diff --git a/.babelrc b/.babelrc
new file mode 100644
index 0000000..0d4d89e
--- /dev/null
+++ b/.babelrc
@@ -0,0 +1,3 @@
+{
+ "presets": ["es2015", "es2016", "es2017", "stage-1", "react"]
+}
diff --git a/.credo.exs b/.credo.exs
new file mode 100644
index 0000000..ba8867e
--- /dev/null
+++ b/.credo.exs
@@ -0,0 +1,19 @@
+# config/.credo.exs
+%{
+ configs: [
+ %{
+ name: "default",
+ files: %{
+ included: ["lib/", "src/", "web/", "apps/"],
+ excluded: []
+ },
+ checks: [
+ {Credo.Check.Consistency.TabsOrSpaces},
+ {Credo.Check.Design.TagTODO, exit_status: 0},
+ {Credo.Check.Readability.Specs, false},
+ {Credo.Check.Consistency.MultiAliasImportRequireUse, false},
+ {Credo.Check.Readability.MaxLineLength, priority: :low, max_length: 100},
+ ]
+ }
+ ]
+}
diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000..eed9719
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,4 @@
+_build
+deps
+node_modules
+test
\ No newline at end of file
diff --git a/.eslintignore b/.eslintignore
new file mode 100644
index 0000000..32bcdf1
--- /dev/null
+++ b/.eslintignore
@@ -0,0 +1 @@
+/test
\ No newline at end of file
diff --git a/.eslintrc.json b/.eslintrc.json
new file mode 100644
index 0000000..dd73a7f
--- /dev/null
+++ b/.eslintrc.json
@@ -0,0 +1,24 @@
+{
+ "parser": "babel-eslint",
+ "parserOptions": {
+ "sourceType": "module",
+ "allowImportExportEverywhere": false
+ },
+ "extends": "airbnb",
+ "plugins": [
+ "react"
+ ],
+ "rules": {
+ "strict": 0,
+ "react/jsx-filename-extension": "off",
+ "no-use-before-define": "off",
+ "comma-dangle": "off",
+ "no-unused-vars": ["error", { "argsIgnorePattern": "^_" }] ,
+ "react/require-default-props": "off",
+ "react/prefer-stateless-function": "off",
+ "react/forbid-prop-types": "off",
+ "jsx-a11y/no-access-key": 2,
+ "jsx-a11y/href-no-hash": 2,
+ "jsx-a11y/img-has-alt": 2
+ }
+}
diff --git a/.gitignore b/.gitignore
index 19fe3da..1ad398f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -22,3 +22,8 @@ erl_crash.dump
# secrets file as long as you replace its contents by environment
# variables.
/config/prod.secret.exs
+
+.DS_Store
+.idea/
+
+npm-debug.log*
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..b43e86f
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,32 @@
+FROM bitwalker/alpine-elixir-phoenix:latest
+
+# Install dependencies
+RUN apk add --no-cache python=2.7.12-r0 make gcc g++
+
+# Build Environment
+ARG RDS_PASSWORD
+
+ARG MIX_ENV
+ENV MIX_ENV ${MIX_ENV:-prod}
+ARG RDS_PASSWORD
+ENV RDS_PASSWORD ${RDS_PASSWORD:-nopassword}
+
+# Set exposed ports
+EXPOSE 4000
+ENV PORT=4000
+
+# Cache elixir deps
+ADD mix.exs mix.lock ./
+RUN mix do deps.get, deps.compile
+
+# Same with npm deps
+ADD package.json package.json
+RUN npm install
+
+ADD . .
+
+# Run frontend build, compile, and digest assets
+RUN brunch build --production && \
+ mix do compile, phoenix.digest
+
+CMD ["mix", "do", "ecto.migrate,", "phoenix.server"]
\ No newline at end of file
diff --git a/PLAYBOOK_ADHERENCE.md b/PLAYBOOK_ADHERENCE.md
new file mode 100644
index 0000000..d81475d
--- /dev/null
+++ b/PLAYBOOK_ADHERENCE.md
@@ -0,0 +1,55 @@
+# US Digital Services Playbook Adherence
+
+Lab Zero’s existing product design and development approach aligns closely with the US Digital Services Playbook. Our prioritized [Prototype Design](https://github.com/labzero/adpq/projects/2) and [Prototype Dev](https://github.com/labzero/adpq/projects/1) backlogs within GitHub show how the activities in our iterative and collaborative process from discovery to delivery and deployment. We make reference within many Product Design cards to the Playbook activity, as well (noted as “PB”).
+
+In addition, below are key activities and artifacts relative to the Digital Service Plays:
+
+## Play 1: Understand what people need
+* Drafted open-ended discovery interview scripts for key personas [Requester Interview Script](https://github.com/labzero/adpq/blob/develop/docs/interviews/00TemplateOpen-endedInterviewScriptforRequester.pdf), [Admin Interview Script](TBD)
+* Interviewed representative users, documented & shared learnings [Dennis Baker](https://github.com/labzero/adpq/blob/develop/docs/interviews/Interview1.1DennisBaker-StateAssemblyReprographicsManager.pdf), [Robert Lee](https://github.com/labzero/adpq/blob/develop/docs/interviews/Interview2.1RobertLee-StartupOfficeManager.pdf), [Ned holets](https://github.com/labzero/adpq/blob/develop/docs/interviews/Interview3.1NedHolets-CMSDeveloper.pdf)
+* Utilize existing large scale quantitative eCommerce research through the Baymard Institute [Ecommerce Usability Guidelines](https://github.com/labzero/adpq/blob/develop/docs/research/RelevanteCommerceUsabilityGuidelines.pdf), [Shopping & Procurement Research](https://github.com/labzero/adpq/blob/develop/docs/research/ShoppingandProcurementResearch.pdf)
+* Outline Full Persona List to note all roles likely involved in the full experience [Link](https://github.com/labzero/adpq/blob/develop/docs/personas/00FullPersonasList.pdf)
+* Focus on and define State Agency Requester as primary persona [Link](https://github.com/labzero/adpq/blob/develop/docs/personas/01StateAgencyRequesterPersona.pdf)
+* Focus on and define Lead Purchasing Org web admin as secondary persona [Link](https://github.com/labzero/adpq/blob/develop/docs/personas/02DataAdminPersona.pdf)
+* Capture & prioritize needs as user stories [Link](https://github.com/labzero/adpq/projects/1)
+* Regularly test to validate problem/solution fit [Robert Lee](https://github.com/labzero/adpq/blob/develop/docs/interviews/Interview2.2RobertLeeConceptTest.pdf), [Tracey Thompson](TBD)
+
+## Play 2: Address the whole experience, from start to finish
+* Illustrated on- & off-line touch points and align team on key points of impact & focus
+* Stated project summary, goals, & metrics to ensure the effort meets needs [Product Speclet](https://github.com/labzero/adpq/blob/develop/docs/Product%20Speclet.pdf)
+
+## Play 3: Make it simple and intuitive
+* Consistently utilized US Web Design Standards
+* Followed accessibility best practices [Readme, G](https://github.com/labzero/adpq/blob/develop/README.md)
+* Leveraged login to provide users with a way to exit and return later to complete process
+* Improved readability by re-formatting and adjusting sample data [Data Spreadsheet](TBD)
+
+## Play 4: Build the service using agile and iterative practices
+* Shipped a functioning MVP
+* Frequently ran usability tests to identify improvements [Interviews](https://github.com/labzero/adpq/tree/develop/docs/interviews)
+* Facilitated team alignment & communication through daily standups, [weekly demos/retros](https://github.com/labzero/adpq/tree/develop/docs/retrospective), & [Slack channel](https://github.com/labzero/adpq/blob/develop/docs/Collaboration%20work%20sample%20-%20Slack%20conversation.jpeg)
+* Kept the delivery team flat & focused [Kickoff deck](https://github.com/labzero/adpq/blob/develop/docs/Prototype%20A%20Kickoff%20deck.pdf)
+* Drafted a prioritized features backlog and review with team [Link](https://github.com/labzero/adpq/projects/1)
+
+## Play 6: Assign on leader and hold that person accountable
+* Assigned experienced Product Owner accountable for project [Readme, A](https://github.com/labzero/adpq/blob/develop/README.md)
+
+## Play 7: Bring in experienced teams
+* Assembled a team experienced building similar applications in a modern fashion [Readme, B](https://github.com/labzero/adpq/blob/develop/README.md)
+
+## Play 8: Choose a modern technology stack
+* Modern technology stack chosen [Readme, L](https://github.com/labzero/adpq/blob/develop/README.md)
+
+## Play 9: Deploy in a flexible hosting environment
+* Deployed in a flexible hosting environment [Readme, M](https://github.com/labzero/adpq/blob/develop/README.md)
+
+## Play 10: Automate testing and deployments
+* Testing & deploys automated [Readme, O](https://github.com/labzero/adpq/blob/develop/README.md)
+
+## Play 12: User data to drive
+* Monitoring system performance [Readme, Q](https://github.com/labzero/adpq/blob/develop/README.md)
+
+## Play 13: Default to open
+* Utilized open source
+
+
diff --git a/README.md b/README.md
index f0b8646..5d494fe 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,10 @@
# Adpq
[Setup Instructions](SETUP.md)
+
+[Technical Approach](TECHNICAL_APPROACH.md)
+
+[Requirements List](REQUIREMENTS_LIST.md)
+
+[Playbook Adherence](PLAYBOOK_ADHERENCE.md)
+
diff --git a/REQUIREMENTS_LIST.md b/REQUIREMENTS_LIST.md
new file mode 100644
index 0000000..ef55384
--- /dev/null
+++ b/REQUIREMENTS_LIST.md
@@ -0,0 +1,102 @@
+Requirements List
+
+**a. Assigned one (1) leader and gave that person authority and responsibility and held that person accountable for the quality of the prototype submitted**
+> Aaron Cripps, Product Owner
+
+**b. Assembled a multidisciplinary and collaborative team that includes, at a minimum, five (5) of the labor categories as identified in Attachment B: PQVP DS-AD Labor Category Descriptions**
+> The majority of the team is based in the San Francisco Bay Area. One member is in Tucson AZ, one member in Little Rock AR. Our team collaborates using tools like Slack, Google Hangouts, Screen Hero, GoToMeeting, and Google Docs.
+* Product Manager - Aaron Cripps
+* Technical Architect - Sasha Voynow, Matt Wilson
+* Interaction Designer - Dean Baker, Clayton Hopkins
+* Visual Designer - Jim Ochsenreiter
+* Front End Web Developer - Adam Ducker, Jeffrey Carl Faden
+* Backend Web Developer - Sasha Voynow
+* DevOps Engineer - Brien Wankel, Dave O’Dell
+
+**c. Understood what people needed, by including people in the prototype development and design process**
+> Informed by our initial persona attributes, we found three individuals whose job activities aligned with or related to the Lead Purchasing Organization Administration and State Agency IT Requester roles.
+* [Dennis Baker](https://github.com/labzero/adpq/blob/develop/docs/interviews/Interview1.1DennisBaker-StateAssemblyReprographicsManager.pdf), State of California Assembly Reprographics Manager
+* [Robert Lee](https://github.com/labzero/adpq/blob/develop/docs/interviews/Interview2.1RobertLee-StartupOfficeManager.pdf), Startup Office Manager
+* [Ned Holets](https://github.com/labzero/adpq/blob/develop/docs/interviews/Interview3.1NedHolets-CMSDeveloper.pdf), Lead Software Engineer who has worked on CMS projects
+
+**d. Used at least a minimum of three (3) “user-centric design” techniques and/or tools**
+> Human-centered design is a core aspect of our process. You can find a richer explanation of our processes here. Key examples listed below:
+* Customer Development activities
+ * Stating and prioritizing learning goals (hypotheses)
+ * Open-ended interviews with people who met our target personas to understand their needs and goals
+* In-person usability testing to validate solution ideas/hypotheses
+ * Clickable prototypes to support usability testing
+ * ‘Think aloud’ qualitative user test of prototype
+ * Accessibility test
+* Leveraging existing usability research
+ * Baymard Institute, an ecommerce usability research firm whose methodology includes qualitative ‘Think aloud’ protocol and large scale eye-tracking study.
+
+**e. Used GitHub to document code commits**
+> Yes, we’ve used Github fully for peer-review and as our sole code repository.
+
+**f. Used Swagger to document the RESTful API, and provided a link to the Swagger API**
+> Yes, we’ve have implemented Swagger, you can view it [here](http://petstore.swagger.io/?url=http://staging.adpq.labzero.com/api/swagger_docs)
+
+**g. Complied with Section 508 of the Americans with Disabilities Act and WCAG 2.0**
+> Yes, we have used HTML and CSS in a manner that complies with the ADA and WCAG 2.0
+
+**h. Created or used a design style guide and/or a pattern library**
+* We utilized the US Web Design Standards for user experience, visual design and responsive guidelines and patterns.
+* We leveraged the Baymard Institute’s research-based user interaction guidelines for eCommerce product lists, homepages and checkout.
+
+**i. Performed usability tests with people**
+> We showed functional prototypes to the following individuals facilitated by a “Think Aloud” qualitative user test.
+* Robert Lee
+* Tracey Thompson
+
+**j. Used an iterative approach, where feedback informed subsequent work or versions of the prototype**
+> We began by clarifying the business case and target outcomes without proposing solutions. This empowers each team member to bring their expertise and creativity into the solutions which are iteratively built and tested. Learnings from test are fed back into subsequent iterations.
+* Product Owner led goal-oriented kickoff and drafted a first version of the “Speclet” to align and hold the team accountable to high-level key outcomes and measurements.
+* Key learnings from user interviews informed the project summary, goals, and measurements and allowed us to apply improvements to our designs and development.
+* Team story time for formal technical review of prioritized backlog. Development feedback assisted in clarifying prototype behavior and story decomposition.
+* Validated design concepts through clickable prototypes with people outside the team. User feedback informed backlog grooming (through prioritization) and design iterations.
+* Presented design, development, and product ideas to the full team frequently to inform final deliverables through daily standups and conversations.
+* Utilized Scrum framework for frequent and agile inspection and adaptation
+ * Product Owner managed a prioritized backlog of tasks for Design & Development
+ * Daily standup
+ * Weekly sprints: team performed demos and retrospectives
+
+**k. Created a prototype that works on multiple devices, and presents a responsive design**
+> Our prototype has been designed, developed and tested to work on desktop browsers, iOS and Android phones as well as screen readers.
+
+## l. Used at least five (5) modern and open-source technologies, regardless of architectural layer (frontend, backend, etc.)
+>We utilized many modern open-source technologies:
+* Elixir
+* Phoenix Framework
+* Ecto (data layer)
+* React.js
+* Docker
+* SASS
+* Javascript/ES6
+* REST
+
+**m. Deployed the prototype on an Infrastructure as a Service (IaaS) or Platform as Service (PaaS) provider, and indicated which provider they used**
+> Our prototype has been deployed to AWS as a Docker container running in ECS using RDS for it’s datastore.
+
+**n. Developed automated unit tests for their code**
+> The Engineering Team delivered stories with working code and some level of automated testing. All tests are run in the continuous integration loop with each.
+* Javascript we wrote Jest tests (link)
+* Elixir we wrote ExUnit tests (link)
+
+**o. Setup or used a continuous integration system to automate the running of tests and continuously deployed their code to their IaaS or PaaS provider**
+> Our use of a CI server drives automated tests and our deployment pipeline. All new pull requests are tested. We used CircleCI to automate our CI and CD automation.
+
+**p. Setup or used configuration management**
+> We generate CloudFormation templates and build Docker containers, adhering to a https://12factor.net/ approach.
+
+**q. Setup or used continuous monitoring**
+> We setup Honeybadger.io for error reporting and Pingdom for uptime monitoring.
+
+**r. Deployed their software in an open source container, such as Docker (i.e., utilized operating-system-level virtualization)**
+> We build Docker containers in our CI/CD process and deploy them to ECR/ECS in AWS.
+
+**s. Provided sufficient documentation to install and run their prototype on another machine**
+> Please see the SETUP.md file in root directory of this repository. All engineers used these steps to set up their development environments.
+
+**t. Prototype and underlying platforms used to create and run the prototype are openly licensed and free of charge**
+> All systems used to create and run the prototype are open source and free of charge for use. Our prototype carries an MIT license as well.
diff --git a/SETUP.md b/SETUP.md
index 40b3f98..a43299d 100644
--- a/SETUP.md
+++ b/SETUP.md
@@ -5,23 +5,28 @@
### Software Versions
* Elixir 1.4.1 (Erlang/OTP 19 [erts-8.2])
+ * Phoenix Framework 1.2.1
* postgres (PostgreSQL) 9.6.2
+ * Node.js 7.5.0
+ * React 15.4.2
### MacOS
1. Install Homebrew if not already installed `/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"`
1. Update Homebrew `brew update`
1. Install postgresql `brew install postgresql`
+ 1. Install node `brew install node`
1. Install elixir `brew install elixir`
1. Install mix `mix local.hex`
+ 1. Create PostgreSQL role `createuser -d adpq`
+ 1. Create and migrate schema `mix ecto.create && mix ecto.migrate`
+ 1. To add seed data to your database: `mix run priv/repo/seeds.exs`
### Linux
## Starting the application
1. Install dependencies with `mix deps.get`
- 1. Create and migrate your database with `mix ecto.create && mix ecto.migrate`
1. Install Node.js dependencies with `npm install`
1. Start Phoenix endpoint with `mix phoenix.server`
Now you can visit [`localhost:4000`](http://localhost:4000) from your browser.
-
diff --git a/TECHNICAL_APPROACH.md b/TECHNICAL_APPROACH.md
new file mode 100644
index 0000000..6e04bcb
--- /dev/null
+++ b/TECHNICAL_APPROACH.md
@@ -0,0 +1,36 @@
+# Technical Approach
+## Development Process
+We use the GitFlow branching model and create feature branches off of the develop branch for all new changes. All
+commits should adhere to the guidelines described in our [commit guide](https://github.com/labzero/guides/blob/master/process/commit_guide.md).
+Each feature branch is pushed to Github and a pull request is created, built and tested in CircleCI before peer-review
+is performed by other developers on the team. Upon final approval by the dev lead, the branch will be squash-merged back
+into develop.
+
+## CI Process
+PR phase looks for success for all of these steps:
+* Compilation and Docker container build
+* Credo (code quality/style analyser)
+* Unit tests
+
+## Continuous Delivery
+* Commits to develop trigger deployment to our Test environment
+* Upon deployment post-deploy automated testing it performed
+
+## Release Process
+Using GitFlow tooling, we create a release branch and tag. The tag is then used to create a new container image. A job
+in Circle CI is used to deploy the tagged container to ECS in AWS.
+
+## Architectural Approach
+This web application will be built as a modern React.js app (Single Page Application) that consumes a JSON API backend
+written in Elixir using the Phoenix framework and talking to a Postgres database. We considered using Shopify or Spree
+but ultimately decided to build the prototype from scratch so that we could demonstrate our ability to write good custom
+ software with usable user interfaces that was designed after speaking with real users.
+
+![Cloud Architecture](docs/ADPQ-PrototypeA-Architecture.png)
+
+## Infrastructure Approach
+This application will be built in a cloud-first manner on AWS, but will be deployed as a Docker container in order to
+allow cloud portability. However, if AWS offers a managed service for something we need, we will prefer the managed
+service to rolling our own infrastructure. I.e. Postgres via RDS instead of running our own Postgres servers in EC2.
+
+Our VPC and security blueprints will be maintained as CloudFormation templates and checked into Git.
\ No newline at end of file
diff --git a/brunch-config.js b/brunch-config.js
index d2fe679..95c6394 100644
--- a/brunch-config.js
+++ b/brunch-config.js
@@ -22,7 +22,8 @@ exports.config = {
stylesheets: {
joinTo: "css/app.css",
order: {
- after: ["web/static/css/app.css"] // concat app.css last
+ before: ["node_modules/uswds/dist/css/uswds.css", "web/static/css/uswds-bugfixes.css"],
+ after: ["web/static/css/app.scss"] // concat app.css last
}
},
templates: {
@@ -34,13 +35,16 @@ exports.config = {
// This option sets where we should place non-css and non-js assets in.
// By default, we set this to "/web/static/assets". Files in this directory
// will be copied to `paths.public`, which is "priv/static" by default.
- assets: /^(web\/static\/assets)/
+ assets: /^(web\/static\/assets)/,
+ // Ignore uswds.min.css
+ ignored: /\.min.css$/
},
// Phoenix paths configuration
paths: {
// Dependencies and current project directories to watch
watched: [
+ "node_modules/uswds/dist/css/",
"web/static",
"test/static"
],
@@ -52,8 +56,15 @@ exports.config = {
// Configure your plugins
plugins: {
babel: {
+ presets: ['es2015', 'es2016', 'es2017', 'stage-1', 'react'],
// Do not use ES6 compiler in vendor code
ignore: [/web\/static\/vendor/]
+ },
+ replacement: {
+ replacements: [{
+ files: [/\.css$/],
+ match: {find: '../img/', replace: '/images/'}
+ }]
}
},
diff --git a/circle.yml b/circle.yml
new file mode 100644
index 0000000..37750d0
--- /dev/null
+++ b/circle.yml
@@ -0,0 +1,41 @@
+machine:
+ pre:
+ - curl -sSL https://s3.amazonaws.com/circle-downloads/install-circleci-docker.sh | bash -s -- 1.10.0
+ services:
+ - docker
+dependencies:
+ pre:
+ - script/ci/prepare.sh
+ post:
+ - if [[ ! -e sassc ]]; then git clone git@github.com:sass/sassc.git sassc; fi
+ - if [[ ! -e libsass ]]; then git clone --recursive git@github.com:sass/libsass.git && cd sassc && export SASS_LIBSASS_PATH=$(readlink -f ../libsass) && make && cd ..; fi
+ - ln -s sassc/bin/sassc ~/bin/sassc
+ cache_directories:
+ - ~/dependencies
+ - ~/.mix
+ - _build
+ - deps
+ - node_modules
+database:
+ override:
+ - createuser -d adpq
+test:
+ override:
+ - mkdir -p $CIRCLE_TEST_REPORTS/test
+ - script/ci/tests.sh
+deployment:
+ brien:
+ branch: /.*?brien.*$/
+ commands:
+ - script/ci/deploy-prod.sh
+ develop:
+ branch: develop
+ commands:
+ - script/ci/deploy-develop.sh
+ production:
+ branch: master
+ commands:
+ - script/ci/deploy-prod.sh
+general:
+ artifacts:
+ - /opt/app/npm-debug.log
diff --git a/config/config.exs b/config/config.exs
index facc077..a676ac3 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -22,6 +22,12 @@ config :logger, :console,
format: "$time $metadata[$level] $message\n",
metadata: [:request_id]
+# Honeybadger
+config :honeybadger,
+ api_key: System.get_env("HONEYBADGER_API_KEY"),
+ exclude_envs: [:test, :dev],
+ environment_name: :dev
+
# Import environment specific config. This must remain at the bottom
# of this file so it overrides the configuration defined above.
import_config "#{Mix.env}.exs"
diff --git a/config/dev.exs b/config/dev.exs
index a4cfbf9..939ee12 100644
--- a/config/dev.exs
+++ b/config/dev.exs
@@ -36,8 +36,8 @@ config :phoenix, :stacktrace_depth, 20
# Configure your database
config :adpq, Adpq.Repo,
adapter: Ecto.Adapters.Postgres,
- username: "postgres",
- password: "postgres",
+ username: "adpq",
+ password: "",
database: "adpq_dev",
hostname: "localhost",
pool_size: 10
diff --git a/config/develop.exs b/config/develop.exs
new file mode 100644
index 0000000..c6c0f72
--- /dev/null
+++ b/config/develop.exs
@@ -0,0 +1,32 @@
+use Mix.Config
+
+# For development, we disable any cache and enable
+# debugging and code reloading.
+#
+# The watchers configuration can be used to run external
+# watchers to your application. For example, we use it
+# with brunch.io to recompile .js and .css sources.
+config :adpq, Adpq.Endpoint,
+ http: [port: {:system, "PORT"}],
+ debug_errors: true,
+ check_origin: false,
+ cache_static_manifest: "priv/static/manifest.json"
+
+
+# Do not include metadata nor timestamps in development logs
+config :logger, :console, format: "[$level] $message\n"
+
+# Configure your database
+config :adpq, Adpq.Repo,
+ adapter: Ecto.Adapters.Postgres,
+ username: "adpq_develop",
+ password: System.get_env("RDS_PASSWORD"),
+ database: "adpq_develop",
+ hostname: "adpq-develop.cuhwr9egpxgb.us-west-1.rds.amazonaws.com",
+ pool_size: 10
+
+config :adpq, Adpq.Endpoint,
+ secret_key_base: "Y8xMqKI4RKA19P9K3CG4AnaYtf1eu8GqTmZyxMlluiyV12j/3Nki+WC83S9e3XVe"
+
+# Honeybadger
+config :honeybadger, environment_name: :staging
\ No newline at end of file
diff --git a/config/prod.exs b/config/prod.exs
index c8e487d..96c941a 100644
--- a/config/prod.exs
+++ b/config/prod.exs
@@ -13,49 +13,22 @@ use Mix.Config
# which you typically run after static files are built.
config :adpq, Adpq.Endpoint,
http: [port: {:system, "PORT"}],
- url: [host: "example.com", port: 80],
cache_static_manifest: "priv/static/manifest.json"
# Do not print debug messages in production
config :logger, level: :info
-# ## SSL Support
-#
-# To get SSL working, you will need to add the `https` key
-# to the previous section and set your `:url` port to 443:
-#
-# config :adpq, Adpq.Endpoint,
-# ...
-# url: [host: "example.com", port: 443],
-# https: [port: 443,
-# keyfile: System.get_env("SOME_APP_SSL_KEY_PATH"),
-# certfile: System.get_env("SOME_APP_SSL_CERT_PATH")]
-#
-# Where those two env variables return an absolute path to
-# the key and cert in disk or a relative path inside priv,
-# for example "priv/ssl/server.key".
-#
-# We also recommend setting `force_ssl`, ensuring no data is
-# ever sent via http, always redirecting to https:
-#
-# config :adpq, Adpq.Endpoint,
-# force_ssl: [hsts: true]
-#
-# Check `Plug.SSL` for all available options in `force_ssl`.
+# Configure your database
+config :adpq, Adpq.Repo,
+ adapter: Ecto.Adapters.Postgres,
+ username: "adpq_production",
+ password: System.get_env("RDS_PASSWORD"),
+ database: "adpq_production",
+ hostname: "adpq-production.cuhwr9egpxgb.us-west-1.rds.amazonaws.com",
+ pool_size: 10
-# ## Using releases
-#
-# If you are doing OTP releases, you need to instruct Phoenix
-# to start the server for all endpoints:
-#
-# config :phoenix, :serve_endpoints, true
-#
-# Alternatively, you can configure exactly which server to
-# start per endpoint:
-#
-# config :adpq, Adpq.Endpoint, server: true
-#
+config :adpq, Adpq.Endpoint,
+ secret_key_base: "Y8xMqKI4RKA19P9K3CG4AnaYtf1eu8GqTmZyxMlluiyV12j/3Nki+WC83S9e3XVe"
-# Finally import the config/prod.secret.exs
-# which should be versioned separately.
-import_config "prod.secret.exs"
+# Honeybadger
+config :honeybadger, environment_name: :production
\ No newline at end of file
diff --git a/config/test.exs b/config/test.exs
index 4e85081..7d7729d 100644
--- a/config/test.exs
+++ b/config/test.exs
@@ -12,8 +12,18 @@ config :logger, level: :warn
# Configure your database
config :adpq, Adpq.Repo,
adapter: Ecto.Adapters.Postgres,
- username: "postgres",
- password: "postgres",
+ username: "adpq",
+ password: "",
database: "adpq_test",
hostname: "localhost",
pool: Ecto.Adapters.SQL.Sandbox
+
+report_path = case System.get_env("CIRCLE_TEST_REPORTS") do
+ nil -> "_build"
+ path -> path
+end
+
+# Honeybadger
+config :honeybadger, environment_name: :test
+
+config :junit_formatter, report_dir: "#{report_path}/test"
\ No newline at end of file
diff --git a/docs/ADPQ-PrototypeA-Architecture.graffle/data.plist b/docs/ADPQ-PrototypeA-Architecture.graffle/data.plist
new file mode 100644
index 0000000..41d0550
--- /dev/null
+++ b/docs/ADPQ-PrototypeA-Architecture.graffle/data.plist
@@ -0,0 +1,2145 @@
+
+
+
+
+ ActiveLayerIndex
+ 0
+ ApplicationVersion
+
+ com.omnigroup.OmniGrafflePro
+ 139.18.0.187838
+
+ AutoAdjust
+
+ BackgroundGraphic
+
+ Bounds
+ {{0, 0}, {575.99997234344482, 733}}
+ Class
+ SolidGraphic
+ ID
+ 2
+ Style
+
+ shadow
+
+ Draws
+ NO
+
+ stroke
+
+ Draws
+ NO
+
+
+
+ BaseZoom
+ 0
+ CanvasOrigin
+ {0, 0}
+ ColumnAlign
+ 1
+ ColumnSpacing
+ 36
+ CreationDate
+ 2014-06-20 19:20:21 +0000
+ Creator
+ Matthew Wilson
+ DisplayScale
+ 1 0/72 in = 1.0000 in
+ GraphDocumentVersion
+ 8
+ GraphicsList
+
+
+ Class
+ LineGraphic
+ Head
+
+ ID
+ 672
+
+ ID
+ 359
+ Points
+
+ {256.92655906999681, 285.40788450487605}
+ {257.36120086424222, 328.18854114246983}
+
+ Style
+
+ stroke
+
+ HeadArrow
+ FilledArrow
+ Legacy
+
+ LineType
+ 1
+ TailArrow
+ 0
+
+
+ Tail
+
+ ID
+ 681
+
+
+
+ Class
+ LineGraphic
+ Head
+
+ ID
+ 681
+
+ ID
+ 183
+ Points
+
+ {137.9544327969347, 204.99158077959675}
+ {212.89358073030144, 242.54558980511453}
+
+ Style
+
+ stroke
+
+ HeadArrow
+ FilledArrow
+ Legacy
+
+ LineType
+ 1
+ TailArrow
+ 0
+
+
+ Tail
+
+ ID
+ 628
+
+
+
+ Class
+ LineGraphic
+ Head
+
+ ID
+ 686
+
+ ID
+ 382
+ Points
+
+ {211.2508078150482, 352.05452703344866}
+ {82.829852314728384, 352.72220809435589}
+
+ Style
+
+ stroke
+
+ HeadArrow
+ FilledArrow
+ Legacy
+
+ LineType
+ 1
+ TailArrow
+ 0
+
+
+ Tail
+
+ ID
+ 672
+
+
+
+ Class
+ LineGraphic
+ Head
+
+ ID
+ 175
+
+ ID
+ 61
+ Points
+
+ {297.8086685530912, 328.43717781220374}
+ {408.66953012761462, 263.97425128047462}
+
+ Style
+
+ stroke
+
+ HeadArrow
+ FilledArrow
+ HopLines
+
+ HopType
+ 1
+ Legacy
+
+ LineType
+ 1
+ TailArrow
+ 0
+
+
+ Tail
+
+ ID
+ 672
+
+
+
+ Class
+ LineGraphic
+ Head
+
+ ID
+ 638
+
+ ID
+ 639
+ Points
+
+ {303.96302434220064, 351.0732434264666}
+ {410.42434860145045, 349.37313863262534}
+
+ Style
+
+ stroke
+
+ HeadArrow
+ FilledArrow
+ Legacy
+
+ LineType
+ 1
+ TailArrow
+ 0
+
+
+ Tail
+
+ ID
+ 672
+
+
+
+ Class
+ Group
+ Graphics
+
+
+ Bounds
+ {{358.19343566894531, 456.3473949432373}, {25, 14}}
+ Class
+ ShapedGraphic
+ FitText
+ YES
+ Flow
+ Resize
+ ID
+ 670
+ Shape
+ Rectangle
+ Style
+
+ fill
+
+ Draws
+ NO
+
+ shadow
+
+ Draws
+ NO
+
+ stroke
+
+ Draws
+ NO
+
+
+ Text
+
+ Pad
+ 0
+ Text
+ {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf760
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+{\*\expandedcolortbl;;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 VPC}
+ VerticalPad
+ 0
+
+ Wrap
+ NO
+
+
+ Class
+ Group
+ Graphics
+
+
+ Bounds
+ {{211.75080108642578, 328.68851407368982}, {91.712287003347427, 46.25}}
+ Class
+ ShapedGraphic
+ ID
+ 672
+ Shape
+ Rectangle
+ Text
+
+ Text
+ {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf760
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+{\*\expandedcolortbl;;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 Carts, Orders, Admin\
+API (Phoenix )}
+
+
+
+ Bounds
+ {{204.05387115478516, 335.32073911031091}, {91.712287003347427, 46.25}}
+ Class
+ ShapedGraphic
+ ID
+ 673
+ Shape
+ Rectangle
+
+
+ Bounds
+ {{96.49652099609375, 328.68854077657068}, {107.55735778808594, 14}}
+ Class
+ ShapedGraphic
+ FitText
+ Vertical
+ Flow
+ Resize
+ ID
+ 674
+ Shape
+ Rectangle
+ Style
+
+ fill
+
+ Draws
+ NO
+
+ shadow
+
+ Draws
+ NO
+
+ stroke
+
+ Draws
+ NO
+
+
+ Text
+
+ Pad
+ 0
+ Text
+ {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf760
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+{\*\expandedcolortbl;;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 Web app}
+ VerticalPad
+ 0
+
+
+
+ ID
+ 671
+
+
+ Class
+ Group
+ Graphics
+
+
+ Bounds
+ {{316.60851928654586, 406.0490550994873}, {32.078519974175137, 21.298351385272746}}
+ Class
+ ShapedGraphic
+ ID
+ 676
+ ImageID
+ 4
+ Shape
+ Rectangle
+ Style
+
+ fill
+
+ Draws
+ NO
+
+ shadow
+
+ Draws
+ NO
+
+ stroke
+
+ Draws
+ NO
+
+
+
+
+ Bounds
+ {{298.66924619674671, 392.0490550994873}, {27, 14}}
+ Class
+ ShapedGraphic
+ FitText
+ Vertical
+ Flow
+ Resize
+ ID
+ 677
+ Shape
+ Rectangle
+ Style
+
+ fill
+
+ Draws
+ NO
+
+ shadow
+
+ Draws
+ NO
+
+ stroke
+
+ Draws
+ NO
+
+
+ Text
+
+ Pad
+ 0
+ Text
+ {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf760
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+{\*\expandedcolortbl;;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 ECS}
+ VerticalPad
+ 0
+
+
+
+ Bounds
+ {{189.16926002502419, 313.0490550994873}, {143, 98.119915604153704}}
+ Class
+ ShapedGraphic
+ ID
+ 678
+ Shape
+ Rectangle
+
+
+ ID
+ 675
+
+
+ Class
+ Group
+ Graphics
+
+
+ Bounds
+ {{294.26332509422474, 276.76412010192871}, {39.106355310438055, 26.587697982788086}}
+ Class
+ ShapedGraphic
+ ID
+ 680
+ ImageID
+ 4
+ Shape
+ Rectangle
+ Style
+
+ fill
+
+ Draws
+ NO
+
+ shadow
+
+ Draws
+ NO
+
+ stroke
+
+ Draws
+ NO
+
+
+
+
+ Bounds
+ {{204.48666715621883, 242.76412010192874}, {104.44145320260024, 42.1437901957433}}
+ Class
+ ShapedGraphic
+ ID
+ 681
+ Shape
+ Rectangle
+ Text
+
+ Text
+ {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf760
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+{\*\expandedcolortbl;;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 Elastic Load Balancer (ELB)}
+
+
+
+ ID
+ 679
+
+
+ Bounds
+ {{123.50288391113281, 232.82512855529785}, {271, 246.14056396484375}}
+ Class
+ ShapedGraphic
+ ID
+ 682
+ Shape
+ Rectangle
+
+
+ ID
+ 669
+
+
+ Class
+ Group
+ Graphics
+
+
+ Bounds
+ {{65.002920802169967, 360.92675616219634}, {31.493600193923779, 23.319122314453125}}
+ Class
+ ShapedGraphic
+ FontInfo
+
+ Font
+ Helvetica
+ Size
+ 12
+
+ ID
+ 685
+ ImageID
+ 4
+ Shape
+ Rectangle
+ Style
+
+ fill
+
+ Draws
+ NO
+
+ shadow
+
+ Draws
+ NO
+
+ stroke
+
+ Draws
+ NO
+
+
+
+
+ Bounds
+ {{14.999992370605469, 335.42260124161834}, {67.329864501953125, 34.891849517822266}}
+ Class
+ ShapedGraphic
+ ID
+ 686
+ Shape
+ Rectangle
+ Text
+
+ Text
+ {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf760
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+{\*\expandedcolortbl;;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 SMTP\
+(SES)}
+
+
+
+ ID
+ 684
+
+
+ Class
+ Group
+ Graphics
+
+
+ Bounds
+ {{444.21878011970352, 536.01868047507901}, {32.078519974175137, 21.298351385272746}}
+ Class
+ ShapedGraphic
+ ID
+ 648
+ ImageID
+ 4
+ Shape
+ Rectangle
+ Style
+
+ fill
+
+ Draws
+ NO
+
+ shadow
+
+ Draws
+ NO
+
+ stroke
+
+ Draws
+ NO
+
+
+
+
+ Class
+ Group
+ Graphics
+
+
+ Bounds
+ {{477.58229782548193, 513.03483061716918}, {95.417701964252373, 12.657886690563625}}
+ Class
+ ShapedGraphic
+ ID
+ 650
+ Shape
+ Rectangle
+ Style
+
+ fill
+
+ Draws
+ NO
+
+ shadow
+
+ Draws
+ NO
+
+ stroke
+
+ Draws
+ NO
+
+
+ Text
+
+ Align
+ 0
+ Pad
+ 0
+ Text
+ {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf760
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+{\*\expandedcolortbl;;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural
+
+\f0\fs24 \cf0 Docker images}
+ VerticalPad
+ 0
+
+
+
+ Bounds
+ {{408.66954019500776, 496}, {57.250616400034914, 48.823277235031128}}
+ Class
+ ShapedGraphic
+ ID
+ 651
+ Magnets
+
+ {0, 1}
+ {0, -1}
+ {1, 0}
+ {-1, 0}
+
+ Shape
+ Cylinder
+ Style
+
+ Text
+
+ Text
+ {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf760
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+{\*\expandedcolortbl;;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs20 \cf0 ECR}
+ VerticalPad
+ 0
+
+
+
+ ID
+ 649
+
+
+ ID
+ 647
+
+
+ Bounds
+ {{108, 112}, {45, 14}}
+ Class
+ ShapedGraphic
+ FitText
+ YES
+ Flow
+ Resize
+ ID
+ 646
+ Shape
+ Rectangle
+ Style
+
+ fill
+
+ Draws
+ NO
+
+ shadow
+
+ Draws
+ NO
+
+ stroke
+
+ Draws
+ NO
+
+
+ Text
+
+ Pad
+ 0
+ Text
+ {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf760
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+{\*\expandedcolortbl;;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\b\fs24 \cf0 Admins}
+ VerticalPad
+ 0
+
+ Wrap
+ NO
+
+
+ Class
+ Group
+ Graphics
+
+
+ Bounds
+ {{496.69857999682421, 384.24813255377541}, {31.493600193923779, 20.922168435325712}}
+ Class
+ ShapedGraphic
+ ID
+ 632
+ ImageID
+ 4
+ Shape
+ Rectangle
+ Style
+
+ fill
+
+ Draws
+ NO
+
+ shadow
+
+ Draws
+ NO
+
+ stroke
+
+ Draws
+ NO
+
+
+
+
+ Class
+ Group
+ Graphics
+
+
+ Class
+ Group
+ Graphics
+
+
+ Bounds
+ {{479.27274013745495, 356.78422285095627}, {85.84877734486524, 18.083333333333336}}
+ Class
+ ShapedGraphic
+ ID
+ 635
+ Shape
+ Rectangle
+ Style
+
+ fill
+
+ Draws
+ NO
+
+ shadow
+
+ Draws
+ NO
+
+ stroke
+
+ Draws
+ NO
+
+
+ Text
+
+ Pad
+ 0
+ VerticalPad
+ 0
+
+
+
+ Class
+ Group
+ Graphics
+
+
+ Bounds
+ {{477.55686574410925, 326.4898557748657}, {84.055008183523512, 46.25}}
+ Class
+ ShapedGraphic
+ ID
+ 637
+ Shape
+ Rectangle
+ Style
+
+ fill
+
+ Draws
+ NO
+
+ shadow
+
+ Draws
+ NO
+
+ stroke
+
+ Draws
+ NO
+
+
+ Text
+
+ Pad
+ 0
+ Text
+ {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf760
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+{\*\expandedcolortbl;;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 Items,\
+Carts,\
+Preferences,\
+Orders}
+ VerticalPad
+ 0
+
+
+
+ Bounds
+ {{410.42434860145045, 314.49813863262534}, {61.455593373397882, 69.750000000000014}}
+ Class
+ ShapedGraphic
+ ID
+ 638
+ Magnets
+
+ {0, 1}
+ {0, -1}
+ {1, 0}
+ {-1, 0}
+
+ Shape
+ Cylinder
+ Style
+
+ Text
+
+ Text
+ {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf760
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+{\*\expandedcolortbl;;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs20 \cf0 RDS\
+Postgres}
+ VerticalPad
+ 0
+
+
+
+ ID
+ 636
+
+
+ ID
+ 634
+
+
+ ID
+ 633
+
+
+ ID
+ 631
+
+
+ Class
+ Group
+ Graphics
+
+
+ Bounds
+ {{152.65840657552084, 175.42743257681531}, {67, 42}}
+ Class
+ ShapedGraphic
+ FitText
+ YES
+ Flow
+ Resize
+ ID
+ 627
+ Shape
+ Rectangle
+ Style
+
+ fill
+
+ Draws
+ NO
+
+ shadow
+
+ Draws
+ NO
+
+ stroke
+
+ Draws
+ NO
+
+
+ Text
+
+ Pad
+ 0
+ Text
+ {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf760
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+{\*\expandedcolortbl;;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 Online Store\
+\
+}
+ VerticalPad
+ 0
+
+ Wrap
+ NO
+
+
+ Bounds
+ {{51.042007446289062, 156.8469049818932}, {86.465413411458371, 52.511203765869141}}
+ Class
+ ShapedGraphic
+ ID
+ 628
+ Shape
+ Rectangle
+ Text
+
+ Text
+ {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf760
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+{\*\expandedcolortbl;;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 React.js single-page application}
+
+
+
+ ID
+ 626
+
+
+ Bounds
+ {{14.999992370605469, 706.93064880371094}, {270, 14}}
+ Class
+ ShapedGraphic
+ FitText
+ YES
+ Flow
+ Resize
+ ID
+ 520
+ Shape
+ Rectangle
+ Style
+
+ fill
+
+ Draws
+ NO
+
+ shadow
+
+ Draws
+ NO
+
+ stroke
+
+ Draws
+ NO
+
+
+ Text
+
+ Pad
+ 0
+ Text
+ {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf760
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+{\*\expandedcolortbl;;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 This symbol indicates a managed service on AWS.}
+ VerticalPad
+ 0
+
+ Wrap
+ NO
+
+
+ Bounds
+ {{288, 704.45885467529297}, {31.493600193923779, 18.943663276556247}}
+ Class
+ ShapedGraphic
+ ID
+ 518
+ ImageID
+ 4
+ Shape
+ Rectangle
+ Style
+
+ fill
+
+ Draws
+ NO
+
+ shadow
+
+ Draws
+ NO
+
+ stroke
+
+ Draws
+ NO
+
+
+
+
+ Class
+ LineGraphic
+ ID
+ 383
+ Points
+
+ {45.793931972513818, 334.92888370966062}
+ {22.333333333333332, 188.33333333333334}
+ {63.30853271484375, 122}
+
+ Style
+
+ stroke
+
+ HeadArrow
+ FilledArrow
+ Legacy
+
+ LineType
+ 1
+ TailArrow
+ 0
+
+
+ Tail
+
+ ID
+ 686
+
+
+
+ Class
+ Group
+ Graphics
+
+
+ Class
+ Group
+ Graphics
+
+
+ Bounds
+ {{92.670135498046875, 99.425238754344804}, {41.712287003347434, 9.5474915937943852}}
+ Class
+ ShapedGraphic
+ ID
+ 576
+ Shape
+ Rectangle
+ Style
+
+ fill
+
+ Draws
+ NO
+
+ shadow
+
+ Draws
+ NO
+
+ stroke
+
+ Draws
+ NO
+
+
+ Text
+
+ VerticalPad
+ 0
+
+
+
+ Class
+ Group
+ Graphics
+
+
+ AllowLabelDrop
+
+ Class
+ LineGraphic
+ ID
+ 578
+ Points
+
+ {127.43037466750309, 75.821717869686651}
+ {113.52627899972059, 75.821717869686651}
+
+ Style
+
+ stroke
+
+ HeadArrow
+ 0
+ Legacy
+
+ TailArrow
+ 0
+
+
+
+
+ AllowLabelDrop
+
+ Class
+ LineGraphic
+ ID
+ 579
+ Points
+
+ {113.52627899972055, 75.821717869686651}
+ {99.622183331938018, 75.821717869686651}
+
+ Style
+
+ stroke
+
+ HeadArrow
+ 0
+ Legacy
+
+ TailArrow
+ 0
+
+
+
+
+ AllowLabelDrop
+
+ Class
+ LineGraphic
+ ID
+ 580
+ Points
+
+ {113.52627899972063, 85.369209463481198}
+ {120.47832683361197, 99.690446854172791}
+
+ Style
+
+ stroke
+
+ HeadArrow
+ 0
+ Legacy
+
+ TailArrow
+ 0
+
+
+
+
+ AllowLabelDrop
+
+ Class
+ LineGraphic
+ ID
+ 581
+ Points
+
+ {113.52627899972059, 85.369209463481198}
+ {106.57423116582927, 99.690446854172791}
+
+ Style
+
+ stroke
+
+ HeadArrow
+ 0
+ Legacy
+
+ TailArrow
+ 0
+
+
+
+
+ AllowConnections
+ NO
+ AllowLabelDrop
+
+ AllowToConnect
+
+ Class
+ LineGraphic
+ ID
+ 582
+ Points
+
+ {113.52627899972066, 71.047972072789406}
+ {113.52627899972066, 85.369209463480956}
+
+ Style
+
+ stroke
+
+ HeadArrow
+ 0
+ Legacy
+
+ TailArrow
+ 0
+
+
+
+
+ Bounds
+ {{106.57423116582935, 61.500480478995001}, {13.904095667782487, 9.5474915937943798}}
+ Class
+ ShapedGraphic
+ ID
+ 583
+ Shape
+ Circle
+ Style
+
+
+
+ ID
+ 577
+
+
+ Bounds
+ {{92.670135498046875, 56.726734682097685}, {41.712287003347434, 52.511203765869134}}
+ Class
+ ShapedGraphic
+ ID
+ 584
+ Shape
+ Rectangle
+ Style
+
+ fill
+
+ Draws
+ NO
+
+ shadow
+
+ Draws
+ NO
+
+ stroke
+
+ Draws
+ NO
+
+
+
+
+ ID
+ 575
+
+
+ Class
+ Group
+ Graphics
+
+
+ Bounds
+ {{42.670135498046875, 100.50662982287918}, {41.712287003347434, 10.175395901750228}}
+ Class
+ ShapedGraphic
+ ID
+ 586
+ Shape
+ Rectangle
+ Style
+
+ fill
+
+ Draws
+ NO
+
+ shadow
+
+ Draws
+ NO
+
+ stroke
+
+ Draws
+ NO
+
+
+ Text
+
+ VerticalPad
+ 0
+
+
+
+ Class
+ Group
+ Graphics
+
+
+ AllowLabelDrop
+
+ Class
+ LineGraphic
+ ID
+ 588
+ Points
+
+ {77.430374667503145, 75.35078995466354}
+ {63.52627899972066, 75.35078995466354}
+
+ Style
+
+ stroke
+
+ HeadArrow
+ 0
+ Legacy
+
+ TailArrow
+ 0
+
+
+
+
+ AllowLabelDrop
+
+ Class
+ LineGraphic
+ ID
+ 589
+ Points
+
+ {63.526278999720617, 75.35078995466354}
+ {49.622183331938132, 75.35078995466354}
+
+ Style
+
+ stroke
+
+ HeadArrow
+ 0
+ Legacy
+
+ TailArrow
+ 0
+
+
+
+
+ AllowLabelDrop
+
+ Class
+ LineGraphic
+ ID
+ 590
+ Points
+
+ {63.526278999720716, 85.526185856413832}
+ {70.478326833612016, 100.78927970903916}
+
+ Style
+
+ stroke
+
+ HeadArrow
+ 0
+ Legacy
+
+ TailArrow
+ 0
+
+
+
+
+ AllowLabelDrop
+
+ Class
+ LineGraphic
+ ID
+ 591
+ Points
+
+ {63.526278999720631, 85.526185856413832}
+ {56.574231165829303, 100.78927970903916}
+
+ Style
+
+ stroke
+
+ HeadArrow
+ 0
+ Legacy
+
+ TailArrow
+ 0
+
+
+
+
+ AllowConnections
+ NO
+ AllowLabelDrop
+
+ AllowToConnect
+
+ Class
+ LineGraphic
+ ID
+ 592
+ Points
+
+ {63.526278999720674, 70.263092003788344}
+ {63.526278999720674, 85.52618585641369}
+
+ Style
+
+ stroke
+
+ HeadArrow
+ 0
+ Legacy
+
+ TailArrow
+ 0
+
+
+
+
+ Bounds
+ {{56.57423116582936, 60.087696102038066}, {13.904095667782487, 10.175395901750223}}
+ Class
+ ShapedGraphic
+ ID
+ 593
+ Shape
+ Circle
+ Style
+
+
+
+ ID
+ 587
+
+
+ Bounds
+ {{42.670135498046875, 54.999998151162799}, {41.712287003347434, 55.964677459626266}}
+ Class
+ ShapedGraphic
+ ID
+ 594
+ Shape
+ Rectangle
+ Style
+
+ fill
+
+ Draws
+ NO
+
+ shadow
+
+ Draws
+ NO
+
+ stroke
+
+ Draws
+ NO
+
+
+
+
+ ID
+ 585
+
+
+ Bounds
+ {{65.421410894051462, 134.17625047876027}, {46.209730946312121, 18.943663276556247}}
+ Class
+ ShapedGraphic
+ ID
+ 595
+ Shape
+ Rectangle
+ Style
+
+ fill
+
+ Draws
+ NO
+
+ shadow
+
+ Draws
+ NO
+
+ stroke
+
+ Draws
+ NO
+
+
+ Text
+
+ Text
+ {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf760
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+{\*\expandedcolortbl;;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\b\fs24 \cf0 Users}
+ VerticalPad
+ 0
+
+
+
+ Class
+ Group
+ Graphics
+
+
+ AllowLabelDrop
+
+ Class
+ LineGraphic
+ ID
+ 597
+ Points
+
+ {103.92952001597826, 103.56194328355427}
+ {88.526276367207572, 103.56194328355427}
+
+ Style
+
+ stroke
+
+ HeadArrow
+ 0
+ Legacy
+
+ TailArrow
+ 0
+
+
+
+
+ AllowLabelDrop
+
+ Class
+ LineGraphic
+ ID
+ 598
+ Points
+
+ {88.526276367207572, 103.56194328355427}
+ {73.123032718436889, 103.56194328355427}
+
+ Style
+
+ stroke
+
+ HeadArrow
+ 0
+ Legacy
+
+ TailArrow
+ 0
+
+
+
+
+ AllowLabelDrop
+
+ Class
+ LineGraphic
+ ID
+ 599
+ Points
+
+ {88.526276367207402, 113.93657529866756}
+ {88.685096740722656, 116.81267925332746}
+ {96.227898191592828, 129.49852332133764}
+
+ Style
+
+ stroke
+
+ HeadArrow
+ 0
+ Legacy
+
+ TailArrow
+ 0
+
+
+
+
+ AllowLabelDrop
+
+ Class
+ LineGraphic
+ ID
+ 600
+ Points
+
+ {88.52627636720743, 113.93657529866756}
+ {80.824654542822117, 129.49852332133764}
+
+ Style
+
+ stroke
+
+ HeadArrow
+ 0
+ Legacy
+
+ TailArrow
+ 0
+
+
+
+
+ AllowConnections
+ NO
+ AllowLabelDrop
+
+ AllowToConnect
+
+ Class
+ LineGraphic
+ ID
+ 601
+ Points
+
+ {88.526276367207501, 98.374627275997554}
+ {88.526276367207501, 113.93657529866766}
+
+ Style
+
+ stroke
+
+ HeadArrow
+ 0
+ Legacy
+
+ TailArrow
+ 0
+
+
+
+
+ Bounds
+ {{80.824654542822159, 87.999995260884148}, {15.40324364877071, 10.374632015113367}}
+ Class
+ ShapedGraphic
+ ID
+ 602
+ Shape
+ Circle
+ Style
+
+
+
+ ID
+ 596
+
+
+ ID
+ 574
+
+
+ Class
+ Group
+ Graphics
+
+
+ Bounds
+ {{432.0543769452139, 278.85579509848407}, {32.078519974175137, 21.298351385272746}}
+ Class
+ ShapedGraphic
+ ID
+ 170
+ ImageID
+ 4
+ Shape
+ Rectangle
+ Style
+
+ fill
+
+ Draws
+ NO
+
+ shadow
+
+ Draws
+ NO
+
+ stroke
+
+ Draws
+ NO
+
+
+
+
+ Class
+ Group
+ Graphics
+
+
+ Bounds
+ {{474.27842088587363, 256.37820933904499}, {90.843115263876413, 13.034070859221325}}
+ Class
+ ShapedGraphic
+ ID
+ 172
+ Shape
+ Rectangle
+ Style
+
+ fill
+
+ Draws
+ NO
+
+ shadow
+
+ Draws
+ NO
+
+ stroke
+
+ Draws
+ NO
+
+
+ Text
+
+ Align
+ 0
+ Pad
+ 0
+ Text
+ {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf760
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+{\*\expandedcolortbl;;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural
+
+\f0\fs24 \cf0 Attachments:\
+Product Images, Logs}
+ VerticalPad
+ 0
+
+
+
+ Bounds
+ {{408.66953012761462, 238.83711462340494}, {54.505864608904545, 50.274273314139393}}
+ Class
+ ShapedGraphic
+ ID
+ 175
+ Magnets
+
+ {0, 1}
+ {0, -1}
+ {1, 0}
+ {-1, 0}
+
+ Shape
+ Cylinder
+ Style
+
+ Text
+
+ Text
+ {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf760
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+{\*\expandedcolortbl;;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs20 \cf0 S3}
+ VerticalPad
+ 0
+
+
+
+ ID
+ 171
+
+
+ ID
+ 169
+
+
+ Bounds
+ {{141.53340345134507, 48}, {271, 87}}
+ Class
+ ShapedGraphic
+ FitText
+ Vertical
+ Flow
+ Resize
+ FontInfo
+
+ Font
+ Helvetica
+ Size
+ 18
+
+ ID
+ 22
+ Shape
+ Rectangle
+ Style
+
+ fill
+
+ Draws
+ NO
+
+ shadow
+
+ Draws
+ NO
+
+ stroke
+
+ Draws
+ NO
+
+
+ Text
+
+ Pad
+ 0
+ Text
+ {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf760
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+{\*\expandedcolortbl;;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs48 \cf0 ADPQ Prototype A \
+Architecture\
+}
+ VerticalPad
+ 0
+
+
+
+ GridInfo
+
+ GuidesLocked
+ NO
+ GuidesVisible
+ YES
+ HPages
+ 1
+ ImageCounter
+ 14
+ ImageLinkBack
+
+
+
+ ImageList
+
+ image4.tiff
+
+ KeepToScale
+
+ Layers
+
+
+ Lock
+ NO
+ Name
+ Layer 1
+ Print
+ YES
+ View
+ YES
+
+
+ LayoutInfo
+
+ Animate
+ NO
+ circoMinDist
+ 18
+ circoSeparation
+ 0.0
+ layoutEngine
+ dot
+ neatoSeparation
+ 0.0
+ twopiSeparation
+ 0.0
+
+ LinksVisible
+ NO
+ MagnetsVisible
+ NO
+ MasterSheets
+
+ ModificationDate
+ 2017-02-21 22:11:42 +0000
+ Modifier
+ Matthew Wilson
+ NotesVisible
+ NO
+ Orientation
+ 2
+ OriginVisible
+ NO
+ PageBreaks
+ YES
+ PrintInfo
+
+ NSBottomMargin
+
+ float
+ 41
+
+ NSHorizonalPagination
+
+ coded
+ BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwCG
+
+ NSLeftMargin
+
+ float
+ 18
+
+ NSPaperSize
+
+ size
+ {611.99997234344482, 792}
+
+ NSPrintReverseOrientation
+
+ int
+ 0
+
+ NSRightMargin
+
+ float
+ 18
+
+ NSTopMargin
+
+ float
+ 18
+
+
+ PrintOnePage
+
+ ReadOnly
+ NO
+ RowAlign
+ 1
+ RowSpacing
+ 36
+ SheetTitle
+ AWS architecture
+ SmartAlignmentGuidesActive
+ YES
+ SmartDistanceGuidesActive
+ YES
+ UniqueID
+ 1
+ UseEntirePage
+
+ VPages
+ 1
+ WindowInfo
+
+ CurrentSheet
+ 0
+ ExpandedCanvases
+
+
+ name
+ AWS architecture
+
+
+ Frame
+ {{753, 177}, {1168, 906}}
+ ListView
+
+ OutlineWidth
+ 142
+ RightSidebar
+
+ ShowRuler
+
+ Sidebar
+
+ SidebarWidth
+ 120
+ VisibleRegion
+ {{-357.99999999999994, -110.00000000000001}, {1291.2499807588761, 954.99998576939129}}
+ Zoom
+ 0.80000001192092896
+ ZoomValues
+
+
+ AWS architecture
+ 0.80000001192092896
+ 0.5
+
+
+
+
+
diff --git a/docs/ADPQ-PrototypeA-Architecture.graffle/image4.tiff b/docs/ADPQ-PrototypeA-Architecture.graffle/image4.tiff
new file mode 100644
index 0000000..a32e2da
Binary files /dev/null and b/docs/ADPQ-PrototypeA-Architecture.graffle/image4.tiff differ
diff --git a/docs/ADPQ-PrototypeA-Architecture.png b/docs/ADPQ-PrototypeA-Architecture.png
new file mode 100644
index 0000000..482c779
Binary files /dev/null and b/docs/ADPQ-PrototypeA-Architecture.png differ
diff --git a/docs/Collaboration work sample - InVision comments.jpeg b/docs/Collaboration work sample - InVision comments.jpeg
new file mode 100644
index 0000000..6aef55a
Binary files /dev/null and b/docs/Collaboration work sample - InVision comments.jpeg differ
diff --git a/docs/Collaboration work sample - Slack conversation.jpeg b/docs/Collaboration work sample - Slack conversation.jpeg
new file mode 100644
index 0000000..cc8f1aa
Binary files /dev/null and b/docs/Collaboration work sample - Slack conversation.jpeg differ
diff --git a/docs/InVision Clickable Prototype.pdf b/docs/InVision Clickable Prototype.pdf
new file mode 100644
index 0000000..ce07cb2
Binary files /dev/null and b/docs/InVision Clickable Prototype.pdf differ
diff --git a/docs/Product Speclet.pdf b/docs/Product Speclet.pdf
new file mode 100644
index 0000000..e88bc06
Binary files /dev/null and b/docs/Product Speclet.pdf differ
diff --git a/docs/Prototype A Kickoff deck.pdf b/docs/Prototype A Kickoff deck.pdf
new file mode 100644
index 0000000..1d76da7
Binary files /dev/null and b/docs/Prototype A Kickoff deck.pdf differ
diff --git a/docs/Sample whiteboarding 02.14.17.jpg b/docs/Sample whiteboarding 02.14.17.jpg
new file mode 100644
index 0000000..debc83e
Binary files /dev/null and b/docs/Sample whiteboarding 02.14.17.jpg differ
diff --git a/docs/Sample whiteboarding 1 - 02.16.17.jpg b/docs/Sample whiteboarding 1 - 02.16.17.jpg
new file mode 100644
index 0000000..2c99b57
Binary files /dev/null and b/docs/Sample whiteboarding 1 - 02.16.17.jpg differ
diff --git a/docs/Sample whiteboarding 2 - 02.16.17.jpg b/docs/Sample whiteboarding 2 - 02.16.17.jpg
new file mode 100644
index 0000000..2904e5d
Binary files /dev/null and b/docs/Sample whiteboarding 2 - 02.16.17.jpg differ
diff --git a/docs/Service Map 02.16.17.png b/docs/Service Map 02.16.17.png
new file mode 100644
index 0000000..af86c3b
Binary files /dev/null and b/docs/Service Map 02.16.17.png differ
diff --git a/docs/interviews/00TemplateOpen-endedInterviewScriptforRequester.pdf b/docs/interviews/00TemplateOpen-endedInterviewScriptforRequester.pdf
new file mode 100644
index 0000000..6bd9eac
Binary files /dev/null and b/docs/interviews/00TemplateOpen-endedInterviewScriptforRequester.pdf differ
diff --git a/docs/interviews/Interview1.1DennisBaker-StateAssemblyReprographicsManager.pdf b/docs/interviews/Interview1.1DennisBaker-StateAssemblyReprographicsManager.pdf
new file mode 100644
index 0000000..d0e9c1e
Binary files /dev/null and b/docs/interviews/Interview1.1DennisBaker-StateAssemblyReprographicsManager.pdf differ
diff --git a/docs/interviews/Interview2.1RobertLee-StartupOfficeManager.pdf b/docs/interviews/Interview2.1RobertLee-StartupOfficeManager.pdf
new file mode 100644
index 0000000..81585ad
Binary files /dev/null and b/docs/interviews/Interview2.1RobertLee-StartupOfficeManager.pdf differ
diff --git a/docs/interviews/Interview2.2RobertLeeConceptTest.pdf b/docs/interviews/Interview2.2RobertLeeConceptTest.pdf
new file mode 100644
index 0000000..090c642
Binary files /dev/null and b/docs/interviews/Interview2.2RobertLeeConceptTest.pdf differ
diff --git a/docs/interviews/Interview3.1NedHolets-CMSDeveloper.pdf b/docs/interviews/Interview3.1NedHolets-CMSDeveloper.pdf
new file mode 100644
index 0000000..89221bf
Binary files /dev/null and b/docs/interviews/Interview3.1NedHolets-CMSDeveloper.pdf differ
diff --git a/docs/personas/00FullPersonasList.pdf b/docs/personas/00FullPersonasList.pdf
new file mode 100644
index 0000000..e6381fe
Binary files /dev/null and b/docs/personas/00FullPersonasList.pdf differ
diff --git a/docs/personas/01StateAgencyRequesterPersona.pdf b/docs/personas/01StateAgencyRequesterPersona.pdf
new file mode 100644
index 0000000..55d1bfe
Binary files /dev/null and b/docs/personas/01StateAgencyRequesterPersona.pdf differ
diff --git a/docs/personas/02DataAdminPersona.pdf b/docs/personas/02DataAdminPersona.pdf
new file mode 100644
index 0000000..d57a3c2
Binary files /dev/null and b/docs/personas/02DataAdminPersona.pdf differ
diff --git a/docs/research/RelevanteCommerceUsabilityGuidelines.pdf b/docs/research/RelevanteCommerceUsabilityGuidelines.pdf
new file mode 100644
index 0000000..532f6d5
Binary files /dev/null and b/docs/research/RelevanteCommerceUsabilityGuidelines.pdf differ
diff --git a/docs/research/ShoppingandProcurementResearch.pdf b/docs/research/ShoppingandProcurementResearch.pdf
new file mode 100644
index 0000000..da2700e
Binary files /dev/null and b/docs/research/ShoppingandProcurementResearch.pdf differ
diff --git a/docs/retrospective/Retrospective 02.16.2017.pdf b/docs/retrospective/Retrospective 02.16.2017.pdf
new file mode 100644
index 0000000..42a250e
Binary files /dev/null and b/docs/retrospective/Retrospective 02.16.2017.pdf differ
diff --git a/docs/retrospective/Retrospective 02.23.2017.pdf b/docs/retrospective/Retrospective 02.23.2017.pdf
new file mode 100644
index 0000000..12f6997
Binary files /dev/null and b/docs/retrospective/Retrospective 02.23.2017.pdf differ
diff --git a/docs/wireframes/00.00.00 Sign in.png b/docs/wireframes/00.00.00 Sign in.png
new file mode 100644
index 0000000..09fdf56
Binary files /dev/null and b/docs/wireframes/00.00.00 Sign in.png differ
diff --git a/docs/wireframes/1.00.00 Home.png b/docs/wireframes/1.00.00 Home.png
new file mode 100644
index 0000000..367e636
Binary files /dev/null and b/docs/wireframes/1.00.00 Home.png differ
diff --git a/docs/wireframes/1.00.01 Home Menu.png b/docs/wireframes/1.00.01 Home Menu.png
new file mode 100644
index 0000000..ca1b7a2
Binary files /dev/null and b/docs/wireframes/1.00.01 Home Menu.png differ
diff --git a/docs/wireframes/2.00.00 Category Show List.png b/docs/wireframes/2.00.00 Category Show List.png
new file mode 100644
index 0000000..6e25557
Binary files /dev/null and b/docs/wireframes/2.00.00 Category Show List.png differ
diff --git a/docs/wireframes/2.10.00 Category Hide List.png b/docs/wireframes/2.10.00 Category Hide List.png
new file mode 100644
index 0000000..d946c75
Binary files /dev/null and b/docs/wireframes/2.10.00 Category Hide List.png differ
diff --git a/docs/wireframes/2.20.00 Category Filter.png b/docs/wireframes/2.20.00 Category Filter.png
new file mode 100644
index 0000000..59f5aa6
Binary files /dev/null and b/docs/wireframes/2.20.00 Category Filter.png differ
diff --git a/docs/wireframes/2.20.01 Category Filter.png b/docs/wireframes/2.20.01 Category Filter.png
new file mode 100644
index 0000000..9ffb0ac
Binary files /dev/null and b/docs/wireframes/2.20.01 Category Filter.png differ
diff --git a/docs/wireframes/3.00.00 Detail.png b/docs/wireframes/3.00.00 Detail.png
new file mode 100644
index 0000000..f7fac3a
Binary files /dev/null and b/docs/wireframes/3.00.00 Detail.png differ
diff --git a/docs/wireframes/4.00.00 Upgrades.png b/docs/wireframes/4.00.00 Upgrades.png
new file mode 100644
index 0000000..296c7d8
Binary files /dev/null and b/docs/wireframes/4.00.00 Upgrades.png differ
diff --git a/docs/wireframes/5.00.00 Cart.png b/docs/wireframes/5.00.00 Cart.png
new file mode 100644
index 0000000..72a048c
Binary files /dev/null and b/docs/wireframes/5.00.00 Cart.png differ
diff --git a/docs/wireframes/6.00.00 Upgrades Added.png b/docs/wireframes/6.00.00 Upgrades Added.png
new file mode 100644
index 0000000..c2ea254
Binary files /dev/null and b/docs/wireframes/6.00.00 Upgrades Added.png differ
diff --git a/docs/wireframes/7.00.00 Account Orders.png b/docs/wireframes/7.00.00 Account Orders.png
new file mode 100644
index 0000000..c66d413
Binary files /dev/null and b/docs/wireframes/7.00.00 Account Orders.png differ
diff --git a/docs/wireframes/7.10.00 Account Order Detail.png b/docs/wireframes/7.10.00 Account Order Detail.png
new file mode 100644
index 0000000..63e37dc
Binary files /dev/null and b/docs/wireframes/7.10.00 Account Order Detail.png differ
diff --git a/lib/adpq.ex b/lib/adpq.ex
index 82a0e27..0f719e4 100644
--- a/lib/adpq.ex
+++ b/lib/adpq.ex
@@ -1,6 +1,9 @@
defmodule Adpq do
use Application
+ alias Adpq.Endpoint
+ @moduledoc false
+
# See http://elixir-lang.org/docs/stable/elixir/Application.html
# for more information on OTP Applications
def start(_type, _args) do
@@ -25,7 +28,7 @@ defmodule Adpq do
# Tell Phoenix to update the endpoint configuration
# whenever the application is updated.
def config_change(changed, _new, removed) do
- Adpq.Endpoint.config_change(changed, removed)
+ Endpoint.config_change(changed, removed)
:ok
end
end
diff --git a/lib/adpq/endpoint.ex b/lib/adpq/endpoint.ex
index 6cdd08a..43ea2f8 100644
--- a/lib/adpq/endpoint.ex
+++ b/lib/adpq/endpoint.ex
@@ -9,7 +9,8 @@ defmodule Adpq.Endpoint do
# when deploying your static files in production.
plug Plug.Static,
at: "/", from: :adpq, gzip: false,
- only: ~w(css fonts images js favicon.ico robots.txt)
+ only: ~w(css fonts img images js favicon.ico robots.txt swagger.json),
+ headers: %{"Access-Control-Allow-Origin" => "*"}
# Code reloading can be explicitly enabled under the
# :code_reloader configuration of your endpoint.
@@ -38,5 +39,6 @@ defmodule Adpq.Endpoint do
key: "_adpq_key",
signing_salt: "R3qLN8KP"
+ plug Corsica, origins: "*", allow_headers: ["authorization", "content-type"]
plug Adpq.Router
end
diff --git a/lib/auth_helpers.ex b/lib/auth_helpers.ex
new file mode 100644
index 0000000..00779af
--- /dev/null
+++ b/lib/auth_helpers.ex
@@ -0,0 +1,13 @@
+defmodule Adpq.AuthHelpers do
+ alias Plug.Conn
+
+ @moduledoc """
+ Helper functions for authn/authz
+ """
+
+ def unauthorized(conn) do
+ conn
+ |> Conn.send_resp(:unauthorized, "")
+ |> Conn.halt()
+ end
+end
diff --git a/lib/ensure_admin.ex b/lib/ensure_admin.ex
new file mode 100644
index 0000000..8c3e802
--- /dev/null
+++ b/lib/ensure_admin.ex
@@ -0,0 +1,17 @@
+defmodule Adpq.EnsureAdmin do
+ alias Adpq.AuthHelpers
+ alias Adpq.User
+
+ @moduledoc """
+ A plug that checks if the authenticated user is an admin
+ """
+
+ def init(opts), do: opts
+
+ def call(conn, _) do
+ case Map.get(conn.assigns, :user) do
+ %User{role: "ADMIN"} -> conn
+ _ -> AuthHelpers.unauthorized(conn)
+ end
+ end
+end
diff --git a/lib/ensure_user.ex b/lib/ensure_user.ex
new file mode 100644
index 0000000..d44ba20
--- /dev/null
+++ b/lib/ensure_user.ex
@@ -0,0 +1,17 @@
+defmodule Adpq.EnsureUser do
+ alias Adpq.AuthHelpers
+ alias Adpq.User
+
+ @moduledoc """
+ A plug that checks if the authenticated user is an user
+ """
+
+ def init(opts), do: opts
+
+ def call(conn, _) do
+ case Map.get(conn.assigns, :user) do
+ %User{} -> conn
+ _ -> AuthHelpers.unauthorized(conn)
+ end
+ end
+end
diff --git a/lib/load_user.ex b/lib/load_user.ex
new file mode 100644
index 0000000..c865fc6
--- /dev/null
+++ b/lib/load_user.ex
@@ -0,0 +1,23 @@
+defmodule Adpq.LoadUser do
+ import Plug.Conn
+ import Ecto.Query
+ alias Adpq.{User, Repo}
+
+ @moduledoc """
+ A plug for loading the authorized user into the Conn
+ """
+
+ def init(opts), do: opts
+
+ def call(conn, _) do
+ case get_req_header(conn, "authorization") do
+ [auth | _] ->
+ user =
+ User
+ |> where([u], u.name == ^auth)
+ |> Repo.one
+ assign(conn, :user, user)
+ _ -> conn
+ end
+ end
+end
diff --git a/lib/queries/order_queries.ex b/lib/queries/order_queries.ex
new file mode 100644
index 0000000..c3c67cc
--- /dev/null
+++ b/lib/queries/order_queries.ex
@@ -0,0 +1,58 @@
+defmodule Adpq.OrderQueries do
+ import Ecto.Query
+
+ alias Adpq.{User, Order}
+
+ @moduledoc """
+ Ecto queries related to orders
+ """
+
+ def user_scope(user_id) do
+ where(User, [users], users.id == ^user_id)
+ end
+
+ def load_user_order(user_id, id) do
+ user_id
+ |> user_scope
+ |> with_order_items
+ |> where([users, orders, order_items, catalog_items], orders.id == ^id)
+ end
+
+ def with_order_items(query) do
+ query
+ |> join(:left, [users], orders in assoc(users, :orders))
+ |> join(:left, [users, orders], order_items in assoc(orders, :order_items))
+ |> join(:left, [users, orders, order_items], catalog_item in assoc(order_items, :catalog_item))
+ |> order_by([users, orders], desc: orders.inserted_at)
+ |> preload(
+ [users, orders, order_items, catalog_items],
+ [orders: {orders, order_items: {order_items, catalog_item: catalog_items}}]
+ )
+ end
+
+ def with_cart_items(query) do
+ query
+ |> join(:left, [users], cart_items in assoc(users, :cart_items))
+ |> join(:left, [users, cart_items], catalog_item in assoc(cart_items, :catalog_item))
+ |> preload(
+ [users, cart_items, catalog_items],
+ [cart_items: {cart_items, catalog_item: catalog_items}]
+ )
+ end
+
+ def find_with_items(id) do
+ where(orders_with_items(), [orders], orders.id == ^id)
+ end
+
+ def orders_with_items do
+ Order
+ |> join(:left, [orders], order_items in assoc(orders, :order_items))
+ |> join(:left, [orders, order_items], catalog_item in assoc(order_items, :catalog_item))
+ |> join(:left, [orders], user in assoc(orders, :user))
+ |> preload(
+ [orders, order_items, catalog_items, users],
+ [user: users, order_items: {order_items, catalog_item: catalog_items}]
+ )
+ |> order_by([orders], orders.updated_at)
+ end
+end
diff --git a/mix.exs b/mix.exs
index da4cf61..b1f8223 100644
--- a/mix.exs
+++ b/mix.exs
@@ -19,11 +19,12 @@ defmodule Adpq.Mixfile do
def application do
[mod: {Adpq, []},
applications: [:phoenix, :phoenix_pubsub, :phoenix_html, :cowboy, :logger, :gettext,
- :phoenix_ecto, :postgrex]]
+ :phoenix_ecto, :postgrex, :csv, :corsica, :honeybadger]]
end
# Specifies which paths to compile per environment.
defp elixirc_paths(:test), do: ["lib", "web", "test/support"]
+ defp elixirc_paths(:dev), do: ["lib", "web", "test/support"] # So we can have factories in iex
defp elixirc_paths(_), do: ["lib", "web"]
# Specifies your project dependencies.
@@ -37,7 +38,15 @@ defmodule Adpq.Mixfile do
{:phoenix_html, "~> 2.6"},
{:phoenix_live_reload, "~> 1.0", only: :dev},
{:gettext, "~> 0.11"},
- {:cowboy, "~> 1.0"}]
+ {:junit_formatter, "~> 1.2", only: :test},
+ {:cowboy, "~> 1.0"},
+ {:csv, "~> 1.4"},
+ {:phoenix_swagger, "~> 0.4.0"},
+ {:corsica, "~> 0.5"},
+ {:ex_machina, "~> 1.0", only: [:dev, :test]},
+ {:credo, "~> 0.5", only: [:dev, :test]},
+ {:honeybadger, "~> 0.1"}
+ ]
end
# Aliases are shortcuts or tasks specific to the current project.
diff --git a/mix.lock b/mix.lock
index 58f1195..78e5717 100644
--- a/mix.lock
+++ b/mix.lock
@@ -1,19 +1,35 @@
-%{"connection": {:hex, :connection, "1.0.4", "a1cae72211f0eef17705aaededacac3eb30e6625b04a6117c1b2db6ace7d5976", [:mix], []},
+%{"bunt": {:hex, :bunt, "0.2.0", "951c6e801e8b1d2cbe58ebbd3e616a869061ddadcc4863d0a2182541acae9a38", [:mix], []},
+ "certifi": {:hex, :certifi, "1.0.0", "1c787a85b1855ba354f0b8920392c19aa1d06b0ee1362f9141279620a5be2039", [:rebar3], []},
+ "connection": {:hex, :connection, "1.0.4", "a1cae72211f0eef17705aaededacac3eb30e6625b04a6117c1b2db6ace7d5976", [:mix], []},
+ "corsica": {:hex, :corsica, "0.5.0", "eb5b2fccc5bc4f31b8e2b77dd15f5f302aca5d63286c953e8e916f806056d50c", [:mix], [{:cowboy, ">= 1.0.0", [hex: :cowboy, optional: false]}, {:plug, ">= 0.9.0", [hex: :plug, optional: false]}]},
"cowboy": {:hex, :cowboy, "1.1.2", "61ac29ea970389a88eca5a65601460162d370a70018afe6f949a29dca91f3bb0", [:rebar3], [{:cowlib, "~> 1.0.2", [hex: :cowlib, optional: false]}, {:ranch, "~> 1.3.2", [hex: :ranch, optional: false]}]},
"cowlib": {:hex, :cowlib, "1.0.2", "9d769a1d062c9c3ac753096f868ca121e2730b9a377de23dec0f7e08b1df84ee", [:make], []},
- "db_connection": {:hex, :db_connection, "1.1.0", "b2b88db6d7d12f99997b584d09fad98e560b817a20dab6a526830e339f54cdb3", [:mix], [{:connection, "~> 1.0.2", [hex: :connection, optional: false]}, {:poolboy, "~> 1.5", [hex: :poolboy, optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, optional: true]}]},
+ "credo": {:hex, :credo, "0.6.1", "a941e2591bd2bd2055dc92b810c174650b40b8290459c89a835af9d59ac4a5f8", [:mix], [{:bunt, "~> 0.2.0", [hex: :bunt, optional: false]}]},
+ "csv": {:hex, :csv, "1.4.4", "992f2e1418849a326fd1d9287801fa2d86091db4f9611f60781da6d236f64cd4", [:mix], [{:parallel_stream, "~> 1.0.4", [hex: :parallel_stream, optional: false]}]},
+ "db_connection": {:hex, :db_connection, "1.1.1", "f9d246e8f65b9490945cf7360875eee18fcec9a0115207603215eb1fd94c39ef", [:mix], [{:connection, "~> 1.0.2", [hex: :connection, optional: false]}, {:poolboy, "~> 1.5", [hex: :poolboy, optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, optional: true]}]},
"decimal": {:hex, :decimal, "1.3.1", "157b3cedb2bfcb5359372a7766dd7a41091ad34578296e951f58a946fcab49c6", [:mix], []},
"ecto": {:hex, :ecto, "2.1.3", "ffb24e150b519a4c0e4c84f9eabc8587199389bc499195d5d1a93cd3b2d9a045", [:mix], [{:db_connection, "~> 1.1", [hex: :db_connection, optional: true]}, {:decimal, "~> 1.2", [hex: :decimal, optional: false]}, {:mariaex, "~> 0.8.0", [hex: :mariaex, optional: true]}, {:poison, "~> 2.2 or ~> 3.0", [hex: :poison, optional: true]}, {:poolboy, "~> 1.5", [hex: :poolboy, optional: false]}, {:postgrex, "~> 0.13.0", [hex: :postgrex, optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, optional: true]}]},
+ "ex_machina": {:hex, :ex_machina, "1.0.2", "1cc49e1a09e3f7ab2ecb630c17f14c2872dc4ec145d6d05a9c3621936a63e34f", [:mix], [{:ecto, "~> 2.0", [hex: :ecto, optional: true]}]},
"fs": {:hex, :fs, "0.9.2", "ed17036c26c3f70ac49781ed9220a50c36775c6ca2cf8182d123b6566e49ec59", [:rebar], []},
"gettext": {:hex, :gettext, "0.13.1", "5e0daf4e7636d771c4c71ad5f3f53ba09a9ae5c250e1ab9c42ba9edccc476263", [:mix], []},
- "mime": {:hex, :mime, "1.0.1", "05c393850524767d13a53627df71beeebb016205eb43bfbd92d14d24ec7a1b51", [:mix], []},
+ "hackney": {:hex, :hackney, "1.6.6", "5564b4695d48fd87859e9df77a7fa4b4d284d24519f0cd7cc898f09e8fbdc8a3", [:rebar3], [{:certifi, "1.0.0", [hex: :certifi, optional: false]}, {:idna, "4.0.0", [hex: :idna, optional: false]}, {:metrics, "1.0.1", [hex: :metrics, optional: false]}, {:mimerl, "1.0.2", [hex: :mimerl, optional: false]}, {:ssl_verify_fun, "1.1.1", [hex: :ssl_verify_fun, optional: false]}]},
+ "honeybadger": {:hex, :honeybadger, "0.6.1", "1d5311cbb379b2c92e7ba6951980f3160d1acb794385fc07025f6db48929780f", [:mix], [{:httpoison, "~> 0.9", [hex: :httpoison, optional: false]}, {:plug, ">= 0.13.0 and < 2.0.0", [hex: :plug, optional: false]}, {:poison, ">= 1.4.0 and < 3.0.0", [hex: :poison, optional: false]}]},
+ "httpoison": {:hex, :httpoison, "0.11.0", "b9240a9c44fc46fcd8618d17898859ba09a3c1b47210b74316c0ffef10735e76", [:mix], [{:hackney, "~> 1.6.3", [hex: :hackney, optional: false]}]},
+ "idna": {:hex, :idna, "4.0.0", "10aaa9f79d0b12cf0def53038547855b91144f1bfcc0ec73494f38bb7b9c4961", [:rebar3], []},
+ "junit_formatter": {:hex, :junit_formatter, "1.3.0", "e4321e3275f48daecadb3116bc814e1a743645f2549c6526b1a32cd6c8dd1833", [:mix], []},
+ "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], []},
+ "mime": {:hex, :mime, "1.1.0", "01c1d6f4083d8aa5c7b8c246ade95139620ef8effb009edde934e0ec3b28090a", [:mix], []},
+ "mimerl": {:hex, :mimerl, "1.0.2", "993f9b0e084083405ed8252b99460c4f0563e41729ab42d9074fd5e52439be88", [:rebar3], []},
+ "parallel_stream": {:hex, :parallel_stream, "1.0.5", "4c78d3e675f9eff885cbe252c89a8fc1d2fb803c0d03a914281e587834e09431", [:mix], []},
"phoenix": {:hex, :phoenix, "1.2.1", "6dc592249ab73c67575769765b66ad164ad25d83defa3492dc6ae269bd2a68ab", [:mix], [{:cowboy, "~> 1.0", [hex: :cowboy, optional: true]}, {:phoenix_pubsub, "~> 1.0", [hex: :phoenix_pubsub, optional: false]}, {:plug, "~> 1.1", [hex: :plug, optional: false]}, {:poison, "~> 1.5 or ~> 2.0", [hex: :poison, optional: false]}]},
- "phoenix_ecto": {:hex, :phoenix_ecto, "3.2.1", "6cf11d590c61977f50fcb98ad8a10ee90ba8670a82cbf5eaf49cfaee2e95e8b7", [:mix], [{:ecto, "~> 2.1", [hex: :ecto, optional: false]}, {:phoenix_html, "~> 2.9", [hex: :phoenix_html, optional: false]}, {:plug, "~> 1.0", [hex: :plug, optional: false]}]},
+ "phoenix_ecto": {:hex, :phoenix_ecto, "3.2.2", "2e51c57614528b130d54019e78349f83a5b5d53b3b2ef775dbc30df7e1fecb45", [:mix], [{:ecto, "~> 2.1", [hex: :ecto, optional: false]}, {:phoenix_html, "~> 2.9", [hex: :phoenix_html, optional: false]}, {:plug, "~> 1.0", [hex: :plug, optional: false]}]},
"phoenix_html": {:hex, :phoenix_html, "2.9.3", "1b5a2122cbf743aa242f54dced8a4f1cc778b8bd304f4b4c0043a6250c58e258", [:mix], [{:plug, "~> 1.0", [hex: :plug, optional: false]}]},
"phoenix_live_reload": {:hex, :phoenix_live_reload, "1.0.8", "4333f9c74190f485a74866beff2f9304f069d53f047f5fbb0fb8d1ee4c495f73", [:mix], [{:fs, "~> 0.9.1", [hex: :fs, optional: false]}, {:phoenix, "~> 1.0 or ~> 1.2-rc", [hex: :phoenix, optional: false]}]},
"phoenix_pubsub": {:hex, :phoenix_pubsub, "1.0.1", "c10ddf6237007c804bf2b8f3c4d5b99009b42eca3a0dfac04ea2d8001186056a", [:mix], []},
- "plug": {:hex, :plug, "1.3.0", "6e2b01afc5db3fd011ca4a16efd9cb424528c157c30a44a0186bcc92c7b2e8f3", [:mix], [{:cowboy, "~> 1.0.1 or ~> 1.1", [hex: :cowboy, optional: true]}, {:mime, "~> 1.0", [hex: :mime, optional: false]}]},
+ "phoenix_swagger": {:hex, :phoenix_swagger, "0.4.2", "c9a5a583b9d1dcc7fdd844c9e4f304918ce0848bf254f5f84850bb116d27f3fe", [:mix], [{:ex_json_schema, "~> 0.5.1", [hex: :ex_json_schema, optional: true]}, {:plug, "~> 1.1", [hex: :plug, optional: false]}, {:poison, "~> 1.5 or ~> 2.0", [hex: :poison, optional: false]}]},
+ "plug": {:hex, :plug, "1.3.2", "8391d8ba2e2c187de069211110a882599e851f64550c556163b5130e1e2dbc1b", [:mix], [{:cowboy, "~> 1.0.1 or ~> 1.1", [hex: :cowboy, optional: true]}, {:mime, "~> 1.0", [hex: :mime, optional: false]}]},
"poison": {:hex, :poison, "2.2.0", "4763b69a8a77bd77d26f477d196428b741261a761257ff1cf92753a0d4d24a63", [:mix], []},
"poolboy": {:hex, :poolboy, "1.5.1", "6b46163901cfd0a1b43d692657ed9d7e599853b3b21b95ae5ae0a777cf9b6ca8", [:rebar], []},
- "postgrex": {:hex, :postgrex, "0.13.0", "e101ab47d0725955c5c8830ae8812412992e02e4bd9db09e17abb0a5d82d09c7", [:mix], [{:connection, "~> 1.0", [hex: :connection, optional: false]}, {:db_connection, "~> 1.1", [hex: :db_connection, optional: false]}, {:decimal, "~> 1.0", [hex: :decimal, optional: false]}]},
- "ranch": {:hex, :ranch, "1.3.2", "e4965a144dc9fbe70e5c077c65e73c57165416a901bd02ea899cfd95aa890986", [:rebar3], []}}
+ "postgrex": {:hex, :postgrex, "0.13.1", "ebf17b7348922af9db8b4d70f946328ab9ef5123526bf05567d9306393fce104", [:mix], [{:connection, "~> 1.0", [hex: :connection, optional: false]}, {:db_connection, "~> 1.1", [hex: :db_connection, optional: false]}, {:decimal, "~> 1.0", [hex: :decimal, optional: false]}]},
+ "ranch": {:hex, :ranch, "1.3.2", "e4965a144dc9fbe70e5c077c65e73c57165416a901bd02ea899cfd95aa890986", [:rebar3], []},
+ "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.1", "28a4d65b7f59893bc2c7de786dec1e1555bd742d336043fe644ae956c3497fbe", [:make, :rebar], []}}
diff --git a/package.json b/package.json
index 13de858..ed038c4 100644
--- a/package.json
+++ b/package.json
@@ -3,18 +3,73 @@
"license": "MIT",
"scripts": {
"deploy": "brunch build --production",
- "watch": "brunch watch --stdin"
+ "watch": "brunch watch --stdin",
+ "test": "jest --verbose",
+ "lint": "./node_modules/.bin/eslint web/static/js/**"
},
"dependencies": {
+ "babel-polyfill": "^6.23.0",
+ "babel-preset-es2016": "^6.22.0",
+ "currency-formatter": "^1.1.1",
+ "es6-promise": "^4.0.5",
+ "isomorphic-fetch": "^2.2.1",
+ "lodash": "^4.17.4",
+ "lodash-es": "^4.17.4",
+ "lodash.debounce": "^4.0.8",
"phoenix": "file:deps/phoenix",
- "phoenix_html": "file:deps/phoenix_html"
+ "phoenix_html": "file:deps/phoenix_html",
+ "react": "^15.4.2",
+ "react-dom": "^15.4.2",
+ "react-redux": "^5.0.2",
+ "react-router": "^3.0.2",
+ "react-router-redux": "^4.0.8",
+ "reactable": "^0.14.1",
+ "redux": "^3.6.0",
+ "redux-form": "^6.5.0",
+ "redux-thunk": "^2.2.0",
+ "uswds": "^0.14.0"
+ },
+ "jest": {
+ "transform": {
+ "^.+\\.js$": "babel-jest"
+ },
+ "modulePaths": [
+ "/web/static/js"
+ ],
+ "unmockedModulePathPatterns": [
+ "/node_modules/react",
+ "/node_modules/react-dom",
+ "/node_modules/react-addons-test-utils",
+ "/node_modules/fbjs"
+ ]
},
"devDependencies": {
"babel-brunch": "~6.0.0",
- "brunch": "2.7.4",
+ "babel-eslint": "^7.1.1",
+ "babel-jest": "^18.0.0",
+ "babel-preset-es2015": "^6.22.0",
+ "babel-preset-es2017": "^6.22.0",
+ "babel-preset-react": "^6.23.0",
+ "babel-preset-stage-1": "^6.22.0",
+ "brunch": "2.10.8",
"clean-css-brunch": "~2.0.0",
"css-brunch": "~2.0.0",
+ "enzyme": "^2.7.1",
+ "eslint": "^3.16.1",
+ "eslint-config-airbnb": "^14.1.0",
+ "eslint-plugin-import": "^2.2.0",
+ "eslint-plugin-jsx-a11y": "^4.0.0",
+ "eslint-plugin-lodash-fp": "^2.1.3",
+ "eslint-plugin-react": "^6.10.0",
+ "fetch-mock": "^5.9.4",
"javascript-brunch": "~2.0.0",
+ "jest": "^18.1.0",
+ "jest-cli": "^18.1.0",
+ "react-addons-test-utils": "^15.4.2",
+ "react-test-renderer": "^15.4.2",
+ "redux-mock-store": "^1.2.2",
+ "replacement-brunch": "^2.0.4",
+ "sass-brunch": "^2.10.4",
"uglify-js-brunch": "~2.0.1"
}
}
diff --git a/priv/repo/catalog.csv b/priv/repo/catalog.csv
new file mode 100644
index 0000000..3db3b80
--- /dev/null
+++ b/priv/repo/catalog.csv
@@ -0,0 +1,905 @@
+clin,unspc_code,manufacturer_part_number,manufacturer,sku,name,description,unit_of_measure,quantity_in_uom,list_price,contract_unit_price,contract_discount,long_category,simple_category,top_level_category
+1011b,,,DELL,210-AFXK,OptiPlex 3040 Small Form Factor XCTO,"4GB 1DIMM 1600MHz DDR3L, Windows 7 Pro (32/64 bit),
+integrated Intel HD Graphics, DVD+/- RW, 500GB SATA
+7200rpm, USB Optical Wheel Mouse, USB Keyboard, 3-Year
+Next Business Day On-Site Warranty",EACH,1,"$1,013.71",$446.03,56%,Standard Desktop Hardware,Standard,Desktops
+102d,,,DELL,210-AFXL,Dell Optiplex 3040 MT,"Core i5-6500, 3.20GHz,
+4GB 1DIMM 1600MHz DDR3L, Windows 7 Pro (32/64 bit),
+integrated Intel HD Graphics 530, DVD+/- RW, 500GB SATA
+7200rpm, USB Optical Wheel Mouse, USB Keyboard, 3-Year
+Next Business Day On-Site Warranty",EACH,1,"$1,013.71",$446.03,56%,Standard Desktop Hardware,Standard,Desktops
+106a,,,DELL,210-AFXJ,Dell Optiplex 3040 Micro,"Core i5-6500T, 2.5GHz,
+4GB 1DIMM 1600MHz DDR3L, Windows 7 Pro (32/64 bit),
+integrated Intel HD Graphics 530, 500GB SATA 7200rpm,
+USB Optical Wheel Mouse, USB Keyboard, 3-Year Next
+Business Day On-Site Warranty",EACH,1,$930.43,$409.39,56%,Standard Desktop Hardware,Standard,Desktops
+200c,,,DELL,210-AFIF,Dell Optiplex 5040 SFF,"Core i7-6700, 3.4GHz, 8GB 2
+DIMMs 1600Mhz DDR3L, Windows 7 Pro (64-bit), integrated
+Intel HD Graphics, DVD +/- RW, 500GB SATA II 7200RPM,
+USB Optical Wheel Mouse, USB Keyboard, 90% Efficient
+Power Supply, 3-Year Next Business Day On-Site Warranty",EACH,1,"$1,295.86",$570.18,56%,Power Desktop Hardware,Standard,Desktops
+202c,,,DELL,210-AFID,Dell Optiplex 5040 MT,"Core i7-6700, 3.4GHz, 8GB 2
+DIMMs 1600Mhz DDR3L, Windows 7 Pro (64-bit), integrated
+Intel HD Graphics, DVD +/- RW, 500GB SATA II 7200RPM,
+USB Optical Wheel Mouse, USB Keyboard, 90% Efficient
+Power Supply, 3-Year Next Business Day On-Site Warranty",EACH,1,"$1,315.86",$578.98,56%,Standard Desktop Hardware,Standard,Desktops
+,,,DELL,210-ACQM,Dell Precision T5810,"Four Core E5-1607 v3
+(4C, 3.1GHz, 10M, 140W), 16GB DDR4 RDIMM 2133MHz,
+Windows 7 Po, SP1, 64-bit, NVIDIA® Quadro® K620 2GB (DP,
+DL-DVI-I) (1 DP to SL-DVI adapter), 16X DVD+/-RW Drive,
+900GB 2.5"" SAS (10,000 RPM), USB Optical Wheel Mouse,
+USB Keyboard, 3- Year Next Business Day On-Site Warranty",EACH,1,"$2,803.33","$1,233.47",56%,Workstation Hardware,Workstation,Desktops
+400a,,,DELL,909686-51L,Dell Wyse Z90D7,"Dual Core 1.65GHz, 2GB
+1600MHz DDR3, Windows Embedded Std 7, USB Keyboard,
+PS/2 Optical Mouse, 3-Year Limited Hardware Warranty on-site",EACH,1,$679.00,$298.76,56%,Thin Client Hardware,Thin Client,Desktops
+430a,,,DELL,210-AFGK,Dell Optiplex 7040 SFF,"Core i7-6700, 3.4GHz, 8GB 2
+DIMMs 1600Mhz DDR4, Windows 7 Pro (64-bit), integrated
+Intel HD Graphics, DVD +/- RW, 500GB SATA II 7200RPM,
+USB Optical Wheel Mouse, USB Keyboard, 90% Efficient
+Power Supply, 3-Year Next Business Day On-Site Warranty",EACH,1,"$1,354.43",$595.95,56%,Power Desktop Hardware,Standard,Desktops
+,,,DELL,370-ACLY,Dell 8GB DDR3L Memory,"8GB (1x8GB), 1600MHz DDR3L Memory",EACH,1,$130.00,$88.40,32%,Upgrades,Memory,Components
+1003c,,,DELL,490-BCYL,AMD Radeon R5 340X,2GB DP/DVI-I,EACH,1,$110.00,$74.80,32%,"Standard Desktop Options
+Upgrades",Video Cards,Components
+1005b,,,DELL,400-AIOY,"Dell 1TB 3.5"" HDD",3.5 1TB 7200rpm HDD,EACH,1,$130.00,$88.40,32%,"Standard Desktop Options
+Upgrades",Storage Devices,Components
+1006b,,,DELL,"470-ABLQ, 555-
+BCMT",Intel® Dual Band Wireless 8260,(802.11ac) + Bluetooth,EACH,1,$53.00,$36.04,32%,"Standard Desktop Options
+Upgrades",Networking,Components
+1007b,,,DELL,429-AAVN,Dell 8x DVD-ROM,8x DVD-ROM 9.5mm Optical Disk Drive,EACH,1,$40.00,$27.20,32%,"Standard Desktop Options
+Upgrades",Storage Devices,Components
+1008a,,,DELL,A4051228,Dell Comfort Wave Keyboard,Comfort wave Ergonomic keyboard,EACH,1,$79.99,$54.39,32%,"Standard Desktop Options
+Upgrades",Keyboards & Mice,Peripherals
+1009b,,,DELL,A7055994,Dell Performance Ergonomic Mouse,Performance Ergonomic mouse mx,EACH,1,$99.99,$67.99,32%,"Standard Desktop Options
+Upgrades",Keyboards & Mice,Peripherals
+,,,DELL,A6024088,Dell Wireless Mouse,Wireless mouse M525,EACH,1,$39.99,$27.19,32%,Upgrades,Keyboards & Mice,Peripherals
+1012b,,,DELL,A5950984,Jabra UC Voice 150,UC Voice 150 USB Duo. Headband INL,EACH,1,$33.99,$23.11,32%,"Standard Desktop Options
+Upgrades",Headsets Microphones & Speakers,Peripherals
+1013a,,,DELL,313-7362,Dell AX210 Stereo Speakers,"AX210 USB Stereo Speakers WW, I/S/X DT C",EACH,1,$19.99,$13.59,32%,"Standard Desktop Options
+Upgrades",Headsets Microphones & Speakers,Peripherals
+1014c,,,DELL,A3881047,Logitech Stereo Headset,H110 2 Stereo Headset,EACH,1,$14.99,$10.19,32%,"Standard Desktop Options
+Upgrades",Headsets Microphones & Speakers,Peripherals
+1015a,,,DELL,A3793590,DVI-D M/M Dual Link Digital Video Cable 6',6 ft DVI-D Single Link Digital Video Monitor Cable w/ Audio,EACH,1,$12.99,$8.83,32%,"Standard Desktop Options
+Upgrades",Cables & Adapters,Peripherals
+1016b,,,DELL,470-AANH,DisplayPort to DVI 6.5',DisplayPort 1.1 Male to DVI-D Male Black Cable - 6.5 ft,EACH,1,$24.99,$16.99,32%,"Standard Desktop Options
+Upgrades",Cables & Adapters,Peripherals
+1017b,,,DELL,470-AANW,DiplayPort to DVI (Dual-Link),"The Dell™ DisplayPort to DVI (Dual-Link) adapter lets you to take video content from your laptop or desktop and display it on any monitor, projector or HDTV featuring a DVI (Dual-Link) input.",EACH,1,$139.99,$95.19,32%,"Standard Desktop Options
+Upgrades",Cables & Adapters,Peripherals
+1019c,,,DELL,370-ACMQ,Dell 16GB DDR3L Memory,"16GB (2x8GB), 1600MHz DDR3L Memory (5040)",EACH,1,$260.00,$176.80,32%,"Power Desktop Options
+Upgrades",Memory,Components
+1020c,,,DELL,490-BCPG,AMD Radeon R5 340X,2GB DP/DVI-I,EACH,1,$110.00,$74.80,32%,"Power Desktop Options
+Upgrades",Video Cards,Components
+1021c,,,DELL,490-BCPF,AMD Radeon R7 350X,"4GB, HH (DP SL-DVI-I)",EACH,1,$180.00,$122.40,32%,"Power Desktop Options
+Upgrades",Video Cards,Components
+1022c,,,DELL,400-AIOY,"Dell 1TB 3.5"" HDD",3.5 inch 1TB 7200rpm Hard Disk Drive,EACH,1,$130.00,$88.40,32%,"Power Desktop Options
+Upgrades",Storage Devices,Components
+1023c,,,DELL,400-AIRX,Dell 128GB SSD (SATA),128GB SATA Solid State Drive,EACH,1,$200.00,$136.00,32%,"Power Desktop Options
+Upgrades",Storage Devices,Components
+1024c,,,DELL,400-AIRY,Dell 256GB SSD (PCIe),256GB PCIe Solid State Drive,EACH,1,$400.00,$272.00,32%,"Power Desktop Options
+Upgrades",Storage Devices,Components
+1026d,,,DELL,"470-ABLQ, 555-
+BCMT",Intel® Dual Band Wireless 8260, (802.11ac) + Bluetooth,EACH,1,$53.00,$36.04,32%,"Power Desktop Options
+Upgrades",Networking,Components
+1027d,,,DELL,631-AASS,Intel Standard Manageability,Upgrade to Intel Standard Manageability,EACH,1,$15.00,$10.20,32%,"Power Desktop Options
+Upgrades",Support,Services
+1028d,,,DELL,429-AAVN,Dell 8x DVD-ROM Optical Disk Drive,"8x DVD-ROM, 9.5mm Optical Disk Drive",EACH,1,$40.00,$27.20,32%,"Power Desktop Options
+Upgrades",Storage Devices,Components
+1030b,,,DELL,338-BFJW,Intel® Xeon® Processor E5-1620 v3,"Quad Core HT, 3.7 GHz
+Turbo, 10 MB",EACH,1,$340.00,$231.20,32%,Workstation Options Upgrades,Processors,Components
+1031b,,,DELL,338-BFJV,Intel® Xeon® Processor E5-1660 v3,"Six Core HT, 3.5 GHz
+Turbo, 12 MB",EACH,1,"$1,820.00","$1,237.60",32%,Workstation Options Upgrades,Processors,Components
+1033b,,,DELL,370-ABUP,Dell 32GB 18666MHz DDR3 Memory,"32GB (4x8GB), 1866MHz DDR3 ECC RDIMM",EACH,1,"$1,040.00",$707.20,32%,Workstation Options Upgrades,Memory,Components
+1034b,,,DELL,490-BCCO,NVIDIA® Quadro® K4200 4GB,"2 DP DL-DVI-I, 1 DP to SL-
+DVI adapter",EACH,1,"$2,200.00","$1,496.00",32%,Workstation Options Upgrades,Video Cards,Components
+,,,DELL,400-AETZ,"2x900GB 2.5"" SAS HD","2x900GB 2.5inch, SAS (10.000 Rpm) Hard Drive",EACH,1,$729.00,$495.72,32%,Workstation Options Upgrades,Storage Devices,Components
+1040b,,,DELL,400-AECP,"Dell 256 GB 2.5"" SSD","256GB 2.5inch, Serial ATA Solid State Drive",EACH,1,$477.00,$324.36,32%,Workstation Options Upgrades,Storage Devices,Components
+1041b,,,DELL,400-AECQ,"Dell 512GB 2.5"" SSD","512GB 2.5inch, Serial ATA Solid State Drive",EACH,1,$810.33,$551.02,32%,Workstation Options Upgrades,Storage Devices,Components
+1042b,,,DELL,540-BBHC,Intel® X540-T2 10GbE NIC,"Dual Port, Copper",EACH,1,$450.00,$306.00,32%,Workstation Options Upgrades,Networking,Components
+1043b,,,DELL,555-BBGR,Dell Wireless 1540,802.11 a/g/n PCIe,EACH,1,$49.00,$33.32,32%,Workstation Options Upgrades,Networking,Components
+1044b,,,DELL,429-AAPD,Dell 8x Slimline DVD-ROM,8x Slimline DVD-ROM Drive,EACH,1,$30.00,$20.40,32%,Workstation Options Upgrades,Storage Devices,Components
+1045B,,,DELL,429-AAUX,Dell External USB Slim DVD+/-RW Optical Drive,Dell External USB Slim DVD+/-RW Optical Drive,EACH,1,$59.99,$40.79,32%,Thin Client Options Upgrades,Storage Devices,Components
+1047,,,DELL,A7287839,KINGSTON DATATRAVELER G4,USB-FLASHSTAS,EACH,1,$10.99,$7.47,32%,Thin Client Options Upgrades,Storage Devices,Components
+1048b,,,DELL,A6188150,WYSE Displayport (M) TO DVI-D (F) adapter,WYSE Displayport (M) TO DVI-D (F) adapter,EACH,1,$27.55,$18.73,32%,Thin Client Options Upgrades,Cables & Adapters,Peripherals
+1049c,,,DELL,338-BHUG,Intel® CoreTM i5-6600 Processor,"Quad Core, 6MB, 4T,
+3.3GHz, 65W",EACH,1,$235.00,$159.80,32%,All In One Options Upgrades,Processors,Components
+1050c,,,DELL,338-BHUH,Intel® CoreTM i7-6700 Processor,"Quad Core, 8MB, 8T,
+3.4GHz, 65W",EACH,1,$340.00,$231.20,32%,All In One Options Upgrades,Processors,Components
+1051c,,,DELL,370-ACHX,Dell 8GB DDR4Memory,"8GB (2x4GB), 2133MHz DDR4 Memory",EACH,1,$130.00,$88.40,32%,All In One Options Upgrades,Memory,Components
+1054c,,,DELL,400-AMPC,Dell 128GB SSD (SATA),M.2 128GB SATA Solid State Drive,EACH,1,$200.00,$136.00,32%,All In One Options Upgrades,Storage Devices,Components
+1055c,,,DELL,631-AAUF,Intel vPro,Intel® vPro Technology Enabled,EACH,1,$40.00,$27.20,32%,All In One Options Upgrades,Support,Services
+1056c,,,DELL,429-AAWE,Dell 8x DVD-ROM,8x DVD-ROM 9.5mm Optical Disk Drive,EACH,1,$40.00,$27.20,32%,All In One Options Upgrades,Storage Devices,Components
+1057a,,,DELL,A3793590,DVI 6.6' Cable,"MS - Display cable - DVI-D M - DVI-D M - 6.6 ft ( included in the
+22"" widescreen monitor)",EACH,1,$12.99,$8.83,32%,Monitor Option/Upgrades,Cables & Adapters,Peripherals
+1058b,,,DELL,A7639742,DisplayPort Cable with Latches,C2G 2M Displayport CBL W/ latches,EACH,1,$15.99,$10.87,32%,Monitor Option/Upgrades,Cables & Adapters,Peripherals
+1059a,,,DELL,575-BBHE,Dell OptiPlex Micro Stand,Dell OptiPlex Micro AIO Stand,EACH,1,$92.86,$63.14,32%,Micro Desktop Options,Displays,Peripherals
+1060a,,,DELL,575-BBHC,Opti Micro Mount,Opti Micro VESA Mount,EACH,1,$28.57,$19.43,32%,Micro Desktop Options,Mounting,Peripherals
+1061a,,,DELL,575-BBHF,Opti Micro Dual Mount,Opti Micro Dual VESA Mount,EACH,1,$35.71,$24.28,32%,Micro Desktop Options,Mounting,Peripherals
+,,,DELL,575-BBHH,Opti Micro Console,Opti Micro Console,EACH,1,$121.43,$82.57,32%,Micro Desktop Options,Mounting,Peripherals
+1064a,,,DELL,382-BBDP,DisplayPort Option,2nd Display Port (Only 7040 Micro),EACH,1,$13.00,$8.84,32%,Micro Desktop Options,Cables & Adapters,Peripherals
+1065,,,DELL,338-BHUU,Intel® CoreTM i7-6700T Processor,"Quad Core, 8MB, 8T,
+2.8GHz, 35W), 3040MFF",EACH,1,$340.00,$231.20,32%,"Micro Standard Desktop
+Upgrades",Processors,Components
+1066,,,DELL,370-AAMU,Dell 16GB DDR3 Memory,"16GB (2x8GB), 1600MHz DDR3 Non-ECC(3040MFF)",EACH,1,$260.00,$176.80,32%,"Micro Standard Desktop
+Upgrades",Memory,Components
+1067,,,DELL,370-AAML,Dell 8GB DDR3L Memory,"8GB (2x4GB), 1600MHz DDR3L Memory(3040MFF)",EACH,1,$130.00,$88.40,32%,"Micro Standard Desktop
+Upgrades",Memory,Components
+1068,,,DELL,400-AJKT,"Dell 128GB 2.5"" SSD",2.5inch 128GB SSD(3040MFF),EACH,1,$200.00,$136.00,32%,"Micro Standard Desktop
+Upgrades",Storage Devices,Components
+1069,,,DELL,338-BHUH,Intel® CoreTM i7-6700 Processor,"Quad Core, 8MB, 8T,
+3.4GHz, 65W",EACH,1,$340.00,$231.20,32%,"Standard Desktop Options
+Upgrades",Processors,Components
+1070,,,DELL,370-ACMQ,Dell 16GB DDR3L Memory,"16GB (2x8GB), 1600MHz DDR3L Memory",EACH,1,$260.00,$176.80,32%,"Standard Desktop Options
+Upgrades",Memory,Components
+1071,,,DELL,400-AJKS,"Dell 128GB 2.5"" SSD",2.5 128GB SSD,EACH,1,$200.00,$136.00,32%,"Standard Desktop Options
+Upgrades",Storage Devices,Components
+1072,,,DELL,400-AJCK,Dell 256GB SSD,256GB Solid State Drive,EACH,1,$400.00,$272.00,32%,"Standard Desktop Options
+Upgrades",Storage Devices,Components
+1073,,,DELL,490-BCYM,AMD RadeonTM R7 350X,"4GB (DP, SL-DVI-I",EACH,1,$180.00,$122.40,32%,"Standard Desktop Options
+Upgrades",Video Cards,Components
+1074,,,DELL,490-BCYL,AMD RadeonTM R5 340X,2GB DP/DVI-I,EACH,1,$110.00,$74.80,32%,"Standard Desktop Options
+Upgrades",Video Cards,Components
+1075,,,DELL,"421-9983, 954-3463",DDPE Enterprise Edition 3 Year,"DDPE Enterprise Edition License + ProSupport for Software
+3 Year",EACH,1,$104.00,$70.72,32%,"Standard Desktop Options
+Upgrades",Support,Services
+1076,,,DELL,400-AHZI,"Dell 1TB 2.5"" HDD",2.5 inch 1TB 7200rpm Hard Disk Drive (7040 Micro),EACH,1,$130.00,$88.40,32%,"Power Desktop Options
+Upgrades",Storage Devices,Components
+1077,,,DELL,370-ACMR,Dell 16GB DDR4Memory,"16GB (2x8GB), 2133MHz DDR4 Memory (7040
+Micro)",EACH,1,$260.00,$176.80,32%,"Power Desktop Options
+Upgrades",Memory,Components
+1078,,,DELL,338-BHUF,Intel® CoreTM i5-6500 Processor,"Quad Core, 6MB, 4T,
+3.2GHz, 65W",EACH,1,$205.00,$139.40,32%,"Power Desktop Options
+Upgrades",Processors,Components
+1079,,,DELL,338-BHUS,Intel® CoreTM i5-6500T Processor,"Quad Core, 6MB, 4T,
+2.5GHz, 35W 7040 Micro",EACH,1,$205.00,$139.40,32%,"Power Desktop Options
+Upgrades",Processors,Components
+1080,,,DELL,370-ACKD,Dell 16GB DDR4 Memory,"16GB (2x8GB), 2133MHz DDR4 Memory (7040)",EACH,1,$260.00,$176.80,32%,"Power Desktop Options
+Upgrades",Memory,Components
+1081,,,DELL,370-ACKC,Dell 32GB DDR4 Memory,"32GB (4x8GB), 2133MHz DDR4 Memory",EACH,1,$570.00,$387.60,32%,"Power Desktop Options
+Upgrades",Memory,Components
+1082,,,DELL,400-AIRW,"Dell 500GB 2.5"" HDD","2.5 inch 500GB 7200rpm OPAL 2.0 FIPS Self Encrypting Hard
+Disk Drive",EACH,1,$160.00,$108.80,32%,"Power Desktop Options
+Upgrades",Storage Devices,Components
+,,,DELL,490-BCQT,AMD R5 340X,"2GB DP/DVI, 5040 MINITOWER",EACH,1,$110.00,$74.80,32%,Upgrades,Video Cards,Components
+1085,,,DELL,325-BBQT,"Secure Cable Cover, SFF","Secure Cable Cover, SFF",EACH,1,$25.33,$17.22,32%,"Power Desktop Options
+Upgrades",Cables & Adapters,Peripherals
+1086,,,DELL,325-BBTM,"Secure Cable Cover, MT","Secure Cable Cover, MT",EACH,1,$28.57,$19.43,32%,"Power Desktop Options
+Upgrades",Cables & Adapters,Peripherals
+1087,,,DELL,370-ACHX,Dell 8GB DDR4 Memory,"8GB (2x4GB), 2133MHz DDR4 Memory",EACH,1,$130.00,$88.40,32%,All In One Options Upgrades,Memory,Components
+1088,,,DELL,370-ACHW,Dell 16GB DDR4 Memory,"16GB (2x8GB), 2133MHz DDR4 Memory (7440 AIO)",EACH,1,$260.00,$176.80,32%,All In One Options Upgrades,Memory,Components
+1089,,,DELL,400-AKYB,Dell 256GB PCIe SSD,256GB PCIe Solid State Drive,EACH,1,$400.00,$272.00,32%,All In One Options Upgrades,Storage Devices,Components
+1090,,,DELL,400-AHIF,Dell 512GB SATA SSD,2.5 inch 512GB SATA Solid State Drive,EACH,1,$900.00,$612.00,32%,All In One Options Upgrades,Storage Devices,Components
+1091,,,DELL,400-AHZH,"Dell 500GB 2.5"" HDD","2.5 inch 500GB 7200rpm FIPS Certified Self-Encrypting Hard
+Drive",EACH,1,$160.00,$108.80,32%,All In One Options Upgrades,Storage Devices,Components
+1092,,,DELL,"391-BCNF, 490-
+BCTH",Dell 4K Touch ,4K TOUCH LCD,EACH,1,$685.00,$465.80,32%,All In One Options Upgrades,Displays,Peripherals
+1800b,,,DELL,858-BBCU,"Dell 19.5"" Widescreen","P2016 19.5"" WideScreen Monitor",EACH,1,$189.99,$129.20,32%,Monitor Options Upgrades,Displays,Peripherals
+1801a,,,VIEWSONIC,TD2220,"Viewsonic 22"" Touchscreen","22"" Touchscreen monitor",EACH,1,$445.00,$302.60,32%,Monitor Options Upgrades,Displays,Peripherals
+1802a,,,DELL,320-9704,"Dell 22"" Widescreen","P2213 22"" Widescreen Monitor",EACH,1,$219.99,$149.59,32%,Monitor Options Upgrades,Displays,Peripherals
+1803c,,,DELL,320-9794,"Dell 24"" Widescreen","P2414H 24"" Widescreen Monitor",EACH,1,$299.99,$204.00,32%,Monitor Options Upgrades,Displays,Peripherals
+,,,DELL,"997-8533, 997-8536",Dell 4 Year Service,4 Year Basic Hardware Service with 4 Year NBD on-site,EACH,1,$188.00,$101.52,46%,Power Desktop Service O/U,Support,Services
+2001b,,,DELL,"997-8538, 997-8533",5 Year Basic Hardware Service with NBD on-site,5 Year Basic Hardware Service with NBD on-site,EACH,1,$228.00,$123.12,46%,Power Desktop Service O/U,Support,Services
+2002b,,,DELL,984-0092,"Keep Your Hard Drive, 3 Years","Keep Your Hard Drive, 3 Years",EACH,1,$20.00,$10.80,46%,Standard Desktop Service O/U,Support,Services
+2003a,,,DELL,981-3953,"Keep Your Hard Drive, 4 Years","Keep Your Hard Drive, 4 Years",EACH,1,$25.00,$13.50,46%,Standard Desktop Service O/U,Support,Services
+2004a,,,DELL,980-7554,"Keep Your Hard Drive, 5 Years","Keep Your Hard Drive, 5 Years",EACH,1,$30.00,$16.20,46%,Standard Desktop Service O/U,Support,Services
+2005a,,,DELL,"983-7873, 986-4872",4 Year Warranty,Upgrade 4 Year Warranty Exchange Replacement,EACH,1,$39.00,$21.06,46%,Monitor Service O/U,Support,Services
+,,,DELL,"997-7166, 997-7163",4 Year Hardware Service,"4 Year Basic Hardware Service with 4 Year NBD Limited
+Onsite Service After Remote Diagnosis",EACH,1,$372.00,$200.88,46%,Workstation Options Upgrades,Support,Services
+2008b,,,DELL,"997-7163, 997-7168",5 Year Hardware Service,"5 Year Basic Hardware Service with 5 Year NBD Limited
+Onsite Service After Remote Diagnosis",EACH,1,$472.00,$254.88,46%,Workstation Options Upgrades,Support,Services
+2009a,,,DELL,984-1772,"Keep Your Hard Drive, 3 Years","Keep Your Hard Drive, 3 Years",EACH,1,$20.00,$10.80,46%,Workstation Options Upgrades,Support,Services
+2010a,,,DELL,981-5573,"Keep Your Hard Drive, 4 Years","Keep Your Hard Drive, 4 Years",EACH,1,$25.00,$13.50,46%,Workstation Options Upgrades,Support,Services
+2011a,,,DELL,980-9194,"Keep Your Hard Drive, 5 Years","Keep Your Hard Drive, 5 Years",EACH,1,$30.00,$16.20,46%,Workstation Options Upgrades,Support,Services
+2012c,,,DELL,"803-8591, 803-8583",4 Year Hardware Service,4 Year Basic Hardware Service with NBD on-site,EACH,1,$178.00,$96.12,46%,Standard Desktop Service O/U,Support,Services
+2013c,,,DELL,"803-8583, 803-8593",5 Year Hardware Service,5 Year Basic Hardware Service with 4 Year NBD on-site,EACH,1,$208.00,$112.32,46%,Standard Desktop Service O/U,Support,Services
+2014a,,,DELL,A6047259,1 Year Silverchoice Renewal,"VL 1 Year Silverchoice Renewal for Z-Class (same as 4 year
+Basic)",EACH,1,$49.00,$26.46,46%,Thin Client Service O/U,Support,Services
+2015a,,,DELL,A6047260,(2) 1 Year Silverchoice Renewals,"(2) VL 1 Year Silverchoice Renewal for Z-Class (same as a 5
+year basic - but order quantity of 2)",EACH,1,$49.00,$26.46,46%,Thin Client Service O/U,Support,Services
+2016c,,,DELL,"997-6870, 997-6873",4 Year Hardware Service,"4 Year Hardware Service with Onsite/In-Home Service After
+Remote Diagnosis",EACH,1,$322.00,$173.88,46%,All In One Service O/U,Support,Services
+2017d,,,DELL,"997-6870, 997-6875",5 Year Hardware Service,"5 Year Hardware Service with Onsite/In-Home Service After
+Remote Diagnosis",EACH,1,$342.00,$184.68,46%,All In One Service O/U,Support,Services
+2018,,,DELL,"997-6870, 997-6873",4 Year Hardware Service,4 Year Basic Hardware Service with 4 Year NBD on-site,EACH,1,$322.00,$173.88,46%,"Power Desktop Service O/U
+7040",Support,Services
+2019,,,DELL,"997-6870, 997-6875",5 Year Hardware Service,5 Year Basic Hardware Service with 5 Year NBD on-site,EACH,1,$342.00,$184.68,46%,"Power Desktop Service O/U
+7040",Support,Services
+3000a,,,TIG,TIG-INS-CPU,Installation Services,Installation Services,EACH,1,$40.00,$30.80,23%,VAS Standard Desktop,Support,Services
+3001a,,,TIG,TIG-ATG-CPU,Asset Tagging Services,Asset Tagging Services - Customer Provided Tags,EACH,1,$10.00,$7.70,23%,VAS Standard Desktop,Support,Services
+3002,,,TIG,TIG-AIN-CPU,Asset Information via Internet,Asset Information via Internet,EACH,1,,,23%,VAS Standard Desktop,Support,Services
+3003a,,,TIG,TIG-IMG-CPU,Imaging,Imaging,EACH,1,$27.00,$20.79,23%,VAS Standard Desktop,Support,Services
+3004,,,TIG,TIG-SWC-CPU,Self-Warranty Certification,Self-Warranty Certification,EACH,1,,,23%,VAS Standard Desktop,Support,Services
+3005,,,TIG,TIG-DIS-CPU,Take-Back Services,Take-Back Services,EACH,1,$10.00,$7.70,23%,VAS Standard Desktop,Support,Services
+3006,,,TIG,TIG-DLG-CPU,Deployments & Logistics Services,Deployments & Logistics Services,HOUR,1,$46.00,$35.42,23%,VAS Standard Desktop,Support,Services
+3007a,,,TIG,TIG-EMG-CPU,Emergency Services,Emergency Services ( 4 hour response),HOUR,1,$58.00,$44.66,23%,VAS Standard Desktop,Support,Services
+3008,,,DELL,"365-1245, 365-1401",Computrace 3 Year License,Absolute Computrace Complete 3YR License,EACH,1,$174.95,$134.71,23%,VAS Standard Desktop,Support,Services
+100d,43211500,210-AFTZ,DELL,210-AFTZ,Dell Latitude E5470,"i5-6200U, 2.3GHz, 4GB DDR4-
+2133MHz 1DIMM, Windows 10 Pro 64-bit (Windows 7 Compatible),
+500GB SATA II 7200RPM, Intel Integrated Graphics Card, 14.0"" HD
+Widescreen, Integrated Wireless, Bluetooth, 4-Cell Battery, 3 -Year
+NBD Onsite Warranty",EACH,1,"$1,624.09",$730.84,55%,Standard Laptop Config,Standard,Laptops
+200d,43211500,210-AFTZP,DELL,210-AFTZP,Dell Latitude E5470 ,"i5-6200U, 2.3GHz, 8GB DDR4-
+2133MHz 2DIMM, Windows 10 Pro 64-bit (Windows 7 Compatible),
+500GB SATA II 7200RPM, Intel Integrated Graphics Card, 14.0"" HD
+Widescreen, Integrated Wireless, Bluetooth, 4-Cell Battery, 3 -Year
+NBD Onsite Warranty",EACH,1,"$1,699.09",$764.59,55%,Power Laptop Config,Standard,Laptops
+300d,43211500,210-AFTT,DELL,210-AFTT,Dell Latitude E7270,"i5-6200U, 2.3GHz, 4GB DDR4-
+2133MHz 1DIMM, Windows 10 Pro 64-bit (Windows 7 Compatible),
+128GB SATA III Solid State HD, Intel Integrated Graphics Card, 12.5""
+HD Widescreen Integrated Wireless, Bluetooth, 4-Cell Battery, 3-Year
+NDB Onsite Warranty",EACH,1,"$1,947.80",$876.51,55%,Ultralight Laptop Config,Ultralight,Laptops
+400d,43211500,210-AFXM,DELL,210-AFXM,Dell Mobile Precision 7510,"i7-6820HQ 2.7GHz
+Quad Core, 16GB DDR4 2133MHz 2DIMMS, Windows 10 Pro 64-bit
+(Windows 7 Compatible), 500GB SATA II 7200RPM, AMD FireProTM W5170M w/2GB GDDR5, 15.6"" HD Widescreen, Integrated Wireless,
+Bluetooth. 6-cell battery. 3-Year NBD Onsite Warranty
+",EACH,1,"2,230.06","1,003.53",55%,Mobile Workstation Config,Workstation,Laptops
+1005b,43211500,451-BBUV,DELL,451-BBUV,Dell 6 Cell Battery,6 Cell (91 Whr) Long Life Cycle Lithium Polymer battery,EACH,1,$212.86,$138.36,35%,"Options/Upgrades
+Mobile Workstation",Batteries,Components
+1007,43211500,313-7362,DELL,313-7362,Dell External Speakers,USB Powered External Speakers,EACH,1,19.99,$12.99,35%,"Options/Upgrades
+All Laptops",Headsets Microphones & Speakers,Peripherals
+1008c,43211500,429-AAUX,DELL,429-AAUX,USB External DVD+/-RW Drive,USB External DVD+/-RW Drive,EACH,1,59.99,$38.99,35%,"Options/Upgrades
+Standard and Ultralight
+Laptop",Storage Devices,Components
+1009c,43211500,"379-BCFY, 391-BCDQ",DELL,"379-BCFY, 391-BCDQ",Intel® CoreTM i7-6600U,"Dual Core, 2.6GHz, 4M cache, 15W vPro",EACH,1,$500.00,$325.00,35%,"Options/Upgrades
+Power Laptop",Processors,Components
+1010a,43211500,NA,DELL,NA,Integrated Microphone,Add Integrated Microphone (INCLUDED IN BASE),EACH,1,,,35%,"Options/Upgrades
+Power Laptop",Headsets Microphones & Speakers,Peripherals
+1011a,43211500,NA,DELL,NA,Integrated Microphone,Add Integrated Microphone (INCLUDED IN BASE),EACH,1,,,35%,"Options/Upgrades
+Standard Laptop",Headsets Microphones & Speakers,Peripherals
+1012c,43211500,346-BBPV,DELL,346-BBPV,Fingerprint & Smartcard Reader,Fingerprint Reader/Smartcard Reader,EACH,1,30,$19.50,35%,"Options/Upgrades
+Ultralight Laptop",Security,Components
+1014b,43211500,"319-BBDT, 320-BBQV, 391
+BCFG",DELL,"319-BBDT, 320-BBQV, 391
+BCFG",Integrated Microphone,Add Integrated Microphone,EACH,1,$212.86,$138.36,35%,"Options/Upgrades
+Mobile Workstation",Headsets Microphones & Speakers,Peripherals
+1016c,43211500,370-ACDE,DELL,370-ACDE,Dell 8GB DDR4 Memory,"8GB (2x4GB), 2133MHz DDR4 Memory",EACH,1,$180.00,$117.00,35%,"Options/Upgrades
+Ultralight Laptop",Memory,Components
+1017c,43211500,338-BIFC,DELL,338-BIFC,Intel® CoreTM i7-6920HQ,"Quad Core 2.90GHz, 3.80GHz Turbo, 8MB
+45W, w/Intel HD Graphics 530",EACH,1,$741.43,$481.93,35%,"Options/Upgrades
+Mobile Workstation",Processors,Components
+1018b,43211500,370-ACEB,DELL,370-ACEB,Dell 32GB DDR4 Memory,"32GB (2x16GB), DDR4-2133MHz SDRAM, 4 DIMMS",EACH,1,$588.57,$382.57,35%,"Options/Upgrades
+Mobile Workstation",Memory,Components
+1020c,43211500,"379-BCFY, 391-BCDQ",DELL,"379-BCFY, 391-BCDQ",Intel® CoreTM i7-6600U,"Dual Core, 2.6GHz, 4M cache, 15W vPro",EACH,1,$500.00,$325.00,35%,"Options/Upgrades
+Standard Laptop",Processors,Components
+1021b,43211500,379-BCFY,DELL,379-BCFY,Intel® CoreTM i7-6600U,"Dual Core, 2.6GHz, 4M cache, 15W",EACH,1,$400.00,$260.00,35%,"Options/Upgrades
+Ultralight Laptop",Processors,Components
+1022a,43211500,370-ACDF,DELL,370-ACDF,Dell 16GB DDR4 Memory,"16GB (2x8GB), DDR4-2133MHZ",EACH,1,$330.00,$214.50,35%,"Options/Upgrades
+Power Laptop",Memory,Components
+1023b,43211500,391-BCFM,DELL,391-BCFM,Integrated Webcam,Add Integrated Webcam,EACH,1,30,$19.50,35%,"Options/Upgrades
+Ultralight Laptop",Webcams,Components
+1024a,43211500,319-BBCW,DELL,319-BBCW,"Integrated Microphone, No Webcam",Add Integrated Microphone (Remove Webcam),EACH,1,,,35%,"Options/Upgrades
+Ultralight Laptop",Headsets Microphones & Speakers,Peripherals
+1026,43211500,330-9456,DELL,330-9456,Optical Mouse,Add USB optical mouse,EACH,1,19.99,$12.99,35%,"Options/Upgrades
+All Laptops",Keyboards & Mice,Peripherals
+1027a,43211500,331-9653,DELL,331-9653,USB Keyboard,Add USB keyboard,EACH,1,29.99,$19.49,35%,"Options/Upgrades
+All Laptops",Keyboards & Mice,Peripherals
+1028a,43211500,631-AARN,DELL,631-AARN,Intel vPro,Upgrade to Intel vPro Technology,EACH,1,30,$19.50,35%,"Options/Upgrades
+Power Laptop",Support,Services
+1029c,43211500,346-BBRJ,DELL,346-BBRJ,Fingerprint & Smartcard Reader,Fingerprint Reader/Smartcard Reader,EACH,1,30,$19.50,35%,"Options/Upgrades
+Power Laptop",Security,Components
+1030b,43211500,631-AARD,DELL,631-AARD,Intel vPro,Upgrade Intel vProTM Technology’s Advanced Management Features,EACH,1,30,$19.50,35%,"Options/Upgrades
+Ultralight Laptop",Support,Services
+1031b,43211500,346-BBRE,DELL,346-BBRE,Fingerprint & Smartcard Reader,Add fingerprint reader/Smartcard Reader,EACH,1,70,$45.50,35%,"Options/Upgrades
+Mobile Workstation",Security,Components
+1032b,43211500,631-AAQU,DELL,631-AAQU,Intel vPro,Intel vPro Technology Enabled,EACH,1,$27.14,$17.64,35%,"Options/Upgrades
+Mobile Workstation",Support,Services
+1033a,43211500,331-6304,DELL,331-6304,Dell Standard,"Docking Station with A/C adapter, supports laptop recharging",EACH,1,$219.99,$142.99,35%,"Options/Upgrades
+Mobile Workstation",Docking Stations,Peripherals
+1034a,43211500,469-4546,DELL,469-4546,Dell Car Charger Adapter,"Dell 90-Watt Auto-Air DC Adapter for Select Dell Systems(Car
+Charger)",EACH,1,$99.99,$64.99,35%,"Options/Upgrades
+Standard, Power and
+Ultralight Laptop",Batteries,Components
+1035a,43211500,570-AALK,DELL,570-AALK,Wireless Mouse,Dell Wireless Mouse-WM126 - Black,EACH,1,$19.99,$12.99,35%,"Options/Upgrades
+All Laptops",Keyboards & Mice,Peripherals
+1036c,43211500,400-AHCC,DELL,400-AHCC,Dell 256GB SSD,256GB Solid State Drive,EACH,1,$320.00,$208.00,35%,"Options/Upgrades
+Ultralight Laptop",Storage Devices,Components
+1038b,43211500,400-AJBG,DELL,400-AJBG,Dell 256GB SSD,256GB Solid State Drive,EACH,1,$284.29,$184.79,35%,"Options/Upgrades
+Mobile Workstation",Storage Devices,Components
+1041b,43211500,400-AJBO,DELL,400-AJBO,Dell 500GB OPAL,500G 7200 OPAL,EACH,1,$84.29,$54.79,35%,"Options/Upgrades
+Mobile Workstation",Storage Devices,Components
+1043c,43211500,391-BCDP,DELL,391-BCDP,Integrated Webcam,Add Integrated Webcam,EACH,1,30,$19.50,35%,"Options/Upgrades
+Standard, Power",Webcams,Components
+1044b,43211500,331-6307,DELL,331-6307,Dell E-Port Replicator,Dell E-Port Replicator Docking Station with USB 3.0,EACH,1,$169.00,$109.85,35%,"Options/Upgrades
+Standard, Power and
+Ultralight Laptop",Docking Stations,Peripherals
+1045,81110000,980-5714,DELL,980-5714,"Keep Your Hard Drive, 5 Year","Keep Your Hard Drive, 5 Year",EACH,1,30,$19.50,35%,"Options/Upgrades
+Mobile Workstation",Support,Services
+1046,81110000,980-9314,DELL,980-9314,"Keep Your Hard Drive, 5 Year","Keep Your Hard Drive, 5 Year",EACH,1,30,$19.50,35%,"Options/Upgrades
+Standard, Power and
+Ultralight Laptop",Support,Services
+1047,81110000,981-2233,DELL,981-2233,"Keep Your Hard Drive, 4 Year","Keep Your Hard Drive, 4 Year",EACH,1,25,$16.25,35%,"Options/Upgrades
+Mobile Workstation",Support,Services
+1048,81110000,981-5693,DELL,981-5693,"Keep Your Hard Drive, 4 Year","Keep Your Hard Drive, 4 Year",EACH,1,25,$16.25,35%,"Standard, Power and
+Ultralight Laptop",Support,Services
+1049,81110000,983-8332,DELL,983-8332,"Keep Your Hard Drive, 3 Year","Keep Your Hard Drive, 3 Year",EACH,1,$20.00,$13.00,35%,"Options/Upgrades
+Mobile Workstation",Support,Services
+1050,81110000,984-1892,DELL,984-1892,"Keep Your Hard Drive, 3 Year","Keep Your Hard Drive, 3 Year",EACH,1,20,$13.00,35%,"Standard, Power and
+Ultralight Laptop",Support,Services
+1051b,43211500,A1475677,DELL,A1475677,Targus Corporate Traveler Laptop Case,"16-inch, Corporate Traveler, Vertical Rolling Laptop Case",EACH,1,52.99,$34.44,35%,"Options/Upgrades
+All Laptops",Cases & Bags,Peripherals
+1052a,43211500,A5468037,DELL,A5468037,Logitech Wireless Headset H600,LOGITECH WIRELESS HEADSET H600,EACH,1,29.99,$45.49,35%,"Options/Upgrades
+All Laptops",Headsets Microphones & Speakers,Peripherals
+1053,43211500,A6107465,DELL,A6107465,Wireless Keyboard,Add wireless keyboard,EACH,1,29.99,$19.49,35%,"Options/Upgrades
+All Laptops",Keyboards & Mice,Peripherals
+1054c,43211500,460-BBRC,DELL,460-BBRC,Dell Topload Carrying Case,"Dell, Professional Topload Carrying Case, 14”",EACH,1,59.99,$38.99,35%,"Options/Upgrades
+All Laptops",Cases & Bags,Peripherals
+1055c,43211500,370-ACDE,DELL,370-ACDE,Dell 8GB DDR4 Memory,"8GB (2x4GB), 2133MHz DDR4 Memory",EACH,1,$180.00,$117.00,35%,"Options/Upgrades
+Standard Laptop",Memory,Components
+1056b,43211500,"365-0521, 374-4751",DELL,"365-0521, 374-4751",Kensington Combination Lock,Kensington Combination Lock,EACH,1,39.85,$25.90,35%,"Options/Upgrades
+All Laptops",Security,Components
+1057b,43211500,400-AHCC,DELL,400-AHCC,Dell 256GB SSD,256GB Solid State Drive,EACH,1,$320.00,$208.00,35%,"Options/Upgrades
+Power Laptop",Storage Devices,Components
+1059b,43211500,391-BCDN,DELL,391-BCDN,"Dell Standard 14"" Touchscreen","14"" Touch FHD LCD with camera, WWAN",EACH,1,$280.00,$182.00,35%,"Options/Upgrades
+Standard Laptop",Laptop Screens,Components
+1060b,43211500,"391-BCEV, 451-BBPK",DELL,"391-BCEV, 451-BBPK","Dell Ultralight 12.5"" Screen","12.5” FHD Touch with Corning® Gorilla® Glass NBT (1920 x 10800)
+LCD with camera, WIGI",EACH,1,$379.00,$246.35,35%,"Options/Upgrades
+Ultralight Laptop",Laptop Screens,Components
+1062a,43211500,580-ACKL,DELL,580-ACKL,Backlit Keyboard (Standard),Backlit Keyboard,EACH,1,50,$32.50,35%,"Options/Upgrades
+Standard Laptop",Keyboards & Mice,Peripherals
+1063a,43211500,391-BCDH,DELL,391-BCDH,"Dell Standard 15"" Touchscreen","15"" Touch FHD LCD with Camera, WIGI",EACH,1,$280.00,$182.00,35%,"Options/Upgrades
+Standard Laptop",Laptop Screens,Components
+1064a,43211500,391-BCFN,DELL,391-BCFN,"Dell 14"" Ultralight Touchscreen","14"" Touch FHD LCD with Camera, WIGI",EACH,1,$480.00,$312.00,35%,"Options/Upgrades
+Ultralight Laptop",Laptop Screens,Components
+1065a,43211500,379-BCFY,DELL,379-BCFY,Intel® CoreTM i7-6600U,"Dual Core, 2.6GHz, 4M cache, 15W",EACH,1,$400.00,$260.00,35%,"Options/Upgrades
+Ultralight Laptop",Processors,Components
+1066,43211500,"954-3471,
+421-9983",DELL,"954-3471,
+421-9983",DDPE Enterprise Edition 5 Year,"PS4SW,DDPE,ENTERPRISE EDITION,5YR, DDPE Enterprise
+Edition DD",EACH,1,$129.00,$83.85,35%,"Options/Upgrades
+All Laptops",Support,Services
+1067a,43211500,370-ACDF,DELL,370-ACDF,Dell 16GB DDR4 Memory,"16GB (2x8GB), DDR4-2133MHz",EACH,1,$330.00,$214.50,35%,"Options/Upgrades
+All Laptops",Memory,Components
+1069a,43211500,555-BCMT,DELL,555-BCMT,Intel® Dual-Band Wireless,"AC 8260 Wi-Fi + BT 4.1 Wireless Card
+(2x2)",EACH,1,25,$16.25,35%,"Options/Upgrades
+All Laptops",Networking,Components
+1070,43211500,460-BBNE,DELL,460-BBNE,Premier Backpack,DELL Premier Backpack,EACH,1,99.99,$64.99,35%,"Options/Upgrades
+All Laptops",Cases & Bags,Peripherals
+1071a,43211500,331-9053,DELL,331-9053,Dell AC Adapter,DELL AC Adapter,EACH,1,$139.99,$90.99,35%,"Options/Upgrades
+All Laptops",Cables & Adapters,Peripherals
+1072a,43211500,346-BBPV,DELL,346-BBPV,Smart Card Reader,Smart Card Reader,EACH,1,30,$19.50,35%,"Options/Upgrades
+Ultralight Laptop",Security,Components
+1073a,43211500,631-AARN,DELL,631-AARN,Intel vPro,Upgrade to Intel vPro Technology,EACH,1,30,$19.50,35%,"Options/Upgrades
+Standard Laptop",Support,Services
+1074a,43211500,346-BBRJ,DELL,346-BBRJ,Dual Pointing palmrest With Smart Card and Fingerprint Reader,"Dual Pointing Palmrest, Smart Card, Fingerprint Reader",EACH,1,30,$19.50,35%,"Options/Upgrades
+Standard Laptop",Security,Components
+1075,43211500,332-2270,DELL,332-2270,Mini Displayport to VGA,Dell Adapter Mini Displayport to VGA,EACH,1,34.99,$22.74,35%,"Options/Upgrades
+All Laptops",Cables & Adapters,Peripherals
+1076,43211500,A7639742,DELL,A7639742,Displayport 6' Cable,Displayport to Displayport 6ft Cable M/M,EACH,1,15.99,$10.39,35%,"Options/Upgrades
+All Laptops",Cables & Adapters,Peripherals
+1077,43211500,451-BBKV,DELL,451-BBKV,Dell Power Companion,Dell Portable Power Companion (18000mAh),EACH,1,$139.99,$90.99,35%,"Options/Upgrades
+All Laptops",Batteries,Components
+1078a,43211500,400-AHHX,DELL,400-AHHX,Dell 128GB SSD,128GB SSD,EACH,1,$180.00,$117.00,35%,"Standard and Power
+Laptops",Storage Devices,Components
+1079a,43211500,370-ACDD,DELL,370-ACDD,Dell 8GB DDR4 Memory,"8GB (1x8GB), 2133MHz DDR4 Memory",EACH,1,$180.00,$117.00,35%,"Standard and Power
+Laptops",Memory,Components
+1081,43211500,400-AHHV,DELL,400-AHHV,Dell 512GB SSD,M.2 512GB SATA Class 20 Solid State Drive,EACH,1,$580.00,$377.00,35%,"Options/Upgrades
+All Laptops",Storage Devices,Components
+1082,43211500,"421-9983, 954-3463, 391-
+BCDQ",DELL,"421-9983, 954-3463, 391-
+BCDQ",DDPE Enterprise Edition 3 Year,DDPE Enterprise Edition License + ProSupport for Software 3 Year,EACH,1,$204.00,$132.60,35%,"Options/Upgrades
+All Laptops",Support,Services
+1083,43211500,452-BBLQ,DELL,452-BBLQ,Dell E-Port Plus,"E-Port Plus, dock adds dual digital display and legacy port support,
+USB 3.0",EACH,1,$219.00,$142.35,35%,"Options/Upgrades
+Standard Laptop",Docking Stations,Peripherals
+1084,43211500,338-BHOZ,DELL,338-BHOZ,AMD RadeonTM R7 M370,For I7-6820H No Type C (Vpro Capable),EACH,1,$129.00,$83.85,35%,"Options/Upgrades
+Standard Laptop",Video Cards,Components
+1085,43211500,450-AAYU,DELL,450-AAYU,Dell AC Adapter,90 Watt AC Adaptor,EACH,1,$5.00,$3.25,35%,"Options/Upgrades
+Standard Laptop",Cables & Adapters,Peripherals
+1086,43211500,346-BBSG,DELL,346-BBSG,Dual Pointing palmrest With Smart Card and Fingerprint Reader,"Dual Pointing Palmrest, Smart Card, Fingerprint Reader",EACH,1,$30.00,$19.50,35%,"Options/Upgrades
+Standard Laptop",Security,Components
+1087,43211500,631-AARO,DELL,631-AARO,Intel vPro,Intel vProTM Technology’s Advanced Management Features,EACH,1,$30.00,$19.50,35%,"Options/Upgrades
+Standard Laptop",Support,Services
+1088,43211500,391-BCDL,DELL,391-BCDL,"Dell 15.6"" Standard Screen","15.6"" FHD (1920 x 1080) Anti Glare LCD, Camera and Microphone,
+WWAN Capable",EACH,1,$110.00,$71.50,35%,"Options/Upgrades
+Standard Laptop",Laptop Screens,Components
+1089,43211500,338-BHLO,DELL,338-BHLO,AMD RadeonTM R7 M360,For I7-6600U,EACH,1,$129.00,$83.85,35%,"Options/Upgrades
+Standard Laptop",Video Cards,Components
+1090,43211500,379-BCGD,DELL,379-BCGD,I7-6820HQ Intel® CoreTM i7-6820HQ,"Quad Core, 2.7GHz, 8M cache",EACH,1,$460.00,$299.00,35%,"Options/Upgrades
+Standard Laptop",Processors,Components
+1091,43211500,631-AARQ,DELL,631-AARQ,Intel vPro,"INTEL VPRO - ME IN,",EACH,1,$30.00,$19.50,35%,"Options/Upgrades
+Standard Laptop",Support,Services
+1092,43211500,391-BCFO,DELL,391-BCFO,"Dell 14"" Ultralight Screen","14.0” FHD (1920 x 1080) Anti Glare LCD, Camera and Mic,
+WLAN/WWAN Capable",EACH,1,$110.00,$71.50,35%,"Options/Upgrades
+Ultralight Laptop",Laptop Screens,Components
+1093,43211500,631-AARG,DELL,631-AARG,Intel vPro,Intel vProTM Technology’s Advanced Management Features,EACH,1,$30.00,$19.50,35%,"Options/Upgrades
+Ultralight Laptop",Support,Services
+1094,43211500,346-BBUY,DELL,346-BBUY,Smart Card,"Smart Card, Contactless Smart Card and Fingerprint Reader for 82
+Key, Dual Point Keyboard",EACH,1,$30.00,$19.50,35%,"Options/Upgrades
+Ultralight Laptop",Keyboards & Mice,Peripherals
+1095,43211500,583-BCUS,DELL,583-BCUS,Backlit Keyboard (Ultralight),82 Key Internal Backlight English Keyboard,EACH,1,$50.00,$32.50,35%,"Options/Upgrades
+Ultralight Laptop",Keyboards & Mice,Peripherals
+1096,43211500,492-BBFM,DELL,492-BBFM,Mini DisplayPort to VGA,Dell Adapter - Mini DisplayPort to VGA,EACH,1,$37.49,$24.37,35%,"Options/Upgrades
+Ultralight Laptop",Cables & Adapters,Peripherals
+1097,43211500,391-BCFB,DELL,391-BCFB,"Dell 12.5"" Ultralight Anti-Glare Screen","12.5” FHD (1920 x 1080) Anti Glare LCD with Camera and mic, WLA",EACH,1,$110.00,$71.50,35%,"Options/Upgrades
+Ultralight Laptop",Laptop Screens,Components
+1098,43211500,379-BCFX,DELL,379-BCFX,Intel® CoreTM i5-6300U,"Dual Core, 2.4GHz, 3M cache, 15W",EACH,1,$220.00,$143.00,35%,"Options/Upgrades
+Ultralight Laptop",Processors,Components
+1099,43211500,631-AARD,DELL,631-AARD,Intel vPro,Intel vProTM Technology’s Advanced Management Features,EACH,1,$30.00,$19.50,35%,"Options/Upgrades
+Ultralight Laptop",Support,Services
+1100,43211500,583-BCUH,DELL,583-BCUH,Backlit Keyboard (Ultralight),82 Key Internal Backlight English Keyboard,EACH,1,$50.00,$32.50,35%,"Options/Upgrades
+Ultralight Laptop",Keyboards & Mice,Peripherals
+1101,43211500,555-BCMV,DELL,555-BCMV,Intel® Tri-Band Wireless,AC 18260 WiGig + Wi-Fi + BT4.1 Wireless,EACH,1,$25.00,$16.25,35%,"Options/Upgrades
+Ultralight Laptop",Networking,Components
+1102,43211500,"490-BCPK, 490-BCQJ",DELL,"490-BCPK, 490-BCQJ",Dell 512GB SSD,512GB SSD,EACH,1,$614.29,$399.29,35%,"Options/Upgrades
+Mobile Workstation",Storage Devices,Components
+1104,43211500,338-BIFC,DELL,338-BIFC,Intel Core i7-6920HQ,"Quad Core 2.90 Ghz, 3.80GHz Turbo, 8B 45W",EACH,1,$741.43,$481.93,35%,"Options/Upgrades
+Mobile Workstation",Processors,Components
+1105,43211500,"319-BBDS, 320-BBQV, 391
+BCFF",DELL,"319-BBDS, 320-BBQV, 391
+BCFF","Dell 15.6"" Workstation Screen","15.6"" UltraSharpTM FHD IPS (1920x1080) Wide View Anti-Glare LED-",EACH,1,$270.00,$175.50,35%,"Options/Upgrades
+Mobile Workstation",Laptop Screens,Components
+1106,43211500,370-ACSV,DELL,370-ACSV,Dell 32GB DDR4 Memory,"32GB (2x16GB), 2133MHz DDR4 SDRAM, Non-ECC",EACH,1,$588.57,$382.57,35%,"Options/Upgrades
+Mobile Workstation",Memory,Components
+1107,43211500,580-ACLF,DELL,580-ACLF,Backlit Keyboard (Workstation),"Internal Dual Pointing Backlit Keyboard, English",EACH,1,$50.00,$32.50,35%,"Options/Upgrades
+Mobile Workstation",Keyboards & Mice,Peripherals
+1108,43211500,338-BHRI,DELL,338-BHRI,Smart card Thunderbolt,Smart card Thunderbolt,EACH,1,$42.86,$27.86,35%,"Options/Upgrades
+Mobile Workstation",Security,Components
+1109,43211500,401-AAPS,DELL,401-AAPS,"Dell 1TB 2.5"" SATA",Secondary drive 1TB 2.5 inch 7200 rpm SATA Hard Drive,EACH,1,$198.57,$129.07,35%,"Options/Upgrades
+Mobile Workstation",Storage Devices,Components
+2000b,81110000,"997-1022,997-1024, 935-
+8283",DELL,"997-1022,997-1024, 935-
+8283",4 Year Hardware Service,4 Year Basic Hardware Service with 4 Year NBD Onsite Service,EACH,1,$577.66,$398.59,31%,"Service Options/Upgrades
+Mobile Workstation",Support,Services
+2001b,81110000,"997-1022,997-1025, 933-
+9854",DELL,"997-1022,997-1025, 933-
+9854",5 Year Hardware Service,5 Year Basic Hardware Service with 5 Year NBD Onsite Service,EACH,1,$823.23,$568.03,31%,"Service Options/Upgrades
+Mobile Workstation",Support,Services
+2002b,81110000,"997-8317, 997-8328, 997-
+8334, 935-8283",DELL,"997-8317, 997-8328, 997-
+8334, 935-8283",4 Year Hardware Service,4 Year Basic Hardware Service with NBD Onsite Service,EACH,1,$475.66,$328.21,31%,"Service Options/Upgrades
+Power Laptop",Support,Services
+2003b,81110000,"997-8317, 997-8328, 997-
+8335,933-9854",DELL,"997-8317, 997-8328, 997-
+8335,933-9854",5 Year Hardware Service,5 Year Basic Hardware Service with NBD Onsite Service,EACH,1,$588.23,$405.88,31%,"Service Options/Upgrades
+Power Laptop",Support,Services
+2004d,81110000,"804-2167, 804-2169, 935-
+8283",DELL,"804-2167, 804-2169, 935-
+8283",4 Year Hardware Service,"4 Year Hardware Service with In-Home/Onsite Service After Remote
+Diagnosis",EACH,1,$516.66,$356.50,31%,"Service Options/Upgrades
+Ultralight Laptop",Support,Services
+2005d,81110000,"804-2167, 804-2170,933-
+9854",DELL,"804-2167, 804-2170,933-
+9854",5 Year Hardware Service,"5 Year Hardware Service with In-Home/Onsite Service After Remote
+Diagnosis",EACH,1,$619.23,$427.27,31%,"Service Options/Upgrades
+Ultralight Laptop",Support,Services
+2006d,81110000,"997-8317, 997-8328, 997-
+8334, 935-8283",DELL,"997-8317, 997-8328, 997-
+8334, 935-8283",4 Year Hardware Service,"4 Years Hardware Service with In-Home/Onsite Service After Remote
+Diagnosis",EACH,1,$475.66,$328.21,31%,"Service Options/Upgrades
+Standard Laptop",Support,Services
+2007d,81110000,"997-8317, 997-8328, 997-
+8335,933-9854",DELL,"997-8317, 997-8328, 997-
+8335,933-9854",5 Year Hardware Service,"5 Years Hardware Service with In-Home/Onsite Service After Remote
+Diagnosis",EACH,1,$588.23,$405.88,31%,"Service Options/Upgrades
+Standard Laptop",Support,Services
+2008b,81110000,"804-2238, 804-2240,935-
+8283",DELL,"804-2238, 804-2240,935-
+8283",4 Year Hardware Service,"Ultralight 14"" 4 Year Hardware Service with Onsite Service After
+Remote Diagnosis",EACH,1,$475.66,$328.21,31%,"Service Options/Upgrades
+Ultralight Laptop",Support,Services
+2009b,81110000,"804-2238, 804-2241,933-
+9854",DELL,"804-2238, 804-2241,933-
+9854",5 Year Hardware Service,"Ultralight 14"" 5 Year Hardware Service with Onsite Service After
+Remote Diagnosis",EACH,1,$588.23,$405.88,31%,"Service Options/Upgrades
+Ultralight Laptop",Support,Services
+2010,81110000,988-5542,DELL,988-5542,Extended Battery Service 2 Year,2 Years Extended Battery Service for Years 2 and 3 of System Life,EACH,1,$89.00,$61.41,31%,"Service Options/Upgrades
+All Laptops",Support,Services
+2011,81110000,"997-8380, 997-8381, 997-
+8382, 997-8383, 997-8317,
+997-8366",DELL,"997-8380, 997-8381, 997-
+8382, 997-8383, 997-8317,
+997-8366",Extended Battery Service 3 Year,3 Years ProSupport Plus with Next Business Day Onsite Service,EACH,1,$541.00,$351.65,35%,"Service Options/Upgrades
+Standard Laptop",Support,Services
+2012,81110000,"998-0538, 998-0547, 998-
+0548,998-0549,998-0550",DELL,"998-0538, 998,0547, 998-
+0548,998-0549,998-0550",ProSupport Plus 3 Year,"Ultralight 12"" 3 Year ProSupport Plus with Next Business Day Onsite",EACH,1,$612.00,$397.80,35%,"Service Options/Upgrades
+Ultralight Laptop",Support,Services
+2013,81110000,"804-2238, 804-2244",DELL,"804-2238, 804-2244",ProSupport Plus 3 Year,"Ultralight 14"" 3 Year Prosupport warranty",EACH,1,$427.00,$277.55,35%,"Service Options/Upgrades
+Ultralight Laptop",Support,Services
+2014,81110000,"804-2238, 804-2256, 804-
+2257, 804-2258, 804-2259",DELL,"804-2238, 804-2256, 804-
+2257, 804-2258, 804-2259",ProSupport Plus 3 Year,"Ultralight 14"" 3 Year ProSupport Plus with Next Business Day Onsite
+Service",EACH,1,$541.00,$351.65,35%,"Service Options/Upgrades
+Ultralight Laptop",Support,Services
+,81110000,"365-1245,365-1401",DELL,"365-1245,365-1401",Computrace 3 Year,Computrace 3 Year,EACH,1,$174.95,$134.71,23%,"Value Added Services
+All Laptops",Support,Services
+3001,81110000,TIG-AIN-NBK,TIG,TIG-AIN-NBK,Asset Information,Asset Information via Internet,EACH,1,,,23%,"Value Added Services
+All Laptops",Support,Services
+3002,81110000,TIG-ATG-NBK,TIG,TIG-ATG-NBK,Asset Tagging Services,Asset Tagging Services - Customer Provided Tags,EACH,1,$10.00,$7.70,23%,"Value Added Services
+All Laptops",Support,Services
+3003,81110000,TIG-DIS-NBK,TIG,TIG-DIS-NBK,Take-Back Services,Take-Back Services,EACH,1,$10.00,$7.70,23%,"Value Added Services
+All Laptops",Support,Services
+3004,81110000,TIG-DLG-NBK,TIG,TIG-DLG-NBK,Deployments & Logistics Services,Deployments & Logistics Services,EACH,1,46,$35.42,23%,"Value Added Services
+All Laptops",Support,Services
+3005,81110000,TIG-EMG-NBK,TIG,TIG-EMG-NBK,Emergency Services,Emergency Services ( 4 hour response),EACH,1,58,$44.66,23%,"Value Added Services
+All Laptops",Support,Services
+3006,81110000,TIG-IMG-NBK,TIG,TIG-IMG-NBK,Imaging,Imaging,EACH,1,27,$20.79,23%,"Value Added Services
+All Laptops",Support,Services
+3007,81110000,TIG-INS-NBK,TIG,TIG-INS-NBK,Installation Services,Installation Services,EACH,1,$40.00,$30.80,23%,"Value Added Services
+All Laptops",Support,Services
+3008,81110000,TIG-SWC-NBK,TIG,TIG-SWC-NBK,Self-Warranty Certification,Self-Warranty Certification,EACH,1,,,23%,"Value Added Services
+All Laptops",Support,Services
+100-C,43211507,T6V32UP,HP,T6V32UP,HP ProDesk 600 G2 SFF Business PC,"Single
+Unit (SFF) Packaging, ENERGY STAR Qualified
+Label, HP ProDesk 600 SFF Platinum G2
+Chassis, Microsoft Windows 7 Professional 64,
+Intel Core i5-6500 3.2G 6M 2133 4C CPU, 4GB
+DDR4-2133 DIMM (1x4GB) RAM, 500GB 7200
+RPM SATA 6G 3.5 HDD, HP USB Business Slim
+Keyboard
+HP USB Mouse, 9.5mm Slim Desktop, uperMulti
+DVDRW ODD, 3/3/3 SFF Warranty US, HP
+ProDesk 600 Country Kit US, Intel Inside Core i5",each,1,$901.00,450.5,50%,Core Standard Desktop,Standard,Desktops
+102-B,43211507,W3U92UP,HP,W3U92UP,"HP EliteDesk 800
+G2 SFF Business PC","Single Unit (SFF)
+Packaging, ENERGY STAR Qualified Label
+HP EliteDesk 800 SFF Platinum G2 Chassis
+Microsoft Windows 7 Professional 64, Intel Core
+i5-6500 3.2G 6M 2133 4C CPU, 4GB DDR4-2133
+(1x4GB) RAM, 500GB 7200 RPM SATA 6G 3.5
+HDD, HP USB Business Slim Keyboard, HP USB
+Mouse, 9.5mm Slim Desktop SuperMulti DVDRW
+ODD, 3/3/3 (material/labor/onsite) SFF/ST
+Warranty US
+HP EliteDesk 800 Country Kit US, Intel Inside
+Core i5 SFF Label",each,1,$983.00,491.5,50%,Core Standard Desktop,Standard,Desktops
+101-C,43211507,T6V33UP,HP,T6V33UP,HP ProDesk 600 G2 MT Business PC,"Single Unit
+(MT) Packaging, ENERGY STAR Qualified Label,
+HP ProDesk 600 MT Platinum G2 Chassis,
+Microsoft Windows 7 Professional 64, Intel Core
+i5-6500 3.2G 6M 2133 4C CPU, 4GB DDR4-2133
+DIMM (1x4GB) RAM, 500GB 7200 RPM SATA
+6G 3.5 HDD, HP USB Business Slim Keyboard,
+HP USB Mouse, 9.5mm Slim Desktop SuperMulti
+DVDRW, DD, 3/3/3 (material/labor/onsite) MT
+Warranty US, HP ProDesk 600 Country Kit US,
+Intel Inside Core i5 TWR/MT Label",each,1,$952.00,476,50%,Core Standard Desktop,Standard,Desktops
+103-B,43211507,W3U93UP,HP,W3U93UP,HP EliteDesk 800 G2 TWR Business PC,"Single Unit (TWR)
+Packaging, ENERGY STAR Qualified Label, HP
+EliteDesk 800 TWR Platinum G2 Chassis,
+Microsoft Windows 7 Professional 64, Intel Core
+i5-6500 3.2G 6M 2133 4C CPU, 4GB DDR4-2133
+(1x4GB) RAM, 500GB 7200 RPM SATA 6G 3.5
+HDD, HP USB Business Slim Keyboard, HP USB
+Mouse, 9.5mm Slim Desktop SuperMulti DVDRW
+ODD, 3/3/3 (material/labor/onsite) TWR Warranty
+US, HP EliteDesk 800 Country Kit US, Intel Inside
+Core i5 TWR/MT Label",each,1,"$1,019.00",509.5,50%,Core Standard Desktop,Standard,Desktops
+200-C,43211507,T6U97UP,HP,T6U97UP,HP EliteDesk 800 G2 SFF Business PC,"Single Unit (SFF)
+Packaging, ENERGY STAR Qualified Label, HP
+EliteDesk 800 SFF Platinum G2 Chassis,
+Microsoft Windows 7 Professional 64, Intel Core
+i7-6700 3.4G 8M 2133 4C CPU, 8GB DDR4-2133
+(2x4GB) RAM, 500GB 7200 RPM SATA 6G 3.5
+HDD, HP USB Business Slim Keyboard, HP USB
+Mouse, 9.5mm Slim Desktop SuperMulti DVDRW
+ODD, 3/3/3 (material/labor/onsite) SFF/ST
+Warranty US, HP EliteDesk 800 Country Kit US,
+Intel Inside Core i7 SFF Label",each,1,"$1,234.00",617,50%,Core Power Desktop,Performance,Desktops
+400-B,43211507,F5A53AA#ABA,HP,F5A53AA#ABA,HP t620 Flexible Series AMD Thin Client WES7E,"
+AMD Fusion t56N 2nd Gen. 1.65GHz dual core
+1MB L2 Cache, 4GB (1x4GB) RAM DDR3-1600,
+16 GB SSD, 3/3/0 Warranty",each,1,$720.00,360,50%,Core Thin Client Desktop,Thin Client,Desktops
+1004-A,43211902,L1G56AV,HP,L1G56AV,AMD Radeon R9 350,2GB DH PCIe x16 GFX,each,1,$159.00,63.6,60%,POWER DESKTOP 800 Upgrade,Video Cards,Components
+1007-A,43211902,N1T21AV,HP,N1T21AV,Intel 8260,802.11ac PCIe-CL BT VPro,each,1,$150.00,60,60%,POWER DESKTOP 800 Upgrade,Networking,Components
+1009-A,43211902,L1Z45AV,HP,L1Z45AV,HP Slim Desktop DVD-ROM,Slim Desktop DVD-ROM ODD,each,1,$28.00,11.2,60%,POWER DESKTOP 800 Upgrade,Storage Devices,Components
+1010-A,43211902,N8G29AV,HP,N8G29AV,Intel Core i5-6600 CPU,3.3G 6M 2133 4C CPU,each,1,$835.00,334,60%,600 Desktop Upgrades,Processors,Components
+1011-B,43211902,L1Q07AV,HP,L1Q07AV,HP 8GB DDR4 Memory,"8GB (2x4GB), DDR4-2133 DIMM RAM",each,1,$215.00,86,60%,optiplex,Memory,Components
+1012-A,43211902,L1P96AV,HP,L1P96AV,AMD Radeon R9 350,2GB DH PCIe x16 GFX,each,1,$220.00,88,60%,600 Desktop Upgrades,Video Cards,Components
+1013-A,43211902,L1Q19AV,HP,L1Q19AV,Intel 7265,802.11AC PCIe BT nVPr,each,1,$81.00,32.4,60%,600 Desktop Upgrades,Networking,Components
+1014-A,43211902,L2B27AV,HP,L2B27AV,HP Slim Desktop DVD-ROM,Slim Desktop DVD-ROM ODD,each,1,$75.00,30,60%,600 Desktop Upgrades,Storage Devices,Components
+1015-B,43211902,L1G54AV,HP,L1G54AV,HP 16GB DDR4 Memory,16GB DDR4-2133 DIMM (2x8GB) RAM,each,1,$520.00,208,60%,POWER DESKTOP 800 Upgrade,Memory,Components
+1018-A,43211902,L1Z12AV,HP,L1Z12AV,HP 1TB SATA HDD,1TB 7200 RPM SATA 6G HDD,each,1,$175.00,70,60%,POWER DESKTOP 800 Upgrade,Storage Devices,Components
+1019-A,43211902,L1Z20AV,HP,L1Z20AV,"HP 256GB 2.5"" SSD",256GB SATA 2.5 3D SSD,each,1,$575.00,230,60%,POWER DESKTOP 800 Upgrade,Storage Devices,Components
+1020,43211902,M9S33AV,HP,M9S33AV,"HP 180GB 2.5"" SSD",180GB SATA 2.5 Non-SED SSD,each,1,$297.00,118.8,60%,POWER DESKTOP 800 Upgrade,Storage Devices,Components
+1023-A,43211902,L1P73AV,HP,L1P73AV,DisplayPort to DVI-D,HP DisplayPort To DVI-D Adapter,each,1,$12.00,4.8,60%,POWER DESKTOP 800 Upgrade,Cables & Adapters,Peripherals
+1025-A,43211902,L4K62AV,HP,L4K62AV,HP 8GB DDR4 Memory,8GB DDR4-2133 SODIMM (2x4GB) RAM,each,1,$192.00,76.8,60%,AOI Options Upgrades,Memory,Components
+1026-C,43211902,L4K07AV,HP,L4K07AV,HP 128GB SATA SSD,128GB SATA 2.5 SSD,each,1,$160.00,64,60%,AiO 800 Options Upgrades,Storage Devices,Components
+1028-A,43211902,N1U53AV,HP,N1U53AV,HP Recline Stand,HP Recline Stand,each,1,$175.00,70,60%,AiO Upgrade,Mounting,Peripherals
+1030,43211902,VN567AA,HP,VN567AA,DisplayPort Cable Kit,Display port cable kit,each,1,$25.00,10,60%,Options Upgrades,Cables & Adapters,Peripherals
+1032-A,43211902,L1W03AV,HP,L1W03AV,HP 16GB DDR4 Memory,16GB DDR4-2133 SODIMM (2x8GB) RAM,each,1,$400.00,160,60%,800 Mini Upgrades,Memory,Components
+1034-A,43211902,N8G54AV,HP,N8G54AV,Intel 8260,Intel 8260 802.11ac M.2 BT VPro,each,1,$75.00,30,60%,800 Mini Upgrades,Networking,Components
+1035-A,43211902,N8G38AV,HP,N8G38AV,HP 120GB SATA SSD,120GB SATA 2.5 Opal2 SED SSD,each,1,$275.00,10,60%,800 Mini Upgrades,Storage Devices,Components
+1037-A,43211902,N8G41AV,HP,N8G41AV,HP 180GB SATA SSD,180GB SATA 2.5 Non-SED SSD,each,1,$350.00,140,60%,800 Mini Upgrades,Storage Devices,Components
+1038-A,43211902,N8G42AV,HP,N8G42AV,HP 180GB SATA SSD,180GB SATA 2.5 Opal2 SED SSD,each,1,$350.00,140,60%,800 Mini Upgrades,Storage Devices,Components
+1039-A,43211902,L2A59AV,HP,L2A59AV,HP 1TB SATA SSHD,1TB SATA 6G 2.5 8G SSHD,each,1,$175.00,70,60%,800 Mini Upgrades,Storage Devices,Components
+1040-A,43211902,L2A62AV,HP,L2A62AV,HP 256GB SSD,256GB SATA 2.5 Opal2 SED SSD,each,1,$500.00,200,60%,800 Mini Upgrades,Storage Devices,Components
+1041-A,43211902,L3N90AV,HP,L3N90AV,HP EliteOne 800 G2 All-In-One,HP EliteOne 800 G2 23-in Non-Touch AiO,each,1,"$2,075.00",830,60%,AiO 800 Options Upgrades,All-In-One,Desktops
+1042,43211902,D9J19AA,HP,D9J19AA,HP Business Speakers,HP Business Speakers,each,1,$50.00,20,60%,Options Upgrades,Headsets Microphones & Speakers,Peripherals
+1043,43211902,DC198A,HP,DC198A,DVI Cable Kit,HP DVI Cable Kit,each,1,$30.00,12,60%,Options Upgrades,Cables & Adapters,Peripherals
+1044,43211902,AS615AA,HP,AS615AA,DisplayPort to VGA,HP DisplayPort To VGA Adapter,each,1,$50.00,20,60%,Options Upgrades,Cables & Adapters,Peripherals
+1045,43211902,DL139A,HP,DL139A,DVI Video Splitter,"DMS-59 to Dual DVI Cable Kit,accessory",each,1,$40.00,16,60%,Options Upgrades,Cables & Adapters,Peripherals
+1046,43211902,NL571AA,HP,NL571AA,USB Graphics Adapter,HP USB Graphics Adapter,each,1,$73.00,29.2,60%,Options Upgrades,Cables & Adapters,Peripherals
+1047,43211902,BU516AA,HP,BU516AA,HP Mobile DVDRW Drive,HP Mobile USB DVDRW Drive,each,1,$125.00,50,60%,Options Upgrades,Storage Devices,Components
+1048,43211902,XP688AA,HP,XP688AA,DMS59 to DisplayPort Splitter,HP DMS-59 to dual DisplayPort Adapter,each,1,$40.00,16,60%,Options Upgrades,Cables & Adapters,Peripherals
+1049,43211902,GS567AA,HP,GS567AA,DMS59 to VGA Splitter,HP DMS 59 to Dual VGA Cable Kit,each,1,$30.00,12,60%,Options Upgrades,Cables & Adapters,Peripherals
+1050,43211902,NQ576AA,HP,NQ576AA,HP LCD Speaker Bar,HP LCD Speaker Bar,each,1,$42.50,17,60%,Options Upgrades,Headsets Microphones & Speakers,Peripherals
+1051,43211902,E0X93AA,HP,E0X93AA,Intel 6205,Intel 6205 802.11 a/b/g/n PCIe x1 WLAN,each,1,$85.00,34,60%,Options Upgrades,Networking,Components
+1052,43211902,A2U57AA,HP,A2U57AA,HP Mobile DVDRW Drive,HP Mobile USB nLS DVDRW Drive,each,1,$170.00,68,60%,Options Upgrades,Storage Devices,Components
+1053,43211902,J3J88AV,HP,J3J88AV,HP 300GB HDD,300GB 10K RPM SAS SFF 1st HDD,each,1,$405.00,162,60%,Z640 Options Upgrades,Storage Devices,Components
+1054,43211902,J3J90AV,HP,J3J90AV,HP 1.2TB HDD,1.2TB 10K RPM SAS SFF 1st HDD,each,1,"$1,010.00",404,60%,Z640 Options Upgrades,Storage Devices,Components
+1055,43211902,J1P92AV,HP,J1P92AV,NVIDIA Quadro K420,"1GB DL-DVI(I)+DP 1st No
+cables included Graphics",each,1,$258.00,103.2,60%,Z640 Options Upgrades,Video Cards,Components
+1056,43211902,J1P95AV,HP,J1P95AV,NVIDIA Quadro K4200,"4GB DL-DVI(I)+2xDP 1st
+No cables included Graphics",each,1,"$1,618.00",647.2,60%,Z640 Options Upgrades,Video Cards,Components
+1057,43211902,J1P96AV,HP,J1P96AV,NVIDIA Quadro K5200,"8GB DL-DVI(I)+DL-
+DVI(D)+2xDP 1st No cables included Graphics",each,1,"$3,556.00",1422.4,60%,Z640 Options Upgrades,Video Cards,Components
+1058,43211902,J1P93AV,HP,J1P93AV,NVIDIA Quadro K620,"2GB DL-DVI(I)+DP 1st No
+cables included Graphics",each,1,$324.00,129.6,60%,Z640 Options Upgrades,Video Cards,Components
+1059,43211902,J6F21AV,HP,J6F21AV,Intel Xeon E5-1607v3 CPU,"3.10GHz 10MB 1866 4C
+CPU",each,1,$663.00,265.2,60%,Z640 Options Upgrades,Processors,Components
+1060,43211902,J6F20AV,HP,J6F20AV,Intel Xeon E5-1620v3 CPU,"3.50GHz 10MB 2133 4C
+CPU",each,1,$970.00,388,60%,Z640 Options Upgrades,Processors,Components
+1061,43211902,J6F19AV,HP,J6F19AV,Intel Xeon E5-1630v3 CPU,"3.70GHz 10MB 2133 4C
+CPU",each,1,"$1,293.00",517.2,60%,Z640 Options Upgrades,Processors,Components
+1062,43211902,J6F18AV,HP,J6F18AV,Intel Xeon E5-1650v3 CPU,"3.50GHz 15MB 2133 6C
+CPU",each,1,"$1,956.00",782.4,60%,Z640 Options Upgrades,Processors,Components
+1063,43211902,J6F17AV,HP,J6F17AV,Intel Xeon E5-1660v3 CPU,"3.00GHz 20MB 2133 8C
+CPU",each,1,"$3,395.00",1358,60%,Z640 Options Upgrades,Processors,Components
+1064,43211902,J6F16AV,HP,J6F16AV,Intel Xeon E5-1680v3 CPU,"3.20GHz 20MB 2133 8C
+CPU",each,1,"$5,335.00",2134,60%,Z640 Options Upgrades,Processors,Components
+1065,43211902,J6F36AV,HP,J6F36AV,Intel Xeon E5-2630v3 CPU,"2.40GHz 20MB 1866 8C
+CPU",each,1,"$2,102.00",840.8,60%,Z640 Options Upgrades,Processors,Components
+1066,43211902,G8X31AV,HP,G8X31AV,HP 32GB DDR4 Memory,32GB DDR4-2133 (4x8GB) 1CPU RegRAM,each,1,"$1,940.00",776,60%,Z640 Options Upgrades,Memory,Components
+1067,43211902,G8X38AV,HP,G8X38AV,HP 32GB DDR4 Memory,32GB DDR4-2133 (4x8GB) 2CPU RegRAM,each,1,"$1,940.00",776,60%,Z640 Options Upgrades,Memory,Components
+1069,43211902,K6D86AV,HP,K6D86AV,HP 64GB DDR4 Memory,64GB DDR4-2133 (4x16GB) 2CPU RegRAM,each,1,"$3,716.00",1486.4,60%,Z640 Options Upgrades,Memory,Components
+1070,43211902,G8X36AV,HP,G8X36AV,HP 16GB DDR4 Memory,16GB DDR4-2133 (4x4GB) 2CPU RegRAM,each,1,"$1,618.00",647.2,60%,Z640 Options Upgrades,Memory,Components
+1071,43211902,J3J82AV,HP,J3J82AV,HP 256GB SSD,256GB SATA 1st SSD,each,1,$578.00,231.2,60%,Z640 Options Upgrades,Storage Devices,Components
+1072,43211902,J3J83AV,HP,J3J83AV,HP 512GB SSD,512GB SATA 1st SSD,each,1,"$1,103.00",441.2,60%,Z640 Options Upgrades,Storage Devices,Components
+1073,43211902,N2Q44AV,HP,N2Q44AV,Intel Core i7-6700 CPU,3.4G 8M 2133 4C CPU,each,1,$649.00,259.6,60%,AiO 800 Options Upgrades,Processors,Components
+1074,43211902,T3N35AV,HP,T3N35AV,HP Tri-Mode Wireless Charging Stand,HP Tri-Mode Wireless Charging Stand,each,1,$450.00,180,60%,AiO 800 Options Upgrades,Mounting,Peripherals
+1800-A,43211902,M1F41AA#ABA,HP,M1F41AA#ABA,"HP EliteDisplay 20""",HP EliteDisplay E202 Monitor US,each,1,$315.00,126,60%,"Options Upgrades 19 Inch Widescreen
+Monitor O/U",Displays,Peripherals
+1801-A,43211902,L4Q76AA#ABA,HP,L4Q76AA#ABA,"HP EliteDisplay 20""",HP EliteDisplay E202 MNT US,each,1,$565.00,226,60%,"Options Upgrades 21 Inch Touchscreen
+Monitor",Displays,Peripherals
+1802-A,43211902,M1N98AA#ABA,HP,M1N98AA#ABA,"HP EliteDisplay 23""",HP EliteDisplay E232 Monitor US,each,1,400,160,60%,"Options Upgrades 22 Inch Widescreen
+Monitor",Displays,Peripherals
+1804-a,43211902,M1P02AA#ABA,HP,M1P02AA#ABA,"HP EliteDisplay 24""",HP EliteDisplay E242 Monitor US,each,1,565,226,60%,"Options Upgrades 22 Inch Widescreen
+Monitor",Displays,Peripherals
+3006,432001404,UE332E,HP,UE332E,HP 3 Year Next Business Day Onsite,HP 3y NextBusDay Onsite/DMR DT Only SVC,each,1,$21.00,168,20%,"Service Options Upgrades Standard/
+Power Desktop",Support,Services
+3007,432001404,UE333E,HP,UE333E,HP 4 Year Next Business Day Onsite,HP 4y NextBusDay Onsite/DMR DT Only SVC,each,1,$115.00,92,20%,"Service Options Upgrades Standard/
+Power Desktop",Support,Services
+3008,432001404,UE334E,HP,UE334E,HP 5 Year Next Business Day Onsite,HP 5y NextBusDay Onsite/DMR DT Only SVC,each,1,$199.00,159.2,20%,"Service Options Upgrades Standard/
+Power Desktop",Support,Services
+3009,432001404,UE342E,HP,UE342E,HP 3 Year Next Business Day Onsite,HP 3y Nbd Onsite/DMR Workstation Service,each,1,$19.00,15.2,20%,"Service Options Upgrades Workstation
+Desktop",Support,Services
+3010,432001404,UE343E,HP,UE343E,HP 4 Year Next Business Day Onsite,HP 4y Nbd Onsite/DMR Workstation Service,each,1,$91.00,72.8,20%,"Service Options Upgrades Workstation
+Desktop",Support,Services
+3011,432001404,UE344E,HP,UE344E,HP 5 Year Next Business Day Onsite,HP 5y Nbd Onsite/DMR Workstation Service,each,1,$166.00,132.8,20%,"Service Options Upgrades Workstation
+Desktop",Support,Services
+3400,432001404,U4847E,HP,U4847E,HP 3 Year Next Business Day Onsite,HP 3y NextBusDay Exchange TC Only SVC,each,1,$69.00,55.2,20%,"Service Options Upgrades Thin Client
+Desktop",Support,Services
+3401,432001404,U7927E,HP,U7927E,HP 4 Year Next Business Day Onsite,HP 4y NextBusDayExch ThinClient Only SVC,each,1,$120.00,96,20%,"Service Options Upgrades Thin Client
+Desktop",Support,Services
+3402,432001404,U7929E,HP,U7929E,HP 5 Year Next Business Day Onsite,HP 5y NextBusDayExch ThinClient Only SVC,each,1,$172.00,137.6,20%,"Service Options Upgrades Thin Client
+Desktop",Support,Services
+3500,432001404,U0J10E,HP,U0J10E,HP 4 Year Next Business Day Onsite,HP 4y Nbd Adv Exchange Standard Monitor Servi,each,1,$31.00,24.8,20%,Service Options Upgrades Monitors,Support,Services
+3501,432001404,U0J11E,HP,U0J11E,HP 5 Year Next Business Day Onsite,HP 5y Nbd Adv Exchange Standard Monitor Servi,each,1,$67.00,53.6,20%,Service Options Upgrades Monitors,Support,Services
+3502,432001404,U0J12E,HP,U0J12E,HP 4 Year Next Business Day Onsite,HP 4y Nbd Adv Exchange Large Monitor Service,each,1,$41.00,32.8,20%,Service Options Upgrades Monitors,Support,Services
+4000,81110000,999-5023,NWN,999-5023,Basic Installation,Basic Installation,each,1,$43.00,35.69,17%,VAS Installation,Support,Services
+4001,81110000,999-2001,NWN,999-2001,Basic Asset Tagging,Basic Asset Tagging,each,1,$11.00,9.13,17%,"VAS Asset Tagging - Bidder
+administration of State provided tag
+(with number)",Support,Services
+4003,81110000,999-0024,NWN,999-0024,Basic Disposal Services,Basic Disposition/Disposal Services,each,1,$11.00,9.13,17%,VAS Take-Back Services,Support,Services
+4004,81110000,999-5033,NWN,999-5033,Basic Deployment & Logistics,Basic Deployment & Logistics,each,1,$49.00,40.67,17%,"NON-Core VAS - D
+Deployment & Logistics",Support,Services
+101,43211500,W8E24UP,HP,W8E24UP,HP IDS UMA HM76 noWWAN 640 G2 BNBPC,"Win 7 Professional 64, Intel
+Core i5-6200 Dual Core, No Webcam, 14 LED HD SVA AG, 4GB 1600MHz
+2133 DDR4, 500GB 7200RPM, TP 640 G1, 3 Cell 55 WHr, No Finger Print
+Reader, DVD+/-RW SM DL UB, MDC v.92 Modem, Intel 6235 abgn 2x2 WW,
+Bluetooth 4.0, No WWAN Module, 3/3/0 Warranty, NO vPro AMT supported
+Feature, eStar IOPT Module, 65W Hardware Kit, Core i5-G6 Label, MS Win7
+Logo BLU Label, HP 3y NextBusDayOnsite Notebook Only SVC",Each,1,"1,325.00",689,48%,Core Standard Laptop,Standard,Laptops
+202,43211500,W8E25UP,HP,W8E25UP,Power Laptop 640 G2,"Win 7 Pro 64 US, UMA i5-6200U, No Webcam, 14 inch
+LED HD SVA Anti-Glare flat (1366x768), 8GB (2x4GB) 2133 DDR4, 500GB
+7200RPM, DVD+/-RW SuperMulti DL, Near Field Communication, Intel 8260 ac
+2x2 +Bluetooth 4.2 LE WW, No WWAN, No Fingerprint Reader, 3 Cell 48 WHr
+Long, Life, 65 Watt Smart nPFC AC Adapter, C5 1.0m Power Cord US, 3/3/0
+Warranty US, NO vPro AMT supported Feature, SGX Permanent Disable IOPT,
+Touchpad US, Country Localization US, eStar Enable IOPT, 3 year Battery
+Warranty Card, Core i5 G6 Label, HP 3 year Next business day Onsite
+Notebook Only Service",Each,1,"$1,395.00",$725.40,48%,Core Power Laptop,Standard,Laptops
+203,43211500,X1W81UP,HP,X1W81UP,HP PROBOOK 640 G2,"HP IDS UMA i7-6600U fWWAN 640 G2 BNBPC, Win
+7 Professional 64 640, No Webcam 640, 14 LED HD SVA AG flat 640, 8GB
+(2x4GB) 2133 DDR4, 500GB 7200RPM 640, DVD+/-RW SM DL 640, Near
+Field Communication 640, Intel 8260 ac 2x2 +BT 4.2 LE WW 640, No WWAN
+640, No Fingerprint Reader 640, 3 Cell 48 WHr Long Life 640, 65 Watt Smart
+nPFC AC Adapter 640, C5 1.0m Power Cord 640, 3/3/0 Warranty 640, AMT
+Enabled Module 640, TP 640, Country Localization 640, eStar Enable IOPT, 3
+year Battery Warranty Card, Intel Core i7 vPro G6 an Label, HP 3y
+NextBusDayOnsite Notebook Only",Each,1,"$1,715.00",$891.80,48%,Core Power Laptop,Performance,Laptops
+204,43211500,X1D03UP,HP,X1D03UP,HP ProBook 650G2 i5,"Win 7 Pro 64, UMA i5-6300U, No Webcam, 15.6 inch
+LED HD SVA Anti-Glare flat (1366x768), 4GB (1x4GB) 2133 DDR4, 500GB
+7200RPM, DVD+/-RW SuperMulti DL, No Serial Port, No Near Field
+Communication, Intel 7265 ac 2x2 nvP WW, No Fingerprint Reader, 3 Cell 48
+WHr Long Life, 65 Watt Smart nPFC AC Adapter, C5 1.0m Power Cord US,
+3/3/0 Warranty US, No vPro AMT Supported, SGX Permanent Disable IOPT,
+Dual Point Backlit US, Country Localization US, eStar Enable IOPT, 3 year
+Battery Warranty Card, Core i5 G6 Label",Each,1,"$1,850.00",$962.00,48%,Core Power Laptop,Performance,Laptops
+205,43211500,X1W80UP,HP,X1W80UP,HP ProBook 650G2 i7,"HP IDS UMA i7-6600U fWWAN 650 G2 BNBPC, Win 7 Professional 64 650,
+No Webcam 650, 15.6 LED HD SVA AG flat 650, 8GB (2x4GB) 2133 DDR4,
+500GB 7200RPM 650, DVD+/-RW SM DL 650, No Serial Port 650, No Near
+Field Communication 650, Intel 8260 ac 2x2 +BT 4.2 LE WW 650, No WWAN
+650, Fingerprint Reader 650, 3 Cell 48 WHr Long Life 650, 65 Watt Smart nPFC
+AC Adapter 650, C5 1.0m Power Cord 650, 3/3/0 Warranty 650, AMT Enabled
+Module 650, TP 650, Country Localization 650, eStar Enable IOPT, 3 year
+Battery Warranty Card, Intel Core i7 vPro G6 an Label, HP 3y
+NextBusDayOnsite Notebook Only",Each,1,"$2,250.00","$1,170.00",48%,Core Power Laptop,Performance,Laptops
+301-B,43211500,L6N36UP,HP,L6N36UP,HP IDS UMA 810 G3 BNBPC,"Win 10 Pro 64 w/DG Win7 64, Intel Core i5-
+5300U Dual Core, Webcam Integrated 720p HD, 11.6 LED HD UWVA AG, 4GB
+1600MHz DDR3L 1DM, 256GB M2 SATA-3 SSD, touchpad Backlit, No Optical
+Disc Drive, 6 Cell 44 WHr Long Life, MDC v.92 Modem, Intel 7265AN abgn
+2x2 +Bluetooth 4.0 LE MOW, 3/3/3 Warranty, AMT enabled, 45W Hardware Kit,
+eStar PCID Module, Touch PCID Module, Core i5 vPro-14 BLU Label, MS Win7
+Logo BLU Label, HP 3y NextBusDayOnsite Notebook Only SVC",Each,1,"$3,595.00","$1,869.40",48%,Core Ultralight Laptop,Ultralight,Laptops
+302,43211500,W8E26UP,HP,W8E26UP,Powerbook 820 G3 I5,"UMA i5-6300U, Win 7 Pro 64 US, No Webcam, 12.5
+inch LED HD SVA Anti-Glare (1366x768), 4GB (1x4GB) 2133 DDR4, 128GB
+M2 SATA-3 Three Layer Cell Solid State Drive, No Near Field Communication,
+Intel 8260 ac 2x2 +Bluetooth 4.2 LE WW, No WWAN, Fingerprint Reader, 3
+Cell 44 WHr Long Life, 45 Watt Smart nPFC AC Adapter, C5 1.8m Power Cord
+US, 3/3/0 Warranty US, AMT Enabled, Dual Point US, Country Localization US,
+eStar Enable IOPT, 3 year Battery Warranty Card, Core i5 vPro G6 Label , HP
+3year NBD Onsite NB Service Only",Each,1,"$1,698.00",$882.96,48%,Core Ultralight Laptop,Ultralight,Laptops
+302,43211500,W8E26UP,HP,W8E26UP,Powerbook 820 G3 I5,"UMA i5-6300U, Win 7 Pro 64 US, No Webcam, 12.5
+inch LED HD SVA Anti-Glare (1366x768), 4GB (1x4GB) 2133 DDR4, 128GB
+M2 SATA-3 Three Layer Cell Solid State Drive, No Near Field Communication,
+Intel 8260 ac 2x2 +Bluetooth 4.2 LE WW, No WWAN, Fingerprint Reader, 3
+Cell 44 WHr Long Life, 45 Watt Smart nPFC AC Adapter, C5 1.8m Power Cord
+US, 3/3/0 Warranty US, AMT Enabled, Dual Point US, Country Localization US,
+eStar Enable IOPT, 3 year Battery Warranty Card, Core i5 vPro G6 Label , HP
+3year NBD Onsite NB Service Only",Each,1,"$1,698.00",$882.96,48%,Core Ultralight Laptop,Ultralight,Laptops
+303,43211500,W8E27UP,HP,W8E27UP,Powerbook 820 G3 i7,"HP IDS UMA i7-6600U 820 G3 Base NB PC, Microsoft
+Windows 7 Professional 64 US, No Webcam, 12.5 inch LED HD SVA Anti-
+Glare (1366x768), 8 GB 2133 DDR4 (1D), 128GB M2 SATA-3 Three Layer Cell
+Solid State Drive, No Near Field Communication, Intel 8260 ac 2x2 +Bluetooth
+4.2 LE WW
+No WWAN, Fingerprint Reader, 3 Cell 44 WHr Long Life, 45 Watt Smart nPFC
+AC Adapter, C5 1.8m Power Cord US, 3/3/0 Warranty US, AMT Enabled, Dual
+Point US, Country Localization US, eStar Enable IOPT, 3 year Battery Warranty
+Card, Core i7 vPro G6 Label, HP 3year NBD Onsite NB Service Only",Each,1,"$2,475.00","$1,287.00",48%,Core Ultralight Laptop,Ultralight,Laptops
+401,43211500,X1U91UP,HP,X1U91UP,ZBook15 Studio Mobile Workstation Z15 G3,"HP IDS DSC i7-6700HQ Studio
+G3 Base NB PC, Windows 10 Pro 64 w/Downgrade Facilitation Win 7 64 US,
+Win 10 Driver DVD, NVIDIA Quadro M1000M Graphics, No Webcam, 15.6 inch
+LED FHD UWVA Anti-Glare (1920x1080), 16GB (2x8GB) 2133 DDR4, 256GB
+Z Turbo Drive PCIe Solid State Drive, Intel 8260 ac 2x2 non vPro +Bluetooth
+4.2 WW, No Fingerprint Reader, 4 Cell 64 WHr Long Life, 150 Watt Smart PFC
+Slim AC Adapter, C5 1.0m Power Cord US, 3/3/3 Warranty US, NO vPro AMT
+supported Module, M.2 Carrier Cage, SGX Permanent Disable IOPT, Clickpad
+Backlit US
+Country Localization US, 3 year Battery Warranty Card, eStar Enable IOPT,",Each,1,"$2,985.00","$1,552.20",48%,Core Mobile Workstation Laptop,Workstation,Laptops
+402,43211500,Y2P60UP,HP,Y2P60UP,HP IDS i7-6820HQ 15 G3 Base NB PC,"Windows 10 Pro 64 w/Downgrade
+Facilitation Win 7 64 US, Win 10 Driver DVD, NVIDIA Quadro M1000M 2GB
+GDDR5 Graphics, No Webcam, 15.6 inch LED FHD UWVA Anti-Glare slim
+(1920x1080), 16GB (2x8GB) 2133 DDR4, 256GB Z Turbo Drive PCIe Solid
+State Drive, WLAN I 8260 ac 2x2 +BT 4.2 Combo, No WWAN, No Fingerprint
+Reader, 9 Cell 90 WHr Long Life, 150 Watt Smart PFC Slim AC Adapter, C5
+1.0m Power Cord US, 3/3/3 Warranty US, AMT Enabled, Hard Drive Carrier
+Cage, Dual Point Backlit US, Country Localization US, 3 year Battery Warranty
+Card, eStar Enable IOPT, LBL Core i7 vPro G6 Label",each,1,"$3,075.00","$1,599.00",48%,Core Mobile Workstation Laptop,Workstation,Laptops
+1006,43211500,F2B56AA,HP,F2B56AA,HP External DVD+/-RW Drive,External USB DVD+/-RW Drive,Each,1,$171.00,$111.15,35%,Options/Upgrade Ultralight Laptop,Storage Devices,Components
+1007,43211500,E7U25AA,HP,E7U25AA,HP Notebook Battery,HP SB03XL Notebook Battery,Each,1,$146.00,$94.90,35%,Options/Upgrade Ultralight Laptop,Batteries,Components
+1014,43211500,D9Y32AA#ABA,HP,D9Y32AA#ABA,HP UltraSlim,HP UltraSlim Docking Station,Each,1,$220.00,$143.00,35%,Options/Upgrade Ultralight Laptop,Docking Stations,Peripherals
+1032-A,43211500,H5M92AA,HP,H5M92AA,HP Topload Carrying Case,HP Business Top Load Case,Each,1,$39.00,$25.35,35%,"Options/Upgrade Standard, Power Laptops",Cases & Bags,Peripherals
+1056,43211500,A896056,Logitech,A896056,Logitech External Speakers,USB Powered External Speakers Logitech: 980-000028-CA,Each,1,$25.00,$16.25,35%,"Options/Upgrade Standard, Power, Mobile Laptops",Headsets Microphones & Speakers,Peripherals
+1058,43211500,A896060,Logitech,A896060,Logitech Wireless Keyboard,Wireless keyboard Logitech: 920-004088-CA,Each,1,$60.00,$39.00,35%,Options/Upgrade All Laptops,Keyboards & Mice,Peripherals
+1059,43211500,A896059,Logitech,A896059,Logitech Headset,Logitech Headset/Headphone,Each,1,$30.00,$19.50,35%,Options/Upgrade All Laptops,Headsets Microphones & Speakers,Peripherals
+1061-A,43211500,A896049,HP,A896049,Ergonomic Keyboard,USB Ergonomic Keyboard,Each,1,$35.00,$22.75,35%,Options/Upgrade All Laptops,Keyboards & Mice,Peripherals
+1062,43211500,A896051,HP,A896051,Targus Optical Mouse,Targus USB optical mouse,Each,1,$40.00,$26.00,35%,Options/Upgrade All Laptops,Keyboards & Mice,Peripherals
+1083,43211500,T1A63AA,HP,T1A63AA,Security Cable Lock,HP Master Keyed Cable Lock 10mm,Each,1,$41.00,$26.65,35%,"Options/Upgrade Standard, Power Laptops",Security,Services
+1084,43211500,L3L45AV,HP,L3L45AV,HP 8GB DDR4 Memory,8 GB 2133 DDR4 (1D),Each,1,$123.00,$79.95,35%,Options/Upgrade Ultralight Laptop 820,Memory,Components
+1085,43211500,L3M18AV,HP,L3M18AV,HP 16GB DDR4 Memory,16 GB 2133 DDR4 (2D),Each,1,$515.00,$334.75,35%,Options/Upgrade Ultralight Laptop 820,Memory,Components
+1086,43211500,L3L49AV,HP,L3L49AV,HP 180GB SSD,180 GB M2 SATA-3 SED OPAL2 MLC SSD,Each,1,$250.00,$162.50,35%,Options/Upgrade Ultralight Laptop 820,Storage Devices,Components
+1087,43211500,M7S15AV,HP,M7S15AV,HP 240GB SSD,240 GB M2 SATA-3 MLC SSD,Each,1,$485.00,$315.25,35%,Options/Upgrade Ultralight Laptop 820,Storage Devices,Components
+1088,43211500,N4P36AV,HP,N4P36AV,HP 256GB PCIe SSD,256 GB PCIe NVMe SSD,Each,1,$510.00,$331.50,35%,Options/Upgrade Ultralight Laptop 820,Storage Devices,Components
+1089,43211500,L9U53AV,HP,L9U53AV,Webcam,Integrated HD Webcam,Each,1,$20.00,$13.00,35%,Options/Upgrade Ultralight Laptop 820,Webcams,Components
+1090,43211500,L3L39AV,HP,L3L39AV,"HP 12.5"" Ultralight Anti-Glare Screen","12.5"" LED HD SVA Anti-Glare enabled for Webcam (1366x768)",Each,1,$178.00,$115.70,35%,Options/Upgrade Ultralight Laptop 820,Laptop Screens,Components
+1091,43211500,M2K50AV,HP,M2K50AV,Integrated Fingerprint Reader,Integrated Fingerprint Reader,Each,1,$7.00,$4.55,35%,"Options/Upgrade Standard, Power Laptops 640",Security,Components
+1092,43211500,L8X75AV,HP,L8X75AV,Webcam,Integrated HD Webcam,Each,1,$10.00,$6.50,35%,"Options/Upgrade Standard, Power Laptops 640",Webcams,Components
+1093,43211500,L8U82AV,HP,L8U82AV,"HP 14"" Standard Screen",14 LED HD SVA Anti-Glare enabled for Webcam flat (1366x768),Each,1,$72.00,$46.80,35%,"Options/Upgrade Standard, Power Laptops 640",Laptop Screens,Components
+1095,43211500,L8Z30AV,HP,L8Z30AV,HP 1TB HD,1TB 5400RPM 640,Each,1,$174.00,$113.10,35%,"Options/Upgrade Standard, Power Laptops 640",Storage Devices,Components
+1096,43211500,L8Z39AV,HP,L8Z39AV,HP 180GB SSD,180 GB M2 SATA-3 SED OPAL2 MLC SSD,Each,1,$214.00,$139.10,35%,"Options/Upgrade Standard, Power Laptops 640",Storage Devices,Components
+1097,43211500,L8Z96AV,HP,L8Z96AV,HP Blu-Ray DVD+/-RW,Blu-ray ROM DVD+/-RW SuperMulti DL Drive,Each,1,$119.00,$77.35,35%,"Options/Upgrade Standard, Power Laptops 640",Storage Devices,Components
+1098,43211500,T5D77AV,HP,T5D77AV,HP 240GB SSD,240 GB M2 SATA-3 MLC SSD,Each,1,$341.00,$221.65,35%,"Options/Upgrade Standard, Power Laptops 640",Storage Devices,Components
+1099,43211500,E7U21AA,HP,E7U21AA,HP Long Life Notebook Battery,HP CA06XL Long Life Battery,Each,1,$146.00,$94.90,35%,"Options/Upgrade Standard, Power Laptops 640",Batteries,Components
+1100,43211500,H2L63AA,HP,H2L63AA,HP Comfort Grip Wireless Mouse,HP Comfort Grip Wireless Mobile Mouse,Each,1,$31.00,$20.15,35%,"Options/Upgrade Standard, Power Laptops 640",Keyboards & Mice,Peripherals
+1101,43211500,M3X50AV,HP,M3X50AV,HP 16GB DDR4 Memory,16 GB 2133 DDR4 (2D),Each,1,$287.00,$186.55,35%,"Options/Upgrade Standard, Power Laptops 650",Memory,Components
+1102,43211500,L8U71AV,HP,L8U71AV,"HP 15.6"" Standard Screen","15.6"" LED HD SVA Anti-Glare enabled for WWAN enabled for Webcam flat",Each,1,$78.00,50.7,35%,"Options/Upgrade Standard, Power Laptops 650",Laptop Screens,Components
+1104,43211500,L9Q39AV,HP,L9Q39AV,HP 180GB SSD,180 GB M2 SATA-3 SED OPAL2 MLC SSD,Each,1,$214.00,$139.10,35%,"Options/Upgrade Standard, Power Laptops 650",Storage Devices,Components
+1105,43211500,T5D78AV,HP,T5D78AV,HP 240GB SSD,240 GB M2 SATA-3 MLC SSD,Each,1,$341.00,$221.65,35%,"Options/Upgrade Standard, Power Laptops 650",Storage Devices,Components
+1106,43211500,L9Q44AV,HP,L9Q44AV,HP 512 SSD,512 GB M2 SATA-3 TLC SSD,Each,1,$486.00,$315.90,35%,"Options/Upgrade Standard, Power Laptops 650",Storage Devices,Components
+1107,43211500,L9Q53AV,HP,L9Q53AV,HP Blu-Ray DVD+/-RW,Blu-ray ROM DVD+/-RW SuperMulti DL Drive,Each,1,$119.00,$77.35,35%,"Options/Upgrade Standard, Power Laptops 650",Storage Devices,Components
+1108,43211500,M6W14AV,HP,M6W14AV,HP 512GB PCIe SSD,512GB Z Turbo Drive PCIe Solid State Drive,Each,1,$524.00,$340.60,35%,Options/Upgrade Mobile Workstation Studio,Storage Devices,Components
+1109,43211500,P2D08AV,HP,P2D08AV,HP 1TB PCIe SSD,1TB Z Turbo Drive PCIe Solid State Drive,Each,1,$839.00,$545.35,35%,Options/Upgrade Mobile Workstation Studio,Storage Devices,Components
+1110,43211500,M6V92AV,HP,M6V92AV,"HP 15.6"" HD Screen",15.6 inch LED FHD UWVA Anti-Glare enabled for Webcam (1920x1080),Each,1,$320.00,$208.00,35%,Options/Upgrade Mobile Workstation Studio,Laptop Screens,Components
+1111,43211500,M6W04AV,HP,M6W04AV,HP 32GB DDR4 Memory,"32GB (2x16GB), 2133 DDR4",Each,1,$840.00,$546.00,35%,Options/Upgrade Mobile Workstation Studio,Memory,Components
+1112,43211500,M6W23AV,HP,M6W23AV,Fingerprint Reader,Fingerprint Reader,Each,1,$27.00,$17.55,35%,Options/Upgrade Mobile Workstation Studio,Security,Components
+1113,43211500,P5Q58AA#ABA,HP,P5Q58AA#ABA,HP ZBook 150W TB3 Dock,HP ZBook 150W TB3 Dock,Each,1,$314.00,$204.10,35%,Options/Upgrade Mobile Workstation Studio,Docking Stations,Peripherals
+1114,43211500,P5Q61AA#ABA,HP,P5Q61AA#ABA,HP ZBook 200W TB3 Dock,HP ZBook 200W TB3 Dock,Each,1,$335.00,$217.75,35%,Options/Upgrade Mobile Workstation Studio,Docking Stations,Peripherals
+1115,43211500,M6V97AV,HP,M6V97AV,Webcam,WEBCAM Integrated 720p HD,Each,1,$34.00,$22.10,35%,Options/Upgrade Mobile Workstation Studio,Webcams,Components
+1116,43211500,A936061,HP,A936061,Numeric Keypad,USB Numeric Keypad,Each,1,$21.00,$13.65,35%,Options/Upgrade Mobile Workstation Studio,Keyboards & Mice,Peripherals
+1117,43211500,M9R83AV,HP,M9R83AV,Webcam,WEBCAM Integrated 720p HD,Each,1,$21.00,$13.65,35%,Options/Upgrade Mobile Workstation Laptop 15,Webcams,Components
+1118,43211500,M9R78AV,HP,M9R78AV,"HP 15.6"" HD Screen",15.6 inch LED FHD UWVA Anti-Glare enabled for Webcam slim (1920x1080),Each,1,$210.00,$136.50,35%,Options/Upgrade Mobile Workstation Laptop 15,Laptop Screens,Components
+1119,43211500,M9R72AV,HP,M9R72AV,NVIDIA Quadro M2000M,NVIDIA Quadro M2000M Graphics,Each,1,$378.00,$245.70,35%,Options/Upgrade Mobile Workstation Laptop 15,Video Cards,Components
+1120,43211500,M9R91AV,HP,M9R91AV,HP 32GB DDR4 Memory,"32GB (2x16GB), 2133MHz DDR4",Each,1,$504.00,$327.60,35%,Options/Upgrade Mobile Workstation Laptop 15,Memory,Components
+1121,43211500,M9R93AV,HP,M9R93AV,HP 64GB DDR4 Memory,"64GB (4x16GB), 2133MHz DDR4",Each,1,"$1,008.00",$655.20,35%,Options/Upgrade Mobile Workstation Laptop 15,Memory,Components
+1122,43211500,T9T62AV,HP,T9T62AV,HP 512GB SSD,512GB SATA-3 Self Encrypted OPAL2 MLC Solid State Drive,Each,1,$419.00,$272.35,35%,Options/Upgrade Mobile Workstation Laptop 15,Storage Devices,Components
+1123,43211500,T0P65AV,HP,T0P65AV,HP 1TB PCIe SSD,1TB Z Turbo Drive PCIe Solid State Drive,Each,1,$839.00,$545.35,35%,Options/Upgrade Mobile Workstation Laptop 15,Storage Devices,Components
+1124,43211500,P5Q58AA,HP,P5Q58AA,HP ZBook 150W TB3 Dock,HP ZBook 150W TB3 Dock,Each,1,$314.00,$204.10,35%,Options/Upgrade Mobile Workstation Laptop 15,Docking Stations,Peripherals
+1125,43211500,P5Q61AA#ABA,HP,P5Q61AA#ABA,HP ZBook 200W TB3 Dock,HP ZBook 200W TB3 Dock,Each,1,$335.00,$217.75,35%,Options/Upgrade Mobile Workstation Laptop 15,Docking Stations,Peripherals
+1126,43211500,M9M10AV,HP,M9M10AV,Webcam,WEBCAM Integrated 720p HD 17,Each,1,$21.00,$13.65,35%,Options/Upgrade Mobile Workstation Laptop 17,Webcams,Components
+1127,43211500,M9M07AV,HP,M9M07AV,HP 17.3 Workstation Screen,17.3 LED HD+ SVA AG f/CAM flat 17,Each,1,$158.00,$102.70,35%,Options/Upgrade Mobile Workstation Laptop 17,Laptop Screens,Components
+1128,43211500,M9M16AV,HP,M9M16AV,HP 16GB DDR4 Memory,"16GB (2x8GB), 2133 DDR4",Each,1,$231.00,$150.15,35%,Options/Upgrade Mobile Workstation Laptop 17,Memory,Components
+1129,43211500,M9M38AV,HP,M9M38AV,HP 1TB HD,1TB 7200RPM 17,Each,1,$147.00,$95.55,35%,Options/Upgrade Mobile Workstation Laptop 17,Storage Devices,Components
+1130,43211500,M9M28AV,HP,M9M28AV,HP 256GB SSD,256GB SATA-3 Self Encrypted OPAL2 Solid State Drive,Each,1,$262.00,$170.30,35%,Options/Upgrade Mobile Workstation Laptop 17,Storage Devices,Components
+1131,43211500,M9M30AV,HP,M9M30AV,HP 512GB PCIe SSD,512GB Z Turbo Drive PCIe Solid State Drive,Each,1,$524.00,$340.60,35%,Options/Upgrade Mobile Workstation Laptop 17,Storage Devices,Components
+1132,43211500,M9M04AV,HP,M9M04AV,NVIDIA Quadro M5000M,NVIDIA Quadro M5000M Graphics,Each,1,"$1,679.00","$1,091.35",35%,Options/Upgrade Mobile Workstation Laptop 17,Video Cards,Components
+1133,43211500,M9M18AV,HP,M9M18AV,HP 32GB DDR4 Memory,"32GB (2x16GB), 2133MHz DDR4",Each,1,$504.00,$327.60,35%,Options/Upgrade Mobile Workstation Laptop 17,Memory,Components
+2000,43211500,U7860E,HP,U7860E,HP 4 Year Next Business Day Onsite,"4 Year Warranty, Next Business Day, On-Site",Each,1,$220.00,$176.00,20%,"Service Options/Upgrades Standard, Power,Ultralight",Support,Services
+2001,43211500,U7861E,HP,U7861E,HP 5 Year Next Business Day Onsite,"5 Year Warranty, Next Business Day, On-Site",Each,1,$314.00,$251.20,20%,"Service Options/Upgrades Standard, Power,Ultralight",Support,Services
+2002,43211500,UF633E,HP,UF633E,HP 4 Year Next Business Day Onsite,"4 Year Warranty, Next Business Day, On-Site",Each,1,$136.00,$108.80,20%,Service Options/Upgrades Mobile Workstation Laptop,Support,Services
+2003,43211500,UF635E,HP,UF635E,HP 5 Year Next Business Day Onsite,"5 Year Warranty, Next Business Day, On-Site",Each,1,$272.00,$217.60,20%,Service Options/Upgrades Mobile Workstation Laptop,Support,Services
+2004,43211500,UG841E,HP,UG841E,HP 4 Year Next Business Day Onsite,HP 4y NextBusDay Onsite/DMR NB,Each,1,$167.00,$133.60,20%,Service Options/Upgrades Mobile Workstation Laptop,Support,Services
+3000,81110000,999-5023,NWN,999-5023,Basic Installation,Basic Installation,Each,1,$43.00,$35.69,17%,VAS Installation,Support,Services
+3001,81110000,999-2001,NWN,999-2001,Basic Asset Tagging,Basic Asset Tagging,Each,1,$11.00,$9.13,17%,"VAS sset Tagging- Bidder adminstration of Sate provided tage
+(with number)",Support,Services
+3002,81110000,Included,NWN,Included,Asset information,Asset information via internet,Each,1,,,17%,VAS Asset informatin via internet,Support,Services
+3003,81110000,Included,NWN,Included,Self-Warranty Certification,Self-Warranty Certification,Each,1,,,17%,VAS Self Warranty Certification,Support,Services
+3004,81110000,999-0003,NWN,999-0003,Basic Imaging,Basic Imaging,Each,1,$26.00,$21.58,17%,VAS Imaging,Support,Services
+3005,81110000,999-0024,NWN,999-0024,Basic Disposal Services,Basic Disposition/Disposal Services,Each,1,$11.00,$9.13,17%,VAS Take Back Services,Support,Services
+3006,81110000,999-5033,NWN,999-5033,Basic Deployment & Logistics,Basic Deployment & Logistics,Each,1,$49.00,$40.67,17%,VAS Non-Core Deployment and Logistics,Support,Services
+3007,81110000,999-5201,NWN,999-5201,Basic Emergency Services,Basic Emergency Services,Each,1,$79.00,$65.57,17%,VAS Emergency Serices (4 hours response per occurrence),Support,Services
+100c,43211900,"210-AIIJ , 806-2763",DELL,"210-AIIJ , 806-2763","Dell 19""","P1917s 19"" Standard Monitor",EACH,1,$249.99,$169.99,32%,"19 inch Standard
+MONITOR",Displays,Peripherals
+101b,43211900,858-BBCU,DELL,858-BBCU,"Dell 19.5"" Widescreen","P2016 19.5"" WideScreen
+Monitor",EACH,1,$189.99,$129.20,32%,"19 inch WideScreen
+MONITOR",Displays,Peripherals
+102a,43211900,TD2220,VIEWSONIC,TD2220,"ViewSonic 22"" Touchscreen","22"" Touchscreen Monitor",EACH,1,$445.00,$302.60,32%,"22 inch Touchscreen
+MONITOR",Displays,Peripherals
+103b,43211900,"210-AIIC, 806-2763",DELL,"210-AIIC, 806-2763","Dell 22"" Widescreen","P2217 22"" Widescreen Monitor",EACH,1,$219.99,$149.59,32%,"22 inch Widescreen
+MONITOR",Displays,Peripherals
+104c,43211900,"320-9794, 806-2763",DELL,"210-AIIM, 806-2763","Dell 24"" Widescreen","P2417H 24"" Widescreen
+Monitor",EACH,1,$299.99,$203.99,32%,"24 inch Widescreen
+MONITOR",Displays,Peripherals
+105b,43211900,VG2847SMH,VIEWSONIC,VG2847SMH,"ViewSonic 28"" Widescreen","28"" Widescreen Monitor",EACH,1,$552.00,$375.36,32%,"28 inch Widescreen
+MONITOR",Displays,Peripherals
+200a,43211900,A3793590,DELL,A3793590,DVI 6.6' Cable,"MS - Display cable - DVI-D M -
+DVI-D M - 6.6 ft (included in
+the 22"" widescreen monitor)",EACH,1,$12.99,$8.96,31%,Options Upgrades,Cables & Adapters,Peripherals
+201b,43211900,A7639742,DELL,A7639742,DisplayPort 6' Cable,"6FT C2G DISPLAYPORT
+CABLE M/M BLK",EACH,1,$15.99,$11.04,31%,Options Upgrades,Cables & Adapters,Peripherals
+202,81110000,318-2885,DELL,318-2885,Dell Soundbar,"Dell USB Monitor Soundbar
+AC511",EACH,1,$34.99,$24.14,31%,Options Upgrades,Headsets Microphones & Speakers,Peripherals
+203,81110000,332-1235,DELL,332-1235,"Dell MSA14 Single Monitor
+Arm Stand","Dell MSA14 Single Monitor
+Arm Stand",EACH,1,$129.99,$89.69,31%,Options Upgrades,Mounting,Peripherals
+204,81110000,332-1236,DELL,332-1236,"Dell MDS14 Dual Monitor
+Stand","Dell MDS14 Dual Monitor
+Stand",EACH,1,$169.99,$117.29,31%,Options Upgrades,Mounting,Peripherals
+205,81110000,855-BBBN,DELL,855-BBBN,"Dell MDA17 Dual Monitor
+Stand","Dell MDA17 Dual Monitor
+Stand",EACH,1,$249.99,$172.50,31%,Options Upgrades,Mounting,Peripherals
+300a,81110000,"983-7873, 986-4872",DELL,"983-7873, 986-4872",Dell 4 Year Warranty,"Upgrade 4 Year Warranty
+Exchange Replacement",EACH,1,$39.00,$26.91,31%,"Service Options
+Upgrades",Support,Services
+301a,81110000,983-1324,DELL,983-1324,Dell 5 Year Warranty,"Upgrade 5 Year Warranty
+Exchange Replacement",EACH,1,$49.00,$33.81,31%,"Service Options
+Upgrades",Support,Services
+302b,81110000,810-6398,DELL,810-6398,Dell 4 Year Warranty,"Upgrade 4 Year Warranty
+Exchange Replacement",EACH,1,$100.00,$69.00,31%,"Service Options
+Upgrades for 30 inch
+monitors",Support,Services
+303b,81110000,810-6399,DELL,810-6399,Dell 5 Year Warranty,"Upgrade 5 Year Warranty
+Exchange Replacement",EACH,1,$150.00,$103.50,31%,"Service Options
+Upgrades for 30 inch
+monitors",Support,Services
+304,81110000,LCD-EEEW-27-01,VIEWSONIC,LCD-EEEW-27-01,ViewSonic 4 Year Warranty,"Upgrade 4 Year Warranty
+Exchange Replacement",EACH,1,$72.00,$49.68,31%,"Service Options
+Upgrades",Support,Services
+305,81110000,LCD-EEEW-27-02,VIEWSONIC,LCD-EEEW-27-02,ViewSonic 5 Year Warranty,"Upgrade 5 Year Warranty
+Exchange Replacement",EACH,1,$121.00,$83.49,31%,"Service Options
+Upgrades",Support,Services
+306,81110000,806-2756,DELL,806-2756,Dell 4 Year Warranty,"Upgrade 4 Year Warranty
+Exchange Replacement",EACH,1,$19.00,$13.11,31%,"P1917s, P2217,
+P2417H Service
+Options Upgrades",Support,Services
+999,99990000,987-zyx,ADOBE,adb-123,Adobe Photoshop CS6,"The world’s best imaging and design app is at the core of almost every creative project. Work across desktop and mobile devices to create and enhance your photographs, web and mobile app designs, 3D artwork, videos, and more.",EACH,1,$299.00,$199.00,30%,Software,Design,Software
+998,99980000,986-abc,MICROSOFT,mst-123,Microsoft Office Business 2016,"Full installed Office 2016 versions of Word Excel PowerPoin, OneNote and Outlook, For 1 PC",EACH,1,$229.99,$99.99,55%,Software,Productivity,Software
diff --git a/priv/repo/migrations/20170217185137_create_catalog_item.exs b/priv/repo/migrations/20170217185137_create_catalog_item.exs
new file mode 100644
index 0000000..0c37ad6
--- /dev/null
+++ b/priv/repo/migrations/20170217185137_create_catalog_item.exs
@@ -0,0 +1,23 @@
+defmodule Adpq.Repo.Migrations.CreateCatalogItem do
+ use Ecto.Migration
+
+ def change do
+ create table(:catalog_items) do
+ add :clin, :string
+ add :unspc, :string
+ add :manufacturer, :string
+ add :sku, :string
+ add :description, :text
+ add :unit_of_measure, :string
+ add :quantity_in_uom, :integer
+ add :list_price, :integer
+ add :contract_unit_price, :integer
+ add :contract_discount, :integer
+ add :category, :string
+ add :super_category, :string
+
+ timestamps()
+ end
+
+ end
+end
diff --git a/priv/repo/migrations/20170220201218_create_user.exs b/priv/repo/migrations/20170220201218_create_user.exs
new file mode 100644
index 0000000..e25cccd
--- /dev/null
+++ b/priv/repo/migrations/20170220201218_create_user.exs
@@ -0,0 +1,14 @@
+defmodule Adpq.Repo.Migrations.CreateUser do
+ use Ecto.Migration
+
+ def change do
+ create table(:users) do
+ add :name, :string, unique: true
+ add :password, :string
+ add :role, :string
+
+ timestamps()
+ end
+
+ end
+end
diff --git a/priv/repo/migrations/20170221165825_alter_catalog_item_categories.exs b/priv/repo/migrations/20170221165825_alter_catalog_item_categories.exs
new file mode 100644
index 0000000..bfc4079
--- /dev/null
+++ b/priv/repo/migrations/20170221165825_alter_catalog_item_categories.exs
@@ -0,0 +1,13 @@
+defmodule Adpq.Repo.Migrations.AlterCatalogItemCategories do
+ use Ecto.Migration
+
+ def change do
+ alter table(:catalog_items) do
+ remove :category
+ add :name, :string
+ add :long_category, :text
+ add :top_level_category, :string
+ add :simple_category, :string
+ end
+ end
+end
diff --git a/priv/repo/migrations/20170221193947_create_cart_item.exs b/priv/repo/migrations/20170221193947_create_cart_item.exs
new file mode 100644
index 0000000..869112a
--- /dev/null
+++ b/priv/repo/migrations/20170221193947_create_cart_item.exs
@@ -0,0 +1,14 @@
+defmodule Adpq.Repo.Migrations.CreateCartItem do
+ use Ecto.Migration
+
+ def change do
+ create table(:cart_items) do
+ add :user_id, references(:users)
+ add :catalog_item_id, references(:catalog_items)
+ add :quantity, :integer
+
+ timestamps()
+ end
+
+ end
+end
diff --git a/priv/repo/migrations/20170224025502_create_order.exs b/priv/repo/migrations/20170224025502_create_order.exs
new file mode 100644
index 0000000..79f508d
--- /dev/null
+++ b/priv/repo/migrations/20170224025502_create_order.exs
@@ -0,0 +1,13 @@
+defmodule Adpq.Repo.Migrations.CreateOrder do
+ use Ecto.Migration
+
+ def change do
+ create table(:orders) do
+ add :user_id, references(:users)
+ add :status, :string
+
+ timestamps()
+ end
+
+ end
+end
diff --git a/priv/repo/migrations/20170224030644_create_order_item.exs b/priv/repo/migrations/20170224030644_create_order_item.exs
new file mode 100644
index 0000000..37fe517
--- /dev/null
+++ b/priv/repo/migrations/20170224030644_create_order_item.exs
@@ -0,0 +1,15 @@
+defmodule Adpq.Repo.Migrations.CreateOrderItem do
+ use Ecto.Migration
+
+ def change do
+ create table(:order_items) do
+ add :order_id, references(:orders)
+ add :catalog_item_id, references(:catalog_items)
+ add :quantity, :integer
+ add :price, :integer
+
+ timestamps()
+ end
+
+ end
+end
diff --git a/priv/repo/migrations/20170226002454_add_users_department.exs b/priv/repo/migrations/20170226002454_add_users_department.exs
new file mode 100644
index 0000000..9bce1f7
--- /dev/null
+++ b/priv/repo/migrations/20170226002454_add_users_department.exs
@@ -0,0 +1,9 @@
+defmodule Adpq.Repo.Migrations.AddUsersDepartment do
+ use Ecto.Migration
+
+ def change do
+ alter table(:users) do
+ add :department, :string
+ end
+ end
+end
diff --git a/priv/repo/seeds.exs b/priv/repo/seeds.exs
index eabd39c..2d9b3f9 100644
--- a/priv/repo/seeds.exs
+++ b/priv/repo/seeds.exs
@@ -9,3 +9,103 @@
#
# We recommend using the bang functions (`insert!`, `update!`
# and so on) as they will fail if something goes wrong.
+
+defmodule Adpq.CatalogSeeds do
+ alias Adpq.{Repo, CatalogItem, User, CartItem, OrderItem, Order}
+ alias Adpq.CatalogItem
+ alias Adpq.User
+ import Ecto.Query
+
+ def insertRows do
+ 'priv/repo/catalog.csv'
+ |> File.stream!()
+ |> CSV.decode(headers: true)
+ |> Enum.map(&processRow/1)
+ |> Enum.each(&insertRow/1)
+ end
+
+ def clean do
+ Adpq.Repo.delete_all(OrderItem)
+ Adpq.Repo.delete_all(Order)
+ Adpq.Repo.delete_all(CartItem)
+ Adpq.Repo.delete_all(CatalogItem)
+ end
+
+ defp dollarsToInt(dollars) do
+ dollars
+ |> String.replace("$", "")
+ |> String.replace(".", "")
+ |> String.replace(",", "")
+ end
+
+ defp dollarsToInt(dollars) do
+ dollars
+ |> String.replace("$", "")
+ |> String.replace(".", "")
+ |> String.replace(",", "")
+ end
+
+ defp percentToInt(pct) do
+ String.replace(pct, "%", "")
+ end
+
+ defp cleanNewlines(text) do
+ String.replace(text, ~s(\n\r\n), ~s(\n))
+ end
+
+ defp cleanSku(sku) do
+ [clean] =
+ sku
+ |> String.split(",")
+ |> Enum.take(1)
+ clean
+ end
+
+ defp fieldMappings do
+ %{
+ "contract_unit_price" => &dollarsToInt/1,
+ "contract_discount" => &percentToInt/1,
+ "list_price" => &dollarsToInt/1,
+ "description" => &cleanNewlines/1,
+ "long_category" => &cleanNewlines/1,
+ "sku" => &cleanSku/1
+ }
+ end
+
+ defp processRow(row) do
+ row
+ |> Enum.map(fn {k, v} -> if Map.has_key?(fieldMappings(), k) do {k, Map.get(fieldMappings(), k).(v)} else {k, v} end end)
+ |> Enum.into(%{})
+ end
+
+ defp insertRow(row) do
+ sku = row["sku"]
+ exists =
+ CatalogItem
+ |> where(sku: ^sku)
+ |> Repo.one
+ case exists do
+ %CatalogItem{} -> IO.puts("SKU #{sku} already exists. Skipping..")
+ _ -> row = Adpq.Repo.insert(CatalogItem.changeset(%CatalogItem{}, row))
+ inspect row
+ end
+ end
+end
+
+defmodule Adpq.UserSeeds do
+ alias Adpq.Repo
+ alias Adpq.User
+
+ def create_admin do
+ User.find_or_create_by_name(%{"name" => "admin", "password" => "admin", "role" => "ADMIN"})
+ end
+
+ def create_user do
+ User.find_or_create_by_name(%{"name" => "user", "password" => "user", "role" => "USER"})
+ end
+end
+
+Adpq.CatalogSeeds.clean()
+Adpq.CatalogSeeds.insertRows()
+Adpq.UserSeeds.create_admin()
+Adpq.UserSeeds.create_user()
diff --git a/script/ci/deploy-develop.sh b/script/ci/deploy-develop.sh
new file mode 100755
index 0000000..0c6efd9
--- /dev/null
+++ b/script/ci/deploy-develop.sh
@@ -0,0 +1,98 @@
+#!/usr/bin/env bash
+
+# more bash-friendly output for jq
+JQ="jq --raw-output --exit-status"
+
+export MIX_ENV="develop"
+export PATH="$HOME/dependencies/erlang/bin:$HOME/dependencies/elixir/bin:$PATH"
+
+configure_aws_cli(){
+ aws --version
+ aws configure set default.region us-west-1
+ aws configure set default.output json
+}
+
+deploy_cluster() {
+
+ family="adpq-task-family"
+
+ make_task_def
+ register_definition
+ if [[ $(aws ecs update-service --cluster ADPQ --service adpq-web --task-definition $revision | \
+ $JQ '.service.taskDefinition') != $revision ]]; then
+ echo "Error updating service."
+ return 1
+ fi
+ # Skip stale version check. remove this and uncomment below if desired
+ echo "Deployed!"
+ return 0
+ # # wait for older revisions to disappear
+ # # not really necessary, but nice for demos
+ # for attempt in {1..30}; do
+ # if stale=$(aws ecs describe-services --cluster QDPQ --services adpq-web | \
+ # $JQ ".services[0].deployments | .[] | select(.taskDefinition != \"$revision\") | .taskDefinition"); then
+ # echo "Waiting for stale deployments:"
+ # echo "$stale"
+ # sleep 5
+ # else
+ # echo "Deployed!"
+ # return 0
+ # fi
+ # done
+ # echo "Service update took too long."
+ # return 1
+}
+
+make_task_def(){
+ task_template='[
+ {
+ "name": "adpq-web",
+ "image": "%s.dkr.ecr.us-west-1.amazonaws.com/adpq:%s",
+ "essential": true,
+ "memory": 200,
+ "cpu": 10,
+ "portMappings": [
+ {
+ "containerPort": 4000,
+ "hostPort": 80,
+ "protocol": "tcp"
+ }
+ ],
+ "environment": [
+ {
+ "name": "MIX_ENV",
+ "value": "%s"
+ },
+ {
+ "name": "RDS_PASSWORD",
+ "value": "%s"
+ },
+ {
+ "name": "HONEYBADGER_API_KEY",
+ "value": "%s"
+ }
+ ]
+ }
+ ]'
+ task_def=$(printf "$task_template" $AWS_ACCOUNT_ID $CIRCLE_SHA1 $MIX_ENV $RDS_DEVELOP_PASSWORD $HONEYBADGER_API_KEY)
+}
+
+push_ecr_image(){
+ eval $(aws ecr get-login --region us-west-1)
+ docker push $AWS_ACCOUNT_ID.dkr.ecr.us-west-1.amazonaws.com/adpq:$CIRCLE_SHA1
+}
+
+register_definition() {
+
+ if revision=$(aws ecs register-task-definition --container-definitions "$task_def" --family $family | $JQ '.taskDefinition.taskDefinitionArn'); then
+ echo "Revision: $revision"
+ else
+ echo "Failed to register task definition"
+ return 1
+ fi
+
+}
+configure_aws_cli
+docker build --rm=false --build-arg MIX_ENV=develop --build-arg RDS_PASSWORD=$RDS_DEVELOP_PASSWORD -t $AWS_ACCOUNT_ID.dkr.ecr.us-west-1.amazonaws.com/adpq:$CIRCLE_SHA1 .
+push_ecr_image
+deploy_cluster
\ No newline at end of file
diff --git a/script/ci/deploy-prod.sh b/script/ci/deploy-prod.sh
new file mode 100755
index 0000000..b18cdd6
--- /dev/null
+++ b/script/ci/deploy-prod.sh
@@ -0,0 +1,98 @@
+#!/usr/bin/env bash
+
+# more bash-friendly output for jq
+JQ="jq --raw-output --exit-status"
+
+export MIX_ENV="prod"
+export PATH="$HOME/dependencies/erlang/bin:$HOME/dependencies/elixir/bin:$PATH"
+
+configure_aws_cli(){
+ aws --version
+ aws configure set default.region us-west-1
+ aws configure set default.output json
+}
+
+deploy_cluster() {
+
+ family="adpq-task-family"
+
+ make_task_def
+ register_definition
+ if [[ $(aws ecs update-service --cluster ADPQ-PROD --service adpq-web --task-definition $revision | \
+ $JQ '.service.taskDefinition') != $revision ]]; then
+ echo "Error updating service."
+ return 1
+ fi
+ # Skip stale version check. remove this and uncomment below if desired
+ echo "Deployed!"
+ return 0
+ # # wait for older revisions to disappear
+ # # not really necessary, but nice for demos
+ # for attempt in {1..30}; do
+ # if stale=$(aws ecs describe-services --cluster QDPQ --services adpq-web | \
+ # $JQ ".services[0].deployments | .[] | select(.taskDefinition != \"$revision\") | .taskDefinition"); then
+ # echo "Waiting for stale deployments:"
+ # echo "$stale"
+ # sleep 5
+ # else
+ # echo "Deployed!"
+ # return 0
+ # fi
+ # done
+ # echo "Service update took too long."
+ # return 1
+}
+
+make_task_def(){
+ task_template='[
+ {
+ "name": "adpq-web",
+ "image": "%s.dkr.ecr.us-west-1.amazonaws.com/adpq:%s",
+ "essential": true,
+ "memory": 200,
+ "cpu": 10,
+ "portMappings": [
+ {
+ "containerPort": 4000,
+ "hostPort": 80,
+ "protocol": "tcp"
+ }
+ ],
+ "environment": [
+ {
+ "name": "MIX_ENV",
+ "value": "%s"
+ },
+ {
+ "name": "RDS_PASSWORD",
+ "value": "%s"
+ },
+ {
+ "name": "HONEYBADGER_API_KEY",
+ "value": "%s"
+ }
+ ]
+ }
+ ]'
+ task_def=$(printf "$task_template" $AWS_ACCOUNT_ID $CIRCLE_SHA1 $MIX_ENV $RDS_PRODUCTION_PASSWORD $HONEYBADGER_API_KEY)
+}
+
+push_ecr_image(){
+ eval $(aws ecr get-login --region us-west-1)
+ docker push $AWS_ACCOUNT_ID.dkr.ecr.us-west-1.amazonaws.com/adpq:$CIRCLE_SHA1
+}
+
+register_definition() {
+
+ if revision=$(aws ecs register-task-definition --container-definitions "$task_def" --family $family | $JQ '.taskDefinition.taskDefinitionArn'); then
+ echo "Revision: $revision"
+ else
+ echo "Failed to register task definition"
+ return 1
+ fi
+
+}
+configure_aws_cli
+docker build --rm=false --build-arg MIX_ENV=prod --build-arg RDS_PASSWORD=$RDS_PRODUCTION_PASSWORD -t $AWS_ACCOUNT_ID.dkr.ecr.us-west-1.amazonaws.com/adpq:$CIRCLE_SHA1 .
+push_ecr_image
+deploy_cluster
\ No newline at end of file
diff --git a/script/ci/prepare.sh b/script/ci/prepare.sh
new file mode 100755
index 0000000..2e72f09
--- /dev/null
+++ b/script/ci/prepare.sh
@@ -0,0 +1,82 @@
+#!/usr/bin/env bash
+
+# NOTE: Keep in mind that this script does not verify the shasum of the downloads.
+
+# NOTE: Don't forget to make this file executable or the build won't run
+
+set -e
+
+export ERLANG_VERSION="19.0"
+export ELIXIR_VERSION="v1.4.1"
+
+# If you have a elixir_buildpack.config, do this instead:
+#export ERLANG_VERSION=$(cat elixir_buildpack.config | grep erlang_version | tr "=" " " | awk '{ print $2 }')
+#export ELIXIR_VERSION=v$(cat elixir_buildpack.config | grep elixir_version | tr "=" " " | awk '{ print $2 }')
+
+export INSTALL_PATH="$HOME/dependencies"
+
+export ERLANG_PATH="$INSTALL_PATH/otp_src_$ERLANG_VERSION"
+export ELIXIR_PATH="$INSTALL_PATH/elixir_$ELIXIR_VERSION"
+
+mkdir -p $INSTALL_PATH
+cd $INSTALL_PATH
+
+# Install erlang
+if [ ! -e $ERLANG_PATH/bin/erl ]; then
+ curl -L -O http://www.erlang.org/download/otp_src_$ERLANG_VERSION.tar.gz
+ tar xzf otp_src_$ERLANG_VERSION.tar.gz
+ cd $ERLANG_PATH
+ ./configure --enable-smp-support \
+ --enable-m64-build \
+ --disable-native-libs \
+ --disable-sctp \
+ --enable-threads \
+ --enable-kernel-poll \
+ --disable-hipe \
+ --without-javac
+ make
+
+ # Symlink to make it easier to setup PATH to run tests
+ ln -sf $ERLANG_PATH $INSTALL_PATH/erlang
+fi
+
+# Install elixir
+export PATH="$ERLANG_PATH/bin:$PATH"
+
+if [ ! -e $ELIXIR_PATH/bin/elixir ]; then
+ git clone https://github.com/elixir-lang/elixir $ELIXIR_PATH
+ cd $ELIXIR_PATH
+ git checkout $ELIXIR_VERSION
+ make
+
+ # Symlink to make it easier to setup PATH to run tests
+ ln -sf $ELIXIR_PATH $INSTALL_PATH/elixir
+fi
+
+export PATH="$ERLANG_PATH/bin:$ELIXIR_PATH/bin:$PATH"
+
+# Install package tools
+if [ ! -e $HOME/.mix/rebar ]; then
+ yes Y | LC_ALL=en_GB.UTF-8 mix local.hex
+ yes Y | LC_ALL=en_GB.UTF-8 mix local.rebar
+fi
+
+# If you use Elm:
+# 1) add the code below
+# 2) run the Elm build like this " ~/dependencies/sysconfcpus/bin/sysconfcpus -n 2 node_modules/brunch/bin/brunch build"
+# 3) your Elm builds will finish in seconds instead of minutes
+#
+# For more info see: https://github.com/elm-lang/elm-compiler/issues/1473#issuecomment-245704142
+#if [ ! -d $INSTALL_PATH/sysconfcpus/bin ]; then
+# git clone https://github.com/obmarg/libsysconfcpus.git
+# cd libsysconfcpus
+# ./configure --prefix=$INSTALL_PATH/sysconfcpus
+# make && make install
+# cd ..
+#fi
+
+# Fetch and compile dependencies and application code (and include testing tools)
+export MIX_ENV="test"
+cd $HOME/$CIRCLE_PROJECT_REPONAME
+mkdir -p priv/repo/migrations
+mix do deps.get, deps.compile, compile
\ No newline at end of file
diff --git a/script/ci/tests.sh b/script/ci/tests.sh
new file mode 100755
index 0000000..a5a0ebf
--- /dev/null
+++ b/script/ci/tests.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+
+export MIX_ENV="test"
+export PATH="$HOME/dependencies/erlang/bin:$HOME/dependencies/elixir/bin:$PATH"
+
+./node_modules/.bin/eslint web/static/js/**
+mix credo --strict
+mix test
+mix phoenix.swagger.generate priv/swagger/swagger.json
+npm test
diff --git a/test/controllers/admin/catalog_item_controller_test.exs b/test/controllers/admin/catalog_item_controller_test.exs
new file mode 100644
index 0000000..ab42d56
--- /dev/null
+++ b/test/controllers/admin/catalog_item_controller_test.exs
@@ -0,0 +1,112 @@
+defmodule Adpq.Admin.CatalogItemControllerTest do
+ use Adpq.ConnCase
+ import Adpq.Factory
+
+ setup %{conn: conn} do
+ admin = insert(:user, %{role: "ADMIN"})
+ conn =
+ conn
+ |> put_req_header("accept", "application/json")
+ |> put_req_header("authorization", admin.name)
+ %{ conn: conn }
+ end
+
+ test "index returns all catalog items", %{conn: conn} do
+ insert_list(6, :catalog_item)
+ conn = get conn, admin_catalog_item_path(conn, :index)
+ assert json_response(conn, 200) |> Enum.count == 6
+ end
+
+ test "index returns unauthorized unless the user has the admin role" do
+ conn = user_conn(insert(:user))
+ conn = get conn, admin_catalog_item_path(conn, :index)
+ assert conn.status == 401
+ end
+
+ test "show returns unauthorized unless the user has the admin role" do
+ item = insert(:catalog_item)
+ conn = user_conn(insert(:user))
+ conn = get conn, admin_catalog_item_path(conn, :show, item)
+ assert conn.status == 401
+ end
+
+ test "create returns unauthorized unless the user has the admin role" do
+ conn = user_conn(insert(:user))
+ conn = post conn, admin_catalog_item_path(conn, :create), %{}
+ assert conn.status == 401
+ end
+
+ test "create creates a new catalog item if all required fields are provided", %{conn: conn} do
+ attrs = params_for(:catalog_item)
+ conn = post conn, admin_catalog_item_path(conn, :create), attrs
+ response = json_response(conn, 201)
+ assert response["id"]
+ assert response["sku"] == attrs[:sku]
+ end
+
+ test "create returns 422 if a required field is not provided", %{conn: conn} do
+ [
+ :clin,
+ :manufacturer,
+ :sku,
+ :description,
+ :unit_of_measure,
+ :quantity_in_uom,
+ :list_price,
+ :contract_unit_price,
+ :contract_discount,
+ :name,
+ :long_category,
+ :simple_category,
+ :top_level_category
+ ]
+ |> Enum.each(
+ fn param ->
+ attrs = Map.drop(params_for(:catalog_item), [param])
+ conn = post conn, admin_catalog_item_path(conn, :create), attrs
+ assert conn.status == 422
+ end)
+ end
+
+ test "update returns unauthorized unless the user has the admin role" do
+ item = insert(:catalog_item)
+ conn = user_conn(insert(:user))
+ conn = patch conn, admin_catalog_item_path(conn, :update, item.id), %{}
+ assert conn.status == 401
+ end
+
+ test "update updates the selected resource", %{conn: conn} do
+ item = insert(:catalog_item)
+ updates = %{
+ clin: "new clin",
+ contract_discount: 0,
+ contract_unit_price: 0,
+ description: "new descriptio ",
+ list_price: 0,
+ manufacturer: "new manufacturer",
+ name: "new name",
+ quantity_in_uom: 2,
+ simple_category: "new category",
+ sku: "YYYY",
+ top_level_category: "new category",
+ unit_of_measure: "pair",
+ unspc: "zzzz"
+ }
+ conn = patch conn, admin_catalog_item_path(conn, :update, item.id), updates
+ response = json_response(conn, 200)
+ Enum.each(updates, fn {k, v} -> assert response[Atom.to_string(k)] == v end)
+ end
+
+ test "update returns 422 if an invalid field value is provided", %{conn: conn} do
+ item = insert(:catalog_item)
+ conn = patch conn, admin_catalog_item_path(conn, :update, item.id), %{list_price: "not a number"}
+ assert conn.status == 422
+ end
+
+ def user_conn(user) do
+ build_conn()
+ |> put_req_header("accept", "application/json")
+ |> put_req_header("authorization", user.name)
+ end
+
+end
diff --git a/test/controllers/admin/order_controller_test.exs b/test/controllers/admin/order_controller_test.exs
new file mode 100644
index 0000000..85d04eb
--- /dev/null
+++ b/test/controllers/admin/order_controller_test.exs
@@ -0,0 +1,78 @@
+defmodule Adpq.Admin.OrderControllerTest do
+ use Adpq.ConnCase
+ import Adpq.Factory
+
+ setup %{conn: conn} do
+ admin = insert(:user, %{role: "ADMIN"})
+ conn =
+ conn
+ |> put_req_header("accept", "application/json")
+ |> put_req_header("authorization", admin.name)
+ %{ conn: conn }
+ end
+
+ test "index returns unauthorized unless the user has the admin role" do
+ conn = user_conn(insert(:user))
+ conn = get conn, admin_order_path(conn, :index)
+ assert conn.status == 401
+ end
+
+ test "index returns all orders", %{conn: conn} do
+ 6
+ |> insert_list(:user)
+ |> Enum.each(fn u -> order_with_items(u, 2) end)
+ conn = get conn, admin_order_path(conn, :index)
+ assert json_response(conn, 200) |> Enum.count == 6
+
+ end
+
+ test "show returns any order", %{conn: conn} do
+ order = order_with_items(insert(:user), 1)
+ conn = get conn, admin_order_path(conn, :show, order.id)
+ assert json_response(conn, 200)["department"] == order.user.department
+ end
+
+ test "show returns unauthorized unless the user has the admin role" do
+ order = insert(:order)
+ conn = user_conn(insert(:user))
+ conn = get conn, admin_order_path(conn, :show, order.id)
+ assert conn.status == 401
+ end
+
+ test "show returns not found if the order does not exist", %{conn: conn} do
+ assert_error_sent 404, fn ->
+ get conn, admin_order_path(conn, :show, -1)
+ end
+ end
+
+ test "update returns unauthorized unless the user has the admin role" do
+ order = insert(:order)
+ conn = user_conn(insert(:user))
+ conn = get conn, admin_order_path(conn, :update, order.id)
+ assert conn.status == 401
+ end
+
+ test "update allows the admin to update the status of any order", %{conn: conn} do
+ order = insert(:order)
+ conn = patch conn, admin_order_path(conn, :update, order.id), %{"status" => "CANCELLED"}
+ assert json_response(conn, 200)["status"] == "CANCELLED"
+ end
+
+ test "update returns not found if the order does not exist", %{conn: conn} do
+ assert_error_sent 404, fn ->
+ patch conn, admin_order_path(conn, :update, -1), %{"status" => "SUBMITTED"}
+ end
+ end
+
+ test "update does not allow the admin to update any other fields", %{conn: conn} do
+ assert_error_sent 400, fn ->
+ patch conn, admin_order_path(conn, :update, insert(:order).id), %{"user_id" => insert(:user).id}
+ end
+ end
+
+ def user_conn(user) do
+ build_conn()
+ |> put_req_header("accept", "application/json")
+ |> put_req_header("authorization", user.name)
+ end
+end
diff --git a/test/controllers/auth_controller_test.exs b/test/controllers/auth_controller_test.exs
new file mode 100644
index 0000000..a2d333b
--- /dev/null
+++ b/test/controllers/auth_controller_test.exs
@@ -0,0 +1,49 @@
+defmodule Adpq.AuthControllerTest do
+ use Adpq.ConnCase
+
+ alias Adpq.{User}
+
+ @user1 %{"name" => "user1", "password" => "user"}
+ @user2 %{"name" => "user2", "password" => "user"}
+ @invalid_user %{"name" => "user3", "password" => "wrong"}
+ @admin %{"name" => "admin", "password" => "admin"}
+ @invalid_admin %{"name" => "admin", "password" => "wrong"}
+
+ setup %{conn: conn} do
+ { :ok, conn: put_req_header(conn, "accept", "application/json") }
+ %{
+ user: User.find_or_create_by_name(Map.put(@user1, "role", "USER")),
+ admin: User.find_or_create_by_name(Map.put(@admin, "role", "ADMIN"))
+ }
+ end
+
+ test "returns success for existing user", %{user: user} do
+ conn = build_conn()
+ conn = post conn, auth_path(conn, :create, @user1)
+ assert json_response(conn, 200)["id"] == user.id
+ end
+
+ test "returns success for new user" do
+ conn = build_conn()
+ conn = post conn, auth_path(conn, :create, @user2)
+ assert json_response(conn, 200)["name"] == @user2["name"]
+ end
+
+ test "returns unauthorized for incorrect user password" do
+ conn = build_conn()
+ conn = post conn, auth_path(conn, :create, @invalid_user)
+ assert conn.status == 401
+ end
+
+ test "returns success for existing admin", %{admin: admin} do
+ conn = build_conn()
+ conn = post conn, auth_path(conn, :create, @admin)
+ assert json_response(conn, 200)["id"] == admin.id
+ end
+
+ test "returns success for incorrect admin password" do
+ conn = build_conn()
+ conn = post conn, auth_path(conn, :create, @invalid_admin)
+ assert conn.status == 401
+ end
+end
diff --git a/test/controllers/cart_item_controller_test.exs b/test/controllers/cart_item_controller_test.exs
new file mode 100644
index 0000000..89326b6
--- /dev/null
+++ b/test/controllers/cart_item_controller_test.exs
@@ -0,0 +1,67 @@
+defmodule Adpq.CartItemControllerTest do
+ use Adpq.ConnCase
+ import Adpq.Factory
+
+ alias Adpq.CartItem
+
+ setup %{conn: conn} do
+ user = insert(:user)
+ catalog_item = insert(:catalog_item)
+ conn =
+ conn
+ |> put_req_header("accept", "application/json")
+ |> put_req_header("authorization", user.name)
+ %{
+ conn: conn,
+ user: user,
+ items: insert_list(3, :cart_item, %{user: user, catalog_item: catalog_item}),
+ catalog_item: catalog_item
+ }
+ end
+
+ test "lists all entries on index", %{conn: conn, user: user} do
+ conn = get conn, user_cart_item_path(conn, :index, user.id)
+ assert json_response(conn, 200) |> Enum.count == 3
+ end
+
+ test "returns 404 when the user is not found", %{conn: conn} do
+ assert_error_sent 404, fn ->
+ get conn, user_cart_item_path(conn, :index, -1)
+ end
+ end
+
+ test "creates and renders resource when data is valid", %{conn: conn, user: user, catalog_item: catalog_item} do
+ attrs = params_for(:cart_item, %{user_id: user.id, catalog_item_id: catalog_item.id})
+ conn = post conn, user_cart_item_path(conn, :index, user.id), attrs
+ assert json_response(conn, 201)["id"]
+ assert Repo.get(CartItem, json_response(conn, 201)["id"])
+ end
+
+ test "it updates quantity", %{conn: conn, user: user, items: [item | _]} do
+ conn = patch conn, user_cart_item_path(conn, :update, user.id, item.id), %{quantity: 2}
+ response = json_response(conn, 200)
+ assert response["id"]
+ updated = Repo.get(CartItem,response["id"])
+ assert updated.quantity == 2
+ end
+
+ test "it returns 404 when the item to be updated does not exist", %{conn: conn, user: user} do
+ assert_error_sent 404, fn ->
+ patch conn, user_cart_item_path(conn, :update, user.id, -1), %{quantity: 2}
+ end
+ end
+
+ test "it returns 422 when the update is invalid", %{conn: conn, user: user, items: [item | _]} do
+ conn = patch conn, user_cart_item_path(conn, :update, user.id, item.id), %{quantity: "MORE"}
+ assert conn.status == 422
+ end
+
+ test "it deletes the resource", %{conn: conn, user: user, items: [item | _]} do
+ conn = delete conn, user_cart_item_path(conn, :update, user.id, item.id)
+ assert conn.status == 204
+ refute Repo.get(CartItem, item.id)
+ end
+
+
+
+end
diff --git a/test/controllers/catalog_item_controller_test.exs b/test/controllers/catalog_item_controller_test.exs
new file mode 100644
index 0000000..f0c6e6e
--- /dev/null
+++ b/test/controllers/catalog_item_controller_test.exs
@@ -0,0 +1,46 @@
+defmodule Adpq.CatalogItemControllerTest do
+ use Adpq.ConnCase
+ import Adpq.Factory
+
+ alias Adpq.CatalogItem
+
+ setup %{conn: conn} do
+ user = insert(:user)
+ conn =
+ conn
+ |> put_req_header("accept", "application/json")
+ |> put_req_header("authorization", user.name)
+ %{conn: put_req_header(conn, "accept", "application/json")}
+ end
+
+ test "lists all entries on index", %{conn: conn} do
+ conn = get conn, catalog_item_path(conn, :index)
+ assert json_response(conn, 200) == []
+ end
+
+ test "shows chosen resource", %{conn: conn} do
+ catalog_item = Repo.insert! %CatalogItem{}
+ conn = get conn, catalog_item_path(conn, :show, catalog_item)
+ assert json_response(conn, 200)== %{"id" => catalog_item.id,
+ "clin" => catalog_item.clin,
+ "unspc" => catalog_item.unspc,
+ "manufacturer" => catalog_item.manufacturer,
+ "sku" => catalog_item.sku,
+ "description" => catalog_item.description,
+ "unit_of_measure" => catalog_item.unit_of_measure,
+ "quantity_in_uom" => catalog_item.quantity_in_uom,
+ "list_price" => catalog_item.list_price,
+ "contract_unit_price" => catalog_item.contract_unit_price,
+ "contract_discount" => catalog_item.contract_discount,
+ "simple_category" => catalog_item.simple_category,
+ "name" => catalog_item.name,
+ "top_level_category" => catalog_item.top_level_category}
+ end
+
+ test "renders page not found when id is nonexistent", %{conn: conn} do
+ assert_error_sent 404, fn ->
+ get conn, catalog_item_path(conn, :show, -1)
+ end
+ end
+
+end
diff --git a/test/controllers/order_controller_test.exs b/test/controllers/order_controller_test.exs
new file mode 100644
index 0000000..61b5986
--- /dev/null
+++ b/test/controllers/order_controller_test.exs
@@ -0,0 +1,90 @@
+defmodule Adpq.OrderControllerTest do
+ use Adpq.ConnCase
+ import Adpq.Factory
+
+ alias Adpq.{Order, CartItem}
+
+ setup %{conn: conn} do
+ user = insert(:user)
+ conn =
+ conn
+ |> put_req_header("accept", "application/json")
+ |> put_req_header("authorization", user.name)
+ %{
+ conn: conn,
+ user: user
+ }
+ end
+
+ test "lists all orders for user on index", %{conn: conn, user: user} do
+ _order = order_with_items(user, 2)
+ conn = get conn, user_order_path(conn, :index, user.id)
+ assert json_response(conn, 200) |> Enum.count == 1
+ end
+
+ test "does not list other user's orders on index", %{conn: conn, user: user} do
+ _order = order_with_items(user, 2)
+ _other_order = order_with_items(build(:user), 2)
+ conn = get conn, user_order_path(conn, :index, user.id)
+ assert json_response(conn, 200) |> Enum.count == 1
+ end
+
+ test "includes items for the order(s) on index", %{conn: conn, user: user} do
+ _order = order_with_items(user, 2)
+ conn = get conn, user_order_path(conn, :index, user.id)
+ [response | _] = json_response(conn, 200)
+ assert response["items"] |> Enum.count == 2
+ end
+
+
+ test "shows chosen resource", %{conn: conn, user: user} do
+ order = order_with_items(user, 2)
+ conn = get conn, user_order_path(conn, :show, user.id, order)
+ response = json_response(conn, 200)
+ assert response["id"] == order.id
+ assert response["status"] == "SUBMITTED"
+ assert response["items"] |> Enum.count == 2
+ end
+
+ test "returns page not found when id is nonexistent", %{conn: conn} do
+ assert_error_sent 404, fn ->
+ get conn, user_order_path(conn, :show, -1, -1)
+ end
+ end
+
+ test "creates and renders resource when data is valid", %{conn: conn} do
+ user = insert(:user)
+ _cart_items = insert_list(2, :cart_item, %{user: user})
+ conn = post conn, user_order_path(conn, :create, user)
+ response = json_response(conn, 201)
+ assert response["items"] |> Enum.count == 2
+ assert Repo.get(Order, response["id"])
+ end
+
+ test "removes cart items when creating an order", %{conn: conn} do
+ user = insert(:user)
+ _cart_items = insert_list(2, :cart_item, %{user: user})
+ conn = post conn, user_order_path(conn, :create, user)
+ response = json_response(conn, 201)
+ assert response["items"] |> Enum.count == 2
+ remaining_items =
+ CartItem
+ |> where([c], c.user_id == ^user.id)
+ |> Repo.all
+ assert Enum.count(remaining_items) == 0
+ end
+
+ test "it will not create an empty order", %{conn: conn} do
+ user = insert(:user)
+ conn = post conn, user_order_path(conn, :create, user)
+ assert json_response(conn, 422)
+ end
+
+
+ test "it updates the status", %{conn: conn, user: user} do
+ order = order_with_items(user, 3)
+ conn = patch conn, user_order_path(conn, :update, user, order), status: Order.Status.cancelled
+ assert json_response(conn, 200)["status"] == "CANCELLED"
+ end
+
+end
diff --git a/test/controllers/page_controller_test.exs b/test/controllers/page_controller_test.exs
index 3e6d01c..243459b 100644
--- a/test/controllers/page_controller_test.exs
+++ b/test/controllers/page_controller_test.exs
@@ -3,6 +3,6 @@ defmodule Adpq.PageControllerTest do
test "GET /", %{conn: conn} do
conn = get conn, "/"
- assert html_response(conn, 200) =~ "Welcome to Phoenix!"
+ assert html_response(conn, 200) =~ "ADPQ"
end
end
diff --git a/test/javascript/actions.spec.js b/test/javascript/actions.spec.js
new file mode 100644
index 0000000..553696b
--- /dev/null
+++ b/test/javascript/actions.spec.js
@@ -0,0 +1,329 @@
+import configureMockStore from 'redux-mock-store'
+import thunk from 'redux-thunk'
+import * as actions from 'actions'
+import * as ActionTypes from 'constants/ActionTypes'
+import * as RemoteDataStates from 'constants/RemoteDataStates'
+import * as reactRouter from 'react-router';
+import fetchMock from 'fetch-mock'
+
+const middlewares = [ thunk ]
+const mockStore = configureMockStore(middlewares)
+
+describe('Auth Actions', () => {
+ beforeEach(function() {
+ global.sessionStorage = jest.genMockFunction();
+ global.sessionStorage.setItem = jest.genMockFunction();
+ global.sessionStorage.getItem = jest.genMockFunction().mockReturnValue(JSON.stringify({id: 1}));
+ reactRouter.browserHistory = {
+ push: jest.genMockFunction()
+ };
+ })
+
+ afterEach(fetchMock.restore)
+
+ it('loginRequest creates a LOGIN_REQUEST action', () => {
+ expect(actions.loginRequest().type).toEqual(ActionTypes.LOGIN_REQUEST)
+ })
+
+ describe('loginUser', () => {
+ it('does nothing if auth request is already in-flight', () => {
+ const store = mockStore({auth: {remoteDataState: RemoteDataStates.LOADING}})
+ store.dispatch(actions.loginUser())
+ expect(store.getActions()).toEqual([])
+ })
+
+ it('does nothing if auth data is already present', () => {
+ const store = mockStore({auth: {remoteDataState: RemoteDataStates.LOADED}})
+ store.dispatch(actions.loginUser())
+ expect(store.getActions()).toEqual([])
+ })
+
+ it('dispatches a login request and handles the response data', (done) => {
+ const store = mockStore({auth: {remoteDataState: RemoteDataStates.NOT_REQUESTED}})
+ const mockResponse = {id: 0, name: 'Joe', role: 'ADMIN'}
+ const expectedActions = [
+ { type: ActionTypes.LOGIN_REQUEST },
+ { type: ActionTypes.LOGIN_SUCCESS, auth: mockResponse }
+ ]
+ fetchMock.mock('/api/auth', mockResponse, {method: "POST"})
+
+ store.dispatch(actions.loginUser()).then(() => {
+ expect(fetchMock.called('/api/auth')).toBe(true)
+ expect(store.getActions()).toEqual(expectedActions)
+ done();
+ })
+ })
+
+ it('dispatches a login request and handles any error', (done) => {
+ const store = mockStore({auth: {remoteDataState: RemoteDataStates.NOT_REQUESTED}})
+ const expectedActions = [
+ { type: ActionTypes.LOGIN_REQUEST },
+ { type: ActionTypes.LOGIN_ERROR, error: 'something' }
+ ]
+ fetchMock.mock('/api/auth', 409, {method: "POST"})
+
+ store.dispatch(actions.loginUser()).then(() => {
+ expect(fetchMock.called('/api/auth')).toBe(true)
+ expect(store.getActions()[0]).toEqual(expectedActions[0])
+ expect(store.getActions()[1].type).toEqual(expectedActions[1].type)
+ done();
+ })
+ })
+ })
+
+ describe('fetchCart', () => {
+ let store;
+ let mockResponse
+ beforeEach(() => {
+ store = mockStore({})
+ mockResponse = [{id: 0, name: 'Computer'}]
+ fetchMock.mock('/api/user/1/cart_items', mockResponse, {method: "GET"})
+ })
+
+ it('dispatches requestCart', (done) => {
+ const expectedActions = [
+ { type: ActionTypes.REQUEST_CART }
+ ]
+
+ store.dispatch(actions.fetchCart()).then(() => {
+ expect(store.getActions()[0]).toEqual(expectedActions[0])
+ done();
+ })
+ })
+
+ it('fetches cart items', (done) => {
+ store.dispatch(actions.fetchCart()).then(() => {
+ expect(fetchMock.called('/api/user/1/cart_items')).toBe(true)
+ done();
+ })
+ })
+
+ it('dispatches success', (done) => {
+ const expectedActions = [
+ { type: ActionTypes.REQUEST_CART },
+ { type: ActionTypes.FETCH_CART_SUCCESS, data: mockResponse }
+ ]
+
+ fetchMock.mock('/api/user/1/cart_items', mockResponse, {method: "GET"})
+
+ store.dispatch(actions.fetchCart()).then(() => {
+ expect(store.getActions()).toEqual(expectedActions)
+ done();
+ })
+ })
+
+ it('dispatches failure', (done) => {
+ const expectedActions = [
+ { type: ActionTypes.REQUEST_CART },
+ { type: ActionTypes.FETCH_CART_ERROR, error: 409 }
+ ]
+
+ fetchMock.mock('/api/user/1/cart_items', 409, {method: "GET"})
+
+ store.dispatch(actions.fetchCart()).then(() => {
+ expect(store.getActions()[0].type).toEqual(expectedActions[0].type)
+ done();
+ })
+ })
+ })
+
+ describe('addToCart', () => {
+ let store, id, quantity, mockResponse
+
+ beforeEach(() => {
+ id = 1
+ quantity = 2
+ store = mockStore({})
+ fetchMock.mock('/api/user/1/cart_items', {}, {method: "GET"})
+ mockResponse = {id: 0, name: 'Computer'}
+ })
+
+ describe('success', () => {
+ let expectedActions;
+ beforeEach((done) => {
+ expectedActions = [
+ { type: ActionTypes.ADD_TO_CART, id, quantity },
+ { type: ActionTypes.ADD_TO_CART_SUCCESS, data: mockResponse },
+ { type: ActionTypes.REQUEST_CART }
+ ]
+ fetchMock.mock('/api/user/1/cart_items', mockResponse, {method: "POST"})
+ store.dispatch(actions.addToCart(id, quantity)).then(done);
+ })
+
+ it('dispatches requestAddToCart', () => {
+ expect(store.getActions()[0]).toEqual(expectedActions[0])
+ })
+
+ it('dispatches success', () => {
+ expect(store.getActions()[1]).toEqual(expectedActions[1])
+ })
+
+ it('dispatches fetchCart', () => {
+ expect(store.getActions()[2]).toEqual(expectedActions[2])
+ })
+ })
+
+ it('dispatches error', (done) => {
+ const expectedActions = [
+ { type: ActionTypes.ADD_TO_CART, id, quantity },
+ { type: ActionTypes.ADD_TO_CART_ERROR, error: 'something' }
+ ]
+
+ fetchMock.mock('/api/user/1/cart_items', 409, {method: "POST"})
+
+ store.dispatch(actions.addToCart(id, quantity)).then(() => {
+ expect(store.getActions()[1].type).toEqual(expectedActions[1].type)
+ done();
+ })
+ })
+ })
+
+ describe('removeFromCart', () => {
+ let id, mockResponse, store;
+
+ beforeEach(() => {
+ id = 123;
+ mockResponse = {}
+ store = mockStore({})
+ })
+
+ describe('success', () => {
+ let expectedActions;
+
+ beforeEach((done) => {
+ expectedActions = [
+ { type: ActionTypes.REMOVE_FROM_CART, id },
+ { type: ActionTypes.REMOVE_FROM_CART_SUCCESS },
+ { type: ActionTypes.REQUEST_CART }
+ ]
+
+ fetchMock.mock('/api/user/1/cart_items/123', {}, {method: "DELETE"})
+ fetchMock.mock('/api/user/1/cart_items', {}, {method: "GET"})
+
+ store.dispatch(actions.removeFromCart(id)).then(done);
+ })
+
+ it('dispatches requestRemoveFromCart', () => {
+ expect(store.getActions()[0]).toEqual(expectedActions[0])
+ })
+
+ it('dispatches removeFromCartSuccess', () => {
+ expect(store.getActions()[1]).toEqual(expectedActions[1])
+ })
+
+ it('dispatches fetchCart', () => {
+ expect(store.getActions()[2]).toEqual(expectedActions[2])
+ })
+ })
+
+ it('dispatches removeFromCartError', (done) => {
+ const expectedActions = [
+ { type: ActionTypes.REMOVE_FROM_CART, id },
+ { type: ActionTypes.REMOVE_FROM_CART_ERROR, error: 'something' }
+ ]
+
+ fetchMock.mock('/api/user/1/cart_items/123', 409, {method: "DELETE"})
+
+ store.dispatch(actions.removeFromCart(id)).then(() => {
+ expect(store.getActions()[1].type).toEqual(expectedActions[1].type)
+ done();
+ })
+ })
+
+ })
+
+ describe('createOrder', () => {
+ let store, mockResponse
+
+ beforeEach(() => {
+ store = mockStore({})
+ fetchMock.mock('/api/user/1/cart_items', {}, {method: "GET"})
+ fetchMock.mock('/api/user/1/orders', {}, {method: "GET"})
+ })
+
+ describe('success', () => {
+ let expectedActions;
+
+ beforeEach((done) => {
+ mockResponse = [{id: 0, name: 'Computer'}]
+ fetchMock.mock('/api/user/1/orders', mockResponse, {method: "POST"})
+ expectedActions = [
+ { type: ActionTypes.CREATE_ORDER },
+ { type: ActionTypes.CREATE_ORDER_SUCCESS },
+ { type: ActionTypes.ALERT, alert: { type: ActionTypes.CREATE_ORDER_SUCCESS }, willExpire: false },
+ { type: ActionTypes.REQUEST_CART },
+ { type: ActionTypes.FETCH_CART_SUCCESS, data: {} },
+ { type: ActionTypes.REQUEST_ORDERS },
+ { type: ActionTypes.FETCH_ORDERS_SUCCESS, data: {} },
+
+ ]
+ store.dispatch(actions.createOrder()).then(done);
+ })
+
+ it('dispatches requestCreateOrder', () => {
+ expect(store.getActions()[0]).toEqual(expectedActions[0])
+ })
+
+ it('dispatches success', () => {
+ expect(store.getActions()[1]).toEqual(expectedActions[1])
+ })
+
+ it('dispatches alert', () => {
+ expect(store.getActions()[2]).toEqual(expectedActions[2])
+ })
+
+ it('dispatches fetchCart', () => {
+ expect(store.getActions()[3]).toEqual(expectedActions[3])
+ })
+
+ it('dispatches fetchOrders', () => {
+ expect(store.getActions()[5]).toEqual(expectedActions[5])
+ })
+ })
+
+ it('dispatches error', (done) => {
+ const expectedActions = [
+ { type: ActionTypes.CREATE_ORDER },
+ { type: ActionTypes.CREATE_ORDER_ERROR, error: 'something' }
+ ]
+
+ fetchMock.mock('/api/user/1/orders', 409, {method: "POST"})
+
+ store.dispatch(actions.createOrder()).then(() => {
+ expect(store.getActions()[1].type).toEqual(expectedActions[1].type)
+ done();
+ })
+ })
+ })
+
+ describe('alert', () => {
+ let store, action
+
+ beforeEach(() => {
+ action = { type: 'WOO_HOO' }
+ store = mockStore({})
+ })
+
+ it('dispatches alert with action', () => {
+ store.dispatch(actions.alert(action))
+ expect(store.getActions()).toEqual([
+ {
+ type: 'ALERT',
+ alert: action,
+ willExpire: false
+ }
+ ])
+ })
+
+ it('dispatches immediately expiring alert', () => {
+ store.dispatch(actions.alert(action, true))
+ expect(store.getActions()).toEqual([
+ {
+ type: 'ALERT',
+ alert: action,
+ willExpire: true
+ }
+ ])
+ })
+ })
+})
diff --git a/test/javascript/components/Cart.spec.js b/test/javascript/components/Cart.spec.js
new file mode 100644
index 0000000..1f42734
--- /dev/null
+++ b/test/javascript/components/Cart.spec.js
@@ -0,0 +1,38 @@
+import React from 'react';
+import {shallow} from 'enzyme'
+import Cart from 'components/Cart/Cart'
+import * as RemoteDataStates from 'constants/RemoteDataStates'
+
+const items = [{
+ id: 0,
+ name: 'Dell Optiplex 3040 MT',
+ manufacturer: 'DELL',
+ sku: '210-AFXL',
+ price: 10000,
+}]
+
+describe('Cart', () => {
+ let props;
+
+ beforeEach(() => {
+ props = {
+ placeOrder: jest.genMockFunction().mockReturnValue(Promise.resolve()),
+ goToThanks: jest.genMockFunction(),
+ cart: {
+ items,
+ remoteDataState: RemoteDataStates.LOADED
+ }
+ }
+ })
+
+ it('places order', (done) => {
+ const rendered = shallow()
+
+ rendered.instance().placeOrder({ preventDefault: () => {} }).then(() => {
+ expect(props.placeOrder).toBeCalled()
+ expect(props.goToThanks).toBeCalled()
+ done();
+ })
+ })
+
+})
diff --git a/test/javascript/components/CatalogItem.spec.js b/test/javascript/components/CatalogItem.spec.js
new file mode 100644
index 0000000..5f644ab
--- /dev/null
+++ b/test/javascript/components/CatalogItem.spec.js
@@ -0,0 +1,44 @@
+import React from 'react';
+import {shallow} from 'enzyme'
+import CatalogItem from 'components/CatalogItem/CatalogItem'
+
+const item = {
+ id: 0,
+ name: ' Dell Optiplex 3040 MT',
+ manufacturer: 'DELL',
+ sku: '210-AFXL',
+ list_price: 10000,
+ image: '/images/products/everyday-computing-dell-desktop.jpg',
+ description: "4GB 1DIMM 1600MHz DDR3L, Windows 7 Pro (32/64 bit), integrated Intel HD Graphics, DVD+/- RW, 500GB SATA 7200rpm, USB Optical Wheel Mouse, USB Keyboard, 3-Year Next Business Day On-Site Warranty",
+}
+
+describe('CatalogItem', () => {
+ let props;
+
+ beforeEach(() => {
+ props = {
+ addToCart: jest.genMockFunction().mockReturnValue(Promise.resolve()),
+ goToCart: jest.genMockFunction(),
+ item
+ }
+ })
+
+ it('renders item information', () => {
+ const rendered = shallow()
+ expect(rendered.text()).toContain('DELL')
+ expect(rendered.text()).toContain('$100')
+ expect(rendered.text()).toContain('4GB 1DIMM')
+ expect(rendered.text()).not.toContain('DDR3L, Windows') // make sure we're splitting our description
+ })
+
+ it('adds to cart', (done) => {
+ const rendered = shallow()
+
+ rendered.instance().addToCart({ preventDefault: () => {} }).then(() => {
+ expect(props.addToCart).toBeCalled()
+ expect(props.goToCart).toBeCalled()
+ done();
+ })
+ })
+
+})
diff --git a/test/javascript/components/Category.spec.js b/test/javascript/components/Category.spec.js
new file mode 100644
index 0000000..d4ac104
--- /dev/null
+++ b/test/javascript/components/Category.spec.js
@@ -0,0 +1,88 @@
+import React from 'react';
+import {shallow} from 'enzyme'
+import Category from 'components/Category/Category'
+import * as RemoteDataStates from 'constants/RemoteDataStates'
+
+describe('', () => {
+ let props, push;
+ let catalog = {
+ remoteDataState: RemoteDataStates.LOADED,
+ items: [
+ { id: 1, description: 'Laptop', manufacturer: 'Dell', list_price: 100000, top_level_category: 'stuff', simple_category: 'Ultralight' },
+ { id: 2, description: 'Desktop', manufacturer: 'HP', list_price: 200000, top_level_category: 'stuff', simple_category: 'Workstation' }
+ ],
+ error: {}
+ }
+
+ beforeEach(() => {
+ push = jest.fn();
+
+ props = {
+ catalog: catalog,
+ category: {
+ name: 'stuff',
+ fields: {
+ simple_category: [],
+ manufacturer: []
+ }
+ },
+ fetchCatalog: () => {},
+ filters: [],
+ push,
+ rangeFilters: [],
+ sorts: []
+ };
+ });
+
+ it('renders an item for every item in the catalog', () => {
+ const rendered = shallow()
+ expect(rendered.find('Connect(CatalogItem)').length).toBe(2)
+ })
+
+ it('renders a loading message if the data is not loaded yet', () => {
+ props.catalog = {
+ remoteDataState: RemoteDataStates.LOADING,
+ catalog
+ };
+ const rendered = shallow()
+ expect(rendered.text()).toContain('Loading')
+ })
+
+ it('goes to new url with filter after it is toggled', () => {
+ const instance = shallow().instance();
+
+ instance.toggleFilter('simple_category', 'Ultralight')()
+
+ expect(push.mock.calls[0][0]).toBe('/category/stuff?filter=simple_category:ultralight')
+ })
+
+ it('adds to existing filter after it is toggled', () => {
+ props.filters = [['simple_category', ['workstation']]]
+
+ const instance = shallow().instance();
+
+ instance.toggleFilter('simple_category', 'Ultralight')()
+
+ expect(push.mock.calls[0][0]).toBe('/category/stuff?filter=simple_category:workstation,ultralight')
+ })
+
+ it('removes an existing filter after it is toggled', () => {
+ props.filters = [['simple_category', ['workstation']]]
+
+ const instance = shallow().instance();
+
+ instance.toggleFilter('simple_category', 'Workstation')()
+
+ expect(push.mock.calls[0][0]).toBe('/category/stuff')
+ })
+
+ it('goes to new url with two different filters after one is toggled', () => {
+ props.filters = [['manufacturer', ['dell']]]
+
+ const instance = shallow().instance();
+
+ instance.toggleFilter('simple_category', 'Ultralight')()
+
+ expect(push.mock.calls[0][0]).toBe('/category/stuff?filter=manufacturer:dell&filter=simple_category:ultralight')
+ })
+});
diff --git a/test/javascript/components/Footer.spec.js b/test/javascript/components/Footer.spec.js
new file mode 100644
index 0000000..a503096
--- /dev/null
+++ b/test/javascript/components/Footer.spec.js
@@ -0,0 +1,37 @@
+import React from 'react';
+import {shallow} from 'enzyme'
+import Footer from 'components/Footer/Footer'
+
+describe('', () => {
+ let props;
+
+ beforeEach(() => {
+ props = {
+ footerMode: 'less'
+ };
+ });
+
+ it('renders a slim footer', () => {
+ const rendered = shallow();
+ expect(rendered.html()).toContain('usa-footer-slim');
+ expect(rendered.html()).not.toContain('footer usa-footer usa-footer-big');
+ })
+
+ it('renders a big footer', () => {
+ props = {
+ footerMode: 'more'
+ };
+ const rendered = shallow();
+ expect(rendered.html()).toContain('usa-footer usa-footer-big');
+ expect(rendered.html()).not.toContain('footer-slim usa-footer-slim');
+ })
+
+ it('renders limited footer', () => {
+ props = {
+ footerMode: 'none'
+ };
+ const rendered = shallow();
+ expect(rendered.html()).not.toContain('usa-footer-nav');
+ })
+
+});
diff --git a/test/javascript/components/Header.spec.js b/test/javascript/components/Header.spec.js
new file mode 100644
index 0000000..b409ef3
--- /dev/null
+++ b/test/javascript/components/Header.spec.js
@@ -0,0 +1,30 @@
+import React from 'react';
+import {render, shallow} from 'enzyme'
+import Header from 'components/Header/Header'
+import * as RemoteDataStates from 'constants/RemoteDataStates'
+
+it('renders default menu', () => {
+ const rendered = render()
+ expect(rendered.text()).toContain('Tech Shop')
+ expect(rendered.text()).toContain('Cart')
+ expect(rendered.text()).toContain('Account')
+ expect(rendered.text()).toContain('Logout')
+ expect(rendered.text()).toContain('Hardware')
+ expect(rendered.text()).toContain('Software')
+ expect(rendered.text()).toContain('Services')
+})
+
+it('renders no menu when set to login', () => {
+ const rendered = render()
+ expect(rendered.text()).toContain('Tech Shop')
+ expect(rendered.text()).not.toContain('Logout')
+})
+
+it('renders admin menu when set to admin', () => {
+ const rendered = render()
+ expect(rendered.text()).toContain('Tech Shop Admin')
+ expect(rendered.text()).toContain('Tech Shop Site')
+ expect(rendered.text()).toContain('Logout')
+ expect(rendered.text()).toContain('Orders')
+ expect(rendered.text()).toContain('Catalog')
+})
diff --git a/test/javascript/components/ItemDetail.spec.js b/test/javascript/components/ItemDetail.spec.js
new file mode 100644
index 0000000..9ad9946
--- /dev/null
+++ b/test/javascript/components/ItemDetail.spec.js
@@ -0,0 +1,54 @@
+import React from 'react';
+import {shallow} from 'enzyme'
+import ItemDetail from 'components/ItemDetail/ItemDetail'
+import * as RemoteDataStates from 'constants/RemoteDataStates'
+
+const item = {
+ id: 0,
+ name: ' Dell Optiplex 3040 MT',
+ manufacturer: 'DELL',
+ sku: '210-AFXL',
+ list_price: 10000,
+ image: '/images/products/everyday-computing-dell-desktop.jpg',
+ description: "4GB 1DIMM 1600MHz DDR3L, Windows 7 Pro (32/64 bit), integrated Intel HD Graphics, DVD+/- RW, 500GB SATA 7200rpm, USB Optical Wheel Mouse, USB Keyboard, 3-Year Next Business Day On-Site Warranty",
+}
+
+const LOADING_INDICATOR = "Loading"
+const NOT_FOUND_MESSAGE = "No such item"
+
+it('renders item information if available', () => {
+ const props = {
+ item,
+ catalog: {
+ items: [item],
+ remoteDataState: RemoteDataStates.LOADED
+ },
+ fetchCatalog: function() {}
+ }
+ const rendered = shallow()
+ expect(rendered.find('Connect(CatalogItem)').length).toBe(1)
+})
+
+it('renders a loading indicator if data is not yet loaded', () => {
+ const props = {
+ catalog: {
+ remoteDataState: RemoteDataStates.LOADING
+ },
+ item: {},
+ fetchCatalog: function() {}
+ }
+ const rendered = shallow()
+ expect(rendered.text()).toContain(LOADING_INDICATOR)
+})
+
+it('renders an error message if there is no item', () => {
+ const props = {
+ item: null,
+ catalog: {
+ remoteDataState: RemoteDataStates.LOADED
+ },
+ fetchCatalog: function() {}
+ }
+ const rendered = shallow()
+ expect(rendered.text()).toContain(NOT_FOUND_MESSAGE)
+})
diff --git a/test/javascript/components/RecommendedItems.spec.js b/test/javascript/components/RecommendedItems.spec.js
new file mode 100644
index 0000000..d2da7bc
--- /dev/null
+++ b/test/javascript/components/RecommendedItems.spec.js
@@ -0,0 +1,62 @@
+import React from 'react';
+import {render, shallow} from 'enzyme'
+import RecommendedItems from 'components/RecommendedItems/RecommendedItems'
+import * as RemoteDataStates from 'constants/RemoteDataStates'
+
+const example = {
+ title: 'Test title',
+ subtitle: 'Test subtitle',
+ items: [
+ {
+ id: 1,
+ top_level_category: 'Laptops',
+ name: 'ZBook15',
+ image: '/images/placeholder-01.jpg'
+ },{
+ id: 2,
+ top_level_category: 'Desktops',
+ name: 'Workstation',
+ image: '/images/placeholder-01.jpg'
+ }
+ ]
+}
+
+it('renders a basic set of recommendations', () => {
+
+ const rendered = render()
+
+ expect(rendered.text()).toContain('Test title')
+ expect(rendered.text()).toContain('Test subtitle')
+ expect(rendered.text()).toContain('ZBook15')
+ expect(rendered.text()).toContain('Workstation')
+ expect(rendered.text()).toContain('Laptop')
+ expect(rendered.text()).toContain('Desktop')
+})
+
+it('renders without a title', () => {
+
+ const rendered = render()
+
+ expect(rendered.text()).toContain('Test subtitle')
+ expect(rendered.text()).toContain('ZBook15')
+ expect(rendered.text()).toContain('Workstation')
+ expect(rendered.text()).toContain('Laptop')
+ expect(rendered.text()).toContain('Desktop')
+})
+
+it('renders without a subtitle', () => {
+
+ const rendered = render()
+
+ expect(rendered.text()).toContain('ZBook15')
+ expect(rendered.text()).toContain('Workstation')
+ expect(rendered.text()).toContain('Laptop')
+ expect(rendered.text()).toContain('Desktop')
+})
+
+it('renders without items', () => {
+
+ const rendered = render()
+
+ expect(rendered.text()).toContain('Test subtitle')
+})
diff --git a/test/javascript/lib/category_item.spec.js b/test/javascript/lib/category_item.spec.js
new file mode 100644
index 0000000..8a533bb
--- /dev/null
+++ b/test/javascript/lib/category_item.spec.js
@@ -0,0 +1,10 @@
+import { singleCategory } from "lib/category_item"
+
+test("it returns correct matches", () => {
+ expect(singleCategory('Desktops')).toEqual('Desktop')
+ expect(singleCategory('Laptops')).toEqual('Laptop')
+})
+
+test("it returns input if no match is found", () => {
+ expect(singleCategory('Fooz')).toEqual('Fooz')
+})
diff --git a/test/javascript/lib/filters.spec.js b/test/javascript/lib/filters.spec.js
new file mode 100644
index 0000000..c2e8fbe
--- /dev/null
+++ b/test/javascript/lib/filters.spec.js
@@ -0,0 +1,101 @@
+import {
+ filterByValue, filterByRange,
+ applyFilters,
+ applyRangeFilters
+} from "lib/filters"
+
+import sortBy from 'lodash/fp/sortBy'
+const data = [
+ {a: 10, b: 20, c: "bar"},
+ {a: 10, b: 100, c: "baz"},
+ {a: 20, b: 20, c: "foo"},
+ {a: 100, b: 30, c: "FOO"}
+]
+
+describe("applyFilters", () => {
+
+ test("it applies multiple exact value filters correctly", () => {
+ const filters = [
+ ["a", [10, 20]],
+ ["b", [20]]
+ ]
+ const expected = [
+ {a: 10, b: 20, c: "bar"},
+ {a: 20, b: 20, c: "foo"}
+ ]
+ expect(applyFilters(filters, data)).toEqual(expected)
+ })
+
+ test("it leaves the data untouched if given no filters", () => {
+ expect(applyFilters([], data)).toEqual(data)
+ })
+})
+
+describe("applyRangeFilters", () => {
+
+ test("it applies multiple range filters correctly", () => {
+ const filters = [
+ ["a", [20, 100]],
+ ["b", [20, 50]]
+ ]
+ const expected = [
+ {a: 20, b: 20, c: "foo"},
+ {a: 100, b: 30, c: "FOO"}
+ ]
+ expect(applyRangeFilters(filters, data)).toEqual(expected)
+ })
+
+ test("it leaves the data untouched if given no filters", () => {
+ expect(applyRangeFilters([], data)).toEqual(data)
+ })
+})
+
+describe("filterByValue", () => {
+
+ test("it filters by a single numbers", () => {
+ const expected = [
+ {a: 10, b: 20, c: "bar"},
+ {a: 10, b: 100, c: "baz"}
+ ]
+ expect(filterByValue('a', [10], data)).toEqual(expected)
+ })
+
+ test("it filters by a multiple numbers", () => {
+ const expected = [
+ {a: 10, b: 20, c: "bar"},
+ {a: 10, b: 100, c: "baz"},
+ {a: 100, b: 30, c: "FOO"}
+ ]
+ expect(filterByValue('a', [10, 100], data)).toEqual(expected)
+ })
+
+ test("it filters by a single string (case insensitive)", () => {
+ const expected = [
+ {a: 20, b: 20, c: "foo"},
+ {a: 100, b: 30, c: "FOO"}
+ ]
+ expect(filterByValue('c', ['foo'], data)).toEqual(expected)
+ expect(filterByValue('c', ['FOO'], data)).toEqual(expected)
+ })
+
+ test("it filters by multiple strings", () => {
+ const expected = sortBy('a', [
+ {a: 20, b: 20, c: "foo"},
+ {a: 100, b: 30, c: "FOO"},
+ {a: 10, b: 100, c: "baz"}
+ ])
+ expect(sortBy('a', filterByValue('c', ['foo', 'BAZ'], data))).toEqual(expected)
+ })
+})
+
+describe("filterByRange", () => {
+
+ test("it filters by range", () => {
+ const expected = [
+ {a: 10, b: 20, c: "bar"},
+ {a: 10, b: 100, c: "baz"},
+ {a: 20, b: 20, c: "foo"}
+ ]
+ expect(filterByRange('a', [10, 50], data)).toEqual(expected)
+ })
+})
diff --git a/test/javascript/lib/image_urls.spec.js b/test/javascript/lib/image_urls.spec.js
new file mode 100644
index 0000000..7d3abd6
--- /dev/null
+++ b/test/javascript/lib/image_urls.spec.js
@@ -0,0 +1,13 @@
+import { catalogItemImage } from "lib/image_urls"
+
+test("it returns a specific item match", () => {
+ expect(catalogItemImage({manufacturer: 'HP', sku: 'F5A53AA#ABA'})).toEqual('/images/products/thin-client-hp.jpg')
+})
+
+test("it returns a manufacturer top level category match", () => {
+ expect(catalogItemImage({manufacturer: 'HP', top_level_category: 'Laptops'})).toEqual('/images/products/everyday-computing-hp-laptop.jpg')
+})
+
+test("it returns a default image when no match is found", () => {
+ expect(catalogItemImage({})).toEqual('/images/products/everyday-computing-dell-desktop.jpg')
+})
\ No newline at end of file
diff --git a/test/javascript/lib/query.spec.js b/test/javascript/lib/query.spec.js
new file mode 100644
index 0000000..e104eba
--- /dev/null
+++ b/test/javascript/lib/query.spec.js
@@ -0,0 +1,110 @@
+import { generateQuery, parseSorts, parseFilters } from 'lib/query'
+
+describe('parseFilters', () => {
+
+ it('parses a single filter with a single value', () => {
+ const param = ["manufacturer:DELL"]
+ expect(parseFilters(param)).toEqual([["manufacturer", ["dell"]]])
+ })
+
+ it('parses a single filter with a multiple values', () => {
+ const param = ["manufacturer:DELL,hp"]
+ expect(parseFilters(param)).toEqual([["manufacturer", ["dell", "hp"]]])
+ })
+
+ it('parses multiple filters', () => {
+ const param = ["manufacturer:dell,hp", "simple_category:thin client"]
+ expect(parseFilters(param)).toEqual([["manufacturer", ["dell", "hp"]], ["simple_category", ["thin client"]]])
+ })
+
+ it('does not parse filters with invalid field names', () => {
+ const param = ["manufa:dell"]
+ expect(parseFilters(param)).toEqual([])
+ })
+
+ it('parses filters with spaces and ampersands', () => {
+ const param = ["simple_category:keyboards%20%26%20mice,desktops"]
+ expect(parseFilters(param)).toEqual([["simple_category", ["keyboards%20%26%20mice", "desktops"]]])
+ })
+})
+
+describe('parseSorts', () => {
+
+ it('parses a single sort', () => {
+ const param = ["list_price:asc"]
+ expect(parseSorts(param)).toEqual([['list_price', 'asc']])
+ })
+
+ it('parses multiple sorts', () => {
+ const param = ["list_price:asc", "manufacturer:desc"]
+ expect(parseSorts(param)).toEqual([['list_price', 'asc'], ['manufacturer', 'desc']])
+ })
+
+ it('does not parse sorts with an invalid direction', () => {
+ const param = ["list_price:asc", "manufacturer:sca"]
+ expect(parseSorts(param)).toEqual([['list_price', 'asc']])
+ })
+
+ it('does not parse sorts with an invalid field name', () => {
+ const param = ["list_price:asc", "manufact:desc"]
+ expect(parseSorts(param)).toEqual([['list_price', 'asc']])
+ })
+
+ it('is case insensitive with regard to field names', () => {
+ const param = ["LIST_PRICE:asc"]
+ expect(parseSorts(param)).toEqual([['list_price', 'asc']])
+ })
+
+ it('is case insensitive with regard to direction', () => {
+ const param = ["list_price:ASC"]
+ expect(parseSorts(param)).toEqual([['list_price', 'asc']])
+ })
+})
+
+describe('generateQuery', () => {
+ it('returns empty string if no sorts or filters', () => {
+ expect(generateQuery()).toEqual('')
+ })
+
+ it('returns a sort', () => {
+ const sorts = [['name', 'asc']];
+ const filters = null;
+ expect(generateQuery(sorts, filters)).toEqual('?sort=name:asc')
+ })
+
+ it('returns a lowercase sort', () => {
+ const sorts = [['NAME', 'ASC']];
+ const filters = null;
+ expect(generateQuery(sorts, filters)).toEqual('?sort=name:asc')
+ })
+
+ it('returns a lowercase filter', () => {
+ const sorts = null;
+ const filters = [['simple_category', ['Workstation']]];
+ expect(generateQuery(sorts, filters)).toEqual('?filter=simple_category:workstation')
+ })
+
+ it('returns a filter with multiple values', () => {
+ const sorts = null;
+ const filters = [['simple_category', ['workstation', 'ultralight']]];
+ expect(generateQuery(sorts, filters)).toEqual('?filter=simple_category:workstation,ultralight')
+ })
+
+ it('returns multiple filters', () => {
+ const sorts = null;
+ const filters = [['simple_category', ['workstation']], ['brand', ['dell']]]
+ expect(generateQuery(sorts, filters)).toEqual('?filter=simple_category:workstation&filter=brand:dell')
+ })
+
+ it('returns sort and filter', () => {
+ const sorts = [['name', 'asc']];
+ const filters = [['simple_category', ['workstation']]];
+ expect(generateQuery(sorts, filters)).toEqual('?sort=name:asc&filter=simple_category:workstation')
+ })
+
+ it('returns a filter that can handle spaces and ampersands', () => {
+ const sorts = null;
+ const filters = [['simple_category', ['Keyboards & Mice', 'Thin Client']]];
+ expect(generateQuery(sorts, filters)).toEqual('?filter=simple_category:keyboards%20%26%20mice,thin%20client')
+ })
+})
diff --git a/test/javascript/lib/sorts.spec.js b/test/javascript/lib/sorts.spec.js
new file mode 100644
index 0000000..2fb4054
--- /dev/null
+++ b/test/javascript/lib/sorts.spec.js
@@ -0,0 +1,25 @@
+import { sortBy } from "lib/sorts"
+
+const data = [
+ {a: 1, b: "a", c: "A"},
+ {a: 1, b: "b", c: "B"},
+ {a: 2, b: "c", c: "C"}
+]
+
+test("it sorts by a single field", () => {
+ const expected = [
+ {a: 2, b: "c", c: "C"},
+ {a: 1, b: "a", c: "A"},
+ {a: 1, b: "b", c: "B"}
+ ]
+ expect(sortBy([['a', 'desc']], data)).toEqual(expected)
+})
+
+test("it sorts by multiple fields", () => {
+ const expected = [
+ {a: 1, b: "b", c: "B"},
+ {a: 1, b: "a", c: "A"},
+ {a: 2, b: "c", c: "C"}
+ ]
+ expect(sortBy([['a', 'asc'], ['b', 'desc']], data)).toEqual(expected)
+})
diff --git a/test/javascript/reducers/alerts_reducer.spec.js b/test/javascript/reducers/alerts_reducer.spec.js
new file mode 100644
index 0000000..1ec4dd0
--- /dev/null
+++ b/test/javascript/reducers/alerts_reducer.spec.js
@@ -0,0 +1,25 @@
+import AlertsReducer from 'reducers/alerts'
+import * as ActionTypes from 'constants/ActionTypes'
+
+describe('AlertsReducer', () => {
+ it('adds alert to list with willExpire attribute', () => {
+ const state = AlertsReducer(undefined, { type: ActionTypes.ALERT, alert: { type: 'HELLO' } })
+ expect(state).toEqual([{ type: 'HELLO', willExpire: false }])
+ })
+
+ it('expires willExpire alerts', () => {
+ const beforeState = [
+ {
+ type: 'HELLO',
+ willExpire: false
+ },
+ {
+ type: 'GOODBYE',
+ willExpire: true
+ }
+ ]
+
+ const state = AlertsReducer(beforeState, { type: ActionTypes.EXPIRE_ALERTS })
+ expect(state).toEqual([{ type: 'HELLO', willExpire: true }])
+ })
+})
diff --git a/test/javascript/reducers/auth_reducer.spec.js b/test/javascript/reducers/auth_reducer.spec.js
new file mode 100644
index 0000000..130da83
--- /dev/null
+++ b/test/javascript/reducers/auth_reducer.spec.js
@@ -0,0 +1,32 @@
+import AuthReducer from 'reducers/auth'
+import * as ActionTypes from 'constants/ActionTypes'
+import * as RemoteDataStates from 'constants/RemoteDataStates'
+
+
+describe('AuthReducer', () => {
+
+ it('changes state to loading after a login request', () => {
+ const state = AuthReducer(undefined, { type: ActionTypes.LOGIN_REQUEST })
+ expect(state.remoteDataState).toEqual(RemoteDataStates.LOADING)
+ })
+
+ it('changes state to loaded after successful login', () => {
+ const state = AuthReducer(undefined, { type: ActionTypes.LOGIN_SUCCESS })
+ expect(state.remoteDataState).toEqual(RemoteDataStates.LOADED)
+ })
+
+ it('changes state to error after login error', () => {
+ const state = AuthReducer(undefined, { type: ActionTypes.LOGIN_ERROR })
+ expect(state.remoteDataState).toEqual(RemoteDataStates.ERROR)
+ })
+
+ it('populates the error field after login error', () => {
+ const state = AuthReducer(undefined, { type: ActionTypes.LOGIN_ERROR, error: 'something bad happened' })
+ expect(state.error).toEqual('something bad happened')
+ })
+
+ it('changes state to not requested after logout', () => {
+ const state = AuthReducer(undefined, { type: ActionTypes.LOGOUT })
+ expect(state.remoteDataState).toEqual(RemoteDataStates.NOT_REQUESTED)
+ })
+})
diff --git a/test/javascript/routes.spec.js b/test/javascript/routes.spec.js
new file mode 100644
index 0000000..8fd9f8b
--- /dev/null
+++ b/test/javascript/routes.spec.js
@@ -0,0 +1,57 @@
+import { match } from 'react-router'
+import { default as getRoutes } from 'routes'
+
+let routes;
+
+beforeEach(function() {
+ global.sessionStorage = jest.genMockFunction();
+ global.sessionStorage.setItem = jest.genMockFunction();
+ global.sessionStorage.getItem = jest.genMockFunction().mockReturnValue(null);
+ routes = getRoutes(null)
+})
+
+describe("routes", () => {
+ it("/ base route is defined", (cb) => {
+ match(route("/"), exists(cb))
+ })
+ it("/category route without param is not defined", (cb) => {
+ match(route("/category"), doesNotExist(cb))
+ })
+ it("/category/:id route is defined", (cb) => {
+ match(route("/category/laptops"), exists(cb))
+ })
+ it("/item route without param is not defined", (cb) => {
+ match(route("/item"), doesNotExist(cb))
+ })
+ it("/item/:id route is defined", (cb) => {
+ match(route("/item/dell|a-345"), exists(cb))
+ })
+ it("/account route is defined", (cb) => {
+ match(route("/account"), exists(cb))
+ })
+ it("/cart route is defined", (cb) => {
+ match(route("/cart"), exists(cb))
+ })
+ it("/login route is defined", (cb) => {
+ match(route("/login"), exists(cb))
+ })
+ it("/logout route is defined", (cb) => {
+ match(route("/logout"), exists(cb))
+ })
+})
+
+const route = (location) => ({history: null, routes: routes, location: location})
+
+const exists = (cb) => {
+ return (_, match) => {
+ expect(match).toBeDefined()
+ cb()
+ }
+}
+
+const doesNotExist = (cb) => {
+ return (_, match) => {
+ expect(match).toBeUndefined()
+ cb()
+ }
+}
diff --git a/test/lib/auth_helpers_test.exs b/test/lib/auth_helpers_test.exs
new file mode 100644
index 0000000..6e2fe5c
--- /dev/null
+++ b/test/lib/auth_helpers_test.exs
@@ -0,0 +1,4 @@
+defmodule Adpq.AuthHelpersTest do
+ use Adpq.ConnCase
+
+end
diff --git a/test/lib/ensure_admin_test.exs b/test/lib/ensure_admin_test.exs
new file mode 100644
index 0000000..d0dfc0c
--- /dev/null
+++ b/test/lib/ensure_admin_test.exs
@@ -0,0 +1,13 @@
+defmodule Adpq.EnsureAdminTest do
+ use Adpq.ConnCase
+ alias Adpq.EnsureAdmin
+
+ setup %{conn: conn} do
+ %{ conn: conn }
+ end
+
+ test "ensureAdmin return unauthorize if the user in the assigns is not an admin", %{conn: conn} do
+ conn = EnsureAdmin.call(conn, %{})
+ assert conn.status == 401
+ end
+end
diff --git a/test/lib/ensure_user_test.exs b/test/lib/ensure_user_test.exs
new file mode 100644
index 0000000..0683569
--- /dev/null
+++ b/test/lib/ensure_user_test.exs
@@ -0,0 +1,14 @@
+defmodule Adpq.EnsureUserTest do
+ use Adpq.ConnCase
+
+ alias Adpq.EnsureUser
+
+ setup %{conn: conn} do
+ %{ conn: conn }
+ end
+
+ test "ensureUser returns unauthorized if there is no user in the assigns", %{conn: conn} do
+ conn = EnsureUser.call(conn, %{})
+ assert conn.status == 401
+ end
+end
diff --git a/test/lib/load_user_test.exs b/test/lib/load_user_test.exs
new file mode 100644
index 0000000..c5501e1
--- /dev/null
+++ b/test/lib/load_user_test.exs
@@ -0,0 +1,18 @@
+defmodule Adpq.LoadUserTest do
+ use Adpq.ConnCase
+ alias Adpq.{Repo, User, LoadUser}
+
+ setup %{conn: conn} do
+ user = Repo.insert!(%User{name: "Jerry", password: "user", role: "USER"})
+ %{
+ conn: conn,
+ user: user
+ }
+ end
+
+ test "loadUser looks up the user from the auth header", %{conn: conn, user: user} do
+ conn = put_req_header(conn, "authorization", user.name)
+ conn = LoadUser.call(conn, %{})
+ assert conn.assigns[:user].id == user.id
+ end
+end
diff --git a/test/models/cart_item_test.exs b/test/models/cart_item_test.exs
new file mode 100644
index 0000000..db3d51e
--- /dev/null
+++ b/test/models/cart_item_test.exs
@@ -0,0 +1,18 @@
+defmodule Adpq.CartItemTest do
+ use Adpq.ModelCase
+
+ alias Adpq.CartItem
+
+ @valid_attrs %{catalog_item_id: 42, quantity: 42, user_id: 42}
+ @invalid_attrs %{}
+
+ test "changeset with valid attributes" do
+ changeset = CartItem.changeset(%CartItem{}, @valid_attrs)
+ assert changeset.valid?
+ end
+
+ test "changeset with invalid attributes" do
+ changeset = CartItem.changeset(%CartItem{}, @invalid_attrs)
+ refute changeset.valid?
+ end
+end
diff --git a/test/models/catalog_item_test.exs b/test/models/catalog_item_test.exs
new file mode 100644
index 0000000..748e606
--- /dev/null
+++ b/test/models/catalog_item_test.exs
@@ -0,0 +1,34 @@
+defmodule Adpq.CatalogItemTest do
+ use Adpq.ModelCase
+
+ alias Adpq.CatalogItem
+
+ @valid_attrs %{
+ long_category: "long",
+ clin: "abcd",
+ name: "A Computer",
+ contract_discount: 42,
+ contract_unit_price: 42,
+ description: "lorem ipsum",
+ list_price: 42,
+ manufacturer: "HP",
+ quantity_in_uom: 42,
+ sku: "A-123",
+ simple_category: "simple",
+ top_level_category: "top level",
+ unit_of_measure: "some content",
+ unspc: "some content"
+ }
+
+ @invalid_attrs %{}
+
+ test "changeset with valid attributes" do
+ changeset = CatalogItem.changeset(%CatalogItem{}, @valid_attrs)
+ assert changeset.valid?
+ end
+
+ test "changeset with invalid attributes" do
+ changeset = CatalogItem.changeset(%CatalogItem{}, @invalid_attrs)
+ refute changeset.valid?
+ end
+end
diff --git a/test/models/order_item_test.exs b/test/models/order_item_test.exs
new file mode 100644
index 0000000..ebfb2b7
--- /dev/null
+++ b/test/models/order_item_test.exs
@@ -0,0 +1,38 @@
+defmodule Adpq.OrderItemTest do
+ use Adpq.ModelCase
+ import Adpq.Factory
+
+ alias Adpq.OrderItem
+
+ @valid_attrs %{catalog_item_id: 42, order_id: 42, price: 42, quantity: 42}
+ @invalid_attrs %{}
+
+ test "changeset with valid attributes" do
+ changeset = OrderItem.changeset(%OrderItem{}, @valid_attrs)
+ assert changeset.valid?
+ end
+
+ test "changeset with invalid attributes" do
+ changeset = OrderItem.changeset(%OrderItem{}, @invalid_attrs)
+ refute changeset.valid?
+ end
+
+ test "from cart item creates a valid changeset" do
+ catalog_item = insert(:catalog_item)
+ cart_item = insert(:cart_item, %{catalog_item: catalog_item})
+ order = insert(:order, %{user: cart_item.user})
+ changeset = OrderItem.from_cart_item(order, cart_item)
+ assert changeset.valid?
+ end
+
+ test "from cart item copies necessary data from the cart item" do
+ catalog_item = insert(:catalog_item)
+ cart_item = insert(:cart_item, %{catalog_item: catalog_item})
+ order = insert(:order, %{user: cart_item.user})
+ {:ok, order_item} = Repo.insert(OrderItem.from_cart_item(order, cart_item))
+ assert order_item.price == catalog_item.list_price
+ assert order_item.quantity == cart_item.quantity
+ assert order_item.catalog_item_id == catalog_item.id
+ assert order_item.order_id == order.id
+ end
+end
diff --git a/test/models/order_test.exs b/test/models/order_test.exs
new file mode 100644
index 0000000..a1a0910
--- /dev/null
+++ b/test/models/order_test.exs
@@ -0,0 +1,18 @@
+defmodule Adpq.OrderTest do
+ use Adpq.ModelCase
+
+ alias Adpq.Order
+
+ @valid_attrs %{status: "some content", user_id: 42}
+ @invalid_attrs %{}
+
+ test "changeset with valid attributes" do
+ changeset = Order.changeset(%Order{}, @valid_attrs)
+ assert changeset.valid?
+ end
+
+ test "changeset with invalid attributes" do
+ changeset = Order.changeset(%Order{}, @invalid_attrs)
+ refute changeset.valid?
+ end
+end
diff --git a/test/models/user_test.exs b/test/models/user_test.exs
new file mode 100644
index 0000000..85a2308
--- /dev/null
+++ b/test/models/user_test.exs
@@ -0,0 +1,38 @@
+defmodule Adpq.UserTest do
+ use Adpq.ModelCase
+
+ alias Adpq.{User, Repo}
+
+ @valid_attrs %{name: "name", password: "pw", role: "USER", department: "FOO"}
+ @invalid_attrs %{}
+
+ test "changeset with valid attributes" do
+ changeset = User.changeset(%User{}, @valid_attrs)
+ assert changeset.valid?
+ end
+
+ test "changeset with invalid attributes" do
+ changeset = User.changeset(%User{}, @invalid_attrs)
+ refute changeset.valid?
+ end
+
+ test "find or create a new user (user already exists)" do
+ user = Repo.insert!(User.changeset(%User{}, @valid_attrs))
+ params =
+ for {key, val} <- @valid_attrs, into: %{}, do: {Atom.to_string(key), val}
+ found_or_created = User.find_or_create_by_name(params)
+ assert user.id === found_or_created.id
+ end
+
+ test "find or create new user" do
+ attributes = %{"name" => "asfg", "password" => "user", "role" => "USER"}
+ user = User.find_or_create_by_name(attributes)
+ assert user.id !== nil
+ end
+
+ test "automatically assigns a department" do
+ attributes = %{"name" => "zxcv", "password" => "user", "role" => "USER"}
+ user = User.find_or_create_by_name(attributes)
+ assert user.department !== nil
+ end
+end
diff --git a/test/support/factory.ex b/test/support/factory.ex
new file mode 100644
index 0000000..8480736
--- /dev/null
+++ b/test/support/factory.ex
@@ -0,0 +1,80 @@
+defmodule Adpq.Factory do
+
+ use ExMachina.Ecto, repo: Adpq.Repo
+
+ def catalog_item_factory do
+ %Adpq.CatalogItem{
+ long_category: "Powerful Laptops for Serious Work",
+ simple_category: "Power",
+ top_level_category: "Laptops",
+ clin: "B4789",
+ contract_discount: 15,
+ contract_unit_price: 100000,
+ description: "High End Dell Laptop",
+ list_price: 85000,
+ manufacturer: "DELL",
+ name: "XP-43",
+ quantity_in_uom: 1,
+ sku: "DL-1546",
+ unit_of_measure: "1",
+ unspc: "A4567"
+ }
+ end
+
+ def user_factory do
+ %Adpq.User{
+ name: sequence("name-"),
+ password: "user",
+ role: "USER",
+ department: Adpq.User.Department.random
+ }
+ end
+
+ def admin_user_factory do
+ %Adpq.User{
+ name: "admin",
+ password: "admin",
+ role: "admin",
+ department: Adpq.User.Department.random
+ }
+ end
+
+ def cart_item_factory do
+ %Adpq.CartItem{
+ user: build(:user),
+ catalog_item: build(:catalog_item),
+ quantity: 1
+ }
+ end
+
+ def order_factory do
+ %Adpq.Order{
+ user: build(:user),
+ status: Adpq.Order.Status.submitted
+ }
+ end
+
+ def order_with_items_factory do
+ %Adpq.Order{
+ user: build(:user),
+ status: Adpq.Order.Status.submitted
+ }
+
+ end
+
+ def order_item_factory do
+ %Adpq.OrderItem{
+ order: build(:order),
+ catalog_item: build(:catalog_item),
+ quantity: 1,
+ price: 1000
+ }
+ end
+
+ def order_with_items(user, num_items) do
+ order = insert(:order, %{user: user})
+ insert_list(num_items, :order_item, %{order: order})
+ order
+ end
+
+end
diff --git a/test/test_helper.exs b/test/test_helper.exs
index 6b4596c..94f36da 100644
--- a/test/test_helper.exs
+++ b/test/test_helper.exs
@@ -1,4 +1,5 @@
-ExUnit.start
+{:ok, _} = Application.ensure_all_started(:ex_machina)
+ExUnit.configure formatters: [JUnitFormatter, ExUnit.CLIFormatter]
+ExUnit.start(exclude: [:skip])
Ecto.Adapters.SQL.Sandbox.mode(Adpq.Repo, :manual)
-
diff --git a/web/controllers/admin/catalog_item_controller.ex b/web/controllers/admin/catalog_item_controller.ex
new file mode 100644
index 0000000..127dd2a
--- /dev/null
+++ b/web/controllers/admin/catalog_item_controller.ex
@@ -0,0 +1,130 @@
+defmodule Adpq.Admin.CatalogItemController do
+ use Adpq.Web, :controller
+ use PhoenixSwagger
+
+ alias Adpq.{CatalogItem, CatalogItemController}
+
+ swagger_path :index do
+ get "/api/admin/catalog_items"
+ tag "Admin CatalogItem"
+ description "List all catalog items"
+ produces "application/json"
+ response 200, "OK", Schema.ref(:CatalogItems)
+ end
+
+ def index(conn, _params) do
+ catalog_items = Repo.all(CatalogItem)
+ render(conn, Adpq.CatalogItemView, "index.json", catalog_items: catalog_items)
+ end
+
+ swagger_path :show do
+ get "/api/admin/catalog_items/{id}"
+ description "Show a single catalog item"
+ tag "Admin CatalogItem"
+ produces "application/json"
+ parameter "id", :path, :string, "Item ID", required: true, example: "22"
+ response 200, "OK", Schema.ref(:CatalogItem)
+ response 404, "Not Found"
+ end
+
+ def show(conn, %{"id" => id}) do
+ catalog_item = Repo.get!(CatalogItem, id)
+ render(conn, Adpq.CatalogItemView, "show.json", catalog_item: catalog_item)
+ end
+
+ swagger_path :create do
+ post "/api/admin/catalog_items"
+ description "Create a new catalog item"
+ produces "application/json"
+ tag "Admin CatalogItem"
+ parameter "body", :body, :object, "Body", required: true, schema: :CatalogItemBody
+ response 201, "Created", Schema.ref(:CatalogItem)
+ response 422, "Unprocesseable"
+ end
+
+ def create(conn, params) do
+ changeset = CatalogItem.changeset(%CatalogItem{}, params)
+ case Repo.insert(changeset) do
+ {:ok, item} ->
+ conn
+ |> put_status(:created)
+ |> put_resp_header("location", admin_catalog_item_path(conn, :show, item))
+ |> render(Adpq.CatalogItemView, "show.json", catalog_item: item)
+ {:error, changeset} ->
+ conn
+ |> put_status(:unprocessable_entity)
+ |> render(Adpq.ChangesetView, "error.json", changeset: changeset)
+ end
+ end
+
+ swagger_path :update do
+ put "/api/admin/catalog_items/{id}"
+ description "Create a new catalog item"
+ produces "application/json"
+ tag "Admin CatalogItem"
+ parameters do
+ id :path, :integer, "ID", required: true, example: 235
+ body :body, :object, "Body", required: true, schema: :CatalogItemUpdate
+ end
+ response 200, "OK", Schema.ref(:CatalogItem)
+ response 422, "Unprocesseable"
+ end
+
+ def update(conn, %{"id" => id} = params) do
+ item = Repo.get!(CatalogItem, id)
+ changeset = CatalogItem.changeset(item, Map.drop(params, ["id"]))
+ case Repo.update(changeset) do
+ {:ok, item} ->
+ conn
+ |> put_status(:ok)
+ |> render(Adpq.CatalogItemView, "show.json", catalog_item: item)
+ {:error, changeset} ->
+ conn
+ |> put_status(:unprocessable_entity)
+ |> render(Adpq.ChangesetView, "error.json", changeset: changeset)
+ end
+ end
+
+ def swagger_definitions do
+ Map.merge(
+ CatalogItemController.swagger_definitions(),
+ %{
+ CatalogItemBody: swagger_schema do
+ title "CatalogItemBody"
+ description "Request body for creating a CatalogItem"
+ properties do
+ unspc :string, "United Nations Standard Products and Services Code"
+ unit_of_measure :string, "e.g. EACH, DOZEN etc", required: true
+ quantity_in_uom :integer, "Quantity per item", required: true
+ category :string, "Item category", required: true
+ super_category :string, "Rollup category", required: true
+ sku :string, "SKU / OEM part number", required: true
+ manufacturer :string, "Manufacturer name", required: true
+ list_price :integer, "List price in cents", required: true
+ description :string, "Item description", required: true
+ contract_unit_price :integer, "Contract unit price in cents", required: true
+ contract_discount :integer, "Contract discount (%)", required: true
+ clin :string, "Contract line item number", required: true
+ end
+ end,
+ CatalogItemUpdate: swagger_schema do
+ title "CatalogItemUpdate"
+ description "Changes to be applied to a CatalogItem"
+ properties do
+ unspc :string, "United Nations Standard Products and Services Code"
+ unit_of_measure :string, "e.g. EACH, DOZEN etc"
+ quantity_in_uom :integer, "Quantity per item"
+ category :string, "Item category"
+ super_category :string, "Rollup category"
+ sku :string, "SKU / OEM part number", required: true
+ manufacturer :string, "Manufacturer name"
+ list_price :integer, "List price in cents"
+ description :string, "Item description"
+ contract_unit_price :integer, "Contract unit price in cents"
+ contract_discount :integer, "Contract discount (%)"
+ clin :string, "Contract line item number"
+ end
+ end
+ })
+ end
+end
diff --git a/web/controllers/admin/order_controller.ex b/web/controllers/admin/order_controller.ex
new file mode 100644
index 0000000..d775879
--- /dev/null
+++ b/web/controllers/admin/order_controller.ex
@@ -0,0 +1,97 @@
+defmodule Adpq.Admin.OrderController do
+ use Adpq.Web, :controller
+ use PhoenixSwagger
+
+ alias Adpq.{Order, Order.Status, OrderQueries, User.Department}
+
+ swagger_path :index do
+ get "/api/admin/orders"
+ tag "Admin Order"
+ description "List orders"
+ produces "application/json"
+ response 200, "OK", Schema.ref(:Order)
+ response 404, "Not Found"
+ end
+
+ def index(conn, _params) do
+ orders = Repo.all(OrderQueries.orders_with_items)
+ render(conn, "index.json", orders: orders)
+ end
+
+ swagger_path :show do
+ get "/api/admin/orders/{id}"
+ tag "Admin Order"
+ description "Show an individual order"
+ parameter "id", :path, :integer, "Order ID", required: true
+ response 200, "OK", Schema.ref(:Order)
+ response 404, "Not Found"
+ end
+
+ def show(conn, %{"id" => id}) do
+ order = Repo.one!(OrderQueries.find_with_items(id))
+ render(conn, "show.json", order: order)
+ end
+
+ swagger_path :update do
+ put "/api/admin/orders/{id}"
+ description "Update the status of an order"
+ tag "Admin Order"
+ parameters do
+ id :path, :integer, "Order ID", required: true
+ body :body, :object, "Status", required: true, schema: Schema.ref(:OrderStatusUpdate)
+ end
+ response 200, "OK", Schema.ref(:Order)
+ response 404, "Not Found"
+ response 422, "Unprocessable Entity"
+ end
+
+ def update(conn, %{"id" => id, "status" => status}) do
+ order = Repo.get!(Order, id)
+ changeset = Order.status_update_changeset(order, %{status: status})
+ case Repo.update(changeset) do
+ {:ok, order} ->
+ order_with_items = Repo.one(OrderQueries.find_with_items(order.id))
+ conn
+ |> put_resp_header("location", admin_order_path(conn, :show, order))
+ |> render("show.json", order: order_with_items)
+ {:error, changeset} ->
+ conn
+ |> put_status(:unprocessable_entity)
+ |> render(Adpq.ChangesetView, "error.json", changeset: changeset)
+ end
+ end
+
+ def swagger_definitions do
+ %{
+ OrderItem: swagger_schema do
+ title "OrderItem"
+ description "An order line item"
+ properties do
+ id :string, "Item ID", required: true
+ category :string, "Item Category", required: true
+ sub_category :string, "Item Subcategory", required: true
+ price :integer, "Total Price", required: true
+ quantity :integer, "Quantity", required: true
+ name :string, "Item Name", required: true
+ sku :string, "SKU / OEM part number", required: true
+ manufacturer :string, "Manufacturer Name", required: true
+ end
+ end,
+ Order: swagger_schema do
+ title "Order"
+ description "A Customer Order"
+ properties do
+ id :string, "Order ID", required: true
+ user_id :string, "User ID", required: true
+ status :string, "Order Status", required: true, enum: Status.list
+ items array(:OrderItem), "Items", required: true
+ department :string, "Department", required: true, enum: Department.all
+ end
+ end,
+ OrderStatusUpdate: swagger_schema do
+ title "Order Status Update"
+ property "status", :string, "Status", required: true, enum: Status.list
+ end
+ }
+ end
+end
diff --git a/web/controllers/auth_controller.ex b/web/controllers/auth_controller.ex
new file mode 100644
index 0000000..74071b4
--- /dev/null
+++ b/web/controllers/auth_controller.ex
@@ -0,0 +1,53 @@
+defmodule Adpq.AuthController do
+ use Adpq.Web, :controller
+ use PhoenixSwagger
+
+ alias Adpq.{User, Repo}
+
+ swagger_path :create do
+ post "/api/auth"
+ description "exchange credentials for an authorization \"token\""
+ produces "application/json"
+ parameter "body", :body, :object, "name and password", required: true, schema: Schema.ref(:AuthRequest)
+ response 200, "OK", Schema.ref(:User)
+ response 401, "Unauthorized"
+ response 404, "Not Found"
+ end
+
+ def create(conn, %{"name" => _, "password" => "user"} = params) do
+ user = User.find_or_create_by_name(Map.put(params, "role", "USER"))
+ render(conn, "show.json", auth: user)
+ end
+
+ def create(conn, %{"name" => "admin", "password" => "admin"}) do
+ user = Repo.get_by!(User, name: "admin")
+ render(conn, "show.json", auth: user)
+ end
+
+ def create(conn, _) do
+ send_resp(conn, :unauthorized, "")
+ end
+
+ def swagger_definitions do
+ %{
+ AuthRequest: swagger_schema do
+ title "Authorization Request"
+ description "name and password"
+ properties do
+ name :string, "username", required: true
+ password :string, "password", required: true
+ end
+ end,
+ User: swagger_schema do
+ title "User"
+ description "User Information"
+ properties do
+ id :integer, "User ID", required: true
+ name :string, "username", required: true
+ role :string, "role", required: true, enum: ["USER", "ADMIN"]
+ end
+ end
+ }
+ end
+
+end
diff --git a/web/controllers/cart_item_controller.ex b/web/controllers/cart_item_controller.ex
new file mode 100644
index 0000000..ddcf4c1
--- /dev/null
+++ b/web/controllers/cart_item_controller.ex
@@ -0,0 +1,142 @@
+defmodule Adpq.CartItemController do
+ use Adpq.Web, :controller
+ use PhoenixSwagger
+
+ alias Adpq.{User, CartItem}
+
+ swagger_path :index do
+ get "/api/user/{user_id}/cart_items"
+ description "List items in a users cart"
+ produces "application/json"
+ parameter "user_id", :path, :integer, "User ID", required: true, example: 22
+ response 200, "OK", Schema.ref(:CartItems)
+ response 404, "Not Found"
+ end
+
+ def index(conn, %{"user_id" => user_id}) do
+ user = loadUser(user_id)
+ user_with_cart_items = Repo.preload(user, [{:cart_items, [:catalog_item]}])
+ render(conn, "index.json", cart_items: user_with_cart_items.cart_items)
+ end
+
+ swagger_path :create do
+ post "/api/user/{user_id}/cart_items"
+ description "Add an item to a users cart"
+ produces "application/json"
+ parameters do
+ user_id :path, :integer, "User ID", required: true, example: 22
+ body :body, :object, "catalog item id and quantity", required: true, schema: Schema.ref(:CartItemBody)
+ end
+ response 200, "OK", Schema.ref(:CartItem)
+ response 404, "Not Found"
+ end
+
+ def create(conn, %{"user_id" => _} = params) do
+ changeset = CartItem.changeset(%CartItem{}, params)
+ case Repo.insert(changeset) do
+ {:ok, cart_item} ->
+ conn
+ |> put_status(:created)
+ |> put_resp_header("location", user_cart_item_path(conn, :index, cart_item))
+ |> render("show.json", cart_item: Repo.preload(cart_item, [:user, :catalog_item]))
+ {:error, changeset} ->
+ conn
+ |> put_status(:unprocessable_entity)
+ |> render(Adpq.ChangesetView, "error.json", changeset: changeset)
+ end
+ end
+
+ swagger_path :update do
+ put "/api/user/{user_id}/cart_items/{id}"
+ description "Update quantity of an item in a users cart"
+ produces "application/json"
+ parameters do
+ user_id :path, :integer, "User ID", required: true, example: 22
+ id :path, :integer, "Item ID", required: true, example: 33
+ body :body, :object, "Quantity", required: true, schema: Schema.ref(:CartItemUpdate)
+ end
+ response 200, "OK", Schema.ref(:CartItem)
+ response 404, "Not Found"
+ end
+
+ def update(conn, %{"user_id" => user_id, "id" => id, "quantity" => quantity}) do
+ user = loadUser(user_id)
+ item = Repo.get_by!(CartItem, %{id: id, user_id: user.id})
+ changeset = CartItem.update_changeset(item, %{quantity: quantity})
+ case Repo.update(changeset) do
+ {:ok, cart_item} ->
+ conn
+ |> put_status(:ok)
+ |> render("show.json", cart_item: Repo.preload(cart_item, [:user, :catalog_item]))
+ {:error, changeset} ->
+ conn
+ |> put_status(:unprocessable_entity)
+ |> render(Adpq.ChangesetView, "error.json", changeset: changeset)
+ end
+ end
+
+ swagger_path :delete do
+ delete "/api/user/{user_id}/cart_items/{id}"
+ description "Remove item from users cart"
+ produces "application/json"
+ parameters do
+ user_id :path, :integer, "User ID", required: true, example: 22
+ id :path, :integer, "Item ID", required: true, example: 33
+ end
+ response 201, "OK"
+ response 404, "Not Found"
+ end
+
+ def delete(conn, %{"user_id" => user_id, "id" => id}) do
+ user = loadUser(user_id)
+ item = Repo.get_by!(CartItem, %{id: id, user_id: user.id})
+ case Repo.delete(item) do
+ {:ok, _} ->
+ conn
+ |> put_resp_header("content-type", "application/json")
+ |> send_resp(:no_content, "")
+ {:error, changeset} ->
+ conn
+ |> put_status(:unprocessable_entity)
+ |> render(Adpq.ChangesetView, "error.json", changeset: changeset)
+ end
+
+ end
+
+ def loadUser(user_id) do
+ # ensure === session user
+ Repo.get!(User, user_id)
+ end
+
+ def swagger_definitions do
+ %{
+ CartItem: swagger_schema do
+ title "Cart Item"
+ description "Cart Item"
+ properties do
+ catalog_item_id :integer, "Catalog Item ID", required: true
+ quantity :integer, "Quantity", required: true
+ user_id :integer, "User ID", required: true
+ name :string, "Name", required: true
+ price :integer, "Price", required: true
+ manufacturer :string, "Manufacturer", required: true
+ sku :string, "SKU", required: true
+ end
+ end,
+ CartItemBody: swagger_schema do
+ title "Cart Item Body"
+ description "required JSON to create cart item"
+ properties do
+ catalog_item_id :integer, "Catalog Item ID", required: true
+ quantity :integer, "Quantity", required: true
+ end
+ end,
+ CartItemUpdate: swagger_schema do
+ title "Cart Item Quantity Update"
+ description "New Quantity"
+ property "quantity", :integer, "Quantity", required: true
+ end
+ }
+ end
+
+end
diff --git a/web/controllers/catalog_item_controller.ex b/web/controllers/catalog_item_controller.ex
new file mode 100644
index 0000000..850eabe
--- /dev/null
+++ b/web/controllers/catalog_item_controller.ex
@@ -0,0 +1,62 @@
+defmodule Adpq.CatalogItemController do
+ use Adpq.Web, :controller
+ use PhoenixSwagger
+
+ alias Adpq.CatalogItem
+
+ swagger_path :index do
+ get "/api/catalog_items"
+ description "List all catalog items"
+ produces "application/json"
+ response 200, "OK", Schema.ref(:CatalogItems)
+ end
+
+ def index(conn, _params) do
+ catalog_items = Repo.all(CatalogItem)
+ render(conn, "index.json", catalog_items: catalog_items)
+ end
+
+ swagger_path :show do
+ get "/api/catalog_items/{id}"
+ description "Show a single catalog item"
+ produces "application/json"
+ parameter "id", :path, :string, "Item ID", required: true, example: "22"
+ response 200, "OK", Schema.ref(:CatalogItem)
+ response 404, "Not Found"
+ end
+
+ def show(conn, %{"id" => id}) do
+ catalog_item = Repo.get!(CatalogItem, id)
+ render(conn, "show.json", catalog_item: catalog_item)
+ end
+
+ def swagger_definitions do
+ %{
+ CatalogItem: swagger_schema do
+ title "CatalogItem"
+ description "An inventory SKU"
+ properties do
+ id :string, "Item ID"
+ unspc :string, "United Nations Standard Products and Services Code"
+ unit_of_measure :string, "e.g. EACH, DOZEN etc", required: true
+ quantity_in_uom :integer, "Quantity per item", required: true
+ category :string, "Item category", required: true
+ super_category :string, "Rollup category"
+ sku :string, "SKU / OEM part number", required: true
+ manufacturer :string, "Manufacturer name", required: true
+ list_price :integer, "List price in cents", required: true
+ description :string, "Item description", required: true
+ contract_unit_price :integer, "Contract unit price in cents"
+ contract_discount :integer, "Contract discount (%)"
+ clin :string, "Contract line item number"
+ end
+ end,
+ CatalogItems: swagger_schema do
+ title "CatalogItems"
+ description "A collection of CatalogItems"
+ type :array
+ items Schema.ref(:CatalogItem)
+ end
+ }
+ end
+end
diff --git a/web/controllers/order_controller.ex b/web/controllers/order_controller.ex
new file mode 100644
index 0000000..c40c830
--- /dev/null
+++ b/web/controllers/order_controller.ex
@@ -0,0 +1,152 @@
+defmodule Adpq.OrderController do
+ use Adpq.Web, :controller
+ use PhoenixSwagger
+
+ import Adpq.OrderQueries
+ alias Adpq.{Order, OrderItem, CartItem, User, ErrorView, Order.Status}
+
+ swagger_path :index do
+ get "/api/user/{user_id}/orders"
+ description "List orders for a user"
+ produces "application/json"
+ parameter "user_id", :path, :integer, "User ID", required: true, example: 22
+ response 200, "OK", Schema.ref(:Order)
+ response 404, "Not Found"
+ end
+
+ def index(conn, %{"user_id" => user_id}) do
+ user =
+ user_id
+ |> user_scope
+ |> with_order_items
+ |> Repo.one!
+ render(conn, "index.json", orders: user.orders)
+ end
+
+ swagger_path :create do
+ post "/api/user/{user_id}/orders"
+ description "Create an order from a users current cart"
+ parameter "user_id", :path, :integer, "User ID", required: true, example: 22
+ produces "application/json"
+ response 200, "OK", Schema.ref(:Order)
+ response 422, "Empty Cart"
+ end
+
+ def create(conn, %{"user_id" => user_id}) do
+ # load cart items
+ user =
+ user_id
+ |> user_scope
+ |> with_cart_items
+ |> Repo.one!
+ case user.cart_items do
+ [] ->
+ conn
+ |> put_status(:unprocessable_entity)
+ |> render(ErrorView, "error.json", %{message: "Empty Cart"})
+ _ ->
+ # create order
+ order =
+ %Order{}
+ |> Order.changeset(%{user_id: user_id, status: Status.submitted})
+ |> Repo.insert!
+ # move cart items into order
+ Enum.map(user.cart_items, fn ci -> Repo.insert!(OrderItem.from_cart_item(order, ci)) end)
+ # reload and render
+ order = Repo.preload(order, [{:order_items, [:catalog_item]}])
+ Repo.delete_all(from c in CartItem, where: c.user_id == ^user.id)
+ conn
+ |> put_status(:created)
+ |> put_resp_header("location", user_order_path(conn, :show, user.id, order))
+ |> render("show.json", order: order)
+ end
+ end
+
+ swagger_path :show do
+ get "/api/user/{user_id}/orders/{id}"
+ description "Show an individual order"
+ parameters do
+ user_id :path, :integer, "User ID", required: true, example: 22
+ id :path, :integer, "Order ID", required: true
+ end
+ response 200, "OK", Schema.ref(:Order)
+ response 404, "Not Found"
+ end
+
+ def show(conn, %{"user_id" => user_id, "id" => id}) do
+ case Repo.one!(load_user_order(user_id, id)) do
+ %User{orders: [order | _]} -> render(conn, "show.json", order: order)
+ _ ->
+ conn
+ |> put_resp_header("content-type", "application/json")
+ |> send_resp(:not_found, "")
+ end
+ end
+
+ swagger_path :update do
+ put "/api/user/{user_id}/orders/{id}"
+ description "Update the status of an order"
+ parameters do
+ user_id :path, :integer, "User ID", required: true, example: 22
+ id :path, :integer, "Order ID", required: true
+ body :body, :object, "Status", required: true, schema: Schema.ref(:OrderStatusUpdate)
+ end
+ response 200, "OK", Schema.ref(:Order)
+ response 404, "Not Found"
+ response 422, "Unprocessable Entity"
+ end
+
+ def update(conn, %{"user_id" => user_id, "id" => id, "status" => status}) do
+ case Repo.one!(load_user_order(user_id, id)) do
+ %User{orders: [order | _]} ->
+ changeset = Order.status_update_changeset(order, %{status: status})
+ case Repo.update(changeset) do
+ {:ok, order} ->
+ conn
+ |> put_resp_header("location", user_order_path(conn, :show, user_id, order))
+ |> render("show.json", order: order)
+ {:error, changeset} ->
+ conn
+ |> put_status(:unprocessable_entity)
+ |> render(Adpq.ChangesetView, "error.json", changeset: changeset)
+ end
+ _ ->
+ conn
+ |> put_resp_header("content-type", "application/json")
+ |> send_resp(:not_found, "")
+ end
+ end
+
+ def swagger_definitions do
+ %{
+ OrderItem: swagger_schema do
+ title "OrderItem"
+ description "An order line item"
+ properties do
+ id :string, "Item ID", required: true
+ category :string, "Item Category", required: true
+ sub_category :string, "Item Subcategory", required: true
+ price :integer, "Total Price", required: true
+ quantity :integer, "Quantity", required: true
+ name :string, "Item Name", required: true
+ sku :string, "SKU / OEM part number", required: true
+ manufacturer :string, "Manufacturer Name", required: true
+ end
+ end,
+ Order: swagger_schema do
+ title "Order"
+ description "A Customer Order"
+ properties do
+ id :string, "Order ID", required: true
+ user_id :string, "User ID", required: true
+ status :string, "Order Status", required: true, enum: Status.list
+ items array(:OrderItem), "Items", required: true
+ end
+ end,
+ OrderStatusUpdate: swagger_schema do
+ title "Order Status Update"
+ property "status", :string, "Status", required: true, enum: Status.list
+ end
+ }
+ end
+end
diff --git a/web/controllers/swagger_docs_controller.ex b/web/controllers/swagger_docs_controller.ex
new file mode 100644
index 0000000..675e59a
--- /dev/null
+++ b/web/controllers/swagger_docs_controller.ex
@@ -0,0 +1,14 @@
+defmodule Adpq.SwaggerDocsController do
+ use Adpq.Web, :controller
+
+ def index(conn, _) do
+ swagger =
+ :adpq
+ |> Application.app_dir("priv/swagger/swagger.json")
+ |> File.read!
+ |> Poison.decode!
+ conn
+ |> put_status(:ok)
+ |> json(swagger)
+ end
+end
diff --git a/web/controllers/user_controller.ex b/web/controllers/user_controller.ex
new file mode 100644
index 0000000..5944fbf
--- /dev/null
+++ b/web/controllers/user_controller.ex
@@ -0,0 +1,4 @@
+defmodule UserController do
+ use Adpq.Web, :controller
+ @moduledoc false
+end
diff --git a/web/models/cart_item.ex b/web/models/cart_item.ex
new file mode 100644
index 0000000..adade20
--- /dev/null
+++ b/web/models/cart_item.ex
@@ -0,0 +1,29 @@
+defmodule Adpq.CartItem do
+ use Adpq.Web, :model
+
+ @moduledoc """
+ A shopping cart line item
+ """
+
+ schema "cart_items" do
+ field :quantity, :integer
+ belongs_to :user, Adpq.User
+ belongs_to :catalog_item, Adpq.CatalogItem
+ timestamps()
+ end
+
+ @doc """
+ Builds a changeset based on the `struct` and `params`.
+ """
+ def changeset(struct, params \\ %{}) do
+ struct
+ |> cast(params, [:user_id, :catalog_item_id, :quantity])
+ |> validate_required([:user_id, :catalog_item_id, :quantity])
+ end
+
+ def update_changeset(struct, params \\ %{}) do
+ struct
+ |> cast(params, [:quantity])
+ |> validate_required([:quantity])
+ end
+end
diff --git a/web/models/catalog_item.ex b/web/models/catalog_item.ex
new file mode 100644
index 0000000..6dd8f7e
--- /dev/null
+++ b/web/models/catalog_item.ex
@@ -0,0 +1,73 @@
+defmodule Adpq.CatalogItem do
+ use Adpq.Web, :model
+
+ @moduledoc """
+ An Inventory SKU
+ """
+
+ schema "catalog_items" do
+ field :clin, :string
+ field :unspc, :string
+ field :manufacturer, :string
+ field :name, :string
+ field :sku, :string
+ field :description, :string
+ field :unit_of_measure, :string
+ field :quantity_in_uom, :integer
+ field :list_price, :integer
+ field :contract_unit_price, :integer
+ field :contract_discount, :integer
+ field :long_category, :string
+ field :simple_category, :string
+ field :top_level_category, :string
+ has_many :order_items, Adpq.OrderItem
+
+ timestamps()
+ end
+
+ @doc """
+ Builds a changeset based on the `struct` and `params`.
+ """
+ def changeset(struct, params \\ %{}) do
+ struct
+ |> cast(params, params())
+ |> validate_required(required_params())
+ end
+
+ def params do
+ [
+ :clin,
+ :unspc,
+ :manufacturer,
+ :sku,
+ :description,
+ :unit_of_measure,
+ :quantity_in_uom,
+ :list_price,
+ :contract_unit_price,
+ :contract_discount,
+ :name,
+ :long_category,
+ :simple_category,
+ :top_level_category
+ ]
+ end
+
+ defp required_params do
+ [
+ :clin,
+ :manufacturer,
+ :sku,
+ :description,
+ :unit_of_measure,
+ :quantity_in_uom,
+ :list_price,
+ :contract_unit_price,
+ :contract_discount,
+ :name,
+ :long_category,
+ :simple_category,
+ :top_level_category
+ ]
+ end
+end
diff --git a/web/models/order.ex b/web/models/order.ex
new file mode 100644
index 0000000..68fc061
--- /dev/null
+++ b/web/models/order.ex
@@ -0,0 +1,37 @@
+defmodule Adpq.Order do
+ use Adpq.Web, :model
+
+ @moduledoc """
+ An individual user order
+ """
+
+ schema "orders" do
+ belongs_to :user, Adpq.User
+ field :status, :string
+ has_many :order_items, Adpq.OrderItem
+
+ timestamps()
+ end
+
+ @doc """
+ Builds a changeset based on the `struct` and `params`.
+ """
+ def changeset(struct, params \\ %{}) do
+ struct
+ |> cast(params, [:user_id, :status])
+ |> validate_required([:user_id, :status])
+ end
+
+ def status_update_changeset(struct, params \\ %{}) do
+ struct
+ |> cast(params, [:status])
+ |> validate_required([:status])
+ end
+
+ defmodule Status do
+ @moduledoc "valid order status values"
+ def submitted, do: "SUBMITTED"
+ def cancelled, do: "CANCELLED"
+ def list, do: [submitted(), cancelled()]
+ end
+end
diff --git a/web/models/order_item.ex b/web/models/order_item.ex
new file mode 100644
index 0000000..cf527c6
--- /dev/null
+++ b/web/models/order_item.ex
@@ -0,0 +1,37 @@
+defmodule Adpq.OrderItem do
+ use Adpq.Web, :model
+
+ alias Adpq.{Order, CartItem, CatalogItem}
+
+ @moduledoc """
+ An order line item
+ """
+
+ schema "order_items" do
+ belongs_to :order, Adpq.Order
+ belongs_to :catalog_item, Adpq.CatalogItem
+ field :quantity, :integer
+ field :price, :integer
+
+ timestamps()
+ end
+
+ @doc """
+ Builds a changeset based on the `struct` and `params`.
+ """
+ def changeset(struct, params \\ %{}) do
+ struct
+ |> cast(params, [:order_id, :catalog_item_id, :quantity, :price])
+ |> validate_required([:order_id, :catalog_item_id, :quantity, :price])
+ end
+
+ def from_cart_item(%Order{} = order, %CartItem{catalog_item: %CatalogItem{} = catalog_item} = cart_item) do
+ params = %{
+ order_id: order.id,
+ catalog_item_id: catalog_item.id,
+ quantity: cart_item.quantity,
+ price: catalog_item.list_price
+ }
+ changeset(%Adpq.OrderItem{}, params)
+ end
+end
diff --git a/web/models/user.ex b/web/models/user.ex
new file mode 100644
index 0000000..62f10c6
--- /dev/null
+++ b/web/models/user.ex
@@ -0,0 +1,49 @@
+defmodule Adpq.User do
+ use Adpq.Web, :model
+
+ alias Adpq.{Repo, User, User.Department}
+
+ @moduledoc """
+ A system login, either a regular user/requester or admin
+ """
+
+ schema "users" do
+ field :name, :string
+ field :password, :string
+ field :role, :string
+ field :department, :string
+ has_many :cart_items, Adpq.CartItem
+ has_many :orders, Adpq.Order
+ timestamps()
+ end
+
+ @doc """
+ Builds a changeset based on the `struct` and `params`.
+ """
+ def changeset(struct, params \\ %{}) do
+ struct
+ |> cast(params, [:name, :password, :role, :department])
+ |> validate_required([:name, :password, :role, :department])
+ end
+
+ def find_or_create_by_name(%{"name" => name, "password" => _, "role" => _} = params) do
+ exists =
+ User
+ |> where(name: ^name)
+ |> Repo.one
+ case exists do
+ %User{} -> exists
+ _ -> Repo.insert!(changeset(%User{}, Map.put(params, "department", Department.random)))
+ end
+ end
+
+ defmodule Department do
+ @moduledoc """
+ Departments to arbitrarily assign demo users
+ """
+ @departments ~w(DCSS CDE ABC PARKS)
+ def random, do: Enum.random(@departments)
+ def all, do: @departments
+ end
+
+end
diff --git a/web/router.ex b/web/router.ex
index aa56928..b3f6365 100644
--- a/web/router.ex
+++ b/web/router.ex
@@ -1,5 +1,6 @@
defmodule Adpq.Router do
use Adpq.Web, :router
+ use Honeybadger.Plug
pipeline :browser do
plug :accepts, ["html"]
@@ -13,14 +14,47 @@ defmodule Adpq.Router do
plug :accepts, ["json"]
end
+ scope "/api", Adpq do
+ pipe_through :api
+ resources "/swagger_docs", SwaggerDocsController, only: [:index]
+ resources "/auth", AuthController, only: [:create]
+ scope "/" do # protected routes
+ pipe_through [:api, Adpq.LoadUser, Adpq.EnsureUser]
+ resources "/catalog_items", CatalogItemController, except: [:new, :edit]
+ resources "/user", UserController, only: [] do
+ resources "/cart_items", CartItemController, except: [:new, :edit]
+ resources "/orders", OrderController, except: [:delete]
+ end
+ end
+ scope "/admin", Admin, as: :admin do
+ pipe_through [:api, Adpq.LoadUser, Adpq.EnsureAdmin]
+ resources "/orders", OrderController, only: [:index, :show, :update]
+ resources "/catalog_items", CatalogItemController, only: [:index, :show, :update, :create]
+ end
+ end
+
scope "/", Adpq do
pipe_through :browser # Use the default browser stack
-
- get "/", PageController, :index
+ get "/*path", PageController, :index
end
- # Other scopes may use custom stacks.
- # scope "/api", Adpq do
- # pipe_through :api
- # end
+ def swagger_info do
+ %{
+ securityDefinitions: %{
+ ApiToken: %{
+ type: "apiKey",
+ name: "Authorization",
+ in: "header",
+ description: "API Operations require a valid token."
+ }
+ },
+ security: [
+ %{ApiToken: []}
+ ],
+ info: %{
+ version: "0.1",
+ title: "Lab Zero - ADPQ"
+ }
+ }
+ end
end
diff --git a/web/static/.DS_Store b/web/static/.DS_Store
new file mode 100644
index 0000000..016ef7d
Binary files /dev/null and b/web/static/.DS_Store differ
diff --git a/web/static/fonts/merriweather-bold-webfont.eot b/web/static/assets/fonts/merriweather-bold-webfont.eot
similarity index 100%
rename from web/static/fonts/merriweather-bold-webfont.eot
rename to web/static/assets/fonts/merriweather-bold-webfont.eot
diff --git a/web/static/fonts/merriweather-bold-webfont.ttf b/web/static/assets/fonts/merriweather-bold-webfont.ttf
similarity index 100%
rename from web/static/fonts/merriweather-bold-webfont.ttf
rename to web/static/assets/fonts/merriweather-bold-webfont.ttf
diff --git a/web/static/fonts/merriweather-bold-webfont.woff b/web/static/assets/fonts/merriweather-bold-webfont.woff
similarity index 100%
rename from web/static/fonts/merriweather-bold-webfont.woff
rename to web/static/assets/fonts/merriweather-bold-webfont.woff
diff --git a/web/static/fonts/merriweather-bold-webfont.woff2 b/web/static/assets/fonts/merriweather-bold-webfont.woff2
similarity index 100%
rename from web/static/fonts/merriweather-bold-webfont.woff2
rename to web/static/assets/fonts/merriweather-bold-webfont.woff2
diff --git a/web/static/fonts/merriweather-italic-webfont.eot b/web/static/assets/fonts/merriweather-italic-webfont.eot
similarity index 100%
rename from web/static/fonts/merriweather-italic-webfont.eot
rename to web/static/assets/fonts/merriweather-italic-webfont.eot
diff --git a/web/static/fonts/merriweather-italic-webfont.ttf b/web/static/assets/fonts/merriweather-italic-webfont.ttf
similarity index 100%
rename from web/static/fonts/merriweather-italic-webfont.ttf
rename to web/static/assets/fonts/merriweather-italic-webfont.ttf
diff --git a/web/static/fonts/merriweather-italic-webfont.woff b/web/static/assets/fonts/merriweather-italic-webfont.woff
similarity index 100%
rename from web/static/fonts/merriweather-italic-webfont.woff
rename to web/static/assets/fonts/merriweather-italic-webfont.woff
diff --git a/web/static/fonts/merriweather-italic-webfont.woff2 b/web/static/assets/fonts/merriweather-italic-webfont.woff2
similarity index 100%
rename from web/static/fonts/merriweather-italic-webfont.woff2
rename to web/static/assets/fonts/merriweather-italic-webfont.woff2
diff --git a/web/static/fonts/merriweather-light-webfont.eot b/web/static/assets/fonts/merriweather-light-webfont.eot
similarity index 100%
rename from web/static/fonts/merriweather-light-webfont.eot
rename to web/static/assets/fonts/merriweather-light-webfont.eot
diff --git a/web/static/fonts/merriweather-light-webfont.ttf b/web/static/assets/fonts/merriweather-light-webfont.ttf
similarity index 100%
rename from web/static/fonts/merriweather-light-webfont.ttf
rename to web/static/assets/fonts/merriweather-light-webfont.ttf
diff --git a/web/static/fonts/merriweather-light-webfont.woff b/web/static/assets/fonts/merriweather-light-webfont.woff
similarity index 100%
rename from web/static/fonts/merriweather-light-webfont.woff
rename to web/static/assets/fonts/merriweather-light-webfont.woff
diff --git a/web/static/fonts/merriweather-light-webfont.woff2 b/web/static/assets/fonts/merriweather-light-webfont.woff2
similarity index 100%
rename from web/static/fonts/merriweather-light-webfont.woff2
rename to web/static/assets/fonts/merriweather-light-webfont.woff2
diff --git a/web/static/fonts/merriweather-regular-webfont.eot b/web/static/assets/fonts/merriweather-regular-webfont.eot
similarity index 100%
rename from web/static/fonts/merriweather-regular-webfont.eot
rename to web/static/assets/fonts/merriweather-regular-webfont.eot
diff --git a/web/static/fonts/merriweather-regular-webfont.ttf b/web/static/assets/fonts/merriweather-regular-webfont.ttf
similarity index 100%
rename from web/static/fonts/merriweather-regular-webfont.ttf
rename to web/static/assets/fonts/merriweather-regular-webfont.ttf
diff --git a/web/static/fonts/merriweather-regular-webfont.woff b/web/static/assets/fonts/merriweather-regular-webfont.woff
similarity index 100%
rename from web/static/fonts/merriweather-regular-webfont.woff
rename to web/static/assets/fonts/merriweather-regular-webfont.woff
diff --git a/web/static/fonts/merriweather-regular-webfont.woff2 b/web/static/assets/fonts/merriweather-regular-webfont.woff2
similarity index 100%
rename from web/static/fonts/merriweather-regular-webfont.woff2
rename to web/static/assets/fonts/merriweather-regular-webfont.woff2
diff --git a/web/static/fonts/sourcesanspro-bold-webfont.eot b/web/static/assets/fonts/sourcesanspro-bold-webfont.eot
similarity index 100%
rename from web/static/fonts/sourcesanspro-bold-webfont.eot
rename to web/static/assets/fonts/sourcesanspro-bold-webfont.eot
diff --git a/web/static/fonts/sourcesanspro-bold-webfont.ttf b/web/static/assets/fonts/sourcesanspro-bold-webfont.ttf
similarity index 100%
rename from web/static/fonts/sourcesanspro-bold-webfont.ttf
rename to web/static/assets/fonts/sourcesanspro-bold-webfont.ttf
diff --git a/web/static/fonts/sourcesanspro-bold-webfont.woff b/web/static/assets/fonts/sourcesanspro-bold-webfont.woff
similarity index 100%
rename from web/static/fonts/sourcesanspro-bold-webfont.woff
rename to web/static/assets/fonts/sourcesanspro-bold-webfont.woff
diff --git a/web/static/fonts/sourcesanspro-bold-webfont.woff2 b/web/static/assets/fonts/sourcesanspro-bold-webfont.woff2
similarity index 100%
rename from web/static/fonts/sourcesanspro-bold-webfont.woff2
rename to web/static/assets/fonts/sourcesanspro-bold-webfont.woff2
diff --git a/web/static/fonts/sourcesanspro-italic-webfont.eot b/web/static/assets/fonts/sourcesanspro-italic-webfont.eot
similarity index 100%
rename from web/static/fonts/sourcesanspro-italic-webfont.eot
rename to web/static/assets/fonts/sourcesanspro-italic-webfont.eot
diff --git a/web/static/fonts/sourcesanspro-italic-webfont.ttf b/web/static/assets/fonts/sourcesanspro-italic-webfont.ttf
similarity index 100%
rename from web/static/fonts/sourcesanspro-italic-webfont.ttf
rename to web/static/assets/fonts/sourcesanspro-italic-webfont.ttf
diff --git a/web/static/fonts/sourcesanspro-italic-webfont.woff b/web/static/assets/fonts/sourcesanspro-italic-webfont.woff
similarity index 100%
rename from web/static/fonts/sourcesanspro-italic-webfont.woff
rename to web/static/assets/fonts/sourcesanspro-italic-webfont.woff
diff --git a/web/static/fonts/sourcesanspro-italic-webfont.woff2 b/web/static/assets/fonts/sourcesanspro-italic-webfont.woff2
similarity index 100%
rename from web/static/fonts/sourcesanspro-italic-webfont.woff2
rename to web/static/assets/fonts/sourcesanspro-italic-webfont.woff2
diff --git a/web/static/fonts/sourcesanspro-light-webfont.eot b/web/static/assets/fonts/sourcesanspro-light-webfont.eot
similarity index 100%
rename from web/static/fonts/sourcesanspro-light-webfont.eot
rename to web/static/assets/fonts/sourcesanspro-light-webfont.eot
diff --git a/web/static/fonts/sourcesanspro-light-webfont.ttf b/web/static/assets/fonts/sourcesanspro-light-webfont.ttf
similarity index 100%
rename from web/static/fonts/sourcesanspro-light-webfont.ttf
rename to web/static/assets/fonts/sourcesanspro-light-webfont.ttf
diff --git a/web/static/fonts/sourcesanspro-light-webfont.woff b/web/static/assets/fonts/sourcesanspro-light-webfont.woff
similarity index 100%
rename from web/static/fonts/sourcesanspro-light-webfont.woff
rename to web/static/assets/fonts/sourcesanspro-light-webfont.woff
diff --git a/web/static/fonts/sourcesanspro-light-webfont.woff2 b/web/static/assets/fonts/sourcesanspro-light-webfont.woff2
similarity index 100%
rename from web/static/fonts/sourcesanspro-light-webfont.woff2
rename to web/static/assets/fonts/sourcesanspro-light-webfont.woff2
diff --git a/web/static/fonts/sourcesanspro-regular-webfont.eot b/web/static/assets/fonts/sourcesanspro-regular-webfont.eot
similarity index 100%
rename from web/static/fonts/sourcesanspro-regular-webfont.eot
rename to web/static/assets/fonts/sourcesanspro-regular-webfont.eot
diff --git a/web/static/fonts/sourcesanspro-regular-webfont.ttf b/web/static/assets/fonts/sourcesanspro-regular-webfont.ttf
similarity index 100%
rename from web/static/fonts/sourcesanspro-regular-webfont.ttf
rename to web/static/assets/fonts/sourcesanspro-regular-webfont.ttf
diff --git a/web/static/fonts/sourcesanspro-regular-webfont.woff b/web/static/assets/fonts/sourcesanspro-regular-webfont.woff
similarity index 100%
rename from web/static/fonts/sourcesanspro-regular-webfont.woff
rename to web/static/assets/fonts/sourcesanspro-regular-webfont.woff
diff --git a/web/static/fonts/sourcesanspro-regular-webfont.woff2 b/web/static/assets/fonts/sourcesanspro-regular-webfont.woff2
similarity index 100%
rename from web/static/fonts/sourcesanspro-regular-webfont.woff2
rename to web/static/assets/fonts/sourcesanspro-regular-webfont.woff2
diff --git a/web/static/assets/images/california-technology-agency.jpg b/web/static/assets/images/california-technology-agency.jpg
new file mode 100644
index 0000000..5721899
Binary files /dev/null and b/web/static/assets/images/california-technology-agency.jpg differ
diff --git a/web/static/assets/images/cart-alt.svg b/web/static/assets/images/cart-alt.svg
new file mode 100755
index 0000000..bbef52d
--- /dev/null
+++ b/web/static/assets/images/cart-alt.svg
@@ -0,0 +1,8 @@
+
\ No newline at end of file
diff --git a/web/static/assets/images/cart.svg b/web/static/assets/images/cart.svg
new file mode 100755
index 0000000..98170b9
--- /dev/null
+++ b/web/static/assets/images/cart.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/web/static/assets/images/favicons/favicon.ico b/web/static/assets/images/favicons/favicon.ico
old mode 100755
new mode 100644
index c8c9f1c..54c027b
Binary files a/web/static/assets/images/favicons/favicon.ico and b/web/static/assets/images/favicons/favicon.ico differ
diff --git a/web/static/assets/images/products/everyday-computing-dell-desktop.jpg b/web/static/assets/images/products/everyday-computing-dell-desktop.jpg
new file mode 100755
index 0000000..d49efc4
Binary files /dev/null and b/web/static/assets/images/products/everyday-computing-dell-desktop.jpg differ
diff --git a/web/static/assets/images/products/everyday-computing-hp-laptop.jpg b/web/static/assets/images/products/everyday-computing-hp-laptop.jpg
new file mode 100755
index 0000000..605452b
Binary files /dev/null and b/web/static/assets/images/products/everyday-computing-hp-laptop.jpg differ
diff --git a/web/static/assets/images/products/powerhouse-dell-desktop.jpg b/web/static/assets/images/products/powerhouse-dell-desktop.jpg
new file mode 100755
index 0000000..44e9275
Binary files /dev/null and b/web/static/assets/images/products/powerhouse-dell-desktop.jpg differ
diff --git a/web/static/assets/images/products/powerhouse-hp-laptop.jpg b/web/static/assets/images/products/powerhouse-hp-laptop.jpg
new file mode 100755
index 0000000..c21217a
Binary files /dev/null and b/web/static/assets/images/products/powerhouse-hp-laptop.jpg differ
diff --git a/web/static/assets/images/products/thin-client-hp.jpg b/web/static/assets/images/products/thin-client-hp.jpg
new file mode 100755
index 0000000..6bc34a2
Binary files /dev/null and b/web/static/assets/images/products/thin-client-hp.jpg differ
diff --git a/web/static/assets/images/products/travel-dell.jpg b/web/static/assets/images/products/travel-dell.jpg
new file mode 100755
index 0000000..dfb2ad5
Binary files /dev/null and b/web/static/assets/images/products/travel-dell.jpg differ
diff --git a/web/static/assets/images/search-alt-hover.svg b/web/static/assets/images/search-alt-hover.svg
new file mode 100755
index 0000000..cd62d5e
--- /dev/null
+++ b/web/static/assets/images/search-alt-hover.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/web/static/css/_utilities.scss b/web/static/css/_utilities.scss
new file mode 100644
index 0000000..a365dc7
--- /dev/null
+++ b/web/static/css/_utilities.scss
@@ -0,0 +1 @@
+@import 'node_modules/uswds/src/stylesheets/core/utilities';
diff --git a/web/static/css/_variables.scss b/web/static/css/_variables.scss
new file mode 100644
index 0000000..05d3005
--- /dev/null
+++ b/web/static/css/_variables.scss
@@ -0,0 +1,2 @@
+@import 'node_modules/uswds/src/stylesheets/lib/bourbon';
+@import 'node_modules/uswds/src/stylesheets/core/variables';
\ No newline at end of file
diff --git a/web/static/css/alerts.scss b/web/static/css/alerts.scss
new file mode 100644
index 0000000..1e4ebe4
--- /dev/null
+++ b/web/static/css/alerts.scss
@@ -0,0 +1,9 @@
+.alerts {
+ padding-bottom: 20rem;
+}
+
+.alerts-alert {
+ &:first-child {
+ margin-top: 0;
+ }
+}
\ No newline at end of file
diff --git a/web/static/css/app.css b/web/static/css/app.css
deleted file mode 100644
index 5314c34..0000000
--- a/web/static/css/app.css
+++ /dev/null
@@ -1 +0,0 @@
-/* This file is for your main application css. */
\ No newline at end of file
diff --git a/web/static/css/app.scss b/web/static/css/app.scss
new file mode 100644
index 0000000..6a44d5e
--- /dev/null
+++ b/web/static/css/app.scss
@@ -0,0 +1,41 @@
+@import 'variables';
+
+.content {
+ padding-bottom: 20px;
+}
+
+h1, h2, h3, h4 {
+ font-family: "Source Sans Pro", "Helvetica Neue", "Helvetica", "Roboto", "Arial", sans-serif;
+}
+
+h2 {
+ font-weight: 300;
+ margin: 0 0 10px 0;
+ font-size: 40px;
+}
+
+h4 {
+ font-size: $lead-font-size;
+ margin: 0;
+}
+
+.subsection {
+ font-size: $small-font-size;
+ font-weight: normal;
+ text-transform: uppercase;
+ margin-bottom: 16px;
+}
+
+.subheading {
+ font-size: $lead-font-size;
+ margin: 0;
+}
+
+.loading {
+ padding: 20px;
+ text-align: center;
+}
+
+.return-to-top {
+ margin-top: 3em;
+}
\ No newline at end of file
diff --git a/web/static/css/cart.scss b/web/static/css/cart.scss
new file mode 100644
index 0000000..7fa3c6b
--- /dev/null
+++ b/web/static/css/cart.scss
@@ -0,0 +1,15 @@
+@import 'variables';
+
+.cart-item {
+ padding: 1.5em 0;
+}
+
+.cart-checkout-form {
+ border-top: 1px solid $color-gray-lighter;
+ padding-top: 5rem;
+ text-align: right;
+
+ button {
+ margin-right: 0;
+ }
+}
diff --git a/web/static/css/category.scss b/web/static/css/category.scss
new file mode 100644
index 0000000..3382f54
--- /dev/null
+++ b/web/static/css/category.scss
@@ -0,0 +1,23 @@
+@import 'variables';
+
+.category-count {
+ font-style: italic;
+}
+
+.category-item,
+.category-filter-section {
+ border-top: 1px solid $color-gray-light;
+ margin: 2rem 0 3rem;
+}
+
+.category-filter-section {
+ position: relative;
+}
+
+.category-filter-section-heading {
+ font-size: $h4-font-size;
+}
+
+.category-item {
+ padding: 1.5em 0;
+}
diff --git a/web/static/css/footer.scss b/web/static/css/footer.scss
new file mode 100644
index 0000000..851900e
--- /dev/null
+++ b/web/static/css/footer.scss
@@ -0,0 +1,67 @@
+@import 'variables';
+
+.footer {
+ .footer-grid {
+ padding: 0;
+ ul {
+ padding-left: 1.5rem;
+ li {
+ margin-left: 0;
+ }
+ .footer-primary-link {
+ background-image: none;
+ padding-left: 0;
+ padding-bottom: 0;
+ }
+ }
+ }
+}
+
+.footer-slim {
+ .footer-primary {
+ padding-bottom: 0;
+ }
+}
+
+.footer-logo img {
+ border-radius: 65px;
+ max-width: 65px;
+}
+
+@media (min-width: $medium-screen) {
+ .footer {
+ .footer-grid {
+ ul {
+ padding-left: 3rem;
+ }
+ }
+ }
+ .footer-slim {
+ .footer-primary {
+ padding-bottom: 1rem;
+ }
+ }
+ .footer-contact-links {
+ margin-top: 23px;
+ }
+ .footer-heading {
+ margin-top: 10px;
+ }
+ .footer-logo {
+ margin-right: 0;
+ }
+}
+
+@media screen and (min-width: $medium-screen) and (max-width: 800px) {
+ .footer-heading {
+ margin-top: 2px;
+ font-size: 1.7rem;
+ }
+ .footer-contact-links {
+ margin-top: 12px;
+ }
+ .footer-logo img {
+ border-radius: 45px;
+ max-width: 45px;
+ }
+}
\ No newline at end of file
diff --git a/web/static/css/header.scss b/web/static/css/header.scss
new file mode 100644
index 0000000..d6cc5ca
--- /dev/null
+++ b/web/static/css/header.scss
@@ -0,0 +1,39 @@
+@import 'variables';
+
+.header {
+ background: $color-gray;
+ color: $color-white;
+ .header-cart-button {
+ span.count {
+ display: inline;
+ }
+ &:hover {
+ text-decoration: none;
+ }
+ }
+}
+
+.header-login .menu-btn {
+ display: none;
+}
+
+.header-admin .nav-primary {
+ margin-top: 58px;
+}
+
+@media screen and (min-width: $nav-width) {
+ .nav-secondary-links {
+ a:hover {
+ color: $color-white;
+ text-decoration: underline;
+ }
+ }
+ .header-cart-button {
+ background: url(/images/cart-alt.svg) left center no-repeat;
+ background-size: 1.8rem;
+ padding-left: 1.8rem;
+ }
+ .header-cart-button span {
+ display: none;
+ }
+}
diff --git a/web/static/css/homepage.scss b/web/static/css/homepage.scss
new file mode 100644
index 0000000..e571740
--- /dev/null
+++ b/web/static/css/homepage.scss
@@ -0,0 +1,82 @@
+@import 'variables';
+
+.homepage-recommendations {
+ padding: 1rem 0;
+ border-top: 2px solid $color-gray-lighter;
+ @include clearfix;
+ h4 {
+ padding-top: 10px;
+ }
+ p {
+ padding: 0 0 20px 0;
+ margin: 0;
+ }
+ img {
+ width: 100%;
+ }
+ &:last-child {
+ padding-bottom: 0;
+ }
+}
+
+.homepage-recommendation {
+ margin-bottom: 2rem;
+ margin-top: 0;
+ a {
+ border: 1px solid $color-gray-lighter;
+ cursor: pointer;
+ text-decoration: none;
+ display: block;
+ &:hover,
+ &:hover .homepage-recommendation-details {
+ border-color: $color-primary;
+ }
+ }
+ &:last-child {
+ margin-bottom: 0;
+ }
+}
+
+.homepage-recommendation-details {
+ border-top: 1px solid $color-gray-lighter;
+ padding: 18px;
+ font-size: $base-font-size;
+ color: $color-gray-warm-dark;
+}
+
+.homepage-recommendation-category {
+ text-transform: uppercase;
+ font-size: $small-font-size;
+ padding-bottom: 5px;
+ color: $color-gray-dark;
+}
+
+@media screen and (min-width: $medium-screen) and (max-width: 1200px) {
+ .homepage-recommendations {
+ padding: 2rem 0 3rem;
+ .homepage-recommendation {
+ margin-right: 4.5%;
+ &:last-child {
+ margin-right: 0;
+ }
+ }
+ }
+ .homepage-recommendations-description {
+ width: 100%;
+ }
+}
+
+@media screen and (min-width: $medium-screen) {
+ .homepage-recommendation-details {
+ min-height: 105px;
+ }
+}
+
+@media screen and (min-width: $large-screen) {
+ .homepage-recommendations {
+ padding: 2.5rem 0 5.5rem;
+ }
+ .homepage-recommendation {
+ margin-bottom: 0;
+ }
+}
\ No newline at end of file
diff --git a/web/static/css/item.scss b/web/static/css/item.scss
new file mode 100644
index 0000000..05fdb39
--- /dev/null
+++ b/web/static/css/item.scss
@@ -0,0 +1,84 @@
+@import 'utilities';
+@import 'variables';
+
+.item {
+ a {
+ color: inherit;
+ text-decoration: none;
+ }
+}
+
+.item-image {
+ margin-bottom: 2rem;
+ img {
+ border: 1px solid $color-gray-lighter;
+ }
+}
+
+.item-details {
+ margin-bottom: 3rem;
+ p {
+ margin: 0;
+ font-size: $small-font-size;
+ }
+ ul {
+ padding: 1.5rem 0 0 2rem;
+ list-style-type: disc;
+ margin: 0;
+
+ li {
+ margin: 0;
+ }
+ }
+}
+
+.item-detail {
+ h4 {
+ padding-bottom: 2rem;
+ }
+ button {
+ margin-bottom: 0;
+ }
+}
+
+@media screen and (min-width: $medium-screen) and (max-width: 1200px) {
+ .item-image {
+ width: 40%;
+ }
+ .item-details {
+ width: 50%;
+ }
+ .item-cart {
+ button {
+ display: block;
+ }
+ }
+}
+
+@include media($medium-screen) {
+ .item-cart {
+ select {
+ display: inline-block;
+ }
+ button, select {
+ max-width: 150px;
+ width: 100%;
+ margin-right: 0;
+ }
+ h4 {
+ padding-bottom: 2rem;
+ }
+ }
+}
+
+@include media($large-screen) {
+ .item-image {
+ padding-right: 1.5rem;
+ }
+ .item-cart {
+ text-align: right;
+ h4 {
+ padding-bottom: 3rem;
+ }
+ }
+}
\ No newline at end of file
diff --git a/web/static/css/login.scss b/web/static/css/login.scss
new file mode 100644
index 0000000..d382f88
--- /dev/null
+++ b/web/static/css/login.scss
@@ -0,0 +1,7 @@
+.login {
+ margin-bottom: 10rem;
+}
+.login-show-password {
+ text-align: right;
+ max-width: 46rem;
+}
\ No newline at end of file
diff --git a/web/static/css/logo.scss b/web/static/css/logo.scss
new file mode 100644
index 0000000..55d2036
--- /dev/null
+++ b/web/static/css/logo.scss
@@ -0,0 +1,41 @@
+@import 'utilities';
+@import 'variables';
+
+.logo-container {
+ float: left;
+ margin: .5rem;
+}
+
+.logo-department {
+ font-size: $h6-font-size;
+ letter-spacing: 1px;
+ line-height: 1;
+ text-transform: uppercase;
+}
+
+.logo {
+ margin-left: 0;
+
+ a {
+ color: $color-white;
+ }
+}
+
+.logo-text {
+ line-height: 1;
+}
+
+@include media($nav-width) {
+ .logo-container {
+ margin: 0;
+ }
+
+ .logo-department {
+ line-height: initial;
+ margin-top: 2rem;
+ }
+
+ .header .logo {
+ margin: 2.5rem 0 2rem;
+ }
+}
diff --git a/web/static/css/nav.scss b/web/static/css/nav.scss
new file mode 100644
index 0000000..ce4f255
--- /dev/null
+++ b/web/static/css/nav.scss
@@ -0,0 +1,68 @@
+@import 'variables';
+
+.nav {
+ .nav-primary {
+ .nav-submenu,
+ button[aria-expanded=true],
+ button[aria-expanded=true]:hover {
+ background-color: $color-white;
+ }
+ button[aria-expanded=true] span {
+ border-color: $color-white;
+ }
+ .nav-submenu {
+ li {
+ ul {
+ padding: 0;
+ margin: 0;
+ }
+ li {
+ display: block;
+ font-weight: normal;
+ }
+ }
+ }
+ }
+}
+
+@media screen and (min-width: 951px) {
+ .nav {
+ .nav-primary {
+ .nav-submenu,
+ button[aria-expanded=true],
+ button[aria-expanded=true]:hover{
+ background-color: $color-primary-darker;
+ }
+ .nav-submenu {
+ left: 16px;
+ right: 16px;
+ li {
+ width: 25%;
+ display: inline-block;
+ font-weight: bold;
+ vertical-align: top;
+ li {
+ width: auto;
+ }
+ a {
+ margin: 0 15px;
+ }
+ li {
+ a {
+ color: #cee5ef;
+ }
+ }
+ }
+ }
+ .nav-link-current span {
+ border-bottom: 0.7rem solid $color-primary;
+ padding-bottom: 1rem;
+ }
+ }
+ }
+ .nav-secondary-links {
+ a {
+ color: $color-white;
+ }
+ }
+}
diff --git a/web/static/css/phoenix.css b/web/static/css/phoenix.css
deleted file mode 100644
index df69d80..0000000
--- a/web/static/css/phoenix.css
+++ /dev/null
@@ -1,82 +0,0 @@
-/* Includes Bootstrap as well as some default style for the starter
- * application. This can be safely deleted to start fresh.
- */
-
-/*!
- * Bootstrap v3.3.5 (http://getbootstrap.com)
- * Copyright 2011-2015 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 */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-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:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}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{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;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-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{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 td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/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:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-eur:before,.glyphicon-euro: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}:after,:before{-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:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;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:inherit;font-weight:500;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:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.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{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}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;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;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{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.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-md-1,.col-md-10,.col-md-11,.col-md-12,.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-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.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-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{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=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;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:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@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 .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.33px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;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:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .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-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.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}.dropdown,.dropup{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;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.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{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{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 .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-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-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-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(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{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .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>.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-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;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-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;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=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{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-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn: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:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{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-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-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:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-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:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{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{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.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:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;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-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{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-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{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;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{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;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;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:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@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 .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{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;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left: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:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:3;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:2;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;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}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.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{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-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{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-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:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.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-body,.media-left,.media-right{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{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-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:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.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: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,.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{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}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:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}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:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}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:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}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:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;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-left-radius:3px;border-top-right-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-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.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:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.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,.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: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:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.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,.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: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:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.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,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.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,.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{border-bottom-left-radius:3px}.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,.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{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 #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.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,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>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{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.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>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height: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:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.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;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.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,.5);box-shadow:0 5px 15px rgba(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:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.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{right:5px;bottom:0;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:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;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{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";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:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,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;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.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%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(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-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left: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-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-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}td.visible-xs,th.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}td.visible-sm,th.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}td.visible-md,th.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}td.visible-lg,th.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}td.visible-print,th.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}}
-
-/* Space out content a bit */
-body, form, ul, table {
- margin-top: 20px;
- margin-bottom: 20px;
-}
-
-/* Phoenix flash messages */
-.alert:empty { display: none; }
-
-/* Phoenix inline forms in links and buttons */
-form.link, form.button {
- display: inline;
-}
-
-/* Custom page header */
-.header {
- border-bottom: 1px solid #e5e5e5;
-}
-.logo {
- width: 519px;
- height: 71px;
- display: inline-block;
- margin-bottom: 1em;
- background-image: url("/images/phoenix.png");
- background-size: 519px 71px;
-}
-
-/* Everything but the jumbotron gets side spacing for mobile first views */
-.header,
-.marketing {
- padding-right: 15px;
- padding-left: 15px;
-}
-
-/* Customize container */
-@media (min-width: 768px) {
- .container {
- max-width: 730px;
- }
-}
-.container-narrow > hr {
- margin: 30px 0;
-}
-
-/* Main marketing message */
-.jumbotron {
- text-align: center;
- border-bottom: 1px solid #e5e5e5;
-}
-
-/* Supporting marketing content */
-.marketing {
- margin: 35px 0;
-}
-
-/* Responsive: Portrait tablets and up */
-@media screen and (min-width: 768px) {
- /* Remove the padding we set earlier */
- .header,
- .marketing {
- padding-right: 0;
- padding-left: 0;
- }
- /* Space out the masthead */
- .header {
- margin-bottom: 30px;
- }
- /* Remove the bottom border on the jumbotron for visual effect */
- .jumbotron {
- border-bottom: 0;
- }
-}
\ No newline at end of file
diff --git a/web/static/css/uswds-bugfixes.css b/web/static/css/uswds-bugfixes.css
new file mode 100644
index 0000000..267a6aa
--- /dev/null
+++ b/web/static/css/uswds-bugfixes.css
@@ -0,0 +1,5 @@
+/* Styleguide bugfixes only. To override elements give them a non-usa class. */
+
+.usa-width-one-third:nth-child(3n) {
+ margin-right: 0;
+}
diff --git a/web/static/css/uswds.css b/web/static/css/uswds.css
deleted file mode 100644
index 0cff1ef..0000000
--- a/web/static/css/uswds.css
+++ /dev/null
@@ -1,4352 +0,0 @@
-/*! uswds v0.14.0 */
-html {
- box-sizing: border-box;
-}
-
-*, *::after, *::before {
- box-sizing: inherit;
-}
-
-/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */
-/**
- * 1. Set default font family to sans-serif.
- * 2. Prevent iOS and IE text size adjust after device orientation change,
- * without disabling user zoom.
- */
-html {
- font-family: sans-serif;
- /* 1 */
- -ms-text-size-adjust: 100%;
- /* 2 */
- -webkit-text-size-adjust: 100%;
- /* 2 */
-}
-
-/**
- * Remove default margin.
- */
-body {
- margin: 0;
-}
-
-/* HTML5 display definitions
- ========================================================================== */
-/**
- * Correct `block` display not defined for any HTML5 element in IE 8/9.
- * Correct `block` display not defined for `details` or `summary` in IE 10/11
- * and Firefox.
- * Correct `block` display not defined for `main` in IE 11.
- */
-article,
-aside,
-details,
-figcaption,
-figure,
-footer,
-header,
-hgroup,
-main,
-menu,
-nav,
-section,
-summary {
- display: block;
-}
-
-/**
- * 1. Correct `inline-block` display not defined in IE 8/9.
- * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
- */
-audio,
-canvas,
-progress,
-video {
- display: inline-block;
- /* 1 */
- vertical-align: baseline;
- /* 2 */
-}
-
-/**
- * Prevent modern browsers from displaying `audio` without controls.
- * Remove excess height in iOS 5 devices.
- */
-audio:not([controls]) {
- display: none;
- height: 0;
-}
-
-/**
- * Address `[hidden]` styling not present in IE 8/9/10.
- * Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.
- */
-[hidden],
-template {
- display: none;
-}
-
-/* Links
- ========================================================================== */
-/**
- * Remove the gray background color from active links in IE 10.
- */
-a {
- background-color: transparent;
-}
-
-/**
- * Improve readability of focused elements when they are also in an
- * active/hover state.
- */
-a:active,
-a:hover {
- outline: 0;
-}
-
-/* Text-level semantics
- ========================================================================== */
-/**
- * Address styling not present in IE 8/9/10/11, Safari, and Chrome.
- */
-abbr[title] {
- border-bottom: 1px dotted;
-}
-
-/**
- * Address style set to `bolder` in Firefox 4+, Safari, and Chrome.
- */
-b,
-strong {
- font-weight: bold;
-}
-
-/**
- * Address styling not present in Safari and Chrome.
- */
-dfn {
- font-style: italic;
-}
-
-/**
- * Address variable `h1` font-size and margin within `section` and `article`
- * contexts in Firefox 4+, Safari, and Chrome.
- */
-h1 {
- font-size: 2em;
- margin: 0.67em 0;
-}
-
-/**
- * Address styling not present in IE 8/9.
- */
-mark {
- background: #ff0;
- color: #000;
-}
-
-/**
- * Address inconsistent and variable font size in all browsers.
- */
-small {
- font-size: 80%;
-}
-
-/**
- * Prevent `sub` and `sup` affecting `line-height` in all browsers.
- */
-sub,
-sup {
- font-size: 75%;
- line-height: 0;
- position: relative;
- vertical-align: baseline;
-}
-
-sup {
- top: -0.5em;
-}
-
-sub {
- bottom: -0.25em;
-}
-
-/* Embedded content
- ========================================================================== */
-/**
- * Remove border when inside `a` element in IE 8/9/10.
- */
-img {
- border: 0;
-}
-
-/**
- * Correct overflow not hidden in IE 9/10/11.
- */
-svg:not(:root) {
- overflow: hidden;
-}
-
-/* Grouping content
- ========================================================================== */
-/**
- * Address margin not present in IE 8/9 and Safari.
- */
-figure {
- margin: 1em 40px;
-}
-
-/**
- * Address differences between Firefox and other browsers.
- */
-hr {
- box-sizing: content-box;
- height: 0;
-}
-
-/**
- * Contain overflow in all browsers.
- */
-pre {
- overflow: auto;
-}
-
-/**
- * Address odd `em`-unit font size rendering in all browsers.
- */
-code,
-kbd,
-pre,
-samp {
- font-family: monospace, monospace;
- font-size: 1em;
-}
-
-/* Forms
- ========================================================================== */
-/**
- * Known limitation: by default, Chrome and Safari on OS X allow very limited
- * styling of `select`, unless a `border` property is set.
- */
-/**
- * 1. Correct color not being inherited.
- * Known issue: affects color of disabled elements.
- * 2. Correct font properties not being inherited.
- * 3. Address margins set differently in Firefox 4+, Safari, and Chrome.
- */
-button,
-input,
-optgroup,
-select,
-textarea {
- color: inherit;
- /* 1 */
- font: inherit;
- /* 2 */
- margin: 0;
- /* 3 */
-}
-
-/**
- * Address `overflow` set to `hidden` in IE 8/9/10/11.
- */
-button {
- overflow: visible;
-}
-
-/**
- * Address inconsistent `text-transform` inheritance for `button` and `select`.
- * All other form control elements do not inherit `text-transform` values.
- * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.
- * Correct `select` style inheritance in Firefox.
- */
-button,
-select {
- text-transform: none;
-}
-
-/**
- * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
- * and `video` controls.
- * 2. Correct inability to style clickable `input` types in iOS.
- * 3. Improve usability and consistency of cursor style between image-type
- * `input` and others.
- */
-button,
-html input[type="button"],
-input[type="reset"],
-input[type="submit"] {
- -webkit-appearance: button;
- /* 2 */
- cursor: pointer;
- /* 3 */
-}
-
-/**
- * Re-set default cursor for disabled elements.
- */
-button[disabled],
-html input[disabled] {
- cursor: default;
-}
-
-/**
- * Remove inner padding and border in Firefox 4+.
- */
-button::-moz-focus-inner,
-input::-moz-focus-inner {
- border: 0;
- padding: 0;
-}
-
-/**
- * Address Firefox 4+ setting `line-height` on `input` using `!important` in
- * the UA stylesheet.
- */
-input {
- line-height: normal;
-}
-
-/**
- * It's recommended that you don't attempt to style these elements.
- * Firefox's implementation doesn't respect box-sizing, padding, or width.
- *
- * 1. Address box sizing set to `content-box` in IE 8/9/10.
- * 2. Remove excess padding in IE 8/9/10.
- */
-input[type="checkbox"],
-input[type="radio"] {
- box-sizing: border-box;
- /* 1 */
- padding: 0;
- /* 2 */
-}
-
-/**
- * Fix the cursor style for Chrome's increment/decrement buttons. For certain
- * `font-size` values of the `input`, it causes the cursor style of the
- * decrement button to change from `default` to `text`.
- */
-input[type="number"]::-webkit-inner-spin-button,
-input[type="number"]::-webkit-outer-spin-button {
- height: auto;
-}
-
-/**
- * 1. Address `appearance` set to `searchfield` in Safari and Chrome.
- * 2. Address `box-sizing` set to `border-box` in Safari and Chrome.
- */
-input[type="search"] {
- -webkit-appearance: textfield;
- /* 1 */
- box-sizing: content-box;
- /* 2 */
-}
-
-/**
- * Remove inner padding and search cancel button in Safari and Chrome on OS X.
- * Safari (but not Chrome) clips the cancel button when the search input has
- * padding (and `textfield` appearance).
- */
-input[type="search"]::-webkit-search-cancel-button,
-input[type="search"]::-webkit-search-decoration {
- -webkit-appearance: none;
-}
-
-/**
- * Define consistent border, margin, and padding.
- */
-fieldset {
- border: 1px solid #c0c0c0;
- margin: 0 2px;
- padding: 0.35em 0.625em 0.75em;
-}
-
-/**
- * 1. Correct `color` not being inherited in IE 8/9/10/11.
- * 2. Remove padding so people aren't caught out if they zero out fieldsets.
- */
-legend {
- border: 0;
- /* 1 */
- padding: 0;
- /* 2 */
-}
-
-/**
- * Remove default vertical scrollbar in IE 8/9/10/11.
- */
-textarea {
- overflow: auto;
-}
-
-/**
- * Don't inherit the `font-weight` (applied by a rule above).
- * NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
- */
-optgroup {
- font-weight: bold;
-}
-
-/* Tables
- ========================================================================== */
-/**
- * Remove most spacing between table cells.
- */
-table {
- border-collapse: collapse;
- border-spacing: 0;
-}
-
-td,
-th {
- padding: 0;
-}
-
-@font-face {
- font-family: "Source Sans Pro";
- font-style: normal;
- font-weight: 300;
- src: url("../fonts/sourcesanspro-light-webfont.eot?#iefix") format("embedded-opentype"), url("../fonts/sourcesanspro-light-webfont.woff2") format("woff2"), url("../fonts/sourcesanspro-light-webfont.woff") format("woff"), url("../fonts/sourcesanspro-light-webfont.ttf") format("truetype");
-}
-
-@font-face {
- font-family: "Source Sans Pro";
- font-style: normal;
- font-weight: 400;
- src: url("../fonts/sourcesanspro-regular-webfont.eot?#iefix") format("embedded-opentype"), url("../fonts/sourcesanspro-regular-webfont.woff2") format("woff2"), url("../fonts/sourcesanspro-regular-webfont.woff") format("woff"), url("../fonts/sourcesanspro-regular-webfont.ttf") format("truetype");
-}
-
-@font-face {
- font-family: "Source Sans Pro";
- font-style: italic;
- font-weight: 400;
- src: url("../fonts/sourcesanspro-italic-webfont.eot?#iefix") format("embedded-opentype"), url("../fonts/sourcesanspro-italic-webfont.woff2") format("woff2"), url("../fonts/sourcesanspro-italic-webfont.woff") format("woff"), url("../fonts/sourcesanspro-italic-webfont.ttf") format("truetype");
-}
-
-@font-face {
- font-family: "Source Sans Pro";
- font-style: normal;
- font-weight: 700;
- src: url("../fonts/sourcesanspro-bold-webfont.eot?#iefix") format("embedded-opentype"), url("../fonts/sourcesanspro-bold-webfont.woff2") format("woff2"), url("../fonts/sourcesanspro-bold-webfont.woff") format("woff"), url("../fonts/sourcesanspro-bold-webfont.ttf") format("truetype");
-}
-
-@font-face {
- font-family: "Merriweather";
- font-style: normal;
- font-weight: 300;
- src: url("../fonts/merriweather-light-webfont.eot?#iefix") format("embedded-opentype"), url("../fonts/merriweather-light-webfont.woff2") format("woff2"), url("../fonts/merriweather-light-webfont.woff") format("woff"), url("../fonts/merriweather-light-webfont.ttf") format("truetype");
-}
-
-@font-face {
- font-family: "Merriweather";
- font-style: normal;
- font-weight: 400;
- src: url("../fonts/merriweather-regular-webfont.eot?#iefix") format("embedded-opentype"), url("../fonts/merriweather-regular-webfont.woff2") format("woff2"), url("../fonts/merriweather-regular-webfont.woff") format("woff"), url("../fonts/merriweather-regular-webfont.ttf") format("truetype");
-}
-
-@font-face {
- font-family: "Merriweather";
- font-style: italic;
- font-weight: 400;
- src: url("../fonts/merriweather-italic-webfont.eot?#iefix") format("embedded-opentype"), url("../fonts/merriweather-italic-webfont.woff2") format("woff2"), url("../fonts/merriweather-italic-webfont.woff") format("woff"), url("../fonts/merriweather-italic-webfont.ttf") format("truetype");
-}
-
-@font-face {
- font-family: "Merriweather";
- font-style: normal;
- font-weight: 700;
- src: url("../fonts/merriweather-bold-webfont.eot?#iefix") format("embedded-opentype"), url("../fonts/merriweather-bold-webfont.woff2") format("woff2"), url("../fonts/merriweather-bold-webfont.woff") format("woff"), url("../fonts/merriweather-bold-webfont.ttf") format("truetype");
-}
-
-html {
- box-sizing: border-box;
-}
-
-*,
-*::before,
-*::after {
- box-sizing: inherit;
-}
-
-body {
- background-color: #ffffff;
- overflow-x: hidden;
-}
-
-.lt-ie9 * {
- -webkit-filter: none !important;
- filter: none !important;
-}
-
-[hidden] {
- display: none !important;
-}
-
-.usa-grid,
-.usa-grid-full {
- max-width: 1200px;
- margin-left: auto;
- margin-right: auto;
- max-width: 1040px;
-}
-
-.usa-grid::after,
-.usa-grid-full::after {
- clear: both;
- content: "";
- display: block;
-}
-
-.usa-grid {
- padding-right: 1.5rem;
- padding-left: 1.5rem;
-}
-
-@media screen and (min-width: 600px) {
- .usa-grid {
- padding-right: 3rem;
- padding-left: 3rem;
- }
-}
-
-.usa-grid-full {
- padding: 0;
-}
-
-@media screen and (min-width: 600px) {
- .usa-width-one-whole {
- float: left;
- display: block;
- margin-right: 4.82916%;
- width: 100%;
- }
- .usa-width-one-whole:last-child {
- margin-right: 0;
- }
- .usa-width-one-half {
- float: left;
- display: block;
- margin-right: 4.82916%;
- width: 47.58542%;
- }
- .usa-width-one-half:last-child {
- margin-right: 0;
- }
- .usa-width-one-third {
- float: left;
- display: block;
- margin-right: 4.82916%;
- width: 30.11389%;
- }
- .usa-width-one-third:last-child {
- margin-right: 0;
- }
- .usa-width-two-thirds {
- float: left;
- display: block;
- margin-right: 4.82916%;
- width: 65.05695%;
- }
- .usa-width-two-thirds:last-child {
- margin-right: 0;
- }
- .usa-width-one-fourth {
- float: left;
- display: block;
- margin-right: 4.82916%;
- width: 47.58542%;
- }
- .usa-width-one-fourth:last-child {
- margin-right: 0;
- }
- .usa-width-one-fourth:nth-child(2n) {
- margin-right: 0;
- }
- .usa-width-three-fourths {
- float: left;
- display: block;
- margin-right: 4.82916%;
- width: 100%;
- }
- .usa-width-three-fourths:last-child {
- margin-right: 0;
- }
- .usa-width-one-sixth {
- float: left;
- display: block;
- margin-right: 4.82916%;
- width: 30.11389%;
- }
- .usa-width-one-sixth:last-child {
- margin-right: 0;
- }
- .usa-width-one-sixth:nth-child(3n) {
- margin-right: 0;
- }
- .usa-width-five-sixths {
- float: left;
- display: block;
- margin-right: 4.82916%;
- width: 65.05695%;
- }
- .usa-width-five-sixths:last-child {
- margin-right: 0;
- }
- .usa-width-one-twelfth {
- float: left;
- display: block;
- margin-right: 4.82916%;
- width: 30.11389%;
- }
- .usa-width-one-twelfth:last-child {
- margin-right: 0;
- }
- .usa-width-one-twelfth:nth-child(3n) {
- margin-right: 0;
- }
- .usa-width-five-twelfths {
- float: left;
- display: block;
- margin-right: 4.82916%;
- width: 30.11389%;
- }
- .usa-width-five-twelfths:last-child {
- margin-right: 0;
- }
- .usa-width-seven-twelfths {
- float: left;
- display: block;
- margin-right: 4.82916%;
- width: 65.05695%;
- }
- .usa-width-seven-twelfths:last-child {
- margin-right: 0;
- }
-}
-
-@media screen and (min-width: 1201px) {
- .usa-width-one-whole {
- float: left;
- display: block;
- margin-right: 2.35765%;
- width: 100%;
- }
- .usa-width-one-whole:last-child {
- margin-right: 0;
- }
- .usa-width-one-half {
- float: left;
- display: block;
- margin-right: 2.35765%;
- width: 48.82117%;
- }
- .usa-width-one-half:last-child {
- margin-right: 0;
- }
- .usa-width-one-third {
- float: left;
- display: block;
- margin-right: 2.35765%;
- width: 31.76157%;
- }
- .usa-width-one-third:last-child {
- margin-right: 0;
- }
- .usa-width-two-thirds {
- float: left;
- display: block;
- margin-right: 2.35765%;
- width: 65.88078%;
- }
- .usa-width-two-thirds:last-child {
- margin-right: 0;
- }
- .usa-width-one-fourth {
- float: left;
- display: block;
- margin-right: 2.35765%;
- width: 23.23176%;
- }
- .usa-width-one-fourth:last-child {
- margin-right: 0;
- }
- .usa-width-one-fourth:nth-child(2n) {
- float: left;
- display: block;
- margin-right: 2.35765%;
- width: 23.23176%;
- }
- .usa-width-one-fourth:nth-child(2n):last-child {
- margin-right: 0;
- }
- .usa-width-one-fourth:nth-child(4n) {
- margin-right: 0;
- }
- .usa-width-three-fourths {
- float: left;
- display: block;
- margin-right: 2.35765%;
- width: 74.41059%;
- }
- .usa-width-three-fourths:last-child {
- margin-right: 0;
- }
- .usa-width-one-sixth {
- float: left;
- display: block;
- margin-right: 2.35765%;
- width: 14.70196%;
- }
- .usa-width-one-sixth:last-child {
- margin-right: 0;
- }
- .usa-width-one-sixth:nth-child(3n) {
- float: left;
- display: block;
- margin-right: 2.35765%;
- width: 14.70196%;
- }
- .usa-width-one-sixth:nth-child(3n):last-child {
- margin-right: 0;
- }
- .usa-width-one-sixth:nth-child(6n) {
- margin-right: 0;
- }
- .usa-width-five-sixths {
- float: left;
- display: block;
- margin-right: 2.35765%;
- width: 82.94039%;
- }
- .usa-width-five-sixths:last-child {
- margin-right: 0;
- }
- .usa-width-one-twelfth {
- float: left;
- display: block;
- margin-right: 2.35765%;
- width: 6.17215%;
- }
- .usa-width-one-twelfth:last-child {
- margin-right: 0;
- }
- .usa-width-one-twelfth:nth-child(3n) {
- float: left;
- display: block;
- margin-right: 2.35765%;
- width: 6.17215%;
- }
- .usa-width-one-twelfth:nth-child(3n):last-child {
- margin-right: 0;
- }
- .usa-width-one-twelfth:nth-child(12n) {
- margin-right: 0;
- }
- .usa-width-five-twelfths {
- float: left;
- display: block;
- margin-right: 2.35765%;
- width: 40.29137%;
- }
- .usa-width-five-twelfths:last-child {
- margin-right: 0;
- }
- .usa-width-seven-twelfths {
- float: left;
- display: block;
- margin-right: 2.35765%;
- width: 57.35098%;
- }
- .usa-width-seven-twelfths:last-child {
- margin-right: 0;
- }
-}
-
-.usa-end-row {
- margin-right: 0;
-}
-
-.usa-sr-only {
- position: absolute;
- left: -999em;
-}
-
-.usa-button,
-.usa-button-primary,
-.usa-button:visited,
-.usa-button-primary:visited,
-button,
-[type="button"],
-[type="submit"],
-[type="reset"],
-[type="image"] {
- -moz-osx-font-smoothing: grayscale;
- -webkit-font-smoothing: antialiased;
- margin-top: 0.5em;
- margin-right: 0.5em;
- margin-bottom: 0.5em;
- -webkit-appearance: none;
- -moz-appearance: none;
- appearance: none;
- background-color: #0071bc;
- border: 0;
- border-radius: 0.3rem;
- color: #ffffff;
- cursor: pointer;
- display: inline-block;
- font-family: "Source Sans Pro", "Helvetica Neue", "Helvetica", "Roboto", "Arial", sans-serif;
- font-size: 1.7rem;
- font-weight: 700;
- line-height: 1;
- outline: none;
- padding: 1rem 2rem;
- text-align: center;
- text-decoration: none;
- width: 100%;
-}
-
-@media screen and (min-width: 481px) {
- .usa-button,
- .usa-button-primary,
- .usa-button:visited,
- .usa-button-primary:visited,
- button,
- [type="button"],
- [type="submit"],
- [type="reset"],
- [type="image"] {
- width: auto;
- }
-}
-
-.usa-button:hover, .usa-button.usa-button-hover,
-.usa-button-primary:hover,
-.usa-button-primary.usa-button-hover,
-.usa-button:visited:hover,
-.usa-button:visited.usa-button-hover,
-.usa-button-primary:visited:hover,
-.usa-button-primary:visited.usa-button-hover,
-button:hover,
-button.usa-button-hover,
-[type="button"]:hover,
-[type="button"].usa-button-hover,
-[type="submit"]:hover,
-[type="submit"].usa-button-hover,
-[type="reset"]:hover,
-[type="reset"].usa-button-hover,
-[type="image"]:hover,
-[type="image"].usa-button-hover {
- background-color: #205493;
- border-bottom: 0;
- color: #ffffff;
- text-decoration: none;
-}
-
-.usa-button:focus, .usa-button.usa-button-focus,
-.usa-button-primary:focus,
-.usa-button-primary.usa-button-focus,
-.usa-button:visited:focus,
-.usa-button:visited.usa-button-focus,
-.usa-button-primary:visited:focus,
-.usa-button-primary:visited.usa-button-focus,
-button:focus,
-button.usa-button-focus,
-[type="button"]:focus,
-[type="button"].usa-button-focus,
-[type="submit"]:focus,
-[type="submit"].usa-button-focus,
-[type="reset"]:focus,
-[type="reset"].usa-button-focus,
-[type="image"]:focus,
-[type="image"].usa-button-focus {
- box-shadow: 0 0 3px #3e94cf, 0 0 7px #3e94cf;
-}
-
-.usa-button:active, .usa-button.usa-button-active,
-.usa-button-primary:active,
-.usa-button-primary.usa-button-active,
-.usa-button:visited:active,
-.usa-button:visited.usa-button-active,
-.usa-button-primary:visited:active,
-.usa-button-primary:visited.usa-button-active,
-button:active,
-button.usa-button-active,
-[type="button"]:active,
-[type="button"].usa-button-active,
-[type="submit"]:active,
-[type="submit"].usa-button-active,
-[type="reset"]:active,
-[type="reset"].usa-button-active,
-[type="image"]:active,
-[type="image"].usa-button-active {
- background-color: #112e51;
-}
-
-.usa-button.usa-button-primary-alt,
-.usa-button-primary.usa-button-primary-alt,
-.usa-button:visited.usa-button-primary-alt,
-.usa-button-primary:visited.usa-button-primary-alt,
-button.usa-button-primary-alt,
-[type="button"].usa-button-primary-alt,
-[type="submit"].usa-button-primary-alt,
-[type="reset"].usa-button-primary-alt,
-[type="image"].usa-button-primary-alt {
- background-color: #02bfe7;
- color: #212121;
-}
-
-.usa-button.usa-button-primary-alt:hover, .usa-button.usa-button-primary-alt.usa-button-hover,
-.usa-button-primary.usa-button-primary-alt:hover,
-.usa-button-primary.usa-button-primary-alt.usa-button-hover,
-.usa-button:visited.usa-button-primary-alt:hover,
-.usa-button:visited.usa-button-primary-alt.usa-button-hover,
-.usa-button-primary:visited.usa-button-primary-alt:hover,
-.usa-button-primary:visited.usa-button-primary-alt.usa-button-hover,
-button.usa-button-primary-alt:hover,
-button.usa-button-primary-alt.usa-button-hover,
-[type="button"].usa-button-primary-alt:hover,
-[type="button"].usa-button-primary-alt.usa-button-hover,
-[type="submit"].usa-button-primary-alt:hover,
-[type="submit"].usa-button-primary-alt.usa-button-hover,
-[type="reset"].usa-button-primary-alt:hover,
-[type="reset"].usa-button-primary-alt.usa-button-hover,
-[type="image"].usa-button-primary-alt:hover,
-[type="image"].usa-button-primary-alt.usa-button-hover {
- background-color: #00a6d2;
-}
-
-.usa-button.usa-button-primary-alt:active, .usa-button.usa-button-primary-alt.usa-button-active,
-.usa-button-primary.usa-button-primary-alt:active,
-.usa-button-primary.usa-button-primary-alt.usa-button-active,
-.usa-button:visited.usa-button-primary-alt:active,
-.usa-button:visited.usa-button-primary-alt.usa-button-active,
-.usa-button-primary:visited.usa-button-primary-alt:active,
-.usa-button-primary:visited.usa-button-primary-alt.usa-button-active,
-button.usa-button-primary-alt:active,
-button.usa-button-primary-alt.usa-button-active,
-[type="button"].usa-button-primary-alt:active,
-[type="button"].usa-button-primary-alt.usa-button-active,
-[type="submit"].usa-button-primary-alt:active,
-[type="submit"].usa-button-primary-alt.usa-button-active,
-[type="reset"].usa-button-primary-alt:active,
-[type="reset"].usa-button-primary-alt.usa-button-active,
-[type="image"].usa-button-primary-alt:active,
-[type="image"].usa-button-primary-alt.usa-button-active {
- background-color: #046b99;
- color: #ffffff;
-}
-
-.usa-button.usa-button-secondary,
-.usa-button-primary.usa-button-secondary,
-.usa-button:visited.usa-button-secondary,
-.usa-button-primary:visited.usa-button-secondary,
-button.usa-button-secondary,
-[type="button"].usa-button-secondary,
-[type="submit"].usa-button-secondary,
-[type="reset"].usa-button-secondary,
-[type="image"].usa-button-secondary {
- background-color: #e31c3d;
-}
-
-.usa-button.usa-button-secondary:hover, .usa-button.usa-button-secondary.usa-button-hover,
-.usa-button-primary.usa-button-secondary:hover,
-.usa-button-primary.usa-button-secondary.usa-button-hover,
-.usa-button:visited.usa-button-secondary:hover,
-.usa-button:visited.usa-button-secondary.usa-button-hover,
-.usa-button-primary:visited.usa-button-secondary:hover,
-.usa-button-primary:visited.usa-button-secondary.usa-button-hover,
-button.usa-button-secondary:hover,
-button.usa-button-secondary.usa-button-hover,
-[type="button"].usa-button-secondary:hover,
-[type="button"].usa-button-secondary.usa-button-hover,
-[type="submit"].usa-button-secondary:hover,
-[type="submit"].usa-button-secondary.usa-button-hover,
-[type="reset"].usa-button-secondary:hover,
-[type="reset"].usa-button-secondary.usa-button-hover,
-[type="image"].usa-button-secondary:hover,
-[type="image"].usa-button-secondary.usa-button-hover {
- background-color: #cd2026;
-}
-
-.usa-button.usa-button-secondary:active, .usa-button.usa-button-secondary.usa-button-active,
-.usa-button-primary.usa-button-secondary:active,
-.usa-button-primary.usa-button-secondary.usa-button-active,
-.usa-button:visited.usa-button-secondary:active,
-.usa-button:visited.usa-button-secondary.usa-button-active,
-.usa-button-primary:visited.usa-button-secondary:active,
-.usa-button-primary:visited.usa-button-secondary.usa-button-active,
-button.usa-button-secondary:active,
-button.usa-button-secondary.usa-button-active,
-[type="button"].usa-button-secondary:active,
-[type="button"].usa-button-secondary.usa-button-active,
-[type="submit"].usa-button-secondary:active,
-[type="submit"].usa-button-secondary.usa-button-active,
-[type="reset"].usa-button-secondary:active,
-[type="reset"].usa-button-secondary.usa-button-active,
-[type="image"].usa-button-secondary:active,
-[type="image"].usa-button-secondary.usa-button-active {
- background-color: #981b1e;
-}
-
-.usa-button.usa-button-gray,
-.usa-button-primary.usa-button-gray,
-.usa-button:visited.usa-button-gray,
-.usa-button-primary:visited.usa-button-gray,
-button.usa-button-gray,
-[type="button"].usa-button-gray,
-[type="submit"].usa-button-gray,
-[type="reset"].usa-button-gray,
-[type="image"].usa-button-gray {
- background-color: #5b616b;
-}
-
-.usa-button.usa-button-gray:hover, .usa-button.usa-button-gray.usa-button-hover,
-.usa-button-primary.usa-button-gray:hover,
-.usa-button-primary.usa-button-gray.usa-button-hover,
-.usa-button:visited.usa-button-gray:hover,
-.usa-button:visited.usa-button-gray.usa-button-hover,
-.usa-button-primary:visited.usa-button-gray:hover,
-.usa-button-primary:visited.usa-button-gray.usa-button-hover,
-button.usa-button-gray:hover,
-button.usa-button-gray.usa-button-hover,
-[type="button"].usa-button-gray:hover,
-[type="button"].usa-button-gray.usa-button-hover,
-[type="submit"].usa-button-gray:hover,
-[type="submit"].usa-button-gray.usa-button-hover,
-[type="reset"].usa-button-gray:hover,
-[type="reset"].usa-button-gray.usa-button-hover,
-[type="image"].usa-button-gray:hover,
-[type="image"].usa-button-gray.usa-button-hover {
- background-color: #323a45;
-}
-
-.usa-button.usa-button-gray:active, .usa-button.usa-button-gray.usa-button-active,
-.usa-button-primary.usa-button-gray:active,
-.usa-button-primary.usa-button-gray.usa-button-active,
-.usa-button:visited.usa-button-gray:active,
-.usa-button:visited.usa-button-gray.usa-button-active,
-.usa-button-primary:visited.usa-button-gray:active,
-.usa-button-primary:visited.usa-button-gray.usa-button-active,
-button.usa-button-gray:active,
-button.usa-button-gray.usa-button-active,
-[type="button"].usa-button-gray:active,
-[type="button"].usa-button-gray.usa-button-active,
-[type="submit"].usa-button-gray:active,
-[type="submit"].usa-button-gray.usa-button-active,
-[type="reset"].usa-button-gray:active,
-[type="reset"].usa-button-gray.usa-button-active,
-[type="image"].usa-button-gray:active,
-[type="image"].usa-button-gray.usa-button-active {
- background-color: #212121;
-}
-
-.usa-button.usa-button-outline,
-.usa-button-primary.usa-button-outline,
-.usa-button:visited.usa-button-outline,
-.usa-button-primary:visited.usa-button-outline,
-button.usa-button-outline,
-[type="button"].usa-button-outline,
-[type="submit"].usa-button-outline,
-[type="reset"].usa-button-outline,
-[type="image"].usa-button-outline {
- background-color: #ffffff;
- box-shadow: inset 0 0 0 2px #0071bc;
- color: #0071bc;
-}
-
-.usa-button.usa-button-outline:hover, .usa-button.usa-button-outline.usa-button-hover,
-.usa-button-primary.usa-button-outline:hover,
-.usa-button-primary.usa-button-outline.usa-button-hover,
-.usa-button:visited.usa-button-outline:hover,
-.usa-button:visited.usa-button-outline.usa-button-hover,
-.usa-button-primary:visited.usa-button-outline:hover,
-.usa-button-primary:visited.usa-button-outline.usa-button-hover,
-button.usa-button-outline:hover,
-button.usa-button-outline.usa-button-hover,
-[type="button"].usa-button-outline:hover,
-[type="button"].usa-button-outline.usa-button-hover,
-[type="submit"].usa-button-outline:hover,
-[type="submit"].usa-button-outline.usa-button-hover,
-[type="reset"].usa-button-outline:hover,
-[type="reset"].usa-button-outline.usa-button-hover,
-[type="image"].usa-button-outline:hover,
-[type="image"].usa-button-outline.usa-button-hover {
- box-shadow: inset 0 0 0 2px #205493;
- color: #205493;
-}
-
-.usa-button.usa-button-outline:active, .usa-button.usa-button-outline.usa-button-active,
-.usa-button-primary.usa-button-outline:active,
-.usa-button-primary.usa-button-outline.usa-button-active,
-.usa-button:visited.usa-button-outline:active,
-.usa-button:visited.usa-button-outline.usa-button-active,
-.usa-button-primary:visited.usa-button-outline:active,
-.usa-button-primary:visited.usa-button-outline.usa-button-active,
-button.usa-button-outline:active,
-button.usa-button-outline.usa-button-active,
-[type="button"].usa-button-outline:active,
-[type="button"].usa-button-outline.usa-button-active,
-[type="submit"].usa-button-outline:active,
-[type="submit"].usa-button-outline.usa-button-active,
-[type="reset"].usa-button-outline:active,
-[type="reset"].usa-button-outline.usa-button-active,
-[type="image"].usa-button-outline:active,
-[type="image"].usa-button-outline.usa-button-active {
- box-shadow: inset 0 0 0 2px #112e51;
- color: #112e51;
-}
-
-.usa-button.usa-button-outline:focus, .usa-button.usa-button-outline.usa-button-focus,
-.usa-button-primary.usa-button-outline:focus,
-.usa-button-primary.usa-button-outline.usa-button-focus,
-.usa-button:visited.usa-button-outline:focus,
-.usa-button:visited.usa-button-outline.usa-button-focus,
-.usa-button-primary:visited.usa-button-outline:focus,
-.usa-button-primary:visited.usa-button-outline.usa-button-focus,
-button.usa-button-outline:focus,
-button.usa-button-outline.usa-button-focus,
-[type="button"].usa-button-outline:focus,
-[type="button"].usa-button-outline.usa-button-focus,
-[type="submit"].usa-button-outline:focus,
-[type="submit"].usa-button-outline.usa-button-focus,
-[type="reset"].usa-button-outline:focus,
-[type="reset"].usa-button-outline.usa-button-focus,
-[type="image"].usa-button-outline:focus,
-[type="image"].usa-button-outline.usa-button-focus {
- box-shadow: inset 0 0 0 2px #112e51, 0 0 3px #3e94cf, 0 0 7px #3e94cf;
-}
-
-.usa-button.usa-button-outline-inverse,
-.usa-button-primary.usa-button-outline-inverse,
-.usa-button:visited.usa-button-outline-inverse,
-.usa-button-primary:visited.usa-button-outline-inverse,
-button.usa-button-outline-inverse,
-[type="button"].usa-button-outline-inverse,
-[type="submit"].usa-button-outline-inverse,
-[type="reset"].usa-button-outline-inverse,
-[type="image"].usa-button-outline-inverse {
- background: transparent;
- box-shadow: inset 0 0 0 2px #ffffff;
- color: #ffffff;
-}
-
-.usa-button.usa-button-outline-inverse:hover, .usa-button.usa-button-outline-inverse.usa-button-hover,
-.usa-button-primary.usa-button-outline-inverse:hover,
-.usa-button-primary.usa-button-outline-inverse.usa-button-hover,
-.usa-button:visited.usa-button-outline-inverse:hover,
-.usa-button:visited.usa-button-outline-inverse.usa-button-hover,
-.usa-button-primary:visited.usa-button-outline-inverse:hover,
-.usa-button-primary:visited.usa-button-outline-inverse.usa-button-hover,
-button.usa-button-outline-inverse:hover,
-button.usa-button-outline-inverse.usa-button-hover,
-[type="button"].usa-button-outline-inverse:hover,
-[type="button"].usa-button-outline-inverse.usa-button-hover,
-[type="submit"].usa-button-outline-inverse:hover,
-[type="submit"].usa-button-outline-inverse.usa-button-hover,
-[type="reset"].usa-button-outline-inverse:hover,
-[type="reset"].usa-button-outline-inverse.usa-button-hover,
-[type="image"].usa-button-outline-inverse:hover,
-[type="image"].usa-button-outline-inverse.usa-button-hover {
- box-shadow: inset 0 0 0 2px #d6d7d9;
- color: #d6d7d9;
-}
-
-.usa-button.usa-button-outline-inverse:active, .usa-button.usa-button-outline-inverse.usa-button-active,
-.usa-button-primary.usa-button-outline-inverse:active,
-.usa-button-primary.usa-button-outline-inverse.usa-button-active,
-.usa-button:visited.usa-button-outline-inverse:active,
-.usa-button:visited.usa-button-outline-inverse.usa-button-active,
-.usa-button-primary:visited.usa-button-outline-inverse:active,
-.usa-button-primary:visited.usa-button-outline-inverse.usa-button-active,
-button.usa-button-outline-inverse:active,
-button.usa-button-outline-inverse.usa-button-active,
-[type="button"].usa-button-outline-inverse:active,
-[type="button"].usa-button-outline-inverse.usa-button-active,
-[type="submit"].usa-button-outline-inverse:active,
-[type="submit"].usa-button-outline-inverse.usa-button-active,
-[type="reset"].usa-button-outline-inverse:active,
-[type="reset"].usa-button-outline-inverse.usa-button-active,
-[type="image"].usa-button-outline-inverse:active,
-[type="image"].usa-button-outline-inverse.usa-button-active {
- box-shadow: inset 0 0 0 2px #aeb0b5;
- color: #d6d7d9;
-}
-
-.usa-button.usa-button-outline-inverse:focus, .usa-button.usa-button-outline-inverse.usa-button-focus,
-.usa-button-primary.usa-button-outline-inverse:focus,
-.usa-button-primary.usa-button-outline-inverse.usa-button-focus,
-.usa-button:visited.usa-button-outline-inverse:focus,
-.usa-button:visited.usa-button-outline-inverse.usa-button-focus,
-.usa-button-primary:visited.usa-button-outline-inverse:focus,
-.usa-button-primary:visited.usa-button-outline-inverse.usa-button-focus,
-button.usa-button-outline-inverse:focus,
-button.usa-button-outline-inverse.usa-button-focus,
-[type="button"].usa-button-outline-inverse:focus,
-[type="button"].usa-button-outline-inverse.usa-button-focus,
-[type="submit"].usa-button-outline-inverse:focus,
-[type="submit"].usa-button-outline-inverse.usa-button-focus,
-[type="reset"].usa-button-outline-inverse:focus,
-[type="reset"].usa-button-outline-inverse.usa-button-focus,
-[type="image"].usa-button-outline-inverse:focus,
-[type="image"].usa-button-outline-inverse.usa-button-focus {
- box-shadow: inset 0 0 0 2px #aeb0b5, 0 0 3px #3e94cf, 0 0 7px #3e94cf;
-}
-
-.usa-button.usa-button-big,
-.usa-button-primary.usa-button-big,
-.usa-button:visited.usa-button-big,
-.usa-button-primary:visited.usa-button-big,
-button.usa-button-big,
-[type="button"].usa-button-big,
-[type="submit"].usa-button-big,
-[type="reset"].usa-button-big,
-[type="image"].usa-button-big {
- font-size: 1.9rem;
- padding: 1.5rem 3rem;
-}
-
-[type="submit"]:disabled,
-.usa-button-disabled {
- background-color: #d6d7d9;
- color: #323a45;
- pointer-events: none;
-}
-
-[type="submit"]:disabled:hover, [type="submit"]:disabled.usa-button-hover, [type="submit"]:disabled:active, [type="submit"]:disabled.usa-button-active, [type="submit"]:disabled:focus,
-.usa-button-disabled:hover,
-.usa-button-disabled.usa-button-hover,
-.usa-button-disabled:active,
-.usa-button-disabled.usa-button-active,
-.usa-button-disabled:focus {
- background-color: #d6d7d9;
- border: 0;
- box-shadow: none;
- color: #323a45;
-}
-
-.usa-button-unstyled {
- background-color: transparent;
- border: 0;
- border-radius: 0;
- font-weight: 400;
- margin: 0;
- outline: 0;
- padding: 0;
- text-align: left;
- -webkit-font-smoothing: auto;
-}
-
-.usa-button-unstyled:hover {
- background-color: transparent;
-}
-
-img {
- max-width: 100%;
-}
-
-.media_link {
- display: inline-block;
- line-height: 0;
-}
-
-input,
-textarea,
-select {
- -webkit-appearance: none;
- -moz-appearance: none;
- appearance: none;
- border: 1px solid #5b616b;
- border-radius: 0;
- box-sizing: border-box;
- color: #212121;
- display: block;
- font-size: 1.7rem;
- height: 4.4rem;
- line-height: 1.3;
- margin: 0.2em 0;
- max-width: 46rem;
- outline: none;
- padding: 1rem 0.7em;
- width: 100%;
-}
-
-input:focus, input.usa-input-focus,
-textarea:focus,
-textarea.usa-input-focus,
-select:focus,
-select.usa-input-focus {
- box-shadow: 0 0 3px #3e94cf, 0 0 7px #3e94cf;
-}
-
-input.usa-input-success,
-textarea.usa-input-success,
-select.usa-input-success {
- border: 3px solid #4aa564;
-}
-
-.usa-input-error {
- border-left: 4px solid #cd2026;
- margin-top: 3rem;
- padding-bottom: 0.8rem;
- padding-left: 1.5rem;
- padding-top: 0.8rem;
- position: relative;
- right: 1.9rem;
-}
-
-.usa-input-error input,
-.usa-input-error textarea,
-.usa-input-error select {
- border: 3px solid #cd2026;
- width: calc(100% + 1.9rem);
-}
-
-.usa-input-error label {
- margin-top: 0;
-}
-
-.usa-input-error .usa-input-inline {
- border: 1px solid #5b616b;
- width: inherit;
-}
-
-.usa-input-error .usa-input-inline-error {
- border: 3px solid #cd2026;
-}
-
-.usa-input-error-label {
- display: block;
- font-size: 1.7rem;
- font-weight: 700;
-}
-
-.usa-input-error-message {
- color: #cd2026;
- display: block;
- font-size: 1.7rem;
- font-weight: 700;
- padding-bottom: 3px;
- padding-top: 3px;
-}
-
-.usa-input-required:after {
- color: #981b1e;
- content: ' (*Required)';
-}
-
-label {
- display: block;
- margin-top: 3rem;
- max-width: 46rem;
-}
-
-textarea {
- height: 16rem;
-}
-
-select {
- -moz-appearance: none;
- -webkit-appearance: none;
- appearance: none;
- background-color: #ffffff;
- background-image: url("../img/arrow-down.png");
- background-image: url("../img/arrow-down.svg");
- background-position: right 1.3rem center;
- background-repeat: no-repeat;
- background-size: 1.3rem;
-}
-
-legend {
- font-size: 3rem;
- font-weight: 700;
-}
-
-.usa-fieldset-inputs label {
- margin-top: 0;
-}
-
-.usa-form-hint {
- color: #757575;
- font-family: "Source Sans Pro", "Helvetica Neue", "Helvetica", "Roboto", "Arial", sans-serif;
- margin-bottom: 0;
-}
-
-[type="checkbox"],
-[type="radio"] {
- margin-left: -2rem;
- opacity: 0;
- position: absolute;
-}
-
-.lt-ie9 [type="checkbox"], .lt-ie9
-[type="radio"] {
- border: 0;
- float: left;
- margin: 0.4em 0.4em 0 0;
- position: static;
- width: auto;
-}
-
-[type="checkbox"] + label,
-[type="radio"] + label {
- cursor: pointer;
- font-weight: 400;
- margin-bottom: 0.5em;
-}
-
-[type="checkbox"] + label::before,
-[type="radio"] + label::before {
- background: #ffffff;
- border-radius: 0.3rem;
- box-shadow: 0 0 0 1px #757575;
- content: '\a0';
- display: inline-block;
- height: 1.8rem;
- line-height: 1.8rem;
- margin-right: 0.6em;
- text-indent: 0.15em;
- vertical-align: middle\0;
- width: 1.8rem;
-}
-
-[type="radio"] + label::before {
- box-shadow: 0 0 0 2px #ffffff, 0 0 0 3px #757575;
- height: 1.6rem;
- line-height: 1.6rem;
- width: 1.6rem;
- border-radius: 100%;
-}
-
-[type="checkbox"]:checked + label::before,
-[type="radio"]:checked + label::before {
- background-color: #0071bc;
- box-shadow: 0 0 0 1px #0071bc;
-}
-
-[type="radio"]:checked + label::before {
- box-shadow: 0 0 0 2px #ffffff, 0 0 0 4px #0071bc;
-}
-
-[type="radio"]:focus + label::before {
- box-shadow: 0 0 0 2px #ffffff, 0 0 0 4px #0071bc, 0 0 3px 4px #3e94cf, 0 0 7px 4px #3e94cf;
-}
-
-[type="checkbox"]:checked + label::before {
- background-image: url("../img/correct8.png");
- background-image: url("../img/correct8.svg");
- background-position: 50%;
- background-repeat: no-repeat;
-}
-
-[type="checkbox"]:focus + label::before {
- box-shadow: 0 0 0 1px #ffffff, 0 0 0 3px #0071bc;
-}
-
-[type="checkbox"]:disabled + label {
- color: #5b616b;
-}
-
-[type="checkbox"]:disabled + label::before,
-[type="radio"]:disabled + label::before {
- background: #d6d7d9;
- box-shadow: 0 0 0 1px #aeb0b5;
- cursor: not-allowed;
-}
-
-[type=range] {
- -webkit-appearance: none;
- border: none;
- padding-left: 0;
- width: 100%;
-}
-
-[type=range]:focus {
- box-shadow: none;
- outline: none;
-}
-
-[type=range]::-webkit-slider-runnable-track {
- background: #aeb0b5;
- border: 1px solid #757575;
- cursor: pointer;
- height: 1.2rem;
- width: 100%;
-}
-
-[type=range]::-moz-range-track {
- background: #0071bc;
- border: 1px solid #757575;
- cursor: pointer;
- height: 1.2rem;
- width: 100%;
-}
-
-[type=range]::-ms-track {
- background: transparent;
- color: transparent;
- cursor: pointer;
- height: 1.2rem;
- width: 100%;
-}
-
-[type=range]::-webkit-slider-thumb {
- -webkit-appearance: none;
- border: 1px solid #757575;
- height: 2.2rem;
- border-radius: 1.5rem;
- background: #f1f1f1;
- cursor: pointer;
- margin-top: -.65rem;
- width: 2.2rem;
-}
-
-[type=range]::-moz-range-thumb {
- background: #f1f1f1;
- border: 1px solid #757575;
- border-radius: 1.5rem;
- cursor: pointer;
- height: 2.2rem;
- width: 2.2rem;
-}
-
-[type=range]::-ms-thumb {
- background: #f1f1f1;
- border: 1px solid #757575;
- border-radius: 1.5rem;
- cursor: pointer;
- height: 2.2rem;
- width: 2.2rem;
-}
-
-[type=range]::-ms-fill-lower {
- background: #aeb0b5;
- border: 1px solid #757575;
- border-radius: 2rem;
-}
-
-[type=range]::-ms-fill-upper {
- background: #aeb0b5;
- border: 1px solid #757575;
- border-radius: 2rem;
-}
-
-[type=range]:focus::-webkit-slider-thumb {
- border: 2px solid #3e94cf;
-}
-
-[type=range]:focus::-moz-range-thumb {
- border: 2px solid #3e94cf;
-}
-
-[type=range]:focus::-ms-thumb {
- border: 2px solid #3e94cf;
-}
-
-.usa-date-of-birth label {
- margin-top: 0;
-}
-
-.usa-date-of-birth [type=number]::-webkit-inner-spin-button,
-.usa-date-of-birth [type=number]::-webkit-outer-spin-button {
- -webkit-appearance: none;
- appearance: none;
- margin: 0;
-}
-
-.usa-date-of-birth [type=number] {
- -moz-appearance: textfield;
-}
-
-.usa-form-group-day,
-.usa-form-group-month,
-.usa-form-group-year {
- clear: none;
- float: left;
- margin-right: 1.5rem;
- width: 5rem;
-}
-
-.usa-form-group-year {
- width: 7rem;
-}
-
-.usa-label, .usa-label-big {
- background-color: #0071bc;
- border-radius: 0.3rem;
- color: #ffffff;
- font-size: 1.5rem;
- margin-right: 0.5rem;
- padding: 0.1rem 0.7rem;
- text-transform: uppercase;
-}
-
-.usa-label:only-of-type, .usa-label-big:only-of-type {
- margin-right: 0;
-}
-
-.usa-label-big {
- font-size: 1.7rem;
- padding-left: 0.9rem;
- padding-right: 0.9rem;
-}
-
-ul,
-ol {
- margin-top: 1em;
- margin-bottom: 1em;
- padding-left: 1.94em;
-}
-
-li {
- line-height: 1.5;
- margin-bottom: 0.5em;
-}
-
-li:last-child {
- margin-bottom: 0;
-}
-
-h1 + ul,
-h1 + ol,
-h2 + ul,
-h2 + ol,
-h3 + ul,
-h3 + ol,
-h4 + ul,
-h4 + ol,
-h5 + ul,
-h5 + ol,
-h6 + ul,
-h6 + ol,
-p + ul,
-p + ol {
- margin-top: 0;
-}
-
-.usa-unstyled-list {
- margin-top: 0;
- margin-bottom: 0;
- list-style-type: none;
- padding-left: 0;
-}
-
-.usa-unstyled-list > li {
- margin-bottom: 0;
-}
-
-table {
- border-spacing: 0;
- margin: 2em 0;
- min-width: 100%;
-}
-
-table thead th,
-table thead td {
- background-color: #f1f1f1;
-}
-
-table th {
- text-align: left;
-}
-
-table tbody th {
- font-weight: 400;
-}
-
-table th,
-table td {
- background-color: #ffffff;
- border: 1px solid #5b616b;
- padding: 1.5rem;
-}
-
-.usa-table-borderless thead tr {
- background-color: transparent;
-}
-
-.usa-table-borderless thead th {
- border-top: 0;
-}
-
-.usa-table-borderless th,
-.usa-table-borderless td {
- border-left: 0;
- border-right: 0;
-}
-
-html {
- font-family: "Source Sans Pro", "Helvetica Neue", "Helvetica", "Roboto", "Arial", sans-serif;
- font-size: 10px;
-}
-
-body {
- font-size: 1.7rem;
-}
-
-p {
- line-height: 1.5;
- margin-bottom: 1em;
- margin-top: 1em;
-}
-
-a {
- color: #0071bc;
- text-decoration: underline;
-}
-
-a:hover, a:active {
- color: #205493;
-}
-
-a:visited {
- color: #4c2c92;
-}
-
-a:focus {
- box-shadow: 0 0 3px #3e94cf, 0 0 7px #3e94cf;
- outline: 0;
-}
-
-.usa-external_link::after {
- background: url("../img/external-link.png") no-repeat 0 0;
- background: url("../img/external-link.svg") no-repeat 0 0;
- background-size: 100%;
- content: '';
- display: inline-block;
- height: 0.65em;
- margin-bottom: -1px;
- margin-left: 4px;
- width: 0.65em;
-}
-
-.usa-external_link:hover::after {
- background-image: url("../img/external-link-hover.png");
- background-image: url("../img/external-link-hover.svg");
-}
-
-.usa-external_link-alt::after {
- background: url("../img/external-link-alt.png") no-repeat 0 0;
- background: url("../img/external-link-alt.svg") no-repeat 0 0;
- background-size: 100%;
- content: '';
- display: inline-block;
- height: 0.65em;
- margin-bottom: -1px;
- margin-left: 4px;
- width: 0.65em;
-}
-
-.usa-external_link-alt:hover::after {
- background-image: url("../img/external-link-alt-hover.png");
- background-image: url("../img/external-link-alt-hover.svg");
-}
-
-h1,
-h2,
-h3,
-h4,
-h5,
-h6 {
- clear: both;
- font-family: "Merriweather", "Georgia", "Cambria", "Times New Roman", "Times", serif;
- line-height: 1.3;
- margin-bottom: .5em;
- margin-top: 1.5em;
-}
-
-h1 {
- font-size: 4rem;
- font-weight: 700;
-}
-
-h2 {
- font-size: 3rem;
- font-weight: 700;
-}
-
-h3 {
- font-size: 2rem;
- font-weight: 700;
-}
-
-h4 {
- font-size: 1.7rem;
- font-weight: 700;
-}
-
-h5 {
- font-size: 1.5rem;
- font-weight: 700;
-}
-
-h6 {
- font-family: "Source Sans Pro", "Helvetica Neue", "Helvetica", "Roboto", "Arial", sans-serif;
- font-size: 1.3rem;
- font-weight: 400;
- text-transform: uppercase;
-}
-
-cite,
-var,
-address,
-dfn {
- font-style: normal;
-}
-
-.usa-content p:not(.usa-font-lead) {
- max-width: 53rem;
-}
-
-.usa-content-list {
- max-width: 53rem;
-}
-
-.usa-sans p,
-.usa-sans a,
-.usa-sans li,
-.usa-sans span {
- font-family: "Source Sans Pro", "Helvetica Neue", "Helvetica", "Roboto", "Arial", sans-serif;
-}
-
-.usa-sans a {
- border-bottom: none;
- font-weight: 700;
-}
-
-.usa-serif p,
-.usa-serif a,
-.usa-serif li,
-.usa-serif span {
- font-family: "Merriweather", "Georgia", "Cambria", "Times New Roman", "Times", serif;
-}
-
-.usa-display {
- font-size: 2rem;
- font-weight: 700;
- margin-bottom: 0;
-}
-
-@media screen and (min-width: 481px) {
- .usa-display {
- font-size: 4rem;
- font-weight: 700;
- }
-}
-
-@media screen and (min-width: 600px) {
- .usa-display {
- font-size: 5.2rem;
- font-weight: 700;
- }
-}
-
-.usa-font-lead {
- font-family: "Merriweather", "Georgia", "Cambria", "Times New Roman", "Times", serif;
- font-size: 2rem;
- line-height: 1.7;
- max-width: 77rem;
-}
-
-.usa-image-block {
- position: relative;
-}
-
-.usa-image-text-block {
- color: #ffffff;
- left: 0;
- margin-left: 8%;
- position: absolute;
- top: 0;
-}
-
-.usa-image-text {
- margin-top: 0;
-}
-
-.usa-drop_text {
- margin-bottom: 0;
-}
-
-.usa-background-dark {
- background-color: #323a45;
-}
-
-.usa-background-dark p,
-.usa-background-dark span {
- color: #ffffff;
-}
-
-.usa-background-dark a {
- color: #d6d7d9;
-}
-
-.usa-background-dark a:hover {
- color: #ffffff;
-}
-
-.usa-text-small {
- font-size: 1.3rem;
- margin-top: 0;
-}
-
-.usa-section > :first-child,
-.usa-grid > :first-child {
- margin-top: 0;
-}
-
-.usa-section > :last-child,
-.usa-grid > :last-child {
- margin-bottom: 0;
-}
-
-.usa-width-one-whole:first-child > :first-child,
-.usa-width-one-half:first-child > :first-child,
-.usa-width-one-third:first-child > :first-child,
-.usa-width-two-thirds:first-child > :first-child,
-.usa-width-one-fourth:first-child > :first-child,
-.usa-width-three-fourths:first-child > :first-child,
-.usa-width-one-sixth:first-child > :first-child,
-.usa-width-five-sixths:first-child > :first-child,
-.usa-width-one-twelfth:first-child > :first-child {
- margin-top: 0;
-}
-
-@media screen and (min-width: 600px) {
- .usa-width-one-whole > :first-child,
- .usa-width-one-half > :first-child,
- .usa-width-one-third > :first-child,
- .usa-width-two-thirds > :first-child,
- .usa-width-one-fourth > :first-child,
- .usa-width-three-fourths > :first-child,
- .usa-width-one-sixth > :first-child,
- .usa-width-five-sixths > :first-child,
- .usa-width-one-twelfth > :first-child {
- margin-top: 0;
- }
-}
-
-.usa-width-one-whole:last-child > :last-child,
-.usa-width-one-half:last-child > :last-child,
-.usa-width-one-third:last-child > :last-child,
-.usa-width-two-thirds:last-child > :last-child,
-.usa-width-one-fourth:last-child > :last-child,
-.usa-width-three-fourths:last-child > :last-child,
-.usa-width-one-sixth:last-child > :last-child,
-.usa-width-five-sixths:last-child > :last-child,
-.usa-width-one-twelfth:last-child > :last-child {
- margin-bottom: 0;
-}
-
-@media screen and (min-width: 600px) {
- .usa-width-one-whole > :last-child,
- .usa-width-one-half > :last-child,
- .usa-width-one-third > :last-child,
- .usa-width-two-thirds > :last-child,
- .usa-width-one-fourth > :last-child,
- .usa-width-three-fourths > :last-child,
- .usa-width-one-sixth > :last-child,
- .usa-width-five-sixths > :last-child,
- .usa-width-one-twelfth > :last-child {
- margin-bottom: 0;
- }
-}
-
-.usa-accordion,
-.usa-accordion-bordered {
- margin-top: 0;
- margin-bottom: 0;
- list-style-type: none;
- padding-left: 0;
- color: #212121;
- margin: 0;
- padding: 0;
- width: 100%;
-}
-
-.usa-accordion > li,
-.usa-accordion-bordered > li {
- margin-bottom: 0;
-}
-
-.usa-accordion + .usa-accordion,
-.usa-accordion + .usa-accordion-bordered,
-.usa-accordion-bordered + .usa-accordion,
-.usa-accordion-bordered + .usa-accordion-bordered {
- margin-top: 1rem;
-}
-
-.usa-accordion > ul,
-.usa-accordion-bordered > ul {
- margin-top: 0;
- margin-bottom: 0;
- list-style-type: none;
- padding-left: 0;
- color: #212121;
- margin: 0;
- padding: 0;
- width: 100%;
-}
-
-.usa-accordion > ul > li,
-.usa-accordion-bordered > ul > li {
- margin-bottom: 0;
-}
-
-.usa-accordion > ul > li,
-.usa-accordion-bordered > ul > li {
- background-color: #f1f1f1;
- font-family: "Source Sans Pro", "Helvetica Neue", "Helvetica", "Roboto", "Arial", sans-serif;
- list-style: none;
- margin-bottom: 6px;
- width: 100%;
-}
-
-.usa-accordion > ul button,
-.usa-accordion-bordered > ul button {
- background-color: transparent;
- border: 0;
- border-radius: 0;
- font-weight: 400;
- margin: 0;
- outline: 0;
- padding: 0;
- text-align: left;
- -webkit-font-smoothing: auto;
- background-color: #f1f1f1;
- background-image: url("../img/minus.png");
- background-image: url("../img/minus.svg");
- background-position: right 3rem center;
- background-repeat: no-repeat;
- background-size: 13px;
- color: #212121;
- cursor: pointer;
- display: inline-block;
- font-family: "Source Sans Pro", "Helvetica Neue", "Helvetica", "Roboto", "Arial", sans-serif;
- font-weight: 700;
- margin: 0;
- padding: 1.5rem 5.5rem 1.5rem 3rem;
- width: 100%;
-}
-
-.usa-accordion > ul button:hover,
-.usa-accordion-bordered > ul button:hover {
- background-color: transparent;
-}
-
-.usa-accordion > ul button:focus,
-.usa-accordion-bordered > ul button:focus {
- box-shadow: 0 0 3px #3e94cf, 0 0 7px #3e94cf;
-}
-
-.usa-accordion > ul button:hover,
-.usa-accordion-bordered > ul button:hover {
- background-color: #d6d7d9;
- color: #212121;
-}
-
-.usa-accordion > ul button h1,
-.usa-accordion > ul button h2,
-.usa-accordion > ul button h3,
-.usa-accordion > ul button h4,
-.usa-accordion > ul button h5,
-.usa-accordion > ul button h6,
-.usa-accordion-bordered > ul button h1,
-.usa-accordion-bordered > ul button h2,
-.usa-accordion-bordered > ul button h3,
-.usa-accordion-bordered > ul button h4,
-.usa-accordion-bordered > ul button h5,
-.usa-accordion-bordered > ul button h6 {
- margin: 0;
-}
-
-.usa-accordion > ul [aria-expanded=false],
-.usa-accordion-bordered > ul [aria-expanded=false] {
- background-image: url("../img/plus.png");
- background-image: url("../img/plus.svg");
- background-repeat: no-repeat;
- background-size: 1.3rem;
-}
-
-.usa-accordion > li,
-.usa-accordion-bordered > li {
- background-color: #f1f1f1;
- font-family: "Source Sans Pro", "Helvetica Neue", "Helvetica", "Roboto", "Arial", sans-serif;
- list-style: none;
- margin-bottom: 6px;
- width: 100%;
-}
-
-.usa-accordion-bordered .usa-accordion-content {
- border-bottom: 3px solid #f1f1f1;
- border-left: 3px solid #f1f1f1;
- border-right: 3px solid #f1f1f1;
-}
-
-.usa-accordion-content {
- background-color: #ffffff;
- overflow: auto;
- padding: 3rem;
-}
-
-.usa-accordion-content > *:first-child {
- margin-top: 0;
-}
-
-.usa-accordion-content > *:last-child {
- margin-bottom: 0;
-}
-
-.usa-accordion-content:not([aria-hidden]) {
- position: absolute;
- left: -999em;
-}
-
-.usa-accordion-content[aria-hidden=true] {
- display: none;
-}
-
-.usa-accordion-button {
- background-color: transparent;
- border: 0;
- border-radius: 0;
- font-weight: 400;
- margin: 0;
- outline: 0;
- padding: 0;
- text-align: left;
- -webkit-font-smoothing: auto;
- background-color: #f1f1f1;
- background-image: url("../img/minus.png");
- background-image: url("../img/minus.svg");
- background-position: right 3rem center;
- background-repeat: no-repeat;
- background-size: 13px;
- color: #212121;
- cursor: pointer;
- display: inline-block;
- font-family: "Source Sans Pro", "Helvetica Neue", "Helvetica", "Roboto", "Arial", sans-serif;
- font-weight: 700;
- margin: 0;
- padding: 1.5rem 5.5rem 1.5rem 3rem;
- width: 100%;
-}
-
-.usa-accordion-button:hover {
- background-color: transparent;
-}
-
-.usa-accordion-button:focus {
- box-shadow: 0 0 3px #3e94cf, 0 0 7px #3e94cf;
-}
-
-.usa-accordion-button:hover {
- background-color: #d6d7d9;
- color: #212121;
-}
-
-.usa-accordion-button h1,
-.usa-accordion-button h2,
-.usa-accordion-button h3,
-.usa-accordion-button h4,
-.usa-accordion-button h5,
-.usa-accordion-button h6 {
- margin: 0;
-}
-
-.usa-accordion-button[aria-expanded=false] {
- background-image: url("../img/plus.png");
- background-image: url("../img/plus.svg");
- background-repeat: no-repeat;
- background-size: 1.3rem;
-}
-
-.usa-alert {
- background-color: #f1f1f1;
- background-position: 1rem 2rem;
- background-repeat: no-repeat;
- background-size: 4rem;
- margin-top: 1.5em;
- padding: 1em;
-}
-
-@media screen and (min-width: 600px) {
- .usa-alert {
- background-size: 5.2rem;
- }
-}
-
-.usa-alert ul {
- margin-bottom: 0;
- margin-top: 1em;
-}
-
-.usa-alert-icon {
- display: table-cell;
- padding-right: 1rem;
-}
-
-.usa-alert-body {
- display: table-cell;
- padding-left: 3.5rem;
- vertical-align: top;
-}
-
-@media screen and (min-width: 600px) {
- .usa-alert-body {
- padding-left: 5rem;
- }
-}
-
-.usa-alert-body p:first-child {
- margin-top: 0.8rem;
-}
-
-.usa-alert-heading {
- margin-bottom: .3rem;
- margin-top: 0;
-}
-
-@media screen and (min-width: 600px) {
- .usa-alert-heading {
- margin-top: .3rem;
- }
-}
-
-.usa-alert-text {
- font-family: "Source Sans Pro", "Helvetica Neue", "Helvetica", "Roboto", "Arial", sans-serif;
- margin-bottom: 0;
- margin-top: 0;
-}
-
-.usa-alert-success {
- background-color: #e7f4e4;
- background-image: url("../img/alerts/success.png");
- background-image: url("../img/alerts/success.svg");
-}
-
-.usa-alert-warning {
- background-color: #fff1d2;
- background-image: url("../img/alerts/warning.png");
- background-image: url("../img/alerts/warning.svg");
-}
-
-.usa-alert-error {
- background-color: #f9dede;
- background-image: url("../img/alerts/error.png");
- background-image: url("../img/alerts/error.svg");
-}
-
-.usa-alert-info {
- background-color: #e1f3f8;
- background-image: url("../img/alerts/info.png");
- background-image: url("../img/alerts/info.svg");
-}
-
-.usa-alert-no_icon {
- background-image: none;
-}
-
-.usa-banner {
- background-color: #f1f1f1;
- padding-bottom: 0.7rem;
-}
-
-@media screen and (min-width: 481px) {
- .usa-banner {
- font-size: 1.3rem;
- padding-bottom: 0;
- }
-}
-
-.usa-banner-content {
- padding-right: 1.5rem;
- padding-bottom: 3px;
- padding-left: 1.5rem;
- background-color: transparent;
- font-size: 1.5rem;
- padding-top: 2rem;
- width: 100%;
-}
-
-@media screen and (min-width: 600px) {
- .usa-banner-content {
- padding-bottom: 2.3rem;
- padding-top: 4rem;
- }
-}
-
-@media screen and (min-width: 951px) {
- .usa-banner-content {
- padding-right: 3rem;
- padding-left: 3rem;
- }
-}
-
-.usa-banner-content p:first-child {
- margin-top: 1rem;
-}
-
-@media screen and (min-width: 600px) {
- .usa-banner-content p:first-child {
- margin-top: 0;
- }
-}
-
-.usa-banner-inner {
- max-width: 1200px;
- margin-left: auto;
- margin-right: auto;
- padding-right: 1.5rem;
- padding-left: 1.5rem;
- max-width: 1040px;
-}
-
-.usa-banner-inner::after {
- clear: both;
- content: "";
- display: block;
-}
-
-@media screen and (min-width: 951px) {
- .usa-banner-inner {
- padding-right: 3rem;
- padding-left: 3rem;
- }
-}
-
-.usa-banner-header {
- padding-top: 0.55rem;
- padding-bottom: 0.55rem;
- font-size: 1.2rem;
- font-weight: 400;
-}
-
-@media screen and (min-width: 481px) {
- .usa-banner-header {
- padding-top: 0;
- padding-bottom: 0;
- }
-}
-
-.usa-banner-header p {
- margin-top: 0;
- margin-bottom: 0;
- display: inline;
- overflow: hidden;
- vertical-align: middle;
-}
-
-@media screen and (min-width: 481px) {
- .usa-banner-header p {
- margin-top: 2px;
- margin-bottom: 2px;
- display: inline-block;
- }
-}
-
-.usa-banner-header img {
- float: left;
- margin-right: 1rem;
- margin-top: 1px;
- width: 2.4rem;
-}
-
-@media screen and (min-width: 481px) {
- .usa-banner-header img {
- margin-right: 0.7rem;
- width: 2rem;
- }
-}
-
-.usa-banner-header-expanded {
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- border-bottom: 1px solid #aeb0b5;
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- font-size: 1.5rem;
- min-height: 5.6rem;
- padding-right: 3rem;
-}
-
-@media screen and (min-width: 481px) {
- .usa-banner-header-expanded {
- border-bottom: none;
- display: block;
- font-size: 1.2rem;
- font-weight: 400;
- min-height: 0;
- padding-right: 0;
- }
-}
-
-.usa-banner-header-expanded > .usa-banner-inner {
- margin-left: 0;
-}
-
-@media screen and (min-width: 481px) {
- .usa-banner-header-expanded > .usa-banner-inner {
- margin-left: auto;
- }
-}
-
-.usa-banner-header-expanded img {
- margin-right: 2.4rem;
-}
-
-@media screen and (min-width: 481px) {
- .usa-banner-header-expanded img {
- margin-right: 0.7rem;
- }
-}
-
-.usa-banner-header-expanded p {
- line-height: 1.3;
- vertical-align: top;
-}
-
-@media screen and (min-width: 481px) {
- .usa-banner-header-expanded p {
- line-height: 1.5;
- vertical-align: middle;
- }
-}
-
-.usa-banner-button {
- background-color: transparent;
- border: 0;
- border-radius: 0;
- font-weight: 400;
- margin: 0;
- outline: 0;
- padding: 0;
- text-align: left;
- -webkit-font-smoothing: auto;
- padding-top: 1.3rem;
- padding-left: 4.8rem;
- background-position-x: right;
- color: #0071bc;
- display: block;
- font-size: 1.2rem;
- height: 4.3rem;
- left: 0;
- position: absolute;
- text-decoration: underline;
- top: 0;
- width: 100%;
-}
-
-.usa-banner-button:hover {
- background-color: transparent;
-}
-
-@media screen and (min-width: 481px) {
- .usa-banner-button {
- padding-top: 0;
- padding-left: 0;
- display: inline;
- height: initial;
- margin-left: 3px;
- position: relative;
- vertical-align: middle;
- width: initial;
- }
-}
-
-.usa-banner-button:hover {
- color: #205493;
- text-decoration: underline;
-}
-
-.usa-banner-button[aria-expanded=false] {
- background-image: none;
-}
-
-.usa-banner-button[aria-expanded=false]::after {
- background-image: url(../img/angle-arrow-down-primary.png);
- background-image: url(../img/angle-arrow-down-primary.svg);
- background-size: 100%;
- content: '';
- display: inline-block;
- height: 1rem;
- width: 1rem;
- margin-left: 0;
-}
-
-.usa-banner-button[aria-expanded=false]:hover::after {
- background-image: url(../img/angle-arrow-down-primary-hover.png);
- background-image: url(../img/angle-arrow-down-primary-hover.svg);
-}
-
-.usa-banner-button[aria-expanded=false]::after {
- background-position-y: 1px;
-}
-
-.usa-banner-button[aria-expanded=true] {
- background-image: none;
- height: 5.6rem;
-}
-
-.usa-banner-button[aria-expanded=true]::after {
- background-image: url(../img/close.png);
- background-image: url(../img/close.svg);
- background-size: 100%;
- content: '';
- display: inline-block;
- height: 1.3rem;
- width: 1.3rem;
- margin-left: 0;
-}
-
-@media screen and (min-width: 481px) {
- .usa-banner-button[aria-expanded=true] {
- height: initial;
- padding: 0;
- position: relative;
- }
- .usa-banner-button[aria-expanded=true]::after {
- background-image: url(../img/angle-arrow-up-primary.png);
- background-image: url(../img/angle-arrow-up-primary.svg);
- background-size: 100%;
- content: '';
- display: inline-block;
- height: 1rem;
- width: 1rem;
- margin-left: 0;
- }
- .usa-banner-button[aria-expanded=true]:hover::after {
- background-image: url(../img/angle-arrow-up-primary-hover.png);
- background-image: url(../img/angle-arrow-up-primary-hover.svg);
- }
- .usa-banner-button[aria-expanded=true]::after {
- background-position-y: 1px;
- }
-}
-
-.usa-banner-button[aria-expanded=true]::after {
- position: absolute;
- right: 1.5rem;
- top: 2.15rem;
-}
-
-@media screen and (min-width: 481px) {
- .usa-banner-button[aria-expanded=true]::after {
- position: static;
- }
-}
-
-.usa-banner-button[aria-expanded=true] .usa-banner-button-text {
- display: none;
-}
-
-@media screen and (min-width: 481px) {
- .usa-banner-button[aria-expanded=true] .usa-banner-button-text {
- display: inline;
- }
-}
-
-.usa-banner-icon {
- width: 3.8rem;
-}
-
-.usa-footer .usa-unstyled-list {
- display: block;
-}
-
-.usa-footer .usa-footer-primary-link {
- color: #212121;
- display: block;
- font-weight: 700;
- margin-top: 0;
- padding-bottom: 2rem;
- padding-top: 2rem;
- text-decoration: none;
-}
-
-@media screen and (min-width: 600px) {
- .usa-footer .usa-footer-primary-link {
- border-top: none;
- }
-}
-
-.usa-footer .usa-footer-primary-link:hover {
- text-decoration: underline;
-}
-
-.usa-footer a {
- font-weight: normal;
-}
-
-.usa-footer-return-to-top {
- padding-bottom: 2rem;
- padding-top: 2rem;
-}
-
-.usa-footer-primary-section {
- background-color: #f1f1f1;
-}
-
-.usa-footer-primary-section .usa-footer-primary-content {
- padding-left: 2.5rem;
- padding-right: 2.5rem;
-}
-
-@media screen and (min-width: 600px) {
- .usa-footer-primary-section .usa-footer-primary-content {
- padding-left: 0;
- padding-right: 0;
- }
-}
-
-.usa-footer-primary-section .usa-footer-primary-content li {
- margin-left: 1rem;
-}
-
-@media screen and (min-width: 600px) {
- .usa-footer-primary-section .usa-footer-primary-content li {
- margin-left: 0;
- }
-}
-
-@media screen and (min-width: 600px) {
- .usa-footer-primary-section .usa-grid-full {
- padding-left: 2.5rem;
- padding-right: 2.5rem;
- }
-}
-
-.usa-footer-medium .usa-footer-primary-section {
- padding: 0;
-}
-
-@media screen and (min-width: 600px) {
- .usa-footer-medium .usa-footer-primary-section {
- padding-bottom: 1rem;
- padding-top: 1rem;
- }
-}
-
-@media screen and (min-width: 1201px) {
- .usa-footer-medium .usa-footer-primary-section .usa-footer-primary-content {
- margin-right: 6%;
- width: inherit;
- }
-}
-
-@media screen and (min-width: 1201px) {
- .usa-footer-medium .usa-footer-primary-section .usa-footer-primary-content:last-child {
- margin-right: 0;
- }
-}
-
-@media screen and (min-width: 600px) {
- .usa-footer-medium .usa-footer-nav ul {
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- }
-}
-
-.usa-footer-slim .usa-footer-nav a {
- display: block;
-}
-
-@media screen and (min-width: 1201px) {
- .usa-footer-slim .usa-footer-nav .usa-footer-primary-content {
- margin-right: 9%;
- width: inherit;
- }
-}
-
-@media screen and (min-width: 1201px) {
- .usa-footer-slim .usa-footer-nav .usa-footer-primary-content:last-child {
- margin-right: 0;
- }
-}
-
-.usa-footer-slim .usa-footer-primary-section {
- padding-bottom: 2rem;
-}
-
-@media screen and (min-width: 600px) {
- .usa-footer-slim .usa-footer-primary-section {
- padding-bottom: 1rem;
- padding-top: 1rem;
- }
- .usa-footer-slim .usa-footer-primary-section .usa-grid-full {
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- }
-}
-
-@media screen and (min-width: 600px) {
- .usa-footer-slim .usa-footer-contact_info > * {
- margin: 0;
- }
-}
-
-@media screen and (min-width: 600px) {
- .usa-footer-slim .usa-footer-contact_info {
- padding-top: 2rem;
- padding-bottom: 2rem;
- }
-}
-
-@media screen and (min-width: 600px) {
- .usa-footer-slim .usa-footer-contact_info {
- width: 100%;
- }
-}
-
-@media screen and (min-width: 1201px) {
- .usa-footer-slim .usa-footer-contact_info {
- float: left;
- display: block;
- margin-right: 2.35765%;
- width: 48.82117%;
- }
- .usa-footer-slim .usa-footer-contact_info:last-child {
- margin-right: 0;
- }
-}
-
-ul.usa-footer-primary-content,
-li.usa-footer-primary-content,
-li.usa-footer-primary-content {
- border-top: 1px solid #212121;
-}
-
-@media screen and (min-width: 600px) {
- ul.usa-footer-primary-content,
- li.usa-footer-primary-content,
- li.usa-footer-primary-content {
- border: none;
- }
-}
-
-ul.usa-footer-primary-content:last-child,
-li.usa-footer-primary-content:last-child,
-li.usa-footer-primary-content:last-child {
- border-bottom: 1px solid #212121;
-}
-
-@media screen and (min-width: 600px) {
- ul.usa-footer-primary-content:last-child,
- li.usa-footer-primary-content:last-child,
- li.usa-footer-primary-content:last-child {
- border-bottom: none;
- }
-}
-
-.usa-sign_up-block {
- padding-bottom: 2rem;
- padding-left: 2.5rem;
- padding-right: 2.5rem;
-}
-
-@media screen and (min-width: 600px) {
- .usa-sign_up-block {
- float: right;
- padding: 0;
- }
-}
-
-.usa-sign_up-block label:first-of-type {
- margin-top: 0;
-}
-
-.usa-sign_up-block button {
- float: none;
- margin-right: 0;
- margin-top: 1.5rem;
-}
-
-.usa-sign_up-block input {
- width: 100%;
-}
-
-.usa-footer-secondary_section {
- background-color: #d6d7d9;
- padding-bottom: 3rem;
- padding-top: 3rem;
-}
-
-.usa-footer-secondary_section a {
- color: #212121;
-}
-
-@media screen and (min-width: 600px) {
- .usa-footer-big-secondary-section {
- padding-top: 5rem;
- }
-}
-
-@media screen and (min-width: 600px) {
- .usa-footer-contact-links {
- text-align: right;
- }
-}
-
-.usa-social-links a {
- text-decoration: none;
-}
-
-@media screen and (min-width: 600px) {
- .usa-footer-big .usa-footer-primary-section {
- padding-bottom: 4rem;
- padding-top: 3rem;
- }
-}
-
-.usa-footer-big ul {
- padding-bottom: 2.5rem;
-}
-
-@media screen and (min-width: 600px) {
- .usa-footer-big ul {
- padding-bottom: 0;
- }
-}
-
-.usa-footer-big ul:last-child {
- border-bottom: 1px solid #212121;
-}
-
-@media screen and (min-width: 600px) {
- .usa-footer-big ul:last-child {
- border-bottom: none;
- }
-}
-
-.usa-footer-big ul li {
- line-height: 2em;
-}
-
-.usa-footer-big ul .usa-footer-primary-link {
- background-image: url("../img/arrow-down.png");
- background-image: url("../img/arrow-down.svg");
- background-position: 1.5rem center;
- background-repeat: no-repeat;
- background-size: 1.3rem;
- margin-left: 0;
- padding-left: 3.5rem;
-}
-
-@media screen and (min-width: 600px) {
- .usa-footer-big ul .usa-footer-primary-link {
- background: none;
- margin-bottom: .8rem;
- padding-bottom: 0;
- padding-left: 0;
- }
-}
-
-.usa-footer-big ul .usa-footer-primary-link > * {
- margin-top: 0;
- margin-bottom: 0;
-}
-
-.usa-footer-big ul.hidden {
- padding-bottom: 0;
-}
-
-.usa-footer-big ul.hidden li {
- display: none;
-}
-
-.usa-footer-big ul.hidden .usa-footer-primary-link {
- background-image: url("../img/arrow-right.png");
- background-image: url("../img/arrow-right.svg");
- cursor: pointer;
- display: block;
-}
-
-@media screen and (min-width: 600px) {
- .usa-footer-big ul.hidden .usa-footer-primary-link {
- background: none;
- padding-left: 0;
- }
-}
-
-.usa-footer-topic {
- margin: 0;
- padding: 2rem 0;
-}
-
-@media screen and (min-width: 600px) {
- .usa-sign_up-header {
- margin: 0;
- padding: 2rem 0;
- }
-}
-
-.usa-footer-logo-img {
- max-width: 14rem;
-}
-
-.usa-footer-slim-logo-img {
- float: left;
- max-width: 10rem;
-}
-
-.usa-footer-logo-heading {
- margin-top: 2rem;
-}
-
-.usa-footer-contact-heading {
- margin-top: 0;
-}
-
-@media screen and (min-width: 600px) {
- .usa-footer-contact-heading {
- margin-top: 1rem;
- }
-}
-
-.usa-footer-slim-logo-heading {
- display: block;
- padding-top: 1rem;
-}
-
-@media screen and (min-width: 600px) {
- .usa-footer-slim-logo-heading {
- display: inline-block;
- padding-left: 1em;
- }
-}
-
-.usa-social_link, .usa-link-facebook, .usa-link-twitter, .usa-link-youtube, .usa-link-rss {
- margin: 2.5rem 1rem 1.5rem 0;
- background-position: center center;
- background-repeat: no-repeat;
- background-size: auto 3rem;
- display: inline-block;
- height: 4.4rem;
- left: -1.6rem;
- position: relative;
- text-align: center;
- width: 4.4rem;
-}
-
-@media screen and (min-width: 600px) {
- .usa-social_link, .usa-link-facebook, .usa-link-twitter, .usa-link-youtube, .usa-link-rss {
- margin: 0 0 0 1rem;
- left: 1.2rem;
- }
-}
-
-.usa-social_link span, .usa-link-facebook span, .usa-link-twitter span, .usa-link-youtube span, .usa-link-rss span {
- position: absolute;
- left: -999em;
-}
-
-.usa-link-facebook {
- background-image: url("../img/social-icons/png/facebook25.png");
- background-image: url("../img/social-icons/svg/facebook25.svg");
-}
-
-.usa-link-twitter {
- background-image: url("../img/social-icons/png/twitter16.png");
- background-image: url("../img/social-icons/svg/twitter16.svg");
-}
-
-.usa-link-youtube {
- background-image: url("../img/social-icons/png/youtube15.png");
- background-image: url("../img/social-icons/svg/youtube15.svg");
-}
-
-.usa-link-rss {
- background-image: url("../img/social-icons/png/rss25.png");
- background-image: url("../img/social-icons/svg/rss25.svg");
-}
-
-form a {
- border-bottom: 0;
-}
-
-form [type="submit"],
-form [type="submit"] {
- display: block;
- margin-bottom: 1.5em;
- margin-top: 2.5rem;
-}
-
-@media screen and (min-width: 600px) {
- form [type="submit"],
- form [type="submit"] {
- padding-left: 2.7em;
- padding-right: 2.7em;
- width: auto;
- }
-}
-
-form [name="password"],
-form [name="confirmPassword"] {
- margin-bottom: 1.1rem;
-}
-
-@media screen and (min-width: 600px) {
- .usa-form {
- max-width: 32rem;
- }
-}
-
-.usa-form-note {
- float: right;
- font-family: "Source Sans Pro", "Helvetica Neue", "Helvetica", "Roboto", "Arial", sans-serif;
- font-size: 1.5rem;
- margin: 0 0 1.5rem;
-}
-
-.usa-form-note + * {
- clear: both;
-}
-
-fieldset {
- border: none;
- margin: 0;
- padding: 0;
-}
-
-@media screen and (min-width: 600px) {
- .usa-form-large {
- max-width: 46rem;
- }
-}
-
-@media screen and (min-width: 600px) {
- input.usa-input-tiny {
- max-width: 6rem;
- }
-}
-
-@media screen and (min-width: 600px) {
- input.usa-input-medium {
- max-width: 12rem;
- }
-}
-
-@media screen and (min-width: 600px) {
- .usa-input-grid {
- padding-right: 5%;
- }
-}
-
-@media screen and (min-width: 600px) {
- .usa-input-grid:last-of-type {
- padding-right: 0;
- }
-}
-
-@media screen and (min-width: 600px) {
- .usa-input-grid-small {
- float: left;
- width: 35%;
- }
-}
-
-.usa-input-grid-small input {
- margin-bottom: 3rem;
-}
-
-.usa-input-grid-small select {
- margin-bottom: 3rem;
-}
-
-@media screen and (min-width: 600px) {
- .usa-input-grid-medium {
- float: left;
- width: 65%;
- }
-}
-
-.usa-input-grid-medium input {
- margin-bottom: 3rem;
-}
-
-.usa-input-grid-medium select {
- margin-bottom: 3rem;
-}
-
-@media screen and (min-width: 600px) {
- .usa-input-grid-large {
- float: left;
- width: 100%;
- }
-}
-
-.usa-input-grid-large input {
- margin-bottom: 3rem;
-}
-
-.usa-input-grid-large select {
- margin-bottom: 3rem;
-}
-
-.usa-additional_text {
- font-weight: normal;
-}
-
-.usa-checklist {
- list-style: none;
- margin-left: 0;
- padding-left: 0;
-}
-
-.usa-checklist li {
- display: inline-block;
- list-style: none;
- margin-bottom: 0;
- margin-top: 0;
- padding-left: 3em;
- text-indent: -2em;
-}
-
-.usa-checklist li::before {
- content: ' ';
- display: inline-block;
- height: .8em;
- margin-right: .2em;
- width: 1.8em;
-}
-
-.usa-checklist-checked::before {
- background-image: url("../img/correct9.png");
- background-image: url("../img/correct9.svg");
- background-position: 100%;
- background-repeat: no-repeat;
- background-size: 100%;
-}
-
-.usa-graphic_list .usa-graphic_list-row .usa-media_block {
- margin-bottom: 3rem;
-}
-
-@media screen and (min-width: 600px) {
- .usa-graphic_list .usa-graphic_list-row .usa-media_block {
- margin-bottom: 6rem;
- }
-}
-
-@media screen and (min-width: 600px) {
- .usa-graphic_list .usa-graphic_list-row:last-child .usa-media_block {
- margin-bottom: 0;
- }
-}
-
-.usa-graphic_list .usa-graphic_list-row:last-child .usa-media_block:last-child {
- margin-bottom: 0;
-}
-
-.usa-graphic_list .usa-media_block-img {
- margin-right: 3rem;
-}
-
-.usa-graphic_list .usa-media_block-body > :first-child {
- margin-top: 0;
-}
-
-.usa-header {
- width: 100%;
- z-index: 7000;
-}
-
-@media screen and (min-width: 951px) {
- .usa-header {
- border-bottom: 1px solid #aeb0b5;
- }
-}
-
-.usa-header a {
- border-bottom: none;
-}
-
-.usa-header .usa-search {
- margin-bottom: 1.5rem;
-}
-
-@media screen and (min-width: 951px) {
- .usa-header .usa-search {
- float: right;
- margin-bottom: 0;
- max-width: 21.5rem;
- }
-}
-
-.usa-logo {
- float: left;
- line-height: 4rem;
- margin-left: 1.5rem;
-}
-
-@media screen and (min-width: 951px) {
- .usa-logo {
- line-height: 7.5rem;
- margin-left: 0;
- }
-}
-
-.usa-logo a {
- color: #212121;
- text-decoration: none;
-}
-
-.usa-logo br {
- display: none;
-}
-
-@media screen and (min-width: 951px) {
- .usa-logo br {
- display: block;
- }
-}
-
-.usa-logo-text {
- display: block;
- font-size: 1.5rem;
- font-style: normal;
- font-weight: 700;
- margin: 0;
-}
-
-@media screen and (min-width: 951px) {
- .usa-logo-text {
- display: block;
- font-size: 2.4rem;
- line-height: 1.3;
- }
-}
-
-.usa-menu-btn {
- background-color: transparent;
- border: 0;
- border-radius: 0;
- font-weight: 400;
- margin: 0;
- outline: 0;
- padding: 0;
- text-align: left;
- -webkit-font-smoothing: auto;
- background-color: #0071bc;
- color: #ffffff;
- display: inline;
- float: right;
- font-size: 1.3rem;
- height: 4rem;
- line-height: 4rem;
- text-align: center;
- text-decoration: none;
- text-transform: uppercase;
- width: 5.8rem;
-}
-
-.usa-menu-btn:hover {
- background-color: transparent;
-}
-
-@media screen and (min-width: 951px) {
- .usa-menu-btn {
- display: none;
- }
-}
-
-.usa-menu-btn:hover {
- color: #ffffff;
- background-color: #205493;
-}
-
-.usa-menu-btn:visited {
- color: #ffffff;
-}
-
-.usa-overlay {
- position: fixed;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- background: #000000;
- opacity: 0;
- -webkit-transition: all 0.2s ease-in-out;
- transition: all 0.2s ease-in-out;
- visibility: hidden;
- z-index: 8000;
-}
-
-.usa-overlay.is-visible {
- opacity: 0.1;
- visibility: visible;
-}
-
-@media screen and (min-width: 951px) {
- .usa-header-basic .usa-logo {
- bottom: 1.9rem;
- position: absolute;
- }
-}
-
-@media screen and (min-width: 951px) {
- .usa-header-basic .usa-navbar {
- position: relative;
- width: 18%;
- }
-}
-
-@media screen and (min-width: 951px) {
- .usa-header-extended .usa-header {
- border-bottom: none;
- }
-}
-
-@media screen and (min-width: 951px) {
- .usa-header-extended .usa-logo {
- margin-top: 3rem;
- margin-bottom: 3rem;
- }
-}
-
-@media screen and (min-width: 951px) {
- .usa-header-extended em {
- font-size: 3.2rem;
- line-height: 1;
- }
-}
-
-@media screen and (min-width: 951px) {
- .usa-header-extended .usa-navbar {
- max-width: 1200px;
- margin-left: auto;
- margin-right: auto;
- padding-right: 3rem;
- padding-left: 3rem;
- display: block;
- height: auto;
- max-width: 1040px;
- }
- .usa-header-extended .usa-navbar::after {
- clear: both;
- content: "";
- display: block;
- }
-}
-
-@media screen and (min-width: 951px) {
- .usa-header-extended .usa-nav {
- border-top: 1px solid #aeb0b5;
- float: none;
- padding: 0;
- width: 100%;
- }
-}
-
-@media screen and (min-width: 951px) {
- .usa-header-extended .usa-nav-inner {
- max-width: 1200px;
- margin-left: auto;
- margin-right: auto;
- padding-right: 3rem;
- padding-left: 2rem;
- margin-top: -1px;
- max-width: 1040px;
- position: relative;
- }
- .usa-header-extended .usa-nav-inner::after {
- clear: both;
- content: "";
- display: block;
- }
-}
-
-@media screen and (min-width: 951px) {
- .usa-header-extended .usa-nav-primary::after {
- clear: both;
- content: "";
- display: block;
- }
-}
-
-@media screen and (min-width: 951px) {
- .usa-header-extended .usa-nav-primary button[aria-expanded=false], .usa-header-extended .usa-nav-primary button[aria-expanded=true] {
- background-position: right 1.5rem top 50%;
- }
-}
-
-@media screen and (min-width: 951px) {
- .usa-header-extended .usa-nav-link {
- padding-top: 1.9rem;
- }
-}
-
-@media screen and (min-width: 951px) {
- .usa-header-extended .usa-nav-submenu .usa-grid-full {
- padding-left: 1.2rem;
- }
-}
-
-@media screen and (min-width: 951px) {
- .usa-header-extended .usa-megamenu {
- padding-left: 3rem;
- }
-}
-
-.usa-hero {
- padding-top: 3rem;
- padding-bottom: 3rem;
- background-image: url("../img/hero.png");
- background-position: center;
- background-size: cover;
-}
-
-.usa-hero .usa-button {
- color: #ffffff;
-}
-
-.usa-section-dark .usa-hero-link {
- color: #02bfe7;
-}
-
-.usa-hero-callout {
- background-color: #112e51;
- padding: 3rem;
-}
-
-@media screen and (min-width: 481px) {
- .usa-hero-callout {
- max-width: 30rem;
- }
-}
-
-.usa-hero-callout > *:first-child {
- margin-top: 0;
- margin-bottom: 3rem;
-}
-
-.usa-hero-callout .usa-button {
- font-size: 1.4rem;
- margin-top: 7rem;
- width: 100%;
-}
-
-.usa-hero-callout-alt {
- color: #ffffff;
- display: block;
-}
-
-.usa-layout-docs {
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- -webkit-box-orient: vertical;
- -webkit-box-direction: normal;
- -ms-flex-direction: column;
- flex-direction: column;
-}
-
-@media screen and (min-width: 1201px) {
- .usa-layout-docs {
- display: inherit;
- }
-}
-
-.usa-layout-docs .usa-grid > :first-child:not(.usa-width-*) {
- margin-top: 0;
-}
-
-.usa-layout-docs .usa-grid > :last-child:not(.usa-width-*) {
- margin-bottom: 0;
-}
-
-.usa-layout-docs-sidenav {
- -webkit-box-ordinal-group: 3;
- -ms-flex-order: 2;
- order: 2;
-}
-
-.usa-layout-docs-main_content {
- margin-bottom: 3rem;
- -webkit-box-ordinal-group: 2;
- -ms-flex-order: 1;
- order: 1;
-}
-
-@media screen and (min-width: 1201px) {
- .usa-layout-docs-main_content {
- margin-bottom: 0;
- }
-}
-
-.usa-layout-docs-main_content > :first-child {
- margin-top: 0;
-}
-
-.usa-media_block-img {
- float: left;
- margin-right: 1rem;
-}
-
-.usa-media_block-body {
- overflow: hidden;
-}
-
-.usa-navbar {
- border-bottom: 1px solid #aeb0b5;
- height: 4rem;
-}
-
-@media screen and (min-width: 951px) {
- .usa-navbar {
- border-bottom: none;
- display: inline-block;
- height: 10.3rem;
- }
-}
-
-.usa-nav-link {
- -moz-osx-font-smoothing: grayscale;
- -webkit-font-smoothing: antialiased;
-}
-
-@media screen and (min-width: 951px) {
- .usa-nav-link:hover span {
- border-bottom: 0.7rem solid #0071bc;
- padding-bottom: 1rem;
- }
-}
-
-@media screen and (min-width: 951px) {
- .usa-nav-container {
- max-width: 1200px;
- margin-left: auto;
- margin-right: auto;
- padding-right: 3rem;
- padding-left: 3rem;
- max-width: 1040px;
- }
- .usa-nav-container::after {
- clear: both;
- content: "";
- display: block;
- }
-}
-
-.usa-nav {
- position: fixed;
- top: 0;
- right: 0;
- bottom: 0;
- left: auto;
- height: 100%;
- width: 26rem;
- -webkit-transform: translateX(26rem);
- -ms-transform: translateX(26rem);
- transform: translateX(26rem);
- background: #ffffff;
- border-left: 1px solid #aeb0b5;
- border-right: 0;
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- -webkit-box-orient: vertical;
- -webkit-box-direction: normal;
- -ms-flex-direction: column;
- flex-direction: column;
- overflow-y: auto;
- padding: 2rem;
- z-index: 9000;
-}
-
-@media screen and (min-width: 951px) {
- .usa-nav {
- padding-top: 5rem;
- padding-right: 0;
- padding-bottom: 0;
- -webkit-transform: translateX(0);
- -ms-transform: translateX(0);
- transform: translateX(0);
- border-left: none;
- display: block;
- float: right;
- overflow-y: visible;
- position: relative;
- width: auto;
- }
-}
-
-.usa-nav.is-visible {
- -webkit-transform: translateX(0);
- -ms-transform: translateX(0);
- transform: translateX(0);
- -webkit-transition: all 0.3s ease-in-out;
- transition: all 0.3s ease-in-out;
-}
-
-.usa-nav nav {
- margin-top: 6rem;
- min-height: 100%;
-}
-
-@media screen and (min-width: 951px) {
- .usa-nav nav {
- margin-top: 0;
- }
-}
-
-.usa-nav .usa-current {
- border-left: 4px solid #0071bc;
- color: #0071bc;
- font-weight: 700;
- padding-left: 1.4rem;
-}
-
-.usa-nav .usa-button {
- width: 100%;
-}
-
-@media screen and (min-width: 951px) {
- .usa-nav .usa-search {
- margin-left: 1.5rem;
- }
-}
-
-.usa-nav-primary {
- margin-top: 0;
- margin-bottom: 0;
- list-style-type: none;
- padding-left: 0;
- -webkit-box-ordinal-group: 3;
- -ms-flex-order: 2;
- order: 2;
-}
-
-.usa-nav-primary > li {
- margin-bottom: 0;
-}
-
-.usa-nav-primary > li {
- background-color: transparent;
- border-top: 1px solid #5b616b;
- font-size: 1.7rem;
-}
-
-.usa-nav-primary > li:first-child {
- border-top: none;
-}
-
-.usa-nav-primary a {
- border: none;
- color: #212121;
- display: block;
- font-family: "Source Sans Pro", "Helvetica Neue", "Helvetica", "Roboto", "Arial", sans-serif;
- line-height: 1.3;
- padding: 0.85rem 1rem 0.85rem 1.8rem;
- text-decoration: none;
-}
-
-.usa-nav-primary a:hover {
- background-color: #f1f1f1;
- color: #0071bc;
- text-decoration: none;
-}
-
-.usa-nav-primary a:focus {
- position: relative;
- z-index: 1;
-}
-
-.usa-nav-primary a.usa-current {
- border-left: 4px solid #0071bc;
- color: #0071bc;
- font-weight: 700;
- padding-left: 1.4rem;
-}
-
-@media screen and (min-width: 951px) {
- .usa-nav-primary {
- display: inline;
- }
-}
-
-@media screen and (min-width: 951px) {
- .usa-nav-primary li {
- border-top: none;
- }
-}
-
-.usa-nav-primary > li {
- width: auto;
-}
-
-@media screen and (min-width: 951px) {
- .usa-nav-primary > li {
- display: inline-block;
- margin-left: -4px;
- }
-}
-
-@media screen and (min-width: 951px) {
- .usa-nav-primary > li > a {
- padding: 1.3rem 1.5rem 1.7rem;
- color: #5b616b;
- font-size: 1.5rem;
- font-weight: 700;
- line-height: 1.2;
- }
-}
-
-@media screen and (min-width: 951px) {
- .usa-nav-primary > li > a:hover {
- background-color: transparent;
- }
-}
-
-.usa-nav-primary button {
- background-color: transparent;
- border: 0;
- border-radius: 0;
- font-weight: 400;
- margin: 0;
- outline: 0;
- padding: 0;
- text-align: left;
- -webkit-font-smoothing: auto;
- -moz-osx-font-smoothing: grayscale;
- -webkit-font-smoothing: antialiased;
- font-weight: 400;
- padding: 1.4rem 1.5rem 1rem 1.8rem;
-}
-
-.usa-nav-primary button:hover {
- background-color: transparent;
-}
-
-@media screen and (min-width: 951px) {
- .usa-nav-primary button {
- padding-right: 3rem;
- padding-bottom: 1.9rem;
- padding-left: 1.5rem;
- color: #5b616b;
- font-size: 1.5rem;
- font-weight: 700;
- width: initial;
- }
-}
-
-.usa-nav-primary button:focus, .usa-nav-primary button:active {
- box-shadow: 0 0 3px #3e94cf, 0 0 7px #3e94cf;
-}
-
-.usa-nav-primary button:hover {
- background-color: #f1f1f1;
- color: #0071bc;
-}
-
-@media screen and (min-width: 951px) {
- .usa-nav-primary button:hover {
- background-color: transparent;
- }
-}
-
-.usa-nav-primary button[aria-expanded=false] {
- background-image: url("../img/plus-alt.png");
- background-image: url("../img/plus-alt.svg");
- background-repeat: no-repeat;
- background-position: right 0 center;
- background-size: 1rem;
-}
-
-@media screen and (min-width: 951px) {
- .usa-nav-primary button[aria-expanded=false] {
- background-image: url("../img/angle-arrow-down.png");
- background-image: url("../img/angle-arrow-down.svg");
- background-position: right 1.5rem top 44%;
- }
-}
-
-.usa-nav-primary button[aria-expanded=true] {
- background-image: url("../img/minus-alt.png");
- background-image: url("../img/minus-alt.svg");
- background-repeat: no-repeat;
- background-position: right 0 center;
- background-size: 1rem;
-}
-
-@media screen and (min-width: 951px) {
- .usa-nav-primary button[aria-expanded=true] {
- background-color: #112e51;
- color: #ffffff;
- background-image: url("../img/angle-arrow-down-hover.png");
- background-image: url("../img/angle-arrow-down-hover.svg");
- background-position: right 1.5rem top 44%;
- }
- .usa-nav-primary button[aria-expanded=true]:hover {
- background-color: #112e51;
- }
- .usa-nav-primary button[aria-expanded=true] span {
- border-bottom: 0.7rem solid #0071bc;
- padding-bottom: 1rem;
- }
-}
-
-@media screen and (min-width: 951px) {
- .usa-nav-secondary {
- position: absolute;
- right: 3rem;
- top: -5.7rem;
- }
-}
-
-.usa-nav-secondary .usa-search {
- margin-top: 3rem;
- margin-bottom: 3rem;
-}
-
-@media screen and (min-width: 951px) {
- .usa-nav-secondary .usa-search {
- margin-top: -0.2rem;
- margin-bottom: 0;
- margin-left: 0;
- float: left;
- }
-}
-
-@media screen and (min-width: 951px) {
- .usa-nav-secondary-links {
- float: left;
- }
-}
-
-@media screen and (min-width: 951px) {
- .usa-nav-secondary-links li {
- display: inline;
- padding-left: 1rem;
- }
-}
-
-@media screen and (min-width: 951px) {
- .usa-nav-secondary-links li:not(:last-child)::after {
- content: '|';
- padding-left: 1rem;
- }
-}
-
-.usa-nav-secondary-links a,
-.usa-nav-secondary-links .usa-header-search-button {
- color: #5b616b;
- display: inline-block;
- font-size: 1.5rem;
- text-decoration: none;
-}
-
-.usa-nav-secondary-links a:hover,
-.usa-nav-secondary-links .usa-header-search-button:hover {
- color: #0071bc;
-}
-
-.usa-nav-secondary-links .usa-header-search-button {
- background-color: transparent;
- border: 0;
- border-radius: 0;
- font-weight: 400;
- margin: 0;
- outline: 0;
- padding: 0;
- text-align: left;
- -webkit-font-smoothing: auto;
- display: none;
-}
-
-.usa-nav-secondary-links .usa-header-search-button:hover {
- background-color: transparent;
-}
-
-@media screen and (min-width: 951px) {
- .usa-nav-secondary-links .usa-header-search-button {
- background-image: url("../img/search-alt.png");
- background-image: url("../img/search-alt.svg");
- background-repeat: no-repeat;
- background-position: left center;
- background-size: 2.2rem;
- display: inline-block;
- padding-left: 2.3rem;
- }
-}
-
-@media screen and (min-width: 951px) {
- .usa-nav-secondary-links .usa-header-search-button.is-hidden {
- display: none;
- }
-}
-
-.usa-nav-submenu {
- margin-top: 0;
- margin-bottom: 0;
- list-style-type: none;
- padding-left: 0;
- margin: 0;
- width: 100%;
-}
-
-.usa-nav-submenu > li {
- margin-bottom: 0;
-}
-
-.usa-nav-submenu li {
- border: none;
- font-size: 1.5rem;
-}
-
-.usa-nav-submenu a {
- padding-left: 2.8rem;
- line-height: 1.3;
-}
-
-.usa-nav-submenu a:hover, .usa-nav-submenu a.usa-current {
- border: none;
- padding-left: 2.8rem;
-}
-
-.usa-nav-submenu .usa-sidenav-sub_list a {
- padding-left: 3.8rem;
-}
-
-.usa-nav-submenu .usa-sidenav-sub_list a:hover {
- padding-left: 3.8rem;
-}
-
-@media screen and (min-width: 951px) {
- .usa-nav-submenu {
- margin-top: 0;
- margin-bottom: 0;
- list-style-type: none;
- padding-left: 0;
- padding-top: 1.15rem;
- padding-bottom: 1.15rem;
- background-color: #112e51;
- min-width: 21.5rem;
- width: auto;
- position: absolute;
- }
- .usa-nav-submenu > li {
- margin-bottom: 0;
- }
-}
-
-.usa-nav-submenu[aria-hidden=true] {
- display: none;
-}
-
-@media screen and (min-width: 951px) {
- .usa-nav-submenu a {
- color: #ffffff;
- padding-left: 1.8rem;
- }
-}
-
-@media screen and (min-width: 951px) {
- .usa-nav-submenu a:hover {
- background-color: #112e51;
- color: #ffffff;
- text-decoration: underline;
- }
-}
-
-@media screen and (min-width: 951px) {
- .usa-nav-submenu a:hover, .usa-nav-submenu a.usa-current {
- padding-left: 1.8rem;
- }
-}
-
-.usa-nav-submenu li {
- margin-bottom: 0;
-}
-
-.usa-nav-close {
- background-color: transparent;
- border: 0;
- border-radius: 0;
- font-weight: 400;
- margin: 0;
- outline: 0;
- padding: 0;
- text-align: left;
- -webkit-font-smoothing: auto;
- margin: -1.2rem -1.5rem 2.4rem auto;
- float: right;
- height: 4.4rem;
- text-align: center;
- width: 4.4rem;
-}
-
-.usa-nav-close:hover {
- background-color: transparent;
-}
-
-@media screen and (min-width: 951px) {
- .usa-nav-close {
- display: none;
- }
-}
-
-.usa-nav-close img {
- width: 1.3rem;
-}
-
-.usa-mobile_nav-active {
- overflow: hidden;
-}
-
-@media screen and (min-width: 951px) {
- .usa-megamenu {
- padding-top: 3.15rem;
- padding-bottom: 3.15rem;
- left: -1.8rem;
- width: 100%;
- }
-}
-
-@media screen and (min-width: 951px) {
- .usa-megamenu::before {
- background-color: #112e51;
- content: '';
- display: block;
- height: 100%;
- position: absolute;
- top: 0;
- width: 1000%;
- right: 100%;
- }
-}
-
-@media screen and (min-width: 951px) {
- .usa-megamenu::after {
- background-color: #112e51;
- content: '';
- display: block;
- height: 100%;
- position: absolute;
- top: 0;
- width: 1000%;
- left: 100%;
- }
-}
-
-@media screen and (min-width: 951px) {
- .usa-header-basic-megamenu .usa-nav {
- padding-top: 0;
- width: 100%;
- }
-}
-
-.usa-header-basic-megamenu .usa-nav-inner {
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- -webkit-box-orient: vertical;
- -webkit-box-direction: normal;
- -ms-flex-direction: column;
- flex-direction: column;
-}
-
-@media screen and (min-width: 951px) {
- .usa-header-basic-megamenu .usa-nav-inner {
- display: initial;
- float: right;
- margin-top: -4.8rem;
- }
-}
-
-@media screen and (min-width: 951px) {
- .usa-header-basic-megamenu .usa-nav-submenu .usa-grid-full {
- margin-left: -1.8rem;
- }
-}
-
-@media screen and (min-width: 951px) {
- .usa-megamenu-col {
- float: left;
- display: block;
- margin-right: 2.35765%;
- width: 23.23176%;
- }
- .usa-megamenu-col:last-child {
- margin-right: 0;
- }
- .usa-megamenu-col:nth-child(2n) {
- float: left;
- display: block;
- margin-right: 2.35765%;
- width: 23.23176%;
- }
- .usa-megamenu-col:nth-child(2n):last-child {
- margin-right: 0;
- }
- .usa-megamenu-col:nth-child(4n) {
- margin-right: 0;
- }
-}
-
-.usa-megamenu-col > ul {
- margin-top: 0;
- margin-bottom: 0;
- list-style-type: none;
- padding-left: 0;
-}
-
-.usa-megamenu-col > ul > li {
- margin-bottom: 0;
-}
-
-.usa-search {
- max-width: none;
- position: relative;
-}
-
-.usa-search::after {
- clear: both;
- content: "";
- display: block;
-}
-
-.usa-search [type="search"],
-.usa-search .usa-search-input {
- padding-top: 0;
- padding-bottom: 0;
- -webkit-appearance: none;
- border-bottom-right-radius: 0;
- border-right: none;
- border-top-right-radius: 0;
- box-sizing: border-box;
- float: left;
- font-size: 1.4rem;
- height: 3.3rem;
- margin: 0;
- width: calc(100% - 4.5rem);
-}
-
-@media screen and (min-width: 481px) {
- .usa-search [type="search"],
- .usa-search .usa-search-input {
- width: calc(100% - 8.5rem);
- }
-}
-
-.usa-search [type="submit"],
-.usa-search .usa-search-submit {
- background-image: url("../img/search.png");
- background-image: url("../img/search.svg");
- background-position: 50%;
- background-repeat: no-repeat;
- border-bottom-left-radius: 0;
- border-top-left-radius: 0;
- height: 3.3rem;
- margin: 0;
- padding: 0;
- width: 4.5rem;
-}
-
-@media screen and (min-width: 481px) {
- .usa-search [type="submit"],
- .usa-search .usa-search-submit {
- background-image: none;
- width: 8.5rem;
- }
-}
-
-.usa-search .usa-search-submit-text {
- display: none;
-}
-
-@media screen and (min-width: 481px) {
- .usa-search .usa-search-submit-text {
- display: block;
- }
-}
-
-@media screen and (min-width: 481px) {
- .usa-search.usa-search-big [type="search"],
- .usa-search.usa-search-big .usa-search-input {
- font-size: 1.7rem;
- height: 4.4rem;
- width: calc(100% - 11.6rem);
- }
- .usa-search.usa-search-big [type="submit"],
- .usa-search.usa-search-big .usa-search-submit {
- font-size: 2rem;
- height: 4.4rem;
- width: 11.6rem;
- }
-}
-
-@media screen and (min-width: 481px) {
- .usa-search.usa-search-small [type="search"],
- .usa-search.usa-search-small .usa-search-input {
- width: calc(100% - 4.5rem);
- }
- .usa-search.usa-search-small [type="submit"],
- .usa-search.usa-search-small .usa-search-submit {
- background-image: url("../img/search.png");
- background-image: url("../img/search.svg");
- background-position: 50%;
- background-repeat: no-repeat;
- width: 4.5rem;
- }
-}
-
-@media screen and (max-width: 950px) {
- .usa-search.usa-search-small.usa-sr-only {
- left: auto;
- position: relative;
- }
-}
-
-.usa-section {
- padding-top: 3rem;
- padding-bottom: 3rem;
-}
-
-@media screen and (min-width: 600px) {
- .usa-section {
- padding-top: 6rem;
- padding-bottom: 6rem;
- }
-}
-
-.usa-section-light {
- background-color: #f1f1f1;
-}
-
-.usa-section-dark {
- background-color: #112e51;
- color: #ffffff;
-}
-
-.usa-section-dark h1,
-.usa-section-dark h2,
-.usa-section-dark h3,
-.usa-section-dark h4,
-.usa-section-dark h5,
-.usa-section-dark h6 {
- color: #02bfe7;
-}
-
-.usa-section-dark p {
- color: #ffffff;
-}
-
-.usa-section-dark a {
- color: #d6d7d9;
-}
-
-.usa-section-dark a:hover {
- color: #ffffff;
-}
-
-.usa-sidenav-list {
- margin-top: 0;
- margin-bottom: 0;
- list-style-type: none;
- padding-left: 0;
-}
-
-.usa-sidenav-list > li {
- margin-bottom: 0;
-}
-
-.usa-sidenav-list > li {
- background-color: transparent;
- border-top: 1px solid #5b616b;
- font-size: 1.7rem;
-}
-
-.usa-sidenav-list > li:first-child {
- border-top: none;
-}
-
-.usa-sidenav-list a {
- border: none;
- color: #212121;
- display: block;
- font-family: "Source Sans Pro", "Helvetica Neue", "Helvetica", "Roboto", "Arial", sans-serif;
- line-height: 1.3;
- padding: 0.85rem 1rem 0.85rem 1.8rem;
- text-decoration: none;
-}
-
-.usa-sidenav-list a:hover {
- background-color: #f1f1f1;
- color: #0071bc;
- text-decoration: none;
-}
-
-.usa-sidenav-list a:focus {
- position: relative;
- z-index: 1;
-}
-
-.usa-sidenav-list a.usa-current {
- border-left: 4px solid #0071bc;
- color: #0071bc;
- font-weight: 700;
- padding-left: 1.4rem;
-}
-
-.usa-sidenav-sub_list {
- margin-top: 0;
- margin-bottom: 0;
- list-style-type: none;
- padding-left: 0;
- margin: 0;
- width: 100%;
-}
-
-.usa-sidenav-sub_list > li {
- margin-bottom: 0;
-}
-
-.usa-sidenav-sub_list li {
- border: none;
- font-size: 1.5rem;
-}
-
-.usa-sidenav-sub_list a {
- padding-left: 2.8rem;
- line-height: 1.3;
-}
-
-.usa-sidenav-sub_list a:hover, .usa-sidenav-sub_list a.usa-current {
- border: none;
- padding-left: 2.8rem;
-}
-
-.usa-sidenav-sub_list .usa-sidenav-sub_list a {
- padding-left: 3.8rem;
-}
-
-.usa-sidenav-sub_list .usa-sidenav-sub_list a:hover {
- padding-left: 3.8rem;
-}
-
-.usa-skipnav {
- background: transparent;
- color: #212121;
- left: 0;
- padding: 1rem 1.5rem;
- position: absolute;
- top: -4.2rem;
- -webkit-transition: all 0.2s ease-in-out;
- transition: all 0.2s ease-in-out;
- z-index: 100;
-}
-
-.usa-skipnav:focus {
- background: #ffffff;
- left: 0;
- outline: 0;
- position: absolute;
- top: 0;
- -webkit-transition: all 0.2s ease-in-out;
- transition: all 0.2s ease-in-out;
-}
diff --git a/web/static/css/uswds.min.css b/web/static/css/uswds.min.css
deleted file mode 100644
index 95a1896..0000000
--- a/web/static/css/uswds.min.css
+++ /dev/null
@@ -1 +0,0 @@
-/*! uswds v0.14.0 */html{box-sizing:border-box}*,*::after,*::before{box-sizing:inherit}/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */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}@font-face{font-family:"Source Sans Pro";font-style:normal;font-weight:300;src:url("../fonts/sourcesanspro-light-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/sourcesanspro-light-webfont.woff2") format("woff2"),url("../fonts/sourcesanspro-light-webfont.woff") format("woff"),url("../fonts/sourcesanspro-light-webfont.ttf") format("truetype")}@font-face{font-family:"Source Sans Pro";font-style:normal;font-weight:400;src:url("../fonts/sourcesanspro-regular-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/sourcesanspro-regular-webfont.woff2") format("woff2"),url("../fonts/sourcesanspro-regular-webfont.woff") format("woff"),url("../fonts/sourcesanspro-regular-webfont.ttf") format("truetype")}@font-face{font-family:"Source Sans Pro";font-style:italic;font-weight:400;src:url("../fonts/sourcesanspro-italic-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/sourcesanspro-italic-webfont.woff2") format("woff2"),url("../fonts/sourcesanspro-italic-webfont.woff") format("woff"),url("../fonts/sourcesanspro-italic-webfont.ttf") format("truetype")}@font-face{font-family:"Source Sans Pro";font-style:normal;font-weight:700;src:url("../fonts/sourcesanspro-bold-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/sourcesanspro-bold-webfont.woff2") format("woff2"),url("../fonts/sourcesanspro-bold-webfont.woff") format("woff"),url("../fonts/sourcesanspro-bold-webfont.ttf") format("truetype")}@font-face{font-family:"Merriweather";font-style:normal;font-weight:300;src:url("../fonts/merriweather-light-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/merriweather-light-webfont.woff2") format("woff2"),url("../fonts/merriweather-light-webfont.woff") format("woff"),url("../fonts/merriweather-light-webfont.ttf") format("truetype")}@font-face{font-family:"Merriweather";font-style:normal;font-weight:400;src:url("../fonts/merriweather-regular-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/merriweather-regular-webfont.woff2") format("woff2"),url("../fonts/merriweather-regular-webfont.woff") format("woff"),url("../fonts/merriweather-regular-webfont.ttf") format("truetype")}@font-face{font-family:"Merriweather";font-style:italic;font-weight:400;src:url("../fonts/merriweather-italic-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/merriweather-italic-webfont.woff2") format("woff2"),url("../fonts/merriweather-italic-webfont.woff") format("woff"),url("../fonts/merriweather-italic-webfont.ttf") format("truetype")}@font-face{font-family:"Merriweather";font-style:normal;font-weight:700;src:url("../fonts/merriweather-bold-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/merriweather-bold-webfont.woff2") format("woff2"),url("../fonts/merriweather-bold-webfont.woff") format("woff"),url("../fonts/merriweather-bold-webfont.ttf") format("truetype")}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}body{background-color:#fff;overflow-x:hidden}.lt-ie9 *{-webkit-filter:none !important;filter:none !important}[hidden]{display:none !important}.usa-grid,.usa-grid-full{max-width:1200px;margin-left:auto;margin-right:auto;max-width:1040px}.usa-grid::after,.usa-grid-full::after{clear:both;content:"";display:block}.usa-grid{padding-right:1.5rem;padding-left:1.5rem}@media screen and (min-width: 600px){.usa-grid{padding-right:3rem;padding-left:3rem}}.usa-grid-full{padding:0}@media screen and (min-width: 600px){.usa-width-one-whole{float:left;display:block;margin-right:4.82916%;width:100%}.usa-width-one-whole:last-child{margin-right:0}.usa-width-one-half{float:left;display:block;margin-right:4.82916%;width:47.58542%}.usa-width-one-half:last-child{margin-right:0}.usa-width-one-third{float:left;display:block;margin-right:4.82916%;width:30.11389%}.usa-width-one-third:last-child{margin-right:0}.usa-width-two-thirds{float:left;display:block;margin-right:4.82916%;width:65.05695%}.usa-width-two-thirds:last-child{margin-right:0}.usa-width-one-fourth{float:left;display:block;margin-right:4.82916%;width:47.58542%}.usa-width-one-fourth:last-child{margin-right:0}.usa-width-one-fourth:nth-child(2n){margin-right:0}.usa-width-three-fourths{float:left;display:block;margin-right:4.82916%;width:100%}.usa-width-three-fourths:last-child{margin-right:0}.usa-width-one-sixth{float:left;display:block;margin-right:4.82916%;width:30.11389%}.usa-width-one-sixth:last-child{margin-right:0}.usa-width-one-sixth:nth-child(3n){margin-right:0}.usa-width-five-sixths{float:left;display:block;margin-right:4.82916%;width:65.05695%}.usa-width-five-sixths:last-child{margin-right:0}.usa-width-one-twelfth{float:left;display:block;margin-right:4.82916%;width:30.11389%}.usa-width-one-twelfth:last-child{margin-right:0}.usa-width-one-twelfth:nth-child(3n){margin-right:0}.usa-width-five-twelfths{float:left;display:block;margin-right:4.82916%;width:30.11389%}.usa-width-five-twelfths:last-child{margin-right:0}.usa-width-seven-twelfths{float:left;display:block;margin-right:4.82916%;width:65.05695%}.usa-width-seven-twelfths:last-child{margin-right:0}}@media screen and (min-width: 1201px){.usa-width-one-whole{float:left;display:block;margin-right:2.35765%;width:100%}.usa-width-one-whole:last-child{margin-right:0}.usa-width-one-half{float:left;display:block;margin-right:2.35765%;width:48.82117%}.usa-width-one-half:last-child{margin-right:0}.usa-width-one-third{float:left;display:block;margin-right:2.35765%;width:31.76157%}.usa-width-one-third:last-child{margin-right:0}.usa-width-two-thirds{float:left;display:block;margin-right:2.35765%;width:65.88078%}.usa-width-two-thirds:last-child{margin-right:0}.usa-width-one-fourth{float:left;display:block;margin-right:2.35765%;width:23.23176%}.usa-width-one-fourth:last-child{margin-right:0}.usa-width-one-fourth:nth-child(2n){float:left;display:block;margin-right:2.35765%;width:23.23176%}.usa-width-one-fourth:nth-child(2n):last-child{margin-right:0}.usa-width-one-fourth:nth-child(4n){margin-right:0}.usa-width-three-fourths{float:left;display:block;margin-right:2.35765%;width:74.41059%}.usa-width-three-fourths:last-child{margin-right:0}.usa-width-one-sixth{float:left;display:block;margin-right:2.35765%;width:14.70196%}.usa-width-one-sixth:last-child{margin-right:0}.usa-width-one-sixth:nth-child(3n){float:left;display:block;margin-right:2.35765%;width:14.70196%}.usa-width-one-sixth:nth-child(3n):last-child{margin-right:0}.usa-width-one-sixth:nth-child(6n){margin-right:0}.usa-width-five-sixths{float:left;display:block;margin-right:2.35765%;width:82.94039%}.usa-width-five-sixths:last-child{margin-right:0}.usa-width-one-twelfth{float:left;display:block;margin-right:2.35765%;width:6.17215%}.usa-width-one-twelfth:last-child{margin-right:0}.usa-width-one-twelfth:nth-child(3n){float:left;display:block;margin-right:2.35765%;width:6.17215%}.usa-width-one-twelfth:nth-child(3n):last-child{margin-right:0}.usa-width-one-twelfth:nth-child(12n){margin-right:0}.usa-width-five-twelfths{float:left;display:block;margin-right:2.35765%;width:40.29137%}.usa-width-five-twelfths:last-child{margin-right:0}.usa-width-seven-twelfths{float:left;display:block;margin-right:2.35765%;width:57.35098%}.usa-width-seven-twelfths:last-child{margin-right:0}}.usa-end-row{margin-right:0}.usa-sr-only{position:absolute;left:-999em}.usa-button,.usa-button-primary,.usa-button:visited,.usa-button-primary:visited,button,[type="button"],[type="submit"],[type="reset"],[type="image"]{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;margin-top:.5em;margin-right:.5em;margin-bottom:.5em;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#0071bc;border:0;border-radius:.3rem;color:#fff;cursor:pointer;display:inline-block;font-family:"Source Sans Pro","Helvetica Neue","Helvetica","Roboto","Arial",sans-serif;font-size:1.7rem;font-weight:700;line-height:1;outline:none;padding:1rem 2rem;text-align:center;text-decoration:none;width:100%}@media screen and (min-width: 481px){.usa-button,.usa-button-primary,.usa-button:visited,.usa-button-primary:visited,button,[type="button"],[type="submit"],[type="reset"],[type="image"]{width:auto}}.usa-button:hover,.usa-button.usa-button-hover,.usa-button-primary:hover,.usa-button-primary.usa-button-hover,.usa-button:visited:hover,.usa-button:visited.usa-button-hover,.usa-button-primary:visited:hover,.usa-button-primary:visited.usa-button-hover,button:hover,button.usa-button-hover,[type="button"]:hover,[type="button"].usa-button-hover,[type="submit"]:hover,[type="submit"].usa-button-hover,[type="reset"]:hover,[type="reset"].usa-button-hover,[type="image"]:hover,[type="image"].usa-button-hover{background-color:#205493;border-bottom:0;color:#fff;text-decoration:none}.usa-button:focus,.usa-button.usa-button-focus,.usa-button-primary:focus,.usa-button-primary.usa-button-focus,.usa-button:visited:focus,.usa-button:visited.usa-button-focus,.usa-button-primary:visited:focus,.usa-button-primary:visited.usa-button-focus,button:focus,button.usa-button-focus,[type="button"]:focus,[type="button"].usa-button-focus,[type="submit"]:focus,[type="submit"].usa-button-focus,[type="reset"]:focus,[type="reset"].usa-button-focus,[type="image"]:focus,[type="image"].usa-button-focus{box-shadow:0 0 3px #3e94cf,0 0 7px #3e94cf}.usa-button:active,.usa-button.usa-button-active,.usa-button-primary:active,.usa-button-primary.usa-button-active,.usa-button:visited:active,.usa-button:visited.usa-button-active,.usa-button-primary:visited:active,.usa-button-primary:visited.usa-button-active,button:active,button.usa-button-active,[type="button"]:active,[type="button"].usa-button-active,[type="submit"]:active,[type="submit"].usa-button-active,[type="reset"]:active,[type="reset"].usa-button-active,[type="image"]:active,[type="image"].usa-button-active{background-color:#112e51}.usa-button.usa-button-primary-alt,.usa-button-primary.usa-button-primary-alt,.usa-button:visited.usa-button-primary-alt,.usa-button-primary:visited.usa-button-primary-alt,button.usa-button-primary-alt,[type="button"].usa-button-primary-alt,[type="submit"].usa-button-primary-alt,[type="reset"].usa-button-primary-alt,[type="image"].usa-button-primary-alt{background-color:#02bfe7;color:#212121}.usa-button.usa-button-primary-alt:hover,.usa-button.usa-button-primary-alt.usa-button-hover,.usa-button-primary.usa-button-primary-alt:hover,.usa-button-primary.usa-button-primary-alt.usa-button-hover,.usa-button:visited.usa-button-primary-alt:hover,.usa-button:visited.usa-button-primary-alt.usa-button-hover,.usa-button-primary:visited.usa-button-primary-alt:hover,.usa-button-primary:visited.usa-button-primary-alt.usa-button-hover,button.usa-button-primary-alt:hover,button.usa-button-primary-alt.usa-button-hover,[type="button"].usa-button-primary-alt:hover,[type="button"].usa-button-primary-alt.usa-button-hover,[type="submit"].usa-button-primary-alt:hover,[type="submit"].usa-button-primary-alt.usa-button-hover,[type="reset"].usa-button-primary-alt:hover,[type="reset"].usa-button-primary-alt.usa-button-hover,[type="image"].usa-button-primary-alt:hover,[type="image"].usa-button-primary-alt.usa-button-hover{background-color:#00a6d2}.usa-button.usa-button-primary-alt:active,.usa-button.usa-button-primary-alt.usa-button-active,.usa-button-primary.usa-button-primary-alt:active,.usa-button-primary.usa-button-primary-alt.usa-button-active,.usa-button:visited.usa-button-primary-alt:active,.usa-button:visited.usa-button-primary-alt.usa-button-active,.usa-button-primary:visited.usa-button-primary-alt:active,.usa-button-primary:visited.usa-button-primary-alt.usa-button-active,button.usa-button-primary-alt:active,button.usa-button-primary-alt.usa-button-active,[type="button"].usa-button-primary-alt:active,[type="button"].usa-button-primary-alt.usa-button-active,[type="submit"].usa-button-primary-alt:active,[type="submit"].usa-button-primary-alt.usa-button-active,[type="reset"].usa-button-primary-alt:active,[type="reset"].usa-button-primary-alt.usa-button-active,[type="image"].usa-button-primary-alt:active,[type="image"].usa-button-primary-alt.usa-button-active{background-color:#046b99;color:#fff}.usa-button.usa-button-secondary,.usa-button-primary.usa-button-secondary,.usa-button:visited.usa-button-secondary,.usa-button-primary:visited.usa-button-secondary,button.usa-button-secondary,[type="button"].usa-button-secondary,[type="submit"].usa-button-secondary,[type="reset"].usa-button-secondary,[type="image"].usa-button-secondary{background-color:#e31c3d}.usa-button.usa-button-secondary:hover,.usa-button.usa-button-secondary.usa-button-hover,.usa-button-primary.usa-button-secondary:hover,.usa-button-primary.usa-button-secondary.usa-button-hover,.usa-button:visited.usa-button-secondary:hover,.usa-button:visited.usa-button-secondary.usa-button-hover,.usa-button-primary:visited.usa-button-secondary:hover,.usa-button-primary:visited.usa-button-secondary.usa-button-hover,button.usa-button-secondary:hover,button.usa-button-secondary.usa-button-hover,[type="button"].usa-button-secondary:hover,[type="button"].usa-button-secondary.usa-button-hover,[type="submit"].usa-button-secondary:hover,[type="submit"].usa-button-secondary.usa-button-hover,[type="reset"].usa-button-secondary:hover,[type="reset"].usa-button-secondary.usa-button-hover,[type="image"].usa-button-secondary:hover,[type="image"].usa-button-secondary.usa-button-hover{background-color:#cd2026}.usa-button.usa-button-secondary:active,.usa-button.usa-button-secondary.usa-button-active,.usa-button-primary.usa-button-secondary:active,.usa-button-primary.usa-button-secondary.usa-button-active,.usa-button:visited.usa-button-secondary:active,.usa-button:visited.usa-button-secondary.usa-button-active,.usa-button-primary:visited.usa-button-secondary:active,.usa-button-primary:visited.usa-button-secondary.usa-button-active,button.usa-button-secondary:active,button.usa-button-secondary.usa-button-active,[type="button"].usa-button-secondary:active,[type="button"].usa-button-secondary.usa-button-active,[type="submit"].usa-button-secondary:active,[type="submit"].usa-button-secondary.usa-button-active,[type="reset"].usa-button-secondary:active,[type="reset"].usa-button-secondary.usa-button-active,[type="image"].usa-button-secondary:active,[type="image"].usa-button-secondary.usa-button-active{background-color:#981b1e}.usa-button.usa-button-gray,.usa-button-primary.usa-button-gray,.usa-button:visited.usa-button-gray,.usa-button-primary:visited.usa-button-gray,button.usa-button-gray,[type="button"].usa-button-gray,[type="submit"].usa-button-gray,[type="reset"].usa-button-gray,[type="image"].usa-button-gray{background-color:#5b616b}.usa-button.usa-button-gray:hover,.usa-button.usa-button-gray.usa-button-hover,.usa-button-primary.usa-button-gray:hover,.usa-button-primary.usa-button-gray.usa-button-hover,.usa-button:visited.usa-button-gray:hover,.usa-button:visited.usa-button-gray.usa-button-hover,.usa-button-primary:visited.usa-button-gray:hover,.usa-button-primary:visited.usa-button-gray.usa-button-hover,button.usa-button-gray:hover,button.usa-button-gray.usa-button-hover,[type="button"].usa-button-gray:hover,[type="button"].usa-button-gray.usa-button-hover,[type="submit"].usa-button-gray:hover,[type="submit"].usa-button-gray.usa-button-hover,[type="reset"].usa-button-gray:hover,[type="reset"].usa-button-gray.usa-button-hover,[type="image"].usa-button-gray:hover,[type="image"].usa-button-gray.usa-button-hover{background-color:#323a45}.usa-button.usa-button-gray:active,.usa-button.usa-button-gray.usa-button-active,.usa-button-primary.usa-button-gray:active,.usa-button-primary.usa-button-gray.usa-button-active,.usa-button:visited.usa-button-gray:active,.usa-button:visited.usa-button-gray.usa-button-active,.usa-button-primary:visited.usa-button-gray:active,.usa-button-primary:visited.usa-button-gray.usa-button-active,button.usa-button-gray:active,button.usa-button-gray.usa-button-active,[type="button"].usa-button-gray:active,[type="button"].usa-button-gray.usa-button-active,[type="submit"].usa-button-gray:active,[type="submit"].usa-button-gray.usa-button-active,[type="reset"].usa-button-gray:active,[type="reset"].usa-button-gray.usa-button-active,[type="image"].usa-button-gray:active,[type="image"].usa-button-gray.usa-button-active{background-color:#212121}.usa-button.usa-button-outline,.usa-button-primary.usa-button-outline,.usa-button:visited.usa-button-outline,.usa-button-primary:visited.usa-button-outline,button.usa-button-outline,[type="button"].usa-button-outline,[type="submit"].usa-button-outline,[type="reset"].usa-button-outline,[type="image"].usa-button-outline{background-color:#fff;box-shadow:inset 0 0 0 2px #0071bc;color:#0071bc}.usa-button.usa-button-outline:hover,.usa-button.usa-button-outline.usa-button-hover,.usa-button-primary.usa-button-outline:hover,.usa-button-primary.usa-button-outline.usa-button-hover,.usa-button:visited.usa-button-outline:hover,.usa-button:visited.usa-button-outline.usa-button-hover,.usa-button-primary:visited.usa-button-outline:hover,.usa-button-primary:visited.usa-button-outline.usa-button-hover,button.usa-button-outline:hover,button.usa-button-outline.usa-button-hover,[type="button"].usa-button-outline:hover,[type="button"].usa-button-outline.usa-button-hover,[type="submit"].usa-button-outline:hover,[type="submit"].usa-button-outline.usa-button-hover,[type="reset"].usa-button-outline:hover,[type="reset"].usa-button-outline.usa-button-hover,[type="image"].usa-button-outline:hover,[type="image"].usa-button-outline.usa-button-hover{box-shadow:inset 0 0 0 2px #205493;color:#205493}.usa-button.usa-button-outline:active,.usa-button.usa-button-outline.usa-button-active,.usa-button-primary.usa-button-outline:active,.usa-button-primary.usa-button-outline.usa-button-active,.usa-button:visited.usa-button-outline:active,.usa-button:visited.usa-button-outline.usa-button-active,.usa-button-primary:visited.usa-button-outline:active,.usa-button-primary:visited.usa-button-outline.usa-button-active,button.usa-button-outline:active,button.usa-button-outline.usa-button-active,[type="button"].usa-button-outline:active,[type="button"].usa-button-outline.usa-button-active,[type="submit"].usa-button-outline:active,[type="submit"].usa-button-outline.usa-button-active,[type="reset"].usa-button-outline:active,[type="reset"].usa-button-outline.usa-button-active,[type="image"].usa-button-outline:active,[type="image"].usa-button-outline.usa-button-active{box-shadow:inset 0 0 0 2px #112e51;color:#112e51}.usa-button.usa-button-outline:focus,.usa-button.usa-button-outline.usa-button-focus,.usa-button-primary.usa-button-outline:focus,.usa-button-primary.usa-button-outline.usa-button-focus,.usa-button:visited.usa-button-outline:focus,.usa-button:visited.usa-button-outline.usa-button-focus,.usa-button-primary:visited.usa-button-outline:focus,.usa-button-primary:visited.usa-button-outline.usa-button-focus,button.usa-button-outline:focus,button.usa-button-outline.usa-button-focus,[type="button"].usa-button-outline:focus,[type="button"].usa-button-outline.usa-button-focus,[type="submit"].usa-button-outline:focus,[type="submit"].usa-button-outline.usa-button-focus,[type="reset"].usa-button-outline:focus,[type="reset"].usa-button-outline.usa-button-focus,[type="image"].usa-button-outline:focus,[type="image"].usa-button-outline.usa-button-focus{box-shadow:inset 0 0 0 2px #112e51,0 0 3px #3e94cf,0 0 7px #3e94cf}.usa-button.usa-button-outline-inverse,.usa-button-primary.usa-button-outline-inverse,.usa-button:visited.usa-button-outline-inverse,.usa-button-primary:visited.usa-button-outline-inverse,button.usa-button-outline-inverse,[type="button"].usa-button-outline-inverse,[type="submit"].usa-button-outline-inverse,[type="reset"].usa-button-outline-inverse,[type="image"].usa-button-outline-inverse{background:transparent;box-shadow:inset 0 0 0 2px #fff;color:#fff}.usa-button.usa-button-outline-inverse:hover,.usa-button.usa-button-outline-inverse.usa-button-hover,.usa-button-primary.usa-button-outline-inverse:hover,.usa-button-primary.usa-button-outline-inverse.usa-button-hover,.usa-button:visited.usa-button-outline-inverse:hover,.usa-button:visited.usa-button-outline-inverse.usa-button-hover,.usa-button-primary:visited.usa-button-outline-inverse:hover,.usa-button-primary:visited.usa-button-outline-inverse.usa-button-hover,button.usa-button-outline-inverse:hover,button.usa-button-outline-inverse.usa-button-hover,[type="button"].usa-button-outline-inverse:hover,[type="button"].usa-button-outline-inverse.usa-button-hover,[type="submit"].usa-button-outline-inverse:hover,[type="submit"].usa-button-outline-inverse.usa-button-hover,[type="reset"].usa-button-outline-inverse:hover,[type="reset"].usa-button-outline-inverse.usa-button-hover,[type="image"].usa-button-outline-inverse:hover,[type="image"].usa-button-outline-inverse.usa-button-hover{box-shadow:inset 0 0 0 2px #d6d7d9;color:#d6d7d9}.usa-button.usa-button-outline-inverse:active,.usa-button.usa-button-outline-inverse.usa-button-active,.usa-button-primary.usa-button-outline-inverse:active,.usa-button-primary.usa-button-outline-inverse.usa-button-active,.usa-button:visited.usa-button-outline-inverse:active,.usa-button:visited.usa-button-outline-inverse.usa-button-active,.usa-button-primary:visited.usa-button-outline-inverse:active,.usa-button-primary:visited.usa-button-outline-inverse.usa-button-active,button.usa-button-outline-inverse:active,button.usa-button-outline-inverse.usa-button-active,[type="button"].usa-button-outline-inverse:active,[type="button"].usa-button-outline-inverse.usa-button-active,[type="submit"].usa-button-outline-inverse:active,[type="submit"].usa-button-outline-inverse.usa-button-active,[type="reset"].usa-button-outline-inverse:active,[type="reset"].usa-button-outline-inverse.usa-button-active,[type="image"].usa-button-outline-inverse:active,[type="image"].usa-button-outline-inverse.usa-button-active{box-shadow:inset 0 0 0 2px #aeb0b5;color:#d6d7d9}.usa-button.usa-button-outline-inverse:focus,.usa-button.usa-button-outline-inverse.usa-button-focus,.usa-button-primary.usa-button-outline-inverse:focus,.usa-button-primary.usa-button-outline-inverse.usa-button-focus,.usa-button:visited.usa-button-outline-inverse:focus,.usa-button:visited.usa-button-outline-inverse.usa-button-focus,.usa-button-primary:visited.usa-button-outline-inverse:focus,.usa-button-primary:visited.usa-button-outline-inverse.usa-button-focus,button.usa-button-outline-inverse:focus,button.usa-button-outline-inverse.usa-button-focus,[type="button"].usa-button-outline-inverse:focus,[type="button"].usa-button-outline-inverse.usa-button-focus,[type="submit"].usa-button-outline-inverse:focus,[type="submit"].usa-button-outline-inverse.usa-button-focus,[type="reset"].usa-button-outline-inverse:focus,[type="reset"].usa-button-outline-inverse.usa-button-focus,[type="image"].usa-button-outline-inverse:focus,[type="image"].usa-button-outline-inverse.usa-button-focus{box-shadow:inset 0 0 0 2px #aeb0b5,0 0 3px #3e94cf,0 0 7px #3e94cf}.usa-button.usa-button-big,.usa-button-primary.usa-button-big,.usa-button:visited.usa-button-big,.usa-button-primary:visited.usa-button-big,button.usa-button-big,[type="button"].usa-button-big,[type="submit"].usa-button-big,[type="reset"].usa-button-big,[type="image"].usa-button-big{font-size:1.9rem;padding:1.5rem 3rem}[type="submit"]:disabled,.usa-button-disabled{background-color:#d6d7d9;color:#323a45;pointer-events:none}[type="submit"]:disabled:hover,[type="submit"]:disabled.usa-button-hover,[type="submit"]:disabled:active,[type="submit"]:disabled.usa-button-active,[type="submit"]:disabled:focus,.usa-button-disabled:hover,.usa-button-disabled.usa-button-hover,.usa-button-disabled:active,.usa-button-disabled.usa-button-active,.usa-button-disabled:focus{background-color:#d6d7d9;border:0;box-shadow:none;color:#323a45}.usa-button-unstyled{background-color:transparent;border:0;border-radius:0;font-weight:400;margin:0;outline:0;padding:0;text-align:left;-webkit-font-smoothing:auto}.usa-button-unstyled:hover{background-color:transparent}img{max-width:100%}.media_link{display:inline-block;line-height:0}input,textarea,select{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:1px solid #5b616b;border-radius:0;box-sizing:border-box;color:#212121;display:block;font-size:1.7rem;height:4.4rem;line-height:1.3;margin:0.2em 0;max-width:46rem;outline:none;padding:1rem 0.7em;width:100%}input:focus,input.usa-input-focus,textarea:focus,textarea.usa-input-focus,select:focus,select.usa-input-focus{box-shadow:0 0 3px #3e94cf,0 0 7px #3e94cf}input.usa-input-success,textarea.usa-input-success,select.usa-input-success{border:3px solid #4aa564}.usa-input-error{border-left:4px solid #cd2026;margin-top:3rem;padding-bottom:0.8rem;padding-left:1.5rem;padding-top:0.8rem;position:relative;right:1.9rem}.usa-input-error input,.usa-input-error textarea,.usa-input-error select{border:3px solid #cd2026;width:calc(100% + 1.9rem)}.usa-input-error label{margin-top:0}.usa-input-error .usa-input-inline{border:1px solid #5b616b;width:inherit}.usa-input-error .usa-input-inline-error{border:3px solid #cd2026}.usa-input-error-label{display:block;font-size:1.7rem;font-weight:700}.usa-input-error-message{color:#cd2026;display:block;font-size:1.7rem;font-weight:700;padding-bottom:3px;padding-top:3px}.usa-input-required:after{color:#981b1e;content:' (*Required)'}label{display:block;margin-top:3rem;max-width:46rem}textarea{height:16rem}select{-moz-appearance:none;-webkit-appearance:none;appearance:none;background-color:#fff;background-image:url("../img/arrow-down.png");background-image:url("../img/arrow-down.svg");background-position:right 1.3rem center;background-repeat:no-repeat;background-size:1.3rem}legend{font-size:3rem;font-weight:700}.usa-fieldset-inputs label{margin-top:0}.usa-form-hint{color:#757575;font-family:"Source Sans Pro","Helvetica Neue","Helvetica","Roboto","Arial",sans-serif;margin-bottom:0}[type="checkbox"],[type="radio"]{margin-left:-2rem;opacity:0;position:absolute}.lt-ie9 [type="checkbox"],.lt-ie9 [type="radio"]{border:0;float:left;margin:0.4em 0.4em 0 0;position:static;width:auto}[type="checkbox"]+label,[type="radio"]+label{cursor:pointer;font-weight:400;margin-bottom:0.5em}[type="checkbox"]+label::before,[type="radio"]+label::before{background:#fff;border-radius:.3rem;box-shadow:0 0 0 1px #757575;content:'\a0';display:inline-block;height:1.8rem;line-height:1.8rem;margin-right:0.6em;text-indent:0.15em;vertical-align:middle\0;width:1.8rem}[type="radio"]+label::before{box-shadow:0 0 0 2px #fff,0 0 0 3px #757575;height:1.6rem;line-height:1.6rem;width:1.6rem;border-radius:100%}[type="checkbox"]:checked+label::before,[type="radio"]:checked+label::before{background-color:#0071bc;box-shadow:0 0 0 1px #0071bc}[type="radio"]:checked+label::before{box-shadow:0 0 0 2px #fff,0 0 0 4px #0071bc}[type="radio"]:focus+label::before{box-shadow:0 0 0 2px #fff,0 0 0 4px #0071bc,0 0 3px 4px #3e94cf,0 0 7px 4px #3e94cf}[type="checkbox"]:checked+label::before{background-image:url("../img/correct8.png");background-image:url("../img/correct8.svg");background-position:50%;background-repeat:no-repeat}[type="checkbox"]:focus+label::before{box-shadow:0 0 0 1px #fff,0 0 0 3px #0071bc}[type="checkbox"]:disabled+label{color:#5b616b}[type="checkbox"]:disabled+label::before,[type="radio"]:disabled+label::before{background:#d6d7d9;box-shadow:0 0 0 1px #aeb0b5;cursor:not-allowed}[type=range]{-webkit-appearance:none;border:none;padding-left:0;width:100%}[type=range]:focus{box-shadow:none;outline:none}[type=range]::-webkit-slider-runnable-track{background:#aeb0b5;border:1px solid #757575;cursor:pointer;height:1.2rem;width:100%}[type=range]::-moz-range-track{background:#0071bc;border:1px solid #757575;cursor:pointer;height:1.2rem;width:100%}[type=range]::-ms-track{background:transparent;color:transparent;cursor:pointer;height:1.2rem;width:100%}[type=range]::-webkit-slider-thumb{-webkit-appearance:none;border:1px solid #757575;height:2.2rem;border-radius:1.5rem;background:#f1f1f1;cursor:pointer;margin-top:-.65rem;width:2.2rem}[type=range]::-moz-range-thumb{background:#f1f1f1;border:1px solid #757575;border-radius:1.5rem;cursor:pointer;height:2.2rem;width:2.2rem}[type=range]::-ms-thumb{background:#f1f1f1;border:1px solid #757575;border-radius:1.5rem;cursor:pointer;height:2.2rem;width:2.2rem}[type=range]::-ms-fill-lower{background:#aeb0b5;border:1px solid #757575;border-radius:2rem}[type=range]::-ms-fill-upper{background:#aeb0b5;border:1px solid #757575;border-radius:2rem}[type=range]:focus::-webkit-slider-thumb{border:2px solid #3e94cf}[type=range]:focus::-moz-range-thumb{border:2px solid #3e94cf}[type=range]:focus::-ms-thumb{border:2px solid #3e94cf}.usa-date-of-birth label{margin-top:0}.usa-date-of-birth [type=number]::-webkit-inner-spin-button,.usa-date-of-birth [type=number]::-webkit-outer-spin-button{-webkit-appearance:none;appearance:none;margin:0}.usa-date-of-birth [type=number]{-moz-appearance:textfield}.usa-form-group-day,.usa-form-group-month,.usa-form-group-year{clear:none;float:left;margin-right:1.5rem;width:5rem}.usa-form-group-year{width:7rem}.usa-label,.usa-label-big{background-color:#0071bc;border-radius:.3rem;color:#fff;font-size:1.5rem;margin-right:0.5rem;padding:0.1rem 0.7rem;text-transform:uppercase}.usa-label:only-of-type,.usa-label-big:only-of-type{margin-right:0}.usa-label-big{font-size:1.7rem;padding-left:0.9rem;padding-right:0.9rem}ul,ol{margin-top:1em;margin-bottom:1em;padding-left:1.94em}li{line-height:1.5;margin-bottom:0.5em}li:last-child{margin-bottom:0}h1+ul,h1+ol,h2+ul,h2+ol,h3+ul,h3+ol,h4+ul,h4+ol,h5+ul,h5+ol,h6+ul,h6+ol,p+ul,p+ol{margin-top:0}.usa-unstyled-list{margin-top:0;margin-bottom:0;list-style-type:none;padding-left:0}.usa-unstyled-list>li{margin-bottom:0}table{border-spacing:0;margin:2em 0;min-width:100%}table thead th,table thead td{background-color:#f1f1f1}table th{text-align:left}table tbody th{font-weight:400}table th,table td{background-color:#fff;border:1px solid #5b616b;padding:1.5rem}.usa-table-borderless thead tr{background-color:transparent}.usa-table-borderless thead th{border-top:0}.usa-table-borderless th,.usa-table-borderless td{border-left:0;border-right:0}html{font-family:"Source Sans Pro","Helvetica Neue","Helvetica","Roboto","Arial",sans-serif;font-size:10px}body{font-size:1.7rem}p{line-height:1.5;margin-bottom:1em;margin-top:1em}a{color:#0071bc;text-decoration:underline}a:hover,a:active{color:#205493}a:visited{color:#4c2c92}a:focus{box-shadow:0 0 3px #3e94cf,0 0 7px #3e94cf;outline:0}.usa-external_link::after{background:url("../img/external-link.png") no-repeat 0 0;background:url("../img/external-link.svg") no-repeat 0 0;background-size:100%;content:'';display:inline-block;height:0.65em;margin-bottom:-1px;margin-left:4px;width:0.65em}.usa-external_link:hover::after{background-image:url("../img/external-link-hover.png");background-image:url("../img/external-link-hover.svg")}.usa-external_link-alt::after{background:url("../img/external-link-alt.png") no-repeat 0 0;background:url("../img/external-link-alt.svg") no-repeat 0 0;background-size:100%;content:'';display:inline-block;height:0.65em;margin-bottom:-1px;margin-left:4px;width:0.65em}.usa-external_link-alt:hover::after{background-image:url("../img/external-link-alt-hover.png");background-image:url("../img/external-link-alt-hover.svg")}h1,h2,h3,h4,h5,h6{clear:both;font-family:"Merriweather","Georgia","Cambria","Times New Roman","Times",serif;line-height:1.3;margin-bottom:.5em;margin-top:1.5em}h1{font-size:4rem;font-weight:700}h2{font-size:3rem;font-weight:700}h3{font-size:2rem;font-weight:700}h4{font-size:1.7rem;font-weight:700}h5{font-size:1.5rem;font-weight:700}h6{font-family:"Source Sans Pro","Helvetica Neue","Helvetica","Roboto","Arial",sans-serif;font-size:1.3rem;font-weight:400;text-transform:uppercase}cite,var,address,dfn{font-style:normal}.usa-content p:not(.usa-font-lead){max-width:53rem}.usa-content-list{max-width:53rem}.usa-sans p,.usa-sans a,.usa-sans li,.usa-sans span{font-family:"Source Sans Pro","Helvetica Neue","Helvetica","Roboto","Arial",sans-serif}.usa-sans a{border-bottom:none;font-weight:700}.usa-serif p,.usa-serif a,.usa-serif li,.usa-serif span{font-family:"Merriweather","Georgia","Cambria","Times New Roman","Times",serif}.usa-display{font-size:2rem;font-weight:700;margin-bottom:0}@media screen and (min-width: 481px){.usa-display{font-size:4rem;font-weight:700}}@media screen and (min-width: 600px){.usa-display{font-size:5.2rem;font-weight:700}}.usa-font-lead{font-family:"Merriweather","Georgia","Cambria","Times New Roman","Times",serif;font-size:2rem;line-height:1.7;max-width:77rem}.usa-image-block{position:relative}.usa-image-text-block{color:#fff;left:0;margin-left:8%;position:absolute;top:0}.usa-image-text{margin-top:0}.usa-drop_text{margin-bottom:0}.usa-background-dark{background-color:#323a45}.usa-background-dark p,.usa-background-dark span{color:#fff}.usa-background-dark a{color:#d6d7d9}.usa-background-dark a:hover{color:#fff}.usa-text-small{font-size:1.3rem;margin-top:0}.usa-section>:first-child,.usa-grid>:first-child{margin-top:0}.usa-section>:last-child,.usa-grid>:last-child{margin-bottom:0}.usa-width-one-whole:first-child>:first-child,.usa-width-one-half:first-child>:first-child,.usa-width-one-third:first-child>:first-child,.usa-width-two-thirds:first-child>:first-child,.usa-width-one-fourth:first-child>:first-child,.usa-width-three-fourths:first-child>:first-child,.usa-width-one-sixth:first-child>:first-child,.usa-width-five-sixths:first-child>:first-child,.usa-width-one-twelfth:first-child>:first-child{margin-top:0}@media screen and (min-width: 600px){.usa-width-one-whole>:first-child,.usa-width-one-half>:first-child,.usa-width-one-third>:first-child,.usa-width-two-thirds>:first-child,.usa-width-one-fourth>:first-child,.usa-width-three-fourths>:first-child,.usa-width-one-sixth>:first-child,.usa-width-five-sixths>:first-child,.usa-width-one-twelfth>:first-child{margin-top:0}}.usa-width-one-whole:last-child>:last-child,.usa-width-one-half:last-child>:last-child,.usa-width-one-third:last-child>:last-child,.usa-width-two-thirds:last-child>:last-child,.usa-width-one-fourth:last-child>:last-child,.usa-width-three-fourths:last-child>:last-child,.usa-width-one-sixth:last-child>:last-child,.usa-width-five-sixths:last-child>:last-child,.usa-width-one-twelfth:last-child>:last-child{margin-bottom:0}@media screen and (min-width: 600px){.usa-width-one-whole>:last-child,.usa-width-one-half>:last-child,.usa-width-one-third>:last-child,.usa-width-two-thirds>:last-child,.usa-width-one-fourth>:last-child,.usa-width-three-fourths>:last-child,.usa-width-one-sixth>:last-child,.usa-width-five-sixths>:last-child,.usa-width-one-twelfth>:last-child{margin-bottom:0}}.usa-accordion,.usa-accordion-bordered{margin-top:0;margin-bottom:0;list-style-type:none;padding-left:0;color:#212121;margin:0;padding:0;width:100%}.usa-accordion>li,.usa-accordion-bordered>li{margin-bottom:0}.usa-accordion+.usa-accordion,.usa-accordion+.usa-accordion-bordered,.usa-accordion-bordered+.usa-accordion,.usa-accordion-bordered+.usa-accordion-bordered{margin-top:1rem}.usa-accordion>ul,.usa-accordion-bordered>ul{margin-top:0;margin-bottom:0;list-style-type:none;padding-left:0;color:#212121;margin:0;padding:0;width:100%}.usa-accordion>ul>li,.usa-accordion-bordered>ul>li{margin-bottom:0}.usa-accordion>ul>li,.usa-accordion-bordered>ul>li{background-color:#f1f1f1;font-family:"Source Sans Pro","Helvetica Neue","Helvetica","Roboto","Arial",sans-serif;list-style:none;margin-bottom:6px;width:100%}.usa-accordion>ul button,.usa-accordion-bordered>ul button{background-color:transparent;border:0;border-radius:0;font-weight:400;margin:0;outline:0;padding:0;text-align:left;-webkit-font-smoothing:auto;background-color:#f1f1f1;background-image:url("../img/minus.png");background-image:url("../img/minus.svg");background-position:right 3rem center;background-repeat:no-repeat;background-size:13px;color:#212121;cursor:pointer;display:inline-block;font-family:"Source Sans Pro","Helvetica Neue","Helvetica","Roboto","Arial",sans-serif;font-weight:700;margin:0;padding:1.5rem 5.5rem 1.5rem 3rem;width:100%}.usa-accordion>ul button:hover,.usa-accordion-bordered>ul button:hover{background-color:transparent}.usa-accordion>ul button:focus,.usa-accordion-bordered>ul button:focus{box-shadow:0 0 3px #3e94cf,0 0 7px #3e94cf}.usa-accordion>ul button:hover,.usa-accordion-bordered>ul button:hover{background-color:#d6d7d9;color:#212121}.usa-accordion>ul button h1,.usa-accordion>ul button h2,.usa-accordion>ul button h3,.usa-accordion>ul button h4,.usa-accordion>ul button h5,.usa-accordion>ul button h6,.usa-accordion-bordered>ul button h1,.usa-accordion-bordered>ul button h2,.usa-accordion-bordered>ul button h3,.usa-accordion-bordered>ul button h4,.usa-accordion-bordered>ul button h5,.usa-accordion-bordered>ul button h6{margin:0}.usa-accordion>ul [aria-expanded=false],.usa-accordion-bordered>ul [aria-expanded=false]{background-image:url("../img/plus.png");background-image:url("../img/plus.svg");background-repeat:no-repeat;background-size:1.3rem}.usa-accordion>li,.usa-accordion-bordered>li{background-color:#f1f1f1;font-family:"Source Sans Pro","Helvetica Neue","Helvetica","Roboto","Arial",sans-serif;list-style:none;margin-bottom:6px;width:100%}.usa-accordion-bordered .usa-accordion-content{border-bottom:3px solid #f1f1f1;border-left:3px solid #f1f1f1;border-right:3px solid #f1f1f1}.usa-accordion-content{background-color:#fff;overflow:auto;padding:3rem}.usa-accordion-content>*:first-child{margin-top:0}.usa-accordion-content>*:last-child{margin-bottom:0}.usa-accordion-content:not([aria-hidden]){position:absolute;left:-999em}.usa-accordion-content[aria-hidden=true]{display:none}.usa-accordion-button{background-color:transparent;border:0;border-radius:0;font-weight:400;margin:0;outline:0;padding:0;text-align:left;-webkit-font-smoothing:auto;background-color:#f1f1f1;background-image:url("../img/minus.png");background-image:url("../img/minus.svg");background-position:right 3rem center;background-repeat:no-repeat;background-size:13px;color:#212121;cursor:pointer;display:inline-block;font-family:"Source Sans Pro","Helvetica Neue","Helvetica","Roboto","Arial",sans-serif;font-weight:700;margin:0;padding:1.5rem 5.5rem 1.5rem 3rem;width:100%}.usa-accordion-button:hover{background-color:transparent}.usa-accordion-button:focus{box-shadow:0 0 3px #3e94cf,0 0 7px #3e94cf}.usa-accordion-button:hover{background-color:#d6d7d9;color:#212121}.usa-accordion-button h1,.usa-accordion-button h2,.usa-accordion-button h3,.usa-accordion-button h4,.usa-accordion-button h5,.usa-accordion-button h6{margin:0}.usa-accordion-button[aria-expanded=false]{background-image:url("../img/plus.png");background-image:url("../img/plus.svg");background-repeat:no-repeat;background-size:1.3rem}.usa-alert{background-color:#f1f1f1;background-position:1rem 2rem;background-repeat:no-repeat;background-size:4rem;margin-top:1.5em;padding:1em}@media screen and (min-width: 600px){.usa-alert{background-size:5.2rem}}.usa-alert ul{margin-bottom:0;margin-top:1em}.usa-alert-icon{display:table-cell;padding-right:1rem}.usa-alert-body{display:table-cell;padding-left:3.5rem;vertical-align:top}@media screen and (min-width: 600px){.usa-alert-body{padding-left:5rem}}.usa-alert-body p:first-child{margin-top:0.8rem}.usa-alert-heading{margin-bottom:.3rem;margin-top:0}@media screen and (min-width: 600px){.usa-alert-heading{margin-top:.3rem}}.usa-alert-text{font-family:"Source Sans Pro","Helvetica Neue","Helvetica","Roboto","Arial",sans-serif;margin-bottom:0;margin-top:0}.usa-alert-success{background-color:#e7f4e4;background-image:url("../img/alerts/success.png");background-image:url("../img/alerts/success.svg")}.usa-alert-warning{background-color:#fff1d2;background-image:url("../img/alerts/warning.png");background-image:url("../img/alerts/warning.svg")}.usa-alert-error{background-color:#f9dede;background-image:url("../img/alerts/error.png");background-image:url("../img/alerts/error.svg")}.usa-alert-info{background-color:#e1f3f8;background-image:url("../img/alerts/info.png");background-image:url("../img/alerts/info.svg")}.usa-alert-no_icon{background-image:none}.usa-banner{background-color:#f1f1f1;padding-bottom:0.7rem}@media screen and (min-width: 481px){.usa-banner{font-size:1.3rem;padding-bottom:0}}.usa-banner-content{padding-right:1.5rem;padding-bottom:3px;padding-left:1.5rem;background-color:transparent;font-size:1.5rem;padding-top:2rem;width:100%}@media screen and (min-width: 600px){.usa-banner-content{padding-bottom:2.3rem;padding-top:4rem}}@media screen and (min-width: 951px){.usa-banner-content{padding-right:3rem;padding-left:3rem}}.usa-banner-content p:first-child{margin-top:1rem}@media screen and (min-width: 600px){.usa-banner-content p:first-child{margin-top:0}}.usa-banner-inner{max-width:1200px;margin-left:auto;margin-right:auto;padding-right:1.5rem;padding-left:1.5rem;max-width:1040px}.usa-banner-inner::after{clear:both;content:"";display:block}@media screen and (min-width: 951px){.usa-banner-inner{padding-right:3rem;padding-left:3rem}}.usa-banner-header{padding-top:.55rem;padding-bottom:.55rem;font-size:1.2rem;font-weight:400}@media screen and (min-width: 481px){.usa-banner-header{padding-top:0;padding-bottom:0}}.usa-banner-header p{margin-top:0;margin-bottom:0;display:inline;overflow:hidden;vertical-align:middle}@media screen and (min-width: 481px){.usa-banner-header p{margin-top:2px;margin-bottom:2px;display:inline-block}}.usa-banner-header img{float:left;margin-right:1rem;margin-top:1px;width:2.4rem}@media screen and (min-width: 481px){.usa-banner-header img{margin-right:0.7rem;width:2rem}}.usa-banner-header-expanded{-webkit-box-align:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #aeb0b5;display:-webkit-box;display:-ms-flexbox;display:flex;font-size:1.5rem;min-height:5.6rem;padding-right:3rem}@media screen and (min-width: 481px){.usa-banner-header-expanded{border-bottom:none;display:block;font-size:1.2rem;font-weight:400;min-height:0;padding-right:0}}.usa-banner-header-expanded>.usa-banner-inner{margin-left:0}@media screen and (min-width: 481px){.usa-banner-header-expanded>.usa-banner-inner{margin-left:auto}}.usa-banner-header-expanded img{margin-right:2.4rem}@media screen and (min-width: 481px){.usa-banner-header-expanded img{margin-right:0.7rem}}.usa-banner-header-expanded p{line-height:1.3;vertical-align:top}@media screen and (min-width: 481px){.usa-banner-header-expanded p{line-height:1.5;vertical-align:middle}}.usa-banner-button{background-color:transparent;border:0;border-radius:0;font-weight:400;margin:0;outline:0;padding:0;text-align:left;-webkit-font-smoothing:auto;padding-top:1.3rem;padding-left:4.8rem;background-position-x:right;color:#0071bc;display:block;font-size:1.2rem;height:4.3rem;left:0;position:absolute;text-decoration:underline;top:0;width:100%}.usa-banner-button:hover{background-color:transparent}@media screen and (min-width: 481px){.usa-banner-button{padding-top:0;padding-left:0;display:inline;height:initial;margin-left:3px;position:relative;vertical-align:middle;width:initial}}.usa-banner-button:hover{color:#205493;text-decoration:underline}.usa-banner-button[aria-expanded=false]{background-image:none}.usa-banner-button[aria-expanded=false]::after{background-image:url(../img/angle-arrow-down-primary.png);background-image:url(../img/angle-arrow-down-primary.svg);background-size:100%;content:'';display:inline-block;height:1rem;width:1rem;margin-left:0}.usa-banner-button[aria-expanded=false]:hover::after{background-image:url(../img/angle-arrow-down-primary-hover.png);background-image:url(../img/angle-arrow-down-primary-hover.svg)}.usa-banner-button[aria-expanded=false]::after{background-position-y:1px}.usa-banner-button[aria-expanded=true]{background-image:none;height:5.6rem}.usa-banner-button[aria-expanded=true]::after{background-image:url(../img/close.png);background-image:url(../img/close.svg);background-size:100%;content:'';display:inline-block;height:1.3rem;width:1.3rem;margin-left:0}@media screen and (min-width: 481px){.usa-banner-button[aria-expanded=true]{height:initial;padding:0;position:relative}.usa-banner-button[aria-expanded=true]::after{background-image:url(../img/angle-arrow-up-primary.png);background-image:url(../img/angle-arrow-up-primary.svg);background-size:100%;content:'';display:inline-block;height:1rem;width:1rem;margin-left:0}.usa-banner-button[aria-expanded=true]:hover::after{background-image:url(../img/angle-arrow-up-primary-hover.png);background-image:url(../img/angle-arrow-up-primary-hover.svg)}.usa-banner-button[aria-expanded=true]::after{background-position-y:1px}}.usa-banner-button[aria-expanded=true]::after{position:absolute;right:1.5rem;top:2.15rem}@media screen and (min-width: 481px){.usa-banner-button[aria-expanded=true]::after{position:static}}.usa-banner-button[aria-expanded=true] .usa-banner-button-text{display:none}@media screen and (min-width: 481px){.usa-banner-button[aria-expanded=true] .usa-banner-button-text{display:inline}}.usa-banner-icon{width:3.8rem}.usa-footer .usa-unstyled-list{display:block}.usa-footer .usa-footer-primary-link{color:#212121;display:block;font-weight:700;margin-top:0;padding-bottom:2rem;padding-top:2rem;text-decoration:none}@media screen and (min-width: 600px){.usa-footer .usa-footer-primary-link{border-top:none}}.usa-footer .usa-footer-primary-link:hover{text-decoration:underline}.usa-footer a{font-weight:normal}.usa-footer-return-to-top{padding-bottom:2rem;padding-top:2rem}.usa-footer-primary-section{background-color:#f1f1f1}.usa-footer-primary-section .usa-footer-primary-content{padding-left:2.5rem;padding-right:2.5rem}@media screen and (min-width: 600px){.usa-footer-primary-section .usa-footer-primary-content{padding-left:0;padding-right:0}}.usa-footer-primary-section .usa-footer-primary-content li{margin-left:1rem}@media screen and (min-width: 600px){.usa-footer-primary-section .usa-footer-primary-content li{margin-left:0}}@media screen and (min-width: 600px){.usa-footer-primary-section .usa-grid-full{padding-left:2.5rem;padding-right:2.5rem}}.usa-footer-medium .usa-footer-primary-section{padding:0}@media screen and (min-width: 600px){.usa-footer-medium .usa-footer-primary-section{padding-bottom:1rem;padding-top:1rem}}@media screen and (min-width: 1201px){.usa-footer-medium .usa-footer-primary-section .usa-footer-primary-content{margin-right:6%;width:inherit}}@media screen and (min-width: 1201px){.usa-footer-medium .usa-footer-primary-section .usa-footer-primary-content:last-child{margin-right:0}}@media screen and (min-width: 600px){.usa-footer-medium .usa-footer-nav ul{-webkit-box-align:center;-ms-flex-align:center;align-items:center}}.usa-footer-slim .usa-footer-nav a{display:block}@media screen and (min-width: 1201px){.usa-footer-slim .usa-footer-nav .usa-footer-primary-content{margin-right:9%;width:inherit}}@media screen and (min-width: 1201px){.usa-footer-slim .usa-footer-nav .usa-footer-primary-content:last-child{margin-right:0}}.usa-footer-slim .usa-footer-primary-section{padding-bottom:2rem}@media screen and (min-width: 600px){.usa-footer-slim .usa-footer-primary-section{padding-bottom:1rem;padding-top:1rem}.usa-footer-slim .usa-footer-primary-section .usa-grid-full{-webkit-box-align:center;-ms-flex-align:center;align-items:center}}@media screen and (min-width: 600px){.usa-footer-slim .usa-footer-contact_info>*{margin:0}}@media screen and (min-width: 600px){.usa-footer-slim .usa-footer-contact_info{padding-top:2rem;padding-bottom:2rem}}@media screen and (min-width: 600px){.usa-footer-slim .usa-footer-contact_info{width:100%}}@media screen and (min-width: 1201px){.usa-footer-slim .usa-footer-contact_info{float:left;display:block;margin-right:2.35765%;width:48.82117%}.usa-footer-slim .usa-footer-contact_info:last-child{margin-right:0}}ul.usa-footer-primary-content,li.usa-footer-primary-content,li.usa-footer-primary-content{border-top:1px solid #212121}@media screen and (min-width: 600px){ul.usa-footer-primary-content,li.usa-footer-primary-content,li.usa-footer-primary-content{border:none}}ul.usa-footer-primary-content:last-child,li.usa-footer-primary-content:last-child,li.usa-footer-primary-content:last-child{border-bottom:1px solid #212121}@media screen and (min-width: 600px){ul.usa-footer-primary-content:last-child,li.usa-footer-primary-content:last-child,li.usa-footer-primary-content:last-child{border-bottom:none}}.usa-sign_up-block{padding-bottom:2rem;padding-left:2.5rem;padding-right:2.5rem}@media screen and (min-width: 600px){.usa-sign_up-block{float:right;padding:0}}.usa-sign_up-block label:first-of-type{margin-top:0}.usa-sign_up-block button{float:none;margin-right:0;margin-top:1.5rem}.usa-sign_up-block input{width:100%}.usa-footer-secondary_section{background-color:#d6d7d9;padding-bottom:3rem;padding-top:3rem}.usa-footer-secondary_section a{color:#212121}@media screen and (min-width: 600px){.usa-footer-big-secondary-section{padding-top:5rem}}@media screen and (min-width: 600px){.usa-footer-contact-links{text-align:right}}.usa-social-links a{text-decoration:none}@media screen and (min-width: 600px){.usa-footer-big .usa-footer-primary-section{padding-bottom:4rem;padding-top:3rem}}.usa-footer-big ul{padding-bottom:2.5rem}@media screen and (min-width: 600px){.usa-footer-big ul{padding-bottom:0}}.usa-footer-big ul:last-child{border-bottom:1px solid #212121}@media screen and (min-width: 600px){.usa-footer-big ul:last-child{border-bottom:none}}.usa-footer-big ul li{line-height:2em}.usa-footer-big ul .usa-footer-primary-link{background-image:url("../img/arrow-down.png");background-image:url("../img/arrow-down.svg");background-position:1.5rem center;background-repeat:no-repeat;background-size:1.3rem;margin-left:0;padding-left:3.5rem}@media screen and (min-width: 600px){.usa-footer-big ul .usa-footer-primary-link{background:none;margin-bottom:.8rem;padding-bottom:0;padding-left:0}}.usa-footer-big ul .usa-footer-primary-link>*{margin-top:0;margin-bottom:0}.usa-footer-big ul.hidden{padding-bottom:0}.usa-footer-big ul.hidden li{display:none}.usa-footer-big ul.hidden .usa-footer-primary-link{background-image:url("../img/arrow-right.png");background-image:url("../img/arrow-right.svg");cursor:pointer;display:block}@media screen and (min-width: 600px){.usa-footer-big ul.hidden .usa-footer-primary-link{background:none;padding-left:0}}.usa-footer-topic{margin:0;padding:2rem 0}@media screen and (min-width: 600px){.usa-sign_up-header{margin:0;padding:2rem 0}}.usa-footer-logo-img{max-width:14rem}.usa-footer-slim-logo-img{float:left;max-width:10rem}.usa-footer-logo-heading{margin-top:2rem}.usa-footer-contact-heading{margin-top:0}@media screen and (min-width: 600px){.usa-footer-contact-heading{margin-top:1rem}}.usa-footer-slim-logo-heading{display:block;padding-top:1rem}@media screen and (min-width: 600px){.usa-footer-slim-logo-heading{display:inline-block;padding-left:1em}}.usa-social_link,.usa-link-facebook,.usa-link-twitter,.usa-link-youtube,.usa-link-rss{margin:2.5rem 1rem 1.5rem 0;background-position:center center;background-repeat:no-repeat;background-size:auto 3rem;display:inline-block;height:4.4rem;left:-1.6rem;position:relative;text-align:center;width:4.4rem}@media screen and (min-width: 600px){.usa-social_link,.usa-link-facebook,.usa-link-twitter,.usa-link-youtube,.usa-link-rss{margin:0 0 0 1rem;left:1.2rem}}.usa-social_link span,.usa-link-facebook span,.usa-link-twitter span,.usa-link-youtube span,.usa-link-rss span{position:absolute;left:-999em}.usa-link-facebook{background-image:url("../img/social-icons/png/facebook25.png");background-image:url("../img/social-icons/svg/facebook25.svg")}.usa-link-twitter{background-image:url("../img/social-icons/png/twitter16.png");background-image:url("../img/social-icons/svg/twitter16.svg")}.usa-link-youtube{background-image:url("../img/social-icons/png/youtube15.png");background-image:url("../img/social-icons/svg/youtube15.svg")}.usa-link-rss{background-image:url("../img/social-icons/png/rss25.png");background-image:url("../img/social-icons/svg/rss25.svg")}form a{border-bottom:0}form [type="submit"],form [type="submit"]{display:block;margin-bottom:1.5em;margin-top:2.5rem}@media screen and (min-width: 600px){form [type="submit"],form [type="submit"]{padding-left:2.7em;padding-right:2.7em;width:auto}}form [name="password"],form [name="confirmPassword"]{margin-bottom:1.1rem}@media screen and (min-width: 600px){.usa-form{max-width:32rem}}.usa-form-note{float:right;font-family:"Source Sans Pro","Helvetica Neue","Helvetica","Roboto","Arial",sans-serif;font-size:1.5rem;margin:0 0 1.5rem}.usa-form-note+*{clear:both}fieldset{border:none;margin:0;padding:0}@media screen and (min-width: 600px){.usa-form-large{max-width:46rem}}@media screen and (min-width: 600px){input.usa-input-tiny{max-width:6rem}}@media screen and (min-width: 600px){input.usa-input-medium{max-width:12rem}}@media screen and (min-width: 600px){.usa-input-grid{padding-right:5%}}@media screen and (min-width: 600px){.usa-input-grid:last-of-type{padding-right:0}}@media screen and (min-width: 600px){.usa-input-grid-small{float:left;width:35%}}.usa-input-grid-small input{margin-bottom:3rem}.usa-input-grid-small select{margin-bottom:3rem}@media screen and (min-width: 600px){.usa-input-grid-medium{float:left;width:65%}}.usa-input-grid-medium input{margin-bottom:3rem}.usa-input-grid-medium select{margin-bottom:3rem}@media screen and (min-width: 600px){.usa-input-grid-large{float:left;width:100%}}.usa-input-grid-large input{margin-bottom:3rem}.usa-input-grid-large select{margin-bottom:3rem}.usa-additional_text{font-weight:normal}.usa-checklist{list-style:none;margin-left:0;padding-left:0}.usa-checklist li{display:inline-block;list-style:none;margin-bottom:0;margin-top:0;padding-left:3em;text-indent:-2em}.usa-checklist li::before{content:' ';display:inline-block;height:.8em;margin-right:.2em;width:1.8em}.usa-checklist-checked::before{background-image:url("../img/correct9.png");background-image:url("../img/correct9.svg");background-position:100%;background-repeat:no-repeat;background-size:100%}.usa-graphic_list .usa-graphic_list-row .usa-media_block{margin-bottom:3rem}@media screen and (min-width: 600px){.usa-graphic_list .usa-graphic_list-row .usa-media_block{margin-bottom:6rem}}@media screen and (min-width: 600px){.usa-graphic_list .usa-graphic_list-row:last-child .usa-media_block{margin-bottom:0}}.usa-graphic_list .usa-graphic_list-row:last-child .usa-media_block:last-child{margin-bottom:0}.usa-graphic_list .usa-media_block-img{margin-right:3rem}.usa-graphic_list .usa-media_block-body>:first-child{margin-top:0}.usa-header{width:100%;z-index:7000}@media screen and (min-width: 951px){.usa-header{border-bottom:1px solid #aeb0b5}}.usa-header a{border-bottom:none}.usa-header .usa-search{margin-bottom:1.5rem}@media screen and (min-width: 951px){.usa-header .usa-search{float:right;margin-bottom:0;max-width:21.5rem}}.usa-logo{float:left;line-height:4rem;margin-left:1.5rem}@media screen and (min-width: 951px){.usa-logo{line-height:7.5rem;margin-left:0}}.usa-logo a{color:#212121;text-decoration:none}.usa-logo br{display:none}@media screen and (min-width: 951px){.usa-logo br{display:block}}.usa-logo-text{display:block;font-size:1.5rem;font-style:normal;font-weight:700;margin:0}@media screen and (min-width: 951px){.usa-logo-text{display:block;font-size:2.4rem;line-height:1.3}}.usa-menu-btn{background-color:transparent;border:0;border-radius:0;font-weight:400;margin:0;outline:0;padding:0;text-align:left;-webkit-font-smoothing:auto;background-color:#0071bc;color:#fff;display:inline;float:right;font-size:1.3rem;height:4rem;line-height:4rem;text-align:center;text-decoration:none;text-transform:uppercase;width:5.8rem}.usa-menu-btn:hover{background-color:transparent}@media screen and (min-width: 951px){.usa-menu-btn{display:none}}.usa-menu-btn:hover{color:#fff;background-color:#205493}.usa-menu-btn:visited{color:#fff}.usa-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:#000;opacity:0;-webkit-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;visibility:hidden;z-index:8000}.usa-overlay.is-visible{opacity:0.1;visibility:visible}@media screen and (min-width: 951px){.usa-header-basic .usa-logo{bottom:1.9rem;position:absolute}}@media screen and (min-width: 951px){.usa-header-basic .usa-navbar{position:relative;width:18%}}@media screen and (min-width: 951px){.usa-header-extended .usa-header{border-bottom:none}}@media screen and (min-width: 951px){.usa-header-extended .usa-logo{margin-top:3rem;margin-bottom:3rem}}@media screen and (min-width: 951px){.usa-header-extended em{font-size:3.2rem;line-height:1}}@media screen and (min-width: 951px){.usa-header-extended .usa-navbar{max-width:1200px;margin-left:auto;margin-right:auto;padding-right:3rem;padding-left:3rem;display:block;height:auto;max-width:1040px}.usa-header-extended .usa-navbar::after{clear:both;content:"";display:block}}@media screen and (min-width: 951px){.usa-header-extended .usa-nav{border-top:1px solid #aeb0b5;float:none;padding:0;width:100%}}@media screen and (min-width: 951px){.usa-header-extended .usa-nav-inner{max-width:1200px;margin-left:auto;margin-right:auto;padding-right:3rem;padding-left:2rem;margin-top:-1px;max-width:1040px;position:relative}.usa-header-extended .usa-nav-inner::after{clear:both;content:"";display:block}}@media screen and (min-width: 951px){.usa-header-extended .usa-nav-primary::after{clear:both;content:"";display:block}}@media screen and (min-width: 951px){.usa-header-extended .usa-nav-primary button[aria-expanded=false],.usa-header-extended .usa-nav-primary button[aria-expanded=true]{background-position:right 1.5rem top 50%}}@media screen and (min-width: 951px){.usa-header-extended .usa-nav-link{padding-top:1.9rem}}@media screen and (min-width: 951px){.usa-header-extended .usa-nav-submenu .usa-grid-full{padding-left:1.2rem}}@media screen and (min-width: 951px){.usa-header-extended .usa-megamenu{padding-left:3rem}}.usa-hero{padding-top:3rem;padding-bottom:3rem;background-image:url("../img/hero.png");background-position:center;background-size:cover}.usa-hero .usa-button{color:#fff}.usa-section-dark .usa-hero-link{color:#02bfe7}.usa-hero-callout{background-color:#112e51;padding:3rem}@media screen and (min-width: 481px){.usa-hero-callout{max-width:30rem}}.usa-hero-callout>*:first-child{margin-top:0;margin-bottom:3rem}.usa-hero-callout .usa-button{font-size:1.4rem;margin-top:7rem;width:100%}.usa-hero-callout-alt{color:#fff;display:block}.usa-layout-docs{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}@media screen and (min-width: 1201px){.usa-layout-docs{display:inherit}}.usa-layout-docs .usa-grid>:first-child:not(.usa-width-*){margin-top:0}.usa-layout-docs .usa-grid>:last-child:not(.usa-width-*){margin-bottom:0}.usa-layout-docs-sidenav{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.usa-layout-docs-main_content{margin-bottom:3rem;-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}@media screen and (min-width: 1201px){.usa-layout-docs-main_content{margin-bottom:0}}.usa-layout-docs-main_content>:first-child{margin-top:0}.usa-media_block-img{float:left;margin-right:1rem}.usa-media_block-body{overflow:hidden}.usa-navbar{border-bottom:1px solid #aeb0b5;height:4rem}@media screen and (min-width: 951px){.usa-navbar{border-bottom:none;display:inline-block;height:10.3rem}}.usa-nav-link{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}@media screen and (min-width: 951px){.usa-nav-link:hover span{border-bottom:0.7rem solid #0071bc;padding-bottom:1rem}}@media screen and (min-width: 951px){.usa-nav-container{max-width:1200px;margin-left:auto;margin-right:auto;padding-right:3rem;padding-left:3rem;max-width:1040px}.usa-nav-container::after{clear:both;content:"";display:block}}.usa-nav{position:fixed;top:0;right:0;bottom:0;left:auto;height:100%;width:26rem;-webkit-transform:translateX(26rem);-ms-transform:translateX(26rem);transform:translateX(26rem);background:#fff;border-left:1px solid #aeb0b5;border-right:0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;overflow-y:auto;padding:2rem;z-index:9000}@media screen and (min-width: 951px){.usa-nav{padding-top:5rem;padding-right:0;padding-bottom:0;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0);border-left:none;display:block;float:right;overflow-y:visible;position:relative;width:auto}}.usa-nav.is-visible{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0);-webkit-transition:all 0.3s ease-in-out;transition:all 0.3s ease-in-out}.usa-nav nav{margin-top:6rem;min-height:100%}@media screen and (min-width: 951px){.usa-nav nav{margin-top:0}}.usa-nav .usa-current{border-left:4px solid #0071bc;color:#0071bc;font-weight:700;padding-left:1.4rem}.usa-nav .usa-button{width:100%}@media screen and (min-width: 951px){.usa-nav .usa-search{margin-left:1.5rem}}.usa-nav-primary{margin-top:0;margin-bottom:0;list-style-type:none;padding-left:0;-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.usa-nav-primary>li{margin-bottom:0}.usa-nav-primary>li{background-color:transparent;border-top:1px solid #5b616b;font-size:1.7rem}.usa-nav-primary>li:first-child{border-top:none}.usa-nav-primary a{border:none;color:#212121;display:block;font-family:"Source Sans Pro","Helvetica Neue","Helvetica","Roboto","Arial",sans-serif;line-height:1.3;padding:0.85rem 1rem 0.85rem 1.8rem;text-decoration:none}.usa-nav-primary a:hover{background-color:#f1f1f1;color:#0071bc;text-decoration:none}.usa-nav-primary a:focus{position:relative;z-index:1}.usa-nav-primary a.usa-current{border-left:4px solid #0071bc;color:#0071bc;font-weight:700;padding-left:1.4rem}@media screen and (min-width: 951px){.usa-nav-primary{display:inline}}@media screen and (min-width: 951px){.usa-nav-primary li{border-top:none}}.usa-nav-primary>li{width:auto}@media screen and (min-width: 951px){.usa-nav-primary>li{display:inline-block;margin-left:-4px}}@media screen and (min-width: 951px){.usa-nav-primary>li>a{padding:1.3rem 1.5rem 1.7rem;color:#5b616b;font-size:1.5rem;font-weight:700;line-height:1.2}}@media screen and (min-width: 951px){.usa-nav-primary>li>a:hover{background-color:transparent}}.usa-nav-primary button{background-color:transparent;border:0;border-radius:0;font-weight:400;margin:0;outline:0;padding:0;text-align:left;-webkit-font-smoothing:auto;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-weight:400;padding:1.4rem 1.5rem 1rem 1.8rem}.usa-nav-primary button:hover{background-color:transparent}@media screen and (min-width: 951px){.usa-nav-primary button{padding-right:3rem;padding-bottom:1.9rem;padding-left:1.5rem;color:#5b616b;font-size:1.5rem;font-weight:700;width:initial}}.usa-nav-primary button:focus,.usa-nav-primary button:active{box-shadow:0 0 3px #3e94cf,0 0 7px #3e94cf}.usa-nav-primary button:hover{background-color:#f1f1f1;color:#0071bc}@media screen and (min-width: 951px){.usa-nav-primary button:hover{background-color:transparent}}.usa-nav-primary button[aria-expanded=false]{background-image:url("../img/plus-alt.png");background-image:url("../img/plus-alt.svg");background-repeat:no-repeat;background-position:right 0 center;background-size:1rem}@media screen and (min-width: 951px){.usa-nav-primary button[aria-expanded=false]{background-image:url("../img/angle-arrow-down.png");background-image:url("../img/angle-arrow-down.svg");background-position:right 1.5rem top 44%}}.usa-nav-primary button[aria-expanded=true]{background-image:url("../img/minus-alt.png");background-image:url("../img/minus-alt.svg");background-repeat:no-repeat;background-position:right 0 center;background-size:1rem}@media screen and (min-width: 951px){.usa-nav-primary button[aria-expanded=true]{background-color:#112e51;color:#fff;background-image:url("../img/angle-arrow-down-hover.png");background-image:url("../img/angle-arrow-down-hover.svg");background-position:right 1.5rem top 44%}.usa-nav-primary button[aria-expanded=true]:hover{background-color:#112e51}.usa-nav-primary button[aria-expanded=true] span{border-bottom:0.7rem solid #0071bc;padding-bottom:1rem}}@media screen and (min-width: 951px){.usa-nav-secondary{position:absolute;right:3rem;top:-5.7rem}}.usa-nav-secondary .usa-search{margin-top:3rem;margin-bottom:3rem}@media screen and (min-width: 951px){.usa-nav-secondary .usa-search{margin-top:-.2rem;margin-bottom:0;margin-left:0;float:left}}@media screen and (min-width: 951px){.usa-nav-secondary-links{float:left}}@media screen and (min-width: 951px){.usa-nav-secondary-links li{display:inline;padding-left:1rem}}@media screen and (min-width: 951px){.usa-nav-secondary-links li:not(:last-child)::after{content:'|';padding-left:1rem}}.usa-nav-secondary-links a,.usa-nav-secondary-links .usa-header-search-button{color:#5b616b;display:inline-block;font-size:1.5rem;text-decoration:none}.usa-nav-secondary-links a:hover,.usa-nav-secondary-links .usa-header-search-button:hover{color:#0071bc}.usa-nav-secondary-links .usa-header-search-button{background-color:transparent;border:0;border-radius:0;font-weight:400;margin:0;outline:0;padding:0;text-align:left;-webkit-font-smoothing:auto;display:none}.usa-nav-secondary-links .usa-header-search-button:hover{background-color:transparent}@media screen and (min-width: 951px){.usa-nav-secondary-links .usa-header-search-button{background-image:url("../img/search-alt.png");background-image:url("../img/search-alt.svg");background-repeat:no-repeat;background-position:left center;background-size:2.2rem;display:inline-block;padding-left:2.3rem}}@media screen and (min-width: 951px){.usa-nav-secondary-links .usa-header-search-button.is-hidden{display:none}}.usa-nav-submenu{margin-top:0;margin-bottom:0;list-style-type:none;padding-left:0;margin:0;width:100%}.usa-nav-submenu>li{margin-bottom:0}.usa-nav-submenu li{border:none;font-size:1.5rem}.usa-nav-submenu a{padding-left:2.8rem;line-height:1.3}.usa-nav-submenu a:hover,.usa-nav-submenu a.usa-current{border:none;padding-left:2.8rem}.usa-nav-submenu .usa-sidenav-sub_list a{padding-left:3.8rem}.usa-nav-submenu .usa-sidenav-sub_list a:hover{padding-left:3.8rem}@media screen and (min-width: 951px){.usa-nav-submenu{margin-top:0;margin-bottom:0;list-style-type:none;padding-left:0;padding-top:1.15rem;padding-bottom:1.15rem;background-color:#112e51;min-width:21.5rem;width:auto;position:absolute}.usa-nav-submenu>li{margin-bottom:0}}.usa-nav-submenu[aria-hidden=true]{display:none}@media screen and (min-width: 951px){.usa-nav-submenu a{color:#fff;padding-left:1.8rem}}@media screen and (min-width: 951px){.usa-nav-submenu a:hover{background-color:#112e51;color:#fff;text-decoration:underline}}@media screen and (min-width: 951px){.usa-nav-submenu a:hover,.usa-nav-submenu a.usa-current{padding-left:1.8rem}}.usa-nav-submenu li{margin-bottom:0}.usa-nav-close{background-color:transparent;border:0;border-radius:0;font-weight:400;margin:0;outline:0;padding:0;text-align:left;-webkit-font-smoothing:auto;margin:-1.2rem -1.5rem 2.4rem auto;float:right;height:4.4rem;text-align:center;width:4.4rem}.usa-nav-close:hover{background-color:transparent}@media screen and (min-width: 951px){.usa-nav-close{display:none}}.usa-nav-close img{width:1.3rem}.usa-mobile_nav-active{overflow:hidden}@media screen and (min-width: 951px){.usa-megamenu{padding-top:3.15rem;padding-bottom:3.15rem;left:-1.8rem;width:100%}}@media screen and (min-width: 951px){.usa-megamenu::before{background-color:#112e51;content:'';display:block;height:100%;position:absolute;top:0;width:1000%;right:100%}}@media screen and (min-width: 951px){.usa-megamenu::after{background-color:#112e51;content:'';display:block;height:100%;position:absolute;top:0;width:1000%;left:100%}}@media screen and (min-width: 951px){.usa-header-basic-megamenu .usa-nav{padding-top:0;width:100%}}.usa-header-basic-megamenu .usa-nav-inner{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}@media screen and (min-width: 951px){.usa-header-basic-megamenu .usa-nav-inner{display:initial;float:right;margin-top:-4.8rem}}@media screen and (min-width: 951px){.usa-header-basic-megamenu .usa-nav-submenu .usa-grid-full{margin-left:-1.8rem}}@media screen and (min-width: 951px){.usa-megamenu-col{float:left;display:block;margin-right:2.35765%;width:23.23176%}.usa-megamenu-col:last-child{margin-right:0}.usa-megamenu-col:nth-child(2n){float:left;display:block;margin-right:2.35765%;width:23.23176%}.usa-megamenu-col:nth-child(2n):last-child{margin-right:0}.usa-megamenu-col:nth-child(4n){margin-right:0}}.usa-megamenu-col>ul{margin-top:0;margin-bottom:0;list-style-type:none;padding-left:0}.usa-megamenu-col>ul>li{margin-bottom:0}.usa-search{max-width:none;position:relative}.usa-search::after{clear:both;content:"";display:block}.usa-search [type="search"],.usa-search .usa-search-input{padding-top:0;padding-bottom:0;-webkit-appearance:none;border-bottom-right-radius:0;border-right:none;border-top-right-radius:0;box-sizing:border-box;float:left;font-size:1.4rem;height:3.3rem;margin:0;width:calc(100% - 4.5rem)}@media screen and (min-width: 481px){.usa-search [type="search"],.usa-search .usa-search-input{width:calc(100% - 8.5rem)}}.usa-search [type="submit"],.usa-search .usa-search-submit{background-image:url("../img/search.png");background-image:url("../img/search.svg");background-position:50%;background-repeat:no-repeat;border-bottom-left-radius:0;border-top-left-radius:0;height:3.3rem;margin:0;padding:0;width:4.5rem}@media screen and (min-width: 481px){.usa-search [type="submit"],.usa-search .usa-search-submit{background-image:none;width:8.5rem}}.usa-search .usa-search-submit-text{display:none}@media screen and (min-width: 481px){.usa-search .usa-search-submit-text{display:block}}@media screen and (min-width: 481px){.usa-search.usa-search-big [type="search"],.usa-search.usa-search-big .usa-search-input{font-size:1.7rem;height:4.4rem;width:calc(100% - 11.6rem)}.usa-search.usa-search-big [type="submit"],.usa-search.usa-search-big .usa-search-submit{font-size:2rem;height:4.4rem;width:11.6rem}}@media screen and (min-width: 481px){.usa-search.usa-search-small [type="search"],.usa-search.usa-search-small .usa-search-input{width:calc(100% - 4.5rem)}.usa-search.usa-search-small [type="submit"],.usa-search.usa-search-small .usa-search-submit{background-image:url("../img/search.png");background-image:url("../img/search.svg");background-position:50%;background-repeat:no-repeat;width:4.5rem}}@media screen and (max-width: 950px){.usa-search.usa-search-small.usa-sr-only{left:auto;position:relative}}.usa-section{padding-top:3rem;padding-bottom:3rem}@media screen and (min-width: 600px){.usa-section{padding-top:6rem;padding-bottom:6rem}}.usa-section-light{background-color:#f1f1f1}.usa-section-dark{background-color:#112e51;color:#fff}.usa-section-dark h1,.usa-section-dark h2,.usa-section-dark h3,.usa-section-dark h4,.usa-section-dark h5,.usa-section-dark h6{color:#02bfe7}.usa-section-dark p{color:#fff}.usa-section-dark a{color:#d6d7d9}.usa-section-dark a:hover{color:#fff}.usa-sidenav-list{margin-top:0;margin-bottom:0;list-style-type:none;padding-left:0}.usa-sidenav-list>li{margin-bottom:0}.usa-sidenav-list>li{background-color:transparent;border-top:1px solid #5b616b;font-size:1.7rem}.usa-sidenav-list>li:first-child{border-top:none}.usa-sidenav-list a{border:none;color:#212121;display:block;font-family:"Source Sans Pro","Helvetica Neue","Helvetica","Roboto","Arial",sans-serif;line-height:1.3;padding:0.85rem 1rem 0.85rem 1.8rem;text-decoration:none}.usa-sidenav-list a:hover{background-color:#f1f1f1;color:#0071bc;text-decoration:none}.usa-sidenav-list a:focus{position:relative;z-index:1}.usa-sidenav-list a.usa-current{border-left:4px solid #0071bc;color:#0071bc;font-weight:700;padding-left:1.4rem}.usa-sidenav-sub_list{margin-top:0;margin-bottom:0;list-style-type:none;padding-left:0;margin:0;width:100%}.usa-sidenav-sub_list>li{margin-bottom:0}.usa-sidenav-sub_list li{border:none;font-size:1.5rem}.usa-sidenav-sub_list a{padding-left:2.8rem;line-height:1.3}.usa-sidenav-sub_list a:hover,.usa-sidenav-sub_list a.usa-current{border:none;padding-left:2.8rem}.usa-sidenav-sub_list .usa-sidenav-sub_list a{padding-left:3.8rem}.usa-sidenav-sub_list .usa-sidenav-sub_list a:hover{padding-left:3.8rem}.usa-skipnav{background:transparent;color:#212121;left:0;padding:1rem 1.5rem;position:absolute;top:-4.2rem;-webkit-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;z-index:100}.usa-skipnav:focus{background:#fff;left:0;outline:0;position:absolute;top:0;-webkit-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out}
diff --git a/web/static/css/uswds.min.css.map b/web/static/css/uswds.min.css.map
deleted file mode 100644
index 4107c95..0000000
--- a/web/static/css/uswds.min.css.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["uswds.scss","lib/grid/_box-sizing.scss","lib/_normalize.scss","lib/css3/_font-face.scss","lib/helpers/_font-source-declaration.scss","core/_base.scss","lib/grid/_outer-container.scss","core/_grid.scss","core/_variables.scss","lib/mixins/_clearfix.scss","lib/helpers/_directional-values.scss","lib/grid/_media.scss","lib/grid/_span-columns.scss","lib/grid/_private.scss","lib/grid/_omega.scss","core/_utilities.scss","elements/_buttons.scss","elements/_figure.scss","elements/_inputs.scss","elements/_labels.scss","elements/_list.scss","elements/_table.scss","elements/_typography.scss","lib/functions/_px-to-rem.scss","lib/addons/_font-stacks.scss","components/_accordions.scss","components/_alerts.scss","components/_banner.scss","components/_footer.scss","components/_forms.scss","components/_graphic-list.scss","components/_header.scss","lib/addons/_position.scss","components/_hero.scss","components/_layout.scss","components/_media-block.scss","components/_navigation.scss","lib/addons/_size.scss","lib/addons/_prefixer.scss","components/_search.scss","components/_section.scss","components/_skipnav.scss"],"names":[],"mappings":"AAAA,qBAAqB,KCIjB,qBAAuB,CACxB,qBAMG,kBAAoB,CACrB,4ECZuE,KAS1E,uBACA,0BACA,6BAA+B,CAChC,KAOC,QAAU,CACX,2FAyBC,aAAe,CAChB,4BAWC,qBACA,uBAAyB,CAC1B,sBAQC,aACA,QAAU,CACX,kBASC,YAAc,CACf,EAUC,4BAA8B,CAC/B,iBASC,SAAW,CACZ,YAUC,wBAA0B,CAC3B,SAQC,gBAAkB,CACnB,IAOC,iBAAmB,CACpB,GAQC,cACA,eAAiB,CAClB,KAOC,gBACA,UAAY,CACb,MAOC,aAAe,CAChB,QAQC,cACA,cACA,kBACA,uBAAyB,CAC1B,IAGC,UAAY,CACb,IAGC,cAAgB,CACjB,IAUC,QAAU,CACX,eAOC,eAAiB,CAClB,OAUC,eAAiB,CAClB,GAOC,uBACA,QAAU,CACX,IAOC,aAAe,CAChB,kBAUC,iCACA,aAAe,CAChB,sCAsBC,cACA,aACA,QAAU,CACX,OAOC,gBAAkB,CACnB,cAWC,mBAAqB,CACtB,0EAcC,0BACA,cAAgB,CACjB,sCAQC,cAAgB,CACjB,iDAQC,SACA,SAAW,CACZ,MAQC,kBAAoB,CACrB,2CAYC,sBACA,SAAW,CACZ,gGAUC,WAAa,CACd,qBAQC,6BACA,sBAAwB,CACzB,mGAUC,uBAAyB,CAC1B,SAOC,yBACA,aACA,6BAA+B,CAChC,OAQC,SACA,SAAW,CACZ,SAOC,aAAe,CAChB,SAQC,gBAAkB,CACnB,MAUC,yBACA,gBAAkB,CACnB,MAIC,SAAW,CC5ZX,WACE,8BACA,kBACA,gBAEA,2RCSiC,CDdnC,WACE,8BACA,kBACA,gBAEA,mSCSiC,CDdnC,WACE,8BACA,kBACA,gBAEA,+RCSiC,CDdnC,WACE,8BACA,kBACA,gBAEA,uRCSiC,CDdnC,WACE,2BACA,kBACA,gBAEA,uRCSiC,CDdnC,WACE,2BACA,kBACA,gBAEA,+RCSiC,CDdnC,WACE,2BACA,kBACA,gBAEA,2RCSiC,CDdnC,WACE,2BACA,kBACA,gBAEA,mRCSiC,CCrBrC,KACE,qBAAuB,CACxB,qBAKC,kBAAoB,CACrB,KAGC,sBACA,iBAAmB,CACpB,UAMG,+BAAA,AAAwB,sBAAA,CACzB,SAOD,uBAAyB,CAC1B,yBCHC,iBACA,iBAAA,kBCzBA,gBC0G0B,CD7G5B,uCEmBI,WACA,WACA,aAAe,CAChB,UCwDuB,qBAKA,mBF4BE,CGtDxB,qCJnDJ,UGwE0B,mBAKA,iBF2BA,CDlGzB,CAED,eACE,SAAW,CIsET,qCJjEF,qBK8CE,WAGE,cAeA,sBACA,UC5Ec,CNWlB,gCKoEM,cAA+B,CAChC,oBAvBH,WAGE,cAeA,sBACA,eC5Ec,CNelB,+BKgEM,cAA+B,CAChC,qBAvBH,WAGE,cAeA,sBACA,eC5Ec,CNmBlB,gCK4DM,cAA+B,CAChC,sBAvBH,WAGE,cAeA,sBACA,eC5Ec,CNuBlB,iCKwDM,cAA+B,CAChC,sBAvBH,WAGE,cAeA,sBACA,eC5Ec,CN2BlB,iCKoDM,cAA+B,CAChC,oCLjDD,cAAgB,CACjB,yBKyBD,WAGE,cAeA,sBACA,UC5Ec,CNmClB,oCK4CM,cAA+B,CAChC,qBAvBH,WAGE,cAeA,sBACA,eC5Ec,CNuClB,gCKwCM,cAA+B,CAChC,mCLrCD,cAAgB,CACjB,uBKaD,WAGE,cAeA,sBACA,eC5Ec,CN+ClB,kCKgCM,cAA+B,CAChC,uBAvBH,WAGE,cAeA,sBACA,eC5Ec,CNmDlB,kCK4BM,cAA+B,CAChC,qCLzBD,cAAgB,CACjB,yBKCD,WAGE,cAeA,sBACA,eC5Ec,CN2DlB,oCKoBM,cAA+B,CAChC,0BAvBH,WAGE,cAeA,sBACA,eC5Ec,CN+DlB,qCKgBM,cAA+B,CAChC,CDJH,sCJPF,qBKZE,WAGE,cAeA,sBACA,UC5Ec,CNqElB,gCKUM,cAA+B,CAChC,oBAvBH,WAGE,cAeA,sBACA,eC5Ec,CNyElB,+BKMM,cAA+B,CAChC,qBAvBH,WAGE,cAeA,sBACA,eC5Ec,CN6ElB,gCKEM,cAA+B,CAChC,sBAvBH,WAGE,cAeA,sBACA,eC5Ec,CNiFlB,iCKFM,cAA+B,CAChC,sBAvBH,WAGE,cAeA,sBACA,eC5Ec,CNqFlB,iCKNM,cAA+B,CAChC,oCAvBH,WAGE,cAeA,sBACA,eC5Ec,CNqFlB,+CKNM,cAA+B,CAChC,oCLaD,cAAgB,CACjB,yBKrCD,WAGE,cAeA,sBACA,eC5Ec,CNiGlB,oCKlBM,cAA+B,CAChC,qBAvBH,WAGE,cAeA,sBACA,eC5Ec,CNqGlB,gCKtBM,cAA+B,CAChC,mCAvBH,WAGE,cAeA,sBACA,eC5Ec,CNqGlB,8CKtBM,cAA+B,CAChC,mCL6BD,cAAgB,CACjB,uBKrDD,WAGE,cAeA,sBACA,eC5Ec,CNiHlB,kCKlCM,cAA+B,CAChC,uBAvBH,WAGE,cAeA,sBACA,cC5Ec,CNsHlB,kCKvCM,cAA+B,CAChC,qCAvBH,WAGE,cAeA,sBACA,cC5Ec,CNsHlB,gDKvCM,cAA+B,CAChC,sCL8CD,cAAgB,CACjB,yBKtED,WAGE,cAeA,sBACA,eC5Ec,CNkIlB,oCKnDM,cAA+B,CAChC,0BAvBH,WAGE,cAeA,sBACA,eC5Ec,CNsIlB,qCKvDM,cAA+B,CAChC,CL8DP,aOjGM,cAA+B,CPmGpC,aQjJC,kBACA,WAAa,CAKd,qJAwBC,kCACA,mCLkCsB,gBAKE,kBAUA,mBMvExB,wBAAA,AACA,qBADA,AACA,gBAAA,yBACA,SACA,oBACA,WACA,eACA,qBACA,uFACA,iBACA,gBACA,cACA,aACA,kBACA,kBACA,qBACA,UAAY,CD/BZ,qCCKF,qJA6BI,UAAY,CAmHf,CAhJD,yfAkCI,yBACA,gBACA,WACA,oBAAsB,CArC1B,yfA0CI,0CR+BgC,CQzEpC,2gBA+CI,wBRlBgC,CQ7BpC,oWAmDI,yBACA,aRRgC,CQ5CpC,u5BAwDM,wBRxB8B,CQhCpC,y6BA6DM,yBACA,URnB8B,CQ3CpC,kVAmEI,wBR9BgC,CQrCpC,m3BAuEM,wBRjC8B,CQtCpC,q4BA4EM,wBRrC8B,CQvCpC,qSAiFI,wBRjCgC,CQhDpC,yxBAqFM,wBRtC8B,CQ/CpC,2yBA0FM,wBR9C8B,CQ5CpC,gUA+FI,sBACA,mCACA,aRtEgC,CQ3BpC,+0BAqGM,mCACA,aR1E8B,CQ5BpC,i2BA2GM,mCACA,aR/E8B,CQ7BpC,+0BAiHM,kERxC8B,CQzEpC,wYAsHI,uBACA,gCACA,UR7EgC,CQ3CpC,+9BA4HM,mCACA,aR1E8B,CQnDpC,i/BAkIM,mCACA,aRhF8B,CQnDpC,+9BAwIM,kER/D8B,CQzEpC,4RA6II,iBACA,mBAAqB,CACtB,8CAMD,yBACA,cACA,mBAAqB,CAYtB,kVALG,yBACA,SACA,gBACA,aRlHgC,CQmHjC,qBAID,6BACA,SACA,gBACA,gBACA,SACA,UACA,UACA,gBACA,2BAA6B,CAO/B,2BAJI,4BAA8B,CAC/B,ICxLD,cAAgB,CACjB,YAIC,qBACA,aAAe,CAKhB,sBCUC,wBAAA,AACA,qBADA,AACA,gBAAA,yBACA,gBACA,sBACA,cACA,cACA,iBACA,cACA,gBACA,eACA,gBACA,aACA,mBACA,UAAY,CAhBd,8GAoBI,0CVyCgC,CU7DpC,4EAwBI,wBV4BgC,CU3BjC,iBAID,8BACA,gBACA,sBACA,oBACA,mBACA,kBACA,YAAc,CAPhB,yEAYI,yBACA,yBAAW,CAbf,uBAiBI,YAAc,CAjBlB,mCAqBI,yBACA,aAAe,CAtBnB,yCA0BI,wBV5BgC,CU6BjC,uBAID,cACA,iBACA,eVjDuB,CUkDxB,yBAGC,cACA,cACA,iBACA,gBACA,mBACA,eAAiB,CAClB,0BAGC,cACA,sBAAwB,CACzB,MAGC,cACA,gBACA,eVcyB,CUb1B,SAGC,YAAc,CACf,OAGC,qBACA,wBACA,gBACA,sBACA,8CACA,8CACA,wCACA,4BACA,sBAAwB,CACzB,OAGC,eACA,eV1FuB,CU2FxB,2BAIG,YAAc,CACf,eAMD,cACA,uFACA,eAAiB,CAClB,iCAMC,kBACA,UACA,iBAAmB,CAJL,iDAOZ,SACA,WACA,uBACA,gBACA,UAAY,CACb,6CAKD,eACA,gBACA,mBAAqB,CACtB,6DAIC,gBACA,oBACA,6BACA,cACA,qBACA,cACA,mBACA,mBACA,mBACA,wBACA,YAAc,CACf,6BAGC,4CACA,cACA,mBACA,aACA,kBAAoB,CACrB,6EAIC,yBACA,4BV1JkC,CU2JnC,qCAGC,2CV9JkC,CU+JnC,mCAGC,mFVpHkC,CUqHnC,wCAGC,4CACA,4CACA,wBACA,2BAA6B,CAC9B,sCAGC,2CV7KkC,CU8KnC,iCAGC,aV5JkC,CU6JnC,+EAIC,mBACA,6BACA,kBAAoB,CACrB,aAKC,wBACA,YACA,eACA,UAAY,CACb,mBAGC,gBACA,YAAc,CACf,4CAGC,mBACA,yBACA,eACA,cACA,UAAY,CACb,+BAGC,mBACA,yBACA,eACA,cACA,UAAY,CACb,wBAGC,uBACA,kBACA,eACA,cACA,UAAY,CACb,mCAGC,wBACA,yBACA,cACA,qBACA,mBACA,eACA,mBACA,YAAc,CACf,+BAGC,mBACA,yBACA,qBACA,eACA,cACA,YAAc,CACf,wBAGC,mBACA,yBACA,qBACA,eACA,cACA,YAAc,CACf,6BAGC,mBACA,yBACA,kBAAoB,CACrB,6BAGC,mBACA,yBACA,kBAAoB,CACrB,yCAGC,wBV7NkC,CU8NnC,qCAGC,wBVjOkC,CUkOnC,8BAGC,wBVrOkC,CUsOnC,yBAMG,YAAc,CAFlB,wHAOI,wBACA,gBACA,QAAU,CATd,iCAaI,yBAA2B,CAC5B,+DAMD,WACA,WACA,oBACA,UAAY,CACb,qBAGC,UAAY,CACb,0BCrVC,yBACA,oBACA,WACA,iBACA,oBACA,sBACA,wBAA0B,CAP5B,oDAUI,cAAgB,CACjB,eAKD,iBACA,oBACA,oBAAsB,CACvB,MTuDuB,eASE,kBUhFxB,mBAAqB,CACtB,GAGC,gBACA,mBAAqB,CAFvB,cAKI,eAAiB,CAClB,kFAYC,YAAc,CACf,mBViDqB,aASE,gBKxDxB,qBACA,cAAgB,CAEd,sBACA,eAAiB,CAClB,MM/BD,iBACA,aACA,cAAgB,CAHlB,8BAQM,wBbmD8B,Ca3DpC,SAaI,eAAiB,CAbrB,eAkBM,ebYmB,Ca9BzB,kBAwBI,sBACA,yBACA,cAAgB,CACjB,+BAMG,4BAA8B,CAHpC,+BAOM,YAAc,CAPpB,kDAaI,cACA,cAAgB,CACjB,KC5CD,uFACA,cdUwB,CcTzB,KAGC,gBCOe,CDNhB,EAGC,gBACA,kBACA,cAAgB,CACjB,EAGC,cACA,yBAA2B,CAF7B,iBAMI,adcgC,CcpBpC,UAUI,adwDgC,CclEpC,QAcI,2CACA,SAAW,CACZ,0BAKC,yDACA,yDACA,qBACA,WACA,qBACA,cACA,mBACA,gBACA,YAAc,CACf,gCAGC,uDACA,sDAAqB,CACtB,8BAdC,6DACA,6DACA,qBACA,WACA,qBACA,cACA,mBACA,gBACA,YAAc,CACf,oCAGC,2DACA,0DAAqB,CACtB,kBAqBD,WACA,+EACA,gBACA,mBACA,gBAAkB,CACnB,GAUC,eACA,edxDuB,CcwFxB,GA5BC,eACA,ed7DuB,Cc4FxB,GA3BC,eACA,edlEuB,CcgGxB,GA1BC,iBACA,edvEuB,CcoGxB,GAzBC,iBACA,ed5EuB,CcwGxB,GAxBC,uFACA,iBACA,gBACA,wBAA0B,CAyB3B,qBAQC,iBAAmB,CACpB,mCAMG,ed9CuB,Cc+CxB,kBAID,ednDyB,CcoD1B,oDAOG,sFE3JoE,CFsJxE,YASI,mBACA,ed7IqB,Cc8ItB,wDAQC,8EE/K6D,CFgL9D,aAtFD,eACA,gBA0FA,eAAiB,CPzLjB,qCOuLF,aAnGE,eACA,edxDuB,CcqKxB,CPlMC,qCOuLF,aAxGE,iBACA,ednDuB,CcqKxB,CAED,eACE,+EACA,eACA,gBACA,ed7FyB,Cc8F1B,iBAGC,iBAAmB,CACpB,sBAGC,WACA,OACA,eACA,kBACA,KAAO,CACR,gBAGC,YAAc,CACf,eAGC,eAAiB,CAClB,qBAGC,wBd5KkC,Cc2KpC,iDAKI,UdpLgC,Cc+KpC,uBASI,adhLgC,CcuKpC,6BAYM,Ud3L8B,Cc4L/B,gBAKH,iBACA,YAAc,CACf,iDAOG,YAAc,CAHlB,+CAOI,eAAiB,CAClB,uaAcG,YAAc,CP7QlB,qCOkQF,2TAiBM,YAAc,CAEjB,CAnBH,qZAuBM,eAAiB,CPzRrB,qCOkQF,kTA6BM,eAAiB,CAEpB,CGhOH,uCfOwB,aASE,gBKxDxB,qBACA,eUpBA,cACA,SACA,UACA,UAAY,CVmBV,6CACA,eAAiB,CAClB,4JUyCC,eAAiB,CANrB,6CfOwB,aASE,gBKxDxB,qBACA,eUpBA,cACA,SACA,UACA,UAAY,CVmBV,mDACA,eAAiB,CAClB,mDUjBD,yBACA,uFACA,gBACA,kBACA,UAAY,CAgDd,2DT0GE,6BACA,SACA,gBACA,gBACA,SACA,UACA,UACA,gBACA,4BS5JA,yBACA,yCACA,yCACA,sCACA,4BACA,qBACA,cACA,eACA,qBACA,uFACA,gBACA,SACA,kCACA,UAAY,CA6Bd,uETqHI,4BAA8B,CAC/B,uEShJC,0CjBuCgC,CiBtCjC,uEAGC,yBACA,ajBKgC,CiBJjC,sYAQC,QAAU,CACX,yFAKD,wCACA,wCACA,4BACA,sBAAwB,CAG1B,6CApDE,yBACA,uFACA,gBACA,kBACA,UAAY,CA+EX,+CAMC,gCACA,8BACA,8BjB/CgC,CiBgDjC,uBAID,sBACA,cACA,YAAc,CAHhB,qCAMI,YAAc,CANlB,oCAUI,eAAiB,CAVrB,0CVrGE,kBACA,WAAa,CUoGf,yCV1FI,YAAc,CACf,sBCwJD,6BACA,SACA,gBACA,gBACA,SACA,UACA,UACA,gBACA,4BS5JA,yBACA,yCACA,yCACA,sCACA,4BACA,qBACA,cACA,eACA,qBACA,uFACA,gBACA,SACA,kCACA,UAAY,CA4Fd,4BTsDI,4BAA8B,CAC/B,4BShJC,0CjBuCgC,CiBtCjC,4BAGC,yBACA,ajBKgC,CiBJjC,sJAQC,QAAU,CACX,2CAKD,wCACA,wCACA,4BACA,sBAAwB,CAwEzB,WC3HC,yBACA,8BACA,4BACA,qBACA,iBACA,WAAa,CXhBb,qCWUF,WASI,sBAAwB,CAO3B,CAhBD,cAaI,gBACA,cAAgB,CACjB,gBAID,mBACA,kBAAoB,CACrB,gBAGC,mBACA,oBACA,kBAAoB,CXpCpB,qCWiCF,gBAMI,iBAAmB,CAMtB,CAZD,8BAUI,iBAAmB,CACpB,mBAID,oBACA,YAAc,CXjDd,qCW+CF,mBAKI,gBAAkB,CAErB,CAED,gBACE,uFACA,gBACA,YAAc,CACf,mBAIG,yBACA,kDACA,iDAAqB,CAHvB,mBACE,yBACA,kDACA,iDAAqB,CAHvB,iBACE,yBACA,gDACA,+CAAqB,CAHvB,gBACE,yBACA,+CACA,8CAAqB,CACtB,mBAID,qBAAuB,CACxB,YCzEC,yBACA,qBAAuB,CZAvB,qCYFF,YAKI,iBACA,gBAAkB,CAErB,CAED,oBjBqE0B,qBAOA,mBACA,oBiB3ExB,6BACA,iBACA,iBACA,UAAY,CZbZ,qCYQF,oBAQI,sBACA,gBAAkB,CAgBrB,CZjCC,qCYQF,oBjBqE0B,mBAKA,iBF2BA,CmB5EzB,CAzBD,kCAkBM,eAAiB,CZ1BrB,qCYQF,kCAqBQ,YAAc,CAEjB,CAIL,kBrBTE,iBACA,iBAAA,kBIkDwB,qBAKA,oBiB5CxB,gBnBsE0B,CmBzE5B,yBlBjBI,WACA,WACA,aAAe,CAChB,qCkBcH,kBjB0C0B,mBAKA,iBF2BA,CmBlEzB,CAED,mBjB2BwB,mBASE,sBiBlCxB,iBACA,enBpBuB,CO5BvB,qCY6CF,mBjB2BwB,cASE,gBA/CL,CiB2CpB,CAhCD,qBjB2BwB,aASE,gBiBzBtB,eACA,gBACA,qBAAuB,CZ1DzB,qCY6CF,qBjB2BwB,eASE,kBiBnBpB,oBAAsB,CAEzB,CAnBH,uBAsBI,WACA,kBACA,eACA,YAAc,CZtEhB,qCY6CF,uBA4BM,oBACA,UAAY,CAEf,CAGH,4BACE,yBAAA,AACA,sBADA,AACA,mBAAA,gCACA,oBAAA,AACA,oBADA,AACA,aAAA,iBACA,kBACA,kBAAoB,CZrFpB,qCY+EF,4BASI,mBACA,cACA,iBACA,gBACA,aACA,eAAiB,CA4BpB,CA1CD,8CAkBI,aAAe,CZjGjB,qCY+EF,8CAqBM,gBAAkB,CAErB,CAvBH,gCA0BI,mBAAqB,CZzGvB,qCY+EF,gCA6BM,mBAAqB,CAExB,CA/BH,8BAkCI,gBACA,kBAAoB,CZlHtB,qCY+EF,8BAsCM,gBACA,qBAAuB,CAE1B,CAGH,mBXgDE,6BACA,SACA,gBACA,gBACA,SACA,UACA,UACA,gBACA,4BN3GsB,mBAgBE,oBiBsCxB,4BACA,cACA,cACA,iBACA,cACA,OACA,kBACA,0BACA,MACA,UAAY,CAZd,yBX2DI,4BAA8B,CDtLhC,qCY2HF,mBjBnDwB,cAgBE,eiBmDtB,eACA,eACA,gBACA,kBACA,sBACA,aAAe,CAmDlB,CAxED,yBAyBI,cACA,yBAA2B,CA1B/B,wCA+BI,qBAAuB,CA/B3B,+CZ7BI,0DACA,0DACA,qBACA,WACA,qBACA,YACA,WAGE,aYkD4D,CZ9C/D,qDAIG,gEACA,+DAAuB,CACxB,+CY4CC,yBAA2B,CAlCjC,uCAwCI,sBACA,aAAe,CAzCnB,8CZ7BI,uCACA,uCACA,qBACA,WACA,qBACA,cACA,aAGE,aY2D2C,CZlK/C,qCY2HF,uCA6CM,eACA,UACA,iBAAmB,CA/CzB,8CZ7BI,wDACA,wDACA,qBACA,WACA,qBACA,YACA,WAGE,aYgE4D,CZ5D/D,oDAIG,8DACA,6DAAuB,CACxB,8CY4DG,yBAA2B,CAC5B,CAnDP,8CAuDM,kBACA,aACA,WAAa,CZpLjB,qCY2HF,8CA4DQ,eAAiB,CAEpB,CA9DL,+DAiEM,YAAc,CZ5LlB,qCY2HF,+DAoEQ,cAAgB,CAEnB,CAIL,iBACE,YAAc,CACf,+BCvMG,aAAe,CAFnB,qCAMI,cACA,cACA,gBACA,aACA,oBACA,iBACA,oBAAsB,CbVxB,qCaFF,qCAeM,eAAiB,CAMpB,CArBH,2CAmBM,yBAA2B,CAnBjC,cAwBI,kBAAoB,CACrB,0BAID,oBACA,gBAAkB,CACnB,4BAGC,wBpByBkC,CoB1BpC,wDAII,oBACA,oBAAsB,CbpCxB,qCa+BF,wDAQM,eACA,eAAiB,CAUpB,CAnBH,2DAaM,gBAAkB,Cb5CtB,qCa+BF,2DAgBQ,aAAe,CAElB,CbjDH,qCa+BF,2CAuBM,oBACA,oBAAsB,CAEzB,CAGH,+CAEI,SAAW,Cb9Db,qCa4DF,+CAKM,oBACA,gBAAkB,CAerB,CbjFD,sCa4DF,2EAWQ,gBACA,aAAe,CAQlB,CbhFH,sCa4DF,sFAiBU,cAAgB,CAEnB,Cb/EL,qCa4DF,sCAyBM,yBAAA,AAAoB,sBAApB,AAAoB,kBAAA,CAEvB,CAGH,mCAGM,aAAe,Cb7FnB,sCa0FF,6DAQQ,gBACA,aAAe,CAQlB,Cb3GH,sCa0FF,wEAcU,cAAgB,CAEnB,CAhBP,6CAqBI,mBAAqB,Cb/GvB,qCa0FF,6CAwBM,oBACA,gBAAkB,CAzBxB,4DA4BQ,yBAAA,AAAoB,sBAApB,AAAoB,kBAAA,CACrB,CbvHL,qCa0FF,4CAoCQ,QAAU,CAEb,CbhIH,qCa0FF,0ClBlBwB,iBASE,mBkBkDE,CAUzB,Cb7ID,qCa0FF,0CA6CM,UAAY,CAMf,Cb7ID,sCa0FF,0ChBzBI,WAGE,cAeA,sBACA,eC5Ec,CekFpB,qDhBHQ,cAA+B,CAChC,CgByDP,0FAGE,4BpBnGkC,COjDlC,qCaiJF,0FAMI,WAAa,CAUhB,CAhBD,2HAUI,+BpB1GgC,COjDlC,qCaiJF,2HAaM,kBAAoB,CAEvB,CAIH,mBACE,oBACA,oBACA,oBAAsB,CbvKtB,qCaoKF,mBAMI,YACA,SAAW,CAgBd,CAvBD,uCAWI,YAAc,CAXlB,0BAeI,WACA,eACA,iBAAmB,CAjBvB,yBAqBI,UAAY,CACb,8BAID,yBACA,oBACA,gBAAkB,CAHpB,gCAMI,apBlJgC,COjDlC,qCauMF,kCAEI,gBAAkB,CAErB,Cb3MC,qCa6MF,0BAEI,gBAAkB,CAErB,CAED,oBAEI,oBAAsB,CbrNxB,qCayNF,4CAGM,oBACA,gBAAkB,CAErB,CANH,mBASI,qBAAuB,CblOzB,qCayNF,mBAYM,gBAAkB,CAsDrB,CAlEH,8BAgBM,+BpBxL8B,COjDlC,qCayNF,8BAmBQ,kBAAoB,CAEvB,CArBL,sBAwBM,eAAiB,CAxBvB,4CA4BM,8CACA,8CACA,kCACA,4BACA,uBACA,cACA,mBAAqB,Cb3PzB,qCayNF,4CAqCQ,gBACA,oBACA,iBACA,cAAgB,CAOnB,CA/CL,8ClBjJwB,aASE,eA/CL,CkBuLrB,0BAkDM,gBAAkB,CAlDxB,6BAoDW,YAAc,CApDzB,mDAuDQ,+CACA,+CACA,eACA,aAAe,CbnRrB,qCayNF,mDA6DU,gBACA,cAAgB,CAEnB,CAKP,kBACE,SACA,cAAgB,CbhShB,qCamSF,oBAEI,SACA,cAAgB,CAEnB,CAED,qBACE,eAAiB,CAClB,0BAGC,WACA,eAAiB,CAClB,yBAGC,eAAiB,CAClB,4BAGC,YAAc,CbxTd,qCauTF,4BAII,eAAiB,CAEpB,CAED,8BACE,cACA,gBAAkB,CbjUlB,qCa+TF,8BAKI,qBACA,gBAAkB,CAErB,CAED,sFlB9OI,4BkBmPF,kCACA,4BACA,0BACA,qBACA,cACA,aACA,kBACA,kBACA,YAXiB,Cb3UjB,qCayUF,sFlB9OI,kBkB+PA,WAAa,CAMhB,CAvBD,+GblUE,kBACA,WAAa,CauVZ,mBAKD,+DACA,8DAAqB,CACtB,kBAIC,8DACA,6DAAqB,CACtB,kBAIC,8DACA,6DAAqB,CACtB,cAIC,0DACA,yDAAqB,CACtB,OCtXG,eAAiB,CAFrB,0CAOI,cACA,oBACA,iBAAmB,CdTrB,qCcAF,0CAYM,mBACA,oBACA,UAAY,CAEf,CAhBH,qDAoBI,oBAAsB,CdpBxB,qCcwBF,UAEI,eA5BkB,CA8BrB,CAED,eACE,YACA,uFACA,iBACA,iBAAmB,CAJrB,iBAOI,UAAY,CACb,SAID,YACA,SACA,SAAW,Cd5CX,qCc+CF,gBAEI,eAAiB,CAEpB,CdnDC,qCcqDF,qBAGM,cAAgB,CAEnB,Cd1DD,qCcqDF,uBASM,eAAiB,CAEpB,CdhED,qCcmEF,gBAEI,gBAAkB,CAErB,CdvEC,qCcyEF,6BAEI,eAAiB,CAEpB,Cd7EC,qCc+EF,sBAEI,WACA,SAAW,CAUd,CAbD,4BAOI,kBAAoB,CAPxB,6BAWI,kBAAoB,Cd1FtB,qCc8FF,uBAEI,WACA,SAAW,CAUd,CAbD,6BAOI,kBAAoB,CAPxB,8BAWI,kBAAoB,CdzGtB,qCc6GF,sBAEI,WACA,UAAY,CAUf,CAbD,4BAOI,kBAAoB,CAPxB,6BAWI,kBAAoB,CACrB,qBAID,kBAAoB,CACrB,eAKC,gBACA,cACA,cAAgB,CAHlB,kBAMI,qBACA,gBACA,gBACA,aACA,iBACA,gBAAkB,CAXtB,0BAcM,YACA,qBACA,YACA,kBACA,WAAa,CACd,+BAMD,4CACA,4CACA,yBACA,4BACA,oBAAsB,CACvB,yDC7JG,kBtB0GoB,CO7GxB,qCeAF,yDAMQ,kBAA4B,CAE/B,CfRH,qCeAF,oEAaU,eAAiB,CAMpB,CAnBP,+EAiBU,eAAiB,CAjB3B,uCAwBI,iBtBqFsB,CsB7G1B,qDA6BM,YAAc,CACf,YCnBH,WACA,YARoB,ChBJpB,qCgBUF,YAKI,+BvBwCgC,CuBxBnC,CArBD,cASI,kBAAoB,CATxB,wBAaI,oBAAsB,ChBvBxB,qCgBUF,wBAgBM,YACA,gBACA,iBAAmB,CAEtB,CAGH,UACE,WACA,iBACA,kBAAoB,ChBpCpB,qCgBiCF,UAMI,mBACA,aAAe,CAelB,CAtBD,YAWI,cACA,oBAAsB,CAZ1B,aAgBI,YAAc,ChBjDhB,qCgBiCF,aAmBM,aAAe,CAElB,CAGH,eACE,cACA,iBACA,kBACA,gBACA,QAAU,ChB9DV,qCgByDF,eAQI,cACA,iBACA,evB7CqB,CuB+CxB,CAGD,cfmGE,6BACA,SACA,gBACA,gBACA,SACA,UACA,UACA,gBACA,4BezGA,yBACA,WACA,eACA,YACA,iBACA,YACA,iBACA,kBACA,qBACA,yBACA,YAAc,CAZhB,oBf8GI,4BAA8B,CDtLhC,qCgBwEF,cAeI,YAAc,CAWjB,CA1BD,oBAmBI,WACA,wBvB3DgC,CuBuCpC,sBAwBI,UvBhDgC,CuBiDjC,aC3DD,eAII,MAAA,QAAA,SAAA,OD6DJ,gBACA,UACA,wCAAA,AACA,gCAAA,kBACA,YAtGoB,CAgGtB,wBASI,YACA,kBAAoB,ChB/GtB,qCgBqHF,4BAGM,cACA,iBAAmB,CAEtB,ChB3HD,qCgBqHF,8BAUM,kBACA,SAAW,CAEd,ChBlID,qCgBuIF,iCAGM,kBAAoB,CAEvB,ChB5ID,qCgBuIF,+BrB/DwB,gBASE,kBqB+DA,CAEvB,ChBlJD,qCgBuIF,wBAeM,iBACA,aAAe,CAElB,ChBzJD,qCgBuIF,iCzB7GE,iBACA,iBAAA,kBIkDwB,mBAKA,kBqB6EpB,cACA,YACA,gBvBrDsB,CuB2B5B,wCtBrHI,WACA,WACA,aAAe,CAChB,CMrBD,qCgBuIF,8BAgCM,6BACA,WACA,UACA,UAAY,CAEf,ChB5KD,qCgBuIF,oCzB7GE,iBACA,iBAAA,kBIkDwB,mBAWA,kBqB0FpB,gBACA,iBACA,iBAAmB,CA7CzB,2CtBrHI,WACA,WACA,aAAe,CAChB,CMrBD,qCgBuIF,6CtBrHI,WACA,WACA,aAAe,CAChB,CMrBD,qCgBuIF,mIA0DU,wCAA0C,CAE7C,ChBnML,qCgBuIF,mCAkEM,kBAAoB,CAEvB,ChB3MD,qCgBuIF,qDAyEQ,mBAAqB,CAExB,ChBlNH,qCgBuIF,mCAgFM,iBvB1GoB,CuB4GvB,CExNH,UvBuEwB,iBASE,oBuB9ExB,wCACA,2BACA,qBAAuB,CAJzB,sBAOI,UzBwCgC,CyBvCjC,iCAKC,azBsBgC,CyBrBjC,kBAID,yBACA,YAAc,ClBpBd,qCkBkBF,kBAKI,eAAiB,CAYpB,CAjBD,gCvBsDwB,aAYE,kBFyBA,CyB3F1B,8BAaI,iBACA,gBACA,UAAY,CACb,sBAID,WACA,aAAe,CAChB,iBCxCC,oBAAA,AACA,oBADA,AACA,aAAA,4BAAA,AAAuB,6BAAvB,AAAuB,0BAAvB,AAAuB,qBAAA,CnBDvB,sCmBDF,iBAKI,eAAiB,CAYpB,CAjBD,0DAUM,YAAc,CAVpB,yDAcM,eAAiB,CAClB,yBAKH,4BAAA,AAAS,iBAAT,AAAS,OAAA,CACV,8BAGC,mBACA,4BAAA,AAAS,iBAAT,AAAS,OAAA,CnBxBT,sCmBsBF,8BAKI,eAAiB,CAMpB,CAXD,2CASI,YAAc,CACf,qBCjCD,WACA,iBAFwC,CAOzC,sBAGC,eAAiB,CAClB,YCFC,gCACA,WAAa,CrBRb,qCqBMF,YAKI,mBACA,qBACA,cAAgB,CAEnB,CAED,crBoBE,kCACA,kCAAoC,CAtCpC,qCqBiBF,yBAfE,mCACA,mBAAqB,CAsBlB,CrBzBH,qCqB6BF,mB9BHE,iBACA,iBAAA,kBIkDwB,mBAKA,kB0BjDtB,gB5B2EwB,C4B/E5B,0B3BXI,WACA,WACA,aAAe,CAChB,C2BgBH,SJCE,eAII,MAAA,QAAA,SAAA,UKJF,YAMA,YCXI,oCAIA,AAIA,gCAIA,AAIA,4BFPN,gBACA,8BACA,eACA,oBAAA,AACA,oBADA,AACA,aAAA,4BAAA,AACA,6BADA,AACA,0BADA,AACA,sBAAA,gBACA,aACA,YL3CoB,ChBNpB,qCqBqCF,S1BmCwB,iBAKE,gBAUA,iB4BtDlB,gCAIA,AAIA,4BAIA,AAIA,wBFKJ,iBACA,cACA,YACA,mBACA,kBACA,UAAY,CAiCf,CAvDD,oBEJQ,gCAIA,AAIA,4BAIA,AAIA,wBAhBA,wCAIA,AAYA,+BFeoC,CA3B5C,aA+BI,gBACA,eAAiB,CrBrEnB,qCqBqCF,aAmCM,YAAc,CAEjB,CArCH,sBAwCI,8BACA,cACA,gBACA,mBAAqB,CA3CzB,qBA+CI,UAAY,CrBpFd,qCqBqCF,qBAoDM,kBAAoB,CAEvB,CAKH,iB1BxBwB,aASE,gBKxDxB,qBACA,eqBwEA,4BAAA,AAAS,iBAAT,AAAS,OAAA,CrBtEP,oBACA,eAAiB,CAClB,oBA2FC,6BACA,6BACA,gBQhHa,CR6Gb,gCAME,eAAiB,CAClB,mBAID,YACA,cACA,cACA,uFACA,gBACA,oCACA,oBAAsB,CAPxB,yBAUI,yBACA,cACA,oBAAsB,CAZ1B,yBAgBI,kBACA,SAAW,CAjBf,+BAqBI,8BACA,cACA,gBACA,mBAAqB,CA1JzB,qCqBgGF,iBAKI,cAAgB,CAoGnB,CrBzMC,qCqBgGF,oBAUM,eAAiB,CAEpB,CAZH,oBAeI,UAAY,CrB/Gd,qCqBgGF,oBAkBM,qBACA,gBAAkB,CAkBrB,CrBrID,qCqBgGF,sB1BLI,6B0B8BI,cACA,iBACA,gBACA,eAAiB,CAQpB,CrBpIH,qCqBgGF,4BAiCU,4BAA8B,CAEjC,CAnCP,wBpB2EE,6BACA,SACA,gBACA,gBACA,SACA,UACA,UACA,gBACA,4BD9IA,kCACA,mCqBoGE,gBACA,iCAAmC,CA3CvC,8BpBsFI,4BAA8B,CDtLhC,qCqBgGF,wB1BnB0B,mBAUA,sBACA,oB0BuDpB,cACA,iBACA,gBACA,aAAe,CAsDlB,CAxGH,6DAuDM,0C5BzE8B,C4BkBpC,8BA2DM,yBACA,a5B5H8B,COhClC,qCqBgGF,8BA+DQ,4BAA8B,CAEjC,CAjEL,6CAoEM,4CACA,4CACA,4BACA,mCACA,oBAAsB,CrBxK1B,qCqBgGF,6CA2EQ,oDACA,oDACA,wCAA0C,CAE7C,CA/EL,4CAkFM,6CACA,6CACA,4BACA,mCACA,oBAAsB,CrBtL1B,qCqBgGF,4CAyFQ,yBACA,WACA,0DACA,0DACA,wCAA0C,CA7FlD,kDAgGU,wB5B9J0B,C4B8DpC,iDA9FE,mCACA,mBAAqB,CAkMd,CrBrMP,qCqB6MF,mBAEI,kBACA,WACA,WAAa,CAWhB,CAfD,+B1BrIwB,gBASE,kB0BoIF,CrBrNtB,qCqB6MF,+B1BrIwB,kBAeE,gBACA,c0BiIpB,UAAY,CAEf,CrB3ND,qCqB8NF,yBAEI,UAAY,CAiDf,CrBjRC,qCqB8NF,4BAOM,eACA,iBAAmB,CAStB,CrB/OD,qCqB8NF,oDAaQ,YACA,iBAAmB,CAEtB,CAhBL,8EAqBI,cACA,qBACA,iBACA,oBAAsB,CAxB1B,0FA2BM,a5BzN8B,C4B8LpC,mDpBnDE,6BACA,SACA,gBACA,gBACA,SACA,UACA,UACA,gBACA,4BoB4EE,YAAc,CAjClB,yDpBxCI,4BAA8B,CDtLhC,qCqB8NF,mDAoCM,8CACA,8CACA,4BACA,gCACA,uBACA,qBACA,mBAAqB,CAQxB,CrBhRD,qCqB8NF,6DA+CQ,YAAc,CAEjB,CAML,iB1B7MwB,aASE,gBKxDxB,qBACA,eAwIA,SACA,UAAY,CAvIV,oBACA,eAAiB,CAClB,oBAwIC,YACA,gBQ5Ja,CR6Jd,mBAGC,oBACA,ePtJqB,COoJvB,wDAMI,YACA,mBAAqB,CACtB,yCAKC,mBAAqB,CADvB,+CAII,mBAAqB,CA1L3B,qCqBqRF,iB1B7MwB,aASE,gBKxDxB,qBACA,eL8CsB,oBASE,uB0B0MtB,yBACA,kBACA,WACA,iBAAmB,CrBlQnB,oBACA,eAAiB,CAClB,CqBuPH,mCAaI,YAAc,CrBlShB,qCqBqRF,mBAkBM,WACA,mBAAqB,CAiBxB,CrBzTD,qCqBqRF,yBAwBQ,yBACA,WACA,yBAA2B,CAE9B,CrBjTH,qCqBqRF,wDAiCQ,mBAAqB,CAExB,CAnCL,oBAuCI,eAAiB,CAClB,epBlJD,6BACA,SACA,gBACA,gBACA,SACA,UACA,UACA,gBACA,4BNxFE,mC0B0OF,YACA,cACA,kBACA,Y5BhNe,C4B0MjB,qBpB5II,4BAA8B,CDtLhC,qCqBkUF,eASI,YAAc,CAMjB,CAfD,mBAaI,YAAc,CACf,uBAID,eAAiB,CrBpVjB,qCqBmWF,c1B3RwB,oBASE,uB0BqRtB,aACA,UAAY,CAgBf,CrBvXC,qCqBmWF,sBATE,yBACA,WACA,cACA,YACA,kBACA,MACA,YAaI,UAAY,CAEf,CrB/WD,qCqBmWF,qBATE,yBACA,WACA,cACA,YACA,kBACA,MACA,YAoBI,SAAW,CAEd,CrBtXD,qCqByXF,oCAGM,cACA,UAAY,CAEf,CANH,0CASI,oBAAA,AACA,oBADA,AACA,aAAA,4BAAA,AAAuB,6BAAvB,AAAuB,0BAAvB,AAAuB,qBAAA,CrBnYzB,qCqByXF,0CAaM,gBACA,YACA,kBAAoB,CAEvB,CrB1YD,qCqByXF,2DAsBQ,mBAAqB,CAExB,CrBjZH,qCqBqZF,kBxBpVI,WAGE,cAeA,sBACA,eC5Ec,CuB6YpB,6BxB9TQ,cAA+B,CAChC,gCAvBH,WAGE,cAeA,sBACA,eC5Ec,CuB6YpB,2CxB9TQ,cAA+B,CAChC,gCwBsUD,cAAgB,CACjB,CAVL,qB1B7UwB,aASE,gBKxDxB,qBACA,cAAgB,CAEd,wBACA,eAAiB,CAClB,YwBnBD,eACA,iBAAmB,CAHrB,mB9BSI,WACA,WACA,aAAe,CAChB,0DCmDqB,cASE,iB6BhEtB,wBACA,6BACA,kBACA,0BACA,sBACA,WACA,iBACA,cACA,SACA,yBAAW,CxB1Bb,qCwBSF,0DAoBM,yBAAW,CAEd,CAtBH,2DANE,0CACA,0CACA,wBACA,4BA8BE,4BACA,yBACA,cACA,SACA,UACA,YA3C0B,CxBE5B,qCwBSF,2DAmCM,sBACA,YA9CwB,CAgD3B,CAtCH,oCAyCI,YAAc,CxBlDhB,qCwBSF,oCA4CM,aAAe,CAElB,CxBvDD,qCwBSF,wFAuDQ,iBACA,cACA,0BAAW,CAzDnB,yFA8DQ,eACA,cACA,aAzEuB,CA0ExB,CxB1EL,qCwBSF,4FA2EQ,yBAAW,CA3EnB,6FANE,0CACA,0CACA,wBACA,4BAoFM,YA5FsB,CA6FvB,CAEH,qCApFJ,yCAsFQ,UACA,iBAAmB,CACpB,CCnGP,a9B0EwB,iBASE,mBF4BA,CO7GxB,qCyBFF,a9B0EwB,iBASE,mB8B/ED,CAExB,CAED,mBACE,wBhCkDkC,CgCjDnC,kBAGC,yBACA,UhCoCkC,CgCtCpC,8HAUI,ahCgBgC,CgC1BpC,oBAcI,UhCwBgC,CgCtCpC,oBAkBI,ahC4BgC,CgC9CpC,0BAqBM,UhCiB8B,CgChB/B,kB9BwCmB,aASE,gBKxDxB,qBACA,cAAgB,CAEd,qBACA,eAAiB,CAClB,qBA2FC,6BACA,6BACA,gBQhHa,CR6Gb,iCAME,eAAiB,CAClB,oBAID,YACA,cACA,cACA,uFACA,gBACA,oCACA,oBAAsB,CAPxB,0BAUI,yBACA,cACA,oBAAsB,CAZ1B,0BAgBI,kBACA,SAAW,CAjBf,gCAqBI,8BACA,cACA,gBACA,mBAAqB,CACtB,sBLnFmB,aASE,gBKxDxB,qBACA,eAwIA,SACA,UAAY,CAvIV,yBACA,eAAiB,CAClB,yBAwIC,YACA,gBQ5Ja,CR6Jd,wBAGC,oBACA,ePtJqB,COoJvB,kEAMI,YACA,mBAAqB,CACtB,8CAKC,mBAAqB,CADvB,oDAII,mBAAqB,CACtB,a0B5LL,uBACA,cACA,OACA,oBACA,kBACA,YACA,wCAAA,AACA,gCAAA,WAAa,CARf,mBAWI,gBACA,OACA,UACA,kBACA,MACA,wCAAA,AAAiC,+BAAA,CAClC","file":"uswds.min.css","sourcesContent":["/*! uswds v0.14.0 */\n\n// Vendor -------------- //\n\n@import 'lib/bourbon';\n@import 'lib/neat';\n@import 'lib/normalize';\n\n\n// Core -------------- //\n\n@import 'core/variables';\n@import 'core/fonts';\n@import 'core/base';\n@import 'core/grid';\n@import 'core/utilities';\n\n\n// Elements -------------- //\n// Styles basic HTML elements\n\n@import 'elements/buttons';\n@import 'elements/figure';\n@import 'elements/inputs';\n@import 'elements/labels';\n@import 'elements/list';\n@import 'elements/table';\n@import 'elements/typography';\n\n\n// Components -------------- //\n\n@import 'components/accordions';\n@import 'components/alerts';\n@import 'components/banner';\n@import 'components/footer';\n@import 'components/forms';\n@import 'components/graphic-list';\n@import 'components/header';\n@import 'components/hero';\n@import 'components/layout';\n@import 'components/media-block';\n@import 'components/navigation';\n@import 'components/search';\n@import 'components/section';\n@import 'components/sidenav';\n@import 'components/skipnav';\n","@charset \"UTF-8\";\n\n@if $border-box-sizing == true {\n html { // http://bit.ly/1qk2tVR\n box-sizing: border-box;\n }\n\n * {\n &,\n &::after,\n &::before {\n box-sizing: inherit;\n }\n }\n}\n","/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\n\n/**\n * 1. Set default font family to sans-serif.\n * 2. Prevent iOS and IE text size adjust after device orientation change,\n * without disabling user zoom.\n */\n\nhtml {\n font-family: sans-serif; /* 1 */\n -ms-text-size-adjust: 100%; /* 2 */\n -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/**\n * Remove default margin.\n */\n\nbody {\n margin: 0;\n}\n\n/* HTML5 display definitions\n ========================================================================== */\n\n/**\n * Correct `block` display not defined for any HTML5 element in IE 8/9.\n * Correct `block` display not defined for `details` or `summary` in IE 10/11\n * and Firefox.\n * Correct `block` display not defined for `main` in IE 11.\n */\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n/**\n * 1. Correct `inline-block` display not defined in IE 8/9.\n * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n */\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; /* 1 */\n vertical-align: baseline; /* 2 */\n}\n\n/**\n * Prevent modern browsers from displaying `audio` without controls.\n * Remove excess height in iOS 5 devices.\n */\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n/**\n * Address `[hidden]` styling not present in IE 8/9/10.\n * Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.\n */\n\n[hidden],\ntemplate {\n display: none;\n}\n\n/* Links\n ========================================================================== */\n\n/**\n * Remove the gray background color from active links in IE 10.\n */\n\na {\n background-color: transparent;\n}\n\n/**\n * Improve readability of focused elements when they are also in an\n * active/hover state.\n */\n\na:active,\na:hover {\n outline: 0;\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n */\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n/**\n * Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n */\n\nb,\nstrong {\n font-weight: bold;\n}\n\n/**\n * Address styling not present in Safari and Chrome.\n */\n\ndfn {\n font-style: italic;\n}\n\n/**\n * Address variable `h1` font-size and margin within `section` and `article`\n * contexts in Firefox 4+, Safari, and Chrome.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/**\n * Address styling not present in IE 8/9.\n */\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n/**\n * Address inconsistent and variable font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` affecting `line-height` in all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove border when inside `a` element in IE 8/9/10.\n */\n\nimg {\n border: 0;\n}\n\n/**\n * Correct overflow not hidden in IE 9/10/11.\n */\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * Address margin not present in IE 8/9 and Safari.\n */\n\nfigure {\n margin: 1em 40px;\n}\n\n/**\n * Address differences between Firefox and other browsers.\n */\n\nhr {\n box-sizing: content-box;\n height: 0;\n}\n\n/**\n * Contain overflow in all browsers.\n */\n\npre {\n overflow: auto;\n}\n\n/**\n * Address odd `em`-unit font size rendering in all browsers.\n */\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * Known limitation: by default, Chrome and Safari on OS X allow very limited\n * styling of `select`, unless a `border` property is set.\n */\n\n/**\n * 1. Correct color not being inherited.\n * Known issue: affects color of disabled elements.\n * 2. Correct font properties not being inherited.\n * 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; /* 1 */\n font: inherit; /* 2 */\n margin: 0; /* 3 */\n}\n\n/**\n * Address `overflow` set to `hidden` in IE 8/9/10/11.\n */\n\nbutton {\n overflow: visible;\n}\n\n/**\n * Address inconsistent `text-transform` inheritance for `button` and `select`.\n * All other form control elements do not inherit `text-transform` values.\n * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n * Correct `select` style inheritance in Firefox.\n */\n\nbutton,\nselect {\n text-transform: none;\n}\n\n/**\n * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n * and `video` controls.\n * 2. Correct inability to style clickable `input` types in iOS.\n * 3. Improve usability and consistency of cursor style between image-type\n * `input` and others.\n */\n\nbutton,\nhtml input[type=\"button\"], /* 1 */\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; /* 2 */\n cursor: pointer; /* 3 */\n}\n\n/**\n * Re-set default cursor for disabled elements.\n */\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n/**\n * Remove inner padding and border in Firefox 4+.\n */\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n/**\n * Address Firefox 4+ setting `line-height` on `input` using `!important` in\n * the UA stylesheet.\n */\n\ninput {\n line-height: normal;\n}\n\n/**\n * It's recommended that you don't attempt to style these elements.\n * Firefox's implementation doesn't respect box-sizing, padding, or width.\n *\n * 1. Address box sizing set to `content-box` in IE 8/9/10.\n * 2. Remove excess padding in IE 8/9/10.\n */\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Fix the cursor style for Chrome's increment/decrement buttons. For certain\n * `font-size` values of the `input`, it causes the cursor style of the\n * decrement button to change from `default` to `text`.\n */\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n * 2. Address `box-sizing` set to `border-box` in Safari and Chrome.\n */\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; /* 1 */\n box-sizing: content-box; /* 2 */\n}\n\n/**\n * Remove inner padding and search cancel button in Safari and Chrome on OS X.\n * Safari (but not Chrome) clips the cancel button when the search input has\n * padding (and `textfield` appearance).\n */\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/**\n * Define consistent border, margin, and padding.\n */\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n/**\n * 1. Correct `color` not being inherited in IE 8/9/10/11.\n * 2. Remove padding so people aren't caught out if they zero out fieldsets.\n */\n\nlegend {\n border: 0; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Remove default vertical scrollbar in IE 8/9/10/11.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * Don't inherit the `font-weight` (applied by a rule above).\n * NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n */\n\noptgroup {\n font-weight: bold;\n}\n\n/* Tables\n ========================================================================== */\n\n/**\n * Remove most spacing between table cells.\n */\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n","@mixin font-face(\n $font-family,\n $file-path,\n $weight: normal,\n $style: normal,\n $asset-pipeline: $asset-pipeline,\n $file-formats: eot woff2 woff ttf svg) {\n\n $font-url-prefix: font-url-prefixer($asset-pipeline);\n\n @font-face {\n font-family: $font-family;\n font-style: $style;\n font-weight: $weight;\n\n src: font-source-declaration(\n $font-family,\n $file-path,\n $asset-pipeline,\n $file-formats,\n $font-url-prefix\n );\n }\n}\n","// Used for creating the source string for fonts using @font-face\n// Reference: http://goo.gl/Ru1bKP\n\n@function font-url-prefixer($asset-pipeline) {\n @if $asset-pipeline == true {\n @return font-url;\n } @else {\n @return url;\n }\n}\n\n@function font-source-declaration(\n $font-family,\n $file-path,\n $asset-pipeline,\n $file-formats,\n $font-url) {\n\n $src: ();\n\n $formats-map: (\n eot: \"#{$file-path}.eot?#iefix\" format(\"embedded-opentype\"),\n woff2: \"#{$file-path}.woff2\" format(\"woff2\"),\n woff: \"#{$file-path}.woff\" format(\"woff\"),\n ttf: \"#{$file-path}.ttf\" format(\"truetype\"),\n svg: \"#{$file-path}.svg##{$font-family}\" format(\"svg\")\n );\n\n @each $key, $values in $formats-map {\n @if contains($file-formats, $key) {\n $file-path: nth($values, 1);\n $font-format: nth($values, 2);\n\n @if $asset-pipeline == true {\n $src: append($src, font-url($file-path) $font-format, comma);\n } @else {\n $src: append($src, url($file-path) $font-format, comma);\n }\n }\n }\n\n @return $src;\n}\n","// Apply a natural box layout model to all elements, but allowing components to\n// change\n\nhtml {\n box-sizing: border-box;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit;\n}\n\nbody {\n background-color: $color-white;\n overflow-x: hidden;\n}\n\n// Hack for clearfixes\n.lt-ie9 {\n * {\n // scss-lint:disable ImportantRule\n filter: none !important;\n }\n}\n\n// for IE < 11, see:\n// \n[hidden] {\n // scss-lint:disable ImportantRule\n display: none !important;\n}\n","@charset \"UTF-8\";\n\n/// Makes an element a outer container by centering it in the viewport, clearing its floats, and setting its `max-width`.\n/// Although optional, using `outer-container` is recommended. The mixin can be called on more than one element per page, as long as they are not nested.\n///\n/// @param {Number [unit]} $local-max-width [$max-width]\n/// Max width to be applied to the element. Can be a percentage or a measure.\n///\n/// @example scss - Usage\n/// .element {\n/// @include outer-container(100%);\n/// }\n///\n/// @example css - CSS Output\n/// .element {\n/// max-width: 100%;\n/// margin-left: auto;\n/// margin-right: auto;\n/// }\n///\n/// .element::after {\n/// clear: both;\n/// content: \"\";\n/// display: table;\n/// }\n\n@mixin outer-container($local-max-width: $max-width) {\n @include clearfix;\n max-width: $local-max-width;\n margin: {\n left: auto;\n right: auto;\n }\n}\n","// Grid container\n.usa-grid,\n.usa-grid-full {\n @include outer-container();\n max-width: $site-max-width;\n}\n\n.usa-grid {\n @include padding(null $site-margins-mobile);\n\n @include media($medium-screen) {\n @include padding(null $site-margins);\n }\n}\n\n.usa-grid-full {\n padding: 0;\n}\n\n// Grid items\n@include media($medium) {\n .usa-width-one-whole {\n @include span-columns(6);\n }\n\n .usa-width-one-half {\n @include span-columns(3);\n }\n\n .usa-width-one-third {\n @include span-columns(2);\n }\n\n .usa-width-two-thirds {\n @include span-columns(4);\n }\n\n .usa-width-one-fourth {\n @include span-columns(3);\n\n &:nth-child(2n) {\n margin-right: 0;\n }\n }\n\n .usa-width-three-fourths {\n @include span-columns(6);\n }\n\n .usa-width-one-sixth {\n @include span-columns(2);\n\n &:nth-child(3n) {\n margin-right: 0;\n }\n }\n\n .usa-width-five-sixths {\n @include span-columns(4);\n }\n\n .usa-width-one-twelfth {\n @include span-columns(2);\n\n &:nth-child(3n) {\n margin-right: 0;\n }\n }\n\n .usa-width-five-twelfths {\n @include span-columns(2);\n }\n\n .usa-width-seven-twelfths {\n @include span-columns(4);\n }\n}\n\n@include media($large) {\n .usa-width-one-whole {\n @include span-columns(12);\n }\n\n .usa-width-one-half {\n @include span-columns(6);\n }\n\n .usa-width-one-third {\n @include span-columns(4);\n }\n\n .usa-width-two-thirds {\n @include span-columns(8);\n }\n\n .usa-width-one-fourth {\n @include span-columns(3);\n\n &:nth-child(2n) {\n @include span-columns(3);\n }\n\n &:nth-child(4n) {\n margin-right: 0;\n }\n }\n\n .usa-width-three-fourths {\n @include span-columns(9);\n }\n\n .usa-width-one-sixth {\n @include span-columns(2);\n\n &:nth-child(3n) {\n @include span-columns(2);\n }\n\n &:nth-child(6n) {\n margin-right: 0;\n }\n }\n\n .usa-width-five-sixths {\n @include span-columns(10);\n }\n\n\n .usa-width-one-twelfth {\n @include span-columns(1);\n\n &:nth-child(3n) {\n @include span-columns(1);\n }\n\n &:nth-child(12n) {\n margin-right: 0;\n }\n }\n\n .usa-width-five-twelfths {\n @include span-columns(5);\n }\n\n .usa-width-seven-twelfths {\n @include span-columns(7);\n }\n}\n\n// Specifies end of a row.\n// Required if grid-box contains multiple rows.\n// Required if browser does not support :last-child\n.usa-end-row {\n @include omega();\n}\n","// These variables drive almost every aspect of the U.S. Web Design\n// system. Every variable is declared as !default so that it can be\n// overridden by a previous import.\n//\n// XXX Do not modify this file!\n//\n// If you want to override a variable, set that variable in one of your\n// own partials, then @import '{path/to/uswds/}core/variables'.\n\n// Typography\n// Removing the !default from $em-base so we are not inheriting that \n// value from Bourbon.\n$em-base: 10px;\n$base-font-size: rem(17px) !default;\n$small-font-size: rem(14px) !default;\n$lead-font-size: rem(20px) !default;\n$title-font-size: rem(52px) !default;\n$h1-font-size: rem(40px) !default;\n$h2-font-size: rem(30px) !default;\n$h3-font-size: rem(20px) !default;\n$h4-font-size: rem(17px) !default;\n$h5-font-size: rem(15px) !default;\n$h6-font-size: rem(13px) !default;\n$base-line-height: 1.5 !default;\n$heading-line-height: 1.3 !default;\n$lead-line-height: 1.7 !default;\n\n$font-sans: 'Source Sans Pro', $helvetica !default;\n$font-serif: 'Merriweather', $georgia !default;\n\n$font-normal: 400 !default;\n$font-bold: 700 !default;\n\n// Color\n$color-primary: #0071bc !default;\n$color-primary-darker: #205493 !default;\n$color-primary-darkest: #112e51 !default;\n\n$color-primary-alt: #02bfe7 !default;\n$color-primary-alt-dark: #00a6d2 !default;\n$color-primary-alt-darkest: #046b99 !default;\n$color-primary-alt-light: #9bdaf1 !default; // lighten($color-primary-alt, 60%)\n$color-primary-alt-lightest: #e1f3f8 !default; // lighten($color-primary-alt, 90%)\n\n$color-secondary: #e31c3d !default;\n$color-secondary-dark: #cd2026 !default;\n$color-secondary-darkest: #981b1e !default;\n$color-secondary-light: #e59393 !default; // lighten($color-secondary, 60%)\n$color-secondary-lightest: #f9dede !default; // lighten($color-secondary, 90%)\n\n$color-white: #ffffff !default;\n$color-base: #212121 !default;\n$color-black: #000000 !default;\n\n$color-gray-dark: #323a45 !default;\n$color-gray: #5b616b !default; // lighten($color-gray-dark, 20%)\n$color-gray-medium: #757575 !default; // lightest gray that passes color contrast\n$color-gray-light: #aeb0b5 !default; // lighten($color-gray-dark, 60%)\n$color-gray-lighter: #d6d7d9 !default; // lighten($color-gray-dark, 80%)\n$color-gray-lightest: #f1f1f1 !default; // lighten($color-gray-dark, 91%)\n\n$color-gray-warm-dark: #494440 !default;\n$color-gray-warm-light: #e4e2e0 !default; // lighten($color-gray-warm-dark, 90%)\n$color-gray-cool-light: #dce4ef !default; // lighten($color-primary, 90%)\n\n$color-gold: #fdb81e !default;\n$color-gold-light: #f9c642 !default; // lighten($color-gold, 20%)\n$color-gold-lighter: #fad980 !default; // lighten($color-gold, 60%)\n$color-gold-lightest: #fff1d2 !default; // lighten($color-gold, 83%)\n\n$color-green: #2e8540 !default;\n$color-green-light: #4aa564 !default; // lighten($color-green, 20%)\n$color-green-lighter: #94bfa2 !default; // lighten($color-green, 60%)\n$color-green-lightest: #e7f4e4 !default; // lighten($color-green, 60%)\n\n$color-cool-blue: #205493 !default;\n$color-cool-blue-light: #4773aa !default; // lighten($color-cool-blue, 20%)\n$color-cool-blue-lighter: #8ba6ca !default; // lighten($color-cool-blue, 60%)\n$color-cool-blue-lightest: #dce4ef !default; // lighten($color-cool-blue, 90%)\n\n$color-focus: #3e94cf !default;\n$color-visited: #4c2c92 !default;\n\n$color-shadow: rgba(#000, 0.3) !default;\n\n// Mobile First Breakpoints\n$small-screen: 481px !default;\n$medium-screen: 600px !default;\n$large-screen: 1201px !default;\n\n// Grid column counts by screen size\n$grid-columns-small: 1 !default;\n$grid-columns-medium: 6 !default;\n$grid-columns-large: 12 !default;\n\n// @media single-keyword helpers\n$small: new-breakpoint(min-width $small-screen $grid-columns-small) !default;\n$medium: new-breakpoint(min-width $medium-screen $grid-columns-medium) !default;\n$large: new-breakpoint(min-width $large-screen $grid-columns-large) !default;\n\n// Relative font and image file paths\n$font-path: '../fonts' !default;\n$image-path: '../img' !default;\n\n// Set $asset-pipeline to true if you're using the Rails Asset Pipeline\n$asset-pipeline: false !default;\n\n// Magic Numbers\n$text-max-width: 53rem !default;\n$lead-max-width: 77rem !default;\n$site-max-width: 1040px !default;\n$site-margins: 3rem !default;\n$site-margins-mobile: 1.5rem !default;\n$article-max-width: 600px !default;\n$input-max-width: 46rem !default;\n$border-radius: rem(3px) !default;\n$box-shadow: 0 0 2px $color-shadow !default;\n$focus-shadow: 0 0 3px $color-focus, 0 0 7px $color-focus !default;\n$nav-width: 951px !default;\n\n// 44 x 44 pixels hit target following Apple iOS Human Interface\n// Guidelines\n$hit-area: 4.4rem !default;\n","@charset \"UTF-8\";\n\n/// Provides an easy way to include a clearfix for containing floats.\n///\n/// @link http://goo.gl/yP5hiZ\n///\n/// @example scss\n/// .element {\n/// @include clearfix;\n/// }\n///\n/// @example css\n/// .element::after {\n/// clear: both;\n/// content: \"\";\n/// display: block;\n/// }\n\n@mixin clearfix {\n &::after {\n clear: both;\n content: \"\";\n display: block;\n }\n}\n","@charset \"UTF-8\";\n\n/// Directional-property mixins are shorthands for writing properties like the following\n///\n/// @ignore You can also use `false` instead of `null`.\n///\n/// @param {List} $vals\n/// List of directional values\n///\n/// @example scss - Usage\n/// .element {\n/// @include border-style(dotted null);\n/// @include margin(null 0 10px);\n/// }\n///\n/// @example css - CSS Output\n/// .element {\n/// border-bottom-style: dotted;\n/// border-top-style: dotted;\n/// margin-bottom: 10px;\n/// margin-left: 0;\n/// margin-right: 0;\n/// }\n///\n/// @require {function} contains-falsy\n///\n/// @return {List}\n\n@function collapse-directionals($vals) {\n $output: null;\n\n $a: nth($vals, 1);\n $b: if(length($vals) < 2, $a, nth($vals, 2));\n $c: if(length($vals) < 3, $a, nth($vals, 3));\n $d: if(length($vals) < 2, $a, nth($vals, if(length($vals) < 4, 2, 4)));\n\n @if $a == 0 { $a: 0; }\n @if $b == 0 { $b: 0; }\n @if $c == 0 { $c: 0; }\n @if $d == 0 { $d: 0; }\n\n @if $a == $b and $a == $c and $a == $d { $output: $a; }\n @else if $a == $c and $b == $d { $output: $a $b; }\n @else if $b == $d { $output: $a $b $c; }\n @else { $output: $a $b $c $d; }\n\n @return $output;\n}\n\n/// Output directional properties, for instance `margin`.\n///\n/// @access private\n///\n/// @param {String} $pre\n/// Prefix to use\n/// @param {String} $suf\n/// Suffix to use\n/// @param {List} $vals\n/// List of values\n///\n/// @require {function} collapse-directionals\n/// @require {function} contains-falsy\n\n@mixin directional-property($pre, $suf, $vals) {\n // Property Names\n $top: $pre + \"-top\" + if($suf, \"-#{$suf}\", \"\");\n $bottom: $pre + \"-bottom\" + if($suf, \"-#{$suf}\", \"\");\n $left: $pre + \"-left\" + if($suf, \"-#{$suf}\", \"\");\n $right: $pre + \"-right\" + if($suf, \"-#{$suf}\", \"\");\n $all: $pre + if($suf, \"-#{$suf}\", \"\");\n\n $vals: collapse-directionals($vals);\n\n @if contains-falsy($vals) {\n @if nth($vals, 1) { #{$top}: nth($vals, 1); }\n\n @if length($vals) == 1 {\n @if nth($vals, 1) { #{$right}: nth($vals, 1); }\n } @else {\n @if nth($vals, 2) { #{$right}: nth($vals, 2); }\n }\n\n @if length($vals) == 2 {\n @if nth($vals, 1) { #{$bottom}: nth($vals, 1); }\n @if nth($vals, 2) { #{$left}: nth($vals, 2); }\n } @else if length($vals) == 3 {\n @if nth($vals, 3) { #{$bottom}: nth($vals, 3); }\n @if nth($vals, 2) { #{$left}: nth($vals, 2); }\n } @else if length($vals) == 4 {\n @if nth($vals, 3) { #{$bottom}: nth($vals, 3); }\n @if nth($vals, 4) { #{$left}: nth($vals, 4); }\n }\n } @else {\n #{$all}: $vals;\n }\n}\n","@charset \"UTF-8\";\n\n/// Outputs a media-query block with an optional grid context (the total number of columns used in the grid).\n///\n/// @param {List} $query\n/// A list of media query features and values, where each `$feature` should have a corresponding `$value`.\n/// For a list of valid values for `$feature`, click [here](http://www.w3.org/TR/css3-mediaqueries/#media1).\n///\n/// If there is only a single `$value` in `$query`, `$default-feature` is going to be used.\n///\n/// The number of total columns in the grid can be set by passing `$columns` at the end of the list (overrides `$total-columns`).\n///\n///\n/// @param {Number (unitless)} $total-columns [$grid-columns]\n/// - Number of columns to use in the new grid context. Can be set as a shorthand in the first parameter.\n///\n/// @example scss - Usage\n/// .responsive-element {\n/// @include media(769px) {\n/// @include span-columns(6);\n/// }\n/// }\n///\n/// .new-context-element {\n/// @include media(min-width 320px max-width 480px, 6) {\n/// @include span-columns(6);\n/// }\n/// }\n///\n/// @example css - CSS Output\n/// @media screen and (min-width: 769px) {\n/// .responsive-element {\n/// display: block;\n/// float: left;\n/// margin-right: 2.35765%;\n/// width: 48.82117%;\n/// }\n///\n/// .responsive-element:last-child {\n/// margin-right: 0;\n/// }\n/// }\n///\n/// @media screen and (min-width: 320px) and (max-width: 480px) {\n/// .new-context-element {\n/// display: block;\n/// float: left;\n/// margin-right: 4.82916%;\n/// width: 100%;\n/// }\n///\n/// .new-context-element:last-child {\n/// margin-right: 0;\n/// }\n/// }\n\n@mixin media($query: $feature $value $columns, $total-columns: $grid-columns) {\n @if length($query) == 1 {\n @media screen and ($default-feature: nth($query, 1)) {\n $default-grid-columns: $grid-columns;\n $grid-columns: $total-columns !global;\n @content;\n $grid-columns: $default-grid-columns !global;\n }\n } @else {\n $loop-to: length($query);\n $media-query: \"screen and \";\n $default-grid-columns: $grid-columns;\n $grid-columns: $total-columns !global;\n\n @if is-not(is-even(length($query))) {\n $grid-columns: nth($query, $loop-to) !global;\n $loop-to: $loop-to - 1;\n }\n\n $i: 1;\n @while $i <= $loop-to {\n $media-query: $media-query + \"(\" + nth($query, $i) + \": \" + nth($query, $i + 1) + \") \";\n\n @if ($i + 1) != $loop-to {\n $media-query: $media-query + \"and \";\n }\n\n $i: $i + 2;\n }\n\n @media #{$media-query} {\n @content;\n $grid-columns: $default-grid-columns !global;\n }\n }\n}\n","@charset \"UTF-8\";\n\n/// Specifies the number of columns an element should span. If the selector is nested the number of columns of its parent element should be passed as an argument as well.\n///\n/// @param {List} $span\n/// A list containing `$columns`, the unitless number of columns the element spans (required), and `$container-columns`, the number of columns the parent element spans (optional).\n///\n/// If only one value is passed, it is assumed that it's `$columns` and that that `$container-columns` is equal to `$grid-columns`, the total number of columns in the grid.\n///\n/// The values can be separated with any string such as `of`, `/`, etc.\n///\n/// `$columns` also accepts decimals for when it's necessary to break out of the standard grid. E.g. Passing `2.4` in a standard 12 column grid will divide the row into 5 columns.\n///\n/// @param {String} $display [block]\n/// Sets the display property of the element. By default it sets the display property of the element to `block`.\n///\n/// If passed `block-collapse`, it also removes the margin gutter by adding it to the element width.\n///\n/// If passed `table`, it sets the display property to `table-cell` and calculates the width of the element without taking gutters into consideration. The result does not align with the block-based grid.\n///\n/// @example scss - Usage\n/// .element {\n/// @include span-columns(6);\n///\n/// .nested-element {\n/// @include span-columns(2 of 6);\n/// }\n/// }\n///\n/// @example css - CSS Output\n/// .element {\n/// display: block;\n/// float: left;\n/// margin-right: 2.35765%;\n/// width: 48.82117%;\n/// }\n///\n/// .element:last-child {\n/// margin-right: 0;\n/// }\n///\n/// .element .nested-element {\n/// display: block;\n/// float: left;\n/// margin-right: 4.82916%;\n/// width: 30.11389%;\n/// }\n///\n/// .element .nested-element:last-child {\n/// margin-right: 0;\n/// }\n\n@mixin span-columns($span: $columns of $container-columns, $display: block) {\n $columns: nth($span, 1);\n $container-columns: container-span($span);\n\n $parent-columns: get-parent-columns($container-columns) !global;\n\n $direction: get-direction($layout-direction, $default-layout-direction);\n $opposite-direction: get-opposite-direction($direction);\n\n $display-table: is-display-table($container-display-table, $display);\n\n @if $display-table {\n display: table-cell;\n width: percentage($columns / $container-columns);\n } @else {\n float: #{$opposite-direction};\n\n @if $display != no-display {\n display: block;\n }\n\n @if $display == collapse {\n @include -neat-warn(\"The 'collapse' argument will be deprecated. Use 'block-collapse' instead.\");\n }\n\n @if $display == collapse or $display == block-collapse {\n width: flex-grid($columns, $container-columns) + flex-gutter($container-columns);\n\n &:last-child {\n width: flex-grid($columns, $container-columns);\n }\n\n } @else {\n margin-#{$direction}: flex-gutter($container-columns);\n width: flex-grid($columns, $container-columns);\n\n &:last-child {\n margin-#{$direction}: 0;\n }\n }\n }\n}\n","$parent-columns: $grid-columns !default;\n$fg-column: $column;\n$fg-gutter: $gutter;\n$fg-max-columns: $grid-columns;\n$container-display-table: false !default;\n$layout-direction: LTR !default;\n\n@function flex-grid($columns, $container-columns: $fg-max-columns) {\n $width: $columns * $fg-column + ($columns - 1) * $fg-gutter;\n $container-width: $container-columns * $fg-column + ($container-columns - 1) * $fg-gutter;\n @return percentage($width / $container-width);\n}\n\n@function flex-gutter($container-columns: $fg-max-columns, $gutter: $fg-gutter) {\n $container-width: $container-columns * $fg-column + ($container-columns - 1) * $fg-gutter;\n @return percentage($gutter / $container-width);\n}\n\n@function grid-width($n) {\n @return $n * $gw-column + ($n - 1) * $gw-gutter;\n}\n\n@function get-parent-columns($columns) {\n @if $columns != $grid-columns {\n $parent-columns: $columns !global;\n } @else {\n $parent-columns: $grid-columns !global;\n }\n\n @return $parent-columns;\n}\n\n@function is-display-table($container-is-display-table, $display) {\n @return $container-is-display-table == true or $display == table;\n}\n","@charset \"UTF-8\";\n\n/// Removes the element's gutter margin, regardless of its position in the grid hierarchy or display property. It can target a specific element, or every `nth-child` occurrence. Works only with `block` layouts.\n///\n/// @param {List} $query [block]\n/// List of arguments. Supported arguments are `nth-child` selectors (targets a specific pseudo element) and `auto` (targets `last-child`).\n///\n/// When passed an `nth-child` argument of type `*n` with `block` display, the omega mixin automatically adds a clear to the `*n+1` th element. Note that composite arguments such as `2n+1` do not support this feature.\n///\n/// **Deprecation warning**: The omega mixin will no longer take a `$direction` argument. To change the layout direction, use `row($direction)` or set `$default-layout-direction` instead.\n///\n/// @example scss - Usage\n/// .element {\n/// @include omega;\n/// }\n///\n/// .nth-element {\n/// @include omega(4n);\n/// }\n///\n/// @example css - CSS Output\n/// .element {\n/// margin-right: 0;\n/// }\n///\n/// .nth-element:nth-child(4n) {\n/// margin-right: 0;\n/// }\n///\n/// .nth-element:nth-child(4n+1) {\n/// clear: left;\n/// }\n\n@mixin omega($query: block, $direction: default) {\n $table: belongs-to(table, $query);\n $auto: belongs-to(auto, $query);\n\n @if $direction != default {\n @include -neat-warn(\"The omega mixin will no longer take a $direction argument. To change the layout direction, use the direction(){...} mixin.\");\n } @else {\n $direction: get-direction($layout-direction, $default-layout-direction);\n }\n\n @if $table {\n @include -neat-warn(\"The omega mixin no longer removes padding in table layouts.\");\n }\n\n @if length($query) == 1 {\n @if $auto {\n &:last-child {\n margin-#{$direction}: 0;\n }\n }\n\n @else if contains-display-value($query) and $table == false {\n margin-#{$direction}: 0;\n }\n\n @else {\n @include nth-child($query, $direction);\n }\n } @else if length($query) == 2 {\n @if $auto {\n &:last-child {\n margin-#{$direction}: 0;\n }\n } @else {\n @include nth-child(nth($query, 1), $direction);\n }\n } @else {\n @include -neat-warn(\"Too many arguments passed to the omega() mixin.\");\n }\n}\n\n@mixin nth-child($query, $direction) {\n $opposite-direction: get-opposite-direction($direction);\n\n &:nth-child(#{$query}) {\n margin-#{$direction}: 0;\n }\n\n @if type-of($query) == number and unit($query) == \"n\" {\n &:nth-child(#{$query}+1) {\n clear: $opposite-direction;\n }\n }\n}\n","// Mobile-first media query helper\n@mixin media($bp) {\n @media screen and (min-width: #{$bp}) {\n @content;\n }\n}\n\n// Screen reader only helper\n@mixin sr-only() {\n position: absolute;\n left: -999em;\n}\n\n.usa-sr-only {\n @include sr-only();\n}\n\n// Aria hidden helper\n@mixin accessibly-hidden() {\n &[aria-hidden=true] {\n display: none;\n }\n}\n\n// Unstyled list helper\n@mixin unstyled-list() {\n @include margin(0 null);\n list-style-type: none;\n padding-left: 0;\n\n > li {\n margin-bottom: 0;\n }\n}\n\n// Font smoothing mixin\n// Only use for light text on dark background\n// TODO: Remove after adding PostCSS\n@mixin font-smoothing {\n -moz-osx-font-smoothing: grayscale;\n -webkit-font-smoothing: antialiased;\n}\n\n// Content size helpers\n@mixin allow-layout-classes {\n @include margin(null auto);\n\n &.width-one-half {\n @include media($medium-screen) {\n width: 50%;\n }\n }\n\n &.width-one-third {\n @include media($medium-screen) {\n width: 33%;\n }\n }\n\n &.width-two-thirds {\n @include media($medium-screen) {\n width: 67%;\n }\n }\n\n &.width-one-fourth {\n @include media($medium-screen) {\n width: 25%;\n }\n }\n\n &.width-three-fourths {\n @include media($medium-screen) {\n width: 75%;\n }\n }\n\n &.align-left {\n @include media($medium-screen) {\n float: left;\n margin-right: 2em;\n margin-top: 0.5em;\n }\n }\n\n &.align-right {\n @include media($medium-screen) {\n float: right;\n margin-left: 2em;\n margin-top: 0.5em;\n }\n }\n}\n\n@mixin display-icon($icon, $direction, $size, $margin, $hover) {\n &::#{$direction} {\n background-image: url(#{$image-path}/#{$icon}.png);\n background-image: url(#{$image-path}/#{$icon}.svg);\n background-size: 100%;\n content: '';\n display: inline-block;\n height: $size;\n width: $size;\n\n @if $direction == 'after' {\n margin-left: $margin;\n } @else {\n margin-right: $margin;\n }\n }\n\n @if $hover == 'hover' {\n &:hover::#{$direction} {\n background-image: url(#{$image-path}/#{$icon}-hover.png);\n background-image: url(#{$image-path}/#{$icon}-hover.svg);\n }\n }\n}\n\n@mixin usa-sidenav-list {\n @include unstyled-list();\n\n > li {\n background-color: transparent;\n border-top: 1px solid $color-gray;\n font-size: $h4-font-size;\n\n &:first-child {\n border-top: none;\n }\n }\n\n a {\n border: none;\n color: $color-base;\n display: block;\n font-family: $font-sans;\n line-height: 1.3;\n padding: 0.85rem 1rem 0.85rem 1.8rem;\n text-decoration: none;\n\n &:hover {\n background-color: $color-gray-lightest;\n color: $color-primary;\n text-decoration: none;\n }\n\n &:focus {\n position: relative;\n z-index: 1;\n }\n\n &.usa-current {\n border-left: 4px solid $color-primary;\n color: $color-primary;\n font-weight: $font-bold;\n padding-left: 1.4rem;\n }\n }\n}\n\n\n@mixin usa-sidenav-sublist {\n @include unstyled-list();\n margin: 0;\n width: 100%;\n\n li {\n border: none;\n font-size: $h5-font-size;\n }\n\n a {\n padding-left: 2.8rem;\n line-height: $heading-line-height;\n\n &:hover,\n &.usa-current {\n border: none;\n padding-left: 2.8rem;\n }\n }\n\n .usa-sidenav-sub_list {\n a {\n padding-left: 3.8rem;\n\n &:hover {\n padding-left: 3.8rem;\n }\n }\n }\n}\n","// Buttons variables\n\n$button-stroke: inset 0 0 0 2px;\n\n// Buttons\n\n// scss-lint:disable PropertyCount\n.usa-button,\n.usa-button-primary,\n.usa-button:visited,\n.usa-button-primary:visited,\nbutton,\n[type=\"button\"],\n[type=\"submit\"],\n[type=\"reset\"],\n[type=\"image\"] {\n @include font-smoothing;\n @include margin(0.5em 0.5em 0.5em null);\n appearance: none;\n background-color: $color-primary;\n border: 0;\n border-radius: $border-radius;\n color: $color-white;\n cursor: pointer;\n display: inline-block;\n font-family: $font-sans;\n font-size: $base-font-size;\n font-weight: $font-bold;\n line-height: 1;\n outline: none;\n padding: 1rem 2rem;\n text-align: center;\n text-decoration: none;\n width: 100%;\n\n @include media($small-screen) {\n width: auto;\n }\n\n &:hover,\n &.usa-button-hover {\n background-color: $color-primary-darker;\n border-bottom: 0;\n color: $color-white;\n text-decoration: none;\n }\n\n &:focus,\n &.usa-button-focus {\n box-shadow: $focus-shadow;\n }\n\n &:active,\n &.usa-button-active {\n background-color: $color-primary-darkest;\n }\n\n &.usa-button-primary-alt {\n background-color: $color-primary-alt;\n color: $color-base;\n\n &:hover,\n &.usa-button-hover {\n background-color: $color-primary-alt-dark;\n }\n\n &:active,\n &.usa-button-active {\n background-color: $color-primary-alt-darkest;\n color: $color-white;\n }\n }\n\n &.usa-button-secondary {\n background-color: $color-secondary;\n\n &:hover,\n &.usa-button-hover {\n background-color: $color-secondary-dark;\n }\n\n &:active,\n &.usa-button-active {\n background-color: $color-secondary-darkest;\n }\n }\n\n &.usa-button-gray {\n background-color: $color-gray;\n\n &:hover,\n &.usa-button-hover {\n background-color: $color-gray-dark;\n }\n\n &:active,\n &.usa-button-active {\n background-color: $color-base;\n }\n }\n\n &.usa-button-outline {\n background-color: $color-white;\n box-shadow: $button-stroke $color-primary;\n color: $color-primary;\n\n &:hover,\n &.usa-button-hover {\n box-shadow: $button-stroke $color-primary-darker;\n color: $color-primary-darker;\n }\n\n &:active,\n &.usa-button-active {\n box-shadow: $button-stroke $color-primary-darkest;\n color: $color-primary-darkest;\n }\n\n &:focus,\n &.usa-button-focus {\n box-shadow: $button-stroke $color-primary-darkest, $focus-shadow;\n }\n }\n\n &.usa-button-outline-inverse {\n background: transparent;\n box-shadow: $button-stroke $color-white;\n color: $color-white;\n\n &:hover,\n &.usa-button-hover {\n box-shadow: $button-stroke $color-gray-lighter;\n color: $color-gray-lighter;\n }\n\n &:active,\n &.usa-button-active {\n box-shadow: $button-stroke $color-gray-light;\n color: $color-gray-lighter;\n }\n\n &:focus,\n &.usa-button-focus {\n box-shadow: $button-stroke $color-gray-light, $focus-shadow;\n }\n }\n\n &.usa-button-big {\n font-size: 1.9rem;\n padding: 1.5rem 3rem;\n }\n}\n// scss-lint:enable PropertyCount\n\n[type=\"submit\"]:disabled,\n.usa-button-disabled {\n background-color: $color-gray-lighter;\n color: $color-gray-dark;\n pointer-events: none;\n\n &:hover,\n &.usa-button-hover,\n &:active,\n &.usa-button-active,\n &:focus {\n background-color: $color-gray-lighter;\n border: 0;\n box-shadow: none;\n color: $color-gray-dark;\n }\n}\n\n@mixin button-unstyled {\n background-color: transparent;\n border: 0;\n border-radius: 0;\n font-weight: $font-normal;\n margin: 0;\n outline: 0;\n padding: 0;\n text-align: left;\n -webkit-font-smoothing: auto;\n\n &:hover {\n background-color: transparent;\n }\n}\n\n.usa-button-unstyled {\n @include button-unstyled;\n}\n","img {\n max-width: 100%;\n}\n\n// TODO: Add documentation instructions for using this class on image links\n@mixin media-link {\n display: inline-block;\n line-height: 0;\n}\n\n.media_link {\n @include media-link();\n}\n","// scss-lint:disable QualifyingElement, PropertyCount\n\n$input-line-height: 1.3;\n$input-border-width: 1px;\n$input-padding-vertical: 1rem;\n\n// input heights will vary by browser and type\n// if height not explicitly set\n$input-height-exact: (\n ($base-font-size * $input-line-height) +\n ($input-padding-vertical * 2) +\n (rem($input-border-width * 2))\n);\n\n// truncated to 1 decimal place\n// (i.e., 1.21rem -> 1.2rem)\n$input-height: floor($input-height-exact * 10) / 10;\n\n// Block form elements\ninput,\ntextarea,\nselect {\n appearance: none;\n border: $input-border-width solid $color-gray;\n border-radius: 0;\n box-sizing: border-box;\n color: $color-base; // standardize on firefox\n display: block;\n font-size: $base-font-size;\n height: $input-height;\n line-height: $input-line-height;\n margin: 0.2em 0;\n max-width: $input-max-width;\n outline: none;\n padding: $input-padding-vertical 0.7em;\n width: 100%;\n\n &:focus,\n &.usa-input-focus {\n box-shadow: $focus-shadow;\n }\n\n &.usa-input-success {\n border: 3px solid $color-green-light;\n }\n}\n\n.usa-input-error {\n border-left: 4px solid $color-secondary-dark;\n margin-top: 3rem;\n padding-bottom: 0.8rem;\n padding-left: 1.5rem;\n padding-top: 0.8rem;\n position: relative;\n right: 1.9rem;\n\n input,\n textarea,\n select {\n border: 3px solid $color-secondary-dark;\n width: calc(100% + 1.9rem); // 1.5rem left padding + 4px border from input error spacing\n }\n\n label {\n margin-top: 0;\n }\n\n .usa-input-inline {\n border: $input-border-width solid $color-gray;\n width: inherit;\n }\n\n .usa-input-inline-error {\n border: 3px solid $color-secondary-dark;\n }\n}\n\n.usa-input-error-label {\n display: block;\n font-size: $base-font-size;\n font-weight: $font-bold;\n}\n\n.usa-input-error-message {\n color: $color-secondary-dark;\n display: block;\n font-size: $base-font-size;\n font-weight: $font-bold;\n padding-bottom: 3px;\n padding-top: 3px;\n}\n\n.usa-input-required:after {\n color: $color-secondary-darkest;\n content: ' (*Required)';\n}\n\nlabel {\n display: block;\n margin-top: 3rem;\n max-width: $input-max-width;\n}\n\ntextarea {\n height: 16rem;\n}\n\nselect {\n -moz-appearance: none;\n -webkit-appearance: none;\n appearance: none;\n background-color: $color-white;\n background-image: url('#{$image-path}/arrow-down.png');\n background-image: url('#{$image-path}/arrow-down.svg');\n background-position: right 1.3rem center;\n background-repeat: no-repeat;\n background-size: 1.3rem;\n}\n\nlegend {\n font-size: $h2-font-size;\n font-weight: $font-bold;\n}\n\n.usa-fieldset-inputs {\n label {\n margin-top: 0;\n }\n}\n\n// Hint text\n\n.usa-form-hint {\n color: $color-gray-medium;\n font-family: $font-sans;\n margin-bottom: 0;\n}\n\n// Custom checkboxes\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n margin-left: -2rem;\n opacity: 0;\n position: absolute;\n\n .lt-ie9 & {\n border: 0;\n float: left;\n margin: 0.4em 0.4em 0 0;\n position: static;\n width: auto;\n }\n}\n\n[type=\"checkbox\"] + label,\n[type=\"radio\"] + label {\n cursor: pointer;\n font-weight: 400;\n margin-bottom: 0.5em;\n}\n\n[type=\"checkbox\"] + label::before,\n[type=\"radio\"] + label::before {\n background: $color-white;\n border-radius: $border-radius;\n box-shadow: 0 0 0 1px $color-gray-medium;\n content: '\\a0';\n display: inline-block;\n height: 1.8rem;\n line-height: 1.8rem;\n margin-right: 0.6em;\n text-indent: 0.15em;\n vertical-align: middle\\0; // Target IE 11 and below to vertically center inputs\n width: 1.8rem;\n}\n\n[type=\"radio\"] + label::before {\n box-shadow: 0 0 0 2px $color-white, 0 0 0 3px $color-gray-medium;\n height: 1.6rem;\n line-height: 1.6rem;\n width: 1.6rem;\n border-radius: 100%;\n}\n\n[type=\"checkbox\"]:checked + label::before,\n[type=\"radio\"]:checked + label::before {\n background-color: $color-primary;\n box-shadow: 0 0 0 1px $color-primary;\n}\n\n[type=\"radio\"]:checked + label::before {\n box-shadow: 0 0 0 2px $color-white, 0 0 0 4px $color-primary;\n}\n\n[type=\"radio\"]:focus + label::before {\n box-shadow: 0 0 0 2px $color-white, 0 0 0 4px $color-primary, 0 0 3px 4px $color-focus, 0 0 7px 4px $color-focus;\n}\n\n[type=\"checkbox\"]:checked + label::before {\n background-image: url('#{$image-path}/correct8.png');\n background-image: url('#{$image-path}/correct8.svg');\n background-position: 50%;\n background-repeat: no-repeat;\n}\n\n[type=\"checkbox\"]:focus + label::before {\n box-shadow: 0 0 0 1px $color-white, 0 0 0 3px $color-primary;\n}\n\n[type=\"checkbox\"]:disabled + label {\n color: $color-gray;\n}\n\n[type=\"checkbox\"]:disabled + label::before,\n[type=\"radio\"]:disabled + label::before {\n background: $color-gray-lighter;\n box-shadow: 0 0 0 1px $color-gray-light;\n cursor: not-allowed;\n}\n\n// Range inputs\n\n[type=range] {\n -webkit-appearance: none;\n border: none;\n padding-left: 0;\n width: 100%;\n}\n\n[type=range]:focus {\n box-shadow: none;\n outline: none;\n}\n\n[type=range]::-webkit-slider-runnable-track {\n background: $color-gray-light;\n border: 1px solid $color-gray-medium;\n cursor: pointer;\n height: 1.2rem;\n width: 100%;\n}\n\n[type=range]::-moz-range-track {\n background: $color-primary;\n border: 1px solid $color-gray-medium;\n cursor: pointer;\n height: 1.2rem;\n width: 100%;\n}\n\n[type=range]::-ms-track {\n background: transparent;\n color: transparent;\n cursor: pointer;\n height: 1.2rem;\n width: 100%;\n}\n\n[type=range]::-webkit-slider-thumb {\n -webkit-appearance: none;\n border: 1px solid $color-gray-medium;\n height: 2.2rem;\n border-radius: 1.5rem;\n background: $color-gray-lightest;\n cursor: pointer;\n margin-top: -.65rem;\n width: 2.2rem;\n}\n\n[type=range]::-moz-range-thumb {\n background: $color-gray-lightest;\n border: 1px solid $color-gray-medium;\n border-radius: 1.5rem;\n cursor: pointer;\n height: 2.2rem;\n width: 2.2rem;\n}\n\n[type=range]::-ms-thumb {\n background: $color-gray-lightest;\n border: 1px solid $color-gray-medium;\n border-radius: 1.5rem;\n cursor: pointer;\n height: 2.2rem;\n width: 2.2rem;\n}\n\n[type=range]::-ms-fill-lower {\n background: $color-gray-light;\n border: 1px solid $color-gray-medium;\n border-radius: 2rem;\n}\n\n[type=range]::-ms-fill-upper {\n background: $color-gray-light;\n border: 1px solid $color-gray-medium;\n border-radius: 2rem;\n}\n\n[type=range]:focus::-webkit-slider-thumb {\n border: 2px solid $color-focus;\n}\n\n[type=range]:focus::-moz-range-thumb {\n border: 2px solid $color-focus;\n}\n\n[type=range]:focus::-ms-thumb {\n border: 2px solid $color-focus;\n}\n\n// Memorable dates\n\n.usa-date-of-birth {\n label {\n margin-top: 0;\n }\n\n [type=number]::-webkit-inner-spin-button,\n [type=number]::-webkit-outer-spin-button {\n -webkit-appearance: none;\n appearance: none;\n margin: 0;\n }\n\n [type=number] {\n -moz-appearance: textfield;\n }\n}\n\n.usa-form-group-day,\n.usa-form-group-month,\n.usa-form-group-year {\n clear: none;\n float: left;\n margin-right: 1.5rem;\n width: 5rem;\n}\n\n.usa-form-group-year {\n width: 7rem;\n}\n",".usa-label {\n background-color: $color-primary;\n border-radius: $border-radius;\n color: $color-white;\n font-size: $h5-font-size;\n margin-right: 0.5rem;\n padding: 0.1rem 0.7rem;\n text-transform: uppercase;\n\n &:only-of-type {\n margin-right: 0;\n }\n}\n\n.usa-label-big {\n @extend .usa-label;\n font-size: $base-font-size;\n padding-left: 0.9rem;\n padding-right: 0.9rem;\n}\n","ul,\nol {\n @include margin(1em null);\n padding-left: 1.94em; // Approximately 15px left padding at default font size\n}\n\nli {\n line-height: $base-line-height;\n margin-bottom: 0.5em;\n\n &:last-child {\n margin-bottom: 0;\n }\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\np {\n + ul,\n + ol {\n margin-top: 0;\n }\n}\n\n// Unstyled lists\n.usa-unstyled-list {\n @include unstyled-list;\n}\n","table {\n border-spacing: 0;\n margin: 2em 0;\n min-width: 100%;\n\n thead {\n th,\n td {\n background-color: $color-gray-lightest;\n }\n }\n\n th {\n text-align: left;\n }\n\n tbody {\n th {\n font-weight: $font-normal;\n }\n }\n\n th,\n td {\n background-color: $color-white;\n border: 1px solid $color-gray;\n padding: 1.5rem;\n }\n}\n\n.usa-table-borderless {\n thead {\n tr {\n background-color: transparent;\n }\n\n th {\n border-top: 0;\n }\n }\n\n th,\n td {\n border-left: 0;\n border-right: 0;\n }\n}\n","html {\n font-family: $font-sans;\n font-size: $em-base;\n}\n\nbody {\n font-size: $base-font-size;\n}\n\np {\n line-height: $base-line-height;\n margin-bottom: 1em;\n margin-top: 1em;\n}\n\na {\n color: $color-primary;\n text-decoration: underline;\n\n &:hover,\n &:active {\n color: $color-primary-darker;\n }\n\n &:visited {\n color: $color-visited;\n }\n\n &:focus {\n box-shadow: $focus-shadow;\n outline: 0;\n }\n}\n\n@mixin external-link($external-link, $external-link-hover) {\n &::after {\n background: url('#{$image-path}/#{$external-link}.png') no-repeat 0 0;\n background: url('#{$image-path}/#{$external-link}.svg') no-repeat 0 0;\n background-size: 100%;\n content: '';\n display: inline-block;\n height: 0.65em;\n margin-bottom: -1px;\n margin-left: 4px;\n width: 0.65em;\n }\n\n &:hover::after {\n background-image: url('#{$image-path}/#{$external-link-hover}.png');\n background-image: url('#{$image-path}/#{$external-link-hover}.svg');\n }\n}\n\n// External link consider \"effortless style approach\":\n// [href^=\"http:\"]:not([href*=\"my-domain.com\"])\n// [href^=\"https:\"]:not([href*=\"my-domain.com\"])\n\n.usa-external_link {\n @include external-link(external-link, external-link-hover);\n}\n\n.usa-external_link-alt {\n @include external-link(external-link-alt, external-link-alt-hover);\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n clear: both;\n font-family: $font-serif;\n line-height: $heading-line-height;\n margin-bottom: .5em;\n margin-top: 1.5em;\n}\n\n// Create heading mixins\n\n@mixin title {\n font-size: $title-font-size;\n font-weight: $font-bold;\n}\n\n@mixin h1 {\n font-size: $h1-font-size;\n font-weight: $font-bold;\n}\n\n@mixin h2 {\n font-size: $h2-font-size;\n font-weight: $font-bold;\n}\n\n@mixin h3 {\n font-size: $h3-font-size;\n font-weight: $font-bold;\n}\n\n@mixin h4 {\n font-size: $h4-font-size;\n font-weight: $font-bold;\n}\n\n@mixin h5 {\n font-size: $h5-font-size;\n font-weight: $font-bold;\n}\n\n@mixin h6 {\n font-family: $font-sans;\n font-size: $h6-font-size;\n font-weight: $font-normal;\n text-transform: uppercase;\n}\n\nh1 {\n @include h1();\n}\n\nh2 {\n @include h2();\n}\n\nh3 {\n @include h3();\n}\n\nh4 {\n @include h4();\n}\n\nh5 {\n @include h5();\n}\n\nh6 {\n @include h6();\n}\n\n// Remove user agent styles\n\ncite,\nvar,\naddress,\ndfn {\n font-style: normal;\n}\n\n// Custom typography\n\n.usa-content {\n p:not(.usa-font-lead) {\n max-width: $text-max-width;\n }\n}\n\n.usa-content-list {\n max-width: $text-max-width;\n}\n\n.usa-sans {\n p,\n a,\n li,\n span {\n font-family: $font-sans;\n }\n\n a {\n border-bottom: none;\n font-weight: $font-bold;\n }\n}\n\n.usa-serif {\n p,\n a,\n li,\n span {\n font-family: $font-serif;\n }\n}\n\n.usa-display {\n @include h3();\n margin-bottom: 0;\n\n @include media($small-screen) {\n @include h1();\n }\n\n @include media($medium-screen) {\n @include title();\n }\n}\n\n.usa-font-lead {\n font-family: $font-serif;\n font-size: $lead-font-size;\n line-height: $lead-line-height;\n max-width: $lead-max-width;\n}\n\n.usa-image-block {\n position: relative;\n}\n\n.usa-image-text-block {\n color: $color-white;\n left: 0;\n margin-left: 8%;\n position: absolute;\n top: 0;\n}\n\n.usa-image-text {\n margin-top: 0;\n}\n\n.usa-drop_text {\n margin-bottom: 0;\n}\n\n.usa-background-dark {\n background-color: $color-gray-dark;\n\n p,\n span {\n color: $color-white;\n }\n\n a {\n color: $color-gray-lighter;\n\n &:hover {\n color: $color-white;\n }\n }\n}\n\n.usa-text-small {\n font-size: $h6-font-size;\n margin-top: 0;\n}\n\n// Removes top margin from first child and bottom margin from last child on\n// elements when they are within those layout elements.\n.usa-section,\n.usa-grid {\n > :first-child {\n margin-top: 0;\n }\n\n > :last-child {\n margin-bottom: 0;\n }\n}\n\n.usa-width-one-whole,\n.usa-width-one-half,\n.usa-width-one-third,\n.usa-width-two-thirds,\n.usa-width-one-fourth,\n.usa-width-three-fourths,\n.usa-width-one-sixth,\n.usa-width-five-sixths,\n.usa-width-one-twelfth {\n &:first-child {\n > :first-child {\n margin-top: 0;\n }\n }\n\n > :first-child {\n @include media($medium-screen) {\n margin-top: 0;\n }\n }\n\n &:last-child {\n > :last-child {\n margin-bottom: 0;\n }\n }\n\n > :last-child {\n @include media($medium-screen) {\n margin-bottom: 0;\n }\n }\n}\n","// Convert pixels to rems\n// eg. for a relational value of 12px write rem(12)\n// Assumes $em-base is the font-size of \n\n@function rem($pxval) {\n @if not unitless($pxval) {\n $pxval: strip-units($pxval);\n }\n\n $base: $em-base;\n @if not unitless($base) {\n $base: strip-units($base);\n }\n @return ($pxval / $base) * 1rem;\n}\n","@charset \"UTF-8\";\n\n/// Georgia font stack.\n///\n/// @type List\n\n$georgia: \"Georgia\", \"Cambria\", \"Times New Roman\", \"Times\", serif;\n\n/// Helvetica font stack.\n///\n/// @type List\n\n$helvetica: \"Helvetica Neue\", \"Helvetica\", \"Roboto\", \"Arial\", sans-serif;\n\n/// Lucida Grande font stack.\n///\n/// @type List\n\n$lucida-grande: \"Lucida Grande\", \"Tahoma\", \"Verdana\", \"Arial\", sans-serif;\n\n/// Monospace font stack.\n///\n/// @type List\n\n$monospace: \"Bitstream Vera Sans Mono\", \"Consolas\", \"Courier\", monospace;\n\n/// Verdana font stack.\n///\n/// @type List\n\n$verdana: \"Verdana\", \"Geneva\", sans-serif;\n","// Variables\n\n$accordion-border: 3px solid $color-gray-lightest;\n\n// Accordion Styles\n\n@mixin accordion-list-styles {\n @include unstyled-list;\n color: $color-base;\n margin: 0;\n padding: 0;\n width: 100%;\n}\n\n@mixin accordion-list-item-styles {\n background-color: $color-gray-lightest;\n font-family: $font-sans;\n list-style: none;\n margin-bottom: 6px;\n width: 100%;\n}\n\n// scss-lint:disable PropertyCount\n@mixin accordion-button-styles {\n @include button-unstyled;\n background-color: $color-gray-lightest;\n background-image: url('#{$image-path}/minus.png');\n background-image: url('#{$image-path}/minus.svg');\n background-position: right 3rem center;\n background-repeat: no-repeat;\n background-size: 13px;\n color: $color-base;\n cursor: pointer;\n display: inline-block;\n font-family: $font-sans;\n font-weight: $font-bold;\n margin: 0;\n padding: 1.5rem 5.5rem 1.5rem 3rem;\n width: 100%;\n\n &:focus {\n box-shadow: $focus-shadow;\n }\n\n &:hover {\n background-color: $color-gray-lighter;\n color: $color-base;\n }\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n margin: 0;\n }\n}\n// scss-lint:enable PropertyCount\n\n@mixin accordion-button-unopened-styles {\n background-image: url('#{$image-path}/plus.png');\n background-image: url('#{$image-path}/plus.svg');\n background-repeat: no-repeat;\n background-size: 1.3rem;\n}\n\n.usa-accordion,\n.usa-accordion-bordered {\n @include accordion-list-styles;\n\n + .usa-accordion,\n + .usa-accordion-bordered {\n margin-top: 1rem;\n }\n\n // TODO deprecated ruleset based on old accordion.\n > ul {\n @include accordion-list-styles;\n\n // TODO deprecated ruleset based on old accordion.\n > li {\n @include accordion-list-item-styles;\n }\n\n // TODO deprecated ruleset based on old accordion.\n button {\n @include accordion-button-styles;\n }\n\n // TODO deprecated ruleset based on old accordion.\n [aria-expanded=false] {\n @include accordion-button-unopened-styles;\n }\n }\n\n > li {\n @include accordion-list-item-styles;\n }\n\n}\n\n.usa-accordion-bordered {\n .usa-accordion-content {\n border-bottom: $accordion-border;\n border-left: $accordion-border;\n border-right: $accordion-border;\n }\n}\n\n.usa-accordion-content {\n background-color: $color-white;\n overflow: auto;\n padding: 3rem;\n\n > *:first-child {\n margin-top: 0;\n }\n\n > *:last-child {\n margin-bottom: 0;\n }\n\n &:not([aria-hidden]) {\n @include sr-only();\n }\n\n @include accessibly-hidden();\n}\n\n.usa-accordion-button {\n @include accordion-button-styles;\n}\n\n.usa-accordion-button[aria-expanded=false] {\n @include accordion-button-unopened-styles;\n}","// Alert variables ---------- //\n$usa-custom-alerts: () !default;\n\n$usa-alerts: (\n success: $color-green-lightest,\n warning: $color-gold-lightest,\n error: $color-secondary-lightest,\n info: $color-primary-alt-lightest\n);\n\n$alerts: map-merge($usa-alerts, $usa-custom-alerts);\n\n.usa-alert {\n background-color: $color-gray-lightest;\n background-position: 1rem 2rem;\n background-repeat: no-repeat;\n background-size: 4rem;\n margin-top: 1.5em;\n padding: 1em;\n\n @include media($medium-screen) {\n background-size: 5.2rem;\n }\n\n ul {\n margin-bottom: 0;\n margin-top: 1em;\n }\n}\n\n.usa-alert-icon {\n display: table-cell;\n padding-right: 1rem;\n}\n\n.usa-alert-body {\n display: table-cell;\n padding-left: 3.5rem;\n vertical-align: top;\n\n @include media($medium-screen) {\n padding-left: 5rem;\n }\n\n p:first-child {\n margin-top: 0.8rem;\n }\n}\n\n.usa-alert-heading {\n margin-bottom: .3rem;\n margin-top: 0;\n\n @include media($medium-screen) {\n margin-top: .3rem;\n }\n}\n\n.usa-alert-text {\n font-family: $font-sans;\n margin-bottom: 0;\n margin-top: 0;\n}\n\n@each $name, $bgcolor in $alerts {\n .usa-alert-#{$name} {\n background-color: $bgcolor;\n background-image: url('#{$image-path}/alerts/#{$name}.png');\n background-image: url('#{$image-path}/alerts/#{$name}.svg');\n }\n}\n\n.usa-alert-no_icon {\n background-image: none;\n}\n",".usa-banner {\n background-color: $color-gray-lightest;\n padding-bottom: 0.7rem;\n\n @include media($small-screen) {\n font-size: $h6-font-size;\n padding-bottom: 0;\n }\n}\n\n.usa-banner-content {\n @include padding(null $site-margins-mobile 3px $site-margins-mobile);\n background-color: transparent;\n font-size: $h5-font-size;\n padding-top: 2rem;\n width: 100%;\n\n @include media($medium-screen) {\n padding-bottom: 2.3rem;\n padding-top: 4rem;\n }\n\n @include media($nav-width) {\n @include padding(null $site-margins);\n }\n\n p {\n &:first-child {\n margin-top: 1rem;\n\n @include media($medium-screen) {\n margin-top: 0;\n }\n }\n }\n}\n\n.usa-banner-inner {\n @include outer-container();\n @include padding(null $site-margins-mobile);\n max-width: $site-max-width;\n\n @include media($nav-width) {\n @include padding(null $site-margins);\n }\n}\n\n.usa-banner-header {\n @include padding(0.55rem null);\n font-size: 1.2rem;\n font-weight: $font-normal;\n\n @include media($small-screen) {\n @include padding(0 null);\n }\n\n p {\n @include margin(0 null);\n display: inline;\n overflow: hidden;\n vertical-align: middle;\n\n @include media($small-screen) {\n @include margin(2px null);\n display: inline-block;\n }\n }\n\n img {\n float: left;\n margin-right: 1rem;\n margin-top: 1px;\n width: 2.4rem;\n\n @include media($small-screen) {\n margin-right: 0.7rem;\n width: 2rem;\n }\n }\n}\n\n.usa-banner-header-expanded {\n align-items: center;\n border-bottom: 1px solid $color-gray-light;\n display: flex;\n font-size: $h5-font-size;\n min-height: 5.6rem;\n padding-right: 3rem;\n\n @include media($small-screen) {\n border-bottom: none;\n display: block;\n font-size: 1.2rem;\n font-weight: $font-normal;\n min-height: 0;\n padding-right: 0;\n }\n\n > .usa-banner-inner {\n margin-left: 0;\n\n @include media($small-screen) {\n margin-left: auto;\n }\n }\n\n img {\n margin-right: 2.4rem;\n\n @include media($small-screen) {\n margin-right: 0.7rem;\n }\n }\n\n p {\n line-height: $heading-line-height;\n vertical-align: top;\n\n @include media($small-screen) {\n line-height: $base-line-height;\n vertical-align: middle;\n }\n }\n}\n\n.usa-banner-button {\n @include button-unstyled;\n @include padding(1.3rem null null 4.8rem);\n background-position-x: right;\n color: $color-primary;\n display: block;\n font-size: 1.2rem;\n height: 4.3rem;\n left: 0;\n position: absolute;\n text-decoration: underline;\n top: 0;\n width: 100%;\n\n @include media($small-screen) {\n @include padding(0 null null 0);\n display: inline;\n height: initial;\n margin-left: 3px;\n position: relative;\n vertical-align: middle;\n width: initial;\n }\n\n &:hover {\n color: $color-primary-darker;\n text-decoration: underline;\n }\n\n &[aria-expanded=false] {\n @include display-icon(angle-arrow-down-primary, after, 1rem, 0, hover);\n background-image: none;\n\n &::after {\n background-position-y: 1px;\n }\n }\n\n &[aria-expanded=true] {\n @include display-icon(close, after, 1.3rem, 0, no-hover);\n background-image: none;\n height: 5.6rem;\n\n @include media($small-screen) {\n @include display-icon(angle-arrow-up-primary, after, 1rem, 0, hover);\n height: initial;\n padding: 0;\n position: relative;\n\n &::after {\n background-position-y: 1px;\n }\n }\n\n &::after {\n position: absolute;\n right: 1.5rem;\n top: 2.15rem;\n\n @include media($small-screen) {\n position: static;\n }\n }\n\n .usa-banner-button-text {\n display: none;\n\n @include media($small-screen) {\n display: inline;\n }\n }\n }\n}\n\n.usa-banner-icon {\n width: 3.8rem;\n}\n",".usa-footer {\n .usa-unstyled-list {\n display: block;\n }\n\n .usa-footer-primary-link {\n color: $color-base;\n display: block;\n font-weight: $font-bold;\n margin-top: 0;\n padding-bottom: 2rem;\n padding-top: 2rem;\n text-decoration: none;\n\n @include media($medium-screen) {\n border-top: none;\n }\n\n &:hover {\n text-decoration: underline;\n }\n }\n\n a {\n font-weight: normal;\n }\n}\n\n.usa-footer-return-to-top {\n padding-bottom: 2rem;\n padding-top: 2rem;\n}\n\n.usa-footer-primary-section {\n background-color: $color-gray-lightest;\n\n .usa-footer-primary-content {\n padding-left: 2.5rem;\n padding-right: 2.5rem;\n\n @include media($medium-screen) {\n padding-left: 0;\n padding-right: 0;\n }\n\n li {\n margin-left: 1rem;\n\n @include media($medium-screen) {\n margin-left: 0;\n }\n }\n }\n\n .usa-grid-full {\n @include media($medium-screen) {\n padding-left: 2.5rem;\n padding-right: 2.5rem;\n }\n }\n}\n\n.usa-footer-medium {\n .usa-footer-primary-section {\n padding: 0;\n\n @include media($medium-screen) {\n padding-bottom: 1rem;\n padding-top: 1rem;\n }\n\n .usa-footer-primary-content {\n @include media($large-screen) {\n margin-right: 6%;\n width: inherit;\n }\n\n &:last-child {\n @include media($large-screen) {\n margin-right: 0;\n }\n }\n }\n }\n\n .usa-footer-nav ul {\n @include media($medium-screen) {\n align-items: center;\n }\n }\n}\n\n.usa-footer-slim {\n .usa-footer-nav {\n a {\n display: block;\n }\n\n .usa-footer-primary-content {\n @include media($large-screen) {\n margin-right: 9%;\n width: inherit;\n }\n\n &:last-child {\n @include media($large-screen) {\n margin-right: 0;\n }\n }\n }\n }\n\n .usa-footer-primary-section {\n padding-bottom: 2rem;\n\n @include media($medium-screen) {\n padding-bottom: 1rem;\n padding-top: 1rem;\n\n .usa-grid-full {\n align-items: center;\n }\n }\n }\n\n .usa-footer-contact_info {\n > * {\n @include media($medium-screen) {\n margin: 0;\n }\n }\n\n @include media($medium-screen) {\n @include padding (2rem null);\n }\n\n @include media($medium-screen) {\n width: 100%;\n }\n\n @include media($large-screen) {\n @include span-columns(6);\n }\n }\n}\n\n// scss-lint:disable QualifyingElement\nul.usa-footer-primary-content,\nli.usa-footer-primary-content,\nli.usa-footer-primary-content {\n border-top: 1px solid $color-base;\n\n @include media($medium-screen) {\n border: none;\n }\n\n &:last-child {\n border-bottom: 1px solid $color-base;\n\n @include media($medium-screen) {\n border-bottom: none;\n }\n }\n}\n// scss-lint:enable QualifyingElement\n\n.usa-sign_up-block {\n padding-bottom: 2rem;\n padding-left: 2.5rem;\n padding-right: 2.5rem;\n\n @include media($medium-screen) {\n float: right;\n padding: 0;\n }\n\n label:first-of-type {\n margin-top: 0;\n }\n\n button {\n float: none;\n margin-right: 0;\n margin-top: 1.5rem;\n }\n\n input {\n width: 100%;\n }\n}\n\n.usa-footer-secondary_section {\n background-color: $color-gray-lighter;\n padding-bottom: 3rem;\n padding-top: 3rem;\n\n a {\n color: $color-base;\n }\n}\n\n.usa-footer-big-secondary-section {\n @include media($medium-screen) {\n padding-top: 5rem;\n }\n}\n\n.usa-footer-contact-links {\n @include media($medium-screen) {\n text-align: right;\n }\n}\n\n.usa-social-links {\n a {\n text-decoration: none;\n }\n}\n\n.usa-footer-big {\n .usa-footer-primary-section {\n @include media($medium-screen) {\n padding-bottom: 4rem;\n padding-top: 3rem;\n }\n }\n\n ul {\n padding-bottom: 2.5rem;\n\n @include media($medium-screen) {\n padding-bottom: 0;\n }\n\n &:last-child {\n border-bottom: 1px solid $color-base;\n\n @include media($medium-screen) {\n border-bottom: none;\n }\n }\n\n li {\n line-height: 2em;\n }\n\n .usa-footer-primary-link {\n background-image: url('#{$image-path}/arrow-down.png');\n background-image: url('#{$image-path}/arrow-down.svg');\n background-position: 1.5rem center;\n background-repeat: no-repeat;\n background-size: 1.3rem;\n margin-left: 0;\n padding-left: 3.5rem;\n\n @include media($medium-screen) {\n background: none;\n margin-bottom: .8rem;\n padding-bottom: 0;\n padding-left: 0;\n }\n\n // scss-lint:disable SelectorDepth\n > * {\n @include margin(0 null);\n }\n }\n\n &.hidden {\n padding-bottom: 0;\n\n li { display: none; }\n\n .usa-footer-primary-link {\n background-image: url('#{$image-path}/arrow-right.png');\n background-image: url('#{$image-path}/arrow-right.svg');\n cursor: pointer;\n display: block;\n\n @include media($medium-screen) {\n background: none;\n padding-left: 0;\n }\n }\n }\n }\n}\n\n.usa-footer-topic {\n margin: 0;\n padding: 2rem 0;\n}\n\n.usa-sign_up-header {\n @include media($medium-screen) {\n margin: 0;\n padding: 2rem 0;\n }\n}\n\n.usa-footer-logo-img {\n max-width: 14rem;\n}\n\n.usa-footer-slim-logo-img {\n float: left;\n max-width: 10rem;\n}\n\n.usa-footer-logo-heading {\n margin-top: 2rem;\n}\n\n.usa-footer-contact-heading {\n margin-top: 0;\n\n @include media($medium-screen) {\n margin-top: 1rem;\n }\n}\n\n.usa-footer-slim-logo-heading {\n display: block;\n padding-top: 1rem;\n\n @include media($medium-screen) {\n display: inline-block;\n padding-left: 1em;\n }\n}\n\n.usa-social_link {\n $background-height: 3rem; // Height of icon within hit area.\n $hit-area: 4.4rem; // Link hit target is 44 x 44 pixels following Apple iOS\n // Human Interface Guidelines.\n @include margin(2.5rem 1rem 1.5rem 0);\n background-position: center center;\n background-repeat: no-repeat;\n background-size: auto $background-height;\n display: inline-block;\n height: $hit-area;\n left: -1.6rem; // relative left positioning\n position: relative;\n text-align: center;\n width: $hit-area;\n\n @include media($medium-screen) {\n @include margin(0 0 0 1rem);\n left: 1.2rem;\n }\n\n span {\n @include sr-only();\n }\n}\n\n.usa-link-facebook {\n @extend .usa-social_link;\n background-image: url('#{$image-path}/social-icons/png/facebook25.png');\n background-image: url('#{$image-path}/social-icons/svg/facebook25.svg');\n}\n\n.usa-link-twitter {\n @extend .usa-social_link;\n background-image: url('#{$image-path}/social-icons/png/twitter16.png');\n background-image: url('#{$image-path}/social-icons/svg/twitter16.svg');\n}\n\n.usa-link-youtube {\n @extend .usa-social_link;\n background-image: url('#{$image-path}/social-icons/png/youtube15.png');\n background-image: url('#{$image-path}/social-icons/svg/youtube15.svg');\n}\n\n.usa-link-rss {\n @extend .usa-social_link;\n background-image: url('#{$image-path}/social-icons/png/rss25.png');\n background-image: url('#{$image-path}/social-icons/svg/rss25.svg');\n}\n","$usa-form-width: 32rem;\n\nform {\n a {\n border-bottom: 0;\n }\n\n [type=\"submit\"],\n [type=\"submit\"] {\n display: block;\n margin-bottom: 1.5em;\n margin-top: 2.5rem;\n\n @include media($medium-screen) {\n padding-left: 2.7em;\n padding-right: 2.7em;\n width: auto;\n }\n }\n\n [name=\"password\"],\n [name=\"confirmPassword\"] {\n margin-bottom: 1.1rem;\n }\n}\n\n.usa-form {\n @include media($medium-screen) {\n max-width: $usa-form-width;\n }\n}\n\n.usa-form-note {\n float: right;\n font-family: $font-sans;\n font-size: $h5-font-size;\n margin: 0 0 1.5rem;\n\n + * {\n clear: both;\n }\n}\n\nfieldset {\n border: none;\n margin: 0;\n padding: 0;\n}\n\n.usa-form-large {\n @include media($medium-screen) {\n max-width: 46rem;\n }\n}\n\ninput {\n &.usa-input-tiny {\n @include media($medium-screen) {\n max-width: 6rem;\n }\n }\n\n &.usa-input-medium {\n @include media($medium-screen) {\n max-width: 12rem;\n }\n }\n}\n\n.usa-input-grid {\n @include media($medium-screen) {\n padding-right: 5%;\n }\n}\n\n.usa-input-grid:last-of-type {\n @include media($medium-screen) {\n padding-right: 0;\n }\n}\n\n.usa-input-grid-small {\n @include media($medium-screen) {\n float: left;\n width: 35%;\n }\n\n input {\n margin-bottom: 3rem;\n }\n\n select {\n margin-bottom: 3rem;\n }\n}\n\n.usa-input-grid-medium {\n @include media($medium-screen) {\n float: left;\n width: 65%;\n }\n\n input {\n margin-bottom: 3rem;\n }\n\n select {\n margin-bottom: 3rem;\n }\n}\n\n.usa-input-grid-large {\n @include media($medium-screen) {\n float: left;\n width: 100%;\n }\n\n input {\n margin-bottom: 3rem;\n }\n\n select {\n margin-bottom: 3rem;\n }\n}\n\n.usa-additional_text {\n font-weight: normal;\n}\n\n// Reset password checklist\n\n.usa-checklist {\n list-style: none;\n margin-left: 0;\n padding-left: 0;\n\n li {\n display: inline-block;\n list-style: none;\n margin-bottom: 0;\n margin-top: 0;\n padding-left: 3em;\n text-indent: -2em;\n\n &::before {\n content: ' ';\n display: inline-block;\n height: .8em;\n margin-right: .2em;\n width: 1.8em;\n }\n }\n}\n\n.usa-checklist-checked {\n &::before {\n background-image: url('#{$image-path}/correct9.png');\n background-image: url('#{$image-path}/correct9.svg');\n background-position: 100%;\n background-repeat: no-repeat;\n background-size: 100%;\n }\n}\n","// A collection of media block objects\n\n.usa-graphic_list {\n .usa-graphic_list-row {\n .usa-media_block {\n margin-bottom: $site-margins;\n\n @include media($medium-screen) {\n margin-bottom: $site-margins * 2;\n }\n }\n\n &:last-child {\n .usa-media_block {\n @include media($medium-screen) {\n margin-bottom: 0;\n }\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n }\n }\n\n .usa-media_block-img {\n margin-right: $site-margins;\n }\n\n .usa-media_block-body {\n > :first-child {\n margin-top: 0;\n }\n }\n}\n","// Header variables ---------- //\n\n$height-nav-secondary: 5rem;\n$width-nav-sidebar: 250px;\n\n// z-indexes - TODO refactor to a site-wide z-index management approach\n$z-index-header: 7000;\n$z-index-overlay: 8000;\n$z-index-nav: 9000;\n\n// Header ------------- //\n\n.usa-header {\n width: 100%;\n z-index: $z-index-header;\n\n @include media($nav-width) {\n border-bottom: 1px solid $color-gray-light;\n }\n\n a {\n border-bottom: none;\n }\n\n .usa-search {\n margin-bottom: 1.5rem;\n\n @include media($nav-width) {\n float: right;\n margin-bottom: 0;\n max-width: 21.5rem;\n }\n }\n}\n\n.usa-logo {\n float: left;\n line-height: 4rem;\n margin-left: 1.5rem;\n\n @include media($nav-width) {\n line-height: 7.5rem;\n margin-left: 0;\n }\n\n a {\n color: $color-base;\n text-decoration: none;\n }\n\n br {\n display: none;\n\n @include media($nav-width) {\n display: block;\n }\n }\n}\n\n.usa-logo-text {\n display: block;\n font-size: $h5-font-size;\n font-style: normal;\n font-weight: $font-bold;\n margin: 0;\n\n @include media($nav-width) {\n display: block;\n font-size: 2.4rem;\n line-height: $heading-line-height;\n }\n}\n\n// scss-lint:disable PropertyCount\n.usa-menu-btn {\n @include button-unstyled;\n background-color: $color-primary;\n color: $color-white;\n display: inline;\n float: right;\n font-size: $h6-font-size;\n height: 4rem;\n line-height: 4rem;\n text-align: center;\n text-decoration: none;\n text-transform: uppercase;\n width: 5.8rem;\n\n @include media($nav-width) {\n display: none;\n }\n\n &:hover {\n color: $color-white;\n background-color: $color-primary-darker;\n }\n\n &:visited {\n color: $color-white;\n }\n}\n// scss-lint:enable PropertyCount\n\n.usa-overlay {\n @include position(fixed, 0);\n background: $color-black;\n opacity: 0;\n transition: all 0.2s ease-in-out;\n visibility: hidden;\n z-index: $z-index-overlay;\n\n &.is-visible {\n opacity: 0.1;\n visibility: visible;\n }\n}\n\n// Basic header ----------- //\n\n.usa-header-basic {\n .usa-logo {\n @include media($nav-width) {\n bottom: 1.9rem;\n position: absolute;\n }\n }\n\n .usa-navbar {\n @include media($nav-width) {\n position: relative;\n width: 18%; // TODO: review this more\n }\n }\n}\n\n// Extended header ----------- //\n\n.usa-header-extended {\n .usa-header {\n @include media($nav-width) {\n border-bottom: none;\n }\n }\n\n .usa-logo {\n @include media($nav-width) {\n @include margin(3rem null);\n }\n }\n\n em {\n @include media($nav-width) {\n font-size: 3.2rem;\n line-height: 1;\n }\n }\n\n .usa-navbar {\n @include media($nav-width) {\n @include outer-container();\n @include padding(null $site-margins);\n display: block;\n height: auto;\n max-width: $site-max-width;\n }\n }\n\n .usa-nav {\n @include media($nav-width) {\n border-top: 1px solid $color-gray-light;\n float: none;\n padding: 0;\n width: 100%;\n }\n }\n\n .usa-nav-inner {\n @include media($nav-width) {\n @include outer-container();\n @include padding(null $site-margins null 2rem);\n margin-top: -1px;\n max-width: $site-max-width;\n position: relative;\n }\n }\n\n .usa-nav-primary {\n @include media($nav-width) {\n @include clearfix;\n }\n\n button {\n &[aria-expanded=false],\n &[aria-expanded=true] {\n @include media($nav-width) {\n background-position: right 1.5rem top 50%;\n }\n }\n }\n }\n\n .usa-nav-link {\n @include media($nav-width) {\n padding-top: 1.9rem;\n }\n }\n\n .usa-nav-submenu {\n .usa-grid-full {\n @include media($nav-width) {\n padding-left: 1.2rem;\n }\n }\n }\n\n .usa-megamenu {\n @include media($nav-width) {\n padding-left: $site-margins;\n }\n }\n}\n","@charset \"UTF-8\";\n\n/// Provides a quick method for setting an element’s position. Use a `null` value to “skip” a side.\n///\n/// @param {Position} $position [relative]\n/// A CSS position value\n///\n/// @param {Arglist} $coordinates [null null null null]\n/// List of values that correspond to the 4-value syntax for the edges of a box\n///\n/// @example scss - Usage\n/// .element {\n/// @include position(absolute, 0 null null 10em);\n/// }\n///\n/// @example css - CSS Output\n/// .element {\n/// left: 10em;\n/// position: absolute;\n/// top: 0;\n/// }\n///\n/// @require {function} is-length\n/// @require {function} unpack\n\n@mixin position($position: relative, $coordinates: null null null null) {\n @if type-of($position) == list {\n $coordinates: $position;\n $position: relative;\n }\n\n $coordinates: unpack($coordinates);\n\n $offsets: (\n top: nth($coordinates, 1),\n right: nth($coordinates, 2),\n bottom: nth($coordinates, 3),\n left: nth($coordinates, 4)\n );\n\n position: $position;\n\n @each $offset, $value in $offsets {\n @if is-length($value) {\n #{$offset}: $value;\n }\n }\n}\n","// Hero feature\n// ==========================\n\n.usa-hero {\n @include padding($site-margins null);\n background-image: url('#{$image-path}/hero.png');\n background-position: center;\n background-size: cover;\n\n .usa-button {\n color: $color-white;\n }\n}\n\n.usa-section-dark {\n .usa-hero-link {\n color: $color-primary-alt;\n }\n}\n\n.usa-hero-callout {\n background-color: $color-primary-darkest;\n padding: 3rem;\n\n @include media($small-screen) {\n max-width: 30rem;\n }\n\n > *:first-child {\n @include margin(0 null $site-margins null);\n }\n\n .usa-button {\n font-size: $small-font-size;\n margin-top: 7rem;\n width: 100%;\n }\n}\n\n.usa-hero-callout-alt {\n color: $color-white;\n display: block;\n}\n","// Flexbox positioning to move sidenav below main content on small screens\n.usa-layout-docs {\n display: flex;\n flex-direction: column;\n\n @include media($large-screen) {\n display: inherit;\n }\n\n .usa-grid {\n > :first-child:not(.usa-width-*) {\n margin-top: 0;\n }\n\n > :last-child:not(.usa-width-*) {\n margin-bottom: 0;\n }\n }\n}\n\n.usa-layout-docs-sidenav {\n order: 2;\n}\n\n.usa-layout-docs-main_content {\n margin-bottom: $site-margins;\n order: 1;\n\n @include media($large-screen) {\n margin-bottom: 0;\n }\n\n > :first-child {\n margin-top: 0;\n }\n}\n","@mixin media-block-img($margin-right: 1rem) {\n float: left;\n margin-right: $margin-right;\n}\n\n.usa-media_block-img {\n @include media-block-img;\n}\n\n.usa-media_block-body {\n overflow: hidden;\n}\n","\n// Header navigation ------------- //\n\n@mixin nav-border {\n border-bottom: 0.7rem solid $color-primary;\n padding-bottom: 1rem;\n}\n\n.usa-navbar {\n border-bottom: 1px solid $color-gray-light;\n height: 4rem;\n\n @include media($nav-width) {\n border-bottom: none;\n display: inline-block;\n height: 10.3rem;\n }\n}\n\n.usa-nav-link {\n @include font-smoothing;\n\n &:hover {\n span {\n @include media($nav-width) {\n @include nav-border;\n }\n }\n }\n}\n\n.usa-nav-container {\n @include media($nav-width) {\n @include outer-container();\n @include padding(null $site-margins);\n max-width: $site-max-width;\n }\n}\n\n.usa-nav {\n $sliding-panel-width: 26rem;\n @include position(fixed, 0 0 0 auto);\n @include size($sliding-panel-width 100%);\n @include transform(translateX($sliding-panel-width));\n background: $color-white;\n border-left: 1px solid $color-gray-light;\n border-right: 0;\n display: flex;\n flex-direction: column;\n overflow-y: auto;\n padding: 2rem;\n z-index: $z-index-nav;\n\n @include media($nav-width) {\n @include padding(5rem 0 0 null);\n @include transform(translateX(0));\n border-left: none;\n display: block;\n float: right;\n overflow-y: visible;\n position: relative;\n width: auto;\n }\n\n &.is-visible {\n @include transform(translateX(0));\n @include transition(all 0.3s ease-in-out);\n }\n\n nav {\n margin-top: 6rem;\n min-height: 100%;\n\n @include media($nav-width) {\n margin-top: 0;\n }\n }\n\n .usa-current {\n border-left: 4px solid $color-primary;\n color: $color-primary;\n font-weight: $font-bold;\n padding-left: 1.4rem;\n }\n\n .usa-button {\n width: 100%;\n }\n\n .usa-search {\n @include media($nav-width) {\n margin-left: 1.5rem;\n }\n }\n}\n\n// Primary navigation ------------- //\n\n.usa-nav-primary {\n @include usa-sidenav-list;\n order: 2;\n\n @include media($nav-width) {\n display: inline;\n }\n\n li {\n @include media($nav-width) {\n border-top: none;\n }\n }\n\n > li {\n width: auto;\n\n @include media($nav-width) {\n display: inline-block;\n margin-left: -4px;\n }\n\n > a {\n @include media($nav-width) {\n @include padding(1.3rem 1.5rem 1.7rem 1.5rem);\n color: $color-gray;\n font-size: $h5-font-size;\n font-weight: $font-bold;\n line-height: 1.2;\n }\n\n &:hover {\n @include media($nav-width) {\n background-color: transparent;\n }\n }\n }\n }\n\n button {\n @include button-unstyled;\n @include font-smoothing;\n font-weight: $font-normal;\n padding: 1.4rem 1.5rem 1rem 1.8rem;\n\n @include media($nav-width) {\n @include padding(null 3rem 1.9rem 1.5rem);\n color: $color-gray;\n font-size: $h5-font-size;\n font-weight: $font-bold;\n width: initial;\n }\n\n &:focus,\n &:active {\n box-shadow: $focus-shadow;\n }\n\n &:hover {\n background-color: $color-gray-lightest;\n color: $color-primary;\n\n @include media($nav-width) {\n background-color: transparent;\n }\n }\n\n &[aria-expanded=false] {\n background-image: url('#{$image-path}/plus-alt.png');\n background-image: url('#{$image-path}/plus-alt.svg');\n background-repeat: no-repeat;\n background-position: right 0 center;\n background-size: 1rem;\n\n @include media($nav-width) {\n background-image: url('#{$image-path}/angle-arrow-down.png');\n background-image: url('#{$image-path}/angle-arrow-down.svg');\n background-position: right 1.5rem top 44%;\n }\n }\n\n &[aria-expanded=true] {\n background-image: url('#{$image-path}/minus-alt.png');\n background-image: url('#{$image-path}/minus-alt.svg');\n background-repeat: no-repeat;\n background-position: right 0 center;\n background-size: 1rem;\n\n @include media($nav-width) {\n background-color: $color-primary-darkest;\n color: $color-white;\n background-image: url('#{$image-path}/angle-arrow-down-hover.png');\n background-image: url('#{$image-path}/angle-arrow-down-hover.svg');\n background-position: right 1.5rem top 44%;\n\n &:hover {\n background-color: $color-primary-darkest;\n }\n\n span {\n @include nav-border;\n }\n }\n }\n }\n}\n\n// Secondary navigation ----------- //\n\n.usa-nav-secondary {\n @include media($nav-width) {\n position: absolute;\n right: $site-margins;\n top: -5.7rem;\n }\n\n .usa-search {\n @include margin(3rem null);\n\n @include media($nav-width) {\n @include margin(-0.2rem null 0 0);\n float: left;\n }\n }\n}\n\n.usa-nav-secondary-links {\n @include media($nav-width) {\n float: left;\n }\n\n li {\n @include media($nav-width) {\n display: inline;\n padding-left: 1rem;\n }\n\n &:not(:last-child)::after {\n @include media($nav-width) {\n content: '|';\n padding-left: 1rem;\n }\n }\n }\n\n a,\n .usa-header-search-button {\n color: $color-gray;\n display: inline-block;\n font-size: $h5-font-size;\n text-decoration: none;\n\n &:hover {\n color: $color-primary;\n }\n }\n\n .usa-header-search-button {\n @include button-unstyled;\n display: none;\n\n @include media($nav-width) {\n background-image: url('#{$image-path}/search-alt.png');\n background-image: url('#{$image-path}/search-alt.svg');\n background-repeat: no-repeat;\n background-position: left center;\n background-size: 2.2rem;\n display: inline-block;\n padding-left: 2.3rem;\n }\n\n &.is-hidden {\n @include media($nav-width) {\n display: none;\n }\n }\n }\n}\n\n// Navigation submenu (dropdown and mega menu) ----- //\n\n.usa-nav-submenu {\n @include usa-sidenav-sublist;\n\n @include media($nav-width) {\n @include unstyled-list;\n @include padding(1.15rem null);\n background-color: $color-primary-darkest;\n min-width: 21.5rem;\n width: auto;\n position: absolute;\n }\n\n &[aria-hidden=true] {\n display: none;\n }\n\n a {\n @include media($nav-width) {\n color: $color-white;\n padding-left: 1.8rem;\n }\n\n &:hover {\n @include media($nav-width) {\n background-color: $color-primary-darkest;\n color: $color-white;\n text-decoration: underline;\n }\n }\n\n &:hover,\n &.usa-current {\n @include media($nav-width) {\n padding-left: 1.8rem;\n }\n }\n }\n\n li {\n margin-bottom: 0;\n }\n}\n\n// Navigation close button -------- //\n\n.usa-nav-close {\n @include button-unstyled;\n @include margin(-1.2rem -1.5rem 2.4rem auto);\n float: right;\n height: $hit-area;\n text-align: center;\n width: $hit-area;\n\n @include media($nav-width) {\n display: none;\n }\n\n img {\n width: 1.3rem;\n }\n}\n\n.usa-mobile_nav-active {\n overflow: hidden;\n}\n\n// Navigation mega menu -------- //\n\n@mixin outer-megamenu {\n background-color: $color-primary-darkest;\n content: '';\n display: block;\n height: 100%;\n position: absolute;\n top: 0;\n width: 1000%;\n}\n\n.usa-megamenu {\n @include media($nav-width) {\n @include padding(3.15rem null);\n left: -1.8rem;\n width: 100%;\n }\n\n &::before {\n @include media($nav-width) {\n @include outer-megamenu;\n right: 100%;\n }\n }\n\n &::after {\n @include media($nav-width) {\n @include outer-megamenu;\n left: 100%;\n }\n }\n}\n\n.usa-header-basic-megamenu {\n .usa-nav {\n @include media($nav-width) {\n padding-top: 0;\n width: 100%;\n }\n }\n\n .usa-nav-inner {\n display: flex;\n flex-direction: column;\n\n @include media($nav-width) {\n display: initial;\n float: right;\n margin-top: -4.8rem;\n }\n }\n\n .usa-nav-submenu {\n .usa-grid-full {\n @include media($nav-width) {\n margin-left: -1.8rem;\n }\n }\n }\n}\n\n.usa-megamenu-col {\n @include media($nav-width) {\n @include span-columns(3);\n\n &:nth-child(2n) {\n @include span-columns(3);\n }\n\n &:nth-child(4n) {\n margin-right: 0;\n }\n }\n\n > ul {\n @include unstyled-list;\n }\n}\n","@charset \"UTF-8\";\n\n/// Sets the `width` and `height` of the element.\n///\n/// @param {List} $size\n/// A list of at most 2 size values.\n///\n/// If there is only a single value in `$size` it is used for both width and height. All units are supported.\n///\n/// @example scss - Usage\n/// .first-element {\n/// @include size(2em);\n/// }\n///\n/// .second-element {\n/// @include size(auto 10em);\n/// }\n///\n/// @example css - CSS Output\n/// .first-element {\n/// width: 2em;\n/// height: 2em;\n/// }\n///\n/// .second-element {\n/// width: auto;\n/// height: 10em;\n/// }\n///\n/// @todo Refactor in 5.0.0 to use a comma-separated argument\n\n@mixin size($value) {\n $width: nth($value, 1);\n $height: $width;\n\n @if length($value) > 1 {\n $height: nth($value, 2);\n }\n\n @if is-size($height) {\n height: $height;\n } @else {\n @warn \"`#{$height}` is not a valid length for the `$height` parameter in the `size` mixin.\";\n }\n\n @if is-size($width) {\n width: $width;\n } @else {\n @warn \"`#{$width}` is not a valid length for the `$width` parameter in the `size` mixin.\";\n }\n}\n","@charset \"UTF-8\";\n\n/// A mixin for generating vendor prefixes on non-standardized properties.\n///\n/// @param {String} $property\n/// Property to prefix\n///\n/// @param {*} $value\n/// Value to use\n///\n/// @param {List} $prefixes\n/// Prefixes to define\n///\n/// @example scss - Usage\n/// .element {\n/// @include prefixer(border-radius, 10px, webkit ms spec);\n/// }\n///\n/// @example css - CSS Output\n/// .element {\n/// -webkit-border-radius: 10px;\n/// -moz-border-radius: 10px;\n/// border-radius: 10px;\n/// }\n///\n/// @require {variable} $prefix-for-webkit\n/// @require {variable} $prefix-for-mozilla\n/// @require {variable} $prefix-for-microsoft\n/// @require {variable} $prefix-for-opera\n/// @require {variable} $prefix-for-spec\n\n@mixin prefixer($property, $value, $prefixes) {\n @each $prefix in $prefixes {\n @if $prefix == webkit {\n @if $prefix-for-webkit {\n -webkit-#{$property}: $value;\n }\n } @else if $prefix == moz {\n @if $prefix-for-mozilla {\n -moz-#{$property}: $value;\n }\n } @else if $prefix == ms {\n @if $prefix-for-microsoft {\n -ms-#{$property}: $value;\n }\n } @else if $prefix == o {\n @if $prefix-for-opera {\n -o-#{$property}: $value;\n }\n } @else if $prefix == spec {\n @if $prefix-for-spec {\n #{$property}: $value;\n }\n } @else {\n @warn \"Unrecognized prefix: #{$prefix}\";\n }\n }\n}\n\n@mixin disable-prefix-for-all() {\n $prefix-for-webkit: false !global;\n $prefix-for-mozilla: false !global;\n $prefix-for-microsoft: false !global;\n $prefix-for-opera: false !global;\n $prefix-for-spec: false !global;\n}\n","$usa-btn-small-width: 4.5rem;\n$usa-btn-medium-width: 8.5rem;\n$usa-btn-big-width: 11.6rem;\n\n@mixin search-icon {\n background-image: url('#{$image-path}/search.png');\n background-image: url('#{$image-path}/search.svg');\n background-position: 50%;\n background-repeat: no-repeat;\n}\n\n.usa-search {\n @include clearfix;\n max-width: none;\n position: relative;\n\n [type=\"search\"],\n .usa-search-input {\n @include padding(0 null);\n -webkit-appearance: none;\n border-bottom-right-radius: 0;\n border-right: none;\n border-top-right-radius: 0;\n box-sizing: border-box;\n float: left;\n font-size: $small-font-size;\n height: 3.3rem;\n margin: 0;\n width: calc(100% - #{$usa-btn-small-width});\n\n @include media($small-screen) {\n width: calc(100% - #{$usa-btn-medium-width});\n }\n }\n\n [type=\"submit\"],\n .usa-search-submit {\n @include search-icon;\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n height: 3.3rem;\n margin: 0;\n padding: 0;\n width: $usa-btn-small-width;\n\n @include media($small-screen) {\n background-image: none;\n width: $usa-btn-medium-width;\n }\n }\n\n .usa-search-submit-text {\n display: none;\n\n @include media($small-screen) {\n display: block;\n }\n }\n\n &.usa-search-big {\n @include media($small-screen) {\n $height: 4.4rem;\n $width: $usa-btn-big-width;\n\n [type=\"search\"],\n .usa-search-input {\n font-size: $base-font-size;\n height: $height;\n width: calc(100% - #{$width});\n }\n\n [type=\"submit\"],\n .usa-search-submit {\n font-size: $h3-font-size;\n height: $height;\n width: $width;\n }\n }\n }\n\n &.usa-search-small {\n @include media($small-screen) {\n $width: $usa-btn-small-width;\n\n [type=\"search\"],\n .usa-search-input {\n width: calc(100% - #{$width});\n }\n\n [type=\"submit\"],\n .usa-search-submit {\n @include search-icon;\n width: $width;\n }\n }\n @media screen and (max-width: ($nav-width - 1px)) {\n &.usa-sr-only {\n left: auto;\n position: relative;\n }\n }\n }\n}\n",".usa-section {\n @include padding($site-margins null);\n\n @include media($medium-screen) {\n @include padding(6rem null);\n }\n}\n\n.usa-section-light {\n background-color: $color-gray-lightest;\n}\n\n.usa-section-dark {\n background-color: $color-primary-darkest;\n color: $color-white;\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n color: $color-primary-alt;\n }\n\n p {\n color: $color-white;\n }\n\n a {\n color: $color-gray-lighter;\n\n &:hover {\n color: $color-white;\n }\n }\n}\n",".usa-skipnav {\n background: transparent;\n color: $color-base;\n left: 0;\n padding: 1rem 1.5rem;\n position: absolute;\n top: -4.2rem;\n transition: all 0.2s ease-in-out;\n z-index: 100;\n\n &:focus {\n background: $color-white;\n left: 0;\n outline: 0;\n position: absolute;\n top: 0;\n transition: all 0.2s ease-in-out;\n }\n}\n"]}
\ No newline at end of file
diff --git a/web/static/js/actions/index.js b/web/static/js/actions/index.js
new file mode 100644
index 0000000..9751c2e
--- /dev/null
+++ b/web/static/js/actions/index.js
@@ -0,0 +1,282 @@
+/* global fetch */
+import { browserHistory } from 'react-router';
+import includes from 'lodash/fp/includes';
+import * as ActionTypes from '../constants/ActionTypes';
+import * as RemoteDataStates from '../constants/RemoteDataStates';
+import { setUserData, deleteUserData, getUserData } from '../lib/user';
+
+export function fetchCart() {
+ return (dispatch) => {
+ dispatch(requestCart());
+ const user = getUserData();
+ return fetch(`/api/user/${user.id}/cart_items`, requestWithAuth({}))
+ .then(checkHttpStatus)
+ .then(response => response.json())
+ .then(json => dispatch(fetchCartSuccess(json)))
+ .catch(error => dispatch(fetchCartError(error))); // TODO flash message
+ };
+}
+
+export function fetchCartSuccess(json) {
+ return { type: ActionTypes.FETCH_CART_SUCCESS, data: json };
+}
+
+export function fetchCartError(error) {
+ return { type: ActionTypes.FETCH_CART_ERROR, error };
+}
+
+export function requestCart() {
+ return { type: ActionTypes.REQUEST_CART };
+}
+
+export function addToCart(id, quantity) {
+ const request = {
+ method: 'post',
+ credentials: 'include',
+ headers: {
+ Accept: 'application/json',
+ 'Content-Type': 'application/json'
+ },
+ body: JSON.stringify({ catalog_item_id: id, quantity })
+ };
+ const user = getUserData();
+ return (dispatch) => {
+ dispatch(requestAddToCart(id, quantity));
+ return fetch(`/api/user/${user.id}/cart_items`, requestWithAuth(request))
+ .then(checkHttpStatus)
+ .then(response => response.json())
+ .then(json => dispatch(addToCartSuccess(json)))
+ .then(() => dispatch(fetchCart()))
+ .catch(error => dispatch(addToCartError(error))); // TODO flash message
+ };
+}
+
+export function requestAddToCart(id, quantity) {
+ return { type: ActionTypes.ADD_TO_CART, id, quantity };
+}
+
+export function addToCartSuccess(json) {
+ return { type: ActionTypes.ADD_TO_CART_SUCCESS, data: json };
+}
+
+export function addToCartError(error) {
+ return { type: ActionTypes.ADD_TO_CART_ERROR, error };
+}
+
+export function removeFromCart(id) {
+ const request = {
+ method: 'delete',
+ credentials: 'include'
+ };
+ const user = getUserData();
+ return (dispatch) => {
+ dispatch(requestRemoveFromCart(id));
+ return fetch(`/api/user/${user.id}/cart_items/${id}`, requestWithAuth(request))
+ .then(checkHttpStatus)
+ .then(() => dispatch(removeFromCartSuccess()))
+ .then(() => dispatch(fetchCart()))
+ .catch(error => dispatch(removeFromCartError(error))); // TODO flash message
+ };
+}
+
+export function requestRemoveFromCart(id) {
+ return { type: ActionTypes.REMOVE_FROM_CART, id };
+}
+
+export function removeFromCartSuccess() {
+ return { type: ActionTypes.REMOVE_FROM_CART_SUCCESS };
+}
+
+export function removeFromCartError(error) {
+ return { type: ActionTypes.REMOVE_FROM_CART_ERROR, error };
+}
+
+// order actions
+export function fetchOrders() {
+ return (dispatch) => {
+ dispatch(requestOrders());
+ const user = getUserData();
+ return fetch(`/api/user/${user.id}/orders`, requestWithAuth({}))
+ .then(checkHttpStatus)
+ .then(response => response.json())
+ .then(json => dispatch(fetchOrdersSuccess(json)))
+ .catch(error => dispatch(fetchOrdersError(error))); // TODO flash message
+ };
+}
+
+export function fetchOrdersSuccess(json) {
+ return { type: ActionTypes.FETCH_ORDERS_SUCCESS, data: json };
+}
+
+export function fetchOrdersError(error) {
+ return { type: ActionTypes.FETCH_ORDERS_ERROR, error };
+}
+
+export function requestOrders() {
+ return { type: ActionTypes.REQUEST_ORDERS };
+}
+
+export function createOrder() {
+ const request = {
+ method: 'post',
+ credentials: 'include'
+ };
+ const user = getUserData();
+ return (dispatch) => {
+ dispatch(requestCreateOrder());
+ return fetch(`/api/user/${user.id}/orders`, requestWithAuth(request))
+ .then(checkHttpStatus)
+ .then(() => dispatch(createOrderSuccess()))
+ .then(() => dispatch(alert(createOrderSuccess())))
+ .then(() => dispatch(fetchCart()))
+ .then(() => dispatch(fetchOrders()))
+ .catch(error => dispatch(createOrderError(error))); // TODO flash message
+ };
+}
+
+export function requestCreateOrder() {
+ return { type: ActionTypes.CREATE_ORDER };
+}
+
+export function createOrderSuccess() {
+ return { type: ActionTypes.CREATE_ORDER_SUCCESS };
+}
+
+export function createOrderError(error) {
+ return { type: ActionTypes.CREATE_ORDER_ERROR, error };
+}
+
+// user actions
+export function loginRequest() {
+ return { type: ActionTypes.LOGIN_REQUEST };
+}
+
+export function loginUser(name, password, redirect = '/') {
+ return (dispatch, getState) => {
+ if (shouldFetchAuth(getState())) {
+ return dispatch(doLoginUser(name, password, redirect));
+ }
+ return Promise.resolve();
+ };
+}
+
+const doLoginUser = (name, password, redirect) => {
+ const request = {
+ method: 'post',
+ credentials: 'include',
+ headers: {
+ Accept: 'application/json',
+ 'Content-Type': 'application/json'
+ },
+ body: JSON.stringify({ name, password })
+ };
+ return (dispatch) => {
+ dispatch(loginRequest());
+ return fetch('/api/auth', request)
+ .then(checkHttpStatus)
+ .then(response => response.json())
+ .then((json) => {
+ dispatch(loginSuccess(json));
+ browserHistory.push(redirectOrDefault(redirect));
+ })
+ .catch(error => dispatch(loginError(error)));
+ };
+};
+
+export function loginSuccess(auth) {
+ setUserData(auth);
+ return { type: ActionTypes.LOGIN_SUCCESS, auth };
+}
+
+export function loginError(error) {
+ return { type: ActionTypes.LOGIN_ERROR, error };
+}
+
+export function logoutUser() {
+ deleteUserData();
+ return { type: ActionTypes.LOGOUT };
+}
+
+// catalog actions
+export function fetchCatalogIfNeeded() {
+ return (dispatch, getState) => {
+ if (shouldFetchCatalog(getState())) {
+ return dispatch(fetchCatalog());
+ }
+
+ // Let the calling code know there's nothing to wait for.
+ return Promise.resolve();
+ };
+}
+
+
+export function fetchCatalog() {
+ return (dispatch) => {
+ dispatch(requestCatalog());
+ return fetch('/api/catalog_items', requestWithAuth({}))
+ .then(response => response.json()) // TODO check response.ok
+ .then(json => dispatch(fetchCatalogSuccess(json)))
+ .catch(error => dispatch(fetchCatalogError(error))); // TODO flash message
+ };
+}
+
+
+export function fetchCatalogSuccess(json) {
+ return { type: ActionTypes.FETCH_CATALOG_SUCCESS, data: json };
+}
+
+export function fetchCatalogError(error) {
+ return { type: ActionTypes.FETCH_CATALOG_ERROR, error };
+}
+
+export function requestCatalog() {
+ return { type: ActionTypes.REQUEST_CATALOG };
+}
+
+// alerts actions
+export function alert(action, willExpire = false) {
+ return { type: ActionTypes.ALERT, alert: action, willExpire };
+}
+
+export function expireAlerts() {
+ return { type: ActionTypes.EXPIRE_ALERTS };
+}
+
+// helpers
+function shouldFetchCatalog(state) {
+ return shouldFetch(state.catalog);
+}
+
+function shouldFetchAuth(state) {
+ return shouldFetch(state.auth);
+}
+
+function shouldFetch(remoteData) {
+ return !includes(remoteData.remoteDataState, [RemoteDataStates.LOADING, RemoteDataStates.LOADED]);
+}
+
+function checkHttpStatus(response) {
+ if (response.status >= 200 && response.status < 300) {
+ return response;
+ }
+ const error = new Error(response.statusText);
+ error.response = response;
+ throw error;
+}
+
+function redirectOrDefault(redirect) {
+ if (getUserData().role === 'ADMIN' && redirect === '/') {
+ return '/admin';
+ }
+ return redirect;
+}
+
+function requestWithAuth(request) {
+ return {
+ ...request,
+ headers: {
+ ...request.headers,
+ Authorization: getUserData().name
+ }
+ };
+}
diff --git a/web/static/js/app.js b/web/static/js/app.js
index e7549b9..3db97e3 100644
--- a/web/static/js/app.js
+++ b/web/static/js/app.js
@@ -1,3 +1,4 @@
+/* global document */
// Brunch automatically concatenates all files in your
// watched paths. Those paths can be configured at
// config.paths.watched in "brunch-config.js".
@@ -11,7 +12,20 @@
//
// If you no longer want to use a dependency, remember
// to also remove its path from "config.paths.watched".
-import "phoenix_html"
+import 'babel-polyfill';
+import 'phoenix_html';
+import 'lodash.debounce';
+import es6Promise from 'es6-promise';
+import 'isomorphic-fetch';
+
+import React from 'react';
+import ReactDOM from 'react-dom';
+
+import Main from './components/Main';
+
+es6Promise.polyfill();
+
+ReactDOM.render(, document.getElementById('index'));
// Import local files
//
diff --git a/web/static/js/components/Account/Account.js b/web/static/js/components/Account/Account.js
new file mode 100644
index 0000000..99a5121
--- /dev/null
+++ b/web/static/js/components/Account/Account.js
@@ -0,0 +1,5 @@
+import React from 'react';
+
+const Account = () =>
Account
;
+
+export default Account;
diff --git a/web/static/js/components/Account/AccountContainer.js b/web/static/js/components/Account/AccountContainer.js
new file mode 100644
index 0000000..85a36c9
--- /dev/null
+++ b/web/static/js/components/Account/AccountContainer.js
@@ -0,0 +1,4 @@
+import { connect } from 'react-redux';
+import Account from './Account';
+
+export default connect()(Account);
diff --git a/web/static/js/components/Admin/Admin.js b/web/static/js/components/Admin/Admin.js
new file mode 100644
index 0000000..8814b41
--- /dev/null
+++ b/web/static/js/components/Admin/Admin.js
@@ -0,0 +1,14 @@
+import React, { Component } from 'react';
+
+export default class Admin extends Component {
+ render() {
+ return (
+
+
+
Admin
+
Admin...
+
+
+ );
+ }
+}
diff --git a/web/static/js/components/Admin/AdminContainer.js b/web/static/js/components/Admin/AdminContainer.js
new file mode 100644
index 0000000..56ac1fe
--- /dev/null
+++ b/web/static/js/components/Admin/AdminContainer.js
@@ -0,0 +1,4 @@
+import { connect } from 'react-redux';
+import Admin from './Admin';
+
+export default connect()(Admin);
diff --git a/web/static/js/components/Alerts/AlertContents/CreateOrderSuccess.js b/web/static/js/components/Alerts/AlertContents/CreateOrderSuccess.js
new file mode 100644
index 0000000..bd02820
--- /dev/null
+++ b/web/static/js/components/Alerts/AlertContents/CreateOrderSuccess.js
@@ -0,0 +1,15 @@
+import React from 'react';
+import { Link } from 'react-router';
+
+const CreateOrderSuccess = () => (
+
+
We have received your order.
+
+ Your order request has been sent to your purchasing manager for approval.
+
+ You can check the status of your order by visiting your Account page.
+