`, and ``.
-$font-family-monospace: Menlo, Monaco, Consolas, "Courier New", monospace !default;
-$font-family-base: $font-family-sans-serif !default;
-
-$font-size-base: 14px !default;
-$font-size-large: ceil(($font-size-base * 1.25)) !default; // ~18px
-$font-size-small: ceil(($font-size-base * 0.85)) !default; // ~12px
-
-$font-size-h1: floor(($font-size-base * 2.6)) !default; // ~36px
-$font-size-h2: floor(($font-size-base * 2.15)) !default; // ~30px
-$font-size-h3: ceil(($font-size-base * 1.7)) !default; // ~24px
-$font-size-h4: ceil(($font-size-base * 1.25)) !default; // ~18px
-$font-size-h5: $font-size-base !default;
-$font-size-h6: ceil(($font-size-base * 0.85)) !default; // ~12px
-
-//** Unit-less `line-height` for use in components like buttons.
-$line-height-base: 1.428571429 !default; // 20/14
-//** Computed "line-height" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.
-$line-height-computed: floor(($font-size-base * $line-height-base)) !default; // ~20px
-
-//** By default, this inherits from the ``.
-$headings-font-family: inherit !default;
-$headings-font-weight: 500 !default;
-$headings-line-height: 1.1 !default;
-$headings-color: inherit !default;
-
-
-//== Iconography
-//
-//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.
-
-//** Load fonts from this directory.
-
-// [converter] If $bootstrap-sass-asset-helper if used, provide path relative to the assets load path.
-// [converter] This is because some asset helpers, such as Sprockets, do not work with file-relative paths.
-$icon-font-path: if($bootstrap-sass-asset-helper, "bootstrap/", "../fonts/bootstrap/") !default;
-
-//** File name for all font files.
-$icon-font-name: "glyphicons-halflings-regular" !default;
-//** Element ID within SVG icon file.
-$icon-font-svg-id: "glyphicons_halflingsregular" !default;
-
-
-//== Components
-//
-//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).
-
-$padding-base-vertical: 6px !default;
-$padding-base-horizontal: 12px !default;
-
-$padding-large-vertical: 10px !default;
-$padding-large-horizontal: 16px !default;
-
-$padding-small-vertical: 5px !default;
-$padding-small-horizontal: 10px !default;
-
-$padding-xs-vertical: 1px !default;
-$padding-xs-horizontal: 5px !default;
-
-$line-height-large: 1.3333333 !default; // extra decimals for Win 8.1 Chrome
-$line-height-small: 1.5 !default;
-
-$border-radius-base: 4px !default;
-$border-radius-large: 6px !default;
-$border-radius-small: 3px !default;
-
-//** Global color for active items (e.g., navs or dropdowns).
-$component-active-color: #fff !default;
-//** Global background color for active items (e.g., navs or dropdowns).
-$component-active-bg: $brand-primary !default;
-
-//** Width of the `border` for generating carets that indicate dropdowns.
-$caret-width-base: 4px !default;
-//** Carets increase slightly in size for larger components.
-$caret-width-large: 5px !default;
-
-
-//== Tables
-//
-//## Customizes the `.table` component with basic values, each used across all table variations.
-
-//** Padding for ``s and ` `s.
-$table-cell-padding: 8px !default;
-//** Padding for cells in `.table-condensed`.
-$table-condensed-cell-padding: 5px !default;
-
-//** Default background color used for all tables.
-$table-bg: transparent !default;
-//** Background color used for `.table-striped`.
-$table-bg-accent: #f9f9f9 !default;
-//** Background color used for `.table-hover`.
-$table-bg-hover: #f5f5f5 !default;
-$table-bg-active: $table-bg-hover !default;
-
-//** Border color for table and cell borders.
-$table-border-color: #ddd !default;
-
-
-//== Buttons
-//
-//## For each of Bootstrap's buttons, define text, background and border color.
-
-$btn-font-weight: normal !default;
-
-$btn-default-color: #333 !default;
-$btn-default-bg: #fff !default;
-$btn-default-border: #ccc !default;
-
-$btn-primary-color: #fff !default;
-$btn-primary-bg: $brand-primary !default;
-$btn-primary-border: darken($btn-primary-bg, 5%) !default;
-
-$btn-success-color: #fff !default;
-$btn-success-bg: $brand-success !default;
-$btn-success-border: darken($btn-success-bg, 5%) !default;
-
-$btn-info-color: #fff !default;
-$btn-info-bg: $brand-info !default;
-$btn-info-border: darken($btn-info-bg, 5%) !default;
-
-$btn-warning-color: #fff !default;
-$btn-warning-bg: $brand-warning !default;
-$btn-warning-border: darken($btn-warning-bg, 5%) !default;
-
-$btn-danger-color: #fff !default;
-$btn-danger-bg: $brand-danger !default;
-$btn-danger-border: darken($btn-danger-bg, 5%) !default;
-
-$btn-link-disabled-color: $gray-light !default;
-
-// Allows for customizing button radius independently from global border radius
-$btn-border-radius-base: $border-radius-base !default;
-$btn-border-radius-large: $border-radius-large !default;
-$btn-border-radius-small: $border-radius-small !default;
-
-
-//== Forms
-//
-//##
-
-//** ` ` background color
-$input-bg: #fff !default;
-//** ` ` background color
-$input-bg-disabled: $gray-lighter !default;
-
-//** Text color for ` `s
-$input-color: $gray !default;
-//** ` ` border color
-$input-border: #ccc !default;
-
-// TODO: Rename `$input-border-radius` to `$input-border-radius-base` in v4
-//** Default `.form-control` border radius
-// This has no effect on ``s in some browsers, due to the limited stylability of ``s in CSS.
-$input-border-radius: $border-radius-base !default;
-//** Large `.form-control` border radius
-$input-border-radius-large: $border-radius-large !default;
-//** Small `.form-control` border radius
-$input-border-radius-small: $border-radius-small !default;
-
-//** Border color for inputs on focus
-$input-border-focus: #66afe9 !default;
-
-//** Placeholder text color
-$input-color-placeholder: #999 !default;
-
-//** Default `.form-control` height
-$input-height-base: ($line-height-computed + ($padding-base-vertical * 2) + 2) !default;
-//** Large `.form-control` height
-$input-height-large: (ceil($font-size-large * $line-height-large) + ($padding-large-vertical * 2) + 2) !default;
-//** Small `.form-control` height
-$input-height-small: (floor($font-size-small * $line-height-small) + ($padding-small-vertical * 2) + 2) !default;
-
-//** `.form-group` margin
-$form-group-margin-bottom: 15px !default;
-
-$legend-color: $gray-dark !default;
-$legend-border-color: #e5e5e5 !default;
-
-//** Background color for textual input addons
-$input-group-addon-bg: $gray-lighter !default;
-//** Border color for textual input addons
-$input-group-addon-border-color: $input-border !default;
-
-//** Disabled cursor for form controls and buttons.
-$cursor-disabled: not-allowed !default;
-
-
-//== Dropdowns
-//
-//## Dropdown menu container and contents.
-
-//** Background for the dropdown menu.
-$dropdown-bg: #fff !default;
-//** Dropdown menu `border-color`.
-$dropdown-border: rgba(0,0,0,.15) !default;
-//** Dropdown menu `border-color` **for IE8**.
-$dropdown-fallback-border: #ccc !default;
-//** Divider color for between dropdown items.
-$dropdown-divider-bg: #e5e5e5 !default;
-
-//** Dropdown link text color.
-$dropdown-link-color: $gray-dark !default;
-//** Hover color for dropdown links.
-$dropdown-link-hover-color: darken($gray-dark, 5%) !default;
-//** Hover background for dropdown links.
-$dropdown-link-hover-bg: #f5f5f5 !default;
-
-//** Active dropdown menu item text color.
-$dropdown-link-active-color: $component-active-color !default;
-//** Active dropdown menu item background color.
-$dropdown-link-active-bg: $component-active-bg !default;
-
-//** Disabled dropdown menu item background color.
-$dropdown-link-disabled-color: $gray-light !default;
-
-//** Text color for headers within dropdown menus.
-$dropdown-header-color: $gray-light !default;
-
-//** Deprecated `$dropdown-caret-color` as of v3.1.0
-$dropdown-caret-color: #000 !default;
-
-
-//-- Z-index master list
-//
-// Warning: Avoid customizing these values. They're used for a bird's eye view
-// of components dependent on the z-axis and are designed to all work together.
-//
-// Note: These variables are not generated into the Customizer.
-
-$zindex-navbar: 1000 !default;
-$zindex-dropdown: 1000 !default;
-$zindex-popover: 1060 !default;
-$zindex-tooltip: 1070 !default;
-$zindex-navbar-fixed: 1030 !default;
-$zindex-modal-background: 1040 !default;
-$zindex-modal: 1050 !default;
-
-
-//== Media queries breakpoints
-//
-//## Define the breakpoints at which your layout will change, adapting to different screen sizes.
-
-// Extra small screen / phone
-//** Deprecated `$screen-xs` as of v3.0.1
-$screen-xs: 480px !default;
-//** Deprecated `$screen-xs-min` as of v3.2.0
-$screen-xs-min: $screen-xs !default;
-//** Deprecated `$screen-phone` as of v3.0.1
-$screen-phone: $screen-xs-min !default;
-
-// Small screen / tablet
-//** Deprecated `$screen-sm` as of v3.0.1
-$screen-sm: 768px !default;
-$screen-sm-min: $screen-sm !default;
-//** Deprecated `$screen-tablet` as of v3.0.1
-$screen-tablet: $screen-sm-min !default;
-
-// Medium screen / desktop
-//** Deprecated `$screen-md` as of v3.0.1
-$screen-md: 992px !default;
-$screen-md-min: $screen-md !default;
-//** Deprecated `$screen-desktop` as of v3.0.1
-$screen-desktop: $screen-md-min !default;
-
-// Large screen / wide desktop
-//** Deprecated `$screen-lg` as of v3.0.1
-$screen-lg: 1200px !default;
-$screen-lg-min: $screen-lg !default;
-//** Deprecated `$screen-lg-desktop` as of v3.0.1
-$screen-lg-desktop: $screen-lg-min !default;
-
-// So media queries don't overlap when required, provide a maximum
-$screen-xs-max: ($screen-sm-min - 1) !default;
-$screen-sm-max: ($screen-md-min - 1) !default;
-$screen-md-max: ($screen-lg-min - 1) !default;
-
-
-//== Grid system
-//
-//## Define your custom responsive grid.
-
-//** Number of columns in the grid.
-$grid-columns: 12 !default;
-//** Padding between columns. Gets divided in half for the left and right.
-$grid-gutter-width: 30px !default;
-// Navbar collapse
-//** Point at which the navbar becomes uncollapsed.
-$grid-float-breakpoint: $screen-sm-min !default;
-//** Point at which the navbar begins collapsing.
-$grid-float-breakpoint-max: ($grid-float-breakpoint - 1) !default;
-
-
-//== Container sizes
-//
-//## Define the maximum width of `.container` for different screen sizes.
-
-// Small screen / tablet
-$container-tablet: (720px + $grid-gutter-width) !default;
-//** For `$screen-sm-min` and up.
-$container-sm: $container-tablet !default;
-
-// Medium screen / desktop
-$container-desktop: (940px + $grid-gutter-width) !default;
-//** For `$screen-md-min` and up.
-$container-md: $container-desktop !default;
-
-// Large screen / wide desktop
-$container-large-desktop: (1140px + $grid-gutter-width) !default;
-//** For `$screen-lg-min` and up.
-$container-lg: $container-large-desktop !default;
-
-
-//== Navbar
-//
-//##
-
-// Basics of a navbar
-$navbar-height: 50px !default;
-$navbar-margin-bottom: $line-height-computed !default;
-$navbar-border-radius: $border-radius-base !default;
-$navbar-padding-horizontal: floor(($grid-gutter-width / 2)) !default;
-$navbar-padding-vertical: (($navbar-height - $line-height-computed) / 2) !default;
-$navbar-collapse-max-height: 340px !default;
-
-$navbar-default-color: #777 !default;
-$navbar-default-bg: #f8f8f8 !default;
-$navbar-default-border: darken($navbar-default-bg, 6.5%) !default;
-
-// Navbar links
-$navbar-default-link-color: #777 !default;
-$navbar-default-link-hover-color: #333 !default;
-$navbar-default-link-hover-bg: transparent !default;
-$navbar-default-link-active-color: #555 !default;
-$navbar-default-link-active-bg: darken($navbar-default-bg, 6.5%) !default;
-$navbar-default-link-disabled-color: #ccc !default;
-$navbar-default-link-disabled-bg: transparent !default;
-
-// Navbar brand label
-$navbar-default-brand-color: $navbar-default-link-color !default;
-$navbar-default-brand-hover-color: darken($navbar-default-brand-color, 10%) !default;
-$navbar-default-brand-hover-bg: transparent !default;
-
-// Navbar toggle
-$navbar-default-toggle-hover-bg: #ddd !default;
-$navbar-default-toggle-icon-bar-bg: #888 !default;
-$navbar-default-toggle-border-color: #ddd !default;
-
-
-//=== Inverted navbar
-// Reset inverted navbar basics
-$navbar-inverse-color: lighten($gray-light, 15%) !default;
-$navbar-inverse-bg: #222 !default;
-$navbar-inverse-border: darken($navbar-inverse-bg, 10%) !default;
-
-// Inverted navbar links
-$navbar-inverse-link-color: lighten($gray-light, 15%) !default;
-$navbar-inverse-link-hover-color: #fff !default;
-$navbar-inverse-link-hover-bg: transparent !default;
-$navbar-inverse-link-active-color: $navbar-inverse-link-hover-color !default;
-$navbar-inverse-link-active-bg: darken($navbar-inverse-bg, 10%) !default;
-$navbar-inverse-link-disabled-color: #444 !default;
-$navbar-inverse-link-disabled-bg: transparent !default;
-
-// Inverted navbar brand label
-$navbar-inverse-brand-color: $navbar-inverse-link-color !default;
-$navbar-inverse-brand-hover-color: #fff !default;
-$navbar-inverse-brand-hover-bg: transparent !default;
-
-// Inverted navbar toggle
-$navbar-inverse-toggle-hover-bg: #333 !default;
-$navbar-inverse-toggle-icon-bar-bg: #fff !default;
-$navbar-inverse-toggle-border-color: #333 !default;
-
-
-//== Navs
-//
-//##
-
-//=== Shared nav styles
-$nav-link-padding: 10px 15px !default;
-$nav-link-hover-bg: $gray-lighter !default;
-
-$nav-disabled-link-color: $gray-light !default;
-$nav-disabled-link-hover-color: $gray-light !default;
-
-//== Tabs
-$nav-tabs-border-color: #ddd !default;
-
-$nav-tabs-link-hover-border-color: $gray-lighter !default;
-
-$nav-tabs-active-link-hover-bg: $body-bg !default;
-$nav-tabs-active-link-hover-color: $gray !default;
-$nav-tabs-active-link-hover-border-color: #ddd !default;
-
-$nav-tabs-justified-link-border-color: #ddd !default;
-$nav-tabs-justified-active-link-border-color: $body-bg !default;
-
-//== Pills
-$nav-pills-border-radius: $border-radius-base !default;
-$nav-pills-active-link-hover-bg: $component-active-bg !default;
-$nav-pills-active-link-hover-color: $component-active-color !default;
-
-
-//== Pagination
-//
-//##
-
-$pagination-color: $link-color !default;
-$pagination-bg: #fff !default;
-$pagination-border: #ddd !default;
-
-$pagination-hover-color: $link-hover-color !default;
-$pagination-hover-bg: $gray-lighter !default;
-$pagination-hover-border: #ddd !default;
-
-$pagination-active-color: #fff !default;
-$pagination-active-bg: $brand-primary !default;
-$pagination-active-border: $brand-primary !default;
-
-$pagination-disabled-color: $gray-light !default;
-$pagination-disabled-bg: #fff !default;
-$pagination-disabled-border: #ddd !default;
-
-
-//== Pager
-//
-//##
-
-$pager-bg: $pagination-bg !default;
-$pager-border: $pagination-border !default;
-$pager-border-radius: 15px !default;
-
-$pager-hover-bg: $pagination-hover-bg !default;
-
-$pager-active-bg: $pagination-active-bg !default;
-$pager-active-color: $pagination-active-color !default;
-
-$pager-disabled-color: $pagination-disabled-color !default;
-
-
-//== Jumbotron
-//
-//##
-
-$jumbotron-padding: 30px !default;
-$jumbotron-color: inherit !default;
-$jumbotron-bg: $gray-lighter !default;
-$jumbotron-heading-color: inherit !default;
-$jumbotron-font-size: ceil(($font-size-base * 1.5)) !default;
-$jumbotron-heading-font-size: ceil(($font-size-base * 4.5)) !default;
-
-
-//== Form states and alerts
-//
-//## Define colors for form feedback states and, by default, alerts.
-
-$state-success-text: #3c763d !default;
-$state-success-bg: #dff0d8 !default;
-$state-success-border: darken(adjust-hue($state-success-bg, -10), 5%) !default;
-
-$state-info-text: #31708f !default;
-$state-info-bg: #d9edf7 !default;
-$state-info-border: darken(adjust-hue($state-info-bg, -10), 7%) !default;
-
-$state-warning-text: #8a6d3b !default;
-$state-warning-bg: #fcf8e3 !default;
-$state-warning-border: darken(adjust-hue($state-warning-bg, -10), 5%) !default;
-
-$state-danger-text: #a94442 !default;
-$state-danger-bg: #f2dede !default;
-$state-danger-border: darken(adjust-hue($state-danger-bg, -10), 5%) !default;
-
-
-//== Tooltips
-//
-//##
-
-//** Tooltip max width
-$tooltip-max-width: 200px !default;
-//** Tooltip text color
-$tooltip-color: #fff !default;
-//** Tooltip background color
-$tooltip-bg: #000 !default;
-$tooltip-opacity: .9 !default;
-
-//** Tooltip arrow width
-$tooltip-arrow-width: 5px !default;
-//** Tooltip arrow color
-$tooltip-arrow-color: $tooltip-bg !default;
-
-
-//== Popovers
-//
-//##
-
-//** Popover body background color
-$popover-bg: #fff !default;
-//** Popover maximum width
-$popover-max-width: 276px !default;
-//** Popover border color
-$popover-border-color: rgba(0,0,0,.2) !default;
-//** Popover fallback border color
-$popover-fallback-border-color: #ccc !default;
-
-//** Popover title background color
-$popover-title-bg: darken($popover-bg, 3%) !default;
-
-//** Popover arrow width
-$popover-arrow-width: 10px !default;
-//** Popover arrow color
-$popover-arrow-color: $popover-bg !default;
-
-//** Popover outer arrow width
-$popover-arrow-outer-width: ($popover-arrow-width + 1) !default;
-//** Popover outer arrow color
-$popover-arrow-outer-color: fade_in($popover-border-color, 0.05) !default;
-//** Popover outer arrow fallback color
-$popover-arrow-outer-fallback-color: darken($popover-fallback-border-color, 20%) !default;
-
-
-//== Labels
-//
-//##
-
-//** Default label background color
-$label-default-bg: $gray-light !default;
-//** Primary label background color
-$label-primary-bg: $brand-primary !default;
-//** Success label background color
-$label-success-bg: $brand-success !default;
-//** Info label background color
-$label-info-bg: $brand-info !default;
-//** Warning label background color
-$label-warning-bg: $brand-warning !default;
-//** Danger label background color
-$label-danger-bg: $brand-danger !default;
-
-//** Default label text color
-$label-color: #fff !default;
-//** Default text color of a linked label
-$label-link-hover-color: #fff !default;
-
-
-//== Modals
-//
-//##
-
-//** Padding applied to the modal body
-$modal-inner-padding: 15px !default;
-
-//** Padding applied to the modal title
-$modal-title-padding: 15px !default;
-//** Modal title line-height
-$modal-title-line-height: $line-height-base !default;
-
-//** Background color of modal content area
-$modal-content-bg: #fff !default;
-//** Modal content border color
-$modal-content-border-color: rgba(0,0,0,.2) !default;
-//** Modal content border color **for IE8**
-$modal-content-fallback-border-color: #999 !default;
-
-//** Modal backdrop background color
-$modal-backdrop-bg: #000 !default;
-//** Modal backdrop opacity
-$modal-backdrop-opacity: .5 !default;
-//** Modal header border color
-$modal-header-border-color: #e5e5e5 !default;
-//** Modal footer border color
-$modal-footer-border-color: $modal-header-border-color !default;
-
-$modal-lg: 900px !default;
-$modal-md: 600px !default;
-$modal-sm: 300px !default;
-
-
-//== Alerts
-//
-//## Define alert colors, border radius, and padding.
-
-$alert-padding: 15px !default;
-$alert-border-radius: $border-radius-base !default;
-$alert-link-font-weight: bold !default;
-
-$alert-success-bg: $state-success-bg !default;
-$alert-success-text: $state-success-text !default;
-$alert-success-border: $state-success-border !default;
-
-$alert-info-bg: $state-info-bg !default;
-$alert-info-text: $state-info-text !default;
-$alert-info-border: $state-info-border !default;
-
-$alert-warning-bg: $state-warning-bg !default;
-$alert-warning-text: $state-warning-text !default;
-$alert-warning-border: $state-warning-border !default;
-
-$alert-danger-bg: $state-danger-bg !default;
-$alert-danger-text: $state-danger-text !default;
-$alert-danger-border: $state-danger-border !default;
-
-
-//== Progress bars
-//
-//##
-
-//** Background color of the whole progress component
-$progress-bg: #f5f5f5 !default;
-//** Progress bar text color
-$progress-bar-color: #fff !default;
-//** Variable for setting rounded corners on progress bar.
-$progress-border-radius: $border-radius-base !default;
-
-//** Default progress bar color
-$progress-bar-bg: $brand-primary !default;
-//** Success progress bar color
-$progress-bar-success-bg: $brand-success !default;
-//** Warning progress bar color
-$progress-bar-warning-bg: $brand-warning !default;
-//** Danger progress bar color
-$progress-bar-danger-bg: $brand-danger !default;
-//** Info progress bar color
-$progress-bar-info-bg: $brand-info !default;
-
-
-//== List group
-//
-//##
-
-//** Background color on `.list-group-item`
-$list-group-bg: #fff !default;
-//** `.list-group-item` border color
-$list-group-border: #ddd !default;
-//** List group border radius
-$list-group-border-radius: $border-radius-base !default;
-
-//** Background color of single list items on hover
-$list-group-hover-bg: #f5f5f5 !default;
-//** Text color of active list items
-$list-group-active-color: $component-active-color !default;
-//** Background color of active list items
-$list-group-active-bg: $component-active-bg !default;
-//** Border color of active list elements
-$list-group-active-border: $list-group-active-bg !default;
-//** Text color for content within active list items
-$list-group-active-text-color: lighten($list-group-active-bg, 40%) !default;
-
-//** Text color of disabled list items
-$list-group-disabled-color: $gray-light !default;
-//** Background color of disabled list items
-$list-group-disabled-bg: $gray-lighter !default;
-//** Text color for content within disabled list items
-$list-group-disabled-text-color: $list-group-disabled-color !default;
-
-$list-group-link-color: #555 !default;
-$list-group-link-hover-color: $list-group-link-color !default;
-$list-group-link-heading-color: #333 !default;
-
-
-//== Panels
-//
-//##
-
-$panel-bg: #fff !default;
-$panel-body-padding: 15px !default;
-$panel-heading-padding: 10px 15px !default;
-$panel-footer-padding: $panel-heading-padding !default;
-$panel-border-radius: $border-radius-base !default;
-
-//** Border color for elements within panels
-$panel-inner-border: #ddd !default;
-$panel-footer-bg: #f5f5f5 !default;
-
-$panel-default-text: $gray-dark !default;
-$panel-default-border: #ddd !default;
-$panel-default-heading-bg: #f5f5f5 !default;
-
-$panel-primary-text: #fff !default;
-$panel-primary-border: $brand-primary !default;
-$panel-primary-heading-bg: $brand-primary !default;
-
-$panel-success-text: $state-success-text !default;
-$panel-success-border: $state-success-border !default;
-$panel-success-heading-bg: $state-success-bg !default;
-
-$panel-info-text: $state-info-text !default;
-$panel-info-border: $state-info-border !default;
-$panel-info-heading-bg: $state-info-bg !default;
-
-$panel-warning-text: $state-warning-text !default;
-$panel-warning-border: $state-warning-border !default;
-$panel-warning-heading-bg: $state-warning-bg !default;
-
-$panel-danger-text: $state-danger-text !default;
-$panel-danger-border: $state-danger-border !default;
-$panel-danger-heading-bg: $state-danger-bg !default;
-
-
-//== Thumbnails
-//
-//##
-
-//** Padding around the thumbnail image
-$thumbnail-padding: 4px !default;
-//** Thumbnail background color
-$thumbnail-bg: $body-bg !default;
-//** Thumbnail border color
-$thumbnail-border: #ddd !default;
-//** Thumbnail border radius
-$thumbnail-border-radius: $border-radius-base !default;
-
-//** Custom text color for thumbnail captions
-$thumbnail-caption-color: $text-color !default;
-//** Padding around the thumbnail caption
-$thumbnail-caption-padding: 9px !default;
-
-
-//== Wells
-//
-//##
-
-$well-bg: #f5f5f5 !default;
-$well-border: darken($well-bg, 7%) !default;
-
-
-//== Badges
-//
-//##
-
-$badge-color: #fff !default;
-//** Linked badge text color on hover
-$badge-link-hover-color: #fff !default;
-$badge-bg: $gray-light !default;
-
-//** Badge text color in active nav link
-$badge-active-color: $link-color !default;
-//** Badge background color in active nav link
-$badge-active-bg: #fff !default;
-
-$badge-font-weight: bold !default;
-$badge-line-height: 1 !default;
-$badge-border-radius: 10px !default;
-
-
-//== Breadcrumbs
-//
-//##
-
-$breadcrumb-padding-vertical: 8px !default;
-$breadcrumb-padding-horizontal: 15px !default;
-//** Breadcrumb background color
-$breadcrumb-bg: #f5f5f5 !default;
-//** Breadcrumb text color
-$breadcrumb-color: #ccc !default;
-//** Text color of current page in the breadcrumb
-$breadcrumb-active-color: $gray-light !default;
-//** Textual separator for between breadcrumb elements
-$breadcrumb-separator: "/" !default;
-
-
-//== Carousel
-//
-//##
-
-$carousel-text-shadow: 0 1px 2px rgba(0,0,0,.6) !default;
-
-$carousel-control-color: #fff !default;
-$carousel-control-width: 15% !default;
-$carousel-control-opacity: .5 !default;
-$carousel-control-font-size: 20px !default;
-
-$carousel-indicator-active-bg: #fff !default;
-$carousel-indicator-border-color: #fff !default;
-
-$carousel-caption-color: #fff !default;
-
-
-//== Close
-//
-//##
-
-$close-font-weight: bold !default;
-$close-color: #000 !default;
-$close-text-shadow: 0 1px 0 #fff !default;
-
-
-//== Code
-//
-//##
-
-$code-color: #c7254e !default;
-$code-bg: #f9f2f4 !default;
-
-$kbd-color: #fff !default;
-$kbd-bg: #333 !default;
-
-$pre-bg: #f5f5f5 !default;
-$pre-color: $gray-dark !default;
-$pre-border-color: #ccc !default;
-$pre-scrollable-max-height: 340px !default;
-
-
-//== Type
-//
-//##
-
-//** Horizontal offset for forms and lists.
-$component-offset-horizontal: 180px !default;
-//** Text muted color
-$text-muted: $gray-light !default;
-//** Abbreviations and acronyms border color
-$abbr-border-color: $gray-light !default;
-//** Headings small color
-$headings-small-color: $gray-light !default;
-//** Blockquote small color
-$blockquote-small-color: $gray-light !default;
-//** Blockquote font size
-$blockquote-font-size: ($font-size-base * 1.25) !default;
-//** Blockquote border color
-$blockquote-border-color: $gray-lighter !default;
-//** Page header border color
-$page-header-border-color: $gray-lighter !default;
-//** Width of horizontal description list titles
-$dl-horizontal-offset: $component-offset-horizontal !default;
-//** Point at which .dl-horizontal becomes horizontal
-$dl-horizontal-breakpoint: $grid-float-breakpoint !default;
-//** Horizontal line color.
-$hr-border: $gray-lighter !default;
diff --git a/cove/cove_360/sass/bootstrap/bootstrap/_wells.scss b/cove/cove_360/sass/bootstrap/bootstrap/_wells.scss
deleted file mode 100644
index b865711..0000000
--- a/cove/cove_360/sass/bootstrap/bootstrap/_wells.scss
+++ /dev/null
@@ -1,29 +0,0 @@
-//
-// Wells
-// --------------------------------------------------
-
-
-// Base class
-.well {
- min-height: 20px;
- padding: 19px;
- margin-bottom: 20px;
- background-color: $well-bg;
- border: 1px solid $well-border;
- border-radius: $border-radius-base;
- @include box-shadow(inset 0 1px 1px rgba(0,0,0,.05));
- blockquote {
- border-color: #ddd;
- border-color: rgba(0,0,0,.15);
- }
-}
-
-// Sizes
-.well-lg {
- padding: 24px;
- border-radius: $border-radius-large;
-}
-.well-sm {
- padding: 9px;
- border-radius: $border-radius-small;
-}
diff --git a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_alerts.scss b/cove/cove_360/sass/bootstrap/bootstrap/mixins/_alerts.scss
deleted file mode 100644
index 3faf0b5..0000000
--- a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_alerts.scss
+++ /dev/null
@@ -1,14 +0,0 @@
-// Alerts
-
-@mixin alert-variant($background, $border, $text-color) {
- background-color: $background;
- border-color: $border;
- color: $text-color;
-
- hr {
- border-top-color: darken($border, 5%);
- }
- .alert-link {
- color: darken($text-color, 10%);
- }
-}
diff --git a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_background-variant.scss b/cove/cove_360/sass/bootstrap/bootstrap/mixins/_background-variant.scss
deleted file mode 100644
index 4c7769e..0000000
--- a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_background-variant.scss
+++ /dev/null
@@ -1,12 +0,0 @@
-// Contextual backgrounds
-
-// [converter] $parent hack
-@mixin bg-variant($parent, $color) {
- #{$parent} {
- background-color: $color;
- }
- a#{$parent}:hover,
- a#{$parent}:focus {
- background-color: darken($color, 10%);
- }
-}
diff --git a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_border-radius.scss b/cove/cove_360/sass/bootstrap/bootstrap/mixins/_border-radius.scss
deleted file mode 100644
index ce19499..0000000
--- a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_border-radius.scss
+++ /dev/null
@@ -1,18 +0,0 @@
-// Single side border-radius
-
-@mixin border-top-radius($radius) {
- border-top-right-radius: $radius;
- border-top-left-radius: $radius;
-}
-@mixin border-right-radius($radius) {
- border-bottom-right-radius: $radius;
- border-top-right-radius: $radius;
-}
-@mixin border-bottom-radius($radius) {
- border-bottom-right-radius: $radius;
- border-bottom-left-radius: $radius;
-}
-@mixin border-left-radius($radius) {
- border-bottom-left-radius: $radius;
- border-top-left-radius: $radius;
-}
diff --git a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_buttons.scss b/cove/cove_360/sass/bootstrap/bootstrap/mixins/_buttons.scss
deleted file mode 100644
index b93f84b..0000000
--- a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_buttons.scss
+++ /dev/null
@@ -1,65 +0,0 @@
-// Button variants
-//
-// Easily pump out default styles, as well as :hover, :focus, :active,
-// and disabled options for all buttons
-
-@mixin button-variant($color, $background, $border) {
- color: $color;
- background-color: $background;
- border-color: $border;
-
- &:focus,
- &.focus {
- color: $color;
- background-color: darken($background, 10%);
- border-color: darken($border, 25%);
- }
- &:hover {
- color: $color;
- background-color: darken($background, 10%);
- border-color: darken($border, 12%);
- }
- &:active,
- &.active,
- .open > &.dropdown-toggle {
- color: $color;
- background-color: darken($background, 10%);
- border-color: darken($border, 12%);
-
- &:hover,
- &:focus,
- &.focus {
- color: $color;
- background-color: darken($background, 17%);
- border-color: darken($border, 25%);
- }
- }
- &:active,
- &.active,
- .open > &.dropdown-toggle {
- background-image: none;
- }
- &.disabled,
- &[disabled],
- fieldset[disabled] & {
- &:hover,
- &:focus,
- &.focus {
- background-color: $background;
- border-color: $border;
- }
- }
-
- .badge {
- color: $background;
- background-color: $color;
- }
-}
-
-// Button sizes
-@mixin button-size($padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) {
- padding: $padding-vertical $padding-horizontal;
- font-size: $font-size;
- line-height: $line-height;
- border-radius: $border-radius;
-}
diff --git a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_center-block.scss b/cove/cove_360/sass/bootstrap/bootstrap/mixins/_center-block.scss
deleted file mode 100644
index e06fb5e..0000000
--- a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_center-block.scss
+++ /dev/null
@@ -1,7 +0,0 @@
-// Center-align a block level element
-
-@mixin center-block() {
- display: block;
- margin-left: auto;
- margin-right: auto;
-}
diff --git a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_clearfix.scss b/cove/cove_360/sass/bootstrap/bootstrap/mixins/_clearfix.scss
deleted file mode 100644
index dc3e2ab..0000000
--- a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_clearfix.scss
+++ /dev/null
@@ -1,22 +0,0 @@
-// Clearfix
-//
-// For modern browsers
-// 1. The space content is one way to avoid an Opera bug when the
-// contenteditable attribute is included anywhere else in the document.
-// Otherwise it causes space to appear at the top and bottom of elements
-// that are clearfixed.
-// 2. The use of `table` rather than `block` is only necessary if using
-// `:before` to contain the top-margins of child elements.
-//
-// Source: http://nicolasgallagher.com/micro-clearfix-hack/
-
-@mixin clearfix() {
- &:before,
- &:after {
- content: " "; // 1
- display: table; // 2
- }
- &:after {
- clear: both;
- }
-}
diff --git a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_forms.scss b/cove/cove_360/sass/bootstrap/bootstrap/mixins/_forms.scss
deleted file mode 100644
index 277aa5f..0000000
--- a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_forms.scss
+++ /dev/null
@@ -1,88 +0,0 @@
-// Form validation states
-//
-// Used in forms.less to generate the form validation CSS for warnings, errors,
-// and successes.
-
-@mixin form-control-validation($text-color: #555, $border-color: #ccc, $background-color: #f5f5f5) {
- // Color the label and help text
- .help-block,
- .control-label,
- .radio,
- .checkbox,
- .radio-inline,
- .checkbox-inline,
- &.radio label,
- &.checkbox label,
- &.radio-inline label,
- &.checkbox-inline label {
- color: $text-color;
- }
- // Set the border and box shadow on specific inputs to match
- .form-control {
- border-color: $border-color;
- @include box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work
- &:focus {
- border-color: darken($border-color, 10%);
- $shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten($border-color, 20%);
- @include box-shadow($shadow);
- }
- }
- // Set validation states also for addons
- .input-group-addon {
- color: $text-color;
- border-color: $border-color;
- background-color: $background-color;
- }
- // Optional feedback icon
- .form-control-feedback {
- color: $text-color;
- }
-}
-
-
-// Form control focus state
-//
-// Generate a customized focus state and for any input with the specified color,
-// which defaults to the `$input-border-focus` variable.
-//
-// We highly encourage you to not customize the default value, but instead use
-// this to tweak colors on an as-needed basis. This aesthetic change is based on
-// WebKit's default styles, but applicable to a wider range of browsers. Its
-// usability and accessibility should be taken into account with any change.
-//
-// Example usage: change the default blue border and shadow to white for better
-// contrast against a dark gray background.
-@mixin form-control-focus($color: $input-border-focus) {
- $color-rgba: rgba(red($color), green($color), blue($color), .6);
- &:focus {
- border-color: $color;
- outline: 0;
- @include box-shadow(inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px $color-rgba);
- }
-}
-
-// Form control sizing
-//
-// Relative text size, padding, and border-radii changes for form controls. For
-// horizontal sizing, wrap controls in the predefined grid classes. ``
-// element gets special love because it's special, and that's a fact!
-// [converter] $parent hack
-@mixin input-size($parent, $input-height, $padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) {
- #{$parent} {
- height: $input-height;
- padding: $padding-vertical $padding-horizontal;
- font-size: $font-size;
- line-height: $line-height;
- border-radius: $border-radius;
- }
-
- select#{$parent} {
- height: $input-height;
- line-height: $input-height;
- }
-
- textarea#{$parent},
- select[multiple]#{$parent} {
- height: auto;
- }
-}
diff --git a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_gradients.scss b/cove/cove_360/sass/bootstrap/bootstrap/mixins/_gradients.scss
deleted file mode 100644
index a8939f5..0000000
--- a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_gradients.scss
+++ /dev/null
@@ -1,58 +0,0 @@
-// Gradients
-
-
-
-// Horizontal gradient, from left to right
-//
-// Creates two color stops, start and end, by specifying a color and position for each color stop.
-// Color stops are not available in IE9 and below.
-@mixin gradient-horizontal($start-color: #555, $end-color: #333, $start-percent: 0%, $end-percent: 100%) {
- background-image: -webkit-linear-gradient(left, $start-color $start-percent, $end-color $end-percent); // Safari 5.1-6, Chrome 10+
- background-image: -o-linear-gradient(left, $start-color $start-percent, $end-color $end-percent); // Opera 12
- background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=1); // IE9 and down
-}
-
-// Vertical gradient, from top to bottom
-//
-// Creates two color stops, start and end, by specifying a color and position for each color stop.
-// Color stops are not available in IE9 and below.
-@mixin gradient-vertical($start-color: #555, $end-color: #333, $start-percent: 0%, $end-percent: 100%) {
- background-image: -webkit-linear-gradient(top, $start-color $start-percent, $end-color $end-percent); // Safari 5.1-6, Chrome 10+
- background-image: -o-linear-gradient(top, $start-color $start-percent, $end-color $end-percent); // Opera 12
- background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=0); // IE9 and down
-}
-
-@mixin gradient-directional($start-color: #555, $end-color: #333, $deg: 45deg) {
- background-repeat: repeat-x;
- background-image: -webkit-linear-gradient($deg, $start-color, $end-color); // Safari 5.1-6, Chrome 10+
- background-image: -o-linear-gradient($deg, $start-color, $end-color); // Opera 12
- background-image: linear-gradient($deg, $start-color, $end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
-}
-@mixin gradient-horizontal-three-colors($start-color: #00b3ee, $mid-color: #7a43b6, $color-stop: 50%, $end-color: #c3325f) {
- background-image: -webkit-linear-gradient(left, $start-color, $mid-color $color-stop, $end-color);
- background-image: -o-linear-gradient(left, $start-color, $mid-color $color-stop, $end-color);
- background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color);
- background-repeat: no-repeat;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=1); // IE9 and down, gets no color-stop at all for proper fallback
-}
-@mixin gradient-vertical-three-colors($start-color: #00b3ee, $mid-color: #7a43b6, $color-stop: 50%, $end-color: #c3325f) {
- background-image: -webkit-linear-gradient($start-color, $mid-color $color-stop, $end-color);
- background-image: -o-linear-gradient($start-color, $mid-color $color-stop, $end-color);
- background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);
- background-repeat: no-repeat;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=0); // IE9 and down, gets no color-stop at all for proper fallback
-}
-@mixin gradient-radial($inner-color: #555, $outer-color: #333) {
- background-image: -webkit-radial-gradient(circle, $inner-color, $outer-color);
- background-image: radial-gradient(circle, $inner-color, $outer-color);
- background-repeat: no-repeat;
-}
-@mixin gradient-striped($color: rgba(255,255,255,.15), $angle: 45deg) {
- background-image: -webkit-linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);
- background-image: -o-linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);
- background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);
-}
diff --git a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_grid-framework.scss b/cove/cove_360/sass/bootstrap/bootstrap/mixins/_grid-framework.scss
deleted file mode 100644
index 16d038c..0000000
--- a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_grid-framework.scss
+++ /dev/null
@@ -1,81 +0,0 @@
-// Framework grid generation
-//
-// Used only by Bootstrap to generate the correct number of grid classes given
-// any value of `$grid-columns`.
-
-// [converter] This is defined recursively in LESS, but Sass supports real loops
-@mixin make-grid-columns($i: 1, $list: ".col-xs-#{$i}, .col-sm-#{$i}, .col-md-#{$i}, .col-lg-#{$i}") {
- @for $i from (1 + 1) through $grid-columns {
- $list: "#{$list}, .col-xs-#{$i}, .col-sm-#{$i}, .col-md-#{$i}, .col-lg-#{$i}";
- }
- #{$list} {
- position: relative;
- // Prevent columns from collapsing when empty
- min-height: 1px;
- // Inner gutter via padding
- padding-left: ceil(($grid-gutter-width / 2));
- padding-right: floor(($grid-gutter-width / 2));
- }
-}
-
-
-// [converter] This is defined recursively in LESS, but Sass supports real loops
-@mixin float-grid-columns($class, $i: 1, $list: ".col-#{$class}-#{$i}") {
- @for $i from (1 + 1) through $grid-columns {
- $list: "#{$list}, .col-#{$class}-#{$i}";
- }
- #{$list} {
- float: left;
- }
-}
-
-
-@mixin calc-grid-column($index, $class, $type) {
- @if ($type == width) and ($index > 0) {
- .col-#{$class}-#{$index} {
- width: percentage(($index / $grid-columns));
- }
- }
- @if ($type == push) and ($index > 0) {
- .col-#{$class}-push-#{$index} {
- left: percentage(($index / $grid-columns));
- }
- }
- @if ($type == push) and ($index == 0) {
- .col-#{$class}-push-0 {
- left: auto;
- }
- }
- @if ($type == pull) and ($index > 0) {
- .col-#{$class}-pull-#{$index} {
- right: percentage(($index / $grid-columns));
- }
- }
- @if ($type == pull) and ($index == 0) {
- .col-#{$class}-pull-0 {
- right: auto;
- }
- }
- @if ($type == offset) {
- .col-#{$class}-offset-#{$index} {
- margin-left: percentage(($index / $grid-columns));
- }
- }
-}
-
-// [converter] This is defined recursively in LESS, but Sass supports real loops
-@mixin loop-grid-columns($columns, $class, $type) {
- @for $i from 0 through $columns {
- @include calc-grid-column($i, $class, $type);
- }
-}
-
-
-// Create grid for specific class
-@mixin make-grid($class) {
- @include float-grid-columns($class);
- @include loop-grid-columns($grid-columns, $class, width);
- @include loop-grid-columns($grid-columns, $class, pull);
- @include loop-grid-columns($grid-columns, $class, push);
- @include loop-grid-columns($grid-columns, $class, offset);
-}
diff --git a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_grid.scss b/cove/cove_360/sass/bootstrap/bootstrap/mixins/_grid.scss
deleted file mode 100644
index 59551da..0000000
--- a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_grid.scss
+++ /dev/null
@@ -1,122 +0,0 @@
-// Grid system
-//
-// Generate semantic grid columns with these mixins.
-
-// Centered container element
-@mixin container-fixed($gutter: $grid-gutter-width) {
- margin-right: auto;
- margin-left: auto;
- padding-left: floor(($gutter / 2));
- padding-right: ceil(($gutter / 2));
- @include clearfix;
-}
-
-// Creates a wrapper for a series of columns
-@mixin make-row($gutter: $grid-gutter-width) {
- margin-left: ceil(($gutter / -2));
- margin-right: floor(($gutter / -2));
- @include clearfix;
-}
-
-// Generate the extra small columns
-@mixin make-xs-column($columns, $gutter: $grid-gutter-width) {
- position: relative;
- float: left;
- width: percentage(($columns / $grid-columns));
- min-height: 1px;
- padding-left: ($gutter / 2);
- padding-right: ($gutter / 2);
-}
-@mixin make-xs-column-offset($columns) {
- margin-left: percentage(($columns / $grid-columns));
-}
-@mixin make-xs-column-push($columns) {
- left: percentage(($columns / $grid-columns));
-}
-@mixin make-xs-column-pull($columns) {
- right: percentage(($columns / $grid-columns));
-}
-
-// Generate the small columns
-@mixin make-sm-column($columns, $gutter: $grid-gutter-width) {
- position: relative;
- min-height: 1px;
- padding-left: ($gutter / 2);
- padding-right: ($gutter / 2);
-
- @media (min-width: $screen-sm-min) {
- float: left;
- width: percentage(($columns / $grid-columns));
- }
-}
-@mixin make-sm-column-offset($columns) {
- @media (min-width: $screen-sm-min) {
- margin-left: percentage(($columns / $grid-columns));
- }
-}
-@mixin make-sm-column-push($columns) {
- @media (min-width: $screen-sm-min) {
- left: percentage(($columns / $grid-columns));
- }
-}
-@mixin make-sm-column-pull($columns) {
- @media (min-width: $screen-sm-min) {
- right: percentage(($columns / $grid-columns));
- }
-}
-
-// Generate the medium columns
-@mixin make-md-column($columns, $gutter: $grid-gutter-width) {
- position: relative;
- min-height: 1px;
- padding-left: ($gutter / 2);
- padding-right: ($gutter / 2);
-
- @media (min-width: $screen-md-min) {
- float: left;
- width: percentage(($columns / $grid-columns));
- }
-}
-@mixin make-md-column-offset($columns) {
- @media (min-width: $screen-md-min) {
- margin-left: percentage(($columns / $grid-columns));
- }
-}
-@mixin make-md-column-push($columns) {
- @media (min-width: $screen-md-min) {
- left: percentage(($columns / $grid-columns));
- }
-}
-@mixin make-md-column-pull($columns) {
- @media (min-width: $screen-md-min) {
- right: percentage(($columns / $grid-columns));
- }
-}
-
-// Generate the large columns
-@mixin make-lg-column($columns, $gutter: $grid-gutter-width) {
- position: relative;
- min-height: 1px;
- padding-left: ($gutter / 2);
- padding-right: ($gutter / 2);
-
- @media (min-width: $screen-lg-min) {
- float: left;
- width: percentage(($columns / $grid-columns));
- }
-}
-@mixin make-lg-column-offset($columns) {
- @media (min-width: $screen-lg-min) {
- margin-left: percentage(($columns / $grid-columns));
- }
-}
-@mixin make-lg-column-push($columns) {
- @media (min-width: $screen-lg-min) {
- left: percentage(($columns / $grid-columns));
- }
-}
-@mixin make-lg-column-pull($columns) {
- @media (min-width: $screen-lg-min) {
- right: percentage(($columns / $grid-columns));
- }
-}
diff --git a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_hide-text.scss b/cove/cove_360/sass/bootstrap/bootstrap/mixins/_hide-text.scss
deleted file mode 100644
index 1767e02..0000000
--- a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_hide-text.scss
+++ /dev/null
@@ -1,21 +0,0 @@
-// CSS image replacement
-//
-// Heads up! v3 launched with only `.hide-text()`, but per our pattern for
-// mixins being reused as classes with the same name, this doesn't hold up. As
-// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.
-//
-// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757
-
-// Deprecated as of v3.0.1 (has been removed in v4)
-@mixin hide-text() {
- font: 0/0 a;
- color: transparent;
- text-shadow: none;
- background-color: transparent;
- border: 0;
-}
-
-// New mixin to use as of v3.0.1
-@mixin text-hide() {
- @include hide-text;
-}
diff --git a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_image.scss b/cove/cove_360/sass/bootstrap/bootstrap/mixins/_image.scss
deleted file mode 100644
index c8dcf5e..0000000
--- a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_image.scss
+++ /dev/null
@@ -1,33 +0,0 @@
-// Image Mixins
-// - Responsive image
-// - Retina image
-
-
-// Responsive image
-//
-// Keep images from scaling beyond the width of their parents.
-@mixin img-responsive($display: block) {
- display: $display;
- max-width: 100%; // Part 1: Set a maximum relative to the parent
- height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching
-}
-
-
-// Retina image
-//
-// Short retina mixin for setting background-image and -size. Note that the
-// spelling of `min--moz-device-pixel-ratio` is intentional.
-@mixin img-retina($file-1x, $file-2x, $width-1x, $height-1x) {
- background-image: url(if($bootstrap-sass-asset-helper, twbs-image-path("#{$file-1x}"), "#{$file-1x}"));
-
- @media
- only screen and (-webkit-min-device-pixel-ratio: 2),
- only screen and ( min--moz-device-pixel-ratio: 2),
- only screen and ( -o-min-device-pixel-ratio: 2/1),
- only screen and ( min-device-pixel-ratio: 2),
- only screen and ( min-resolution: 192dpi),
- only screen and ( min-resolution: 2dppx) {
- background-image: url(if($bootstrap-sass-asset-helper, twbs-image-path("#{$file-2x}"), "#{$file-2x}"));
- background-size: $width-1x $height-1x;
- }
-}
diff --git a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_labels.scss b/cove/cove_360/sass/bootstrap/bootstrap/mixins/_labels.scss
deleted file mode 100644
index eda6dfd..0000000
--- a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_labels.scss
+++ /dev/null
@@ -1,12 +0,0 @@
-// Labels
-
-@mixin label-variant($color) {
- background-color: $color;
-
- &[href] {
- &:hover,
- &:focus {
- background-color: darken($color, 10%);
- }
- }
-}
diff --git a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_list-group.scss b/cove/cove_360/sass/bootstrap/bootstrap/mixins/_list-group.scss
deleted file mode 100644
index c478eeb..0000000
--- a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_list-group.scss
+++ /dev/null
@@ -1,32 +0,0 @@
-// List Groups
-
-@mixin list-group-item-variant($state, $background, $color) {
- .list-group-item-#{$state} {
- color: $color;
- background-color: $background;
-
- // [converter] extracted a&, button& to a.list-group-item-#{$state}, button.list-group-item-#{$state}
- }
-
- a.list-group-item-#{$state},
- button.list-group-item-#{$state} {
- color: $color;
-
- .list-group-item-heading {
- color: inherit;
- }
-
- &:hover,
- &:focus {
- color: $color;
- background-color: darken($background, 5%);
- }
- &.active,
- &.active:hover,
- &.active:focus {
- color: #fff;
- background-color: $color;
- border-color: $color;
- }
- }
-}
diff --git a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_nav-divider.scss b/cove/cove_360/sass/bootstrap/bootstrap/mixins/_nav-divider.scss
deleted file mode 100644
index 2e6da02..0000000
--- a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_nav-divider.scss
+++ /dev/null
@@ -1,10 +0,0 @@
-// Horizontal dividers
-//
-// Dividers (basically an hr) within dropdowns and nav lists
-
-@mixin nav-divider($color: #e5e5e5) {
- height: 1px;
- margin: (($line-height-computed / 2) - 1) 0;
- overflow: hidden;
- background-color: $color;
-}
diff --git a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_nav-vertical-align.scss b/cove/cove_360/sass/bootstrap/bootstrap/mixins/_nav-vertical-align.scss
deleted file mode 100644
index c8fbf1a..0000000
--- a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_nav-vertical-align.scss
+++ /dev/null
@@ -1,9 +0,0 @@
-// Navbar vertical align
-//
-// Vertically center elements in the navbar.
-// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.
-
-@mixin navbar-vertical-align($element-height) {
- margin-top: (($navbar-height - $element-height) / 2);
- margin-bottom: (($navbar-height - $element-height) / 2);
-}
diff --git a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_opacity.scss b/cove/cove_360/sass/bootstrap/bootstrap/mixins/_opacity.scss
deleted file mode 100644
index 88e9a57..0000000
--- a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_opacity.scss
+++ /dev/null
@@ -1,8 +0,0 @@
-// Opacity
-
-@mixin opacity($opacity) {
- opacity: $opacity;
- // IE8 filter
- $opacity-ie: ($opacity * 100);
- filter: alpha(opacity=$opacity-ie);
-}
diff --git a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_pagination.scss b/cove/cove_360/sass/bootstrap/bootstrap/mixins/_pagination.scss
deleted file mode 100644
index d4a5404..0000000
--- a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_pagination.scss
+++ /dev/null
@@ -1,24 +0,0 @@
-// Pagination
-
-@mixin pagination-size($padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) {
- > li {
- > a,
- > span {
- padding: $padding-vertical $padding-horizontal;
- font-size: $font-size;
- line-height: $line-height;
- }
- &:first-child {
- > a,
- > span {
- @include border-left-radius($border-radius);
- }
- }
- &:last-child {
- > a,
- > span {
- @include border-right-radius($border-radius);
- }
- }
- }
-}
diff --git a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_panels.scss b/cove/cove_360/sass/bootstrap/bootstrap/mixins/_panels.scss
deleted file mode 100644
index 3ff31ae..0000000
--- a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_panels.scss
+++ /dev/null
@@ -1,24 +0,0 @@
-// Panels
-
-@mixin panel-variant($border, $heading-text-color, $heading-bg-color, $heading-border) {
- border-color: $border;
-
- & > .panel-heading {
- color: $heading-text-color;
- background-color: $heading-bg-color;
- border-color: $heading-border;
-
- + .panel-collapse > .panel-body {
- border-top-color: $border;
- }
- .badge {
- color: $heading-bg-color;
- background-color: $heading-text-color;
- }
- }
- & > .panel-footer {
- + .panel-collapse > .panel-body {
- border-bottom-color: $border;
- }
- }
-}
diff --git a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_progress-bar.scss b/cove/cove_360/sass/bootstrap/bootstrap/mixins/_progress-bar.scss
deleted file mode 100644
index 90a62af..0000000
--- a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_progress-bar.scss
+++ /dev/null
@@ -1,10 +0,0 @@
-// Progress bars
-
-@mixin progress-bar-variant($color) {
- background-color: $color;
-
- // Deprecated parent class requirement as of v3.2.0
- .progress-striped & {
- @include gradient-striped;
- }
-}
diff --git a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_reset-filter.scss b/cove/cove_360/sass/bootstrap/bootstrap/mixins/_reset-filter.scss
deleted file mode 100644
index bf73051..0000000
--- a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_reset-filter.scss
+++ /dev/null
@@ -1,8 +0,0 @@
-// Reset filters for IE
-//
-// When you need to remove a gradient background, do not forget to use this to reset
-// the IE filter for IE9 and below.
-
-@mixin reset-filter() {
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-}
diff --git a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_reset-text.scss b/cove/cove_360/sass/bootstrap/bootstrap/mixins/_reset-text.scss
deleted file mode 100644
index c9c2841..0000000
--- a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_reset-text.scss
+++ /dev/null
@@ -1,18 +0,0 @@
-@mixin reset-text() {
- font-family: $font-family-base;
- // We deliberately do NOT reset font-size.
- font-style: normal;
- font-weight: normal;
- letter-spacing: normal;
- line-break: auto;
- line-height: $line-height-base;
- text-align: left; // Fallback for where `start` is not supported
- text-align: start;
- text-decoration: none;
- text-shadow: none;
- text-transform: none;
- white-space: normal;
- word-break: normal;
- word-spacing: normal;
- word-wrap: normal;
-}
diff --git a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_resize.scss b/cove/cove_360/sass/bootstrap/bootstrap/mixins/_resize.scss
deleted file mode 100644
index 83fa637..0000000
--- a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_resize.scss
+++ /dev/null
@@ -1,6 +0,0 @@
-// Resize anything
-
-@mixin resizable($direction) {
- resize: $direction; // Options: horizontal, vertical, both
- overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible`
-}
diff --git a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_responsive-visibility.scss b/cove/cove_360/sass/bootstrap/bootstrap/mixins/_responsive-visibility.scss
deleted file mode 100644
index cbdf777..0000000
--- a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_responsive-visibility.scss
+++ /dev/null
@@ -1,21 +0,0 @@
-// Responsive utilities
-
-//
-// More easily include all the states for responsive-utilities.less.
-// [converter] $parent hack
-@mixin responsive-visibility($parent) {
- #{$parent} {
- display: block !important;
- }
- table#{$parent} { display: table !important; }
- tr#{$parent} { display: table-row !important; }
- th#{$parent},
- td#{$parent} { display: table-cell !important; }
-}
-
-// [converter] $parent hack
-@mixin responsive-invisibility($parent) {
- #{$parent} {
- display: none !important;
- }
-}
diff --git a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_size.scss b/cove/cove_360/sass/bootstrap/bootstrap/mixins/_size.scss
deleted file mode 100644
index abbe246..0000000
--- a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_size.scss
+++ /dev/null
@@ -1,10 +0,0 @@
-// Sizing shortcuts
-
-@mixin size($width, $height) {
- width: $width;
- height: $height;
-}
-
-@mixin square($size) {
- @include size($size, $size);
-}
diff --git a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_tab-focus.scss b/cove/cove_360/sass/bootstrap/bootstrap/mixins/_tab-focus.scss
deleted file mode 100644
index f16ed64..0000000
--- a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_tab-focus.scss
+++ /dev/null
@@ -1,9 +0,0 @@
-// WebKit-style focus
-
-@mixin tab-focus() {
- // WebKit-specific. Other browsers will keep their default outline style.
- // (Initially tried to also force default via `outline: initial`,
- // but that seems to erroneously remove the outline in Firefox altogether.)
- outline: 5px auto -webkit-focus-ring-color;
- outline-offset: -2px;
-}
diff --git a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_table-row.scss b/cove/cove_360/sass/bootstrap/bootstrap/mixins/_table-row.scss
deleted file mode 100644
index 1367950..0000000
--- a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_table-row.scss
+++ /dev/null
@@ -1,28 +0,0 @@
-// Tables
-
-@mixin table-row-variant($state, $background) {
- // Exact selectors below required to override `.table-striped` and prevent
- // inheritance to nested tables.
- .table > thead > tr,
- .table > tbody > tr,
- .table > tfoot > tr {
- > td.#{$state},
- > th.#{$state},
- &.#{$state} > td,
- &.#{$state} > th {
- background-color: $background;
- }
- }
-
- // Hover states for `.table-hover`
- // Note: this is not available for cells or rows within `thead` or `tfoot`.
- .table-hover > tbody > tr {
- > td.#{$state}:hover,
- > th.#{$state}:hover,
- &.#{$state}:hover > td,
- &:hover > .#{$state},
- &.#{$state}:hover > th {
- background-color: darken($background, 5%);
- }
- }
-}
diff --git a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_text-emphasis.scss b/cove/cove_360/sass/bootstrap/bootstrap/mixins/_text-emphasis.scss
deleted file mode 100644
index 3b446c4..0000000
--- a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_text-emphasis.scss
+++ /dev/null
@@ -1,12 +0,0 @@
-// Typography
-
-// [converter] $parent hack
-@mixin text-emphasis-variant($parent, $color) {
- #{$parent} {
- color: $color;
- }
- a#{$parent}:hover,
- a#{$parent}:focus {
- color: darken($color, 10%);
- }
-}
diff --git a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_text-overflow.scss b/cove/cove_360/sass/bootstrap/bootstrap/mixins/_text-overflow.scss
deleted file mode 100644
index 1593b25..0000000
--- a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_text-overflow.scss
+++ /dev/null
@@ -1,8 +0,0 @@
-// Text overflow
-// Requires inline-block or block for proper styling
-
-@mixin text-overflow() {
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
diff --git a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_vendor-prefixes.scss b/cove/cove_360/sass/bootstrap/bootstrap/mixins/_vendor-prefixes.scss
deleted file mode 100644
index b3d0371..0000000
--- a/cove/cove_360/sass/bootstrap/bootstrap/mixins/_vendor-prefixes.scss
+++ /dev/null
@@ -1,222 +0,0 @@
-// Vendor Prefixes
-//
-// All vendor mixins are deprecated as of v3.2.0 due to the introduction of
-// Autoprefixer in our Gruntfile. They have been removed in v4.
-
-// - Animations
-// - Backface visibility
-// - Box shadow
-// - Box sizing
-// - Content columns
-// - Hyphens
-// - Placeholder text
-// - Transformations
-// - Transitions
-// - User Select
-
-
-// Animations
-@mixin animation($animation) {
- -webkit-animation: $animation;
- -o-animation: $animation;
- animation: $animation;
-}
-@mixin animation-name($name) {
- -webkit-animation-name: $name;
- animation-name: $name;
-}
-@mixin animation-duration($duration) {
- -webkit-animation-duration: $duration;
- animation-duration: $duration;
-}
-@mixin animation-timing-function($timing-function) {
- -webkit-animation-timing-function: $timing-function;
- animation-timing-function: $timing-function;
-}
-@mixin animation-delay($delay) {
- -webkit-animation-delay: $delay;
- animation-delay: $delay;
-}
-@mixin animation-iteration-count($iteration-count) {
- -webkit-animation-iteration-count: $iteration-count;
- animation-iteration-count: $iteration-count;
-}
-@mixin animation-direction($direction) {
- -webkit-animation-direction: $direction;
- animation-direction: $direction;
-}
-@mixin animation-fill-mode($fill-mode) {
- -webkit-animation-fill-mode: $fill-mode;
- animation-fill-mode: $fill-mode;
-}
-
-// Backface visibility
-// Prevent browsers from flickering when using CSS 3D transforms.
-// Default value is `visible`, but can be changed to `hidden`
-
-@mixin backface-visibility($visibility) {
- -webkit-backface-visibility: $visibility;
- -moz-backface-visibility: $visibility;
- backface-visibility: $visibility;
-}
-
-// Drop shadows
-//
-// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's
-// supported browsers that have box shadow capabilities now support it.
-
-@mixin box-shadow($shadow...) {
- -webkit-box-shadow: $shadow; // iOS <4.3 & Android <4.1
- box-shadow: $shadow;
-}
-
-// Box sizing
-@mixin box-sizing($boxmodel) {
- -webkit-box-sizing: $boxmodel;
- -moz-box-sizing: $boxmodel;
- box-sizing: $boxmodel;
-}
-
-// CSS3 Content Columns
-@mixin content-columns($column-count, $column-gap: $grid-gutter-width) {
- -webkit-column-count: $column-count;
- -moz-column-count: $column-count;
- column-count: $column-count;
- -webkit-column-gap: $column-gap;
- -moz-column-gap: $column-gap;
- column-gap: $column-gap;
-}
-
-// Optional hyphenation
-@mixin hyphens($mode: auto) {
- word-wrap: break-word;
- -webkit-hyphens: $mode;
- -moz-hyphens: $mode;
- -ms-hyphens: $mode; // IE10+
- -o-hyphens: $mode;
- hyphens: $mode;
-}
-
-// Placeholder text
-@mixin placeholder($color: $input-color-placeholder) {
- // Firefox
- &::-moz-placeholder {
- color: $color;
- opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526
- }
- &:-ms-input-placeholder { color: $color; } // Internet Explorer 10+
- &::-webkit-input-placeholder { color: $color; } // Safari and Chrome
-}
-
-// Transformations
-@mixin scale($ratio...) {
- -webkit-transform: scale($ratio);
- -ms-transform: scale($ratio); // IE9 only
- -o-transform: scale($ratio);
- transform: scale($ratio);
-}
-
-@mixin scaleX($ratio) {
- -webkit-transform: scaleX($ratio);
- -ms-transform: scaleX($ratio); // IE9 only
- -o-transform: scaleX($ratio);
- transform: scaleX($ratio);
-}
-@mixin scaleY($ratio) {
- -webkit-transform: scaleY($ratio);
- -ms-transform: scaleY($ratio); // IE9 only
- -o-transform: scaleY($ratio);
- transform: scaleY($ratio);
-}
-@mixin skew($x, $y) {
- -webkit-transform: skewX($x) skewY($y);
- -ms-transform: skewX($x) skewY($y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+
- -o-transform: skewX($x) skewY($y);
- transform: skewX($x) skewY($y);
-}
-@mixin translate($x, $y) {
- -webkit-transform: translate($x, $y);
- -ms-transform: translate($x, $y); // IE9 only
- -o-transform: translate($x, $y);
- transform: translate($x, $y);
-}
-@mixin translate3d($x, $y, $z) {
- -webkit-transform: translate3d($x, $y, $z);
- transform: translate3d($x, $y, $z);
-}
-@mixin rotate($degrees) {
- -webkit-transform: rotate($degrees);
- -ms-transform: rotate($degrees); // IE9 only
- -o-transform: rotate($degrees);
- transform: rotate($degrees);
-}
-@mixin rotateX($degrees) {
- -webkit-transform: rotateX($degrees);
- -ms-transform: rotateX($degrees); // IE9 only
- -o-transform: rotateX($degrees);
- transform: rotateX($degrees);
-}
-@mixin rotateY($degrees) {
- -webkit-transform: rotateY($degrees);
- -ms-transform: rotateY($degrees); // IE9 only
- -o-transform: rotateY($degrees);
- transform: rotateY($degrees);
-}
-@mixin perspective($perspective) {
- -webkit-perspective: $perspective;
- -moz-perspective: $perspective;
- perspective: $perspective;
-}
-@mixin perspective-origin($perspective) {
- -webkit-perspective-origin: $perspective;
- -moz-perspective-origin: $perspective;
- perspective-origin: $perspective;
-}
-@mixin transform-origin($origin) {
- -webkit-transform-origin: $origin;
- -moz-transform-origin: $origin;
- -ms-transform-origin: $origin; // IE9 only
- transform-origin: $origin;
-}
-
-
-// Transitions
-
-@mixin transition($transition...) {
- -webkit-transition: $transition;
- -o-transition: $transition;
- transition: $transition;
-}
-@mixin transition-property($transition-property...) {
- -webkit-transition-property: $transition-property;
- transition-property: $transition-property;
-}
-@mixin transition-delay($transition-delay) {
- -webkit-transition-delay: $transition-delay;
- transition-delay: $transition-delay;
-}
-@mixin transition-duration($transition-duration...) {
- -webkit-transition-duration: $transition-duration;
- transition-duration: $transition-duration;
-}
-@mixin transition-timing-function($timing-function) {
- -webkit-transition-timing-function: $timing-function;
- transition-timing-function: $timing-function;
-}
-@mixin transition-transform($transition...) {
- -webkit-transition: -webkit-transform $transition;
- -moz-transition: -moz-transform $transition;
- -o-transition: -o-transform $transition;
- transition: transform $transition;
-}
-
-
-// User select
-// For selecting text on the page
-
-@mixin user-select($select) {
- -webkit-user-select: $select;
- -moz-user-select: $select;
- -ms-user-select: $select; // IE10+
- user-select: $select;
-}
diff --git a/cove/cove_360/sass/build_360.sh b/cove/cove_360/sass/build_360.sh
deleted file mode 100755
index 61f377c..0000000
--- a/cove/cove_360/sass/build_360.sh
+++ /dev/null
@@ -1 +0,0 @@
-sassc -s compressed -I bootstrap styles-360.scss ../static/dataexplore/css/bootstrap-360.css
diff --git a/cove/cove_360/sass/styles-360.scss b/cove/cove_360/sass/styles-360.scss
deleted file mode 100644
index bca0bfd..0000000
--- a/cove/cove_360/sass/styles-360.scss
+++ /dev/null
@@ -1,3 +0,0 @@
-@import "bootstrap-variables-360";
-@import "bootstrap/bootstrap";
-@import "_custom-360";
diff --git a/cove/cove_360/static/dataexplore/css/bootstrap-360.css b/cove/cove_360/static/dataexplore/css/bootstrap-360.css
deleted file mode 100644
index 3962807..0000000
--- a/cove/cove_360/static/dataexplore/css/bootstrap-360.css
+++ /dev/null
@@ -1,5 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright 2011-2016 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */@import url("https://fonts.googleapis.com/css?family=Lato:400,700,400italic");html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,*:before,*:after{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}@font-face{font-family:'Glyphicons Halflings';src:url("../fonts/bootstrap/glyphicons-halflings-regular.eot");src:url("../fonts/bootstrap/glyphicons-halflings-regular.eot?#iefix") format("embedded-opentype"),url("../fonts/bootstrap/glyphicons-halflings-regular.woff2") format("woff2"),url("../fonts/bootstrap/glyphicons-halflings-regular.woff") format("woff"),url("../fonts/bootstrap/glyphicons-halflings-regular.ttf") format("truetype"),url("../fonts/bootstrap/glyphicons-halflings-regular.svg#glyphicons_halflingsregular") format("svg")}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-euro:before,.glyphicon-eur:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Lato","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:15px;line-height:1.42857;color:#2C3E50;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#2e666b;text-decoration:none}a:hover,a:focus{color:#2e666b;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857;background-color:#fff;border:1px solid #ecf0f1;border-radius:4px;-webkit-transition:all 0.2s ease-in-out;-o-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:21px;margin-bottom:21px;border:0;border-top:1px solid #ecf0f1}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role="button"]{cursor:pointer}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Assistant",sans-serif;font-weight:100;line-height:1.1;color:inherit}h1 small,h1 .small,h2 small,h2 .small,h3 small,h3 .small,h4 small,h4 .small,h5 small,h5 .small,h6 small,h6 .small,.h1 small,.h1 .small,.h2 small,.h2 .small,.h3 small,.h3 .small,.h4 small,.h4 .small,.h5 small,.h5 .small,.h6 small,.h6 .small{font-weight:normal;line-height:1;color:#7b8a8b}h1,.h1,h2,.h2,h3,.h3{margin-top:21px;margin-bottom:10.5px}h1 small,h1 .small,.h1 small,.h1 .small,h2 small,h2 .small,.h2 small,.h2 .small,h3 small,h3 .small,.h3 small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10.5px;margin-bottom:10.5px}h4 small,h4 .small,.h4 small,.h4 .small,h5 small,h5 .small,.h5 small,.h5 .small,h6 small,h6 .small,.h6 small,.h6 .small{font-size:75%}h1,.h1{font-size:39px}h2,.h2{font-size:32px}h3,.h3{font-size:26px}h4,.h4{font-size:19px}h5,.h5{font-size:15px}h6,.h6{font-size:13px}p{margin:0 0 10.5px}.lead{margin-bottom:21px;font-size:17px;font-weight:300;line-height:1.4}@media (min-width: 768px){.lead{font-size:22.5px}}small,.small{font-size:100%}mark,.mark{background-color:#F39C12;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase,.initialism{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#b4bcc2}.text-primary{color:#2C3E50}a.text-primary:hover,a.text-primary:focus{color:#1a252f}.text-success{color:#fff}a.text-success:hover,a.text-success:focus{color:#e6e6e6}.text-info{color:#fff}a.text-info:hover,a.text-info:focus{color:#e6e6e6}.text-warning{color:#fff}a.text-warning:hover,a.text-warning:focus{color:#e6e6e6}.text-danger{color:#fff}a.text-danger:hover,a.text-danger:focus{color:#e6e6e6}.bg-primary{color:#fff}.bg-primary{background-color:#2C3E50}a.bg-primary:hover,a.bg-primary:focus{background-color:#1a252f}.bg-success{background-color:#2e666b}a.bg-success:hover,a.bg-success:focus{background-color:#1f4447}.bg-info{background-color:#ADADAD}a.bg-info:hover,a.bg-info:focus{background-color:#949494}.bg-warning{background-color:#F39C12}a.bg-warning:hover,a.bg-warning:focus{background-color:#c87f0a}.bg-danger{background-color:#E74C3C}a.bg-danger:hover,a.bg-danger:focus{background-color:#d62c1a}.page-header{padding-bottom:9.5px;margin:42px 0 21px;border-bottom:1px solid rgba(0,0,0,0)}ul,ol{margin-top:0;margin-bottom:10.5px}ul ul,ul ol,ol ul,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:21px}dt,dd{line-height:1.42857}dt{font-weight:bold}dd{margin-left:0}.dl-horizontal dd:before,.dl-horizontal dd:after{content:" ";display:table}.dl-horizontal dd:after{clear:both}@media (min-width: 768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #b4bcc2}.initialism{font-size:90%}blockquote{padding:10.5px 21px;margin:0 0 21px;font-size:18.75px;border-left:5px solid #ecf0f1}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857;color:#b4bcc2}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #ecf0f1;border-left:0;text-align:right}.blockquote-reverse footer:before,.blockquote-reverse small:before,.blockquote-reverse .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,.blockquote-reverse small:after,.blockquote-reverse .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:21px;font-style:normal;line-height:1.42857}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:bold;box-shadow:none}pre{display:block;padding:10px;margin:0 0 10.5px;font-size:14px;line-height:1.42857;word-break:break-all;word-wrap:break-word;color:#7b8a8b;background-color:#ecf0f1;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.container:before,.container:after{content:" ";display:table}.container:after{clear:both}@media (min-width: 768px){.container{width:750px}}@media (min-width: 992px){.container{width:970px}}@media (min-width: 1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.container-fluid:before,.container-fluid:after{content:" ";display:table}.container-fluid:after{clear:both}.row{margin-left:-15px;margin-right:-15px}.row:before,.row:after{content:" ";display:table}.row:after{clear:both}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-1{width:8.33333%}.col-xs-2{width:16.66667%}.col-xs-3{width:25%}.col-xs-4{width:33.33333%}.col-xs-5{width:41.66667%}.col-xs-6{width:50%}.col-xs-7{width:58.33333%}.col-xs-8{width:66.66667%}.col-xs-9{width:75%}.col-xs-10{width:83.33333%}.col-xs-11{width:91.66667%}.col-xs-12{width:100%}.col-xs-pull-0{right:auto}.col-xs-pull-1{right:8.33333%}.col-xs-pull-2{right:16.66667%}.col-xs-pull-3{right:25%}.col-xs-pull-4{right:33.33333%}.col-xs-pull-5{right:41.66667%}.col-xs-pull-6{right:50%}.col-xs-pull-7{right:58.33333%}.col-xs-pull-8{right:66.66667%}.col-xs-pull-9{right:75%}.col-xs-pull-10{right:83.33333%}.col-xs-pull-11{right:91.66667%}.col-xs-pull-12{right:100%}.col-xs-push-0{left:auto}.col-xs-push-1{left:8.33333%}.col-xs-push-2{left:16.66667%}.col-xs-push-3{left:25%}.col-xs-push-4{left:33.33333%}.col-xs-push-5{left:41.66667%}.col-xs-push-6{left:50%}.col-xs-push-7{left:58.33333%}.col-xs-push-8{left:66.66667%}.col-xs-push-9{left:75%}.col-xs-push-10{left:83.33333%}.col-xs-push-11{left:91.66667%}.col-xs-push-12{left:100%}.col-xs-offset-0{margin-left:0%}.col-xs-offset-1{margin-left:8.33333%}.col-xs-offset-2{margin-left:16.66667%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-4{margin-left:33.33333%}.col-xs-offset-5{margin-left:41.66667%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-7{margin-left:58.33333%}.col-xs-offset-8{margin-left:66.66667%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-10{margin-left:83.33333%}.col-xs-offset-11{margin-left:91.66667%}.col-xs-offset-12{margin-left:100%}@media (min-width: 768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-1{width:8.33333%}.col-sm-2{width:16.66667%}.col-sm-3{width:25%}.col-sm-4{width:33.33333%}.col-sm-5{width:41.66667%}.col-sm-6{width:50%}.col-sm-7{width:58.33333%}.col-sm-8{width:66.66667%}.col-sm-9{width:75%}.col-sm-10{width:83.33333%}.col-sm-11{width:91.66667%}.col-sm-12{width:100%}.col-sm-pull-0{right:auto}.col-sm-pull-1{right:8.33333%}.col-sm-pull-2{right:16.66667%}.col-sm-pull-3{right:25%}.col-sm-pull-4{right:33.33333%}.col-sm-pull-5{right:41.66667%}.col-sm-pull-6{right:50%}.col-sm-pull-7{right:58.33333%}.col-sm-pull-8{right:66.66667%}.col-sm-pull-9{right:75%}.col-sm-pull-10{right:83.33333%}.col-sm-pull-11{right:91.66667%}.col-sm-pull-12{right:100%}.col-sm-push-0{left:auto}.col-sm-push-1{left:8.33333%}.col-sm-push-2{left:16.66667%}.col-sm-push-3{left:25%}.col-sm-push-4{left:33.33333%}.col-sm-push-5{left:41.66667%}.col-sm-push-6{left:50%}.col-sm-push-7{left:58.33333%}.col-sm-push-8{left:66.66667%}.col-sm-push-9{left:75%}.col-sm-push-10{left:83.33333%}.col-sm-push-11{left:91.66667%}.col-sm-push-12{left:100%}.col-sm-offset-0{margin-left:0%}.col-sm-offset-1{margin-left:8.33333%}.col-sm-offset-2{margin-left:16.66667%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-4{margin-left:33.33333%}.col-sm-offset-5{margin-left:41.66667%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-7{margin-left:58.33333%}.col-sm-offset-8{margin-left:66.66667%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-10{margin-left:83.33333%}.col-sm-offset-11{margin-left:91.66667%}.col-sm-offset-12{margin-left:100%}}@media (min-width: 992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-1{width:8.33333%}.col-md-2{width:16.66667%}.col-md-3{width:25%}.col-md-4{width:33.33333%}.col-md-5{width:41.66667%}.col-md-6{width:50%}.col-md-7{width:58.33333%}.col-md-8{width:66.66667%}.col-md-9{width:75%}.col-md-10{width:83.33333%}.col-md-11{width:91.66667%}.col-md-12{width:100%}.col-md-pull-0{right:auto}.col-md-pull-1{right:8.33333%}.col-md-pull-2{right:16.66667%}.col-md-pull-3{right:25%}.col-md-pull-4{right:33.33333%}.col-md-pull-5{right:41.66667%}.col-md-pull-6{right:50%}.col-md-pull-7{right:58.33333%}.col-md-pull-8{right:66.66667%}.col-md-pull-9{right:75%}.col-md-pull-10{right:83.33333%}.col-md-pull-11{right:91.66667%}.col-md-pull-12{right:100%}.col-md-push-0{left:auto}.col-md-push-1{left:8.33333%}.col-md-push-2{left:16.66667%}.col-md-push-3{left:25%}.col-md-push-4{left:33.33333%}.col-md-push-5{left:41.66667%}.col-md-push-6{left:50%}.col-md-push-7{left:58.33333%}.col-md-push-8{left:66.66667%}.col-md-push-9{left:75%}.col-md-push-10{left:83.33333%}.col-md-push-11{left:91.66667%}.col-md-push-12{left:100%}.col-md-offset-0{margin-left:0%}.col-md-offset-1{margin-left:8.33333%}.col-md-offset-2{margin-left:16.66667%}.col-md-offset-3{margin-left:25%}.col-md-offset-4{margin-left:33.33333%}.col-md-offset-5{margin-left:41.66667%}.col-md-offset-6{margin-left:50%}.col-md-offset-7{margin-left:58.33333%}.col-md-offset-8{margin-left:66.66667%}.col-md-offset-9{margin-left:75%}.col-md-offset-10{margin-left:83.33333%}.col-md-offset-11{margin-left:91.66667%}.col-md-offset-12{margin-left:100%}}@media (min-width: 1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-1{width:8.33333%}.col-lg-2{width:16.66667%}.col-lg-3{width:25%}.col-lg-4{width:33.33333%}.col-lg-5{width:41.66667%}.col-lg-6{width:50%}.col-lg-7{width:58.33333%}.col-lg-8{width:66.66667%}.col-lg-9{width:75%}.col-lg-10{width:83.33333%}.col-lg-11{width:91.66667%}.col-lg-12{width:100%}.col-lg-pull-0{right:auto}.col-lg-pull-1{right:8.33333%}.col-lg-pull-2{right:16.66667%}.col-lg-pull-3{right:25%}.col-lg-pull-4{right:33.33333%}.col-lg-pull-5{right:41.66667%}.col-lg-pull-6{right:50%}.col-lg-pull-7{right:58.33333%}.col-lg-pull-8{right:66.66667%}.col-lg-pull-9{right:75%}.col-lg-pull-10{right:83.33333%}.col-lg-pull-11{right:91.66667%}.col-lg-pull-12{right:100%}.col-lg-push-0{left:auto}.col-lg-push-1{left:8.33333%}.col-lg-push-2{left:16.66667%}.col-lg-push-3{left:25%}.col-lg-push-4{left:33.33333%}.col-lg-push-5{left:41.66667%}.col-lg-push-6{left:50%}.col-lg-push-7{left:58.33333%}.col-lg-push-8{left:66.66667%}.col-lg-push-9{left:75%}.col-lg-push-10{left:83.33333%}.col-lg-push-11{left:91.66667%}.col-lg-push-12{left:100%}.col-lg-offset-0{margin-left:0%}.col-lg-offset-1{margin-left:8.33333%}.col-lg-offset-2{margin-left:16.66667%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-4{margin-left:33.33333%}.col-lg-offset-5{margin-left:41.66667%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-7{margin-left:58.33333%}.col-lg-offset-8{margin-left:66.66667%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-10{margin-left:83.33333%}.col-lg-offset-11{margin-left:91.66667%}.col-lg-offset-12{margin-left:100%}}table{background-color:rgba(0,0,0,0)}caption{padding-top:8px;padding-bottom:8px;color:#b4bcc2;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:21px}.table>thead>tr>th,.table>thead>tr>td,.table>tbody>tr>th,.table>tbody>tr>td,.table>tfoot>tr>th,.table>tfoot>tr>td{padding:8px;line-height:1.42857;vertical-align:top;border-top:1px solid #ecf0f1}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ecf0f1}.table>caption+thead>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>th,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ecf0f1}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ecf0f1}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>tfoot>tr>td{border:1px solid #ecf0f1}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#ecf0f1}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>thead>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th{background-color:#ecf0f1}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#dde4e6}.table>thead>tr>td.success,.table>thead>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th{background-color:#2e666b}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#265559}.table>thead>tr>td.info,.table>thead>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th{background-color:#ADADAD}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#a0a0a0}.table>thead>tr>td.warning,.table>thead>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th{background-color:#F39C12}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#e08e0b}.table>thead>tr>td.danger,.table>thead>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th{background-color:#E74C3C}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#e43725}.table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width: 767px){.table-responsive{width:100%;margin-bottom:15.75px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ecf0f1}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:21px;font-size:22.5px;line-height:inherit;color:#2C3E50;border:0;border-bottom:1px solid rgba(0,0,0,0)}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:11px;font-size:15px;line-height:1.42857;color:#2C3E50}.form-control{display:block;width:100%;height:45px;padding:10px 15px;font-size:15px;line-height:1.42857;color:#2C3E50;background-color:#fff;background-image:none;border:1px solid #dce4ec;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s;-o-transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s;transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s}.form-control:focus{border-color:#2C3E50;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(44,62,80,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(44,62,80,0.6)}.form-control::-moz-placeholder{color:#acb6c0;opacity:1}.form-control:-ms-input-placeholder{color:#acb6c0}.form-control::-webkit-input-placeholder{color:#acb6c0}.form-control::-ms-expand{border:0;background-color:transparent}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#ecf0f1;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio: 0){input[type="date"].form-control,input[type="time"].form-control,input[type="datetime-local"].form-control,input[type="month"].form-control{line-height:45px}input[type="date"].input-sm,.input-group-sm>[type="date"].form-control,.input-group-sm>[type="date"].input-group-addon,.input-group-sm>.input-group-btn>[type="date"].btn,.input-group-sm input[type="date"],input[type="time"].input-sm,.input-group-sm>[type="time"].form-control,.input-group-sm>[type="time"].input-group-addon,.input-group-sm>.input-group-btn>[type="time"].btn,.input-group-sm input[type="time"],input[type="datetime-local"].input-sm,.input-group-sm>[type="datetime-local"].form-control,.input-group-sm>[type="datetime-local"].input-group-addon,.input-group-sm>.input-group-btn>[type="datetime-local"].btn,.input-group-sm input[type="datetime-local"],input[type="month"].input-sm,.input-group-sm>[type="month"].form-control,.input-group-sm>[type="month"].input-group-addon,.input-group-sm>.input-group-btn>[type="month"].btn,.input-group-sm input[type="month"]{line-height:38px}input[type="date"].input-lg,.input-group-lg>[type="date"].form-control,.input-group-lg>[type="date"].input-group-addon,.input-group-lg>.input-group-btn>[type="date"].btn,.input-group-lg input[type="date"],input[type="time"].input-lg,.input-group-lg>[type="time"].form-control,.input-group-lg>[type="time"].input-group-addon,.input-group-lg>.input-group-btn>[type="time"].btn,.input-group-lg input[type="time"],input[type="datetime-local"].input-lg,.input-group-lg>[type="datetime-local"].form-control,.input-group-lg>[type="datetime-local"].input-group-addon,.input-group-lg>.input-group-btn>[type="datetime-local"].btn,.input-group-lg input[type="datetime-local"],input[type="month"].input-lg,.input-group-lg>[type="month"].form-control,.input-group-lg>[type="month"].input-group-addon,.input-group-lg>.input-group-btn>[type="month"].btn,.input-group-lg input[type="month"]{line-height:66px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:21px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="radio"].disabled,fieldset[disabled] input[type="radio"],input[type="checkbox"][disabled],input[type="checkbox"].disabled,fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,fieldset[disabled] .radio-inline,.checkbox-inline.disabled,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,fieldset[disabled] .radio label,.checkbox.disabled label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:11px;padding-bottom:11px;margin-bottom:0;min-height:36px}.form-control-static.input-lg,.input-group-lg>.form-control-static.form-control,.input-group-lg>.form-control-static.input-group-addon,.input-group-lg>.input-group-btn>.form-control-static.btn,.form-control-static.input-sm,.input-group-sm>.form-control-static.form-control,.input-group-sm>.form-control-static.input-group-addon,.input-group-sm>.input-group-btn>.form-control-static.btn{padding-left:0;padding-right:0}.input-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:38px;padding:6px 9px;font-size:15px;line-height:1.5;border-radius:3px}select.input-sm,.input-group-sm>select.form-control,.input-group-sm>select.input-group-addon,.input-group-sm>.input-group-btn>select.btn{height:38px;line-height:38px}textarea.input-sm,.input-group-sm>textarea.form-control,.input-group-sm>textarea.input-group-addon,.input-group-sm>.input-group-btn>textarea.btn,select[multiple].input-sm,.input-group-sm>[multiple].form-control,.input-group-sm>[multiple].input-group-addon,.input-group-sm>.input-group-btn>[multiple].btn{height:auto}.form-group-sm .form-control{height:38px;padding:6px 9px;font-size:15px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:38px;line-height:38px}.form-group-sm textarea.form-control,.form-group-sm select[multiple].form-control{height:auto}.form-group-sm .form-control-static{height:38px;min-height:36px;padding:7px 9px;font-size:15px;line-height:1.5}.input-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:66px;padding:18px 27px;font-size:19px;line-height:1.33333;border-radius:6px}select.input-lg,.input-group-lg>select.form-control,.input-group-lg>select.input-group-addon,.input-group-lg>.input-group-btn>select.btn{height:66px;line-height:66px}textarea.input-lg,.input-group-lg>textarea.form-control,.input-group-lg>textarea.input-group-addon,.input-group-lg>.input-group-btn>textarea.btn,select[multiple].input-lg,.input-group-lg>[multiple].form-control,.input-group-lg>[multiple].input-group-addon,.input-group-lg>.input-group-btn>[multiple].btn{height:auto}.form-group-lg .form-control{height:66px;padding:18px 27px;font-size:19px;line-height:1.33333;border-radius:6px}.form-group-lg select.form-control{height:66px;line-height:66px}.form-group-lg textarea.form-control,.form-group-lg select[multiple].form-control{height:auto}.form-group-lg .form-control-static{height:66px;min-height:40px;padding:19px 27px;font-size:19px;line-height:1.33333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:56.25px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:45px;height:45px;line-height:45px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback,.input-group-lg>.form-control+.form-control-feedback,.input-group-lg>.input-group-addon+.form-control-feedback,.input-group-lg>.input-group-btn>.btn+.form-control-feedback,.input-group-lg+.form-control-feedback,.form-group-lg .form-control+.form-control-feedback{width:66px;height:66px;line-height:66px}.input-sm+.form-control-feedback,.input-group-sm>.form-control+.form-control-feedback,.input-group-sm>.input-group-addon+.form-control-feedback,.input-group-sm>.input-group-btn>.btn+.form-control-feedback,.input-group-sm+.form-control-feedback,.form-group-sm .form-control+.form-control-feedback{width:38px;height:38px;line-height:38px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#fff}.has-success .form-control{border-color:#fff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.has-success .input-group-addon{color:#fff;border-color:#fff;background-color:#2e666b}.has-success .form-control-feedback{color:#fff}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#fff}.has-warning .form-control{border-color:#fff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.has-warning .input-group-addon{color:#fff;border-color:#fff;background-color:#F39C12}.has-warning .form-control-feedback{color:#fff}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#fff}.has-error .form-control{border-color:#fff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.has-error .input-group-addon{color:#fff;border-color:#fff;background-color:#E74C3C}.has-error .form-control-feedback{color:#fff}.has-feedback label~.form-control-feedback{top:26px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#597ea2}@media (min-width: 768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:11px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:32px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}.form-horizontal .form-group:before,.form-horizontal .form-group:after{content:" ";display:table}.form-horizontal .form-group:after{clear:both}@media (min-width: 768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:11px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width: 768px){.form-horizontal .form-group-lg .control-label{padding-top:19px;font-size:19px}}@media (min-width: 768px){.form-horizontal .form-group-sm .control-label{padding-top:7px;font-size:15px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:10px 15px;font-size:15px;line-height:1.42857;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn.focus,.btn:active:focus,.btn:active.focus,.btn.active:focus,.btn.active.focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#fff;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#fff;background-color:#95a5a6;border-color:#95a5a6}.btn-default:focus,.btn-default.focus{color:#fff;background-color:#798d8f;border-color:#566566}.btn-default:hover{color:#fff;background-color:#798d8f;border-color:#74898a}.btn-default:active,.btn-default.active,.open>.btn-default.dropdown-toggle{color:#fff;background-color:#798d8f;border-color:#74898a}.btn-default:active:hover,.btn-default:active:focus,.btn-default:active.focus,.btn-default.active:hover,.btn-default.active:focus,.btn-default.active.focus,.open>.btn-default.dropdown-toggle:hover,.open>.btn-default.dropdown-toggle:focus,.open>.btn-default.dropdown-toggle.focus{color:#fff;background-color:#687b7c;border-color:#566566}.btn-default:active,.btn-default.active,.open>.btn-default.dropdown-toggle{background-image:none}.btn-default.disabled:hover,.btn-default.disabled:focus,.btn-default.disabled.focus,.btn-default[disabled]:hover,.btn-default[disabled]:focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default:hover,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default.focus{background-color:#95a5a6;border-color:#95a5a6}.btn-default .badge{color:#95a5a6;background-color:#fff}.btn-primary{color:#fff;background-color:#2C3E50;border-color:#2C3E50}.btn-primary:focus,.btn-primary.focus{color:#fff;background-color:#1a252f;border-color:#000}.btn-primary:hover{color:#fff;background-color:#1a252f;border-color:#161f29}.btn-primary:active,.btn-primary.active,.open>.btn-primary.dropdown-toggle{color:#fff;background-color:#1a252f;border-color:#161f29}.btn-primary:active:hover,.btn-primary:active:focus,.btn-primary:active.focus,.btn-primary.active:hover,.btn-primary.active:focus,.btn-primary.active.focus,.open>.btn-primary.dropdown-toggle:hover,.open>.btn-primary.dropdown-toggle:focus,.open>.btn-primary.dropdown-toggle.focus{color:#fff;background-color:#0d1318;border-color:#000}.btn-primary:active,.btn-primary.active,.open>.btn-primary.dropdown-toggle{background-image:none}.btn-primary.disabled:hover,.btn-primary.disabled:focus,.btn-primary.disabled.focus,.btn-primary[disabled]:hover,.btn-primary[disabled]:focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary:hover,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary.focus{background-color:#2C3E50;border-color:#2C3E50}.btn-primary .badge{color:#2C3E50;background-color:#fff}.btn-success{color:#fff;background-color:#2e666b;border-color:#2e666b}.btn-success:focus,.btn-success.focus{color:#fff;background-color:#1f4447;border-color:#081112}.btn-success:hover{color:#fff;background-color:#1f4447;border-color:#1c3d40}.btn-success:active,.btn-success.active,.open>.btn-success.dropdown-toggle{color:#fff;background-color:#1f4447;border-color:#1c3d40}.btn-success:active:hover,.btn-success:active:focus,.btn-success:active.focus,.btn-success.active:hover,.btn-success.active:focus,.btn-success.active.focus,.open>.btn-success.dropdown-toggle:hover,.open>.btn-success.dropdown-toggle:focus,.open>.btn-success.dropdown-toggle.focus{color:#fff;background-color:#142c2e;border-color:#081112}.btn-success:active,.btn-success.active,.open>.btn-success.dropdown-toggle{background-image:none}.btn-success.disabled:hover,.btn-success.disabled:focus,.btn-success.disabled.focus,.btn-success[disabled]:hover,.btn-success[disabled]:focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success:hover,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success.focus{background-color:#2e666b;border-color:#2e666b}.btn-success .badge{color:#2e666b;background-color:#fff}.btn-info{color:#fff;background-color:#ADADAD;border-color:#ADADAD}.btn-info:focus,.btn-info.focus{color:#fff;background-color:#949494;border-color:#6d6d6d}.btn-info:hover{color:#fff;background-color:#949494;border-color:#8e8e8e}.btn-info:active,.btn-info.active,.open>.btn-info.dropdown-toggle{color:#fff;background-color:#949494;border-color:#8e8e8e}.btn-info:active:hover,.btn-info:active:focus,.btn-info:active.focus,.btn-info.active:hover,.btn-info.active:focus,.btn-info.active.focus,.open>.btn-info.dropdown-toggle:hover,.open>.btn-info.dropdown-toggle:focus,.open>.btn-info.dropdown-toggle.focus{color:#fff;background-color:#828282;border-color:#6d6d6d}.btn-info:active,.btn-info.active,.open>.btn-info.dropdown-toggle{background-image:none}.btn-info.disabled:hover,.btn-info.disabled:focus,.btn-info.disabled.focus,.btn-info[disabled]:hover,.btn-info[disabled]:focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info:hover,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info.focus{background-color:#ADADAD;border-color:#ADADAD}.btn-info .badge{color:#ADADAD;background-color:#fff}.btn-warning{color:#fff;background-color:#F39C12;border-color:#F39C12}.btn-warning:focus,.btn-warning.focus{color:#fff;background-color:#c87f0a;border-color:#7f5006}.btn-warning:hover{color:#fff;background-color:#c87f0a;border-color:#be780a}.btn-warning:active,.btn-warning.active,.open>.btn-warning.dropdown-toggle{color:#fff;background-color:#c87f0a;border-color:#be780a}.btn-warning:active:hover,.btn-warning:active:focus,.btn-warning:active.focus,.btn-warning.active:hover,.btn-warning.active:focus,.btn-warning.active.focus,.open>.btn-warning.dropdown-toggle:hover,.open>.btn-warning.dropdown-toggle:focus,.open>.btn-warning.dropdown-toggle.focus{color:#fff;background-color:#a66908;border-color:#7f5006}.btn-warning:active,.btn-warning.active,.open>.btn-warning.dropdown-toggle{background-image:none}.btn-warning.disabled:hover,.btn-warning.disabled:focus,.btn-warning.disabled.focus,.btn-warning[disabled]:hover,.btn-warning[disabled]:focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning:hover,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning.focus{background-color:#F39C12;border-color:#F39C12}.btn-warning .badge{color:#F39C12;background-color:#fff}.btn-danger{color:#fff;background-color:#E74C3C;border-color:#E74C3C}.btn-danger:focus,.btn-danger.focus{color:#fff;background-color:#d62c1a;border-color:#921e12}.btn-danger:hover{color:#fff;background-color:#d62c1a;border-color:#cd2a19}.btn-danger:active,.btn-danger.active,.open>.btn-danger.dropdown-toggle{color:#fff;background-color:#d62c1a;border-color:#cd2a19}.btn-danger:active:hover,.btn-danger:active:focus,.btn-danger:active.focus,.btn-danger.active:hover,.btn-danger.active:focus,.btn-danger.active.focus,.open>.btn-danger.dropdown-toggle:hover,.open>.btn-danger.dropdown-toggle:focus,.open>.btn-danger.dropdown-toggle.focus{color:#fff;background-color:#b62516;border-color:#921e12}.btn-danger:active,.btn-danger.active,.open>.btn-danger.dropdown-toggle{background-image:none}.btn-danger.disabled:hover,.btn-danger.disabled:focus,.btn-danger.disabled.focus,.btn-danger[disabled]:hover,.btn-danger[disabled]:focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger:hover,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger.focus{background-color:#E74C3C;border-color:#E74C3C}.btn-danger .badge{color:#E74C3C;background-color:#fff}.btn-link{color:#2e666b;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2e666b;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:hover,fieldset[disabled] .btn-link:focus{color:#b4bcc2;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:18px 27px;font-size:19px;line-height:1.33333;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:6px 9px;font-size:15px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:15px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height,visibility;transition-property:height,visibility;-webkit-transition-duration:0.35s;transition-duration:0.35s;-webkit-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid \9;border-right:4px solid transparent;border-left:4px solid transparent}.dropup,.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:15px;text-align:left;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9.5px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857;color:#7b8a8b;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#fff;background-color:#2C3E50}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#2C3E50}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#b4bcc2}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:15px;line-height:1.42857;color:#b4bcc2;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid \9;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width: 768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn:hover,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar:before,.btn-toolbar:after{content:" ";display:table}.btn-toolbar:after{clear:both}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle,.btn-group-lg.btn-group>.btn+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret,.btn-group-lg>.btn .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret,.dropup .btn-group-lg>.btn .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{content:" ";display:table}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:10px 15px;font-size:15px;font-weight:normal;line-height:1;color:#2C3E50;text-align:center;background-color:#ecf0f1;border:1px solid #dce4ec;border-radius:4px}.input-group-addon.input-sm,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.input-group-addon.btn{padding:6px 9px;font-size:15px;border-radius:3px}.input-group-addon.input-lg,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.input-group-addon.btn{padding:18px 27px;font-size:19px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav:before,.nav:after{content:" ";display:table}.nav:after{clear:both}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#ecf0f1}.nav>li.disabled>a{color:#b4bcc2}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#b4bcc2;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#ecf0f1;border-color:#2e666b}.nav .nav-divider{height:1px;margin:9.5px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ecf0f1}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#ecf0f1 #ecf0f1 #ecf0f1}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#2C3E50;background-color:#fff;border:1px solid #ecf0f1;border-bottom-color:transparent;cursor:default}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#2C3E50}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified,.nav-tabs.nav-justified{width:100%}.nav-justified>li,.nav-tabs.nav-justified>li{float:none}.nav-justified>li>a,.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width: 768px){.nav-justified>li,.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a,.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified,.nav-tabs.nav-justified{border-bottom:0}.nav-tabs-justified>li>a,.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs.nav-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ecf0f1}@media (min-width: 768px){.nav-tabs-justified>li>a,.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ecf0f1;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs.nav-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:80px;margin-bottom:21px;border:1px solid transparent}.navbar:before,.navbar:after{content:" ";display:table}.navbar:after{clear:both}@media (min-width: 768px){.navbar{border-radius:0}}.navbar-header:before,.navbar-header:after{content:" ";display:table}.navbar-header:after{clear:both}@media (min-width: 768px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse:before,.navbar-collapse:after{content:" ";display:table}.navbar-collapse:after{clear:both}.navbar-collapse.in{overflow-y:auto}@media (min-width: 768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width: 480px) and (orientation: landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-header,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width: 768px){.container>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-header,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width: 768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width: 768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:29.5px 15px;font-size:19px;line-height:21px;height:80px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width: 768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:23px;margin-bottom:23px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width: 768px){.navbar-toggle{display:none}}.navbar-nav{margin:14.75px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:21px}@media (max-width: 767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:21px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width: 768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:29.5px;padding-bottom:29.5px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:17.5px;margin-bottom:17.5px}@media (min-width: 768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width: 767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width: 768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:17.5px;margin-bottom:17.5px}.navbar-btn.btn-sm,.btn-group-sm>.navbar-btn.btn{margin-top:21px;margin-bottom:21px}.navbar-btn.btn-xs,.btn-group-xs>.navbar-btn.btn{margin-top:29px;margin-bottom:29px}.navbar-text{margin-top:29.5px;margin-bottom:29.5px}@media (min-width: 768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}}@media (min-width: 768px){.navbar-left{float:left !important}.navbar-right{float:right !important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#2C3E50;border-color:rgba(0,0,0,0)}.navbar-default .navbar-brand{color:#fff}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#2e666b;background-color:rgba(0,0,0,0)}.navbar-default .navbar-text{color:#fff}.navbar-default .navbar-nav>li>a{color:#fff}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#2e666b;background-color:rgba(0,0,0,0)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#fff;background-color:#1a252f}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:rgba(0,0,0,0)}.navbar-default .navbar-toggle{border-color:#1a252f}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#1a252f}.navbar-default .navbar-toggle .icon-bar{background-color:#fff}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:rgba(0,0,0,0)}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#1a252f;color:#fff}@media (max-width: 767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#fff}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#2e666b;background-color:rgba(0,0,0,0)}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#1a252f}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:rgba(0,0,0,0)}}.navbar-default .navbar-link{color:#fff}.navbar-default .navbar-link:hover{color:#2e666b}.navbar-default .btn-link{color:#fff}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#2e666b}.navbar-default .btn-link[disabled]:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:hover,fieldset[disabled] .navbar-default .btn-link:focus{color:#ccc}.navbar-inverse{background-color:#2e666b;border-color:rgba(0,0,0,0)}.navbar-inverse .navbar-brand{color:#fff}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#2C3E50;background-color:rgba(0,0,0,0)}.navbar-inverse .navbar-text{color:#fff}.navbar-inverse .navbar-nav>li>a{color:#fff}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#2C3E50;background-color:rgba(0,0,0,0)}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#265559}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#ccc;background-color:rgba(0,0,0,0)}.navbar-inverse .navbar-toggle{border-color:#1f4447}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#1f4447}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#234e52}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#265559;color:#fff}@media (max-width: 767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:rgba(0,0,0,0)}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:rgba(0,0,0,0)}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#fff}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#2C3E50;background-color:rgba(0,0,0,0)}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#265559}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:rgba(0,0,0,0)}}.navbar-inverse .navbar-link{color:#fff}.navbar-inverse .navbar-link:hover{color:#2C3E50}.navbar-inverse .btn-link{color:#fff}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#2C3E50}.navbar-inverse .btn-link[disabled]:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:hover,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#ccc}.breadcrumb{padding:8px 15px;margin-bottom:21px;list-style:none;background-color:#ecf0f1;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/ ";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#95a5a6}.pagination{display:inline-block;padding-left:0;margin:21px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:10px 15px;line-height:1.42857;text-decoration:none;color:#fff;background-color:#2e666b;border:1px solid rgba(0,0,0,0);margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>a:focus,.pagination>li>span:hover,.pagination>li>span:focus{z-index:2;color:#fff;background-color:#173336;border-color:rgba(0,0,0,0)}.pagination>.active>a,.pagination>.active>a:hover,.pagination>.active>a:focus,.pagination>.active>span,.pagination>.active>span:hover,.pagination>.active>span:focus{z-index:3;color:#fff;background-color:#173336;border-color:rgba(0,0,0,0);cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#ecf0f1;background-color:#4599a1;border-color:rgba(0,0,0,0);cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:18px 27px;font-size:19px;line-height:1.33333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:6px 9px;font-size:15px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:21px 0;list-style:none;text-align:center}.pager:before,.pager:after{content:" ";display:table}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#2e666b;border:1px solid rgba(0,0,0,0);border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#173336}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#fff;background-color:#2e666b;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label:empty{display:none}.btn .label{position:relative;top:-1px}a.label:hover,a.label:focus{color:#fff;text-decoration:none;cursor:pointer}.label-default{background-color:#95a5a6}.label-default[href]:hover,.label-default[href]:focus{background-color:#798d8f}.label-primary{background-color:#2C3E50}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#1a252f}.label-success{background-color:#2e666b}.label-success[href]:hover,.label-success[href]:focus{background-color:#1f4447}.label-info{background-color:#ADADAD}.label-info[href]:hover,.label-info[href]:focus{background-color:#949494}.label-warning{background-color:#F39C12}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#c87f0a}.label-danger{background-color:#E74C3C}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#d62c1a}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:15px;font-weight:bold;color:#fff;line-height:1;vertical-align:middle;white-space:nowrap;text-align:center;background-color:#2C3E50;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge,.btn-group-xs>.btn .badge{top:0;padding:1px 5px}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#2C3E50;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#ecf0f1}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:23px;font-weight:200}.jumbotron>hr{border-top-color:#cfd9db}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px;padding-left:15px;padding-right:15px}.jumbotron .container{max-width:100%}@media screen and (min-width: 768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:68px}}.thumbnail{display:block;padding:4px;margin-bottom:21px;line-height:1.42857;background-color:#fff;border:1px solid #ecf0f1;border-radius:4px;-webkit-transition:border 0.2s ease-in-out;-o-transition:border 0.2s ease-in-out;transition:border 0.2s ease-in-out}.thumbnail>img,.thumbnail a>img{display:block;max-width:100%;height:auto;margin-left:auto;margin-right:auto}.thumbnail .caption{padding:9px;color:#2C3E50}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#2e666b}.alert{padding:15px;margin-bottom:21px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#2e666b;border-color:#2e666b;color:#fff}.alert-success hr{border-top-color:#265559}.alert-success .alert-link{color:#e6e6e6}.alert-info{background-color:#ADADAD;border-color:#ADADAD;color:#fff}.alert-info hr{border-top-color:#a0a0a0}.alert-info .alert-link{color:#e6e6e6}.alert-warning{background-color:#F39C12;border-color:#F39C12;color:#fff}.alert-warning hr{border-top-color:#e08e0b}.alert-warning .alert-link{color:#e6e6e6}.alert-danger{background-color:#E74C3C;border-color:#E74C3C;color:#fff}.alert-danger hr{border-top-color:#e43725}.alert-danger .alert-link{color:#e6e6e6}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:21px;margin-bottom:21px;background-color:#ecf0f1;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0%;height:100%;font-size:15px;line-height:21px;color:#fff;text-align:center;background-color:#2C3E50;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#2e666b}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#ADADAD}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#F39C12}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#E74C3C}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ecf0f1}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus,button.list-group-item:hover,button.list-group-item:focus{text-decoration:none;color:#555;background-color:#ecf0f1}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#ecf0f1;color:#b4bcc2;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#b4bcc2}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#fff;background-color:#2C3E50;border-color:#2C3E50}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#8aa4be}.list-group-item-success{color:#fff;background-color:#2e666b}a.list-group-item-success,button.list-group-item-success{color:#fff}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus,button.list-group-item-success:hover,button.list-group-item-success:focus{color:#fff;background-color:#265559}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus,button.list-group-item-success.active,button.list-group-item-success.active:hover,button.list-group-item-success.active:focus{color:#fff;background-color:#fff;border-color:#fff}.list-group-item-info{color:#fff;background-color:#ADADAD}a.list-group-item-info,button.list-group-item-info{color:#fff}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus,button.list-group-item-info:hover,button.list-group-item-info:focus{color:#fff;background-color:#a0a0a0}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus,button.list-group-item-info.active,button.list-group-item-info.active:hover,button.list-group-item-info.active:focus{color:#fff;background-color:#fff;border-color:#fff}.list-group-item-warning{color:#fff;background-color:#F39C12}a.list-group-item-warning,button.list-group-item-warning{color:#fff}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus,button.list-group-item-warning:hover,button.list-group-item-warning:focus{color:#fff;background-color:#e08e0b}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus,button.list-group-item-warning.active,button.list-group-item-warning.active:hover,button.list-group-item-warning.active:focus{color:#fff;background-color:#fff;border-color:#fff}.list-group-item-danger{color:#fff;background-color:#E74C3C}a.list-group-item-danger,button.list-group-item-danger{color:#fff}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus,button.list-group-item-danger:hover,button.list-group-item-danger:focus{color:#fff;background-color:#e43725}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus,button.list-group-item-danger.active,button.list-group-item-danger.active:hover,button.list-group-item-danger.active:focus{color:#fff;background-color:#fff;border-color:#fff}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:21px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-body:before,.panel-body:after{content:" ";display:table}.panel-body:after{clear:both}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:17px;color:inherit}.panel-title>a,.panel-title>small,.panel-title>.small,.panel-title>small>a,.panel-title>.small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#ecf0f1;border-top:1px solid #ecf0f1;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-left:15px;padding-right:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ecf0f1}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:21px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #ecf0f1}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ecf0f1}.panel-default{border-color:#ecf0f1}.panel-default>.panel-heading{color:#2C3E50;background-color:#ecf0f1;border-color:#ecf0f1}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ecf0f1}.panel-default>.panel-heading .badge{color:#ecf0f1;background-color:#2C3E50}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ecf0f1}.panel-primary{border-color:#2C3E50}.panel-primary>.panel-heading{color:#fff;background-color:#2C3E50;border-color:#2C3E50}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#2C3E50}.panel-primary>.panel-heading .badge{color:#2C3E50;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#2C3E50}.panel-success{border-color:#2e666b}.panel-success>.panel-heading{color:#fff;background-color:#2e666b;border-color:#2e666b}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#2e666b}.panel-success>.panel-heading .badge{color:#2e666b;background-color:#fff}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#2e666b}.panel-info{border-color:#ADADAD}.panel-info>.panel-heading{color:#fff;background-color:#ADADAD;border-color:#ADADAD}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ADADAD}.panel-info>.panel-heading .badge{color:#ADADAD;background-color:#fff}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ADADAD}.panel-warning{border-color:#F39C12}.panel-warning>.panel-heading{color:#fff;background-color:#F39C12;border-color:#F39C12}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#F39C12}.panel-warning>.panel-heading .badge{color:#F39C12;background-color:#fff}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#F39C12}.panel-danger{border-color:#E74C3C}.panel-danger>.panel-heading{color:#fff;background-color:#E74C3C;border-color:#E74C3C}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#E74C3C}.panel-danger>.panel-heading .badge{color:#E74C3C;background-color:#fff}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#E74C3C}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#ecf0f1;border:1px solid rgba(0,0,0,0);border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:22.5px;font-weight:bold;line-height:1;color:#000;text-shadow:none;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);-o-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform 0.3s ease-out;-moz-transition:-moz-transform 0.3s ease-out;-o-transition:-o-transform 0.3s ease-out;transition:transform 0.3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header:before,.modal-header:after{content:" ";display:table}.modal-header:after{clear:both}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857}.modal-body{position:relative;padding:20px}.modal-footer{padding:20px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer:before,.modal-footer:after{content:" ";display:table}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width: 768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width: 992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Lato","Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:15px;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{bottom:0;right:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Lato","Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:15px;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:15px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:fadein(rgba(0,0,0,0.2), 5%);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:fadein(rgba(0,0,0,0.2), 5%)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:fadein(rgba(0,0,0,0.2), 5%);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:fadein(rgba(0,0,0,0.2), 5%)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:0.6s ease-in-out left;-o-transition:0.6s ease-in-out left;transition:0.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto;line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform 0.6s ease-in-out;-moz-transition:-moz-transform 0.6s ease-in-out;-o-transition:-o-transform 0.6s ease-in-out;transition:transform 0.6s ease-in-out;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;-moz-perspective:1000px;perspective:1000px}.carousel-inner>.item.next,.carousel-inner>.item.active.right{-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);left:0}.carousel-inner>.item.prev,.carousel-inner>.item.active.left{-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);left:0}.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right,.carousel-inner>.item.active{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6);background-color:rgba(0,0,0,0)}.carousel-control.left{background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.5) 0%, rgba(0,0,0,0.0001) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.5) 0%, rgba(0,0,0,0.0001) 100%);background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0%, rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0%, rgba(0,0,0,0.5) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.0001) 0%, rgba(0,0,0,0.5) 100%);background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0%, rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;margin-top:-10px;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;line-height:1;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width: 768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after{content:" ";display:table}.clearfix:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs{display:none !important}.visible-sm{display:none !important}.visible-md{display:none !important}.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width: 767px){.visible-xs{display:block !important}table.visible-xs{display:table !important}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width: 767px){.visible-xs-block{display:block !important}}@media (max-width: 767px){.visible-xs-inline{display:inline !important}}@media (max-width: 767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width: 768px) and (max-width: 991px){.visible-sm{display:block !important}table.visible-sm{display:table !important}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width: 768px) and (max-width: 991px){.visible-sm-block{display:block !important}}@media (min-width: 768px) and (max-width: 991px){.visible-sm-inline{display:inline !important}}@media (min-width: 768px) and (max-width: 991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width: 992px) and (max-width: 1199px){.visible-md{display:block !important}table.visible-md{display:table !important}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width: 992px) and (max-width: 1199px){.visible-md-block{display:block !important}}@media (min-width: 992px) and (max-width: 1199px){.visible-md-inline{display:inline !important}}@media (min-width: 992px) and (max-width: 1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width: 1200px){.visible-lg{display:block !important}table.visible-lg{display:table !important}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width: 1200px){.visible-lg-block{display:block !important}}@media (min-width: 1200px){.visible-lg-inline{display:inline !important}}@media (min-width: 1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width: 767px){.hidden-xs{display:none !important}}@media (min-width: 768px) and (max-width: 991px){.hidden-sm{display:none !important}}@media (min-width: 992px) and (max-width: 1199px){.hidden-md{display:none !important}}@media (min-width: 1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table !important}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}body{background-color:white}.expand-collapse-all{text-align:right;padding-top:100px}.panel-title.panel-title-explore{font-size:30px;cursor:pointer}.panel-title.panel-title-explore small{font-weight:100;font-size:45%}.panel-title.panel-title-explore .glyphicon-collapse-down,.panel-title.panel-title-explore .glyphicon-collapse-up{padding-right:0px;line-height:33px;color:#666}.panel-title.panel-title-explore span.glyphicon-save::before{color:#666}.panel-title.panel-title-explore span.glyphicon-list-alt::before{color:#666;vertical-align:text-bottom}.font-tick{font-family:'tick';margin-right:5px}.font-tick.tick{color:green}.font-tick.tick::after{content:'\2713'}.font-tick.cross{color:red}.font-tick.cross::after{content:'\2715'}.font-tick.question{color:orange}.font-tick.question::after{content:'?'}ul.pagination a{padding:4px;font-size:80%}.explore-help{margin:12px 35px}.panel-body p.icon-indent{text-indent:20px}.panel-body p.icon-indent span{color:#666 !important}.info-faq{cursor:pointer;margin-top:20px;font-size:16px;color:#050505;margin-bottom:20px}.info-faq span{font-size:12px;color:#ff9222}.highlight-background-text{background-color:#E7EBE8 !important}.navbar{border-width:0}.navbar-default .badge{background-color:#fff;color:#2C3E50}.navbar-inverse .badge{background-color:#fff;color:#2e666b}.navbar-brand{color:#FFF;font-family:'Ostrich Sans',sans-serif;font-size:48px;letter-spacing:2px;line-height:1.9em;padding:0px 12px}@media (min-width: 768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:0}}.navbar-brand:hover{color:#FFF !important}.navbar-header{margin-left:10px}.btn{border-width:2px}.btn:active{-webkit-box-shadow:none;box-shadow:none}.btn-group.open .dropdown-toggle{-webkit-box-shadow:none;box-shadow:none}.text-primary,.text-primary:hover{color:#2C3E50}.text-success,.text-success:hover{color:#2e666b}.text-danger,.text-danger:hover{color:#E74C3C}.text-warning,.text-warning:hover{color:#F39C12}.text-info,.text-info:hover{color:#ADADAD}h1,.h1,h2,.h2,h3,.h3{margin-top:21px;margin-bottom:10.5px}h1 small,h1 .small,.h1 small,.h1 .small,h2 small,h2 .small,.h2 small,.h2 .small,h3 small,h3 .small,.h3 small,.h3 .small{font-size:85%}h4,.h4,h5,.h5,h6,.h6{margin-top:10.5px;margin-bottom:10.5px}h4 small,h4 .small,.h4 small,.h4 .small,h5 small,h5 .small,.h5 small,.h5 .small,h6 small,h6 .small,.h6 small,.h6 .small{font-size:95%}table a:not(.btn),.table a:not(.btn){text-decoration:underline}table .dropdown-menu a,.table .dropdown-menu a{text-decoration:none}table .success,table .warning,table .danger,table .info,.table .success,.table .warning,.table .danger,.table .info{color:#fff}table .success>th>a,table .success>td>a,table .success>a,table .warning>th>a,table .warning>td>a,table .warning>a,table .danger>th>a,table .danger>td>a,table .danger>a,table .info>th>a,table .info>td>a,table .info>a,.table .success>th>a,.table .success>td>a,.table .success>a,.table .warning>th>a,.table .warning>td>a,.table .warning>a,.table .danger>th>a,.table .danger>td>a,.table .danger>a,.table .info>th>a,.table .info>td>a,.table .info>a{color:#fff}table-bordered>thead>tr>th,table-bordered>tbody>tr>th,table-bordered>tfoot>tr>th,table-bordered>thead>tr>td,table-bordered>tbody>tr>td,table-bordered>tfoot>tr>td,.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ecf0f1}.form-control,input{border-width:2px;-webkit-box-shadow:none;box-shadow:none}.form-control:focus,input:focus{-webkit-box-shadow:none;box-shadow:none}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label,.has-warning .form-control-feedback{color:#F39C12}.has-warning .form-control,.has-warning .form-control:focus{border:2px solid #F39C12}.has-warning .input-group-addon{border-color:#F39C12}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label,.has-error .form-control-feedback{color:#E74C3C}.has-error .form-control,.has-error .form-control:focus{border:2px solid #E74C3C}.has-error .input-group-addon{border-color:#E74C3C}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label,.has-success .form-control-feedback{color:#2e666b}.has-success .form-control,.has-success .form-control:focus{border:2px solid #2e666b}.has-success .input-group-addon{border-color:#2e666b}::-webkit-input-placeholder{font-style:italic}::-moz-placeholder{font-style:italic}:-ms-input-placeholder{font-style:italic}input:-moz-placeholder{font-style:italic}.container-wrapper{background-color:#2e666b;margin-top:-21px;padding-top:15px}.search-box{left:18px}.search-icon{right:18px;z-index:1000;position:relative}.large-search{display:inline-block;vertical-align:top;width:79%;margin:0 auto;padding:10px 20px;border-radius:12px;border:2px solid #e5831e;background-color:#FFF;font-size:28px;height:79px}.large-search-icon{position:absolute;right:38px;top:12px}.search-help{font-size:1.1em;color:#663a0e;padding-top:10px;margin:0 auto;margin-bottom:20px;text-align:center}@media (min-width: 1400px){.col-vlg-offset-1{width:1300px;margin-left:auto;margin-right:auto}}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{border-color:transparent}.pager a,.pager a:hover{color:#fff}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{background-color:#4599a1}.close{color:#fff;text-decoration:none;opacity:0.4}.close:hover,.close:focus{color:#fff;opacity:1}.alert .alert-link{color:#fff;text-decoration:underline}.progress{height:10px;-webkit-box-shadow:none;box-shadow:none}.progress .progress-bar{font-size:10px;line-height:10px}.well{-webkit-box-shadow:none;box-shadow:none}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{border-color:#ecf0f1}a.list-group-item-success.active{background-color:#2e666b}a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{background-color:#265559}a.list-group-item-warning.active{background-color:#F39C12}a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{background-color:#e08e0b}a.list-group-item-danger.active{background-color:#E74C3C}a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{background-color:#e43725}.panel-default .close{color:#2C3E50}.modal .close{color:#2C3E50}.popover{color:#2C3E50}html{font-size:initial}
diff --git a/cove/cove_360/static/dataexplore/css/extra.css b/cove/cove_360/static/dataexplore/css/extra.css
new file mode 100644
index 0000000..4169167
--- /dev/null
+++ b/cove/cove_360/static/dataexplore/css/extra.css
@@ -0,0 +1,9 @@
+ul.list-unstyled {
+ list-style-type: none;
+}
+
+button.show-all-errors-btn {
+ min-width: 70px !important;
+ padding-right: 6px !important;
+ padding-left: 6px !important;
+}
\ No newline at end of file
diff --git a/cove/cove_360/static/dataexplore/css/main.css b/cove/cove_360/static/dataexplore/css/main.css
index f9ba046..2ddef0f 100644
--- a/cove/cove_360/static/dataexplore/css/main.css
+++ b/cove/cove_360/static/dataexplore/css/main.css
@@ -163,14 +163,11 @@ sup {
a {
color: var(--color-accent);
- text-decoration: none;
-webkit-text-decoration-skip: objects; }
a:hover, a:focus {
- color: var(--color-accent);
- text-decoration: none; }
+ color: var(--color-accent); }
a:active {
- color: var(--color-orange);
- text-decoration: none; }
+ color: var(--color-orange); }
a:not([href]):not([tabindex]) {
color: inherit;
@@ -401,6 +398,9 @@ template, [hidden] {
overflow: hidden;
white-space: nowrap; }
+.margin-top\:0 {
+ margin-top: 0 !important; }
+
.margin-top\:05 {
margin-top: .5rem !important; }
@@ -545,6 +545,15 @@ template, [hidden] {
.padding-bottom\:5 {
padding-bottom: 5rem !important; }
+.padding\:0 {
+ padding: 0 !important; }
+
+.justify-content-end {
+ justify-content: end; }
+
+.white-wash {
+ background-color: white !important; }
+
:root {
--gray-05-hsl: 0, 0%, 95%;
--gray-10-hsl: 0, 0%, 90%;
@@ -822,7 +831,9 @@ template, [hidden] {
a {
font-weight: 400;
- color: hsl(var(--teal-dark-hsl), 1); }
+ color: hsl(var(--teal-dark-hsl), 1);
+ text-decoration: underline;
+ text-underline-position: under; }
a:hover {
color: hsl(var(--orange-dark-hsl), 1); }
a:active {
@@ -852,7 +863,7 @@ a {
color: var(--text-color);
display: inline-block;
border-radius: 3px;
- padding: 6px 24px 8px;
+ padding: 6px 24px 6px;
font-size: 1rem;
font-weight: 400;
background-color: var(--bg-color);
@@ -863,7 +874,7 @@ a {
border-width: 1px;
font-size: .9rem; }
.button.button--large {
- padding: 10px 32px 12px;
+ padding: 10px 32px 10px;
border-width: 3px;
font-size: 1.3rem; }
.button.button--unstyled {
@@ -871,19 +882,43 @@ a {
padding: 0; }
.button.button--white {
--border-color: hsla(var(--white-hsl), 1);
- --text-color: hsla(var(--white-hsl), 1); }
+ --text-color: hsla(var(--white-hsl), 1);
+ --bg-color: transparent; }
.button.button--orange {
--border-color: var(--color-orange);
- --text-color: hsla(var(--orange-dark-hsl), 1); }
+ --text-color: hsla(var(--orange-dark-hsl), 1);
+ --bg-color: transparent; }
+ .button.button--orange.button--solid {
+ --text-color: hsla(var(--white-hsl), 1);
+ --bg-color: var(--color-orange); }
.button.button--teal {
--border-color: var(--color-teal);
- --text-color: hsla(var(--teal-dark-hsl), 1); }
+ --text-color: hsla(var(--teal-dark-hsl), 1);
+ --bg-color: transparent; }
+ .button.button--teal.button--solid {
+ --text-color: hsla(var(--white-hsl), 1);
+ --bg-color: var(--color-teal); }
+ .button.button--teal-dark {
+ --border-color: var(--color-teal-dark);
+ --text-color: hsla(var(--teal-dark-hsl), 1);
+ --bg-color: transparent; }
+ .button.button--teal-dark.button--solid {
+ --text-color: hsla(var(--white-hsl), 1);
+ --bg-color: var(--color-teal-dark); }
.button.button--yellow {
--border-color: var(--color-yellow);
- --text-color: var(--color-yellow-dark); }
+ --text-color: var(--color-yellow-dark);
+ --bg-color: transparent; }
+ .button.button--yellow.button--solid {
+ --text-color: hsla(var(--base-hsl), 1);
+ --bg-color: var(--color-yellow); }
.button.button--red {
--border-color: var(--color-red);
- --text-color: var(--color-red); }
+ --text-color: var(--color-red);
+ --bg-color: transparent; }
+ .button.button--red.button--solid {
+ --text-color: hsla(var(--white-hsl), 1);
+ --bg-color: var(--color-red); }
.button.button--black {
--border-color: var(--color-black);
--bg-color: var(--color-black);
@@ -891,6 +926,11 @@ a {
.button.button--disabled {
opacity: .3 !important;
pointer-events: none !important; }
+ .button.button--disabled.button--solid {
+ --text-color: hsla(var(--base-hsl), 1);
+ --bg-color: var(--base-hsl); }
+ .button.bold {
+ font-weight: bold; }
.code-block {
padding: 0 16px;
@@ -1014,8 +1054,7 @@ a {
margin-bottom: 38px; }
.page-title__id a {
font-size: 24px;
- font-weight: 400;
- text-decoration: underline; }
+ font-weight: 400; }
.pager {
font-size: 16px;
@@ -1486,12 +1525,6 @@ p {
font-weight: 400;
color: var(--color-teal-dark); }
-p > a {
- text-decoration: underline; }
-
-ul > li > a {
- text-decoration: underline; }
-
.accordion__trigger {
cursor: pointer; }
@@ -1511,7 +1544,6 @@ ul > li > a {
--scale: 127;
--bar-bg-color: hsla(var(--yellow-hsl), 1); }
.bar-chart__item {
- --value: 0;
display: flex;
padding-bottom: 8px; }
.bar-chart__bar {
@@ -1527,8 +1559,7 @@ ul > li > a {
background-color: var(--bar-bg-color);
width: var(--width); }
.bar-chart__bar > span:after {
- counter-reset: value var(--value);
- content: counter(value);
+ content: attr(data-val);
position: absolute;
left: calc(100% + 8px); }
.bar-chart__label {
@@ -1680,7 +1711,7 @@ ul > li > a {
content: '';
width: 10px;
height: 10px;
- background: url("/images/checkmark-icon.svg") no-repeat;
+ background: url("../images/checkmark-icon.svg") no-repeat;
background-size: cover;
border-radius: 2px;
position: absolute;
@@ -1848,7 +1879,7 @@ ul > li > a {
.filter-list--with-checkboxes .filter-list__form--checkbox-item label::after {
content: '';
position: absolute;
- background: url("/images/checkmark-icon.svg") no-repeat;
+ background: url("../images/checkmark-icon.svg") no-repeat;
background-size: cover;
left: 10px;
top: 10px;
@@ -1940,6 +1971,304 @@ ul > li > a {
border-radius: 3px;
padding: 2px 6px; }
+form.generic-form {
+ /*********** Baseline, reset styles ***********/
+ /* Removes default focus */
+ /******** Chrome, Safari, Opera and Edge Chromium styles ********/
+ /* slider track */
+ /* slider thumb */
+ /*********** Firefox styles ***********/
+ /* slider track */
+ /* slider thumb */ }
+ form.generic-form label {
+ font-size: 1.1875rem;
+ line-height: 1.3157894737;
+ font-weight: 400;
+ display: block;
+ margin-top: 1.3rem;
+ margin-bottom: 0rem; }
+ form.generic-form.fixed-width input[type=text],
+ form.generic-form.fixed-width input[type=email],
+ form.generic-form.fixed-width input[type=color],
+ form.generic-form.fixed-width input[type=url],
+ form.generic-form.fixed-width input[type=search],
+ form.generic-form.fixed-width input[type=tel],
+ form.generic-form.fixed-width input[type=number],
+ form.generic-form.fixed-width input[type=date],
+ form.generic-form.fixed-width input[type=datetime-local],
+ form.generic-form.fixed-width input[type=week],
+ form.generic-form.fixed-width input[type=time],
+ form.generic-form.fixed-width input[type=password],
+ form.generic-form.fixed-width input[type=month],
+ form.generic-form.fixed-width input[type=file],
+ form.generic-form.fixed-width textarea,
+ form.generic-form.fixed-width select {
+ width: 450px;
+ max-width: 100%; }
+ form.generic-form input[type=text],
+ form.generic-form input[type=email],
+ form.generic-form input[type=color],
+ form.generic-form input[type=url],
+ form.generic-form input[type=search],
+ form.generic-form input[type=tel],
+ form.generic-form input[type=number],
+ form.generic-form input[type=date],
+ form.generic-form input[type=datetime-local],
+ form.generic-form input[type=week],
+ form.generic-form input[type=time],
+ form.generic-form input[type=password],
+ form.generic-form input[type=month],
+ form.generic-form input[type=file],
+ form.generic-form textarea,
+ form.generic-form select {
+ font-size: 1.1875rem;
+ line-height: 1.3157894737;
+ margin-top: 5px;
+ padding: 5px;
+ width: auto;
+ min-width: 25%;
+ border: 2px solid hsl(var(--base-hsl), 1);
+ color: hsl(var(--base-hsl), 1);
+ background-color: #fff;
+ display: block; }
+ form.generic-form input[type=text]:focus,
+ form.generic-form input[type=email]:focus,
+ form.generic-form input[type=color]:focus,
+ form.generic-form input[type=url]:focus,
+ form.generic-form input[type=search]:focus,
+ form.generic-form input[type=tel]:focus,
+ form.generic-form input[type=number]:focus,
+ form.generic-form input[type=date]:focus,
+ form.generic-form input[type=datetime-local]:focus,
+ form.generic-form input[type=week]:focus,
+ form.generic-form input[type=time]:focus,
+ form.generic-form input[type=password]:focus,
+ form.generic-form input[type=month]:focus,
+ form.generic-form input[type=file]:focus,
+ form.generic-form textarea:focus,
+ form.generic-form select:focus {
+ outline: 2px solid hsl(var(--yellow-hsl), 1);
+ outline-offset: 0;
+ -webkit-box-shadow: inset 0 0 0 2px;
+ box-shadow: inset 0 0 0 2px; }
+ form.generic-form input[type=text]:focus:required,
+ form.generic-form input[type=email]:focus:required,
+ form.generic-form input[type=color]:focus:required,
+ form.generic-form input[type=url]:focus:required,
+ form.generic-form input[type=search]:focus:required,
+ form.generic-form input[type=tel]:focus:required,
+ form.generic-form input[type=number]:focus:required,
+ form.generic-form input[type=date]:focus:required,
+ form.generic-form input[type=datetime-local]:focus:required,
+ form.generic-form input[type=week]:focus:required,
+ form.generic-form input[type=time]:focus:required,
+ form.generic-form input[type=password]:focus:required,
+ form.generic-form input[type=month]:focus:required,
+ form.generic-form input[type=file]:focus:required,
+ form.generic-form textarea:focus:required,
+ form.generic-form select:focus:required {
+ outline: 2px solid hsl(var(--orange-hsl), 1); }
+ form.generic-form input[type=text]::placeholder,
+ form.generic-form input[type=email]::placeholder,
+ form.generic-form input[type=color]::placeholder,
+ form.generic-form input[type=url]::placeholder,
+ form.generic-form input[type=search]::placeholder,
+ form.generic-form input[type=tel]::placeholder,
+ form.generic-form input[type=number]::placeholder,
+ form.generic-form input[type=date]::placeholder,
+ form.generic-form input[type=datetime-local]::placeholder,
+ form.generic-form input[type=week]::placeholder,
+ form.generic-form input[type=time]::placeholder,
+ form.generic-form input[type=password]::placeholder,
+ form.generic-form input[type=month]::placeholder,
+ form.generic-form input[type=file]::placeholder,
+ form.generic-form textarea::placeholder,
+ form.generic-form select::placeholder {
+ color: hsl(var(--base-hsl), 0.7); }
+ form.generic-form input[type=text].full-width,
+ form.generic-form input[type=email].full-width,
+ form.generic-form input[type=color].full-width,
+ form.generic-form input[type=url].full-width,
+ form.generic-form input[type=search].full-width,
+ form.generic-form input[type=tel].full-width,
+ form.generic-form input[type=number].full-width,
+ form.generic-form input[type=date].full-width,
+ form.generic-form input[type=datetime-local].full-width,
+ form.generic-form input[type=week].full-width,
+ form.generic-form input[type=time].full-width,
+ form.generic-form input[type=password].full-width,
+ form.generic-form input[type=month].full-width,
+ form.generic-form input[type=file].full-width,
+ form.generic-form textarea.full-width,
+ form.generic-form select.full-width {
+ width: 100%; }
+ form.generic-form label.required::after {
+ content: " *";
+ color: hsl(var(--red-hsl), 1); }
+ form.generic-form .note {
+ display: block;
+ margin-top: 0.3rem;
+ color: hsl(var(--base-hsl), 0.7); }
+ form.generic-form input[type=search] {
+ border-radius: 8px; }
+ form.generic-form input[type=color] {
+ width: 80px;
+ min-width: initial;
+ height: 38px;
+ padding: 2px; }
+ form.generic-form input[type="range"] {
+ -webkit-appearance: none;
+ appearance: none;
+ background: transparent;
+ cursor: pointer; }
+ form.generic-form input[type="range"]:focus {
+ outline: none; }
+ form.generic-form input[type="range"]::-webkit-slider-runnable-track {
+ background-color: hsl(var(--teal-hsl), 1);
+ border-radius: 0.5rem;
+ height: 0.5rem; }
+ form.generic-form input[type="range"]::-webkit-slider-thumb {
+ -webkit-appearance: none;
+ /* Override default look */
+ appearance: none;
+ margin-top: -4px;
+ /* Centers thumb on the track */
+ background-color: hsl(var(--base-hsl), 1);
+ border-radius: 0.5rem;
+ height: 1rem;
+ width: 1rem; }
+ form.generic-form input[type="range"]:focus::-webkit-slider-thumb {
+ outline: 3px solid hsl(var(--yellow-hsl), 1);
+ outline-offset: 0.125rem; }
+ form.generic-form input[type="range"]::-moz-range-track {
+ background-color: hsl(var(--teal-hsl), 1);
+ border-radius: 0.5rem;
+ height: 0.5rem; }
+ form.generic-form input[type="range"]::-moz-range-thumb {
+ background-color: hsl(var(--base-hsl), 1);
+ border: none;
+ /*Removes extra border that FF applies*/
+ border-radius: 0.5rem;
+ height: 1rem;
+ width: 1rem; }
+ form.generic-form input[type="range"]:focus::-moz-range-thumb {
+ outline: 3px solid hsl(var(--yellow-hsl), 1);
+ outline-offset: 0.125rem; }
+ form.generic-form .checkbox,
+ form.generic-form .radio {
+ display: block;
+ position: relative;
+ min-height: 40px;
+ margin-bottom: 10px;
+ padding-left: 40px;
+ clear: left; }
+ form.generic-form .checkbox input[type=checkbox],
+ form.generic-form .checkbox input[type=radio],
+ form.generic-form .radio input[type=checkbox],
+ form.generic-form .radio input[type=radio] {
+ cursor: pointer;
+ position: absolute;
+ z-index: 1;
+ top: -2px;
+ left: -2px;
+ width: 44px;
+ height: 44px;
+ margin: 0;
+ opacity: 0; }
+ form.generic-form .checkbox label::before,
+ form.generic-form .radio label::before {
+ content: "";
+ display: block;
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 34px;
+ height: 34px;
+ border: 2px solid hsl(var(--base-hsl), 1);
+ margin-right: 0.5rem;
+ background-color: #fff;
+ cursor: pointer; }
+ form.generic-form .checkbox input[type=checkbox]:checked + label::after,
+ form.generic-form .checkbox input[type=radio]:checked + label::after,
+ form.generic-form .radio input[type=checkbox]:checked + label::after,
+ form.generic-form .radio input[type=radio]:checked + label::after {
+ opacity: 1; }
+ form.generic-form .checkbox label,
+ form.generic-form .radio label {
+ display: inline-block;
+ margin-top: 0;
+ margin-bottom: 0;
+ padding: 5px 6px 5px;
+ cursor: pointer;
+ -ms-touch-action: manipulation;
+ touch-action: manipulation; }
+ form.generic-form .checkbox label::after,
+ form.generic-form .radio label::after {
+ content: "";
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ position: absolute;
+ top: 12px;
+ left: 7px;
+ width: 19px;
+ height: 9px;
+ -webkit-transform: rotate(-45deg);
+ -ms-transform: rotate(-45deg);
+ transform: rotate(-45deg);
+ border: solid;
+ border-top-color: currentcolor;
+ border-top-width: medium;
+ border-right-width: medium;
+ border-bottom-width: medium;
+ border-left-width: medium;
+ border-width: 0 0 5px 5px;
+ border-top-color: rgba(0, 0, 0, 0);
+ opacity: 0;
+ background: rgba(0, 0, 0, 0); }
+ form.generic-form .radio label::before {
+ border-radius: 50%; }
+ form.generic-form .radio label::after {
+ content: "";
+ position: absolute;
+ top: 8px;
+ left: 8px;
+ width: 0;
+ height: 0;
+ border: 9px solid currentcolor;
+ border-radius: 50%;
+ opacity: 0;
+ background: currentcolor; }
+ form.generic-form input[type=button],
+ form.generic-form input[type=reset],
+ form.generic-form button {
+ --border-color: hsla(var(--orange-hsl), 1);
+ --bg-color: #fff;
+ --text-color: hsla(var(--orange-hsl), 1);
+ border: 2px solid var(--border-color);
+ color: var(--text-color);
+ display: inline-block;
+ border-radius: 3px;
+ padding: 6px 24px 6px;
+ font-size: 1rem;
+ font-weight: 400;
+ background-color: var(--bg-color);
+ text-decoration: none;
+ cursor: pointer; }
+ form.generic-form input[type=submit] {
+ --border-color: hsla(var(--orange-hsl), 1);
+ --text-color: #fff;
+ --bg-color: hsla(var(--orange-hsl), 1);
+ border: 2px solid var(--border-color);
+ color: var(--text-color);
+ display: inline-block;
+ border-radius: 3px;
+ padding: 6px 24px 6px;
+ font-size: 1rem;
+ font-weight: 400;
+ background-color: var(--bg-color);
+ text-decoration: none;
+ cursor: pointer; }
+
.frame {
--n: 9;
--d: 16;
@@ -2165,7 +2494,7 @@ body.modal--shown {
.search-summary--description {
color: #153634;
background: #F4D569;
- font-size: 1rem;
+ font-size: 1.125rem;
line-height: 120%;
font-weight: 500;
padding: 1rem;
@@ -2997,8 +3326,6 @@ a.base-card:hover:before {
.footer ul {
list-style-type: none;
padding: 0; }
- .footer ul a {
- text-decoration: none; }
.footer a {
color: hsl(var(--white-hsl), 1);
text-decoration: underline;
@@ -3333,18 +3660,38 @@ a.base-card:hover:before {
.grid--five-columns {
grid-template-columns: repeat(5, 1fr); } }
+@media (min-width: 36em) {
+ .grid--six-columns {
+ grid-template-columns: repeat(6, 1fr); } }
+
+@media (min-width: 36em) {
+ .grid--seven-columns {
+ grid-template-columns: repeat(7, 1fr); } }
+
.grid__2 {
grid-column: auto / span 2; }
.grid__3 {
grid-column: auto / span 3; }
+.grid__4 {
+ grid-column: auto / span 4; }
+
.grid__5 {
grid-column: auto / span 5; }
+.grid__6 {
+ grid-column: auto / span 6; }
+
+.grid__7 {
+ grid-column: auto / span 7; }
+
.grid__all {
grid-column: 1 / -1; }
+.grid.max-width__100 {
+ max-width: 100%; }
+
.slick-dots {
position: absolute;
display: block;
@@ -3630,7 +3977,7 @@ a.base-card:hover:before {
.media-card__content_no_image {
justify-content: center;
padding: 20px;
- width: 100%; }
+ width: 100vw; }
.media-card__image-wrapper {
width: 30%;
max-width: 320px;
@@ -3946,9 +4293,7 @@ a.base-card:hover:before {
.prose a {
font-weight: inherit;
- color: hsl(var(--teal-dark-hsl), 1);
- text-decoration: underline;
- text-underline-position: under; }
+ color: hsl(var(--teal-dark-hsl), 1); }
.prose a:hover {
background-color: hsl(var(--teal-hsl), 0.1); }
.prose a.button {
@@ -4386,6 +4731,8 @@ a.base-card:hover:before {
background: hsl(var(--teal-hsl), 1) !important; }
.search-block--recipients {
background: hsl(var(--yellow-hsl), 1) !important; }
+ .search-block--no-padding {
+ padding: 0; }
.search-block__description {
text-align: center;
font-size: 24px;
@@ -4689,6 +5036,11 @@ a.base-card:hover:before {
.sort-filters select.sort-filters__filter-active {
color: #153634; }
+.clear-all {
+ border: none;
+ height: 35px;
+ width: 100px; }
+
.subscribe-section {
background-color: hsl(var(--yellow-hsl), 1);
padding: 24px; }
@@ -4771,9 +5123,6 @@ a.base-card:hover:before {
list-style: none;
margin: 0; }
-.top-bar a {
- text-decoration: none; }
-
.top-bar {
--panel-width: 280px; }
@media (min-width: 36em) {
@@ -5088,6 +5437,7 @@ a.base-card:hover:before {
display: none; } }
.grantnav-search__content {
+ overflow-x: auto;
padding-top: 0px;
width: 100%; }
@media (min-width: 60em) {
@@ -5189,3 +5539,16 @@ a.base-card:hover:before {
display: flex;
justify-content: center;
margin-bottom: 48px; }
+
+@media (min-width: 1690px) {
+ .sidebar-container {
+ max-width: 1690px;
+ margin: 0 auto; } }
+
+.sidebar-adjacent-content {
+ margin-left: -176px;
+ margin-right: 176px; }
+ @media (max-width: 1690px) {
+ .sidebar-adjacent-content {
+ margin-left: 0;
+ margin-right: 0; } }
diff --git a/cove/cove_360/static/dataexplore/360-giving-logo.svg b/cove/cove_360/static/dataexplore/images/360-giving-logo.svg
similarity index 100%
rename from cove/cove_360/static/dataexplore/360-giving-logo.svg
rename to cove/cove_360/static/dataexplore/images/360-giving-logo.svg
diff --git a/cove/cove_360/static/dataexplore/images/360insights-color.svg b/cove/cove_360/static/dataexplore/images/360insights-color.svg
deleted file mode 100644
index 332e9c5..0000000
--- a/cove/cove_360/static/dataexplore/images/360insights-color.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/cove/cove_360/static/dataexplore/images/linkedin-logo.svg b/cove/cove_360/static/dataexplore/images/linkedin-logo.svg
new file mode 100644
index 0000000..e149999
--- /dev/null
+++ b/cove/cove_360/static/dataexplore/images/linkedin-logo.svg
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
diff --git a/cove/cove_360/static/dataexplore/js/modals.js b/cove/cove_360/static/dataexplore/js/modals.js
new file mode 100644
index 0000000..5692e01
--- /dev/null
+++ b/cove/cove_360/static/dataexplore/js/modals.js
@@ -0,0 +1,20 @@
+(function () {
+ /* Add handler to launch modals */
+ for (const modalOpenBtn of document.querySelectorAll('button[data-toggle="modal"]')) {
+ modalOpenBtn.addEventListener('click', (event) => {
+ /* Not sure why these are done by class */
+ const modal = document.getElementsByClassName(event.target.dataset.targetClass);
+ modal[0].removeAttribute('aria-hidden');
+ modal[0].classList.add('modal--shown');
+ });
+ }
+
+ /* Add handler to close modals */
+ for (const modalCloseBtn of document.getElementsByClassName('modal__close')) {
+ modalCloseBtn.addEventListener('click', (event) => {
+ const modal = event.target.parentElement.parentElement;
+ modal.classList.remove('modal--shown');
+ modal.setAttribute('aria-hidden', true);
+ });
+ }
+})();
diff --git a/cove/cove_360/static/dataexplore/js/tab-switcher.js b/cove/cove_360/static/dataexplore/js/tab-switcher.js
new file mode 100644
index 0000000..d60a65b
--- /dev/null
+++ b/cove/cove_360/static/dataexplore/js/tab-switcher.js
@@ -0,0 +1,60 @@
+const allTabs = [
+ 'summary',
+ 'validity',
+ 'accuracy',
+ 'usefulness',
+ 'upload',
+ 'link',
+ 'paste'
+];
+
+(function () {
+ /* tab switching mechanism -> click handler > */
+
+ /* Find all the Links */
+ for (const tab of allTabs) {
+ /* For each type (e.g. 'paste') add a click handler and set state */
+ for (const tabLink of document.querySelectorAll(`a[href="#${tab}"]`)) {
+ tabLink.addEventListener('click', (event) => {
+ event.preventDefault();
+ /* We do this manually to avoid page jumping position to the href/id */
+ window.location.hash = `#${tab}`;
+
+ /* Remove active from all tabs */
+ for (const otherTabs of document.getElementsByClassName('tab')) {
+ otherTabs.classList.remove('tab--active');
+ }
+ /* Add active to our tab */
+ document.getElementById(`${tab}-tab-link`).parentElement.classList.toggle('tab--active');
+
+ for (const tabContents of document.getElementsByClassName('tab-content')) {
+ tabContents.setAttribute('style', 'display:none');
+ }
+
+ document.getElementById(`${tab}-tab`).setAttribute('style', 'display: block');
+ });
+ }
+ }
+})();
+
+(function () {
+ /* If "?open-all=true" is passed show all tabs on the page at once
+ and ignore any resuming of the tab state.
+ */
+ const params = new URLSearchParams(window.location.search);
+
+ if (params.get('open-all')) {
+ for (const tab of document.getElementsByClassName('tab-content')) {
+ tab.removeAttribute('style');
+ }
+
+ return;
+ }
+
+ /* Resume the tab selection state from the window hash on page load.
+ * substring to remove the # to match values in allTabs array.
+ */
+ if (allTabs.includes(window.location.hash.substring(1))) {
+ document.querySelector(`a[href="${window.location.hash}"]`).click();
+ }
+})();
diff --git a/cove/cove_360/templates/cove_360/500.html b/cove/cove_360/templates/cove_360/500.html
new file mode 100644
index 0000000..941ac3e
--- /dev/null
+++ b/cove/cove_360/templates/cove_360/500.html
@@ -0,0 +1,14 @@
+{% extends 'base.html' %}
+{% load i18n %}
+{% block content %}
+
+
+ {% trans 'Internal Server Error' %}
+
+ {% blocktrans %}Something went wrong with your request. This could be due to a bug in the application and/or the data you supplied.{% endblocktrans %}
+ {% if request.sentry.id %}
+ {% blocktrans %}This error has been automatically reported to our development team. If you {% endblocktrans %}{% trans "get in touch" %} , {% blocktrans %}please reference this error as {% endblocktrans %}{{ request.sentry.id }} .
+ {% endif %}
+
+{% endblock %}
+
diff --git a/cove/cove_360/templates/cove_360/additional_codelist_values.html b/cove/cove_360/templates/cove_360/additional_codelist_values.html
new file mode 100644
index 0000000..8ae13df
--- /dev/null
+++ b/cove/cove_360/templates/cove_360/additional_codelist_values.html
@@ -0,0 +1,32 @@
+{% load i18n %}
+{% load cove_tags %}
+
+
+
+
+ {% trans 'Field' %}
+ {% trans 'Path to Field' %}
+ {% trans 'Codelist' %}
+ {% trans 'Additional Values Used' %}
+
+
+
+ {% for path, detail in additional_codelist_values.items %}
+
+ {{detail.field}} {{detail.path}}
+
+ {{detail.codelist}}
+ {% if detail.codelist_amend_urls %}
+ (
+ {% for symbol, url in detail.codelist_amend_urls %}
+ {{symbol}}
+ {% endfor %}
+ )
+ {% endif %}
+
+
+ {{detail.values|join:", "}}
+
+ {% endfor %}
+
+
diff --git a/cove/cove_360/templates/cove_360/additional_fields_table.html b/cove/cove_360/templates/cove_360/additional_fields_table.html
new file mode 100644
index 0000000..cbcd55d
--- /dev/null
+++ b/cove/cove_360/templates/cove_360/additional_fields_table.html
@@ -0,0 +1,13 @@
+{% load i18n %}
+{% load cove_tags %}
+
+
+ {% trans 'Field' %} {% trans 'Path to Field' %} {% trans 'Usage Count' %}
+
+ {% for path, error, count in data_only %}
+
+ {{error}} {{path}} {{count}}
+
+ {% endfor %}
+
+
diff --git a/cove/cove_360/templates/cove_360/additional_fields_table_all.html b/cove/cove_360/templates/cove_360/additional_fields_table_all.html
new file mode 100644
index 0000000..afb2b2e
--- /dev/null
+++ b/cove/cove_360/templates/cove_360/additional_fields_table_all.html
@@ -0,0 +1,79 @@
+{% load i18n %}
+{% load cove_tags %}
+
+
+
+
+ {% trans 'Field' %}
+ {% trans 'Path to Field' %}
+ {% trans 'Usage Count' %}
+ {% trans 'Examples (first 3)' %}
+ {% trans 'Child Fields' %}
+
+
+
+ {% for full_path, info in additional_fields.items %}
+ {% if info.root_additional_field %}
+
+ {{info.field_name}}
+ {{info.path}}
+ {{info.count}}
+
+ {% for example in info.examples %}
+ {{example}}
+ {% endfor %}
+
+
+ {% if info.additional_field_descendance %}
+ {{info.additional_field_descendance|length}}
+ {% trans "(See child fields)" %}
+ {% endif %}
+
+
+ {% endif %}
+ {% endfor %}
+
+
+
+
+{% for parent_full_path, parent_info in additional_fields.items %}
+ {% if parent_info.root_additional_field and parent_info.additional_field_descendance %}
+
+
+
+
+
+
+
+
+ {% trans 'Field' %}
+ {% trans 'Path to Field' %}
+ {% trans 'Usage Count' %}
+ {% trans 'Examples (first 3)' %}
+
+
+
+ {% for full_path, info in parent_info.additional_field_descendance.items %}
+
+ {{info.field_name}}
+ {{info.path}}
+ {{info.count}}
+
+ {% for example in info.examples %}
+ {{example}}
+ {% endfor %}
+
+
+ {% endfor %}
+
+
+
+
+
+
+ {% endif %}
+{% endfor %}
diff --git a/cove/cove_360/templates/cove_360/base.html b/cove/cove_360/templates/cove_360/base.html
index 1446bed..ae75fba 100644
--- a/cove/cove_360/templates/cove_360/base.html
+++ b/cove/cove_360/templates/cove_360/base.html
@@ -1,120 +1,90 @@
-{% extends 'base.html' %}
{% load i18n %}
{% load static %}
-{% block banner %}
-{% endblock banner %}
+
+
+
+
+
+
+
+
+
-{% block heading %}
-
-{% endblock %}
+ 360Giving Data {% if submission_tool %}Submission{% else %}Quality{% endif %} Tool
+
+
+
+
-{% block language_select %}{% endblock %}
+
+
+
+
-{% block bootstrap_css %}
-
-
-
-
-
-
-
-
-{% endblock %}
+
+
+
+
+
+ {% block content %}
+ {% endblock %}
+
-{% block bottomcontent1 %}
+ {% if DEBUG or DISABLE_COOKIE_POPUP %}
+
+ {% else %}
+ {% include "cove_360/components/cookie_consent.html" %}
+ {% endif %}
-
-
-
{% blocktrans %}How to check your data{% endblocktrans %}
- {% comment %}Translators: Paragraph that describes the application{% endcomment %}
-
{% blocktrans %}Upload, paste or provide a link to data using the 360Giving Data Standard format, and this application will check whether it is valid 360Giving data, and provide feedback so that you can check for errors and see ways to improve its quality.{% endblocktrans %}
-
{% blocktrans %}The tool will convert between JSON, Excel and CSV formats, allowing you to download the original file, and the converted versions.{% endblocktrans %}
-
{% blocktrans %}This tool will : {% endblocktrans %}
-
{% blocktrans %} Check your data is valid.{% endblocktrans %}
-
{% blocktrans %}The term ‘valid‘ means the data includes the 10 core fields and the information has all the correct data formatting that is required by 360Giving Data Standard. When it passes these checks, you will know that it is formatted for use alongside other valid 360Giving data and can be included in 360Giving tools, such as GrantNav and 360Insights .{% endblocktrans %}
-
{% blocktrans %}It will not : {% endblocktrans %}
-
{% blocktrans %} Check your data is accurate.{% endblocktrans %}
-
{% blocktrans %} Check the data against your own open data policy.{% endblocktrans %}
-
{% blocktrans %} This means there may be further checks you need to carry out to make sure the information is accurate, and that the data does not include information that is unsuitable for publishing as open data. Read more about what to consider when publishing open grants data. {% endblocktrans %}
- {% if request.path == "/" %}
-
{% blocktrans %}Further guidance{% endblocktrans %}
-
{% blocktrans %}Read about common data errors and what causes them in the Common Errors section.{% endblocktrans %}
-
{% blocktrans %}To preview how this tool works, try{% endblocktrans %}
-
- {% endif %}
-
{% blocktrans %}Formats{% endblocktrans %}
-
{% blocktrans %}The application accepts data in the formats set out in the {% endblocktrans %}360Giving Data Standard guidance .
-
{% blocktrans %}Acceptable files are: {% endblocktrans %}
-
- {% blocktrans %}Summary Spreadsheet - OpenDocument Spreadsheet, Excel , CSV (UTF-8, Windows-1252 and ISO-8859-1 encodings supported){% endblocktrans %}
- {% blocktrans %}JSON built to the 360Giving JSON schema (UTF-8 encoding supported){% endblocktrans %}
- {% blocktrans %}Multi-table data package - Excel {% endblocktrans %}
-
-
-
+ {% include "cove_360/components/footer.html" %}
-
-
-
{% blocktrans %}How to submit your data{% endblocktrans %}
-
{% blocktrans %}
- Once 360Giving data has been published by an organisation, the file must be added to the 360Giving Data Registry so that the data to appear in 360Giving’s tools such as GrantNav and 360Insights.
- {% endblocktrans %}
-
-
{% blocktrans %}
- Publishers of 360Giving data can add their valid 360Giving data files to the Data Registry using the 360Giving data file submission form.
- {% endblocktrans %}
-
-
{% blocktrans %}The submission form allows users to:{% endblocktrans %}
-
- Update an existing Data Registry entry with an updated version of an existing file
- Add an entry for a new file to the Data Registry
-
-
Only publishers with an authorised website domain can use this submission process.
+
-
Authorised domains
-
By default, the website domain used by existing publishers to host their 360Giving data files will be authorised.
-
Organisations that publish 360Giving data for the first time can also use the 360Giving data file submission process once they have registered their website domain with 360Giving. To register to your website domain prior to publishing for the first time please contact 360Giving Helpdesk via support@threesixtygiving.org .
-
Publishers can opt out of authorising their website domain and using the 360Giving data file submission process on request.
-
Which domains are not authorised?
-
Data files published on multi-user hosting platforms like open data repositories, or file sharing services Google Sheets or Dropbox, cannot be authorised for use with the 360Giving data file submission process because the domain cannot be authorised as being unique to a particular organisation.
-
Files published in this way can be added to the 360Giving Data Registry by emailing 360Giving Helpdesk via support@threesixtygiving.org .
-
Further guidance
-
Read our full guidance on how to use the 360Giving data submission process .
-
-
-
-{% endblock %}
-
-{% block bottomcontent2 %}
-
-{% if not DEBUG %}
-{% include "cove_360/cookie_consent.html" %}
-{% endif %}
-{% include "cove_360/more_info.html" %}
-{% include "cove_360/footer.html" %}
-{% endblock %}
+
+
+
\ No newline at end of file
diff --git a/cove/cove_360/templates/cove_360/common_errors.html b/cove/cove_360/templates/cove_360/common_errors.html
index fa109ee..874efe2 100644
--- a/cove/cove_360/templates/cove_360/common_errors.html
+++ b/cove/cove_360/templates/cove_360/common_errors.html
@@ -1,4 +1,4 @@
-{% extends 'base.html' %}
+{% extends request.current_app_base_template %}
{% load i18n %}
{% block content %}
@@ -16,7 +16,7 @@
{% trans "Invalid 'uri' found" %}
{% blocktrans %}What is a URI? Short for “Uniform Resource Identifier” it is a sequence of characters that distinguishes one resource from another. A URL — short for “Uniform Resource Locator” — is a specific type of URI.{% endblocktrans %}
{% blocktrans %}When the 360Giving Data Standard requires data to be provided in the format of a URI, this will mean you will very likely be providing a URL — or website address.{% endblocktrans %}
-
+
{% trans "Date is not in the correct format" %}
@@ -105,7 +105,7 @@
{% trans "(something) is missing but is required" %}
-
+
{% trans "Invalid code found in (something)" %}
{% blocktrans %}In the 360Giving Data Standard, there are three fields that require publishers to use values from a predefined list. When we validate people's data, we check the values of those fields against those lists.{% endblocktrans %}
@@ -129,8 +129,8 @@
{% trans "Invalid code found in (something)" %}
{% blocktrans %}The currency and country code lists are referenced in the 360Giving JSON Schemas and the field descriptions link to the code lists on third-party websites.{% endblocktrans %}
-
-
+
+
{% trans "Field x
is not a string" %}
{% blocktrans %}Data in the 360Giving Data Standard is expected to be provided in a certain format.{% endblocktrans %}
diff --git a/cove/cove_360/templates/cove_360/cookie_consent.html b/cove/cove_360/templates/cove_360/components/cookie_consent.html
similarity index 73%
rename from cove/cove_360/templates/cove_360/cookie_consent.html
rename to cove/cove_360/templates/cove_360/components/cookie_consent.html
index 7b2eee2..74f9964 100644
--- a/cove/cove_360/templates/cove_360/cookie_consent.html
+++ b/cove/cove_360/templates/cove_360/components/cookie_consent.html
@@ -22,27 +22,27 @@
@@ -59,4 +59,4 @@
Allow analytics cookies? <
360Giving uses privacy-respecting analytics. If you don't accept cookies, we will track only basic information about your visit. Click "Disable Analytics" if you don't want us to track at all.
-
+
\ No newline at end of file
diff --git a/cove/cove_360/templates/cove_360/components/explore/accuracy.html b/cove/cove_360/templates/cove_360/components/explore/accuracy.html
new file mode 100644
index 0000000..1ff3560
--- /dev/null
+++ b/cove/cove_360/templates/cove_360/components/explore/accuracy.html
@@ -0,0 +1,92 @@
+{% load i18n %}
+{% load humanize %}
+{% load cove_tags %}
+
+ Data Accuracy
+
+ {% if validation_errors or additional_closed_codelist_values %}
+ The data provided did not pass validation therefore the accuracy of the data could not be determined.
+ {% else %}
+
+ {% if quality_accuracy_checks_passed %}
+
What is working well
+ check Congratulations, {{quality_accuracy_checks_passed|length}} of our data accuracy checks passed.
+ {% endif %}
+
+
+ {% if quality_accuracy_errored %}
+ {% blocktrans %}Quality accuracy checks failed due to an issue with the data. Fix some validation errors first.{% endblocktrans %}
+ {% else %}
+
+ {% if quality_accuracy_checks %}
+ Potential issues
+ {% blocktrans %}These checks highlight areas where your data may be incorrect or need further attention.{% endblocktrans %}
+ {% blocktrans %}
+ For each check we give feedback on the issue and what steps may be taken to resolve it.
+ Receiving this feedback does not mean the data is invalid, and it can be ignored when not relevant.
+ {% endblocktrans %}
+
+ {% for category in quality_accuracy_categories %}
+ {{category}}
+
+
+
+ {% trans 'Passed' %}
+ {% trans 'Check Description' %}
+ {% trans 'First 3 Locations' %}
+
+
+
+ {# using regroup here would be good if we had dictionaries #}
+ {% for message, json_location, spreadsheet_location in quality_accuracy_checks %}
+ {% if message.category == category %}
+
+ close
+
+ {{ message.heading }} {{ message.message }}
+
+ {% if file_type == 'xlsx' or file_type == 'csv' %}
+
+
+ {% for location in spreadsheet_location|slice:":3" %}
+ Sheet: {{location.sheet}} Row: {{location.row_number}} {% if location.header %} Header: {{location.header}} {% endif %}
+ {% endfor %}
+ {% if spreadsheet_location|length > 3 %}
+ see all
+ {% endif %}
+
+
+ {% else %}
+
+
+ {% for location in json_location|slice:":3" %}
+ {{location}}
+ {% endfor %}
+ {% if json_location|length > 3 %}
+ see all
+ {% endif %}
+
+
+ {% endif %}
+
+ {% endif %} {# category filter #}
+ {% endfor %}
+
+
+ {% endfor %} {# for each category #}
+ {% else %}
+ No accuracy issues found.
+ {% endif %}
+
+{% for message, json_location, spreadsheet_location in quality_accuracy_checks %}
+{% with msg=message.heading %}
+{% if file_type == 'json' %}
+{% cove_modal_errors className="quality_accuracy-checks-"|concat:forloop.counter modalTitle=msg errorList=json_location file_type=file_type full_table=False %}
+{% else %}
+{% cove_modal_errors className="quality_accuracy-checks-"|concat:forloop.counter modalTitle=msg errorList=spreadsheet_location file_type=file_type full_table=False %}
+{% endif %}
+{% endwith %}
+{% endfor %}
+
+{% endif %} {# Quality accuracy errored #}
+{% endif %} {# validation failed #}
\ No newline at end of file
diff --git a/cove/cove_360/templates/cove_360/components/explore/summary.html b/cove/cove_360/templates/cove_360/components/explore/summary.html
new file mode 100644
index 0000000..79491ea
--- /dev/null
+++ b/cove/cove_360/templates/cove_360/components/explore/summary.html
@@ -0,0 +1,324 @@
+{% load i18n %}
+{% load humanize %}
+{% load cove_tags %}
+
+
+{% trans "Summary" %}
+
+ {% if validation_errors or additional_closed_codelist_values %}
+
+
+
{% trans "Sorry your data is not yet using the 360Giving Data Standard. We used the " %}
+ 360Giving JSON Package Schema {% trans "to check this." %}
+ See Validity for further details.
+
+
+ {% else %}
+
+
{% trans "This data uses the 360Giving Data Standard correctly" %}
+
+ {% trans "Congratulations! Your data is using the 360Giving Data Standard. We used the " %}
+ 360Giving JSON Package Schema
+ {% trans "to check this." %}
+
+
+ {% endif %}
+
+ {% if conversion_warning_messages or conversion_error %}
+
+ {% endif %}
+
+ {% if conversion == 'flatten' %}
+
+
File conversion successful
+
We have converted your JSON data into spreadsheet format. See Download and share for more details.
+
+ {% endif %}
+
+
+
+ The file "{{file_name}}" was
+ {% if source_url %}
+ {% trans "downloaded from " %} {{source_url}}
+ {% else %}
+ {% trans "uploaded " %}
+ {% endif %}
+ {% trans "on " %} {{created_date}} at {{created_time}}.
+
+
+ Explore your data:
+
+ {% if additional_fields_count %}
+ Additional fields ({{additional_fields_count}})
+ {% endif %}
+ {% if conversion_warning_messages %}
+ Conversion errors ({{conversion_warning_messages|length}})
+ {% endif %}
+
+ {% if metadata %}
+ Metadata
+ {% endif %}
+ File contents
+ Identifiers
+ Data convertor
+ Download and share
+ Further help
+
+
+ {% if conversion_warning_messages or conversion_error %}
+
+
+ {% trans "Data conversion unsuccessful - " %}
+ {% blocktrans count n_warnings=conversion_warning_messages|length %}{{n_warnings}} Error has been found{% plural %}{{n_warnings}} Errors have been found{% endblocktrans %}
+
+
+ {% trans "Before checking your data we needed to convert it to JSON" %}{% if conversion_error or conversion_warning_messages %}{% blocktrans %} but we were not able to do this successfully{% endblocktrans %}{% endif %}.
+ {% blocktrans %}This tool converts data into JSON because the 360Giving Data Standard uses a JSON Schema to describe the standard in a technical way.{% endblocktrans %}
+ {% blocktrans %}If a file cannot be converted to JSON it indicates that it cannot be correctly mapped to the standard and needs to be reviewed. If this is the case you should check the file and re-upload it once you’ve fixed the problem. The conversion errors below will give an indication of where the issue is.{% endblocktrans %}
+ {% if conversion_error %}
+ {% blocktrans %}The JSON data could not be converted to spreadsheet due to the following error: {{conversion_error}}{% endblocktrans %}
+ {% include 'error_extra.html' %}
+ {% endif %}
+
+ {% if conversion_warning_messages %}
+ {% trans "Conversion errors: " %}
+
+ {% for warning_message in conversion_warning_messages %}
+ {{warning_message}}
+ {% endfor %}
+
+ {% trans "Please resolve this error, as well as any others found, and test the data again." %} Load new file.
+ {% endif %}
+{% endif %} {# / if conversion errors #}
+
+
+
+ {% if metadata %}
+
+
+
+
+ {% if metadata.publisher %}
+
Publisher: {{metadata.publisher.name}} ({{metadata.publisher.identifier}})
+ {% endif %}
+ {% if metadata.accessURL %}
+
Website that contains this Dataset: {{metadata.accessURL}}
+ {% endif %}
+ {% if metadata.identifier %}
+
Dataset Identifier: {{metadata.identifier}}
+ {% endif %}
+ {% if metadata.version %}
+
360 Giving Schema Version: {{metadata.version}}
+ {% endif %}
+ {% if metadata.license %}
+
License: {{metadata.license}}
+ {% endif %}
+ {% if extension_metadatas %}
+
Extensions: {% for extension_metadata in extension_metadatas %}
{{extension_metadata.id}} {% endfor %}
+ {% endif %}
+
+
+ {% if metadata.publisher.logo %}
+
+ {% endif %}
+
+
+ {% endif %} {# end if the file had a metadata tab #}
+
+ {% if metadata.downloadURL or metadata.title %}
+
+ {% if metadata.title %}
+ {{metadata.title}}
+ {% endif %}
+ {% if metadata.downloadURL %}
+ Original Data Download
+ {% endif %}
+
+ {% endif %}
+
+ {% if metadata.description %}
+
+ {{metadata.description}}
+
+ {% endif %}
+
+
+ This file contains
+
+ {% trans "Use this section to get an overview of the data and check if this was what you were expecting to see." %}
+
+
+ {% blocktrans count n_grants=grants_aggregates.count|default:0 %}There is {{n_grants}} grant {% plural %}There are {{n_grants}} grants {% endblocktrans %}
+ {% blocktrans count n_recipients=grants_aggregates.distinct_recipient_org_identifier|length|default:0 %}to {{n_recipients}} recipient organisation and {% plural %}to {{n_recipients}} recipient organisations and{% endblocktrans %}
+ {% blocktrans count n_recipients_individuals=grants_aggregates.recipient_individuals_count|default:0 %}{{n_recipients_individuals}} to a recipient individual {% plural %}{{n_recipients_individuals}} to recipient individuals {% endblocktrans %}.
+
+ {% blocktrans count n_funders=grants_aggregates.distinct_funding_org_identifier|length|default:0 %} The grants are made by {{n_funders}} funding organisation{% plural %} The grants are made by {{n_funders}} funding organisations{% endblocktrans %}.
+
+ {% blocktrans count n_grants=grants_aggregates.count|default:0 %}The grant was awarded {% plural %}The grants were awarded {% endblocktrans %}
+ {% if grants_aggregates.min_award_date == grants_aggregates.max_award_date %}
+ {% blocktrans with start_date=grants_aggregates.min_award_date %}on {{start_date}} .{% endblocktrans %}
+ {% else %}
+ {% blocktrans with start_date=grants_aggregates.min_award_date end_date=grants_aggregates.max_award_date %}between {{start_date}} and {{end_date}} .{% endblocktrans %}
+ {% endif %}
+
+
+ {% if metadata.issued %}
+
+ The file was issued on {{metadata.issued|slice:":10"}}
+
+ {% endif %}
+ {% if metadata.modified %}
+
+ The file was modified on {{metadata.modified|slice:":10"}}
+
+ {% endif %}
+ {% for currency_code, currency_aggregates in grants_aggregates.currencies.items %}
+
+ {% if currency_aggregates.count == 1 %}
+ {% if currency_aggregates.count == grants_aggregates.count %}
+ {% trans "The grant" %}
+ {% else %}
+ {% trans "1 grant " %}
+ {% endif %}
+ {% blocktrans with amount_awarded=currency_aggregates.total_amount|intcomma currency_symbol=currency_aggregates.currency_symbol|safe %} was awarded in {{currency_code}} with a value of {{currency_symbol}}{{amount_awarded}} .{% endblocktrans %}
+ {% else %}
+ {% if currency_aggregates.count == grants_aggregates.count %}
+ {% trans "The grants" %}
+ {% else %}
+ {{currency_aggregates.count}} {% trans "grants " %}
+ {% endif %}
+ {% blocktrans with n_grants=currency_aggregates.count total_amount=currency_aggregates.total_amount|intcomma max_amount=currency_aggregates.max_amount|intcomma min_amount=currency_aggregates.min_amount|intcomma currency_symbol=currency_aggregates.currency_symbol|safe %} were awarded in {{currency_code}} with a total value of {{currency_symbol}}{{total_amount}} and individual awards ranging from {{currency_symbol}}{{min_amount}} (lowest) to {{currency_symbol}}{{max_amount}} (highest).{% endblocktrans %}
+ {% endif %}
+
+ {% endfor %}
+ {% if csv_encoding and csv_encoding != "utf-8-sig" %}
+
+ {% blocktrans %} This file is not 'utf-8' encoded (it is {{csv_encoding}} encoded).{% endblocktrans %}
+
+ {% endif %}
+
+
+{# / file contains #}
+
+ {% if additional_fields_count %}
+
+
+ {% blocktrans count n_additional_fields=additional_fields_count %} Additional fields{% plural %} Additional fields ({{n_additional_fields}}){% endblocktrans %}
+
+ {% if data_only %}
+ {% blocktrans %} Additional fields which do not use 360Giving Data Standard titles were found in your data.{% endblocktrans %}
+ {% blocktrans %} You are welcome to include additional fields in your data, however please check the field title(s) shown below to confirm if they are intended additions and not the result of spelling or formatting mistakes in the title. Please refer to the Common Errors section to see the correctly formatted field titles for the required fields. {% endblocktrans %}
+ {% include "additional_fields_table.html" %}
+ {% endif %}
+ {% for message, json_location, spreadsheet_location in additional_checks %}
+ {% with msg=message.heading %}
+ {% if file_type == 'json' %}
+ {% cove_modal_errors className="additional-checks-"|concat:forloop.counter modalTitle=msg errorList=json_location file_type=file_type full_table=False %}
+ {% else %}
+ {% cove_modal_errors className="additional-checks-"|concat:forloop.counter modalTitle=msg errorList=spreadsheet_location file_type=file_type full_table=False %}
+ {% endif %}
+ {% endwith %}
+ {% endfor %}
+ {% endif %}
+
+ {# / additional fields #}
+
+ Identifiers
+ {% trans "Unique grant identifiers" %}
+ {% if grants_aggregates.unique_ids|length %}{% endif %}
+ {{ grants_aggregates.unique_ids|length}}
+ {% if grants_aggregates.unique_ids|length %} .{% endif %}
+ {% trans "Unique funder organisation identifiers" %}
+ {% if grants_aggregates.distinct_funding_org_identifier|length %}{% endif %}
+ {{ grants_aggregates.distinct_funding_org_identifier|length}}
+ {% if grants_aggregates.distinct_funding_org_identifier|length %} .
+ {% endif %}
+ {% trans "Unique recipient organisation identifiers" %}
+ {% if grants_aggregates.distinct_recipient_org_identifier|length %}{% endif %}
+ {{ grants_aggregates.distinct_recipient_org_identifier|length}}
+ {% if grants_aggregates.distinct_recipient_org_identifier|length %} .{% endif %}
+
+ {% blocktrans %}Do these results look correct?{% endblocktrans %}
+
+ {% blocktrans %}Do the numbers of funders, grants and recipients match what you expect?{% endblocktrans %}
+ {% blocktrans %}Are the dates for the right time period?{% endblocktrans %}
+ {% blocktrans %}Do the currency and total value figures show the correct amounts?{% endblocktrans %}
+
+ {% blocktrans %}If any of this information appears incorrect, the feedback below will help you to investigate what happened. {% endblocktrans %}
+
+
+
+
+
Data conversion
+ {% if conversion == 'flattenable' %}
+
Convert the data from JSON format to spreadsheet.
+
+ {% endif %}
+
+
+
+ {% cove_360_modal_list className="unique-ids" modalTitle="Unique IDs" itemList=grants_aggregates.unique_ids %}
+ {% cove_360_modal_list className="distinct-funding-org-identifier" modalTitle="Funder Organisation IDs" itemList=grants_aggregates.distinct_funding_org_identifier %}
+ {% cove_360_modal_list className="distinct-recipient-org-identifier" modalTitle="Recipient Organisation IDs" itemList=grants_aggregates.distinct_recipient_org_identifier %}
+
+
+ {% trans "Download data and share these results" %}
+
+
Share
+
{% trans "You can share these test results with others by using the following url:" %}
+
{{ current_url }}
+ Copy link to Clipboard
+
+
{% trans "If your data is not suitable for sharing publicly, then you should treat this url with care. Only share it with people who have permission to access the data." %}
+
{% trans "After 7 days, the link will expire and the data will be deleted from our servers - so the results will no longer be available. You can revisit these results until then." %}
+
Download
+
{% trans "This application converts data in Excel and CSV format into JSON format, allowing you download the converted version." %}
+
{% trans "If your file is originally in JSON format select ‘Convert to Spreadsheet’ in the summary section to create an Excel version of the file." %}
+
+ {% if not conversion_error and conversion != 'flattenable' %}
+
{% trans "We provide the following formats to download:" %}
+
+ {% else %}
+
(No downloads available as the conversion hasn't happened, or has errored).
+ {% endif %}
+ {% if user.is_authenticated %}
+
Original file download for admin users
+ Warning, this is the original file uploaded. Do not download if you don't trust whoever sent you a link to this page, it could contain a virus. Note that this box and this download link are only visible to admin users, not others you share this page with.
+
+ {% endif %}
+
+
+
+
+ Getting further help
+ You can read about common data errors and what causes them in the Common Errors section.
+ Visit our Data Quality Dashboard to see the data quality of 360Giving data as a whole and for each individual publisher. If you have already published data, you can view your own publisher page there too. It provides insights into the key features that make the data useful for analysis to help publishers to identify opportunities for their data to be improved.
+
diff --git a/cove/cove_360/templates/cove_360/components/explore/usefulness.html b/cove/cove_360/templates/cove_360/components/explore/usefulness.html
new file mode 100644
index 0000000..91a3fc5
--- /dev/null
+++ b/cove/cove_360/templates/cove_360/components/explore/usefulness.html
@@ -0,0 +1,106 @@
+{% load i18n %}
+{% load humanize %}
+{% load cove_tags %}
+
+Usefulness Opportunities
+
+ {% if validation_errors or additional_closed_codelist_values %}
+ The data provided did not pass validation therefore the usefulness of the data could not be determined.
+ {% else %}
+
+{% if usefulness_checks_passed %}
+
What is working well
+ check Congratulations, {{usefulness_checks_passed|length}} of our usefulness checks passed.
+ {% endif %}
+
+
+{% if usefulness_checks_count %}
+ Potential opportunities
+ {% if usefulness_checks_errored %}
+ {% blocktrans %}Usefulness checks failed due to an issue with the data. Fix some validation errors first.{% endblocktrans %}
+ {% endif %}
+
+ {% if usefulness_checks %}
+
+ We identified {% blocktrans count n_usefulness_checks=usefulness_checks_count %} usefulness opportunity{% plural %}{{n_usefulness_checks}} usefulness opportunities{% endblocktrans %}.
+ {% blocktrans %}These usefulness checks highlight ways the data could be made more useful.{% endblocktrans %}
+
+
+ {% blocktrans %}
+ These are the key features that make the data useful for analysis, which we recommend including in 360Giving data whenever possible.
+ Receiving this feedback does not mean the data is invalid and it can be ignored when not relevant.
+ Visit our Data Quality Dashboard to see the data quality of 360Giving data as a whole and for each individual publisher. If you have already published data, you can view your own publisher page there too. It provides insights into the key features that make the data useful for analysis to help publishers to identify opportunities for their data to be improved.
+ {% endblocktrans %}
+
+ {% for category in usefulness_categories %}
+ {{category}}
+
+
+
+
+ {% trans 'Failed' %}
+ {% trans 'Check Description' %}
+ {% trans 'First 3 Locations' %}
+
+
+
+ {% for message, json_location, spreadsheet_location in usefulness_checks %}
+ {% if message.category == category %}
+
+
+
+
+ {{message.percentage|multiply:100}}%
+
+
+
+
+ {{ message.heading }} {{ message.message }}
+
+ {% if file_type == 'xlsx' or file_type == 'csv' %}
+
+
+ {% for location in spreadsheet_location|slice:":3" %}
+ Sheet: {{location.sheet}} Row: {{location.row_number}} {% if location.header %} Header: {{location.header}} {% endif %}
+ {% endfor %}
+ {% if spreadsheet_location|length > 3 %}
+ see all
+ {% endif %}
+
+
+ {% else %}
+
+ {# first 3 locations #}
+
+ {% for location in json_location|slice:":3" %}
+ {{location}}
+ {% endfor %}
+ {% if json_location|length > 3 %}
+ see all
+ {% endif %}
+
+
+ {% endif %}
+
+ {% endif %} {# end category filter #}
+ {% endfor %}
+
+
+ {% endfor %} {# categories #}
+
+ {% endif %} {# if count #}
+
+ {% for message, json_location, spreadsheet_location in usefulness_checks %}
+ {% with msg=message.heading %}
+ {% if file_type == 'json' %}
+ {% cove_360_modal_errors className="usefulness-checks-"|concat:forloop.counter modalTitle=msg errorList=json_location file_type=file_type full_table=False %}
+ {% else %}
+ {% cove_360_modal_errors className="usefulness-checks-"|concat:forloop.counter modalTitle=msg errorList=spreadsheet_location file_type=file_type full_table=False %}
+ {% endif %}
+ {% endwith %}
+ {% endfor %}
+
+ {% else %}
+ No usefulness opportunities detected.
+ {% endif %}
+{% endif %} {# validation failed #}
\ No newline at end of file
diff --git a/cove/cove_360/templates/cove_360/components/explore/validity.html b/cove/cove_360/templates/cove_360/components/explore/validity.html
new file mode 100644
index 0000000..6ce6e98
--- /dev/null
+++ b/cove/cove_360/templates/cove_360/components/explore/validity.html
@@ -0,0 +1,102 @@
+{% load i18n %}
+{% load humanize %}
+{% load cove_tags %}
+
+ Validation
+ {% if validation_and_closed_codelist_errors_count > 0 %}
+ Failed
+ {% else %}
+ Passed
+ {% endif %}
+
+
+
+ {% if validation_and_closed_codelist_errors_count > 0 %}
+ {% trans "Validation failed means that the data does not meet " %}
+ {% else %}
+ {% trans "Validation passed means that the data meets " %}
+ {% endif %}
+ {% blocktrans %}the requirements of the 360Giving Data Standard .{% endblocktrans %}
+ {% blocktrans %} Making sure your data uses the standard correctly is important. Otherwise it cannot be used alongside other valid 360Giving data and cannot be included in 360Giving tools, such as GrantNav and 360Insights.{% endblocktrans %}
+
+
+ {% if extension_metadatas %}
+ {% trans "The 360Giving Data Standard was extended using these extensions:" %}
+
+ {% for extension_metadata in extension_metadatas %}
+ {{extension_metadata.title}} ({{extension_metadata.id}})
+ {% endfor %}
+
+ {% endif %}
+
+ {% if validation_errors or additional_closed_codelist_values %}
+ {% trans "The following errors are preventing your data from being valid 360Giving data. Please use the feedback below to find and resolve the issues in your file" %}
+
+ {% with validation_errors=validation_errors_grouped.required error_prefix='required-' %}
+ {% if validation_errors %}
+
+ Missing Fields
+ Some or all of your entries were missing fields which are required by the 360Giving Data Standard.
+ {% include "cove_360/validation_table.html" %}
+
+
+ {% for error_json, error_extra in validation_errors %}
+ {% with error=error_json|json_decode %}
+ {% cove_360_modal_errors className="validation-errors-"|concat:error_prefix|concat:forloop.counter modalTitle=error.message errorList=error_extra.values file_type=file_type full_table=True %}
+ {% endwith %}
+ {% endfor %}
+ {% endif %}
+ {% endwith %}
+ {% with validation_errors=validation_errors_grouped.format error_prefix='format-' %}
+ {% if validation_errors %}
+
+
+ Incorrect Formats
+
+
+ Some or all of your entries have incorrectly formatted data.
+ {% include "cove_360/validation_table.html" %}
+
+
+ {% for error_json, error_extra in validation_errors %}
+ {% with error=error_json|json_decode %}
+ {% cove_360_modal_errors className="validation-errors-"|concat:error_prefix|concat:forloop.counter modalTitle=error.message errorList=error_extra.values file_type=file_type full_table=True %}
+ {% endwith %}
+ {% endfor %}
+ {% endif %}
+ {% endwith %}
+ {% if additional_closed_codelist_values %}
+
+
+ {% trans 'Codelist Errors' %}
+
+
+
+ Some or all of your entries do not use the 360Giving Data Standard codelists correctly.
+ {% blocktrans %}The fields below use closed codelists. When using these fields, you must use one of the pre-defined codelist values. If you use a value that is not on the relevant codelist, your data will not pass structural checks.{% endblocktrans %}
+
+ {% with additional_codelist_values=additional_closed_codelist_values %}
+ {% include "additional_codelist_values.html" %}
+ {% endwith %}
+
+
+ {% endif %}
+ {% endif %}
+ {% with validation_errors=validation_errors_grouped.other error_prefix='other-' %}
+ {% if validation_errors %}
+
+
+ Other
+
+
+ Other validation errors.
+ {% include "cove_360/validation_table.html" %}
+
+
+ {% for error_json, error_extra in validation_errors %}
+ {% with error=error_json|json_decode %}
+ {% cove_360_modal_errors className="validation-errors-"|concat:error_prefix|concat:forloop.counter modalTitle=error.message errorList=error_extra.values file_type=file_type full_table=True %}
+ {% endwith %}
+ {% endfor %}
+ {% endif %}
+ {% endwith %}
\ No newline at end of file
diff --git a/cove/cove_360/templates/cove_360/components/explore_checking.html b/cove/cove_360/templates/cove_360/components/explore_checking.html
new file mode 100644
index 0000000..248c85d
--- /dev/null
+++ b/cove/cove_360/templates/cove_360/components/explore_checking.html
@@ -0,0 +1,143 @@
+{% load i18n %} {% load humanize %} {% load cove_tags %}
+
+{% trans 'Converted from Original' as converted %}
+{% trans 'Original' as original %}
+{% trans 'Excel Spreadsheet (.xlsx)' as xlsx %}
+{% trans 'OpenDocument Spreadsheet (.ods)' as ods %}
+{% trans 'CSV Spreadsheet (.csv)' as csv %}
+{% trans 'Excel Spreadsheet (.xlsx) with titles' as xlsx_titles %}
+{% trans 'OpenDocument Spreadsheet (.ods) with titles' as ods_titles %}
+{# Translators: JSON probably does not need a transalation: http://www.json.org/ #}
+{% trans 'JSON' as JSON %}
+{% trans 'XML' as XML %}
+
+
+
+Checking file "{{file_name}}"
+
+
+
+
+
+
+
+
+
+ {{validation_and_closed_codelist_errors_count}}
+
+
Validity errors to fix
+
+
+
+
+
+
+
+
+ {% if validation_and_closed_codelist_errors_count %}
+ 0
+ {% else %}
+ {{quality_accuracy_checks_count}}
+ {% endif %}
+
+
Potential accuracy issue
+
+
+
+
+
+
+
+
+ {% if validation_and_closed_codelist_errors_count %}
+ 0
+ {% else %}
+ {{usefulness_checks_count }}
+ {% endif %}
+
+
Usefulness opportunities
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {% include "cove_360/components/explore/summary.html" %}
+
+
+
+ {% include "cove_360/components/explore/validity.html" %}
+
+
+
+ {% include "cove_360/components/explore/accuracy.html" %}
+
+
+
+ {% include "cove_360/components/explore/usefulness.html" %}
+
+
+
+
+
+
\ No newline at end of file
diff --git a/cove/cove_360/templates/cove_360/components/explore_publishing.html b/cove/cove_360/templates/cove_360/components/explore_publishing.html
new file mode 100644
index 0000000..3cadd7f
--- /dev/null
+++ b/cove/cove_360/templates/cove_360/components/explore_publishing.html
@@ -0,0 +1,118 @@
+{% load i18n %}
+
+{% trans 'Converted from Original' as converted %}
+{% trans 'Original' as original %}
+{% trans 'Excel Spreadsheet (.xlsx)' as xlsx %}
+{% trans 'OpenDocument Spreadsheet (.ods)' as ods %}
+{% trans 'CSV Spreadsheet (.csv)' as csv %}
+{% trans 'Excel Spreadsheet (.xlsx) with titles' as xlsx_titles %}
+{% trans 'OpenDocument Spreadsheet (.ods) with titles' as ods_titles %}
+{# Translators: JSON probably does not need a transalation: http://www.json.org/ #}
+{% trans 'JSON' as JSON %}
+{% trans 'XML' as XML %}
+{% trans "Submit your data" %}
+
+{% if validation_and_closed_codelist_errors_count > 0 %}
+
+
+
+ {{validation_and_closed_codelist_errors_count}}
+
+
Validity errors to fix before submitting
+
+
+
+{% endif %}
+
+{% if data_status.can_publish %}
+{% trans "Submitting for: " %}{{publisher.name}}
+check {% trans "The data was checked and can now be submitted to the 360Giving Data Registry." %}
+
+ {% trans "Click the 'Submit your file' to fill out the 360Giving data file submission form. " %}
+ {% trans "Guidance about using the submission form." %}
+
+
+ Submit your file
+
+{% endif %} {# Data passed, Domain not recognised/approved #}
+{% if data_status.passed and not data_status.can_publish %}
+
+ {% blocktrans %} Sorry you aren't able to submit this file because the domain
+ name of the website hosting your file ({{source_url_domain}}) is not
+ authorised for publishing 360Giving data. {% endblocktrans %}
+
+
+ {% blocktrans %} Please email 360Giving Helpdesk via
+ support@threesixtygiving.org
+ with the link to the file you want to submit to the Data Registry.
+ {% endblocktrans %}
+
+{% endif %}
+{# Validation failed #} {% if not data_status.passed %}
+
+ {% blocktrans %}Sorry you aren't able to submit this file because it is not
+ valid 360Giving data.{% endblocktrans %}
+
+
+ {% blocktrans %} Follow the feedback in the Data Quality Tool to make the amendments needed to
+ your data. Once your data passes the Data Quality tool checks, upload the
+ updated file to your website and then restart the 360Giving data file
+ submission process. The data did not pass the checks and cannot be published.
+ See results below. {% endblocktrans %}
+
+
+Open the file in Data Quality Tool to see validation errors.
+{% endif %}
+
+
+
+{% comment %} TODO no longer needed?
+
+
+
+
+
+Report
+{% include "cove_360/components/explore/summary.html" %}
+
+{% include "cove_360/components/explore/validity.html" %}
+
+{% include "cove_360/components/explore/accuracy.html" %}
+
+{% include "cove_360/components/explore/usefulness.html" %}
+#}
+{% endcomment %}
+
+
diff --git a/cove/cove_360/templates/cove_360/components/footer.html b/cove/cove_360/templates/cove_360/components/footer.html
new file mode 100644
index 0000000..7b129a4
--- /dev/null
+++ b/cove/cove_360/templates/cove_360/components/footer.html
@@ -0,0 +1,77 @@
+{% load i18n %}
+{% load static %}
+
+
\ No newline at end of file
diff --git a/cove/cove_360/templates/cove_360/components/terms/terms_conditions.html b/cove/cove_360/templates/cove_360/components/terms/terms_conditions.html
new file mode 100644
index 0000000..9e35206
--- /dev/null
+++ b/cove/cove_360/templates/cove_360/components/terms/terms_conditions.html
@@ -0,0 +1,17 @@
+
+Terms & conditions
+
+{% include "terms_conditions_intro.html" %}
+
+The use of this website is subject to the following terms of use:
+
+The content of the pages of this website is for your general information and use only. It is subject to change without notice.
+
+Neither we nor any third parties provide any warranty or guarantee as to the accuracy, timeliness, performance, completeness or suitability of the information and materials found or offered on this website for any particular purpose. You acknowledge that such information and materials may contain inaccuracies or errors and we expressly exclude liability for any such inaccuracies or errors to the fullest extent permitted by law.
+Your use of any information or materials on this website is entirely at your own risk, for which we shall not be liable. It shall be your own responsibility to ensure that any products, services or information available through this website meet your specific requirements.
+This website contains material which is owned by or licensed to us. This material includes, but is not limited to, the design, layout, look, appearance and graphics. Reproduction is prohibited other than in accordance with the copyright notice, which forms part of these terms and conditions.
+All trademarks reproduced in this website which are not the property of, or licensed to, the operator are acknowledged on the website.
+Unauthorised use of this website may give rise to a claim for damages and/or be a criminal offence.
+From time to time this website may also include links to other websites. These links are provided for your convenience to provide further information. They do not signify that we endorse the website(s). We have no responsibility for the content of the linked website(s).
+Your use of this website and any dispute arising out of such use of the website is subject to the laws of England, Northern Ireland, Scotland and Wales.
+
diff --git a/cove/cove_360/templates/cove_360/components/terms/terms_conditions_intro.html b/cove/cove_360/templates/cove_360/components/terms/terms_conditions_intro.html
new file mode 100644
index 0000000..ba37058
--- /dev/null
+++ b/cove/cove_360/templates/cove_360/components/terms/terms_conditions_intro.html
@@ -0,0 +1,22 @@
+
+This web application is free software designed to help people check data published to the
+{% if app == 'cove_360' %}360Giving Standard.{% endif %}
+{% if app == 'cove_iati' %}IATI data standard.{% endif %}
+
+
+It is offered as service WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+
+If you continue to browse and use this website, you are agreeing to comply with and be bound by the following terms and conditions of use, which together with our privacy notice govern
+ {% if app == 'cove_360' %}360Giving's{% endif %}
+ {% if app == 'cove_iati' %}Open Data Services Co-operative Limited's{% endif %}
+ relationship with you in relation to this website. If you disagree with any part of these terms and conditions, please do not use our website.
+
+
+{% if app == 'cove_iati' %}
+The term 'Open Data Services Co-operative Limited' or 'us' or 'we' refers to the owner of the website. Our company registration number is 09506232. Our registered address is 1st Floor, Holyoake House, Hanover Street, Manchester, Greater Manchester, England, M60 0AS. You can contact us by email company@opendataservices.coop . There is more company information on the Open Data Services Co-operative Limited page at Open Corporates . The term 'you' refers to the user or viewer of our website.
+{% elif app == 'cove_360' %}
+The term ‘360Giving’ or ‘us’ or ‘we’ refers to the owner of the website. Our company registration number is 09668396. Our registered address is 360Giving, c/o Esmée Fairbairn Foundation, King's Place, 90 York Way, London, N1 9AG. You can contact us by email info@threesixtygiving.org .
+The site is operated by Open Data Services Co-operative Limited.
+The term 'Open Data Services Co-operative Limited' refers to the operator of the website on behalf of 360Giving. Open Data Services Co-operative Limited's company registration number is 09506232. Their registered address is 1st Floor, Holyoake House, Hanover Street, Manchester, Greater Manchester, England, M60 0AS. Email: company@opendataservices.coop
+{% endif %}
diff --git a/cove/cove_360/templates/cove_360/components/terms/terms_cookies.html b/cove/cove_360/templates/cove_360/components/terms/terms_cookies.html
new file mode 100644
index 0000000..1dbc9be
--- /dev/null
+++ b/cove/cove_360/templates/cove_360/components/terms/terms_cookies.html
@@ -0,0 +1,37 @@
+
+How we use cookies
+A cookie is a small file which asks permission to be placed on your computer's hard drive. Once you agree, the file is added and the cookie helps analyse web traffic or lets you know when you visit a particular site.
+
+Cookies allow web applications to respond to you as an individual. The web application can tailor its operations to your needs, likes and dislikes by gathering and remembering information about your preferences. A cookie in no way gives us access to your computer or any information about you, other than the data you choose to share with us.
+
+You can choose to accept or decline cookies. Most web browsers automatically accept cookies, but you can usually modify your browser setting to decline cookies if you prefer. This may prevent you from taking full advantage of the website.
+
+In this website we use cookies to:
+
+
+Help us analyse how our website is used.
+To ensure other sites can’t “forge” requests.
+Remember your choices within the application, for your convenience.
+
+
+{% include "terms_cookies_we_use.html" %}
+
+
+If you do allow cookies to be used, Matomo uses 1st party cookies, set on the domain of this website. Cookies created by Matomo start with:
+
+_pk_ref
+_pk_cvar
+_pk_id
+_pk_ses
+
+
+{% include "terms_cookies_links.html" %}
+
+
+The application is built using Django and we use that framework to set the following cookies:
+{% comment %}Translators: csrftoken and sessionid are names of cookies and do not need translation {% endcomment %}
+csrftoken - (to prevent cross site scripting attacks https://docs.djangoproject.com/en/1.8/ref/csrf/#how-it-works)
+sessionid - (you will get this if you interact with the application, so that we can save the things you have done, e.g. select a language)"
+
+
+If you choose not to accept these cookies the application may not work for you.
diff --git a/cove/cove_360/templates/cove_360/components/terms/terms_cookies_link_matmo.html b/cove/cove_360/templates/cove_360/components/terms/terms_cookies_link_matmo.html
new file mode 100644
index 0000000..b446b2a
--- /dev/null
+++ b/cove/cove_360/templates/cove_360/components/terms/terms_cookies_link_matmo.html
@@ -0,0 +1 @@
+See: http://piwik.org/faq/general/faq_146/ for more information.
diff --git a/cove/cove_360/templates/cove_360/components/terms/terms_cookies_links.html b/cove/cove_360/templates/cove_360/components/terms/terms_cookies_links.html
new file mode 100644
index 0000000..a3afe6c
--- /dev/null
+++ b/cove/cove_360/templates/cove_360/components/terms/terms_cookies_links.html
@@ -0,0 +1,4 @@
+{% include "terms_cookies_link_matmo.html" %}
+
+{% include "terms_cookies_link_google_analytics.html" %}
+
diff --git a/cove/cove_360/templates/cove_360/components/terms/terms_cookies_we_use.html b/cove/cove_360/templates/cove_360/components/terms/terms_cookies_we_use.html
new file mode 100644
index 0000000..a200a7c
--- /dev/null
+++ b/cove/cove_360/templates/cove_360/components/terms/terms_cookies_we_use.html
@@ -0,0 +1,5 @@
+
+ We use Matomo {% if google_analytics_id %}and Google Analytics{% endif %} to analyse usage of our website (see "Understanding website visitor and traffic patterns" section below).
+ This uses cookies to identify you (anonymously) as the same user, so that we can analyse our web traffic better.
+ E.g. it allows us to count how many users we have, instead of just total page views or analyse what pages people commonly visit together.
+
diff --git a/cove/cove_360/templates/cove_360/components/terms/terms_data_deleting.html b/cove/cove_360/templates/cove_360/components/terms/terms_data_deleting.html
new file mode 100644
index 0000000..f9026d8
--- /dev/null
+++ b/cove/cove_360/templates/cove_360/components/terms/terms_data_deleting.html
@@ -0,0 +1,9 @@
+
+Deleting our copies of the files
+When you provide data to the application we store the data you have provided in order to process it for you. We also enable derived versions of the data to be downloaded. Those derived versions and the original data are stored on our server.
+
+After a period of time we will delete those files from our server, meaning they are no-longer available for download.
+
+Information about how long files will be stored is made available to users directly through the interface, but will be for no longer than one year from the date of submission.
+
+If you believe that any information we are holding on you is incorrect or incomplete, please write to or email us as soon as possible at the above address. We will promptly correct any information found to be incorrect.
diff --git a/cove/cove_360/templates/cove_360/components/terms/terms_data_uploaded.html b/cove/cove_360/templates/cove_360/components/terms/terms_data_uploaded.html
new file mode 100644
index 0000000..4d15ff6
--- /dev/null
+++ b/cove/cove_360/templates/cove_360/components/terms/terms_data_uploaded.html
@@ -0,0 +1,10 @@
+
+Data uploaded to this website
+
+This application is designed so that people can submit files to the application, allow the application to process them and to then display information about them, generate alternative file formats of the original data, and provide those files for download.
+
+Please do not submit any non-public personal data to this application.
+
+We do not make use of any of the data within the files for purposes other than to create reports for you about the data you have submitted and to review the operation and output of the website.
+
+We do create and store metadata about your use of the application, and about the files/data that you have uploaded in order to monitor how the application is being used.
diff --git a/cove/cove_360/templates/cove_360/components/terms/terms_disclaimer.html b/cove/cove_360/templates/cove_360/components/terms/terms_disclaimer.html
new file mode 100644
index 0000000..2eecc27
--- /dev/null
+++ b/cove/cove_360/templates/cove_360/components/terms/terms_disclaimer.html
@@ -0,0 +1,6 @@
+
+Website disclaimer
+The information contained in this website is for general information purposes only. The information is provided by us and while we endeavour to keep the information up to date and correct, we make no representations or warranties of any kind, express or implied, about the completeness, accuracy, reliability, suitability or availability with respect to the website or the information, products, services, or related graphics contained on the website for any purpose. Any reliance you place on such information is therefore strictly at your own risk.
+In no event will we be liable for any loss or damage including without limitation, indirect or consequential loss or damage, or any loss or damage whatsoever arising from loss of data or profits arising out of, or in connection with, the use of this website.
+Through this website you are able to link to other websites which are not under the control of us. We have no control over the nature, content and availability of those sites. The inclusion of any links does not necessarily imply a recommendation or endorse the views expressed within them.
+Every effort is made to keep the website up and running smoothly. However, we take no responsibility for, and will not be liable for, the website being temporarily unavailable due to technical issues beyond our control.
diff --git a/cove/cove_360/templates/cove_360/components/terms/terms_links.html b/cove/cove_360/templates/cove_360/components/terms/terms_links.html
new file mode 100644
index 0000000..3f3bd2c
--- /dev/null
+++ b/cove/cove_360/templates/cove_360/components/terms/terms_links.html
@@ -0,0 +1,3 @@
+
+Links to other websites
+Our website may contain links to other websites of interest. However, once you have used these links to leave our site, you should note that we do not have any control over that other website. Therefore, we cannot be responsible for the protection and privacy of any information which you provide whilst visiting such sites and such sites are not governed by this privacy statement. You should exercise caution and look at the privacy statement applicable to the website in question.
diff --git a/cove/cove_360/templates/cove_360/components/terms/terms_privacy.html b/cove/cove_360/templates/cove_360/components/terms/terms_privacy.html
new file mode 100644
index 0000000..05b7fc6
--- /dev/null
+++ b/cove/cove_360/templates/cove_360/components/terms/terms_privacy.html
@@ -0,0 +1,22 @@
+
+
+Privacy Notice
+
+{% include "terms_privacy_intro.html" %}
+
+You have the following rights concerning this data:
+ Right to be informed, which is the purpose of this privacy notice
+ Right to Access, Rectification, Erasure, and to Restrict Processing. Note that the right to Erasure and Restrict Processing are balanced against our legitimate interests. Where relevant, you need to provide information to re-identify yourself from our pseudonymised data, see GDPR Article 11
+Right to object to our processing.
+
+
+Our supervisory authority is the ICO in the UK . You have the right to lodge a complaint with them.
+
+We process personal data for the following purposes:
+Understanding website visitor and traffic patterns
+Understanding server behaviour
+Identifying and being alerted to software errors
+
+
+We rely on legitimate interests (GDPR Article 6(1)(f) ) as the lawful basis for this processing. Details about the type of data, the purpose of the processing and legitimate interests, and the storage and retention of the data are set out below.
+
diff --git a/cove/cove_360/templates/cove_360/components/terms/terms_privacy_intro.html b/cove/cove_360/templates/cove_360/components/terms/terms_privacy_intro.html
new file mode 100644
index 0000000..f2079ee
--- /dev/null
+++ b/cove/cove_360/templates/cove_360/components/terms/terms_privacy_intro.html
@@ -0,0 +1,18 @@
+
+{% if app == 'cove_360' %}360Giving{% endif %}
+{% if app == 'cove_iati' %}Open Data Services Co-operative Limited{% endif %}
+is committed to ensuring that your privacy is protected. This privacy notice sets out how we collect and process any personal data when you use this website.
+
+We may change this notice from time to time by updating this page. This notice is effective from 24th May 2018.
+
+Data controller:
+{% if app == 'cove_360' %}
+ 360Giving, c/o Esmée Fairbairn Foundation, King's Place, 90 York Way, London, N1 9AG.
+{% elif app == 'cove_iati' %}
+ Open Data Services Co-operative Limited, 1st Floor, Holyoake House, Hanover Street, Manchester, Greater Manchester, England, M60 0AS. inbox+opendataservices+443f+data-protection@plan.io .
+{% endif %}
+ Contact us if would like a copy of the information held on you or if you believe that any information we are holding on you is incorrect or incomplete.
+{% if app == 'cove_360' %}
+ You can contact us by email at: info@threesixtygiving.org
+{% endif %}
+
diff --git a/cove/cove_360/templates/cove_360/components/terms/terms_security.html b/cove/cove_360/templates/cove_360/components/terms/terms_security.html
new file mode 100644
index 0000000..8ed54d7
--- /dev/null
+++ b/cove/cove_360/templates/cove_360/components/terms/terms_security.html
@@ -0,0 +1,3 @@
+
+Security
+We are committed to ensuring that your information is secure. In order to prevent unauthorised access or disclosure, we have put in place suitable physical, electronic and managerial procedures to safeguard and secure the information we collect online.
diff --git a/cove/cove_360/templates/cove_360/components/terms/terms_tracker_data_controller_international.html b/cove/cove_360/templates/cove_360/components/terms/terms_tracker_data_controller_international.html
new file mode 100644
index 0000000..e69de29
diff --git a/cove/cove_360/templates/cove_360/components/terms/terms_tracker_matmo.html b/cove/cove_360/templates/cove_360/components/terms/terms_tracker_matmo.html
new file mode 100644
index 0000000..5b04c2c
--- /dev/null
+++ b/cove/cove_360/templates/cove_360/components/terms/terms_tracker_matmo.html
@@ -0,0 +1,23 @@
+
+
+
+Personal data we collect:
+Your IP address - this is pseudonymised by redacting the second half of the address
+Referrer (what page you arrived at one of our web pages from)
+Information about your device, OS and browser
+ We do not use this data to personally identify individuals, but it is possible that it could be used to do so, particularly if combined with other datasets.
+
+You can opt out of this processing:
+If you have set your web browser to "I do not want to be tracked" (DoNotTrack is enabled) then Matomo will not track your visit.
+
+Matomo also it’s own opt out mechanism:
+
+
+
+Data processors: {% if app != 'cove_iati' %}Open Data Services Co-operative Limited, {% endif %}Bytemark.
+
+{% include "terms_tracker_data_controller_international.html" %}
+
+{% include "terms_tracker_no_international.html" %}
+
+The data is kept indefinitely, in pseudonymised form.
diff --git a/cove/cove_360/templates/cove_360/components/terms/terms_tracker_no_international.html b/cove/cove_360/templates/cove_360/components/terms/terms_tracker_no_international.html
new file mode 100644
index 0000000..e1e08f3
--- /dev/null
+++ b/cove/cove_360/templates/cove_360/components/terms/terms_tracker_no_international.html
@@ -0,0 +1 @@
+No data is transferred to third countries or international organisations.
diff --git a/cove/cove_360/templates/cove_360/components/terms/terms_tracker_sentry.html b/cove/cove_360/templates/cove_360/components/terms/terms_tracker_sentry.html
new file mode 100644
index 0000000..0f67bc6
--- /dev/null
+++ b/cove/cove_360/templates/cove_360/components/terms/terms_tracker_sentry.html
@@ -0,0 +1,19 @@
+{% if sentry_dsn %}
+
+ Identifying and being alerted to software errors
+ When an error occurs on our site, we record details about the visit that caused it. We use Sentry for this.
+
+ Data we collect:
+ Your IP address
+ User agent (information about the OS and browser that you use)
+ Referrer (what page you arrived at one of our web pages from)
+ We do not use this data to personally identify individuals, but it is possible that it could be used to do so, particularly if combined with other datasets.
+
+ Data processors: {% if app != 'cove_iati' %}Open Data Services Co-operative Limited, {% endif %}Sentry (Functional Software, Inc.)
+
+ {% include "terms_tracker_data_controller_international.html" %}
+
+ Data is transferred to Functional Software, Inc. who are based in the USA.
+ The data is kept for 90 days.
+
+{% endif %}
diff --git a/cove/cove_360/templates/cove_360/components/terms/terms_tracker_server.html b/cove/cove_360/templates/cove_360/components/terms/terms_tracker_server.html
new file mode 100644
index 0000000..5764daf
--- /dev/null
+++ b/cove/cove_360/templates/cove_360/components/terms/terms_tracker_server.html
@@ -0,0 +1,16 @@
+Understanding server behaviour
+We collect data about your visits to the website in server logs. This is for the purpose of debugging network issues, monitoring server usage, and identifying malicious usage.
+
+Personal data we collect:
+Your IP address
+User agent (information about the OS and browser that you use)
+Referrer (what page you arrived at one of our web pages from)
+ We do not use this data to personally identify individuals, but it is possible that it could be used to do so, particularly if combined with other datasets.
+
+Data processors: {% if app != 'cove_iati' %}Open Data Services Co-operative Limited, {% endif %}Bytemark.
+
+{% include "terms_tracker_data_controller_international.html" %}
+
+{% include "terms_tracker_no_international.html" %}
+
+The data is kept indefinitely.
diff --git a/cove/cove_360/templates/cove_360/components/terms/terms_trackers.html b/cove/cove_360/templates/cove_360/components/terms/terms_trackers.html
new file mode 100644
index 0000000..5a19678
--- /dev/null
+++ b/cove/cove_360/templates/cove_360/components/terms/terms_trackers.html
@@ -0,0 +1,11 @@
+Understanding website visitor and traffic patterns
+
+We collect data about your visits to the website, for the purpose of analysing how the website is used, so that we can improve it. A self hosted copy of Matomo is used for this.
+
+{% include "terms_tracker_matmo.html" %}
+
+{% include "terms_tracker_google_analytics.html" %}
+
+{% include "terms_tracker_server.html" %}
+
+{% include "terms_tracker_sentry.html" %}
diff --git a/cove/cove_360/templates/cove_360/data_loading.html b/cove/cove_360/templates/cove_360/data_loading.html
index 1b57d0f..41bd4c7 100644
--- a/cove/cove_360/templates/cove_360/data_loading.html
+++ b/cove/cove_360/templates/cove_360/data_loading.html
@@ -4,54 +4,62 @@
{% block explore_content %}
-
-
-
Data processing is in progress
-
Upload data complete, data is now processing …
-
-
-
- Converting data into machine readable format (JSON)
- Running validation tests
- Running quality tests
-
-
-
-
-{% endblock %}
-
-{% block extrafooterscript %}
+Data processing is in progress
+Upload data complete, data is now processing …
+
+
+
+ Converting data into machine readable format (JSON)
+ Running validation tests
+ Running quality tests
+
+
+
+async function updateStatus() {
+ try {
+ const response = await fetch(pollUrl);
+ const data = response.json();
+ if (data.done) {
+ clearInterval(poller);
+ window.location.href = resultsUrl;
+ }
+ } catch {
+ console.error("Error updating status:", error);
+ window.location.href = resultsUrl;
+ }
+}
+const poller = setInterval(updateStatus, 5000);
+
+
{% endblock %}
\ No newline at end of file
diff --git a/cove/cove_360/templates/cove_360/error.html b/cove/cove_360/templates/cove_360/error.html
new file mode 100644
index 0000000..062677b
--- /dev/null
+++ b/cove/cove_360/templates/cove_360/error.html
@@ -0,0 +1,21 @@
+{% extends request.current_app_base_template %}
+{% load i18n %}
+{% block content %}
+{# fixme this template isn't getting used #}
+{{ sub_title }}
+
+ {{ msg | linebreaks }}
+
+ {% include 'error_extra.html' %}
+
+ {{ link_text }}
+
+
+{% endblock %}
+
+{% block extrapiwik %}
+
+{% if piwik.dimension_map.page_type %}
+_paq.push(['setCustomDimension', {{piwik.dimension_map.page_type}}, 'caught error']);
+{% endif %}
+{% endblock %}
diff --git a/cove/cove_360/templates/cove_360/error_extra.html b/cove/cove_360/templates/cove_360/error_extra.html
new file mode 100644
index 0000000..8be3804
--- /dev/null
+++ b/cove/cove_360/templates/cove_360/error_extra.html
@@ -0,0 +1,2 @@
+{% load i18n %}
+{% blocktrans %}If you think this is a bug, you can file an issue publicly on GitHub or {% endblocktrans %}{% trans "get in touch via email" %} {% if request.sentry.id %}, {% blocktrans %}referencing this error as {% endblocktrans %}{{ request.sentry.id }} {% endif %}.
diff --git a/cove/cove_360/templates/cove_360/explore.html b/cove/cove_360/templates/cove_360/explore.html
index 729f01a..e938745 100644
--- a/cove/cove_360/templates/cove_360/explore.html
+++ b/cove/cove_360/templates/cove_360/explore.html
@@ -1,828 +1,10 @@
{% extends 'explore.html' %}
-{% load i18n %}
-{% load humanize %}
-{% load cove_tags %}
-{% block header_button %}
-{{block.super}}
-
-{% endblock %}
+{% block content %}
+{% if submission_tool %}
+ {% include "cove_360/components/explore_publishing.html" %}
+{% else %}
+ {% include "cove_360/components/explore_checking.html" %}
+{% endif %}
-{% block explore_content %}
-
- {% block data_supplied %}
-
- {% if "self_publishing" in data_status.supplied_data.parameters %}
-
-
-
- {% if data_status.can_publish %}
-
- {% endif %}
- {% trans "Submit your data" %}
-
-
- {% if data_status.can_publish %}
-
{% trans "Submitting for:" %} {{publisher.name}}
-
{% trans "The data was checked and can now be submitted to the 360Giving Data Registry." %}
-
{% trans "Click the 'Submit your file' to fill out the 360Giving data file submission form. " %} {% trans "Guidance about using the submission form." %}
-
Submit your file
- {% endif %}
-
- {# Data passed, Domain not recognised/approved #}
- {% if data_status.passed and not data_status.can_publish %}
-
- {% blocktrans %}
- Sorry you aren't able to submit this file because the domain name of the website hosting your file ({{source_url_domain}}) is not authorised for publishing 360Giving data.
- {% endblocktrans %}
-
-
- {% blocktrans %}
- Please email 360Giving Helpdesk via support@threesixtygiving.org with the link to the file you want to submit to the Data Registry.
- {% endblocktrans %}
-
- {% endif %}
-
- {# Validation failed #}
- {% if not data_status.passed %}
-
{% blocktrans %}Sorry you aren't able to submit this file because it is not valid 360Giving data.{% endblocktrans %}
-
- {% blocktrans %}
- Follow the feedback below to make the amendments needed to your data. Once your data passes the Data Quality tool checks, upload the updated file to your website and then restart the 360Giving data file submission process.
- The data did not pass the checks and cannot be published. See results below.
- {% endblocktrans %}
-
- {% endif %}
-
-
-
-
-
- {% endif %}
-
-
-
-
-
- {% trans "Summary: Your data at a glance" %}
-
-
-
-
-
-
- {% trans "Use this section to get an overview of the data and check if this was what you were expecting to see." %}
-
-
-
- {% trans "A file was " %}
- {% if source_url %}
- {% trans "downloaded from " %} {{source_url}}
- {% else %}
- {% trans "uploaded " %}
- {% endif %}
- {% trans "on " %} {{created_date}}.
-
-
- {% if metadata %}
-
- {% if metadata.publisher.logo %}
-
-
-
- {% endif %}
-
- {% if metadata.publisher %}
-
Publisher: {{metadata.publisher.name}} ({{metadata.publisher.identifier}})
- {% endif %}
- {% if metadata.accessURL %}
-
Website that contains this Dataset: {{metadata.accessURL}}
- {% endif %}
- {% if metadata.identifier %}
-
Dataset Identifier: {{metadata.identifier}}
- {% endif %}
- {% if metadata.version %}
-
360 Giving Schema Version: {{metadata.version}}
- {% endif %}
- {% if metadata.license %}
-
License: {{metadata.license}}
- {% endif %}
- {% if extension_metadatas %}
-
Extensions: {% for extension_metadata in extension_metadatas %}
{{extension_metadata.id}} {% endfor %}
- {% endif %}
-
-
-
- {% endif %}
-
- {% if metadata.downloadURL or metadata.title %}
-
- {% if metadata.title %}
- {{metadata.title}}
- {% endif %}
- {% if metadata.downloadURL %}
- Original Data Download
- {% endif %}
-
- {% endif %}
- {% if metadata.description %}
-
- {{metadata.description}}
-
- {% endif %}
-
-
-
This file contains
-
-
- {% blocktrans count n_funders=grants_aggregates.distinct_funding_org_identifier|length|default:0 %}Data about {{n_funders}} funder {% plural %}Data about {{n_funders}} funders {% endblocktrans %}
-
-
- {% blocktrans count n_grants=grants_aggregates.count|default:0 %}There is {{n_grants}} grant {% plural %}There are {{n_grants}} grants {% endblocktrans %}
- {% blocktrans count n_recipients=grants_aggregates.distinct_recipient_org_identifier|length|default:0 %}to {{n_recipients}} recipient organisation and {% plural %}to {{n_recipients}} recipient organisations and{% endblocktrans %}
- {% blocktrans count n_recipients_individuals=grants_aggregates.recipient_individuals_count|default:0 %}{{n_recipients_individuals}} to a recipient individual {% plural %}{{n_recipients_individuals}} to recipient individuals {% endblocktrans %}.
-
-
- {% blocktrans count n_grants=grants_aggregates.count|default:0 %}The grant was awarded {% plural %}The grants were awarded {% endblocktrans %}
- {% if grants_aggregates.min_award_date == grants_aggregates.max_award_date %}
- {% blocktrans with start_date=grants_aggregates.min_award_date %}on {{start_date}} .{% endblocktrans %}
- {% else %}
- {% blocktrans with start_date=grants_aggregates.min_award_date end_date=grants_aggregates.max_award_date %}between {{start_date}} and {{end_date}} .{% endblocktrans %}
-
- {% endif %}
- {% if metadata.issued %}
-
- The file was issued on {{metadata.issued|slice:":10"}}
-
- {% endif %}
- {% if metadata.modified %}
-
- The file was modified on {{metadata.modified|slice:":10"}}
-
- {% endif %}
- {% for currency_code, currency_aggregates in grants_aggregates.currencies.items %}
-
- {% if currency_aggregates.count == 1 %}
- {% if currency_aggregates.count == grants_aggregates.count %}
- {% trans "The grant" %}
- {% else %}
- {% trans "1 grant " %}
- {% endif %}
- {% blocktrans with amount_awarded=currency_aggregates.total_amount|intcomma currency_symbol=currency_aggregates.currency_symbol|safe %} was awarded in {{currency_code}} with a value of {{currency_symbol}}{{amount_awarded}} .{% endblocktrans %}
- {% else %}
- {% if currency_aggregates.count == grants_aggregates.count %}
- {% trans "The grants" %}
- {% else %}
- {{currency_aggregates.count}} {% trans "grants " %}
- {% endif %}
- {% blocktrans with n_grants=currency_aggregates.count total_amount=currency_aggregates.total_amount|intcomma max_amount=currency_aggregates.max_amount|intcomma min_amount=currency_aggregates.min_amount|intcomma currency_symbol=currency_aggregates.currency_symbol|safe %} were awarded in {{currency_code}} with a total value of {{currency_symbol}}{{total_amount}} and individual awards ranging from {{currency_symbol}}{{min_amount}} (lowest) to {{currency_symbol}}{{max_amount}} (highest).{% endblocktrans %}
- {% endif %}
-
- {% endfor %}
- {% if csv_encoding and csv_encoding != "utf-8-sig" %}
-
- {% blocktrans %} This file is not 'utf-8' encoded (it is {{csv_encoding}} encoded).{% endblocktrans %}
-
- {% endif %}
-
-
-
-
{% blocktrans %}Do these results look correct?{% endblocktrans %}
-
- {% blocktrans %}Do the numbers of funders, grants and recipients match what you expect?{% endblocktrans %}
- {% blocktrans %}Are the dates for the right time period?{% endblocktrans %}
- {% blocktrans %}Do the currency and total value figures show the correct amounts?{% endblocktrans %}
-
-
{% blocktrans %}If any of this information appears incorrect, the feedback below will help you to investigate what happened. {% endblocktrans %}
-
-
-
{% blocktrans %}About the feedback{% endblocktrans %}
-
{% blocktrans %}The feedback is split into several sections. Use the small arrow icon on the far right side to display or hide the details for each section.{% endblocktrans %}
-
- {% blocktrans %}a red cross indicates warnings or errors . These types of issues must be resolved before the data can be published and used alongside other valid 360Giving data. {% endblocktrans %}
- {% blocktrans %}a green tick indicates that the file is valid 360Giving data. {% endblocktrans %}
- {% blocktrans %}a question mark indicates additional checks which suggest ways to improve the quality or usefulness of the data. {% endblocktrans %}
-
-
A maximum of 10 additional checks can be displayed at once.
-
The check your data section allows you to review the data itself to help identify any issues.
-
If you make changes to the data prompted by this feedback, return here to upload the updated file for a new check. It may take several iterations to get the data to a state you are happy with and are ready to publish as open data.
-
-
-
Getting further help
-
You can read about common data errors and what causes them in the Common Errors section.
-
Visit our Data Quality Dashboard to see the data quality of 360Giving data as a whole and for each individual publisher. If you have already published data, you can view your own publisher page there too. It provides insights into the key features that make the data useful for analysis to help publishers to identify opportunities for their data to be improved.
-
- {% if conversion == 'flattenable' %}
-
- {% endif %}
-
-
-
- {% endblock data_supplied %}
-
- {% block conversion %}
- {% if conversion == 'unflatten' or conversion == 'flatten'%}
-
-
-
- {% if conversion_warning_messages or conversion_error %}
-
- {% trans "Data conversion unsuccessful - " %}
- {% else %}
-
- {% trans "Data conversion successful" %}
- {% endif %}
- {% if conversion_warning_messages %}
- {% blocktrans count n_warnings=conversion_warning_messages|length %}{{n_warnings}} Error has been found{% plural %}{{n_warnings}} Errors have been found{% endblocktrans %}
- {% endif %}
-
-
-
-
-
- {% if conversion == 'unflatten' %}
-
{% trans "Before checking your data we needed to convert it to JSON" %}{% if conversion_error or conversion_warning_messages %}{% blocktrans %} but we were not able to do this successfully{% endblocktrans %}{% endif %}.
-
{% blocktrans %}This tool converts data into JSON because the 360Giving Data Standard uses a
JSON Schema to describe the standard in a technical way.{% endblocktrans %}
- {% if conversion_error %}
- {% blocktrans %}If a file cannot be converted to JSON it indicates that it cannot be correctly mapped to the standard and needs to be reviewed. If this is the case you should check the file and re-upload it once you’ve fixed the problem. The conversion errors below will give an indication of where the issue is.{% endblocktrans %}
- {% endif %}
-
- {% else %}
-
We have converted your JSON data into spreadsheet format.
- {% if conversion_error %}
-
{% blocktrans %}The JSON data could not be converted to spreadsheet due to the following error: {{conversion_error}}{% endblocktrans %}
- {% include 'error_extra.html' %}
- {% endif %}
- {% endif %}
- {% if conversion_warning_messages %}
-
-
{% trans "Conversion errors: " %}
-
- {% for warning_message in conversion_warning_messages %}
- {{warning_message}}
- {% endfor %}
-
-
{% trans "Please resolve this error, as well as any others found, and test the data again." %}
- {% endif %}
-
-
-
- {% endif %}
- {% endblock conversion %}
-
- {% block validation %}
-
-
-
- {% if validation_errors or additional_closed_codelist_values %}
-
- {% trans "This data does not use the 360Giving Data Standard correctly" %} {% blocktrans count n_errors=validation_and_closed_codelist_errors_count %} {{n_errors}} Error.{% plural %}{{n_errors}} Errors {% endblocktrans %}
- {% else %}
-
- {% trans "This data uses the 360Giving Data Standard correctly" %}
- {% endif %}
-
-
-
-
-
-
- {% if validation_errors or additional_closed_codelist_values %}
- {% trans "Sorry your data is not yet using the 360Giving Data Standard. We used the " %}
- {% else %}
- {% trans "Congratulations! Your data is using the 360Giving Data Standard. We used the " %}
- {% endif %}
- 360Giving JSON Package Schema
- {% trans "to check this." %}
-
-
{% trans "This means that the data" %}
- {% if validation_errors or additional_closed_codelist_values %}
- {% trans " does not meet " %}
- {% else %}
- {% trans " meets " %}
- {% endif %}
-
- {% blocktrans %}the requirements of the
360Giving Data Standard .{% endblocktrans %}
- {% blocktrans %} Making sure your data uses the standard correctly is important. Otherwise it cannot be used alongside other valid 360Giving data and cannot be included in 360Giving tools, such as GrantNav and 360Insights.{% endblocktrans %}
-
-
- {% if extension_metadatas %}
-
{% trans "The 360Giving Data Standard was extended using these extensions:" %}
-
- {% for extension_metadata in extension_metadatas %}
- {{extension_metadata.title}} ({{extension_metadata.id}})
- {% endfor %}
-
- {% endif %}
-
- {% if validation_errors or additional_closed_codelist_values %}
-
-
{% trans "The following errors are preventing your data from being valid 360Giving data. Please use the feedback below to find and resolve the issues in your file" %}
-
- {% with validation_errors=validation_errors_grouped.required error_prefix='required-' %}
- {% if validation_errors %}
-
-
-
Missing Fields
-
-
-
Some or all of your entries were missing fields which are required by the 360Giving Data Standard.
- {% include "cove_360/validation_table.html" %}
-
-
- {% for error_json, error_extra in validation_errors %}
- {% with error=error_json|json_decode %}
- {% cove_modal_errors className="validation-errors-"|concat:error_prefix|concat:forloop.counter modalTitle=error.message errorList=error_extra.values file_type=file_type full_table=True %}
- {% endwith %}
- {% endfor %}
- {% endif %}
- {% endwith %}
- {% with validation_errors=validation_errors_grouped.format error_prefix='format-' %}
- {% if validation_errors %}
-
-
-
Incorrect Formats
-
-
-
Some or all of your entries have incorrectly formatted data.
- {% include "cove_360/validation_table.html" %}
-
-
- {% for error_json, error_extra in validation_errors %}
- {% with error=error_json|json_decode %}
- {% cove_modal_errors className="validation-errors-"|concat:error_prefix|concat:forloop.counter modalTitle=error.message errorList=error_extra.values file_type=file_type full_table=True %}
- {% endwith %}
- {% endfor %}
- {% endif %}
- {% endwith %}
- {% if additional_closed_codelist_values %}
-
-
-
{% trans 'Codelist Errors' %}
-
-
-
-
Some or all of your entries do not use the 360Giving Data Standard codelists correctly.
-
{% blocktrans %}The fields below use closed codelists. When using these fields, you must use one of the pre-defined codelist values. If you use a value that is not on the relevant codelist, your data will not pass structural checks.{% endblocktrans %}
-
-
- {% with additional_codelist_values=additional_closed_codelist_values %}
-
{% include "additional_codelist_values.html" %}
- {% endwith %}
-
-
- {% endif %}
- {% endif %}
- {% with validation_errors=validation_errors_grouped.other error_prefix='other-' %}
- {% if validation_errors %}
-
-
-
Other
-
-
-
Other validation errors.
- {% include "cove_360/validation_table.html" %}
-
-
- {% for error_json, error_extra in validation_errors %}
- {% with error=error_json|json_decode %}
- {% cove_modal_errors className="validation-errors-"|concat:error_prefix|concat:forloop.counter modalTitle=error.message errorList=error_extra.values file_type=file_type full_table=True %}
- {% endwith %}
- {% endfor %}
- {% endif %}
- {% endwith %}
-
-
-
- {% endblock validation %}
-
-
- {% block quality_accuracy %}
- {% if quality_accuracy_checks_count %}
-
-
-
-
- {% trans "Data Quality Check: Incorrect values" %}
- {% blocktrans count n_quality_accuracy_checks=quality_accuracy_checks_count %}{{n_quality_accuracy_checks}} Incorrect value check{% plural %}{{n_quality_accuracy_checks}} Incorrect value checks{% endblocktrans %}
-
-
-
-
- {% if quality_accuracy_checks_errored %}
-
-
-
- {% blocktrans %}Quality checks failed due to an issue with the data. Fix some validation errors first.{% endblocktrans %}
-
-
-
- {% endif %}
- {% if quality_accuracy_checks %}
-
{% blocktrans %}These checks highlight areas where your data may be incorrect or need further attention.{% endblocktrans %}
-
-
- {% blocktrans %}
-
For each check we give feedback on the issue and what steps may be taken to resolve it.
-
Receiving this feedback does not mean the data is invalid, and it can be ignored when not relevant.
- {% endblocktrans %}
-
-
-
-
-
- {% trans 'Check Description' %}
- {% trans 'First 3 Locations' %}
-
-
-
- {% for message, json_location, spreadsheet_location in quality_accuracy_checks %}
-
-
- {{ message.heading }} {{ message.message }}
-
- {% if file_type == 'xlsx' or file_type == 'csv' %}
-
-
- {% for location in spreadsheet_location|slice:":3" %}
- Sheet: {{location.sheet}} Row: {{location.row_number}} {% if location.header %} Header: {{location.header}} {% endif %}
- {% endfor %}
- {% if spreadsheet_location|length > 3 %}
- see all
- {% endif %}
-
-
- {% else %}
-
-
- {% for location in json_location|slice:":3" %}
- {{location}}
- {% endfor %}
- {% if json_location|length > 3 %}
- see all
- {% endif %}
-
-
- {% endif %}
-
- {% endfor %}
-
-
- {% endif %}
-
- {% for message, json_location, spreadsheet_location in quality_accuracy_checks %}
- {% with msg=message.heading %}
- {% if file_type == 'json' %}
- {% cove_modal_errors className="quality_accuracy-checks-"|concat:forloop.counter modalTitle=msg errorList=json_location file_type=file_type full_table=False %}
- {% else %}
- {% cove_modal_errors className="quality_accuracy-checks-"|concat:forloop.counter modalTitle=msg errorList=spreadsheet_location file_type=file_type full_table=False %}
- {% endif %}
- {% endwith %}
- {% endfor %}
-
- {% endif %}
- {% endblock quality_accuracy %}
-
- {% block usefulness %}
- {% if usefulness_checks_count %}
-
-
-
-
- {% trans "Data Quality Check: Usefulness" %}
- {% blocktrans count n_usefulness_checks=usefulness_checks_count %} Usefulness checks{% plural %}{{n_usefulness_checks}} Usefulness checks{% endblocktrans %}
-
-
-
-
- {% if usefulness_checks_errored %}
-
-
-
- {% blocktrans %}Usefulness checks failed due to an issue with the data. Fix some validation errors first.{% endblocktrans %}
-
-
-
- {% endif %}
- {% if usefulness_checks %}
-
{% blocktrans %}These checks highlight ways the data could be made more useful.{% endblocktrans %}
-
-
- {% blocktrans %}
-
These are the key features that make the data useful for analysis, which we recommend including in 360Giving data whenever possible.
-
Receiving this feedback does not mean the data is invalid and it can be ignored when not relevant.
-
Visit our Data Quality Dashboard to see the data quality of 360Giving data as a whole and for each individual publisher. If you have already published data, you can view your own publisher page there too. It provides insights into the key features that make the data useful for analysis to help publishers to identify opportunities for their data to be improved.
-
- {% endblocktrans %}
-
-
-
-
-
- {% trans 'Check Description' %}
- {% trans 'First 3 Locations' %}
-
-
-
- {% for message, json_location, spreadsheet_location in usefulness_checks %}
-
-
- {{ message.heading }} {{ message.message }}
-
- {% if file_type == 'xlsx' or file_type == 'csv' %}
-
-
- {% for location in spreadsheet_location|slice:":3" %}
- Sheet: {{location.sheet}} Row: {{location.row_number}} {% if location.header %} Header: {{location.header}} {% endif %}
- {% endfor %}
- {% if spreadsheet_location|length > 3 %}
- see all
- {% endif %}
-
-
- {% else %}
-
-
- {% for location in json_location|slice:":3" %}
- {{location}}
- {% endfor %}
- {% if json_location|length > 3 %}
- see all
- {% endif %}
-
-
- {% endif %}
-
- {% endfor %}
-
-
- {% endif %}
-
- {% for message, json_location, spreadsheet_location in usefulness_checks %}
- {% with msg=message.heading %}
- {% if file_type == 'json' %}
- {% cove_modal_errors className="usefulness-checks-"|concat:forloop.counter modalTitle=msg errorList=json_location file_type=file_type full_table=False %}
- {% else %}
- {% cove_modal_errors className="usefulness-checks-"|concat:forloop.counter modalTitle=msg errorList=spreadsheet_location file_type=file_type full_table=False %}
- {% endif %}
- {% endwith %}
- {% endfor %}
-
- {% endif %}
- {% endblock usefulness %}
-
- {% block additional_fields %}
- {% if additional_fields_count %}
-
-
-
-
- {% trans "Additional Fields" %}
- {% blocktrans count n_additional_fields=additional_fields_count %} Additional fields{% plural %}{{n_additional_fields}} Additional fields{% endblocktrans %}
-
-
-
-
- {% if data_only %}
-
-
{% blocktrans %} Additional fields which do not use 360Giving Data Standard titles were found in your data.{% endblocktrans %}
-
{% blocktrans %} You are welcome to include additional fields in your data, however please check the field title(s) shown below to confirm if they are intended additions and not the result of spelling or formatting mistakes in the title. Please refer to the Common Errors section to see the correctly formatted field titles for the required fields. {% endblocktrans %}
- {% include "additional_fields_table.html" %}
- {% endif %}
-
- {% for message, json_location, spreadsheet_location in additional_checks %}
- {% with msg=message.heading %}
- {% if file_type == 'json' %}
- {% cove_modal_errors className="additional-checks-"|concat:forloop.counter modalTitle=msg errorList=json_location file_type=file_type full_table=False %}
- {% else %}
- {% cove_modal_errors className="additional-checks-"|concat:forloop.counter modalTitle=msg errorList=spreadsheet_location file_type=file_type full_table=False %}
- {% endif %}
- {% endwith %}
- {% endfor %}
-
- {% endif %}
- {% endblock additional_fields %}
-
- {% block review %}
-
-
-
- {% trans "Check your data" %} {% blocktrans count n_grants=grants_aggregates.count|default:0 %}{{n_grants}} Grant{% plural %}{{n_grants}} Grants{% endblocktrans %}
-
-
-
-
-
-
{% trans "Review your data." %}
-
- We recommend having a look over your data here. This table shows how the data looks after it has been converted.
- {% if conversion_warning_messages or validation_errors or additional_fields_count %}
- If anything seems unexpected this may be caused by any errors or warnings shown above.
- {% endif %}
-
-
{% trans "Click on the numbers below to see a list of unique identifiers." %}
-
-
-
-
-
-
-
- {% trans 'Grants Table' %}
-
-
-
-
-
-
- id
- title
- currency
- amountAwarded
- dateModified
-
-
-
- {% for grant in grants|slice:":5000" %}
-
- {{grant.id}}
- {{grant.title }}
- {{grant.currency}}
- {{grant.amountAwarded}}
- {{grant.dateModified}}
-
- {% endfor %}
-
-
-
-
-
-
-
-
-
- {% cove_modal_list className="unique-ids" modalTitle="Unique IDs" itemList=grants_aggregates.unique_ids %}
- {% cove_modal_list className="distinct-funding-org-identifier" modalTitle="Funder Organisation IDs" itemList=grants_aggregates.distinct_funding_org_identifier %}
- {% cove_modal_list className="distinct-recipient-org-identifier" modalTitle="Recipient Organisation IDs" itemList=grants_aggregates.distinct_recipient_org_identifier %}
- {% endblock review %}
-
- {% block download_and_share %}
-
-
-
- {% trans "Download data and share these results" %}
-
-
-
-
-
-
Share
-
{% trans "You can share these test results with others by using the following url:" %}
-
-
{{ current_url }}
-
{% trans "If your data is not suitable for sharing publicly, then you should treat this url with care. Only share it with people who have permission to access the data." %}
-
-
{% trans "After 7 days, the link will expire and the data will be deleted from our servers - so the results will no longer be available. You can revisit these results until then." %}
-
Download
-
{% trans "This application converts data in Excel and CSV format into JSON format, allowing you download the converted version." %}
-
{% trans "If your file is originally in JSON format select ‘Convert to Spreadsheet’ in the summary section to create an Excel version of the file." %}
- {% if not conversion_error and conversion != 'flattenable' %}
-
{% trans "We provide the following formats to download:" %}
-
- {% else %}
-
(No downloads available as the conversion hasn't happened, or has errored).
- {% endif %}
- {% if user.is_authenticated %}
-
-
Original file download for admin users
- Warning, this is the original file uploaded. Do not download if you don't trust whoever sent you a link to this page, it could contain a virus. Note that this box and this download link are only visible to admin users, not others you share this page with.
-
-
- {% endif %}
-
-
-
- {% endblock download_and_share %}
-
-{% endblock explore_content %}
-
-{% block extrafooterscript %}
- {{ block.super }}
-
-{% endblock extrafooterscript %}
-
-
-{% comment %}
-
-{% cove_modal_list className="duplicate-id-modal" modalTitle="Duplicate IDs" itemList=grants_aggregates.duplicate_ids %}
-{% cove_modal_list className="funding-org-identifier-prefixes" modalTitle="Funding Organisation ID Prefixes" itemList=grants_aggregates.funding_org_identifier_prefixes %}
-{% cove_modal_list className="funding-org-identifiers-unrecognised-prefixes" modalTitle="Unrecognised Funding Organisation ID Prefixes" itemList=grants_aggregates.funding_org_identifiers_unrecognised_prefixes %}
-{% cove_modal_list className="recipient-org-identifier-prefixes" modalTitle="Recipient Organisation ID Prefixes" itemList=grants_aggregates.recipient_org_identifier_prefixes %}
-{% cove_modal_list className="recipient-org-identifiers-unrecognised-prefixes" modalTitle="Unrecognised Recipient Organisation ID Prefixes" itemList=grants_aggregates.recipient_org_identifiers_unrecognised_prefixes %}
-
-
-
-
-
- {% for id in grants_aggregates.distinct_funding_org_identifier %}
- {{ id }}
- {% endfor %}
-
-
-
-
-
-{% endcomment %}
+{% endblock %}
\ No newline at end of file
diff --git a/cove/cove_360/templates/cove_360/explore_advanced.html b/cove/cove_360/templates/cove_360/explore_advanced.html
index 14fcd57..afc299c 100644
--- a/cove/cove_360/templates/cove_360/explore_advanced.html
+++ b/cove/cove_360/templates/cove_360/explore_advanced.html
@@ -139,11 +139,8 @@ Unrecognised Prefixes ({{grants_aggregates.recipient_org_identifiers_unrecog
-
-
-
-{% cove_modal_list className="duplicate-id-modal" modalTitle="Duplicate IDs" itemList=grants_aggregates.duplicate_ids %}
-{% cove_modal_list className="unique-ids" modalTitle="Unique IDs" itemList=grants_aggregates.unique_ids %}
+{% cove_360_modal_list className="duplicate-id-modal" modalTitle="Duplicate IDs" itemList=grants_aggregates.duplicate_ids %}
+{% cove_360_modal_list className="unique-ids" modalTitle="Unique IDs" itemList=grants_aggregates.unique_ids %}
{% endblock %}
diff --git a/cove/cove_360/templates/cove_360/footer.html b/cove/cove_360/templates/cove_360/footer.html
deleted file mode 100644
index 2b9cc90..0000000
--- a/cove/cove_360/templates/cove_360/footer.html
+++ /dev/null
@@ -1,89 +0,0 @@
-{% load i18n %}
-{% load static %}
-
-
diff --git a/cove/cove_360/templates/cove_360/home.html b/cove/cove_360/templates/cove_360/home.html
new file mode 100644
index 0000000..62228dd
--- /dev/null
+++ b/cove/cove_360/templates/cove_360/home.html
@@ -0,0 +1,65 @@
+{% extends 'base.html' %}
+{% block 'content' %}
+
+
+
{% blocktrans %}How to check your data{% endblocktrans %}
+ {% comment %}Translators: Paragraph that describes the application{% endcomment %}
+
{% blocktrans %}Upload, paste or provide a link to data using the 360Giving Data Standard format, and this application will check whether it is valid 360Giving data, and provide feedback so that you can check for errors and see ways to improve its quality.{% endblocktrans %}
+
{% blocktrans %}The tool will convert between JSON, Excel and CSV formats, allowing you to download the original file, and the converted versions.{% endblocktrans %}
+
{% blocktrans %}This tool will : {% endblocktrans %}
+
{% blocktrans %} Check your data is valid.{% endblocktrans %}
+
{% blocktrans %}The term ‘valid‘ means the data includes the 10 core fields and the information has all the correct data formatting that is required by 360Giving Data Standard. When it passes these checks, you will know that it is formatted for use alongside other valid 360Giving data and can be included in 360Giving tools, such as GrantNav and 360Insights .{% endblocktrans %}
+
{% blocktrans %}It will not : {% endblocktrans %}
+
{% blocktrans %} Check your data is accurate.{% endblocktrans %}
+
{% blocktrans %} Check the data against your own open data policy.{% endblocktrans %}
+
{% blocktrans %} This means there may be further checks you need to carry out to make sure the information is accurate, and that the data does not include information that is unsuitable for publishing as open data. Read more about what to consider when publishing open grants data. {% endblocktrans %}
+ {% if request.path == "/" %}
+
{% blocktrans %}Further guidance{% endblocktrans %}
+
{% blocktrans %}Read about common data errors and what causes them in the Common Errors section.{% endblocktrans %}
+
{% blocktrans %}To preview how this tool works, try loading some sample data. {% endblocktrans%}
+ {% endif %}
+
{% blocktrans %}Formats{% endblocktrans %}
+
{% blocktrans %}The application accepts data in the formats set out in the {% endblocktrans %}360Giving Data Standard guidance .
+
{% blocktrans %}Acceptable files are: {% endblocktrans %}
+
+ {% blocktrans %}Summary Spreadsheet - OpenDocument Spreadsheet, Excel , CSV (UTF-8, Windows-1252 and ISO-8859-1 encodings supported){% endblocktrans %}
+ {% blocktrans %}JSON built to the 360Giving JSON schema (UTF-8 encoding supported){% endblocktrans %}
+ {% blocktrans %}Multi-table data package - Excel {% endblocktrans %}
+
+
+
+
+
+
+
{% blocktrans %}How to submit your data{% endblocktrans %}
+
{% blocktrans %}
+ Once 360Giving data has been published by an organisation, the file must be added to the 360Giving Data Registry so that the data to appear in 360Giving’s tools such as GrantNav and 360Insights.
+ {% endblocktrans %}
+
+
{% blocktrans %}
+ Publishers of 360Giving data can add their valid 360Giving data files to the Data Registry using the 360Giving data file submission form.
+ {% endblocktrans %}
+
+
{% blocktrans %}The submission form allows users to:{% endblocktrans %}
+
+ Update an existing Data Registry entry with an updated version of an existing file
+ Add an entry for a new file to the Data Registry
+
+
Only publishers with an authorised website domain can use this submission process.
+
+
Authorised domains
+
By default, the website domain used by existing publishers to host their 360Giving data files will be authorised.
+
Organisations that publish 360Giving data for the first time can also use the 360Giving data file submission process once they have registered their website domain with 360Giving. To register to your website domain prior to publishing for the first time please contact 360Giving Helpdesk via support@threesixtygiving.org .
+
Publishers can opt out of authorising their website domain and using the 360Giving data file submission process on request.
+
Which domains are not authorised?
+
Data files published on multi-user hosting platforms like open data repositories, or file sharing services Google Sheets or Dropbox, cannot be authorised for use with the 360Giving data file submission process because the domain cannot be authorised as being unique to a particular organisation.
+
Files published in this way can be added to the 360Giving Data Registry by emailing 360Giving Helpdesk via support@threesixtygiving.org .
+
Further guidance
+
Read our full guidance on how to use the 360Giving data submission process .
+
+
+
+
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/cove/cove_360/templates/cove_360/input.html b/cove/cove_360/templates/cove_360/input.html
index be8bbd8..d8bbd60 100644
--- a/cove/cove_360/templates/cove_360/input.html
+++ b/cove/cove_360/templates/cove_360/input.html
@@ -1,139 +1,93 @@
{% extends request.current_app_base_template %}
-{% load bootstrap3 %}
{% load i18n %}
-{# For original input.html see lib-cove-web/cove/templates/input.html #}
+{% load bootstrap3 %} {# this is needed for lib-cove-web stuff #}
+{% block content %}
-{% block precontent %}
-
-
-
Check your data
-
Upload or provide a link to a file, or paste JSON to check and convert your data and get feedback on whether it is valid 360Giving data.
-
-
-{% endblock %}
+
+Check your data
+ Upload, provide a link to a file, or paste JSON to check and convert your data and get feedback on whether it is valid 360Giving data.
+To preview how this tool works, try loading some sample data .
+
-{% block content %}
- {% trans "Loading:" %}
-
+
-{% endblock %}
-{% block postcontent %}
-{% if DATA_SUBMISSION_ENABLED %}
-
-
-
Submit your data
-
Submit your 360Giving data file to the 360Giving Data Registry . Your file will also be checked to make sure you are submitting valid 360Giving data.
+{% if 'upload' in input_methods %}
+
+
-
+
+ {% trans 'Check Data' %}
+
+ {% endbuttons %}
+
+
+{% endif %}
-
-
+{% if 'url' in input_methods %}
+
+
+
+{% endif %}
+
+{% if 'text' in input_methods %}
+
+
{% endif %}
-{% endblock %}
-{% block extrafooterscript %}
-
-{% endblock %}
\ No newline at end of file
+{% endblock %}
diff --git a/cove/cove_360/templates/cove_360/modal_errors.html b/cove/cove_360/templates/cove_360/modal_errors.html
new file mode 100644
index 0000000..2113325
--- /dev/null
+++ b/cove/cove_360/templates/cove_360/modal_errors.html
@@ -0,0 +1,65 @@
+{% load i18n %}
+{% load cove_tags %}
+
+
+
+
+
+
{{ modalTitle }}
+
+ {% if validation_error_locations_length and errorList|length > validation_error_locations_length %}
+ {% if validation_error_locations_sample %}
+ {% blocktrans %}Showing a random {{validation_error_locations_length}} locations for this error.{% endblocktrans %}
+ {% else %}
+ {% blocktrans %}Showing the first {{validation_error_locations_length}} locations for this error.{% endblocktrans %}
+ {% endif %}
+ {% endif %}
+
+
+
+
+ {% if full_table %}
+ {% trans 'Value' %}
+ {% trans 'Location' %}
+ {% if file_type == 'xlsx' or file_type == 'csv' or file_type == 'ods' %}
+ {% trans 'Spreadsheet Location' %}
+ {% endif %}
+ {% else %}
+ {% if file_type == 'json' %}
+ {% trans 'Location' %}
+ {% else %}
+ {% trans 'Spreadsheet Location' %}
+ {% endif %}
+ {% endif %}
+
+
+
+ {% for item in errorList|take_or_sample:validation_error_locations_length %}
+
+ {% if full_table %}
+ "{{item.value}}"
+
+ {% if item.line %}
+ {% trans 'Path:' %} {{item.path}}
+ {% trans 'Line:' %} {{item.line}}
+ {% else %}
+ {{ item.path }}
+ {% endif %}
+
+ {% if file_type == 'xlsx' or file_type == 'csv' or file_type == 'ods' %}
+ {% trans "Sheet:" %} {{item.sheet}} {% trans "Row:" %} {{item.row_number}} {% if item.header %} {% trans "Header:" %} {{item.header}} {% endif %}
+ {% endif %}
+ {% else %}
+ {% if file_type == 'json' %}
+ {{item}}
+ {% else %}
+ {% trans "Sheet:" %} {{item.sheet}} {% trans "Row:" %} {{item.row_number}} {% if item.header %} {% trans "Header:" %} {{item.header}} {% endif %}
+ {% endif %}
+ {% endif %}
+
+ {% endfor %}
+
+
+
+
+
diff --git a/cove/cove_360/templates/cove_360/modal_list.html b/cove/cove_360/templates/cove_360/modal_list.html
new file mode 100644
index 0000000..3276218
--- /dev/null
+++ b/cove/cove_360/templates/cove_360/modal_list.html
@@ -0,0 +1,14 @@
+
+
+
+
+
+
{{ modalTitle }}
+
+ {% for id in itemList %}
+ {{ id }}
+ {% endfor %}
+
+
+
+
diff --git a/cove/cove_360/templates/cove_360/more_info.html b/cove/cove_360/templates/cove_360/more_info.html
index 6499417..4baac63 100644
--- a/cove/cove_360/templates/cove_360/more_info.html
+++ b/cove/cove_360/templates/cove_360/more_info.html
@@ -31,15 +31,3 @@
{% blocktrans %}More Information {% endblocktrans %}
-
diff --git a/cove/cove_360/templates/cove_360/page_header.html b/cove/cove_360/templates/cove_360/page_header.html
new file mode 100644
index 0000000..90da630
--- /dev/null
+++ b/cove/cove_360/templates/cove_360/page_header.html
@@ -0,0 +1,38 @@
+{% load i18n %}
+{% block page_header %}
+
+{% endblock %}
diff --git a/cove/cove_360/templates/cove_360/publisher_not_found.html b/cove/cove_360/templates/cove_360/publisher_not_found.html
index fe396f8..d07a0a1 100644
--- a/cove/cove_360/templates/cove_360/publisher_not_found.html
+++ b/cove/cove_360/templates/cove_360/publisher_not_found.html
@@ -1,30 +1,30 @@
-{% extends "explore.html" %}
+{% extends request.current_app_base_template %}
{% load i18n %}
-{% block content %}
-
-
-
- {% if data_status.can_publish %}
-
- {% endif %}
- {% trans "Submit your data" %}
-
-
-
{% blocktrans %}Sorry you aren't able to submit this file because the domain name of the website hosting your file ({{source_url_domain}}) is not authorised for publishing 360Giving data.{% endblocktrans %}
-
{% blocktrans %}Please email 360Giving helpdesk via support@threesixtygiving.org with the link to the file you want to submit to the Data Registry.{% endblocktrans %}
-
-
-
+ _paq.push(['trackEvent', 'Status', validation, source]);
+ _paq.push(['trackPageView']);
+ });
+
{% endblock %}
diff --git a/cove/cove_360/templates/cove_360/publishing.html b/cove/cove_360/templates/cove_360/publishing.html
new file mode 100644
index 0000000..09d0def
--- /dev/null
+++ b/cove/cove_360/templates/cove_360/publishing.html
@@ -0,0 +1,30 @@
+{% extends request.current_app_base_template %}
+
+{% block header_title %}360Giving Data Submission 11Tool{% endblock %}
+{% block hero_title %}Data Submission Tool{% endblock %}
+{% block hero_blurb %}Submit your 360Giving data file to be included in the 360Giving Data Registry and tools{% endblock %}
+
+{% block content %}
+
+{% if DATA_SUBMISSION_ENABLED %}
+
Submit your data
+
Submit your 360Giving data file to the 360Giving Data Registry . The file will be checked using the Data Quality Tool to check it is valid 360Giving data.
+
+
Read our guidance on how to submit your data .
+{% else %}
+
Data submission for publishing is not enabled on this instance of the Data Quality Tool.
+{% endif %}
+
+{% endblock %}
\ No newline at end of file
diff --git a/cove/cove_360/templates/cove_360/stats.html b/cove/cove_360/templates/cove_360/stats.html
new file mode 100644
index 0000000..b94c08e
--- /dev/null
+++ b/cove/cove_360/templates/cove_360/stats.html
@@ -0,0 +1,35 @@
+{% extends 'base.html' %}
+{% load i18n %}
+{% block content %}
+
{% trans "Usage stats" %}
+
+
+
+
+
+ {% trans "Upload" %}
+ {% trans "Link" %}
+ {% trans "Paste" %}
+ {% trans "Total" %}
+
+
+
+ {% for num_days, total, by_form in upload_by_time_by_form %}
+
+ {% blocktrans %}Last{% endblocktrans %} {{num_days}} {% blocktrans %}days{% endblocktrans %}
+ {{by_form.upload_form|default:"0"}}
+ {{by_form.url_form|default:"0"}}
+ {{by_form.text_form|default:"0"}}
+ {{total}}
+
+ {% endfor %}
+
+ {% trans "Ever" %}
+ {{total_by_form.upload_form|default:"0"}}
+ {{total_by_form.url_form|default:"0"}}
+ {{total_by_form.text_form|default:"0"}}
+ {{uploaded}}
+
+
+
+{% endblock content %}
diff --git a/cove/cove_360/templates/cove_360/terms.html b/cove/cove_360/templates/cove_360/terms.html
new file mode 100644
index 0000000..1e82bf6
--- /dev/null
+++ b/cove/cove_360/templates/cove_360/terms.html
@@ -0,0 +1,31 @@
+{% extends request.current_app_base_template %}
+{% load i18n %}
+{% block content %}
+ {% with app=request.current_app %}
+
+ {% comment %}
+ The content is split into many small templates.
+ This is so if one cove instance wants to change only one small bit of the page, they can do so by providing replacement templates of only the bit they want to change.
+ For example, a cove instance may want to keep most of the page the same but add legal content for another tracker.
+ {% endcomment %}
+
+ {% include "terms_conditions.html" %}
+
+ {% include "terms_cookies.html" %}
+
+ {% include "terms_privacy.html" %}
+
+ {% include "terms_trackers.html" %}
+
+ {% include "terms_data_uploaded.html" %}
+
+ {% include "terms_data_deleting.html" %}
+
+ {% include "terms_security.html" %}
+
+ {% include "terms_links.html" %}
+
+ {% include "terms_disclaimer.html" %}
+
+ {% endwith %}
+{% endblock %}
diff --git a/cove/cove_360/templates/cove_360/validation_table.html b/cove/cove_360/templates/cove_360/validation_table.html
index 0f8ef37..0367555 100644
--- a/cove/cove_360/templates/cove_360/validation_table.html
+++ b/cove/cove_360/templates/cove_360/validation_table.html
@@ -1,22 +1,25 @@
{% load i18n %}
{% load cove_tags %}
-
-
-
- {% trans 'Error Description' %}
- {% trans 'Error Count' %}
- {% trans 'First 3 Examples' %}
+
+
+
+ {% trans 'Passed' %}
+ {% trans 'Error Description' %}
+ {% trans 'Error Count' %}
+ {% trans 'First 3 Examples' %}
{% if file_type != 'xlsx' and file_type != 'csv' %}
- {% trans 'Location of first 3 errors' %}
+ {% trans 'Location of first 3 errors' %}
{% endif %}
-
+
{% for error_json, error_extra in validation_errors %}
{% with error=error_json|json_decode %}
+ close
+
{{ error | html_error_msg }}
{% if error.message_type in common_error_types %}
@@ -30,25 +33,27 @@
{{ error.schema_title }}
{% endif %}
-
+
+
+ {{error_extra.values|length}}
{% if error_extra.values|length > 3 %}
- {% if error_prefix %}
-
- {% else %}
-
- {% endif %}
- {{error_extra.values|length}}
-
- {% else %}
- {{error_extra.values|length}}
+ {% if error_prefix %}
+
+ {% else %}
+
+ {% endif %}
+ show all
+
{% endif %}
+
{% if error_extra.spreadsheet_style_errors_table %}
+
{% for sheet, table in error_extra.spreadsheet_style_errors_table.items %}
{% if sheet %}
Sheet: {{sheet}}
-
+
{% for row in table %}
{% with rowcounter=forloop.counter %}
@@ -57,9 +62,9 @@ {{ error.schema_title }}
{{cell}}
{% else %}
{% if cell.type == 'example' %}
- {{cell.value}}
+ "{{cell.value}}"
{% else %}
- {{cell.value}}
+ "{{cell.value}}"
{% endif %}
{% endif %}
{% endfor %}
@@ -73,9 +78,10 @@ {{ error.schema_title }}
{% else %}
{% with values=error_extra.values %}
+
{% for value in values|slice:":3" %}
- {{value.value}}
+ "{{value.value}}"
{% endfor %}
diff --git a/cove/cove_360/templatetags/cove_tags.py b/cove/cove_360/templatetags/cove_tags.py
index fb8bef9..65d4553 100644
--- a/cove/cove_360/templatetags/cove_tags.py
+++ b/cove/cove_360/templatetags/cove_tags.py
@@ -2,6 +2,7 @@
from cove.templatetags.cove_tags import register
from django.utils.html import mark_safe
from django.utils.translation import gettext_lazy as _
+from cove.templatetags.cove_tags import cove_modal_errors, cove_modal_list
@register.filter(name='html_error_msg')
@@ -23,3 +24,26 @@ def html_error_msg_360(error):
))
return html_error_msg(error)
+
+
+# wrap lib-cove-web implementation to provide our own template
+@register.inclusion_tag("cove_360/modal_errors.html")
+def cove_360_modal_errors(**context):
+ return cove_modal_errors(**context)
+
+
+# wrap lib-cove-web implementation to provide our own template
+@register.inclusion_tag("cove_360/modal_list.html")
+def cove_360_modal_list(**context):
+ return cove_modal_list(**context)
+
+
+@register.filter("multiply")
+def multiply(a, b):
+ """ Multiple a,b if result is less than one output 1 decimal place otherwise as a rounded int"""
+ res = a*b
+
+ if res < 1:
+ return f"{(a*b):.1f}"
+
+ return int(round(res))
diff --git a/cove/cove_360/tests_functional.py b/cove/cove_360/tests/test_browser.py
similarity index 55%
rename from cove/cove_360/tests_functional.py
rename to cove/cove_360/tests/test_browser.py
index 79ab707..c0f78aa 100644
--- a/cove/cove_360/tests_functional.py
+++ b/cove/cove_360/tests/test_browser.py
@@ -20,6 +20,8 @@
PREFIX_360 = os.environ.get('PREFIX_360', '/')
+settings.DISABLE_COOKIE_POPUP = True
+
# Ensure the correct version of chromedriver is installed
try:
chromedriver_autoinstaller.install()
@@ -36,7 +38,10 @@ def wait_for_results_page(browser):
@pytest.fixture(scope="module")
def browser(request):
- if BROWSER == 'ChromeHeadless':
+ if BROWSER == 'Chrome':
+ chrome_options = Options()
+ browser = webdriver.Chrome(chrome_options=chrome_options)
+ elif BROWSER == 'ChromeHeadless':
chrome_options = Options()
chrome_options.add_argument("--headless")
# uncomment this if "DevToolsActivePort" error
@@ -44,6 +49,7 @@ def browser(request):
browser = webdriver.Chrome(chrome_options=chrome_options)
else:
browser = getattr(webdriver, BROWSER)()
+
browser.implicitly_wait(3)
request.addfinalizer(lambda: browser.quit())
return browser
@@ -58,11 +64,11 @@ def server_url(request, live_server):
@pytest.mark.parametrize(('source_filename', 'expected_text', 'conversion_successful'), [
- ('fundingproviders-grants_fixed_2_grants.json', ['A file was downloaded from',
- 'There are 4 grants to 2 recipient organisations and 0 to recipient individuals',
+ ('fundingproviders-grants_fixed_2_grants.json', ['There are 4 grants to 2 recipient organisations and 0 to recipient individuals',
'The grants were awarded in GBP with a total value of £662,990 and individual awards ranging from £152,505 (lowest) to £178,990 (highest)',
'Convert to Spreadsheet',
- 'data does not use the 360Giving Data Standard correctly 15 Errors',
+ 'data does not use the 360Giving Data Standard correctly',
+ '15 Errors',
'your data is not yet using the 360Giving Data Standard',
'Incorrect Formats',
'Non-unique id values',
@@ -70,33 +76,34 @@ def server_url(request, live_server):
'Unique grant identifiers: 2',
'Unique funder organisation identifiers: 1',
'360G-fundingproviders-000002/X/00/X'], True),
- ('fundingproviders-grants_broken_grants.json', ['data does not use the 360Giving Data Standard correctly 15 Errors',
- 'Check your data 4 Grants',
+ ('fundingproviders-grants_broken_grants.json', ['data does not use the 360Giving Data Standard correctly',
+ '15 Errors',
'Unique funder organisation identifiers: 2',
'Unique recipient organisation identifiers: 2',
'360G-fundingproviders-000002/X/00/X'], True),
- ('fundingproviders-grants_2_grants.xlsx', ['Data about 1 funder',
+ ('fundingproviders-grants_2_grants.xlsx', ['1 funding organisation',
'There are 2 grants to 1 recipient organisation and 0 to recipient individuals',
'The grants were awarded in GBP with a total value of £331,495',
# check that there's no errors after the heading
'Data conversion successful\nBefore checking',
- 'data does not use the 360Giving Data Standard correctly 7 Errors',
+ 'data does not use the 360Giving Data Standard correctly',
+ '7 Errors',
'description is missing but required',
'Sheet: grants Row: 2',
- 'Check your data 2 Grants',
'Unique funder organisation identifiers: 1',
'Unique recipient organisation identifiers: 1',
'360G-fundingproviders-000002/X/00/X'], True),
# Test conversion warnings are shown
('tenders_releases_2_releases.xlsx', ['Data conversion unsuccessful - 5 Errors have been found',
- 'data does not use the 360Giving Data Standard correctly 76 Errors',
+ 'data does not use the 360Giving Data Standard correctly',
+ '76 Errors',
'You may have a duplicate Identifier: We couldn\'t merge these rows with the id "1": field "ocid" in sheet "items": one cell has the value: "PW-14-00627094", the other cell has the value: "PW-14-00629344"'
], True),
# Test that titles that aren't in the rollup are converted correctly
# (See @check_url_input_result_page).
('fundingproviders-grants_2_grants_titleswithoutrollup.xlsx', [], True),
# Test a 360 csv in cp1252 encoding
- ('fundingproviders-grants_2_grants_cp1252.csv', ['Data about 1 funder',
+ ('fundingproviders-grants_2_grants_cp1252.csv', ['1 funding organisation',
'There are 2 grants to 1 recipient organisation and 0 to recipient individuals',
'The grants were awarded in GBP with a total value of £331,495',
'This file is not \'utf-8\' encoded (it is cp1252 encoded)'], True),
@@ -189,13 +196,8 @@ def test_explore_360_url_input(server_url, browser, httpserver, source_filename,
with open(os.path.join('cove_360', 'fixtures', source_filename), 'rb') as fp:
httpserver.serve_content(fp.read())
- if 'CUSTOM_SERVER_URL' in os.environ:
- # Use urls pointing to GitHub if we have a custom (probably non local) server URL
- source_url = 'https://raw.githubusercontent.com/ThreeSixtyGiving/dataquality/main/cove/cove_360/fixtures/' + source_filename
- if authed:
- pytest.skip()
- else:
- source_url = httpserver.url + PREFIX_360 + source_filename
+
+ source_url = httpserver.url + PREFIX_360 + source_filename
if authed:
User = get_user_model()
@@ -203,38 +205,23 @@ def test_explore_360_url_input(server_url, browser, httpserver, source_filename,
force_login(user, browser, server_url)
browser.get(server_url)
- browser.find_element_by_class_name("cookie-consent-no").click()
- browser.find_element_by_partial_link_text('Link').click()
- time.sleep(0.5)
- browser.find_element_by_id('id_source_url').send_keys(source_url)
- browser.find_element_by_css_selector("#fetchURL > div.form-group > button.btn.btn-primary").click()
+
+ browser.find_element(By.ID, "link-tab-link").click()
+ browser.find_element(By.ID, "id_source_url").send_keys(source_url)
+ browser.find_element(By.ID, "submit-link-btn").click()
# Wait for the various redirects after click
wait_for_results_page(browser)
- data_url = browser.current_url
-
- # Click and un-collapse all explore sections
- all_sections = browser.find_elements_by_class_name('panel-heading')
- browser.find_element_by_class_name("cookie-consent-no").click()
- for section in all_sections:
- if section.get_attribute('data-toggle') == "collapse" and section.get_attribute('aria-expanded') != 'true':
- section.click()
- time.sleep(0.5)
+ # reload results page with ?open-all=true to see all values at once
+ browser.get(f"{browser.current_url}?open-all=true")
# Do the assertions
check_url_input_result_page(server_url, browser, httpserver, source_filename, expected_text, conversion_successful, authed)
- if conversion_successful:
- # Expand all sections with the expand all button this time
- browser.find_element_by_link_text('Expand all').click()
-
- browser.get(data_url + '/advanced')
- assert 'Advanced view' in browser.find_element_by_tag_name('body').text
-
def check_url_input_result_page(server_url, browser, httpserver, source_filename, expected_text, conversion_successful, authed):
- body_text = browser.find_element_by_tag_name('body').text
+ body_text = browser.find_element(By.TAG_NAME, 'body').text
body_text += browser.page_source
if isinstance(expected_text, str):
@@ -246,36 +233,30 @@ def check_url_input_result_page(server_url, browser, httpserver, source_filename
if source_filename == 'validation_errors-3.json':
assert 'UNSAFE' not in body_text
- assert 'Data Quality Tool' in browser.find_element_by_class_name('title360').text
- assert '360Giving' in browser.find_element_by_tag_name('body').text
-
if conversion_successful:
if source_filename.endswith('.json'):
if authed:
assert 'Original file (json)' in body_text
- original_file = browser.find_element_by_link_text('Original file (json)').get_attribute("href")
+ original_file = browser.find_element(By.LINK_TEXT, 'Original file (json)').get_attribute("href")
else:
assert 'Original file (json)' not in body_text
elif source_filename.endswith('.xlsx'):
if authed:
assert 'Original file (xlsx)' in body_text
- original_file = browser.find_element_by_link_text('Original file (xlsx)').get_attribute("href")
+ original_file = browser.find_element(By.LINK_TEXT, 'Original file (xlsx)').get_attribute("href")
else:
assert 'Original file (xlsx)' not in body_text
assert 'JSON (Converted from Original) ' in body_text
- converted_file = browser.find_element_by_link_text("JSON (Converted from Original)").get_attribute("href")
+ converted_file = browser.find_element(By.LINK_TEXT, "JSON (Converted from Original)").get_attribute("href")
assert "unflattened.json" in converted_file
elif source_filename.endswith('.csv'):
if authed:
assert 'Original file (csv)' in body_text
- original_file = browser.find_element_by_link_text('Original file (csv)').get_attribute("href")
+ original_file = browser.find_element(By.LINK_TEXT, 'Original file (csv)').get_attribute("href")
else:
assert 'Original file (csv)' not in body_text
- converted_file = browser.find_element_by_link_text("JSON (Converted from Original)").get_attribute("href")
- assert "unflattened.json" in browser.find_element_by_link_text("JSON (Converted from Original)").get_attribute("href")
-
- # Test for Load New File button
- assert 'Load New File' in body_text
+ converted_file = browser.find_element(By.LINK_TEXT, "JSON (Converted from Original)").get_attribute("href")
+ assert "unflattened.json" in browser.find_element(By.LINK_TEXT, "JSON (Converted from Original)").get_attribute("href")
if authed:
assert 'Note that this box and this download link are only visible to admin users' in body_text
@@ -310,10 +291,6 @@ def check_url_input_result_page(server_url, browser, httpserver, source_filename
])
@pytest.mark.parametrize('flatten_or_unflatten', ['flatten', 'unflatten'])
def test_flattentool_warnings(server_url, browser, httpserver, monkeypatch, warning_args, flatten_or_unflatten, iserror):
- # If we're testing a remove server then we can't run this test as we can't
- # set up the mocks
- if 'CUSTOM_SERVER_URL' in os.environ:
- pytest.skip()
if flatten_or_unflatten == 'flatten':
source_filename = 'example.json'
else:
@@ -345,18 +322,28 @@ def mockflatten(input_name, output_name, *args, **kwargs):
# flattentool behaviour with a mock below
httpserver.serve_content('{}')
source_url = httpserver.url + '/' + source_filename
- browser.get(server_url + '?source_url=' + source_url)
+
+ browser.get(server_url)
+
+ browser.find_element(By.ID, "link-tab-link").click()
+ browser.find_element(By.ID, "id_source_url").send_keys(source_url)
+ browser.find_element(By.ID, "submit-link-btn").click()
+
+ wait_for_results_page(browser)
+
+ # The file conversion stuff is in the summary section of the results
+ # (which is the default tab)
if source_filename.endswith('.json'):
- browser.find_element_by_name("flatten").click()
+ browser.find_element(By.NAME, "flatten").click()
- time.sleep(3)
+ time.sleep(2)
- assert 'Warning' not in browser.find_element_by_tag_name("body").text
+ assert 'Warning' not in browser.find_element(By.TAG_NAME, "body").text
warning_heading = "Data conversion unsuccessful - 1 Error has been found"
- conversion_title = browser.find_element_by_id('conversion-title')
+ conversion_title = browser.find_element(By.ID, "conversion-errors")
conversion_title_text = conversion_title.text
if iserror:
@@ -364,104 +351,12 @@ def mockflatten(input_name, output_name, *args, **kwargs):
assert warning_heading in conversion_title_text
else:
assert warning_heading in conversion_title_text
- # should be a cross
- assert conversion_title.find_element_by_class_name('font-tick').get_attribute('class') == 'font-tick cross'
- browser.find_element_by_class_name("cookie-consent-no").click()
- conversion_title.click()
- time.sleep(2)
- assert warning_args[0] in browser.find_element_by_id('conversion-body').text
+ assert warning_args[0] in browser.find_element(By.ID, "conversion-area").text
else:
if flatten_or_unflatten == 'flatten':
assert warning_heading not in conversion_title_text
else:
assert warning_heading not in conversion_title_text
- # should be a tick
- assert conversion_title.find_element_by_class_name('font-tick').get_attribute('class') == 'font-tick tick'
-
-
-@pytest.mark.parametrize(('link_text', 'url'), [
- ('360Giving', 'https://www.threesixtygiving.org/'),
- ('Publisher Guidance', 'https://standard.threesixtygiving.org/en/latest/'),
- ('Common Errors', 'common_errors'),
- ])
-def test_footer_360(server_url, browser, link_text, url):
- browser.get(server_url)
- link = browser.find_element_by_link_text(link_text)
- href = link.get_attribute("href")
- assert url in href
-
-
-def test_index_page_360(server_url, browser):
- browser.get(server_url)
- assert 'Data Quality Tool' in browser.find_element_by_class_name('title360').text
- assert 'How to check your data' in browser.find_element_by_tag_name('body').text
- assert 'Summary Spreadsheet - ' in browser.find_element_by_tag_name('body').text
- assert 'JSON built to the 360Giving JSON schema' in browser.find_element_by_tag_name('body').text
- assert 'Multi-table data package - Excel' in browser.find_element_by_tag_name('body').text
- assert '360Giving' in browser.find_element_by_tag_name('body').text
-
-
-@pytest.mark.parametrize(('link_text', 'url'), [
- ('360Giving Data Standard guidance', 'https://standard.threesixtygiving.org/en/latest/technical/reference/#reference'),
- ('Excel', 'https://threesixtygiving-standard.readthedocs.io/en/latest/_static/summary-table/360-giving-schema-titles.xlsx'),
- ('CSV', 'https://standard.threesixtygiving.org/en/latest/technical/templates-csv/'),
- ('360Giving JSON schema', 'https://standard.threesixtygiving.org/en/latest/reference/#giving-json-schemas'),
- ('Multi-table data package - Excel', 'https://threesixtygiving-standard.readthedocs.io/en/latest/_static/multi-table/360-giving-schema-fields.xlsx')
- ])
-def test_index_page_360_links(server_url, browser, link_text, url):
- browser.get(server_url)
- link = browser.find_element_by_link_text(link_text)
- href = link.get_attribute("href")
- assert url in href
-
-
-def test_common_index_elements(server_url, browser):
- browser.get(server_url)
- browser.find_element_by_css_selector('#more-information .panel-title').click()
- time.sleep(0.5)
- assert 'What happens to the data I provide to this site?' in browser.find_element_by_tag_name('body').text
- assert 'Why do you delete data after seven days?' in browser.find_element_by_tag_name('body').text
- assert 'Why provide converted versions?' in browser.find_element_by_tag_name('body').text
- assert 'Terms & Conditions' in browser.find_element_by_tag_name('body').text
- assert '360Giving' in browser.find_element_by_tag_name('body').text
-
-
-def test_terms_page(server_url, browser):
- browser.get(server_url + 'terms/')
- assert 'Open Data Services Co-operative Limited' in browser.find_element_by_tag_name('body').text
- assert 'Open Data Services Limited' not in browser.find_element_by_tag_name('body').text
- assert '360Giving' in browser.find_element_by_tag_name('body').text
-
-
-def test_accordion(server_url, browser):
- browser.get(server_url)
-
- def buttons():
- return [b.is_displayed() for b in browser.find_elements(By.CSS_SELECTOR, "#accordion button")]
-
- time.sleep(0.5)
- assert buttons() == [True, False, False]
- assert 'Upload a file' in browser.find_elements_by_tag_name('label')[0].text
- browser.find_element_by_class_name("cookie-consent-no").click()
- browser.find_element_by_partial_link_text('Link').click()
- browser.implicitly_wait(1)
- time.sleep(0.5)
- assert buttons() == [False, True, False]
- browser.find_element_by_partial_link_text('Paste').click()
- time.sleep(0.5)
- assert buttons() == [False, False, True]
- assert 'Paste (JSON only)' in browser.find_elements_by_tag_name('label')[2].text
-
- # Now test that the whole banner is clickable
- browser.find_element_by_id('headingOne').click()
- time.sleep(0.5)
- assert buttons() == [True, False, False]
- browser.find_element_by_id('headingTwo').click()
- time.sleep(0.5)
- assert buttons() == [False, True, False]
- browser.find_element_by_id('headingThree').click()
- time.sleep(0.5)
- assert buttons() == [False, False, True]
@pytest.mark.parametrize(('source_filename'), [
@@ -470,85 +365,44 @@ def buttons():
def test_error_modal(server_url, browser, httpserver, source_filename):
with open(os.path.join('cove_360', 'fixtures', source_filename), 'rb') as fp:
httpserver.serve_content(fp.read())
- if 'CUSTOM_SERVER_URL' in os.environ:
- # Use urls pointing to GitHub if we have a custom (probably non local) server URL
- source_url = 'https://raw.githubusercontent.com/ThreeSixtyGiving/dataquality/main/cove/cove_360/fixtures/' + source_filename
- else:
- source_url = httpserver.url + '/' + source_filename
+
+ source_url = httpserver.url + '/' + source_filename
browser.get(server_url)
- browser.find_element_by_class_name("cookie-consent-no").click()
- browser.find_element_by_partial_link_text('Link').click()
- time.sleep(0.5)
- browser.find_element_by_id('id_source_url').send_keys(source_url)
- browser.find_element_by_css_selector("#fetchURL > div.form-group > button.btn.btn-primary").click()
-
- time.sleep(1)
-
- # Click and un-collapse all explore sections
- all_sections = browser.find_elements_by_class_name('panel-heading')
- browser.find_element_by_class_name("cookie-consent-no").click()
- for section in all_sections:
- if section.get_attribute('data-toggle') == "collapse" and section.get_attribute('aria-expanded') != 'true':
- section.click()
- time.sleep(0.5)
- table_rows = browser.find_elements_by_css_selector('.validation-errors-format-1 tbody tr')
+ browser.find_element(By.ID, "link-tab-link").click()
+ browser.find_element(By.ID, "id_source_url").send_keys(source_url)
+ browser.find_element(By.ID, "submit-link-btn").click()
+
+ wait_for_results_page(browser)
+
+ # reload results page with ?open-all=true to see all values at once
+ browser.get(f"{browser.current_url}?open-all=true")
+
+ table_rows = browser.find_elements(By.CSS_SELECTOR, ".validation-errors-format-1 tbody tr")
assert len(table_rows) == 4
- browser.find_element_by_css_selector('a[data-target=".validation-errors-format-2"]').click()
+ browser.find_element(By.CSS_SELECTOR, "button[data-target-class=\"validation-errors-format-2\"]").click()
- modal = browser.find_element_by_css_selector('.validation-errors-format-2')
- assert "in" in modal.get_attribute("class").split()
+ modal = browser.find_element(By.CSS_SELECTOR, '.validation-errors-format-2')
+ assert "modal--shown" in modal.get_attribute("class").split()
modal_text = modal.text
assert "24/07/2014" in modal_text
assert "grants/0/awardDate" in modal_text
- browser.find_element_by_css_selector('div.modal.validation-errors-format-2 button.close').click()
- browser.find_element_by_css_selector('a[data-target=".usefulness-checks-2"]').click()
+ browser.find_element(By.CSS_SELECTOR, ".validation-errors-format-2 .modal__close").click()
+
+ browser.find_element(By.CSS_SELECTOR, "button[data-target-class=\"usefulness-checks-2\"]").click()
- modal_additional_checks = browser.find_element_by_css_selector('.usefulness-checks-2')
- assert "in" in modal_additional_checks.get_attribute("class").split()
+ modal_additional_checks = browser.find_element(By.CLASS_NAME, "usefulness-checks-2")
+ assert "modal--shown" in modal_additional_checks.get_attribute("class").split()
modal_additional_checks_text = modal_additional_checks.text
assert "4 recipient organisation grants do not have recipient organisation location information" in modal_additional_checks_text
assert "grants/0/recipientOrganization/0/id" in modal_additional_checks_text
- table_rows = browser.find_elements_by_css_selector('.usefulness-checks-2 tbody tr')
+ table_rows = browser.find_elements(By.CSS_SELECTOR, ".usefulness-checks-2 tbody tr")
assert len(table_rows) == 4
-@pytest.mark.parametrize(('source_filename', 'expected_text'), [
- ('fundingproviders-grants_fixed_2_grants.json', '360Giving JSON Package Schema')
- ])
-def test_check_schema_link_on_result_page(server_url, browser, httpserver, source_filename, expected_text):
- with open(os.path.join('cove_360', 'fixtures', source_filename), 'rb') as fp:
- httpserver.serve_content(fp.read())
- if 'CUSTOM_SERVER_URL' in os.environ:
- # Use urls pointing to GitHub if we have a custom (probably non local) server URL
- source_url = 'https://raw.githubusercontent.com/ThreeSixtyGiving/dataquality/main/cove/cove_360/fixtures/' + source_filename
- else:
- source_url = httpserver.url + '/' + source_filename
-
- browser.get(server_url)
- browser.find_element_by_class_name("cookie-consent-no").click()
- browser.find_element_by_partial_link_text('Link').click()
- time.sleep(0.5)
- browser.find_element_by_id('id_source_url').send_keys(source_url)
- browser.find_element_by_css_selector("#fetchURL > div.form-group > button.btn.btn-primary").click()
-
- time.sleep(1)
-
- # Click and un-collapse all explore sections
- all_sections = browser.find_elements_by_class_name('panel-heading')
- browser.find_element_by_class_name("cookie-consent-no").click()
- for section in all_sections:
- if section.get_attribute('data-toggle') == "collapse" and section.get_attribute('aria-expanded') != 'true':
- section.click()
- time.sleep(0.5)
- schema_link = browser.find_element_by_link_text(expected_text)
- schema_link.click()
- browser.find_element_by_id('giving-json-schemas')
-
-
@pytest.mark.parametrize(('data_url'), [
reverse_lazy('results', args=['0']),
reverse_lazy('results', args=['324ea8eb-f080-43ce-a8c1-9f47b28162f3']),
@@ -557,81 +411,52 @@ def test_url_invalid_dataset_request(server_url, browser, data_url):
# Test a badly formed hexadecimal UUID string
# Trim the / off reverse_lazy result as server_url has trailing slash to avoid
# e.g. //results/0
+
browser.get("%s%s" % (server_url, data_url[1:]))
- assert "We don't seem to be able to find the data you requested." in browser.find_element_by_tag_name('body').text
+ assert "We don't seem to be able to find the data you requested." in browser.find_element(By.TAG_NAME, 'body').text
# Test for well formed UUID that doesn't identify any dataset that exists
browser.get("%s%s" % (server_url, reverse_lazy('results', args=['38e267ce-d395-46ba-acbf-2540cdd0c810'])[1:]))
- assert "We don't seem to be able to find the data you requested." in browser.find_element_by_tag_name('body').text
- assert '360Giving' in browser.find_element_by_tag_name('body').text
- #363 - Tests there is padding round the 'go to home' button
- success_button = browser.find_element_by_class_name('success-button')
- assert success_button.value_of_css_property('padding-bottom') == '20px'
+ assert "We don't seem to be able to find the data you requested." in browser.find_element(By.TAG_NAME, 'body').text
+ assert '360Giving' in browser.find_element(By.TAG_NAME, 'body').text
def test_500_error(server_url, browser):
browser.get(server_url + 'test/500')
# Check that our nice error message is there
- assert 'Something went wrong' in browser.find_element_by_tag_name('body').text
- # Check for the exclamation icon
- # This helps to check that the theme including the css has been loaded
- # properly
- icon_span = browser.find_element_by_class_name('panel-danger').find_element_by_tag_name('span')
- assert 'Glyphicons Halflings' in icon_span.value_of_css_property('font-family')
- assert icon_span.value_of_css_property('color') == 'rgba(255, 255, 255, 1)'
+ assert 'Something went wrong' in browser.find_element(By.TAG_NAME, 'body').text
def test_common_errors_page(server_url, browser):
browser.get(server_url + 'common_errors/')
- assert "Common Errors" in browser.find_element_by_tag_name('h2').text
- assert '360Giving' in browser.find_element_by_tag_name('h1').text
-
-
-@pytest.mark.parametrize(('anchor_text'), [
- ('uri'),
- ('date-time'),
- ('required'),
- ('enum'),
- ('string'),
- ('number')
- ])
-def test_common_errors_page_anchors(server_url, browser, anchor_text):
- # Checks we have sections for each our error messages
- browser.get(server_url + 'common_errors/')
- browser.find_element_by_id(anchor_text)
+ assert "Common Errors" in browser.find_element(By.TAG_NAME, 'body').text
+ assert '360Giving' in browser.find_element(By.TAG_NAME, 'body').text
def test_favicon(server_url, browser):
browser.get(server_url)
# we should not have a favicon link just now
with pytest.raises(NoSuchElementException):
- browser.find_element_by_xpath("//link[@rel='icon']")
+ browser.find_element(By.XPATH, "//link[@rel='icon']")
def test_explore_360_sample_data_link(server_url, browser):
browser.get(server_url)
- browser.find_element_by_id("load-sample-data-btn").click()
+ browser.find_element(By.ID, "load-sample-data-btn").click()
wait_for_results_page(browser)
- body_text = browser.find_element_by_tag_name('body').text
+ body_text = browser.find_element(By.TAG_NAME, 'body').text
- assert 'Summary: Your data at a glance' in body_text
- assert 'Sorry, we can\'t process that data' not in body_text
- # Show sample data link in the home page only
- with pytest.raises(NoSuchElementException):
- browser.find_element_by_id("load-sample-data-btn")
+ assert "This data uses the 360Giving Data Standard correctly" in body_text
def test_publishing_invalid_domain(server_url, browser):
settings.DATA_SUBMISSION_ENABLED = True
os.environ["REGISTRY_PUBLISHERS_URL"] = "https://raw.githubusercontent.com/ThreeSixtyGiving/dataquality/main/cove/cove_360/fixtures/publishers.json"
- browser.get(server_url)
+ browser.get(f"{server_url}/publishing")
- # Dismiss the cookie popup
- browser.find_element_by_class_name("cookie-consent-no").click()
-
- url_input = browser.find_element(By.CSS_SELECTOR, "#self-publishing-form input[type='url']")
+ url_input = browser.find_element(By.ID, "source-url-input")
url_input.send_keys("https://raw.githubusercontent.com/OpenDataServices/grantnav-sampledata/master/grantnav-20180903134856.json")
browser.find_element(By.ID, "submit-for-publishing-btn").click()
@@ -647,32 +472,24 @@ def test_codelist_validation(server_url, browser, httpserver):
with open(os.path.join('cove_360', 'fixtures', source_filename), 'rb') as fp:
httpserver.serve_content(fp.read())
- if 'CUSTOM_SERVER_URL' in os.environ:
- # Use urls pointing to GitHub if we have a custom (probably non local) server URL
- source_url = 'https://raw.githubusercontent.com/ThreeSixtyGiving/dataquality/main/cove/cove_360/fixtures/' + source_filename
- else:
- source_url = httpserver.url + '/' + source_filename
+
+ source_url = httpserver.url + '/' + source_filename
browser.get(server_url)
- browser.find_element_by_class_name("cookie-consent-no").click()
- browser.find_element_by_partial_link_text('Link').click()
- time.sleep(0.5)
- browser.find_element_by_id('id_source_url').send_keys(source_url)
- browser.find_element_by_css_selector("#fetchURL > div.form-group > button.btn.btn-primary").click()
- time.sleep(1)
+ browser.find_element(By.ID, "link-tab-link").click()
+ browser.find_element(By.ID, "id_source_url").send_keys(source_url)
+ browser.find_element(By.ID, "submit-link-btn").click()
- browser.find_element_by_class_name("cookie-consent-no").click()
- time.sleep(0.5)
+ wait_for_results_page(browser)
+ # reload results page with ?open-all=true to see all values at once
+ browser.get(f"{browser.current_url}?open-all=true")
- # Click and un-collapse validation section
- browser.find_element_by_id('validation-panel-heading').click()
- time.sleep(0.5)
+ body_text = browser.find_element(By.TAG_NAME, "body").text
- validation_body_text = browser.find_element_by_id('validation-body').text
- assert "Codelist Errors" in validation_body_text
- assert "BAD" in validation_body_text
- assert "FRG010" not in validation_body_text
+ assert "Codelist Errors" in body_text
+ assert "BAD" in body_text
+ assert "FRG010" not in body_text
def test_oneof_validation(server_url, browser, httpserver):
@@ -680,32 +497,22 @@ def test_oneof_validation(server_url, browser, httpserver):
with open(os.path.join('cove_360', 'fixtures', source_filename), 'rb') as fp:
httpserver.serve_content(fp.read())
- if 'CUSTOM_SERVER_URL' in os.environ:
- # Use urls pointing to GitHub if we have a custom (probably non local) server URL
- source_url = 'https://raw.githubusercontent.com/ThreeSixtyGiving/dataquality/main/cove/cove_360/fixtures/' + source_filename
- else:
- source_url = httpserver.url + '/' + source_filename
+
+ source_url = httpserver.url + '/' + source_filename
browser.get(server_url)
- browser.find_element_by_class_name("cookie-consent-no").click()
- browser.find_element_by_partial_link_text('Link').click()
- time.sleep(0.5)
- browser.find_element_by_id('id_source_url').send_keys(source_url)
- browser.find_element_by_css_selector("#fetchURL > div.form-group > button.btn.btn-primary").click()
- time.sleep(1)
+ browser.find_element(By.ID, "link-tab-link").click()
+ browser.find_element(By.ID, "id_source_url").send_keys(source_url)
+ browser.find_element(By.ID, "submit-link-btn").click()
- browser.find_element_by_class_name("cookie-consent-no").click()
- time.sleep(0.5)
+ wait_for_results_page(browser)
+ # reload results page with ?open-all=true to see all values at once
+ browser.get(f"{browser.current_url}?open-all=true")
- # Click and un-collapse validation section
- browser.find_element_by_id('validation-panel-heading').click()
- time.sleep(0.5)
+ body_text = browser.find_element(By.TAG_NAME, "body").text
- validation_body_text = browser.find_element_by_id('validation-body').text
- assert "Only 1 of recipientOrganization or recipientIndividual is permitted, but both are present" in validation_body_text
- validation_body_html = browser.find_element_by_id("validation-body").get_attribute("innerHTML")
- assert "Only 1 of recipientOrganization
or recipientIndividual
is permitted, but both are present" in validation_body_html
+ assert "Only 1 of recipientOrganization or recipientIndividual is permitted, but both are present" in body_text
@pytest.mark.parametrize(('source_filename', 'expected_texts', 'unexpected_texts'), [
@@ -731,46 +538,43 @@ def test_oneof_validation(server_url, browser, httpserver):
"Sheet: grants Row: 3 Header: Beneficiary Location:Geographic Code",
"Sheet: grants Row: 4 Header: Beneficiary Location:Geographic Code",
], []),
+ ("duration_usefulness.json", [
+ "1 grant does not contain plannedDates/0/duration or (plannedDates/startDate and plannedDates/endDate)",
+ ], []),
+ ("additional_fields.json", [
+ "Additional fields which do not use 360Giving Data Standard titles were found in your data.",
+ ], []),
+ ("multiple_fundiner_names_org_ids.json", [
+ "introduced an additional name for an existing Funding Org"
+ ], []),
])
def test_quality_checks(server_url, browser, httpserver, source_filename, expected_texts, unexpected_texts):
with open(os.path.join('cove_360', 'fixtures', source_filename), 'rb') as fp:
httpserver.serve_content(fp.read())
- if 'CUSTOM_SERVER_URL' in os.environ:
- # Use urls pointing to GitHub if we have a custom (probably non local) server URL
- source_url = 'https://raw.githubusercontent.com/ThreeSixtyGiving/dataquality/main/cove/cove_360/fixtures/' + source_filename
- else:
- source_url = httpserver.url + '/' + source_filename
+
+ source_url = httpserver.url + '/' + source_filename
browser.get(server_url)
- browser.find_element_by_class_name("cookie-consent-no").click()
- browser.find_element_by_partial_link_text('Link').click()
- time.sleep(0.5)
- browser.find_element_by_id('id_source_url').send_keys(source_url)
- browser.find_element_by_css_selector("#fetchURL > div.form-group > button.btn.btn-primary").click()
- time.sleep(1)
+ browser.find_element(By.ID, "link-tab-link").click()
+ browser.find_element(By.ID, "id_source_url").send_keys(source_url)
+ browser.find_element(By.ID, "submit-link-btn").click()
- browser.find_element_by_class_name("cookie-consent-no").click()
- time.sleep(0.5)
+ wait_for_results_page(browser)
- try:
- # Click and un-collapse quality accuracy section
- browser.find_element_by_id('quality-accuracy-panel-heading').click()
- time.sleep(0.5)
+ # reload results page with ?open-all=true to see all values at once
+ browser.get(f"{browser.current_url}?open-all=true")
- quality_accuracy_body_text = browser.find_element_by_id('quality-accuracy-body').text
- except NoSuchElementException:
- quality_accuracy_body_text = ""
+ body_text = browser.find_element(By.TAG_NAME, 'body').text
for expected_text in expected_texts:
- assert expected_text in quality_accuracy_body_text, f"Expected: '{expected_text}'\nGot: '{quality_accuracy_body_text}'"
+ assert expected_text in body_text, f"Expected: '{expected_text}'\nGot: '{body_text}'"
for unexpected_text in unexpected_texts:
- assert unexpected_text not in quality_accuracy_body_text
+ assert unexpected_text not in body_text
def test_file_submission(server_url, browser, httpserver):
# This code doesn't work reliably on github actions. Leaving here for future refactoring efforts
- return
"""
Test the file submission process works to the point of getting to the "submit"
into the sales force form
@@ -785,23 +589,35 @@ def test_file_submission(server_url, browser, httpserver):
Hint: Skip this test via pytest -k "not test_file_submission" if file
submission credentials aren't available.
"""
+ settings.DATA_SUBMISSION_ENABLED = True
- browser.get(server_url)
- browser.find_element_by_class_name("cookie-consent-no").click()
+ source_filename = "publishers.json"
+ # Create a publishers registry entry
+ with open(os.path.join('cove_360', 'fixtures', source_filename), 'rb') as fp:
+ httpserver.serve_content(fp.read())
+
+ os.environ["REGISTRY_PUBLISHERS_URL"] = f"{httpserver.url}/{source_filename}"
+
+ browser.get(f"{server_url}/publishing/")
valid_for_publishing = "https://www.threesixtygiving.org/wp-content/uploads/love-kingston-funding-data-2018.xlsx"
- browser.find_element_by_id("source-url-input").send_keys(valid_for_publishing)
- browser.find_element_by_id("submit-for-publishing-btn").click()
+ url_input = browser.find_element(By.ID, "source-url-input")
+ url_input.send_keys(valid_for_publishing)
- time.sleep(2)
+ browser.find_element(By.ID, "submit-for-publishing-btn").click()
- # Await for the validation checks to finish for a max of 30s
- count = 0
- while "results" not in browser.current_url and count < 30:
- time.sleep(1)
- count = count + 1
+ wait_for_results_page(browser)
- body_text = browser.find_element_by_tag_name("body").text
+ body_text = browser.find_element(By.TAG_NAME, "body").text
assert "The data was checked and can now be submitted to the 360Giving Data Registry." in body_text, f"Expected '...can now be submitted' in {body_text}"
+
+
+def test_cookie_popup(server_url, browser, httpserver):
+ """ Test that re-enabling the cookie popup does what we expect by including the cookie template """
+ settings.DISABLE_COOKIE_POPUP = False
+
+ browser.get(server_url)
+
+ assert "Allow analytics" in browser.find_element(By.ID, "cookie-dialog-title").text
diff --git a/cove/cove_360/test_hypothesis.py b/cove/cove_360/tests/test_hypothesis.py
similarity index 100%
rename from cove/cove_360/test_hypothesis.py
rename to cove/cove_360/tests/test_hypothesis.py
diff --git a/cove/cove_360/test_input.py b/cove/cove_360/tests/test_input.py
similarity index 100%
rename from cove/cove_360/test_input.py
rename to cove/cove_360/tests/test_input.py
diff --git a/cove/cove_360/tests.py b/cove/cove_360/tests/tests.py
similarity index 100%
rename from cove/cove_360/tests.py
rename to cove/cove_360/tests/tests.py
diff --git a/cove/cove_360/views.py b/cove/cove_360/views.py
index 25c13b3..7ac3462 100644
--- a/cove/cove_360/views.py
+++ b/cove/cove_360/views.py
@@ -61,6 +61,23 @@ def explore_360(request, pk, template='cove_360/explore.html'):
cached_context = cache.get(pk)
if cached_context and not request.POST.get("flatten"):
+
+ if request.GET.get("new-mode"):
+ try:
+ db_data = SuppliedData.objects.get(pk=pk)
+ data_params = json.loads(db_data.parameters)
+ del data_params["self_publishing"]
+ db_data.parameters = json.dumps(data_params)
+ db_data.save()
+ data_status, dsc = SuppliedDataStatus.objects.get_or_create(
+ supplied_data=db_data,
+ )
+ cached_context["data_status"] = data_status
+ cache.set(pk, cached_context)
+
+ except KeyError:
+ pass
+
print("Cache hit")
return render(request, template, cached_context)
@@ -82,6 +99,7 @@ def explore_360(request, pk, template='cove_360/explore.html'):
# bail out early so user doesn't have to wait for validation to complete
return render(request, "cove_360/publisher_not_found.html", context)
data_status._publisher = json.dumps(publisher)
+ context["submission_tool"] = True
context["publisher"] = publisher
lib_cove_config = LibCoveConfig()
@@ -163,11 +181,7 @@ def explore_360(request, pk, template='cove_360/explore.html'):
re.sub(r'([A-Z])', r'-\1', codelist_info['codelist'].split('.')[0]).lower()
)
- # Experimental to test performance impacts
- # Note False will currently leave the grants table in the UI empty
- do_grants_display = True
-
- if do_grants_display and hasattr(json_data, 'get') and hasattr(json_data.get('grants'), '__iter__'):
+ if settings.GRANTS_TABLE and hasattr(json_data, 'get') and hasattr(json_data.get('grants'), '__iter__'):
context['grants'] = json_data['grants']
context['metadata'] = {}
@@ -179,6 +193,7 @@ def explore_360(request, pk, template='cove_360/explore.html'):
else:
context['grants'] = []
context['metadata'] = {}
+ context["json_data"] = {}
context['first_render'] = not db_data.rendered
if not db_data.rendered:
@@ -189,11 +204,53 @@ def explore_360(request, pk, template='cove_360/explore.html'):
data_status.passed = context['validation_errors_count'] == 0
data_status.save()
- cache.set(pk, context)
+ import pprint
+ pprint.pprint(context, stream=open("/tmp/dqt.py", "w"), indent=2)
+ try:
+ context["usefulness_categories"] = set([message["category"] for message, a, b in context["usefulness_checks"]])
+ except TypeError:
+ # if no usefulness_checks the iteration will fail
+ context["usefulness_categories"] = []
+
+ try:
+ context["quality_accuracy_categories"] = set([message["category"] for message, a, b in context["quality_accuracy_checks"]])
+ except TypeError:
+ # if no quality quality_accuracy categories the iteration will fail
+ context["quality_accuracy_categories"] = []
+
+ try:
+ context["quality_accuracy_checks_passed"] = create_passed_tests_context_data(context["quality_accuracy_checks"], TEST_CLASSES["quality_accuracy"])
+ except Exception:
+ context["quality_accuracy_errored"] = True
+
+ try:
+ context["usefulness_checks_passed"] = create_passed_tests_context_data(context["usefulness_checks"], TEST_CLASSES["usefulness"])
+ except Exception:
+ context["usefulness_errored"] = True
+
+ cache.set(pk, context)
return render(request, template, context)
+def create_passed_tests_context_data(failed_tests, available_tests):
+ """ Creates a list of test that have passed """
+
+ passed_tests_names = [test[0]["type"] for test in failed_tests]
+ passed_test_case_headings = []
+
+ for test in available_tests:
+ if test.__name__ in passed_tests_names:
+ continue
+ # We instantiate the test with no data to be able to utilise the heading formatting code
+ # TODO this may no longer be needed
+ # passed_test_case = test(grants=[], aggregates={"count": 0, "recipient_individuals_count": 0})
+ # passed_test_case_headings.append(mark_safe(passed_test_case.format_heading_count(test.check_text["heading"])))
+ passed_test_case_headings.append(test.__name__)
+
+ return passed_test_case_headings
+
+
def common_errors(request):
return render(request, 'cove_360/common_errors.html')
diff --git a/cove/cove_project/settings.py b/cove/cove_project/settings.py
index a477fe1..bf5d982 100644
--- a/cove/cove_project/settings.py
+++ b/cove/cove_project/settings.py
@@ -127,3 +127,12 @@
if "true" in os.environ.get("DATA_SUBMISSION_ENABLED", "").lower():
DATA_SUBMISSION_ENABLED = True
+
+DISABLE_COOKIE_POPUP = False
+
+if "true" in os.environ.get("DISABLE_COOKIE_POPUP", "").lower():
+ DISABLE_COOKIE_POPUP = True
+
+# If enabled the grants data can be used in a template to create a browsable
+# table of grants.
+GRANTS_TABLE = False
diff --git a/cove/cove_project/urls.py b/cove/cove_project/urls.py
index 6870092..3922e4d 100644
--- a/cove/cove_project/urls.py
+++ b/cove/cove_project/urls.py
@@ -2,6 +2,7 @@
from django.conf.urls.static import static
from django.conf import settings
from django.urls import path
+from django.views.generic import TemplateView
from cove.urls import urlpatterns, handler500 # noqa: F401
@@ -15,7 +16,9 @@
path("api/results/", cove_360.api.ResultsApiView.as_view(), name="api-results"),
url(r'^xhr_results_ready/(.+)$', cove_360.views.results_ready, name='xhr_results_ready'),
url(r'^common_errors', cove_360.views.common_errors, name='common_errors'),
- url(r'^additional_checks', cove_360.views.additional_checks, name='additional_checks')
+ url(r'^additional_checks', cove_360.views.additional_checks, name='additional_checks'),
+ path("publishing/", TemplateView.as_view(template_name="cove_360/publishing.html"), name="publishing"),
+ path("terms-conditions/", TemplateView.as_view(template_name="cove_360/terms.html"), name="terms-conditions"),
]
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
diff --git a/lib360dataquality/additional_test.py b/lib360dataquality/additional_test.py
new file mode 100644
index 0000000..22cf9d7
--- /dev/null
+++ b/lib360dataquality/additional_test.py
@@ -0,0 +1,113 @@
+
+class TestType(object):
+ QUALITY_TEST_CLASS = "quality_accuracy"
+ USEFULNESS_TEST_CLASS = "usefulness"
+
+
+class TestRelevance(object):
+ RECIPIENT_ANY = ""
+ RECIPIENT_ORGANISATION = "recipient organisation"
+ RECIPIENT_INDIVIDUAL = "recipient individual"
+
+
+class TestCategories(object):
+ GRANTS = "Grants"
+ ORGANISATIONS = "Organisations"
+ DATA_PROTECTION = "Data Protection"
+ DATES = "Dates"
+ LOCATION = "Location"
+ METADATA = "Metadata"
+
+
+class AdditionalTest(object):
+ category = TestCategories.GRANTS
+
+ def __init__(self, **kw):
+ self.grants = kw["grants"]
+ self.aggregates = kw["aggregates"]
+ self.grants_percentage = 0
+ self.json_locations = []
+ self.failed = False
+ self.count = 0
+ self.heading = None
+ self.message = None
+ # Default to the most common type
+ self.relevant_grant_type = TestRelevance.RECIPIENT_ANY
+
+ def process(self, grant, path_prefix):
+ # Each test must implement this function which is called on each grant after
+ # the class is initialised.
+ # Set self.count, self.failed, self.heading and self.message
+ pass
+
+ def produce_message(self):
+ return {
+ "heading": self.heading,
+ "message": self.message,
+ "type": self.__class__.__name__,
+ "count": self.count,
+ "percentage": self.grants_percentage,
+ "category": self.__class__.category,
+ }
+
+ def get_heading_count(self, test_class_type):
+ # The total grants is contextual e.g. a test may fail for a recipient org-id
+ # this is only relevant to grants to organisations and not individuals
+ if self.relevant_grant_type == TestRelevance.RECIPIENT_ANY:
+ total = self.aggregates["count"]
+ elif self.relevant_grant_type == TestRelevance.RECIPIENT_ORGANISATION:
+ total = self.aggregates["count"] - self.aggregates["recipient_individuals_count"]
+ elif self.relevant_grant_type == TestRelevance.RECIPIENT_INDIVIDUAL:
+ # if there are no individuals in this data then reset the count
+ if self.aggregates["recipient_individuals_count"] == 0:
+ self.count = 0
+ total = self.aggregates["recipient_individuals_count"]
+
+ # Guard against a division by 0
+ if total < 1:
+ total = 1
+
+ self.grants_percentage = self.count / total
+
+ # Return conditions
+
+ if test_class_type == TestType.QUALITY_TEST_CLASS:
+ return self.count
+
+ if self.aggregates["count"] == 1 and self.count == 1:
+ self.grants_percentage = 1.0
+ return f"1 {self.relevant_grant_type}".strip()
+
+ if self.count <= 5:
+ return f"{self.count} {self.relevant_grant_type}".strip()
+
+ return f"{round(self.grants_percentage*100)}% of {self.relevant_grant_type}".strip()
+
+ def format_heading_count(self, message, test_class_type=None, verb="have"):
+ """Build a string with count of grants plus message
+
+ The grant count phrase for the test is pluralized and
+ prepended to message, eg: 1 grant has + message,
+ 2 grants have + message or 3 grants contain + message.
+ """
+ noun = "grant" if self.count == 1 else "grants"
+
+ # Positive result - "what is working well"
+ # Avoid double negative
+ if not message.startswith("not have") and message.startswith("not") and self.count == 0:
+ message = message[len("not"):]
+ if message.startswith("not have") and self.count == 0:
+ verb = "do"
+ # End positive result flip
+
+ if verb == "have":
+ verb = "has" if self.count == 1 else verb
+ elif verb == "do":
+ verb = "does" if self.count == 1 else verb
+ else:
+ # Naively!
+ verb = verb + "s" if self.count == 1 else verb
+
+ return "{} {} {} {}".format(
+ self.get_heading_count(test_class_type), noun, verb, message
+ )
diff --git a/lib360dataquality/check_field_present.py b/lib360dataquality/check_field_present.py
index 27087fa..794bbe7 100644
--- a/lib360dataquality/check_field_present.py
+++ b/lib360dataquality/check_field_present.py
@@ -1,4 +1,4 @@
-from lib360dataquality.cove.threesixtygiving import AdditionalTest, RECIPIENT_INDIVIDUAL
+from lib360dataquality.additional_test import AdditionalTest, TestRelevance
from functools import wraps
@@ -109,7 +109,7 @@ class IndividualsCodeListsNotPresent(FieldNotPresentBase):
def __init__(self, **kwargs):
super().__init__(**kwargs)
- self.relevant_grant_type = RECIPIENT_INDIVIDUAL
+ self.relevant_grant_type = TestRelevance.RECIPIENT_INDIVIDUAL
def check_field(self, grant):
# Not relevant
diff --git a/lib360dataquality/cove/threesixtygiving.py b/lib360dataquality/cove/threesixtygiving.py
index e787d3e..eefe3d2 100644
--- a/lib360dataquality/cove/threesixtygiving.py
+++ b/lib360dataquality/cove/threesixtygiving.py
@@ -14,6 +14,8 @@
from libcove.lib.common import common_checks_context, get_additional_codelist_values, get_orgids_prefixes, validator
from libcove.lib.tools import decimal_default
from rangedict import RangeDict as range_dict
+from lib360dataquality.additional_test import AdditionalTest, TestType, TestCategories, TestRelevance
+from lib360dataquality.check_field_present import PlannedDurationNotPresent
try:
from django.utils.html import mark_safe
@@ -23,8 +25,6 @@
def mark_safe(string):
return string
-QUALITY_TEST_CLASS = "quality_accuracy"
-USEFULNESS_TEST_CLASS = "usefulness"
DATES_JSON_LOCATION = {
"award_date": "/awardDate",
@@ -392,7 +392,7 @@ def common_checks_360(
# If no particular test classes are supplied then run all defined here
if not test_classes:
- test_classes = [QUALITY_TEST_CLASS, USEFULNESS_TEST_CLASS]
+ test_classes = [TestType.QUALITY_TEST_CLASS, TestType.USEFULNESS_TEST_CLASS]
if context["file_type"] == "xlsx":
try:
@@ -428,6 +428,7 @@ def common_checks_360(
json_data,
cell_source_map,
TEST_CLASSES[test_class_type],
+ # Set ignore_errors to False for debugging checks otherwise all exceptions will pass
ignore_errors=True,
return_on_error=None,
aggregates=context["grants_aggregates"],
@@ -515,89 +516,6 @@ def flatten_dict(grant, path=""):
yield ("{}/{}".format(path, key), value)
-RECIPIENT_ANY = ""
-RECIPIENT_ORGANISATION = "recipient organisation"
-RECIPIENT_INDIVIDUAL = "recipient individual"
-
-
-class AdditionalTest:
- def __init__(self, **kw):
- self.grants = kw["grants"]
- self.aggregates = kw["aggregates"]
- self.grants_percentage = 0
- self.json_locations = []
- self.failed = False
- self.count = 0
- self.heading = None
- self.message = None
- # Default to the most common type
- self.relevant_grant_type = RECIPIENT_ANY
-
- def process(self, grant, path_prefix):
- pass
-
- def produce_message(self):
- return {
- "heading": self.heading,
- "message": self.message,
- "type": self.__class__.__name__,
- "count": self.count,
- "percentage": self.grants_percentage,
- }
-
- def get_heading_count(self, test_class_type):
- # The total grants is contextual e.g. a test may fail for a recipient org-id
- # this is only relevant to grants to organisations and not individuals
- if self.relevant_grant_type == RECIPIENT_ANY:
- total = self.aggregates["count"]
- elif self.relevant_grant_type == RECIPIENT_ORGANISATION:
- total = self.aggregates["count"] - self.aggregates["recipient_individuals_count"]
- elif self.relevant_grant_type == RECIPIENT_INDIVIDUAL:
- # if there are no individuals in this data then reset the count
- if self.aggregates["recipient_individuals_count"] == 0:
- self.count = 0
- total = self.aggregates["recipient_individuals_count"]
-
- # Guard against a division by 0
- if total < 1:
- total = 1
-
- self.grants_percentage = self.count / total
-
- # Return conditions
-
- if test_class_type == QUALITY_TEST_CLASS:
- return self.count
-
- if self.aggregates["count"] == 1 and self.count == 1:
- self.grants_percentage = 1.0
- return f"1 {self.relevant_grant_type}".strip()
-
- if self.count <= 5:
- return f"{self.count} {self.relevant_grant_type}".strip()
-
- return f"{round(self.grants_percentage*100)}% of {self.relevant_grant_type}".strip()
-
- def format_heading_count(self, message, test_class_type=None, verb="have"):
- """Build a string with count of grants plus message
-
- The grant count phrase for the test is pluralized and
- prepended to message, eg: 1 grant has + message,
- 2 grants have + message or 3 grants contain + message.
- """
- noun = "grant" if self.count == 1 else "grants"
- if verb == "have":
- verb = "has" if self.count == 1 else verb
- elif verb == "do":
- verb = "does" if self.count == 1 else verb
- else:
- # Naively!
- verb = verb + "s" if self.count == 1 else verb
- return "{} {} {} {}".format(
- self.get_heading_count(test_class_type), noun, verb, message
- )
-
-
class ZeroAmountTest(AdditionalTest):
"""Check if any grants have an amountAwarded of 0.
@@ -615,6 +533,8 @@ class ZeroAmountTest(AdditionalTest):
"using the data to understand how to interpret the information."
)
+ category = TestCategories.GRANTS
+
def process(self, grant, path_prefix):
try:
# check for == 0 explicitly, as other falsey values will be caught
@@ -629,7 +549,7 @@ def process(self, grant, path_prefix):
self.heading = mark_safe(
self.format_heading_count(
- self.check_text["heading"], test_class_type=QUALITY_TEST_CLASS
+ self.check_text["heading"], test_class_type=TestType.QUALITY_TEST_CLASS
)
)
self.message = self.check_text["message"][self.grants_percentage]
@@ -657,9 +577,11 @@ class RecipientOrg360GPrefix(AdditionalTest):
"for further help."
)
+ category = TestCategories.ORGANISATIONS
+
def __init__(self, **kwargs):
super().__init__(**kwargs)
- self.relevant_grant_type = RECIPIENT_ORGANISATION
+ self.relevant_grant_type = TestRelevance.RECIPIENT_ORGANISATION
def process(self, grant, path_prefix):
try:
@@ -695,6 +617,8 @@ class FundingOrg360GPrefix(AdditionalTest):
"for further help."
)
+ category = TestCategories.ORGANISATIONS
+
def process(self, grant, path_prefix):
try:
for num, organization in enumerate(grant["fundingOrganization"]):
@@ -729,9 +653,11 @@ class RecipientOrgUnrecognisedPrefix(AdditionalTest):
'guidance on organisation identifiers for further help.'
)
+ category = TestCategories.ORGANISATIONS
+
def __init__(self, **kwargs):
super().__init__(**kwargs)
- self.relevant_grant_type = RECIPIENT_ORGANISATION
+ self.relevant_grant_type = TestRelevance.RECIPIENT_ORGANISATION
def process(self, grant, path_prefix):
try:
@@ -754,7 +680,7 @@ def process(self, grant, path_prefix):
self.heading = mark_safe(
self.format_heading_count(
- self.check_text["heading"], test_class_type=QUALITY_TEST_CLASS
+ self.check_text["heading"], test_class_type=TestType.QUALITY_TEST_CLASS
)
)
self.message = self.check_text["message"][self.grants_percentage]
@@ -778,6 +704,8 @@ class FundingOrgUnrecognisedPrefix(AdditionalTest):
'guidance on organisation identifiers for further help.'
)
+ category = TestCategories.ORGANISATIONS
+
def process(self, grant, path_prefix):
try:
count_failure = False
@@ -799,7 +727,7 @@ def process(self, grant, path_prefix):
self.heading = mark_safe(
self.format_heading_count(
- self.check_text["heading"], test_class_type=QUALITY_TEST_CLASS
+ self.check_text["heading"], test_class_type=TestType.QUALITY_TEST_CLASS
)
)
self.message = self.check_text["message"][self.grants_percentage]
@@ -828,9 +756,11 @@ class RecipientOrgCharityNumber(AdditionalTest):
"ignored."
)
+ category = TestCategories.ORGANISATIONS
+
def __init__(self, **kwargs):
super().__init__(**kwargs)
- self.relevant_grant_type = RECIPIENT_ORGANISATION
+ self.relevant_grant_type = TestRelevance.RECIPIENT_ORGANISATION
def process(self, grant, path_prefix):
try:
@@ -855,7 +785,7 @@ def process(self, grant, path_prefix):
self.heading = mark_safe(
self.format_heading_count(
- self.check_text["heading"], test_class_type=QUALITY_TEST_CLASS
+ self.check_text["heading"], test_class_type=TestType.QUALITY_TEST_CLASS
)
)
self.message = self.check_text["message"][self.grants_percentage]
@@ -885,9 +815,11 @@ class RecipientOrgCompanyNumber(AdditionalTest):
"in which case this message can be ignored."
)
+ category = TestCategories.ORGANISATIONS
+
def __init__(self, **kwargs):
super().__init__(**kwargs)
- self.relevant_grant_type = RECIPIENT_ORGANISATION
+ self.relevant_grant_type = TestRelevance.RECIPIENT_ORGANISATION
def process(self, grant, path_prefix):
try:
@@ -909,7 +841,7 @@ def process(self, grant, path_prefix):
self.heading = mark_safe(
self.format_heading_count(
- self.check_text["heading"], test_class_type=QUALITY_TEST_CLASS
+ self.check_text["heading"], test_class_type=TestType.QUALITY_TEST_CLASS
)
)
self.message = mark_safe(self.check_text["message"][self.grants_percentage])
@@ -934,9 +866,11 @@ class NoRecipientOrgCompanyCharityNumber(AdditionalTest):
"ignore this notice."
)
+ category = TestCategories.ORGANISATIONS
+
def __init__(self, **kwargs):
super().__init__(**kwargs)
- self.relevant_grant_type = RECIPIENT_ORGANISATION
+ self.relevant_grant_type = TestRelevance.RECIPIENT_ORGANISATION
def process(self, grant, path_prefix):
try:
@@ -985,9 +919,11 @@ class IncompleteRecipientOrg(AdditionalTest):
"for further help. "
)
+ category = TestCategories.LOCATION
+
def __init__(self, **kwargs):
super().__init__(**kwargs)
- self.relevant_grant_type = RECIPIENT_ORGANISATION
+ self.relevant_grant_type = TestRelevance.RECIPIENT_ORGANISATION
def process(self, grant, path_prefix):
try:
@@ -1030,6 +966,8 @@ class MoreThanOneFundingOrg(AdditionalTest):
"of funders is correct, then you can ignore this error notice."
)
+ category = TestCategories.ORGANISATIONS
+
def __init__(self, **kw):
super().__init__(**kw)
self.funding_organization_ids = []
@@ -1080,6 +1018,8 @@ class LooksLikeEmail(AdditionalTest):
"refers."
)
+ category = TestCategories.DATA_PROTECTION
+
def process(self, grant, path_prefix):
flattened_grant = OrderedDict(flatten_dict(grant))
for key, value in flattened_grant.items():
@@ -1092,7 +1032,7 @@ def process(self, grant, path_prefix):
self.heading = self.format_heading_count(
self.check_text["heading"],
- test_class_type=QUALITY_TEST_CLASS,
+ test_class_type=TestType.QUALITY_TEST_CLASS,
verb="contain",
)
self.message = self.check_text["message"][self.grants_percentage]
@@ -1115,6 +1055,8 @@ class NoGrantProgramme(AdditionalTest):
"organisation does not have grant programmes this notice can be ignored."
)
+ category = TestCategories.GRANTS
+
def process(self, grant, path_prefix):
grant_programme = grant.get("grantProgramme")
if not grant_programme:
@@ -1149,6 +1091,8 @@ class NoBeneficiaryLocation(AdditionalTest):
"for further help."
)
+ category = TestCategories.LOCATION
+
def process(self, grant, path_prefix):
beneficiary_location = grant.get("beneficiaryLocation")
if not beneficiary_location:
@@ -1172,6 +1116,8 @@ class TitleDescriptionSame(AdditionalTest):
"Consider including a more detailed description if you have one."
)
+ category = TestCategories.GRANTS
+
def process(self, grant, path_prefix):
title = grant.get("title")
description = grant.get("description")
@@ -1196,6 +1142,8 @@ class TitleLength(AdditionalTest):
"can quickly understand the purpose of the grant."
)
+ category = TestCategories.GRANTS
+
def process(self, grant, path_prefix):
title = grant.get("title", "")
if len(title) > 140:
@@ -1223,9 +1171,11 @@ class GrantIdUnexpectedChars(AdditionalTest):
" for further help."
)
+ category = TestCategories.GRANTS
+
def __init__(self, **kwargs):
super().__init__(**kwargs)
- self.relevant_grant_type = RECIPIENT_ANY
+ self.relevant_grant_type = TestRelevance.RECIPIENT_ANY
def process(self, grant, path_prefix):
if "\n" in grant.get("id"):
@@ -1234,7 +1184,7 @@ def process(self, grant, path_prefix):
self.count += 1
self.heading = self.format_heading_count(
- self.check_text["heading"], test_class_type=QUALITY_TEST_CLASS
+ self.check_text["heading"], test_class_type=TestType.QUALITY_TEST_CLASS
)
self.message = self.check_text["message"][self.grants_percentage]
@@ -1253,9 +1203,11 @@ class OrganizationIdUnexpectedChars(AdditionalTest):
" See our guidance on organisation identifiers "
" for further help.")
+ category = TestCategories.ORGANISATIONS
+
def __init__(self, **kwargs):
super().__init__(**kwargs)
- self.relevant_grant_type = RECIPIENT_ORGANISATION
+ self.relevant_grant_type = TestRelevance.RECIPIENT_ORGANISATION
def process(self, grant, path_prefix):
for org_type in ("fundingOrganization", "recipientOrganization"):
@@ -1272,7 +1224,7 @@ def process(self, grant, path_prefix):
self.count += 1
self.heading = self.format_heading_count(
- self.check_text["heading"], test_class_type=QUALITY_TEST_CLASS
+ self.check_text["heading"], test_class_type=TestType.QUALITY_TEST_CLASS
)
self.message = self.check_text["message"][self.grants_percentage]
@@ -1297,9 +1249,11 @@ class OrganizationIdLooksInvalid(AdditionalTest):
"for further help."
)
+ category = TestCategories.ORGANISATIONS
+
def __init__(self, **kwargs):
super().__init__(**kwargs)
- self.relevant_grant_type = RECIPIENT_ORGANISATION
+ self.relevant_grant_type = TestRelevance.RECIPIENT_ORGANISATION
def process(self, grant, path_prefix):
for org_type in ("fundingOrganization", "recipientOrganization"):
@@ -1322,7 +1276,7 @@ def process(self, grant, path_prefix):
self.count += 1
self.heading = self.format_heading_count(
- self.check_text["heading"], test_class_type=QUALITY_TEST_CLASS
+ self.check_text["heading"], test_class_type=TestType.QUALITY_TEST_CLASS
)
self.message = self.check_text["message"][self.grants_percentage]
@@ -1342,6 +1296,8 @@ class NoLastModified(AdditionalTest):
"users to see when changes have been made and reconcile differences between versions of your data."
)
+ category = TestCategories.METADATA
+
def process(self, grant, path_prefix):
last_modified = grant.get("dateModified")
if not last_modified:
@@ -1373,6 +1329,8 @@ class NoDataSource(AdditionalTest):
"website."
)
+ category = TestCategories.METADATA
+
def process(self, grant, path_prefix):
data_source = grant.get("dataSource")
if not data_source:
@@ -1401,6 +1359,8 @@ class ImpossibleDates(AdditionalTest):
"or the 29th of February in a year that's not a leap year. This error is commonly caused by typos during data entry."
)
+ category = TestCategories.DATES
+
def process(self, grant, path_prefix):
grant_dates = create_grant_dates_dict(Grant(grant))
@@ -1457,6 +1417,8 @@ class PlannedStartDateBeforeEndDate(AdditionalTest):
"This can also be caused by inconsistent date formatting when data was prepared using spreadsheet software."
)
+ category = TestCategories.DATES
+
def process(self, grant, path_prefix):
grant_dates = create_grant_dates_dict(Grant(grant))
@@ -1495,6 +1457,8 @@ class ActualStartDateBeforeEndDate(AdditionalTest):
"This can also be caused by inconsistent date formatting when data was prepared using spreadsheet software."
)
+ category = TestCategories.DATES
+
def process(self, grant, path_prefix):
grant_dates = create_grant_dates_dict(Grant(grant))
@@ -1531,6 +1495,8 @@ class FarFuturePlannedDates(AdditionalTest):
"errors if this isn't expected."
)
+ category = TestCategories.DATES
+
def process(self, grant, path_prefix):
grant_dates = create_grant_dates_dict(Grant(grant))
@@ -1571,6 +1537,8 @@ class FarFutureActualDates(AdditionalTest):
"if this isn't expected."
)
+ category = TestCategories.DATES
+
def process(self, grant, path_prefix):
grant_dates = create_grant_dates_dict(Grant(grant))
@@ -1610,6 +1578,8 @@ class FarPastDates(AdditionalTest):
"data is about activities far in the past, but you should check for data entry errors if this isn't expected."
)
+ category = TestCategories.DATES
+
def process(self, grant, path_prefix):
grant_dates = create_grant_dates_dict(Grant(grant))
@@ -1660,6 +1630,8 @@ class PostDatedAwardDates(AdditionalTest):
"includes grants that are not yet fully committed"
)
+ category = TestCategories.DATES
+
def process(self, grant, path_prefix):
grant_dates = create_grant_dates_dict(Grant(grant))
@@ -1696,9 +1668,11 @@ class RecipientIndWithoutToIndividualsDetails(AdditionalTest):
"individuals."
)
+ category = TestCategories.GRANTS
+
def __init__(self, **kwargs):
super().__init__(**kwargs)
- self.relevant_grant_type = RECIPIENT_INDIVIDUAL
+ self.relevant_grant_type = TestRelevance.RECIPIENT_INDIVIDUAL
def process(self, grant, path_prefix):
if "recipientIndividual" in grant and "toIndividualsDetails" not in grant:
@@ -1726,9 +1700,11 @@ class RecipientIndDEI(AdditionalTest):
"identifiable when combined with other information in the grant."
)
+ category = TestCategories.DATA_PROTECTION
+
def __init__(self, **kwargs):
super().__init__(**kwargs)
- self.relevant_grant_type = RECIPIENT_INDIVIDUAL
+ self.relevant_grant_type = TestRelevance.RECIPIENT_INDIVIDUAL
def process(self, grant, path_prefix):
if "recipientIndividual" in grant and "project" in grant:
@@ -1768,9 +1744,11 @@ class GeoCodePostcode(AdditionalTest):
"grant."
)
+ category = TestCategories.DATA_PROTECTION
+
def __init__(self, **kwargs):
super().__init__(**kwargs)
- self.relevant_grant_type = RECIPIENT_INDIVIDUAL
+ self.relevant_grant_type = TestRelevance.RECIPIENT_INDIVIDUAL
def process(self, grant, path_prefix):
if "recipientIndividual" in grant:
@@ -1787,8 +1765,57 @@ def process(self, grant, path_prefix):
self.message = self.check_text["message"][self.grants_percentage]
+class MultiFundingOrgIdsForName(AdditionalTest):
+ """Check for Funding org ids with multiple names."""
+
+ check_text = {
+ "heading": mark_safe("introduced an additional name for an existing Funding Org"),
+ "message": RangeDict(),
+ }
+ check_text["message"][(0, 100)] = mark_safe(
+ "Your data contains Funding Org names with differing org-ids. "
+ "Funding organisations typically only have one name and one org-id."
+ )
+
+ category = TestCategories.ORGANISATIONS
+
+ def __init__(self, **kw):
+ super().__init__(**kw)
+ # zxy-name: { names: [] }
+ self.funding_organisation_id_name = {}
+
+ def process(self, grant, path_prefix):
+ for num, organisation in enumerate(grant["fundingOrganization"]):
+ org_id = organisation["id"]
+ name = organisation["name"]
+
+ try:
+ names = self.funding_organisation_id_name[organisation["id"]]
+ except KeyError:
+ # initialise the data
+ names = [name]
+ self.funding_organisation_id_name[org_id] = names
+
+ if name not in names:
+ # We have a brand new name for this org id, suspicious.
+ names.append(name)
+ self.json_locations.append(
+ path_prefix + "/fundingOrganization/{}/name".format(num)
+ )
+ self.count = self.count + 1
+ self.failed = True
+
+ self.heading = self.format_heading_count(self.check_text["heading"])
+ self.message = mark_safe(self.check_text["message"][self.grants_percentage])
+
+
+
+
+# Default tests run in CoVE, these are also the base list
+# for the Quality Dashboard checks.
TEST_CLASSES = {
- QUALITY_TEST_CLASS: [
+ # Quality = Accuracy tests in cove
+ TestType.QUALITY_TEST_CLASS: [
ZeroAmountTest,
FundingOrgUnrecognisedPrefix,
RecipientOrgUnrecognisedPrefix,
@@ -1806,11 +1833,11 @@ def process(self, grant, path_prefix):
FarFutureActualDates,
FarPastDates,
PostDatedAwardDates,
- RecipientIndWithoutToIndividualsDetails,
RecipientIndDEI,
GeoCodePostcode,
+ MultiFundingOrgIdsForName,
],
- USEFULNESS_TEST_CLASS: [
+ TestType.USEFULNESS_TEST_CLASS: [
RecipientOrg360GPrefix,
FundingOrg360GPrefix,
NoRecipientOrgCompanyCharityNumber,
@@ -1821,6 +1848,8 @@ def process(self, grant, path_prefix):
TitleLength,
NoLastModified,
NoDataSource,
+ RecipientIndWithoutToIndividualsDetails,
+ PlannedDurationNotPresent,
],
}
@@ -1865,10 +1894,13 @@ def create_grant_dates_dict(grant):
grant_dates = {}
award_date = grant.grant.get("awardDate")
- planned_start_date = grant.grant.get("plannedDates", [{}])[0].get("startDate")
- planned_end_date = grant.grant.get("plannedDates", [{}])[0].get("endDate")
- actual_start_date = grant.grant.get("actualDates", [{}])[0].get("startDate")
- actual_end_date = grant.grant.get("actualDates", [{}])[0].get("endDate")
+ try:
+ planned_start_date = grant.grant.get("plannedDates", [{}])[0].get("startDate")
+ planned_end_date = grant.grant.get("plannedDates", [{}])[0].get("endDate")
+ actual_start_date = grant.grant.get("actualDates", [{}])[0].get("startDate")
+ actual_end_date = grant.grant.get("actualDates", [{}])[0].get("endDate")
+ except IndexError:
+ return {}
for date_type, input_date in [
["award_date", award_date],
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..bfd33bf
--- /dev/null
+++ b/package.json
@@ -0,0 +1,14 @@
+{
+ "devDependencies": {
+ "eslint": "^8.29.0",
+ "eslint-config-semistandard": "^17.0.0",
+ "eslint-config-standard": "^17.0.0",
+ "eslint-plugin-html": "^7.1.0",
+ "eslint-plugin-import": "^2.26.0",
+ "eslint-plugin-n": "^15.6.0",
+ "eslint-plugin-promise": "^6.1.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+}