[
  {
    "path": ".babelrc",
    "content": "{\n  \"presets\": [\n    \"@babel/preset-env\",\n    \"@babel/preset-react\"\n  ]\n}"
  },
  {
    "path": ".editorconfig",
    "content": "# editorconfig.org\nroot = true\n\n[*]\nindent_style = space\nend_of_line = lf\ncharset = utf-8\ntrim_trailing_whitespace = true\ninsert_final_newline = true\nindent_size = 2\n\n[*.json]\nindent_size = 2\n"
  },
  {
    "path": ".eslintignore",
    "content": "index_bundle.js\nconfig.js\ndiff.js\ndiverged.js\ndivergedWorker.js\n**/examples/**\n**/old_splash_page_v2.0/**\n**/dist/**\n**/angular.min.js\n**/js/vendor/**\n"
  },
  {
    "path": ".eslintrc",
    "content": "{\n  \"extends\": \"eslint-config-semistandard\",\n  \"rules\": {\n    \"no-multi-str\": 0\n  }\n}\n"
  },
  {
    "path": ".github/workflows/_backstop-ci-runner.yml",
    "content": "name: 👀 Backstop CI Runner\nrun-name: \"CI running on ${{ github.event_name == 'pull_request' && format('PR #{0}: {1}', github.event.pull_request.number, github.event.pull_request.title) || format('latest {0}', github.ref_name) }}\"\n\non:\n  workflow_dispatch:\n  pull_request:\n    branches: [master, develop]\n  push:\n    branches: [master, develop]\n\npermissions:\n  actions: write\n  checks: write\n  contents: write\n  pull-requests: write\n  packages: write\n\nenv:\n  BRANCH_NAME: ${{ github.event.pull_request.head.sha || github.head_ref || github.ref_name }}\n\njobs:    \n  backstop-reference-test:\n    name: Backstop reference test\n    uses: ./.github/workflows/backstop-reference-test.yml\n\n"
  },
  {
    "path": ".github/workflows/backstop-publish.yml",
    "content": "name: Backstop Publish\n#doesnt work :(\n\non:\n  workflow_dispatch:\n  workflow_call:\n\n\npermissions:\n  actions: write\n  checks: write\n  contents: write\n  pull-requests: write\n  packages: write\n\nenv:\n  BRANCH_NAME: ${{ github.event.pull_request.head.sha || github.head_ref || github.ref_name }}\n  NODE_VERSION: 20\n\njobs:\n  backstop-publish-flow:\n    name: publish-flow\n    runs-on: ubuntu-latest\n    steps:\n      - name: publish to npm\n        uses: ./.github/workflows/npm-push.yml\n\n      - name: publish to dockerhub\n        uses: ./.github/workflows/dockerhub-build-push.yml\n"
  },
  {
    "path": ".github/workflows/backstop-reference-test.yml",
    "content": "name: 🛞 Backstop Reference Test\n\non:\n  workflow_dispatch:\n  workflow_call:\n\npermissions:\n  actions: write\n  contents: write\n  pull-requests: write\n\nenv:\n  NODE_VERSION: 20\n\njobs:\n  reference-test:\n    name: reference-test\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n        with:\n          fetch-depth: 1\n          ref: ${{ github.event.pull_request.head.sha || github.ref }}\n\n      - name: Setup Node & Cache\n        uses: actions/setup-node@v4\n        with:\n          cache: \"npm\"\n          cache-dependency-path: package-lock.json\n\n      - name: Install\n        run: npm ci\n\n      - name: \"execute test\"\n        run: npm run reference-test\n\n\n"
  },
  {
    "path": ".github/workflows/backstop-sanity-docker.yml",
    "content": "name: Backstop Sanity Docker\n\non:\n  workflow_dispatch:\n  workflow_call:\n\npermissions:\n  actions: write\n  checks: write\n  contents: write\n  pull-requests: write\n  packages: write\n\nenv:\n  NODE_VERSION: 20\n  # BRANCH_NAME: ${{ github.event.pull_request.head_ref || github.event.pull_request.head.ref_name || github.head_ref || github.ref_name }}\n  # REGISTRY: ghcr.io\n  # IMAGE_NAME: ${{ github.repository }}\n\njobs:\n  sanity-puppeteer-docker:\n    name: 🤪 Puppeteer-On-Docker\n    runs-on: ubuntu-latest\n\n    permissions:\n      contents: read\n      packages: write\n\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n        with:\n          fetch-depth: 1\n          ref: ${{ github.event.pull_request.head.sha || github.ref }}\n\n      - name: Login to Docker Hub\n        uses: docker/login-action@v3\n        with:\n          username: ${{ secrets.DOCKERHUB_USERNAME }}\n          password: ${{ secrets.DOCKERHUB_TOKEN }}\n        run:\n          echo \"USERNAME=${secrets.DOCKERHUB_USERNAME}\" >>${GITHUB_ENV}\n          echo \"USERNAME=${secrets.DOCKERHUB_TOKEN}\" >>${GITHUB_ENV}\n          \n      - name: Set Name and Tag Vars\n        env:\n          name: \"${{ env.BRANCH_NAME }}\"\n        run: |\n          echo \"IMAGE_NAME_LC=${IMAGE_NAME,,}\" >>${GITHUB_ENV}\n          echo \"TAG=${name/\\//-}\" >> $GITHUB_ENV\n          echo \"PV=$(cat package.json | jq -r '.version')\" >> $GITHUB_ENV\n          echo \"PLAYWRIGHT_VERSION=$(cat package.json | jq -r '.dependencies.playwright')\"  >> $GITHUB_ENV\n\n      - name: ⬢ Setup Node & Cache\n        uses: actions/setup-node@v4\n        with:\n          cache: \"npm\"\n          cache-dependency-path: package-lock.json\n\n      - name: ↧ Install\n        run: npm ci\n\n      - name: \"𓋏 Run `npm run sanity-test-docker`\"\n        run: |\n          npm run sanity-test-docker\n\n\n\n\n"
  },
  {
    "path": ".github/workflows/docker-sanity-test.yml",
    "content": "name: Docker Sanity Tests\n\non:\n  workflow_dispatch:\n  workflow_call:\n\npermissions:\n  actions: write\n  checks: write\n  contents: write\n  pull-requests: write\n  packages: write\n\nenv:\n  BRANCH_NAME: ${{ github.event.pull_request.head_ref || github.event.pull_request.head.ref_name || github.head_ref || github.ref_name }}\n  NODE_VERSION: 20\n  REGISTRY: ghcr.io\n  IMAGE_NAME: ${{ github.repository }}\n\njobs:\n  sanity-test-puppeteer:\n    name: 🤪 Puppeteer\n    runs-on: ubuntu-latest\n\n    permissions:\n      contents: read\n      packages: write\n\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n        with:\n          fetch-depth: 1\n          ref: ${{ github.event.pull_request.head.sha || github.ref }}\n\n      - name: Set Name and Tag Vars\n        env:\n          name: \"${{ env.BRANCH_NAME }}\"\n        run: |\n          echo \"IMAGE_NAME_LC=${IMAGE_NAME,,}\" >>${GITHUB_ENV}\n          echo \"TAG=${name/\\//-}\" >> $GITHUB_ENV\n          echo \"PV=$(cat package.json | jq -r '.version')\" >> $GITHUB_ENV\n          echo \"PLAYWRIGHT_VERSION=$(cat package.json | jq -r '.dependencies.playwright')\"  >> $GITHUB_ENV\n\n      - name: Log in to the Container registry\n        uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1\n        with:\n          registry: ${{ env.REGISTRY }}\n          username: ${{ github.actor }}\n          password: ${{ secrets.GITHUB_TOKEN }}\n\n      - name: ⬢ Setup Node & Cache\n        uses: actions/setup-node@v4\n        with:\n          cache: \"npm\"\n          cache-dependency-path: package-lock.json\n\n      - name: ↧ Install\n        run: npm ci\n\n      - name: Pull Image\n        run: |\n          docker pull $REGISTRY/$IMAGE_NAME_LC:$TAG\n\n      - name: \"𓋏 Run `backstop test` in Docker\"\n        run: |\n          cd test/configs/ && docker run --rm -t --mount type=bind,source=\"$(pwd)\",target=/src $REGISTRY/$IMAGE_NAME_LC:$TAG test\n\n  sanity-test-playwright:\n    name: 🤪 Playwright\n    runs-on: ubuntu-latest\n\n    permissions:\n      contents: read\n      packages: write\n\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n        with:\n          fetch-depth: 1\n          ref: ${{ github.event.pull_request.head.sha || github.ref }}\n\n      - name: Set Name and Tag Vars\n        env:\n          name: \"${{ env.BRANCH_NAME }}\"\n        run: |\n          echo \"IMAGE_NAME_LC=${IMAGE_NAME,,}\" >>${GITHUB_ENV}\n          echo \"TAG=${name/\\//-}\" >> $GITHUB_ENV\n          echo \"PV=$(cat package.json | jq -r '.version')\" >> $GITHUB_ENV\n          echo \"PLAYWRIGHT_VERSION=$(cat package.json | jq -r '.dependencies.playwright')\"  >> $GITHUB_ENV\n\n      - name: Log in to the Container registry\n        uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1\n        with:\n          registry: ${{ env.REGISTRY }}\n          username: ${{ github.actor }}\n          password: ${{ secrets.GITHUB_TOKEN }}\n\n      - name: ⬢ Setup Node & Cache\n        uses: actions/setup-node@v4\n        with:\n          cache: \"npm\"\n          cache-dependency-path: package-lock.json\n\n      - name: ↧ Install\n        run: npm ci --verbose --foreground-scripts\n\n      - name: Pull Image\n        run: |\n          docker pull $REGISTRY/$IMAGE_NAME_LC:$TAG\n\n      - name: \"🎭 Run `backstop test --confg=playwright` in Docker\"\n        run: |\n          cd test/configs/ && docker run --rm -t --entrypoint='' --mount type=bind,source=\"$(pwd)\",target=/src $REGISTRY/$IMAGE_NAME_LC:$TAG sh -c \"chmod -R 777 /root && chmod -R 777 /opt/pw-browsers && npm --verbose --foreground-scripts i -D playwright && npx --verbose --foreground-scripts --yes playwright@$PLAYWRIGHT_VERSION install && backstop test --config=playwright\"\n"
  },
  {
    "path": ".github/workflows/dockerhub-build-push.yml",
    "content": "name: 🐳 Docker Hub Build & Push\n\non:\n  workflow_dispatch:\n  workflow_call:\n\npermissions:\n  actions: write\n  checks: write\n  contents: write\n  pull-requests: write\n  packages: write\n\nenv:\n  NODE_VERSION: 20\n\njobs:\n  build-and-push-image:\n    runs-on: ubuntu-latest\n\n    steps:\n      - name: ⇣ Checkout\n        uses: actions/checkout@v4\n        with:\n          fetch-depth: 1\n          ref: ${{ github.event.pull_request.head.sha || github.ref }}\n\n      - name: 🏷️ Set Docker Image Tag\n        run: |\n          echo \"PV=$(cat package.json | jq -r '.version')\" >> $GITHUB_ENV\n\n      - name: Log in to the Container registry\n        uses: docker/login-action@v3\n        with:\n          username: ${{ secrets.DOCKERHUB_USERNAME }}\n          password: ${{ secrets.DOCKERHUB_TOKEN }}\n\n      - name: ⬢ Setup Node & Cache\n        uses: actions/setup-node@v4\n        with:\n          cache: \"npm\"\n          cache-dependency-path: package-lock.json\n\n      - name: ↧ Install\n        run: npm ci --verbose --foreground-scripts\n\n      - name: 🚢 Build Docker Builder\n        run: |\n          npm run --verbose --foreground-scripts init-docker-builder\n\n      - name: 🐳 Build & Push to Docker Hub\n        run: |\n          docker buildx build --push --platform linux/amd64,linux/arm64 -t backstopjs/backstopjs:$PV -t backstopjs/backstopjs:latest --build-arg BACKSTOPJS_VERSION=$PV docker\n"
  },
  {
    "path": ".github/workflows/npm-push.yml",
    "content": "name: 📦 NPM Push\n\non:\n  workflow_dispatch:\n  workflow_call:\n\npermissions:\n  actions: write\n  checks: write\n  contents: write\n  pull-requests: write\n  packages: write\n  \nenv:\n  BRANCH_NAME: ${{ github.event.pull_request.head.sha || github.head_ref || github.ref_name }}\n  NODE_VERSION: 20\n\njobs:\n  publish:\n    runs-on: ubuntu-latest\n    steps: \n      - name: Checkout\n        uses: actions/checkout@v4\n        with:\n          fetch-depth: 1\n          ref: ${{ github.event.pull_request.head.sha || github.ref }}\n          \n      - name: Setup Node & Cache\n        uses: actions/setup-node@v4\n        with:\n          cache: \"npm\"\n          cache-dependency-path: package-lock.json\n      \n      - run: npm ci\n      \n      - uses: JS-DevTools/npm-publish@v3\n        with:\n          token: ${{ secrets.NPM_I2_TOKEN }}\n"
  },
  {
    "path": ".github/workflows/test-build-pub-npm-dockerhub.yml",
    "content": "name: Test build & publish npm + docker\n\non:\n  workflow_dispatch:\n        \npermissions:\n  actions: write\n  checks: write\n  contents: write\n  pull-requests: write\n  packages: write\n\nenv:\n  NODE_VERSION: 20\n\njobs:\n  test-push-npm-dockerhub:\n    runs-on: ubuntu-latest\n    \n    steps:\n      - run: echo \"start workflow\"\n      \n      - name: Checkout\n        uses: actions/checkout@v2\n      \n      - name: reference test\n        uses: ./.github/actions/backstop-reference-test.yml\n\n    \n"
  },
  {
    "path": ".gitignore",
    "content": ".DS_Store\n\n# Logs\nlogs\n*.log\n\n# Runtime data\npids\n*.pid\n*.seed\n*.cache\n\n# Dependency directory\n# Commenting this out is preferred by some people, see\n# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git-\nnode_modules\nyarn.lock\n\n# Users Environment Variables\n.lock-wscript\n\n*.sublime*\n.idea\n\ncompare/bower_components/**/.*\nexamples/**/html_report/\n\n**/backstop_data/bitmaps_test/\n**/backstop_data/html_report/\n**/backstop_data/json_report/\n**/backstop_data/reports/\ncompare/config.js\ncapture/config.json\n\ncompare/output/bitmaps_reference/\n\ncompare/output/bitmaps_test/\n\ncompare/output/config\\.js\n\n\\.vscode/\n\n# Tests\n*integrationTestDir\n"
  },
  {
    "path": ".gitlab-ci.yml",
    "content": "image: node:$NODEJS\n\n# Select what we should cache\ncache:\n  key: ${CI_COMMIT_REF_SLUG}\n  paths:\n    - node_modules/\n\nbefore_script:\n  - node -v\n  - npm -v\n  - npm install\n\ntests:\n  script:\n    - npm run lint\n    - npm run unit-test\n  parallel:\n    matrix:\n      - NODEJS:\n          - 14\n          - 16\n          - 18\n"
  },
  {
    "path": ".travis.yml",
    "content": "addons: # get google-chrome [stable|beta]\n  chrome: beta\nlanguage: node_js\nnode_js:\n  - 14\n  - 16\ninstall:\n  - npm install\nscript:\n  - npm run lint && npm run unit-test\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing to this project\n\nThank you for contributing to developer happiness all over the world!\n\nFor notes on contributing to BackstopJS please see [Developing, bug fixing, contributing...](./README.md#developing-bug-fixing-contributing)\n\n☮️\n"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2014 Garris Shipon\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n"
  },
  {
    "path": "README.md",
    "content": "![npm@latest](https://img.shields.io/npm/v/backstopjs/latest.svg) ![GitHub Repo stars](https://img.shields.io/github/stars/garris/backstopjs) ![GitHub contributors](https://img.shields.io/github/contributors/garris/backstopjs) ![downloads](https://img.shields.io/npm/dy/backstopjs) [![Backstop CI](https://github.com/garris/BackstopJS/actions/workflows/backstop-reference-test.yml/badge.svg)](https://github.com/garris/BackstopJS/actions/workflows/backstop-reference-test.yml)\n\n\n\n# BackstopJS\n\n![I'm in your webapps -- checkin your screens](http://garris.github.io/BackstopJS/assets/memes/im-in-ur-webapps-checking-ur-screens.jpg)\n\n**BackstopJS automates visual regression testing of your webapp – comparing screenshots over time.**\n\n## News\n\n**Backstop 6.3.2 -- now with support for Node 20** Many thanks to @dgrebb for this doozy of a maintainance release!\n\n**EmberJS users** -- check out our ember-backstop test helper! https://github.com/garris/ember-backstop\n\n**Want to learn how to Backstop from a pro?** Check out [visual regression testing with BackstopJS on udemy.com]([https://www.udemy.com/course/visual-regression-testing-with-backstopjs/](https://www.udemy.com/course/testes-de-regressao-visual-com-backstopjs/?referralCode=3751623DD59D061311E1)) by [Walmyr Filho](https://www.udemy.com/user/walmyr/)\n\n## Backstop Features\n\n- In-browser reporting UI with...\n  * layout settings for print and screen\n  * scenario display filtering\n  * reference, test, visual diff inspector\n  * cool scrubber thingy\n  * approving a test\n\n![BackstopJS browser report](http://garris.github.io/BackstopJS/assets/backstopjs_new_ui_.png)\n\n- Integrated Docker rendering -- to eliminate cross-platform rendering shenanigans\n- CLI reports\n- Render tests with **Chrome Headless**\n- Simulate user interactions with **Playwright** or **Puppeteer** scripts\n- JUnit reports\n- Plays nice with CI and source control\n- Run globally or locally as a standalone package app or `require('backstopjs')` right into your node app\n- Incredibly easy to use: just 3 commands go a long long way!\n\n![BackstopJS cli report](http://garris.github.io/BackstopJS/assets/cli-report.png)\n\n## Install BackstopJS Now\n\n```sh\nnpm install -g backstopjs\n```\n\n----\n\n## Contents\n\n- [Install BackstopJS Now](#install-backstopjs-now)\n- [The BackstopJS Workflow](#the-backstopjs-workflow)\n- [Getting Started](#getting-started)\n  - [Installation](#installation)\n  - [Initializing Your Project](#initializing-your-project)\n  - [Working with Your Config File](#working-with-your-config-file)\n  - [Generating Test Bitmaps](#generating-test-bitmaps)\n  - [Approving Changes](#approving-changes)\n- [Using BackstopJS](#using-backstopjs)\n  - [Scenario Properties](#scenario-properties)\n  - [Global Scenario Properties](#global-scenario-properties)\n  - [Advanced Scenarios](#advanced-scenarios)\n- [Developing, Bug Fixing, Contributing...](#developing-bug-fixing-contributing)\n- [Troubleshooting](#troubleshooting)\n- [Tutorials, Extensions and More](#tutorials-extensions-and-more)\n- [Credits](#credits)\n\n----\n\n## The BackstopJS Workflow\n\n- **`backstop init`:** Set up a new BackstopJS instance -- specify URLs, cookies, screen sizes, DOM selectors, interactions etc. (see examples directory)\n- **`backstop test`:** BackstopJS creates a set of *test* screenshots and compares them with your *reference* screenshots. Any changes show up in a visual report. (Run this after making CSS changes as many times as needed.)\n- **`backstop approve`:** If the test you ran looks good, then go ahead and approve it. Approving changes will update your reference files with the results from your last test.  Future tests are compared against your most recent approved test screenshots.\n\n## Getting Started\n\n### Installation\n\n#### Global Installation (Recommended)\n\n```sh\nnpm install -g backstopjs\n```\n\n#### Local Installation\n\nBackstopJS will run as a totally stand alone app -- but installing locally allows you to do this...\n\n```js\nconst backstop = require('backstopjs');\n```\n\nSee [Integration Options](#integration-options-local-install) to learn about cool BackstopJS integration options!\n\n### Initializing Your Project\n\n**If you don't already have BackstopJS set up...**\nBackstopJS can create a default configuration file and project scaffolding in your current working directory. Please note: this will overwrite any existing files!\n\n`cd` to your project's directory and run...\n\n```sh\nbackstop init\n```\n\n### Working with Your Config File\n\nBy default, BackstopJS places `backstop.json` in the root of your project. And also by default, BackstopJS looks for this file when invoked.\n\nPass a `--config=<configFilePathStr>` argument to test using a different config file.\n\n**JS based config file**\n\nYou may use a javascript based config file to allow comments in your config. Be sure to _export your config object as a node module_.\n\nExample: Create a backstop.js\n\n```\nmodule.exports = { Same object as backstop.json }\n```\n\nand then `backstop test --config=\"backstop.js\"`\n\n#### Required Config Properties\n\nAs a new user setting up tests for your project, you will be primarily concerned with these properties...\n\n- **`id`** – Used for screenshot naming. Set this property when sharing reference files with teammates -- otherwise omit and BackstopJS will auto-generate one for you to avoid naming collisions with BackstopJS resources.\n- **`viewports`** – An array of screen size objects your DOM will be tested against.  Add as many as you like -- but add at least one.\n- **`scenarios`** – This is where you set up your actual tests. The important sub properties are...\n  - **`scenarios[n].label`** – Required. Also used for screenshot naming.\n  - **`scenarios[n].url`** – Required. Tells BackstopJS what endpoint/document you want to test.  This can be an absolute URL or local to your current working directory.\n\n> [!TIP]\n> No other SCENARIO properties are required. Other properties can just be added as necessary.\n\n### Generating Test Bitmaps\n\n```sh\nbackstop test\n```\n\nThis will create a new set of bitmaps in `bitmaps_test/<timestamp>/`\n\nOnce the test bitmaps are generated, a report comparing the most recent test bitmaps against the current reference bitmaps will display.\n\nPass a `--filter=<scenarioLabelRegex>` argument to just run scenarios matching your scenario label.\n\n> [!TIP]\n> The `--filter` argument offers a useful shortcut for re-running a single test or failed tests.\n\nPass a `--docker` flag to render your test in a Docker container -- this will help with consistency if you are attempting to compare references across multiple environments.\n\n### Approving Changes\n\n```sh\nbackstop approve\n```\n\nWhen running this command, all images (with changes) from your most recent test batch will be promoted to your reference collection. Subsequent tests will be compared against your updated reference files.\n\nPass a `--filter=<image_filename_regex>` argument to promote only the test captures matching your scenario filename. The filenames (which by default include scenario and viewport names) are displayed in the visual and cli reports.\n\n> [!TIP]\n> Remember to pass a `--config=<configFilePathStr>` argument if you passed that when you ran your last test.\n\n## Using BackstopJS\n\n### Scenario Properties\n\nScenario properties, [which may be global](#global-scenario-properties), are described throughout this document and **processed sequentially in the following order...**\n\n| Property                 | Description                                                                                                                    |\n|--------------------------|--------------------------------------------------------------------------------------------------------------------------------|\n| `label`                  | [required] Tag saved with your reference images                                                                                 |\n| `onBeforeScript`         | Used to set up browser state e.g. cookies.                                                                                     |\n| `cookiePath`             | Import cookies in JSON format (available with default onBeforeScript, see setting cookies below)                               |\n| `url`                    | [required] The URL of your app state                                                                                           |\n| `referenceUrl`           | Specify a different state or environment when creating reference.                                                             |\n| `readyEvent`             | Wait until this string has been logged to the console.                                                                         |\n| `readySelector`          | Wait until this selector exists before continuing.                                                                            |\n| `readyTimeout`           | Timeout for readyEvent and readySelector (default: 30000ms)                                                                    |\n| `delay`                  | Wait for x milliseconds                                                                                                        |\n| `hideSelectors`          | Array of selectors set to visibility: hidden                                                                                  |\n| `removeSelectors`        | Array of selectors set to display: none                                                                                        |\n| `onReadyScript`          | After the above conditions are met -- use this script to modify UI state prior to screenshots, e.g., hovers, clicks, etc.     |\n| `keyPressSelectors`      | Takes an array of selectors and string values -- simulates multiple sequential keypress interactions.                         |\n| `hoverSelector`          | Move the pointer over the specified DOM element prior to the screenshot.                                                       |\n| `hoverSelectors`         | *Playwright and Puppeteer only* takes an array of selectors -- simulates multiple sequential hover interactions.             |\n| `clickSelector`          | Click the specified DOM element prior to the screenshot.                                                                      |\n| `clickSelectors`         | *Playwright and Puppeteer only* takes an array of selectors -- simulates multiple sequential click interactions.               |\n| `postInteractionWait`    | Wait for a selector after interacting with hoverSelector or clickSelector (optionally accepts wait time in ms). Ideal for use with a click or hover element transition. Available with default onReadyScript. |\n| `scrollToSelector`       | Scrolls the specified DOM element into view prior to the screenshot (available with default onReadyScript).                  |\n| `selectors`              | Array of selectors to capture. Defaults to document if omitted. Use \"viewport\" to capture the viewport size. See Targeting elements in the next section for more info... |\n| `selectorExpansion`      | See Targeting elements in the next section for more info...                                                                   |\n| `misMatchThreshold`      | Percentage of different pixels allowed to pass the test                                                                      |\n| `requireSameDimensions`  | If set to true -- any change in selector size will trigger a test failure.                                                    |\n| `viewports`              | An array of screen size objects your DOM will be tested against. This configuration will override the viewports property assigned at the config root. |\n| `gotoParameters`         | An array of settings passed to page.goto(url, parameters) function.                                                           |\n\n### Global Scenario Properties\n\nOne may opt to include any of the above properties at the \"global\" level, in the `scenarioDefaults` configuration object.\n\n<details>\n  <summary>Expand Example</summary>\n\n  ```json\n  {\n    \"id\": \"backstop_playwright\",\n    \"viewports\": [\n      {\n        \"label\": \"phone\",\n        \"width\": 320,\n        \"height\": 480\n      },\n      {\n        \"label\": \"tablet\",\n        \"width\": 1024,\n        \"height\": 768\n      }\n    ],\n    \"onBeforeScript\": \"playwright/onBefore.js\",\n    \"onReadyScript\": \"playwright/onReady.js\",\n    \"scenarioDefaults\": {\n      \"cookiePath\": \"backstop_data/engine_scripts/cookies.json\",\n      \"url\": \"https://garris.github.io/BackstopJS/\",\n      \"readySelector\": \"\",\n      \"delay\": 0,\n      \"hideSelectors\": [\".getItBlock\"],\n      \"removeSelectors\": [\".logoBlock\"],\n      \"hoverSelector\": \"\",\n      \"clickSelector\": \"\",\n      \"postInteractionWait\": 1000,\n      \"selectors\": [],\n      \"selectorExpansion\": true,\n      \"misMatchThreshold\" : 0.1,\n      \"requireSameDimensions\": true\n    },\n    \"scenarios\": [\n      {\n        \"label\": \"BackstopJS Homepage\",\n        \"cookiePath\": \"backstop_data/engine_scripts/cookies.json\",\n        \"url\": \"https://garris.github.io/BackstopJS/\",\n        \"referenceUrl\": \"\",\n        \"readyEvent\": \"\",\n        \"readySelector\": \"\",\n        \"delay\": 0,\n        \"hoverSelector\": \"\",\n        \"clickSelector\": \"\",\n        \"selectors\": [],\n        \"selectorExpansion\": true,\n        \"misMatchThreshold\" : 0.1,\n        \"requireSameDimensions\": true\n      }\n    ],\n    \"paths\": {\n      \"bitmaps_reference\": \"backstop_data/bitmaps_reference\",\n      \"bitmaps_test\": \"backstop_data/bitmaps_test\",\n      \"engine_scripts\": \"backstop_data/engine_scripts\",\n      \"html_report\": \"backstop_data/html_report\",\n      \"ci_report\": \"backstop_data/ci_report\"\n    },\n    \"report\": [\"browser\"],\n    \"engine\": \"playwright\",\n    \"engineOptions\": {\n      \"args\": [\"--no-sandbox\"]\n    },\n    \"asyncCaptureLimit\": 5,\n    \"asyncCompareLimit\": 50,\n    \"debug\": false,\n    \"debugWindow\": false,\n    \"archiveReport\": true,\n    \"scenarioLogsInReports\": true\n  }\n  ```\n\n</details>\n\n> [!IMPORTANT]\n> Global configuration is overridden at the `scenario` level. A scenario with `selectors: []` set as an empty array will yield zero selectors. E.g. `scenarioDefaults.selectors: [\".fancy\", \".global\", \".classes\"]` will be set to `[]`, as `scenario.selectors` takes precedence.\n\n### Advanced Scenarios\n\n#### Testing Click and Hover Interactions\n\nBackstopJS ships with an `onReady` script that enables the following interaction selectors...\n\n```js\nclickSelector: \".my-hamburger-menu\",\nhoverSelector: \".my-hamburger-menu .some-menu-item\",\n```\n\nThe above would tell BackstopJS to wait for your app to generate an element with a `.my-hamburger-menu` class, then click that selector.   Then it would wait again for a `.my-hamburger-menu .some-menu-item` class, then move the cursor over that element (causing a hover state).  Then BackstopJS would take a screenshot.\n\nYou can use these properties independent of each other to easily test various click and or hover states in your app.  These are obviously simple scenarios -- if you have more complex needs then this example should serve as a pretty good starting point create your own `onReady` scripts.\n\n> [!NOTE]\n> Playwright and Puppeteer versions optionally take `clickSelectors` & `hoverSelectors` as arrays of selectors...\n\n```js\nclickSelectors: [\".my-hamburger-menu\",\".my-hamburger-item\"],\nhoverSelectors: [\".my-nav-menu-item\",\".my-nav-menu-dropdown-item\"],\n```\n\n#### Key Press Interactions\n\nBackstopJS ships with an `onReady` script that allows user to key press on selectors...\n\n> [!NOTE]\n> Supports both Playwright and Puppeteer and takes arrays of selectors and key press values.\n\n```json\nscenarios: [\n  {\n    \"keyPressSelectors\": [\n      {\n        \"selector\": \"#email\",\n        \"keyPress\": \"marcdacz@backstopjs.com\"\n      },\n      {\n        \"selector\": \"#password\",\n        \"keyPress\": \"1234\"\n      }\n    ]\n  }\n]\n```\n\n#### Setting Cookies\n\nBackstopJS ships with an onBefore script that makes it easy to import cookie files…\n\n```json\ncookiePath: \"backstop_data/engine_scripts/cookies.json\",\n```\n\n> [!NOTE]\n> Path is relative to your current working directory.\n\n> [!TIP]\n> If you want an easy way to manually export cookies from your browser then download [this browser extension](https://github.com/ktty1220/export-cookie-for-puppeteer). You can directly use the output cookie files with BackstopJS.\n\n#### Targeting Elements\n\nBackstopJS makes it super easy to capture screenshots of your entire layout or just parts of your layout. This is defined in your `scenario.selectors` array. Elements are defined with standard CSS notation. By default BackstopJS takes a screenshot of the first occurrence of any selector found in your DOM. e.g. If you have three `li` tags in your layout only the first will used.\n\n##### `selectorExpansion`\n\nIf you want BackstopJS to find and take screenshots of _all_ matching selector instances then there is a handy switch for that. Set `selectorExpansion` to `true` like so...\n\n```json\nscenarios: [\n  {\n    \"selectors\": [\n      \".aListOfStuff li\"\n    ],\n    \"selectorExpansion\": true\n  }\n]\n// captures all <li> tags inside .aListOfStuff\n```\n\n(Default behavior) If you want very explicit control of what you capture then you can disable `selectorExpansion` and explicitly select what you want...\n\n```json\nscenarios: [\n  {\n    \"selectors\": [\n      \".aListOfStuff li\"\n    ],\n    \"selectorExpansion\": false\n  }\n]\n// Just captures the first <li> tag inside .aListOfStuff\n```\n\n##### `expect`\n\nWhen working with selector expansion(set selectors in `selectors` properties and set `selectorExpansion` to `true`), you might want to explicitly set the number of results that you expect to find by the selectors. Set `expect` in the scenario to a number which is greater than 0, then the test will fail for the scenario if the number of selected result does not match the expect number.\n\n```json\nscenarios: [\n  {\n    \"selectors\": [\n      \".aListOfStuff li\"\n    ],\n    \"selectorExpansion\": true,\n    \"expect\": 5\n  }\n]\n// captures all <li> tags inside .aListOfStuff, and make sure the number of <li> tags is 5\n```\n\n(Default behavior) If you don't care the number of the selected elements, just set `expect` to 0 or not set the property.\n\n```json\nscenarios: [\n  {\n    \"selectors\": [\n      \".aListOfStuff li\"\n    ],\n    \"selectorExpansion\": false,\n    \"expect\": 0\n  }\n]\n// Captures all <li> tags inside .aListOfStuff, and not check the number of <li> tags\n```\n\n#### Testing Progressive Apps, SPAs, and Ajax Content\n\nIt is very common for client-side web apps is to initially download a small chunk of bootstrapping code/content/state and render it to the screen as soon as it arrives at the browser. Once this has completed, various JS components often take over to progressively load more content/state.\n\nThe problem testing these scenarios is knowing _when_ to take the screenshot.  BackstopJS solves this problem with two config properties: `readySelector`, `readyEvent` and `delay`.\n\n##### Trigger Screen Capture Via Selector\n\nThe `readySelector` property tells BackstopJS to wait until a selector exists before taking a screenshot. For example, the following line will delay screen capture until a selector with the id '#catOfTheDayResult' is present somewhere in the DOM.\n\n```json\n\"readySelector\": \"#catOfTheDayResult\"\n```\n\nAnother approach might look like this...\n\n```json\n\"readySelector\": \"body.ember-has-rendered\"\n```\n\n##### Trigger Screen Capture Via `console.log()`\n\nThe `readyEvent` property enables you to trigger the screen capture by logging a predefined string to the console. For example, the following line will delay screen capture until your web app calls `console.log(\"backstopjs_ready\")`...\n\n```json\n\"readyEvent\": \"backstopjs_ready\"\n```\n\nIn the above case it would be up to you to wait for all dependencies to complete before calling logging `\"backstopjs_ready\"` string to the console.\n\n##### Delay Screen Capture\n\nThe `delay` property enables you to pause screen capturing for a specified duration of time. This delay is applied after `readyEvent` (if also applied).\n\n```js\n\"delay\": 1000 //delay in ms\n```\n\nIn the above case, BackstopJS would wait for one second before taking a screenshot.\n\nIn the following case, BackstopJS would wait for one second after the string `backstopjs_ready` is logged to the console.\n\n```js\n{\n  // ...\n  \"readyEvent\": \"backstopjs_ready\",\n  \"delay\": 1000 //delay in ms\n  // ...\n}\n```\n\n#### Dealing With Dynamic Content\n\nFor obvious reasons, this screenshot approach is not optimal for testing live dynamic content. The best way to test a dynamic app would be to use a known static content data stub – or ideally many content stubs of varying lengths which, regardless of input length, should produce certain specific bitmap output.\n\n##### Hiding Selectors\n\nThat said, for a use case where you are testing a DOM with say an ad banner or a block of dynamic content which retains static dimensions, we have the `hideSelectors` property in `capture/config.json` which will set the corresponding DOM to `visibility:hidden`, thus hiding the content from our Resemble.js analysis but retaining the original layout flow.\n\n```json\n\"hideSelectors\": [\n  \"#someFixedSizeDomSelector\"\n]\n```\n\n##### Removing Selectors\n\nThere may also be elements which need to be completely removed during testing. For that we have `removeSelectors` which removes them from the DOM before screenshots.\n\n```json\n\"removeSelectors\": [\n  \"#someUnpredictableSizedDomSelector\"\n]\n```\n\n#### Capturing Browser Console Logs\n\nSometimes you need a little more information to debug misbehavior. If that information is in the browser console logs, it won't appear in a screenshot. To capture the browser console logs along with the screenshots, set `scenarioLogsInReports`. ( _Note: In order to view the logs, you will have to serve the reports from an HTTP server. See [Interactive Web Reporting](#interactive-web-reporting) below._)\n\n```json\n\"scenarioLogsInReports\": true\n```\n\n#### Changing Test Sensitivity\n\n`\"misMatchThreshold\"` (percentage 0.00%-100.00%) will change the amount of difference BackstopJS will tolerate before marking a test screenshot as \"failed\".  The default setting is `0.1`, this may need to be adjusted based on the kinds of testing you're doing.\n\nMore info on how misMatchThreshold is derived can be found here... https://github.com/Huddle/Resemble.js/blob/af57cb2f4edfbe718d24b350b2be1d956b764298/resemble.js#L495\n\n`\"requireSameDimensions\"` (true || false) will change whether BackstopJS will accept any change in dimensions. The default setting is `true`. If set to true then the test must be the same dimensions as the reference. If set to false the test does not have to be the same dimensions as the reference.\n\nThis setting can be used in conjunction with `\"misMatchThreshold\"`, for example, when setting a `\"misMatchThreshold\"` of more than 0.00% and the mismatch causing a change in dimensions, setting `\"requireSameDimensions\"` to false will allow the test to still pass, setting it to true would still make it fail.\n\n#### Capturing the entire document or just the viewport, or just an element, or a combination.\n\nBackstopJS recognizes two magic selectors: `document` and `viewport` -- these capture the entire document and just the current specified viewport respectively.  e.g.\n\n```js\n\"scenarios\": [\n  {\n    \"selectors\": [\n      \"document\",\n      \"viewport\",\n      \"#myFeature\",\n      // ...\n    ],\n     // ...\n  }\n]\n```\n\n#### Comparing Different Endpoints (e.g. comparing staging and production)\n\nPointing to different endpoints is easy. (e.g. to compare a production environment against a staging environment).\n\nYou can create reference files (without previewing) by using the command `backstop reference`.  By default this command calls the `url` property specified in your config.  Optionally, you can add a `referenceUrl` property to your scenario configuration. If found, BackstopJS will use `referenceUrl` for screen grabs when running `backstop reference`.\n\n```js\n\"scenarios\": [\n  {\n    \"label\": \"cat meme feed sanity check\",\n    \"url\": \"http://www.moreCatMemes.com\",\n    \"referenceUrl\": \"http://staging.moreCatMemes.com:81\",\n    // ...\n  }\n]\n```\n\n#### Running Custom Scripts\n\nSimulate user actions (click, scroll, hover, wait, etc.) or states (cookie values) by running your own script on ready. For each scenario, the custom .js file you specify is imported and run when the BackstopJS ready events are fulfilled.\n\nFrom your project root, place your scripts in...\n\n```sh\n./backstop_data/engine_scripts\n```\n\nat the root of your config or in your scenario...\n\n```js\n\"onReadyScript\": \"filename.js\"   // Runs after onReady event on all scenarios -- use for simulating interactions (.js suffix is optional)\n\"onBeforeScript\": \"filename.js\"  // Runs before each scenario -- use for setting cookies or other env state (.js suffix is optional)\n\"scenarios\": [\n  {\n    \"label\": \"cat meme feed sanity check\",\n    \"onReadyScript\": \"filename.js\"   //  If found will run instead of onReadyScript set at the root (.js suffix is optional)\n    \"onBeforeScript\": \"filename.js\" // If found will run instead of onBeforeScript at the root (.js suffix is optional)\n     // ...\n  }\n]\n```\n\nInside `filename.js`, structure it like this:\n\n```js\n// onBefore example (puppeteer engine)\nmodule.exports = async (page, scenario, vp, isReference) => {\n  await require('./loadCookies')(page, scenario);\n\n  // Example: set user agent\n  await page.setUserAgent('some user agent string here');\n\n};\n\n// onReady example (puppeteer engine)\nmodule.exports = async (page, scenario, vp) => {\n  console.log('SCENARIO > ' + scenario.label);\n  await require('./clickAndHoverHelper')(page, scenario);\n\n  // Example: changing behavior based on config values\n  if (vp.label === 'phone') {\n    console.log( 'doing stuff for just phone viewport here' );\n  }\n\n  // add more stuff here...\n};\n```\n\n##### Setting the base path for custom `onBefore` and `onReady` scripts\n\nBy default, the base path is a folder called `engine_scripts` inside your BackstopJS installation directory. You can override this by setting the `paths.scripts` property in your `backstop.json` file to point to somewhere in your project directory (recommended).\n\n```json\n\"paths\": {\n  \"engine_scripts\": \"backstop_data/engine_scripts\"\n}\n```\n\n##### `onBeforeScript`/`onReadyScript` available variables\n\n`onBefore(page, scenario, viewport, isReference, Engine, config)``\n\n| Variable      | Description                                                                          |\n|---------------|--------------------------------------------------------------------------------------|\n| `page`          | Browser page object                                                                  |\n| `scenario`      | Currently running scenario config                                                    |\n| `viewport`      | Viewport info                                                                        |\n| `isReference`   | Whether the scenario contains a reference URL property                                |\n| `Engine`        | Static class reference (Puppeteer/Playwright)                                        |\n| `config`        | The whole config object                                                              |\n\n<!-- omit from toc -->\n### Reporting Workflow Tips\n\nOne testing approach to consider is incorporating BackstopJS into your build process and just let the CLI report run on each build or before each deploy.\n\nIt's natural for your layout to break while you're in feature development -- in that case you might just run a `backstop test` when you feel things should be shaping up.\n\nUse the `report` property in your config to enable or disable the respective properties. E.g. the following settings will open a browser and write a junit report.\n\n```json\n\"report\": [\"browser\", \"CI\"]\n```\n\nYou can also specify a json report:\n```json\n\"report\": [\"json\"]\n```\n\nIf you choose the CI-only reporting or even no reporting (CLI is always on) you can always enter the following command to see the latest test run report in the browser.\n\n```sh\nbackstop openReport\n```\n\n#### Test report integration with a build system like Jenkins/Travis\n\nThe following config would enable the CI - report (*default: junit format*)\n\n```json\n\"report\" : [ \"CI\" ],\n```\n\nThe regression test report will be generated in the JUnit format and the report will be placed in the given directory (*default: [backstopjs dir]/test/ci_report/xunit.xml*).\n\nYou may customize the testsuite name and/or a report file (xunit.xml) path to your build report directory by using the below configuration overrides,\n\n```js\n\"paths\": {\n  \"ci_report\" :  \"backstop_data/ci_report\"\n},\n\"ci\": {\n  \"format\" :  \"junit\" ,\n  \"testReportFileName\": \"myproject-xunit\", // in case if you want to override the default filename (xunit.xml)\n  \"testSuiteName\" :  \"backstopJS\"\n},\n```\n\n<!-- omit from toc -->\n### Interactive Web Reporting\n\n![Approve Scenarios Web Report](http://garris.github.io/BackstopJS/assets/approve_feature_hilite_sm.png)\n\nBackstop web reports support *approving scenarios* and *viewing browser logs* generated by each scenario. To enable these features you will need to run the backstop remote HTTP service in another terminal window...\n\n```bash\nBACKSTOP_REMOTE_HTTP_PORT=3000 backstop remote --config=<your config>\n```\n\n> [!TIP]\n> The command above needs to be running before you open the report, so that Backstop detects it automatically. By default Backstop will open a report after running `backstop test`. Additionally reports can always be opened by running `backstop openReport`. Also have a look at [Reporting workflow tips](#reporting-workflow-tips).\n\n> [!TIP]\n> To stop the remote server, you can either hit `Ctrl-C` or `GET` the `http://<backstopHost>/stop/` endpoint.\n\n<!-- omit from toc -->\n### BackstopJS and CLI Return Values\n\n> [!TIP]\n> When run on the command line, the BackstopJS process will return a 0 if tests were successful and a 1 if anything failed. So you always have the flexibility of branching way up high in your CLI if needed -- e.g....\n\n```\nnode ./backstopjs/cli/ test  && echo 'passed' || echo 'failed'\n```\n\n#### CLI Error Handling\n\nWhen a layout error is found in CLI mode, BackstopJS will let you know in a general report displayed in the console. In addition, BackstopJS will return a 1 (error) to the calling CLI process.\n\n<!-- omit from toc -->\n### Setting The Bitmap And Script Directory Paths\n\nBy default, BackstopJS saves generated resources into the `backstop_data` directory in parallel with your `backstop.json` config file. The location of the various resource types are configurable so they can easily be moved inside or outside your source control or file sharing environment. See below for options...\n\n> [!TIP]\n> These file paths are relative to your current working directory.\n\n```json\n  ...\n  \"paths\": {\n    \"bitmaps_reference\": \"backstop_data/bitmaps_reference\",\n    \"bitmaps_test\": \"backstop_data/bitmaps_test\",\n    \"engine_scripts\": \"backstop_data/engine_scripts\",\n    \"html_report\": \"backstop_data/html_report\",\n    \"json_report\": \"backstop_data/json_report\",\n    \"ci_report\": \"backstop_data/ci_report\",\n  }\n  ...\n```\n\n<!-- omit from toc -->\n### Changing The Rendering Engine\n\nBoth Puppeteer and Playwright are installed by default, though the default configuration is set to Puppeteer.\n\n#### Chrome-Headless (The latest webkit library)\n\nTo use chrome headless you can currently use _puppeteer_ (https://github.com/GoogleChrome/puppeteer).\n\n```json\n\"engine\": \"puppeteer\"\n```\n\n#### Playwright\n\nTo use firefox or webkit, you can currently use _playwright_ (https://github.com/microsoft/playwright).\n\nBe sure to also switch the onBefore and `onReady` scripts to the Playwright defaults.  Playwright supports setting `engineOptions.browser` to `chromium`, `firefox`, or `webkit`.\n\nThe [storageState](https://playwright.dev/docs/api/class-browsercontext#browser-context-storage-state) config property is supported via the `engineOptions` object in backstop config. This sets cookies _and_ localStorage variables in the Playwright engine before tests are run. Very useful taking screenshots of pages that require authentication.\n\n```json\n  ...\n  \"onBeforeScript\": \"playwright/onBefore.js\",\n  \"onReadyScript\": \"playwright/onReady.js\",\n  ...\n  \"engine\": \"playwright\"\n  ...\n  \"engineOptions\": {\n    \"browser\": \"chromium\",\n    \"storageState\": \"/path/to/cookies-and-local-storage-file.json\"\n  }\n  ...\n```\n\n<!-- omit from toc -->\n### Setting Puppeteer And Playwright Option Flags\n\nBackstop sets two defaults for both Puppeteer and Playwright:\n\n```json\nignoreHTTPSErrors: true,\nheadless: <!!!config.debugWindow>\n```\n\nYou can add more settings (or override the defaults) with the `engineOptions` property. (properties are merged). This is where headless mode can also be set to 'new', until \"new headless mode\" is less hacky and more supported by Playwright.\n\n> [!INFORMATION]\n> Puppeteer now runs in `new` headless mode by default, but can be set to `old` headless by passing `\"headless\": true` in the configuration file.\n\n```json\n\"engineOptions\": {\n  \"ignoreHTTPSErrors\": false,\n  \"args\": [\"--no-sandbox\", \"--disable-setuid-sandbox\"],\n  \"headless\": \"new\",\n  \"gotoParameters\": { \"waitUntil\": \"networkidle0\" },\n}\n```\n\nMore info here:\n  * [Puppeteer on github](https://github.com/GoogleChrome/puppeteer).\n  * [Playwright on github](https://github.com/microsoft/playwright).\n\n<!-- omit from toc -->\n### Using Docker For Testing Across Different Environments\n\nWe've found that different environments can render the same webpage in slightly different ways -- in particular with text. E.G. see the text in this example rendering slightly differently between Linux and Mac...\n\n![BakcstopJS OS rendering differences](http://garris.github.io/BackstopJS/assets/osRenderDifference.png)\n\nYou can make this issue go away by rendering in a BackstopJS Docker container.  Lucky for you we've made it incredibly easy to do.\n\nFirst, go ahead and install docker on your machine from the [Docker Downloads Page](https://store.docker.com/search?type=edition&offering=community&architecture=amd64).\n\nMake sure Docker is running on your machine.  On MacOS there is a menu item that looks like this... ![MacOS Docker Menu Item](https://user-images.githubusercontent.com/447033/42773728-fef034f4-88e2-11e8-9956-d58a7d432402.png)\n\nThen, simply add a `--docker` flag onto your commands. E.G...\n\n```sh\nbackstop test --docker\n```\n\nor for a local install\n\n```js\nconst backstop = require('backstopjs');\nbackstop('test', {docker: true});\n```\n\nThe above flag will cause BackstopJS to hit your Docker local client, spin up a BackstopJS container from https://hub.docker.com/r/backstopjs/backstopjs/ and execute your test. By default, Backstop will attemt to use a Docker image with the same version number specified in your `package.js`.\n\n#### Changing The Default Docker Command\n\nIf the default docker command or image does not work for you, you can customize the command to run BackstopJS with Docker by changing the `dockerCommandTemplate` config option. The default is:\n\n```sh\n\"dockerCommandTemplate\": \"docker run --rm -it --mount type=bind,source=\\\"{cwd}\\\",target=/src backstopjs/backstopjs:{version} {backstopCommand} {args}\"\n```\n\nTo improve security and prevent ownership problems of the generated files it is recommended to configure the used dockerCommandTemplate to use a user which does match your environment, for example to run it on linux with your current user and group id you could use that template:\n\n```sh\n\"dockerCommandTemplate\": \"docker run --rm -it --user $(id -u):$(id -g) --mount type=bind,source=\\\"{cwd}\\\",target=/src backstopjs/backstopjs:{version} {backstopCommand} {args}\"\n```\n\n> [!TIP]\n> To run BackstopJS in Docker in an environment where the output is piped (e.g. CI server or an IDE's output window), remove the -t parameter (change the default to \"docker run --rm -i --mount...)\n\n#### Requirements for when you're using docker...\n\n1. **If you are using a config generated prior to version 3.5 and you get an error like this...**\n\n    ```\n      COMMAND | Command \"test\" ended with an error after [0.312s]\n      COMMAND | Error: Failed to launch chrome!\n                ... Running as root without --no-sandbox is not supported. See https://crbug.com/638180.\n                TROUBLESHOOTING: https://github.com/GoogleChrome/puppeteer/blob/master/docs/troubleshooting.md\n    ```\n\n    then you need to add this to the root of your config...\n\n    ```js\n    \"engineOptions\": {\n        \"args\": [\"--no-sandbox\"]\n    },\n    ```\n\n2. **`localhost` won't work in your scenarios -- instead, mac and win users can use `host.docker.internal` e.g.**\n\n    ```json\n    \"url\": \"https://host.docker.internal/?someCoolAppParameter=true\"\n    ```\n\n<!-- omit from toc -->\n### Integration Options (Local Install)\n\nInstalling BackstopJS locally to your project makes a few integration options available.\n\nUsing Backstop as a locally installed standalone app looks like this....\n\n```sh\n# Install from your project root\nnpm install backstopjs\n\n# Then, run commands by directly calling the cli\n./node_modules/.bin/backstop test --config=<myConfigPath>\n```\n\nThe more interesting case is calling backstop from another node app...\n\n```js\nconst backstop = require('backstopjs');\n```\n\n#### Invoke default behavior in the current working directory context\n\n```js\nbackstop('test')\n  .then(() => {\n    // test successful\n  }).catch(() => {\n    // test failed\n  });\n```\n\n#### Pass options to the command\n\n```js\nbackstop('test', {config:'custom/backstop/config.json'});\n```\n\n#### Pass a config object to the command\n\n```js\n// you can also pass a literal object\nbackstop('test', {\n  config: {\n    id: \"foo\",\n    scenarios: [\n      //some scenarios here\n    ]\n  }\n});\n```\n\n#### The `--filter` argument still works too -- just pass a `filter` prop instead.\n\n```js\n// you can also pass a literal object\nbackstop('test', {\n  filter: 'someScenarioLabelAsRegExString',\n  config: {\n    id: \"foo\",\n    scenarios: [\n      //some scenarios here\n    ]\n  }\n});\n```\n\n#### Parse a config file explicitly\n\n```js\nbackstop('test', {\n  config: require(\"./backstop.js\")({\n    \"foo\": \"bar\"\n  })\n});\n\n\n// Inside of `backstop.js` we export a function that returns the configuration object\nmodule.exports = options => {\n  return {\n    //you can access options.foo here\n  }\n}\n```\n\n#### Since the backstop returns promises so it can run natively as a task in build systems like gulp\n\n```js\nconst gulp = require('gulp');\nconst backstop = require('backstopjs');\n\ngulp.task('backstop_reference', () => backstop('reference'));\ngulp.task('backstop_test', () => backstop('test'));\n```\n\n#### Using `npm run` Scripts\n\nWhen BackstopJS is installed locally, NPM will recognize the `backstop <command>` pattern originating from your own npm `package.json` scripts. The following would enable you to run the respective `npm <command>` commands locally in your project.\n\n```json\n\"scripts\": {\n  \"approve\": \"backstop approve\",\n  \"test\": \"backstop test\",\n  \"init\": \"backstop init\"\n}\n```\n\nThe above is a basic example -- check out the NPM documentation for more info.\n\n<!-- omit from toc -->\n### Tuning BackstopJS Performance\n\nDuring a test, BackstopJS processes image capture and image comparisons in parallel. You can adjust how much BackstopJS does at one time by changing\n\n#### Capturing Screens In Parallel\n\nBy default, this value is limited to 10.  This value can be adjusted as needed to increase/decrease the amount of RAM required during a test.\n\nThe example below would capture 5 screens at a time...\n```json\nasyncCaptureLimit: 5\n```\n\n#### Comparing Screens In Parallel\n\nBy default, this value is limited to 50. This value can be adjusted as needed to increase/decrease the amount of RAM required during a test.\n\nAs a (very approximate) rule of thumb, BackstopJS will use 100MB RAM plus approximately 5 MB for each concurrent image comparison.\n\nTo adjust this value add the following to the root of your config...\n\n```json\n\"asyncCompareLimit\": 100\n// Would require 600MB to run tests. Your mileage most likely will vary ;)\n```\n\n<!-- omit from toc -->\n### Creating Reference Files\n\nThis Utility command will by default delete all existing screen references and create new ones based on the `referenceUrl` or `url` config config. It will not run any file comparisons.\n\nUse this when you...\n- create references from another environment (e.g. staging vs prod)\n- or clean out your reference files and start fresh with all new reference\n- or just create references without previewing\n\nFrom your project directory...\n\n```sh\nbackstop reference\n```\n\noptional parameters\n`--config=<configFilePath>`   point to a specific config file\n`--filter=<scenario.name>`    filter on scenario.name via regex string\n`--i`                         incremental flag -- use if you don't want BackstopJS to first delete all files in your reference directory\n\n<!-- omit from toc -->\n### Modifying Output Settings Of Image-Diffs\n\nBy specifying `resembleOutputOptions` in your backstop.json file you can modify the image-diffs transparency, errorcolor, etc. (See [Resemble.js outputSettings](https://github.com/Huddle/Resemble.js) for the full list.)\n\nInstead of calling resemble`s ignoreAntialiasing(), you may set it as a property in the config. (See [example](examples/simpleReactApp/backstop.json))\n\nPer default, Backstop uses Resemble's misMatchPercentage value. However, this value only detects mismatches above 0.01%. If you need more precision and want to use a `misMatchThreshold` below `0.01` (e.g. for large screenshots or small changes), you can set `usePreciseMatching` in the `resembleOutputOptions`. (See [example](examples/simpleReactApp/backstop.json))\n\n```json\n\"resembleOutputOptions\": {\n  \"errorColor\": {\n    \"red\": 255,\n    \"green\": 0,\n    \"blue\": 255\n  },\n  \"errorType\": \"movement\",\n  \"transparency\": 0.3,\n  \"ignoreAntialiasing\": true\n}\n```\n\n<!-- omit from toc -->\n### Git Integration\n\nFor most users, it can be helpful to keep a record of reference files over the long haul -- but saving multiple _test_ screenshots is probably overkill. So, just like checking-in your unit tests with your production code you can similarly check in your Backstop reference files with your production code.\n\nFor many users, adding these lines to your `.gitignore` or `.git/info/exclude` files will pare down your backstop files in a sensible way.\n\n```\nbackstop_data/html_report/\nbitmaps_test/\n```\n\n_Of course you can alternatively change your default config to save these files somewhere else out of the source control scope -- thats cool too._\n\n<!-- omit from toc -->\n### Changing Screenshot Filename Formats\n\nOne of the things Backstop does for you is manage all your screenshot files.  Backstop uses a specific file-naming scheme to make this work.  Changing this scheme is of course NOT RECOMMENDED.  That said -- if you have an overwhelming need, then you can modify this behavior using the `fileNameTemplate` property. The default pattern is shown below where the labels in braces are replaced with internal values during runtime.\n\n```js\n{\n  // ...\n  fileNameTemplate: '{scenarioIndex}_{scenarioLabel}_{selectorIndex}_{selectorLabel}_{viewportIndex}_{viewportLabel}',\n  // ...\n}\n```\n\n## Developing, Bug Fixing, Contributing...\n\nFirst off, You are awesome! Thanks for your interest, time and hard work!  Here are some tips...\n\n<!-- omit from toc -->\n### We use `eslint-config-semistandard`.\n\nPlease run the linter before each submit, as follows. Thank you. 🙇🏽\n\n```sh\nnpm run lint -- --fix\n```\n\n<!-- omit from toc -->\n### HTML Report Development\n\n> [!WARNING]\n> Here be dragons. Webpack, React, and other dependency updates are in progress.\n\nHere's some suggestions if you want to work on the HTML report locally...\n\n- The HTML front end is a React app.  It lives in `/compare/src/`\n\n- The workflow is as follows from the backstopjs root\n  - Start a remote server if you need to work with the approving tests flow\n\n    ```\n    cd test/configs/ && node ../../cli/index.js remote\n    ```\n  - Open another shell and run a test with this...\n\n    ```\n    npm run sanity-test\n    ```\n  - Your test report should display as designed.\n  - Then, make your UI changes and build with this...\n\n    ```\n    npm run build-and-copy-report-bundle\n    ```\n    - No need to rerun a test, just refresh the browser window to view your UI changes.\n    - Repeat the process until you're done.\n    - When you are done, check it in and include the bundle as part of the checkin.\n\n> [!NOTE]\n> 👆 As a convenience, `npm run build-and-copy-report-bundle` copies your newly built React bundle into `test/configs/backstop_data/html_report/` so you can then test your changes by simply refreshing your report in chrome.\n\n<!-- omit from toc -->\n### Docker Development\n\nWant to make sure your changes work with the `--docker` option? You can rebuild your local docker image from your current BackstopJS source.  From your BackstopJS root...\n\n#### Building and Testing Locally\n\ntl;dr\n\n- `npm run init-docker-builder`\n- customize `./docker/Dockerfile`\n- `npm run build-docker`\n- `npm run build-and-load-docker`\n\n<details>\n  <summary>Details</summary>\n  <p>The Docker image is created via `npm run build-docker`, which uses a custom docker builder, created via `npm run init-docker-builder`. This ensures the Docker image can run on multiple platform architectures (M1 vs. Inteal Macs for example). [Read more](https://docs.docker.com/build/building/multi-platform/ \"Docker Documentation)) about this.</p>\n\n  <p>Because BackstopJS's Docker image is created with a custom `docker buildx` builder, one must \"load\" the image into their local registry. This is where `npm run build-and-load-docker` comes in handy.</p>\n</details>\n\n#### Publishing to Container Registries\n\nIf you have access to Docker Hub @backstop/backstop, then this command will push a new public BackstopJS docker image with the current version tag...\n\n```sh\nnpm run push-docker\n```\n\nThere are various other ways one can publish to ghcr.io, *.ecr.*.amazonaws.com etc. but those are beyond the scope of this README.\n\n<!-- omit from toc -->\n### SMOKE & FEATURE TESTS\n\nSee the next section for running the SMOKE TEST -- Please make sure this is working before submitting any PR's.  Thanks!\n\n  ```\n  # From root directory\n  # ---------------\n  # simple test\n    npm run sanity-test-docker\n\n  # longer test covering many features\n    npm run smoke-test-docker\n\n  # Or another way to test...\n\n  # From test/configs/ directory\n  # ---------------\n  # simple test\n    ../../cli/index.js test --config=backstop --docker\n  # longer test covering many features\n    ../../cli/index.js test --config=backstop_features --docker\n  ```\n\n## Troubleshooting\n\n<!-- omit from toc -->\n### SANITY TEST: Does Backstop work in my environment?\n\nRun the following command from your Desktop, home or project directory to check that Backstop will install and run in your environment. _Please make sure you have node version 8 or above. Windows users: Powershell is recommended._\n\n```\nmkdir backstopSanityTest; cd backstopSanityTest; mkdir node_modules; npm install backstopjs; ./node_modules/.bin/backstop init; ./node_modules/.bin/backstop reference; ./node_modules/.bin/backstop test\n\n```\n\nHere is a sanity test which also uses docker...\n\n```\nmkdir backstopSanityTest; cd backstopSanityTest; mkdir node_modules; npm install backstopjs; ./node_modules/.bin/backstop init; ./node_modules/.bin/backstop reference --docker; ./node_modules/.bin/backstop test --docker\n```\n\n<!-- omit from toc -->\n### SMOKE TEST: Are backstop features working ok?\n\nRun this command if you have made changes to the BackstopJS codebase and you want to make sure that you haven't broken anything.\n\n```\n    # from the backstopjs directory\n    npm run smoke-test\n```\n\n<!-- omit from toc -->\n### Debugging\n\nYou have the option of displaying the Chrome window as tests are running.  This will allow you to visually see your app state at the time of your test.  To enable use...\n\n```json\n\"debugWindow\": true\n```\n\nWhen `debugWindow` is enabled on macOS, the system may show many firewall popups. This is because Puppeteer's Chromium application is not code-signed. As the exact steps to work around this may change with different macOS versions, see [[problem] Mac OS Firewall popup on every launch of puppeteer #4752](https://github.com/puppeteer/puppeteer/issues/4752) until this is fixed upstream. As of macOS Monterey 12.4, [these steps](https://github.com/puppeteer/puppeteer/issues/4752#issuecomment-1099647133) are the most current to run.\n\nFor all engines there is also the `debug` setting.  This enables verbose console output.This will also output your source payload to the terminal so you can make sure to check that the server is sending what you expect. 😉\n\n```json\n\"debug\": true\n```\n\n<!-- omit from toc -->\n### Issues with Chrome-Headless in Docker\n\nPlease keep in mind, Chrome-Headless will need a lot of memory. Take a look at these if you are seeing weird timeout errors with Docker...\n\nhttps://github.com/garris/BackstopJS/issues/603#issuecomment-346478523\n\nhttps://github.com/garris/BackstopJS/issues/537#issuecomment-339710797\n\n<!-- omit from toc -->\n### Interaction: Clicking A Link That Loads A New Page\n\nThis is a grey area for BackstopJS.  When you click a link to a new page inside of Chrome headless then you are unloading all your current app state and starting fresh with a new app state.  If this is your case, the best practice is to simply create a new BackstopJS scenario with the required URL state etc.  If you have some kind of situation which really requires this kind of behavior then it's doable -- take a look at this issue for inspiration... https://github.com/garris/BackstopJS/issues/657\n\n<!-- omit from toc -->\n### Chrome Zombies!\n\nSometimes when developing scripts -- browser errors can actually cause Chrome-Headless to lose their special connection to each other.  If you find that Chrome zombies are accumulating in your ENV spacetime continuum then please follow these steps:\n\n   1) DON’T PANIC!\n\n   2) Remain calm.\n\n   3) do the following...\n\n      MacOS and Linux users can run...\n      ```\n      pkill -f \"(chrome)?(--headless)\"\n      ```\n\n      Windows users can run... (in PowerShell)\n      ```\n      Get-CimInstance Win32_Process -Filter \"Name = 'chrome.exe' AND CommandLine LIKE '%--headless%'\" | %{Stop-Process $_.ProcessId}\n      ```\n\n<!-- omit from toc -->\n### The dreaded: _command-not-found_ error...\n\nDid you install BackstopJS with the global option?  If installing globally remember to add that `-g` when installing with npm *i.e.* `npm install -g backstopjs`. If you installed *locally*, remember that the `backstop <command>` pattern will only be available to your npm scripts -- see the [local installation section](#local-installation) above for more info.\n\n<!-- omit from toc -->\n### Issues When Installing\n\nSometimes bad permissions happen to good people. It's ok, this is a safe space. Hopefully this will help... https://github.com/garris/BackstopJS/issues/545\n\n<!-- omit from toc -->\n### Projects don't work when I share with other users or run in different environments.\n\nBe sure to use a config `id` in your config file. See https://github.com/garris/BackstopJS/issues/291\n\n---\n\n## Tutorials, Extensions and More\n\n- A cool overview article by [Adrien Lemaire](https://www.linkedin.com/in/adrienlemaire) -- [Overview of BackstopJS, a tool to test a web application’s UI](https://medium.com/@Fandekasp/overview-of-backstopjs-a-tool-to-test-a-web-applications-ui-99234dc6c4f2)\n- Another by [Adrien Lemaire](https://www.linkedin.com/in/adrienlemaire) Check this if you are interested in Continuous Integration (CI)! [A journey in Continuous Integration Testing](https://medium.com/@Fandekasp/a-journey-in-continuous-integration-testing-e33ca79078f4)\n- [Angela Riggs](https://www.linkedin.com/in/angelariggs/detail/recent-activity/posts/) is a pioneer in the Visual Testing space and leader in cultivating a culture of quality for software teams.  Read about it [here](https://www.linkedin.com/pulse/visual-regression-testing-backstopjs-angela-riggs/) and [here](https://www.pnsqc.org/automated-visual-regression-testing-with-backstopjs/) and listen to her talk [here](https://www.linkedin.com/pulse/creating-culture-quality-angela-riggs/)\n- Check out [Marc Dacanay's](https://www.linkedin.com/in/marcdacanay/detail/recent-activity/posts/) BackstopJS articles -- he has a great intro as well as some great in-depth tips.\n- Here is a [cool project template for static sites](https://github.com/wlsf82/backstop-config) by Walmyr Filho [@wlsf82](https://github.com/wlsf82) https://twitter.com/walmyrlimaesilv\n- Here is [an online course about visual regression testing with BackstopJS]([https://www.udemy.com/course/visual-regression-testing-with-backstopjs/](https://www.udemy.com/course/testes-de-regressao-visual-com-backstopjs/?referralCode=3751623DD59D061311E1)) by [Walmyr Filho](https://www.udemy.com/user/walmyr/)\n- [A really good one on refactoring CSS with BackstopJS](https://hannes.kaeufler.net/posts/refactoring-css) by Hannes Käufler\n- [A Simple grunt-backstopjs plugin](http://www.obqo.de/blog/2016/12/30/grunt-backstopjs/) - For the Grunt enthusiasts\n\n## Credits\n\nBackstopJS was created and is maintained by [Garris Shipon](https://www.linkedin.com/in/garrisshipon/) with help from [these amazing engieers](https://github.com/garris/BackstopJS/graphs/contributors).\n\n\n🙇 Special thanks to these contributors...\n- [Lewis Nyman](https://github.com/lewisnyman)\n- [Stoutie](https://github.com/jehoshua02)\n- [Klaus Bayrhammer](https://github.com/klausbayrhammer)\n- [Evan Lovely](https://github.com/EvanLovely)\n- [Benedikt Rötsch](https://github.com/axe312ger)\n- [Suresh Kumar. M](https://github.com/nobso)\n- [Shinji Yamada](https://github.com/dotneet)\n- [@onigoetz](https://github.com/onigoetz)\n- [uğur mirza zeyrek](mirzazeyrek)\n- [anton-kulagin](https://github.com/anton-kulagin)\n- [Leonid Makarov](https://github.com/lmakarov)\n- [Gabriele Mantovani](https://github.com/mantovanig)\n- [Walmyr Filho](https://github.com/wlsf82)\n- [Torsten Krah](https://github.com/tkrah)\n- [Joel Brown](https://github.com/FrostyShosty)\n- [Dan Grebb](https://github.com/dgrebb)\n\n\n\n"
  },
  {
    "path": "assets/styles.css",
    "content": "html {\n  background:#faebd7 url('./duskBg1.png') no-repeat center center fixed;\n  background-size: cover;\n}\nbody {\n  font-family: 'Encode Sans', sans-serif;\n  color: #444;\n  background-color: transparent;\n}\na:hover {\n  background-color: rgba(150, 200, 255, .5);\n  text-decoration: none;\n  color: #faebd7;\n}\n.github-link {\n  display: inline-block;\n  border-radius: 25px;\n}\n.lemur-link:hover, .logo-link:hover {\n  background-color: transparent;\n}\n.page-root {\n  max-width: 1000px;\n}\n.moneyshot {\n  padding: 3rem 0;\n  text-align: center;\n}\n.mascotBlock {\n  perspective: 1000px;\n  margin-bottom: -0.4rem;\n}\n.logoBlock {\n  perspective: 1000px;\n  margin-bottom: .5rem;\n}\n.lemurInYourFace:hover {\n  transform: translateZ(100px);\n}\n.hideLemur .lemurInYourFace {\n  opacity: 0;\n  visibility: hidden;\n  transform: translateZ(200px);\n}\n.hideLemur .lemurInYourFace {\n  opacity: 0;\n  visibility: hidden;\n  transform: translateZ(200px);\n}\n.hideOctocat .github-icon {\n  visibility: hidden;\n}\n.lemurInYourFace {\n  transition: transform 750ms ease, opacity 750ms ease, visibility 800ms ease;\n  width: 50%;\n  /*min-width: 270px;*/\n  z-index: 1;\n  position: relative;\n}\n.hideLemur #lemurButt {\n  opacity: 1;\n}\n#lemurButt {\n  position: absolute;\n  left: calc(50% - 40px);\n  bottom: 10px;\n  opacity: 0;\n  width: 20%;\n  max-width: 100px;\n}\n.github-icon {\n  width: 50px;\n}\n.cta {\n  display: block;\n}\n.BackstopJS3:hover {\n  transform: translateZ(50px);\n}\n.BackstopJS3 {\n  transition: transform 750ms ease;\n  width: 60%;\n  /*min-width: 270px;*/\n}\n.getItBlock, .supportsBlock {\n  padding: 3rem 0;\n  text-align: center;\n  font-weight: 200;\n}\n.casper {\n  color: #BD10E0;\n}\n.chrome {\n  color: #9013FE;\n}\n\nh1, p { font-size: 1em; color: #666; font-weight: 300}\n\n/*Small devices (landscape phones, 576px and up)*/\n@media screen and (min-width: 576px) {\n  h1, p { font-size: 1.3rem; }\n}\n\n/*Medium devices (tablets, 768px and up)*/\n@media screen and (min-width: 768px) {\n  h1, p { font-size: 1.5rem; }\n}\n\n/*Large devices (desktops, 992px and up)*/\n@media (min-width: 992px) {\n  h1, p { font-size: 1.8rem; }\n}\n\n/*Extra large devices (large desktops, 1200px and up)*/\n@media (min-width: 1200px) {\n  h1, p { font-size: 2.1rem; }\n}\n"
  },
  {
    "path": "capture/backstopTools.js",
    "content": "'use strict';\nmodule.exports = (target) => {\n  return target.evaluate(() => {\n    if (window._backstopTools) {\n      return false;\n    }\n\n    window._backstopTools = {\n      hasLogged: function (str) {\n        return new RegExp(str).test(window._backstopTools._consoleLogger);\n      },\n      startConsoleLogger: function () {\n        if (typeof window._backstopTools._consoleLogger !== 'string') {\n          window._backstopTools._consoleLogger = '';\n        }\n        const log = window.console.log.bind(console);\n        window.console.log = function () {\n          window._backstopTools._consoleLogger += Array.from(arguments).join('\\n');\n          log.apply(this, arguments);\n        };\n      },\n      /**\n       * Take an array of selector names and return and array of *all* matching selectors.\n       * For each selector name, If more than 1 selector is matched, proceeding matches are\n       * tagged with an additional `__n` class.\n       *\n       * @return {[string]} [array of expanded selectors]\n       * @param selectors\n       */\n      expandSelectors: function (selectors) {\n        if (!Array.isArray(selectors)) {\n          selectors = selectors.split(',');\n        }\n        return selectors.reduce(function (acc, selector) {\n          if (selector === 'body' || selector === 'viewport') {\n            return acc.concat([selector]);\n          }\n          if (selector === 'document') {\n            return acc.concat(['document']);\n          }\n          const qResult = document.querySelectorAll(selector);\n\n          // pass-through any selectors that don't match any DOM elements\n          if (!qResult.length) {\n            return acc.concat(selector);\n          }\n\n          const expandedSelector = [].slice.call(qResult)\n            .map(function (element, expandedIndex) {\n              if (element.classList.contains('__86d')) {\n                return '';\n              }\n              if (!expandedIndex) {\n                // only first element is used for screenshots -- even if multiple instances exist.\n                // therefore index 0 does not need extended qualification.\n                return selector;\n              }\n              // create index partial\n              const indexPartial = '__n' + expandedIndex;\n              // update all matching selectors with additional indexPartial class\n              element.classList.add(indexPartial);\n              // return array of fully-qualified classnames\n              return selector + '.' + indexPartial;\n            });\n          // concat arrays of fully-qualified classnames\n          return acc.concat(expandedSelector);\n        }, []).filter(function (selector) {\n          return selector !== '';\n        });\n      },\n      /**\n       * is the selector element visible?\n       * @param  {[type]}  selector [a css selector str]\n       * @return {Boolean}          [is it visible? true or false]\n       */\n      isVisible: function (selector) {\n        if (selector === 'body' || selector === 'document' || selector === 'viewport') {\n          return true;\n        } else if (window._backstopTools.exists(selector)) {\n          const element = document.querySelector(selector);\n          const style = window.getComputedStyle(element);\n          return (style.display !== 'none' && style.visibility !== 'hidden' && style.opacity !== '0');\n        }\n        return false;\n      },\n      /**\n       * does the selector element exist?\n       * @param  {[type]} selector [a css selector str]\n       * @return {[type]}          [returns count of found matches -- 0 for no matches]\n       */\n      exists: function (selector) {\n        if (selector === 'body' || selector === 'document' || selector === 'viewport') {\n          return 1;\n        }\n        return document.querySelectorAll(selector).length;\n      }\n    };\n\n    window._backstopTools.startConsoleLogger();\n    console.info('BackstopTools have been installed.');\n    return true;\n  });\n};\n"
  },
  {
    "path": "capture/config.default.json",
    "content": "{\n  \"id\": \"backstop_default\",\n  \"viewports\": [\n    {\n      \"label\": \"phone\",\n      \"width\": 320,\n      \"height\": 480\n    },\n    {\n      \"label\": \"tablet\",\n      \"width\": 1024,\n      \"height\": 768\n    }\n  ],\n  \"onBeforeScript\": \"puppet/onBefore.js\",\n  \"onReadyScript\": \"puppet/onReady.js\",\n  \"scenarios\": [\n    {\n      \"label\": \"BackstopJS Homepage\",\n      \"cookiePath\": \"backstop_data/engine_scripts/cookies.json\",\n      \"url\": \"https://garris.github.io/BackstopJS/\",\n      \"referenceUrl\": \"\",\n      \"readyEvent\": \"\",\n      \"readySelector\": \"\",\n      \"delay\": 0,\n      \"hideSelectors\": [],\n      \"removeSelectors\": [],\n      \"hoverSelector\": \"\",\n      \"clickSelector\": \"\",\n      \"postInteractionWait\": 0,\n      \"selectors\": [],\n      \"selectorExpansion\": true,\n      \"expect\": 0,\n      \"misMatchThreshold\" : 0.1,\n      \"requireSameDimensions\": true\n    }\n  ],\n  \"paths\": {\n    \"bitmaps_reference\": \"backstop_data/bitmaps_reference\",\n    \"bitmaps_test\": \"backstop_data/bitmaps_test\",\n    \"engine_scripts\": \"backstop_data/engine_scripts\",\n    \"html_report\": \"backstop_data/html_report\",\n    \"ci_report\": \"backstop_data/ci_report\"\n  },\n  \"report\": [\"browser\"],\n  \"engine\": \"puppeteer\",\n  \"engineOptions\": {\n    \"args\": [\"--no-sandbox\"]\n  },\n  \"asyncCaptureLimit\": 5,\n  \"asyncCompareLimit\": 50,\n  \"debug\": false,\n  \"debugWindow\": false\n}\n"
  },
  {
    "path": "capture/engine_scripts/cookies.json",
    "content": "[\n  {\n    \"domain\": \".www.yourdomain.com\",\n    \"path\": \"/\",\n    \"name\": \"yourCookieName\",\n    \"value\": \"yourCookieValue\",\n    \"expirationDate\": 1798790400,\n    \"hostOnly\": false,\n    \"httpOnly\": false,\n    \"secure\": false,\n    \"session\": false,\n    \"sameSite\": \"Lax\"\n  }\n]\n"
  },
  {
    "path": "capture/engine_scripts/playwright/clickAndHoverHelper.js",
    "content": "module.exports = async (page, scenario) => {\n  const hoverSelector = scenario.hoverSelectors || scenario.hoverSelector;\n  const clickSelector = scenario.clickSelectors || scenario.clickSelector;\n  const keyPressSelector = scenario.keyPressSelectors || scenario.keyPressSelector;\n  const scrollToSelector = scenario.scrollToSelector;\n  const postInteractionWait = scenario.postInteractionWait; // selector [str] | ms [int]\n\n  if (keyPressSelector) {\n    for (const keyPressSelectorItem of [].concat(keyPressSelector)) {\n      await page.waitForSelector(keyPressSelectorItem.selector);\n      await page.type(keyPressSelectorItem.selector, keyPressSelectorItem.keyPress);\n    }\n  }\n\n  if (hoverSelector) {\n    for (const hoverSelectorIndex of [].concat(hoverSelector)) {\n      await page.waitForSelector(hoverSelectorIndex);\n      await page.hover(hoverSelectorIndex);\n    }\n  }\n\n  if (clickSelector) {\n    for (const clickSelectorIndex of [].concat(clickSelector)) {\n      await page.waitForSelector(clickSelectorIndex);\n      await page.click(clickSelectorIndex);\n    }\n  }\n\n  if (postInteractionWait) {\n    if (parseInt(postInteractionWait) > 0) {\n      await page.waitForTimeout(postInteractionWait);\n    } else {\n      await page.waitForSelector(postInteractionWait);\n    }\n  }\n\n  if (scrollToSelector) {\n    await page.waitForSelector(scrollToSelector);\n    await page.evaluate(scrollToSelector => {\n      document.querySelector(scrollToSelector).scrollIntoView();\n    }, scrollToSelector);\n  }\n};\n"
  },
  {
    "path": "capture/engine_scripts/playwright/interceptImages.js",
    "content": "/**\n * INTERCEPT IMAGES\n * Listen to all requests. If a request matches IMAGE_URL_RE\n * then stub the image with data from IMAGE_STUB_URL\n *\n * Use this in an onBefore script E.G.\n  ```\n  module.exports = async function(page, scenario) {\n    require('./interceptImages')(page, scenario);\n  }\n  ```\n *\n */\n\nconst fs = require('fs');\nconst path = require('path');\n\nconst IMAGE_URL_RE = /\\.gif|\\.jpg|\\.png/i;\nconst IMAGE_STUB_URL = path.resolve(__dirname, '../../imageStub.jpg');\nconst IMAGE_DATA_BUFFER = fs.readFileSync(IMAGE_STUB_URL);\nconst HEADERS_STUB = {};\n\nmodule.exports = async function (page, scenario) {\n  page.route(IMAGE_URL_RE, route => {\n    route.fulfill({\n      body: IMAGE_DATA_BUFFER,\n      headers: HEADERS_STUB,\n      status: 200\n    });\n  });\n};\n"
  },
  {
    "path": "capture/engine_scripts/playwright/loadCookies.js",
    "content": "const fs = require('fs');\n\nmodule.exports = async (browserContext, scenario) => {\n  let cookies = [];\n  const cookiePath = scenario.cookiePath;\n\n  // Read Cookies from File, if exists\n  if (fs.existsSync(cookiePath)) {\n    cookies = JSON.parse(fs.readFileSync(cookiePath));\n  }\n\n  // Add cookies to browser\n  browserContext.addCookies(cookies);\n\n  console.log('Cookie state restored with:', JSON.stringify(cookies, null, 2));\n};\n"
  },
  {
    "path": "capture/engine_scripts/playwright/onBefore.js",
    "content": "module.exports = async (page, scenario, viewport, isReference, browserContext) => {\n  await require('./loadCookies')(browserContext, scenario);\n};\n"
  },
  {
    "path": "capture/engine_scripts/playwright/onReady.js",
    "content": "module.exports = async (page, scenario, viewport, isReference, browserContext) => {\n  console.log('SCENARIO > ' + scenario.label);\n  await require('./clickAndHoverHelper')(page, scenario);\n\n  // add more ready handlers here...\n};\n"
  },
  {
    "path": "capture/engine_scripts/playwright/overrideCSS.js",
    "content": "/**\n * OVERRIDE CSS\n * Apply this CSS to the loaded page, as a way to override styles.\n *\n * Use this in an onReady script E.G.\n  ```\n  module.exports = async function(page, scenario) {\n    await require('./overrideCSS')(page, scenario);\n  }\n  ```\n *\n */\n\nconst BACKSTOP_TEST_CSS_OVERRIDE = `\n  html {\n    background-image: none;\n  }\n`;\n\nmodule.exports = async (page, scenario) => {\n  // inject arbitrary css to override styles\n  await page.addStyleTag({\n    content: BACKSTOP_TEST_CSS_OVERRIDE\n  });\n\n  console.log('BACKSTOP_TEST_CSS_OVERRIDE injected for: ' + scenario.label);\n};\n"
  },
  {
    "path": "capture/engine_scripts/puppet/clickAndHoverHelper.js",
    "content": "module.exports = async (page, scenario) => {\n  const hoverSelector = scenario.hoverSelectors || scenario.hoverSelector;\n  const clickSelector = scenario.clickSelectors || scenario.clickSelector;\n  const keyPressSelector = scenario.keyPressSelectors || scenario.keyPressSelector;\n  const scrollToSelector = scenario.scrollToSelector;\n  const postInteractionWait = scenario.postInteractionWait; // selector [str] | ms [int]\n\n  if (keyPressSelector) {\n    for (const keyPressSelectorItem of [].concat(keyPressSelector)) {\n      await page.waitForSelector(keyPressSelectorItem.selector);\n      await page.type(keyPressSelectorItem.selector, keyPressSelectorItem.keyPress);\n    }\n  }\n\n  if (hoverSelector) {\n    for (const hoverSelectorIndex of [].concat(hoverSelector)) {\n      await page.waitForSelector(hoverSelectorIndex);\n      await page.hover(hoverSelectorIndex);\n    }\n  }\n\n  if (clickSelector) {\n    for (const clickSelectorIndex of [].concat(clickSelector)) {\n      await page.waitForSelector(clickSelectorIndex);\n      await page.click(clickSelectorIndex);\n    }\n  }\n\n  if (postInteractionWait) {\n    await new Promise(resolve => {\n      setTimeout(resolve, postInteractionWait);\n    });\n  }\n\n  if (scrollToSelector) {\n    await page.waitForSelector(scrollToSelector);\n    await page.evaluate(scrollToSelector => {\n      document.querySelector(scrollToSelector).scrollIntoView();\n    }, scrollToSelector);\n  }\n};\n"
  },
  {
    "path": "capture/engine_scripts/puppet/ignoreCSP.js",
    "content": "/**\n * IGNORE CSP HEADERS\n * Listen to all requests. If a request matches scenario.url\n * then fetch the request again manually, strip out CSP headers\n * and respond to the original request without CSP headers.\n * Allows `ignoreHTTPSErrors: true` BUT... requires `debugWindow: true`\n *\n * see https://github.com/GoogleChrome/puppeteer/issues/1229#issuecomment-380133332\n * this is the workaround until Page.setBypassCSP lands... https://github.com/GoogleChrome/puppeteer/pull/2324\n *\n * @param      {REQUEST}  request\n * @return     {VOID}\n *\n * Use this in an onBefore script E.G.\n  ```\n  module.exports = async function(page, scenario) {\n    require('./removeCSP')(page, scenario);\n  }\n  ```\n *\n */\n\nconst fetch = require('node-fetch');\nconst https = require('https');\nconst agent = new https.Agent({\n  rejectUnauthorized: false\n});\n\nmodule.exports = async function (page, scenario) {\n  const intercept = async (request, targetUrl) => {\n    const requestUrl = request.url();\n\n    // FIND TARGET URL REQUEST\n    if (requestUrl === targetUrl) {\n      const cookiesList = await page.cookies(requestUrl);\n      const cookies = cookiesList.map(cookie => `${cookie.name}=${cookie.value}`).join('; ');\n      const headers = Object.assign(request.headers(), { cookie: cookies });\n      const options = {\n        headers,\n        body: request.postData(),\n        method: request.method(),\n        follow: 20,\n        agent\n      };\n\n      const result = await fetch(requestUrl, options);\n\n      const buffer = await result.buffer();\n      const cleanedHeaders = result.headers._headers || {};\n      cleanedHeaders['content-security-policy'] = '';\n      await request.respond({\n        body: buffer,\n        headers: cleanedHeaders,\n        status: result.status\n      });\n    } else {\n      request.continue();\n    }\n  };\n\n  await page.setRequestInterception(true);\n  page.on('request', req => {\n    intercept(req, scenario.url);\n  });\n};\n"
  },
  {
    "path": "capture/engine_scripts/puppet/interceptImages.js",
    "content": "/**\n * INTERCEPT IMAGES\n * Listen to all requests. If a request matches IMAGE_URL_RE\n * then stub the image with data from IMAGE_STUB_URL\n *\n * Use this in an onBefore script E.G.\n  ```\n  module.exports = async function(page, scenario) {\n    require('./interceptImages')(page, scenario);\n  }\n  ```\n *\n */\n\nconst fs = require('fs');\nconst path = require('path');\n\nconst IMAGE_URL_RE = /\\.gif|\\.jpg|\\.png/i;\nconst IMAGE_STUB_URL = path.resolve(__dirname, '../imageStub.jpg');\nconst IMAGE_DATA_BUFFER = fs.readFileSync(IMAGE_STUB_URL);\nconst HEADERS_STUB = {};\n\nmodule.exports = async function (page, scenario) {\n  const intercept = async (request, targetUrl) => {\n    if (IMAGE_URL_RE.test(request.url())) {\n      await request.respond({\n        body: IMAGE_DATA_BUFFER,\n        headers: HEADERS_STUB,\n        status: 200\n      });\n    } else {\n      request.continue();\n    }\n  };\n  await page.setRequestInterception(true);\n  page.on('request', intercept);\n};\n"
  },
  {
    "path": "capture/engine_scripts/puppet/loadCookies.js",
    "content": "const fs = require('fs');\n\nmodule.exports = async (page, scenario) => {\n  let cookies = [];\n  const cookiePath = scenario.cookiePath;\n\n  // READ COOKIES FROM FILE IF EXISTS\n  if (fs.existsSync(cookiePath)) {\n    cookies = JSON.parse(fs.readFileSync(cookiePath));\n  }\n\n  // MUNGE COOKIE DOMAIN\n  cookies = cookies.map(cookie => {\n    if (cookie.domain.startsWith('http://') || cookie.domain.startsWith('https://')) {\n      cookie.url = cookie.domain;\n    } else {\n      cookie.url = 'https://' + cookie.domain;\n    }\n    delete cookie.domain;\n    return cookie;\n  });\n\n  // SET COOKIES\n  const setCookies = async () => {\n    return Promise.all(\n      cookies.map(async (cookie) => {\n        await page.setCookie(cookie);\n      })\n    );\n  };\n  await setCookies();\n  console.log('Cookie state restored with:', JSON.stringify(cookies, null, 2));\n};\n"
  },
  {
    "path": "capture/engine_scripts/puppet/onBefore.js",
    "content": "module.exports = async (page, scenario, vp) => {\n  await require('./loadCookies')(page, scenario);\n};\n"
  },
  {
    "path": "capture/engine_scripts/puppet/onReady.js",
    "content": "module.exports = async (page, scenario, vp) => {\n  console.log('SCENARIO > ' + scenario.label);\n  await require('./clickAndHoverHelper')(page, scenario);\n\n  // add more ready handlers here...\n};\n"
  },
  {
    "path": "capture/engine_scripts/puppet/overrideCSS.js",
    "content": "const BACKSTOP_TEST_CSS_OVERRIDE = 'html {background-image: none;}';\n\nmodule.exports = async (page, scenario) => {\n  // inject arbitrary css to override styles\n  await page.evaluate(`window._styleData = '${BACKSTOP_TEST_CSS_OVERRIDE}'`);\n  await page.evaluate(() => {\n    const style = document.createElement('style');\n    style.type = 'text/css';\n    const styleNode = document.createTextNode(window._styleData);\n    style.appendChild(styleNode);\n    document.head.appendChild(style);\n  });\n\n  console.log('BACKSTOP_TEST_CSS_OVERRIDE injected for: ' + scenario.label);\n};\n"
  },
  {
    "path": "changelog.md",
    "content": "\n# Change Log\n\n \n## [6.0.4] - 2021-12-10\n### Added\n\n### Changed\n- Bump puppeteer to v12 (#1381)\n- Travis remove node 10, 12 test runs\n\n### Fixed \n\n\n\n \n## [6.0.1] - 2021-11-17\n### Added\n- PLAYRIGHT ENGINE OPTION  thank you JB\n\n### Changed\n- support for viewport variants with dynamic scenario mode to browser and json report (#1376)  thank you TW\n\n### Fixed \n- Fixed Puppeteer ENOENT Error When Image Stubbing (#1377)\n\n\n\n \n## [5.4.3] - 2021-08-24\n### Added\n- added archive report feature (#1353)\n  - requested a housekeeping followup PR\n  - documentaiton will be commented until 2nd PR is submitted.\n\n\n### Changed\n- More code formatting and some test cleanups\n- updated readme\n\n### Fixed \n\n\n\n \n## [5.4.1] - 2021-08-24\n### Added\n- Feature: archive report (#1353)  @klodoma\n\n\n\n### Changed\n- Added no-cache tags to client markup (#1357)\n- code formatting, addressed lint warnings\n\n### Fixed \n\n\n\n\n## [5.3.6] - 2021-07-29\n\n### Added\n\n\n### Changed\n\n\n### Fixed\n- https://github.com/garris/BackstopJS/issues/1344\n  Fixed rendering issue found in Backstop (docker) versions > 4.4.2.\n \n\n## [5.3.7] - 2021-07-29\n### Added\n- Changelog\n\n### Changed\n\n\n### Fixed \n\n\n## [5.3.6] - 2021-07-29\n\n### Added\n\n\n### Changed\n\n\n### Fixed\n- https://github.com/garris/BackstopJS/issues/1344\n  Fixed rendering issue found in Backstop (docker) versions > 4.4.2.\n \n\n \n## [5.3.5] - 2021-07-20\n\n### Added\n- New Config feature `readyEventTimeout`\n- New Config feature `usePreciseMatching`\n\n\n### Changed\n- Bumped Node version in docker config\n\n\n### Fixed\n\n"
  },
  {
    "path": "cli/index.js",
    "content": "#!/usr/bin/env node\n\nconst parseArgs = require('minimist');\nconst usage = require('./usage');\nconst version = require('../package.json').version;\nconst runner = require('../core/runner');\n\nmain();\n\nfunction main () {\n  const argsOptions = parseArgs(process.argv.slice(2), {\n    boolean: ['h', 'help', 'v', 'version', 'i', 'docker'],\n    string: ['config'],\n    default: {\n      config: 'backstop.json'\n    }\n  });\n\n  // Catch errors from failing promises\n  process.on('unhandledRejection', function (error) {\n    console.error(error && error.stack);\n  });\n\n  if (argsOptions.h || argsOptions.help) {\n    console.log(usage);\n    return;\n  }\n\n  if (argsOptions.v || argsOptions.version) {\n    console.log('BackstopJS v' + version);\n    return;\n  }\n\n  const commandName = argsOptions._[0];\n\n  if (!commandName) {\n    console.log(usage);\n  } else {\n    console.log('BackstopJS v' + version);\n    runner(commandName, argsOptions).catch(function () {\n      process.exitCode = 1;\n    });\n\n    process.on('uncaughtException', function (err) {\n      console.log('Uncaught exception:', err.message, err.stack);\n      throw err;\n    });\n  }\n}\n"
  },
  {
    "path": "cli/usage.js",
    "content": "const version = require('../package.json').version;\nconst makeSpaces = require('../core/util/makeSpaces');\n\nconst commandsDescription = {\n  test: 'Create test screenshots and compare against the set you previously approved/referenced.',\n  approve: 'Promotes all test bitmaps from last test run to reference bitmaps.',\n  reference: 'Creates new reference screenshots. Deletes all existing reference files.',\n  init: 'Generate BackstopJS boilerplate files in your CWD. NOTE: Overwrites existing config files!',\n  remote: 'Launch BackstopJS remote service.',\n  openReport: 'View the last test report in your browser.'\n};\n\nconst optionsDescription = {\n  '--config': 'Path to config file name',\n  '--filter': 'A RegEx string used to filter by scenario labels when running \"test\", \"reference\", or \"approve\" commands',\n  '-h, --help': 'Display usage',\n  '-v, --version': 'Display version',\n  '-i': 'Prevent deletion of non-matching reference files when running \"reference\" command (newer matching reference files are still overwritten)'\n};\n\nfunction makeDescription (descriptions) {\n  return Object.keys(descriptions)\n    .map(function (commandName) {\n      return makeSpaces(4) + commandName + spacesBetweenCommandAndDescription(commandName) + descriptions[commandName];\n    })\n    .join('\\n');\n}\n\n// Number of spaces to echo before writing description\nconst leftPaddingOfDescription = Object.keys(commandsDescription)\n  .concat(Object.keys(optionsDescription))\n  .map(function (string) {\n    return string.length;\n  })\n  .reduce(function maxReducer (max, length) {\n    return Math.max(max, length);\n  }, 0);\n\nfunction spacesBetweenCommandAndDescription (commandName) {\n  return makeSpaces(2 + leftPaddingOfDescription - commandName.length);\n}\n\nconst usage = '\\\nWelcome to BackstopJS ' + version + ' CLI\\n\\\n\\n\\\nCommands:\\n\\\n' + makeDescription(commandsDescription) + '\\n\\\n\\n\\\nOptions:\\n\\\n' + makeDescription(optionsDescription) + '\\n\\\n\\n';\n\nmodule.exports = usage;\n"
  },
  {
    "path": "compare/README.md",
    "content": "HTML report resource bundle\n====\n\nThis directory contains the source files for the BackstopJS report UI.\n\nTo build the React project run...\n\n```\nnpm run build-compare\n``` \n\nThis will generate `/compare/output/index_bundle.js`.\n\n`/compare/output/index_bundle.js` contains all styles and js for the HTML report.  In normal BackstopJS operation this file bundle will be copied into the correct HTML report directory during a test flow (e.g. when running `backstop test`) after bitmap generation has completed.  See: `/core/command/report.js` writeBrowserReport() method for details on this mechanism.\n\nNote: The files `diverged.js` & `diff.js` are copied from `node_modules` to `/compare/output/` during build.\n"
  },
  {
    "path": "compare/output/diff.js",
    "content": "/*!\n\n diff v3.5.0\n\nSoftware License Agreement (BSD License)\n\nCopyright (c) 2009-2015, Kevin Decker <kpdecker@gmail.com>\n\nAll rights reserved.\n\nRedistribution and use of this software in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above\n  copyright notice, this list of conditions and the\n  following disclaimer.\n\n* Redistributions in binary form must reproduce the above\n  copyright notice, this list of conditions and the\n  following disclaimer in the documentation and/or other\n  materials provided with the distribution.\n\n* Neither the name of Kevin Decker nor the names of its\n  contributors may be used to endorse or promote products\n  derived from this software without specific prior\n  written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR\nIMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND\nFITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\nCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER\nIN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT\nOF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n@license\n*/\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"JsDiff\"] = factory();\n\telse\n\t\troot[\"JsDiff\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n\n\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*istanbul ignore start*/'use strict';\n\n\texports.__esModule = true;\n\texports.canonicalize = exports.convertChangesToXML = exports.convertChangesToDMP = exports.merge = exports.parsePatch = exports.applyPatches = exports.applyPatch = exports.createPatch = exports.createTwoFilesPatch = exports.structuredPatch = exports.diffArrays = exports.diffJson = exports.diffCss = exports.diffSentences = exports.diffTrimmedLines = exports.diffLines = exports.diffWordsWithSpace = exports.diffWords = exports.diffChars = exports.Diff = undefined;\n\n\t/*istanbul ignore end*/var /*istanbul ignore start*/_base = __webpack_require__(1) /*istanbul ignore end*/;\n\n\t/*istanbul ignore start*/var _base2 = _interopRequireDefault(_base);\n\n\t/*istanbul ignore end*/var /*istanbul ignore start*/_character = __webpack_require__(2) /*istanbul ignore end*/;\n\n\tvar /*istanbul ignore start*/_word = __webpack_require__(3) /*istanbul ignore end*/;\n\n\tvar /*istanbul ignore start*/_line = __webpack_require__(5) /*istanbul ignore end*/;\n\n\tvar /*istanbul ignore start*/_sentence = __webpack_require__(6) /*istanbul ignore end*/;\n\n\tvar /*istanbul ignore start*/_css = __webpack_require__(7) /*istanbul ignore end*/;\n\n\tvar /*istanbul ignore start*/_json = __webpack_require__(8) /*istanbul ignore end*/;\n\n\tvar /*istanbul ignore start*/_array = __webpack_require__(9) /*istanbul ignore end*/;\n\n\tvar /*istanbul ignore start*/_apply = __webpack_require__(10) /*istanbul ignore end*/;\n\n\tvar /*istanbul ignore start*/_parse = __webpack_require__(11) /*istanbul ignore end*/;\n\n\tvar /*istanbul ignore start*/_merge = __webpack_require__(13) /*istanbul ignore end*/;\n\n\tvar /*istanbul ignore start*/_create = __webpack_require__(14) /*istanbul ignore end*/;\n\n\tvar /*istanbul ignore start*/_dmp = __webpack_require__(16) /*istanbul ignore end*/;\n\n\tvar /*istanbul ignore start*/_xml = __webpack_require__(17) /*istanbul ignore end*/;\n\n\t/*istanbul ignore start*/function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n\t/* See LICENSE file for terms of use */\n\n\t/*\n\t * Text diff implementation.\n\t *\n\t * This library supports the following APIS:\n\t * JsDiff.diffChars: Character by character diff\n\t * JsDiff.diffWords: Word (as defined by \\b regex) diff which ignores whitespace\n\t * JsDiff.diffLines: Line based diff\n\t *\n\t * JsDiff.diffCss: Diff targeted at CSS content\n\t *\n\t * These methods are based on the implementation proposed in\n\t * \"An O(ND) Difference Algorithm and its Variations\" (Myers, 1986).\n\t * http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.4.6927\n\t */\n\texports. /*istanbul ignore end*/Diff = _base2['default'];\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/diffChars = _character.diffChars;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/diffWords = _word.diffWords;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/diffWordsWithSpace = _word.diffWordsWithSpace;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/diffLines = _line.diffLines;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/diffTrimmedLines = _line.diffTrimmedLines;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/diffSentences = _sentence.diffSentences;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/diffCss = _css.diffCss;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/diffJson = _json.diffJson;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/diffArrays = _array.diffArrays;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/structuredPatch = _create.structuredPatch;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/createTwoFilesPatch = _create.createTwoFilesPatch;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/createPatch = _create.createPatch;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/applyPatch = _apply.applyPatch;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/applyPatches = _apply.applyPatches;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/parsePatch = _parse.parsePatch;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/merge = _merge.merge;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/convertChangesToDMP = _dmp.convertChangesToDMP;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/convertChangesToXML = _xml.convertChangesToXML;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/canonicalize = _json.canonicalize;\n\t//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJEaWZmIiwiZGlmZkNoYXJzIiwiZGlmZldvcmRzIiwiZGlmZldvcmRzV2l0aFNwYWNlIiwiZGlmZkxpbmVzIiwiZGlmZlRyaW1tZWRMaW5lcyIsImRpZmZTZW50ZW5jZXMiLCJkaWZmQ3NzIiwiZGlmZkpzb24iLCJkaWZmQXJyYXlzIiwic3RydWN0dXJlZFBhdGNoIiwiY3JlYXRlVHdvRmlsZXNQYXRjaCIsImNyZWF0ZVBhdGNoIiwiYXBwbHlQYXRjaCIsImFwcGx5UGF0Y2hlcyIsInBhcnNlUGF0Y2giLCJtZXJnZSIsImNvbnZlcnRDaGFuZ2VzVG9ETVAiLCJjb252ZXJ0Q2hhbmdlc1RvWE1MIiwiY2Fub25pY2FsaXplIl0sIm1hcHBpbmdzIjoiOzs7Ozt1QkFnQkE7Ozs7dUJBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBRUE7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7Ozs7QUFqQ0E7O0FBRUE7Ozs7Ozs7Ozs7Ozs7O2dDQWtDRUEsSTt5REFFQUMsUzt5REFDQUMsUzt5REFDQUMsa0I7eURBQ0FDLFM7eURBQ0FDLGdCO3lEQUNBQyxhO3lEQUVBQyxPO3lEQUNBQyxRO3lEQUVBQyxVO3lEQUVBQyxlO3lEQUNBQyxtQjt5REFDQUMsVzt5REFDQUMsVTt5REFDQUMsWTt5REFDQUMsVTt5REFDQUMsSzt5REFDQUMsbUI7eURBQ0FDLG1CO3lEQUNBQyxZIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyogU2VlIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMgb2YgdXNlICovXG5cbi8qXG4gKiBUZXh0IGRpZmYgaW1wbGVtZW50YXRpb24uXG4gKlxuICogVGhpcyBsaWJyYXJ5IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgQVBJUzpcbiAqIEpzRGlmZi5kaWZmQ2hhcnM6IENoYXJhY3RlciBieSBjaGFyYWN0ZXIgZGlmZlxuICogSnNEaWZmLmRpZmZXb3JkczogV29yZCAoYXMgZGVmaW5lZCBieSBcXGIgcmVnZXgpIGRpZmYgd2hpY2ggaWdub3JlcyB3aGl0ZXNwYWNlXG4gKiBKc0RpZmYuZGlmZkxpbmVzOiBMaW5lIGJhc2VkIGRpZmZcbiAqXG4gKiBKc0RpZmYuZGlmZkNzczogRGlmZiB0YXJnZXRlZCBhdCBDU1MgY29udGVudFxuICpcbiAqIFRoZXNlIG1ldGhvZHMgYXJlIGJhc2VkIG9uIHRoZSBpbXBsZW1lbnRhdGlvbiBwcm9wb3NlZCBpblxuICogXCJBbiBPKE5EKSBEaWZmZXJlbmNlIEFsZ29yaXRobSBhbmQgaXRzIFZhcmlhdGlvbnNcIiAoTXllcnMsIDE5ODYpLlxuICogaHR0cDovL2NpdGVzZWVyeC5pc3QucHN1LmVkdS92aWV3ZG9jL3N1bW1hcnk/ZG9pPTEwLjEuMS40LjY5MjdcbiAqL1xuaW1wb3J0IERpZmYgZnJvbSAnLi9kaWZmL2Jhc2UnO1xuaW1wb3J0IHtkaWZmQ2hhcnN9IGZyb20gJy4vZGlmZi9jaGFyYWN0ZXInO1xuaW1wb3J0IHtkaWZmV29yZHMsIGRpZmZXb3Jkc1dpdGhTcGFjZX0gZnJvbSAnLi9kaWZmL3dvcmQnO1xuaW1wb3J0IHtkaWZmTGluZXMsIGRpZmZUcmltbWVkTGluZXN9IGZyb20gJy4vZGlmZi9saW5lJztcbmltcG9ydCB7ZGlmZlNlbnRlbmNlc30gZnJvbSAnLi9kaWZmL3NlbnRlbmNlJztcblxuaW1wb3J0IHtkaWZmQ3NzfSBmcm9tICcuL2RpZmYvY3NzJztcbmltcG9ydCB7ZGlmZkpzb24sIGNhbm9uaWNhbGl6ZX0gZnJvbSAnLi9kaWZmL2pzb24nO1xuXG5pbXBvcnQge2RpZmZBcnJheXN9IGZyb20gJy4vZGlmZi9hcnJheSc7XG5cbmltcG9ydCB7YXBwbHlQYXRjaCwgYXBwbHlQYXRjaGVzfSBmcm9tICcuL3BhdGNoL2FwcGx5JztcbmltcG9ydCB7cGFyc2VQYXRjaH0gZnJvbSAnLi9wYXRjaC9wYXJzZSc7XG5pbXBvcnQge21lcmdlfSBmcm9tICcuL3BhdGNoL21lcmdlJztcbmltcG9ydCB7c3RydWN0dXJlZFBhdGNoLCBjcmVhdGVUd29GaWxlc1BhdGNoLCBjcmVhdGVQYXRjaH0gZnJvbSAnLi9wYXRjaC9jcmVhdGUnO1xuXG5pbXBvcnQge2NvbnZlcnRDaGFuZ2VzVG9ETVB9IGZyb20gJy4vY29udmVydC9kbXAnO1xuaW1wb3J0IHtjb252ZXJ0Q2hhbmdlc1RvWE1MfSBmcm9tICcuL2NvbnZlcnQveG1sJztcblxuZXhwb3J0IHtcbiAgRGlmZixcblxuICBkaWZmQ2hhcnMsXG4gIGRpZmZXb3JkcyxcbiAgZGlmZldvcmRzV2l0aFNwYWNlLFxuICBkaWZmTGluZXMsXG4gIGRpZmZUcmltbWVkTGluZXMsXG4gIGRpZmZTZW50ZW5jZXMsXG5cbiAgZGlmZkNzcyxcbiAgZGlmZkpzb24sXG5cbiAgZGlmZkFycmF5cyxcblxuICBzdHJ1Y3R1cmVkUGF0Y2gsXG4gIGNyZWF0ZVR3b0ZpbGVzUGF0Y2gsXG4gIGNyZWF0ZVBhdGNoLFxuICBhcHBseVBhdGNoLFxuICBhcHBseVBhdGNoZXMsXG4gIHBhcnNlUGF0Y2gsXG4gIG1lcmdlLFxuICBjb252ZXJ0Q2hhbmdlc1RvRE1QLFxuICBjb252ZXJ0Q2hhbmdlc1RvWE1MLFxuICBjYW5vbmljYWxpemVcbn07XG4iXX0=\n\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports) {\n\n\t/*istanbul ignore start*/'use strict';\n\n\texports.__esModule = true;\n\texports['default'] = /*istanbul ignore end*/Diff;\n\tfunction Diff() {}\n\n\tDiff.prototype = {\n\t  /*istanbul ignore start*/ /*istanbul ignore end*/diff: function diff(oldString, newString) {\n\t    /*istanbul ignore start*/var /*istanbul ignore end*/options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n\t    var callback = options.callback;\n\t    if (typeof options === 'function') {\n\t      callback = options;\n\t      options = {};\n\t    }\n\t    this.options = options;\n\n\t    var self = this;\n\n\t    function done(value) {\n\t      if (callback) {\n\t        setTimeout(function () {\n\t          callback(undefined, value);\n\t        }, 0);\n\t        return true;\n\t      } else {\n\t        return value;\n\t      }\n\t    }\n\n\t    // Allow subclasses to massage the input prior to running\n\t    oldString = this.castInput(oldString);\n\t    newString = this.castInput(newString);\n\n\t    oldString = this.removeEmpty(this.tokenize(oldString));\n\t    newString = this.removeEmpty(this.tokenize(newString));\n\n\t    var newLen = newString.length,\n\t        oldLen = oldString.length;\n\t    var editLength = 1;\n\t    var maxEditLength = newLen + oldLen;\n\t    var bestPath = [{ newPos: -1, components: [] }];\n\n\t    // Seed editLength = 0, i.e. the content starts with the same values\n\t    var oldPos = this.extractCommon(bestPath[0], newString, oldString, 0);\n\t    if (bestPath[0].newPos + 1 >= newLen && oldPos + 1 >= oldLen) {\n\t      // Identity per the equality and tokenizer\n\t      return done([{ value: this.join(newString), count: newString.length }]);\n\t    }\n\n\t    // Main worker method. checks all permutations of a given edit length for acceptance.\n\t    function execEditLength() {\n\t      for (var diagonalPath = -1 * editLength; diagonalPath <= editLength; diagonalPath += 2) {\n\t        var basePath = /*istanbul ignore start*/void 0 /*istanbul ignore end*/;\n\t        var addPath = bestPath[diagonalPath - 1],\n\t            removePath = bestPath[diagonalPath + 1],\n\t            _oldPos = (removePath ? removePath.newPos : 0) - diagonalPath;\n\t        if (addPath) {\n\t          // No one else is going to attempt to use this value, clear it\n\t          bestPath[diagonalPath - 1] = undefined;\n\t        }\n\n\t        var canAdd = addPath && addPath.newPos + 1 < newLen,\n\t            canRemove = removePath && 0 <= _oldPos && _oldPos < oldLen;\n\t        if (!canAdd && !canRemove) {\n\t          // If this path is a terminal then prune\n\t          bestPath[diagonalPath] = undefined;\n\t          continue;\n\t        }\n\n\t        // Select the diagonal that we want to branch from. We select the prior\n\t        // path whose position in the new string is the farthest from the origin\n\t        // and does not pass the bounds of the diff graph\n\t        if (!canAdd || canRemove && addPath.newPos < removePath.newPos) {\n\t          basePath = clonePath(removePath);\n\t          self.pushComponent(basePath.components, undefined, true);\n\t        } else {\n\t          basePath = addPath; // No need to clone, we've pulled it from the list\n\t          basePath.newPos++;\n\t          self.pushComponent(basePath.components, true, undefined);\n\t        }\n\n\t        _oldPos = self.extractCommon(basePath, newString, oldString, diagonalPath);\n\n\t        // If we have hit the end of both strings, then we are done\n\t        if (basePath.newPos + 1 >= newLen && _oldPos + 1 >= oldLen) {\n\t          return done(buildValues(self, basePath.components, newString, oldString, self.useLongestToken));\n\t        } else {\n\t          // Otherwise track this path as a potential candidate and continue.\n\t          bestPath[diagonalPath] = basePath;\n\t        }\n\t      }\n\n\t      editLength++;\n\t    }\n\n\t    // Performs the length of edit iteration. Is a bit fugly as this has to support the\n\t    // sync and async mode which is never fun. Loops over execEditLength until a value\n\t    // is produced.\n\t    if (callback) {\n\t      (function exec() {\n\t        setTimeout(function () {\n\t          // This should not happen, but we want to be safe.\n\t          /* istanbul ignore next */\n\t          if (editLength > maxEditLength) {\n\t            return callback();\n\t          }\n\n\t          if (!execEditLength()) {\n\t            exec();\n\t          }\n\t        }, 0);\n\t      })();\n\t    } else {\n\t      while (editLength <= maxEditLength) {\n\t        var ret = execEditLength();\n\t        if (ret) {\n\t          return ret;\n\t        }\n\t      }\n\t    }\n\t  },\n\t  /*istanbul ignore start*/ /*istanbul ignore end*/pushComponent: function pushComponent(components, added, removed) {\n\t    var last = components[components.length - 1];\n\t    if (last && last.added === added && last.removed === removed) {\n\t      // We need to clone here as the component clone operation is just\n\t      // as shallow array clone\n\t      components[components.length - 1] = { count: last.count + 1, added: added, removed: removed };\n\t    } else {\n\t      components.push({ count: 1, added: added, removed: removed });\n\t    }\n\t  },\n\t  /*istanbul ignore start*/ /*istanbul ignore end*/extractCommon: function extractCommon(basePath, newString, oldString, diagonalPath) {\n\t    var newLen = newString.length,\n\t        oldLen = oldString.length,\n\t        newPos = basePath.newPos,\n\t        oldPos = newPos - diagonalPath,\n\t        commonCount = 0;\n\t    while (newPos + 1 < newLen && oldPos + 1 < oldLen && this.equals(newString[newPos + 1], oldString[oldPos + 1])) {\n\t      newPos++;\n\t      oldPos++;\n\t      commonCount++;\n\t    }\n\n\t    if (commonCount) {\n\t      basePath.components.push({ count: commonCount });\n\t    }\n\n\t    basePath.newPos = newPos;\n\t    return oldPos;\n\t  },\n\t  /*istanbul ignore start*/ /*istanbul ignore end*/equals: function equals(left, right) {\n\t    if (this.options.comparator) {\n\t      return this.options.comparator(left, right);\n\t    } else {\n\t      return left === right || this.options.ignoreCase && left.toLowerCase() === right.toLowerCase();\n\t    }\n\t  },\n\t  /*istanbul ignore start*/ /*istanbul ignore end*/removeEmpty: function removeEmpty(array) {\n\t    var ret = [];\n\t    for (var i = 0; i < array.length; i++) {\n\t      if (array[i]) {\n\t        ret.push(array[i]);\n\t      }\n\t    }\n\t    return ret;\n\t  },\n\t  /*istanbul ignore start*/ /*istanbul ignore end*/castInput: function castInput(value) {\n\t    return value;\n\t  },\n\t  /*istanbul ignore start*/ /*istanbul ignore end*/tokenize: function tokenize(value) {\n\t    return value.split('');\n\t  },\n\t  /*istanbul ignore start*/ /*istanbul ignore end*/join: function join(chars) {\n\t    return chars.join('');\n\t  }\n\t};\n\n\tfunction buildValues(diff, components, newString, oldString, useLongestToken) {\n\t  var componentPos = 0,\n\t      componentLen = components.length,\n\t      newPos = 0,\n\t      oldPos = 0;\n\n\t  for (; componentPos < componentLen; componentPos++) {\n\t    var component = components[componentPos];\n\t    if (!component.removed) {\n\t      if (!component.added && useLongestToken) {\n\t        var value = newString.slice(newPos, newPos + component.count);\n\t        value = value.map(function (value, i) {\n\t          var oldValue = oldString[oldPos + i];\n\t          return oldValue.length > value.length ? oldValue : value;\n\t        });\n\n\t        component.value = diff.join(value);\n\t      } else {\n\t        component.value = diff.join(newString.slice(newPos, newPos + component.count));\n\t      }\n\t      newPos += component.count;\n\n\t      // Common case\n\t      if (!component.added) {\n\t        oldPos += component.count;\n\t      }\n\t    } else {\n\t      component.value = diff.join(oldString.slice(oldPos, oldPos + component.count));\n\t      oldPos += component.count;\n\n\t      // Reverse add and remove so removes are output first to match common convention\n\t      // The diffing algorithm is tied to add then remove output and this is the simplest\n\t      // route to get the desired output with minimal overhead.\n\t      if (componentPos && components[componentPos - 1].added) {\n\t        var tmp = components[componentPos - 1];\n\t        components[componentPos - 1] = components[componentPos];\n\t        components[componentPos] = tmp;\n\t      }\n\t    }\n\t  }\n\n\t  // Special case handle for when one terminal is ignored (i.e. whitespace).\n\t  // For this case we merge the terminal into the prior string and drop the change.\n\t  // This is only available for string mode.\n\t  var lastComponent = components[componentLen - 1];\n\t  if (componentLen > 1 && typeof lastComponent.value === 'string' && (lastComponent.added || lastComponent.removed) && diff.equals('', lastComponent.value)) {\n\t    components[componentLen - 2].value += lastComponent.value;\n\t    components.pop();\n\t  }\n\n\t  return components;\n\t}\n\n\tfunction clonePath(path) {\n\t  return { newPos: path.newPos, components: path.components.slice(0) };\n\t}\n\t//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL2Jhc2UuanMiXSwibmFtZXMiOlsiRGlmZiIsInByb3RvdHlwZSIsImRpZmYiLCJvbGRTdHJpbmciLCJuZXdTdHJpbmciLCJvcHRpb25zIiwiY2FsbGJhY2siLCJzZWxmIiwiZG9uZSIsInZhbHVlIiwic2V0VGltZW91dCIsInVuZGVmaW5lZCIsImNhc3RJbnB1dCIsInJlbW92ZUVtcHR5IiwidG9rZW5pemUiLCJuZXdMZW4iLCJsZW5ndGgiLCJvbGRMZW4iLCJlZGl0TGVuZ3RoIiwibWF4RWRpdExlbmd0aCIsImJlc3RQYXRoIiwibmV3UG9zIiwiY29tcG9uZW50cyIsIm9sZFBvcyIsImV4dHJhY3RDb21tb24iLCJqb2luIiwiY291bnQiLCJleGVjRWRpdExlbmd0aCIsImRpYWdvbmFsUGF0aCIsImJhc2VQYXRoIiwiYWRkUGF0aCIsInJlbW92ZVBhdGgiLCJjYW5BZGQiLCJjYW5SZW1vdmUiLCJjbG9uZVBhdGgiLCJwdXNoQ29tcG9uZW50IiwiYnVpbGRWYWx1ZXMiLCJ1c2VMb25nZXN0VG9rZW4iLCJleGVjIiwicmV0IiwiYWRkZWQiLCJyZW1vdmVkIiwibGFzdCIsInB1c2giLCJjb21tb25Db3VudCIsImVxdWFscyIsImxlZnQiLCJyaWdodCIsImNvbXBhcmF0b3IiLCJpZ25vcmVDYXNlIiwidG9Mb3dlckNhc2UiLCJhcnJheSIsImkiLCJzcGxpdCIsImNoYXJzIiwiY29tcG9uZW50UG9zIiwiY29tcG9uZW50TGVuIiwiY29tcG9uZW50Iiwic2xpY2UiLCJtYXAiLCJvbGRWYWx1ZSIsInRtcCIsImxhc3RDb21wb25lbnQiLCJwb3AiLCJwYXRoIl0sIm1hcHBpbmdzIjoiOzs7NENBQXdCQSxJO0FBQVQsU0FBU0EsSUFBVCxHQUFnQixDQUFFOztBQUVqQ0EsS0FBS0MsU0FBTCxHQUFpQjtBQUFBLG1EQUNmQyxJQURlLGdCQUNWQyxTQURVLEVBQ0NDLFNBREQsRUFDMEI7QUFBQSx3REFBZEMsT0FBYyx1RUFBSixFQUFJOztBQUN2QyxRQUFJQyxXQUFXRCxRQUFRQyxRQUF2QjtBQUNBLFFBQUksT0FBT0QsT0FBUCxLQUFtQixVQUF2QixFQUFtQztBQUNqQ0MsaUJBQVdELE9BQVg7QUFDQUEsZ0JBQVUsRUFBVjtBQUNEO0FBQ0QsU0FBS0EsT0FBTCxHQUFlQSxPQUFmOztBQUVBLFFBQUlFLE9BQU8sSUFBWDs7QUFFQSxhQUFTQyxJQUFULENBQWNDLEtBQWQsRUFBcUI7QUFDbkIsVUFBSUgsUUFBSixFQUFjO0FBQ1pJLG1CQUFXLFlBQVc7QUFBRUosbUJBQVNLLFNBQVQsRUFBb0JGLEtBQXBCO0FBQTZCLFNBQXJELEVBQXVELENBQXZEO0FBQ0EsZUFBTyxJQUFQO0FBQ0QsT0FIRCxNQUdPO0FBQ0wsZUFBT0EsS0FBUDtBQUNEO0FBQ0Y7O0FBRUQ7QUFDQU4sZ0JBQVksS0FBS1MsU0FBTCxDQUFlVCxTQUFmLENBQVo7QUFDQUMsZ0JBQVksS0FBS1EsU0FBTCxDQUFlUixTQUFmLENBQVo7O0FBRUFELGdCQUFZLEtBQUtVLFdBQUwsQ0FBaUIsS0FBS0MsUUFBTCxDQUFjWCxTQUFkLENBQWpCLENBQVo7QUFDQUMsZ0JBQVksS0FBS1MsV0FBTCxDQUFpQixLQUFLQyxRQUFMLENBQWNWLFNBQWQsQ0FBakIsQ0FBWjs7QUFFQSxRQUFJVyxTQUFTWCxVQUFVWSxNQUF2QjtBQUFBLFFBQStCQyxTQUFTZCxVQUFVYSxNQUFsRDtBQUNBLFFBQUlFLGFBQWEsQ0FBakI7QUFDQSxRQUFJQyxnQkFBZ0JKLFNBQVNFLE1BQTdCO0FBQ0EsUUFBSUcsV0FBVyxDQUFDLEVBQUVDLFFBQVEsQ0FBQyxDQUFYLEVBQWNDLFlBQVksRUFBMUIsRUFBRCxDQUFmOztBQUVBO0FBQ0EsUUFBSUMsU0FBUyxLQUFLQyxhQUFMLENBQW1CSixTQUFTLENBQVQsQ0FBbkIsRUFBZ0NoQixTQUFoQyxFQUEyQ0QsU0FBM0MsRUFBc0QsQ0FBdEQsQ0FBYjtBQUNBLFFBQUlpQixTQUFTLENBQVQsRUFBWUMsTUFBWixHQUFxQixDQUFyQixJQUEwQk4sTUFBMUIsSUFBb0NRLFNBQVMsQ0FBVCxJQUFjTixNQUF0RCxFQUE4RDtBQUM1RDtBQUNBLGFBQU9ULEtBQUssQ0FBQyxFQUFDQyxPQUFPLEtBQUtnQixJQUFMLENBQVVyQixTQUFWLENBQVIsRUFBOEJzQixPQUFPdEIsVUFBVVksTUFBL0MsRUFBRCxDQUFMLENBQVA7QUFDRDs7QUFFRDtBQUNBLGFBQVNXLGNBQVQsR0FBMEI7QUFDeEIsV0FBSyxJQUFJQyxlQUFlLENBQUMsQ0FBRCxHQUFLVixVQUE3QixFQUF5Q1UsZ0JBQWdCVixVQUF6RCxFQUFxRVUsZ0JBQWdCLENBQXJGLEVBQXdGO0FBQ3RGLFlBQUlDLDBDQUFKO0FBQ0EsWUFBSUMsVUFBVVYsU0FBU1EsZUFBZSxDQUF4QixDQUFkO0FBQUEsWUFDSUcsYUFBYVgsU0FBU1EsZUFBZSxDQUF4QixDQURqQjtBQUFBLFlBRUlMLFVBQVMsQ0FBQ1EsYUFBYUEsV0FBV1YsTUFBeEIsR0FBaUMsQ0FBbEMsSUFBdUNPLFlBRnBEO0FBR0EsWUFBSUUsT0FBSixFQUFhO0FBQ1g7QUFDQVYsbUJBQVNRLGVBQWUsQ0FBeEIsSUFBNkJqQixTQUE3QjtBQUNEOztBQUVELFlBQUlxQixTQUFTRixXQUFXQSxRQUFRVCxNQUFSLEdBQWlCLENBQWpCLEdBQXFCTixNQUE3QztBQUFBLFlBQ0lrQixZQUFZRixjQUFjLEtBQUtSLE9BQW5CLElBQTZCQSxVQUFTTixNQUR0RDtBQUVBLFlBQUksQ0FBQ2UsTUFBRCxJQUFXLENBQUNDLFNBQWhCLEVBQTJCO0FBQ3pCO0FBQ0FiLG1CQUFTUSxZQUFULElBQXlCakIsU0FBekI7QUFDQTtBQUNEOztBQUVEO0FBQ0E7QUFDQTtBQUNBLFlBQUksQ0FBQ3FCLE1BQUQsSUFBWUMsYUFBYUgsUUFBUVQsTUFBUixHQUFpQlUsV0FBV1YsTUFBekQsRUFBa0U7QUFDaEVRLHFCQUFXSyxVQUFVSCxVQUFWLENBQVg7QUFDQXhCLGVBQUs0QixhQUFMLENBQW1CTixTQUFTUCxVQUE1QixFQUF3Q1gsU0FBeEMsRUFBbUQsSUFBbkQ7QUFDRCxTQUhELE1BR087QUFDTGtCLHFCQUFXQyxPQUFYLENBREssQ0FDaUI7QUFDdEJELG1CQUFTUixNQUFUO0FBQ0FkLGVBQUs0QixhQUFMLENBQW1CTixTQUFTUCxVQUE1QixFQUF3QyxJQUF4QyxFQUE4Q1gsU0FBOUM7QUFDRDs7QUFFRFksa0JBQVNoQixLQUFLaUIsYUFBTCxDQUFtQkssUUFBbkIsRUFBNkJ6QixTQUE3QixFQUF3Q0QsU0FBeEMsRUFBbUR5QixZQUFuRCxDQUFUOztBQUVBO0FBQ0EsWUFBSUMsU0FBU1IsTUFBVCxHQUFrQixDQUFsQixJQUF1Qk4sTUFBdkIsSUFBaUNRLFVBQVMsQ0FBVCxJQUFjTixNQUFuRCxFQUEyRDtBQUN6RCxpQkFBT1QsS0FBSzRCLFlBQVk3QixJQUFaLEVBQWtCc0IsU0FBU1AsVUFBM0IsRUFBdUNsQixTQUF2QyxFQUFrREQsU0FBbEQsRUFBNkRJLEtBQUs4QixlQUFsRSxDQUFMLENBQVA7QUFDRCxTQUZELE1BRU87QUFDTDtBQUNBakIsbUJBQVNRLFlBQVQsSUFBeUJDLFFBQXpCO0FBQ0Q7QUFDRjs7QUFFRFg7QUFDRDs7QUFFRDtBQUNBO0FBQ0E7QUFDQSxRQUFJWixRQUFKLEVBQWM7QUFDWCxnQkFBU2dDLElBQVQsR0FBZ0I7QUFDZjVCLG1CQUFXLFlBQVc7QUFDcEI7QUFDQTtBQUNBLGNBQUlRLGFBQWFDLGFBQWpCLEVBQWdDO0FBQzlCLG1CQUFPYixVQUFQO0FBQ0Q7O0FBRUQsY0FBSSxDQUFDcUIsZ0JBQUwsRUFBdUI7QUFDckJXO0FBQ0Q7QUFDRixTQVZELEVBVUcsQ0FWSDtBQVdELE9BWkEsR0FBRDtBQWFELEtBZEQsTUFjTztBQUNMLGFBQU9wQixjQUFjQyxhQUFyQixFQUFvQztBQUNsQyxZQUFJb0IsTUFBTVosZ0JBQVY7QUFDQSxZQUFJWSxHQUFKLEVBQVM7QUFDUCxpQkFBT0EsR0FBUDtBQUNEO0FBQ0Y7QUFDRjtBQUNGLEdBOUdjO0FBQUEsbURBZ0hmSixhQWhIZSx5QkFnSERiLFVBaEhDLEVBZ0hXa0IsS0FoSFgsRUFnSGtCQyxPQWhIbEIsRUFnSDJCO0FBQ3hDLFFBQUlDLE9BQU9wQixXQUFXQSxXQUFXTixNQUFYLEdBQW9CLENBQS9CLENBQVg7QUFDQSxRQUFJMEIsUUFBUUEsS0FBS0YsS0FBTCxLQUFlQSxLQUF2QixJQUFnQ0UsS0FBS0QsT0FBTCxLQUFpQkEsT0FBckQsRUFBOEQ7QUFDNUQ7QUFDQTtBQUNBbkIsaUJBQVdBLFdBQVdOLE1BQVgsR0FBb0IsQ0FBL0IsSUFBb0MsRUFBQ1UsT0FBT2dCLEtBQUtoQixLQUFMLEdBQWEsQ0FBckIsRUFBd0JjLE9BQU9BLEtBQS9CLEVBQXNDQyxTQUFTQSxPQUEvQyxFQUFwQztBQUNELEtBSkQsTUFJTztBQUNMbkIsaUJBQVdxQixJQUFYLENBQWdCLEVBQUNqQixPQUFPLENBQVIsRUFBV2MsT0FBT0EsS0FBbEIsRUFBeUJDLFNBQVNBLE9BQWxDLEVBQWhCO0FBQ0Q7QUFDRixHQXpIYztBQUFBLG1EQTBIZmpCLGFBMUhlLHlCQTBIREssUUExSEMsRUEwSFN6QixTQTFIVCxFQTBIb0JELFNBMUhwQixFQTBIK0J5QixZQTFIL0IsRUEwSDZDO0FBQzFELFFBQUliLFNBQVNYLFVBQVVZLE1BQXZCO0FBQUEsUUFDSUMsU0FBU2QsVUFBVWEsTUFEdkI7QUFBQSxRQUVJSyxTQUFTUSxTQUFTUixNQUZ0QjtBQUFBLFFBR0lFLFNBQVNGLFNBQVNPLFlBSHRCO0FBQUEsUUFLSWdCLGNBQWMsQ0FMbEI7QUFNQSxXQUFPdkIsU0FBUyxDQUFULEdBQWFOLE1BQWIsSUFBdUJRLFNBQVMsQ0FBVCxHQUFhTixNQUFwQyxJQUE4QyxLQUFLNEIsTUFBTCxDQUFZekMsVUFBVWlCLFNBQVMsQ0FBbkIsQ0FBWixFQUFtQ2xCLFVBQVVvQixTQUFTLENBQW5CLENBQW5DLENBQXJELEVBQWdIO0FBQzlHRjtBQUNBRTtBQUNBcUI7QUFDRDs7QUFFRCxRQUFJQSxXQUFKLEVBQWlCO0FBQ2ZmLGVBQVNQLFVBQVQsQ0FBb0JxQixJQUFwQixDQUF5QixFQUFDakIsT0FBT2tCLFdBQVIsRUFBekI7QUFDRDs7QUFFRGYsYUFBU1IsTUFBVCxHQUFrQkEsTUFBbEI7QUFDQSxXQUFPRSxNQUFQO0FBQ0QsR0E3SWM7QUFBQSxtREErSWZzQixNQS9JZSxrQkErSVJDLElBL0lRLEVBK0lGQyxLQS9JRSxFQStJSztBQUNsQixRQUFJLEtBQUsxQyxPQUFMLENBQWEyQyxVQUFqQixFQUE2QjtBQUMzQixhQUFPLEtBQUszQyxPQUFMLENBQWEyQyxVQUFiLENBQXdCRixJQUF4QixFQUE4QkMsS0FBOUIsQ0FBUDtBQUNELEtBRkQsTUFFTztBQUNMLGFBQU9ELFNBQVNDLEtBQVQsSUFDRCxLQUFLMUMsT0FBTCxDQUFhNEMsVUFBYixJQUEyQkgsS0FBS0ksV0FBTCxPQUF1QkgsTUFBTUcsV0FBTixFQUR4RDtBQUVEO0FBQ0YsR0F0SmM7QUFBQSxtREF1SmZyQyxXQXZKZSx1QkF1SkhzQyxLQXZKRyxFQXVKSTtBQUNqQixRQUFJWixNQUFNLEVBQVY7QUFDQSxTQUFLLElBQUlhLElBQUksQ0FBYixFQUFnQkEsSUFBSUQsTUFBTW5DLE1BQTFCLEVBQWtDb0MsR0FBbEMsRUFBdUM7QUFDckMsVUFBSUQsTUFBTUMsQ0FBTixDQUFKLEVBQWM7QUFDWmIsWUFBSUksSUFBSixDQUFTUSxNQUFNQyxDQUFOLENBQVQ7QUFDRDtBQUNGO0FBQ0QsV0FBT2IsR0FBUDtBQUNELEdBL0pjO0FBQUEsbURBZ0tmM0IsU0FoS2UscUJBZ0tMSCxLQWhLSyxFQWdLRTtBQUNmLFdBQU9BLEtBQVA7QUFDRCxHQWxLYztBQUFBLG1EQW1LZkssUUFuS2Usb0JBbUtOTCxLQW5LTSxFQW1LQztBQUNkLFdBQU9BLE1BQU00QyxLQUFOLENBQVksRUFBWixDQUFQO0FBQ0QsR0FyS2M7QUFBQSxtREFzS2Y1QixJQXRLZSxnQkFzS1Y2QixLQXRLVSxFQXNLSDtBQUNWLFdBQU9BLE1BQU03QixJQUFOLENBQVcsRUFBWCxDQUFQO0FBQ0Q7QUF4S2MsQ0FBakI7O0FBMktBLFNBQVNXLFdBQVQsQ0FBcUJsQyxJQUFyQixFQUEyQm9CLFVBQTNCLEVBQXVDbEIsU0FBdkMsRUFBa0RELFNBQWxELEVBQTZEa0MsZUFBN0QsRUFBOEU7QUFDNUUsTUFBSWtCLGVBQWUsQ0FBbkI7QUFBQSxNQUNJQyxlQUFlbEMsV0FBV04sTUFEOUI7QUFBQSxNQUVJSyxTQUFTLENBRmI7QUFBQSxNQUdJRSxTQUFTLENBSGI7O0FBS0EsU0FBT2dDLGVBQWVDLFlBQXRCLEVBQW9DRCxjQUFwQyxFQUFvRDtBQUNsRCxRQUFJRSxZQUFZbkMsV0FBV2lDLFlBQVgsQ0FBaEI7QUFDQSxRQUFJLENBQUNFLFVBQVVoQixPQUFmLEVBQXdCO0FBQ3RCLFVBQUksQ0FBQ2dCLFVBQVVqQixLQUFYLElBQW9CSCxlQUF4QixFQUF5QztBQUN2QyxZQUFJNUIsUUFBUUwsVUFBVXNELEtBQVYsQ0FBZ0JyQyxNQUFoQixFQUF3QkEsU0FBU29DLFVBQVUvQixLQUEzQyxDQUFaO0FBQ0FqQixnQkFBUUEsTUFBTWtELEdBQU4sQ0FBVSxVQUFTbEQsS0FBVCxFQUFnQjJDLENBQWhCLEVBQW1CO0FBQ25DLGNBQUlRLFdBQVd6RCxVQUFVb0IsU0FBUzZCLENBQW5CLENBQWY7QUFDQSxpQkFBT1EsU0FBUzVDLE1BQVQsR0FBa0JQLE1BQU1PLE1BQXhCLEdBQWlDNEMsUUFBakMsR0FBNENuRCxLQUFuRDtBQUNELFNBSE8sQ0FBUjs7QUFLQWdELGtCQUFVaEQsS0FBVixHQUFrQlAsS0FBS3VCLElBQUwsQ0FBVWhCLEtBQVYsQ0FBbEI7QUFDRCxPQVJELE1BUU87QUFDTGdELGtCQUFVaEQsS0FBVixHQUFrQlAsS0FBS3VCLElBQUwsQ0FBVXJCLFVBQVVzRCxLQUFWLENBQWdCckMsTUFBaEIsRUFBd0JBLFNBQVNvQyxVQUFVL0IsS0FBM0MsQ0FBVixDQUFsQjtBQUNEO0FBQ0RMLGdCQUFVb0MsVUFBVS9CLEtBQXBCOztBQUVBO0FBQ0EsVUFBSSxDQUFDK0IsVUFBVWpCLEtBQWYsRUFBc0I7QUFDcEJqQixrQkFBVWtDLFVBQVUvQixLQUFwQjtBQUNEO0FBQ0YsS0FsQkQsTUFrQk87QUFDTCtCLGdCQUFVaEQsS0FBVixHQUFrQlAsS0FBS3VCLElBQUwsQ0FBVXRCLFVBQVV1RCxLQUFWLENBQWdCbkMsTUFBaEIsRUFBd0JBLFNBQVNrQyxVQUFVL0IsS0FBM0MsQ0FBVixDQUFsQjtBQUNBSCxnQkFBVWtDLFVBQVUvQixLQUFwQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFJNkIsZ0JBQWdCakMsV0FBV2lDLGVBQWUsQ0FBMUIsRUFBNkJmLEtBQWpELEVBQXdEO0FBQ3RELFlBQUlxQixNQUFNdkMsV0FBV2lDLGVBQWUsQ0FBMUIsQ0FBVjtBQUNBakMsbUJBQVdpQyxlQUFlLENBQTFCLElBQStCakMsV0FBV2lDLFlBQVgsQ0FBL0I7QUFDQWpDLG1CQUFXaUMsWUFBWCxJQUEyQk0sR0FBM0I7QUFDRDtBQUNGO0FBQ0Y7O0FBRUQ7QUFDQTtBQUNBO0FBQ0EsTUFBSUMsZ0JBQWdCeEMsV0FBV2tDLGVBQWUsQ0FBMUIsQ0FBcEI7QUFDQSxNQUFJQSxlQUFlLENBQWYsSUFDRyxPQUFPTSxjQUFjckQsS0FBckIsS0FBK0IsUUFEbEMsS0FFSXFELGNBQWN0QixLQUFkLElBQXVCc0IsY0FBY3JCLE9BRnpDLEtBR0d2QyxLQUFLMkMsTUFBTCxDQUFZLEVBQVosRUFBZ0JpQixjQUFjckQsS0FBOUIsQ0FIUCxFQUc2QztBQUMzQ2EsZUFBV2tDLGVBQWUsQ0FBMUIsRUFBNkIvQyxLQUE3QixJQUFzQ3FELGNBQWNyRCxLQUFwRDtBQUNBYSxlQUFXeUMsR0FBWDtBQUNEOztBQUVELFNBQU96QyxVQUFQO0FBQ0Q7O0FBRUQsU0FBU1ksU0FBVCxDQUFtQjhCLElBQW5CLEVBQXlCO0FBQ3ZCLFNBQU8sRUFBRTNDLFFBQVEyQyxLQUFLM0MsTUFBZixFQUF1QkMsWUFBWTBDLEtBQUsxQyxVQUFMLENBQWdCb0MsS0FBaEIsQ0FBc0IsQ0FBdEIsQ0FBbkMsRUFBUDtBQUNEIiwiZmlsZSI6ImJhc2UuanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBEaWZmKCkge31cblxuRGlmZi5wcm90b3R5cGUgPSB7XG4gIGRpZmYob2xkU3RyaW5nLCBuZXdTdHJpbmcsIG9wdGlvbnMgPSB7fSkge1xuICAgIGxldCBjYWxsYmFjayA9IG9wdGlvbnMuY2FsbGJhY2s7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfVxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICBsZXQgc2VsZiA9IHRoaXM7XG5cbiAgICBmdW5jdGlvbiBkb25lKHZhbHVlKSB7XG4gICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsgY2FsbGJhY2sodW5kZWZpbmVkLCB2YWx1ZSk7IH0sIDApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBbGxvdyBzdWJjbGFzc2VzIHRvIG1hc3NhZ2UgdGhlIGlucHV0IHByaW9yIHRvIHJ1bm5pbmdcbiAgICBvbGRTdHJpbmcgPSB0aGlzLmNhc3RJbnB1dChvbGRTdHJpbmcpO1xuICAgIG5ld1N0cmluZyA9IHRoaXMuY2FzdElucHV0KG5ld1N0cmluZyk7XG5cbiAgICBvbGRTdHJpbmcgPSB0aGlzLnJlbW92ZUVtcHR5KHRoaXMudG9rZW5pemUob2xkU3RyaW5nKSk7XG4gICAgbmV3U3RyaW5nID0gdGhpcy5yZW1vdmVFbXB0eSh0aGlzLnRva2VuaXplKG5ld1N0cmluZykpO1xuXG4gICAgbGV0IG5ld0xlbiA9IG5ld1N0cmluZy5sZW5ndGgsIG9sZExlbiA9IG9sZFN0cmluZy5sZW5ndGg7XG4gICAgbGV0IGVkaXRMZW5ndGggPSAxO1xuICAgIGxldCBtYXhFZGl0TGVuZ3RoID0gbmV3TGVuICsgb2xkTGVuO1xuICAgIGxldCBiZXN0UGF0aCA9IFt7IG5ld1BvczogLTEsIGNvbXBvbmVudHM6IFtdIH1dO1xuXG4gICAgLy8gU2VlZCBlZGl0TGVuZ3RoID0gMCwgaS5lLiB0aGUgY29udGVudCBzdGFydHMgd2l0aCB0aGUgc2FtZSB2YWx1ZXNcbiAgICBsZXQgb2xkUG9zID0gdGhpcy5leHRyYWN0Q29tbW9uKGJlc3RQYXRoWzBdLCBuZXdTdHJpbmcsIG9sZFN0cmluZywgMCk7XG4gICAgaWYgKGJlc3RQYXRoWzBdLm5ld1BvcyArIDEgPj0gbmV3TGVuICYmIG9sZFBvcyArIDEgPj0gb2xkTGVuKSB7XG4gICAgICAvLyBJZGVudGl0eSBwZXIgdGhlIGVxdWFsaXR5IGFuZCB0b2tlbml6ZXJcbiAgICAgIHJldHVybiBkb25lKFt7dmFsdWU6IHRoaXMuam9pbihuZXdTdHJpbmcpLCBjb3VudDogbmV3U3RyaW5nLmxlbmd0aH1dKTtcbiAgICB9XG5cbiAgICAvLyBNYWluIHdvcmtlciBtZXRob2QuIGNoZWNrcyBhbGwgcGVybXV0YXRpb25zIG9mIGEgZ2l2ZW4gZWRpdCBsZW5ndGggZm9yIGFjY2VwdGFuY2UuXG4gICAgZnVuY3Rpb24gZXhlY0VkaXRMZW5ndGgoKSB7XG4gICAgICBmb3IgKGxldCBkaWFnb25hbFBhdGggPSAtMSAqIGVkaXRMZW5ndGg7IGRpYWdvbmFsUGF0aCA8PSBlZGl0TGVuZ3RoOyBkaWFnb25hbFBhdGggKz0gMikge1xuICAgICAgICBsZXQgYmFzZVBhdGg7XG4gICAgICAgIGxldCBhZGRQYXRoID0gYmVzdFBhdGhbZGlhZ29uYWxQYXRoIC0gMV0sXG4gICAgICAgICAgICByZW1vdmVQYXRoID0gYmVzdFBhdGhbZGlhZ29uYWxQYXRoICsgMV0sXG4gICAgICAgICAgICBvbGRQb3MgPSAocmVtb3ZlUGF0aCA/IHJlbW92ZVBhdGgubmV3UG9zIDogMCkgLSBkaWFnb25hbFBhdGg7XG4gICAgICAgIGlmIChhZGRQYXRoKSB7XG4gICAgICAgICAgLy8gTm8gb25lIGVsc2UgaXMgZ29pbmcgdG8gYXR0ZW1wdCB0byB1c2UgdGhpcyB2YWx1ZSwgY2xlYXIgaXRcbiAgICAgICAgICBiZXN0UGF0aFtkaWFnb25hbFBhdGggLSAxXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjYW5BZGQgPSBhZGRQYXRoICYmIGFkZFBhdGgubmV3UG9zICsgMSA8IG5ld0xlbixcbiAgICAgICAgICAgIGNhblJlbW92ZSA9IHJlbW92ZVBhdGggJiYgMCA8PSBvbGRQb3MgJiYgb2xkUG9zIDwgb2xkTGVuO1xuICAgICAgICBpZiAoIWNhbkFkZCAmJiAhY2FuUmVtb3ZlKSB7XG4gICAgICAgICAgLy8gSWYgdGhpcyBwYXRoIGlzIGEgdGVybWluYWwgdGhlbiBwcnVuZVxuICAgICAgICAgIGJlc3RQYXRoW2RpYWdvbmFsUGF0aF0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZWxlY3QgdGhlIGRpYWdvbmFsIHRoYXQgd2Ugd2FudCB0byBicmFuY2ggZnJvbS4gV2Ugc2VsZWN0IHRoZSBwcmlvclxuICAgICAgICAvLyBwYXRoIHdob3NlIHBvc2l0aW9uIGluIHRoZSBuZXcgc3RyaW5nIGlzIHRoZSBmYXJ0aGVzdCBmcm9tIHRoZSBvcmlnaW5cbiAgICAgICAgLy8gYW5kIGRvZXMgbm90IHBhc3MgdGhlIGJvdW5kcyBvZiB0aGUgZGlmZiBncmFwaFxuICAgICAgICBpZiAoIWNhbkFkZCB8fCAoY2FuUmVtb3ZlICYmIGFkZFBhdGgubmV3UG9zIDwgcmVtb3ZlUGF0aC5uZXdQb3MpKSB7XG4gICAgICAgICAgYmFzZVBhdGggPSBjbG9uZVBhdGgocmVtb3ZlUGF0aCk7XG4gICAgICAgICAgc2VsZi5wdXNoQ29tcG9uZW50KGJhc2VQYXRoLmNvbXBvbmVudHMsIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYmFzZVBhdGggPSBhZGRQYXRoOyAgIC8vIE5vIG5lZWQgdG8gY2xvbmUsIHdlJ3ZlIHB1bGxlZCBpdCBmcm9tIHRoZSBsaXN0XG4gICAgICAgICAgYmFzZVBhdGgubmV3UG9zKys7XG4gICAgICAgICAgc2VsZi5wdXNoQ29tcG9uZW50KGJhc2VQYXRoLmNvbXBvbmVudHMsIHRydWUsIHVuZGVmaW5lZCk7XG4gICAgICAgIH1cblxuICAgICAgICBvbGRQb3MgPSBzZWxmLmV4dHJhY3RDb21tb24oYmFzZVBhdGgsIG5ld1N0cmluZywgb2xkU3RyaW5nLCBkaWFnb25hbFBhdGgpO1xuXG4gICAgICAgIC8vIElmIHdlIGhhdmUgaGl0IHRoZSBlbmQgb2YgYm90aCBzdHJpbmdzLCB0aGVuIHdlIGFyZSBkb25lXG4gICAgICAgIGlmIChiYXNlUGF0aC5uZXdQb3MgKyAxID49IG5ld0xlbiAmJiBvbGRQb3MgKyAxID49IG9sZExlbikge1xuICAgICAgICAgIHJldHVybiBkb25lKGJ1aWxkVmFsdWVzKHNlbGYsIGJhc2VQYXRoLmNvbXBvbmVudHMsIG5ld1N0cmluZywgb2xkU3RyaW5nLCBzZWxmLnVzZUxvbmdlc3RUb2tlbikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE90aGVyd2lzZSB0cmFjayB0aGlzIHBhdGggYXMgYSBwb3RlbnRpYWwgY2FuZGlkYXRlIGFuZCBjb250aW51ZS5cbiAgICAgICAgICBiZXN0UGF0aFtkaWFnb25hbFBhdGhdID0gYmFzZVBhdGg7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZWRpdExlbmd0aCsrO1xuICAgIH1cblxuICAgIC8vIFBlcmZvcm1zIHRoZSBsZW5ndGggb2YgZWRpdCBpdGVyYXRpb24uIElzIGEgYml0IGZ1Z2x5IGFzIHRoaXMgaGFzIHRvIHN1cHBvcnQgdGhlXG4gICAgLy8gc3luYyBhbmQgYXN5bmMgbW9kZSB3aGljaCBpcyBuZXZlciBmdW4uIExvb3BzIG92ZXIgZXhlY0VkaXRMZW5ndGggdW50aWwgYSB2YWx1ZVxuICAgIC8vIGlzIHByb2R1Y2VkLlxuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgKGZ1bmN0aW9uIGV4ZWMoKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbiwgYnV0IHdlIHdhbnQgdG8gYmUgc2FmZS5cbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgIGlmIChlZGl0TGVuZ3RoID4gbWF4RWRpdExlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFleGVjRWRpdExlbmd0aCgpKSB7XG4gICAgICAgICAgICBleGVjKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAwKTtcbiAgICAgIH0oKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdoaWxlIChlZGl0TGVuZ3RoIDw9IG1heEVkaXRMZW5ndGgpIHtcbiAgICAgICAgbGV0IHJldCA9IGV4ZWNFZGl0TGVuZ3RoKCk7XG4gICAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHB1c2hDb21wb25lbnQoY29tcG9uZW50cywgYWRkZWQsIHJlbW92ZWQpIHtcbiAgICBsZXQgbGFzdCA9IGNvbXBvbmVudHNbY29tcG9uZW50cy5sZW5ndGggLSAxXTtcbiAgICBpZiAobGFzdCAmJiBsYXN0LmFkZGVkID09PSBhZGRlZCAmJiBsYXN0LnJlbW92ZWQgPT09IHJlbW92ZWQpIHtcbiAgICAgIC8vIFdlIG5lZWQgdG8gY2xvbmUgaGVyZSBhcyB0aGUgY29tcG9uZW50IGNsb25lIG9wZXJhdGlvbiBpcyBqdXN0XG4gICAgICAvLyBhcyBzaGFsbG93IGFycmF5IGNsb25lXG4gICAgICBjb21wb25lbnRzW2NvbXBvbmVudHMubGVuZ3RoIC0gMV0gPSB7Y291bnQ6IGxhc3QuY291bnQgKyAxLCBhZGRlZDogYWRkZWQsIHJlbW92ZWQ6IHJlbW92ZWQgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29tcG9uZW50cy5wdXNoKHtjb3VudDogMSwgYWRkZWQ6IGFkZGVkLCByZW1vdmVkOiByZW1vdmVkIH0pO1xuICAgIH1cbiAgfSxcbiAgZXh0cmFjdENvbW1vbihiYXNlUGF0aCwgbmV3U3RyaW5nLCBvbGRTdHJpbmcsIGRpYWdvbmFsUGF0aCkge1xuICAgIGxldCBuZXdMZW4gPSBuZXdTdHJpbmcubGVuZ3RoLFxuICAgICAgICBvbGRMZW4gPSBvbGRTdHJpbmcubGVuZ3RoLFxuICAgICAgICBuZXdQb3MgPSBiYXNlUGF0aC5uZXdQb3MsXG4gICAgICAgIG9sZFBvcyA9IG5ld1BvcyAtIGRpYWdvbmFsUGF0aCxcblxuICAgICAgICBjb21tb25Db3VudCA9IDA7XG4gICAgd2hpbGUgKG5ld1BvcyArIDEgPCBuZXdMZW4gJiYgb2xkUG9zICsgMSA8IG9sZExlbiAmJiB0aGlzLmVxdWFscyhuZXdTdHJpbmdbbmV3UG9zICsgMV0sIG9sZFN0cmluZ1tvbGRQb3MgKyAxXSkpIHtcbiAgICAgIG5ld1BvcysrO1xuICAgICAgb2xkUG9zKys7XG4gICAgICBjb21tb25Db3VudCsrO1xuICAgIH1cblxuICAgIGlmIChjb21tb25Db3VudCkge1xuICAgICAgYmFzZVBhdGguY29tcG9uZW50cy5wdXNoKHtjb3VudDogY29tbW9uQ291bnR9KTtcbiAgICB9XG5cbiAgICBiYXNlUGF0aC5uZXdQb3MgPSBuZXdQb3M7XG4gICAgcmV0dXJuIG9sZFBvcztcbiAgfSxcblxuICBlcXVhbHMobGVmdCwgcmlnaHQpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLmNvbXBhcmF0b3IpIHtcbiAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuY29tcGFyYXRvcihsZWZ0LCByaWdodCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBsZWZ0ID09PSByaWdodFxuICAgICAgICB8fCAodGhpcy5vcHRpb25zLmlnbm9yZUNhc2UgJiYgbGVmdC50b0xvd2VyQ2FzZSgpID09PSByaWdodC50b0xvd2VyQ2FzZSgpKTtcbiAgICB9XG4gIH0sXG4gIHJlbW92ZUVtcHR5KGFycmF5KSB7XG4gICAgbGV0IHJldCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChhcnJheVtpXSkge1xuICAgICAgICByZXQucHVzaChhcnJheVtpXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH0sXG4gIGNhc3RJbnB1dCh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfSxcbiAgdG9rZW5pemUodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUuc3BsaXQoJycpO1xuICB9LFxuICBqb2luKGNoYXJzKSB7XG4gICAgcmV0dXJuIGNoYXJzLmpvaW4oJycpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBidWlsZFZhbHVlcyhkaWZmLCBjb21wb25lbnRzLCBuZXdTdHJpbmcsIG9sZFN0cmluZywgdXNlTG9uZ2VzdFRva2VuKSB7XG4gIGxldCBjb21wb25lbnRQb3MgPSAwLFxuICAgICAgY29tcG9uZW50TGVuID0gY29tcG9uZW50cy5sZW5ndGgsXG4gICAgICBuZXdQb3MgPSAwLFxuICAgICAgb2xkUG9zID0gMDtcblxuICBmb3IgKDsgY29tcG9uZW50UG9zIDwgY29tcG9uZW50TGVuOyBjb21wb25lbnRQb3MrKykge1xuICAgIGxldCBjb21wb25lbnQgPSBjb21wb25lbnRzW2NvbXBvbmVudFBvc107XG4gICAgaWYgKCFjb21wb25lbnQucmVtb3ZlZCkge1xuICAgICAgaWYgKCFjb21wb25lbnQuYWRkZWQgJiYgdXNlTG9uZ2VzdFRva2VuKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IG5ld1N0cmluZy5zbGljZShuZXdQb3MsIG5ld1BvcyArIGNvbXBvbmVudC5jb3VudCk7XG4gICAgICAgIHZhbHVlID0gdmFsdWUubWFwKGZ1bmN0aW9uKHZhbHVlLCBpKSB7XG4gICAgICAgICAgbGV0IG9sZFZhbHVlID0gb2xkU3RyaW5nW29sZFBvcyArIGldO1xuICAgICAgICAgIHJldHVybiBvbGRWYWx1ZS5sZW5ndGggPiB2YWx1ZS5sZW5ndGggPyBvbGRWYWx1ZSA6IHZhbHVlO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb21wb25lbnQudmFsdWUgPSBkaWZmLmpvaW4odmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29tcG9uZW50LnZhbHVlID0gZGlmZi5qb2luKG5ld1N0cmluZy5zbGljZShuZXdQb3MsIG5ld1BvcyArIGNvbXBvbmVudC5jb3VudCkpO1xuICAgICAgfVxuICAgICAgbmV3UG9zICs9IGNvbXBvbmVudC5jb3VudDtcblxuICAgICAgLy8gQ29tbW9uIGNhc2VcbiAgICAgIGlmICghY29tcG9uZW50LmFkZGVkKSB7XG4gICAgICAgIG9sZFBvcyArPSBjb21wb25lbnQuY291bnQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbXBvbmVudC52YWx1ZSA9IGRpZmYuam9pbihvbGRTdHJpbmcuc2xpY2Uob2xkUG9zLCBvbGRQb3MgKyBjb21wb25lbnQuY291bnQpKTtcbiAgICAgIG9sZFBvcyArPSBjb21wb25lbnQuY291bnQ7XG5cbiAgICAgIC8vIFJldmVyc2UgYWRkIGFuZCByZW1vdmUgc28gcmVtb3ZlcyBhcmUgb3V0cHV0IGZpcnN0IHRvIG1hdGNoIGNvbW1vbiBjb252ZW50aW9uXG4gICAgICAvLyBUaGUgZGlmZmluZyBhbGdvcml0aG0gaXMgdGllZCB0byBhZGQgdGhlbiByZW1vdmUgb3V0cHV0IGFuZCB0aGlzIGlzIHRoZSBzaW1wbGVzdFxuICAgICAgLy8gcm91dGUgdG8gZ2V0IHRoZSBkZXNpcmVkIG91dHB1dCB3aXRoIG1pbmltYWwgb3ZlcmhlYWQuXG4gICAgICBpZiAoY29tcG9uZW50UG9zICYmIGNvbXBvbmVudHNbY29tcG9uZW50UG9zIC0gMV0uYWRkZWQpIHtcbiAgICAgICAgbGV0IHRtcCA9IGNvbXBvbmVudHNbY29tcG9uZW50UG9zIC0gMV07XG4gICAgICAgIGNvbXBvbmVudHNbY29tcG9uZW50UG9zIC0gMV0gPSBjb21wb25lbnRzW2NvbXBvbmVudFBvc107XG4gICAgICAgIGNvbXBvbmVudHNbY29tcG9uZW50UG9zXSA9IHRtcDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBTcGVjaWFsIGNhc2UgaGFuZGxlIGZvciB3aGVuIG9uZSB0ZXJtaW5hbCBpcyBpZ25vcmVkIChpLmUuIHdoaXRlc3BhY2UpLlxuICAvLyBGb3IgdGhpcyBjYXNlIHdlIG1lcmdlIHRoZSB0ZXJtaW5hbCBpbnRvIHRoZSBwcmlvciBzdHJpbmcgYW5kIGRyb3AgdGhlIGNoYW5nZS5cbiAgLy8gVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBmb3Igc3RyaW5nIG1vZGUuXG4gIGxldCBsYXN0Q29tcG9uZW50ID0gY29tcG9uZW50c1tjb21wb25lbnRMZW4gLSAxXTtcbiAgaWYgKGNvbXBvbmVudExlbiA+IDFcbiAgICAgICYmIHR5cGVvZiBsYXN0Q29tcG9uZW50LnZhbHVlID09PSAnc3RyaW5nJ1xuICAgICAgJiYgKGxhc3RDb21wb25lbnQuYWRkZWQgfHwgbGFzdENvbXBvbmVudC5yZW1vdmVkKVxuICAgICAgJiYgZGlmZi5lcXVhbHMoJycsIGxhc3RDb21wb25lbnQudmFsdWUpKSB7XG4gICAgY29tcG9uZW50c1tjb21wb25lbnRMZW4gLSAyXS52YWx1ZSArPSBsYXN0Q29tcG9uZW50LnZhbHVlO1xuICAgIGNvbXBvbmVudHMucG9wKCk7XG4gIH1cblxuICByZXR1cm4gY29tcG9uZW50cztcbn1cblxuZnVuY3Rpb24gY2xvbmVQYXRoKHBhdGgpIHtcbiAgcmV0dXJuIHsgbmV3UG9zOiBwYXRoLm5ld1BvcywgY29tcG9uZW50czogcGF0aC5jb21wb25lbnRzLnNsaWNlKDApIH07XG59XG4iXX0=\n\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*istanbul ignore start*/'use strict';\n\n\texports.__esModule = true;\n\texports.characterDiff = undefined;\n\texports. /*istanbul ignore end*/diffChars = diffChars;\n\n\tvar /*istanbul ignore start*/_base = __webpack_require__(1) /*istanbul ignore end*/;\n\n\t/*istanbul ignore start*/var _base2 = _interopRequireDefault(_base);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n\t/*istanbul ignore end*/var characterDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/characterDiff = new /*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/();\n\tfunction diffChars(oldStr, newStr, options) {\n\t  return characterDiff.diff(oldStr, newStr, options);\n\t}\n\t//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL2NoYXJhY3Rlci5qcyJdLCJuYW1lcyI6WyJkaWZmQ2hhcnMiLCJjaGFyYWN0ZXJEaWZmIiwib2xkU3RyIiwibmV3U3RyIiwib3B0aW9ucyIsImRpZmYiXSwibWFwcGluZ3MiOiI7Ozs7Z0NBR2dCQSxTLEdBQUFBLFM7O0FBSGhCOzs7Ozs7dUJBRU8sSUFBTUMseUZBQWdCLHdFQUF0QjtBQUNBLFNBQVNELFNBQVQsQ0FBbUJFLE1BQW5CLEVBQTJCQyxNQUEzQixFQUFtQ0MsT0FBbkMsRUFBNEM7QUFBRSxTQUFPSCxjQUFjSSxJQUFkLENBQW1CSCxNQUFuQixFQUEyQkMsTUFBM0IsRUFBbUNDLE9BQW5DLENBQVA7QUFBcUQiLCJmaWxlIjoiY2hhcmFjdGVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IERpZmYgZnJvbSAnLi9iYXNlJztcblxuZXhwb3J0IGNvbnN0IGNoYXJhY3RlckRpZmYgPSBuZXcgRGlmZigpO1xuZXhwb3J0IGZ1bmN0aW9uIGRpZmZDaGFycyhvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucykgeyByZXR1cm4gY2hhcmFjdGVyRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKTsgfVxuIl19\n\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*istanbul ignore start*/'use strict';\n\n\texports.__esModule = true;\n\texports.wordDiff = undefined;\n\texports. /*istanbul ignore end*/diffWords = diffWords;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/diffWordsWithSpace = diffWordsWithSpace;\n\n\tvar /*istanbul ignore start*/_base = __webpack_require__(1) /*istanbul ignore end*/;\n\n\t/*istanbul ignore start*/var _base2 = _interopRequireDefault(_base);\n\n\t/*istanbul ignore end*/var /*istanbul ignore start*/_params = __webpack_require__(4) /*istanbul ignore end*/;\n\n\t/*istanbul ignore start*/function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n\t/*istanbul ignore end*/ // Based on https://en.wikipedia.org/wiki/Latin_script_in_Unicode\n\t//\n\t// Ranges and exceptions:\n\t// Latin-1 Supplement, 0080–00FF\n\t//  - U+00D7  × Multiplication sign\n\t//  - U+00F7  ÷ Division sign\n\t// Latin Extended-A, 0100–017F\n\t// Latin Extended-B, 0180–024F\n\t// IPA Extensions, 0250–02AF\n\t// Spacing Modifier Letters, 02B0–02FF\n\t//  - U+02C7  ˇ &#711;  Caron\n\t//  - U+02D8  ˘ &#728;  Breve\n\t//  - U+02D9  ˙ &#729;  Dot Above\n\t//  - U+02DA  ˚ &#730;  Ring Above\n\t//  - U+02DB  ˛ &#731;  Ogonek\n\t//  - U+02DC  ˜ &#732;  Small Tilde\n\t//  - U+02DD  ˝ &#733;  Double Acute Accent\n\t// Latin Extended Additional, 1E00–1EFF\n\tvar extendedWordChars = /^[A-Za-z\\xC0-\\u02C6\\u02C8-\\u02D7\\u02DE-\\u02FF\\u1E00-\\u1EFF]+$/;\n\n\tvar reWhitespace = /\\S/;\n\n\tvar wordDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/wordDiff = new /*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/();\n\twordDiff.equals = function (left, right) {\n\t  if (this.options.ignoreCase) {\n\t    left = left.toLowerCase();\n\t    right = right.toLowerCase();\n\t  }\n\t  return left === right || this.options.ignoreWhitespace && !reWhitespace.test(left) && !reWhitespace.test(right);\n\t};\n\twordDiff.tokenize = function (value) {\n\t  var tokens = value.split(/(\\s+|\\b)/);\n\n\t  // Join the boundary splits that we do not consider to be boundaries. This is primarily the extended Latin character set.\n\t  for (var i = 0; i < tokens.length - 1; i++) {\n\t    // If we have an empty string in the next field and we have only word chars before and after, merge\n\t    if (!tokens[i + 1] && tokens[i + 2] && extendedWordChars.test(tokens[i]) && extendedWordChars.test(tokens[i + 2])) {\n\t      tokens[i] += tokens[i + 2];\n\t      tokens.splice(i + 1, 2);\n\t      i--;\n\t    }\n\t  }\n\n\t  return tokens;\n\t};\n\n\tfunction diffWords(oldStr, newStr, options) {\n\t  options = /*istanbul ignore start*/(0, _params.generateOptions) /*istanbul ignore end*/(options, { ignoreWhitespace: true });\n\t  return wordDiff.diff(oldStr, newStr, options);\n\t}\n\n\tfunction diffWordsWithSpace(oldStr, newStr, options) {\n\t  return wordDiff.diff(oldStr, newStr, options);\n\t}\n\t//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL3dvcmQuanMiXSwibmFtZXMiOlsiZGlmZldvcmRzIiwiZGlmZldvcmRzV2l0aFNwYWNlIiwiZXh0ZW5kZWRXb3JkQ2hhcnMiLCJyZVdoaXRlc3BhY2UiLCJ3b3JkRGlmZiIsImVxdWFscyIsImxlZnQiLCJyaWdodCIsIm9wdGlvbnMiLCJpZ25vcmVDYXNlIiwidG9Mb3dlckNhc2UiLCJpZ25vcmVXaGl0ZXNwYWNlIiwidGVzdCIsInRva2VuaXplIiwidmFsdWUiLCJ0b2tlbnMiLCJzcGxpdCIsImkiLCJsZW5ndGgiLCJzcGxpY2UiLCJvbGRTdHIiLCJuZXdTdHIiLCJkaWZmIl0sIm1hcHBpbmdzIjoiOzs7O2dDQW1EZ0JBLFMsR0FBQUEsUzt5REFLQUMsa0IsR0FBQUEsa0I7O0FBeERoQjs7Ozt1QkFDQTs7Ozt3QkFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFNQyxvQkFBb0IsK0RBQTFCOztBQUVBLElBQU1DLGVBQWUsSUFBckI7O0FBRU8sSUFBTUMsK0VBQVcsd0VBQWpCO0FBQ1BBLFNBQVNDLE1BQVQsR0FBa0IsVUFBU0MsSUFBVCxFQUFlQyxLQUFmLEVBQXNCO0FBQ3RDLE1BQUksS0FBS0MsT0FBTCxDQUFhQyxVQUFqQixFQUE2QjtBQUMzQkgsV0FBT0EsS0FBS0ksV0FBTCxFQUFQO0FBQ0FILFlBQVFBLE1BQU1HLFdBQU4sRUFBUjtBQUNEO0FBQ0QsU0FBT0osU0FBU0MsS0FBVCxJQUFtQixLQUFLQyxPQUFMLENBQWFHLGdCQUFiLElBQWlDLENBQUNSLGFBQWFTLElBQWIsQ0FBa0JOLElBQWxCLENBQWxDLElBQTZELENBQUNILGFBQWFTLElBQWIsQ0FBa0JMLEtBQWxCLENBQXhGO0FBQ0QsQ0FORDtBQU9BSCxTQUFTUyxRQUFULEdBQW9CLFVBQVNDLEtBQVQsRUFBZ0I7QUFDbEMsTUFBSUMsU0FBU0QsTUFBTUUsS0FBTixDQUFZLFVBQVosQ0FBYjs7QUFFQTtBQUNBLE9BQUssSUFBSUMsSUFBSSxDQUFiLEVBQWdCQSxJQUFJRixPQUFPRyxNQUFQLEdBQWdCLENBQXBDLEVBQXVDRCxHQUF2QyxFQUE0QztBQUMxQztBQUNBLFFBQUksQ0FBQ0YsT0FBT0UsSUFBSSxDQUFYLENBQUQsSUFBa0JGLE9BQU9FLElBQUksQ0FBWCxDQUFsQixJQUNLZixrQkFBa0JVLElBQWxCLENBQXVCRyxPQUFPRSxDQUFQLENBQXZCLENBREwsSUFFS2Ysa0JBQWtCVSxJQUFsQixDQUF1QkcsT0FBT0UsSUFBSSxDQUFYLENBQXZCLENBRlQsRUFFZ0Q7QUFDOUNGLGFBQU9FLENBQVAsS0FBYUYsT0FBT0UsSUFBSSxDQUFYLENBQWI7QUFDQUYsYUFBT0ksTUFBUCxDQUFjRixJQUFJLENBQWxCLEVBQXFCLENBQXJCO0FBQ0FBO0FBQ0Q7QUFDRjs7QUFFRCxTQUFPRixNQUFQO0FBQ0QsQ0FoQkQ7O0FBa0JPLFNBQVNmLFNBQVQsQ0FBbUJvQixNQUFuQixFQUEyQkMsTUFBM0IsRUFBbUNiLE9BQW5DLEVBQTRDO0FBQ2pEQSxZQUFVLDhFQUFnQkEsT0FBaEIsRUFBeUIsRUFBQ0csa0JBQWtCLElBQW5CLEVBQXpCLENBQVY7QUFDQSxTQUFPUCxTQUFTa0IsSUFBVCxDQUFjRixNQUFkLEVBQXNCQyxNQUF0QixFQUE4QmIsT0FBOUIsQ0FBUDtBQUNEOztBQUVNLFNBQVNQLGtCQUFULENBQTRCbUIsTUFBNUIsRUFBb0NDLE1BQXBDLEVBQTRDYixPQUE1QyxFQUFxRDtBQUMxRCxTQUFPSixTQUFTa0IsSUFBVCxDQUFjRixNQUFkLEVBQXNCQyxNQUF0QixFQUE4QmIsT0FBOUIsQ0FBUDtBQUNEIiwiZmlsZSI6IndvcmQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRGlmZiBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0IHtnZW5lcmF0ZU9wdGlvbnN9IGZyb20gJy4uL3V0aWwvcGFyYW1zJztcblxuLy8gQmFzZWQgb24gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGF0aW5fc2NyaXB0X2luX1VuaWNvZGVcbi8vXG4vLyBSYW5nZXMgYW5kIGV4Y2VwdGlvbnM6XG4vLyBMYXRpbi0xIFN1cHBsZW1lbnQsIDAwODDigJMwMEZGXG4vLyAgLSBVKzAwRDcgIMOXIE11bHRpcGxpY2F0aW9uIHNpZ25cbi8vICAtIFUrMDBGNyAgw7cgRGl2aXNpb24gc2lnblxuLy8gTGF0aW4gRXh0ZW5kZWQtQSwgMDEwMOKAkzAxN0Zcbi8vIExhdGluIEV4dGVuZGVkLUIsIDAxODDigJMwMjRGXG4vLyBJUEEgRXh0ZW5zaW9ucywgMDI1MOKAkzAyQUZcbi8vIFNwYWNpbmcgTW9kaWZpZXIgTGV0dGVycywgMDJCMOKAkzAyRkZcbi8vICAtIFUrMDJDNyAgy4cgJiM3MTE7ICBDYXJvblxuLy8gIC0gVSswMkQ4ICDLmCAmIzcyODsgIEJyZXZlXG4vLyAgLSBVKzAyRDkgIMuZICYjNzI5OyAgRG90IEFib3ZlXG4vLyAgLSBVKzAyREEgIMuaICYjNzMwOyAgUmluZyBBYm92ZVxuLy8gIC0gVSswMkRCICDLmyAmIzczMTsgIE9nb25la1xuLy8gIC0gVSswMkRDICDLnCAmIzczMjsgIFNtYWxsIFRpbGRlXG4vLyAgLSBVKzAyREQgIMudICYjNzMzOyAgRG91YmxlIEFjdXRlIEFjY2VudFxuLy8gTGF0aW4gRXh0ZW5kZWQgQWRkaXRpb25hbCwgMUUwMOKAkzFFRkZcbmNvbnN0IGV4dGVuZGVkV29yZENoYXJzID0gL15bYS16QS1aXFx1e0MwfS1cXHV7RkZ9XFx1e0Q4fS1cXHV7RjZ9XFx1e0Y4fS1cXHV7MkM2fVxcdXsyQzh9LVxcdXsyRDd9XFx1ezJERX0tXFx1ezJGRn1cXHV7MUUwMH0tXFx1ezFFRkZ9XSskL3U7XG5cbmNvbnN0IHJlV2hpdGVzcGFjZSA9IC9cXFMvO1xuXG5leHBvcnQgY29uc3Qgd29yZERpZmYgPSBuZXcgRGlmZigpO1xud29yZERpZmYuZXF1YWxzID0gZnVuY3Rpb24obGVmdCwgcmlnaHQpIHtcbiAgaWYgKHRoaXMub3B0aW9ucy5pZ25vcmVDYXNlKSB7XG4gICAgbGVmdCA9IGxlZnQudG9Mb3dlckNhc2UoKTtcbiAgICByaWdodCA9IHJpZ2h0LnRvTG93ZXJDYXNlKCk7XG4gIH1cbiAgcmV0dXJuIGxlZnQgPT09IHJpZ2h0IHx8ICh0aGlzLm9wdGlvbnMuaWdub3JlV2hpdGVzcGFjZSAmJiAhcmVXaGl0ZXNwYWNlLnRlc3QobGVmdCkgJiYgIXJlV2hpdGVzcGFjZS50ZXN0KHJpZ2h0KSk7XG59O1xud29yZERpZmYudG9rZW5pemUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICBsZXQgdG9rZW5zID0gdmFsdWUuc3BsaXQoLyhcXHMrfFxcYikvKTtcblxuICAvLyBKb2luIHRoZSBib3VuZGFyeSBzcGxpdHMgdGhhdCB3ZSBkbyBub3QgY29uc2lkZXIgdG8gYmUgYm91bmRhcmllcy4gVGhpcyBpcyBwcmltYXJpbHkgdGhlIGV4dGVuZGVkIExhdGluIGNoYXJhY3RlciBzZXQuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIC8vIElmIHdlIGhhdmUgYW4gZW1wdHkgc3RyaW5nIGluIHRoZSBuZXh0IGZpZWxkIGFuZCB3ZSBoYXZlIG9ubHkgd29yZCBjaGFycyBiZWZvcmUgYW5kIGFmdGVyLCBtZXJnZVxuICAgIGlmICghdG9rZW5zW2kgKyAxXSAmJiB0b2tlbnNbaSArIDJdXG4gICAgICAgICAgJiYgZXh0ZW5kZWRXb3JkQ2hhcnMudGVzdCh0b2tlbnNbaV0pXG4gICAgICAgICAgJiYgZXh0ZW5kZWRXb3JkQ2hhcnMudGVzdCh0b2tlbnNbaSArIDJdKSkge1xuICAgICAgdG9rZW5zW2ldICs9IHRva2Vuc1tpICsgMl07XG4gICAgICB0b2tlbnMuc3BsaWNlKGkgKyAxLCAyKTtcbiAgICAgIGktLTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdG9rZW5zO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGRpZmZXb3JkcyhvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucykge1xuICBvcHRpb25zID0gZ2VuZXJhdGVPcHRpb25zKG9wdGlvbnMsIHtpZ25vcmVXaGl0ZXNwYWNlOiB0cnVlfSk7XG4gIHJldHVybiB3b3JkRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpZmZXb3Jkc1dpdGhTcGFjZShvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucykge1xuICByZXR1cm4gd29yZERpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucyk7XG59XG4iXX0=\n\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports) {\n\n\t/*istanbul ignore start*/'use strict';\n\n\texports.__esModule = true;\n\texports. /*istanbul ignore end*/generateOptions = generateOptions;\n\tfunction generateOptions(options, defaults) {\n\t  if (typeof options === 'function') {\n\t    defaults.callback = options;\n\t  } else if (options) {\n\t    for (var name in options) {\n\t      /* istanbul ignore else */\n\t      if (options.hasOwnProperty(name)) {\n\t        defaults[name] = options[name];\n\t      }\n\t    }\n\t  }\n\t  return defaults;\n\t}\n\t//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsL3BhcmFtcy5qcyJdLCJuYW1lcyI6WyJnZW5lcmF0ZU9wdGlvbnMiLCJvcHRpb25zIiwiZGVmYXVsdHMiLCJjYWxsYmFjayIsIm5hbWUiLCJoYXNPd25Qcm9wZXJ0eSJdLCJtYXBwaW5ncyI6Ijs7O2dDQUFnQkEsZSxHQUFBQSxlO0FBQVQsU0FBU0EsZUFBVCxDQUF5QkMsT0FBekIsRUFBa0NDLFFBQWxDLEVBQTRDO0FBQ2pELE1BQUksT0FBT0QsT0FBUCxLQUFtQixVQUF2QixFQUFtQztBQUNqQ0MsYUFBU0MsUUFBVCxHQUFvQkYsT0FBcEI7QUFDRCxHQUZELE1BRU8sSUFBSUEsT0FBSixFQUFhO0FBQ2xCLFNBQUssSUFBSUcsSUFBVCxJQUFpQkgsT0FBakIsRUFBMEI7QUFDeEI7QUFDQSxVQUFJQSxRQUFRSSxjQUFSLENBQXVCRCxJQUF2QixDQUFKLEVBQWtDO0FBQ2hDRixpQkFBU0UsSUFBVCxJQUFpQkgsUUFBUUcsSUFBUixDQUFqQjtBQUNEO0FBQ0Y7QUFDRjtBQUNELFNBQU9GLFFBQVA7QUFDRCIsImZpbGUiOiJwYXJhbXMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVPcHRpb25zKG9wdGlvbnMsIGRlZmF1bHRzKSB7XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGRlZmF1bHRzLmNhbGxiYWNrID0gb3B0aW9ucztcbiAgfSBlbHNlIGlmIChvcHRpb25zKSB7XG4gICAgZm9yIChsZXQgbmFtZSBpbiBvcHRpb25zKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgZGVmYXVsdHNbbmFtZV0gPSBvcHRpb25zW25hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZGVmYXVsdHM7XG59XG4iXX0=\n\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*istanbul ignore start*/'use strict';\n\n\texports.__esModule = true;\n\texports.lineDiff = undefined;\n\texports. /*istanbul ignore end*/diffLines = diffLines;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/diffTrimmedLines = diffTrimmedLines;\n\n\tvar /*istanbul ignore start*/_base = __webpack_require__(1) /*istanbul ignore end*/;\n\n\t/*istanbul ignore start*/var _base2 = _interopRequireDefault(_base);\n\n\t/*istanbul ignore end*/var /*istanbul ignore start*/_params = __webpack_require__(4) /*istanbul ignore end*/;\n\n\t/*istanbul ignore start*/function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n\t/*istanbul ignore end*/var lineDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/lineDiff = new /*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/();\n\tlineDiff.tokenize = function (value) {\n\t  var retLines = [],\n\t      linesAndNewlines = value.split(/(\\n|\\r\\n)/);\n\n\t  // Ignore the final empty token that occurs if the string ends with a new line\n\t  if (!linesAndNewlines[linesAndNewlines.length - 1]) {\n\t    linesAndNewlines.pop();\n\t  }\n\n\t  // Merge the content and line separators into single tokens\n\t  for (var i = 0; i < linesAndNewlines.length; i++) {\n\t    var line = linesAndNewlines[i];\n\n\t    if (i % 2 && !this.options.newlineIsToken) {\n\t      retLines[retLines.length - 1] += line;\n\t    } else {\n\t      if (this.options.ignoreWhitespace) {\n\t        line = line.trim();\n\t      }\n\t      retLines.push(line);\n\t    }\n\t  }\n\n\t  return retLines;\n\t};\n\n\tfunction diffLines(oldStr, newStr, callback) {\n\t  return lineDiff.diff(oldStr, newStr, callback);\n\t}\n\tfunction diffTrimmedLines(oldStr, newStr, callback) {\n\t  var options = /*istanbul ignore start*/(0, _params.generateOptions) /*istanbul ignore end*/(callback, { ignoreWhitespace: true });\n\t  return lineDiff.diff(oldStr, newStr, options);\n\t}\n\t//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL2xpbmUuanMiXSwibmFtZXMiOlsiZGlmZkxpbmVzIiwiZGlmZlRyaW1tZWRMaW5lcyIsImxpbmVEaWZmIiwidG9rZW5pemUiLCJ2YWx1ZSIsInJldExpbmVzIiwibGluZXNBbmROZXdsaW5lcyIsInNwbGl0IiwibGVuZ3RoIiwicG9wIiwiaSIsImxpbmUiLCJvcHRpb25zIiwibmV3bGluZUlzVG9rZW4iLCJpZ25vcmVXaGl0ZXNwYWNlIiwidHJpbSIsInB1c2giLCJvbGRTdHIiLCJuZXdTdHIiLCJjYWxsYmFjayIsImRpZmYiXSwibWFwcGluZ3MiOiI7Ozs7Z0NBOEJnQkEsUyxHQUFBQSxTO3lEQUNBQyxnQixHQUFBQSxnQjs7QUEvQmhCOzs7O3VCQUNBOzs7O3VCQUVPLElBQU1DLCtFQUFXLHdFQUFqQjtBQUNQQSxTQUFTQyxRQUFULEdBQW9CLFVBQVNDLEtBQVQsRUFBZ0I7QUFDbEMsTUFBSUMsV0FBVyxFQUFmO0FBQUEsTUFDSUMsbUJBQW1CRixNQUFNRyxLQUFOLENBQVksV0FBWixDQUR2Qjs7QUFHQTtBQUNBLE1BQUksQ0FBQ0QsaUJBQWlCQSxpQkFBaUJFLE1BQWpCLEdBQTBCLENBQTNDLENBQUwsRUFBb0Q7QUFDbERGLHFCQUFpQkcsR0FBakI7QUFDRDs7QUFFRDtBQUNBLE9BQUssSUFBSUMsSUFBSSxDQUFiLEVBQWdCQSxJQUFJSixpQkFBaUJFLE1BQXJDLEVBQTZDRSxHQUE3QyxFQUFrRDtBQUNoRCxRQUFJQyxPQUFPTCxpQkFBaUJJLENBQWpCLENBQVg7O0FBRUEsUUFBSUEsSUFBSSxDQUFKLElBQVMsQ0FBQyxLQUFLRSxPQUFMLENBQWFDLGNBQTNCLEVBQTJDO0FBQ3pDUixlQUFTQSxTQUFTRyxNQUFULEdBQWtCLENBQTNCLEtBQWlDRyxJQUFqQztBQUNELEtBRkQsTUFFTztBQUNMLFVBQUksS0FBS0MsT0FBTCxDQUFhRSxnQkFBakIsRUFBbUM7QUFDakNILGVBQU9BLEtBQUtJLElBQUwsRUFBUDtBQUNEO0FBQ0RWLGVBQVNXLElBQVQsQ0FBY0wsSUFBZDtBQUNEO0FBQ0Y7O0FBRUQsU0FBT04sUUFBUDtBQUNELENBeEJEOztBQTBCTyxTQUFTTCxTQUFULENBQW1CaUIsTUFBbkIsRUFBMkJDLE1BQTNCLEVBQW1DQyxRQUFuQyxFQUE2QztBQUFFLFNBQU9qQixTQUFTa0IsSUFBVCxDQUFjSCxNQUFkLEVBQXNCQyxNQUF0QixFQUE4QkMsUUFBOUIsQ0FBUDtBQUFpRDtBQUNoRyxTQUFTbEIsZ0JBQVQsQ0FBMEJnQixNQUExQixFQUFrQ0MsTUFBbEMsRUFBMENDLFFBQTFDLEVBQW9EO0FBQ3pELE1BQUlQLFVBQVUsOEVBQWdCTyxRQUFoQixFQUEwQixFQUFDTCxrQkFBa0IsSUFBbkIsRUFBMUIsQ0FBZDtBQUNBLFNBQU9aLFNBQVNrQixJQUFULENBQWNILE1BQWQsRUFBc0JDLE1BQXRCLEVBQThCTixPQUE5QixDQUFQO0FBQ0QiLCJmaWxlIjoibGluZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBEaWZmIGZyb20gJy4vYmFzZSc7XG5pbXBvcnQge2dlbmVyYXRlT3B0aW9uc30gZnJvbSAnLi4vdXRpbC9wYXJhbXMnO1xuXG5leHBvcnQgY29uc3QgbGluZURpZmYgPSBuZXcgRGlmZigpO1xubGluZURpZmYudG9rZW5pemUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICBsZXQgcmV0TGluZXMgPSBbXSxcbiAgICAgIGxpbmVzQW5kTmV3bGluZXMgPSB2YWx1ZS5zcGxpdCgvKFxcbnxcXHJcXG4pLyk7XG5cbiAgLy8gSWdub3JlIHRoZSBmaW5hbCBlbXB0eSB0b2tlbiB0aGF0IG9jY3VycyBpZiB0aGUgc3RyaW5nIGVuZHMgd2l0aCBhIG5ldyBsaW5lXG4gIGlmICghbGluZXNBbmROZXdsaW5lc1tsaW5lc0FuZE5ld2xpbmVzLmxlbmd0aCAtIDFdKSB7XG4gICAgbGluZXNBbmROZXdsaW5lcy5wb3AoKTtcbiAgfVxuXG4gIC8vIE1lcmdlIHRoZSBjb250ZW50IGFuZCBsaW5lIHNlcGFyYXRvcnMgaW50byBzaW5nbGUgdG9rZW5zXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXNBbmROZXdsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgIGxldCBsaW5lID0gbGluZXNBbmROZXdsaW5lc1tpXTtcblxuICAgIGlmIChpICUgMiAmJiAhdGhpcy5vcHRpb25zLm5ld2xpbmVJc1Rva2VuKSB7XG4gICAgICByZXRMaW5lc1tyZXRMaW5lcy5sZW5ndGggLSAxXSArPSBsaW5lO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmlnbm9yZVdoaXRlc3BhY2UpIHtcbiAgICAgICAgbGluZSA9IGxpbmUudHJpbSgpO1xuICAgICAgfVxuICAgICAgcmV0TGluZXMucHVzaChsaW5lKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmV0TGluZXM7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZGlmZkxpbmVzKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjaykgeyByZXR1cm4gbGluZURpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spOyB9XG5leHBvcnQgZnVuY3Rpb24gZGlmZlRyaW1tZWRMaW5lcyhvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spIHtcbiAgbGV0IG9wdGlvbnMgPSBnZW5lcmF0ZU9wdGlvbnMoY2FsbGJhY2ssIHtpZ25vcmVXaGl0ZXNwYWNlOiB0cnVlfSk7XG4gIHJldHVybiBsaW5lRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKTtcbn1cbiJdfQ==\n\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*istanbul ignore start*/'use strict';\n\n\texports.__esModule = true;\n\texports.sentenceDiff = undefined;\n\texports. /*istanbul ignore end*/diffSentences = diffSentences;\n\n\tvar /*istanbul ignore start*/_base = __webpack_require__(1) /*istanbul ignore end*/;\n\n\t/*istanbul ignore start*/var _base2 = _interopRequireDefault(_base);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n\t/*istanbul ignore end*/var sentenceDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/sentenceDiff = new /*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/();\n\tsentenceDiff.tokenize = function (value) {\n\t  return value.split(/(\\S.+?[.!?])(?=\\s+|$)/);\n\t};\n\n\tfunction diffSentences(oldStr, newStr, callback) {\n\t  return sentenceDiff.diff(oldStr, newStr, callback);\n\t}\n\t//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL3NlbnRlbmNlLmpzIl0sIm5hbWVzIjpbImRpZmZTZW50ZW5jZXMiLCJzZW50ZW5jZURpZmYiLCJ0b2tlbml6ZSIsInZhbHVlIiwic3BsaXQiLCJvbGRTdHIiLCJuZXdTdHIiLCJjYWxsYmFjayIsImRpZmYiXSwibWFwcGluZ3MiOiI7Ozs7Z0NBUWdCQSxhLEdBQUFBLGE7O0FBUmhCOzs7Ozs7dUJBR08sSUFBTUMsdUZBQWUsd0VBQXJCO0FBQ1BBLGFBQWFDLFFBQWIsR0FBd0IsVUFBU0MsS0FBVCxFQUFnQjtBQUN0QyxTQUFPQSxNQUFNQyxLQUFOLENBQVksdUJBQVosQ0FBUDtBQUNELENBRkQ7O0FBSU8sU0FBU0osYUFBVCxDQUF1QkssTUFBdkIsRUFBK0JDLE1BQS9CLEVBQXVDQyxRQUF2QyxFQUFpRDtBQUFFLFNBQU9OLGFBQWFPLElBQWIsQ0FBa0JILE1BQWxCLEVBQTBCQyxNQUExQixFQUFrQ0MsUUFBbEMsQ0FBUDtBQUFxRCIsImZpbGUiOiJzZW50ZW5jZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBEaWZmIGZyb20gJy4vYmFzZSc7XG5cblxuZXhwb3J0IGNvbnN0IHNlbnRlbmNlRGlmZiA9IG5ldyBEaWZmKCk7XG5zZW50ZW5jZURpZmYudG9rZW5pemUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUuc3BsaXQoLyhcXFMuKz9bLiE/XSkoPz1cXHMrfCQpLyk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZGlmZlNlbnRlbmNlcyhvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spIHsgcmV0dXJuIHNlbnRlbmNlRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjayk7IH1cbiJdfQ==\n\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*istanbul ignore start*/'use strict';\n\n\texports.__esModule = true;\n\texports.cssDiff = undefined;\n\texports. /*istanbul ignore end*/diffCss = diffCss;\n\n\tvar /*istanbul ignore start*/_base = __webpack_require__(1) /*istanbul ignore end*/;\n\n\t/*istanbul ignore start*/var _base2 = _interopRequireDefault(_base);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n\t/*istanbul ignore end*/var cssDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/cssDiff = new /*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/();\n\tcssDiff.tokenize = function (value) {\n\t  return value.split(/([{}:;,]|\\s+)/);\n\t};\n\n\tfunction diffCss(oldStr, newStr, callback) {\n\t  return cssDiff.diff(oldStr, newStr, callback);\n\t}\n\t//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL2Nzcy5qcyJdLCJuYW1lcyI6WyJkaWZmQ3NzIiwiY3NzRGlmZiIsInRva2VuaXplIiwidmFsdWUiLCJzcGxpdCIsIm9sZFN0ciIsIm5ld1N0ciIsImNhbGxiYWNrIiwiZGlmZiJdLCJtYXBwaW5ncyI6Ijs7OztnQ0FPZ0JBLE8sR0FBQUEsTzs7QUFQaEI7Ozs7Ozt1QkFFTyxJQUFNQyw2RUFBVSx3RUFBaEI7QUFDUEEsUUFBUUMsUUFBUixHQUFtQixVQUFTQyxLQUFULEVBQWdCO0FBQ2pDLFNBQU9BLE1BQU1DLEtBQU4sQ0FBWSxlQUFaLENBQVA7QUFDRCxDQUZEOztBQUlPLFNBQVNKLE9BQVQsQ0FBaUJLLE1BQWpCLEVBQXlCQyxNQUF6QixFQUFpQ0MsUUFBakMsRUFBMkM7QUFBRSxTQUFPTixRQUFRTyxJQUFSLENBQWFILE1BQWIsRUFBcUJDLE1BQXJCLEVBQTZCQyxRQUE3QixDQUFQO0FBQWdEIiwiZmlsZSI6ImNzcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBEaWZmIGZyb20gJy4vYmFzZSc7XG5cbmV4cG9ydCBjb25zdCBjc3NEaWZmID0gbmV3IERpZmYoKTtcbmNzc0RpZmYudG9rZW5pemUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUuc3BsaXQoLyhbe306OyxdfFxccyspLyk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZGlmZkNzcyhvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spIHsgcmV0dXJuIGNzc0RpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spOyB9XG4iXX0=\n\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*istanbul ignore start*/'use strict';\n\n\texports.__esModule = true;\n\texports.jsonDiff = undefined;\n\n\tvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n\texports. /*istanbul ignore end*/diffJson = diffJson;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/canonicalize = canonicalize;\n\n\tvar /*istanbul ignore start*/_base = __webpack_require__(1) /*istanbul ignore end*/;\n\n\t/*istanbul ignore start*/var _base2 = _interopRequireDefault(_base);\n\n\t/*istanbul ignore end*/var /*istanbul ignore start*/_line = __webpack_require__(5) /*istanbul ignore end*/;\n\n\t/*istanbul ignore start*/function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n\t/*istanbul ignore end*/var objectPrototypeToString = Object.prototype.toString;\n\n\tvar jsonDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/jsonDiff = new /*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/();\n\t// Discriminate between two lines of pretty-printed, serialized JSON where one of them has a\n\t// dangling comma and the other doesn't. Turns out including the dangling comma yields the nicest output:\n\tjsonDiff.useLongestToken = true;\n\n\tjsonDiff.tokenize = /*istanbul ignore start*/_line.lineDiff /*istanbul ignore end*/.tokenize;\n\tjsonDiff.castInput = function (value) {\n\t  /*istanbul ignore start*/var _options = /*istanbul ignore end*/this.options,\n\t      undefinedReplacement = _options.undefinedReplacement,\n\t      _options$stringifyRep = _options.stringifyReplacer,\n\t      stringifyReplacer = _options$stringifyRep === undefined ? function (k, v) /*istanbul ignore start*/{\n\t    return (/*istanbul ignore end*/typeof v === 'undefined' ? undefinedReplacement : v\n\t    );\n\t  } : _options$stringifyRep;\n\n\n\t  return typeof value === 'string' ? value : JSON.stringify(canonicalize(value, null, null, stringifyReplacer), stringifyReplacer, '  ');\n\t};\n\tjsonDiff.equals = function (left, right) {\n\t  return (/*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/.prototype.equals.call(jsonDiff, left.replace(/,([\\r\\n])/g, '$1'), right.replace(/,([\\r\\n])/g, '$1'))\n\t  );\n\t};\n\n\tfunction diffJson(oldObj, newObj, options) {\n\t  return jsonDiff.diff(oldObj, newObj, options);\n\t}\n\n\t// This function handles the presence of circular references by bailing out when encountering an\n\t// object that is already on the \"stack\" of items being processed. Accepts an optional replacer\n\tfunction canonicalize(obj, stack, replacementStack, replacer, key) {\n\t  stack = stack || [];\n\t  replacementStack = replacementStack || [];\n\n\t  if (replacer) {\n\t    obj = replacer(key, obj);\n\t  }\n\n\t  var i = /*istanbul ignore start*/void 0 /*istanbul ignore end*/;\n\n\t  for (i = 0; i < stack.length; i += 1) {\n\t    if (stack[i] === obj) {\n\t      return replacementStack[i];\n\t    }\n\t  }\n\n\t  var canonicalizedObj = /*istanbul ignore start*/void 0 /*istanbul ignore end*/;\n\n\t  if ('[object Array]' === objectPrototypeToString.call(obj)) {\n\t    stack.push(obj);\n\t    canonicalizedObj = new Array(obj.length);\n\t    replacementStack.push(canonicalizedObj);\n\t    for (i = 0; i < obj.length; i += 1) {\n\t      canonicalizedObj[i] = canonicalize(obj[i], stack, replacementStack, replacer, key);\n\t    }\n\t    stack.pop();\n\t    replacementStack.pop();\n\t    return canonicalizedObj;\n\t  }\n\n\t  if (obj && obj.toJSON) {\n\t    obj = obj.toJSON();\n\t  }\n\n\t  if ( /*istanbul ignore start*/(typeof /*istanbul ignore end*/obj === 'undefined' ? 'undefined' : _typeof(obj)) === 'object' && obj !== null) {\n\t    stack.push(obj);\n\t    canonicalizedObj = {};\n\t    replacementStack.push(canonicalizedObj);\n\t    var sortedKeys = [],\n\t        _key = /*istanbul ignore start*/void 0 /*istanbul ignore end*/;\n\t    for (_key in obj) {\n\t      /* istanbul ignore else */\n\t      if (obj.hasOwnProperty(_key)) {\n\t        sortedKeys.push(_key);\n\t      }\n\t    }\n\t    sortedKeys.sort();\n\t    for (i = 0; i < sortedKeys.length; i += 1) {\n\t      _key = sortedKeys[i];\n\t      canonicalizedObj[_key] = canonicalize(obj[_key], stack, replacementStack, replacer, _key);\n\t    }\n\t    stack.pop();\n\t    replacementStack.pop();\n\t  } else {\n\t    canonicalizedObj = obj;\n\t  }\n\t  return canonicalizedObj;\n\t}\n\t//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL2pzb24uanMiXSwibmFtZXMiOlsiZGlmZkpzb24iLCJjYW5vbmljYWxpemUiLCJvYmplY3RQcm90b3R5cGVUb1N0cmluZyIsIk9iamVjdCIsInByb3RvdHlwZSIsInRvU3RyaW5nIiwianNvbkRpZmYiLCJ1c2VMb25nZXN0VG9rZW4iLCJ0b2tlbml6ZSIsImNhc3RJbnB1dCIsInZhbHVlIiwib3B0aW9ucyIsInVuZGVmaW5lZFJlcGxhY2VtZW50Iiwic3RyaW5naWZ5UmVwbGFjZXIiLCJrIiwidiIsIkpTT04iLCJzdHJpbmdpZnkiLCJlcXVhbHMiLCJsZWZ0IiwicmlnaHQiLCJjYWxsIiwicmVwbGFjZSIsIm9sZE9iaiIsIm5ld09iaiIsImRpZmYiLCJvYmoiLCJzdGFjayIsInJlcGxhY2VtZW50U3RhY2siLCJyZXBsYWNlciIsImtleSIsImkiLCJsZW5ndGgiLCJjYW5vbmljYWxpemVkT2JqIiwicHVzaCIsIkFycmF5IiwicG9wIiwidG9KU09OIiwic29ydGVkS2V5cyIsImhhc093blByb3BlcnR5Iiwic29ydCJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztnQ0FxQmdCQSxRLEdBQUFBLFE7eURBSUFDLFksR0FBQUEsWTs7QUF6QmhCOzs7O3VCQUNBOzs7O3VCQUVBLElBQU1DLDBCQUEwQkMsT0FBT0MsU0FBUCxDQUFpQkMsUUFBakQ7O0FBR08sSUFBTUMsK0VBQVcsd0VBQWpCO0FBQ1A7QUFDQTtBQUNBQSxTQUFTQyxlQUFULEdBQTJCLElBQTNCOztBQUVBRCxTQUFTRSxRQUFULEdBQW9CLGdFQUFTQSxRQUE3QjtBQUNBRixTQUFTRyxTQUFULEdBQXFCLFVBQVNDLEtBQVQsRUFBZ0I7QUFBQSxpRUFDK0UsS0FBS0MsT0FEcEY7QUFBQSxNQUM1QkMsb0JBRDRCLFlBQzVCQSxvQkFENEI7QUFBQSx1Q0FDTkMsaUJBRE07QUFBQSxNQUNOQSxpQkFETSx5Q0FDYyxVQUFDQyxDQUFELEVBQUlDLENBQUo7QUFBQSxtQ0FBVSxPQUFPQSxDQUFQLEtBQWEsV0FBYixHQUEyQkgsb0JBQTNCLEdBQWtERztBQUE1RDtBQUFBLEdBRGQ7OztBQUduQyxTQUFPLE9BQU9MLEtBQVAsS0FBaUIsUUFBakIsR0FBNEJBLEtBQTVCLEdBQW9DTSxLQUFLQyxTQUFMLENBQWVoQixhQUFhUyxLQUFiLEVBQW9CLElBQXBCLEVBQTBCLElBQTFCLEVBQWdDRyxpQkFBaEMsQ0FBZixFQUFtRUEsaUJBQW5FLEVBQXNGLElBQXRGLENBQTNDO0FBQ0QsQ0FKRDtBQUtBUCxTQUFTWSxNQUFULEdBQWtCLFVBQVNDLElBQVQsRUFBZUMsS0FBZixFQUFzQjtBQUN0QyxTQUFPLG9FQUFLaEIsU0FBTCxDQUFlYyxNQUFmLENBQXNCRyxJQUF0QixDQUEyQmYsUUFBM0IsRUFBcUNhLEtBQUtHLE9BQUwsQ0FBYSxZQUFiLEVBQTJCLElBQTNCLENBQXJDLEVBQXVFRixNQUFNRSxPQUFOLENBQWMsWUFBZCxFQUE0QixJQUE1QixDQUF2RTtBQUFQO0FBQ0QsQ0FGRDs7QUFJTyxTQUFTdEIsUUFBVCxDQUFrQnVCLE1BQWxCLEVBQTBCQyxNQUExQixFQUFrQ2IsT0FBbEMsRUFBMkM7QUFBRSxTQUFPTCxTQUFTbUIsSUFBVCxDQUFjRixNQUFkLEVBQXNCQyxNQUF0QixFQUE4QmIsT0FBOUIsQ0FBUDtBQUFnRDs7QUFFcEc7QUFDQTtBQUNPLFNBQVNWLFlBQVQsQ0FBc0J5QixHQUF0QixFQUEyQkMsS0FBM0IsRUFBa0NDLGdCQUFsQyxFQUFvREMsUUFBcEQsRUFBOERDLEdBQTlELEVBQW1FO0FBQ3hFSCxVQUFRQSxTQUFTLEVBQWpCO0FBQ0FDLHFCQUFtQkEsb0JBQW9CLEVBQXZDOztBQUVBLE1BQUlDLFFBQUosRUFBYztBQUNaSCxVQUFNRyxTQUFTQyxHQUFULEVBQWNKLEdBQWQsQ0FBTjtBQUNEOztBQUVELE1BQUlLLG1DQUFKOztBQUVBLE9BQUtBLElBQUksQ0FBVCxFQUFZQSxJQUFJSixNQUFNSyxNQUF0QixFQUE4QkQsS0FBSyxDQUFuQyxFQUFzQztBQUNwQyxRQUFJSixNQUFNSSxDQUFOLE1BQWFMLEdBQWpCLEVBQXNCO0FBQ3BCLGFBQU9FLGlCQUFpQkcsQ0FBakIsQ0FBUDtBQUNEO0FBQ0Y7O0FBRUQsTUFBSUUsa0RBQUo7O0FBRUEsTUFBSSxxQkFBcUIvQix3QkFBd0JtQixJQUF4QixDQUE2QkssR0FBN0IsQ0FBekIsRUFBNEQ7QUFDMURDLFVBQU1PLElBQU4sQ0FBV1IsR0FBWDtBQUNBTyx1QkFBbUIsSUFBSUUsS0FBSixDQUFVVCxJQUFJTSxNQUFkLENBQW5CO0FBQ0FKLHFCQUFpQk0sSUFBakIsQ0FBc0JELGdCQUF0QjtBQUNBLFNBQUtGLElBQUksQ0FBVCxFQUFZQSxJQUFJTCxJQUFJTSxNQUFwQixFQUE0QkQsS0FBSyxDQUFqQyxFQUFvQztBQUNsQ0UsdUJBQWlCRixDQUFqQixJQUFzQjlCLGFBQWF5QixJQUFJSyxDQUFKLENBQWIsRUFBcUJKLEtBQXJCLEVBQTRCQyxnQkFBNUIsRUFBOENDLFFBQTlDLEVBQXdEQyxHQUF4RCxDQUF0QjtBQUNEO0FBQ0RILFVBQU1TLEdBQU47QUFDQVIscUJBQWlCUSxHQUFqQjtBQUNBLFdBQU9ILGdCQUFQO0FBQ0Q7O0FBRUQsTUFBSVAsT0FBT0EsSUFBSVcsTUFBZixFQUF1QjtBQUNyQlgsVUFBTUEsSUFBSVcsTUFBSixFQUFOO0FBQ0Q7O0FBRUQsTUFBSSx5REFBT1gsR0FBUCx5Q0FBT0EsR0FBUCxPQUFlLFFBQWYsSUFBMkJBLFFBQVEsSUFBdkMsRUFBNkM7QUFDM0NDLFVBQU1PLElBQU4sQ0FBV1IsR0FBWDtBQUNBTyx1QkFBbUIsRUFBbkI7QUFDQUwscUJBQWlCTSxJQUFqQixDQUFzQkQsZ0JBQXRCO0FBQ0EsUUFBSUssYUFBYSxFQUFqQjtBQUFBLFFBQ0lSLHNDQURKO0FBRUEsU0FBS0EsSUFBTCxJQUFZSixHQUFaLEVBQWlCO0FBQ2Y7QUFDQSxVQUFJQSxJQUFJYSxjQUFKLENBQW1CVCxJQUFuQixDQUFKLEVBQTZCO0FBQzNCUSxtQkFBV0osSUFBWCxDQUFnQkosSUFBaEI7QUFDRDtBQUNGO0FBQ0RRLGVBQVdFLElBQVg7QUFDQSxTQUFLVCxJQUFJLENBQVQsRUFBWUEsSUFBSU8sV0FBV04sTUFBM0IsRUFBbUNELEtBQUssQ0FBeEMsRUFBMkM7QUFDekNELGFBQU1RLFdBQVdQLENBQVgsQ0FBTjtBQUNBRSx1QkFBaUJILElBQWpCLElBQXdCN0IsYUFBYXlCLElBQUlJLElBQUosQ0FBYixFQUF1QkgsS0FBdkIsRUFBOEJDLGdCQUE5QixFQUFnREMsUUFBaEQsRUFBMERDLElBQTFELENBQXhCO0FBQ0Q7QUFDREgsVUFBTVMsR0FBTjtBQUNBUixxQkFBaUJRLEdBQWpCO0FBQ0QsR0FuQkQsTUFtQk87QUFDTEgsdUJBQW1CUCxHQUFuQjtBQUNEO0FBQ0QsU0FBT08sZ0JBQVA7QUFDRCIsImZpbGUiOiJqc29uLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IERpZmYgZnJvbSAnLi9iYXNlJztcbmltcG9ydCB7bGluZURpZmZ9IGZyb20gJy4vbGluZSc7XG5cbmNvbnN0IG9iamVjdFByb3RvdHlwZVRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuXG5leHBvcnQgY29uc3QganNvbkRpZmYgPSBuZXcgRGlmZigpO1xuLy8gRGlzY3JpbWluYXRlIGJldHdlZW4gdHdvIGxpbmVzIG9mIHByZXR0eS1wcmludGVkLCBzZXJpYWxpemVkIEpTT04gd2hlcmUgb25lIG9mIHRoZW0gaGFzIGFcbi8vIGRhbmdsaW5nIGNvbW1hIGFuZCB0aGUgb3RoZXIgZG9lc24ndC4gVHVybnMgb3V0IGluY2x1ZGluZyB0aGUgZGFuZ2xpbmcgY29tbWEgeWllbGRzIHRoZSBuaWNlc3Qgb3V0cHV0OlxuanNvbkRpZmYudXNlTG9uZ2VzdFRva2VuID0gdHJ1ZTtcblxuanNvbkRpZmYudG9rZW5pemUgPSBsaW5lRGlmZi50b2tlbml6ZTtcbmpzb25EaWZmLmNhc3RJbnB1dCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIGNvbnN0IHt1bmRlZmluZWRSZXBsYWNlbWVudCwgc3RyaW5naWZ5UmVwbGFjZXIgPSAoaywgdikgPT4gdHlwZW9mIHYgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkUmVwbGFjZW1lbnQgOiB2fSA9IHRoaXMub3B0aW9ucztcblxuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogSlNPTi5zdHJpbmdpZnkoY2Fub25pY2FsaXplKHZhbHVlLCBudWxsLCBudWxsLCBzdHJpbmdpZnlSZXBsYWNlciksIHN0cmluZ2lmeVJlcGxhY2VyLCAnICAnKTtcbn07XG5qc29uRGlmZi5lcXVhbHMgPSBmdW5jdGlvbihsZWZ0LCByaWdodCkge1xuICByZXR1cm4gRGlmZi5wcm90b3R5cGUuZXF1YWxzLmNhbGwoanNvbkRpZmYsIGxlZnQucmVwbGFjZSgvLChbXFxyXFxuXSkvZywgJyQxJyksIHJpZ2h0LnJlcGxhY2UoLywoW1xcclxcbl0pL2csICckMScpKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBkaWZmSnNvbihvbGRPYmosIG5ld09iaiwgb3B0aW9ucykgeyByZXR1cm4ganNvbkRpZmYuZGlmZihvbGRPYmosIG5ld09iaiwgb3B0aW9ucyk7IH1cblxuLy8gVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBwcmVzZW5jZSBvZiBjaXJjdWxhciByZWZlcmVuY2VzIGJ5IGJhaWxpbmcgb3V0IHdoZW4gZW5jb3VudGVyaW5nIGFuXG4vLyBvYmplY3QgdGhhdCBpcyBhbHJlYWR5IG9uIHRoZSBcInN0YWNrXCIgb2YgaXRlbXMgYmVpbmcgcHJvY2Vzc2VkLiBBY2NlcHRzIGFuIG9wdGlvbmFsIHJlcGxhY2VyXG5leHBvcnQgZnVuY3Rpb24gY2Fub25pY2FsaXplKG9iaiwgc3RhY2ssIHJlcGxhY2VtZW50U3RhY2ssIHJlcGxhY2VyLCBrZXkpIHtcbiAgc3RhY2sgPSBzdGFjayB8fCBbXTtcbiAgcmVwbGFjZW1lbnRTdGFjayA9IHJlcGxhY2VtZW50U3RhY2sgfHwgW107XG5cbiAgaWYgKHJlcGxhY2VyKSB7XG4gICAgb2JqID0gcmVwbGFjZXIoa2V5LCBvYmopO1xuICB9XG5cbiAgbGV0IGk7XG5cbiAgZm9yIChpID0gMDsgaSA8IHN0YWNrLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgaWYgKHN0YWNrW2ldID09PSBvYmopIHtcbiAgICAgIHJldHVybiByZXBsYWNlbWVudFN0YWNrW2ldO1xuICAgIH1cbiAgfVxuXG4gIGxldCBjYW5vbmljYWxpemVkT2JqO1xuXG4gIGlmICgnW29iamVjdCBBcnJheV0nID09PSBvYmplY3RQcm90b3R5cGVUb1N0cmluZy5jYWxsKG9iaikpIHtcbiAgICBzdGFjay5wdXNoKG9iaik7XG4gICAgY2Fub25pY2FsaXplZE9iaiA9IG5ldyBBcnJheShvYmoubGVuZ3RoKTtcbiAgICByZXBsYWNlbWVudFN0YWNrLnB1c2goY2Fub25pY2FsaXplZE9iaik7XG4gICAgZm9yIChpID0gMDsgaSA8IG9iai5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgY2Fub25pY2FsaXplZE9ialtpXSA9IGNhbm9uaWNhbGl6ZShvYmpbaV0sIHN0YWNrLCByZXBsYWNlbWVudFN0YWNrLCByZXBsYWNlciwga2V5KTtcbiAgICB9XG4gICAgc3RhY2sucG9wKCk7XG4gICAgcmVwbGFjZW1lbnRTdGFjay5wb3AoKTtcbiAgICByZXR1cm4gY2Fub25pY2FsaXplZE9iajtcbiAgfVxuXG4gIGlmIChvYmogJiYgb2JqLnRvSlNPTikge1xuICAgIG9iaiA9IG9iai50b0pTT04oKTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiBvYmogIT09IG51bGwpIHtcbiAgICBzdGFjay5wdXNoKG9iaik7XG4gICAgY2Fub25pY2FsaXplZE9iaiA9IHt9O1xuICAgIHJlcGxhY2VtZW50U3RhY2sucHVzaChjYW5vbmljYWxpemVkT2JqKTtcbiAgICBsZXQgc29ydGVkS2V5cyA9IFtdLFxuICAgICAgICBrZXk7XG4gICAgZm9yIChrZXkgaW4gb2JqKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIHNvcnRlZEtleXMucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgICBzb3J0ZWRLZXlzLnNvcnQoKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgc29ydGVkS2V5cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAga2V5ID0gc29ydGVkS2V5c1tpXTtcbiAgICAgIGNhbm9uaWNhbGl6ZWRPYmpba2V5XSA9IGNhbm9uaWNhbGl6ZShvYmpba2V5XSwgc3RhY2ssIHJlcGxhY2VtZW50U3RhY2ssIHJlcGxhY2VyLCBrZXkpO1xuICAgIH1cbiAgICBzdGFjay5wb3AoKTtcbiAgICByZXBsYWNlbWVudFN0YWNrLnBvcCgpO1xuICB9IGVsc2Uge1xuICAgIGNhbm9uaWNhbGl6ZWRPYmogPSBvYmo7XG4gIH1cbiAgcmV0dXJuIGNhbm9uaWNhbGl6ZWRPYmo7XG59XG4iXX0=\n\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*istanbul ignore start*/'use strict';\n\n\texports.__esModule = true;\n\texports.arrayDiff = undefined;\n\texports. /*istanbul ignore end*/diffArrays = diffArrays;\n\n\tvar /*istanbul ignore start*/_base = __webpack_require__(1) /*istanbul ignore end*/;\n\n\t/*istanbul ignore start*/var _base2 = _interopRequireDefault(_base);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n\t/*istanbul ignore end*/var arrayDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/arrayDiff = new /*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/();\n\tarrayDiff.tokenize = function (value) {\n\t  return value.slice();\n\t};\n\tarrayDiff.join = arrayDiff.removeEmpty = function (value) {\n\t  return value;\n\t};\n\n\tfunction diffArrays(oldArr, newArr, callback) {\n\t  return arrayDiff.diff(oldArr, newArr, callback);\n\t}\n\t//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL2FycmF5LmpzIl0sIm5hbWVzIjpbImRpZmZBcnJheXMiLCJhcnJheURpZmYiLCJ0b2tlbml6ZSIsInZhbHVlIiwic2xpY2UiLCJqb2luIiwicmVtb3ZlRW1wdHkiLCJvbGRBcnIiLCJuZXdBcnIiLCJjYWxsYmFjayIsImRpZmYiXSwibWFwcGluZ3MiOiI7Ozs7Z0NBVWdCQSxVLEdBQUFBLFU7O0FBVmhCOzs7Ozs7dUJBRU8sSUFBTUMsaUZBQVksd0VBQWxCO0FBQ1BBLFVBQVVDLFFBQVYsR0FBcUIsVUFBU0MsS0FBVCxFQUFnQjtBQUNuQyxTQUFPQSxNQUFNQyxLQUFOLEVBQVA7QUFDRCxDQUZEO0FBR0FILFVBQVVJLElBQVYsR0FBaUJKLFVBQVVLLFdBQVYsR0FBd0IsVUFBU0gsS0FBVCxFQUFnQjtBQUN2RCxTQUFPQSxLQUFQO0FBQ0QsQ0FGRDs7QUFJTyxTQUFTSCxVQUFULENBQW9CTyxNQUFwQixFQUE0QkMsTUFBNUIsRUFBb0NDLFFBQXBDLEVBQThDO0FBQUUsU0FBT1IsVUFBVVMsSUFBVixDQUFlSCxNQUFmLEVBQXVCQyxNQUF2QixFQUErQkMsUUFBL0IsQ0FBUDtBQUFrRCIsImZpbGUiOiJhcnJheS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBEaWZmIGZyb20gJy4vYmFzZSc7XG5cbmV4cG9ydCBjb25zdCBhcnJheURpZmYgPSBuZXcgRGlmZigpO1xuYXJyYXlEaWZmLnRva2VuaXplID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlLnNsaWNlKCk7XG59O1xuYXJyYXlEaWZmLmpvaW4gPSBhcnJheURpZmYucmVtb3ZlRW1wdHkgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWU7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZGlmZkFycmF5cyhvbGRBcnIsIG5ld0FyciwgY2FsbGJhY2spIHsgcmV0dXJuIGFycmF5RGlmZi5kaWZmKG9sZEFyciwgbmV3QXJyLCBjYWxsYmFjayk7IH1cbiJdfQ==\n\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*istanbul ignore start*/'use strict';\n\n\texports.__esModule = true;\n\texports. /*istanbul ignore end*/applyPatch = applyPatch;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/applyPatches = applyPatches;\n\n\tvar /*istanbul ignore start*/_parse = __webpack_require__(11) /*istanbul ignore end*/;\n\n\tvar /*istanbul ignore start*/_distanceIterator = __webpack_require__(12) /*istanbul ignore end*/;\n\n\t/*istanbul ignore start*/var _distanceIterator2 = _interopRequireDefault(_distanceIterator);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n\t/*istanbul ignore end*/function applyPatch(source, uniDiff) {\n\t  /*istanbul ignore start*/var /*istanbul ignore end*/options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n\t  if (typeof uniDiff === 'string') {\n\t    uniDiff = /*istanbul ignore start*/(0, _parse.parsePatch) /*istanbul ignore end*/(uniDiff);\n\t  }\n\n\t  if (Array.isArray(uniDiff)) {\n\t    if (uniDiff.length > 1) {\n\t      throw new Error('applyPatch only works with a single input.');\n\t    }\n\n\t    uniDiff = uniDiff[0];\n\t  }\n\n\t  // Apply the diff to the input\n\t  var lines = source.split(/\\r\\n|[\\n\\v\\f\\r\\x85]/),\n\t      delimiters = source.match(/\\r\\n|[\\n\\v\\f\\r\\x85]/g) || [],\n\t      hunks = uniDiff.hunks,\n\t      compareLine = options.compareLine || function (lineNumber, line, operation, patchContent) /*istanbul ignore start*/{\n\t    return (/*istanbul ignore end*/line === patchContent\n\t    );\n\t  },\n\t      errorCount = 0,\n\t      fuzzFactor = options.fuzzFactor || 0,\n\t      minLine = 0,\n\t      offset = 0,\n\t      removeEOFNL = /*istanbul ignore start*/void 0 /*istanbul ignore end*/,\n\t      addEOFNL = /*istanbul ignore start*/void 0 /*istanbul ignore end*/;\n\n\t  /**\n\t   * Checks if the hunk exactly fits on the provided location\n\t   */\n\t  function hunkFits(hunk, toPos) {\n\t    for (var j = 0; j < hunk.lines.length; j++) {\n\t      var line = hunk.lines[j],\n\t          operation = line.length > 0 ? line[0] : ' ',\n\t          content = line.length > 0 ? line.substr(1) : line;\n\n\t      if (operation === ' ' || operation === '-') {\n\t        // Context sanity check\n\t        if (!compareLine(toPos + 1, lines[toPos], operation, content)) {\n\t          errorCount++;\n\n\t          if (errorCount > fuzzFactor) {\n\t            return false;\n\t          }\n\t        }\n\t        toPos++;\n\t      }\n\t    }\n\n\t    return true;\n\t  }\n\n\t  // Search best fit offsets for each hunk based on the previous ones\n\t  for (var i = 0; i < hunks.length; i++) {\n\t    var hunk = hunks[i],\n\t        maxLine = lines.length - hunk.oldLines,\n\t        localOffset = 0,\n\t        toPos = offset + hunk.oldStart - 1;\n\n\t    var iterator = /*istanbul ignore start*/(0, _distanceIterator2['default']) /*istanbul ignore end*/(toPos, minLine, maxLine);\n\n\t    for (; localOffset !== undefined; localOffset = iterator()) {\n\t      if (hunkFits(hunk, toPos + localOffset)) {\n\t        hunk.offset = offset += localOffset;\n\t        break;\n\t      }\n\t    }\n\n\t    if (localOffset === undefined) {\n\t      return false;\n\t    }\n\n\t    // Set lower text limit to end of the current hunk, so next ones don't try\n\t    // to fit over already patched text\n\t    minLine = hunk.offset + hunk.oldStart + hunk.oldLines;\n\t  }\n\n\t  // Apply patch hunks\n\t  var diffOffset = 0;\n\t  for (var _i = 0; _i < hunks.length; _i++) {\n\t    var _hunk = hunks[_i],\n\t        _toPos = _hunk.oldStart + _hunk.offset + diffOffset - 1;\n\t    diffOffset += _hunk.newLines - _hunk.oldLines;\n\n\t    if (_toPos < 0) {\n\t      // Creating a new file\n\t      _toPos = 0;\n\t    }\n\n\t    for (var j = 0; j < _hunk.lines.length; j++) {\n\t      var line = _hunk.lines[j],\n\t          operation = line.length > 0 ? line[0] : ' ',\n\t          content = line.length > 0 ? line.substr(1) : line,\n\t          delimiter = _hunk.linedelimiters[j];\n\n\t      if (operation === ' ') {\n\t        _toPos++;\n\t      } else if (operation === '-') {\n\t        lines.splice(_toPos, 1);\n\t        delimiters.splice(_toPos, 1);\n\t        /* istanbul ignore else */\n\t      } else if (operation === '+') {\n\t        lines.splice(_toPos, 0, content);\n\t        delimiters.splice(_toPos, 0, delimiter);\n\t        _toPos++;\n\t      } else if (operation === '\\\\') {\n\t        var previousOperation = _hunk.lines[j - 1] ? _hunk.lines[j - 1][0] : null;\n\t        if (previousOperation === '+') {\n\t          removeEOFNL = true;\n\t        } else if (previousOperation === '-') {\n\t          addEOFNL = true;\n\t        }\n\t      }\n\t    }\n\t  }\n\n\t  // Handle EOFNL insertion/removal\n\t  if (removeEOFNL) {\n\t    while (!lines[lines.length - 1]) {\n\t      lines.pop();\n\t      delimiters.pop();\n\t    }\n\t  } else if (addEOFNL) {\n\t    lines.push('');\n\t    delimiters.push('\\n');\n\t  }\n\t  for (var _k = 0; _k < lines.length - 1; _k++) {\n\t    lines[_k] = lines[_k] + delimiters[_k];\n\t  }\n\t  return lines.join('');\n\t}\n\n\t// Wrapper that supports multiple file patches via callbacks.\n\tfunction applyPatches(uniDiff, options) {\n\t  if (typeof uniDiff === 'string') {\n\t    uniDiff = /*istanbul ignore start*/(0, _parse.parsePatch) /*istanbul ignore end*/(uniDiff);\n\t  }\n\n\t  var currentIndex = 0;\n\t  function processIndex() {\n\t    var index = uniDiff[currentIndex++];\n\t    if (!index) {\n\t      return options.complete();\n\t    }\n\n\t    options.loadFile(index, function (err, data) {\n\t      if (err) {\n\t        return options.complete(err);\n\t      }\n\n\t      var updatedContent = applyPatch(data, index, options);\n\t      options.patched(index, updatedContent, function (err) {\n\t        if (err) {\n\t          return options.complete(err);\n\t        }\n\n\t        processIndex();\n\t      });\n\t    });\n\t  }\n\t  processIndex();\n\t}\n\t//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXRjaC9hcHBseS5qcyJdLCJuYW1lcyI6WyJhcHBseVBhdGNoIiwiYXBwbHlQYXRjaGVzIiwic291cmNlIiwidW5pRGlmZiIsIm9wdGlvbnMiLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJFcnJvciIsImxpbmVzIiwic3BsaXQiLCJkZWxpbWl0ZXJzIiwibWF0Y2giLCJodW5rcyIsImNvbXBhcmVMaW5lIiwibGluZU51bWJlciIsImxpbmUiLCJvcGVyYXRpb24iLCJwYXRjaENvbnRlbnQiLCJlcnJvckNvdW50IiwiZnV6ekZhY3RvciIsIm1pbkxpbmUiLCJvZmZzZXQiLCJyZW1vdmVFT0ZOTCIsImFkZEVPRk5MIiwiaHVua0ZpdHMiLCJodW5rIiwidG9Qb3MiLCJqIiwiY29udGVudCIsInN1YnN0ciIsImkiLCJtYXhMaW5lIiwib2xkTGluZXMiLCJsb2NhbE9mZnNldCIsIm9sZFN0YXJ0IiwiaXRlcmF0b3IiLCJ1bmRlZmluZWQiLCJkaWZmT2Zmc2V0IiwibmV3TGluZXMiLCJkZWxpbWl0ZXIiLCJsaW5lZGVsaW1pdGVycyIsInNwbGljZSIsInByZXZpb3VzT3BlcmF0aW9uIiwicG9wIiwicHVzaCIsIl9rIiwiam9pbiIsImN1cnJlbnRJbmRleCIsInByb2Nlc3NJbmRleCIsImluZGV4IiwiY29tcGxldGUiLCJsb2FkRmlsZSIsImVyciIsImRhdGEiLCJ1cGRhdGVkQ29udGVudCIsInBhdGNoZWQiXSwibWFwcGluZ3MiOiI7OztnQ0FHZ0JBLFUsR0FBQUEsVTt5REFvSUFDLFksR0FBQUEsWTs7QUF2SWhCOztBQUNBOzs7Ozs7dUJBRU8sU0FBU0QsVUFBVCxDQUFvQkUsTUFBcEIsRUFBNEJDLE9BQTVCLEVBQW1EO0FBQUEsc0RBQWRDLE9BQWMsdUVBQUosRUFBSTs7QUFDeEQsTUFBSSxPQUFPRCxPQUFQLEtBQW1CLFFBQXZCLEVBQWlDO0FBQy9CQSxjQUFVLHdFQUFXQSxPQUFYLENBQVY7QUFDRDs7QUFFRCxNQUFJRSxNQUFNQyxPQUFOLENBQWNILE9BQWQsQ0FBSixFQUE0QjtBQUMxQixRQUFJQSxRQUFRSSxNQUFSLEdBQWlCLENBQXJCLEVBQXdCO0FBQ3RCLFlBQU0sSUFBSUMsS0FBSixDQUFVLDRDQUFWLENBQU47QUFDRDs7QUFFREwsY0FBVUEsUUFBUSxDQUFSLENBQVY7QUFDRDs7QUFFRDtBQUNBLE1BQUlNLFFBQVFQLE9BQU9RLEtBQVAsQ0FBYSxxQkFBYixDQUFaO0FBQUEsTUFDSUMsYUFBYVQsT0FBT1UsS0FBUCxDQUFhLHNCQUFiLEtBQXdDLEVBRHpEO0FBQUEsTUFFSUMsUUFBUVYsUUFBUVUsS0FGcEI7QUFBQSxNQUlJQyxjQUFjVixRQUFRVSxXQUFSLElBQXdCLFVBQUNDLFVBQUQsRUFBYUMsSUFBYixFQUFtQkMsU0FBbkIsRUFBOEJDLFlBQTlCO0FBQUEsbUNBQStDRixTQUFTRTtBQUF4RDtBQUFBLEdBSjFDO0FBQUEsTUFLSUMsYUFBYSxDQUxqQjtBQUFBLE1BTUlDLGFBQWFoQixRQUFRZ0IsVUFBUixJQUFzQixDQU52QztBQUFBLE1BT0lDLFVBQVUsQ0FQZDtBQUFBLE1BUUlDLFNBQVMsQ0FSYjtBQUFBLE1BVUlDLDZDQVZKO0FBQUEsTUFXSUMsMENBWEo7O0FBYUE7OztBQUdBLFdBQVNDLFFBQVQsQ0FBa0JDLElBQWxCLEVBQXdCQyxLQUF4QixFQUErQjtBQUM3QixTQUFLLElBQUlDLElBQUksQ0FBYixFQUFnQkEsSUFBSUYsS0FBS2pCLEtBQUwsQ0FBV0YsTUFBL0IsRUFBdUNxQixHQUF2QyxFQUE0QztBQUMxQyxVQUFJWixPQUFPVSxLQUFLakIsS0FBTCxDQUFXbUIsQ0FBWCxDQUFYO0FBQUEsVUFDSVgsWUFBYUQsS0FBS1QsTUFBTCxHQUFjLENBQWQsR0FBa0JTLEtBQUssQ0FBTCxDQUFsQixHQUE0QixHQUQ3QztBQUFBLFVBRUlhLFVBQVdiLEtBQUtULE1BQUwsR0FBYyxDQUFkLEdBQWtCUyxLQUFLYyxNQUFMLENBQVksQ0FBWixDQUFsQixHQUFtQ2QsSUFGbEQ7O0FBSUEsVUFBSUMsY0FBYyxHQUFkLElBQXFCQSxjQUFjLEdBQXZDLEVBQTRDO0FBQzFDO0FBQ0EsWUFBSSxDQUFDSCxZQUFZYSxRQUFRLENBQXBCLEVBQXVCbEIsTUFBTWtCLEtBQU4sQ0FBdkIsRUFBcUNWLFNBQXJDLEVBQWdEWSxPQUFoRCxDQUFMLEVBQStEO0FBQzdEVjs7QUFFQSxjQUFJQSxhQUFhQyxVQUFqQixFQUE2QjtBQUMzQixtQkFBTyxLQUFQO0FBQ0Q7QUFDRjtBQUNETztBQUNEO0FBQ0Y7O0FBRUQsV0FBTyxJQUFQO0FBQ0Q7O0FBRUQ7QUFDQSxPQUFLLElBQUlJLElBQUksQ0FBYixFQUFnQkEsSUFBSWxCLE1BQU1OLE1BQTFCLEVBQWtDd0IsR0FBbEMsRUFBdUM7QUFDckMsUUFBSUwsT0FBT2IsTUFBTWtCLENBQU4sQ0FBWDtBQUFBLFFBQ0lDLFVBQVV2QixNQUFNRixNQUFOLEdBQWVtQixLQUFLTyxRQURsQztBQUFBLFFBRUlDLGNBQWMsQ0FGbEI7QUFBQSxRQUdJUCxRQUFRTCxTQUFTSSxLQUFLUyxRQUFkLEdBQXlCLENBSHJDOztBQUtBLFFBQUlDLFdBQVcsb0ZBQWlCVCxLQUFqQixFQUF3Qk4sT0FBeEIsRUFBaUNXLE9BQWpDLENBQWY7O0FBRUEsV0FBT0UsZ0JBQWdCRyxTQUF2QixFQUFrQ0gsY0FBY0UsVUFBaEQsRUFBNEQ7QUFDMUQsVUFBSVgsU0FBU0MsSUFBVCxFQUFlQyxRQUFRTyxXQUF2QixDQUFKLEVBQXlDO0FBQ3ZDUixhQUFLSixNQUFMLEdBQWNBLFVBQVVZLFdBQXhCO0FBQ0E7QUFDRDtBQUNGOztBQUVELFFBQUlBLGdCQUFnQkcsU0FBcEIsRUFBK0I7QUFDN0IsYUFBTyxLQUFQO0FBQ0Q7O0FBRUQ7QUFDQTtBQUNBaEIsY0FBVUssS0FBS0osTUFBTCxHQUFjSSxLQUFLUyxRQUFuQixHQUE4QlQsS0FBS08sUUFBN0M7QUFDRDs7QUFFRDtBQUNBLE1BQUlLLGFBQWEsQ0FBakI7QUFDQSxPQUFLLElBQUlQLEtBQUksQ0FBYixFQUFnQkEsS0FBSWxCLE1BQU1OLE1BQTFCLEVBQWtDd0IsSUFBbEMsRUFBdUM7QUFDckMsUUFBSUwsUUFBT2IsTUFBTWtCLEVBQU4sQ0FBWDtBQUFBLFFBQ0lKLFNBQVFELE1BQUtTLFFBQUwsR0FBZ0JULE1BQUtKLE1BQXJCLEdBQThCZ0IsVUFBOUIsR0FBMkMsQ0FEdkQ7QUFFQUEsa0JBQWNaLE1BQUthLFFBQUwsR0FBZ0JiLE1BQUtPLFFBQW5DOztBQUVBLFFBQUlOLFNBQVEsQ0FBWixFQUFlO0FBQUU7QUFDZkEsZUFBUSxDQUFSO0FBQ0Q7O0FBRUQsU0FBSyxJQUFJQyxJQUFJLENBQWIsRUFBZ0JBLElBQUlGLE1BQUtqQixLQUFMLENBQVdGLE1BQS9CLEVBQXVDcUIsR0FBdkMsRUFBNEM7QUFDMUMsVUFBSVosT0FBT1UsTUFBS2pCLEtBQUwsQ0FBV21CLENBQVgsQ0FBWDtBQUFBLFVBQ0lYLFlBQWFELEtBQUtULE1BQUwsR0FBYyxDQUFkLEdBQWtCUyxLQUFLLENBQUwsQ0FBbEIsR0FBNEIsR0FEN0M7QUFBQSxVQUVJYSxVQUFXYixLQUFLVCxNQUFMLEdBQWMsQ0FBZCxHQUFrQlMsS0FBS2MsTUFBTCxDQUFZLENBQVosQ0FBbEIsR0FBbUNkLElBRmxEO0FBQUEsVUFHSXdCLFlBQVlkLE1BQUtlLGNBQUwsQ0FBb0JiLENBQXBCLENBSGhCOztBQUtBLFVBQUlYLGNBQWMsR0FBbEIsRUFBdUI7QUFDckJVO0FBQ0QsT0FGRCxNQUVPLElBQUlWLGNBQWMsR0FBbEIsRUFBdUI7QUFDNUJSLGNBQU1pQyxNQUFOLENBQWFmLE1BQWIsRUFBb0IsQ0FBcEI7QUFDQWhCLG1CQUFXK0IsTUFBWCxDQUFrQmYsTUFBbEIsRUFBeUIsQ0FBekI7QUFDRjtBQUNDLE9BSk0sTUFJQSxJQUFJVixjQUFjLEdBQWxCLEVBQXVCO0FBQzVCUixjQUFNaUMsTUFBTixDQUFhZixNQUFiLEVBQW9CLENBQXBCLEVBQXVCRSxPQUF2QjtBQUNBbEIsbUJBQVcrQixNQUFYLENBQWtCZixNQUFsQixFQUF5QixDQUF6QixFQUE0QmEsU0FBNUI7QUFDQWI7QUFDRCxPQUpNLE1BSUEsSUFBSVYsY0FBYyxJQUFsQixFQUF3QjtBQUM3QixZQUFJMEIsb0JBQW9CakIsTUFBS2pCLEtBQUwsQ0FBV21CLElBQUksQ0FBZixJQUFvQkYsTUFBS2pCLEtBQUwsQ0FBV21CLElBQUksQ0FBZixFQUFrQixDQUFsQixDQUFwQixHQUEyQyxJQUFuRTtBQUNBLFlBQUllLHNCQUFzQixHQUExQixFQUErQjtBQUM3QnBCLHdCQUFjLElBQWQ7QUFDRCxTQUZELE1BRU8sSUFBSW9CLHNCQUFzQixHQUExQixFQUErQjtBQUNwQ25CLHFCQUFXLElBQVg7QUFDRDtBQUNGO0FBQ0Y7QUFDRjs7QUFFRDtBQUNBLE1BQUlELFdBQUosRUFBaUI7QUFDZixXQUFPLENBQUNkLE1BQU1BLE1BQU1GLE1BQU4sR0FBZSxDQUFyQixDQUFSLEVBQWlDO0FBQy9CRSxZQUFNbUMsR0FBTjtBQUNBakMsaUJBQVdpQyxHQUFYO0FBQ0Q7QUFDRixHQUxELE1BS08sSUFBSXBCLFFBQUosRUFBYztBQUNuQmYsVUFBTW9DLElBQU4sQ0FBVyxFQUFYO0FBQ0FsQyxlQUFXa0MsSUFBWCxDQUFnQixJQUFoQjtBQUNEO0FBQ0QsT0FBSyxJQUFJQyxLQUFLLENBQWQsRUFBaUJBLEtBQUtyQyxNQUFNRixNQUFOLEdBQWUsQ0FBckMsRUFBd0N1QyxJQUF4QyxFQUE4QztBQUM1Q3JDLFVBQU1xQyxFQUFOLElBQVlyQyxNQUFNcUMsRUFBTixJQUFZbkMsV0FBV21DLEVBQVgsQ0FBeEI7QUFDRDtBQUNELFNBQU9yQyxNQUFNc0MsSUFBTixDQUFXLEVBQVgsQ0FBUDtBQUNEOztBQUVEO0FBQ08sU0FBUzlDLFlBQVQsQ0FBc0JFLE9BQXRCLEVBQStCQyxPQUEvQixFQUF3QztBQUM3QyxNQUFJLE9BQU9ELE9BQVAsS0FBbUIsUUFBdkIsRUFBaUM7QUFDL0JBLGNBQVUsd0VBQVdBLE9BQVgsQ0FBVjtBQUNEOztBQUVELE1BQUk2QyxlQUFlLENBQW5CO0FBQ0EsV0FBU0MsWUFBVCxHQUF3QjtBQUN0QixRQUFJQyxRQUFRL0MsUUFBUTZDLGNBQVIsQ0FBWjtBQUNBLFFBQUksQ0FBQ0UsS0FBTCxFQUFZO0FBQ1YsYUFBTzlDLFFBQVErQyxRQUFSLEVBQVA7QUFDRDs7QUFFRC9DLFlBQVFnRCxRQUFSLENBQWlCRixLQUFqQixFQUF3QixVQUFTRyxHQUFULEVBQWNDLElBQWQsRUFBb0I7QUFDMUMsVUFBSUQsR0FBSixFQUFTO0FBQ1AsZUFBT2pELFFBQVErQyxRQUFSLENBQWlCRSxHQUFqQixDQUFQO0FBQ0Q7O0FBRUQsVUFBSUUsaUJBQWlCdkQsV0FBV3NELElBQVgsRUFBaUJKLEtBQWpCLEVBQXdCOUMsT0FBeEIsQ0FBckI7QUFDQUEsY0FBUW9ELE9BQVIsQ0FBZ0JOLEtBQWhCLEVBQXVCSyxjQUF2QixFQUF1QyxVQUFTRixHQUFULEVBQWM7QUFDbkQsWUFBSUEsR0FBSixFQUFTO0FBQ1AsaUJBQU9qRCxRQUFRK0MsUUFBUixDQUFpQkUsR0FBakIsQ0FBUDtBQUNEOztBQUVESjtBQUNELE9BTkQ7QUFPRCxLQWJEO0FBY0Q7QUFDREE7QUFDRCIsImZpbGUiOiJhcHBseS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7cGFyc2VQYXRjaH0gZnJvbSAnLi9wYXJzZSc7XG5pbXBvcnQgZGlzdGFuY2VJdGVyYXRvciBmcm9tICcuLi91dGlsL2Rpc3RhbmNlLWl0ZXJhdG9yJztcblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UGF0Y2goc291cmNlLCB1bmlEaWZmLCBvcHRpb25zID0ge30pIHtcbiAgaWYgKHR5cGVvZiB1bmlEaWZmID09PSAnc3RyaW5nJykge1xuICAgIHVuaURpZmYgPSBwYXJzZVBhdGNoKHVuaURpZmYpO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodW5pRGlmZikpIHtcbiAgICBpZiAodW5pRGlmZi5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FwcGx5UGF0Y2ggb25seSB3b3JrcyB3aXRoIGEgc2luZ2xlIGlucHV0LicpO1xuICAgIH1cblxuICAgIHVuaURpZmYgPSB1bmlEaWZmWzBdO1xuICB9XG5cbiAgLy8gQXBwbHkgdGhlIGRpZmYgdG8gdGhlIGlucHV0XG4gIGxldCBsaW5lcyA9IHNvdXJjZS5zcGxpdCgvXFxyXFxufFtcXG5cXHZcXGZcXHJcXHg4NV0vKSxcbiAgICAgIGRlbGltaXRlcnMgPSBzb3VyY2UubWF0Y2goL1xcclxcbnxbXFxuXFx2XFxmXFxyXFx4ODVdL2cpIHx8IFtdLFxuICAgICAgaHVua3MgPSB1bmlEaWZmLmh1bmtzLFxuXG4gICAgICBjb21wYXJlTGluZSA9IG9wdGlvbnMuY29tcGFyZUxpbmUgfHwgKChsaW5lTnVtYmVyLCBsaW5lLCBvcGVyYXRpb24sIHBhdGNoQ29udGVudCkgPT4gbGluZSA9PT0gcGF0Y2hDb250ZW50KSxcbiAgICAgIGVycm9yQ291bnQgPSAwLFxuICAgICAgZnV6ekZhY3RvciA9IG9wdGlvbnMuZnV6ekZhY3RvciB8fCAwLFxuICAgICAgbWluTGluZSA9IDAsXG4gICAgICBvZmZzZXQgPSAwLFxuXG4gICAgICByZW1vdmVFT0ZOTCxcbiAgICAgIGFkZEVPRk5MO1xuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGh1bmsgZXhhY3RseSBmaXRzIG9uIHRoZSBwcm92aWRlZCBsb2NhdGlvblxuICAgKi9cbiAgZnVuY3Rpb24gaHVua0ZpdHMoaHVuaywgdG9Qb3MpIHtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGh1bmsubGluZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGxldCBsaW5lID0gaHVuay5saW5lc1tqXSxcbiAgICAgICAgICBvcGVyYXRpb24gPSAobGluZS5sZW5ndGggPiAwID8gbGluZVswXSA6ICcgJyksXG4gICAgICAgICAgY29udGVudCA9IChsaW5lLmxlbmd0aCA+IDAgPyBsaW5lLnN1YnN0cigxKSA6IGxpbmUpO1xuXG4gICAgICBpZiAob3BlcmF0aW9uID09PSAnICcgfHwgb3BlcmF0aW9uID09PSAnLScpIHtcbiAgICAgICAgLy8gQ29udGV4dCBzYW5pdHkgY2hlY2tcbiAgICAgICAgaWYgKCFjb21wYXJlTGluZSh0b1BvcyArIDEsIGxpbmVzW3RvUG9zXSwgb3BlcmF0aW9uLCBjb250ZW50KSkge1xuICAgICAgICAgIGVycm9yQ291bnQrKztcblxuICAgICAgICAgIGlmIChlcnJvckNvdW50ID4gZnV6ekZhY3Rvcikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0b1BvcysrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gU2VhcmNoIGJlc3QgZml0IG9mZnNldHMgZm9yIGVhY2ggaHVuayBiYXNlZCBvbiB0aGUgcHJldmlvdXMgb25lc1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGh1bmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IGh1bmsgPSBodW5rc1tpXSxcbiAgICAgICAgbWF4TGluZSA9IGxpbmVzLmxlbmd0aCAtIGh1bmsub2xkTGluZXMsXG4gICAgICAgIGxvY2FsT2Zmc2V0ID0gMCxcbiAgICAgICAgdG9Qb3MgPSBvZmZzZXQgKyBodW5rLm9sZFN0YXJ0IC0gMTtcblxuICAgIGxldCBpdGVyYXRvciA9IGRpc3RhbmNlSXRlcmF0b3IodG9Qb3MsIG1pbkxpbmUsIG1heExpbmUpO1xuXG4gICAgZm9yICg7IGxvY2FsT2Zmc2V0ICE9PSB1bmRlZmluZWQ7IGxvY2FsT2Zmc2V0ID0gaXRlcmF0b3IoKSkge1xuICAgICAgaWYgKGh1bmtGaXRzKGh1bmssIHRvUG9zICsgbG9jYWxPZmZzZXQpKSB7XG4gICAgICAgIGh1bmsub2Zmc2V0ID0gb2Zmc2V0ICs9IGxvY2FsT2Zmc2V0O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobG9jYWxPZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFNldCBsb3dlciB0ZXh0IGxpbWl0IHRvIGVuZCBvZiB0aGUgY3VycmVudCBodW5rLCBzbyBuZXh0IG9uZXMgZG9uJ3QgdHJ5XG4gICAgLy8gdG8gZml0IG92ZXIgYWxyZWFkeSBwYXRjaGVkIHRleHRcbiAgICBtaW5MaW5lID0gaHVuay5vZmZzZXQgKyBodW5rLm9sZFN0YXJ0ICsgaHVuay5vbGRMaW5lcztcbiAgfVxuXG4gIC8vIEFwcGx5IHBhdGNoIGh1bmtzXG4gIGxldCBkaWZmT2Zmc2V0ID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBodW5rcy5sZW5ndGg7IGkrKykge1xuICAgIGxldCBodW5rID0gaHVua3NbaV0sXG4gICAgICAgIHRvUG9zID0gaHVuay5vbGRTdGFydCArIGh1bmsub2Zmc2V0ICsgZGlmZk9mZnNldCAtIDE7XG4gICAgZGlmZk9mZnNldCArPSBodW5rLm5ld0xpbmVzIC0gaHVuay5vbGRMaW5lcztcblxuICAgIGlmICh0b1BvcyA8IDApIHsgLy8gQ3JlYXRpbmcgYSBuZXcgZmlsZVxuICAgICAgdG9Qb3MgPSAwO1xuICAgIH1cblxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgaHVuay5saW5lcy5sZW5ndGg7IGorKykge1xuICAgICAgbGV0IGxpbmUgPSBodW5rLmxpbmVzW2pdLFxuICAgICAgICAgIG9wZXJhdGlvbiA9IChsaW5lLmxlbmd0aCA+IDAgPyBsaW5lWzBdIDogJyAnKSxcbiAgICAgICAgICBjb250ZW50ID0gKGxpbmUubGVuZ3RoID4gMCA/IGxpbmUuc3Vic3RyKDEpIDogbGluZSksXG4gICAgICAgICAgZGVsaW1pdGVyID0gaHVuay5saW5lZGVsaW1pdGVyc1tqXTtcblxuICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJyAnKSB7XG4gICAgICAgIHRvUG9zKys7XG4gICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJy0nKSB7XG4gICAgICAgIGxpbmVzLnNwbGljZSh0b1BvcywgMSk7XG4gICAgICAgIGRlbGltaXRlcnMuc3BsaWNlKHRvUG9zLCAxKTtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJysnKSB7XG4gICAgICAgIGxpbmVzLnNwbGljZSh0b1BvcywgMCwgY29udGVudCk7XG4gICAgICAgIGRlbGltaXRlcnMuc3BsaWNlKHRvUG9zLCAwLCBkZWxpbWl0ZXIpO1xuICAgICAgICB0b1BvcysrO1xuICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gPT09ICdcXFxcJykge1xuICAgICAgICBsZXQgcHJldmlvdXNPcGVyYXRpb24gPSBodW5rLmxpbmVzW2ogLSAxXSA/IGh1bmsubGluZXNbaiAtIDFdWzBdIDogbnVsbDtcbiAgICAgICAgaWYgKHByZXZpb3VzT3BlcmF0aW9uID09PSAnKycpIHtcbiAgICAgICAgICByZW1vdmVFT0ZOTCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAocHJldmlvdXNPcGVyYXRpb24gPT09ICctJykge1xuICAgICAgICAgIGFkZEVPRk5MID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEhhbmRsZSBFT0ZOTCBpbnNlcnRpb24vcmVtb3ZhbFxuICBpZiAocmVtb3ZlRU9GTkwpIHtcbiAgICB3aGlsZSAoIWxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdKSB7XG4gICAgICBsaW5lcy5wb3AoKTtcbiAgICAgIGRlbGltaXRlcnMucG9wKCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGFkZEVPRk5MKSB7XG4gICAgbGluZXMucHVzaCgnJyk7XG4gICAgZGVsaW1pdGVycy5wdXNoKCdcXG4nKTtcbiAgfVxuICBmb3IgKGxldCBfayA9IDA7IF9rIDwgbGluZXMubGVuZ3RoIC0gMTsgX2srKykge1xuICAgIGxpbmVzW19rXSA9IGxpbmVzW19rXSArIGRlbGltaXRlcnNbX2tdO1xuICB9XG4gIHJldHVybiBsaW5lcy5qb2luKCcnKTtcbn1cblxuLy8gV3JhcHBlciB0aGF0IHN1cHBvcnRzIG11bHRpcGxlIGZpbGUgcGF0Y2hlcyB2aWEgY2FsbGJhY2tzLlxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UGF0Y2hlcyh1bmlEaWZmLCBvcHRpb25zKSB7XG4gIGlmICh0eXBlb2YgdW5pRGlmZiA9PT0gJ3N0cmluZycpIHtcbiAgICB1bmlEaWZmID0gcGFyc2VQYXRjaCh1bmlEaWZmKTtcbiAgfVxuXG4gIGxldCBjdXJyZW50SW5kZXggPSAwO1xuICBmdW5jdGlvbiBwcm9jZXNzSW5kZXgoKSB7XG4gICAgbGV0IGluZGV4ID0gdW5pRGlmZltjdXJyZW50SW5kZXgrK107XG4gICAgaWYgKCFpbmRleCkge1xuICAgICAgcmV0dXJuIG9wdGlvbnMuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICBvcHRpb25zLmxvYWRGaWxlKGluZGV4LCBmdW5jdGlvbihlcnIsIGRhdGEpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMuY29tcGxldGUoZXJyKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHVwZGF0ZWRDb250ZW50ID0gYXBwbHlQYXRjaChkYXRhLCBpbmRleCwgb3B0aW9ucyk7XG4gICAgICBvcHRpb25zLnBhdGNoZWQoaW5kZXgsIHVwZGF0ZWRDb250ZW50LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJldHVybiBvcHRpb25zLmNvbXBsZXRlKGVycik7XG4gICAgICAgIH1cblxuICAgICAgICBwcm9jZXNzSW5kZXgoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIHByb2Nlc3NJbmRleCgpO1xufVxuIl19\n\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports) {\n\n\t/*istanbul ignore start*/'use strict';\n\n\texports.__esModule = true;\n\texports. /*istanbul ignore end*/parsePatch = parsePatch;\n\tfunction parsePatch(uniDiff) {\n\t  /*istanbul ignore start*/var /*istanbul ignore end*/options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\t  var diffstr = uniDiff.split(/\\r\\n|[\\n\\v\\f\\r\\x85]/),\n\t      delimiters = uniDiff.match(/\\r\\n|[\\n\\v\\f\\r\\x85]/g) || [],\n\t      list = [],\n\t      i = 0;\n\n\t  function parseIndex() {\n\t    var index = {};\n\t    list.push(index);\n\n\t    // Parse diff metadata\n\t    while (i < diffstr.length) {\n\t      var line = diffstr[i];\n\n\t      // File header found, end parsing diff metadata\n\t      if (/^(\\-\\-\\-|\\+\\+\\+|@@)\\s/.test(line)) {\n\t        break;\n\t      }\n\n\t      // Diff index\n\t      var header = /^(?:Index:|diff(?: -r \\w+)+)\\s+(.+?)\\s*$/.exec(line);\n\t      if (header) {\n\t        index.index = header[1];\n\t      }\n\n\t      i++;\n\t    }\n\n\t    // Parse file headers if they are defined. Unified diff requires them, but\n\t    // there's no technical issues to have an isolated hunk without file header\n\t    parseFileHeader(index);\n\t    parseFileHeader(index);\n\n\t    // Parse hunks\n\t    index.hunks = [];\n\n\t    while (i < diffstr.length) {\n\t      var _line = diffstr[i];\n\n\t      if (/^(Index:|diff|\\-\\-\\-|\\+\\+\\+)\\s/.test(_line)) {\n\t        break;\n\t      } else if (/^@@/.test(_line)) {\n\t        index.hunks.push(parseHunk());\n\t      } else if (_line && options.strict) {\n\t        // Ignore unexpected content unless in strict mode\n\t        throw new Error('Unknown line ' + (i + 1) + ' ' + JSON.stringify(_line));\n\t      } else {\n\t        i++;\n\t      }\n\t    }\n\t  }\n\n\t  // Parses the --- and +++ headers, if none are found, no lines\n\t  // are consumed.\n\t  function parseFileHeader(index) {\n\t    var fileHeader = /^(---|\\+\\+\\+)\\s+(.*)$/.exec(diffstr[i]);\n\t    if (fileHeader) {\n\t      var keyPrefix = fileHeader[1] === '---' ? 'old' : 'new';\n\t      var data = fileHeader[2].split('\\t', 2);\n\t      var fileName = data[0].replace(/\\\\\\\\/g, '\\\\');\n\t      if (/^\".*\"$/.test(fileName)) {\n\t        fileName = fileName.substr(1, fileName.length - 2);\n\t      }\n\t      index[keyPrefix + 'FileName'] = fileName;\n\t      index[keyPrefix + 'Header'] = (data[1] || '').trim();\n\n\t      i++;\n\t    }\n\t  }\n\n\t  // Parses a hunk\n\t  // This assumes that we are at the start of a hunk.\n\t  function parseHunk() {\n\t    var chunkHeaderIndex = i,\n\t        chunkHeaderLine = diffstr[i++],\n\t        chunkHeader = chunkHeaderLine.split(/@@ -(\\d+)(?:,(\\d+))? \\+(\\d+)(?:,(\\d+))? @@/);\n\n\t    var hunk = {\n\t      oldStart: +chunkHeader[1],\n\t      oldLines: +chunkHeader[2] || 1,\n\t      newStart: +chunkHeader[3],\n\t      newLines: +chunkHeader[4] || 1,\n\t      lines: [],\n\t      linedelimiters: []\n\t    };\n\n\t    var addCount = 0,\n\t        removeCount = 0;\n\t    for (; i < diffstr.length; i++) {\n\t      // Lines starting with '---' could be mistaken for the \"remove line\" operation\n\t      // But they could be the header for the next file. Therefore prune such cases out.\n\t      if (diffstr[i].indexOf('--- ') === 0 && i + 2 < diffstr.length && diffstr[i + 1].indexOf('+++ ') === 0 && diffstr[i + 2].indexOf('@@') === 0) {\n\t        break;\n\t      }\n\t      var operation = diffstr[i].length == 0 && i != diffstr.length - 1 ? ' ' : diffstr[i][0];\n\n\t      if (operation === '+' || operation === '-' || operation === ' ' || operation === '\\\\') {\n\t        hunk.lines.push(diffstr[i]);\n\t        hunk.linedelimiters.push(delimiters[i] || '\\n');\n\n\t        if (operation === '+') {\n\t          addCount++;\n\t        } else if (operation === '-') {\n\t          removeCount++;\n\t        } else if (operation === ' ') {\n\t          addCount++;\n\t          removeCount++;\n\t        }\n\t      } else {\n\t        break;\n\t      }\n\t    }\n\n\t    // Handle the empty block count case\n\t    if (!addCount && hunk.newLines === 1) {\n\t      hunk.newLines = 0;\n\t    }\n\t    if (!removeCount && hunk.oldLines === 1) {\n\t      hunk.oldLines = 0;\n\t    }\n\n\t    // Perform optional sanity checking\n\t    if (options.strict) {\n\t      if (addCount !== hunk.newLines) {\n\t        throw new Error('Added line count did not match for hunk at line ' + (chunkHeaderIndex + 1));\n\t      }\n\t      if (removeCount !== hunk.oldLines) {\n\t        throw new Error('Removed line count did not match for hunk at line ' + (chunkHeaderIndex + 1));\n\t      }\n\t    }\n\n\t    return hunk;\n\t  }\n\n\t  while (i < diffstr.length) {\n\t    parseIndex();\n\t  }\n\n\t  return list;\n\t}\n\t//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXRjaC9wYXJzZS5qcyJdLCJuYW1lcyI6WyJwYXJzZVBhdGNoIiwidW5pRGlmZiIsIm9wdGlvbnMiLCJkaWZmc3RyIiwic3BsaXQiLCJkZWxpbWl0ZXJzIiwibWF0Y2giLCJsaXN0IiwiaSIsInBhcnNlSW5kZXgiLCJpbmRleCIsInB1c2giLCJsZW5ndGgiLCJsaW5lIiwidGVzdCIsImhlYWRlciIsImV4ZWMiLCJwYXJzZUZpbGVIZWFkZXIiLCJodW5rcyIsInBhcnNlSHVuayIsInN0cmljdCIsIkVycm9yIiwiSlNPTiIsInN0cmluZ2lmeSIsImZpbGVIZWFkZXIiLCJrZXlQcmVmaXgiLCJkYXRhIiwiZmlsZU5hbWUiLCJyZXBsYWNlIiwic3Vic3RyIiwidHJpbSIsImNodW5rSGVhZGVySW5kZXgiLCJjaHVua0hlYWRlckxpbmUiLCJjaHVua0hlYWRlciIsImh1bmsiLCJvbGRTdGFydCIsIm9sZExpbmVzIiwibmV3U3RhcnQiLCJuZXdMaW5lcyIsImxpbmVzIiwibGluZWRlbGltaXRlcnMiLCJhZGRDb3VudCIsInJlbW92ZUNvdW50IiwiaW5kZXhPZiIsIm9wZXJhdGlvbiJdLCJtYXBwaW5ncyI6Ijs7O2dDQUFnQkEsVSxHQUFBQSxVO0FBQVQsU0FBU0EsVUFBVCxDQUFvQkMsT0FBcEIsRUFBMkM7QUFBQSxzREFBZEMsT0FBYyx1RUFBSixFQUFJOztBQUNoRCxNQUFJQyxVQUFVRixRQUFRRyxLQUFSLENBQWMscUJBQWQsQ0FBZDtBQUFBLE1BQ0lDLGFBQWFKLFFBQVFLLEtBQVIsQ0FBYyxzQkFBZCxLQUF5QyxFQUQxRDtBQUFBLE1BRUlDLE9BQU8sRUFGWDtBQUFBLE1BR0lDLElBQUksQ0FIUjs7QUFLQSxXQUFTQyxVQUFULEdBQXNCO0FBQ3BCLFFBQUlDLFFBQVEsRUFBWjtBQUNBSCxTQUFLSSxJQUFMLENBQVVELEtBQVY7O0FBRUE7QUFDQSxXQUFPRixJQUFJTCxRQUFRUyxNQUFuQixFQUEyQjtBQUN6QixVQUFJQyxPQUFPVixRQUFRSyxDQUFSLENBQVg7O0FBRUE7QUFDQSxVQUFJLHdCQUF3Qk0sSUFBeEIsQ0FBNkJELElBQTdCLENBQUosRUFBd0M7QUFDdEM7QUFDRDs7QUFFRDtBQUNBLFVBQUlFLFNBQVUsMENBQUQsQ0FBNkNDLElBQTdDLENBQWtESCxJQUFsRCxDQUFiO0FBQ0EsVUFBSUUsTUFBSixFQUFZO0FBQ1ZMLGNBQU1BLEtBQU4sR0FBY0ssT0FBTyxDQUFQLENBQWQ7QUFDRDs7QUFFRFA7QUFDRDs7QUFFRDtBQUNBO0FBQ0FTLG9CQUFnQlAsS0FBaEI7QUFDQU8sb0JBQWdCUCxLQUFoQjs7QUFFQTtBQUNBQSxVQUFNUSxLQUFOLEdBQWMsRUFBZDs7QUFFQSxXQUFPVixJQUFJTCxRQUFRUyxNQUFuQixFQUEyQjtBQUN6QixVQUFJQyxRQUFPVixRQUFRSyxDQUFSLENBQVg7O0FBRUEsVUFBSSxpQ0FBaUNNLElBQWpDLENBQXNDRCxLQUF0QyxDQUFKLEVBQWlEO0FBQy9DO0FBQ0QsT0FGRCxNQUVPLElBQUksTUFBTUMsSUFBTixDQUFXRCxLQUFYLENBQUosRUFBc0I7QUFDM0JILGNBQU1RLEtBQU4sQ0FBWVAsSUFBWixDQUFpQlEsV0FBakI7QUFDRCxPQUZNLE1BRUEsSUFBSU4sU0FBUVgsUUFBUWtCLE1BQXBCLEVBQTRCO0FBQ2pDO0FBQ0EsY0FBTSxJQUFJQyxLQUFKLENBQVUsbUJBQW1CYixJQUFJLENBQXZCLElBQTRCLEdBQTVCLEdBQWtDYyxLQUFLQyxTQUFMLENBQWVWLEtBQWYsQ0FBNUMsQ0FBTjtBQUNELE9BSE0sTUFHQTtBQUNMTDtBQUNEO0FBQ0Y7QUFDRjs7QUFFRDtBQUNBO0FBQ0EsV0FBU1MsZUFBVCxDQUF5QlAsS0FBekIsRUFBZ0M7QUFDOUIsUUFBTWMsYUFBYyx1QkFBRCxDQUEwQlIsSUFBMUIsQ0FBK0JiLFFBQVFLLENBQVIsQ0FBL0IsQ0FBbkI7QUFDQSxRQUFJZ0IsVUFBSixFQUFnQjtBQUNkLFVBQUlDLFlBQVlELFdBQVcsQ0FBWCxNQUFrQixLQUFsQixHQUEwQixLQUExQixHQUFrQyxLQUFsRDtBQUNBLFVBQU1FLE9BQU9GLFdBQVcsQ0FBWCxFQUFjcEIsS0FBZCxDQUFvQixJQUFwQixFQUEwQixDQUExQixDQUFiO0FBQ0EsVUFBSXVCLFdBQVdELEtBQUssQ0FBTCxFQUFRRSxPQUFSLENBQWdCLE9BQWhCLEVBQXlCLElBQXpCLENBQWY7QUFDQSxVQUFJLFNBQVNkLElBQVQsQ0FBY2EsUUFBZCxDQUFKLEVBQTZCO0FBQzNCQSxtQkFBV0EsU0FBU0UsTUFBVCxDQUFnQixDQUFoQixFQUFtQkYsU0FBU2YsTUFBVCxHQUFrQixDQUFyQyxDQUFYO0FBQ0Q7QUFDREYsWUFBTWUsWUFBWSxVQUFsQixJQUFnQ0UsUUFBaEM7QUFDQWpCLFlBQU1lLFlBQVksUUFBbEIsSUFBOEIsQ0FBQ0MsS0FBSyxDQUFMLEtBQVcsRUFBWixFQUFnQkksSUFBaEIsRUFBOUI7O0FBRUF0QjtBQUNEO0FBQ0Y7O0FBRUQ7QUFDQTtBQUNBLFdBQVNXLFNBQVQsR0FBcUI7QUFDbkIsUUFBSVksbUJBQW1CdkIsQ0FBdkI7QUFBQSxRQUNJd0Isa0JBQWtCN0IsUUFBUUssR0FBUixDQUR0QjtBQUFBLFFBRUl5QixjQUFjRCxnQkFBZ0I1QixLQUFoQixDQUFzQiw0Q0FBdEIsQ0FGbEI7O0FBSUEsUUFBSThCLE9BQU87QUFDVEMsZ0JBQVUsQ0FBQ0YsWUFBWSxDQUFaLENBREY7QUFFVEcsZ0JBQVUsQ0FBQ0gsWUFBWSxDQUFaLENBQUQsSUFBbUIsQ0FGcEI7QUFHVEksZ0JBQVUsQ0FBQ0osWUFBWSxDQUFaLENBSEY7QUFJVEssZ0JBQVUsQ0FBQ0wsWUFBWSxDQUFaLENBQUQsSUFBbUIsQ0FKcEI7QUFLVE0sYUFBTyxFQUxFO0FBTVRDLHNCQUFnQjtBQU5QLEtBQVg7O0FBU0EsUUFBSUMsV0FBVyxDQUFmO0FBQUEsUUFDSUMsY0FBYyxDQURsQjtBQUVBLFdBQU9sQyxJQUFJTCxRQUFRUyxNQUFuQixFQUEyQkosR0FBM0IsRUFBZ0M7QUFDOUI7QUFDQTtBQUNBLFVBQUlMLFFBQVFLLENBQVIsRUFBV21DLE9BQVgsQ0FBbUIsTUFBbkIsTUFBK0IsQ0FBL0IsSUFDTW5DLElBQUksQ0FBSixHQUFRTCxRQUFRUyxNQUR0QixJQUVLVCxRQUFRSyxJQUFJLENBQVosRUFBZW1DLE9BQWYsQ0FBdUIsTUFBdkIsTUFBbUMsQ0FGeEMsSUFHS3hDLFFBQVFLLElBQUksQ0FBWixFQUFlbUMsT0FBZixDQUF1QixJQUF2QixNQUFpQyxDQUgxQyxFQUc2QztBQUN6QztBQUNIO0FBQ0QsVUFBSUMsWUFBYXpDLFFBQVFLLENBQVIsRUFBV0ksTUFBWCxJQUFxQixDQUFyQixJQUEwQkosS0FBTUwsUUFBUVMsTUFBUixHQUFpQixDQUFsRCxHQUF3RCxHQUF4RCxHQUE4RFQsUUFBUUssQ0FBUixFQUFXLENBQVgsQ0FBOUU7O0FBRUEsVUFBSW9DLGNBQWMsR0FBZCxJQUFxQkEsY0FBYyxHQUFuQyxJQUEwQ0EsY0FBYyxHQUF4RCxJQUErREEsY0FBYyxJQUFqRixFQUF1RjtBQUNyRlYsYUFBS0ssS0FBTCxDQUFXNUIsSUFBWCxDQUFnQlIsUUFBUUssQ0FBUixDQUFoQjtBQUNBMEIsYUFBS00sY0FBTCxDQUFvQjdCLElBQXBCLENBQXlCTixXQUFXRyxDQUFYLEtBQWlCLElBQTFDOztBQUVBLFlBQUlvQyxjQUFjLEdBQWxCLEVBQXVCO0FBQ3JCSDtBQUNELFNBRkQsTUFFTyxJQUFJRyxjQUFjLEdBQWxCLEVBQXVCO0FBQzVCRjtBQUNELFNBRk0sTUFFQSxJQUFJRSxjQUFjLEdBQWxCLEVBQXVCO0FBQzVCSDtBQUNBQztBQUNEO0FBQ0YsT0FaRCxNQVlPO0FBQ0w7QUFDRDtBQUNGOztBQUVEO0FBQ0EsUUFBSSxDQUFDRCxRQUFELElBQWFQLEtBQUtJLFFBQUwsS0FBa0IsQ0FBbkMsRUFBc0M7QUFDcENKLFdBQUtJLFFBQUwsR0FBZ0IsQ0FBaEI7QUFDRDtBQUNELFFBQUksQ0FBQ0ksV0FBRCxJQUFnQlIsS0FBS0UsUUFBTCxLQUFrQixDQUF0QyxFQUF5QztBQUN2Q0YsV0FBS0UsUUFBTCxHQUFnQixDQUFoQjtBQUNEOztBQUVEO0FBQ0EsUUFBSWxDLFFBQVFrQixNQUFaLEVBQW9CO0FBQ2xCLFVBQUlxQixhQUFhUCxLQUFLSSxRQUF0QixFQUFnQztBQUM5QixjQUFNLElBQUlqQixLQUFKLENBQVUsc0RBQXNEVSxtQkFBbUIsQ0FBekUsQ0FBVixDQUFOO0FBQ0Q7QUFDRCxVQUFJVyxnQkFBZ0JSLEtBQUtFLFFBQXpCLEVBQW1DO0FBQ2pDLGNBQU0sSUFBSWYsS0FBSixDQUFVLHdEQUF3RFUsbUJBQW1CLENBQTNFLENBQVYsQ0FBTjtBQUNEO0FBQ0Y7O0FBRUQsV0FBT0csSUFBUDtBQUNEOztBQUVELFNBQU8xQixJQUFJTCxRQUFRUyxNQUFuQixFQUEyQjtBQUN6Qkg7QUFDRDs7QUFFRCxTQUFPRixJQUFQO0FBQ0QiLCJmaWxlIjoicGFyc2UuanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gcGFyc2VQYXRjaCh1bmlEaWZmLCBvcHRpb25zID0ge30pIHtcbiAgbGV0IGRpZmZzdHIgPSB1bmlEaWZmLnNwbGl0KC9cXHJcXG58W1xcblxcdlxcZlxcclxceDg1XS8pLFxuICAgICAgZGVsaW1pdGVycyA9IHVuaURpZmYubWF0Y2goL1xcclxcbnxbXFxuXFx2XFxmXFxyXFx4ODVdL2cpIHx8IFtdLFxuICAgICAgbGlzdCA9IFtdLFxuICAgICAgaSA9IDA7XG5cbiAgZnVuY3Rpb24gcGFyc2VJbmRleCgpIHtcbiAgICBsZXQgaW5kZXggPSB7fTtcbiAgICBsaXN0LnB1c2goaW5kZXgpO1xuXG4gICAgLy8gUGFyc2UgZGlmZiBtZXRhZGF0YVxuICAgIHdoaWxlIChpIDwgZGlmZnN0ci5sZW5ndGgpIHtcbiAgICAgIGxldCBsaW5lID0gZGlmZnN0cltpXTtcblxuICAgICAgLy8gRmlsZSBoZWFkZXIgZm91bmQsIGVuZCBwYXJzaW5nIGRpZmYgbWV0YWRhdGFcbiAgICAgIGlmICgvXihcXC1cXC1cXC18XFwrXFwrXFwrfEBAKVxccy8udGVzdChsaW5lKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLy8gRGlmZiBpbmRleFxuICAgICAgbGV0IGhlYWRlciA9ICgvXig/OkluZGV4OnxkaWZmKD86IC1yIFxcdyspKylcXHMrKC4rPylcXHMqJC8pLmV4ZWMobGluZSk7XG4gICAgICBpZiAoaGVhZGVyKSB7XG4gICAgICAgIGluZGV4LmluZGV4ID0gaGVhZGVyWzFdO1xuICAgICAgfVxuXG4gICAgICBpKys7XG4gICAgfVxuXG4gICAgLy8gUGFyc2UgZmlsZSBoZWFkZXJzIGlmIHRoZXkgYXJlIGRlZmluZWQuIFVuaWZpZWQgZGlmZiByZXF1aXJlcyB0aGVtLCBidXRcbiAgICAvLyB0aGVyZSdzIG5vIHRlY2huaWNhbCBpc3N1ZXMgdG8gaGF2ZSBhbiBpc29sYXRlZCBodW5rIHdpdGhvdXQgZmlsZSBoZWFkZXJcbiAgICBwYXJzZUZpbGVIZWFkZXIoaW5kZXgpO1xuICAgIHBhcnNlRmlsZUhlYWRlcihpbmRleCk7XG5cbiAgICAvLyBQYXJzZSBodW5rc1xuICAgIGluZGV4Lmh1bmtzID0gW107XG5cbiAgICB3aGlsZSAoaSA8IGRpZmZzdHIubGVuZ3RoKSB7XG4gICAgICBsZXQgbGluZSA9IGRpZmZzdHJbaV07XG5cbiAgICAgIGlmICgvXihJbmRleDp8ZGlmZnxcXC1cXC1cXC18XFwrXFwrXFwrKVxccy8udGVzdChsaW5lKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH0gZWxzZSBpZiAoL15AQC8udGVzdChsaW5lKSkge1xuICAgICAgICBpbmRleC5odW5rcy5wdXNoKHBhcnNlSHVuaygpKTtcbiAgICAgIH0gZWxzZSBpZiAobGluZSAmJiBvcHRpb25zLnN0cmljdCkge1xuICAgICAgICAvLyBJZ25vcmUgdW5leHBlY3RlZCBjb250ZW50IHVubGVzcyBpbiBzdHJpY3QgbW9kZVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbGluZSAnICsgKGkgKyAxKSArICcgJyArIEpTT04uc3RyaW5naWZ5KGxpbmUpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGkrKztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBQYXJzZXMgdGhlIC0tLSBhbmQgKysrIGhlYWRlcnMsIGlmIG5vbmUgYXJlIGZvdW5kLCBubyBsaW5lc1xuICAvLyBhcmUgY29uc3VtZWQuXG4gIGZ1bmN0aW9uIHBhcnNlRmlsZUhlYWRlcihpbmRleCkge1xuICAgIGNvbnN0IGZpbGVIZWFkZXIgPSAoL14oLS0tfFxcK1xcK1xcKylcXHMrKC4qKSQvKS5leGVjKGRpZmZzdHJbaV0pO1xuICAgIGlmIChmaWxlSGVhZGVyKSB7XG4gICAgICBsZXQga2V5UHJlZml4ID0gZmlsZUhlYWRlclsxXSA9PT0gJy0tLScgPyAnb2xkJyA6ICduZXcnO1xuICAgICAgY29uc3QgZGF0YSA9IGZpbGVIZWFkZXJbMl0uc3BsaXQoJ1xcdCcsIDIpO1xuICAgICAgbGV0IGZpbGVOYW1lID0gZGF0YVswXS5yZXBsYWNlKC9cXFxcXFxcXC9nLCAnXFxcXCcpO1xuICAgICAgaWYgKC9eXCIuKlwiJC8udGVzdChmaWxlTmFtZSkpIHtcbiAgICAgICAgZmlsZU5hbWUgPSBmaWxlTmFtZS5zdWJzdHIoMSwgZmlsZU5hbWUubGVuZ3RoIC0gMik7XG4gICAgICB9XG4gICAgICBpbmRleFtrZXlQcmVmaXggKyAnRmlsZU5hbWUnXSA9IGZpbGVOYW1lO1xuICAgICAgaW5kZXhba2V5UHJlZml4ICsgJ0hlYWRlciddID0gKGRhdGFbMV0gfHwgJycpLnRyaW0oKTtcblxuICAgICAgaSsrO1xuICAgIH1cbiAgfVxuXG4gIC8vIFBhcnNlcyBhIGh1bmtcbiAgLy8gVGhpcyBhc3N1bWVzIHRoYXQgd2UgYXJlIGF0IHRoZSBzdGFydCBvZiBhIGh1bmsuXG4gIGZ1bmN0aW9uIHBhcnNlSHVuaygpIHtcbiAgICBsZXQgY2h1bmtIZWFkZXJJbmRleCA9IGksXG4gICAgICAgIGNodW5rSGVhZGVyTGluZSA9IGRpZmZzdHJbaSsrXSxcbiAgICAgICAgY2h1bmtIZWFkZXIgPSBjaHVua0hlYWRlckxpbmUuc3BsaXQoL0BAIC0oXFxkKykoPzosKFxcZCspKT8gXFwrKFxcZCspKD86LChcXGQrKSk/IEBALyk7XG5cbiAgICBsZXQgaHVuayA9IHtcbiAgICAgIG9sZFN0YXJ0OiArY2h1bmtIZWFkZXJbMV0sXG4gICAgICBvbGRMaW5lczogK2NodW5rSGVhZGVyWzJdIHx8IDEsXG4gICAgICBuZXdTdGFydDogK2NodW5rSGVhZGVyWzNdLFxuICAgICAgbmV3TGluZXM6ICtjaHVua0hlYWRlcls0XSB8fCAxLFxuICAgICAgbGluZXM6IFtdLFxuICAgICAgbGluZWRlbGltaXRlcnM6IFtdXG4gICAgfTtcblxuICAgIGxldCBhZGRDb3VudCA9IDAsXG4gICAgICAgIHJlbW92ZUNvdW50ID0gMDtcbiAgICBmb3IgKDsgaSA8IGRpZmZzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgIC8vIExpbmVzIHN0YXJ0aW5nIHdpdGggJy0tLScgY291bGQgYmUgbWlzdGFrZW4gZm9yIHRoZSBcInJlbW92ZSBsaW5lXCIgb3BlcmF0aW9uXG4gICAgICAvLyBCdXQgdGhleSBjb3VsZCBiZSB0aGUgaGVhZGVyIGZvciB0aGUgbmV4dCBmaWxlLiBUaGVyZWZvcmUgcHJ1bmUgc3VjaCBjYXNlcyBvdXQuXG4gICAgICBpZiAoZGlmZnN0cltpXS5pbmRleE9mKCctLS0gJykgPT09IDBcbiAgICAgICAgICAgICYmIChpICsgMiA8IGRpZmZzdHIubGVuZ3RoKVxuICAgICAgICAgICAgJiYgZGlmZnN0cltpICsgMV0uaW5kZXhPZignKysrICcpID09PSAwXG4gICAgICAgICAgICAmJiBkaWZmc3RyW2kgKyAyXS5pbmRleE9mKCdAQCcpID09PSAwKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBsZXQgb3BlcmF0aW9uID0gKGRpZmZzdHJbaV0ubGVuZ3RoID09IDAgJiYgaSAhPSAoZGlmZnN0ci5sZW5ndGggLSAxKSkgPyAnICcgOiBkaWZmc3RyW2ldWzBdO1xuXG4gICAgICBpZiAob3BlcmF0aW9uID09PSAnKycgfHwgb3BlcmF0aW9uID09PSAnLScgfHwgb3BlcmF0aW9uID09PSAnICcgfHwgb3BlcmF0aW9uID09PSAnXFxcXCcpIHtcbiAgICAgICAgaHVuay5saW5lcy5wdXNoKGRpZmZzdHJbaV0pO1xuICAgICAgICBodW5rLmxpbmVkZWxpbWl0ZXJzLnB1c2goZGVsaW1pdGVyc1tpXSB8fCAnXFxuJyk7XG5cbiAgICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJysnKSB7XG4gICAgICAgICAgYWRkQ291bnQrKztcbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gPT09ICctJykge1xuICAgICAgICAgIHJlbW92ZUNvdW50Kys7XG4gICAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uID09PSAnICcpIHtcbiAgICAgICAgICBhZGRDb3VudCsrO1xuICAgICAgICAgIHJlbW92ZUNvdW50Kys7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEhhbmRsZSB0aGUgZW1wdHkgYmxvY2sgY291bnQgY2FzZVxuICAgIGlmICghYWRkQ291bnQgJiYgaHVuay5uZXdMaW5lcyA9PT0gMSkge1xuICAgICAgaHVuay5uZXdMaW5lcyA9IDA7XG4gICAgfVxuICAgIGlmICghcmVtb3ZlQ291bnQgJiYgaHVuay5vbGRMaW5lcyA9PT0gMSkge1xuICAgICAgaHVuay5vbGRMaW5lcyA9IDA7XG4gICAgfVxuXG4gICAgLy8gUGVyZm9ybSBvcHRpb25hbCBzYW5pdHkgY2hlY2tpbmdcbiAgICBpZiAob3B0aW9ucy5zdHJpY3QpIHtcbiAgICAgIGlmIChhZGRDb3VudCAhPT0gaHVuay5uZXdMaW5lcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FkZGVkIGxpbmUgY291bnQgZGlkIG5vdCBtYXRjaCBmb3IgaHVuayBhdCBsaW5lICcgKyAoY2h1bmtIZWFkZXJJbmRleCArIDEpKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZW1vdmVDb3VudCAhPT0gaHVuay5vbGRMaW5lcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlbW92ZWQgbGluZSBjb3VudCBkaWQgbm90IG1hdGNoIGZvciBodW5rIGF0IGxpbmUgJyArIChjaHVua0hlYWRlckluZGV4ICsgMSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBodW5rO1xuICB9XG5cbiAgd2hpbGUgKGkgPCBkaWZmc3RyLmxlbmd0aCkge1xuICAgIHBhcnNlSW5kZXgoKTtcbiAgfVxuXG4gIHJldHVybiBsaXN0O1xufVxuIl19\n\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports) {\n\n\t/*istanbul ignore start*/\"use strict\";\n\n\texports.__esModule = true;\n\n\texports[\"default\"] = /*istanbul ignore end*/function (start, minLine, maxLine) {\n\t  var wantForward = true,\n\t      backwardExhausted = false,\n\t      forwardExhausted = false,\n\t      localOffset = 1;\n\n\t  return function iterator() {\n\t    if (wantForward && !forwardExhausted) {\n\t      if (backwardExhausted) {\n\t        localOffset++;\n\t      } else {\n\t        wantForward = false;\n\t      }\n\n\t      // Check if trying to fit beyond text length, and if not, check it fits\n\t      // after offset location (or desired location on first iteration)\n\t      if (start + localOffset <= maxLine) {\n\t        return localOffset;\n\t      }\n\n\t      forwardExhausted = true;\n\t    }\n\n\t    if (!backwardExhausted) {\n\t      if (!forwardExhausted) {\n\t        wantForward = true;\n\t      }\n\n\t      // Check if trying to fit before text beginning, and if not, check it fits\n\t      // before offset location\n\t      if (minLine <= start - localOffset) {\n\t        return -localOffset++;\n\t      }\n\n\t      backwardExhausted = true;\n\t      return iterator();\n\t    }\n\n\t    // We tried to fit hunk before text beginning and beyond text length, then\n\t    // hunk can't fit on the text. Return undefined\n\t  };\n\t};\n\t//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsL2Rpc3RhbmNlLWl0ZXJhdG9yLmpzIl0sIm5hbWVzIjpbInN0YXJ0IiwibWluTGluZSIsIm1heExpbmUiLCJ3YW50Rm9yd2FyZCIsImJhY2t3YXJkRXhoYXVzdGVkIiwiZm9yd2FyZEV4aGF1c3RlZCIsImxvY2FsT2Zmc2V0IiwiaXRlcmF0b3IiXSwibWFwcGluZ3MiOiI7Ozs7NENBR2UsVUFBU0EsS0FBVCxFQUFnQkMsT0FBaEIsRUFBeUJDLE9BQXpCLEVBQWtDO0FBQy9DLE1BQUlDLGNBQWMsSUFBbEI7QUFBQSxNQUNJQyxvQkFBb0IsS0FEeEI7QUFBQSxNQUVJQyxtQkFBbUIsS0FGdkI7QUFBQSxNQUdJQyxjQUFjLENBSGxCOztBQUtBLFNBQU8sU0FBU0MsUUFBVCxHQUFvQjtBQUN6QixRQUFJSixlQUFlLENBQUNFLGdCQUFwQixFQUFzQztBQUNwQyxVQUFJRCxpQkFBSixFQUF1QjtBQUNyQkU7QUFDRCxPQUZELE1BRU87QUFDTEgsc0JBQWMsS0FBZDtBQUNEOztBQUVEO0FBQ0E7QUFDQSxVQUFJSCxRQUFRTSxXQUFSLElBQXVCSixPQUEzQixFQUFvQztBQUNsQyxlQUFPSSxXQUFQO0FBQ0Q7O0FBRURELHlCQUFtQixJQUFuQjtBQUNEOztBQUVELFFBQUksQ0FBQ0QsaUJBQUwsRUFBd0I7QUFDdEIsVUFBSSxDQUFDQyxnQkFBTCxFQUF1QjtBQUNyQkYsc0JBQWMsSUFBZDtBQUNEOztBQUVEO0FBQ0E7QUFDQSxVQUFJRixXQUFXRCxRQUFRTSxXQUF2QixFQUFvQztBQUNsQyxlQUFPLENBQUNBLGFBQVI7QUFDRDs7QUFFREYsMEJBQW9CLElBQXBCO0FBQ0EsYUFBT0csVUFBUDtBQUNEOztBQUVEO0FBQ0E7QUFDRCxHQWxDRDtBQW1DRCxDIiwiZmlsZSI6ImRpc3RhbmNlLWl0ZXJhdG9yLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gSXRlcmF0b3IgdGhhdCB0cmF2ZXJzZXMgaW4gdGhlIHJhbmdlIG9mIFttaW4sIG1heF0sIHN0ZXBwaW5nXG4vLyBieSBkaXN0YW5jZSBmcm9tIGEgZ2l2ZW4gc3RhcnQgcG9zaXRpb24uIEkuZS4gZm9yIFswLCA0XSwgd2l0aFxuLy8gc3RhcnQgb2YgMiwgdGhpcyB3aWxsIGl0ZXJhdGUgMiwgMywgMSwgNCwgMC5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHN0YXJ0LCBtaW5MaW5lLCBtYXhMaW5lKSB7XG4gIGxldCB3YW50Rm9yd2FyZCA9IHRydWUsXG4gICAgICBiYWNrd2FyZEV4aGF1c3RlZCA9IGZhbHNlLFxuICAgICAgZm9yd2FyZEV4aGF1c3RlZCA9IGZhbHNlLFxuICAgICAgbG9jYWxPZmZzZXQgPSAxO1xuXG4gIHJldHVybiBmdW5jdGlvbiBpdGVyYXRvcigpIHtcbiAgICBpZiAod2FudEZvcndhcmQgJiYgIWZvcndhcmRFeGhhdXN0ZWQpIHtcbiAgICAgIGlmIChiYWNrd2FyZEV4aGF1c3RlZCkge1xuICAgICAgICBsb2NhbE9mZnNldCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2FudEZvcndhcmQgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdHJ5aW5nIHRvIGZpdCBiZXlvbmQgdGV4dCBsZW5ndGgsIGFuZCBpZiBub3QsIGNoZWNrIGl0IGZpdHNcbiAgICAgIC8vIGFmdGVyIG9mZnNldCBsb2NhdGlvbiAob3IgZGVzaXJlZCBsb2NhdGlvbiBvbiBmaXJzdCBpdGVyYXRpb24pXG4gICAgICBpZiAoc3RhcnQgKyBsb2NhbE9mZnNldCA8PSBtYXhMaW5lKSB7XG4gICAgICAgIHJldHVybiBsb2NhbE9mZnNldDtcbiAgICAgIH1cblxuICAgICAgZm9yd2FyZEV4aGF1c3RlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKCFiYWNrd2FyZEV4aGF1c3RlZCkge1xuICAgICAgaWYgKCFmb3J3YXJkRXhoYXVzdGVkKSB7XG4gICAgICAgIHdhbnRGb3J3YXJkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdHJ5aW5nIHRvIGZpdCBiZWZvcmUgdGV4dCBiZWdpbm5pbmcsIGFuZCBpZiBub3QsIGNoZWNrIGl0IGZpdHNcbiAgICAgIC8vIGJlZm9yZSBvZmZzZXQgbG9jYXRpb25cbiAgICAgIGlmIChtaW5MaW5lIDw9IHN0YXJ0IC0gbG9jYWxPZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIC1sb2NhbE9mZnNldCsrO1xuICAgICAgfVxuXG4gICAgICBiYWNrd2FyZEV4aGF1c3RlZCA9IHRydWU7XG4gICAgICByZXR1cm4gaXRlcmF0b3IoKTtcbiAgICB9XG5cbiAgICAvLyBXZSB0cmllZCB0byBmaXQgaHVuayBiZWZvcmUgdGV4dCBiZWdpbm5pbmcgYW5kIGJleW9uZCB0ZXh0IGxlbmd0aCwgdGhlblxuICAgIC8vIGh1bmsgY2FuJ3QgZml0IG9uIHRoZSB0ZXh0LiBSZXR1cm4gdW5kZWZpbmVkXG4gIH07XG59XG4iXX0=\n\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*istanbul ignore start*/'use strict';\n\n\texports.__esModule = true;\n\texports. /*istanbul ignore end*/calcLineCount = calcLineCount;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/merge = merge;\n\n\tvar /*istanbul ignore start*/_create = __webpack_require__(14) /*istanbul ignore end*/;\n\n\tvar /*istanbul ignore start*/_parse = __webpack_require__(11) /*istanbul ignore end*/;\n\n\tvar /*istanbul ignore start*/_array = __webpack_require__(15) /*istanbul ignore end*/;\n\n\t/*istanbul ignore start*/function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\n\t/*istanbul ignore end*/function calcLineCount(hunk) {\n\t  /*istanbul ignore start*/var _calcOldNewLineCount = /*istanbul ignore end*/calcOldNewLineCount(hunk.lines),\n\t      oldLines = _calcOldNewLineCount.oldLines,\n\t      newLines = _calcOldNewLineCount.newLines;\n\n\t  if (oldLines !== undefined) {\n\t    hunk.oldLines = oldLines;\n\t  } else {\n\t    delete hunk.oldLines;\n\t  }\n\n\t  if (newLines !== undefined) {\n\t    hunk.newLines = newLines;\n\t  } else {\n\t    delete hunk.newLines;\n\t  }\n\t}\n\n\tfunction merge(mine, theirs, base) {\n\t  mine = loadPatch(mine, base);\n\t  theirs = loadPatch(theirs, base);\n\n\t  var ret = {};\n\n\t  // For index we just let it pass through as it doesn't have any necessary meaning.\n\t  // Leaving sanity checks on this to the API consumer that may know more about the\n\t  // meaning in their own context.\n\t  if (mine.index || theirs.index) {\n\t    ret.index = mine.index || theirs.index;\n\t  }\n\n\t  if (mine.newFileName || theirs.newFileName) {\n\t    if (!fileNameChanged(mine)) {\n\t      // No header or no change in ours, use theirs (and ours if theirs does not exist)\n\t      ret.oldFileName = theirs.oldFileName || mine.oldFileName;\n\t      ret.newFileName = theirs.newFileName || mine.newFileName;\n\t      ret.oldHeader = theirs.oldHeader || mine.oldHeader;\n\t      ret.newHeader = theirs.newHeader || mine.newHeader;\n\t    } else if (!fileNameChanged(theirs)) {\n\t      // No header or no change in theirs, use ours\n\t      ret.oldFileName = mine.oldFileName;\n\t      ret.newFileName = mine.newFileName;\n\t      ret.oldHeader = mine.oldHeader;\n\t      ret.newHeader = mine.newHeader;\n\t    } else {\n\t      // Both changed... figure it out\n\t      ret.oldFileName = selectField(ret, mine.oldFileName, theirs.oldFileName);\n\t      ret.newFileName = selectField(ret, mine.newFileName, theirs.newFileName);\n\t      ret.oldHeader = selectField(ret, mine.oldHeader, theirs.oldHeader);\n\t      ret.newHeader = selectField(ret, mine.newHeader, theirs.newHeader);\n\t    }\n\t  }\n\n\t  ret.hunks = [];\n\n\t  var mineIndex = 0,\n\t      theirsIndex = 0,\n\t      mineOffset = 0,\n\t      theirsOffset = 0;\n\n\t  while (mineIndex < mine.hunks.length || theirsIndex < theirs.hunks.length) {\n\t    var mineCurrent = mine.hunks[mineIndex] || { oldStart: Infinity },\n\t        theirsCurrent = theirs.hunks[theirsIndex] || { oldStart: Infinity };\n\n\t    if (hunkBefore(mineCurrent, theirsCurrent)) {\n\t      // This patch does not overlap with any of the others, yay.\n\t      ret.hunks.push(cloneHunk(mineCurrent, mineOffset));\n\t      mineIndex++;\n\t      theirsOffset += mineCurrent.newLines - mineCurrent.oldLines;\n\t    } else if (hunkBefore(theirsCurrent, mineCurrent)) {\n\t      // This patch does not overlap with any of the others, yay.\n\t      ret.hunks.push(cloneHunk(theirsCurrent, theirsOffset));\n\t      theirsIndex++;\n\t      mineOffset += theirsCurrent.newLines - theirsCurrent.oldLines;\n\t    } else {\n\t      // Overlap, merge as best we can\n\t      var mergedHunk = {\n\t        oldStart: Math.min(mineCurrent.oldStart, theirsCurrent.oldStart),\n\t        oldLines: 0,\n\t        newStart: Math.min(mineCurrent.newStart + mineOffset, theirsCurrent.oldStart + theirsOffset),\n\t        newLines: 0,\n\t        lines: []\n\t      };\n\t      mergeLines(mergedHunk, mineCurrent.oldStart, mineCurrent.lines, theirsCurrent.oldStart, theirsCurrent.lines);\n\t      theirsIndex++;\n\t      mineIndex++;\n\n\t      ret.hunks.push(mergedHunk);\n\t    }\n\t  }\n\n\t  return ret;\n\t}\n\n\tfunction loadPatch(param, base) {\n\t  if (typeof param === 'string') {\n\t    if (/^@@/m.test(param) || /^Index:/m.test(param)) {\n\t      return (/*istanbul ignore start*/(0, _parse.parsePatch) /*istanbul ignore end*/(param)[0]\n\t      );\n\t    }\n\n\t    if (!base) {\n\t      throw new Error('Must provide a base reference or pass in a patch');\n\t    }\n\t    return (/*istanbul ignore start*/(0, _create.structuredPatch) /*istanbul ignore end*/(undefined, undefined, base, param)\n\t    );\n\t  }\n\n\t  return param;\n\t}\n\n\tfunction fileNameChanged(patch) {\n\t  return patch.newFileName && patch.newFileName !== patch.oldFileName;\n\t}\n\n\tfunction selectField(index, mine, theirs) {\n\t  if (mine === theirs) {\n\t    return mine;\n\t  } else {\n\t    index.conflict = true;\n\t    return { mine: mine, theirs: theirs };\n\t  }\n\t}\n\n\tfunction hunkBefore(test, check) {\n\t  return test.oldStart < check.oldStart && test.oldStart + test.oldLines < check.oldStart;\n\t}\n\n\tfunction cloneHunk(hunk, offset) {\n\t  return {\n\t    oldStart: hunk.oldStart, oldLines: hunk.oldLines,\n\t    newStart: hunk.newStart + offset, newLines: hunk.newLines,\n\t    lines: hunk.lines\n\t  };\n\t}\n\n\tfunction mergeLines(hunk, mineOffset, mineLines, theirOffset, theirLines) {\n\t  // This will generally result in a conflicted hunk, but there are cases where the context\n\t  // is the only overlap where we can successfully merge the content here.\n\t  var mine = { offset: mineOffset, lines: mineLines, index: 0 },\n\t      their = { offset: theirOffset, lines: theirLines, index: 0 };\n\n\t  // Handle any leading content\n\t  insertLeading(hunk, mine, their);\n\t  insertLeading(hunk, their, mine);\n\n\t  // Now in the overlap content. Scan through and select the best changes from each.\n\t  while (mine.index < mine.lines.length && their.index < their.lines.length) {\n\t    var mineCurrent = mine.lines[mine.index],\n\t        theirCurrent = their.lines[their.index];\n\n\t    if ((mineCurrent[0] === '-' || mineCurrent[0] === '+') && (theirCurrent[0] === '-' || theirCurrent[0] === '+')) {\n\t      // Both modified ...\n\t      mutualChange(hunk, mine, their);\n\t    } else if (mineCurrent[0] === '+' && theirCurrent[0] === ' ') {\n\t      /*istanbul ignore start*/var _hunk$lines;\n\n\t      /*istanbul ignore end*/ // Mine inserted\n\t      /*istanbul ignore start*/(_hunk$lines = /*istanbul ignore end*/hunk.lines).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_hunk$lines /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/collectChange(mine)));\n\t    } else if (theirCurrent[0] === '+' && mineCurrent[0] === ' ') {\n\t      /*istanbul ignore start*/var _hunk$lines2;\n\n\t      /*istanbul ignore end*/ // Theirs inserted\n\t      /*istanbul ignore start*/(_hunk$lines2 = /*istanbul ignore end*/hunk.lines).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_hunk$lines2 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/collectChange(their)));\n\t    } else if (mineCurrent[0] === '-' && theirCurrent[0] === ' ') {\n\t      // Mine removed or edited\n\t      removal(hunk, mine, their);\n\t    } else if (theirCurrent[0] === '-' && mineCurrent[0] === ' ') {\n\t      // Their removed or edited\n\t      removal(hunk, their, mine, true);\n\t    } else if (mineCurrent === theirCurrent) {\n\t      // Context identity\n\t      hunk.lines.push(mineCurrent);\n\t      mine.index++;\n\t      their.index++;\n\t    } else {\n\t      // Context mismatch\n\t      conflict(hunk, collectChange(mine), collectChange(their));\n\t    }\n\t  }\n\n\t  // Now push anything that may be remaining\n\t  insertTrailing(hunk, mine);\n\t  insertTrailing(hunk, their);\n\n\t  calcLineCount(hunk);\n\t}\n\n\tfunction mutualChange(hunk, mine, their) {\n\t  var myChanges = collectChange(mine),\n\t      theirChanges = collectChange(their);\n\n\t  if (allRemoves(myChanges) && allRemoves(theirChanges)) {\n\t    // Special case for remove changes that are supersets of one another\n\t    if ( /*istanbul ignore start*/(0, _array.arrayStartsWith) /*istanbul ignore end*/(myChanges, theirChanges) && skipRemoveSuperset(their, myChanges, myChanges.length - theirChanges.length)) {\n\t      /*istanbul ignore start*/var _hunk$lines3;\n\n\t      /*istanbul ignore end*/ /*istanbul ignore start*/(_hunk$lines3 = /*istanbul ignore end*/hunk.lines).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_hunk$lines3 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/myChanges));\n\t      return;\n\t    } else if ( /*istanbul ignore start*/(0, _array.arrayStartsWith) /*istanbul ignore end*/(theirChanges, myChanges) && skipRemoveSuperset(mine, theirChanges, theirChanges.length - myChanges.length)) {\n\t      /*istanbul ignore start*/var _hunk$lines4;\n\n\t      /*istanbul ignore end*/ /*istanbul ignore start*/(_hunk$lines4 = /*istanbul ignore end*/hunk.lines).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_hunk$lines4 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/theirChanges));\n\t      return;\n\t    }\n\t  } else if ( /*istanbul ignore start*/(0, _array.arrayEqual) /*istanbul ignore end*/(myChanges, theirChanges)) {\n\t    /*istanbul ignore start*/var _hunk$lines5;\n\n\t    /*istanbul ignore end*/ /*istanbul ignore start*/(_hunk$lines5 = /*istanbul ignore end*/hunk.lines).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_hunk$lines5 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/myChanges));\n\t    return;\n\t  }\n\n\t  conflict(hunk, myChanges, theirChanges);\n\t}\n\n\tfunction removal(hunk, mine, their, swap) {\n\t  var myChanges = collectChange(mine),\n\t      theirChanges = collectContext(their, myChanges);\n\t  if (theirChanges.merged) {\n\t    /*istanbul ignore start*/var _hunk$lines6;\n\n\t    /*istanbul ignore end*/ /*istanbul ignore start*/(_hunk$lines6 = /*istanbul ignore end*/hunk.lines).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_hunk$lines6 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/theirChanges.merged));\n\t  } else {\n\t    conflict(hunk, swap ? theirChanges : myChanges, swap ? myChanges : theirChanges);\n\t  }\n\t}\n\n\tfunction conflict(hunk, mine, their) {\n\t  hunk.conflict = true;\n\t  hunk.lines.push({\n\t    conflict: true,\n\t    mine: mine,\n\t    theirs: their\n\t  });\n\t}\n\n\tfunction insertLeading(hunk, insert, their) {\n\t  while (insert.offset < their.offset && insert.index < insert.lines.length) {\n\t    var line = insert.lines[insert.index++];\n\t    hunk.lines.push(line);\n\t    insert.offset++;\n\t  }\n\t}\n\tfunction insertTrailing(hunk, insert) {\n\t  while (insert.index < insert.lines.length) {\n\t    var line = insert.lines[insert.index++];\n\t    hunk.lines.push(line);\n\t  }\n\t}\n\n\tfunction collectChange(state) {\n\t  var ret = [],\n\t      operation = state.lines[state.index][0];\n\t  while (state.index < state.lines.length) {\n\t    var line = state.lines[state.index];\n\n\t    // Group additions that are immediately after subtractions and treat them as one \"atomic\" modify change.\n\t    if (operation === '-' && line[0] === '+') {\n\t      operation = '+';\n\t    }\n\n\t    if (operation === line[0]) {\n\t      ret.push(line);\n\t      state.index++;\n\t    } else {\n\t      break;\n\t    }\n\t  }\n\n\t  return ret;\n\t}\n\tfunction collectContext(state, matchChanges) {\n\t  var changes = [],\n\t      merged = [],\n\t      matchIndex = 0,\n\t      contextChanges = false,\n\t      conflicted = false;\n\t  while (matchIndex < matchChanges.length && state.index < state.lines.length) {\n\t    var change = state.lines[state.index],\n\t        match = matchChanges[matchIndex];\n\n\t    // Once we've hit our add, then we are done\n\t    if (match[0] === '+') {\n\t      break;\n\t    }\n\n\t    contextChanges = contextChanges || change[0] !== ' ';\n\n\t    merged.push(match);\n\t    matchIndex++;\n\n\t    // Consume any additions in the other block as a conflict to attempt\n\t    // to pull in the remaining context after this\n\t    if (change[0] === '+') {\n\t      conflicted = true;\n\n\t      while (change[0] === '+') {\n\t        changes.push(change);\n\t        change = state.lines[++state.index];\n\t      }\n\t    }\n\n\t    if (match.substr(1) === change.substr(1)) {\n\t      changes.push(change);\n\t      state.index++;\n\t    } else {\n\t      conflicted = true;\n\t    }\n\t  }\n\n\t  if ((matchChanges[matchIndex] || '')[0] === '+' && contextChanges) {\n\t    conflicted = true;\n\t  }\n\n\t  if (conflicted) {\n\t    return changes;\n\t  }\n\n\t  while (matchIndex < matchChanges.length) {\n\t    merged.push(matchChanges[matchIndex++]);\n\t  }\n\n\t  return {\n\t    merged: merged,\n\t    changes: changes\n\t  };\n\t}\n\n\tfunction allRemoves(changes) {\n\t  return changes.reduce(function (prev, change) {\n\t    return prev && change[0] === '-';\n\t  }, true);\n\t}\n\tfunction skipRemoveSuperset(state, removeChanges, delta) {\n\t  for (var i = 0; i < delta; i++) {\n\t    var changeContent = removeChanges[removeChanges.length - delta + i].substr(1);\n\t    if (state.lines[state.index + i] !== ' ' + changeContent) {\n\t      return false;\n\t    }\n\t  }\n\n\t  state.index += delta;\n\t  return true;\n\t}\n\n\tfunction calcOldNewLineCount(lines) {\n\t  var oldLines = 0;\n\t  var newLines = 0;\n\n\t  lines.forEach(function (line) {\n\t    if (typeof line !== 'string') {\n\t      var myCount = calcOldNewLineCount(line.mine);\n\t      var theirCount = calcOldNewLineCount(line.theirs);\n\n\t      if (oldLines !== undefined) {\n\t        if (myCount.oldLines === theirCount.oldLines) {\n\t          oldLines += myCount.oldLines;\n\t        } else {\n\t          oldLines = undefined;\n\t        }\n\t      }\n\n\t      if (newLines !== undefined) {\n\t        if (myCount.newLines === theirCount.newLines) {\n\t          newLines += myCount.newLines;\n\t        } else {\n\t          newLines = undefined;\n\t        }\n\t      }\n\t    } else {\n\t      if (newLines !== undefined && (line[0] === '+' || line[0] === ' ')) {\n\t        newLines++;\n\t      }\n\t      if (oldLines !== undefined && (line[0] === '-' || line[0] === ' ')) {\n\t        oldLines++;\n\t      }\n\t    }\n\t  });\n\n\t  return { oldLines: oldLines, newLines: newLines };\n\t}\n\t//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXRjaC9tZXJnZS5qcyJdLCJuYW1lcyI6WyJjYWxjTGluZUNvdW50IiwibWVyZ2UiLCJodW5rIiwiY2FsY09sZE5ld0xpbmVDb3VudCIsImxpbmVzIiwib2xkTGluZXMiLCJuZXdMaW5lcyIsInVuZGVmaW5lZCIsIm1pbmUiLCJ0aGVpcnMiLCJiYXNlIiwibG9hZFBhdGNoIiwicmV0IiwiaW5kZXgiLCJuZXdGaWxlTmFtZSIsImZpbGVOYW1lQ2hhbmdlZCIsIm9sZEZpbGVOYW1lIiwib2xkSGVhZGVyIiwibmV3SGVhZGVyIiwic2VsZWN0RmllbGQiLCJodW5rcyIsIm1pbmVJbmRleCIsInRoZWlyc0luZGV4IiwibWluZU9mZnNldCIsInRoZWlyc09mZnNldCIsImxlbmd0aCIsIm1pbmVDdXJyZW50Iiwib2xkU3RhcnQiLCJJbmZpbml0eSIsInRoZWlyc0N1cnJlbnQiLCJodW5rQmVmb3JlIiwicHVzaCIsImNsb25lSHVuayIsIm1lcmdlZEh1bmsiLCJNYXRoIiwibWluIiwibmV3U3RhcnQiLCJtZXJnZUxpbmVzIiwicGFyYW0iLCJ0ZXN0IiwiRXJyb3IiLCJwYXRjaCIsImNvbmZsaWN0IiwiY2hlY2siLCJvZmZzZXQiLCJtaW5lTGluZXMiLCJ0aGVpck9mZnNldCIsInRoZWlyTGluZXMiLCJ0aGVpciIsImluc2VydExlYWRpbmciLCJ0aGVpckN1cnJlbnQiLCJtdXR1YWxDaGFuZ2UiLCJjb2xsZWN0Q2hhbmdlIiwicmVtb3ZhbCIsImluc2VydFRyYWlsaW5nIiwibXlDaGFuZ2VzIiwidGhlaXJDaGFuZ2VzIiwiYWxsUmVtb3ZlcyIsInNraXBSZW1vdmVTdXBlcnNldCIsInN3YXAiLCJjb2xsZWN0Q29udGV4dCIsIm1lcmdlZCIsImluc2VydCIsImxpbmUiLCJzdGF0ZSIsIm9wZXJhdGlvbiIsIm1hdGNoQ2hhbmdlcyIsImNoYW5nZXMiLCJtYXRjaEluZGV4IiwiY29udGV4dENoYW5nZXMiLCJjb25mbGljdGVkIiwiY2hhbmdlIiwibWF0Y2giLCJzdWJzdHIiLCJyZWR1Y2UiLCJwcmV2IiwicmVtb3ZlQ2hhbmdlcyIsImRlbHRhIiwiaSIsImNoYW5nZUNvbnRlbnQiLCJmb3JFYWNoIiwibXlDb3VudCIsInRoZWlyQ291bnQiXSwibWFwcGluZ3MiOiI7OztnQ0FLZ0JBLGEsR0FBQUEsYTt5REFnQkFDLEssR0FBQUEsSzs7QUFyQmhCOztBQUNBOztBQUVBOzs7O3VCQUVPLFNBQVNELGFBQVQsQ0FBdUJFLElBQXZCLEVBQTZCO0FBQUEsNkVBQ0xDLG9CQUFvQkQsS0FBS0UsS0FBekIsQ0FESztBQUFBLE1BQzNCQyxRQUQyQix3QkFDM0JBLFFBRDJCO0FBQUEsTUFDakJDLFFBRGlCLHdCQUNqQkEsUUFEaUI7O0FBR2xDLE1BQUlELGFBQWFFLFNBQWpCLEVBQTRCO0FBQzFCTCxTQUFLRyxRQUFMLEdBQWdCQSxRQUFoQjtBQUNELEdBRkQsTUFFTztBQUNMLFdBQU9ILEtBQUtHLFFBQVo7QUFDRDs7QUFFRCxNQUFJQyxhQUFhQyxTQUFqQixFQUE0QjtBQUMxQkwsU0FBS0ksUUFBTCxHQUFnQkEsUUFBaEI7QUFDRCxHQUZELE1BRU87QUFDTCxXQUFPSixLQUFLSSxRQUFaO0FBQ0Q7QUFDRjs7QUFFTSxTQUFTTCxLQUFULENBQWVPLElBQWYsRUFBcUJDLE1BQXJCLEVBQTZCQyxJQUE3QixFQUFtQztBQUN4Q0YsU0FBT0csVUFBVUgsSUFBVixFQUFnQkUsSUFBaEIsQ0FBUDtBQUNBRCxXQUFTRSxVQUFVRixNQUFWLEVBQWtCQyxJQUFsQixDQUFUOztBQUVBLE1BQUlFLE1BQU0sRUFBVjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFJSixLQUFLSyxLQUFMLElBQWNKLE9BQU9JLEtBQXpCLEVBQWdDO0FBQzlCRCxRQUFJQyxLQUFKLEdBQVlMLEtBQUtLLEtBQUwsSUFBY0osT0FBT0ksS0FBakM7QUFDRDs7QUFFRCxNQUFJTCxLQUFLTSxXQUFMLElBQW9CTCxPQUFPSyxXQUEvQixFQUE0QztBQUMxQyxRQUFJLENBQUNDLGdCQUFnQlAsSUFBaEIsQ0FBTCxFQUE0QjtBQUMxQjtBQUNBSSxVQUFJSSxXQUFKLEdBQWtCUCxPQUFPTyxXQUFQLElBQXNCUixLQUFLUSxXQUE3QztBQUNBSixVQUFJRSxXQUFKLEdBQWtCTCxPQUFPSyxXQUFQLElBQXNCTixLQUFLTSxXQUE3QztBQUNBRixVQUFJSyxTQUFKLEdBQWdCUixPQUFPUSxTQUFQLElBQW9CVCxLQUFLUyxTQUF6QztBQUNBTCxVQUFJTSxTQUFKLEdBQWdCVCxPQUFPUyxTQUFQLElBQW9CVixLQUFLVSxTQUF6QztBQUNELEtBTkQsTUFNTyxJQUFJLENBQUNILGdCQUFnQk4sTUFBaEIsQ0FBTCxFQUE4QjtBQUNuQztBQUNBRyxVQUFJSSxXQUFKLEdBQWtCUixLQUFLUSxXQUF2QjtBQUNBSixVQUFJRSxXQUFKLEdBQWtCTixLQUFLTSxXQUF2QjtBQUNBRixVQUFJSyxTQUFKLEdBQWdCVCxLQUFLUyxTQUFyQjtBQUNBTCxVQUFJTSxTQUFKLEdBQWdCVixLQUFLVSxTQUFyQjtBQUNELEtBTk0sTUFNQTtBQUNMO0FBQ0FOLFVBQUlJLFdBQUosR0FBa0JHLFlBQVlQLEdBQVosRUFBaUJKLEtBQUtRLFdBQXRCLEVBQW1DUCxPQUFPTyxXQUExQyxDQUFsQjtBQUNBSixVQUFJRSxXQUFKLEdBQWtCSyxZQUFZUCxHQUFaLEVBQWlCSixLQUFLTSxXQUF0QixFQUFtQ0wsT0FBT0ssV0FBMUMsQ0FBbEI7QUFDQUYsVUFBSUssU0FBSixHQUFnQkUsWUFBWVAsR0FBWixFQUFpQkosS0FBS1MsU0FBdEIsRUFBaUNSLE9BQU9RLFNBQXhDLENBQWhCO0FBQ0FMLFVBQUlNLFNBQUosR0FBZ0JDLFlBQVlQLEdBQVosRUFBaUJKLEtBQUtVLFNBQXRCLEVBQWlDVCxPQUFPUyxTQUF4QyxDQUFoQjtBQUNEO0FBQ0Y7O0FBRUROLE1BQUlRLEtBQUosR0FBWSxFQUFaOztBQUVBLE1BQUlDLFlBQVksQ0FBaEI7QUFBQSxNQUNJQyxjQUFjLENBRGxCO0FBQUEsTUFFSUMsYUFBYSxDQUZqQjtBQUFBLE1BR0lDLGVBQWUsQ0FIbkI7O0FBS0EsU0FBT0gsWUFBWWIsS0FBS1ksS0FBTCxDQUFXSyxNQUF2QixJQUFpQ0gsY0FBY2IsT0FBT1csS0FBUCxDQUFhSyxNQUFuRSxFQUEyRTtBQUN6RSxRQUFJQyxjQUFjbEIsS0FBS1ksS0FBTCxDQUFXQyxTQUFYLEtBQXlCLEVBQUNNLFVBQVVDLFFBQVgsRUFBM0M7QUFBQSxRQUNJQyxnQkFBZ0JwQixPQUFPVyxLQUFQLENBQWFFLFdBQWIsS0FBNkIsRUFBQ0ssVUFBVUMsUUFBWCxFQURqRDs7QUFHQSxRQUFJRSxXQUFXSixXQUFYLEVBQXdCRyxhQUF4QixDQUFKLEVBQTRDO0FBQzFDO0FBQ0FqQixVQUFJUSxLQUFKLENBQVVXLElBQVYsQ0FBZUMsVUFBVU4sV0FBVixFQUF1QkgsVUFBdkIsQ0FBZjtBQUNBRjtBQUNBRyxzQkFBZ0JFLFlBQVlwQixRQUFaLEdBQXVCb0IsWUFBWXJCLFFBQW5EO0FBQ0QsS0FMRCxNQUtPLElBQUl5QixXQUFXRCxhQUFYLEVBQTBCSCxXQUExQixDQUFKLEVBQTRDO0FBQ2pEO0FBQ0FkLFVBQUlRLEtBQUosQ0FBVVcsSUFBVixDQUFlQyxVQUFVSCxhQUFWLEVBQXlCTCxZQUF6QixDQUFmO0FBQ0FGO0FBQ0FDLG9CQUFjTSxjQUFjdkIsUUFBZCxHQUF5QnVCLGNBQWN4QixRQUFyRDtBQUNELEtBTE0sTUFLQTtBQUNMO0FBQ0EsVUFBSTRCLGFBQWE7QUFDZk4sa0JBQVVPLEtBQUtDLEdBQUwsQ0FBU1QsWUFBWUMsUUFBckIsRUFBK0JFLGNBQWNGLFFBQTdDLENBREs7QUFFZnRCLGtCQUFVLENBRks7QUFHZitCLGtCQUFVRixLQUFLQyxHQUFMLENBQVNULFlBQVlVLFFBQVosR0FBdUJiLFVBQWhDLEVBQTRDTSxjQUFjRixRQUFkLEdBQXlCSCxZQUFyRSxDQUhLO0FBSWZsQixrQkFBVSxDQUpLO0FBS2ZGLGVBQU87QUFMUSxPQUFqQjtBQU9BaUMsaUJBQVdKLFVBQVgsRUFBdUJQLFlBQVlDLFFBQW5DLEVBQTZDRCxZQUFZdEIsS0FBekQsRUFBZ0V5QixjQUFjRixRQUE5RSxFQUF3RkUsY0FBY3pCLEtBQXRHO0FBQ0FrQjtBQUNBRDs7QUFFQVQsVUFBSVEsS0FBSixDQUFVVyxJQUFWLENBQWVFLFVBQWY7QUFDRDtBQUNGOztBQUVELFNBQU9yQixHQUFQO0FBQ0Q7O0FBRUQsU0FBU0QsU0FBVCxDQUFtQjJCLEtBQW5CLEVBQTBCNUIsSUFBMUIsRUFBZ0M7QUFDOUIsTUFBSSxPQUFPNEIsS0FBUCxLQUFpQixRQUFyQixFQUErQjtBQUM3QixRQUFJLE9BQU9DLElBQVAsQ0FBWUQsS0FBWixLQUF1QixXQUFXQyxJQUFYLENBQWdCRCxLQUFoQixDQUEzQixFQUFvRDtBQUNsRCxhQUFPLHlFQUFXQSxLQUFYLEVBQWtCLENBQWxCO0FBQVA7QUFDRDs7QUFFRCxRQUFJLENBQUM1QixJQUFMLEVBQVc7QUFDVCxZQUFNLElBQUk4QixLQUFKLENBQVUsa0RBQVYsQ0FBTjtBQUNEO0FBQ0QsV0FBTywrRUFBZ0JqQyxTQUFoQixFQUEyQkEsU0FBM0IsRUFBc0NHLElBQXRDLEVBQTRDNEIsS0FBNUM7QUFBUDtBQUNEOztBQUVELFNBQU9BLEtBQVA7QUFDRDs7QUFFRCxTQUFTdkIsZUFBVCxDQUF5QjBCLEtBQXpCLEVBQWdDO0FBQzlCLFNBQU9BLE1BQU0zQixXQUFOLElBQXFCMkIsTUFBTTNCLFdBQU4sS0FBc0IyQixNQUFNekIsV0FBeEQ7QUFDRDs7QUFFRCxTQUFTRyxXQUFULENBQXFCTixLQUFyQixFQUE0QkwsSUFBNUIsRUFBa0NDLE1BQWxDLEVBQTBDO0FBQ3hDLE1BQUlELFNBQVNDLE1BQWIsRUFBcUI7QUFDbkIsV0FBT0QsSUFBUDtBQUNELEdBRkQsTUFFTztBQUNMSyxVQUFNNkIsUUFBTixHQUFpQixJQUFqQjtBQUNBLFdBQU8sRUFBQ2xDLFVBQUQsRUFBT0MsY0FBUCxFQUFQO0FBQ0Q7QUFDRjs7QUFFRCxTQUFTcUIsVUFBVCxDQUFvQlMsSUFBcEIsRUFBMEJJLEtBQTFCLEVBQWlDO0FBQy9CLFNBQU9KLEtBQUtaLFFBQUwsR0FBZ0JnQixNQUFNaEIsUUFBdEIsSUFDRFksS0FBS1osUUFBTCxHQUFnQlksS0FBS2xDLFFBQXRCLEdBQWtDc0MsTUFBTWhCLFFBRDdDO0FBRUQ7O0FBRUQsU0FBU0ssU0FBVCxDQUFtQjlCLElBQW5CLEVBQXlCMEMsTUFBekIsRUFBaUM7QUFDL0IsU0FBTztBQUNMakIsY0FBVXpCLEtBQUt5QixRQURWLEVBQ29CdEIsVUFBVUgsS0FBS0csUUFEbkM7QUFFTCtCLGNBQVVsQyxLQUFLa0MsUUFBTCxHQUFnQlEsTUFGckIsRUFFNkJ0QyxVQUFVSixLQUFLSSxRQUY1QztBQUdMRixXQUFPRixLQUFLRTtBQUhQLEdBQVA7QUFLRDs7QUFFRCxTQUFTaUMsVUFBVCxDQUFvQm5DLElBQXBCLEVBQTBCcUIsVUFBMUIsRUFBc0NzQixTQUF0QyxFQUFpREMsV0FBakQsRUFBOERDLFVBQTlELEVBQTBFO0FBQ3hFO0FBQ0E7QUFDQSxNQUFJdkMsT0FBTyxFQUFDb0MsUUFBUXJCLFVBQVQsRUFBcUJuQixPQUFPeUMsU0FBNUIsRUFBdUNoQyxPQUFPLENBQTlDLEVBQVg7QUFBQSxNQUNJbUMsUUFBUSxFQUFDSixRQUFRRSxXQUFULEVBQXNCMUMsT0FBTzJDLFVBQTdCLEVBQXlDbEMsT0FBTyxDQUFoRCxFQURaOztBQUdBO0FBQ0FvQyxnQkFBYy9DLElBQWQsRUFBb0JNLElBQXBCLEVBQTBCd0MsS0FBMUI7QUFDQUMsZ0JBQWMvQyxJQUFkLEVBQW9COEMsS0FBcEIsRUFBMkJ4QyxJQUEzQjs7QUFFQTtBQUNBLFNBQU9BLEtBQUtLLEtBQUwsR0FBYUwsS0FBS0osS0FBTCxDQUFXcUIsTUFBeEIsSUFBa0N1QixNQUFNbkMsS0FBTixHQUFjbUMsTUFBTTVDLEtBQU4sQ0FBWXFCLE1BQW5FLEVBQTJFO0FBQ3pFLFFBQUlDLGNBQWNsQixLQUFLSixLQUFMLENBQVdJLEtBQUtLLEtBQWhCLENBQWxCO0FBQUEsUUFDSXFDLGVBQWVGLE1BQU01QyxLQUFOLENBQVk0QyxNQUFNbkMsS0FBbEIsQ0FEbkI7O0FBR0EsUUFBSSxDQUFDYSxZQUFZLENBQVosTUFBbUIsR0FBbkIsSUFBMEJBLFlBQVksQ0FBWixNQUFtQixHQUE5QyxNQUNJd0IsYUFBYSxDQUFiLE1BQW9CLEdBQXBCLElBQTJCQSxhQUFhLENBQWIsTUFBb0IsR0FEbkQsQ0FBSixFQUM2RDtBQUMzRDtBQUNBQyxtQkFBYWpELElBQWIsRUFBbUJNLElBQW5CLEVBQXlCd0MsS0FBekI7QUFDRCxLQUpELE1BSU8sSUFBSXRCLFlBQVksQ0FBWixNQUFtQixHQUFuQixJQUEwQndCLGFBQWEsQ0FBYixNQUFvQixHQUFsRCxFQUF1RDtBQUFBOztBQUFBLDhCQUM1RDtBQUNBLDBFQUFLOUMsS0FBTCxFQUFXMkIsSUFBWCw0TEFBb0JxQixjQUFjNUMsSUFBZCxDQUFwQjtBQUNELEtBSE0sTUFHQSxJQUFJMEMsYUFBYSxDQUFiLE1BQW9CLEdBQXBCLElBQTJCeEIsWUFBWSxDQUFaLE1BQW1CLEdBQWxELEVBQXVEO0FBQUE7O0FBQUEsOEJBQzVEO0FBQ0EsMkVBQUt0QixLQUFMLEVBQVcyQixJQUFYLDZMQUFvQnFCLGNBQWNKLEtBQWQsQ0FBcEI7QUFDRCxLQUhNLE1BR0EsSUFBSXRCLFlBQVksQ0FBWixNQUFtQixHQUFuQixJQUEwQndCLGFBQWEsQ0FBYixNQUFvQixHQUFsRCxFQUF1RDtBQUM1RDtBQUNBRyxjQUFRbkQsSUFBUixFQUFjTSxJQUFkLEVBQW9Cd0MsS0FBcEI7QUFDRCxLQUhNLE1BR0EsSUFBSUUsYUFBYSxDQUFiLE1BQW9CLEdBQXBCLElBQTJCeEIsWUFBWSxDQUFaLE1BQW1CLEdBQWxELEVBQXVEO0FBQzVEO0FBQ0EyQixjQUFRbkQsSUFBUixFQUFjOEMsS0FBZCxFQUFxQnhDLElBQXJCLEVBQTJCLElBQTNCO0FBQ0QsS0FITSxNQUdBLElBQUlrQixnQkFBZ0J3QixZQUFwQixFQUFrQztBQUN2QztBQUNBaEQsV0FBS0UsS0FBTCxDQUFXMkIsSUFBWCxDQUFnQkwsV0FBaEI7QUFDQWxCLFdBQUtLLEtBQUw7QUFDQW1DLFlBQU1uQyxLQUFOO0FBQ0QsS0FMTSxNQUtBO0FBQ0w7QUFDQTZCLGVBQVN4QyxJQUFULEVBQWVrRCxjQUFjNUMsSUFBZCxDQUFmLEVBQW9DNEMsY0FBY0osS0FBZCxDQUFwQztBQUNEO0FBQ0Y7O0FBRUQ7QUFDQU0saUJBQWVwRCxJQUFmLEVBQXFCTSxJQUFyQjtBQUNBOEMsaUJBQWVwRCxJQUFmLEVBQXFCOEMsS0FBckI7O0FBRUFoRCxnQkFBY0UsSUFBZDtBQUNEOztBQUVELFNBQVNpRCxZQUFULENBQXNCakQsSUFBdEIsRUFBNEJNLElBQTVCLEVBQWtDd0MsS0FBbEMsRUFBeUM7QUFDdkMsTUFBSU8sWUFBWUgsY0FBYzVDLElBQWQsQ0FBaEI7QUFBQSxNQUNJZ0QsZUFBZUosY0FBY0osS0FBZCxDQURuQjs7QUFHQSxNQUFJUyxXQUFXRixTQUFYLEtBQXlCRSxXQUFXRCxZQUFYLENBQTdCLEVBQXVEO0FBQ3JEO0FBQ0EsUUFBSSw4RUFBZ0JELFNBQWhCLEVBQTJCQyxZQUEzQixLQUNHRSxtQkFBbUJWLEtBQW5CLEVBQTBCTyxTQUExQixFQUFxQ0EsVUFBVTlCLE1BQVYsR0FBbUIrQixhQUFhL0IsTUFBckUsQ0FEUCxFQUNxRjtBQUFBOztBQUFBLDZCQUNuRixzRUFBS3JCLEtBQUwsRUFBVzJCLElBQVgsNkxBQW9Cd0IsU0FBcEI7QUFDQTtBQUNELEtBSkQsTUFJTyxJQUFJLDhFQUFnQkMsWUFBaEIsRUFBOEJELFNBQTlCLEtBQ0pHLG1CQUFtQmxELElBQW5CLEVBQXlCZ0QsWUFBekIsRUFBdUNBLGFBQWEvQixNQUFiLEdBQXNCOEIsVUFBVTlCLE1BQXZFLENBREEsRUFDZ0Y7QUFBQTs7QUFBQSw2QkFDckYsc0VBQUtyQixLQUFMLEVBQVcyQixJQUFYLDZMQUFvQnlCLFlBQXBCO0FBQ0E7QUFDRDtBQUNGLEdBWEQsTUFXTyxJQUFJLHlFQUFXRCxTQUFYLEVBQXNCQyxZQUF0QixDQUFKLEVBQXlDO0FBQUE7O0FBQUEsMkJBQzlDLHNFQUFLcEQsS0FBTCxFQUFXMkIsSUFBWCw2TEFBb0J3QixTQUFwQjtBQUNBO0FBQ0Q7O0FBRURiLFdBQVN4QyxJQUFULEVBQWVxRCxTQUFmLEVBQTBCQyxZQUExQjtBQUNEOztBQUVELFNBQVNILE9BQVQsQ0FBaUJuRCxJQUFqQixFQUF1Qk0sSUFBdkIsRUFBNkJ3QyxLQUE3QixFQUFvQ1csSUFBcEMsRUFBMEM7QUFDeEMsTUFBSUosWUFBWUgsY0FBYzVDLElBQWQsQ0FBaEI7QUFBQSxNQUNJZ0QsZUFBZUksZUFBZVosS0FBZixFQUFzQk8sU0FBdEIsQ0FEbkI7QUFFQSxNQUFJQyxhQUFhSyxNQUFqQixFQUF5QjtBQUFBOztBQUFBLDJCQUN2QixzRUFBS3pELEtBQUwsRUFBVzJCLElBQVgsNkxBQW9CeUIsYUFBYUssTUFBakM7QUFDRCxHQUZELE1BRU87QUFDTG5CLGFBQVN4QyxJQUFULEVBQWV5RCxPQUFPSCxZQUFQLEdBQXNCRCxTQUFyQyxFQUFnREksT0FBT0osU0FBUCxHQUFtQkMsWUFBbkU7QUFDRDtBQUNGOztBQUVELFNBQVNkLFFBQVQsQ0FBa0J4QyxJQUFsQixFQUF3Qk0sSUFBeEIsRUFBOEJ3QyxLQUE5QixFQUFxQztBQUNuQzlDLE9BQUt3QyxRQUFMLEdBQWdCLElBQWhCO0FBQ0F4QyxPQUFLRSxLQUFMLENBQVcyQixJQUFYLENBQWdCO0FBQ2RXLGNBQVUsSUFESTtBQUVkbEMsVUFBTUEsSUFGUTtBQUdkQyxZQUFRdUM7QUFITSxHQUFoQjtBQUtEOztBQUVELFNBQVNDLGFBQVQsQ0FBdUIvQyxJQUF2QixFQUE2QjRELE1BQTdCLEVBQXFDZCxLQUFyQyxFQUE0QztBQUMxQyxTQUFPYyxPQUFPbEIsTUFBUCxHQUFnQkksTUFBTUosTUFBdEIsSUFBZ0NrQixPQUFPakQsS0FBUCxHQUFlaUQsT0FBTzFELEtBQVAsQ0FBYXFCLE1BQW5FLEVBQTJFO0FBQ3pFLFFBQUlzQyxPQUFPRCxPQUFPMUQsS0FBUCxDQUFhMEQsT0FBT2pELEtBQVAsRUFBYixDQUFYO0FBQ0FYLFNBQUtFLEtBQUwsQ0FBVzJCLElBQVgsQ0FBZ0JnQyxJQUFoQjtBQUNBRCxXQUFPbEIsTUFBUDtBQUNEO0FBQ0Y7QUFDRCxTQUFTVSxjQUFULENBQXdCcEQsSUFBeEIsRUFBOEI0RCxNQUE5QixFQUFzQztBQUNwQyxTQUFPQSxPQUFPakQsS0FBUCxHQUFlaUQsT0FBTzFELEtBQVAsQ0FBYXFCLE1BQW5DLEVBQTJDO0FBQ3pDLFFBQUlzQyxPQUFPRCxPQUFPMUQsS0FBUCxDQUFhMEQsT0FBT2pELEtBQVAsRUFBYixDQUFYO0FBQ0FYLFNBQUtFLEtBQUwsQ0FBVzJCLElBQVgsQ0FBZ0JnQyxJQUFoQjtBQUNEO0FBQ0Y7O0FBRUQsU0FBU1gsYUFBVCxDQUF1QlksS0FBdkIsRUFBOEI7QUFDNUIsTUFBSXBELE1BQU0sRUFBVjtBQUFBLE1BQ0lxRCxZQUFZRCxNQUFNNUQsS0FBTixDQUFZNEQsTUFBTW5ELEtBQWxCLEVBQXlCLENBQXpCLENBRGhCO0FBRUEsU0FBT21ELE1BQU1uRCxLQUFOLEdBQWNtRCxNQUFNNUQsS0FBTixDQUFZcUIsTUFBakMsRUFBeUM7QUFDdkMsUUFBSXNDLE9BQU9DLE1BQU01RCxLQUFOLENBQVk0RCxNQUFNbkQsS0FBbEIsQ0FBWDs7QUFFQTtBQUNBLFFBQUlvRCxjQUFjLEdBQWQsSUFBcUJGLEtBQUssQ0FBTCxNQUFZLEdBQXJDLEVBQTBDO0FBQ3hDRSxrQkFBWSxHQUFaO0FBQ0Q7O0FBRUQsUUFBSUEsY0FBY0YsS0FBSyxDQUFMLENBQWxCLEVBQTJCO0FBQ3pCbkQsVUFBSW1CLElBQUosQ0FBU2dDLElBQVQ7QUFDQUMsWUFBTW5ELEtBQU47QUFDRCxLQUhELE1BR087QUFDTDtBQUNEO0FBQ0Y7O0FBRUQsU0FBT0QsR0FBUDtBQUNEO0FBQ0QsU0FBU2dELGNBQVQsQ0FBd0JJLEtBQXhCLEVBQStCRSxZQUEvQixFQUE2QztBQUMzQyxNQUFJQyxVQUFVLEVBQWQ7QUFBQSxNQUNJTixTQUFTLEVBRGI7QUFBQSxNQUVJTyxhQUFhLENBRmpCO0FBQUEsTUFHSUMsaUJBQWlCLEtBSHJCO0FBQUEsTUFJSUMsYUFBYSxLQUpqQjtBQUtBLFNBQU9GLGFBQWFGLGFBQWF6QyxNQUExQixJQUNFdUMsTUFBTW5ELEtBQU4sR0FBY21ELE1BQU01RCxLQUFOLENBQVlxQixNQURuQyxFQUMyQztBQUN6QyxRQUFJOEMsU0FBU1AsTUFBTTVELEtBQU4sQ0FBWTRELE1BQU1uRCxLQUFsQixDQUFiO0FBQUEsUUFDSTJELFFBQVFOLGFBQWFFLFVBQWIsQ0FEWjs7QUFHQTtBQUNBLFFBQUlJLE1BQU0sQ0FBTixNQUFhLEdBQWpCLEVBQXNCO0FBQ3BCO0FBQ0Q7O0FBRURILHFCQUFpQkEsa0JBQWtCRSxPQUFPLENBQVAsTUFBYyxHQUFqRDs7QUFFQVYsV0FBTzlCLElBQVAsQ0FBWXlDLEtBQVo7QUFDQUo7O0FBRUE7QUFDQTtBQUNBLFFBQUlHLE9BQU8sQ0FBUCxNQUFjLEdBQWxCLEVBQXVCO0FBQ3JCRCxtQkFBYSxJQUFiOztBQUVBLGFBQU9DLE9BQU8sQ0FBUCxNQUFjLEdBQXJCLEVBQTBCO0FBQ3hCSixnQkFBUXBDLElBQVIsQ0FBYXdDLE1BQWI7QUFDQUEsaUJBQVNQLE1BQU01RCxLQUFOLENBQVksRUFBRTRELE1BQU1uRCxLQUFwQixDQUFUO0FBQ0Q7QUFDRjs7QUFFRCxRQUFJMkQsTUFBTUMsTUFBTixDQUFhLENBQWIsTUFBb0JGLE9BQU9FLE1BQVAsQ0FBYyxDQUFkLENBQXhCLEVBQTBDO0FBQ3hDTixjQUFRcEMsSUFBUixDQUFhd0MsTUFBYjtBQUNBUCxZQUFNbkQsS0FBTjtBQUNELEtBSEQsTUFHTztBQUNMeUQsbUJBQWEsSUFBYjtBQUNEO0FBQ0Y7O0FBRUQsTUFBSSxDQUFDSixhQUFhRSxVQUFiLEtBQTRCLEVBQTdCLEVBQWlDLENBQWpDLE1BQXdDLEdBQXhDLElBQ0dDLGNBRFAsRUFDdUI7QUFDckJDLGlCQUFhLElBQWI7QUFDRDs7QUFFRCxNQUFJQSxVQUFKLEVBQWdCO0FBQ2QsV0FBT0gsT0FBUDtBQUNEOztBQUVELFNBQU9DLGFBQWFGLGFBQWF6QyxNQUFqQyxFQUF5QztBQUN2Q29DLFdBQU85QixJQUFQLENBQVltQyxhQUFhRSxZQUFiLENBQVo7QUFDRDs7QUFFRCxTQUFPO0FBQ0xQLGtCQURLO0FBRUxNO0FBRkssR0FBUDtBQUlEOztBQUVELFNBQVNWLFVBQVQsQ0FBb0JVLE9BQXBCLEVBQTZCO0FBQzNCLFNBQU9BLFFBQVFPLE1BQVIsQ0FBZSxVQUFTQyxJQUFULEVBQWVKLE1BQWYsRUFBdUI7QUFDM0MsV0FBT0ksUUFBUUosT0FBTyxDQUFQLE1BQWMsR0FBN0I7QUFDRCxHQUZNLEVBRUosSUFGSSxDQUFQO0FBR0Q7QUFDRCxTQUFTYixrQkFBVCxDQUE0Qk0sS0FBNUIsRUFBbUNZLGFBQW5DLEVBQWtEQyxLQUFsRCxFQUF5RDtBQUN2RCxPQUFLLElBQUlDLElBQUksQ0FBYixFQUFnQkEsSUFBSUQsS0FBcEIsRUFBMkJDLEdBQTNCLEVBQWdDO0FBQzlCLFFBQUlDLGdCQUFnQkgsY0FBY0EsY0FBY25ELE1BQWQsR0FBdUJvRCxLQUF2QixHQUErQkMsQ0FBN0MsRUFBZ0RMLE1BQWhELENBQXVELENBQXZELENBQXBCO0FBQ0EsUUFBSVQsTUFBTTVELEtBQU4sQ0FBWTRELE1BQU1uRCxLQUFOLEdBQWNpRSxDQUExQixNQUFpQyxNQUFNQyxhQUEzQyxFQUEwRDtBQUN4RCxhQUFPLEtBQVA7QUFDRDtBQUNGOztBQUVEZixRQUFNbkQsS0FBTixJQUFlZ0UsS0FBZjtBQUNBLFNBQU8sSUFBUDtBQUNEOztBQUVELFNBQVMxRSxtQkFBVCxDQUE2QkMsS0FBN0IsRUFBb0M7QUFDbEMsTUFBSUMsV0FBVyxDQUFmO0FBQ0EsTUFBSUMsV0FBVyxDQUFmOztBQUVBRixRQUFNNEUsT0FBTixDQUFjLFVBQVNqQixJQUFULEVBQWU7QUFDM0IsUUFBSSxPQUFPQSxJQUFQLEtBQWdCLFFBQXBCLEVBQThCO0FBQzVCLFVBQUlrQixVQUFVOUUsb0JBQW9CNEQsS0FBS3ZELElBQXpCLENBQWQ7QUFDQSxVQUFJMEUsYUFBYS9FLG9CQUFvQjRELEtBQUt0RCxNQUF6QixDQUFqQjs7QUFFQSxVQUFJSixhQUFhRSxTQUFqQixFQUE0QjtBQUMxQixZQUFJMEUsUUFBUTVFLFFBQVIsS0FBcUI2RSxXQUFXN0UsUUFBcEMsRUFBOEM7QUFDNUNBLHNCQUFZNEUsUUFBUTVFLFFBQXBCO0FBQ0QsU0FGRCxNQUVPO0FBQ0xBLHFCQUFXRSxTQUFYO0FBQ0Q7QUFDRjs7QUFFRCxVQUFJRCxhQUFhQyxTQUFqQixFQUE0QjtBQUMxQixZQUFJMEUsUUFBUTNFLFFBQVIsS0FBcUI0RSxXQUFXNUUsUUFBcEMsRUFBOEM7QUFDNUNBLHNCQUFZMkUsUUFBUTNFLFFBQXBCO0FBQ0QsU0FGRCxNQUVPO0FBQ0xBLHFCQUFXQyxTQUFYO0FBQ0Q7QUFDRjtBQUNGLEtBbkJELE1BbUJPO0FBQ0wsVUFBSUQsYUFBYUMsU0FBYixLQUEyQndELEtBQUssQ0FBTCxNQUFZLEdBQVosSUFBbUJBLEtBQUssQ0FBTCxNQUFZLEdBQTFELENBQUosRUFBb0U7QUFDbEV6RDtBQUNEO0FBQ0QsVUFBSUQsYUFBYUUsU0FBYixLQUEyQndELEtBQUssQ0FBTCxNQUFZLEdBQVosSUFBbUJBLEtBQUssQ0FBTCxNQUFZLEdBQTFELENBQUosRUFBb0U7QUFDbEUxRDtBQUNEO0FBQ0Y7QUFDRixHQTVCRDs7QUE4QkEsU0FBTyxFQUFDQSxrQkFBRCxFQUFXQyxrQkFBWCxFQUFQO0FBQ0QiLCJmaWxlIjoibWVyZ2UuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3N0cnVjdHVyZWRQYXRjaH0gZnJvbSAnLi9jcmVhdGUnO1xuaW1wb3J0IHtwYXJzZVBhdGNofSBmcm9tICcuL3BhcnNlJztcblxuaW1wb3J0IHthcnJheUVxdWFsLCBhcnJheVN0YXJ0c1dpdGh9IGZyb20gJy4uL3V0aWwvYXJyYXknO1xuXG5leHBvcnQgZnVuY3Rpb24gY2FsY0xpbmVDb3VudChodW5rKSB7XG4gIGNvbnN0IHtvbGRMaW5lcywgbmV3TGluZXN9ID0gY2FsY09sZE5ld0xpbmVDb3VudChodW5rLmxpbmVzKTtcblxuICBpZiAob2xkTGluZXMgIT09IHVuZGVmaW5lZCkge1xuICAgIGh1bmsub2xkTGluZXMgPSBvbGRMaW5lcztcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgaHVuay5vbGRMaW5lcztcbiAgfVxuXG4gIGlmIChuZXdMaW5lcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaHVuay5uZXdMaW5lcyA9IG5ld0xpbmVzO1xuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBodW5rLm5ld0xpbmVzO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZShtaW5lLCB0aGVpcnMsIGJhc2UpIHtcbiAgbWluZSA9IGxvYWRQYXRjaChtaW5lLCBiYXNlKTtcbiAgdGhlaXJzID0gbG9hZFBhdGNoKHRoZWlycywgYmFzZSk7XG5cbiAgbGV0IHJldCA9IHt9O1xuXG4gIC8vIEZvciBpbmRleCB3ZSBqdXN0IGxldCBpdCBwYXNzIHRocm91Z2ggYXMgaXQgZG9lc24ndCBoYXZlIGFueSBuZWNlc3NhcnkgbWVhbmluZy5cbiAgLy8gTGVhdmluZyBzYW5pdHkgY2hlY2tzIG9uIHRoaXMgdG8gdGhlIEFQSSBjb25zdW1lciB0aGF0IG1heSBrbm93IG1vcmUgYWJvdXQgdGhlXG4gIC8vIG1lYW5pbmcgaW4gdGhlaXIgb3duIGNvbnRleHQuXG4gIGlmIChtaW5lLmluZGV4IHx8IHRoZWlycy5pbmRleCkge1xuICAgIHJldC5pbmRleCA9IG1pbmUuaW5kZXggfHwgdGhlaXJzLmluZGV4O1xuICB9XG5cbiAgaWYgKG1pbmUubmV3RmlsZU5hbWUgfHwgdGhlaXJzLm5ld0ZpbGVOYW1lKSB7XG4gICAgaWYgKCFmaWxlTmFtZUNoYW5nZWQobWluZSkpIHtcbiAgICAgIC8vIE5vIGhlYWRlciBvciBubyBjaGFuZ2UgaW4gb3VycywgdXNlIHRoZWlycyAoYW5kIG91cnMgaWYgdGhlaXJzIGRvZXMgbm90IGV4aXN0KVxuICAgICAgcmV0Lm9sZEZpbGVOYW1lID0gdGhlaXJzLm9sZEZpbGVOYW1lIHx8IG1pbmUub2xkRmlsZU5hbWU7XG4gICAgICByZXQubmV3RmlsZU5hbWUgPSB0aGVpcnMubmV3RmlsZU5hbWUgfHwgbWluZS5uZXdGaWxlTmFtZTtcbiAgICAgIHJldC5vbGRIZWFkZXIgPSB0aGVpcnMub2xkSGVhZGVyIHx8IG1pbmUub2xkSGVhZGVyO1xuICAgICAgcmV0Lm5ld0hlYWRlciA9IHRoZWlycy5uZXdIZWFkZXIgfHwgbWluZS5uZXdIZWFkZXI7XG4gICAgfSBlbHNlIGlmICghZmlsZU5hbWVDaGFuZ2VkKHRoZWlycykpIHtcbiAgICAgIC8vIE5vIGhlYWRlciBvciBubyBjaGFuZ2UgaW4gdGhlaXJzLCB1c2Ugb3Vyc1xuICAgICAgcmV0Lm9sZEZpbGVOYW1lID0gbWluZS5vbGRGaWxlTmFtZTtcbiAgICAgIHJldC5uZXdGaWxlTmFtZSA9IG1pbmUubmV3RmlsZU5hbWU7XG4gICAgICByZXQub2xkSGVhZGVyID0gbWluZS5vbGRIZWFkZXI7XG4gICAgICByZXQubmV3SGVhZGVyID0gbWluZS5uZXdIZWFkZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEJvdGggY2hhbmdlZC4uLiBmaWd1cmUgaXQgb3V0XG4gICAgICByZXQub2xkRmlsZU5hbWUgPSBzZWxlY3RGaWVsZChyZXQsIG1pbmUub2xkRmlsZU5hbWUsIHRoZWlycy5vbGRGaWxlTmFtZSk7XG4gICAgICByZXQubmV3RmlsZU5hbWUgPSBzZWxlY3RGaWVsZChyZXQsIG1pbmUubmV3RmlsZU5hbWUsIHRoZWlycy5uZXdGaWxlTmFtZSk7XG4gICAgICByZXQub2xkSGVhZGVyID0gc2VsZWN0RmllbGQocmV0LCBtaW5lLm9sZEhlYWRlciwgdGhlaXJzLm9sZEhlYWRlcik7XG4gICAgICByZXQubmV3SGVhZGVyID0gc2VsZWN0RmllbGQocmV0LCBtaW5lLm5ld0hlYWRlciwgdGhlaXJzLm5ld0hlYWRlcik7XG4gICAgfVxuICB9XG5cbiAgcmV0Lmh1bmtzID0gW107XG5cbiAgbGV0IG1pbmVJbmRleCA9IDAsXG4gICAgICB0aGVpcnNJbmRleCA9IDAsXG4gICAgICBtaW5lT2Zmc2V0ID0gMCxcbiAgICAgIHRoZWlyc09mZnNldCA9IDA7XG5cbiAgd2hpbGUgKG1pbmVJbmRleCA8IG1pbmUuaHVua3MubGVuZ3RoIHx8IHRoZWlyc0luZGV4IDwgdGhlaXJzLmh1bmtzLmxlbmd0aCkge1xuICAgIGxldCBtaW5lQ3VycmVudCA9IG1pbmUuaHVua3NbbWluZUluZGV4XSB8fCB7b2xkU3RhcnQ6IEluZmluaXR5fSxcbiAgICAgICAgdGhlaXJzQ3VycmVudCA9IHRoZWlycy5odW5rc1t0aGVpcnNJbmRleF0gfHwge29sZFN0YXJ0OiBJbmZpbml0eX07XG5cbiAgICBpZiAoaHVua0JlZm9yZShtaW5lQ3VycmVudCwgdGhlaXJzQ3VycmVudCkpIHtcbiAgICAgIC8vIFRoaXMgcGF0Y2ggZG9lcyBub3Qgb3ZlcmxhcCB3aXRoIGFueSBvZiB0aGUgb3RoZXJzLCB5YXkuXG4gICAgICByZXQuaHVua3MucHVzaChjbG9uZUh1bmsobWluZUN1cnJlbnQsIG1pbmVPZmZzZXQpKTtcbiAgICAgIG1pbmVJbmRleCsrO1xuICAgICAgdGhlaXJzT2Zmc2V0ICs9IG1pbmVDdXJyZW50Lm5ld0xpbmVzIC0gbWluZUN1cnJlbnQub2xkTGluZXM7XG4gICAgfSBlbHNlIGlmIChodW5rQmVmb3JlKHRoZWlyc0N1cnJlbnQsIG1pbmVDdXJyZW50KSkge1xuICAgICAgLy8gVGhpcyBwYXRjaCBkb2VzIG5vdCBvdmVybGFwIHdpdGggYW55IG9mIHRoZSBvdGhlcnMsIHlheS5cbiAgICAgIHJldC5odW5rcy5wdXNoKGNsb25lSHVuayh0aGVpcnNDdXJyZW50LCB0aGVpcnNPZmZzZXQpKTtcbiAgICAgIHRoZWlyc0luZGV4Kys7XG4gICAgICBtaW5lT2Zmc2V0ICs9IHRoZWlyc0N1cnJlbnQubmV3TGluZXMgLSB0aGVpcnNDdXJyZW50Lm9sZExpbmVzO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBPdmVybGFwLCBtZXJnZSBhcyBiZXN0IHdlIGNhblxuICAgICAgbGV0IG1lcmdlZEh1bmsgPSB7XG4gICAgICAgIG9sZFN0YXJ0OiBNYXRoLm1pbihtaW5lQ3VycmVudC5vbGRTdGFydCwgdGhlaXJzQ3VycmVudC5vbGRTdGFydCksXG4gICAgICAgIG9sZExpbmVzOiAwLFxuICAgICAgICBuZXdTdGFydDogTWF0aC5taW4obWluZUN1cnJlbnQubmV3U3RhcnQgKyBtaW5lT2Zmc2V0LCB0aGVpcnNDdXJyZW50Lm9sZFN0YXJ0ICsgdGhlaXJzT2Zmc2V0KSxcbiAgICAgICAgbmV3TGluZXM6IDAsXG4gICAgICAgIGxpbmVzOiBbXVxuICAgICAgfTtcbiAgICAgIG1lcmdlTGluZXMobWVyZ2VkSHVuaywgbWluZUN1cnJlbnQub2xkU3RhcnQsIG1pbmVDdXJyZW50LmxpbmVzLCB0aGVpcnNDdXJyZW50Lm9sZFN0YXJ0LCB0aGVpcnNDdXJyZW50LmxpbmVzKTtcbiAgICAgIHRoZWlyc0luZGV4Kys7XG4gICAgICBtaW5lSW5kZXgrKztcblxuICAgICAgcmV0Lmh1bmtzLnB1c2gobWVyZ2VkSHVuayk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gbG9hZFBhdGNoKHBhcmFtLCBiYXNlKSB7XG4gIGlmICh0eXBlb2YgcGFyYW0gPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKC9eQEAvbS50ZXN0KHBhcmFtKSB8fCAoL15JbmRleDovbS50ZXN0KHBhcmFtKSkpIHtcbiAgICAgIHJldHVybiBwYXJzZVBhdGNoKHBhcmFtKVswXTtcbiAgICB9XG5cbiAgICBpZiAoIWJhc2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTXVzdCBwcm92aWRlIGEgYmFzZSByZWZlcmVuY2Ugb3IgcGFzcyBpbiBhIHBhdGNoJyk7XG4gICAgfVxuICAgIHJldHVybiBzdHJ1Y3R1cmVkUGF0Y2godW5kZWZpbmVkLCB1bmRlZmluZWQsIGJhc2UsIHBhcmFtKTtcbiAgfVxuXG4gIHJldHVybiBwYXJhbTtcbn1cblxuZnVuY3Rpb24gZmlsZU5hbWVDaGFuZ2VkKHBhdGNoKSB7XG4gIHJldHVybiBwYXRjaC5uZXdGaWxlTmFtZSAmJiBwYXRjaC5uZXdGaWxlTmFtZSAhPT0gcGF0Y2gub2xkRmlsZU5hbWU7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdEZpZWxkKGluZGV4LCBtaW5lLCB0aGVpcnMpIHtcbiAgaWYgKG1pbmUgPT09IHRoZWlycykge1xuICAgIHJldHVybiBtaW5lO1xuICB9IGVsc2Uge1xuICAgIGluZGV4LmNvbmZsaWN0ID0gdHJ1ZTtcbiAgICByZXR1cm4ge21pbmUsIHRoZWlyc307XG4gIH1cbn1cblxuZnVuY3Rpb24gaHVua0JlZm9yZSh0ZXN0LCBjaGVjaykge1xuICByZXR1cm4gdGVzdC5vbGRTdGFydCA8IGNoZWNrLm9sZFN0YXJ0XG4gICAgJiYgKHRlc3Qub2xkU3RhcnQgKyB0ZXN0Lm9sZExpbmVzKSA8IGNoZWNrLm9sZFN0YXJ0O1xufVxuXG5mdW5jdGlvbiBjbG9uZUh1bmsoaHVuaywgb2Zmc2V0KSB7XG4gIHJldHVybiB7XG4gICAgb2xkU3RhcnQ6IGh1bmsub2xkU3RhcnQsIG9sZExpbmVzOiBodW5rLm9sZExpbmVzLFxuICAgIG5ld1N0YXJ0OiBodW5rLm5ld1N0YXJ0ICsgb2Zmc2V0LCBuZXdMaW5lczogaHVuay5uZXdMaW5lcyxcbiAgICBsaW5lczogaHVuay5saW5lc1xuICB9O1xufVxuXG5mdW5jdGlvbiBtZXJnZUxpbmVzKGh1bmssIG1pbmVPZmZzZXQsIG1pbmVMaW5lcywgdGhlaXJPZmZzZXQsIHRoZWlyTGluZXMpIHtcbiAgLy8gVGhpcyB3aWxsIGdlbmVyYWxseSByZXN1bHQgaW4gYSBjb25mbGljdGVkIGh1bmssIGJ1dCB0aGVyZSBhcmUgY2FzZXMgd2hlcmUgdGhlIGNvbnRleHRcbiAgLy8gaXMgdGhlIG9ubHkgb3ZlcmxhcCB3aGVyZSB3ZSBjYW4gc3VjY2Vzc2Z1bGx5IG1lcmdlIHRoZSBjb250ZW50IGhlcmUuXG4gIGxldCBtaW5lID0ge29mZnNldDogbWluZU9mZnNldCwgbGluZXM6IG1pbmVMaW5lcywgaW5kZXg6IDB9LFxuICAgICAgdGhlaXIgPSB7b2Zmc2V0OiB0aGVpck9mZnNldCwgbGluZXM6IHRoZWlyTGluZXMsIGluZGV4OiAwfTtcblxuICAvLyBIYW5kbGUgYW55IGxlYWRpbmcgY29udGVudFxuICBpbnNlcnRMZWFkaW5nKGh1bmssIG1pbmUsIHRoZWlyKTtcbiAgaW5zZXJ0TGVhZGluZyhodW5rLCB0aGVpciwgbWluZSk7XG5cbiAgLy8gTm93IGluIHRoZSBvdmVybGFwIGNvbnRlbnQuIFNjYW4gdGhyb3VnaCBhbmQgc2VsZWN0IHRoZSBiZXN0IGNoYW5nZXMgZnJvbSBlYWNoLlxuICB3aGlsZSAobWluZS5pbmRleCA8IG1pbmUubGluZXMubGVuZ3RoICYmIHRoZWlyLmluZGV4IDwgdGhlaXIubGluZXMubGVuZ3RoKSB7XG4gICAgbGV0IG1pbmVDdXJyZW50ID0gbWluZS5saW5lc1ttaW5lLmluZGV4XSxcbiAgICAgICAgdGhlaXJDdXJyZW50ID0gdGhlaXIubGluZXNbdGhlaXIuaW5kZXhdO1xuXG4gICAgaWYgKChtaW5lQ3VycmVudFswXSA9PT0gJy0nIHx8IG1pbmVDdXJyZW50WzBdID09PSAnKycpXG4gICAgICAgICYmICh0aGVpckN1cnJlbnRbMF0gPT09ICctJyB8fCB0aGVpckN1cnJlbnRbMF0gPT09ICcrJykpIHtcbiAgICAgIC8vIEJvdGggbW9kaWZpZWQgLi4uXG4gICAgICBtdXR1YWxDaGFuZ2UoaHVuaywgbWluZSwgdGhlaXIpO1xuICAgIH0gZWxzZSBpZiAobWluZUN1cnJlbnRbMF0gPT09ICcrJyAmJiB0aGVpckN1cnJlbnRbMF0gPT09ICcgJykge1xuICAgICAgLy8gTWluZSBpbnNlcnRlZFxuICAgICAgaHVuay5saW5lcy5wdXNoKC4uLiBjb2xsZWN0Q2hhbmdlKG1pbmUpKTtcbiAgICB9IGVsc2UgaWYgKHRoZWlyQ3VycmVudFswXSA9PT0gJysnICYmIG1pbmVDdXJyZW50WzBdID09PSAnICcpIHtcbiAgICAgIC8vIFRoZWlycyBpbnNlcnRlZFxuICAgICAgaHVuay5saW5lcy5wdXNoKC4uLiBjb2xsZWN0Q2hhbmdlKHRoZWlyKSk7XG4gICAgfSBlbHNlIGlmIChtaW5lQ3VycmVudFswXSA9PT0gJy0nICYmIHRoZWlyQ3VycmVudFswXSA9PT0gJyAnKSB7XG4gICAgICAvLyBNaW5lIHJlbW92ZWQgb3IgZWRpdGVkXG4gICAgICByZW1vdmFsKGh1bmssIG1pbmUsIHRoZWlyKTtcbiAgICB9IGVsc2UgaWYgKHRoZWlyQ3VycmVudFswXSA9PT0gJy0nICYmIG1pbmVDdXJyZW50WzBdID09PSAnICcpIHtcbiAgICAgIC8vIFRoZWlyIHJlbW92ZWQgb3IgZWRpdGVkXG4gICAgICByZW1vdmFsKGh1bmssIHRoZWlyLCBtaW5lLCB0cnVlKTtcbiAgICB9IGVsc2UgaWYgKG1pbmVDdXJyZW50ID09PSB0aGVpckN1cnJlbnQpIHtcbiAgICAgIC8vIENvbnRleHQgaWRlbnRpdHlcbiAgICAgIGh1bmsubGluZXMucHVzaChtaW5lQ3VycmVudCk7XG4gICAgICBtaW5lLmluZGV4Kys7XG4gICAgICB0aGVpci5pbmRleCsrO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDb250ZXh0IG1pc21hdGNoXG4gICAgICBjb25mbGljdChodW5rLCBjb2xsZWN0Q2hhbmdlKG1pbmUpLCBjb2xsZWN0Q2hhbmdlKHRoZWlyKSk7XG4gICAgfVxuICB9XG5cbiAgLy8gTm93IHB1c2ggYW55dGhpbmcgdGhhdCBtYXkgYmUgcmVtYWluaW5nXG4gIGluc2VydFRyYWlsaW5nKGh1bmssIG1pbmUpO1xuICBpbnNlcnRUcmFpbGluZyhodW5rLCB0aGVpcik7XG5cbiAgY2FsY0xpbmVDb3VudChodW5rKTtcbn1cblxuZnVuY3Rpb24gbXV0dWFsQ2hhbmdlKGh1bmssIG1pbmUsIHRoZWlyKSB7XG4gIGxldCBteUNoYW5nZXMgPSBjb2xsZWN0Q2hhbmdlKG1pbmUpLFxuICAgICAgdGhlaXJDaGFuZ2VzID0gY29sbGVjdENoYW5nZSh0aGVpcik7XG5cbiAgaWYgKGFsbFJlbW92ZXMobXlDaGFuZ2VzKSAmJiBhbGxSZW1vdmVzKHRoZWlyQ2hhbmdlcykpIHtcbiAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIHJlbW92ZSBjaGFuZ2VzIHRoYXQgYXJlIHN1cGVyc2V0cyBvZiBvbmUgYW5vdGhlclxuICAgIGlmIChhcnJheVN0YXJ0c1dpdGgobXlDaGFuZ2VzLCB0aGVpckNoYW5nZXMpXG4gICAgICAgICYmIHNraXBSZW1vdmVTdXBlcnNldCh0aGVpciwgbXlDaGFuZ2VzLCBteUNoYW5nZXMubGVuZ3RoIC0gdGhlaXJDaGFuZ2VzLmxlbmd0aCkpIHtcbiAgICAgIGh1bmsubGluZXMucHVzaCguLi4gbXlDaGFuZ2VzKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKGFycmF5U3RhcnRzV2l0aCh0aGVpckNoYW5nZXMsIG15Q2hhbmdlcylcbiAgICAgICAgJiYgc2tpcFJlbW92ZVN1cGVyc2V0KG1pbmUsIHRoZWlyQ2hhbmdlcywgdGhlaXJDaGFuZ2VzLmxlbmd0aCAtIG15Q2hhbmdlcy5sZW5ndGgpKSB7XG4gICAgICBodW5rLmxpbmVzLnB1c2goLi4uIHRoZWlyQ2hhbmdlcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9IGVsc2UgaWYgKGFycmF5RXF1YWwobXlDaGFuZ2VzLCB0aGVpckNoYW5nZXMpKSB7XG4gICAgaHVuay5saW5lcy5wdXNoKC4uLiBteUNoYW5nZXMpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbmZsaWN0KGh1bmssIG15Q2hhbmdlcywgdGhlaXJDaGFuZ2VzKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZhbChodW5rLCBtaW5lLCB0aGVpciwgc3dhcCkge1xuICBsZXQgbXlDaGFuZ2VzID0gY29sbGVjdENoYW5nZShtaW5lKSxcbiAgICAgIHRoZWlyQ2hhbmdlcyA9IGNvbGxlY3RDb250ZXh0KHRoZWlyLCBteUNoYW5nZXMpO1xuICBpZiAodGhlaXJDaGFuZ2VzLm1lcmdlZCkge1xuICAgIGh1bmsubGluZXMucHVzaCguLi4gdGhlaXJDaGFuZ2VzLm1lcmdlZCk7XG4gIH0gZWxzZSB7XG4gICAgY29uZmxpY3QoaHVuaywgc3dhcCA/IHRoZWlyQ2hhbmdlcyA6IG15Q2hhbmdlcywgc3dhcCA/IG15Q2hhbmdlcyA6IHRoZWlyQ2hhbmdlcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29uZmxpY3QoaHVuaywgbWluZSwgdGhlaXIpIHtcbiAgaHVuay5jb25mbGljdCA9IHRydWU7XG4gIGh1bmsubGluZXMucHVzaCh7XG4gICAgY29uZmxpY3Q6IHRydWUsXG4gICAgbWluZTogbWluZSxcbiAgICB0aGVpcnM6IHRoZWlyXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBpbnNlcnRMZWFkaW5nKGh1bmssIGluc2VydCwgdGhlaXIpIHtcbiAgd2hpbGUgKGluc2VydC5vZmZzZXQgPCB0aGVpci5vZmZzZXQgJiYgaW5zZXJ0LmluZGV4IDwgaW5zZXJ0LmxpbmVzLmxlbmd0aCkge1xuICAgIGxldCBsaW5lID0gaW5zZXJ0LmxpbmVzW2luc2VydC5pbmRleCsrXTtcbiAgICBodW5rLmxpbmVzLnB1c2gobGluZSk7XG4gICAgaW5zZXJ0Lm9mZnNldCsrO1xuICB9XG59XG5mdW5jdGlvbiBpbnNlcnRUcmFpbGluZyhodW5rLCBpbnNlcnQpIHtcbiAgd2hpbGUgKGluc2VydC5pbmRleCA8IGluc2VydC5saW5lcy5sZW5ndGgpIHtcbiAgICBsZXQgbGluZSA9IGluc2VydC5saW5lc1tpbnNlcnQuaW5kZXgrK107XG4gICAgaHVuay5saW5lcy5wdXNoKGxpbmUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RDaGFuZ2Uoc3RhdGUpIHtcbiAgbGV0IHJldCA9IFtdLFxuICAgICAgb3BlcmF0aW9uID0gc3RhdGUubGluZXNbc3RhdGUuaW5kZXhdWzBdO1xuICB3aGlsZSAoc3RhdGUuaW5kZXggPCBzdGF0ZS5saW5lcy5sZW5ndGgpIHtcbiAgICBsZXQgbGluZSA9IHN0YXRlLmxpbmVzW3N0YXRlLmluZGV4XTtcblxuICAgIC8vIEdyb3VwIGFkZGl0aW9ucyB0aGF0IGFyZSBpbW1lZGlhdGVseSBhZnRlciBzdWJ0cmFjdGlvbnMgYW5kIHRyZWF0IHRoZW0gYXMgb25lIFwiYXRvbWljXCIgbW9kaWZ5IGNoYW5nZS5cbiAgICBpZiAob3BlcmF0aW9uID09PSAnLScgJiYgbGluZVswXSA9PT0gJysnKSB7XG4gICAgICBvcGVyYXRpb24gPSAnKyc7XG4gICAgfVxuXG4gICAgaWYgKG9wZXJhdGlvbiA9PT0gbGluZVswXSkge1xuICAgICAgcmV0LnB1c2gobGluZSk7XG4gICAgICBzdGF0ZS5pbmRleCsrO1xuICAgIH0gZWxzZSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmV0O1xufVxuZnVuY3Rpb24gY29sbGVjdENvbnRleHQoc3RhdGUsIG1hdGNoQ2hhbmdlcykge1xuICBsZXQgY2hhbmdlcyA9IFtdLFxuICAgICAgbWVyZ2VkID0gW10sXG4gICAgICBtYXRjaEluZGV4ID0gMCxcbiAgICAgIGNvbnRleHRDaGFuZ2VzID0gZmFsc2UsXG4gICAgICBjb25mbGljdGVkID0gZmFsc2U7XG4gIHdoaWxlIChtYXRjaEluZGV4IDwgbWF0Y2hDaGFuZ2VzLmxlbmd0aFxuICAgICAgICAmJiBzdGF0ZS5pbmRleCA8IHN0YXRlLmxpbmVzLmxlbmd0aCkge1xuICAgIGxldCBjaGFuZ2UgPSBzdGF0ZS5saW5lc1tzdGF0ZS5pbmRleF0sXG4gICAgICAgIG1hdGNoID0gbWF0Y2hDaGFuZ2VzW21hdGNoSW5kZXhdO1xuXG4gICAgLy8gT25jZSB3ZSd2ZSBoaXQgb3VyIGFkZCwgdGhlbiB3ZSBhcmUgZG9uZVxuICAgIGlmIChtYXRjaFswXSA9PT0gJysnKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBjb250ZXh0Q2hhbmdlcyA9IGNvbnRleHRDaGFuZ2VzIHx8IGNoYW5nZVswXSAhPT0gJyAnO1xuXG4gICAgbWVyZ2VkLnB1c2gobWF0Y2gpO1xuICAgIG1hdGNoSW5kZXgrKztcblxuICAgIC8vIENvbnN1bWUgYW55IGFkZGl0aW9ucyBpbiB0aGUgb3RoZXIgYmxvY2sgYXMgYSBjb25mbGljdCB0byBhdHRlbXB0XG4gICAgLy8gdG8gcHVsbCBpbiB0aGUgcmVtYWluaW5nIGNvbnRleHQgYWZ0ZXIgdGhpc1xuICAgIGlmIChjaGFuZ2VbMF0gPT09ICcrJykge1xuICAgICAgY29uZmxpY3RlZCA9IHRydWU7XG5cbiAgICAgIHdoaWxlIChjaGFuZ2VbMF0gPT09ICcrJykge1xuICAgICAgICBjaGFuZ2VzLnB1c2goY2hhbmdlKTtcbiAgICAgICAgY2hhbmdlID0gc3RhdGUubGluZXNbKytzdGF0ZS5pbmRleF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1hdGNoLnN1YnN0cigxKSA9PT0gY2hhbmdlLnN1YnN0cigxKSkge1xuICAgICAgY2hhbmdlcy5wdXNoKGNoYW5nZSk7XG4gICAgICBzdGF0ZS5pbmRleCsrO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25mbGljdGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAoKG1hdGNoQ2hhbmdlc1ttYXRjaEluZGV4XSB8fCAnJylbMF0gPT09ICcrJ1xuICAgICAgJiYgY29udGV4dENoYW5nZXMpIHtcbiAgICBjb25mbGljdGVkID0gdHJ1ZTtcbiAgfVxuXG4gIGlmIChjb25mbGljdGVkKSB7XG4gICAgcmV0dXJuIGNoYW5nZXM7XG4gIH1cblxuICB3aGlsZSAobWF0Y2hJbmRleCA8IG1hdGNoQ2hhbmdlcy5sZW5ndGgpIHtcbiAgICBtZXJnZWQucHVzaChtYXRjaENoYW5nZXNbbWF0Y2hJbmRleCsrXSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG1lcmdlZCxcbiAgICBjaGFuZ2VzXG4gIH07XG59XG5cbmZ1bmN0aW9uIGFsbFJlbW92ZXMoY2hhbmdlcykge1xuICByZXR1cm4gY2hhbmdlcy5yZWR1Y2UoZnVuY3Rpb24ocHJldiwgY2hhbmdlKSB7XG4gICAgcmV0dXJuIHByZXYgJiYgY2hhbmdlWzBdID09PSAnLSc7XG4gIH0sIHRydWUpO1xufVxuZnVuY3Rpb24gc2tpcFJlbW92ZVN1cGVyc2V0KHN0YXRlLCByZW1vdmVDaGFuZ2VzLCBkZWx0YSkge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGRlbHRhOyBpKyspIHtcbiAgICBsZXQgY2hhbmdlQ29udGVudCA9IHJlbW92ZUNoYW5nZXNbcmVtb3ZlQ2hhbmdlcy5sZW5ndGggLSBkZWx0YSArIGldLnN1YnN0cigxKTtcbiAgICBpZiAoc3RhdGUubGluZXNbc3RhdGUuaW5kZXggKyBpXSAhPT0gJyAnICsgY2hhbmdlQ29udGVudCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRlLmluZGV4ICs9IGRlbHRhO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY2FsY09sZE5ld0xpbmVDb3VudChsaW5lcykge1xuICBsZXQgb2xkTGluZXMgPSAwO1xuICBsZXQgbmV3TGluZXMgPSAwO1xuXG4gIGxpbmVzLmZvckVhY2goZnVuY3Rpb24obGluZSkge1xuICAgIGlmICh0eXBlb2YgbGluZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIGxldCBteUNvdW50ID0gY2FsY09sZE5ld0xpbmVDb3VudChsaW5lLm1pbmUpO1xuICAgICAgbGV0IHRoZWlyQ291bnQgPSBjYWxjT2xkTmV3TGluZUNvdW50KGxpbmUudGhlaXJzKTtcblxuICAgICAgaWYgKG9sZExpbmVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKG15Q291bnQub2xkTGluZXMgPT09IHRoZWlyQ291bnQub2xkTGluZXMpIHtcbiAgICAgICAgICBvbGRMaW5lcyArPSBteUNvdW50Lm9sZExpbmVzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9sZExpbmVzID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChuZXdMaW5lcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChteUNvdW50Lm5ld0xpbmVzID09PSB0aGVpckNvdW50Lm5ld0xpbmVzKSB7XG4gICAgICAgICAgbmV3TGluZXMgKz0gbXlDb3VudC5uZXdMaW5lcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdMaW5lcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobmV3TGluZXMgIT09IHVuZGVmaW5lZCAmJiAobGluZVswXSA9PT0gJysnIHx8IGxpbmVbMF0gPT09ICcgJykpIHtcbiAgICAgICAgbmV3TGluZXMrKztcbiAgICAgIH1cbiAgICAgIGlmIChvbGRMaW5lcyAhPT0gdW5kZWZpbmVkICYmIChsaW5lWzBdID09PSAnLScgfHwgbGluZVswXSA9PT0gJyAnKSkge1xuICAgICAgICBvbGRMaW5lcysrO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHtvbGRMaW5lcywgbmV3TGluZXN9O1xufVxuIl19\n\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*istanbul ignore start*/'use strict';\n\n\texports.__esModule = true;\n\texports. /*istanbul ignore end*/structuredPatch = structuredPatch;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/createTwoFilesPatch = createTwoFilesPatch;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/createPatch = createPatch;\n\n\tvar /*istanbul ignore start*/_line = __webpack_require__(5) /*istanbul ignore end*/;\n\n\t/*istanbul ignore start*/function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\n\t/*istanbul ignore end*/function structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) {\n\t  if (!options) {\n\t    options = {};\n\t  }\n\t  if (typeof options.context === 'undefined') {\n\t    options.context = 4;\n\t  }\n\n\t  var diff = /*istanbul ignore start*/(0, _line.diffLines) /*istanbul ignore end*/(oldStr, newStr, options);\n\t  diff.push({ value: '', lines: [] }); // Append an empty value to make cleanup easier\n\n\t  function contextLines(lines) {\n\t    return lines.map(function (entry) {\n\t      return ' ' + entry;\n\t    });\n\t  }\n\n\t  var hunks = [];\n\t  var oldRangeStart = 0,\n\t      newRangeStart = 0,\n\t      curRange = [],\n\t      oldLine = 1,\n\t      newLine = 1;\n\n\t  /*istanbul ignore start*/var _loop = function _loop( /*istanbul ignore end*/i) {\n\t    var current = diff[i],\n\t        lines = current.lines || current.value.replace(/\\n$/, '').split('\\n');\n\t    current.lines = lines;\n\n\t    if (current.added || current.removed) {\n\t      /*istanbul ignore start*/var _curRange;\n\n\t      /*istanbul ignore end*/ // If we have previous context, start with that\n\t      if (!oldRangeStart) {\n\t        var prev = diff[i - 1];\n\t        oldRangeStart = oldLine;\n\t        newRangeStart = newLine;\n\n\t        if (prev) {\n\t          curRange = options.context > 0 ? contextLines(prev.lines.slice(-options.context)) : [];\n\t          oldRangeStart -= curRange.length;\n\t          newRangeStart -= curRange.length;\n\t        }\n\t      }\n\n\t      // Output our changes\n\t      /*istanbul ignore start*/(_curRange = /*istanbul ignore end*/curRange).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_curRange /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/lines.map(function (entry) {\n\t        return (current.added ? '+' : '-') + entry;\n\t      })));\n\n\t      // Track the updated file position\n\t      if (current.added) {\n\t        newLine += lines.length;\n\t      } else {\n\t        oldLine += lines.length;\n\t      }\n\t    } else {\n\t      // Identical context lines. Track line changes\n\t      if (oldRangeStart) {\n\t        // Close out any changes that have been output (or join overlapping)\n\t        if (lines.length <= options.context * 2 && i < diff.length - 2) {\n\t          /*istanbul ignore start*/var _curRange2;\n\n\t          /*istanbul ignore end*/ // Overlapping\n\t          /*istanbul ignore start*/(_curRange2 = /*istanbul ignore end*/curRange).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_curRange2 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/contextLines(lines)));\n\t        } else {\n\t          /*istanbul ignore start*/var _curRange3;\n\n\t          /*istanbul ignore end*/ // end the range and output\n\t          var contextSize = Math.min(lines.length, options.context);\n\t          /*istanbul ignore start*/(_curRange3 = /*istanbul ignore end*/curRange).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_curRange3 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/contextLines(lines.slice(0, contextSize))));\n\n\t          var hunk = {\n\t            oldStart: oldRangeStart,\n\t            oldLines: oldLine - oldRangeStart + contextSize,\n\t            newStart: newRangeStart,\n\t            newLines: newLine - newRangeStart + contextSize,\n\t            lines: curRange\n\t          };\n\t          if (i >= diff.length - 2 && lines.length <= options.context) {\n\t            // EOF is inside this hunk\n\t            var oldEOFNewline = /\\n$/.test(oldStr);\n\t            var newEOFNewline = /\\n$/.test(newStr);\n\t            if (lines.length == 0 && !oldEOFNewline) {\n\t              // special case: old has no eol and no trailing context; no-nl can end up before adds\n\t              curRange.splice(hunk.oldLines, 0, '\\\\ No newline at end of file');\n\t            } else if (!oldEOFNewline || !newEOFNewline) {\n\t              curRange.push('\\\\ No newline at end of file');\n\t            }\n\t          }\n\t          hunks.push(hunk);\n\n\t          oldRangeStart = 0;\n\t          newRangeStart = 0;\n\t          curRange = [];\n\t        }\n\t      }\n\t      oldLine += lines.length;\n\t      newLine += lines.length;\n\t    }\n\t  };\n\n\t  for (var i = 0; i < diff.length; i++) {\n\t    /*istanbul ignore start*/_loop( /*istanbul ignore end*/i);\n\t  }\n\n\t  return {\n\t    oldFileName: oldFileName, newFileName: newFileName,\n\t    oldHeader: oldHeader, newHeader: newHeader,\n\t    hunks: hunks\n\t  };\n\t}\n\n\tfunction createTwoFilesPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) {\n\t  var diff = structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options);\n\n\t  var ret = [];\n\t  if (oldFileName == newFileName) {\n\t    ret.push('Index: ' + oldFileName);\n\t  }\n\t  ret.push('===================================================================');\n\t  ret.push('--- ' + diff.oldFileName + (typeof diff.oldHeader === 'undefined' ? '' : '\\t' + diff.oldHeader));\n\t  ret.push('+++ ' + diff.newFileName + (typeof diff.newHeader === 'undefined' ? '' : '\\t' + diff.newHeader));\n\n\t  for (var i = 0; i < diff.hunks.length; i++) {\n\t    var hunk = diff.hunks[i];\n\t    ret.push('@@ -' + hunk.oldStart + ',' + hunk.oldLines + ' +' + hunk.newStart + ',' + hunk.newLines + ' @@');\n\t    ret.push.apply(ret, hunk.lines);\n\t  }\n\n\t  return ret.join('\\n') + '\\n';\n\t}\n\n\tfunction createPatch(fileName, oldStr, newStr, oldHeader, newHeader, options) {\n\t  return createTwoFilesPatch(fileName, fileName, oldStr, newStr, oldHeader, newHeader, options);\n\t}\n\t//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXRjaC9jcmVhdGUuanMiXSwibmFtZXMiOlsic3RydWN0dXJlZFBhdGNoIiwiY3JlYXRlVHdvRmlsZXNQYXRjaCIsImNyZWF0ZVBhdGNoIiwib2xkRmlsZU5hbWUiLCJuZXdGaWxlTmFtZSIsIm9sZFN0ciIsIm5ld1N0ciIsIm9sZEhlYWRlciIsIm5ld0hlYWRlciIsIm9wdGlvbnMiLCJjb250ZXh0IiwiZGlmZiIsInB1c2giLCJ2YWx1ZSIsImxpbmVzIiwiY29udGV4dExpbmVzIiwibWFwIiwiZW50cnkiLCJodW5rcyIsIm9sZFJhbmdlU3RhcnQiLCJuZXdSYW5nZVN0YXJ0IiwiY3VyUmFuZ2UiLCJvbGRMaW5lIiwibmV3TGluZSIsImkiLCJjdXJyZW50IiwicmVwbGFjZSIsInNwbGl0IiwiYWRkZWQiLCJyZW1vdmVkIiwicHJldiIsInNsaWNlIiwibGVuZ3RoIiwiY29udGV4dFNpemUiLCJNYXRoIiwibWluIiwiaHVuayIsIm9sZFN0YXJ0Iiwib2xkTGluZXMiLCJuZXdTdGFydCIsIm5ld0xpbmVzIiwib2xkRU9GTmV3bGluZSIsInRlc3QiLCJuZXdFT0ZOZXdsaW5lIiwic3BsaWNlIiwicmV0IiwiYXBwbHkiLCJqb2luIiwiZmlsZU5hbWUiXSwibWFwcGluZ3MiOiI7OztnQ0FFZ0JBLGUsR0FBQUEsZTt5REFpR0FDLG1CLEdBQUFBLG1CO3lEQXdCQUMsVyxHQUFBQSxXOztBQTNIaEI7Ozs7dUJBRU8sU0FBU0YsZUFBVCxDQUF5QkcsV0FBekIsRUFBc0NDLFdBQXRDLEVBQW1EQyxNQUFuRCxFQUEyREMsTUFBM0QsRUFBbUVDLFNBQW5FLEVBQThFQyxTQUE5RSxFQUF5RkMsT0FBekYsRUFBa0c7QUFDdkcsTUFBSSxDQUFDQSxPQUFMLEVBQWM7QUFDWkEsY0FBVSxFQUFWO0FBQ0Q7QUFDRCxNQUFJLE9BQU9BLFFBQVFDLE9BQWYsS0FBMkIsV0FBL0IsRUFBNEM7QUFDMUNELFlBQVFDLE9BQVIsR0FBa0IsQ0FBbEI7QUFDRDs7QUFFRCxNQUFNQyxPQUFPLHNFQUFVTixNQUFWLEVBQWtCQyxNQUFsQixFQUEwQkcsT0FBMUIsQ0FBYjtBQUNBRSxPQUFLQyxJQUFMLENBQVUsRUFBQ0MsT0FBTyxFQUFSLEVBQVlDLE9BQU8sRUFBbkIsRUFBVixFQVR1RyxDQVNsRTs7QUFFckMsV0FBU0MsWUFBVCxDQUFzQkQsS0FBdEIsRUFBNkI7QUFDM0IsV0FBT0EsTUFBTUUsR0FBTixDQUFVLFVBQVNDLEtBQVQsRUFBZ0I7QUFBRSxhQUFPLE1BQU1BLEtBQWI7QUFBcUIsS0FBakQsQ0FBUDtBQUNEOztBQUVELE1BQUlDLFFBQVEsRUFBWjtBQUNBLE1BQUlDLGdCQUFnQixDQUFwQjtBQUFBLE1BQXVCQyxnQkFBZ0IsQ0FBdkM7QUFBQSxNQUEwQ0MsV0FBVyxFQUFyRDtBQUFBLE1BQ0lDLFVBQVUsQ0FEZDtBQUFBLE1BQ2lCQyxVQUFVLENBRDNCOztBQWhCdUcsOEVBa0I5RkMsQ0FsQjhGO0FBbUJyRyxRQUFNQyxVQUFVZCxLQUFLYSxDQUFMLENBQWhCO0FBQUEsUUFDTVYsUUFBUVcsUUFBUVgsS0FBUixJQUFpQlcsUUFBUVosS0FBUixDQUFjYSxPQUFkLENBQXNCLEtBQXRCLEVBQTZCLEVBQTdCLEVBQWlDQyxLQUFqQyxDQUF1QyxJQUF2QyxDQUQvQjtBQUVBRixZQUFRWCxLQUFSLEdBQWdCQSxLQUFoQjs7QUFFQSxRQUFJVyxRQUFRRyxLQUFSLElBQWlCSCxRQUFRSSxPQUE3QixFQUFzQztBQUFBOztBQUFBLDhCQUNwQztBQUNBLFVBQUksQ0FBQ1YsYUFBTCxFQUFvQjtBQUNsQixZQUFNVyxPQUFPbkIsS0FBS2EsSUFBSSxDQUFULENBQWI7QUFDQUwsd0JBQWdCRyxPQUFoQjtBQUNBRix3QkFBZ0JHLE9BQWhCOztBQUVBLFlBQUlPLElBQUosRUFBVTtBQUNSVCxxQkFBV1osUUFBUUMsT0FBUixHQUFrQixDQUFsQixHQUFzQkssYUFBYWUsS0FBS2hCLEtBQUwsQ0FBV2lCLEtBQVgsQ0FBaUIsQ0FBQ3RCLFFBQVFDLE9BQTFCLENBQWIsQ0FBdEIsR0FBeUUsRUFBcEY7QUFDQVMsMkJBQWlCRSxTQUFTVyxNQUExQjtBQUNBWiwyQkFBaUJDLFNBQVNXLE1BQTFCO0FBQ0Q7QUFDRjs7QUFFRDtBQUNBLDZFQUFTcEIsSUFBVCwwTEFBa0JFLE1BQU1FLEdBQU4sQ0FBVSxVQUFTQyxLQUFULEVBQWdCO0FBQzFDLGVBQU8sQ0FBQ1EsUUFBUUcsS0FBUixHQUFnQixHQUFoQixHQUFzQixHQUF2QixJQUE4QlgsS0FBckM7QUFDRCxPQUZpQixDQUFsQjs7QUFJQTtBQUNBLFVBQUlRLFFBQVFHLEtBQVosRUFBbUI7QUFDakJMLG1CQUFXVCxNQUFNa0IsTUFBakI7QUFDRCxPQUZELE1BRU87QUFDTFYsbUJBQVdSLE1BQU1rQixNQUFqQjtBQUNEO0FBQ0YsS0F6QkQsTUF5Qk87QUFDTDtBQUNBLFVBQUliLGFBQUosRUFBbUI7QUFDakI7QUFDQSxZQUFJTCxNQUFNa0IsTUFBTixJQUFnQnZCLFFBQVFDLE9BQVIsR0FBa0IsQ0FBbEMsSUFBdUNjLElBQUliLEtBQUtxQixNQUFMLEdBQWMsQ0FBN0QsRUFBZ0U7QUFBQTs7QUFBQSxrQ0FDOUQ7QUFDQSxrRkFBU3BCLElBQVQsMkxBQWtCRyxhQUFhRCxLQUFiLENBQWxCO0FBQ0QsU0FIRCxNQUdPO0FBQUE7O0FBQUEsa0NBQ0w7QUFDQSxjQUFJbUIsY0FBY0MsS0FBS0MsR0FBTCxDQUFTckIsTUFBTWtCLE1BQWYsRUFBdUJ2QixRQUFRQyxPQUEvQixDQUFsQjtBQUNBLGtGQUFTRSxJQUFULDJMQUFrQkcsYUFBYUQsTUFBTWlCLEtBQU4sQ0FBWSxDQUFaLEVBQWVFLFdBQWYsQ0FBYixDQUFsQjs7QUFFQSxjQUFJRyxPQUFPO0FBQ1RDLHNCQUFVbEIsYUFERDtBQUVUbUIsc0JBQVdoQixVQUFVSCxhQUFWLEdBQTBCYyxXQUY1QjtBQUdUTSxzQkFBVW5CLGFBSEQ7QUFJVG9CLHNCQUFXakIsVUFBVUgsYUFBVixHQUEwQmEsV0FKNUI7QUFLVG5CLG1CQUFPTztBQUxFLFdBQVg7QUFPQSxjQUFJRyxLQUFLYixLQUFLcUIsTUFBTCxHQUFjLENBQW5CLElBQXdCbEIsTUFBTWtCLE1BQU4sSUFBZ0J2QixRQUFRQyxPQUFwRCxFQUE2RDtBQUMzRDtBQUNBLGdCQUFJK0IsZ0JBQWlCLE1BQU1DLElBQU4sQ0FBV3JDLE1BQVgsQ0FBckI7QUFDQSxnQkFBSXNDLGdCQUFpQixNQUFNRCxJQUFOLENBQVdwQyxNQUFYLENBQXJCO0FBQ0EsZ0JBQUlRLE1BQU1rQixNQUFOLElBQWdCLENBQWhCLElBQXFCLENBQUNTLGFBQTFCLEVBQXlDO0FBQ3ZDO0FBQ0FwQix1QkFBU3VCLE1BQVQsQ0FBZ0JSLEtBQUtFLFFBQXJCLEVBQStCLENBQS9CLEVBQWtDLDhCQUFsQztBQUNELGFBSEQsTUFHTyxJQUFJLENBQUNHLGFBQUQsSUFBa0IsQ0FBQ0UsYUFBdkIsRUFBc0M7QUFDM0N0Qix1QkFBU1QsSUFBVCxDQUFjLDhCQUFkO0FBQ0Q7QUFDRjtBQUNETSxnQkFBTU4sSUFBTixDQUFXd0IsSUFBWDs7QUFFQWpCLDBCQUFnQixDQUFoQjtBQUNBQywwQkFBZ0IsQ0FBaEI7QUFDQUMscUJBQVcsRUFBWDtBQUNEO0FBQ0Y7QUFDREMsaUJBQVdSLE1BQU1rQixNQUFqQjtBQUNBVCxpQkFBV1QsTUFBTWtCLE1BQWpCO0FBQ0Q7QUF2Rm9HOztBQWtCdkcsT0FBSyxJQUFJUixJQUFJLENBQWIsRUFBZ0JBLElBQUliLEtBQUtxQixNQUF6QixFQUFpQ1IsR0FBakMsRUFBc0M7QUFBQSwyREFBN0JBLENBQTZCO0FBc0VyQzs7QUFFRCxTQUFPO0FBQ0xyQixpQkFBYUEsV0FEUixFQUNxQkMsYUFBYUEsV0FEbEM7QUFFTEcsZUFBV0EsU0FGTixFQUVpQkMsV0FBV0EsU0FGNUI7QUFHTFUsV0FBT0E7QUFIRixHQUFQO0FBS0Q7O0FBRU0sU0FBU2pCLG1CQUFULENBQTZCRSxXQUE3QixFQUEwQ0MsV0FBMUMsRUFBdURDLE1BQXZELEVBQStEQyxNQUEvRCxFQUF1RUMsU0FBdkUsRUFBa0ZDLFNBQWxGLEVBQTZGQyxPQUE3RixFQUFzRztBQUMzRyxNQUFNRSxPQUFPWCxnQkFBZ0JHLFdBQWhCLEVBQTZCQyxXQUE3QixFQUEwQ0MsTUFBMUMsRUFBa0RDLE1BQWxELEVBQTBEQyxTQUExRCxFQUFxRUMsU0FBckUsRUFBZ0ZDLE9BQWhGLENBQWI7O0FBRUEsTUFBTW9DLE1BQU0sRUFBWjtBQUNBLE1BQUkxQyxlQUFlQyxXQUFuQixFQUFnQztBQUM5QnlDLFFBQUlqQyxJQUFKLENBQVMsWUFBWVQsV0FBckI7QUFDRDtBQUNEMEMsTUFBSWpDLElBQUosQ0FBUyxxRUFBVDtBQUNBaUMsTUFBSWpDLElBQUosQ0FBUyxTQUFTRCxLQUFLUixXQUFkLElBQTZCLE9BQU9RLEtBQUtKLFNBQVosS0FBMEIsV0FBMUIsR0FBd0MsRUFBeEMsR0FBNkMsT0FBT0ksS0FBS0osU0FBdEYsQ0FBVDtBQUNBc0MsTUFBSWpDLElBQUosQ0FBUyxTQUFTRCxLQUFLUCxXQUFkLElBQTZCLE9BQU9PLEtBQUtILFNBQVosS0FBMEIsV0FBMUIsR0FBd0MsRUFBeEMsR0FBNkMsT0FBT0csS0FBS0gsU0FBdEYsQ0FBVDs7QUFFQSxPQUFLLElBQUlnQixJQUFJLENBQWIsRUFBZ0JBLElBQUliLEtBQUtPLEtBQUwsQ0FBV2MsTUFBL0IsRUFBdUNSLEdBQXZDLEVBQTRDO0FBQzFDLFFBQU1ZLE9BQU96QixLQUFLTyxLQUFMLENBQVdNLENBQVgsQ0FBYjtBQUNBcUIsUUFBSWpDLElBQUosQ0FDRSxTQUFTd0IsS0FBS0MsUUFBZCxHQUF5QixHQUF6QixHQUErQkQsS0FBS0UsUUFBcEMsR0FDRSxJQURGLEdBQ1NGLEtBQUtHLFFBRGQsR0FDeUIsR0FEekIsR0FDK0JILEtBQUtJLFFBRHBDLEdBRUUsS0FISjtBQUtBSyxRQUFJakMsSUFBSixDQUFTa0MsS0FBVCxDQUFlRCxHQUFmLEVBQW9CVCxLQUFLdEIsS0FBekI7QUFDRDs7QUFFRCxTQUFPK0IsSUFBSUUsSUFBSixDQUFTLElBQVQsSUFBaUIsSUFBeEI7QUFDRDs7QUFFTSxTQUFTN0MsV0FBVCxDQUFxQjhDLFFBQXJCLEVBQStCM0MsTUFBL0IsRUFBdUNDLE1BQXZDLEVBQStDQyxTQUEvQyxFQUEwREMsU0FBMUQsRUFBcUVDLE9BQXJFLEVBQThFO0FBQ25GLFNBQU9SLG9CQUFvQitDLFFBQXBCLEVBQThCQSxRQUE5QixFQUF3QzNDLE1BQXhDLEVBQWdEQyxNQUFoRCxFQUF3REMsU0FBeEQsRUFBbUVDLFNBQW5FLEVBQThFQyxPQUE5RSxDQUFQO0FBQ0QiLCJmaWxlIjoiY3JlYXRlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtkaWZmTGluZXN9IGZyb20gJy4uL2RpZmYvbGluZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJ1Y3R1cmVkUGF0Y2gob2xkRmlsZU5hbWUsIG5ld0ZpbGVOYW1lLCBvbGRTdHIsIG5ld1N0ciwgb2xkSGVhZGVyLCBuZXdIZWFkZXIsIG9wdGlvbnMpIHtcbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5jb250ZXh0ID09PSAndW5kZWZpbmVkJykge1xuICAgIG9wdGlvbnMuY29udGV4dCA9IDQ7XG4gIH1cblxuICBjb25zdCBkaWZmID0gZGlmZkxpbmVzKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKTtcbiAgZGlmZi5wdXNoKHt2YWx1ZTogJycsIGxpbmVzOiBbXX0pOyAgIC8vIEFwcGVuZCBhbiBlbXB0eSB2YWx1ZSB0byBtYWtlIGNsZWFudXAgZWFzaWVyXG5cbiAgZnVuY3Rpb24gY29udGV4dExpbmVzKGxpbmVzKSB7XG4gICAgcmV0dXJuIGxpbmVzLm1hcChmdW5jdGlvbihlbnRyeSkgeyByZXR1cm4gJyAnICsgZW50cnk7IH0pO1xuICB9XG5cbiAgbGV0IGh1bmtzID0gW107XG4gIGxldCBvbGRSYW5nZVN0YXJ0ID0gMCwgbmV3UmFuZ2VTdGFydCA9IDAsIGN1clJhbmdlID0gW10sXG4gICAgICBvbGRMaW5lID0gMSwgbmV3TGluZSA9IDE7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGlmZi5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGN1cnJlbnQgPSBkaWZmW2ldLFxuICAgICAgICAgIGxpbmVzID0gY3VycmVudC5saW5lcyB8fCBjdXJyZW50LnZhbHVlLnJlcGxhY2UoL1xcbiQvLCAnJykuc3BsaXQoJ1xcbicpO1xuICAgIGN1cnJlbnQubGluZXMgPSBsaW5lcztcblxuICAgIGlmIChjdXJyZW50LmFkZGVkIHx8IGN1cnJlbnQucmVtb3ZlZCkge1xuICAgICAgLy8gSWYgd2UgaGF2ZSBwcmV2aW91cyBjb250ZXh0LCBzdGFydCB3aXRoIHRoYXRcbiAgICAgIGlmICghb2xkUmFuZ2VTdGFydCkge1xuICAgICAgICBjb25zdCBwcmV2ID0gZGlmZltpIC0gMV07XG4gICAgICAgIG9sZFJhbmdlU3RhcnQgPSBvbGRMaW5lO1xuICAgICAgICBuZXdSYW5nZVN0YXJ0ID0gbmV3TGluZTtcblxuICAgICAgICBpZiAocHJldikge1xuICAgICAgICAgIGN1clJhbmdlID0gb3B0aW9ucy5jb250ZXh0ID4gMCA/IGNvbnRleHRMaW5lcyhwcmV2LmxpbmVzLnNsaWNlKC1vcHRpb25zLmNvbnRleHQpKSA6IFtdO1xuICAgICAgICAgIG9sZFJhbmdlU3RhcnQgLT0gY3VyUmFuZ2UubGVuZ3RoO1xuICAgICAgICAgIG5ld1JhbmdlU3RhcnQgLT0gY3VyUmFuZ2UubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIE91dHB1dCBvdXIgY2hhbmdlc1xuICAgICAgY3VyUmFuZ2UucHVzaCguLi4gbGluZXMubWFwKGZ1bmN0aW9uKGVudHJ5KSB7XG4gICAgICAgIHJldHVybiAoY3VycmVudC5hZGRlZCA/ICcrJyA6ICctJykgKyBlbnRyeTtcbiAgICAgIH0pKTtcblxuICAgICAgLy8gVHJhY2sgdGhlIHVwZGF0ZWQgZmlsZSBwb3NpdGlvblxuICAgICAgaWYgKGN1cnJlbnQuYWRkZWQpIHtcbiAgICAgICAgbmV3TGluZSArPSBsaW5lcy5sZW5ndGg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvbGRMaW5lICs9IGxpbmVzLmxlbmd0aDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWRlbnRpY2FsIGNvbnRleHQgbGluZXMuIFRyYWNrIGxpbmUgY2hhbmdlc1xuICAgICAgaWYgKG9sZFJhbmdlU3RhcnQpIHtcbiAgICAgICAgLy8gQ2xvc2Ugb3V0IGFueSBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIG91dHB1dCAob3Igam9pbiBvdmVybGFwcGluZylcbiAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA8PSBvcHRpb25zLmNvbnRleHQgKiAyICYmIGkgPCBkaWZmLmxlbmd0aCAtIDIpIHtcbiAgICAgICAgICAvLyBPdmVybGFwcGluZ1xuICAgICAgICAgIGN1clJhbmdlLnB1c2goLi4uIGNvbnRleHRMaW5lcyhsaW5lcykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGVuZCB0aGUgcmFuZ2UgYW5kIG91dHB1dFxuICAgICAgICAgIGxldCBjb250ZXh0U2l6ZSA9IE1hdGgubWluKGxpbmVzLmxlbmd0aCwgb3B0aW9ucy5jb250ZXh0KTtcbiAgICAgICAgICBjdXJSYW5nZS5wdXNoKC4uLiBjb250ZXh0TGluZXMobGluZXMuc2xpY2UoMCwgY29udGV4dFNpemUpKSk7XG5cbiAgICAgICAgICBsZXQgaHVuayA9IHtcbiAgICAgICAgICAgIG9sZFN0YXJ0OiBvbGRSYW5nZVN0YXJ0LFxuICAgICAgICAgICAgb2xkTGluZXM6IChvbGRMaW5lIC0gb2xkUmFuZ2VTdGFydCArIGNvbnRleHRTaXplKSxcbiAgICAgICAgICAgIG5ld1N0YXJ0OiBuZXdSYW5nZVN0YXJ0LFxuICAgICAgICAgICAgbmV3TGluZXM6IChuZXdMaW5lIC0gbmV3UmFuZ2VTdGFydCArIGNvbnRleHRTaXplKSxcbiAgICAgICAgICAgIGxpbmVzOiBjdXJSYW5nZVxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKGkgPj0gZGlmZi5sZW5ndGggLSAyICYmIGxpbmVzLmxlbmd0aCA8PSBvcHRpb25zLmNvbnRleHQpIHtcbiAgICAgICAgICAgIC8vIEVPRiBpcyBpbnNpZGUgdGhpcyBodW5rXG4gICAgICAgICAgICBsZXQgb2xkRU9GTmV3bGluZSA9ICgvXFxuJC8udGVzdChvbGRTdHIpKTtcbiAgICAgICAgICAgIGxldCBuZXdFT0ZOZXdsaW5lID0gKC9cXG4kLy50ZXN0KG5ld1N0cikpO1xuICAgICAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA9PSAwICYmICFvbGRFT0ZOZXdsaW5lKSB7XG4gICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZTogb2xkIGhhcyBubyBlb2wgYW5kIG5vIHRyYWlsaW5nIGNvbnRleHQ7IG5vLW5sIGNhbiBlbmQgdXAgYmVmb3JlIGFkZHNcbiAgICAgICAgICAgICAgY3VyUmFuZ2Uuc3BsaWNlKGh1bmsub2xkTGluZXMsIDAsICdcXFxcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUnKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIW9sZEVPRk5ld2xpbmUgfHwgIW5ld0VPRk5ld2xpbmUpIHtcbiAgICAgICAgICAgICAgY3VyUmFuZ2UucHVzaCgnXFxcXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGh1bmtzLnB1c2goaHVuayk7XG5cbiAgICAgICAgICBvbGRSYW5nZVN0YXJ0ID0gMDtcbiAgICAgICAgICBuZXdSYW5nZVN0YXJ0ID0gMDtcbiAgICAgICAgICBjdXJSYW5nZSA9IFtdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBvbGRMaW5lICs9IGxpbmVzLmxlbmd0aDtcbiAgICAgIG5ld0xpbmUgKz0gbGluZXMubGVuZ3RoO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgb2xkRmlsZU5hbWU6IG9sZEZpbGVOYW1lLCBuZXdGaWxlTmFtZTogbmV3RmlsZU5hbWUsXG4gICAgb2xkSGVhZGVyOiBvbGRIZWFkZXIsIG5ld0hlYWRlcjogbmV3SGVhZGVyLFxuICAgIGh1bmtzOiBodW5rc1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVHdvRmlsZXNQYXRjaChvbGRGaWxlTmFtZSwgbmV3RmlsZU5hbWUsIG9sZFN0ciwgbmV3U3RyLCBvbGRIZWFkZXIsIG5ld0hlYWRlciwgb3B0aW9ucykge1xuICBjb25zdCBkaWZmID0gc3RydWN0dXJlZFBhdGNoKG9sZEZpbGVOYW1lLCBuZXdGaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKTtcblxuICBjb25zdCByZXQgPSBbXTtcbiAgaWYgKG9sZEZpbGVOYW1lID09IG5ld0ZpbGVOYW1lKSB7XG4gICAgcmV0LnB1c2goJ0luZGV4OiAnICsgb2xkRmlsZU5hbWUpO1xuICB9XG4gIHJldC5wdXNoKCc9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Jyk7XG4gIHJldC5wdXNoKCctLS0gJyArIGRpZmYub2xkRmlsZU5hbWUgKyAodHlwZW9mIGRpZmYub2xkSGVhZGVyID09PSAndW5kZWZpbmVkJyA/ICcnIDogJ1xcdCcgKyBkaWZmLm9sZEhlYWRlcikpO1xuICByZXQucHVzaCgnKysrICcgKyBkaWZmLm5ld0ZpbGVOYW1lICsgKHR5cGVvZiBkaWZmLm5ld0hlYWRlciA9PT0gJ3VuZGVmaW5lZCcgPyAnJyA6ICdcXHQnICsgZGlmZi5uZXdIZWFkZXIpKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRpZmYuaHVua3MubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBodW5rID0gZGlmZi5odW5rc1tpXTtcbiAgICByZXQucHVzaChcbiAgICAgICdAQCAtJyArIGh1bmsub2xkU3RhcnQgKyAnLCcgKyBodW5rLm9sZExpbmVzXG4gICAgICArICcgKycgKyBodW5rLm5ld1N0YXJ0ICsgJywnICsgaHVuay5uZXdMaW5lc1xuICAgICAgKyAnIEBAJ1xuICAgICk7XG4gICAgcmV0LnB1c2guYXBwbHkocmV0LCBodW5rLmxpbmVzKTtcbiAgfVxuXG4gIHJldHVybiByZXQuam9pbignXFxuJykgKyAnXFxuJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVBhdGNoKGZpbGVOYW1lLCBvbGRTdHIsIG5ld1N0ciwgb2xkSGVhZGVyLCBuZXdIZWFkZXIsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGNyZWF0ZVR3b0ZpbGVzUGF0Y2goZmlsZU5hbWUsIGZpbGVOYW1lLCBvbGRTdHIsIG5ld1N0ciwgb2xkSGVhZGVyLCBuZXdIZWFkZXIsIG9wdGlvbnMpO1xufVxuIl19\n\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports) {\n\n\t/*istanbul ignore start*/\"use strict\";\n\n\texports.__esModule = true;\n\texports. /*istanbul ignore end*/arrayEqual = arrayEqual;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/arrayStartsWith = arrayStartsWith;\n\tfunction arrayEqual(a, b) {\n\t  if (a.length !== b.length) {\n\t    return false;\n\t  }\n\n\t  return arrayStartsWith(a, b);\n\t}\n\n\tfunction arrayStartsWith(array, start) {\n\t  if (start.length > array.length) {\n\t    return false;\n\t  }\n\n\t  for (var i = 0; i < start.length; i++) {\n\t    if (start[i] !== array[i]) {\n\t      return false;\n\t    }\n\t  }\n\n\t  return true;\n\t}\n\t//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsL2FycmF5LmpzIl0sIm5hbWVzIjpbImFycmF5RXF1YWwiLCJhcnJheVN0YXJ0c1dpdGgiLCJhIiwiYiIsImxlbmd0aCIsImFycmF5Iiwic3RhcnQiLCJpIl0sIm1hcHBpbmdzIjoiOzs7Z0NBQWdCQSxVLEdBQUFBLFU7eURBUUFDLGUsR0FBQUEsZTtBQVJULFNBQVNELFVBQVQsQ0FBb0JFLENBQXBCLEVBQXVCQyxDQUF2QixFQUEwQjtBQUMvQixNQUFJRCxFQUFFRSxNQUFGLEtBQWFELEVBQUVDLE1BQW5CLEVBQTJCO0FBQ3pCLFdBQU8sS0FBUDtBQUNEOztBQUVELFNBQU9ILGdCQUFnQkMsQ0FBaEIsRUFBbUJDLENBQW5CLENBQVA7QUFDRDs7QUFFTSxTQUFTRixlQUFULENBQXlCSSxLQUF6QixFQUFnQ0MsS0FBaEMsRUFBdUM7QUFDNUMsTUFBSUEsTUFBTUYsTUFBTixHQUFlQyxNQUFNRCxNQUF6QixFQUFpQztBQUMvQixXQUFPLEtBQVA7QUFDRDs7QUFFRCxPQUFLLElBQUlHLElBQUksQ0FBYixFQUFnQkEsSUFBSUQsTUFBTUYsTUFBMUIsRUFBa0NHLEdBQWxDLEVBQXVDO0FBQ3JDLFFBQUlELE1BQU1DLENBQU4sTUFBYUYsTUFBTUUsQ0FBTixDQUFqQixFQUEyQjtBQUN6QixhQUFPLEtBQVA7QUFDRDtBQUNGOztBQUVELFNBQU8sSUFBUDtBQUNEIiwiZmlsZSI6ImFycmF5LmpzIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIGFycmF5RXF1YWwoYSwgYikge1xuICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGFycmF5U3RhcnRzV2l0aChhLCBiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFycmF5U3RhcnRzV2l0aChhcnJheSwgc3RhcnQpIHtcbiAgaWYgKHN0YXJ0Lmxlbmd0aCA+IGFycmF5Lmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RhcnQubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoc3RhcnRbaV0gIT09IGFycmF5W2ldKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG4iXX0=\n\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports) {\n\n\t/*istanbul ignore start*/\"use strict\";\n\n\texports.__esModule = true;\n\texports. /*istanbul ignore end*/convertChangesToDMP = convertChangesToDMP;\n\t// See: http://code.google.com/p/google-diff-match-patch/wiki/API\n\tfunction convertChangesToDMP(changes) {\n\t  var ret = [],\n\t      change = /*istanbul ignore start*/void 0 /*istanbul ignore end*/,\n\t      operation = /*istanbul ignore start*/void 0 /*istanbul ignore end*/;\n\t  for (var i = 0; i < changes.length; i++) {\n\t    change = changes[i];\n\t    if (change.added) {\n\t      operation = 1;\n\t    } else if (change.removed) {\n\t      operation = -1;\n\t    } else {\n\t      operation = 0;\n\t    }\n\n\t    ret.push([operation, change.value]);\n\t  }\n\t  return ret;\n\t}\n\t//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb252ZXJ0L2RtcC5qcyJdLCJuYW1lcyI6WyJjb252ZXJ0Q2hhbmdlc1RvRE1QIiwiY2hhbmdlcyIsInJldCIsImNoYW5nZSIsIm9wZXJhdGlvbiIsImkiLCJsZW5ndGgiLCJhZGRlZCIsInJlbW92ZWQiLCJwdXNoIiwidmFsdWUiXSwibWFwcGluZ3MiOiI7OztnQ0FDZ0JBLG1CLEdBQUFBLG1CO0FBRGhCO0FBQ08sU0FBU0EsbUJBQVQsQ0FBNkJDLE9BQTdCLEVBQXNDO0FBQzNDLE1BQUlDLE1BQU0sRUFBVjtBQUFBLE1BQ0lDLHdDQURKO0FBQUEsTUFFSUMsMkNBRko7QUFHQSxPQUFLLElBQUlDLElBQUksQ0FBYixFQUFnQkEsSUFBSUosUUFBUUssTUFBNUIsRUFBb0NELEdBQXBDLEVBQXlDO0FBQ3ZDRixhQUFTRixRQUFRSSxDQUFSLENBQVQ7QUFDQSxRQUFJRixPQUFPSSxLQUFYLEVBQWtCO0FBQ2hCSCxrQkFBWSxDQUFaO0FBQ0QsS0FGRCxNQUVPLElBQUlELE9BQU9LLE9BQVgsRUFBb0I7QUFDekJKLGtCQUFZLENBQUMsQ0FBYjtBQUNELEtBRk0sTUFFQTtBQUNMQSxrQkFBWSxDQUFaO0FBQ0Q7O0FBRURGLFFBQUlPLElBQUosQ0FBUyxDQUFDTCxTQUFELEVBQVlELE9BQU9PLEtBQW5CLENBQVQ7QUFDRDtBQUNELFNBQU9SLEdBQVA7QUFDRCIsImZpbGUiOiJkbXAuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTZWU6IGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGUtZGlmZi1tYXRjaC1wYXRjaC93aWtpL0FQSVxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRDaGFuZ2VzVG9ETVAoY2hhbmdlcykge1xuICBsZXQgcmV0ID0gW10sXG4gICAgICBjaGFuZ2UsXG4gICAgICBvcGVyYXRpb247XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY2hhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgIGNoYW5nZSA9IGNoYW5nZXNbaV07XG4gICAgaWYgKGNoYW5nZS5hZGRlZCkge1xuICAgICAgb3BlcmF0aW9uID0gMTtcbiAgICB9IGVsc2UgaWYgKGNoYW5nZS5yZW1vdmVkKSB7XG4gICAgICBvcGVyYXRpb24gPSAtMTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3BlcmF0aW9uID0gMDtcbiAgICB9XG5cbiAgICByZXQucHVzaChbb3BlcmF0aW9uLCBjaGFuZ2UudmFsdWVdKTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuIl19\n\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports) {\n\n\t/*istanbul ignore start*/'use strict';\n\n\texports.__esModule = true;\n\texports. /*istanbul ignore end*/convertChangesToXML = convertChangesToXML;\n\tfunction convertChangesToXML(changes) {\n\t  var ret = [];\n\t  for (var i = 0; i < changes.length; i++) {\n\t    var change = changes[i];\n\t    if (change.added) {\n\t      ret.push('<ins>');\n\t    } else if (change.removed) {\n\t      ret.push('<del>');\n\t    }\n\n\t    ret.push(escapeHTML(change.value));\n\n\t    if (change.added) {\n\t      ret.push('</ins>');\n\t    } else if (change.removed) {\n\t      ret.push('</del>');\n\t    }\n\t  }\n\t  return ret.join('');\n\t}\n\n\tfunction escapeHTML(s) {\n\t  var n = s;\n\t  n = n.replace(/&/g, '&amp;');\n\t  n = n.replace(/</g, '&lt;');\n\t  n = n.replace(/>/g, '&gt;');\n\t  n = n.replace(/\"/g, '&quot;');\n\n\t  return n;\n\t}\n\t//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb252ZXJ0L3htbC5qcyJdLCJuYW1lcyI6WyJjb252ZXJ0Q2hhbmdlc1RvWE1MIiwiY2hhbmdlcyIsInJldCIsImkiLCJsZW5ndGgiLCJjaGFuZ2UiLCJhZGRlZCIsInB1c2giLCJyZW1vdmVkIiwiZXNjYXBlSFRNTCIsInZhbHVlIiwiam9pbiIsInMiLCJuIiwicmVwbGFjZSJdLCJtYXBwaW5ncyI6Ijs7O2dDQUFnQkEsbUIsR0FBQUEsbUI7QUFBVCxTQUFTQSxtQkFBVCxDQUE2QkMsT0FBN0IsRUFBc0M7QUFDM0MsTUFBSUMsTUFBTSxFQUFWO0FBQ0EsT0FBSyxJQUFJQyxJQUFJLENBQWIsRUFBZ0JBLElBQUlGLFFBQVFHLE1BQTVCLEVBQW9DRCxHQUFwQyxFQUF5QztBQUN2QyxRQUFJRSxTQUFTSixRQUFRRSxDQUFSLENBQWI7QUFDQSxRQUFJRSxPQUFPQyxLQUFYLEVBQWtCO0FBQ2hCSixVQUFJSyxJQUFKLENBQVMsT0FBVDtBQUNELEtBRkQsTUFFTyxJQUFJRixPQUFPRyxPQUFYLEVBQW9CO0FBQ3pCTixVQUFJSyxJQUFKLENBQVMsT0FBVDtBQUNEOztBQUVETCxRQUFJSyxJQUFKLENBQVNFLFdBQVdKLE9BQU9LLEtBQWxCLENBQVQ7O0FBRUEsUUFBSUwsT0FBT0MsS0FBWCxFQUFrQjtBQUNoQkosVUFBSUssSUFBSixDQUFTLFFBQVQ7QUFDRCxLQUZELE1BRU8sSUFBSUYsT0FBT0csT0FBWCxFQUFvQjtBQUN6Qk4sVUFBSUssSUFBSixDQUFTLFFBQVQ7QUFDRDtBQUNGO0FBQ0QsU0FBT0wsSUFBSVMsSUFBSixDQUFTLEVBQVQsQ0FBUDtBQUNEOztBQUVELFNBQVNGLFVBQVQsQ0FBb0JHLENBQXBCLEVBQXVCO0FBQ3JCLE1BQUlDLElBQUlELENBQVI7QUFDQUMsTUFBSUEsRUFBRUMsT0FBRixDQUFVLElBQVYsRUFBZ0IsT0FBaEIsQ0FBSjtBQUNBRCxNQUFJQSxFQUFFQyxPQUFGLENBQVUsSUFBVixFQUFnQixNQUFoQixDQUFKO0FBQ0FELE1BQUlBLEVBQUVDLE9BQUYsQ0FBVSxJQUFWLEVBQWdCLE1BQWhCLENBQUo7QUFDQUQsTUFBSUEsRUFBRUMsT0FBRixDQUFVLElBQVYsRUFBZ0IsUUFBaEIsQ0FBSjs7QUFFQSxTQUFPRCxDQUFQO0FBQ0QiLCJmaWxlIjoieG1sLmpzIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRDaGFuZ2VzVG9YTUwoY2hhbmdlcykge1xuICBsZXQgcmV0ID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY2hhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgIGxldCBjaGFuZ2UgPSBjaGFuZ2VzW2ldO1xuICAgIGlmIChjaGFuZ2UuYWRkZWQpIHtcbiAgICAgIHJldC5wdXNoKCc8aW5zPicpO1xuICAgIH0gZWxzZSBpZiAoY2hhbmdlLnJlbW92ZWQpIHtcbiAgICAgIHJldC5wdXNoKCc8ZGVsPicpO1xuICAgIH1cblxuICAgIHJldC5wdXNoKGVzY2FwZUhUTUwoY2hhbmdlLnZhbHVlKSk7XG5cbiAgICBpZiAoY2hhbmdlLmFkZGVkKSB7XG4gICAgICByZXQucHVzaCgnPC9pbnM+Jyk7XG4gICAgfSBlbHNlIGlmIChjaGFuZ2UucmVtb3ZlZCkge1xuICAgICAgcmV0LnB1c2goJzwvZGVsPicpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmV0LmpvaW4oJycpO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVIVE1MKHMpIHtcbiAgbGV0IG4gPSBzO1xuICBuID0gbi5yZXBsYWNlKC8mL2csICcmYW1wOycpO1xuICBuID0gbi5yZXBsYWNlKC88L2csICcmbHQ7Jyk7XG4gIG4gPSBuLnJlcGxhY2UoLz4vZywgJyZndDsnKTtcbiAgbiA9IG4ucmVwbGFjZSgvXCIvZywgJyZxdW90OycpO1xuXG4gIHJldHVybiBuO1xufVxuIl19\n\n\n/***/ })\n/******/ ])\n});\n;"
  },
  {
    "path": "compare/output/diverged.js",
    "content": "'use strict';\nconst noop = function (){};\nlet LCS_DIFF_ARRAY_METHOD = undefined;\n// debugger\nif (typeof require !== 'undefined') {\n    LCS_DIFF_ARRAY_METHOD = require('diff').diffArrays;\n} else {\n    try {\n        LCS_DIFF_ARRAY_METHOD = JsDiff.diffArrays;\n    } catch(err) {\n        console.error(err);\n    }\n}\n\nconst rowSpread = 1;\n\nconst spread = 50; // range of adjacent pixels to aggregate when calculating diff\nconst IS_ADDED_WORD = '0_255_0_255';\nconst IS_REMOVED_WORD = '255_0_0_255';\nconst IS_ADDED_AND_REMOVED_WORD = '0_255_255_255';\nconst IS_SAME_WORD = '';\nconst OPACITY = '40'; // 0-255 range\n\n/**\n * Applies Longest-Common-Subsequence-Diff algorithm to imageData formatted arrays\n * \n * @param {Uint8ClampedArray} [reference] baseline image\n * @param {Uint8ClampedArray} [test] test image\n * \n * @returns {Uint8ClampedArray} diff image\n * \n */\nif (typeof module !== 'undefined') {\n    module.exports = diverged;\n}\n\nfunction diverged(reference, test, h, w) {\n    console.time(\"diverged_total_time\");\n\n    const spread = Math.floor(h / 80); //override\n\n    console.log('spread:', spread);\n\n    console.time(\"imgDataToWords\");\n    const img1wordArr = imgDataToWords(reference);\n    const img2wordArr = imgDataToWords(test);\n    console.timeEnd(\"imgDataToWords\");\n\n    console.time(\"imgDataWordArrToColsAndRows\");\n    let cols_rows_ref = imgDataWordArrToColsAndRows(img1wordArr, h, w);\n    let cols_rows_test = imgDataWordArrToColsAndRows(img2wordArr, h, w);\n    console.timeEnd(\"imgDataWordArrToColsAndRows\");\n\n    console.time(\"groupAdjacent\");\n    const columnRef = groupAdjacent(cols_rows_ref.columns, spread, h, w);\n    const columnTest = groupAdjacent(cols_rows_test.columns, spread, h, w);\n    console.timeEnd(\"groupAdjacent\");\n\n    console.time(\"columnDiffRaw\");\n    const columnDiffRaw = diffArr(columnRef, columnTest, h, w);\n    console.timeEnd(\"columnDiffRaw\");\n\n    console.time(\"reduceColumnDiffRaw\");\n    const reducedColumnDiff = reduceColumnDiffRaw(columnDiffRaw, h, w);\n    console.timeEnd(\"reduceColumnDiffRaw\");\n    // console.log(\"reducedColumnDiff>>>\", reducedColumnDiff);\n    \n    console.time(\"unGroupAdjacent\");\n    const expandedColumns = ungroupAdjacent(reducedColumnDiff, spread, cols_rows_test.columns, h, w);\n    console.timeEnd(\"unGroupAdjacent\");\n\n    console.time(\"columnWordDataToImgDataFormatAsWords\");\n    const convertedColumnDiffImgData = columnWordDataToImgDataFormatAsWords(expandedColumns, h, w);\n    console.timeEnd(\"columnWordDataToImgDataFormatAsWords\");\n    // console.log(\"convertedColumnDiffImgData>>>\", convertedColumnDiffImgData);\n\n    console.time(\"imgDataWordsToClampedImgData\");\n    const imgDataArr = convertImgDataWordsToClampedImgData(convertedColumnDiffImgData);\n    console.timeEnd(\"imgDataWordsToClampedImgData\");\n    // console.log(\"imgDataArr>>>\", imgDataArr);\n\n    console.timeEnd(\"diverged_total_time\");\n    return imgDataArr;\n}\n\n/**\n * ========= HELPERS ========\n */\n\nfunction columnWordDataToImgDataFormatAsWords(columns, h, w) {\n    const imgDataWordsLength = w * h;\n\n    let convertedArr = new Array(imgDataWordsLength);\n    for (var i = 0; i < imgDataWordsLength; i++) {\n        const {column, depth} = serialToColumnMap(i, h, w);\n        convertedArr[i] = columns[column][depth];\n    }\n    return convertedArr;\n}\n\nfunction convertImgDataWordsToClampedImgData(wordsArr) {\n    let convertedArr = new Uint8ClampedArray(wordsArr.length * 4);\n    for (var i = 0; i < wordsArr.length; i++) {\n        const convertedOffset = i * 4;\n        const segments = wordsArr[i].split('_');\n        convertedArr[convertedOffset] = segments[0];\n        convertedArr[convertedOffset+1] = segments[1];\n        convertedArr[convertedOffset+2] = segments[2];\n        convertedArr[convertedOffset+3] = segments[3];\n    }\n    return convertedArr;\n}\n\nfunction reduceColumnDiffRaw(columnDiffs, h, w) {\n    let reducedColumns = new Array(columnDiffs.length);\n    for (let columnIndex = 0; columnIndex < columnDiffs.length; columnIndex++) {\n        const columnDiff = columnDiffs[columnIndex];\n        let resultColumn = new Array();\n        let removedCounter = 0;\n        let resultClass = '';\n        let segment = [];\n        let debug = false;\n\n        for (let depthIndex = 0; depthIndex < columnDiff.length; depthIndex++) {\n            let segmentLength = 0;\n\n            // Categorize the current segment\n            if (columnDiff[depthIndex].removed) {\n                segmentLength = columnDiff[depthIndex].count;\n                removedCounter += segmentLength;\n                resultClass = IS_REMOVED_WORD;\n            } else {\n                if (columnDiff[depthIndex].added) {\n                    if (removedCounter) {\n                        resultClass = IS_ADDED_AND_REMOVED_WORD;\n                    } else {\n                        resultClass = IS_ADDED_WORD;\n                    }\n                } else {\n                    resultClass = IS_SAME_WORD;\n                }\n\n                segmentLength = columnDiff[depthIndex].count;\n\n                if (removedCounter > 0) {\n                    if (segmentLength > removedCounter) {\n                        segmentLength -= removedCounter;\n                        removedCounter = 0;\n                    } else {\n                        removedCounter -= segmentLength;\n                        segmentLength = 0;\n                    }\n                }\n            }\n\n            // Limit segmentLength to total length of column\n            if (!segmentLength) {\n                continue;\n            } else {\n                segmentLength = Math.min(segmentLength, h - resultColumn.length);\n            }\n\n            const printSampleMap = false;\n            if (!printSampleMap || resultClass !== IS_SAME_WORD){\n                segment = new Array(segmentLength).fill(resultClass);\n            } else {\n                // reduced resolution image\n                segment = columnDiff[depthIndex].value.slice(0,segmentLength).map((value, i) => {\n                    if (/|/.test(value)) {\n                        return value.split('|')[0];\n                    }\n                    return value;\n                });\n            }\n\n\n            resultColumn = resultColumn.concat(segment);\n            \n            if (resultColumn.length > h) {\n                console.log('WARNING -- this value is out of bounds!')\n            }\n        }\n        \n        reducedColumns[columnIndex] = resultColumn;\n    }\n\n    return reducedColumns;\n}\n\nfunction diffArr(refArr, testArr, h, w) {\n    let rawResultArr = [];\n    for (let i = 0; i < refArr.length; i++) {\n        rawResultArr.push(LCS_DIFF_ARRAY_METHOD(refArr[i], testArr[i]));\n    }\n    return rawResultArr;\n}\n\nfunction groupAdjacent(columns, spread, h, w) {\n    if (!spread) {\n        return columns;\n    }\n    \n    /**\n     * [getAdjacentArrayBounds retuns existing adjacent lower and upper column bounds]\n     * @param  {[int]} pointer [current index]\n     * @param  {[int]} spread  [distance from index]\n     * @param  {[int]} length     [total length]\n     * @return {[array]}         [0] lower bound, [1] upper bound\n     */\n    function getAdjacentArrayBounds(pointer, spread, length) {\n        return [\n            // Math.max(0, pointer - spread),\n            Math.max(0, pointer),\n            Math.min(length - 1, pointer + spread)\n        ]\n    }\n\n    function getInterpolatedSequence(beginning, end) {\n        const interpolated = [];\n        for (let step = beginning; step <= end; step++) {\n            interpolated.push(step);\n        }\n        return interpolated;\n    }\n\n    function getCompositeColumnDepthValues(columns, sequence, depth) {\n        return sequence.reduce((acc, column) => {\n            return acc.concat(columns[column][depth]);\n        }, [])\n    }\n\n    function getCompositeRowIndexValues(groupedColumns, sequence, column) {\n        return sequence.reduce((acc, depth) => {\n            return acc.concat(groupedColumns[column][depth]);\n        }, [])\n    }\n\n    const groupedColumns = new Array();\n    let columnPointer = 0;\n    while (columnPointer < w) {\n        const adjacentColumnBounds = getAdjacentArrayBounds(columnPointer, spread, w);\n        const interpolatedColumns = getInterpolatedSequence(...adjacentColumnBounds);\n        \n        const columnComposite = new Array();\n        for (var depth = 0; depth < h; depth++) {        \n            columnComposite[depth] = getCompositeColumnDepthValues(columns, interpolatedColumns, depth).join('|');\n        }\n        groupedColumns.push(columnComposite);\n        columnPointer += spread;\n    }\n\n    const groupedRows = new Array();\n    if (rowSpread > 1) {\n        for (var index = 0; index < groupedColumns.length; index++) {\n            const rowComposite = new Array();\n            let depthPointer = 0;\n            while (depthPointer < h) {\n                const adjacentRowBounds = getAdjacentArrayBounds(depthPointer, rowSpread, h);\n                const interpolatedRows = getInterpolatedSequence(...adjacentRowBounds);\n                rowComposite.push(getCompositeRowIndexValues(groupedColumns, interpolatedRows, index).join(','));\n                depthPointer += rowSpread;\n            }\n            groupedRows[index] = rowComposite;\n        }\n    }\n    return groupedRows.length ? groupedRows : groupedColumns ;\n}\n\nfunction ungroupAdjacent(grouped, spread, columnUnderlay, h, w) {\n    if (!spread) {\n        return grouped;\n    }\n\n    function mapUngroupedColumnIndexToGroupedIndex(index, spread) {\n        return Math.floor(index / spread);\n    }\n\n    // expand columns\n    const ungrouped = new Array(w);\n    for (let index = 0; index < w; index++) {\n         if (!ungrouped[index]) {\n            ungrouped[index] = new Array(h);\n         }\n\n         const groupedIndexMap = mapUngroupedColumnIndexToGroupedIndex(index, spread);\n         for (let depth = 0; depth < h; depth++) {\n            const groupedDepthMap = rowSpread > 1 ? mapUngroupedColumnIndexToGroupedIndex(depth, rowSpread) : depth;\n            const value = grouped[groupedIndexMap][groupedDepthMap].split('|')[0];\n            ungrouped[index][depth] = value ? value : columnUnderlay[index][depth].replace(/\\d+$/, OPACITY);\n         }\n    }\n\n    return ungrouped\n}\n\n\n\nfunction imgDataWordArrToColsAndRows(arr, h, w) {\n    let columns = new Array(w);\n    let rows = new Array(h);\n\n    for (var i = 0; i < arr.length; i++) {\n        const word = arr[i];\n\n        var {column, depth} = serialToColumnMap(i, h, w);\n        if (!columns[column]) {\n            columns[column] = new Array(h);\n        }\n        columns[column][depth] = word;\n        \n        var {row, index} = serialToRowMap(i, h, w);\n        if (!rows[row]) {\n            rows[row] = new Array(w);\n        }\n        rows[row][index] = word;\n    }\n    return {columns, rows}\n}\n\nfunction serialToColumnMap(index, h, w) {\n    return {\n        column: index % w, \n        depth: Math.floor(index / w)\n    }\n}\n\nfunction serialToRowMap(index, h, w) {\n    return {\n        row: Math.floor(index / w), \n        index: index % w\n    }\n}\n\nfunction imgDataToWords(arr) {\n    let result = [];\n    for (let i = 0; i < arr.length-1; i += 4) {\n        result.push(`${arr[i]}_${arr[i+1]}_${arr[i+2]}_${arr[i+3]}`)\n    }\n    return result;\n}\n"
  },
  {
    "path": "compare/output/divergedWorker.js",
    "content": "importScripts('diff.js');\nimportScripts('diverged.js');\nself.addEventListener('message', function(e) {\n  self.postMessage(diverged(...e.data.divergedInput));\n  self.close();\n}, false);\n"
  },
  {
    "path": "compare/output/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <!-- Disable Cache -->\n    <meta http-equiv=\"Cache-Control\" content=\"no-cache, no-store, must-revalidate\">\n    <meta http-equiv=\"Pragma\" content=\"no-cache\">\n    <meta http-equiv=\"Expires\" content=\"0\">\n\n    <title>BackstopJS Report</title>\n\n    <style>\n      @font-face {\n          font-family: 'latoregular';\n          src: url('./assets/fonts/lato-regular-webfont.woff2') format('woff2'),\n              url('./assets/fonts/lato-regular-webfont.woff') format('woff');\n          font-weight: 400;\n          font-style: normal;\n      }\n      @font-face {\n          font-family: 'latobold';\n          src: url('./assets/fonts/lato-bold-webfont.woff2') format('woff2'),\n              url('./assets/fonts/lato-bold-webfont.woff') format('woff');\n          font-weight: 700;\n          font-style: normal;\n      }\n\n      .ReactModal__Body--open {\n          overflow: hidden;\n      }\n      .ReactModal__Body--open .header {\n        display: none;\n      }\n\n    </style>\n  </head>\n  <body style=\"background-color: #E2E7EA\">\n    <div id=\"root\">\n\n    </div>\n    <script>\n      function report (report) { // eslint-disable-line no-unused-vars\n        window.tests = report;\n      }\n    </script>\n    <script src=\"config.js\"></script>\n    <script src=\"index_bundle.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "compare/output/index_bundle.js",
    "content": "/*! For license information please see index_bundle.js.LICENSE.txt */\n(()=>{var e,t,n={184:(e,t,n)=>{\"use strict\";function r(e){return r=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},r(e)}t.Z=void 0;var o=function(e,t){if(e&&e.__esModule)return e;if(null===e||\"object\"!=r(e)&&\"function\"!=typeof e)return{default:e};var n=i(t);if(n&&n.has(e))return n.get(e);var o={__proto__:null},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var l in e)if(\"default\"!==l&&Object.prototype.hasOwnProperty.call(e,l)){var u=a?Object.getOwnPropertyDescriptor(e,l):null;u&&(u.get||u.set)?Object.defineProperty(o,l,u):o[l]=e[l]}return o.default=e,n&&n.set(e,o),o}(n(294));function i(e){if(\"function\"!=typeof WeakMap)return null;var t=new WeakMap,n=new WeakMap;return(i=function(e){return e?n:t})(e)}function a(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,l(r.key),r)}}function l(e){var t=function(e,t){if(\"object\"!=r(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var o=n.call(e,\"string\");if(\"object\"!=r(o))return o;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return String(e)}(e);return\"symbol\"==r(t)?t:String(t)}function u(e,t){return u=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},u(e,t)}function c(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e}function s(e){return s=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},s(e)}var f=180/Math.PI;(t.Z=function(e){!function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,\"prototype\",{writable:!1}),t&&u(e,t)}(d,e);var t,n,i,l,p=(i=d,l=function(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,t=s(i);if(l){var n=s(this).constructor;e=Reflect.construct(t,arguments,n)}else e=t.apply(this,arguments);return function(e,t){if(t&&(\"object\"===r(t)||\"function\"==typeof t))return t;if(void 0!==t)throw new TypeError(\"Derived constructors may only return object or undefined\");return c(e)}(this,e)});function d(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,d),(t=p.call(this,e)).state={startX:NaN,startY:NaN,isDragging:!1,position:e.initialPosition},t.beginDrag=t.beginDrag.bind(c(t)),t.endDrag=t.endDrag.bind(c(t)),t.onDragMove=t.onDragMove.bind(c(t)),t.twentyTwentyComponent=(0,o.createRef)(),t}return t=d,(n=[{key:\"componentWillReceiveProps\",value:function(e){var t=e.newPosition;this.setState({position:t})}},{key:\"componentWillUnmount\",value:function(){this.endDrag()}},{key:\"onDragMove\",value:function(e){if(this.props.isDraggingEnabled){var t=this.state.isDragging,n=\"touches\"in e,r=n?e.touches[0]:e,o=r.pageX,i=r.pageY;if(!t&&n){var a=this.props,l=a.maxAngleToBeginInteraction,u=a.minDistanceToBeginInteraction,c=this.state,s=c.startX-o,p=c.startY-i,d=Math.atan(p/s)*f;if((t=Math.sqrt(s*s+p*p)>=u)&&Math.abs(d)>l)return void this.endDrag();if(!t)return}var y=this.twentyTwentyComponent.current.getBoundingClientRect(),h=100*(o-y.left)/y.width;h=Math.max(Math.min(h,100),0),this.setState({position:h,isDragging:t})}}},{key:\"beginDrag\",value:function(e){if(e&&e.preventDefault(),this.props.isDraggingEnabled){var t=\"touches\"in e?e.touches[0]:e,n=t.pageX,r=t.pageY;this.setState({startX:n,startY:r}),document.addEventListener(\"mousemove\",this.onDragMove),document.addEventListener(\"mouseup\",this.endDrag),document.addEventListener(\"touchmove\",this.onDragMove),document.addEventListener(\"touchend\",this.endDrag)}}},{key:\"endDrag\",value:function(){document.removeEventListener(\"mousemove\",this.onDragMove),document.removeEventListener(\"mouseup\",this.endDrag),document.removeEventListener(\"touchmove\",this.onDragMove),document.removeEventListener(\"touchend\",this.endDrag),this.setState({isDragging:!1,startY:NaN,endY:NaN})}},{key:\"render\",value:function(){var e=this.state.position,t=this.props,n=t.children,r=t.verticalAlign,i=t.leftHorizontalAlign,a=t.rightHorizontalAlign;return 2!==n.length&&3!==n.length?(console.warn(\"Expected exactly two or three children\"),null):o.default.createElement(\"div\",{ref:this.twentyTwentyComponent,style:{position:\"relative\",overflow:\"hidden\",whiteSpace:\"nowrap\"},onMouseDown:this.beginDrag,onTouchStart:this.beginDrag},o.default.createElement(\"div\",{style:{position:\"absolute\",left:\"\".concat(e,\"%\"),height:\"100%\",width:0,zIndex:1}},n[2]),o.default.createElement(\"div\",{style:{display:\"inline-block\",width:\"100%\",position:\"relative\",verticalAlign:r,left:\"\".concat(e-100,\"%\"),overflow:\"hidden\"}},o.default.createElement(\"div\",{style:{position:\"relative\",right:\"\".concat(e-100,\"%\"),textAlign:i}},n[0])),o.default.createElement(\"div\",{style:{display:\"inline-block\",width:\"100%\",position:\"relative\",verticalAlign:r,left:\"\".concat(e-100,\"%\"),overflow:\"hidden\"}},o.default.createElement(\"div\",{style:{position:\"relative\",right:\"\".concat(e,\"%\"),textAlign:a}},n[1])))}}])&&a(t.prototype,n),Object.defineProperty(t,\"prototype\",{writable:!1}),d}(o.Component)).defaultProps={verticalAlign:\"middle\",leftHorizontalAlign:\"center\",rightHorizontalAlign:\"center\",minDistanceToBeginInteraction:15,maxAngleToBeginInteraction:30,initialPosition:50,isDraggingEnabled:!0}},875:(e,t,n)=>{var r;!function(){\"use strict\";var o=!(\"undefined\"==typeof window||!window.document||!window.document.createElement),i={canUseDOM:o,canUseWorkers:\"undefined\"!=typeof Worker,canUseEventListeners:o&&!(!window.addEventListener&&!window.attachEvent),canUseViewport:o&&!!window.screen};void 0===(r=function(){return i}.call(t,n,t,e))||(e.exports=r)}()},75:function(e){(function(){var t,n,r,o,i,a;\"undefined\"!=typeof performance&&null!==performance&&performance.now?e.exports=function(){return performance.now()}:\"undefined\"!=typeof process&&null!==process&&process.hrtime?(e.exports=function(){return(t()-i)/1e6},n=process.hrtime,o=(t=function(){var e;return 1e9*(e=n())[0]+e[1]})(),a=1e9*process.uptime(),i=o-a):Date.now?(e.exports=function(){return Date.now()-r},r=Date.now()):(e.exports=function(){return(new Date).getTime()-r},r=(new Date).getTime())}).call(this)},703:(e,t,n)=>{\"use strict\";var r=n(414);function o(){}function i(){}i.resetWarningCache=o,e.exports=function(){function e(e,t,n,o,i,a){if(a!==r){var l=new Error(\"Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types\");throw l.name=\"Invariant Violation\",l}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:i,resetWarningCache:o};return n.PropTypes=n,n}},697:(e,t,n)=>{e.exports=n(703)()},414:e=>{\"use strict\";e.exports=\"SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED\"},87:(e,t,n)=>{for(var r=n(75),o=\"undefined\"==typeof window?n.g:window,i=[\"moz\",\"webkit\"],a=\"AnimationFrame\",l=o[\"request\"+a],u=o[\"cancel\"+a]||o[\"cancelRequest\"+a],c=0;!l&&c<i.length;c++)l=o[i[c]+\"Request\"+a],u=o[i[c]+\"Cancel\"+a]||o[i[c]+\"CancelRequest\"+a];if(!l||!u){var s=0,f=0,p=[];l=function(e){if(0===p.length){var t=r(),n=Math.max(0,16.666666666666668-(t-s));s=n+t,setTimeout((function(){var e=p.slice(0);p.length=0;for(var t=0;t<e.length;t++)if(!e[t].cancelled)try{e[t].callback(s)}catch(e){setTimeout((function(){throw e}),0)}}),Math.round(n))}return p.push({handle:++f,callback:e,cancelled:!1}),f},u=function(e){for(var t=0;t<p.length;t++)p[t].handle===e&&(p[t].cancelled=!0)}}e.exports=function(e){return l.call(o,e)},e.exports.cancel=function(){u.apply(o,arguments)},e.exports.polyfill=function(e){e||(e=o),e.requestAnimationFrame=l,e.cancelAnimationFrame=u}},448:(e,t,n)=>{\"use strict\";var r=n(294),o=n(840);function i(e){for(var t=\"https://reactjs.org/docs/error-decoder.html?invariant=\"+e,n=1;n<arguments.length;n++)t+=\"&args[]=\"+encodeURIComponent(arguments[n]);return\"Minified React error #\"+e+\"; visit \"+t+\" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\"}var a=new Set,l={};function u(e,t){c(e,t),c(e+\"Capture\",t)}function c(e,t){for(l[e]=t,e=0;e<t.length;e++)a.add(t[e])}var s=!(\"undefined\"==typeof window||void 0===window.document||void 0===window.document.createElement),f=Object.prototype.hasOwnProperty,p=/^[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD][:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$/,d={},y={};function h(e,t,n,r,o,i,a){this.acceptsBooleans=2===t||3===t||4===t,this.attributeName=r,this.attributeNamespace=o,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=i,this.removeEmptyString=a}var m={};\"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style\".split(\" \").forEach((function(e){m[e]=new h(e,0,!1,e,null,!1,!1)})),[[\"acceptCharset\",\"accept-charset\"],[\"className\",\"class\"],[\"htmlFor\",\"for\"],[\"httpEquiv\",\"http-equiv\"]].forEach((function(e){var t=e[0];m[t]=new h(t,1,!1,e[1],null,!1,!1)})),[\"contentEditable\",\"draggable\",\"spellCheck\",\"value\"].forEach((function(e){m[e]=new h(e,2,!1,e.toLowerCase(),null,!1,!1)})),[\"autoReverse\",\"externalResourcesRequired\",\"focusable\",\"preserveAlpha\"].forEach((function(e){m[e]=new h(e,2,!1,e,null,!1,!1)})),\"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope\".split(\" \").forEach((function(e){m[e]=new h(e,3,!1,e.toLowerCase(),null,!1,!1)})),[\"checked\",\"multiple\",\"muted\",\"selected\"].forEach((function(e){m[e]=new h(e,3,!0,e,null,!1,!1)})),[\"capture\",\"download\"].forEach((function(e){m[e]=new h(e,4,!1,e,null,!1,!1)})),[\"cols\",\"rows\",\"size\",\"span\"].forEach((function(e){m[e]=new h(e,6,!1,e,null,!1,!1)})),[\"rowSpan\",\"start\"].forEach((function(e){m[e]=new h(e,5,!1,e.toLowerCase(),null,!1,!1)}));var b=/[\\-:]([a-z])/g;function v(e){return e[1].toUpperCase()}function g(e,t,n,r){var o=m.hasOwnProperty(t)?m[t]:null;(null!==o?0!==o.type:r||!(2<t.length)||\"o\"!==t[0]&&\"O\"!==t[0]||\"n\"!==t[1]&&\"N\"!==t[1])&&(function(e,t,n,r){if(null==t||function(e,t,n,r){if(null!==n&&0===n.type)return!1;switch(typeof t){case\"function\":case\"symbol\":return!0;case\"boolean\":return!r&&(null!==n?!n.acceptsBooleans:\"data-\"!==(e=e.toLowerCase().slice(0,5))&&\"aria-\"!==e);default:return!1}}(e,t,n,r))return!0;if(r)return!1;if(null!==n)switch(n.type){case 3:return!t;case 4:return!1===t;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}(t,n,o,r)&&(n=null),r||null===o?function(e){return!!f.call(y,e)||!f.call(d,e)&&(p.test(e)?y[e]=!0:(d[e]=!0,!1))}(t)&&(null===n?e.removeAttribute(t):e.setAttribute(t,\"\"+n)):o.mustUseProperty?e[o.propertyName]=null===n?3!==o.type&&\"\":n:(t=o.attributeName,r=o.attributeNamespace,null===n?e.removeAttribute(t):(n=3===(o=o.type)||4===o&&!0===n?\"\":\"\"+n,r?e.setAttributeNS(r,t,n):e.setAttribute(t,n))))}\"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height\".split(\" \").forEach((function(e){var t=e.replace(b,v);m[t]=new h(t,1,!1,e,null,!1,!1)})),\"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type\".split(\" \").forEach((function(e){var t=e.replace(b,v);m[t]=new h(t,1,!1,e,\"http://www.w3.org/1999/xlink\",!1,!1)})),[\"xml:base\",\"xml:lang\",\"xml:space\"].forEach((function(e){var t=e.replace(b,v);m[t]=new h(t,1,!1,e,\"http://www.w3.org/XML/1998/namespace\",!1,!1)})),[\"tabIndex\",\"crossOrigin\"].forEach((function(e){m[e]=new h(e,1,!1,e.toLowerCase(),null,!1,!1)})),m.xlinkHref=new h(\"xlinkHref\",1,!1,\"xlink:href\",\"http://www.w3.org/1999/xlink\",!0,!1),[\"src\",\"href\",\"action\",\"formAction\"].forEach((function(e){m[e]=new h(e,1,!1,e.toLowerCase(),null,!0,!0)}));var w=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,S=Symbol.for(\"react.element\"),O=Symbol.for(\"react.portal\"),E=Symbol.for(\"react.fragment\"),k=Symbol.for(\"react.strict_mode\"),P=Symbol.for(\"react.profiler\"),x=Symbol.for(\"react.provider\"),j=Symbol.for(\"react.context\"),C=Symbol.for(\"react.forward_ref\"),T=Symbol.for(\"react.suspense\"),A=Symbol.for(\"react.suspense_list\"),R=Symbol.for(\"react.memo\"),_=Symbol.for(\"react.lazy\");Symbol.for(\"react.scope\"),Symbol.for(\"react.debug_trace_mode\");var I=Symbol.for(\"react.offscreen\");Symbol.for(\"react.legacy_hidden\"),Symbol.for(\"react.cache\"),Symbol.for(\"react.tracing_marker\");var N=Symbol.iterator;function M(e){return null===e||\"object\"!=typeof e?null:\"function\"==typeof(e=N&&e[N]||e[\"@@iterator\"])?e:null}var D,L=Object.assign;function z(e){if(void 0===D)try{throw Error()}catch(e){var t=e.stack.trim().match(/\\n( *(at )?)/);D=t&&t[1]||\"\"}return\"\\n\"+D+e}var B=!1;function F(e,t){if(!e||B)return\"\";B=!0;var n=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(t)if(t=function(){throw Error()},Object.defineProperty(t.prototype,\"props\",{set:function(){throw Error()}}),\"object\"==typeof Reflect&&Reflect.construct){try{Reflect.construct(t,[])}catch(e){var r=e}Reflect.construct(e,[],t)}else{try{t.call()}catch(e){r=e}e.call(t.prototype)}else{try{throw Error()}catch(e){r=e}e()}}catch(t){if(t&&r&&\"string\"==typeof t.stack){for(var o=t.stack.split(\"\\n\"),i=r.stack.split(\"\\n\"),a=o.length-1,l=i.length-1;1<=a&&0<=l&&o[a]!==i[l];)l--;for(;1<=a&&0<=l;a--,l--)if(o[a]!==i[l]){if(1!==a||1!==l)do{if(a--,0>--l||o[a]!==i[l]){var u=\"\\n\"+o[a].replace(\" at new \",\" at \");return e.displayName&&u.includes(\"<anonymous>\")&&(u=u.replace(\"<anonymous>\",e.displayName)),u}}while(1<=a&&0<=l);break}}}finally{B=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:\"\")?z(e):\"\"}function U(e){switch(e.tag){case 5:return z(e.type);case 16:return z(\"Lazy\");case 13:return z(\"Suspense\");case 19:return z(\"SuspenseList\");case 0:case 2:case 15:return F(e.type,!1);case 11:return F(e.type.render,!1);case 1:return F(e.type,!0);default:return\"\"}}function W(e){if(null==e)return null;if(\"function\"==typeof e)return e.displayName||e.name||null;if(\"string\"==typeof e)return e;switch(e){case E:return\"Fragment\";case O:return\"Portal\";case P:return\"Profiler\";case k:return\"StrictMode\";case T:return\"Suspense\";case A:return\"SuspenseList\"}if(\"object\"==typeof e)switch(e.$$typeof){case j:return(e.displayName||\"Context\")+\".Consumer\";case x:return(e._context.displayName||\"Context\")+\".Provider\";case C:var t=e.render;return(e=e.displayName)||(e=\"\"!==(e=t.displayName||t.name||\"\")?\"ForwardRef(\"+e+\")\":\"ForwardRef\"),e;case R:return null!==(t=e.displayName||null)?t:W(e.type)||\"Memo\";case _:t=e._payload,e=e._init;try{return W(e(t))}catch(e){}}return null}function H(e){var t=e.type;switch(e.tag){case 24:return\"Cache\";case 9:return(t.displayName||\"Context\")+\".Consumer\";case 10:return(t._context.displayName||\"Context\")+\".Provider\";case 18:return\"DehydratedFragment\";case 11:return e=(e=t.render).displayName||e.name||\"\",t.displayName||(\"\"!==e?\"ForwardRef(\"+e+\")\":\"ForwardRef\");case 7:return\"Fragment\";case 5:return t;case 4:return\"Portal\";case 3:return\"Root\";case 6:return\"Text\";case 16:return W(t);case 8:return t===k?\"StrictMode\":\"Mode\";case 22:return\"Offscreen\";case 12:return\"Profiler\";case 21:return\"Scope\";case 13:return\"Suspense\";case 19:return\"SuspenseList\";case 25:return\"TracingMarker\";case 1:case 0:case 17:case 2:case 14:case 15:if(\"function\"==typeof t)return t.displayName||t.name||null;if(\"string\"==typeof t)return t}return null}function V(e){switch(typeof e){case\"boolean\":case\"number\":case\"string\":case\"undefined\":case\"object\":return e;default:return\"\"}}function G(e){var t=e.type;return(e=e.nodeName)&&\"input\"===e.toLowerCase()&&(\"checkbox\"===t||\"radio\"===t)}function q(e){e._valueTracker||(e._valueTracker=function(e){var t=G(e)?\"checked\":\"value\",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=\"\"+e[t];if(!e.hasOwnProperty(t)&&void 0!==n&&\"function\"==typeof n.get&&\"function\"==typeof n.set){var o=n.get,i=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return o.call(this)},set:function(e){r=\"\"+e,i.call(this,e)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(e){r=\"\"+e},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}(e))}function Q(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r=\"\";return e&&(r=G(e)?e.checked?\"true\":\"false\":e.value),(e=r)!==n&&(t.setValue(e),!0)}function Y(e){if(void 0===(e=e||(\"undefined\"!=typeof document?document:void 0)))return null;try{return e.activeElement||e.body}catch(t){return e.body}}function Z(e,t){var n=t.checked;return L({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=n?n:e._wrapperState.initialChecked})}function J(e,t){var n=null==t.defaultValue?\"\":t.defaultValue,r=null!=t.checked?t.checked:t.defaultChecked;n=V(null!=t.value?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:\"checkbox\"===t.type||\"radio\"===t.type?null!=t.checked:null!=t.value}}function X(e,t){null!=(t=t.checked)&&g(e,\"checked\",t,!1)}function K(e,t){X(e,t);var n=V(t.value),r=t.type;if(null!=n)\"number\"===r?(0===n&&\"\"===e.value||e.value!=n)&&(e.value=\"\"+n):e.value!==\"\"+n&&(e.value=\"\"+n);else if(\"submit\"===r||\"reset\"===r)return void e.removeAttribute(\"value\");t.hasOwnProperty(\"value\")?ee(e,t.type,n):t.hasOwnProperty(\"defaultValue\")&&ee(e,t.type,V(t.defaultValue)),null==t.checked&&null!=t.defaultChecked&&(e.defaultChecked=!!t.defaultChecked)}function $(e,t,n){if(t.hasOwnProperty(\"value\")||t.hasOwnProperty(\"defaultValue\")){var r=t.type;if(!(\"submit\"!==r&&\"reset\"!==r||void 0!==t.value&&null!==t.value))return;t=\"\"+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}\"\"!==(n=e.name)&&(e.name=\"\"),e.defaultChecked=!!e._wrapperState.initialChecked,\"\"!==n&&(e.name=n)}function ee(e,t,n){\"number\"===t&&Y(e.ownerDocument)===e||(null==n?e.defaultValue=\"\"+e._wrapperState.initialValue:e.defaultValue!==\"\"+n&&(e.defaultValue=\"\"+n))}var te=Array.isArray;function ne(e,t,n,r){if(e=e.options,t){t={};for(var o=0;o<n.length;o++)t[\"$\"+n[o]]=!0;for(n=0;n<e.length;n++)o=t.hasOwnProperty(\"$\"+e[n].value),e[n].selected!==o&&(e[n].selected=o),o&&r&&(e[n].defaultSelected=!0)}else{for(n=\"\"+V(n),t=null,o=0;o<e.length;o++){if(e[o].value===n)return e[o].selected=!0,void(r&&(e[o].defaultSelected=!0));null!==t||e[o].disabled||(t=e[o])}null!==t&&(t.selected=!0)}}function re(e,t){if(null!=t.dangerouslySetInnerHTML)throw Error(i(91));return L({},t,{value:void 0,defaultValue:void 0,children:\"\"+e._wrapperState.initialValue})}function oe(e,t){var n=t.value;if(null==n){if(n=t.children,t=t.defaultValue,null!=n){if(null!=t)throw Error(i(92));if(te(n)){if(1<n.length)throw Error(i(93));n=n[0]}t=n}null==t&&(t=\"\"),n=t}e._wrapperState={initialValue:V(n)}}function ie(e,t){var n=V(t.value),r=V(t.defaultValue);null!=n&&((n=\"\"+n)!==e.value&&(e.value=n),null==t.defaultValue&&e.defaultValue!==n&&(e.defaultValue=n)),null!=r&&(e.defaultValue=\"\"+r)}function ae(e){var t=e.textContent;t===e._wrapperState.initialValue&&\"\"!==t&&null!==t&&(e.value=t)}function le(e){switch(e){case\"svg\":return\"http://www.w3.org/2000/svg\";case\"math\":return\"http://www.w3.org/1998/Math/MathML\";default:return\"http://www.w3.org/1999/xhtml\"}}function ue(e,t){return null==e||\"http://www.w3.org/1999/xhtml\"===e?le(t):\"http://www.w3.org/2000/svg\"===e&&\"foreignObject\"===t?\"http://www.w3.org/1999/xhtml\":e}var ce,se,fe=(se=function(e,t){if(\"http://www.w3.org/2000/svg\"!==e.namespaceURI||\"innerHTML\"in e)e.innerHTML=t;else{for((ce=ce||document.createElement(\"div\")).innerHTML=\"<svg>\"+t.valueOf().toString()+\"</svg>\",t=ce.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}},\"undefined\"!=typeof MSApp&&MSApp.execUnsafeLocalFunction?function(e,t,n,r){MSApp.execUnsafeLocalFunction((function(){return se(e,t)}))}:se);function pe(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&3===n.nodeType)return void(n.nodeValue=t)}e.textContent=t}var de={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},ye=[\"Webkit\",\"ms\",\"Moz\",\"O\"];function he(e,t,n){return null==t||\"boolean\"==typeof t||\"\"===t?\"\":n||\"number\"!=typeof t||0===t||de.hasOwnProperty(e)&&de[e]?(\"\"+t).trim():t+\"px\"}function me(e,t){for(var n in e=e.style,t)if(t.hasOwnProperty(n)){var r=0===n.indexOf(\"--\"),o=he(n,t[n],r);\"float\"===n&&(n=\"cssFloat\"),r?e.setProperty(n,o):e[n]=o}}Object.keys(de).forEach((function(e){ye.forEach((function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),de[t]=de[e]}))}));var be=L({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function ve(e,t){if(t){if(be[e]&&(null!=t.children||null!=t.dangerouslySetInnerHTML))throw Error(i(137,e));if(null!=t.dangerouslySetInnerHTML){if(null!=t.children)throw Error(i(60));if(\"object\"!=typeof t.dangerouslySetInnerHTML||!(\"__html\"in t.dangerouslySetInnerHTML))throw Error(i(61))}if(null!=t.style&&\"object\"!=typeof t.style)throw Error(i(62))}}function ge(e,t){if(-1===e.indexOf(\"-\"))return\"string\"==typeof t.is;switch(e){case\"annotation-xml\":case\"color-profile\":case\"font-face\":case\"font-face-src\":case\"font-face-uri\":case\"font-face-format\":case\"font-face-name\":case\"missing-glyph\":return!1;default:return!0}}var we=null;function Se(e){return(e=e.target||e.srcElement||window).correspondingUseElement&&(e=e.correspondingUseElement),3===e.nodeType?e.parentNode:e}var Oe=null,Ee=null,ke=null;function Pe(e){if(e=wo(e)){if(\"function\"!=typeof Oe)throw Error(i(280));var t=e.stateNode;t&&(t=Oo(t),Oe(e.stateNode,e.type,t))}}function xe(e){Ee?ke?ke.push(e):ke=[e]:Ee=e}function je(){if(Ee){var e=Ee,t=ke;if(ke=Ee=null,Pe(e),t)for(e=0;e<t.length;e++)Pe(t[e])}}function Ce(e,t){return e(t)}function Te(){}var Ae=!1;function Re(e,t,n){if(Ae)return e(t,n);Ae=!0;try{return Ce(e,t,n)}finally{Ae=!1,(null!==Ee||null!==ke)&&(Te(),je())}}function _e(e,t){var n=e.stateNode;if(null===n)return null;var r=Oo(n);if(null===r)return null;n=r[t];e:switch(t){case\"onClick\":case\"onClickCapture\":case\"onDoubleClick\":case\"onDoubleClickCapture\":case\"onMouseDown\":case\"onMouseDownCapture\":case\"onMouseMove\":case\"onMouseMoveCapture\":case\"onMouseUp\":case\"onMouseUpCapture\":case\"onMouseEnter\":(r=!r.disabled)||(r=!(\"button\"===(e=e.type)||\"input\"===e||\"select\"===e||\"textarea\"===e)),e=!r;break e;default:e=!1}if(e)return null;if(n&&\"function\"!=typeof n)throw Error(i(231,t,typeof n));return n}var Ie=!1;if(s)try{var Ne={};Object.defineProperty(Ne,\"passive\",{get:function(){Ie=!0}}),window.addEventListener(\"test\",Ne,Ne),window.removeEventListener(\"test\",Ne,Ne)}catch(se){Ie=!1}function Me(e,t,n,r,o,i,a,l,u){var c=Array.prototype.slice.call(arguments,3);try{t.apply(n,c)}catch(e){this.onError(e)}}var De=!1,Le=null,ze=!1,Be=null,Fe={onError:function(e){De=!0,Le=e}};function Ue(e,t,n,r,o,i,a,l,u){De=!1,Le=null,Me.apply(Fe,arguments)}function We(e){var t=e,n=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do{0!=(4098&(t=e).flags)&&(n=t.return),e=t.return}while(e)}return 3===t.tag?n:null}function He(e){if(13===e.tag){var t=e.memoizedState;if(null===t&&null!==(e=e.alternate)&&(t=e.memoizedState),null!==t)return t.dehydrated}return null}function Ve(e){if(We(e)!==e)throw Error(i(188))}function Ge(e){return null!==(e=function(e){var t=e.alternate;if(!t){if(null===(t=We(e)))throw Error(i(188));return t!==e?null:e}for(var n=e,r=t;;){var o=n.return;if(null===o)break;var a=o.alternate;if(null===a){if(null!==(r=o.return)){n=r;continue}break}if(o.child===a.child){for(a=o.child;a;){if(a===n)return Ve(o),e;if(a===r)return Ve(o),t;a=a.sibling}throw Error(i(188))}if(n.return!==r.return)n=o,r=a;else{for(var l=!1,u=o.child;u;){if(u===n){l=!0,n=o,r=a;break}if(u===r){l=!0,r=o,n=a;break}u=u.sibling}if(!l){for(u=a.child;u;){if(u===n){l=!0,n=a,r=o;break}if(u===r){l=!0,r=a,n=o;break}u=u.sibling}if(!l)throw Error(i(189))}}if(n.alternate!==r)throw Error(i(190))}if(3!==n.tag)throw Error(i(188));return n.stateNode.current===n?e:t}(e))?qe(e):null}function qe(e){if(5===e.tag||6===e.tag)return e;for(e=e.child;null!==e;){var t=qe(e);if(null!==t)return t;e=e.sibling}return null}var Qe=o.unstable_scheduleCallback,Ye=o.unstable_cancelCallback,Ze=o.unstable_shouldYield,Je=o.unstable_requestPaint,Xe=o.unstable_now,Ke=o.unstable_getCurrentPriorityLevel,$e=o.unstable_ImmediatePriority,et=o.unstable_UserBlockingPriority,tt=o.unstable_NormalPriority,nt=o.unstable_LowPriority,rt=o.unstable_IdlePriority,ot=null,it=null,at=Math.clz32?Math.clz32:function(e){return 0===(e>>>=0)?32:31-(lt(e)/ut|0)|0},lt=Math.log,ut=Math.LN2,ct=64,st=4194304;function ft(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return 4194240&e;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return 130023424&e;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function pt(e,t){var n=e.pendingLanes;if(0===n)return 0;var r=0,o=e.suspendedLanes,i=e.pingedLanes,a=268435455&n;if(0!==a){var l=a&~o;0!==l?r=ft(l):0!=(i&=a)&&(r=ft(i))}else 0!=(a=n&~o)?r=ft(a):0!==i&&(r=ft(i));if(0===r)return 0;if(0!==t&&t!==r&&0==(t&o)&&((o=r&-r)>=(i=t&-t)||16===o&&0!=(4194240&i)))return t;if(0!=(4&r)&&(r|=16&n),0!==(t=e.entangledLanes))for(e=e.entanglements,t&=r;0<t;)o=1<<(n=31-at(t)),r|=e[n],t&=~o;return r}function dt(e,t){switch(e){case 1:case 2:case 4:return t+250;case 8:case 16:case 32:case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;default:return-1}}function yt(e){return 0!=(e=-1073741825&e.pendingLanes)?e:1073741824&e?1073741824:0}function ht(){var e=ct;return 0==(4194240&(ct<<=1))&&(ct=64),e}function mt(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function bt(e,t,n){e.pendingLanes|=t,536870912!==t&&(e.suspendedLanes=0,e.pingedLanes=0),(e=e.eventTimes)[t=31-at(t)]=n}function vt(e,t){var n=e.entangledLanes|=t;for(e=e.entanglements;n;){var r=31-at(n),o=1<<r;o&t|e[r]&t&&(e[r]|=t),n&=~o}}var gt=0;function wt(e){return 1<(e&=-e)?4<e?0!=(268435455&e)?16:536870912:4:1}var St,Ot,Et,kt,Pt,xt=!1,jt=[],Ct=null,Tt=null,At=null,Rt=new Map,_t=new Map,It=[],Nt=\"mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit\".split(\" \");function Mt(e,t){switch(e){case\"focusin\":case\"focusout\":Ct=null;break;case\"dragenter\":case\"dragleave\":Tt=null;break;case\"mouseover\":case\"mouseout\":At=null;break;case\"pointerover\":case\"pointerout\":Rt.delete(t.pointerId);break;case\"gotpointercapture\":case\"lostpointercapture\":_t.delete(t.pointerId)}}function Dt(e,t,n,r,o,i){return null===e||e.nativeEvent!==i?(e={blockedOn:t,domEventName:n,eventSystemFlags:r,nativeEvent:i,targetContainers:[o]},null!==t&&null!==(t=wo(t))&&Ot(t),e):(e.eventSystemFlags|=r,t=e.targetContainers,null!==o&&-1===t.indexOf(o)&&t.push(o),e)}function Lt(e){var t=go(e.target);if(null!==t){var n=We(t);if(null!==n)if(13===(t=n.tag)){if(null!==(t=He(n)))return e.blockedOn=t,void Pt(e.priority,(function(){Et(n)}))}else if(3===t&&n.stateNode.current.memoizedState.isDehydrated)return void(e.blockedOn=3===n.tag?n.stateNode.containerInfo:null)}e.blockedOn=null}function zt(e){if(null!==e.blockedOn)return!1;for(var t=e.targetContainers;0<t.length;){var n=Zt(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(null!==n)return null!==(t=wo(n))&&Ot(t),e.blockedOn=n,!1;var r=new(n=e.nativeEvent).constructor(n.type,n);we=r,n.target.dispatchEvent(r),we=null,t.shift()}return!0}function Bt(e,t,n){zt(e)&&n.delete(t)}function Ft(){xt=!1,null!==Ct&&zt(Ct)&&(Ct=null),null!==Tt&&zt(Tt)&&(Tt=null),null!==At&&zt(At)&&(At=null),Rt.forEach(Bt),_t.forEach(Bt)}function Ut(e,t){e.blockedOn===t&&(e.blockedOn=null,xt||(xt=!0,o.unstable_scheduleCallback(o.unstable_NormalPriority,Ft)))}function Wt(e){function t(t){return Ut(t,e)}if(0<jt.length){Ut(jt[0],e);for(var n=1;n<jt.length;n++){var r=jt[n];r.blockedOn===e&&(r.blockedOn=null)}}for(null!==Ct&&Ut(Ct,e),null!==Tt&&Ut(Tt,e),null!==At&&Ut(At,e),Rt.forEach(t),_t.forEach(t),n=0;n<It.length;n++)(r=It[n]).blockedOn===e&&(r.blockedOn=null);for(;0<It.length&&null===(n=It[0]).blockedOn;)Lt(n),null===n.blockedOn&&It.shift()}var Ht=w.ReactCurrentBatchConfig,Vt=!0;function Gt(e,t,n,r){var o=gt,i=Ht.transition;Ht.transition=null;try{gt=1,Qt(e,t,n,r)}finally{gt=o,Ht.transition=i}}function qt(e,t,n,r){var o=gt,i=Ht.transition;Ht.transition=null;try{gt=4,Qt(e,t,n,r)}finally{gt=o,Ht.transition=i}}function Qt(e,t,n,r){if(Vt){var o=Zt(e,t,n,r);if(null===o)Vr(e,t,r,Yt,n),Mt(e,r);else if(function(e,t,n,r,o){switch(t){case\"focusin\":return Ct=Dt(Ct,e,t,n,r,o),!0;case\"dragenter\":return Tt=Dt(Tt,e,t,n,r,o),!0;case\"mouseover\":return At=Dt(At,e,t,n,r,o),!0;case\"pointerover\":var i=o.pointerId;return Rt.set(i,Dt(Rt.get(i)||null,e,t,n,r,o)),!0;case\"gotpointercapture\":return i=o.pointerId,_t.set(i,Dt(_t.get(i)||null,e,t,n,r,o)),!0}return!1}(o,e,t,n,r))r.stopPropagation();else if(Mt(e,r),4&t&&-1<Nt.indexOf(e)){for(;null!==o;){var i=wo(o);if(null!==i&&St(i),null===(i=Zt(e,t,n,r))&&Vr(e,t,r,Yt,n),i===o)break;o=i}null!==o&&r.stopPropagation()}else Vr(e,t,r,null,n)}}var Yt=null;function Zt(e,t,n,r){if(Yt=null,null!==(e=go(e=Se(r))))if(null===(t=We(e)))e=null;else if(13===(n=t.tag)){if(null!==(e=He(t)))return e;e=null}else if(3===n){if(t.stateNode.current.memoizedState.isDehydrated)return 3===t.tag?t.stateNode.containerInfo:null;e=null}else t!==e&&(e=null);return Yt=e,null}function Jt(e){switch(e){case\"cancel\":case\"click\":case\"close\":case\"contextmenu\":case\"copy\":case\"cut\":case\"auxclick\":case\"dblclick\":case\"dragend\":case\"dragstart\":case\"drop\":case\"focusin\":case\"focusout\":case\"input\":case\"invalid\":case\"keydown\":case\"keypress\":case\"keyup\":case\"mousedown\":case\"mouseup\":case\"paste\":case\"pause\":case\"play\":case\"pointercancel\":case\"pointerdown\":case\"pointerup\":case\"ratechange\":case\"reset\":case\"resize\":case\"seeked\":case\"submit\":case\"touchcancel\":case\"touchend\":case\"touchstart\":case\"volumechange\":case\"change\":case\"selectionchange\":case\"textInput\":case\"compositionstart\":case\"compositionend\":case\"compositionupdate\":case\"beforeblur\":case\"afterblur\":case\"beforeinput\":case\"blur\":case\"fullscreenchange\":case\"focus\":case\"hashchange\":case\"popstate\":case\"select\":case\"selectstart\":return 1;case\"drag\":case\"dragenter\":case\"dragexit\":case\"dragleave\":case\"dragover\":case\"mousemove\":case\"mouseout\":case\"mouseover\":case\"pointermove\":case\"pointerout\":case\"pointerover\":case\"scroll\":case\"toggle\":case\"touchmove\":case\"wheel\":case\"mouseenter\":case\"mouseleave\":case\"pointerenter\":case\"pointerleave\":return 4;case\"message\":switch(Ke()){case $e:return 1;case et:return 4;case tt:case nt:return 16;case rt:return 536870912;default:return 16}default:return 16}}var Xt=null,Kt=null,$t=null;function en(){if($t)return $t;var e,t,n=Kt,r=n.length,o=\"value\"in Xt?Xt.value:Xt.textContent,i=o.length;for(e=0;e<r&&n[e]===o[e];e++);var a=r-e;for(t=1;t<=a&&n[r-t]===o[i-t];t++);return $t=o.slice(e,1<t?1-t:void 0)}function tn(e){var t=e.keyCode;return\"charCode\"in e?0===(e=e.charCode)&&13===t&&(e=13):e=t,10===e&&(e=13),32<=e||13===e?e:0}function nn(){return!0}function rn(){return!1}function on(e){function t(t,n,r,o,i){for(var a in this._reactName=t,this._targetInst=r,this.type=n,this.nativeEvent=o,this.target=i,this.currentTarget=null,e)e.hasOwnProperty(a)&&(t=e[a],this[a]=t?t(o):o[a]);return this.isDefaultPrevented=(null!=o.defaultPrevented?o.defaultPrevented:!1===o.returnValue)?nn:rn,this.isPropagationStopped=rn,this}return L(t.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e&&(e.preventDefault?e.preventDefault():\"unknown\"!=typeof e.returnValue&&(e.returnValue=!1),this.isDefaultPrevented=nn)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():\"unknown\"!=typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=nn)},persist:function(){},isPersistent:nn}),t}var an,ln,un,cn={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},sn=on(cn),fn=L({},cn,{view:0,detail:0}),pn=on(fn),dn=L({},fn,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:Pn,button:0,buttons:0,relatedTarget:function(e){return void 0===e.relatedTarget?e.fromElement===e.srcElement?e.toElement:e.fromElement:e.relatedTarget},movementX:function(e){return\"movementX\"in e?e.movementX:(e!==un&&(un&&\"mousemove\"===e.type?(an=e.screenX-un.screenX,ln=e.screenY-un.screenY):ln=an=0,un=e),an)},movementY:function(e){return\"movementY\"in e?e.movementY:ln}}),yn=on(dn),hn=on(L({},dn,{dataTransfer:0})),mn=on(L({},fn,{relatedTarget:0})),bn=on(L({},cn,{animationName:0,elapsedTime:0,pseudoElement:0})),vn=L({},cn,{clipboardData:function(e){return\"clipboardData\"in e?e.clipboardData:window.clipboardData}}),gn=on(vn),wn=on(L({},cn,{data:0})),Sn={Esc:\"Escape\",Spacebar:\" \",Left:\"ArrowLeft\",Up:\"ArrowUp\",Right:\"ArrowRight\",Down:\"ArrowDown\",Del:\"Delete\",Win:\"OS\",Menu:\"ContextMenu\",Apps:\"ContextMenu\",Scroll:\"ScrollLock\",MozPrintableKey:\"Unidentified\"},On={8:\"Backspace\",9:\"Tab\",12:\"Clear\",13:\"Enter\",16:\"Shift\",17:\"Control\",18:\"Alt\",19:\"Pause\",20:\"CapsLock\",27:\"Escape\",32:\" \",33:\"PageUp\",34:\"PageDown\",35:\"End\",36:\"Home\",37:\"ArrowLeft\",38:\"ArrowUp\",39:\"ArrowRight\",40:\"ArrowDown\",45:\"Insert\",46:\"Delete\",112:\"F1\",113:\"F2\",114:\"F3\",115:\"F4\",116:\"F5\",117:\"F6\",118:\"F7\",119:\"F8\",120:\"F9\",121:\"F10\",122:\"F11\",123:\"F12\",144:\"NumLock\",145:\"ScrollLock\",224:\"Meta\"},En={Alt:\"altKey\",Control:\"ctrlKey\",Meta:\"metaKey\",Shift:\"shiftKey\"};function kn(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):!!(e=En[e])&&!!t[e]}function Pn(){return kn}var xn=L({},fn,{key:function(e){if(e.key){var t=Sn[e.key]||e.key;if(\"Unidentified\"!==t)return t}return\"keypress\"===e.type?13===(e=tn(e))?\"Enter\":String.fromCharCode(e):\"keydown\"===e.type||\"keyup\"===e.type?On[e.keyCode]||\"Unidentified\":\"\"},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:Pn,charCode:function(e){return\"keypress\"===e.type?tn(e):0},keyCode:function(e){return\"keydown\"===e.type||\"keyup\"===e.type?e.keyCode:0},which:function(e){return\"keypress\"===e.type?tn(e):\"keydown\"===e.type||\"keyup\"===e.type?e.keyCode:0}}),jn=on(xn),Cn=on(L({},dn,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0})),Tn=on(L({},fn,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:Pn})),An=on(L({},cn,{propertyName:0,elapsedTime:0,pseudoElement:0})),Rn=L({},dn,{deltaX:function(e){return\"deltaX\"in e?e.deltaX:\"wheelDeltaX\"in e?-e.wheelDeltaX:0},deltaY:function(e){return\"deltaY\"in e?e.deltaY:\"wheelDeltaY\"in e?-e.wheelDeltaY:\"wheelDelta\"in e?-e.wheelDelta:0},deltaZ:0,deltaMode:0}),_n=on(Rn),In=[9,13,27,32],Nn=s&&\"CompositionEvent\"in window,Mn=null;s&&\"documentMode\"in document&&(Mn=document.documentMode);var Dn=s&&\"TextEvent\"in window&&!Mn,Ln=s&&(!Nn||Mn&&8<Mn&&11>=Mn),zn=String.fromCharCode(32),Bn=!1;function Fn(e,t){switch(e){case\"keyup\":return-1!==In.indexOf(t.keyCode);case\"keydown\":return 229!==t.keyCode;case\"keypress\":case\"mousedown\":case\"focusout\":return!0;default:return!1}}function Un(e){return\"object\"==typeof(e=e.detail)&&\"data\"in e?e.data:null}var Wn=!1,Hn={color:!0,date:!0,datetime:!0,\"datetime-local\":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function Vn(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return\"input\"===t?!!Hn[e.type]:\"textarea\"===t}function Gn(e,t,n,r){xe(r),0<(t=qr(t,\"onChange\")).length&&(n=new sn(\"onChange\",\"change\",null,n,r),e.push({event:n,listeners:t}))}var qn=null,Qn=null;function Yn(e){zr(e,0)}function Zn(e){if(Q(So(e)))return e}function Jn(e,t){if(\"change\"===e)return t}var Xn=!1;if(s){var Kn;if(s){var $n=\"oninput\"in document;if(!$n){var er=document.createElement(\"div\");er.setAttribute(\"oninput\",\"return;\"),$n=\"function\"==typeof er.oninput}Kn=$n}else Kn=!1;Xn=Kn&&(!document.documentMode||9<document.documentMode)}function tr(){qn&&(qn.detachEvent(\"onpropertychange\",nr),Qn=qn=null)}function nr(e){if(\"value\"===e.propertyName&&Zn(Qn)){var t=[];Gn(t,Qn,e,Se(e)),Re(Yn,t)}}function rr(e,t,n){\"focusin\"===e?(tr(),Qn=n,(qn=t).attachEvent(\"onpropertychange\",nr)):\"focusout\"===e&&tr()}function or(e){if(\"selectionchange\"===e||\"keyup\"===e||\"keydown\"===e)return Zn(Qn)}function ir(e,t){if(\"click\"===e)return Zn(t)}function ar(e,t){if(\"input\"===e||\"change\"===e)return Zn(t)}var lr=\"function\"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t};function ur(e,t){if(lr(e,t))return!0;if(\"object\"!=typeof e||null===e||\"object\"!=typeof t||null===t)return!1;var n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(r=0;r<n.length;r++){var o=n[r];if(!f.call(t,o)||!lr(e[o],t[o]))return!1}return!0}function cr(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function sr(e,t){var n,r=cr(e);for(e=0;r;){if(3===r.nodeType){if(n=e+r.textContent.length,e<=t&&n>=t)return{node:r,offset:t-e};e=n}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=cr(r)}}function fr(e,t){return!(!e||!t)&&(e===t||(!e||3!==e.nodeType)&&(t&&3===t.nodeType?fr(e,t.parentNode):\"contains\"in e?e.contains(t):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(t))))}function pr(){for(var e=window,t=Y();t instanceof e.HTMLIFrameElement;){try{var n=\"string\"==typeof t.contentWindow.location.href}catch(e){n=!1}if(!n)break;t=Y((e=t.contentWindow).document)}return t}function dr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(\"input\"===t&&(\"text\"===e.type||\"search\"===e.type||\"tel\"===e.type||\"url\"===e.type||\"password\"===e.type)||\"textarea\"===t||\"true\"===e.contentEditable)}function yr(e){var t=pr(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&fr(n.ownerDocument.documentElement,n)){if(null!==r&&dr(n))if(t=r.start,void 0===(e=r.end)&&(e=t),\"selectionStart\"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if((e=(t=n.ownerDocument||document)&&t.defaultView||window).getSelection){e=e.getSelection();var o=n.textContent.length,i=Math.min(r.start,o);r=void 0===r.end?i:Math.min(r.end,o),!e.extend&&i>r&&(o=r,r=i,i=o),o=sr(n,i);var a=sr(n,r);o&&a&&(1!==e.rangeCount||e.anchorNode!==o.node||e.anchorOffset!==o.offset||e.focusNode!==a.node||e.focusOffset!==a.offset)&&((t=t.createRange()).setStart(o.node,o.offset),e.removeAllRanges(),i>r?(e.addRange(t),e.extend(a.node,a.offset)):(t.setEnd(a.node,a.offset),e.addRange(t)))}for(t=[],e=n;e=e.parentNode;)1===e.nodeType&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(\"function\"==typeof n.focus&&n.focus(),n=0;n<t.length;n++)(e=t[n]).element.scrollLeft=e.left,e.element.scrollTop=e.top}}var hr=s&&\"documentMode\"in document&&11>=document.documentMode,mr=null,br=null,vr=null,gr=!1;function wr(e,t,n){var r=n.window===n?n.document:9===n.nodeType?n:n.ownerDocument;gr||null==mr||mr!==Y(r)||(r=\"selectionStart\"in(r=mr)&&dr(r)?{start:r.selectionStart,end:r.selectionEnd}:{anchorNode:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection()).anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset},vr&&ur(vr,r)||(vr=r,0<(r=qr(br,\"onSelect\")).length&&(t=new sn(\"onSelect\",\"select\",null,t,n),e.push({event:t,listeners:r}),t.target=mr)))}function Sr(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n[\"Webkit\"+e]=\"webkit\"+t,n[\"Moz\"+e]=\"moz\"+t,n}var Or={animationend:Sr(\"Animation\",\"AnimationEnd\"),animationiteration:Sr(\"Animation\",\"AnimationIteration\"),animationstart:Sr(\"Animation\",\"AnimationStart\"),transitionend:Sr(\"Transition\",\"TransitionEnd\")},Er={},kr={};function Pr(e){if(Er[e])return Er[e];if(!Or[e])return e;var t,n=Or[e];for(t in n)if(n.hasOwnProperty(t)&&t in kr)return Er[e]=n[t];return e}s&&(kr=document.createElement(\"div\").style,\"AnimationEvent\"in window||(delete Or.animationend.animation,delete Or.animationiteration.animation,delete Or.animationstart.animation),\"TransitionEvent\"in window||delete Or.transitionend.transition);var xr=Pr(\"animationend\"),jr=Pr(\"animationiteration\"),Cr=Pr(\"animationstart\"),Tr=Pr(\"transitionend\"),Ar=new Map,Rr=\"abort auxClick cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel\".split(\" \");function _r(e,t){Ar.set(e,t),u(t,[e])}for(var Ir=0;Ir<Rr.length;Ir++){var Nr=Rr[Ir];_r(Nr.toLowerCase(),\"on\"+(Nr[0].toUpperCase()+Nr.slice(1)))}_r(xr,\"onAnimationEnd\"),_r(jr,\"onAnimationIteration\"),_r(Cr,\"onAnimationStart\"),_r(\"dblclick\",\"onDoubleClick\"),_r(\"focusin\",\"onFocus\"),_r(\"focusout\",\"onBlur\"),_r(Tr,\"onTransitionEnd\"),c(\"onMouseEnter\",[\"mouseout\",\"mouseover\"]),c(\"onMouseLeave\",[\"mouseout\",\"mouseover\"]),c(\"onPointerEnter\",[\"pointerout\",\"pointerover\"]),c(\"onPointerLeave\",[\"pointerout\",\"pointerover\"]),u(\"onChange\",\"change click focusin focusout input keydown keyup selectionchange\".split(\" \")),u(\"onSelect\",\"focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange\".split(\" \")),u(\"onBeforeInput\",[\"compositionend\",\"keypress\",\"textInput\",\"paste\"]),u(\"onCompositionEnd\",\"compositionend focusout keydown keypress keyup mousedown\".split(\" \")),u(\"onCompositionStart\",\"compositionstart focusout keydown keypress keyup mousedown\".split(\" \")),u(\"onCompositionUpdate\",\"compositionupdate focusout keydown keypress keyup mousedown\".split(\" \"));var Mr=\"abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting\".split(\" \"),Dr=new Set(\"cancel close invalid load scroll toggle\".split(\" \").concat(Mr));function Lr(e,t,n){var r=e.type||\"unknown-event\";e.currentTarget=n,function(e,t,n,r,o,a,l,u,c){if(Ue.apply(this,arguments),De){if(!De)throw Error(i(198));var s=Le;De=!1,Le=null,ze||(ze=!0,Be=s)}}(r,t,void 0,e),e.currentTarget=null}function zr(e,t){t=0!=(4&t);for(var n=0;n<e.length;n++){var r=e[n],o=r.event;r=r.listeners;e:{var i=void 0;if(t)for(var a=r.length-1;0<=a;a--){var l=r[a],u=l.instance,c=l.currentTarget;if(l=l.listener,u!==i&&o.isPropagationStopped())break e;Lr(o,l,c),i=u}else for(a=0;a<r.length;a++){if(u=(l=r[a]).instance,c=l.currentTarget,l=l.listener,u!==i&&o.isPropagationStopped())break e;Lr(o,l,c),i=u}}}if(ze)throw e=Be,ze=!1,Be=null,e}function Br(e,t){var n=t[mo];void 0===n&&(n=t[mo]=new Set);var r=e+\"__bubble\";n.has(r)||(Hr(t,e,2,!1),n.add(r))}function Fr(e,t,n){var r=0;t&&(r|=4),Hr(n,e,r,t)}var Ur=\"_reactListening\"+Math.random().toString(36).slice(2);function Wr(e){if(!e[Ur]){e[Ur]=!0,a.forEach((function(t){\"selectionchange\"!==t&&(Dr.has(t)||Fr(t,!1,e),Fr(t,!0,e))}));var t=9===e.nodeType?e:e.ownerDocument;null===t||t[Ur]||(t[Ur]=!0,Fr(\"selectionchange\",!1,t))}}function Hr(e,t,n,r){switch(Jt(t)){case 1:var o=Gt;break;case 4:o=qt;break;default:o=Qt}n=o.bind(null,t,n,e),o=void 0,!Ie||\"touchstart\"!==t&&\"touchmove\"!==t&&\"wheel\"!==t||(o=!0),r?void 0!==o?e.addEventListener(t,n,{capture:!0,passive:o}):e.addEventListener(t,n,!0):void 0!==o?e.addEventListener(t,n,{passive:o}):e.addEventListener(t,n,!1)}function Vr(e,t,n,r,o){var i=r;if(0==(1&t)&&0==(2&t)&&null!==r)e:for(;;){if(null===r)return;var a=r.tag;if(3===a||4===a){var l=r.stateNode.containerInfo;if(l===o||8===l.nodeType&&l.parentNode===o)break;if(4===a)for(a=r.return;null!==a;){var u=a.tag;if((3===u||4===u)&&((u=a.stateNode.containerInfo)===o||8===u.nodeType&&u.parentNode===o))return;a=a.return}for(;null!==l;){if(null===(a=go(l)))return;if(5===(u=a.tag)||6===u){r=i=a;continue e}l=l.parentNode}}r=r.return}Re((function(){var r=i,o=Se(n),a=[];e:{var l=Ar.get(e);if(void 0!==l){var u=sn,c=e;switch(e){case\"keypress\":if(0===tn(n))break e;case\"keydown\":case\"keyup\":u=jn;break;case\"focusin\":c=\"focus\",u=mn;break;case\"focusout\":c=\"blur\",u=mn;break;case\"beforeblur\":case\"afterblur\":u=mn;break;case\"click\":if(2===n.button)break e;case\"auxclick\":case\"dblclick\":case\"mousedown\":case\"mousemove\":case\"mouseup\":case\"mouseout\":case\"mouseover\":case\"contextmenu\":u=yn;break;case\"drag\":case\"dragend\":case\"dragenter\":case\"dragexit\":case\"dragleave\":case\"dragover\":case\"dragstart\":case\"drop\":u=hn;break;case\"touchcancel\":case\"touchend\":case\"touchmove\":case\"touchstart\":u=Tn;break;case xr:case jr:case Cr:u=bn;break;case Tr:u=An;break;case\"scroll\":u=pn;break;case\"wheel\":u=_n;break;case\"copy\":case\"cut\":case\"paste\":u=gn;break;case\"gotpointercapture\":case\"lostpointercapture\":case\"pointercancel\":case\"pointerdown\":case\"pointermove\":case\"pointerout\":case\"pointerover\":case\"pointerup\":u=Cn}var s=0!=(4&t),f=!s&&\"scroll\"===e,p=s?null!==l?l+\"Capture\":null:l;s=[];for(var d,y=r;null!==y;){var h=(d=y).stateNode;if(5===d.tag&&null!==h&&(d=h,null!==p&&null!=(h=_e(y,p))&&s.push(Gr(y,h,d))),f)break;y=y.return}0<s.length&&(l=new u(l,c,null,n,o),a.push({event:l,listeners:s}))}}if(0==(7&t)){if(u=\"mouseout\"===e||\"pointerout\"===e,(!(l=\"mouseover\"===e||\"pointerover\"===e)||n===we||!(c=n.relatedTarget||n.fromElement)||!go(c)&&!c[ho])&&(u||l)&&(l=o.window===o?o:(l=o.ownerDocument)?l.defaultView||l.parentWindow:window,u?(u=r,null!==(c=(c=n.relatedTarget||n.toElement)?go(c):null)&&(c!==(f=We(c))||5!==c.tag&&6!==c.tag)&&(c=null)):(u=null,c=r),u!==c)){if(s=yn,h=\"onMouseLeave\",p=\"onMouseEnter\",y=\"mouse\",\"pointerout\"!==e&&\"pointerover\"!==e||(s=Cn,h=\"onPointerLeave\",p=\"onPointerEnter\",y=\"pointer\"),f=null==u?l:So(u),d=null==c?l:So(c),(l=new s(h,y+\"leave\",u,n,o)).target=f,l.relatedTarget=d,h=null,go(o)===r&&((s=new s(p,y+\"enter\",c,n,o)).target=d,s.relatedTarget=f,h=s),f=h,u&&c)e:{for(p=c,y=0,d=s=u;d;d=Qr(d))y++;for(d=0,h=p;h;h=Qr(h))d++;for(;0<y-d;)s=Qr(s),y--;for(;0<d-y;)p=Qr(p),d--;for(;y--;){if(s===p||null!==p&&s===p.alternate)break e;s=Qr(s),p=Qr(p)}s=null}else s=null;null!==u&&Yr(a,l,u,s,!1),null!==c&&null!==f&&Yr(a,f,c,s,!0)}if(\"select\"===(u=(l=r?So(r):window).nodeName&&l.nodeName.toLowerCase())||\"input\"===u&&\"file\"===l.type)var m=Jn;else if(Vn(l))if(Xn)m=ar;else{m=or;var b=rr}else(u=l.nodeName)&&\"input\"===u.toLowerCase()&&(\"checkbox\"===l.type||\"radio\"===l.type)&&(m=ir);switch(m&&(m=m(e,r))?Gn(a,m,n,o):(b&&b(e,l,r),\"focusout\"===e&&(b=l._wrapperState)&&b.controlled&&\"number\"===l.type&&ee(l,\"number\",l.value)),b=r?So(r):window,e){case\"focusin\":(Vn(b)||\"true\"===b.contentEditable)&&(mr=b,br=r,vr=null);break;case\"focusout\":vr=br=mr=null;break;case\"mousedown\":gr=!0;break;case\"contextmenu\":case\"mouseup\":case\"dragend\":gr=!1,wr(a,n,o);break;case\"selectionchange\":if(hr)break;case\"keydown\":case\"keyup\":wr(a,n,o)}var v;if(Nn)e:{switch(e){case\"compositionstart\":var g=\"onCompositionStart\";break e;case\"compositionend\":g=\"onCompositionEnd\";break e;case\"compositionupdate\":g=\"onCompositionUpdate\";break e}g=void 0}else Wn?Fn(e,n)&&(g=\"onCompositionEnd\"):\"keydown\"===e&&229===n.keyCode&&(g=\"onCompositionStart\");g&&(Ln&&\"ko\"!==n.locale&&(Wn||\"onCompositionStart\"!==g?\"onCompositionEnd\"===g&&Wn&&(v=en()):(Kt=\"value\"in(Xt=o)?Xt.value:Xt.textContent,Wn=!0)),0<(b=qr(r,g)).length&&(g=new wn(g,e,null,n,o),a.push({event:g,listeners:b}),(v||null!==(v=Un(n)))&&(g.data=v))),(v=Dn?function(e,t){switch(e){case\"compositionend\":return Un(t);case\"keypress\":return 32!==t.which?null:(Bn=!0,zn);case\"textInput\":return(e=t.data)===zn&&Bn?null:e;default:return null}}(e,n):function(e,t){if(Wn)return\"compositionend\"===e||!Nn&&Fn(e,t)?(e=en(),$t=Kt=Xt=null,Wn=!1,e):null;switch(e){case\"paste\":default:return null;case\"keypress\":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1<t.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case\"compositionend\":return Ln&&\"ko\"!==t.locale?null:t.data}}(e,n))&&0<(r=qr(r,\"onBeforeInput\")).length&&(o=new wn(\"onBeforeInput\",\"beforeinput\",null,n,o),a.push({event:o,listeners:r}),o.data=v)}zr(a,t)}))}function Gr(e,t,n){return{instance:e,listener:t,currentTarget:n}}function qr(e,t){for(var n=t+\"Capture\",r=[];null!==e;){var o=e,i=o.stateNode;5===o.tag&&null!==i&&(o=i,null!=(i=_e(e,n))&&r.unshift(Gr(e,i,o)),null!=(i=_e(e,t))&&r.push(Gr(e,i,o))),e=e.return}return r}function Qr(e){if(null===e)return null;do{e=e.return}while(e&&5!==e.tag);return e||null}function Yr(e,t,n,r,o){for(var i=t._reactName,a=[];null!==n&&n!==r;){var l=n,u=l.alternate,c=l.stateNode;if(null!==u&&u===r)break;5===l.tag&&null!==c&&(l=c,o?null!=(u=_e(n,i))&&a.unshift(Gr(n,u,l)):o||null!=(u=_e(n,i))&&a.push(Gr(n,u,l))),n=n.return}0!==a.length&&e.push({event:t,listeners:a})}var Zr=/\\r\\n?/g,Jr=/\\u0000|\\uFFFD/g;function Xr(e){return(\"string\"==typeof e?e:\"\"+e).replace(Zr,\"\\n\").replace(Jr,\"\")}function Kr(e,t,n){if(t=Xr(t),Xr(e)!==t&&n)throw Error(i(425))}function $r(){}var eo=null,to=null;function no(e,t){return\"textarea\"===e||\"noscript\"===e||\"string\"==typeof t.children||\"number\"==typeof t.children||\"object\"==typeof t.dangerouslySetInnerHTML&&null!==t.dangerouslySetInnerHTML&&null!=t.dangerouslySetInnerHTML.__html}var ro=\"function\"==typeof setTimeout?setTimeout:void 0,oo=\"function\"==typeof clearTimeout?clearTimeout:void 0,io=\"function\"==typeof Promise?Promise:void 0,ao=\"function\"==typeof queueMicrotask?queueMicrotask:void 0!==io?function(e){return io.resolve(null).then(e).catch(lo)}:ro;function lo(e){setTimeout((function(){throw e}))}function uo(e,t){var n=t,r=0;do{var o=n.nextSibling;if(e.removeChild(n),o&&8===o.nodeType)if(\"/$\"===(n=o.data)){if(0===r)return e.removeChild(o),void Wt(t);r--}else\"$\"!==n&&\"$?\"!==n&&\"$!\"!==n||r++;n=o}while(n);Wt(t)}function co(e){for(;null!=e;e=e.nextSibling){var t=e.nodeType;if(1===t||3===t)break;if(8===t){if(\"$\"===(t=e.data)||\"$!\"===t||\"$?\"===t)break;if(\"/$\"===t)return null}}return e}function so(e){e=e.previousSibling;for(var t=0;e;){if(8===e.nodeType){var n=e.data;if(\"$\"===n||\"$!\"===n||\"$?\"===n){if(0===t)return e;t--}else\"/$\"===n&&t++}e=e.previousSibling}return null}var fo=Math.random().toString(36).slice(2),po=\"__reactFiber$\"+fo,yo=\"__reactProps$\"+fo,ho=\"__reactContainer$\"+fo,mo=\"__reactEvents$\"+fo,bo=\"__reactListeners$\"+fo,vo=\"__reactHandles$\"+fo;function go(e){var t=e[po];if(t)return t;for(var n=e.parentNode;n;){if(t=n[ho]||n[po]){if(n=t.alternate,null!==t.child||null!==n&&null!==n.child)for(e=so(e);null!==e;){if(n=e[po])return n;e=so(e)}return t}n=(e=n).parentNode}return null}function wo(e){return!(e=e[po]||e[ho])||5!==e.tag&&6!==e.tag&&13!==e.tag&&3!==e.tag?null:e}function So(e){if(5===e.tag||6===e.tag)return e.stateNode;throw Error(i(33))}function Oo(e){return e[yo]||null}var Eo=[],ko=-1;function Po(e){return{current:e}}function xo(e){0>ko||(e.current=Eo[ko],Eo[ko]=null,ko--)}function jo(e,t){ko++,Eo[ko]=e.current,e.current=t}var Co={},To=Po(Co),Ao=Po(!1),Ro=Co;function _o(e,t){var n=e.type.contextTypes;if(!n)return Co;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var o,i={};for(o in n)i[o]=t[o];return r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=i),i}function Io(e){return null!=e.childContextTypes}function No(){xo(Ao),xo(To)}function Mo(e,t,n){if(To.current!==Co)throw Error(i(168));jo(To,t),jo(Ao,n)}function Do(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,\"function\"!=typeof r.getChildContext)return n;for(var o in r=r.getChildContext())if(!(o in t))throw Error(i(108,H(e)||\"Unknown\",o));return L({},n,r)}function Lo(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Co,Ro=To.current,jo(To,e),jo(Ao,Ao.current),!0}function zo(e,t,n){var r=e.stateNode;if(!r)throw Error(i(169));n?(e=Do(e,t,Ro),r.__reactInternalMemoizedMergedChildContext=e,xo(Ao),xo(To),jo(To,e)):xo(Ao),jo(Ao,n)}var Bo=null,Fo=!1,Uo=!1;function Wo(e){null===Bo?Bo=[e]:Bo.push(e)}function Ho(){if(!Uo&&null!==Bo){Uo=!0;var e=0,t=gt;try{var n=Bo;for(gt=1;e<n.length;e++){var r=n[e];do{r=r(!0)}while(null!==r)}Bo=null,Fo=!1}catch(t){throw null!==Bo&&(Bo=Bo.slice(e+1)),Qe($e,Ho),t}finally{gt=t,Uo=!1}}return null}var Vo=[],Go=0,qo=null,Qo=0,Yo=[],Zo=0,Jo=null,Xo=1,Ko=\"\";function $o(e,t){Vo[Go++]=Qo,Vo[Go++]=qo,qo=e,Qo=t}function ei(e,t,n){Yo[Zo++]=Xo,Yo[Zo++]=Ko,Yo[Zo++]=Jo,Jo=e;var r=Xo;e=Ko;var o=32-at(r)-1;r&=~(1<<o),n+=1;var i=32-at(t)+o;if(30<i){var a=o-o%5;i=(r&(1<<a)-1).toString(32),r>>=a,o-=a,Xo=1<<32-at(t)+o|n<<o|r,Ko=i+e}else Xo=1<<i|n<<o|r,Ko=e}function ti(e){null!==e.return&&($o(e,1),ei(e,1,0))}function ni(e){for(;e===qo;)qo=Vo[--Go],Vo[Go]=null,Qo=Vo[--Go],Vo[Go]=null;for(;e===Jo;)Jo=Yo[--Zo],Yo[Zo]=null,Ko=Yo[--Zo],Yo[Zo]=null,Xo=Yo[--Zo],Yo[Zo]=null}var ri=null,oi=null,ii=!1,ai=null;function li(e,t){var n=_c(5,null,null,0);n.elementType=\"DELETED\",n.stateNode=t,n.return=e,null===(t=e.deletions)?(e.deletions=[n],e.flags|=16):t.push(n)}function ui(e,t){switch(e.tag){case 5:var n=e.type;return null!==(t=1!==t.nodeType||n.toLowerCase()!==t.nodeName.toLowerCase()?null:t)&&(e.stateNode=t,ri=e,oi=co(t.firstChild),!0);case 6:return null!==(t=\"\"===e.pendingProps||3!==t.nodeType?null:t)&&(e.stateNode=t,ri=e,oi=null,!0);case 13:return null!==(t=8!==t.nodeType?null:t)&&(n=null!==Jo?{id:Xo,overflow:Ko}:null,e.memoizedState={dehydrated:t,treeContext:n,retryLane:1073741824},(n=_c(18,null,null,0)).stateNode=t,n.return=e,e.child=n,ri=e,oi=null,!0);default:return!1}}function ci(e){return 0!=(1&e.mode)&&0==(128&e.flags)}function si(e){if(ii){var t=oi;if(t){var n=t;if(!ui(e,t)){if(ci(e))throw Error(i(418));t=co(n.nextSibling);var r=ri;t&&ui(e,t)?li(r,n):(e.flags=-4097&e.flags|2,ii=!1,ri=e)}}else{if(ci(e))throw Error(i(418));e.flags=-4097&e.flags|2,ii=!1,ri=e}}}function fi(e){for(e=e.return;null!==e&&5!==e.tag&&3!==e.tag&&13!==e.tag;)e=e.return;ri=e}function pi(e){if(e!==ri)return!1;if(!ii)return fi(e),ii=!0,!1;var t;if((t=3!==e.tag)&&!(t=5!==e.tag)&&(t=\"head\"!==(t=e.type)&&\"body\"!==t&&!no(e.type,e.memoizedProps)),t&&(t=oi)){if(ci(e))throw di(),Error(i(418));for(;t;)li(e,t),t=co(t.nextSibling)}if(fi(e),13===e.tag){if(!(e=null!==(e=e.memoizedState)?e.dehydrated:null))throw Error(i(317));e:{for(e=e.nextSibling,t=0;e;){if(8===e.nodeType){var n=e.data;if(\"/$\"===n){if(0===t){oi=co(e.nextSibling);break e}t--}else\"$\"!==n&&\"$!\"!==n&&\"$?\"!==n||t++}e=e.nextSibling}oi=null}}else oi=ri?co(e.stateNode.nextSibling):null;return!0}function di(){for(var e=oi;e;)e=co(e.nextSibling)}function yi(){oi=ri=null,ii=!1}function hi(e){null===ai?ai=[e]:ai.push(e)}var mi=w.ReactCurrentBatchConfig;function bi(e,t){if(e&&e.defaultProps){for(var n in t=L({},t),e=e.defaultProps)void 0===t[n]&&(t[n]=e[n]);return t}return t}var vi=Po(null),gi=null,wi=null,Si=null;function Oi(){Si=wi=gi=null}function Ei(e){var t=vi.current;xo(vi),e._currentValue=t}function ki(e,t,n){for(;null!==e;){var r=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,null!==r&&(r.childLanes|=t)):null!==r&&(r.childLanes&t)!==t&&(r.childLanes|=t),e===n)break;e=e.return}}function Pi(e,t){gi=e,Si=wi=null,null!==(e=e.dependencies)&&null!==e.firstContext&&(0!=(e.lanes&t)&&(wl=!0),e.firstContext=null)}function xi(e){var t=e._currentValue;if(Si!==e)if(e={context:e,memoizedValue:t,next:null},null===wi){if(null===gi)throw Error(i(308));wi=e,gi.dependencies={lanes:0,firstContext:e}}else wi=wi.next=e;return t}var ji=null;function Ci(e){null===ji?ji=[e]:ji.push(e)}function Ti(e,t,n,r){var o=t.interleaved;return null===o?(n.next=n,Ci(t)):(n.next=o.next,o.next=n),t.interleaved=n,Ai(e,r)}function Ai(e,t){e.lanes|=t;var n=e.alternate;for(null!==n&&(n.lanes|=t),n=e,e=e.return;null!==e;)e.childLanes|=t,null!==(n=e.alternate)&&(n.childLanes|=t),n=e,e=e.return;return 3===n.tag?n.stateNode:null}var Ri=!1;function _i(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Ii(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function Ni(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function Mi(e,t,n){var r=e.updateQueue;if(null===r)return null;if(r=r.shared,0!=(2&Tu)){var o=r.pending;return null===o?t.next=t:(t.next=o.next,o.next=t),r.pending=t,Ai(e,n)}return null===(o=r.interleaved)?(t.next=t,Ci(r)):(t.next=o.next,o.next=t),r.interleaved=t,Ai(e,n)}function Di(e,t,n){if(null!==(t=t.updateQueue)&&(t=t.shared,0!=(4194240&n))){var r=t.lanes;n|=r&=e.pendingLanes,t.lanes=n,vt(e,n)}}function Li(e,t){var n=e.updateQueue,r=e.alternate;if(null!==r&&n===(r=r.updateQueue)){var o=null,i=null;if(null!==(n=n.firstBaseUpdate)){do{var a={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};null===i?o=i=a:i=i.next=a,n=n.next}while(null!==n);null===i?o=i=t:i=i.next=t}else o=i=t;return n={baseState:r.baseState,firstBaseUpdate:o,lastBaseUpdate:i,shared:r.shared,effects:r.effects},void(e.updateQueue=n)}null===(e=n.lastBaseUpdate)?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function zi(e,t,n,r){var o=e.updateQueue;Ri=!1;var i=o.firstBaseUpdate,a=o.lastBaseUpdate,l=o.shared.pending;if(null!==l){o.shared.pending=null;var u=l,c=u.next;u.next=null,null===a?i=c:a.next=c,a=u;var s=e.alternate;null!==s&&(l=(s=s.updateQueue).lastBaseUpdate)!==a&&(null===l?s.firstBaseUpdate=c:l.next=c,s.lastBaseUpdate=u)}if(null!==i){var f=o.baseState;for(a=0,s=c=u=null,l=i;;){var p=l.lane,d=l.eventTime;if((r&p)===p){null!==s&&(s=s.next={eventTime:d,lane:0,tag:l.tag,payload:l.payload,callback:l.callback,next:null});e:{var y=e,h=l;switch(p=t,d=n,h.tag){case 1:if(\"function\"==typeof(y=h.payload)){f=y.call(d,f,p);break e}f=y;break e;case 3:y.flags=-65537&y.flags|128;case 0:if(null==(p=\"function\"==typeof(y=h.payload)?y.call(d,f,p):y))break e;f=L({},f,p);break e;case 2:Ri=!0}}null!==l.callback&&0!==l.lane&&(e.flags|=64,null===(p=o.effects)?o.effects=[l]:p.push(l))}else d={eventTime:d,lane:p,tag:l.tag,payload:l.payload,callback:l.callback,next:null},null===s?(c=s=d,u=f):s=s.next=d,a|=p;if(null===(l=l.next)){if(null===(l=o.shared.pending))break;l=(p=l).next,p.next=null,o.lastBaseUpdate=p,o.shared.pending=null}}if(null===s&&(u=f),o.baseState=u,o.firstBaseUpdate=c,o.lastBaseUpdate=s,null!==(t=o.shared.interleaved)){o=t;do{a|=o.lane,o=o.next}while(o!==t)}else null===i&&(o.shared.lanes=0);Lu|=a,e.lanes=a,e.memoizedState=f}}function Bi(e,t,n){if(e=t.effects,t.effects=null,null!==e)for(t=0;t<e.length;t++){var r=e[t],o=r.callback;if(null!==o){if(r.callback=null,r=n,\"function\"!=typeof o)throw Error(i(191,o));o.call(r)}}}var Fi=(new r.Component).refs;function Ui(e,t,n,r){n=null==(n=n(r,t=e.memoizedState))?t:L({},t,n),e.memoizedState=n,0===e.lanes&&(e.updateQueue.baseState=n)}var Wi={isMounted:function(e){return!!(e=e._reactInternals)&&We(e)===e},enqueueSetState:function(e,t,n){e=e._reactInternals;var r=tc(),o=nc(e),i=Ni(r,o);i.payload=t,null!=n&&(i.callback=n),null!==(t=Mi(e,i,o))&&(rc(t,e,o,r),Di(t,e,o))},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var r=tc(),o=nc(e),i=Ni(r,o);i.tag=1,i.payload=t,null!=n&&(i.callback=n),null!==(t=Mi(e,i,o))&&(rc(t,e,o,r),Di(t,e,o))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=tc(),r=nc(e),o=Ni(n,r);o.tag=2,null!=t&&(o.callback=t),null!==(t=Mi(e,o,r))&&(rc(t,e,r,n),Di(t,e,r))}};function Hi(e,t,n,r,o,i,a){return\"function\"==typeof(e=e.stateNode).shouldComponentUpdate?e.shouldComponentUpdate(r,i,a):!(t.prototype&&t.prototype.isPureReactComponent&&ur(n,r)&&ur(o,i))}function Vi(e,t,n){var r=!1,o=Co,i=t.contextType;return\"object\"==typeof i&&null!==i?i=xi(i):(o=Io(t)?Ro:To.current,i=(r=null!=(r=t.contextTypes))?_o(e,o):Co),t=new t(n,i),e.memoizedState=null!==t.state&&void 0!==t.state?t.state:null,t.updater=Wi,e.stateNode=t,t._reactInternals=e,r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=o,e.__reactInternalMemoizedMaskedChildContext=i),t}function Gi(e,t,n,r){e=t.state,\"function\"==typeof t.componentWillReceiveProps&&t.componentWillReceiveProps(n,r),\"function\"==typeof t.UNSAFE_componentWillReceiveProps&&t.UNSAFE_componentWillReceiveProps(n,r),t.state!==e&&Wi.enqueueReplaceState(t,t.state,null)}function qi(e,t,n,r){var o=e.stateNode;o.props=n,o.state=e.memoizedState,o.refs=Fi,_i(e);var i=t.contextType;\"object\"==typeof i&&null!==i?o.context=xi(i):(i=Io(t)?Ro:To.current,o.context=_o(e,i)),o.state=e.memoizedState,\"function\"==typeof(i=t.getDerivedStateFromProps)&&(Ui(e,t,i,n),o.state=e.memoizedState),\"function\"==typeof t.getDerivedStateFromProps||\"function\"==typeof o.getSnapshotBeforeUpdate||\"function\"!=typeof o.UNSAFE_componentWillMount&&\"function\"!=typeof o.componentWillMount||(t=o.state,\"function\"==typeof o.componentWillMount&&o.componentWillMount(),\"function\"==typeof o.UNSAFE_componentWillMount&&o.UNSAFE_componentWillMount(),t!==o.state&&Wi.enqueueReplaceState(o,o.state,null),zi(e,n,o,r),o.state=e.memoizedState),\"function\"==typeof o.componentDidMount&&(e.flags|=4194308)}function Qi(e,t,n){if(null!==(e=n.ref)&&\"function\"!=typeof e&&\"object\"!=typeof e){if(n._owner){if(n=n._owner){if(1!==n.tag)throw Error(i(309));var r=n.stateNode}if(!r)throw Error(i(147,e));var o=r,a=\"\"+e;return null!==t&&null!==t.ref&&\"function\"==typeof t.ref&&t.ref._stringRef===a?t.ref:(t=function(e){var t=o.refs;t===Fi&&(t=o.refs={}),null===e?delete t[a]:t[a]=e},t._stringRef=a,t)}if(\"string\"!=typeof e)throw Error(i(284));if(!n._owner)throw Error(i(290,e))}return e}function Yi(e,t){throw e=Object.prototype.toString.call(t),Error(i(31,\"[object Object]\"===e?\"object with keys {\"+Object.keys(t).join(\", \")+\"}\":e))}function Zi(e){return(0,e._init)(e._payload)}function Ji(e){function t(t,n){if(e){var r=t.deletions;null===r?(t.deletions=[n],t.flags|=16):r.push(n)}}function n(n,r){if(!e)return null;for(;null!==r;)t(n,r),r=r.sibling;return null}function r(e,t){for(e=new Map;null!==t;)null!==t.key?e.set(t.key,t):e.set(t.index,t),t=t.sibling;return e}function o(e,t){return(e=Nc(e,t)).index=0,e.sibling=null,e}function a(t,n,r){return t.index=r,e?null!==(r=t.alternate)?(r=r.index)<n?(t.flags|=2,n):r:(t.flags|=2,n):(t.flags|=1048576,n)}function l(t){return e&&null===t.alternate&&(t.flags|=2),t}function u(e,t,n,r){return null===t||6!==t.tag?((t=zc(n,e.mode,r)).return=e,t):((t=o(t,n)).return=e,t)}function c(e,t,n,r){var i=n.type;return i===E?f(e,t,n.props.children,r,n.key):null!==t&&(t.elementType===i||\"object\"==typeof i&&null!==i&&i.$$typeof===_&&Zi(i)===t.type)?((r=o(t,n.props)).ref=Qi(e,t,n),r.return=e,r):((r=Mc(n.type,n.key,n.props,null,e.mode,r)).ref=Qi(e,t,n),r.return=e,r)}function s(e,t,n,r){return null===t||4!==t.tag||t.stateNode.containerInfo!==n.containerInfo||t.stateNode.implementation!==n.implementation?((t=Bc(n,e.mode,r)).return=e,t):((t=o(t,n.children||[])).return=e,t)}function f(e,t,n,r,i){return null===t||7!==t.tag?((t=Dc(n,e.mode,r,i)).return=e,t):((t=o(t,n)).return=e,t)}function p(e,t,n){if(\"string\"==typeof t&&\"\"!==t||\"number\"==typeof t)return(t=zc(\"\"+t,e.mode,n)).return=e,t;if(\"object\"==typeof t&&null!==t){switch(t.$$typeof){case S:return(n=Mc(t.type,t.key,t.props,null,e.mode,n)).ref=Qi(e,null,t),n.return=e,n;case O:return(t=Bc(t,e.mode,n)).return=e,t;case _:return p(e,(0,t._init)(t._payload),n)}if(te(t)||M(t))return(t=Dc(t,e.mode,n,null)).return=e,t;Yi(e,t)}return null}function d(e,t,n,r){var o=null!==t?t.key:null;if(\"string\"==typeof n&&\"\"!==n||\"number\"==typeof n)return null!==o?null:u(e,t,\"\"+n,r);if(\"object\"==typeof n&&null!==n){switch(n.$$typeof){case S:return n.key===o?c(e,t,n,r):null;case O:return n.key===o?s(e,t,n,r):null;case _:return d(e,t,(o=n._init)(n._payload),r)}if(te(n)||M(n))return null!==o?null:f(e,t,n,r,null);Yi(e,n)}return null}function y(e,t,n,r,o){if(\"string\"==typeof r&&\"\"!==r||\"number\"==typeof r)return u(t,e=e.get(n)||null,\"\"+r,o);if(\"object\"==typeof r&&null!==r){switch(r.$$typeof){case S:return c(t,e=e.get(null===r.key?n:r.key)||null,r,o);case O:return s(t,e=e.get(null===r.key?n:r.key)||null,r,o);case _:return y(e,t,n,(0,r._init)(r._payload),o)}if(te(r)||M(r))return f(t,e=e.get(n)||null,r,o,null);Yi(t,r)}return null}function h(o,i,l,u){for(var c=null,s=null,f=i,h=i=0,m=null;null!==f&&h<l.length;h++){f.index>h?(m=f,f=null):m=f.sibling;var b=d(o,f,l[h],u);if(null===b){null===f&&(f=m);break}e&&f&&null===b.alternate&&t(o,f),i=a(b,i,h),null===s?c=b:s.sibling=b,s=b,f=m}if(h===l.length)return n(o,f),ii&&$o(o,h),c;if(null===f){for(;h<l.length;h++)null!==(f=p(o,l[h],u))&&(i=a(f,i,h),null===s?c=f:s.sibling=f,s=f);return ii&&$o(o,h),c}for(f=r(o,f);h<l.length;h++)null!==(m=y(f,o,h,l[h],u))&&(e&&null!==m.alternate&&f.delete(null===m.key?h:m.key),i=a(m,i,h),null===s?c=m:s.sibling=m,s=m);return e&&f.forEach((function(e){return t(o,e)})),ii&&$o(o,h),c}function m(o,l,u,c){var s=M(u);if(\"function\"!=typeof s)throw Error(i(150));if(null==(u=s.call(u)))throw Error(i(151));for(var f=s=null,h=l,m=l=0,b=null,v=u.next();null!==h&&!v.done;m++,v=u.next()){h.index>m?(b=h,h=null):b=h.sibling;var g=d(o,h,v.value,c);if(null===g){null===h&&(h=b);break}e&&h&&null===g.alternate&&t(o,h),l=a(g,l,m),null===f?s=g:f.sibling=g,f=g,h=b}if(v.done)return n(o,h),ii&&$o(o,m),s;if(null===h){for(;!v.done;m++,v=u.next())null!==(v=p(o,v.value,c))&&(l=a(v,l,m),null===f?s=v:f.sibling=v,f=v);return ii&&$o(o,m),s}for(h=r(o,h);!v.done;m++,v=u.next())null!==(v=y(h,o,m,v.value,c))&&(e&&null!==v.alternate&&h.delete(null===v.key?m:v.key),l=a(v,l,m),null===f?s=v:f.sibling=v,f=v);return e&&h.forEach((function(e){return t(o,e)})),ii&&$o(o,m),s}return function e(r,i,a,u){if(\"object\"==typeof a&&null!==a&&a.type===E&&null===a.key&&(a=a.props.children),\"object\"==typeof a&&null!==a){switch(a.$$typeof){case S:e:{for(var c=a.key,s=i;null!==s;){if(s.key===c){if((c=a.type)===E){if(7===s.tag){n(r,s.sibling),(i=o(s,a.props.children)).return=r,r=i;break e}}else if(s.elementType===c||\"object\"==typeof c&&null!==c&&c.$$typeof===_&&Zi(c)===s.type){n(r,s.sibling),(i=o(s,a.props)).ref=Qi(r,s,a),i.return=r,r=i;break e}n(r,s);break}t(r,s),s=s.sibling}a.type===E?((i=Dc(a.props.children,r.mode,u,a.key)).return=r,r=i):((u=Mc(a.type,a.key,a.props,null,r.mode,u)).ref=Qi(r,i,a),u.return=r,r=u)}return l(r);case O:e:{for(s=a.key;null!==i;){if(i.key===s){if(4===i.tag&&i.stateNode.containerInfo===a.containerInfo&&i.stateNode.implementation===a.implementation){n(r,i.sibling),(i=o(i,a.children||[])).return=r,r=i;break e}n(r,i);break}t(r,i),i=i.sibling}(i=Bc(a,r.mode,u)).return=r,r=i}return l(r);case _:return e(r,i,(s=a._init)(a._payload),u)}if(te(a))return h(r,i,a,u);if(M(a))return m(r,i,a,u);Yi(r,a)}return\"string\"==typeof a&&\"\"!==a||\"number\"==typeof a?(a=\"\"+a,null!==i&&6===i.tag?(n(r,i.sibling),(i=o(i,a)).return=r,r=i):(n(r,i),(i=zc(a,r.mode,u)).return=r,r=i),l(r)):n(r,i)}}var Xi=Ji(!0),Ki=Ji(!1),$i={},ea=Po($i),ta=Po($i),na=Po($i);function ra(e){if(e===$i)throw Error(i(174));return e}function oa(e,t){switch(jo(na,t),jo(ta,e),jo(ea,$i),e=t.nodeType){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:ue(null,\"\");break;default:t=ue(t=(e=8===e?t.parentNode:t).namespaceURI||null,e=e.tagName)}xo(ea),jo(ea,t)}function ia(){xo(ea),xo(ta),xo(na)}function aa(e){ra(na.current);var t=ra(ea.current),n=ue(t,e.type);t!==n&&(jo(ta,e),jo(ea,n))}function la(e){ta.current===e&&(xo(ea),xo(ta))}var ua=Po(0);function ca(e){for(var t=e;null!==t;){if(13===t.tag){var n=t.memoizedState;if(null!==n&&(null===(n=n.dehydrated)||\"$?\"===n.data||\"$!\"===n.data))return t}else if(19===t.tag&&void 0!==t.memoizedProps.revealOrder){if(0!=(128&t.flags))return t}else if(null!==t.child){t.child.return=t,t=t.child;continue}if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var sa=[];function fa(){for(var e=0;e<sa.length;e++)sa[e]._workInProgressVersionPrimary=null;sa.length=0}var pa=w.ReactCurrentDispatcher,da=w.ReactCurrentBatchConfig,ya=0,ha=null,ma=null,ba=null,va=!1,ga=!1,wa=0,Sa=0;function Oa(){throw Error(i(321))}function Ea(e,t){if(null===t)return!1;for(var n=0;n<t.length&&n<e.length;n++)if(!lr(e[n],t[n]))return!1;return!0}function ka(e,t,n,r,o,a){if(ya=a,ha=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,pa.current=null===e||null===e.memoizedState?ll:ul,e=n(r,o),ga){a=0;do{if(ga=!1,wa=0,25<=a)throw Error(i(301));a+=1,ba=ma=null,t.updateQueue=null,pa.current=cl,e=n(r,o)}while(ga)}if(pa.current=al,t=null!==ma&&null!==ma.next,ya=0,ba=ma=ha=null,va=!1,t)throw Error(i(300));return e}function Pa(){var e=0!==wa;return wa=0,e}function xa(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return null===ba?ha.memoizedState=ba=e:ba=ba.next=e,ba}function ja(){if(null===ma){var e=ha.alternate;e=null!==e?e.memoizedState:null}else e=ma.next;var t=null===ba?ha.memoizedState:ba.next;if(null!==t)ba=t,ma=e;else{if(null===e)throw Error(i(310));e={memoizedState:(ma=e).memoizedState,baseState:ma.baseState,baseQueue:ma.baseQueue,queue:ma.queue,next:null},null===ba?ha.memoizedState=ba=e:ba=ba.next=e}return ba}function Ca(e,t){return\"function\"==typeof t?t(e):t}function Ta(e){var t=ja(),n=t.queue;if(null===n)throw Error(i(311));n.lastRenderedReducer=e;var r=ma,o=r.baseQueue,a=n.pending;if(null!==a){if(null!==o){var l=o.next;o.next=a.next,a.next=l}r.baseQueue=o=a,n.pending=null}if(null!==o){a=o.next,r=r.baseState;var u=l=null,c=null,s=a;do{var f=s.lane;if((ya&f)===f)null!==c&&(c=c.next={lane:0,action:s.action,hasEagerState:s.hasEagerState,eagerState:s.eagerState,next:null}),r=s.hasEagerState?s.eagerState:e(r,s.action);else{var p={lane:f,action:s.action,hasEagerState:s.hasEagerState,eagerState:s.eagerState,next:null};null===c?(u=c=p,l=r):c=c.next=p,ha.lanes|=f,Lu|=f}s=s.next}while(null!==s&&s!==a);null===c?l=r:c.next=u,lr(r,t.memoizedState)||(wl=!0),t.memoizedState=r,t.baseState=l,t.baseQueue=c,n.lastRenderedState=r}if(null!==(e=n.interleaved)){o=e;do{a=o.lane,ha.lanes|=a,Lu|=a,o=o.next}while(o!==e)}else null===o&&(n.lanes=0);return[t.memoizedState,n.dispatch]}function Aa(e){var t=ja(),n=t.queue;if(null===n)throw Error(i(311));n.lastRenderedReducer=e;var r=n.dispatch,o=n.pending,a=t.memoizedState;if(null!==o){n.pending=null;var l=o=o.next;do{a=e(a,l.action),l=l.next}while(l!==o);lr(a,t.memoizedState)||(wl=!0),t.memoizedState=a,null===t.baseQueue&&(t.baseState=a),n.lastRenderedState=a}return[a,r]}function Ra(){}function _a(e,t){var n=ha,r=ja(),o=t(),a=!lr(r.memoizedState,o);if(a&&(r.memoizedState=o,wl=!0),r=r.queue,Va(Ma.bind(null,n,r,e),[e]),r.getSnapshot!==t||a||null!==ba&&1&ba.memoizedState.tag){if(n.flags|=2048,Ba(9,Na.bind(null,n,r,o,t),void 0,null),null===Au)throw Error(i(349));0!=(30&ya)||Ia(n,t,o)}return o}function Ia(e,t,n){e.flags|=16384,e={getSnapshot:t,value:n},null===(t=ha.updateQueue)?(t={lastEffect:null,stores:null},ha.updateQueue=t,t.stores=[e]):null===(n=t.stores)?t.stores=[e]:n.push(e)}function Na(e,t,n,r){t.value=n,t.getSnapshot=r,Da(t)&&La(e)}function Ma(e,t,n){return n((function(){Da(t)&&La(e)}))}function Da(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!lr(e,n)}catch(e){return!0}}function La(e){var t=Ai(e,1);null!==t&&rc(t,e,1,-1)}function za(e){var t=xa();return\"function\"==typeof e&&(e=e()),t.memoizedState=t.baseState=e,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:Ca,lastRenderedState:e},t.queue=e,e=e.dispatch=nl.bind(null,ha,e),[t.memoizedState,e]}function Ba(e,t,n,r){return e={tag:e,create:t,destroy:n,deps:r,next:null},null===(t=ha.updateQueue)?(t={lastEffect:null,stores:null},ha.updateQueue=t,t.lastEffect=e.next=e):null===(n=t.lastEffect)?t.lastEffect=e.next=e:(r=n.next,n.next=e,e.next=r,t.lastEffect=e),e}function Fa(){return ja().memoizedState}function Ua(e,t,n,r){var o=xa();ha.flags|=e,o.memoizedState=Ba(1|t,n,void 0,void 0===r?null:r)}function Wa(e,t,n,r){var o=ja();r=void 0===r?null:r;var i=void 0;if(null!==ma){var a=ma.memoizedState;if(i=a.destroy,null!==r&&Ea(r,a.deps))return void(o.memoizedState=Ba(t,n,i,r))}ha.flags|=e,o.memoizedState=Ba(1|t,n,i,r)}function Ha(e,t){return Ua(8390656,8,e,t)}function Va(e,t){return Wa(2048,8,e,t)}function Ga(e,t){return Wa(4,2,e,t)}function qa(e,t){return Wa(4,4,e,t)}function Qa(e,t){return\"function\"==typeof t?(e=e(),t(e),function(){t(null)}):null!=t?(e=e(),t.current=e,function(){t.current=null}):void 0}function Ya(e,t,n){return n=null!=n?n.concat([e]):null,Wa(4,4,Qa.bind(null,t,e),n)}function Za(){}function Ja(e,t){var n=ja();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&Ea(t,r[1])?r[0]:(n.memoizedState=[e,t],e)}function Xa(e,t){var n=ja();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&Ea(t,r[1])?r[0]:(e=e(),n.memoizedState=[e,t],e)}function Ka(e,t,n){return 0==(21&ya)?(e.baseState&&(e.baseState=!1,wl=!0),e.memoizedState=n):(lr(n,t)||(n=ht(),ha.lanes|=n,Lu|=n,e.baseState=!0),t)}function $a(e,t){var n=gt;gt=0!==n&&4>n?n:4,e(!0);var r=da.transition;da.transition={};try{e(!1),t()}finally{gt=n,da.transition=r}}function el(){return ja().memoizedState}function tl(e,t,n){var r=nc(e);n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},rl(e)?ol(t,n):null!==(n=Ti(e,t,n,r))&&(rc(n,e,r,tc()),il(n,t,r))}function nl(e,t,n){var r=nc(e),o={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(rl(e))ol(t,o);else{var i=e.alternate;if(0===e.lanes&&(null===i||0===i.lanes)&&null!==(i=t.lastRenderedReducer))try{var a=t.lastRenderedState,l=i(a,n);if(o.hasEagerState=!0,o.eagerState=l,lr(l,a)){var u=t.interleaved;return null===u?(o.next=o,Ci(t)):(o.next=u.next,u.next=o),void(t.interleaved=o)}}catch(e){}null!==(n=Ti(e,t,o,r))&&(rc(n,e,r,o=tc()),il(n,t,r))}}function rl(e){var t=e.alternate;return e===ha||null!==t&&t===ha}function ol(e,t){ga=va=!0;var n=e.pending;null===n?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function il(e,t,n){if(0!=(4194240&n)){var r=t.lanes;n|=r&=e.pendingLanes,t.lanes=n,vt(e,n)}}var al={readContext:xi,useCallback:Oa,useContext:Oa,useEffect:Oa,useImperativeHandle:Oa,useInsertionEffect:Oa,useLayoutEffect:Oa,useMemo:Oa,useReducer:Oa,useRef:Oa,useState:Oa,useDebugValue:Oa,useDeferredValue:Oa,useTransition:Oa,useMutableSource:Oa,useSyncExternalStore:Oa,useId:Oa,unstable_isNewReconciler:!1},ll={readContext:xi,useCallback:function(e,t){return xa().memoizedState=[e,void 0===t?null:t],e},useContext:xi,useEffect:Ha,useImperativeHandle:function(e,t,n){return n=null!=n?n.concat([e]):null,Ua(4194308,4,Qa.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Ua(4194308,4,e,t)},useInsertionEffect:function(e,t){return Ua(4,2,e,t)},useMemo:function(e,t){var n=xa();return t=void 0===t?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=xa();return t=void 0!==n?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=tl.bind(null,ha,e),[r.memoizedState,e]},useRef:function(e){return e={current:e},xa().memoizedState=e},useState:za,useDebugValue:Za,useDeferredValue:function(e){return xa().memoizedState=e},useTransition:function(){var e=za(!1),t=e[0];return e=$a.bind(null,e[1]),xa().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=ha,o=xa();if(ii){if(void 0===n)throw Error(i(407));n=n()}else{if(n=t(),null===Au)throw Error(i(349));0!=(30&ya)||Ia(r,t,n)}o.memoizedState=n;var a={value:n,getSnapshot:t};return o.queue=a,Ha(Ma.bind(null,r,a,e),[e]),r.flags|=2048,Ba(9,Na.bind(null,r,a,n,t),void 0,null),n},useId:function(){var e=xa(),t=Au.identifierPrefix;if(ii){var n=Ko;t=\":\"+t+\"R\"+(n=(Xo&~(1<<32-at(Xo)-1)).toString(32)+n),0<(n=wa++)&&(t+=\"H\"+n.toString(32)),t+=\":\"}else t=\":\"+t+\"r\"+(n=Sa++).toString(32)+\":\";return e.memoizedState=t},unstable_isNewReconciler:!1},ul={readContext:xi,useCallback:Ja,useContext:xi,useEffect:Va,useImperativeHandle:Ya,useInsertionEffect:Ga,useLayoutEffect:qa,useMemo:Xa,useReducer:Ta,useRef:Fa,useState:function(){return Ta(Ca)},useDebugValue:Za,useDeferredValue:function(e){return Ka(ja(),ma.memoizedState,e)},useTransition:function(){return[Ta(Ca)[0],ja().memoizedState]},useMutableSource:Ra,useSyncExternalStore:_a,useId:el,unstable_isNewReconciler:!1},cl={readContext:xi,useCallback:Ja,useContext:xi,useEffect:Va,useImperativeHandle:Ya,useInsertionEffect:Ga,useLayoutEffect:qa,useMemo:Xa,useReducer:Aa,useRef:Fa,useState:function(){return Aa(Ca)},useDebugValue:Za,useDeferredValue:function(e){var t=ja();return null===ma?t.memoizedState=e:Ka(t,ma.memoizedState,e)},useTransition:function(){return[Aa(Ca)[0],ja().memoizedState]},useMutableSource:Ra,useSyncExternalStore:_a,useId:el,unstable_isNewReconciler:!1};function sl(e,t){try{var n=\"\",r=t;do{n+=U(r),r=r.return}while(r);var o=n}catch(e){o=\"\\nError generating stack: \"+e.message+\"\\n\"+e.stack}return{value:e,source:t,stack:o,digest:null}}function fl(e,t,n){return{value:e,source:null,stack:null!=n?n:null,digest:null!=t?t:null}}function pl(e,t){try{console.error(t.value)}catch(e){setTimeout((function(){throw e}))}}var dl=\"function\"==typeof WeakMap?WeakMap:Map;function yl(e,t,n){(n=Ni(-1,n)).tag=3,n.payload={element:null};var r=t.value;return n.callback=function(){Gu||(Gu=!0,qu=r),pl(0,t)},n}function hl(e,t,n){(n=Ni(-1,n)).tag=3;var r=e.type.getDerivedStateFromError;if(\"function\"==typeof r){var o=t.value;n.payload=function(){return r(o)},n.callback=function(){pl(0,t)}}var i=e.stateNode;return null!==i&&\"function\"==typeof i.componentDidCatch&&(n.callback=function(){pl(0,t),\"function\"!=typeof r&&(null===Qu?Qu=new Set([this]):Qu.add(this));var e=t.stack;this.componentDidCatch(t.value,{componentStack:null!==e?e:\"\"})}),n}function ml(e,t,n){var r=e.pingCache;if(null===r){r=e.pingCache=new dl;var o=new Set;r.set(t,o)}else void 0===(o=r.get(t))&&(o=new Set,r.set(t,o));o.has(n)||(o.add(n),e=xc.bind(null,e,t,n),t.then(e,e))}function bl(e){do{var t;if((t=13===e.tag)&&(t=null===(t=e.memoizedState)||null!==t.dehydrated),t)return e;e=e.return}while(null!==e);return null}function vl(e,t,n,r,o){return 0==(1&e.mode)?(e===t?e.flags|=65536:(e.flags|=128,n.flags|=131072,n.flags&=-52805,1===n.tag&&(null===n.alternate?n.tag=17:((t=Ni(-1,1)).tag=2,Mi(n,t,1))),n.lanes|=1),e):(e.flags|=65536,e.lanes=o,e)}var gl=w.ReactCurrentOwner,wl=!1;function Sl(e,t,n,r){t.child=null===e?Ki(t,null,n,r):Xi(t,e.child,n,r)}function Ol(e,t,n,r,o){n=n.render;var i=t.ref;return Pi(t,o),r=ka(e,t,n,r,i,o),n=Pa(),null===e||wl?(ii&&n&&ti(t),t.flags|=1,Sl(e,t,r,o),t.child):(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~o,Gl(e,t,o))}function El(e,t,n,r,o){if(null===e){var i=n.type;return\"function\"!=typeof i||Ic(i)||void 0!==i.defaultProps||null!==n.compare||void 0!==n.defaultProps?((e=Mc(n.type,null,r,t,t.mode,o)).ref=t.ref,e.return=t,t.child=e):(t.tag=15,t.type=i,kl(e,t,i,r,o))}if(i=e.child,0==(e.lanes&o)){var a=i.memoizedProps;if((n=null!==(n=n.compare)?n:ur)(a,r)&&e.ref===t.ref)return Gl(e,t,o)}return t.flags|=1,(e=Nc(i,r)).ref=t.ref,e.return=t,t.child=e}function kl(e,t,n,r,o){if(null!==e){var i=e.memoizedProps;if(ur(i,r)&&e.ref===t.ref){if(wl=!1,t.pendingProps=r=i,0==(e.lanes&o))return t.lanes=e.lanes,Gl(e,t,o);0!=(131072&e.flags)&&(wl=!0)}}return jl(e,t,n,r,o)}function Pl(e,t,n){var r=t.pendingProps,o=r.children,i=null!==e?e.memoizedState:null;if(\"hidden\"===r.mode)if(0==(1&t.mode))t.memoizedState={baseLanes:0,cachePool:null,transitions:null},jo(Nu,Iu),Iu|=n;else{if(0==(1073741824&n))return e=null!==i?i.baseLanes|n:n,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e,cachePool:null,transitions:null},t.updateQueue=null,jo(Nu,Iu),Iu|=e,null;t.memoizedState={baseLanes:0,cachePool:null,transitions:null},r=null!==i?i.baseLanes:n,jo(Nu,Iu),Iu|=r}else null!==i?(r=i.baseLanes|n,t.memoizedState=null):r=n,jo(Nu,Iu),Iu|=r;return Sl(e,t,o,n),t.child}function xl(e,t){var n=t.ref;(null===e&&null!==n||null!==e&&e.ref!==n)&&(t.flags|=512,t.flags|=2097152)}function jl(e,t,n,r,o){var i=Io(n)?Ro:To.current;return i=_o(t,i),Pi(t,o),n=ka(e,t,n,r,i,o),r=Pa(),null===e||wl?(ii&&r&&ti(t),t.flags|=1,Sl(e,t,n,o),t.child):(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~o,Gl(e,t,o))}function Cl(e,t,n,r,o){if(Io(n)){var i=!0;Lo(t)}else i=!1;if(Pi(t,o),null===t.stateNode)Vl(e,t),Vi(t,n,r),qi(t,n,r,o),r=!0;else if(null===e){var a=t.stateNode,l=t.memoizedProps;a.props=l;var u=a.context,c=n.contextType;c=\"object\"==typeof c&&null!==c?xi(c):_o(t,c=Io(n)?Ro:To.current);var s=n.getDerivedStateFromProps,f=\"function\"==typeof s||\"function\"==typeof a.getSnapshotBeforeUpdate;f||\"function\"!=typeof a.UNSAFE_componentWillReceiveProps&&\"function\"!=typeof a.componentWillReceiveProps||(l!==r||u!==c)&&Gi(t,a,r,c),Ri=!1;var p=t.memoizedState;a.state=p,zi(t,r,a,o),u=t.memoizedState,l!==r||p!==u||Ao.current||Ri?(\"function\"==typeof s&&(Ui(t,n,s,r),u=t.memoizedState),(l=Ri||Hi(t,n,l,r,p,u,c))?(f||\"function\"!=typeof a.UNSAFE_componentWillMount&&\"function\"!=typeof a.componentWillMount||(\"function\"==typeof a.componentWillMount&&a.componentWillMount(),\"function\"==typeof a.UNSAFE_componentWillMount&&a.UNSAFE_componentWillMount()),\"function\"==typeof a.componentDidMount&&(t.flags|=4194308)):(\"function\"==typeof a.componentDidMount&&(t.flags|=4194308),t.memoizedProps=r,t.memoizedState=u),a.props=r,a.state=u,a.context=c,r=l):(\"function\"==typeof a.componentDidMount&&(t.flags|=4194308),r=!1)}else{a=t.stateNode,Ii(e,t),l=t.memoizedProps,c=t.type===t.elementType?l:bi(t.type,l),a.props=c,f=t.pendingProps,p=a.context,u=\"object\"==typeof(u=n.contextType)&&null!==u?xi(u):_o(t,u=Io(n)?Ro:To.current);var d=n.getDerivedStateFromProps;(s=\"function\"==typeof d||\"function\"==typeof a.getSnapshotBeforeUpdate)||\"function\"!=typeof a.UNSAFE_componentWillReceiveProps&&\"function\"!=typeof a.componentWillReceiveProps||(l!==f||p!==u)&&Gi(t,a,r,u),Ri=!1,p=t.memoizedState,a.state=p,zi(t,r,a,o);var y=t.memoizedState;l!==f||p!==y||Ao.current||Ri?(\"function\"==typeof d&&(Ui(t,n,d,r),y=t.memoizedState),(c=Ri||Hi(t,n,c,r,p,y,u)||!1)?(s||\"function\"!=typeof a.UNSAFE_componentWillUpdate&&\"function\"!=typeof a.componentWillUpdate||(\"function\"==typeof a.componentWillUpdate&&a.componentWillUpdate(r,y,u),\"function\"==typeof a.UNSAFE_componentWillUpdate&&a.UNSAFE_componentWillUpdate(r,y,u)),\"function\"==typeof a.componentDidUpdate&&(t.flags|=4),\"function\"==typeof a.getSnapshotBeforeUpdate&&(t.flags|=1024)):(\"function\"!=typeof a.componentDidUpdate||l===e.memoizedProps&&p===e.memoizedState||(t.flags|=4),\"function\"!=typeof a.getSnapshotBeforeUpdate||l===e.memoizedProps&&p===e.memoizedState||(t.flags|=1024),t.memoizedProps=r,t.memoizedState=y),a.props=r,a.state=y,a.context=u,r=c):(\"function\"!=typeof a.componentDidUpdate||l===e.memoizedProps&&p===e.memoizedState||(t.flags|=4),\"function\"!=typeof a.getSnapshotBeforeUpdate||l===e.memoizedProps&&p===e.memoizedState||(t.flags|=1024),r=!1)}return Tl(e,t,n,r,i,o)}function Tl(e,t,n,r,o,i){xl(e,t);var a=0!=(128&t.flags);if(!r&&!a)return o&&zo(t,n,!1),Gl(e,t,i);r=t.stateNode,gl.current=t;var l=a&&\"function\"!=typeof n.getDerivedStateFromError?null:r.render();return t.flags|=1,null!==e&&a?(t.child=Xi(t,e.child,null,i),t.child=Xi(t,null,l,i)):Sl(e,t,l,i),t.memoizedState=r.state,o&&zo(t,n,!0),t.child}function Al(e){var t=e.stateNode;t.pendingContext?Mo(0,t.pendingContext,t.pendingContext!==t.context):t.context&&Mo(0,t.context,!1),oa(e,t.containerInfo)}function Rl(e,t,n,r,o){return yi(),hi(o),t.flags|=256,Sl(e,t,n,r),t.child}var _l,Il,Nl,Ml,Dl={dehydrated:null,treeContext:null,retryLane:0};function Ll(e){return{baseLanes:e,cachePool:null,transitions:null}}function zl(e,t,n){var r,o=t.pendingProps,a=ua.current,l=!1,u=0!=(128&t.flags);if((r=u)||(r=(null===e||null!==e.memoizedState)&&0!=(2&a)),r?(l=!0,t.flags&=-129):null!==e&&null===e.memoizedState||(a|=1),jo(ua,1&a),null===e)return si(t),null!==(e=t.memoizedState)&&null!==(e=e.dehydrated)?(0==(1&t.mode)?t.lanes=1:\"$!\"===e.data?t.lanes=8:t.lanes=1073741824,null):(u=o.children,e=o.fallback,l?(o=t.mode,l=t.child,u={mode:\"hidden\",children:u},0==(1&o)&&null!==l?(l.childLanes=0,l.pendingProps=u):l=Lc(u,o,0,null),e=Dc(e,o,n,null),l.return=t,e.return=t,l.sibling=e,t.child=l,t.child.memoizedState=Ll(n),t.memoizedState=Dl,e):Bl(t,u));if(null!==(a=e.memoizedState)&&null!==(r=a.dehydrated))return function(e,t,n,r,o,a,l){if(n)return 256&t.flags?(t.flags&=-257,Fl(e,t,l,r=fl(Error(i(422))))):null!==t.memoizedState?(t.child=e.child,t.flags|=128,null):(a=r.fallback,o=t.mode,r=Lc({mode:\"visible\",children:r.children},o,0,null),(a=Dc(a,o,l,null)).flags|=2,r.return=t,a.return=t,r.sibling=a,t.child=r,0!=(1&t.mode)&&Xi(t,e.child,null,l),t.child.memoizedState=Ll(l),t.memoizedState=Dl,a);if(0==(1&t.mode))return Fl(e,t,l,null);if(\"$!\"===o.data){if(r=o.nextSibling&&o.nextSibling.dataset)var u=r.dgst;return r=u,Fl(e,t,l,r=fl(a=Error(i(419)),r,void 0))}if(u=0!=(l&e.childLanes),wl||u){if(null!==(r=Au)){switch(l&-l){case 4:o=2;break;case 16:o=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:o=32;break;case 536870912:o=268435456;break;default:o=0}0!==(o=0!=(o&(r.suspendedLanes|l))?0:o)&&o!==a.retryLane&&(a.retryLane=o,Ai(e,o),rc(r,e,o,-1))}return mc(),Fl(e,t,l,r=fl(Error(i(421))))}return\"$?\"===o.data?(t.flags|=128,t.child=e.child,t=Cc.bind(null,e),o._reactRetry=t,null):(e=a.treeContext,oi=co(o.nextSibling),ri=t,ii=!0,ai=null,null!==e&&(Yo[Zo++]=Xo,Yo[Zo++]=Ko,Yo[Zo++]=Jo,Xo=e.id,Ko=e.overflow,Jo=t),(t=Bl(t,r.children)).flags|=4096,t)}(e,t,u,o,r,a,n);if(l){l=o.fallback,u=t.mode,r=(a=e.child).sibling;var c={mode:\"hidden\",children:o.children};return 0==(1&u)&&t.child!==a?((o=t.child).childLanes=0,o.pendingProps=c,t.deletions=null):(o=Nc(a,c)).subtreeFlags=14680064&a.subtreeFlags,null!==r?l=Nc(r,l):(l=Dc(l,u,n,null)).flags|=2,l.return=t,o.return=t,o.sibling=l,t.child=o,o=l,l=t.child,u=null===(u=e.child.memoizedState)?Ll(n):{baseLanes:u.baseLanes|n,cachePool:null,transitions:u.transitions},l.memoizedState=u,l.childLanes=e.childLanes&~n,t.memoizedState=Dl,o}return e=(l=e.child).sibling,o=Nc(l,{mode:\"visible\",children:o.children}),0==(1&t.mode)&&(o.lanes=n),o.return=t,o.sibling=null,null!==e&&(null===(n=t.deletions)?(t.deletions=[e],t.flags|=16):n.push(e)),t.child=o,t.memoizedState=null,o}function Bl(e,t){return(t=Lc({mode:\"visible\",children:t},e.mode,0,null)).return=e,e.child=t}function Fl(e,t,n,r){return null!==r&&hi(r),Xi(t,e.child,null,n),(e=Bl(t,t.pendingProps.children)).flags|=2,t.memoizedState=null,e}function Ul(e,t,n){e.lanes|=t;var r=e.alternate;null!==r&&(r.lanes|=t),ki(e.return,t,n)}function Wl(e,t,n,r,o){var i=e.memoizedState;null===i?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:r,tail:n,tailMode:o}:(i.isBackwards=t,i.rendering=null,i.renderingStartTime=0,i.last=r,i.tail=n,i.tailMode=o)}function Hl(e,t,n){var r=t.pendingProps,o=r.revealOrder,i=r.tail;if(Sl(e,t,r.children,n),0!=(2&(r=ua.current)))r=1&r|2,t.flags|=128;else{if(null!==e&&0!=(128&e.flags))e:for(e=t.child;null!==e;){if(13===e.tag)null!==e.memoizedState&&Ul(e,n,t);else if(19===e.tag)Ul(e,n,t);else if(null!==e.child){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;null===e.sibling;){if(null===e.return||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}r&=1}if(jo(ua,r),0==(1&t.mode))t.memoizedState=null;else switch(o){case\"forwards\":for(n=t.child,o=null;null!==n;)null!==(e=n.alternate)&&null===ca(e)&&(o=n),n=n.sibling;null===(n=o)?(o=t.child,t.child=null):(o=n.sibling,n.sibling=null),Wl(t,!1,o,n,i);break;case\"backwards\":for(n=null,o=t.child,t.child=null;null!==o;){if(null!==(e=o.alternate)&&null===ca(e)){t.child=o;break}e=o.sibling,o.sibling=n,n=o,o=e}Wl(t,!0,n,null,i);break;case\"together\":Wl(t,!1,null,null,void 0);break;default:t.memoizedState=null}return t.child}function Vl(e,t){0==(1&t.mode)&&null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2)}function Gl(e,t,n){if(null!==e&&(t.dependencies=e.dependencies),Lu|=t.lanes,0==(n&t.childLanes))return null;if(null!==e&&t.child!==e.child)throw Error(i(153));if(null!==t.child){for(n=Nc(e=t.child,e.pendingProps),t.child=n,n.return=t;null!==e.sibling;)e=e.sibling,(n=n.sibling=Nc(e,e.pendingProps)).return=t;n.sibling=null}return t.child}function ql(e,t){if(!ii)switch(e.tailMode){case\"hidden\":t=e.tail;for(var n=null;null!==t;)null!==t.alternate&&(n=t),t=t.sibling;null===n?e.tail=null:n.sibling=null;break;case\"collapsed\":n=e.tail;for(var r=null;null!==n;)null!==n.alternate&&(r=n),n=n.sibling;null===r?t||null===e.tail?e.tail=null:e.tail.sibling=null:r.sibling=null}}function Ql(e){var t=null!==e.alternate&&e.alternate.child===e.child,n=0,r=0;if(t)for(var o=e.child;null!==o;)n|=o.lanes|o.childLanes,r|=14680064&o.subtreeFlags,r|=14680064&o.flags,o.return=e,o=o.sibling;else for(o=e.child;null!==o;)n|=o.lanes|o.childLanes,r|=o.subtreeFlags,r|=o.flags,o.return=e,o=o.sibling;return e.subtreeFlags|=r,e.childLanes=n,t}function Yl(e,t,n){var r=t.pendingProps;switch(ni(t),t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return Ql(t),null;case 1:case 17:return Io(t.type)&&No(),Ql(t),null;case 3:return r=t.stateNode,ia(),xo(Ao),xo(To),fa(),r.pendingContext&&(r.context=r.pendingContext,r.pendingContext=null),null!==e&&null!==e.child||(pi(t)?t.flags|=4:null===e||e.memoizedState.isDehydrated&&0==(256&t.flags)||(t.flags|=1024,null!==ai&&(lc(ai),ai=null))),Il(e,t),Ql(t),null;case 5:la(t);var o=ra(na.current);if(n=t.type,null!==e&&null!=t.stateNode)Nl(e,t,n,r,o),e.ref!==t.ref&&(t.flags|=512,t.flags|=2097152);else{if(!r){if(null===t.stateNode)throw Error(i(166));return Ql(t),null}if(e=ra(ea.current),pi(t)){r=t.stateNode,n=t.type;var a=t.memoizedProps;switch(r[po]=t,r[yo]=a,e=0!=(1&t.mode),n){case\"dialog\":Br(\"cancel\",r),Br(\"close\",r);break;case\"iframe\":case\"object\":case\"embed\":Br(\"load\",r);break;case\"video\":case\"audio\":for(o=0;o<Mr.length;o++)Br(Mr[o],r);break;case\"source\":Br(\"error\",r);break;case\"img\":case\"image\":case\"link\":Br(\"error\",r),Br(\"load\",r);break;case\"details\":Br(\"toggle\",r);break;case\"input\":J(r,a),Br(\"invalid\",r);break;case\"select\":r._wrapperState={wasMultiple:!!a.multiple},Br(\"invalid\",r);break;case\"textarea\":oe(r,a),Br(\"invalid\",r)}for(var u in ve(n,a),o=null,a)if(a.hasOwnProperty(u)){var c=a[u];\"children\"===u?\"string\"==typeof c?r.textContent!==c&&(!0!==a.suppressHydrationWarning&&Kr(r.textContent,c,e),o=[\"children\",c]):\"number\"==typeof c&&r.textContent!==\"\"+c&&(!0!==a.suppressHydrationWarning&&Kr(r.textContent,c,e),o=[\"children\",\"\"+c]):l.hasOwnProperty(u)&&null!=c&&\"onScroll\"===u&&Br(\"scroll\",r)}switch(n){case\"input\":q(r),$(r,a,!0);break;case\"textarea\":q(r),ae(r);break;case\"select\":case\"option\":break;default:\"function\"==typeof a.onClick&&(r.onclick=$r)}r=o,t.updateQueue=r,null!==r&&(t.flags|=4)}else{u=9===o.nodeType?o:o.ownerDocument,\"http://www.w3.org/1999/xhtml\"===e&&(e=le(n)),\"http://www.w3.org/1999/xhtml\"===e?\"script\"===n?((e=u.createElement(\"div\")).innerHTML=\"<script><\\/script>\",e=e.removeChild(e.firstChild)):\"string\"==typeof r.is?e=u.createElement(n,{is:r.is}):(e=u.createElement(n),\"select\"===n&&(u=e,r.multiple?u.multiple=!0:r.size&&(u.size=r.size))):e=u.createElementNS(e,n),e[po]=t,e[yo]=r,_l(e,t,!1,!1),t.stateNode=e;e:{switch(u=ge(n,r),n){case\"dialog\":Br(\"cancel\",e),Br(\"close\",e),o=r;break;case\"iframe\":case\"object\":case\"embed\":Br(\"load\",e),o=r;break;case\"video\":case\"audio\":for(o=0;o<Mr.length;o++)Br(Mr[o],e);o=r;break;case\"source\":Br(\"error\",e),o=r;break;case\"img\":case\"image\":case\"link\":Br(\"error\",e),Br(\"load\",e),o=r;break;case\"details\":Br(\"toggle\",e),o=r;break;case\"input\":J(e,r),o=Z(e,r),Br(\"invalid\",e);break;case\"option\":default:o=r;break;case\"select\":e._wrapperState={wasMultiple:!!r.multiple},o=L({},r,{value:void 0}),Br(\"invalid\",e);break;case\"textarea\":oe(e,r),o=re(e,r),Br(\"invalid\",e)}for(a in ve(n,o),c=o)if(c.hasOwnProperty(a)){var s=c[a];\"style\"===a?me(e,s):\"dangerouslySetInnerHTML\"===a?null!=(s=s?s.__html:void 0)&&fe(e,s):\"children\"===a?\"string\"==typeof s?(\"textarea\"!==n||\"\"!==s)&&pe(e,s):\"number\"==typeof s&&pe(e,\"\"+s):\"suppressContentEditableWarning\"!==a&&\"suppressHydrationWarning\"!==a&&\"autoFocus\"!==a&&(l.hasOwnProperty(a)?null!=s&&\"onScroll\"===a&&Br(\"scroll\",e):null!=s&&g(e,a,s,u))}switch(n){case\"input\":q(e),$(e,r,!1);break;case\"textarea\":q(e),ae(e);break;case\"option\":null!=r.value&&e.setAttribute(\"value\",\"\"+V(r.value));break;case\"select\":e.multiple=!!r.multiple,null!=(a=r.value)?ne(e,!!r.multiple,a,!1):null!=r.defaultValue&&ne(e,!!r.multiple,r.defaultValue,!0);break;default:\"function\"==typeof o.onClick&&(e.onclick=$r)}switch(n){case\"button\":case\"input\":case\"select\":case\"textarea\":r=!!r.autoFocus;break e;case\"img\":r=!0;break e;default:r=!1}}r&&(t.flags|=4)}null!==t.ref&&(t.flags|=512,t.flags|=2097152)}return Ql(t),null;case 6:if(e&&null!=t.stateNode)Ml(e,t,e.memoizedProps,r);else{if(\"string\"!=typeof r&&null===t.stateNode)throw Error(i(166));if(n=ra(na.current),ra(ea.current),pi(t)){if(r=t.stateNode,n=t.memoizedProps,r[po]=t,(a=r.nodeValue!==n)&&null!==(e=ri))switch(e.tag){case 3:Kr(r.nodeValue,n,0!=(1&e.mode));break;case 5:!0!==e.memoizedProps.suppressHydrationWarning&&Kr(r.nodeValue,n,0!=(1&e.mode))}a&&(t.flags|=4)}else(r=(9===n.nodeType?n:n.ownerDocument).createTextNode(r))[po]=t,t.stateNode=r}return Ql(t),null;case 13:if(xo(ua),r=t.memoizedState,null===e||null!==e.memoizedState&&null!==e.memoizedState.dehydrated){if(ii&&null!==oi&&0!=(1&t.mode)&&0==(128&t.flags))di(),yi(),t.flags|=98560,a=!1;else if(a=pi(t),null!==r&&null!==r.dehydrated){if(null===e){if(!a)throw Error(i(318));if(!(a=null!==(a=t.memoizedState)?a.dehydrated:null))throw Error(i(317));a[po]=t}else yi(),0==(128&t.flags)&&(t.memoizedState=null),t.flags|=4;Ql(t),a=!1}else null!==ai&&(lc(ai),ai=null),a=!0;if(!a)return 65536&t.flags?t:null}return 0!=(128&t.flags)?(t.lanes=n,t):((r=null!==r)!=(null!==e&&null!==e.memoizedState)&&r&&(t.child.flags|=8192,0!=(1&t.mode)&&(null===e||0!=(1&ua.current)?0===Mu&&(Mu=3):mc())),null!==t.updateQueue&&(t.flags|=4),Ql(t),null);case 4:return ia(),Il(e,t),null===e&&Wr(t.stateNode.containerInfo),Ql(t),null;case 10:return Ei(t.type._context),Ql(t),null;case 19:if(xo(ua),null===(a=t.memoizedState))return Ql(t),null;if(r=0!=(128&t.flags),null===(u=a.rendering))if(r)ql(a,!1);else{if(0!==Mu||null!==e&&0!=(128&e.flags))for(e=t.child;null!==e;){if(null!==(u=ca(e))){for(t.flags|=128,ql(a,!1),null!==(r=u.updateQueue)&&(t.updateQueue=r,t.flags|=4),t.subtreeFlags=0,r=n,n=t.child;null!==n;)e=r,(a=n).flags&=14680066,null===(u=a.alternate)?(a.childLanes=0,a.lanes=e,a.child=null,a.subtreeFlags=0,a.memoizedProps=null,a.memoizedState=null,a.updateQueue=null,a.dependencies=null,a.stateNode=null):(a.childLanes=u.childLanes,a.lanes=u.lanes,a.child=u.child,a.subtreeFlags=0,a.deletions=null,a.memoizedProps=u.memoizedProps,a.memoizedState=u.memoizedState,a.updateQueue=u.updateQueue,a.type=u.type,e=u.dependencies,a.dependencies=null===e?null:{lanes:e.lanes,firstContext:e.firstContext}),n=n.sibling;return jo(ua,1&ua.current|2),t.child}e=e.sibling}null!==a.tail&&Xe()>Hu&&(t.flags|=128,r=!0,ql(a,!1),t.lanes=4194304)}else{if(!r)if(null!==(e=ca(u))){if(t.flags|=128,r=!0,null!==(n=e.updateQueue)&&(t.updateQueue=n,t.flags|=4),ql(a,!0),null===a.tail&&\"hidden\"===a.tailMode&&!u.alternate&&!ii)return Ql(t),null}else 2*Xe()-a.renderingStartTime>Hu&&1073741824!==n&&(t.flags|=128,r=!0,ql(a,!1),t.lanes=4194304);a.isBackwards?(u.sibling=t.child,t.child=u):(null!==(n=a.last)?n.sibling=u:t.child=u,a.last=u)}return null!==a.tail?(t=a.tail,a.rendering=t,a.tail=t.sibling,a.renderingStartTime=Xe(),t.sibling=null,n=ua.current,jo(ua,r?1&n|2:1&n),t):(Ql(t),null);case 22:case 23:return pc(),r=null!==t.memoizedState,null!==e&&null!==e.memoizedState!==r&&(t.flags|=8192),r&&0!=(1&t.mode)?0!=(1073741824&Iu)&&(Ql(t),6&t.subtreeFlags&&(t.flags|=8192)):Ql(t),null;case 24:case 25:return null}throw Error(i(156,t.tag))}function Zl(e,t){switch(ni(t),t.tag){case 1:return Io(t.type)&&No(),65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 3:return ia(),xo(Ao),xo(To),fa(),0!=(65536&(e=t.flags))&&0==(128&e)?(t.flags=-65537&e|128,t):null;case 5:return la(t),null;case 13:if(xo(ua),null!==(e=t.memoizedState)&&null!==e.dehydrated){if(null===t.alternate)throw Error(i(340));yi()}return 65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 19:return xo(ua),null;case 4:return ia(),null;case 10:return Ei(t.type._context),null;case 22:case 23:return pc(),null;default:return null}}_l=function(e,t){for(var n=t.child;null!==n;){if(5===n.tag||6===n.tag)e.appendChild(n.stateNode);else if(4!==n.tag&&null!==n.child){n.child.return=n,n=n.child;continue}if(n===t)break;for(;null===n.sibling;){if(null===n.return||n.return===t)return;n=n.return}n.sibling.return=n.return,n=n.sibling}},Il=function(){},Nl=function(e,t,n,r){var o=e.memoizedProps;if(o!==r){e=t.stateNode,ra(ea.current);var i,a=null;switch(n){case\"input\":o=Z(e,o),r=Z(e,r),a=[];break;case\"select\":o=L({},o,{value:void 0}),r=L({},r,{value:void 0}),a=[];break;case\"textarea\":o=re(e,o),r=re(e,r),a=[];break;default:\"function\"!=typeof o.onClick&&\"function\"==typeof r.onClick&&(e.onclick=$r)}for(s in ve(n,r),n=null,o)if(!r.hasOwnProperty(s)&&o.hasOwnProperty(s)&&null!=o[s])if(\"style\"===s){var u=o[s];for(i in u)u.hasOwnProperty(i)&&(n||(n={}),n[i]=\"\")}else\"dangerouslySetInnerHTML\"!==s&&\"children\"!==s&&\"suppressContentEditableWarning\"!==s&&\"suppressHydrationWarning\"!==s&&\"autoFocus\"!==s&&(l.hasOwnProperty(s)?a||(a=[]):(a=a||[]).push(s,null));for(s in r){var c=r[s];if(u=null!=o?o[s]:void 0,r.hasOwnProperty(s)&&c!==u&&(null!=c||null!=u))if(\"style\"===s)if(u){for(i in u)!u.hasOwnProperty(i)||c&&c.hasOwnProperty(i)||(n||(n={}),n[i]=\"\");for(i in c)c.hasOwnProperty(i)&&u[i]!==c[i]&&(n||(n={}),n[i]=c[i])}else n||(a||(a=[]),a.push(s,n)),n=c;else\"dangerouslySetInnerHTML\"===s?(c=c?c.__html:void 0,u=u?u.__html:void 0,null!=c&&u!==c&&(a=a||[]).push(s,c)):\"children\"===s?\"string\"!=typeof c&&\"number\"!=typeof c||(a=a||[]).push(s,\"\"+c):\"suppressContentEditableWarning\"!==s&&\"suppressHydrationWarning\"!==s&&(l.hasOwnProperty(s)?(null!=c&&\"onScroll\"===s&&Br(\"scroll\",e),a||u===c||(a=[])):(a=a||[]).push(s,c))}n&&(a=a||[]).push(\"style\",n);var s=a;(t.updateQueue=s)&&(t.flags|=4)}},Ml=function(e,t,n,r){n!==r&&(t.flags|=4)};var Jl=!1,Xl=!1,Kl=\"function\"==typeof WeakSet?WeakSet:Set,$l=null;function eu(e,t){var n=e.ref;if(null!==n)if(\"function\"==typeof n)try{n(null)}catch(n){Pc(e,t,n)}else n.current=null}function tu(e,t,n){try{n()}catch(n){Pc(e,t,n)}}var nu=!1;function ru(e,t,n){var r=t.updateQueue;if(null!==(r=null!==r?r.lastEffect:null)){var o=r=r.next;do{if((o.tag&e)===e){var i=o.destroy;o.destroy=void 0,void 0!==i&&tu(t,n,i)}o=o.next}while(o!==r)}}function ou(e,t){if(null!==(t=null!==(t=t.updateQueue)?t.lastEffect:null)){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function iu(e){var t=e.ref;if(null!==t){var n=e.stateNode;e.tag,e=n,\"function\"==typeof t?t(e):t.current=e}}function au(e){var t=e.alternate;null!==t&&(e.alternate=null,au(t)),e.child=null,e.deletions=null,e.sibling=null,5===e.tag&&null!==(t=e.stateNode)&&(delete t[po],delete t[yo],delete t[mo],delete t[bo],delete t[vo]),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function lu(e){return 5===e.tag||3===e.tag||4===e.tag}function uu(e){e:for(;;){for(;null===e.sibling;){if(null===e.return||lu(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;5!==e.tag&&6!==e.tag&&18!==e.tag;){if(2&e.flags)continue e;if(null===e.child||4===e.tag)continue e;e.child.return=e,e=e.child}if(!(2&e.flags))return e.stateNode}}function cu(e,t,n){var r=e.tag;if(5===r||6===r)e=e.stateNode,t?8===n.nodeType?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(8===n.nodeType?(t=n.parentNode).insertBefore(e,n):(t=n).appendChild(e),null!=(n=n._reactRootContainer)||null!==t.onclick||(t.onclick=$r));else if(4!==r&&null!==(e=e.child))for(cu(e,t,n),e=e.sibling;null!==e;)cu(e,t,n),e=e.sibling}function su(e,t,n){var r=e.tag;if(5===r||6===r)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(4!==r&&null!==(e=e.child))for(su(e,t,n),e=e.sibling;null!==e;)su(e,t,n),e=e.sibling}var fu=null,pu=!1;function du(e,t,n){for(n=n.child;null!==n;)yu(e,t,n),n=n.sibling}function yu(e,t,n){if(it&&\"function\"==typeof it.onCommitFiberUnmount)try{it.onCommitFiberUnmount(ot,n)}catch(e){}switch(n.tag){case 5:Xl||eu(n,t);case 6:var r=fu,o=pu;fu=null,du(e,t,n),pu=o,null!==(fu=r)&&(pu?(e=fu,n=n.stateNode,8===e.nodeType?e.parentNode.removeChild(n):e.removeChild(n)):fu.removeChild(n.stateNode));break;case 18:null!==fu&&(pu?(e=fu,n=n.stateNode,8===e.nodeType?uo(e.parentNode,n):1===e.nodeType&&uo(e,n),Wt(e)):uo(fu,n.stateNode));break;case 4:r=fu,o=pu,fu=n.stateNode.containerInfo,pu=!0,du(e,t,n),fu=r,pu=o;break;case 0:case 11:case 14:case 15:if(!Xl&&null!==(r=n.updateQueue)&&null!==(r=r.lastEffect)){o=r=r.next;do{var i=o,a=i.destroy;i=i.tag,void 0!==a&&(0!=(2&i)||0!=(4&i))&&tu(n,t,a),o=o.next}while(o!==r)}du(e,t,n);break;case 1:if(!Xl&&(eu(n,t),\"function\"==typeof(r=n.stateNode).componentWillUnmount))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(e){Pc(n,t,e)}du(e,t,n);break;case 21:du(e,t,n);break;case 22:1&n.mode?(Xl=(r=Xl)||null!==n.memoizedState,du(e,t,n),Xl=r):du(e,t,n);break;default:du(e,t,n)}}function hu(e){var t=e.updateQueue;if(null!==t){e.updateQueue=null;var n=e.stateNode;null===n&&(n=e.stateNode=new Kl),t.forEach((function(t){var r=Tc.bind(null,e,t);n.has(t)||(n.add(t),t.then(r,r))}))}}function mu(e,t){var n=t.deletions;if(null!==n)for(var r=0;r<n.length;r++){var o=n[r];try{var a=e,l=t,u=l;e:for(;null!==u;){switch(u.tag){case 5:fu=u.stateNode,pu=!1;break e;case 3:case 4:fu=u.stateNode.containerInfo,pu=!0;break e}u=u.return}if(null===fu)throw Error(i(160));yu(a,l,o),fu=null,pu=!1;var c=o.alternate;null!==c&&(c.return=null),o.return=null}catch(e){Pc(o,t,e)}}if(12854&t.subtreeFlags)for(t=t.child;null!==t;)bu(t,e),t=t.sibling}function bu(e,t){var n=e.alternate,r=e.flags;switch(e.tag){case 0:case 11:case 14:case 15:if(mu(t,e),vu(e),4&r){try{ru(3,e,e.return),ou(3,e)}catch(t){Pc(e,e.return,t)}try{ru(5,e,e.return)}catch(t){Pc(e,e.return,t)}}break;case 1:mu(t,e),vu(e),512&r&&null!==n&&eu(n,n.return);break;case 5:if(mu(t,e),vu(e),512&r&&null!==n&&eu(n,n.return),32&e.flags){var o=e.stateNode;try{pe(o,\"\")}catch(t){Pc(e,e.return,t)}}if(4&r&&null!=(o=e.stateNode)){var a=e.memoizedProps,l=null!==n?n.memoizedProps:a,u=e.type,c=e.updateQueue;if(e.updateQueue=null,null!==c)try{\"input\"===u&&\"radio\"===a.type&&null!=a.name&&X(o,a),ge(u,l);var s=ge(u,a);for(l=0;l<c.length;l+=2){var f=c[l],p=c[l+1];\"style\"===f?me(o,p):\"dangerouslySetInnerHTML\"===f?fe(o,p):\"children\"===f?pe(o,p):g(o,f,p,s)}switch(u){case\"input\":K(o,a);break;case\"textarea\":ie(o,a);break;case\"select\":var d=o._wrapperState.wasMultiple;o._wrapperState.wasMultiple=!!a.multiple;var y=a.value;null!=y?ne(o,!!a.multiple,y,!1):d!==!!a.multiple&&(null!=a.defaultValue?ne(o,!!a.multiple,a.defaultValue,!0):ne(o,!!a.multiple,a.multiple?[]:\"\",!1))}o[yo]=a}catch(t){Pc(e,e.return,t)}}break;case 6:if(mu(t,e),vu(e),4&r){if(null===e.stateNode)throw Error(i(162));o=e.stateNode,a=e.memoizedProps;try{o.nodeValue=a}catch(t){Pc(e,e.return,t)}}break;case 3:if(mu(t,e),vu(e),4&r&&null!==n&&n.memoizedState.isDehydrated)try{Wt(t.containerInfo)}catch(t){Pc(e,e.return,t)}break;case 4:default:mu(t,e),vu(e);break;case 13:mu(t,e),vu(e),8192&(o=e.child).flags&&(a=null!==o.memoizedState,o.stateNode.isHidden=a,!a||null!==o.alternate&&null!==o.alternate.memoizedState||(Wu=Xe())),4&r&&hu(e);break;case 22:if(f=null!==n&&null!==n.memoizedState,1&e.mode?(Xl=(s=Xl)||f,mu(t,e),Xl=s):mu(t,e),vu(e),8192&r){if(s=null!==e.memoizedState,(e.stateNode.isHidden=s)&&!f&&0!=(1&e.mode))for($l=e,f=e.child;null!==f;){for(p=$l=f;null!==$l;){switch(y=(d=$l).child,d.tag){case 0:case 11:case 14:case 15:ru(4,d,d.return);break;case 1:eu(d,d.return);var h=d.stateNode;if(\"function\"==typeof h.componentWillUnmount){r=d,n=d.return;try{t=r,h.props=t.memoizedProps,h.state=t.memoizedState,h.componentWillUnmount()}catch(e){Pc(r,n,e)}}break;case 5:eu(d,d.return);break;case 22:if(null!==d.memoizedState){Ou(p);continue}}null!==y?(y.return=d,$l=y):Ou(p)}f=f.sibling}e:for(f=null,p=e;;){if(5===p.tag){if(null===f){f=p;try{o=p.stateNode,s?\"function\"==typeof(a=o.style).setProperty?a.setProperty(\"display\",\"none\",\"important\"):a.display=\"none\":(u=p.stateNode,l=null!=(c=p.memoizedProps.style)&&c.hasOwnProperty(\"display\")?c.display:null,u.style.display=he(\"display\",l))}catch(t){Pc(e,e.return,t)}}}else if(6===p.tag){if(null===f)try{p.stateNode.nodeValue=s?\"\":p.memoizedProps}catch(t){Pc(e,e.return,t)}}else if((22!==p.tag&&23!==p.tag||null===p.memoizedState||p===e)&&null!==p.child){p.child.return=p,p=p.child;continue}if(p===e)break e;for(;null===p.sibling;){if(null===p.return||p.return===e)break e;f===p&&(f=null),p=p.return}f===p&&(f=null),p.sibling.return=p.return,p=p.sibling}}break;case 19:mu(t,e),vu(e),4&r&&hu(e);case 21:}}function vu(e){var t=e.flags;if(2&t){try{e:{for(var n=e.return;null!==n;){if(lu(n)){var r=n;break e}n=n.return}throw Error(i(160))}switch(r.tag){case 5:var o=r.stateNode;32&r.flags&&(pe(o,\"\"),r.flags&=-33),su(e,uu(e),o);break;case 3:case 4:var a=r.stateNode.containerInfo;cu(e,uu(e),a);break;default:throw Error(i(161))}}catch(t){Pc(e,e.return,t)}e.flags&=-3}4096&t&&(e.flags&=-4097)}function gu(e,t,n){$l=e,wu(e,t,n)}function wu(e,t,n){for(var r=0!=(1&e.mode);null!==$l;){var o=$l,i=o.child;if(22===o.tag&&r){var a=null!==o.memoizedState||Jl;if(!a){var l=o.alternate,u=null!==l&&null!==l.memoizedState||Xl;l=Jl;var c=Xl;if(Jl=a,(Xl=u)&&!c)for($l=o;null!==$l;)u=(a=$l).child,22===a.tag&&null!==a.memoizedState?Eu(o):null!==u?(u.return=a,$l=u):Eu(o);for(;null!==i;)$l=i,wu(i,t,n),i=i.sibling;$l=o,Jl=l,Xl=c}Su(e)}else 0!=(8772&o.subtreeFlags)&&null!==i?(i.return=o,$l=i):Su(e)}}function Su(e){for(;null!==$l;){var t=$l;if(0!=(8772&t.flags)){var n=t.alternate;try{if(0!=(8772&t.flags))switch(t.tag){case 0:case 11:case 15:Xl||ou(5,t);break;case 1:var r=t.stateNode;if(4&t.flags&&!Xl)if(null===n)r.componentDidMount();else{var o=t.elementType===t.type?n.memoizedProps:bi(t.type,n.memoizedProps);r.componentDidUpdate(o,n.memoizedState,r.__reactInternalSnapshotBeforeUpdate)}var a=t.updateQueue;null!==a&&Bi(t,a,r);break;case 3:var l=t.updateQueue;if(null!==l){if(n=null,null!==t.child)switch(t.child.tag){case 5:case 1:n=t.child.stateNode}Bi(t,l,n)}break;case 5:var u=t.stateNode;if(null===n&&4&t.flags){n=u;var c=t.memoizedProps;switch(t.type){case\"button\":case\"input\":case\"select\":case\"textarea\":c.autoFocus&&n.focus();break;case\"img\":c.src&&(n.src=c.src)}}break;case 6:case 4:case 12:case 19:case 17:case 21:case 22:case 23:case 25:break;case 13:if(null===t.memoizedState){var s=t.alternate;if(null!==s){var f=s.memoizedState;if(null!==f){var p=f.dehydrated;null!==p&&Wt(p)}}}break;default:throw Error(i(163))}Xl||512&t.flags&&iu(t)}catch(e){Pc(t,t.return,e)}}if(t===e){$l=null;break}if(null!==(n=t.sibling)){n.return=t.return,$l=n;break}$l=t.return}}function Ou(e){for(;null!==$l;){var t=$l;if(t===e){$l=null;break}var n=t.sibling;if(null!==n){n.return=t.return,$l=n;break}$l=t.return}}function Eu(e){for(;null!==$l;){var t=$l;try{switch(t.tag){case 0:case 11:case 15:var n=t.return;try{ou(4,t)}catch(e){Pc(t,n,e)}break;case 1:var r=t.stateNode;if(\"function\"==typeof r.componentDidMount){var o=t.return;try{r.componentDidMount()}catch(e){Pc(t,o,e)}}var i=t.return;try{iu(t)}catch(e){Pc(t,i,e)}break;case 5:var a=t.return;try{iu(t)}catch(e){Pc(t,a,e)}}}catch(e){Pc(t,t.return,e)}if(t===e){$l=null;break}var l=t.sibling;if(null!==l){l.return=t.return,$l=l;break}$l=t.return}}var ku,Pu=Math.ceil,xu=w.ReactCurrentDispatcher,ju=w.ReactCurrentOwner,Cu=w.ReactCurrentBatchConfig,Tu=0,Au=null,Ru=null,_u=0,Iu=0,Nu=Po(0),Mu=0,Du=null,Lu=0,zu=0,Bu=0,Fu=null,Uu=null,Wu=0,Hu=1/0,Vu=null,Gu=!1,qu=null,Qu=null,Yu=!1,Zu=null,Ju=0,Xu=0,Ku=null,$u=-1,ec=0;function tc(){return 0!=(6&Tu)?Xe():-1!==$u?$u:$u=Xe()}function nc(e){return 0==(1&e.mode)?1:0!=(2&Tu)&&0!==_u?_u&-_u:null!==mi.transition?(0===ec&&(ec=ht()),ec):0!==(e=gt)?e:e=void 0===(e=window.event)?16:Jt(e.type)}function rc(e,t,n,r){if(50<Xu)throw Xu=0,Ku=null,Error(i(185));bt(e,n,r),0!=(2&Tu)&&e===Au||(e===Au&&(0==(2&Tu)&&(zu|=n),4===Mu&&uc(e,_u)),oc(e,r),1===n&&0===Tu&&0==(1&t.mode)&&(Hu=Xe()+500,Fo&&Ho()))}function oc(e,t){var n=e.callbackNode;!function(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,o=e.expirationTimes,i=e.pendingLanes;0<i;){var a=31-at(i),l=1<<a,u=o[a];-1===u?0!=(l&n)&&0==(l&r)||(o[a]=dt(l,t)):u<=t&&(e.expiredLanes|=l),i&=~l}}(e,t);var r=pt(e,e===Au?_u:0);if(0===r)null!==n&&Ye(n),e.callbackNode=null,e.callbackPriority=0;else if(t=r&-r,e.callbackPriority!==t){if(null!=n&&Ye(n),1===t)0===e.tag?function(e){Fo=!0,Wo(e)}(cc.bind(null,e)):Wo(cc.bind(null,e)),ao((function(){0==(6&Tu)&&Ho()})),n=null;else{switch(wt(r)){case 1:n=$e;break;case 4:n=et;break;case 16:default:n=tt;break;case 536870912:n=rt}n=Ac(n,ic.bind(null,e))}e.callbackPriority=t,e.callbackNode=n}}function ic(e,t){if($u=-1,ec=0,0!=(6&Tu))throw Error(i(327));var n=e.callbackNode;if(Ec()&&e.callbackNode!==n)return null;var r=pt(e,e===Au?_u:0);if(0===r)return null;if(0!=(30&r)||0!=(r&e.expiredLanes)||t)t=bc(e,r);else{t=r;var o=Tu;Tu|=2;var a=hc();for(Au===e&&_u===t||(Vu=null,Hu=Xe()+500,dc(e,t));;)try{gc();break}catch(t){yc(e,t)}Oi(),xu.current=a,Tu=o,null!==Ru?t=0:(Au=null,_u=0,t=Mu)}if(0!==t){if(2===t&&0!==(o=yt(e))&&(r=o,t=ac(e,o)),1===t)throw n=Du,dc(e,0),uc(e,r),oc(e,Xe()),n;if(6===t)uc(e,r);else{if(o=e.current.alternate,0==(30&r)&&!function(e){for(var t=e;;){if(16384&t.flags){var n=t.updateQueue;if(null!==n&&null!==(n=n.stores))for(var r=0;r<n.length;r++){var o=n[r],i=o.getSnapshot;o=o.value;try{if(!lr(i(),o))return!1}catch(e){return!1}}}if(n=t.child,16384&t.subtreeFlags&&null!==n)n.return=t,t=n;else{if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return!0;t=t.return}t.sibling.return=t.return,t=t.sibling}}return!0}(o)&&(2===(t=bc(e,r))&&0!==(a=yt(e))&&(r=a,t=ac(e,a)),1===t))throw n=Du,dc(e,0),uc(e,r),oc(e,Xe()),n;switch(e.finishedWork=o,e.finishedLanes=r,t){case 0:case 1:throw Error(i(345));case 2:case 5:Oc(e,Uu,Vu);break;case 3:if(uc(e,r),(130023424&r)===r&&10<(t=Wu+500-Xe())){if(0!==pt(e,0))break;if(((o=e.suspendedLanes)&r)!==r){tc(),e.pingedLanes|=e.suspendedLanes&o;break}e.timeoutHandle=ro(Oc.bind(null,e,Uu,Vu),t);break}Oc(e,Uu,Vu);break;case 4:if(uc(e,r),(4194240&r)===r)break;for(t=e.eventTimes,o=-1;0<r;){var l=31-at(r);a=1<<l,(l=t[l])>o&&(o=l),r&=~a}if(r=o,10<(r=(120>(r=Xe()-r)?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*Pu(r/1960))-r)){e.timeoutHandle=ro(Oc.bind(null,e,Uu,Vu),r);break}Oc(e,Uu,Vu);break;default:throw Error(i(329))}}}return oc(e,Xe()),e.callbackNode===n?ic.bind(null,e):null}function ac(e,t){var n=Fu;return e.current.memoizedState.isDehydrated&&(dc(e,t).flags|=256),2!==(e=bc(e,t))&&(t=Uu,Uu=n,null!==t&&lc(t)),e}function lc(e){null===Uu?Uu=e:Uu.push.apply(Uu,e)}function uc(e,t){for(t&=~Bu,t&=~zu,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0<t;){var n=31-at(t),r=1<<n;e[n]=-1,t&=~r}}function cc(e){if(0!=(6&Tu))throw Error(i(327));Ec();var t=pt(e,0);if(0==(1&t))return oc(e,Xe()),null;var n=bc(e,t);if(0!==e.tag&&2===n){var r=yt(e);0!==r&&(t=r,n=ac(e,r))}if(1===n)throw n=Du,dc(e,0),uc(e,t),oc(e,Xe()),n;if(6===n)throw Error(i(345));return e.finishedWork=e.current.alternate,e.finishedLanes=t,Oc(e,Uu,Vu),oc(e,Xe()),null}function sc(e,t){var n=Tu;Tu|=1;try{return e(t)}finally{0===(Tu=n)&&(Hu=Xe()+500,Fo&&Ho())}}function fc(e){null!==Zu&&0===Zu.tag&&0==(6&Tu)&&Ec();var t=Tu;Tu|=1;var n=Cu.transition,r=gt;try{if(Cu.transition=null,gt=1,e)return e()}finally{gt=r,Cu.transition=n,0==(6&(Tu=t))&&Ho()}}function pc(){Iu=Nu.current,xo(Nu)}function dc(e,t){e.finishedWork=null,e.finishedLanes=0;var n=e.timeoutHandle;if(-1!==n&&(e.timeoutHandle=-1,oo(n)),null!==Ru)for(n=Ru.return;null!==n;){var r=n;switch(ni(r),r.tag){case 1:null!=(r=r.type.childContextTypes)&&No();break;case 3:ia(),xo(Ao),xo(To),fa();break;case 5:la(r);break;case 4:ia();break;case 13:case 19:xo(ua);break;case 10:Ei(r.type._context);break;case 22:case 23:pc()}n=n.return}if(Au=e,Ru=e=Nc(e.current,null),_u=Iu=t,Mu=0,Du=null,Bu=zu=Lu=0,Uu=Fu=null,null!==ji){for(t=0;t<ji.length;t++)if(null!==(r=(n=ji[t]).interleaved)){n.interleaved=null;var o=r.next,i=n.pending;if(null!==i){var a=i.next;i.next=o,r.next=a}n.pending=r}ji=null}return e}function yc(e,t){for(;;){var n=Ru;try{if(Oi(),pa.current=al,va){for(var r=ha.memoizedState;null!==r;){var o=r.queue;null!==o&&(o.pending=null),r=r.next}va=!1}if(ya=0,ba=ma=ha=null,ga=!1,wa=0,ju.current=null,null===n||null===n.return){Mu=1,Du=t,Ru=null;break}e:{var a=e,l=n.return,u=n,c=t;if(t=_u,u.flags|=32768,null!==c&&\"object\"==typeof c&&\"function\"==typeof c.then){var s=c,f=u,p=f.tag;if(0==(1&f.mode)&&(0===p||11===p||15===p)){var d=f.alternate;d?(f.updateQueue=d.updateQueue,f.memoizedState=d.memoizedState,f.lanes=d.lanes):(f.updateQueue=null,f.memoizedState=null)}var y=bl(l);if(null!==y){y.flags&=-257,vl(y,l,u,0,t),1&y.mode&&ml(a,s,t),c=s;var h=(t=y).updateQueue;if(null===h){var m=new Set;m.add(c),t.updateQueue=m}else h.add(c);break e}if(0==(1&t)){ml(a,s,t),mc();break e}c=Error(i(426))}else if(ii&&1&u.mode){var b=bl(l);if(null!==b){0==(65536&b.flags)&&(b.flags|=256),vl(b,l,u,0,t),hi(sl(c,u));break e}}a=c=sl(c,u),4!==Mu&&(Mu=2),null===Fu?Fu=[a]:Fu.push(a),a=l;do{switch(a.tag){case 3:a.flags|=65536,t&=-t,a.lanes|=t,Li(a,yl(0,c,t));break e;case 1:u=c;var v=a.type,g=a.stateNode;if(0==(128&a.flags)&&(\"function\"==typeof v.getDerivedStateFromError||null!==g&&\"function\"==typeof g.componentDidCatch&&(null===Qu||!Qu.has(g)))){a.flags|=65536,t&=-t,a.lanes|=t,Li(a,hl(a,u,t));break e}}a=a.return}while(null!==a)}Sc(n)}catch(e){t=e,Ru===n&&null!==n&&(Ru=n=n.return);continue}break}}function hc(){var e=xu.current;return xu.current=al,null===e?al:e}function mc(){0!==Mu&&3!==Mu&&2!==Mu||(Mu=4),null===Au||0==(268435455&Lu)&&0==(268435455&zu)||uc(Au,_u)}function bc(e,t){var n=Tu;Tu|=2;var r=hc();for(Au===e&&_u===t||(Vu=null,dc(e,t));;)try{vc();break}catch(t){yc(e,t)}if(Oi(),Tu=n,xu.current=r,null!==Ru)throw Error(i(261));return Au=null,_u=0,Mu}function vc(){for(;null!==Ru;)wc(Ru)}function gc(){for(;null!==Ru&&!Ze();)wc(Ru)}function wc(e){var t=ku(e.alternate,e,Iu);e.memoizedProps=e.pendingProps,null===t?Sc(e):Ru=t,ju.current=null}function Sc(e){var t=e;do{var n=t.alternate;if(e=t.return,0==(32768&t.flags)){if(null!==(n=Yl(n,t,Iu)))return void(Ru=n)}else{if(null!==(n=Zl(n,t)))return n.flags&=32767,void(Ru=n);if(null===e)return Mu=6,void(Ru=null);e.flags|=32768,e.subtreeFlags=0,e.deletions=null}if(null!==(t=t.sibling))return void(Ru=t);Ru=t=e}while(null!==t);0===Mu&&(Mu=5)}function Oc(e,t,n){var r=gt,o=Cu.transition;try{Cu.transition=null,gt=1,function(e,t,n,r){do{Ec()}while(null!==Zu);if(0!=(6&Tu))throw Error(i(327));n=e.finishedWork;var o=e.finishedLanes;if(null===n)return null;if(e.finishedWork=null,e.finishedLanes=0,n===e.current)throw Error(i(177));e.callbackNode=null,e.callbackPriority=0;var a=n.lanes|n.childLanes;if(function(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0<n;){var o=31-at(n),i=1<<o;t[o]=0,r[o]=-1,e[o]=-1,n&=~i}}(e,a),e===Au&&(Ru=Au=null,_u=0),0==(2064&n.subtreeFlags)&&0==(2064&n.flags)||Yu||(Yu=!0,Ac(tt,(function(){return Ec(),null}))),a=0!=(15990&n.flags),0!=(15990&n.subtreeFlags)||a){a=Cu.transition,Cu.transition=null;var l=gt;gt=1;var u=Tu;Tu|=4,ju.current=null,function(e,t){if(eo=Vt,dr(e=pr())){if(\"selectionStart\"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{var r=(n=(n=e.ownerDocument)&&n.defaultView||window).getSelection&&n.getSelection();if(r&&0!==r.rangeCount){n=r.anchorNode;var o=r.anchorOffset,a=r.focusNode;r=r.focusOffset;try{n.nodeType,a.nodeType}catch(e){n=null;break e}var l=0,u=-1,c=-1,s=0,f=0,p=e,d=null;t:for(;;){for(var y;p!==n||0!==o&&3!==p.nodeType||(u=l+o),p!==a||0!==r&&3!==p.nodeType||(c=l+r),3===p.nodeType&&(l+=p.nodeValue.length),null!==(y=p.firstChild);)d=p,p=y;for(;;){if(p===e)break t;if(d===n&&++s===o&&(u=l),d===a&&++f===r&&(c=l),null!==(y=p.nextSibling))break;d=(p=d).parentNode}p=y}n=-1===u||-1===c?null:{start:u,end:c}}else n=null}n=n||{start:0,end:0}}else n=null;for(to={focusedElem:e,selectionRange:n},Vt=!1,$l=t;null!==$l;)if(e=(t=$l).child,0!=(1028&t.subtreeFlags)&&null!==e)e.return=t,$l=e;else for(;null!==$l;){t=$l;try{var h=t.alternate;if(0!=(1024&t.flags))switch(t.tag){case 0:case 11:case 15:case 5:case 6:case 4:case 17:break;case 1:if(null!==h){var m=h.memoizedProps,b=h.memoizedState,v=t.stateNode,g=v.getSnapshotBeforeUpdate(t.elementType===t.type?m:bi(t.type,m),b);v.__reactInternalSnapshotBeforeUpdate=g}break;case 3:var w=t.stateNode.containerInfo;1===w.nodeType?w.textContent=\"\":9===w.nodeType&&w.documentElement&&w.removeChild(w.documentElement);break;default:throw Error(i(163))}}catch(e){Pc(t,t.return,e)}if(null!==(e=t.sibling)){e.return=t.return,$l=e;break}$l=t.return}h=nu,nu=!1}(e,n),bu(n,e),yr(to),Vt=!!eo,to=eo=null,e.current=n,gu(n,e,o),Je(),Tu=u,gt=l,Cu.transition=a}else e.current=n;if(Yu&&(Yu=!1,Zu=e,Ju=o),0===(a=e.pendingLanes)&&(Qu=null),function(e){if(it&&\"function\"==typeof it.onCommitFiberRoot)try{it.onCommitFiberRoot(ot,e,void 0,128==(128&e.current.flags))}catch(e){}}(n.stateNode),oc(e,Xe()),null!==t)for(r=e.onRecoverableError,n=0;n<t.length;n++)r((o=t[n]).value,{componentStack:o.stack,digest:o.digest});if(Gu)throw Gu=!1,e=qu,qu=null,e;0!=(1&Ju)&&0!==e.tag&&Ec(),0!=(1&(a=e.pendingLanes))?e===Ku?Xu++:(Xu=0,Ku=e):Xu=0,Ho()}(e,t,n,r)}finally{Cu.transition=o,gt=r}return null}function Ec(){if(null!==Zu){var e=wt(Ju),t=Cu.transition,n=gt;try{if(Cu.transition=null,gt=16>e?16:e,null===Zu)var r=!1;else{if(e=Zu,Zu=null,Ju=0,0!=(6&Tu))throw Error(i(331));var o=Tu;for(Tu|=4,$l=e.current;null!==$l;){var a=$l,l=a.child;if(0!=(16&$l.flags)){var u=a.deletions;if(null!==u){for(var c=0;c<u.length;c++){var s=u[c];for($l=s;null!==$l;){var f=$l;switch(f.tag){case 0:case 11:case 15:ru(8,f,a)}var p=f.child;if(null!==p)p.return=f,$l=p;else for(;null!==$l;){var d=(f=$l).sibling,y=f.return;if(au(f),f===s){$l=null;break}if(null!==d){d.return=y,$l=d;break}$l=y}}}var h=a.alternate;if(null!==h){var m=h.child;if(null!==m){h.child=null;do{var b=m.sibling;m.sibling=null,m=b}while(null!==m)}}$l=a}}if(0!=(2064&a.subtreeFlags)&&null!==l)l.return=a,$l=l;else e:for(;null!==$l;){if(0!=(2048&(a=$l).flags))switch(a.tag){case 0:case 11:case 15:ru(9,a,a.return)}var v=a.sibling;if(null!==v){v.return=a.return,$l=v;break e}$l=a.return}}var g=e.current;for($l=g;null!==$l;){var w=(l=$l).child;if(0!=(2064&l.subtreeFlags)&&null!==w)w.return=l,$l=w;else e:for(l=g;null!==$l;){if(0!=(2048&(u=$l).flags))try{switch(u.tag){case 0:case 11:case 15:ou(9,u)}}catch(e){Pc(u,u.return,e)}if(u===l){$l=null;break e}var S=u.sibling;if(null!==S){S.return=u.return,$l=S;break e}$l=u.return}}if(Tu=o,Ho(),it&&\"function\"==typeof it.onPostCommitFiberRoot)try{it.onPostCommitFiberRoot(ot,e)}catch(e){}r=!0}return r}finally{gt=n,Cu.transition=t}}return!1}function kc(e,t,n){e=Mi(e,t=yl(0,t=sl(n,t),1),1),t=tc(),null!==e&&(bt(e,1,t),oc(e,t))}function Pc(e,t,n){if(3===e.tag)kc(e,e,n);else for(;null!==t;){if(3===t.tag){kc(t,e,n);break}if(1===t.tag){var r=t.stateNode;if(\"function\"==typeof t.type.getDerivedStateFromError||\"function\"==typeof r.componentDidCatch&&(null===Qu||!Qu.has(r))){t=Mi(t,e=hl(t,e=sl(n,e),1),1),e=tc(),null!==t&&(bt(t,1,e),oc(t,e));break}}t=t.return}}function xc(e,t,n){var r=e.pingCache;null!==r&&r.delete(t),t=tc(),e.pingedLanes|=e.suspendedLanes&n,Au===e&&(_u&n)===n&&(4===Mu||3===Mu&&(130023424&_u)===_u&&500>Xe()-Wu?dc(e,0):Bu|=n),oc(e,t)}function jc(e,t){0===t&&(0==(1&e.mode)?t=1:(t=st,0==(130023424&(st<<=1))&&(st=4194304)));var n=tc();null!==(e=Ai(e,t))&&(bt(e,t,n),oc(e,n))}function Cc(e){var t=e.memoizedState,n=0;null!==t&&(n=t.retryLane),jc(e,n)}function Tc(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,o=e.memoizedState;null!==o&&(n=o.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(i(314))}null!==r&&r.delete(t),jc(e,n)}function Ac(e,t){return Qe(e,t)}function Rc(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function _c(e,t,n,r){return new Rc(e,t,n,r)}function Ic(e){return!(!(e=e.prototype)||!e.isReactComponent)}function Nc(e,t){var n=e.alternate;return null===n?((n=_c(e.tag,t,e.key,e.mode)).elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=14680064&e.flags,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=null===t?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Mc(e,t,n,r,o,a){var l=2;if(r=e,\"function\"==typeof e)Ic(e)&&(l=1);else if(\"string\"==typeof e)l=5;else e:switch(e){case E:return Dc(n.children,o,a,t);case k:l=8,o|=8;break;case P:return(e=_c(12,n,t,2|o)).elementType=P,e.lanes=a,e;case T:return(e=_c(13,n,t,o)).elementType=T,e.lanes=a,e;case A:return(e=_c(19,n,t,o)).elementType=A,e.lanes=a,e;case I:return Lc(n,o,a,t);default:if(\"object\"==typeof e&&null!==e)switch(e.$$typeof){case x:l=10;break e;case j:l=9;break e;case C:l=11;break e;case R:l=14;break e;case _:l=16,r=null;break e}throw Error(i(130,null==e?e:typeof e,\"\"))}return(t=_c(l,n,t,o)).elementType=e,t.type=r,t.lanes=a,t}function Dc(e,t,n,r){return(e=_c(7,e,r,t)).lanes=n,e}function Lc(e,t,n,r){return(e=_c(22,e,r,t)).elementType=I,e.lanes=n,e.stateNode={isHidden:!1},e}function zc(e,t,n){return(e=_c(6,e,null,t)).lanes=n,e}function Bc(e,t,n){return(t=_c(4,null!==e.children?e.children:[],e.key,t)).lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Fc(e,t,n,r,o){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=mt(0),this.expirationTimes=mt(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=mt(0),this.identifierPrefix=r,this.onRecoverableError=o,this.mutableSourceEagerHydrationData=null}function Uc(e,t,n,r,o,i,a,l,u){return e=new Fc(e,t,n,l,u),1===t?(t=1,!0===i&&(t|=8)):t=0,i=_c(3,null,null,t),e.current=i,i.stateNode=e,i.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},_i(i),e}function Wc(e){if(!e)return Co;e:{if(We(e=e._reactInternals)!==e||1!==e.tag)throw Error(i(170));var t=e;do{switch(t.tag){case 3:t=t.stateNode.context;break e;case 1:if(Io(t.type)){t=t.stateNode.__reactInternalMemoizedMergedChildContext;break e}}t=t.return}while(null!==t);throw Error(i(171))}if(1===e.tag){var n=e.type;if(Io(n))return Do(e,n,t)}return t}function Hc(e,t,n,r,o,i,a,l,u){return(e=Uc(n,r,!0,e,0,i,0,l,u)).context=Wc(null),n=e.current,(i=Ni(r=tc(),o=nc(n))).callback=null!=t?t:null,Mi(n,i,o),e.current.lanes=o,bt(e,o,r),oc(e,r),e}function Vc(e,t,n,r){var o=t.current,i=tc(),a=nc(o);return n=Wc(n),null===t.context?t.context=n:t.pendingContext=n,(t=Ni(i,a)).payload={element:e},null!==(r=void 0===r?null:r)&&(t.callback=r),null!==(e=Mi(o,t,a))&&(rc(e,o,a,i),Di(e,o,a)),a}function Gc(e){return(e=e.current).child?(e.child.tag,e.child.stateNode):null}function qc(e,t){if(null!==(e=e.memoizedState)&&null!==e.dehydrated){var n=e.retryLane;e.retryLane=0!==n&&n<t?n:t}}function Qc(e,t){qc(e,t),(e=e.alternate)&&qc(e,t)}ku=function(e,t,n){if(null!==e)if(e.memoizedProps!==t.pendingProps||Ao.current)wl=!0;else{if(0==(e.lanes&n)&&0==(128&t.flags))return wl=!1,function(e,t,n){switch(t.tag){case 3:Al(t),yi();break;case 5:aa(t);break;case 1:Io(t.type)&&Lo(t);break;case 4:oa(t,t.stateNode.containerInfo);break;case 10:var r=t.type._context,o=t.memoizedProps.value;jo(vi,r._currentValue),r._currentValue=o;break;case 13:if(null!==(r=t.memoizedState))return null!==r.dehydrated?(jo(ua,1&ua.current),t.flags|=128,null):0!=(n&t.child.childLanes)?zl(e,t,n):(jo(ua,1&ua.current),null!==(e=Gl(e,t,n))?e.sibling:null);jo(ua,1&ua.current);break;case 19:if(r=0!=(n&t.childLanes),0!=(128&e.flags)){if(r)return Hl(e,t,n);t.flags|=128}if(null!==(o=t.memoizedState)&&(o.rendering=null,o.tail=null,o.lastEffect=null),jo(ua,ua.current),r)break;return null;case 22:case 23:return t.lanes=0,Pl(e,t,n)}return Gl(e,t,n)}(e,t,n);wl=0!=(131072&e.flags)}else wl=!1,ii&&0!=(1048576&t.flags)&&ei(t,Qo,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;Vl(e,t),e=t.pendingProps;var o=_o(t,To.current);Pi(t,n),o=ka(null,t,r,e,o,n);var a=Pa();return t.flags|=1,\"object\"==typeof o&&null!==o&&\"function\"==typeof o.render&&void 0===o.$$typeof?(t.tag=1,t.memoizedState=null,t.updateQueue=null,Io(r)?(a=!0,Lo(t)):a=!1,t.memoizedState=null!==o.state&&void 0!==o.state?o.state:null,_i(t),o.updater=Wi,t.stateNode=o,o._reactInternals=t,qi(t,r,e,n),t=Tl(null,t,r,!0,a,n)):(t.tag=0,ii&&a&&ti(t),Sl(null,t,o,n),t=t.child),t;case 16:r=t.elementType;e:{switch(Vl(e,t),e=t.pendingProps,r=(o=r._init)(r._payload),t.type=r,o=t.tag=function(e){if(\"function\"==typeof e)return Ic(e)?1:0;if(null!=e){if((e=e.$$typeof)===C)return 11;if(e===R)return 14}return 2}(r),e=bi(r,e),o){case 0:t=jl(null,t,r,e,n);break e;case 1:t=Cl(null,t,r,e,n);break e;case 11:t=Ol(null,t,r,e,n);break e;case 14:t=El(null,t,r,bi(r.type,e),n);break e}throw Error(i(306,r,\"\"))}return t;case 0:return r=t.type,o=t.pendingProps,jl(e,t,r,o=t.elementType===r?o:bi(r,o),n);case 1:return r=t.type,o=t.pendingProps,Cl(e,t,r,o=t.elementType===r?o:bi(r,o),n);case 3:e:{if(Al(t),null===e)throw Error(i(387));r=t.pendingProps,o=(a=t.memoizedState).element,Ii(e,t),zi(t,r,null,n);var l=t.memoizedState;if(r=l.element,a.isDehydrated){if(a={element:r,isDehydrated:!1,cache:l.cache,pendingSuspenseBoundaries:l.pendingSuspenseBoundaries,transitions:l.transitions},t.updateQueue.baseState=a,t.memoizedState=a,256&t.flags){t=Rl(e,t,r,n,o=sl(Error(i(423)),t));break e}if(r!==o){t=Rl(e,t,r,n,o=sl(Error(i(424)),t));break e}for(oi=co(t.stateNode.containerInfo.firstChild),ri=t,ii=!0,ai=null,n=Ki(t,null,r,n),t.child=n;n;)n.flags=-3&n.flags|4096,n=n.sibling}else{if(yi(),r===o){t=Gl(e,t,n);break e}Sl(e,t,r,n)}t=t.child}return t;case 5:return aa(t),null===e&&si(t),r=t.type,o=t.pendingProps,a=null!==e?e.memoizedProps:null,l=o.children,no(r,o)?l=null:null!==a&&no(r,a)&&(t.flags|=32),xl(e,t),Sl(e,t,l,n),t.child;case 6:return null===e&&si(t),null;case 13:return zl(e,t,n);case 4:return oa(t,t.stateNode.containerInfo),r=t.pendingProps,null===e?t.child=Xi(t,null,r,n):Sl(e,t,r,n),t.child;case 11:return r=t.type,o=t.pendingProps,Ol(e,t,r,o=t.elementType===r?o:bi(r,o),n);case 7:return Sl(e,t,t.pendingProps,n),t.child;case 8:case 12:return Sl(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,o=t.pendingProps,a=t.memoizedProps,l=o.value,jo(vi,r._currentValue),r._currentValue=l,null!==a)if(lr(a.value,l)){if(a.children===o.children&&!Ao.current){t=Gl(e,t,n);break e}}else for(null!==(a=t.child)&&(a.return=t);null!==a;){var u=a.dependencies;if(null!==u){l=a.child;for(var c=u.firstContext;null!==c;){if(c.context===r){if(1===a.tag){(c=Ni(-1,n&-n)).tag=2;var s=a.updateQueue;if(null!==s){var f=(s=s.shared).pending;null===f?c.next=c:(c.next=f.next,f.next=c),s.pending=c}}a.lanes|=n,null!==(c=a.alternate)&&(c.lanes|=n),ki(a.return,n,t),u.lanes|=n;break}c=c.next}}else if(10===a.tag)l=a.type===t.type?null:a.child;else if(18===a.tag){if(null===(l=a.return))throw Error(i(341));l.lanes|=n,null!==(u=l.alternate)&&(u.lanes|=n),ki(l,n,t),l=a.sibling}else l=a.child;if(null!==l)l.return=a;else for(l=a;null!==l;){if(l===t){l=null;break}if(null!==(a=l.sibling)){a.return=l.return,l=a;break}l=l.return}a=l}Sl(e,t,o.children,n),t=t.child}return t;case 9:return o=t.type,r=t.pendingProps.children,Pi(t,n),r=r(o=xi(o)),t.flags|=1,Sl(e,t,r,n),t.child;case 14:return o=bi(r=t.type,t.pendingProps),El(e,t,r,o=bi(r.type,o),n);case 15:return kl(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:bi(r,o),Vl(e,t),t.tag=1,Io(r)?(e=!0,Lo(t)):e=!1,Pi(t,n),Vi(t,r,o),qi(t,r,o,n),Tl(null,t,r,!0,e,n);case 19:return Hl(e,t,n);case 22:return Pl(e,t,n)}throw Error(i(156,t.tag))};var Yc=\"function\"==typeof reportError?reportError:function(e){console.error(e)};function Zc(e){this._internalRoot=e}function Jc(e){this._internalRoot=e}function Xc(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType)}function Kc(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType&&(8!==e.nodeType||\" react-mount-point-unstable \"!==e.nodeValue))}function $c(){}function es(e,t,n,r,o){var i=n._reactRootContainer;if(i){var a=i;if(\"function\"==typeof o){var l=o;o=function(){var e=Gc(a);l.call(e)}}Vc(t,a,e,o)}else a=function(e,t,n,r,o){if(o){if(\"function\"==typeof r){var i=r;r=function(){var e=Gc(a);i.call(e)}}var a=Hc(t,r,e,0,null,!1,0,\"\",$c);return e._reactRootContainer=a,e[ho]=a.current,Wr(8===e.nodeType?e.parentNode:e),fc(),a}for(;o=e.lastChild;)e.removeChild(o);if(\"function\"==typeof r){var l=r;r=function(){var e=Gc(u);l.call(e)}}var u=Uc(e,0,!1,null,0,!1,0,\"\",$c);return e._reactRootContainer=u,e[ho]=u.current,Wr(8===e.nodeType?e.parentNode:e),fc((function(){Vc(t,u,n,r)})),u}(n,t,e,o,r);return Gc(a)}Jc.prototype.render=Zc.prototype.render=function(e){var t=this._internalRoot;if(null===t)throw Error(i(409));Vc(e,t,null,null)},Jc.prototype.unmount=Zc.prototype.unmount=function(){var e=this._internalRoot;if(null!==e){this._internalRoot=null;var t=e.containerInfo;fc((function(){Vc(null,e,null,null)})),t[ho]=null}},Jc.prototype.unstable_scheduleHydration=function(e){if(e){var t=kt();e={blockedOn:null,target:e,priority:t};for(var n=0;n<It.length&&0!==t&&t<It[n].priority;n++);It.splice(n,0,e),0===n&&Lt(e)}},St=function(e){switch(e.tag){case 3:var t=e.stateNode;if(t.current.memoizedState.isDehydrated){var n=ft(t.pendingLanes);0!==n&&(vt(t,1|n),oc(t,Xe()),0==(6&Tu)&&(Hu=Xe()+500,Ho()))}break;case 13:fc((function(){var t=Ai(e,1);if(null!==t){var n=tc();rc(t,e,1,n)}})),Qc(e,1)}},Ot=function(e){if(13===e.tag){var t=Ai(e,134217728);null!==t&&rc(t,e,134217728,tc()),Qc(e,134217728)}},Et=function(e){if(13===e.tag){var t=nc(e),n=Ai(e,t);null!==n&&rc(n,e,t,tc()),Qc(e,t)}},kt=function(){return gt},Pt=function(e,t){var n=gt;try{return gt=e,t()}finally{gt=n}},Oe=function(e,t,n){switch(t){case\"input\":if(K(e,n),t=n.name,\"radio\"===n.type&&null!=t){for(n=e;n.parentNode;)n=n.parentNode;for(n=n.querySelectorAll(\"input[name=\"+JSON.stringify(\"\"+t)+'][type=\"radio\"]'),t=0;t<n.length;t++){var r=n[t];if(r!==e&&r.form===e.form){var o=Oo(r);if(!o)throw Error(i(90));Q(r),K(r,o)}}}break;case\"textarea\":ie(e,n);break;case\"select\":null!=(t=n.value)&&ne(e,!!n.multiple,t,!1)}},Ce=sc,Te=fc;var ts={usingClientEntryPoint:!1,Events:[wo,So,Oo,xe,je,sc]},ns={findFiberByHostInstance:go,bundleType:0,version:\"18.2.0\",rendererPackageName:\"react-dom\"},rs={bundleType:ns.bundleType,version:ns.version,rendererPackageName:ns.rendererPackageName,rendererConfig:ns.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setErrorHandler:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:w.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return null===(e=Ge(e))?null:e.stateNode},findFiberByHostInstance:ns.findFiberByHostInstance||function(){return null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null,reconcilerVersion:\"18.2.0-next-9e3b772b8-20220608\"};if(\"undefined\"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__){var os=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!os.isDisabled&&os.supportsFiber)try{ot=os.inject(rs),it=os}catch(se){}}t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=ts,t.createPortal=function(e,t){var n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!Xc(t))throw Error(i(200));return function(e,t,n){var r=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:O,key:null==r?null:\"\"+r,children:e,containerInfo:t,implementation:n}}(e,t,null,n)},t.createRoot=function(e,t){if(!Xc(e))throw Error(i(299));var n=!1,r=\"\",o=Yc;return null!=t&&(!0===t.unstable_strictMode&&(n=!0),void 0!==t.identifierPrefix&&(r=t.identifierPrefix),void 0!==t.onRecoverableError&&(o=t.onRecoverableError)),t=Uc(e,1,!1,null,0,n,0,r,o),e[ho]=t.current,Wr(8===e.nodeType?e.parentNode:e),new Zc(t)},t.findDOMNode=function(e){if(null==e)return null;if(1===e.nodeType)return e;var t=e._reactInternals;if(void 0===t){if(\"function\"==typeof e.render)throw Error(i(188));throw e=Object.keys(e).join(\",\"),Error(i(268,e))}return null===(e=Ge(t))?null:e.stateNode},t.flushSync=function(e){return fc(e)},t.hydrate=function(e,t,n){if(!Kc(t))throw Error(i(200));return es(null,e,t,!0,n)},t.hydrateRoot=function(e,t,n){if(!Xc(e))throw Error(i(405));var r=null!=n&&n.hydratedSources||null,o=!1,a=\"\",l=Yc;if(null!=n&&(!0===n.unstable_strictMode&&(o=!0),void 0!==n.identifierPrefix&&(a=n.identifierPrefix),void 0!==n.onRecoverableError&&(l=n.onRecoverableError)),t=Hc(t,null,e,1,null!=n?n:null,o,0,a,l),e[ho]=t.current,Wr(e),r)for(e=0;e<r.length;e++)o=(o=(n=r[e])._getVersion)(n._source),null==t.mutableSourceEagerHydrationData?t.mutableSourceEagerHydrationData=[n,o]:t.mutableSourceEagerHydrationData.push(n,o);return new Jc(t)},t.render=function(e,t,n){if(!Kc(t))throw Error(i(200));return es(null,e,t,!1,n)},t.unmountComponentAtNode=function(e){if(!Kc(e))throw Error(i(40));return!!e._reactRootContainer&&(fc((function(){es(null,null,e,!1,(function(){e._reactRootContainer=null,e[ho]=null}))})),!0)},t.unstable_batchedUpdates=sc,t.unstable_renderSubtreeIntoContainer=function(e,t,n,r){if(!Kc(n))throw Error(i(200));if(null==e||void 0===e._reactInternals)throw Error(i(38));return es(e,t,n,!1,r)},t.version=\"18.2.0-next-9e3b772b8-20220608\"},935:(e,t,n)=>{\"use strict\";!function e(){if(\"undefined\"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&\"function\"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(e){console.error(e)}}(),e.exports=n(448)},871:(e,t,n)=>{\"use strict\";function r(){var e=this.constructor.getDerivedStateFromProps(this.props,this.state);null!=e&&this.setState(e)}function o(e){this.setState(function(t){var n=this.constructor.getDerivedStateFromProps(e,t);return null!=n?n:null}.bind(this))}function i(e,t){try{var n=this.props,r=this.state;this.props=e,this.state=t,this.__reactInternalSnapshotFlag=!0,this.__reactInternalSnapshot=this.getSnapshotBeforeUpdate(n,r)}finally{this.props=n,this.state=r}}function a(e){var t=e.prototype;if(!t||!t.isReactComponent)throw new Error(\"Can only polyfill class components\");if(\"function\"!=typeof e.getDerivedStateFromProps&&\"function\"!=typeof t.getSnapshotBeforeUpdate)return e;var n=null,a=null,l=null;if(\"function\"==typeof t.componentWillMount?n=\"componentWillMount\":\"function\"==typeof t.UNSAFE_componentWillMount&&(n=\"UNSAFE_componentWillMount\"),\"function\"==typeof t.componentWillReceiveProps?a=\"componentWillReceiveProps\":\"function\"==typeof t.UNSAFE_componentWillReceiveProps&&(a=\"UNSAFE_componentWillReceiveProps\"),\"function\"==typeof t.componentWillUpdate?l=\"componentWillUpdate\":\"function\"==typeof t.UNSAFE_componentWillUpdate&&(l=\"UNSAFE_componentWillUpdate\"),null!==n||null!==a||null!==l){var u=e.displayName||e.name,c=\"function\"==typeof e.getDerivedStateFromProps?\"getDerivedStateFromProps()\":\"getSnapshotBeforeUpdate()\";throw Error(\"Unsafe legacy lifecycles will not be called for components using new component APIs.\\n\\n\"+u+\" uses \"+c+\" but also contains the following legacy lifecycles:\"+(null!==n?\"\\n  \"+n:\"\")+(null!==a?\"\\n  \"+a:\"\")+(null!==l?\"\\n  \"+l:\"\")+\"\\n\\nThe above lifecycles should be removed. Learn more about this warning here:\\nhttps://fb.me/react-async-component-lifecycle-hooks\")}if(\"function\"==typeof e.getDerivedStateFromProps&&(t.componentWillMount=r,t.componentWillReceiveProps=o),\"function\"==typeof t.getSnapshotBeforeUpdate){if(\"function\"!=typeof t.componentDidUpdate)throw new Error(\"Cannot polyfill getSnapshotBeforeUpdate() for components that do not define componentDidUpdate() on the prototype\");t.componentWillUpdate=i;var s=t.componentDidUpdate;t.componentDidUpdate=function(e,t,n){var r=this.__reactInternalSnapshotFlag?this.__reactInternalSnapshot:n;s.call(this,e,t,r)}}return e}n.r(t),n.d(t,{polyfill:()=>a}),r.__suppressDeprecationWarning=!0,o.__suppressDeprecationWarning=!0,i.__suppressDeprecationWarning=!0},983:(e,t,n)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.bodyOpenClassName=t.portalClassName=void 0;var r=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},o=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),i=n(294),a=y(i),l=y(n(935)),u=y(n(697)),c=y(n(747)),s=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(149)),f=n(112),p=y(f),d=n(871);function y(e){return e&&e.__esModule?e:{default:e}}function h(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}var m=t.portalClassName=\"ReactModalPortal\",b=t.bodyOpenClassName=\"ReactModal__Body--open\",v=f.canUseDOM&&void 0!==l.default.createPortal,g=function(e){return document.createElement(e)},w=function(){return v?l.default.createPortal:l.default.unstable_renderSubtreeIntoContainer};function S(e){return e()}var O=function(e){function t(){var e,n,o;!function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,t);for(var i=arguments.length,u=Array(i),s=0;s<i;s++)u[s]=arguments[s];return n=o=h(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(u))),o.removePortal=function(){!v&&l.default.unmountComponentAtNode(o.node);var e=S(o.props.parentSelector);e&&e.contains(o.node)?e.removeChild(o.node):console.warn('React-Modal: \"parentSelector\" prop did not returned any DOM element. Make sure that the parent element is unmounted to avoid any memory leaks.')},o.portalRef=function(e){o.portal=e},o.renderPortal=function(e){var n=w()(o,a.default.createElement(c.default,r({defaultStyles:t.defaultStyles},e)),o.node);o.portalRef(n)},h(o,n)}return function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),o(t,[{key:\"componentDidMount\",value:function(){f.canUseDOM&&(v||(this.node=g(\"div\")),this.node.className=this.props.portalClassName,S(this.props.parentSelector).appendChild(this.node),!v&&this.renderPortal(this.props))}},{key:\"getSnapshotBeforeUpdate\",value:function(e){return{prevParent:S(e.parentSelector),nextParent:S(this.props.parentSelector)}}},{key:\"componentDidUpdate\",value:function(e,t,n){if(f.canUseDOM){var r=this.props,o=r.isOpen,i=r.portalClassName;e.portalClassName!==i&&(this.node.className=i);var a=n.prevParent,l=n.nextParent;l!==a&&(a.removeChild(this.node),l.appendChild(this.node)),(e.isOpen||o)&&!v&&this.renderPortal(this.props)}}},{key:\"componentWillUnmount\",value:function(){if(f.canUseDOM&&this.node&&this.portal){var e=this.portal.state,t=Date.now(),n=e.isOpen&&this.props.closeTimeoutMS&&(e.closesAt||t+this.props.closeTimeoutMS);n?(e.beforeClose||this.portal.closeWithTimeout(),setTimeout(this.removePortal,n-t)):this.removePortal()}}},{key:\"render\",value:function(){return f.canUseDOM&&v?(!this.node&&v&&(this.node=g(\"div\")),w()(a.default.createElement(c.default,r({ref:this.portalRef,defaultStyles:t.defaultStyles},this.props)),this.node)):null}}],[{key:\"setAppElement\",value:function(e){s.setElement(e)}}]),t}(i.Component);O.propTypes={isOpen:u.default.bool.isRequired,style:u.default.shape({content:u.default.object,overlay:u.default.object}),portalClassName:u.default.string,bodyOpenClassName:u.default.string,htmlOpenClassName:u.default.string,className:u.default.oneOfType([u.default.string,u.default.shape({base:u.default.string.isRequired,afterOpen:u.default.string.isRequired,beforeClose:u.default.string.isRequired})]),overlayClassName:u.default.oneOfType([u.default.string,u.default.shape({base:u.default.string.isRequired,afterOpen:u.default.string.isRequired,beforeClose:u.default.string.isRequired})]),appElement:u.default.oneOfType([u.default.instanceOf(p.default),u.default.instanceOf(f.SafeHTMLCollection),u.default.instanceOf(f.SafeNodeList),u.default.arrayOf(u.default.instanceOf(p.default))]),onAfterOpen:u.default.func,onRequestClose:u.default.func,closeTimeoutMS:u.default.number,ariaHideApp:u.default.bool,shouldFocusAfterRender:u.default.bool,shouldCloseOnOverlayClick:u.default.bool,shouldReturnFocusAfterClose:u.default.bool,preventScroll:u.default.bool,parentSelector:u.default.func,aria:u.default.object,data:u.default.object,role:u.default.string,contentLabel:u.default.string,shouldCloseOnEsc:u.default.bool,overlayRef:u.default.func,contentRef:u.default.func,id:u.default.string,overlayElement:u.default.func,contentElement:u.default.func},O.defaultProps={isOpen:!1,portalClassName:m,bodyOpenClassName:b,role:\"dialog\",ariaHideApp:!0,closeTimeoutMS:0,shouldFocusAfterRender:!0,shouldCloseOnEsc:!0,shouldCloseOnOverlayClick:!0,shouldReturnFocusAfterClose:!0,preventScroll:!1,parentSelector:function(){return document.body},overlayElement:function(e,t){return a.default.createElement(\"div\",e,t)},contentElement:function(e,t){return a.default.createElement(\"div\",e,t)}},O.defaultStyles={overlay:{position:\"fixed\",top:0,left:0,right:0,bottom:0,backgroundColor:\"rgba(255, 255, 255, 0.75)\"},content:{position:\"absolute\",top:\"40px\",left:\"40px\",right:\"40px\",bottom:\"40px\",border:\"1px solid #ccc\",background:\"#fff\",overflow:\"auto\",WebkitOverflowScrolling:\"touch\",borderRadius:\"4px\",outline:\"none\",padding:\"20px\"}},(0,d.polyfill)(O),t.default=O},747:(e,t,n)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},o=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),a=n(294),l=m(n(697)),u=h(n(685)),c=m(n(338)),s=h(n(149)),f=h(n(409)),p=n(112),d=m(p),y=m(n(623));function h(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}function m(e){return e&&e.__esModule?e:{default:e}}n(63);var b={overlay:\"ReactModal__Overlay\",content:\"ReactModal__Content\"},v=0,g=function(e){function t(e){!function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,t);var n=function(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.setOverlayRef=function(e){n.overlay=e,n.props.overlayRef&&n.props.overlayRef(e)},n.setContentRef=function(e){n.content=e,n.props.contentRef&&n.props.contentRef(e)},n.afterClose=function(){var e=n.props,t=e.appElement,r=e.ariaHideApp,o=e.htmlOpenClassName,i=e.bodyOpenClassName,a=e.parentSelector,l=a&&a().ownerDocument||document;i&&f.remove(l.body,i),o&&f.remove(l.getElementsByTagName(\"html\")[0],o),r&&v>0&&0==(v-=1)&&s.show(t),n.props.shouldFocusAfterRender&&(n.props.shouldReturnFocusAfterClose?(u.returnFocus(n.props.preventScroll),u.teardownScopedFocus()):u.popWithoutFocus()),n.props.onAfterClose&&n.props.onAfterClose(),y.default.deregister(n)},n.open=function(){n.beforeOpen(),n.state.afterOpen&&n.state.beforeClose?(clearTimeout(n.closeTimer),n.setState({beforeClose:!1})):(n.props.shouldFocusAfterRender&&(u.setupScopedFocus(n.node),u.markForFocusLater()),n.setState({isOpen:!0},(function(){n.openAnimationFrame=requestAnimationFrame((function(){n.setState({afterOpen:!0}),n.props.isOpen&&n.props.onAfterOpen&&n.props.onAfterOpen({overlayEl:n.overlay,contentEl:n.content})}))})))},n.close=function(){n.props.closeTimeoutMS>0?n.closeWithTimeout():n.closeWithoutTimeout()},n.focusContent=function(){return n.content&&!n.contentHasFocus()&&n.content.focus({preventScroll:!0})},n.closeWithTimeout=function(){var e=Date.now()+n.props.closeTimeoutMS;n.setState({beforeClose:!0,closesAt:e},(function(){n.closeTimer=setTimeout(n.closeWithoutTimeout,n.state.closesAt-Date.now())}))},n.closeWithoutTimeout=function(){n.setState({beforeClose:!1,isOpen:!1,afterOpen:!1,closesAt:null},n.afterClose)},n.handleKeyDown=function(e){(function(e){return\"Tab\"===e.code||9===e.keyCode})(e)&&(0,c.default)(n.content,e),n.props.shouldCloseOnEsc&&function(e){return\"Escape\"===e.code||27===e.keyCode}(e)&&(e.stopPropagation(),n.requestClose(e))},n.handleOverlayOnClick=function(e){null===n.shouldClose&&(n.shouldClose=!0),n.shouldClose&&n.props.shouldCloseOnOverlayClick&&(n.ownerHandlesClose()?n.requestClose(e):n.focusContent()),n.shouldClose=null},n.handleContentOnMouseUp=function(){n.shouldClose=!1},n.handleOverlayOnMouseDown=function(e){n.props.shouldCloseOnOverlayClick||e.target!=n.overlay||e.preventDefault()},n.handleContentOnClick=function(){n.shouldClose=!1},n.handleContentOnMouseDown=function(){n.shouldClose=!1},n.requestClose=function(e){return n.ownerHandlesClose()&&n.props.onRequestClose(e)},n.ownerHandlesClose=function(){return n.props.onRequestClose},n.shouldBeClosed=function(){return!n.state.isOpen&&!n.state.beforeClose},n.contentHasFocus=function(){return document.activeElement===n.content||n.content.contains(document.activeElement)},n.buildClassName=function(e,t){var r=\"object\"===(void 0===t?\"undefined\":o(t))?t:{base:b[e],afterOpen:b[e]+\"--after-open\",beforeClose:b[e]+\"--before-close\"},i=r.base;return n.state.afterOpen&&(i=i+\" \"+r.afterOpen),n.state.beforeClose&&(i=i+\" \"+r.beforeClose),\"string\"==typeof t&&t?i+\" \"+t:i},n.attributesFromObject=function(e,t){return Object.keys(t).reduce((function(n,r){return n[e+\"-\"+r]=t[r],n}),{})},n.state={afterOpen:!1,beforeClose:!1},n.shouldClose=null,n.moveFromContentToOverlay=null,n}return function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),i(t,[{key:\"componentDidMount\",value:function(){this.props.isOpen&&this.open()}},{key:\"componentDidUpdate\",value:function(e,t){this.props.isOpen&&!e.isOpen?this.open():!this.props.isOpen&&e.isOpen&&this.close(),this.props.shouldFocusAfterRender&&this.state.isOpen&&!t.isOpen&&this.focusContent()}},{key:\"componentWillUnmount\",value:function(){this.state.isOpen&&this.afterClose(),clearTimeout(this.closeTimer),cancelAnimationFrame(this.openAnimationFrame)}},{key:\"beforeOpen\",value:function(){var e=this.props,t=e.appElement,n=e.ariaHideApp,r=e.htmlOpenClassName,o=e.bodyOpenClassName,i=e.parentSelector,a=i&&i().ownerDocument||document;o&&f.add(a.body,o),r&&f.add(a.getElementsByTagName(\"html\")[0],r),n&&(v+=1,s.hide(t)),y.default.register(this)}},{key:\"render\",value:function(){var e=this.props,t=e.id,n=e.className,o=e.overlayClassName,i=e.defaultStyles,a=e.children,l=n?{}:i.content,u=o?{}:i.overlay;if(this.shouldBeClosed())return null;var c={ref:this.setOverlayRef,className:this.buildClassName(\"overlay\",o),style:r({},u,this.props.style.overlay),onClick:this.handleOverlayOnClick,onMouseDown:this.handleOverlayOnMouseDown},s=r({id:t,ref:this.setContentRef,style:r({},l,this.props.style.content),className:this.buildClassName(\"content\",n),tabIndex:\"-1\",onKeyDown:this.handleKeyDown,onMouseDown:this.handleContentOnMouseDown,onMouseUp:this.handleContentOnMouseUp,onClick:this.handleContentOnClick,role:this.props.role,\"aria-label\":this.props.contentLabel},this.attributesFromObject(\"aria\",r({modal:!0},this.props.aria)),this.attributesFromObject(\"data\",this.props.data||{}),{\"data-testid\":this.props.testId}),f=this.props.contentElement(s,a);return this.props.overlayElement(c,f)}}]),t}(a.Component);g.defaultProps={style:{overlay:{},content:{}},defaultStyles:{}},g.propTypes={isOpen:l.default.bool.isRequired,defaultStyles:l.default.shape({content:l.default.object,overlay:l.default.object}),style:l.default.shape({content:l.default.object,overlay:l.default.object}),className:l.default.oneOfType([l.default.string,l.default.object]),overlayClassName:l.default.oneOfType([l.default.string,l.default.object]),parentSelector:l.default.func,bodyOpenClassName:l.default.string,htmlOpenClassName:l.default.string,ariaHideApp:l.default.bool,appElement:l.default.oneOfType([l.default.instanceOf(d.default),l.default.instanceOf(p.SafeHTMLCollection),l.default.instanceOf(p.SafeNodeList),l.default.arrayOf(l.default.instanceOf(d.default))]),onAfterOpen:l.default.func,onAfterClose:l.default.func,onRequestClose:l.default.func,closeTimeoutMS:l.default.number,shouldFocusAfterRender:l.default.bool,shouldCloseOnOverlayClick:l.default.bool,shouldReturnFocusAfterClose:l.default.bool,preventScroll:l.default.bool,role:l.default.string,contentLabel:l.default.string,aria:l.default.object,data:l.default.object,children:l.default.node,shouldCloseOnEsc:l.default.bool,overlayRef:l.default.func,contentRef:l.default.func,id:l.default.string,overlayElement:l.default.func,contentElement:l.default.func,testId:l.default.string},t.default=g,e.exports=t.default},149:(e,t,n)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.resetState=function(){a&&(a.removeAttribute?a.removeAttribute(\"aria-hidden\"):null!=a.length?a.forEach((function(e){return e.removeAttribute(\"aria-hidden\")})):document.querySelectorAll(a).forEach((function(e){return e.removeAttribute(\"aria-hidden\")}))),a=null},t.log=function(){},t.assertNodeList=l,t.setElement=function(e){var t=e;if(\"string\"==typeof t&&i.canUseDOM){var n=document.querySelectorAll(t);l(n,t),t=n}return a=t||a},t.validateElement=u,t.hide=function(e){var t=!0,n=!1,r=void 0;try{for(var o,i=u(e)[Symbol.iterator]();!(t=(o=i.next()).done);t=!0)o.value.setAttribute(\"aria-hidden\",\"true\")}catch(e){n=!0,r=e}finally{try{!t&&i.return&&i.return()}finally{if(n)throw r}}},t.show=function(e){var t=!0,n=!1,r=void 0;try{for(var o,i=u(e)[Symbol.iterator]();!(t=(o=i.next()).done);t=!0)o.value.removeAttribute(\"aria-hidden\")}catch(e){n=!0,r=e}finally{try{!t&&i.return&&i.return()}finally{if(n)throw r}}},t.documentNotReadyOrSSRTesting=function(){a=null};var r,o=(r=n(473))&&r.__esModule?r:{default:r},i=n(112),a=null;function l(e,t){if(!e||!e.length)throw new Error(\"react-modal: No elements were found for selector \"+t+\".\")}function u(e){var t=e||a;return t?Array.isArray(t)||t instanceof HTMLCollection||t instanceof NodeList?t:[t]:((0,o.default)(!1,[\"react-modal: App element is not defined.\",\"Please use `Modal.setAppElement(el)` or set `appElement={el}`.\",\"This is needed so screen readers don't see main content\",\"when modal is opened. It is not recommended, but you can opt-out\",\"by setting `ariaHideApp={false}`.\"].join(\" \")),[])}},63:(e,t,n)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.resetState=function(){for(var e=[i,a],t=0;t<e.length;t++){var n=e[t];n&&n.parentNode&&n.parentNode.removeChild(n)}i=a=null,l=[]},t.log=function(){console.log(\"bodyTrap ----------\"),console.log(l.length);for(var e=[i,a],t=0;t<e.length;t++){var n=e[t]||{};console.log(n.nodeName,n.className,n.id)}console.log(\"edn bodyTrap ----------\")};var r,o=(r=n(623))&&r.__esModule?r:{default:r},i=void 0,a=void 0,l=[];function u(){0!==l.length&&l[l.length-1].focusContent()}o.default.subscribe((function(e,t){i||a||((i=document.createElement(\"div\")).setAttribute(\"data-react-modal-body-trap\",\"\"),i.style.position=\"absolute\",i.style.opacity=\"0\",i.setAttribute(\"tabindex\",\"0\"),i.addEventListener(\"focus\",u),(a=i.cloneNode()).addEventListener(\"focus\",u)),(l=t).length>0?(document.body.firstChild!==i&&document.body.insertBefore(i,document.body.firstChild),document.body.lastChild!==a&&document.body.appendChild(a)):(i.parentElement&&i.parentElement.removeChild(i),a.parentElement&&a.parentElement.removeChild(a))}))},409:(e,t)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.resetState=function(){var e=document.getElementsByTagName(\"html\")[0];for(var t in n)o(e,n[t]);var i=document.body;for(var a in r)o(i,r[a]);n={},r={}},t.log=function(){};var n={},r={};function o(e,t){e.classList.remove(t)}t.add=function(e,t){return o=e.classList,i=\"html\"==e.nodeName.toLowerCase()?n:r,void t.split(\" \").forEach((function(e){!function(e,t){e[t]||(e[t]=0),e[t]+=1}(i,e),o.add(e)}));var o,i},t.remove=function(e,t){return o=e.classList,i=\"html\"==e.nodeName.toLowerCase()?n:r,void t.split(\" \").forEach((function(e){!function(e,t){e[t]&&(e[t]-=1)}(i,e),0===i[e]&&o.remove(e)}));var o,i}},685:(e,t,n)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.resetState=function(){i=[]},t.log=function(){},t.handleBlur=u,t.handleFocus=c,t.markForFocusLater=function(){i.push(document.activeElement)},t.returnFocus=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=null;try{return void(0!==i.length&&(t=i.pop()).focus({preventScroll:e}))}catch(e){console.warn([\"You tried to return focus to\",t,\"but it is not in the DOM anymore\"].join(\" \"))}},t.popWithoutFocus=function(){i.length>0&&i.pop()},t.setupScopedFocus=function(e){a=e,window.addEventListener?(window.addEventListener(\"blur\",u,!1),document.addEventListener(\"focus\",c,!0)):(window.attachEvent(\"onBlur\",u),document.attachEvent(\"onFocus\",c))},t.teardownScopedFocus=function(){a=null,window.addEventListener?(window.removeEventListener(\"blur\",u),document.removeEventListener(\"focus\",c)):(window.detachEvent(\"onBlur\",u),document.detachEvent(\"onFocus\",c))};var r,o=(r=n(845))&&r.__esModule?r:{default:r},i=[],a=null,l=!1;function u(){l=!0}function c(){if(l){if(l=!1,!a)return;setTimeout((function(){a.contains(document.activeElement)||((0,o.default)(a)[0]||a).focus()}),0)}}},623:(e,t)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.log=function(){console.log(\"portalOpenInstances ----------\"),console.log(r.openInstances.length),r.openInstances.forEach((function(e){return console.log(e)})),console.log(\"end portalOpenInstances ----------\")},t.resetState=function(){r=new n};var n=function e(){var t=this;!function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,e),this.register=function(e){-1===t.openInstances.indexOf(e)&&(t.openInstances.push(e),t.emit(\"register\"))},this.deregister=function(e){var n=t.openInstances.indexOf(e);-1!==n&&(t.openInstances.splice(n,1),t.emit(\"deregister\"))},this.subscribe=function(e){t.subscribers.push(e)},this.emit=function(e){t.subscribers.forEach((function(n){return n(e,t.openInstances.slice())}))},this.openInstances=[],this.subscribers=[]},r=new n;t.default=r},112:(e,t,n)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.canUseDOM=t.SafeNodeList=t.SafeHTMLCollection=void 0;var r,o=((r=n(875))&&r.__esModule?r:{default:r}).default,i=o.canUseDOM?window.HTMLElement:{};t.SafeHTMLCollection=o.canUseDOM?window.HTMLCollection:{},t.SafeNodeList=o.canUseDOM?window.NodeList:{},t.canUseDOM=o.canUseDOM,t.default=i},338:(e,t,n)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=function(e,t){var n=(0,o.default)(e);if(n.length){var r=void 0,a=t.shiftKey,l=n[0],u=n[n.length-1],c=i();if(e===c){if(!a)return;r=u}if(u!==c||a||(r=l),l===c&&a&&(r=u),r)return t.preventDefault(),void r.focus();var s=/(\\bChrome\\b|\\bSafari\\b)\\//.exec(navigator.userAgent);if(null!=s&&\"Chrome\"!=s[1]&&null==/\\biPod\\b|\\biPad\\b/g.exec(navigator.userAgent)){var f=n.indexOf(c);if(f>-1&&(f+=a?-1:1),void 0===(r=n[f]))return t.preventDefault(),void(r=a?u:l).focus();t.preventDefault(),r.focus()}}else t.preventDefault()};var r,o=(r=n(845))&&r.__esModule?r:{default:r};function i(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:document;return e.activeElement.shadowRoot?i(e.activeElement.shadowRoot):e.activeElement}e.exports=t.default},845:(e,t)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=function e(t){return[].slice.call(t.querySelectorAll(\"*\"),0).reduce((function(t,n){return t.concat(n.shadowRoot?e(n.shadowRoot):[n])}),[]).filter(a)};var n=\"none\",r=\"contents\",o=/input|select|textarea|button|object|iframe/;function i(e){var t=e.offsetWidth<=0&&e.offsetHeight<=0;if(t&&!e.innerHTML)return!0;try{var o=window.getComputedStyle(e),i=o.getPropertyValue(\"display\");return t?i!==r&&function(e,t){return\"visible\"!==t.getPropertyValue(\"overflow\")||e.scrollWidth<=0&&e.scrollHeight<=0}(e,o):i===n}catch(e){return console.warn(\"Failed to inspect element style\"),!1}}function a(e){var t=e.getAttribute(\"tabindex\");null===t&&(t=void 0);var n=isNaN(t);return(n||t>=0)&&function(e,t){var n=e.nodeName.toLowerCase();return(o.test(n)&&!e.disabled||\"a\"===n&&e.href||t)&&function(e){for(var t=e,n=e.getRootNode&&e.getRootNode();t&&t!==document.body;){if(n&&t===n&&(t=n.host.parentNode),i(t))return!1;t=t.parentNode}return!0}(e)}(e,!n)}e.exports=t.default},253:(e,t,n)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r,o=(r=n(983))&&r.__esModule?r:{default:r};t.default=o.default,e.exports=t.default},474:(e,t,n)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},o=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),i=n(294),a=c(i),l=c(n(697)),u=c(n(87));function c(e){return e&&e.__esModule?e:{default:e}}function s(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}var f=function(e){function t(){var e,n,r;!function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,t);for(var o=arguments.length,i=Array(o),a=0;a<o;a++)i[a]=arguments[a];return n=r=s(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(i))),r.events=[\"resize\",\"scroll\",\"touchstart\",\"touchmove\",\"touchend\",\"pageshow\",\"load\"],r.subscribers=[],r.rafHandle=null,r.subscribe=function(e){r.subscribers=r.subscribers.concat(e)},r.unsubscribe=function(e){r.subscribers=r.subscribers.filter((function(t){return t!==e}))},r.notifySubscribers=function(e){if(!r.framePending){var t=e.currentTarget;r.rafHandle=(0,u.default)((function(){r.framePending=!1;var e=r.node.getBoundingClientRect(),n=e.top,o=e.bottom;r.subscribers.forEach((function(e){return e({distanceFromTop:n,distanceFromBottom:o,eventSource:t===window?document.body:r.node})}))})),r.framePending=!0}},r.getParent=function(){return r.node},s(r,n)}return function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),o(t,[{key:\"getChildContext\",value:function(){return{subscribe:this.subscribe,unsubscribe:this.unsubscribe,getParent:this.getParent}}},{key:\"componentDidMount\",value:function(){var e=this;this.events.forEach((function(t){return window.addEventListener(t,e.notifySubscribers)}))}},{key:\"componentWillUnmount\",value:function(){var e=this;this.rafHandle&&(u.default.cancel(this.rafHandle),this.rafHandle=null),this.events.forEach((function(t){return window.removeEventListener(t,e.notifySubscribers)}))}},{key:\"render\",value:function(){var e=this;return a.default.createElement(\"div\",r({},this.props,{ref:function(t){return e.node=t},onScroll:this.notifySubscribers,onTouchStart:this.notifySubscribers,onTouchMove:this.notifySubscribers,onTouchEnd:this.notifySubscribers}))}}]),t}(i.PureComponent);f.childContextTypes={subscribe:l.default.func,unsubscribe:l.default.func,getParent:l.default.func},t.default=f},579:(e,t,n)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),o=n(294),i=u(o),a=u(n(935)),l=u(n(697));function u(e){return e&&e.__esModule?e:{default:e}}function c(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}var s=function(e){function t(){var e,n,r;!function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,t);for(var o=arguments.length,i=Array(o),a=0;a<o;a++)i[a]=arguments[a];return n=r=c(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(i))),r.state={isSticky:!1,wasSticky:!1,style:{}},r.handleContainerEvent=function(e){var t=e.distanceFromTop,n=e.distanceFromBottom,o=e.eventSource,i=r.context.getParent(),a=!1;r.props.relative&&(a=o!==i,t=-(o.scrollTop+o.offsetTop)+r.placeholder.offsetTop);var l=r.placeholder.getBoundingClientRect(),u=r.content.getBoundingClientRect().height,c=n-r.props.bottomOffset-u,s=!!r.state.isSticky,f=a?s:t<=-r.props.topOffset&&n>-r.props.bottomOffset;n=(r.props.relative?i.scrollHeight-i.scrollTop:n)-u;var p=f?{position:\"fixed\",top:c>0?r.props.relative?i.offsetTop-i.offsetParent.scrollTop:0:c,left:l.left,width:l.width}:{};r.props.disableHardwareAcceleration||(p.transform=\"translateZ(0)\"),r.setState({isSticky:f,wasSticky:s,distanceFromTop:t,distanceFromBottom:n,calculatedHeight:u,style:p})},c(r,n)}return function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),r(t,[{key:\"componentWillMount\",value:function(){if(!this.context.subscribe)throw new TypeError(\"Expected Sticky to be mounted within StickyContainer\");this.context.subscribe(this.handleContainerEvent)}},{key:\"componentWillUnmount\",value:function(){this.context.unsubscribe(this.handleContainerEvent)}},{key:\"componentDidUpdate\",value:function(){this.placeholder.style.paddingBottom=this.props.disableCompensation?0:(this.state.isSticky?this.state.calculatedHeight:0)+\"px\"}},{key:\"render\",value:function(){var e=this,t=i.default.cloneElement(this.props.children({isSticky:this.state.isSticky,wasSticky:this.state.wasSticky,distanceFromTop:this.state.distanceFromTop,distanceFromBottom:this.state.distanceFromBottom,calculatedHeight:this.state.calculatedHeight,style:this.state.style}),{ref:function(t){e.content=a.default.findDOMNode(t)}});return i.default.createElement(\"div\",null,i.default.createElement(\"div\",{ref:function(t){return e.placeholder=t}}),t)}}]),t}(o.Component);s.propTypes={topOffset:l.default.number,bottomOffset:l.default.number,relative:l.default.bool,children:l.default.func.isRequired},s.defaultProps={relative:!1,topOffset:0,bottomOffset:0,disableCompensation:!1,disableHardwareAcceleration:!1},s.contextTypes={subscribe:l.default.func,unsubscribe:l.default.func,getParent:l.default.func},t.default=s},439:(e,t,n)=>{\"use strict\";t.L9=t.Le=void 0;var r=i(n(579)),o=i(n(474));function i(e){return e&&e.__esModule?e:{default:e}}t.Le=r.default,t.L9=o.default,r.default},635:function(e,t,n){var r;e.exports=(r=n(294),function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={exports:{},id:r,loaded:!1};return e[r].call(o.exports,o,o.exports,t),o.loaded=!0,o.exports}var n={};return t.m=e,t.c=n,t.p=\"\",t(0)}([function(e,t,n){e.exports=n(12)},function(e,t,n){e.exports=n(17)()},function(e,t){\"use strict\";t.__esModule=!0,t.default=function(e){var t={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=\"number\"==typeof e[n]?e[n]:e[n].val);return t},e.exports=t.default},function(e,t){e.exports=r},function(e,t,n){(function(t){(function(){var n,r,o;\"undefined\"!=typeof performance&&null!==performance&&performance.now?e.exports=function(){return performance.now()}:null!=t&&t.hrtime?(e.exports=function(){return(n()-o)/1e6},r=t.hrtime,n=function(){var e;return 1e9*(e=r())[0]+e[1]},o=n()):Date.now?(e.exports=function(){return Date.now()-o},o=Date.now()):(e.exports=function(){return(new Date).getTime()-o},o=(new Date).getTime())}).call(this)}).call(t,n(9))},function(e,t,n){(function(t){for(var r=n(19),o=\"undefined\"==typeof window?t:window,i=[\"moz\",\"webkit\"],a=\"AnimationFrame\",l=o[\"request\"+a],u=o[\"cancel\"+a]||o[\"cancelRequest\"+a],c=0;!l&&c<i.length;c++)l=o[i[c]+\"Request\"+a],u=o[i[c]+\"Cancel\"+a]||o[i[c]+\"CancelRequest\"+a];if(!l||!u){var s=0,f=0,p=[];l=function(e){if(0===p.length){var t=r(),n=Math.max(0,16.666666666666668-(t-s));s=n+t,setTimeout((function(){var e=p.slice(0);p.length=0;for(var t=0;t<e.length;t++)if(!e[t].cancelled)try{e[t].callback(s)}catch(e){setTimeout((function(){throw e}),0)}}),Math.round(n))}return p.push({handle:++f,callback:e,cancelled:!1}),f},u=function(e){for(var t=0;t<p.length;t++)p[t].handle===e&&(p[t].cancelled=!0)}}e.exports=function(e){return l.call(o,e)},e.exports.cancel=function(){u.apply(o,arguments)},e.exports.polyfill=function(e){e||(e=o),e.requestAnimationFrame=l,e.cancelAnimationFrame=u}}).call(t,function(){return this}())},function(e,t){\"use strict\";t.__esModule=!0,t.default=function(e){var t={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=0);return t},e.exports=t.default},function(e,t){\"use strict\";t.__esModule=!0,t.default=function(e,t,n){for(var r in t)if(Object.prototype.hasOwnProperty.call(t,r)){if(0!==n[r])return!1;var o=\"number\"==typeof t[r]?t[r]:t[r].val;if(e[r]!==o)return!1}return!0},e.exports=t.default},function(e,t){\"use strict\";t.__esModule=!0,t.default=function(e,t,r,o,i,a,l){var u=r+(-i*(t-o)+-a*r)*e,c=t+u*e;return Math.abs(u)<l&&Math.abs(c-o)<l?(n[0]=o,n[1]=0,n):(n[0]=c,n[1]=u,n)};var n=[0,0];e.exports=t.default},function(e,t){function n(){throw new Error(\"setTimeout has not been defined\")}function r(){throw new Error(\"clearTimeout has not been defined\")}function o(e){if(c===setTimeout)return setTimeout(e,0);if((c===n||!c)&&setTimeout)return c=setTimeout,setTimeout(e,0);try{return c(e,0)}catch(t){try{return c.call(null,e,0)}catch(t){return c.call(this,e,0)}}}function i(){y&&p&&(y=!1,p.length?d=p.concat(d):h=-1,d.length&&a())}function a(){if(!y){var e=o(i);y=!0;for(var t=d.length;t;){for(p=d,d=[];++h<t;)p&&p[h].run();h=-1,t=d.length}p=null,y=!1,function(e){if(s===clearTimeout)return clearTimeout(e);if((s===r||!s)&&clearTimeout)return s=clearTimeout,clearTimeout(e);try{return s(e)}catch(t){try{return s.call(null,e)}catch(t){return s.call(this,e)}}}(e)}}function l(e,t){this.fun=e,this.array=t}function u(){}var c,s,f=e.exports={};!function(){try{c=\"function\"==typeof setTimeout?setTimeout:n}catch(e){c=n}try{s=\"function\"==typeof clearTimeout?clearTimeout:r}catch(e){s=r}}();var p,d=[],y=!1,h=-1;f.nextTick=function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)t[n-1]=arguments[n];d.push(new l(e,t)),1!==d.length||y||o(a)},l.prototype.run=function(){this.fun.apply(null,this.array)},f.title=\"browser\",f.browser=!0,f.env={},f.argv=[],f.version=\"\",f.versions={},f.on=u,f.addListener=u,f.once=u,f.off=u,f.removeListener=u,f.removeAllListeners=u,f.emit=u,f.prependListener=u,f.prependOnceListener=u,f.listeners=function(e){return[]},f.binding=function(e){throw new Error(\"process.binding is not supported\")},f.cwd=function(){return\"/\"},f.chdir=function(e){throw new Error(\"process.chdir is not supported\")},f.umask=function(){return 0}},function(e,t){\"use strict\";t.__esModule=!0,t.default={noWobble:{stiffness:170,damping:26},gentle:{stiffness:120,damping:14},wobbly:{stiffness:180,damping:12},stiff:{stiffness:210,damping:20}},e.exports=t.default},function(e,t){\"use strict\";function n(e){var t=-1!=e.indexOf(\"rgb\"),n=-1!=e.indexOf(\"rgba\"),r=e.match(/\\d+/g);if(t&&!n)return{r:parseInt(r[0]),g:parseInt(r[1]),b:parseInt(r[2])};if(t&&n){var o=\"0\"==r[3]?\"0.\"+r[4]:r[3];return{r:parseInt(r[0]),g:parseInt(r[1]),b:parseInt(r[2]),a:parseFloat(o)}}return null}function r(e,t,n,r,o){return r+(e-t)/(n-t)*(o-r)}Object.defineProperty(t,\"__esModule\",{value:!0}),t.hexToRGB=function(e){var t=e;if(o[t])return o[t];3===(t=t.replace(\"#\",\"\")).length&&(t=t[0]+t[0]+t[1]+t[1]+t[2]+t[2]);var n=t.match(/.{2}/g),r={r:parseInt(n[0],16),g:parseInt(n[1],16),b:parseInt(n[2],16)};return o[t]=r,r},t.rgbToObj=n,t.rgbToHex=function(e,t,n){var r=e.toString(16),o=t.toString(16),i=n.toString(16);return\"#\"+(r=r.length<2?\"0\"+r:r)+(o=o.length<2?\"0\"+o:o)+(i.length<2?\"0\"+i:i)},t.mapValueInRange=r,t.interpolateColor=function(e,t,o,i,a,l){var u=void 0===i?0:i,c=void 0===a?1:a,s=n(t),f=n(o),p=Math.floor(r(e,u,c,s.r,f.r)),d=Math.floor(r(e,u,c,s.g,f.g)),y=Math.floor(r(e,u,c,s.b,f.b)),h=null;return s.a&&f.a&&(h=r(e,u,c,s.a,f.a)),h?\"rgb(\"+p+\",\"+d+\",\"+y+\",\"+h+\")\":\"rgb(\"+p+\",\"+d+\",\"+y+\")\"};var o={}},function(e,t,n){\"use strict\";var r=function(e){return e&&e.__esModule?e:{default:e}}(n(13));e.exports=r.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),a=n(3),l=r(a),u=n(24),c=r(n(1)),s=n(14),f=n(11),p={active:{base:\"rgb(1,124,66)\",hover:\"rgb(1,124,66)\"},inactive:{base:\"rgb(65,66,68)\",hover:\"rgb(65,66,68)\"},activeThumb:{base:\"rgb(250,250,250)\",hover:\"rgb(250,250,250)\"},inactiveThumb:{base:\"rgb(250,250,250)\",hover:\"rgb(250,250,250)\"}},d={},y=function(e){function t(e){!function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,t);var n=function(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.state={isHover:!1},n}return function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),i(t,[{key:\"onMouseOver\",value:function(){this.setState({isHover:!0})}},{key:\"onMouseOut\",value:function(){this.setState({isHover:!1})}},{key:\"_convertToRgb\",value:function(e,t){if(-1!=e.indexOf(\"#\")){var n=(0,f.hexToRGB)(e);return\"rgb(\"+n.r+\", \"+n.g+\", \"+n.b+\")\"}return-1==e.indexOf(\"rgb\")?t:e}},{key:\"checkAllColors\",value:function(e){var t=this;return Object.keys(e).forEach((function(n){t.checkColors(e,n)})),e}},{key:\"checkColors\",value:function(e,t){e[t]?e[t].hover?(e[t].base=this._convertToRgb(e[t].base,p[t].base),e[t].hover=this._convertToRgb(e[t].hover,p[t].hover)):e[t].base?(e[t].base=this._convertToRgb(e[t].base,p[t].base),e[t].hover=e[t].base):(console.warn('Color prop should have a \"base\" style and a \"hover\" style!'),e[t]=p[t]):e[t]=p[t]}},{key:\"interpolateColorWithHover\",value:function(e,t,n){var r=this.props.colors;return this.checkColors(r,t),this.checkColors(r,n),this.state.isHover?{backgroundColor:(0,f.interpolateColor)(e,r[t].hover,r[n].hover,0,400)}:{backgroundColor:(0,f.interpolateColor)(e,r[t].base,r[n].base,0,400)}}},{key:\"makeStyle\",value:function(e,t){return this.state.isHover?o({},e,t):e}},{key:\"handleClick\",value:function(e){e.target!==this._input&&(e.preventDefault(),this._input.focus(),this._input.click())}},{key:\"render\",value:function(){var e=this,t=this.props,n=t.internalSpringSetting,r=t.internalHoverSpringSetting,i=t.value,a=t.thumbAnimateRange,c=(t.isHover,t.containerStyle),f=t.trackStyle,p=t.animateTrackStyleToggle,d=t.animateTrackStyleHover,y=t.thumbStyleHover,h=t.trackStyleHover,m=t.activeLabelStyle,b=t.activeLabelStyleHover,v=t.activeLabel,g=t.inactiveLabelStyle,w=t.inactiveLabelStyleHover,S=t.inactiveLabel,O=t.thumbStyle,E=t.animateThumbStyleHover,k=t.animateThumbStyleToggle,P=t.thumbIcon,x=t.onClick,j=t.onToggle,C=t.passThroughInputProps,T=n,A=r;return l.default.createElement(u.Motion,{style:{opacity:(0,u.spring)(i?1:0,T),left:(0,u.spring)(i?10*a[1]:10*a[0],T),colorNumber:(0,u.spring)(i?0:400,T),toggleNumber:(0,u.spring)(i?400:0,T),hoverNumber:(0,u.spring)(this.state.isHover?400:0,A)}},(function(t){var n=t.opacity,r=t.left,a=t.colorNumber,u=t.hoverNumber,T=t.toggleNumber;return l.default.createElement(\"div\",{style:o({},e.makeStyle(o({},s.reactToggle,c))),onMouseOver:e.onMouseOver.bind(e),onMouseOut:e.onMouseOut.bind(e),onClick:e.handleClick.bind(e)},l.default.createElement(\"div\",{style:o({},e.makeStyle(o({},s.reactToggleTrack,f,e.interpolateColorWithHover(a,\"active\",\"inactive\"),p(T/400)),o({},h,d(u/400))))},l.default.createElement(\"div\",{style:o({},e.makeStyle(o({},s.reactToggleOn,m),b),{opacity:n})},v),l.default.createElement(\"div\",{style:o({},e.makeStyle(o({},s.reactToggleOff,g),w),{opacity:1-n})},S)),l.default.createElement(\"div\",{style:s.reactThumbCenteringContainer},l.default.createElement(\"div\",{style:o({},e.makeStyle(o({},s.reactToggleThumb,O,e.interpolateColorWithHover(a,\"activeThumb\",\"inactiveThumb\"),k(T/400)),o({},y,E(u/400))),{position:\"relative\",left:Math.round(r/10)})},P)),l.default.createElement(\"input\",o({ref:function(t){e._input=t},type:\"checkbox\",style:s.reactToggleScreenReaderOnly,onClick:function(e){x&&x(e),j(i)},value:i},C)))}))}}]),t}(a.Component);y.defaultProps={value:!1,onToggle:function(){},colors:p,passThroughInputProps:{},activeLabel:\"ON\",containerStyle:d,activeLabelStyle:d,activeLabelStyleHover:d,inactiveLabel:\"OFF\",inactiveLabelStyle:d,inactiveLabelStyleHover:d,thumbStyle:d,thumbStyleHover:d,animateThumbStyleHover:function(){return{}},animateThumbStyleToggle:function(){return{}},trackStyle:d,trackStyleHover:d,animateTrackStyleHover:function(){return{}},animateTrackStyleToggle:function(){return{}},thumbAnimateRange:[1,33],internalSpringSetting:{stiffness:180,damping:22},internalHoverSpringSetting:{stiffness:180,damping:20}},y.displayName=\"Toggle\",t.default=y,y.propTypes={value:c.default.bool.isRequired,onToggle:c.default.func.isRequired,passThroughInputProps:c.default.object,onClick:c.default.func,colors:c.default.object,activeLabel:c.default.oneOfType([c.default.string,c.default.object]),containerStyle:c.default.object,activeLabelStyle:c.default.object,activeLabelStyleHover:c.default.object,activeThumbStyle:c.default.object,activeThumbStyleHover:c.default.object,inactiveLabel:c.default.oneOfType([c.default.string,c.default.object]),inactiveLabelStyle:c.default.object,inactiveLabelStyleHover:c.default.object,thumbStyle:c.default.object,thumbStyleHover:c.default.object,trackStyle:c.default.object,trackStyleHover:c.default.object,animateThumbStyleHover:c.default.func,animateTrackStyleHover:c.default.func,animateTrackStyleToggle:c.default.func,animateThumbStyleToggle:c.default.func,internalSpringSetting:c.default.object,internalHoverSpringSetting:c.default.object,thumbIcon:c.default.oneOfType([c.default.string,c.default.object]),thumbAnimateRange:c.default.array}},function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},r=(t.reactToggle=function(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}({display:\"flex\",width:52,alignItems:\"center\",justifyContent:\"flex-start\",position:\"relative\",cursor:\"pointer\",backgroundColor:\"transparent\",border:0,padding:0,WebkitTouchCallout:\"none\",WebkitUserSelect:\"none\",KhtmlUserSelect:\"none\",MozUserSelect:\"none\",msUserSelect:\"none\",userSelect:\"none\",WebkitTapHighlightColor:\"rgba(0,0,0,0)\"},\"WebkitTapHighlightColor\",\"transparent\"),{fontSize:11,display:\"flex\",alignItems:\"center\",justifyContent:\"center\",fontFamily:\"'Helvetica Neue', Helvetica, sans-serif\"});t.reactToggleScreenReaderOnly={border:0,clip:\"rect(0 0 0 0)\",height:1,margin:-1,overflow:\"hidden\",padding:0,position:\"absolute\",width:1},t.reactToggleTrack={width:\"52px\",height:\"20px\",padding:0,borderRadius:\"26px\",display:\"flex\",alignItems:\"center\",justifyContent:\"center\"},t.reactToggleOn=n({},r,{position:\"relative\",color:\"#FAFAFA\",marginTop:\"auto\",marginBottom:\"auto\",lineHeight:0,opacity:0,width:26,height:20,left:4}),t.reactToggleOff=n({},r,{position:\"relative\",color:\"rgba(255,255,255,0.6)\",bottom:\"0px\",marginTop:\"auto\",marginBottom:\"auto\",paddingRight:5,lineHeight:0,width:26,height:20}),t.reactToggleThumb={width:\"18px\",height:\"18px\",display:\"flex\",alignSelf:\"center\",boxShadow:\"0 0 0 1px rgba(0,0,0,0.3)\",borderRadius:\"50%\",WebkitBoxSizing:\"border-box\",MozBoxSizing:\"border-box\",boxSizing:\"border-box\"},t.reactThumbCenteringContainer={position:\"absolute\",height:\"100%\",top:0,left:0,display:\"flex\",flex:1,alignSelf:\"stretch\",alignItems:\"center\",justifyContent:\"flex-start\"}},function(e,t){\"use strict\";function n(e){return function(){return e}}var r=function(){};r.thatReturns=n,r.thatReturnsFalse=n(!1),r.thatReturnsTrue=n(!0),r.thatReturnsNull=n(null),r.thatReturnsThis=function(){return this},r.thatReturnsArgument=function(e){return e},e.exports=r},function(e,t,n){\"use strict\";var r=function(e){};e.exports=function(e,t,n,o,i,a,l,u){if(r(t),!e){var c;if(void 0===t)c=new Error(\"Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.\");else{var s=[n,o,i,a,l,u],f=0;(c=new Error(t.replace(/%s/g,(function(){return s[f++]})))).name=\"Invariant Violation\"}throw c.framesToPop=1,c}}},function(e,t,n){\"use strict\";var r=n(15),o=n(16),i=n(18);e.exports=function(){function e(e,t,n,r,a,l){l!==i&&o(!1,\"Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types\")}function t(){return e}e.isRequired=e;var n={array:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t};return n.checkPropTypes=r,n.PropTypes=n,n}},function(e,t){\"use strict\";e.exports=\"SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED\"},function(e,t,n){(function(t){(function(){var n,r,o,i,a,l;\"undefined\"!=typeof performance&&null!==performance&&performance.now?e.exports=function(){return performance.now()}:null!=t&&t.hrtime?(e.exports=function(){return(n()-a)/1e6},r=t.hrtime,n=function(){var e;return 1e9*(e=r())[0]+e[1]},i=n(),l=1e9*t.uptime(),a=i-l):Date.now?(e.exports=function(){return Date.now()-o},o=Date.now()):(e.exports=function(){return(new Date).getTime()-o},o=(new Date).getTime())}).call(this)}).call(t,n(9))},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),a=r(n(6)),l=r(n(2)),u=r(n(8)),c=r(n(4)),s=r(n(5)),f=r(n(7)),p=r(n(3)),d=r(n(1)),y=1e3/60,h=function(e){function t(n){var r=this;(function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")})(this,t),e.call(this,n),this.wasAnimating=!1,this.animationID=null,this.prevTime=0,this.accumulatedTime=0,this.unreadPropStyle=null,this.clearUnreadPropStyle=function(e){var t=!1,n=r.state,i=n.currentStyle,a=n.currentVelocity,l=n.lastIdealStyle,u=n.lastIdealVelocity;for(var c in e)if(Object.prototype.hasOwnProperty.call(e,c)){var s=e[c];\"number\"==typeof s&&(t||(t=!0,i=o({},i),a=o({},a),l=o({},l),u=o({},u)),i[c]=s,a[c]=0,l[c]=s,u[c]=0)}t&&r.setState({currentStyle:i,currentVelocity:a,lastIdealStyle:l,lastIdealVelocity:u})},this.startAnimationIfNecessary=function(){r.animationID=s.default((function(e){var t=r.props.style;if(f.default(r.state.currentStyle,t,r.state.currentVelocity))return r.wasAnimating&&r.props.onRest&&r.props.onRest(),r.animationID=null,r.wasAnimating=!1,void(r.accumulatedTime=0);r.wasAnimating=!0;var n=e||c.default(),o=n-r.prevTime;if(r.prevTime=n,r.accumulatedTime=r.accumulatedTime+o,r.accumulatedTime>10*y&&(r.accumulatedTime=0),0===r.accumulatedTime)return r.animationID=null,void r.startAnimationIfNecessary();var i=(r.accumulatedTime-Math.floor(r.accumulatedTime/y)*y)/y,a=Math.floor(r.accumulatedTime/y),l={},s={},p={},d={};for(var h in t)if(Object.prototype.hasOwnProperty.call(t,h)){var m=t[h];if(\"number\"==typeof m)p[h]=m,d[h]=0,l[h]=m,s[h]=0;else{for(var b=r.state.lastIdealStyle[h],v=r.state.lastIdealVelocity[h],g=0;g<a;g++){var w=u.default(y/1e3,b,v,m.val,m.stiffness,m.damping,m.precision);b=w[0],v=w[1]}var S=u.default(y/1e3,b,v,m.val,m.stiffness,m.damping,m.precision),O=S[0],E=S[1];p[h]=b+(O-b)*i,d[h]=v+(E-v)*i,l[h]=b,s[h]=v}}r.animationID=null,r.accumulatedTime-=a*y,r.setState({currentStyle:p,currentVelocity:d,lastIdealStyle:l,lastIdealVelocity:s}),r.unreadPropStyle=null,r.startAnimationIfNecessary()}))},this.state=this.defaultState()}return function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),i(t,null,[{key:\"propTypes\",value:{defaultStyle:d.default.objectOf(d.default.number),style:d.default.objectOf(d.default.oneOfType([d.default.number,d.default.object])).isRequired,children:d.default.func.isRequired,onRest:d.default.func},enumerable:!0}]),t.prototype.defaultState=function(){var e=this.props,t=e.defaultStyle,n=e.style,r=t||l.default(n),o=a.default(r);return{currentStyle:r,currentVelocity:o,lastIdealStyle:r,lastIdealVelocity:o}},t.prototype.componentDidMount=function(){this.prevTime=c.default(),this.startAnimationIfNecessary()},t.prototype.componentWillReceiveProps=function(e){null!=this.unreadPropStyle&&this.clearUnreadPropStyle(this.unreadPropStyle),this.unreadPropStyle=e.style,null==this.animationID&&(this.prevTime=c.default(),this.startAnimationIfNecessary())},t.prototype.componentWillUnmount=function(){null!=this.animationID&&(s.default.cancel(this.animationID),this.animationID=null)},t.prototype.render=function(){var e=this.props.children(this.state.currentStyle);return e&&p.default.Children.only(e)},t}(p.default.Component);t.default=h,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t,n){for(var r=0;r<e.length;r++)if(!p.default(e[r],t[r],n[r]))return!1;return!0}t.__esModule=!0;var i=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},a=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),l=r(n(6)),u=r(n(2)),c=r(n(8)),s=r(n(4)),f=r(n(5)),p=r(n(7)),d=r(n(3)),y=r(n(1)),h=1e3/60,m=function(e){function t(n){var r=this;(function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")})(this,t),e.call(this,n),this.animationID=null,this.prevTime=0,this.accumulatedTime=0,this.unreadPropStyles=null,this.clearUnreadPropStyle=function(e){for(var t=r.state,n=t.currentStyles,o=t.currentVelocities,a=t.lastIdealStyles,l=t.lastIdealVelocities,u=!1,c=0;c<e.length;c++){var s=e[c],f=!1;for(var p in s)if(Object.prototype.hasOwnProperty.call(s,p)){var d=s[p];\"number\"==typeof d&&(f||(f=!0,u=!0,n[c]=i({},n[c]),o[c]=i({},o[c]),a[c]=i({},a[c]),l[c]=i({},l[c])),n[c][p]=d,o[c][p]=0,a[c][p]=d,l[c][p]=0)}}u&&r.setState({currentStyles:n,currentVelocities:o,lastIdealStyles:a,lastIdealVelocities:l})},this.startAnimationIfNecessary=function(){r.animationID=f.default((function(e){var t=r.props.styles(r.state.lastIdealStyles);if(o(r.state.currentStyles,t,r.state.currentVelocities))return r.animationID=null,void(r.accumulatedTime=0);var n=e||s.default(),i=n-r.prevTime;if(r.prevTime=n,r.accumulatedTime=r.accumulatedTime+i,r.accumulatedTime>10*h&&(r.accumulatedTime=0),0===r.accumulatedTime)return r.animationID=null,void r.startAnimationIfNecessary();for(var a=(r.accumulatedTime-Math.floor(r.accumulatedTime/h)*h)/h,l=Math.floor(r.accumulatedTime/h),u=[],f=[],p=[],d=[],y=0;y<t.length;y++){var m=t[y],b={},v={},g={},w={};for(var S in m)if(Object.prototype.hasOwnProperty.call(m,S)){var O=m[S];if(\"number\"==typeof O)b[S]=O,v[S]=0,g[S]=O,w[S]=0;else{for(var E=r.state.lastIdealStyles[y][S],k=r.state.lastIdealVelocities[y][S],P=0;P<l;P++){var x=c.default(h/1e3,E,k,O.val,O.stiffness,O.damping,O.precision);E=x[0],k=x[1]}var j=c.default(h/1e3,E,k,O.val,O.stiffness,O.damping,O.precision),C=j[0],T=j[1];b[S]=E+(C-E)*a,v[S]=k+(T-k)*a,g[S]=E,w[S]=k}}p[y]=b,d[y]=v,u[y]=g,f[y]=w}r.animationID=null,r.accumulatedTime-=l*h,r.setState({currentStyles:p,currentVelocities:d,lastIdealStyles:u,lastIdealVelocities:f}),r.unreadPropStyles=null,r.startAnimationIfNecessary()}))},this.state=this.defaultState()}return function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),a(t,null,[{key:\"propTypes\",value:{defaultStyles:y.default.arrayOf(y.default.objectOf(y.default.number)),styles:y.default.func.isRequired,children:y.default.func.isRequired},enumerable:!0}]),t.prototype.defaultState=function(){var e=this.props,t=e.defaultStyles,n=e.styles,r=t||n().map(u.default),o=r.map((function(e){return l.default(e)}));return{currentStyles:r,currentVelocities:o,lastIdealStyles:r,lastIdealVelocities:o}},t.prototype.componentDidMount=function(){this.prevTime=s.default(),this.startAnimationIfNecessary()},t.prototype.componentWillReceiveProps=function(e){null!=this.unreadPropStyles&&this.clearUnreadPropStyle(this.unreadPropStyles),this.unreadPropStyles=e.styles(this.state.lastIdealStyles),null==this.animationID&&(this.prevTime=s.default(),this.startAnimationIfNecessary())},t.prototype.componentWillUnmount=function(){null!=this.animationID&&(f.default.cancel(this.animationID),this.animationID=null)},t.prototype.render=function(){var e=this.props.children(this.state.currentStyles);return e&&d.default.Children.only(e)},t}(d.default.Component);t.default=m,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t,n){var r=t;return null==r?e.map((function(e,t){return{key:e.key,data:e.data,style:n[t]}})):e.map((function(e,t){for(var o=0;o<r.length;o++)if(r[o].key===e.key)return{key:r[o].key,data:r[o].data,style:n[t]};return{key:e.key,data:e.data,style:n[t]}}))}function i(e,t,n,r){if(r.length!==t.length)return!1;for(var o=0;o<r.length;o++)if(r[o].key!==t[o].key)return!1;for(o=0;o<r.length;o++)if(!h.default(e[o],t[o].style,n[o]))return!1;return!0}function a(e,t,n,r,o,i,a,l,u){for(var s=p.default(r,o,(function(e,r){var o=t(r);return null==o||h.default(i[e],o,a[e])?(n({key:r.key,data:r.data}),null):{key:r.key,data:r.data,style:o}})),f=[],d=[],y=[],m=[],b=0;b<s.length;b++){for(var v=s[b],g=null,w=0;w<r.length;w++)if(r[w].key===v.key){g=w;break}if(null==g){var S=e(v);f[b]=S,y[b]=S;var O=c.default(v.style);d[b]=O,m[b]=O}else f[b]=i[g],y[b]=l[g],d[b]=a[g],m[b]=u[g]}return[s,f,d,y,m]}t.__esModule=!0;var l=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},u=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),c=r(n(6)),s=r(n(2)),f=r(n(8)),p=r(n(23)),d=r(n(4)),y=r(n(5)),h=r(n(7)),m=r(n(3)),b=r(n(1)),v=1e3/60,g=function(e){function t(n){var r=this;(function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")})(this,t),e.call(this,n),this.unmounting=!1,this.animationID=null,this.prevTime=0,this.accumulatedTime=0,this.unreadPropStyles=null,this.clearUnreadPropStyle=function(e){for(var t=a(r.props.willEnter,r.props.willLeave,r.props.didLeave,r.state.mergedPropsStyles,e,r.state.currentStyles,r.state.currentVelocities,r.state.lastIdealStyles,r.state.lastIdealVelocities),n=t[0],o=t[1],i=t[2],u=t[3],c=t[4],s=0;s<e.length;s++){var f=e[s].style,p=!1;for(var d in f)if(Object.prototype.hasOwnProperty.call(f,d)){var y=f[d];\"number\"==typeof y&&(p||(p=!0,o[s]=l({},o[s]),i[s]=l({},i[s]),u[s]=l({},u[s]),c[s]=l({},c[s]),n[s]={key:n[s].key,data:n[s].data,style:l({},n[s].style)}),o[s][d]=y,i[s][d]=0,u[s][d]=y,c[s][d]=0,n[s].style[d]=y)}}r.setState({currentStyles:o,currentVelocities:i,mergedPropsStyles:n,lastIdealStyles:u,lastIdealVelocities:c})},this.startAnimationIfNecessary=function(){r.unmounting||(r.animationID=y.default((function(e){if(!r.unmounting){var t=r.props.styles,n=\"function\"==typeof t?t(o(r.state.mergedPropsStyles,r.unreadPropStyles,r.state.lastIdealStyles)):t;if(i(r.state.currentStyles,n,r.state.currentVelocities,r.state.mergedPropsStyles))return r.animationID=null,void(r.accumulatedTime=0);var l=e||d.default(),u=l-r.prevTime;if(r.prevTime=l,r.accumulatedTime=r.accumulatedTime+u,r.accumulatedTime>10*v&&(r.accumulatedTime=0),0===r.accumulatedTime)return r.animationID=null,void r.startAnimationIfNecessary();for(var c=(r.accumulatedTime-Math.floor(r.accumulatedTime/v)*v)/v,s=Math.floor(r.accumulatedTime/v),p=a(r.props.willEnter,r.props.willLeave,r.props.didLeave,r.state.mergedPropsStyles,n,r.state.currentStyles,r.state.currentVelocities,r.state.lastIdealStyles,r.state.lastIdealVelocities),y=p[0],h=p[1],m=p[2],b=p[3],g=p[4],w=0;w<y.length;w++){var S=y[w].style,O={},E={},k={},P={};for(var x in S)if(Object.prototype.hasOwnProperty.call(S,x)){var j=S[x];if(\"number\"==typeof j)O[x]=j,E[x]=0,k[x]=j,P[x]=0;else{for(var C=b[w][x],T=g[w][x],A=0;A<s;A++){var R=f.default(v/1e3,C,T,j.val,j.stiffness,j.damping,j.precision);C=R[0],T=R[1]}var _=f.default(v/1e3,C,T,j.val,j.stiffness,j.damping,j.precision),I=_[0],N=_[1];O[x]=C+(I-C)*c,E[x]=T+(N-T)*c,k[x]=C,P[x]=T}}b[w]=k,g[w]=P,h[w]=O,m[w]=E}r.animationID=null,r.accumulatedTime-=s*v,r.setState({currentStyles:h,currentVelocities:m,lastIdealStyles:b,lastIdealVelocities:g,mergedPropsStyles:y}),r.unreadPropStyles=null,r.startAnimationIfNecessary()}})))},this.state=this.defaultState()}return function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),u(t,null,[{key:\"propTypes\",value:{defaultStyles:b.default.arrayOf(b.default.shape({key:b.default.string.isRequired,data:b.default.any,style:b.default.objectOf(b.default.number).isRequired})),styles:b.default.oneOfType([b.default.func,b.default.arrayOf(b.default.shape({key:b.default.string.isRequired,data:b.default.any,style:b.default.objectOf(b.default.oneOfType([b.default.number,b.default.object])).isRequired}))]).isRequired,children:b.default.func.isRequired,willEnter:b.default.func,willLeave:b.default.func,didLeave:b.default.func},enumerable:!0},{key:\"defaultProps\",value:{willEnter:function(e){return s.default(e.style)},willLeave:function(){return null},didLeave:function(){}},enumerable:!0}]),t.prototype.defaultState=function(){var e,t=this.props,n=t.defaultStyles,r=t.styles,o=t.willEnter,i=t.willLeave,l=t.didLeave,u=\"function\"==typeof r?r(n):r;e=null==n?u:n.map((function(e){for(var t=0;t<u.length;t++)if(u[t].key===e.key)return u[t];return e}));var f=null==n?u.map((function(e){return s.default(e.style)})):n.map((function(e){return s.default(e.style)})),p=null==n?u.map((function(e){return c.default(e.style)})):n.map((function(e){return c.default(e.style)})),d=a(o,i,l,e,u,f,p,f,p),y=d[0];return{currentStyles:d[1],currentVelocities:d[2],lastIdealStyles:d[3],lastIdealVelocities:d[4],mergedPropsStyles:y}},t.prototype.componentDidMount=function(){this.prevTime=d.default(),this.startAnimationIfNecessary()},t.prototype.componentWillReceiveProps=function(e){this.unreadPropStyles&&this.clearUnreadPropStyle(this.unreadPropStyles);var t=e.styles;this.unreadPropStyles=\"function\"==typeof t?t(o(this.state.mergedPropsStyles,this.unreadPropStyles,this.state.lastIdealStyles)):t,null==this.animationID&&(this.prevTime=d.default(),this.startAnimationIfNecessary())},t.prototype.componentWillUnmount=function(){this.unmounting=!0,null!=this.animationID&&(y.default.cancel(this.animationID),this.animationID=null)},t.prototype.render=function(){var e=o(this.state.mergedPropsStyles,this.unreadPropStyles,this.state.currentStyles),t=this.props.children(e);return t&&m.default.Children.only(t)},t}(m.default.Component);t.default=g,e.exports=t.default},function(e,t){\"use strict\";t.__esModule=!0,t.default=function(e,t,n){for(var r={},o=0;o<e.length;o++)r[e[o].key]=o;var i={};for(o=0;o<t.length;o++)i[t[o].key]=o;var a=[];for(o=0;o<t.length;o++)a[o]=t[o];for(o=0;o<e.length;o++)if(!Object.prototype.hasOwnProperty.call(i,e[o].key)){var l=n(o,e[o]);null!=l&&a.push(l)}return a.sort((function(e,n){var o=i[e.key],a=i[n.key],l=r[e.key],u=r[n.key];if(null!=o&&null!=a)return i[e.key]-i[n.key];if(null!=l&&null!=u)return r[e.key]-r[n.key];if(null!=o){for(var c=0;c<t.length;c++){var s=t[c].key;if(Object.prototype.hasOwnProperty.call(r,s)){if(o<i[s]&&u>r[s])return-1;if(o>i[s]&&u<r[s])return 1}}return 1}for(c=0;c<t.length;c++)if(s=t[c].key,Object.prototype.hasOwnProperty.call(r,s)){if(a<i[s]&&l>r[s])return 1;if(a>i[s]&&l<r[s])return-1}return-1}))},e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e.default:e}t.__esModule=!0;var o=n(20);t.Motion=r(o);var i=n(21);t.StaggeredMotion=r(i);var a=n(22);t.TransitionMotion=r(a);var l=n(26);t.spring=r(l);var u=n(10);t.presets=r(u);var c=n(2);t.stripStyle=r(c);var s=n(25);t.reorderKeys=r(s)},function(e,t,n){\"use strict\";t.__esModule=!0,t.default=function(){},e.exports=t.default},function(e,t,n){\"use strict\";t.__esModule=!0;var r=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e};t.default=function(e,t){return r({},i,t,{val:e})};var o=function(e){return e&&e.__esModule?e:{default:e}}(n(10)),i=r({},o.default.noWobble,{precision:.01});e.exports=t.default}]))},82:function(e,t,n){var r;r=function(e,t){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&\"object\"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,\"default\",{enumerable:!0,value:e}),2&t&&\"string\"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,\"a\",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p=\"\",n(n.s=4)}([function(e,t,n){e.exports=n(5)()},function(t,n){t.exports=e},function(e,n){e.exports=t},function(e,t){e.exports=function(e,t,n){var r=e.direction,o=e.value;switch(r){case\"top\":return n.top+o<t.top&&n.bottom>t.bottom&&n.left<t.left&&n.right>t.right;case\"left\":return n.left+o<t.left&&n.bottom>t.bottom&&n.top<t.top&&n.right>t.right;case\"bottom\":return n.bottom-o>t.bottom&&n.left<t.left&&n.right>t.right&&n.top<t.top;case\"right\":return n.right-o>t.right&&n.left<t.left&&n.top<t.top&&n.bottom>t.bottom}}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"default\",(function(){return b}));var r=n(1),o=n.n(r),i=n(2),a=n.n(i),l=n(0),u=n.n(l),c=n(3),s=n.n(c);function f(e){return f=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},f(e)}function p(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function d(e){return d=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},d(e)}function y(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e}function h(e,t){return h=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},h(e,t)}function m(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var b=function(e){function t(e){var n,r;return function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,t),this,r=d(t).call(this,e),n=!r||\"object\"!==f(r)&&\"function\"!=typeof r?y(this):r,m(y(n),\"getContainer\",(function(){return n.props.containment||window})),m(y(n),\"addEventListener\",(function(e,t,r,o){var i;n.debounceCheck||(n.debounceCheck={});var a=function(){i=null,n.check()},l={target:e,fn:o>-1?function(){i||(i=setTimeout(a,o||0))}:function(){clearTimeout(i),i=setTimeout(a,r||0)},getLastTimeout:function(){return i}};e.addEventListener(t,l.fn),n.debounceCheck[t]=l})),m(y(n),\"startWatching\",(function(){n.debounceCheck||n.interval||(n.props.intervalCheck&&(n.interval=setInterval(n.check,n.props.intervalDelay)),n.props.scrollCheck&&n.addEventListener(n.getContainer(),\"scroll\",n.props.scrollDelay,n.props.scrollThrottle),n.props.resizeCheck&&n.addEventListener(window,\"resize\",n.props.resizeDelay,n.props.resizeThrottle),!n.props.delayedCall&&n.check())})),m(y(n),\"stopWatching\",(function(){if(n.debounceCheck)for(var e in n.debounceCheck)if(n.debounceCheck.hasOwnProperty(e)){var t=n.debounceCheck[e];clearTimeout(t.getLastTimeout()),t.target.removeEventListener(e,t.fn),n.debounceCheck[e]=null}n.debounceCheck=null,n.interval&&(n.interval=clearInterval(n.interval))})),m(y(n),\"check\",(function(){var e,t,r=n.node;if(!r)return n.state;if(e=function(e){return void 0===e.width&&(e.width=e.right-e.left),void 0===e.height&&(e.height=e.bottom-e.top),e}(n.roundRectDown(r.getBoundingClientRect())),n.props.containment){var o=n.props.containment.getBoundingClientRect();t={top:o.top,left:o.left,bottom:o.bottom,right:o.right}}else t={top:0,left:0,bottom:window.innerHeight||document.documentElement.clientHeight,right:window.innerWidth||document.documentElement.clientWidth};var i=n.props.offset||{};\"object\"===f(i)&&(t.top+=i.top||0,t.left+=i.left||0,t.bottom-=i.bottom||0,t.right-=i.right||0);var a={top:e.top>=t.top,left:e.left>=t.left,bottom:e.bottom<=t.bottom,right:e.right<=t.right},l=e.height>0&&e.width>0,u=l&&a.top&&a.left&&a.bottom&&a.right;if(l&&n.props.partialVisibility){var c=e.top<=t.bottom&&e.bottom>=t.top&&e.left<=t.right&&e.right>=t.left;\"string\"==typeof n.props.partialVisibility&&(c=a[n.props.partialVisibility]),u=n.props.minTopValue?c&&e.top<=t.bottom-n.props.minTopValue:c}\"string\"==typeof i.direction&&\"number\"==typeof i.value&&(console.warn(\"[notice] offset.direction and offset.value have been deprecated. They still work for now, but will be removed in next major version. Please upgrade to the new syntax: { %s: %d }\",i.direction,i.value),u=s()(i,e,t));var p=n.state;return n.state.isVisible!==u&&(p={isVisible:u,visibilityRect:a},n.setState(p),n.props.onChange&&n.props.onChange(u)),p})),n.state={isVisible:null,visibilityRect:{}},n}var n,r;return function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&h(e,t)}(t,e),n=t,(r=[{key:\"componentDidMount\",value:function(){this.node=a.a.findDOMNode(this),this.props.active&&this.startWatching()}},{key:\"componentWillUnmount\",value:function(){this.stopWatching()}},{key:\"componentDidUpdate\",value:function(e){this.node=a.a.findDOMNode(this),this.props.active&&!e.active?(this.setState({isVisible:null,visibilityRect:{}}),this.startWatching()):this.props.active||this.stopWatching()}},{key:\"roundRectDown\",value:function(e){return{top:Math.floor(e.top),left:Math.floor(e.left),bottom:Math.floor(e.bottom),right:Math.floor(e.right)}}},{key:\"render\",value:function(){return this.props.children instanceof Function?this.props.children({isVisible:this.state.isVisible,visibilityRect:this.state.visibilityRect}):o.a.Children.only(this.props.children)}}])&&p(n.prototype,r),t}(o.a.Component);m(b,\"defaultProps\",{active:!0,partialVisibility:!1,minTopValue:0,scrollCheck:!1,scrollDelay:250,scrollThrottle:-1,resizeCheck:!1,resizeDelay:250,resizeThrottle:-1,intervalCheck:!0,intervalDelay:100,delayedCall:!1,offset:{},containment:null,children:o.a.createElement(\"span\",null)}),m(b,\"propTypes\",{onChange:u.a.func,active:u.a.bool,partialVisibility:u.a.oneOfType([u.a.bool,u.a.oneOf([\"top\",\"right\",\"bottom\",\"left\"])]),delayedCall:u.a.bool,offset:u.a.oneOfType([u.a.shape({top:u.a.number,left:u.a.number,bottom:u.a.number,right:u.a.number}),u.a.shape({direction:u.a.oneOf([\"top\",\"right\",\"bottom\",\"left\"]),value:u.a.number})]),scrollCheck:u.a.bool,scrollDelay:u.a.number,scrollThrottle:u.a.number,resizeCheck:u.a.bool,resizeDelay:u.a.number,resizeThrottle:u.a.number,intervalCheck:u.a.bool,intervalDelay:u.a.number,containment:\"undefined\"!=typeof window?u.a.instanceOf(window.Element):u.a.any,children:u.a.oneOfType([u.a.element,u.a.func]),minTopValue:u.a.number})},function(e,t,n){\"use strict\";var r=n(6);function o(){}function i(){}i.resetWarningCache=o,e.exports=function(){function e(e,t,n,o,i,a){if(a!==r){var l=new Error(\"Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types\");throw l.name=\"Invariant Violation\",l}}function t(){return e}e.isRequired=e;var n={array:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:i,resetWarningCache:o};return n.PropTypes=n,n}},function(e,t,n){\"use strict\";e.exports=\"SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED\"}])},e.exports=r(n(294),n(935))},408:(e,t)=>{\"use strict\";var n=Symbol.for(\"react.element\"),r=Symbol.for(\"react.portal\"),o=Symbol.for(\"react.fragment\"),i=Symbol.for(\"react.strict_mode\"),a=Symbol.for(\"react.profiler\"),l=Symbol.for(\"react.provider\"),u=Symbol.for(\"react.context\"),c=Symbol.for(\"react.forward_ref\"),s=Symbol.for(\"react.suspense\"),f=Symbol.for(\"react.memo\"),p=Symbol.for(\"react.lazy\"),d=Symbol.iterator,y={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},h=Object.assign,m={};function b(e,t,n){this.props=e,this.context=t,this.refs=m,this.updater=n||y}function v(){}function g(e,t,n){this.props=e,this.context=t,this.refs=m,this.updater=n||y}b.prototype.isReactComponent={},b.prototype.setState=function(e,t){if(\"object\"!=typeof e&&\"function\"!=typeof e&&null!=e)throw Error(\"setState(...): takes an object of state variables to update or a function which returns an object of state variables.\");this.updater.enqueueSetState(this,e,t,\"setState\")},b.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,\"forceUpdate\")},v.prototype=b.prototype;var w=g.prototype=new v;w.constructor=g,h(w,b.prototype),w.isPureReactComponent=!0;var S=Array.isArray,O=Object.prototype.hasOwnProperty,E={current:null},k={key:!0,ref:!0,__self:!0,__source:!0};function P(e,t,r){var o,i={},a=null,l=null;if(null!=t)for(o in void 0!==t.ref&&(l=t.ref),void 0!==t.key&&(a=\"\"+t.key),t)O.call(t,o)&&!k.hasOwnProperty(o)&&(i[o]=t[o]);var u=arguments.length-2;if(1===u)i.children=r;else if(1<u){for(var c=Array(u),s=0;s<u;s++)c[s]=arguments[s+2];i.children=c}if(e&&e.defaultProps)for(o in u=e.defaultProps)void 0===i[o]&&(i[o]=u[o]);return{$$typeof:n,type:e,key:a,ref:l,props:i,_owner:E.current}}function x(e){return\"object\"==typeof e&&null!==e&&e.$$typeof===n}var j=/\\/+/g;function C(e,t){return\"object\"==typeof e&&null!==e&&null!=e.key?function(e){var t={\"=\":\"=0\",\":\":\"=2\"};return\"$\"+e.replace(/[=:]/g,(function(e){return t[e]}))}(\"\"+e.key):t.toString(36)}function T(e,t,o,i,a){var l=typeof e;\"undefined\"!==l&&\"boolean\"!==l||(e=null);var u=!1;if(null===e)u=!0;else switch(l){case\"string\":case\"number\":u=!0;break;case\"object\":switch(e.$$typeof){case n:case r:u=!0}}if(u)return a=a(u=e),e=\"\"===i?\".\"+C(u,0):i,S(a)?(o=\"\",null!=e&&(o=e.replace(j,\"$&/\")+\"/\"),T(a,t,o,\"\",(function(e){return e}))):null!=a&&(x(a)&&(a=function(e,t){return{$$typeof:n,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}(a,o+(!a.key||u&&u.key===a.key?\"\":(\"\"+a.key).replace(j,\"$&/\")+\"/\")+e)),t.push(a)),1;if(u=0,i=\"\"===i?\".\":i+\":\",S(e))for(var c=0;c<e.length;c++){var s=i+C(l=e[c],c);u+=T(l,t,o,s,a)}else if(s=function(e){return null===e||\"object\"!=typeof e?null:\"function\"==typeof(e=d&&e[d]||e[\"@@iterator\"])?e:null}(e),\"function\"==typeof s)for(e=s.call(e),c=0;!(l=e.next()).done;)u+=T(l=l.value,t,o,s=i+C(l,c++),a);else if(\"object\"===l)throw t=String(e),Error(\"Objects are not valid as a React child (found: \"+(\"[object Object]\"===t?\"object with keys {\"+Object.keys(e).join(\", \")+\"}\":t)+\"). If you meant to render a collection of children, use an array instead.\");return u}function A(e,t,n){if(null==e)return e;var r=[],o=0;return T(e,r,\"\",\"\",(function(e){return t.call(n,e,o++)})),r}function R(e){if(-1===e._status){var t=e._result;(t=t()).then((function(t){0!==e._status&&-1!==e._status||(e._status=1,e._result=t)}),(function(t){0!==e._status&&-1!==e._status||(e._status=2,e._result=t)})),-1===e._status&&(e._status=0,e._result=t)}if(1===e._status)return e._result.default;throw e._result}var _={current:null},I={transition:null},N={ReactCurrentDispatcher:_,ReactCurrentBatchConfig:I,ReactCurrentOwner:E};t.Children={map:A,forEach:function(e,t,n){A(e,(function(){t.apply(this,arguments)}),n)},count:function(e){var t=0;return A(e,(function(){t++})),t},toArray:function(e){return A(e,(function(e){return e}))||[]},only:function(e){if(!x(e))throw Error(\"React.Children.only expected to receive a single React element child.\");return e}},t.Component=b,t.Fragment=o,t.Profiler=a,t.PureComponent=g,t.StrictMode=i,t.Suspense=s,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=N,t.cloneElement=function(e,t,r){if(null==e)throw Error(\"React.cloneElement(...): The argument must be a React element, but you passed \"+e+\".\");var o=h({},e.props),i=e.key,a=e.ref,l=e._owner;if(null!=t){if(void 0!==t.ref&&(a=t.ref,l=E.current),void 0!==t.key&&(i=\"\"+t.key),e.type&&e.type.defaultProps)var u=e.type.defaultProps;for(c in t)O.call(t,c)&&!k.hasOwnProperty(c)&&(o[c]=void 0===t[c]&&void 0!==u?u[c]:t[c])}var c=arguments.length-2;if(1===c)o.children=r;else if(1<c){u=Array(c);for(var s=0;s<c;s++)u[s]=arguments[s+2];o.children=u}return{$$typeof:n,type:e.type,key:i,ref:a,props:o,_owner:l}},t.createContext=function(e){return(e={$$typeof:u,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null}).Provider={$$typeof:l,_context:e},e.Consumer=e},t.createElement=P,t.createFactory=function(e){var t=P.bind(null,e);return t.type=e,t},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:c,render:e}},t.isValidElement=x,t.lazy=function(e){return{$$typeof:p,_payload:{_status:-1,_result:e},_init:R}},t.memo=function(e,t){return{$$typeof:f,type:e,compare:void 0===t?null:t}},t.startTransition=function(e){var t=I.transition;I.transition={};try{e()}finally{I.transition=t}},t.unstable_act=function(){throw Error(\"act(...) is not supported in production builds of React.\")},t.useCallback=function(e,t){return _.current.useCallback(e,t)},t.useContext=function(e){return _.current.useContext(e)},t.useDebugValue=function(){},t.useDeferredValue=function(e){return _.current.useDeferredValue(e)},t.useEffect=function(e,t){return _.current.useEffect(e,t)},t.useId=function(){return _.current.useId()},t.useImperativeHandle=function(e,t,n){return _.current.useImperativeHandle(e,t,n)},t.useInsertionEffect=function(e,t){return _.current.useInsertionEffect(e,t)},t.useLayoutEffect=function(e,t){return _.current.useLayoutEffect(e,t)},t.useMemo=function(e,t){return _.current.useMemo(e,t)},t.useReducer=function(e,t,n){return _.current.useReducer(e,t,n)},t.useRef=function(e){return _.current.useRef(e)},t.useState=function(e){return _.current.useState(e)},t.useSyncExternalStore=function(e,t,n){return _.current.useSyncExternalStore(e,t,n)},t.useTransition=function(){return _.current.useTransition()},t.version=\"18.2.0\"},294:(e,t,n)=>{\"use strict\";e.exports=n(408)},53:(e,t)=>{\"use strict\";function n(e,t){var n=e.length;e.push(t);e:for(;0<n;){var r=n-1>>>1,o=e[r];if(!(0<i(o,t)))break e;e[r]=t,e[n]=o,n=r}}function r(e){return 0===e.length?null:e[0]}function o(e){if(0===e.length)return null;var t=e[0],n=e.pop();if(n!==t){e[0]=n;e:for(var r=0,o=e.length,a=o>>>1;r<a;){var l=2*(r+1)-1,u=e[l],c=l+1,s=e[c];if(0>i(u,n))c<o&&0>i(s,u)?(e[r]=s,e[c]=n,r=c):(e[r]=u,e[l]=n,r=l);else{if(!(c<o&&0>i(s,n)))break e;e[r]=s,e[c]=n,r=c}}}return t}function i(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}if(\"object\"==typeof performance&&\"function\"==typeof performance.now){var a=performance;t.unstable_now=function(){return a.now()}}else{var l=Date,u=l.now();t.unstable_now=function(){return l.now()-u}}var c=[],s=[],f=1,p=null,d=3,y=!1,h=!1,m=!1,b=\"function\"==typeof setTimeout?setTimeout:null,v=\"function\"==typeof clearTimeout?clearTimeout:null,g=\"undefined\"!=typeof setImmediate?setImmediate:null;function w(e){for(var t=r(s);null!==t;){if(null===t.callback)o(s);else{if(!(t.startTime<=e))break;o(s),t.sortIndex=t.expirationTime,n(c,t)}t=r(s)}}function S(e){if(m=!1,w(e),!h)if(null!==r(c))h=!0,I(O);else{var t=r(s);null!==t&&N(S,t.startTime-e)}}function O(e,n){h=!1,m&&(m=!1,v(x),x=-1),y=!0;var i=d;try{for(w(n),p=r(c);null!==p&&(!(p.expirationTime>n)||e&&!T());){var a=p.callback;if(\"function\"==typeof a){p.callback=null,d=p.priorityLevel;var l=a(p.expirationTime<=n);n=t.unstable_now(),\"function\"==typeof l?p.callback=l:p===r(c)&&o(c),w(n)}else o(c);p=r(c)}if(null!==p)var u=!0;else{var f=r(s);null!==f&&N(S,f.startTime-n),u=!1}return u}finally{p=null,d=i,y=!1}}\"undefined\"!=typeof navigator&&void 0!==navigator.scheduling&&void 0!==navigator.scheduling.isInputPending&&navigator.scheduling.isInputPending.bind(navigator.scheduling);var E,k=!1,P=null,x=-1,j=5,C=-1;function T(){return!(t.unstable_now()-C<j)}function A(){if(null!==P){var e=t.unstable_now();C=e;var n=!0;try{n=P(!0,e)}finally{n?E():(k=!1,P=null)}}else k=!1}if(\"function\"==typeof g)E=function(){g(A)};else if(\"undefined\"!=typeof MessageChannel){var R=new MessageChannel,_=R.port2;R.port1.onmessage=A,E=function(){_.postMessage(null)}}else E=function(){b(A,0)};function I(e){P=e,k||(k=!0,E())}function N(e,n){x=b((function(){e(t.unstable_now())}),n)}t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(e){e.callback=null},t.unstable_continueExecution=function(){h||y||(h=!0,I(O))},t.unstable_forceFrameRate=function(e){0>e||125<e?console.error(\"forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported\"):j=0<e?Math.floor(1e3/e):5},t.unstable_getCurrentPriorityLevel=function(){return d},t.unstable_getFirstCallbackNode=function(){return r(c)},t.unstable_next=function(e){switch(d){case 1:case 2:case 3:var t=3;break;default:t=d}var n=d;d=t;try{return e()}finally{d=n}},t.unstable_pauseExecution=function(){},t.unstable_requestPaint=function(){},t.unstable_runWithPriority=function(e,t){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var n=d;d=e;try{return t()}finally{d=n}},t.unstable_scheduleCallback=function(e,o,i){var a=t.unstable_now();switch(i=\"object\"==typeof i&&null!==i&&\"number\"==typeof(i=i.delay)&&0<i?a+i:a,e){case 1:var l=-1;break;case 2:l=250;break;case 5:l=1073741823;break;case 4:l=1e4;break;default:l=5e3}return e={id:f++,callback:o,priorityLevel:e,startTime:i,expirationTime:l=i+l,sortIndex:-1},i>a?(e.sortIndex=i,n(s,e),null===r(c)&&e===r(s)&&(m?(v(x),x=-1):m=!0,N(S,i-a))):(e.sortIndex=l,n(c,e),h||y||(h=!0,I(O))),e},t.unstable_shouldYield=T,t.unstable_wrapCallback=function(e){var t=d;return function(){var n=d;d=t;try{return e.apply(this,arguments)}finally{d=n}}}},840:(e,t,n)=>{\"use strict\";e.exports=n(53)},774:e=>{e.exports=function(e,t,n,r){var o=n?n.call(r,e,t):void 0;if(void 0!==o)return!!o;if(e===t)return!0;if(\"object\"!=typeof e||!e||\"object\"!=typeof t||!t)return!1;var i=Object.keys(e),a=Object.keys(t);if(i.length!==a.length)return!1;for(var l=Object.prototype.hasOwnProperty.bind(t),u=0;u<i.length;u++){var c=i[u];if(!l(c))return!1;var s=e[c],f=t[c];if(!1===(o=n?n.call(r,s,f,c):void 0)||void 0===o&&s!==f)return!1}return!0}},771:(e,t,n)=>{\"use strict\";var r=n(294),o=\"function\"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t},i=r.useSyncExternalStore,a=r.useRef,l=r.useEffect,u=r.useMemo,c=r.useDebugValue;t.useSyncExternalStoreWithSelector=function(e,t,n,r,s){var f=a(null);if(null===f.current){var p={hasValue:!1,value:null};f.current=p}else p=f.current;f=u((function(){function e(e){if(!l){if(l=!0,i=e,e=r(e),void 0!==s&&p.hasValue){var t=p.value;if(s(t,e))return a=t}return a=e}if(t=a,o(i,e))return t;var n=r(e);return void 0!==s&&s(t,n)?t:(i=e,a=n)}var i,a,l=!1,u=void 0===n?null:n;return[function(){return e(t())},null===u?void 0:function(){return e(u())}]}),[t,n,r,s]);var d=i(e,f[0],f[1]);return l((function(){p.hasValue=!0,p.value=d}),[d]),c(d),d}},103:(e,t,n)=>{\"use strict\";e.exports=n(771)},473:e=>{\"use strict\";e.exports=function(){}}},r={};function o(e){var t=r[e];if(void 0!==t)return t.exports;var i=r[e]={exports:{}};return n[e].call(i.exports,i,i.exports,o),i.exports}o.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return o.d(t,{a:t}),t},t=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,o.t=function(n,r){if(1&r&&(n=this(n)),8&r)return n;if(\"object\"==typeof n&&n){if(4&r&&n.__esModule)return n;if(16&r&&\"function\"==typeof n.then)return n}var i=Object.create(null);o.r(i);var a={};e=e||[null,t({}),t([]),t(t)];for(var l=2&r&&n;\"object\"==typeof l&&!~e.indexOf(l);l=t(l))Object.getOwnPropertyNames(l).forEach((e=>a[e]=()=>n[e]));return a.default=()=>n,o.d(i,a),i},o.d=(e,t)=>{for(var n in t)o.o(t,n)&&!o.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},o.g=function(){if(\"object\"==typeof globalThis)return globalThis;try{return this||new Function(\"return this\")()}catch(e){if(\"object\"==typeof window)return window}}(),o.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),o.r=e=>{\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},o.nc=void 0,(()=>{\"use strict\";var e=o(294),t=o(935),n=o(103),r=e,i=Symbol.for(\"react-redux-context\"),a=\"undefined\"!=typeof globalThis?globalThis:{};function l(){if(!r.createContext)return{};const e=a[i]??(a[i]=new Map);let t=e.get(r.createContext);return t||(t=r.createContext(null),e.set(r.createContext,t)),t}var u=l(),c=Symbol.for(\"react.element\"),s=Symbol.for(\"react.portal\"),f=Symbol.for(\"react.fragment\"),p=Symbol.for(\"react.strict_mode\"),d=Symbol.for(\"react.profiler\"),y=Symbol.for(\"react.provider\"),h=Symbol.for(\"react.context\"),m=Symbol.for(\"react.server_context\"),b=Symbol.for(\"react.forward_ref\"),v=Symbol.for(\"react.suspense\"),g=Symbol.for(\"react.suspense_list\"),w=Symbol.for(\"react.memo\"),S=Symbol.for(\"react.lazy\"),O=(Symbol.for(\"react.offscreen\"),Symbol.for(\"react.client.reference\"),b),E=w;function k(e,t,n,r,{areStatesEqual:o,areOwnPropsEqual:i,areStatePropsEqual:a}){let l,u,c,s,f,p=!1;return function(d,y){return p?function(p,d){const y=!i(d,u),h=!o(p,l,d,u);return l=p,u=d,y&&h?(c=e(l,u),t.dependsOnOwnProps&&(s=t(r,u)),f=n(c,s,u),f):y?(e.dependsOnOwnProps&&(c=e(l,u)),t.dependsOnOwnProps&&(s=t(r,u)),f=n(c,s,u),f):h?function(){const t=e(l,u),r=!a(t,c);return c=t,r&&(f=n(c,s,u)),f}():f}(d,y):(l=d,u=y,c=e(l,u),s=t(r,u),f=n(c,s,u),p=!0,f)}}function P(e){return function(t){const n=e(t);function r(){return n}return r.dependsOnOwnProps=!1,r}}function x(e){return e.dependsOnOwnProps?Boolean(e.dependsOnOwnProps):1!==e.length}function j(e,t){return function(t,{displayName:n}){const r=function(e,t){return r.dependsOnOwnProps?r.mapToProps(e,t):r.mapToProps(e,void 0)};return r.dependsOnOwnProps=!0,r.mapToProps=function(t,n){r.mapToProps=e,r.dependsOnOwnProps=x(e);let o=r(t,n);return\"function\"==typeof o&&(r.mapToProps=o,r.dependsOnOwnProps=x(o),o=r(t,n)),o},r}}function C(e,t){return(n,r)=>{throw new Error(`Invalid value of type ${typeof e} for ${t} argument when connecting component ${r.wrappedComponentName}.`)}}function T(e,t,n){return{...n,...e,...t}}var A={notify(){},get:()=>[]};function R(e,t){let n,r=A,o=0,i=!1;function a(){c.onStateChange&&c.onStateChange()}function l(){o++,n||(n=t?t.addNestedSub(a):e.subscribe(a),r=function(){let e=null,t=null;return{clear(){e=null,t=null},notify(){(()=>{let t=e;for(;t;)t.callback(),t=t.next})()},get(){let t=[],n=e;for(;n;)t.push(n),n=n.next;return t},subscribe(n){let r=!0,o=t={callback:n,next:null,prev:t};return o.prev?o.prev.next=o:e=o,function(){r&&null!==e&&(r=!1,o.next?o.next.prev=o.prev:t=o.prev,o.prev?o.prev.next=o.next:e=o.next)}}}}())}function u(){o--,n&&0===o&&(n(),n=void 0,r.clear(),r=A)}const c={addNestedSub:function(e){l();const t=r.subscribe(e);let n=!1;return()=>{n||(n=!0,t(),u())}},notifyNestedSubs:function(){r.notify()},handleChangeWrapper:a,isSubscribed:function(){return i},trySubscribe:function(){i||(i=!0,l())},tryUnsubscribe:function(){i&&(i=!1,u())},getListeners:()=>r};return c}var _=\"undefined\"!=typeof window&&void 0!==window.document&&void 0!==window.document.createElement?r.useLayoutEffect:r.useEffect;function I(e,t){return e===t?0!==e||0!==t||1/e==1/t:e!=e&&t!=t}function N(e,t){if(I(e,t))return!0;if(\"object\"!=typeof e||null===e||\"object\"!=typeof t||null===t)return!1;const n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(let r=0;r<n.length;r++)if(!Object.prototype.hasOwnProperty.call(t,n[r])||!I(e[n[r]],t[n[r]]))return!1;return!0}var M={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},D={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},L={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},z={[O]:{$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},[E]:L};function B(e){return function(e){if(\"object\"==typeof e&&null!==e){const t=e.$$typeof;switch(t){case c:{const n=e.type;switch(n){case f:case d:case p:case v:case g:return n;default:{const e=n&&n.$$typeof;switch(e){case m:case h:case b:case S:case w:case y:return e;default:return t}}}}case s:return t}}}(e)===w?L:z[e.$$typeof]||M}var F=Object.defineProperty,U=Object.getOwnPropertyNames,W=Object.getOwnPropertySymbols,H=Object.getOwnPropertyDescriptor,V=Object.getPrototypeOf,G=Object.prototype;function q(e,t){if(\"string\"!=typeof t){if(G){const n=V(t);n&&n!==G&&q(e,n)}let n=U(t);W&&(n=n.concat(W(t)));const r=B(e),o=B(t);for(let i=0;i<n.length;++i){const a=n[i];if(!(D[a]||o&&o[a]||r&&r[a])){const n=H(t,a);try{F(e,a,n)}catch(e){}}}}return e}var Q=()=>{throw new Error(\"uSES not initialized!\")},Y=[null,null];function Z(e,t,n,r,o,i){e.current=r,n.current=!1,o.current&&(o.current=null,i())}function J(e,t){return e===t}var X=function(e,t,n,{pure:o,areStatesEqual:i=J,areOwnPropsEqual:a=N,areStatePropsEqual:l=N,areMergedPropsEqual:c=N,forwardRef:s=!1,context:f=u}={}){const p=f,d=function(e){return e?\"function\"==typeof e?j(e):C(e,\"mapStateToProps\"):P((()=>({})))}(e),y=function(e){return e&&\"object\"==typeof e?P((t=>function(e,t){const n={};for(const r in e){const o=e[r];\"function\"==typeof o&&(n[r]=(...e)=>t(o(...e)))}return n}(e,t))):e?\"function\"==typeof e?j(e):C(e,\"mapDispatchToProps\"):P((e=>({dispatch:e})))}(t),h=function(e){return e?\"function\"==typeof e?function(e){return function(t,{displayName:n,areMergedPropsEqual:r}){let o,i=!1;return function(t,n,a){const l=e(t,n,a);return i?r(l,o)||(o=l):(i=!0,o=l),o}}}(e):C(e,\"mergeProps\"):()=>T}(n),m=Boolean(e);return e=>{const t=e.displayName||e.name||\"Component\",n=`Connect(${t})`,o={shouldHandleStateChanges:m,displayName:n,wrappedComponentName:t,WrappedComponent:e,initMapStateToProps:d,initMapDispatchToProps:y,initMergeProps:h,areStatesEqual:i,areStatePropsEqual:l,areOwnPropsEqual:a,areMergedPropsEqual:c};function u(t){const[n,i,a]=r.useMemo((()=>{const{reactReduxForwardedRef:e,...n}=t;return[t.context,e,n]}),[t]),l=r.useMemo((()=>p),[n,p]),u=r.useContext(l),c=Boolean(t.store)&&Boolean(t.store.getState)&&Boolean(t.store.dispatch),s=Boolean(u)&&Boolean(u.store),f=c?t.store:u.store,d=s?u.getServerState:f.getState,y=r.useMemo((()=>function(e,{initMapStateToProps:t,initMapDispatchToProps:n,initMergeProps:r,...o}){return k(t(e,o),n(e,o),r(e,o),e,o)}(f.dispatch,o)),[f]),[h,b]=r.useMemo((()=>{if(!m)return Y;const e=R(f,c?void 0:u.subscription),t=e.notifyNestedSubs.bind(e);return[e,t]}),[f,c,u]),v=r.useMemo((()=>c?u:{...u,subscription:h}),[c,u,h]),g=r.useRef(),w=r.useRef(a),S=r.useRef(),O=r.useRef(!1),E=(r.useRef(!1),r.useRef(!1)),P=r.useRef();_((()=>(E.current=!0,()=>{E.current=!1})),[]);const x=r.useMemo((()=>()=>S.current&&a===w.current?S.current:y(f.getState(),a)),[f,a]),j=r.useMemo((()=>e=>h?function(e,t,n,r,o,i,a,l,u,c,s){if(!e)return()=>{};let f=!1,p=null;const d=()=>{if(f||!l.current)return;const e=t.getState();let n,d;try{n=r(e,o.current)}catch(e){d=e,p=e}d||(p=null),n===i.current?a.current||c():(i.current=n,u.current=n,a.current=!0,s())};return n.onStateChange=d,n.trySubscribe(),d(),()=>{if(f=!0,n.tryUnsubscribe(),n.onStateChange=null,p)throw p}}(m,f,h,y,w,g,O,E,S,b,e):()=>{}),[h]);var C,T;let A;C=Z,T=[w,g,O,a,S,b],_((()=>C(...T)),undefined);try{A=Q(j,x,d?()=>y(d(),a):x)}catch(e){throw P.current&&(e.message+=`\\nThe error may be correlated with this previous error:\\n${P.current.stack}\\n\\n`),e}_((()=>{P.current=void 0,S.current=void 0,g.current=A}));const I=r.useMemo((()=>r.createElement(e,{...A,ref:i})),[i,e,A]);return r.useMemo((()=>m?r.createElement(l.Provider,{value:v},I):I),[l,I,v])}const f=r.memo(u);if(f.WrappedComponent=e,f.displayName=u.displayName=n,s){const t=r.forwardRef((function(e,t){return r.createElement(f,{...e,reactReduxForwardedRef:t})}));return t.displayName=n,t.WrappedComponent=e,q(t,e)}return q(f,e)}},K=function({store:e,context:t,children:n,serverState:o,stabilityCheck:i=\"once\",identityFunctionCheck:a=\"once\"}){const l=r.useMemo((()=>{const t=R(e);return{store:e,subscription:t,getServerState:o?()=>o:void 0,stabilityCheck:i,identityFunctionCheck:a}}),[e,o,i,a]),c=r.useMemo((()=>e.getState()),[e]);_((()=>{const{subscription:t}=l;return t.onStateChange=t.notifyNestedSubs,t.trySubscribe(),c!==e.getState()&&t.notifyNestedSubs(),()=>{t.tryUnsubscribe(),t.onStateChange=void 0}}),[l,c]);const s=t||u;return r.createElement(s.Provider,{value:l},n)};function $(e){return`Minified Redux error #${e}; visit https://redux.js.org/Errors?code=${e} for the full message or use the non-minified dev environment for full errors. `}n.useSyncExternalStoreWithSelector,(e=>{Q=e})(e.useSyncExternalStore);var ee=(()=>\"function\"==typeof Symbol&&Symbol.observable||\"@@observable\")(),te=()=>Math.random().toString(36).substring(7).split(\"\").join(\".\"),ne={INIT:`@@redux/INIT${te()}`,REPLACE:`@@redux/REPLACE${te()}`,PROBE_UNKNOWN_ACTION:()=>`@@redux/PROBE_UNKNOWN_ACTION${te()}`};function re(e){return re=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},re(e)}function oe(e){switch(e){case\"refImage\":return 100;case\"testImage\":case\"diffImage\":return 0;default:return 50}}function ie(e){switch(e){case\"refImage\":return\"SHOW_SCRUBBER_REF_IMAGE\";case\"testImage\":return\"SHOW_SCRUBBER_TEST_IMAGE\";case\"diffImage\":return\"SHOW_SCRUBBER_DIFF_IMAGE\";default:return\"SCRUB\"}}var ae=function(e){const t=Object.keys(e),n={};for(let r=0;r<t.length;r++){const o=t[r];\"function\"==typeof e[o]&&(n[o]=e[o])}const r=Object.keys(n);let o;try{!function(e){Object.keys(e).forEach((t=>{const n=e[t];if(void 0===n(void 0,{type:ne.INIT}))throw new Error($(12));if(void 0===n(void 0,{type:ne.PROBE_UNKNOWN_ACTION()}))throw new Error($(13))}))}(n)}catch(e){o=e}return function(e={},t){if(o)throw o;let i=!1;const a={};for(let o=0;o<r.length;o++){const l=r[o],u=n[l],c=e[l],s=u(c,t);if(void 0===s)throw t&&t.type,new Error($(14));a[l]=s,i=i||s!==c}return i=i||r.length!==Object.keys(e).length,i?a:e}}({suiteInfo:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1?arguments[1]:void 0;return\"SET_VISIBILITY_FILTER\"===t.type?t.filter:e},tests:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1?arguments[1]:void 0;switch(t.type){case\"APPROVE_TEST\":return Object.assign({},e,{all:e.all.map((function(e){return e.pair&&e.pair.fileName===t.id?Object.assign({},e,{status:\"pass\"}):e}))});case\"FILTER_TESTS\":return\"all\"!==t.status?Object.assign({},e,{filtered:e.all.filter((function(e){return e.status===t.status})),filterStatus:t.status}):Object.assign({},e,{filtered:e.all,filterStatus:t.status});case\"SEARCH_TESTS\":return t.value.length>0?Object.assign({},e,{filtered:e.all.filter((function(n){var r=n.pair.fileName.toLowerCase(),o=n.pair.label.toLowerCase();if(\"all\"!==e.filterStatus){if(n.status===e.filterStatus&&(-1!==o.indexOf(t.value.toLowerCase())||-1!==r.indexOf(t.value.toLowerCase())))return!0}else if(-1!==o.indexOf(t.value.toLowerCase())||-1!==r.indexOf(t.value.toLowerCase()))return!0;return!1}))}):e;default:return e}},scrubber:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1?arguments[1]:void 0,n=\"\";switch(t.type){case\"OPEN_SCRUBBER_MODAL\":try{n=t.value.targetImg.id}catch(e){}return Object.assign({},e,{position:oe(n),visible:!0,test:t.value,testImageType:n,scrubberModalMode:ie(n)});case\"CLOSE_SCRUBBER_MODAL\":return Object.assign({},e,{visible:!1,test:{}});case\"SHOW_SCRUBBER_TEST_IMAGE\":return Object.assign({},e,{position:oe(\"testImage\"),scrubberModalMode:t.type,testImageType:\"testImage\"});case\"SHOW_SCRUBBER_REF_IMAGE\":return Object.assign({},e,{position:oe(\"refImage\"),scrubberModalMode:t.type});case\"SHOW_SCRUBBER_DIFF_IMAGE\":return Object.assign({},e,{position:oe(\"diffImage\"),scrubberModalMode:t.type,testImageType:\"diffImage\"});case\"SHOW_SCRUBBER_DIVERGED_IMAGE\":return Object.assign({},e,{position:oe(\"diffImage\"),scrubberModalMode:t.type,testImageType:\"divergedImage\",test:Object.assign({},e.test,{divergedImage:t.value})});case\"SHOW_SCRUBBER\":return Object.assign({},e,{position:oe(),scrubberModalMode:\"SCRUB\",testImageType:\"testImage\"});default:return e}},logs:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1?arguments[1]:void 0;switch(t.type){case\"OPEN_LOG_MODAL\":return Object.assign({},e,{visible:!0,logs:t.value});case\"CLOSE_LOG_MODAL\":return Object.assign({},e,{visible:!1});default:return e}},layoutSettings:function(){var e,t,n,r,o=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},i=arguments.length>1?arguments[1]:void 0;switch(i.type){case\"UPDATE_SETTINGS\":return Object.assign({},o,(e={},t=i.id,n=!o[i.id],r=function(e,t){if(\"object\"!=re(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,\"string\");if(\"object\"!=re(r))return r;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return String(e)}(t),(t=\"symbol\"==re(r)?r:String(r))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e));case\"TOGGLE_ALL_IMAGES\":return Object.assign({},o,{refImage:i.value,testImage:i.value,diffImage:i.value});default:return o}}});const le=ae;function ue(e){return ue=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},ue(e)}function ce(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function se(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?ce(Object(n),!0).forEach((function(t){var r,o,i;r=e,o=t,i=n[t],(o=function(e){var t=function(e,t){if(\"object\"!=ue(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,\"string\");if(\"object\"!=ue(r))return r;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return String(e)}(e);return\"symbol\"==ue(t)?t:String(t)}(o))in r?Object.defineProperty(r,o,{value:i,enumerable:!0,configurable:!0,writable:!0}):r[o]=i})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):ce(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}var fe=localStorage.getItem(\"backstopjs\"),pe=!!fe&&function(e){var t;try{t=JSON.parse(e)}catch(e){console.error(e),console.warn(\"BackstopJS LocalStorage settings appear to be corrupted. Let me fix that for you.\"),localStorage.removeItem(\"backstopjs\"),t=!1}return t}(fe),de={suiteInfo:{testSuiteName:window.tests.testSuite,idConfig:window.tests.id},tests:{all:window.tests.tests,filtered:window.tests.tests,filterStatus:\"all\"},scrubber:{visible:!1,mode:\"scrub\",test:{}},layoutSettings:{textInfo:!1,refImage:!0,testImage:!0,diffImage:!0}},ye=function e(t,n,r){if(\"function\"!=typeof t)throw new Error($(2));if(\"function\"==typeof n&&\"function\"==typeof r||\"function\"==typeof r&&\"function\"==typeof arguments[3])throw new Error($(0));if(\"function\"==typeof n&&void 0===r&&(r=n,n=void 0),void 0!==r){if(\"function\"!=typeof r)throw new Error($(1));return r(e)(t,n)}let o=t,i=n,a=new Map,l=a,u=0,c=!1;function s(){l===a&&(l=new Map,a.forEach(((e,t)=>{l.set(t,e)})))}function f(){if(c)throw new Error($(3));return i}function p(e){if(\"function\"!=typeof e)throw new Error($(4));if(c)throw new Error($(5));let t=!0;s();const n=u++;return l.set(n,e),function(){if(t){if(c)throw new Error($(6));t=!1,s(),l.delete(n),a=null}}}function d(e){if(!function(e){if(\"object\"!=typeof e||null===e)return!1;let t=e;for(;null!==Object.getPrototypeOf(t);)t=Object.getPrototypeOf(t);return Object.getPrototypeOf(e)===t}(e))throw new Error($(7));if(void 0===e.type)throw new Error($(8));if(\"string\"!=typeof e.type)throw new Error($(17));if(c)throw new Error($(9));try{c=!0,i=o(i,e)}finally{c=!1}return(a=l).forEach((e=>{e()})),e}return d({type:ne.INIT}),{dispatch:d,subscribe:p,getState:f,replaceReducer:function(e){if(\"function\"!=typeof e)throw new Error($(10));o=e,d({type:ne.REPLACE})},[ee]:function(){const e=p;return{subscribe(t){if(\"object\"!=typeof t||null===t)throw new Error($(11));function n(){const e=t;e.next&&e.next(f())}return n(),{unsubscribe:e(n)}},[ee](){return this}}}}}(le,pe?se(se({},de),pe):de,window.__REDUX_DEVTOOLS_EXTENSION__&&window.__REDUX_DEVTOOLS_EXTENSION__());ye.subscribe((function(){var e=ye.getState().layoutSettings,t=JSON.stringify({layoutSettings:e});localStorage.setItem(\"backstopjs\",t)}));const he=ye;var me=function(){return me=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},me.apply(this,arguments)};function be(e,t,n){if(n||2===arguments.length)for(var r,o=0,i=t.length;o<i;o++)!r&&o in t||(r||(r=Array.prototype.slice.call(t,0,o)),r[o]=t[o]);return e.concat(r||Array.prototype.slice.call(t))}Object.create,Object.create;var ve=o(774),ge=o.n(ve),we=\"-ms-\",Se=\"-moz-\",Oe=\"-webkit-\",Ee=\"comm\",ke=\"rule\",Pe=\"decl\",xe=\"@import\",je=\"@keyframes\",Ce=\"@layer\",Te=Math.abs,Ae=String.fromCharCode,Re=Object.assign;function _e(e){return e.trim()}function Ie(e,t){return(e=t.exec(e))?e[0]:e}function Ne(e,t,n){return e.replace(t,n)}function Me(e,t){return e.indexOf(t)}function De(e,t){return 0|e.charCodeAt(t)}function Le(e,t,n){return e.slice(t,n)}function ze(e){return e.length}function Be(e){return e.length}function Fe(e,t){return t.push(e),e}function Ue(e,t){return e.filter((function(e){return!Ie(e,t)}))}var We=1,He=1,Ve=0,Ge=0,qe=0,Qe=\"\";function Ye(e,t,n,r,o,i,a,l){return{value:e,root:t,parent:n,type:r,props:o,children:i,line:We,column:He,length:a,return:\"\",siblings:l}}function Ze(e,t){return Re(Ye(\"\",null,null,\"\",null,null,0,e.siblings),e,{length:-e.length},t)}function Je(e){for(;e.root;)e=Ze(e.root,{children:[e]});Fe(e,e.siblings)}function Xe(){return qe=Ge>0?De(Qe,--Ge):0,He--,10===qe&&(He=1,We--),qe}function Ke(){return qe=Ge<Ve?De(Qe,Ge++):0,He++,10===qe&&(He=1,We++),qe}function $e(){return De(Qe,Ge)}function et(){return Ge}function tt(e,t){return Le(Qe,e,t)}function nt(e){switch(e){case 0:case 9:case 10:case 13:case 32:return 5;case 33:case 43:case 44:case 47:case 62:case 64:case 126:case 59:case 123:case 125:return 4;case 58:return 3;case 34:case 39:case 40:case 91:return 2;case 41:case 93:return 1}return 0}function rt(e){return _e(tt(Ge-1,at(91===e?e+2:40===e?e+1:e)))}function ot(e){for(;(qe=$e())&&qe<33;)Ke();return nt(e)>2||nt(qe)>3?\"\":\" \"}function it(e,t){for(;--t&&Ke()&&!(qe<48||qe>102||qe>57&&qe<65||qe>70&&qe<97););return tt(e,et()+(t<6&&32==$e()&&32==Ke()))}function at(e){for(;Ke();)switch(qe){case e:return Ge;case 34:case 39:34!==e&&39!==e&&at(qe);break;case 40:41===e&&at(e);break;case 92:Ke()}return Ge}function lt(e,t){for(;Ke()&&e+qe!==57&&(e+qe!==84||47!==$e()););return\"/*\"+tt(t,Ge-1)+\"*\"+Ae(47===e?e:Ke())}function ut(e){for(;!nt($e());)Ke();return tt(e,Ge)}function ct(e,t){for(var n=\"\",r=0;r<e.length;r++)n+=t(e[r],r,e,t)||\"\";return n}function st(e,t,n,r){switch(e.type){case Ce:if(e.children.length)break;case xe:case Pe:return e.return=e.return||e.value;case Ee:return\"\";case je:return e.return=e.value+\"{\"+ct(e.children,r)+\"}\";case ke:if(!ze(e.value=e.props.join(\",\")))return\"\"}return ze(n=ct(e.children,r))?e.return=e.value+\"{\"+n+\"}\":\"\"}function ft(e,t,n){switch(function(e,t){return 45^De(e,0)?(((t<<2^De(e,0))<<2^De(e,1))<<2^De(e,2))<<2^De(e,3):0}(e,t)){case 5103:return Oe+\"print-\"+e+e;case 5737:case 4201:case 3177:case 3433:case 1641:case 4457:case 2921:case 5572:case 6356:case 5844:case 3191:case 6645:case 3005:case 6391:case 5879:case 5623:case 6135:case 4599:case 4855:case 4215:case 6389:case 5109:case 5365:case 5621:case 3829:return Oe+e+e;case 4789:return Se+e+e;case 5349:case 4246:case 4810:case 6968:case 2756:return Oe+e+Se+e+we+e+e;case 5936:switch(De(e,t+11)){case 114:return Oe+e+we+Ne(e,/[svh]\\w+-[tblr]{2}/,\"tb\")+e;case 108:return Oe+e+we+Ne(e,/[svh]\\w+-[tblr]{2}/,\"tb-rl\")+e;case 45:return Oe+e+we+Ne(e,/[svh]\\w+-[tblr]{2}/,\"lr\")+e}case 6828:case 4268:case 2903:return Oe+e+we+e+e;case 6165:return Oe+e+we+\"flex-\"+e+e;case 5187:return Oe+e+Ne(e,/(\\w+).+(:[^]+)/,Oe+\"box-$1$2\"+we+\"flex-$1$2\")+e;case 5443:return Oe+e+we+\"flex-item-\"+Ne(e,/flex-|-self/g,\"\")+(Ie(e,/flex-|baseline/)?\"\":we+\"grid-row-\"+Ne(e,/flex-|-self/g,\"\"))+e;case 4675:return Oe+e+we+\"flex-line-pack\"+Ne(e,/align-content|flex-|-self/g,\"\")+e;case 5548:return Oe+e+we+Ne(e,\"shrink\",\"negative\")+e;case 5292:return Oe+e+we+Ne(e,\"basis\",\"preferred-size\")+e;case 6060:return Oe+\"box-\"+Ne(e,\"-grow\",\"\")+Oe+e+we+Ne(e,\"grow\",\"positive\")+e;case 4554:return Oe+Ne(e,/([^-])(transform)/g,\"$1\"+Oe+\"$2\")+e;case 6187:return Ne(Ne(Ne(e,/(zoom-|grab)/,Oe+\"$1\"),/(image-set)/,Oe+\"$1\"),e,\"\")+e;case 5495:case 3959:return Ne(e,/(image-set\\([^]*)/,Oe+\"$1$`$1\");case 4968:return Ne(Ne(e,/(.+:)(flex-)?(.*)/,Oe+\"box-pack:$3\"+we+\"flex-pack:$3\"),/s.+-b[^;]+/,\"justify\")+Oe+e+e;case 4200:if(!Ie(e,/flex-|baseline/))return we+\"grid-column-align\"+Le(e,t)+e;break;case 2592:case 3360:return we+Ne(e,\"template-\",\"\")+e;case 4384:case 3616:return n&&n.some((function(e,n){return t=n,Ie(e.props,/grid-\\w+-end/)}))?~Me(e+(n=n[t].value),\"span\")?e:we+Ne(e,\"-start\",\"\")+e+we+\"grid-row-span:\"+(~Me(n,\"span\")?Ie(n,/\\d+/):+Ie(n,/\\d+/)-+Ie(e,/\\d+/))+\";\":we+Ne(e,\"-start\",\"\")+e;case 4896:case 4128:return n&&n.some((function(e){return Ie(e.props,/grid-\\w+-start/)}))?e:we+Ne(Ne(e,\"-end\",\"-span\"),\"span \",\"\")+e;case 4095:case 3583:case 4068:case 2532:return Ne(e,/(.+)-inline(.+)/,Oe+\"$1$2\")+e;case 8116:case 7059:case 5753:case 5535:case 5445:case 5701:case 4933:case 4677:case 5533:case 5789:case 5021:case 4765:if(ze(e)-1-t>6)switch(De(e,t+1)){case 109:if(45!==De(e,t+4))break;case 102:return Ne(e,/(.+:)(.+)-([^]+)/,\"$1\"+Oe+\"$2-$3$1\"+Se+(108==De(e,t+3)?\"$3\":\"$2-$3\"))+e;case 115:return~Me(e,\"stretch\")?ft(Ne(e,\"stretch\",\"fill-available\"),t,n)+e:e}break;case 5152:case 5920:return Ne(e,/(.+?):(\\d+)(\\s*\\/\\s*(span)?\\s*(\\d+))?(.*)/,(function(t,n,r,o,i,a,l){return we+n+\":\"+r+l+(o?we+n+\"-span:\"+(i?a:+a-+r)+l:\"\")+e}));case 4949:if(121===De(e,t+6))return Ne(e,\":\",\":\"+Oe)+e;break;case 6444:switch(De(e,45===De(e,14)?18:11)){case 120:return Ne(e,/(.+:)([^;\\s!]+)(;|(\\s+)?!.+)?/,\"$1\"+Oe+(45===De(e,14)?\"inline-\":\"\")+\"box$3$1\"+Oe+\"$2$3$1\"+we+\"$2box$3\")+e;case 100:return Ne(e,\":\",\":\"+we)+e}break;case 5719:case 2647:case 2135:case 3927:case 2391:return Ne(e,\"scroll-\",\"scroll-snap-\")+e}return e}function pt(e,t,n,r){if(e.length>-1&&!e.return)switch(e.type){case Pe:return void(e.return=ft(e.value,e.length,n));case je:return ct([Ze(e,{value:Ne(e.value,\"@\",\"@\"+Oe)})],r);case ke:if(e.length)return function(e,t){return e.map(t).join(\"\")}(n=e.props,(function(t){switch(Ie(t,r=/(::plac\\w+|:read-\\w+)/)){case\":read-only\":case\":read-write\":Je(Ze(e,{props:[Ne(t,/:(read-\\w+)/,\":\"+Se+\"$1\")]})),Je(Ze(e,{props:[t]})),Re(e,{props:Ue(n,r)});break;case\"::placeholder\":Je(Ze(e,{props:[Ne(t,/:(plac\\w+)/,\":\"+Oe+\"input-$1\")]})),Je(Ze(e,{props:[Ne(t,/:(plac\\w+)/,\":\"+Se+\"$1\")]})),Je(Ze(e,{props:[Ne(t,/:(plac\\w+)/,we+\"input-$1\")]})),Je(Ze(e,{props:[t]})),Re(e,{props:Ue(n,r)})}return\"\"}))}}function dt(e){return function(e){return Qe=\"\",e}(yt(\"\",null,null,null,[\"\"],e=function(e){return We=He=1,Ve=ze(Qe=e),Ge=0,[]}(e),0,[0],e))}function yt(e,t,n,r,o,i,a,l,u){for(var c=0,s=0,f=a,p=0,d=0,y=0,h=1,m=1,b=1,v=0,g=\"\",w=o,S=i,O=r,E=g;m;)switch(y=v,v=Ke()){case 40:if(108!=y&&58==De(E,f-1)){-1!=Me(E+=Ne(rt(v),\"&\",\"&\\f\"),\"&\\f\")&&(b=-1);break}case 34:case 39:case 91:E+=rt(v);break;case 9:case 10:case 13:case 32:E+=ot(y);break;case 92:E+=it(et()-1,7);continue;case 47:switch($e()){case 42:case 47:Fe(mt(lt(Ke(),et()),t,n,u),u);break;default:E+=\"/\"}break;case 123*h:l[c++]=ze(E)*b;case 125*h:case 59:case 0:switch(v){case 0:case 125:m=0;case 59+s:-1==b&&(E=Ne(E,/\\f/g,\"\")),d>0&&ze(E)-f&&Fe(d>32?bt(E+\";\",r,n,f-1,u):bt(Ne(E,\" \",\"\")+\";\",r,n,f-2,u),u);break;case 59:E+=\";\";default:if(Fe(O=ht(E,t,n,c,s,o,l,g,w=[],S=[],f,i),i),123===v)if(0===s)yt(E,t,O,O,w,i,f,l,S);else switch(99===p&&110===De(E,3)?100:p){case 100:case 108:case 109:case 115:yt(e,O,O,r&&Fe(ht(e,O,O,0,0,o,l,g,o,w=[],f,S),S),o,S,f,l,r?w:S);break;default:yt(E,O,O,O,[\"\"],S,0,l,S)}}c=s=d=0,h=b=1,g=E=\"\",f=a;break;case 58:f=1+ze(E),d=y;default:if(h<1)if(123==v)--h;else if(125==v&&0==h++&&125==Xe())continue;switch(E+=Ae(v),v*h){case 38:b=s>0?1:(E+=\"\\f\",-1);break;case 44:l[c++]=(ze(E)-1)*b,b=1;break;case 64:45===$e()&&(E+=rt(Ke())),p=$e(),s=f=ze(g=E+=ut(et())),v++;break;case 45:45===y&&2==ze(E)&&(h=0)}}return i}function ht(e,t,n,r,o,i,a,l,u,c,s,f){for(var p=o-1,d=0===o?i:[\"\"],y=Be(d),h=0,m=0,b=0;h<r;++h)for(var v=0,g=Le(e,p+1,p=Te(m=a[h])),w=e;v<y;++v)(w=_e(m>0?d[v]+\" \"+g:Ne(g,/&\\f/g,d[v])))&&(u[b++]=w);return Ye(e,t,n,0===o?ke:l,u,c,s,f)}function mt(e,t,n,r){return Ye(e,t,n,Ee,Ae(qe),Le(e,2,-2),0,r)}function bt(e,t,n,r,o){return Ye(e,t,n,Pe,Le(e,0,r),Le(e,r+1,-1),r,o)}const vt={animationIterationCount:1,borderImageOutset:1,borderImageSlice:1,borderImageWidth:1,boxFlex:1,boxFlexGroup:1,boxOrdinalGroup:1,columnCount:1,columns:1,flex:1,flexGrow:1,flexPositive:1,flexShrink:1,flexNegative:1,flexOrder:1,gridRow:1,gridRowEnd:1,gridRowSpan:1,gridRowStart:1,gridColumn:1,gridColumnEnd:1,gridColumnSpan:1,gridColumnStart:1,msGridRow:1,msGridRowSpan:1,msGridColumn:1,msGridColumnSpan:1,fontWeight:1,lineHeight:1,opacity:1,order:1,orphans:1,tabSize:1,widows:1,zIndex:1,zoom:1,WebkitLineClamp:1,fillOpacity:1,floodOpacity:1,stopOpacity:1,strokeDasharray:1,strokeDashoffset:1,strokeMiterlimit:1,strokeOpacity:1,strokeWidth:1};var gt=\"undefined\"!=typeof process&&void 0!==process.env&&(process.env.REACT_APP_SC_ATTR||process.env.SC_ATTR)||\"data-styled\",wt=\"active\",St=\"data-styled-version\",Ot=\"6.1.3\",Et=\"/*!sc*/\\n\",kt=\"undefined\"!=typeof window&&\"HTMLElement\"in window,Pt=Boolean(\"boolean\"==typeof SC_DISABLE_SPEEDY?SC_DISABLE_SPEEDY:\"undefined\"!=typeof process&&void 0!==process.env&&void 0!==process.env.REACT_APP_SC_DISABLE_SPEEDY&&\"\"!==process.env.REACT_APP_SC_DISABLE_SPEEDY?\"false\"!==process.env.REACT_APP_SC_DISABLE_SPEEDY&&process.env.REACT_APP_SC_DISABLE_SPEEDY:\"undefined\"!=typeof process&&void 0!==process.env&&void 0!==process.env.SC_DISABLE_SPEEDY&&\"\"!==process.env.SC_DISABLE_SPEEDY&&\"false\"!==process.env.SC_DISABLE_SPEEDY&&process.env.SC_DISABLE_SPEEDY),xt=(new Set,Object.freeze([])),jt=Object.freeze({});var Ct=new Set([\"a\",\"abbr\",\"address\",\"area\",\"article\",\"aside\",\"audio\",\"b\",\"base\",\"bdi\",\"bdo\",\"big\",\"blockquote\",\"body\",\"br\",\"button\",\"canvas\",\"caption\",\"cite\",\"code\",\"col\",\"colgroup\",\"data\",\"datalist\",\"dd\",\"del\",\"details\",\"dfn\",\"dialog\",\"div\",\"dl\",\"dt\",\"em\",\"embed\",\"fieldset\",\"figcaption\",\"figure\",\"footer\",\"form\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"header\",\"hgroup\",\"hr\",\"html\",\"i\",\"iframe\",\"img\",\"input\",\"ins\",\"kbd\",\"keygen\",\"label\",\"legend\",\"li\",\"link\",\"main\",\"map\",\"mark\",\"menu\",\"menuitem\",\"meta\",\"meter\",\"nav\",\"noscript\",\"object\",\"ol\",\"optgroup\",\"option\",\"output\",\"p\",\"param\",\"picture\",\"pre\",\"progress\",\"q\",\"rp\",\"rt\",\"ruby\",\"s\",\"samp\",\"script\",\"section\",\"select\",\"small\",\"source\",\"span\",\"strong\",\"style\",\"sub\",\"summary\",\"sup\",\"table\",\"tbody\",\"td\",\"textarea\",\"tfoot\",\"th\",\"thead\",\"time\",\"tr\",\"track\",\"u\",\"ul\",\"use\",\"var\",\"video\",\"wbr\",\"circle\",\"clipPath\",\"defs\",\"ellipse\",\"foreignObject\",\"g\",\"image\",\"line\",\"linearGradient\",\"marker\",\"mask\",\"path\",\"pattern\",\"polygon\",\"polyline\",\"radialGradient\",\"rect\",\"stop\",\"svg\",\"text\",\"tspan\"]),Tt=/[!\"#$%&'()*+,./:;<=>?@[\\\\\\]^`{|}~-]+/g,At=/(^-|-$)/g;function Rt(e){return e.replace(Tt,\"-\").replace(At,\"\")}var _t=/(a)(d)/gi,It=52,Nt=function(e){return String.fromCharCode(e+(e>25?39:97))};function Mt(e){var t,n=\"\";for(t=Math.abs(e);t>It;t=t/It|0)n=Nt(t%It)+n;return(Nt(t%It)+n).replace(_t,\"$1-$2\")}var Dt,Lt=5381,zt=function(e,t){for(var n=t.length;n;)e=33*e^t.charCodeAt(--n);return e},Bt=function(e){return zt(Lt,e)};function Ft(e){return\"string\"==typeof e&&!0}var Ut=\"function\"==typeof Symbol&&Symbol.for,Wt=Ut?Symbol.for(\"react.memo\"):60115,Ht=Ut?Symbol.for(\"react.forward_ref\"):60112,Vt={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},Gt={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},qt={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},Qt=((Dt={})[Ht]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},Dt[Wt]=qt,Dt);function Yt(e){return(\"type\"in(t=e)&&t.type.$$typeof)===Wt?qt:\"$$typeof\"in e?Qt[e.$$typeof]:Vt;var t}var Zt=Object.defineProperty,Jt=Object.getOwnPropertyNames,Xt=Object.getOwnPropertySymbols,Kt=Object.getOwnPropertyDescriptor,$t=Object.getPrototypeOf,en=Object.prototype;function tn(e,t,n){if(\"string\"!=typeof t){if(en){var r=$t(t);r&&r!==en&&tn(e,r,n)}var o=Jt(t);Xt&&(o=o.concat(Xt(t)));for(var i=Yt(e),a=Yt(t),l=0;l<o.length;++l){var u=o[l];if(!(u in Gt||n&&n[u]||a&&u in a||i&&u in i)){var c=Kt(t,u);try{Zt(e,u,c)}catch(e){}}}}return e}function nn(e){return\"function\"==typeof e}function rn(e){return\"object\"==typeof e&&\"styledComponentId\"in e}function on(e,t){return e&&t?\"\".concat(e,\" \").concat(t):e||t||\"\"}function an(e,t){if(0===e.length)return\"\";for(var n=e[0],r=1;r<e.length;r++)n+=t?t+e[r]:e[r];return n}function ln(e){return null!==e&&\"object\"==typeof e&&e.constructor.name===Object.name&&!(\"props\"in e&&e.$$typeof)}function un(e,t,n){if(void 0===n&&(n=!1),!n&&!ln(e)&&!Array.isArray(e))return t;if(Array.isArray(t))for(var r=0;r<t.length;r++)e[r]=un(e[r],t[r]);else if(ln(t))for(var r in t)e[r]=un(e[r],t[r]);return e}function cn(e,t){Object.defineProperty(e,\"toString\",{value:t})}function sn(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];return new Error(\"An error occurred. See https://github.com/styled-components/styled-components/blob/main/packages/styled-components/src/utils/errors.md#\".concat(e,\" for more information.\").concat(t.length>0?\" Args: \".concat(t.join(\", \")):\"\"))}var fn=function(){function e(e){this.groupSizes=new Uint32Array(512),this.length=512,this.tag=e}return e.prototype.indexOfGroup=function(e){for(var t=0,n=0;n<e;n++)t+=this.groupSizes[n];return t},e.prototype.insertRules=function(e,t){if(e>=this.groupSizes.length){for(var n=this.groupSizes,r=n.length,o=r;e>=o;)if((o<<=1)<0)throw sn(16,\"\".concat(e));this.groupSizes=new Uint32Array(o),this.groupSizes.set(n),this.length=o;for(var i=r;i<o;i++)this.groupSizes[i]=0}for(var a=this.indexOfGroup(e+1),l=(i=0,t.length);i<l;i++)this.tag.insertRule(a,t[i])&&(this.groupSizes[e]++,a++)},e.prototype.clearGroup=function(e){if(e<this.length){var t=this.groupSizes[e],n=this.indexOfGroup(e),r=n+t;this.groupSizes[e]=0;for(var o=n;o<r;o++)this.tag.deleteRule(n)}},e.prototype.getGroup=function(e){var t=\"\";if(e>=this.length||0===this.groupSizes[e])return t;for(var n=this.groupSizes[e],r=this.indexOfGroup(e),o=r+n,i=r;i<o;i++)t+=\"\".concat(this.tag.getRule(i)).concat(Et);return t},e}(),pn=new Map,dn=new Map,yn=1,hn=function(e){if(pn.has(e))return pn.get(e);for(;dn.has(yn);)yn++;var t=yn++;return pn.set(e,t),dn.set(t,e),t},mn=function(e,t){yn=t+1,pn.set(e,t),dn.set(t,e)},bn=\"style[\".concat(gt,\"][\").concat(St,'=\"').concat(Ot,'\"]'),vn=new RegExp(\"^\".concat(gt,'\\\\.g(\\\\d+)\\\\[id=\"([\\\\w\\\\d-]+)\"\\\\].*?\"([^\"]*)')),gn=function(e,t,n){for(var r,o=n.split(\",\"),i=0,a=o.length;i<a;i++)(r=o[i])&&e.registerName(t,r)},wn=function(e,t){for(var n,r=(null!==(n=t.textContent)&&void 0!==n?n:\"\").split(Et),o=[],i=0,a=r.length;i<a;i++){var l=r[i].trim();if(l){var u=l.match(vn);if(u){var c=0|parseInt(u[1],10),s=u[2];0!==c&&(mn(s,c),gn(e,s,u[3]),e.getTag().insertRules(c,o)),o.length=0}else o.push(l)}}};function Sn(){return o.nc}var On=function(e){var t=document.head,n=e||t,r=document.createElement(\"style\"),o=function(e){var t=Array.from(e.querySelectorAll(\"style[\".concat(gt,\"]\")));return t[t.length-1]}(n),i=void 0!==o?o.nextSibling:null;r.setAttribute(gt,wt),r.setAttribute(St,Ot);var a=Sn();return a&&r.setAttribute(\"nonce\",a),n.insertBefore(r,i),r},En=function(){function e(e){this.element=On(e),this.element.appendChild(document.createTextNode(\"\")),this.sheet=function(e){if(e.sheet)return e.sheet;for(var t=document.styleSheets,n=0,r=t.length;n<r;n++){var o=t[n];if(o.ownerNode===e)return o}throw sn(17)}(this.element),this.length=0}return e.prototype.insertRule=function(e,t){try{return this.sheet.insertRule(t,e),this.length++,!0}catch(e){return!1}},e.prototype.deleteRule=function(e){this.sheet.deleteRule(e),this.length--},e.prototype.getRule=function(e){var t=this.sheet.cssRules[e];return t&&t.cssText?t.cssText:\"\"},e}(),kn=function(){function e(e){this.element=On(e),this.nodes=this.element.childNodes,this.length=0}return e.prototype.insertRule=function(e,t){if(e<=this.length&&e>=0){var n=document.createTextNode(t);return this.element.insertBefore(n,this.nodes[e]||null),this.length++,!0}return!1},e.prototype.deleteRule=function(e){this.element.removeChild(this.nodes[e]),this.length--},e.prototype.getRule=function(e){return e<this.length?this.nodes[e].textContent:\"\"},e}(),Pn=function(){function e(e){this.rules=[],this.length=0}return e.prototype.insertRule=function(e,t){return e<=this.length&&(this.rules.splice(e,0,t),this.length++,!0)},e.prototype.deleteRule=function(e){this.rules.splice(e,1),this.length--},e.prototype.getRule=function(e){return e<this.length?this.rules[e]:\"\"},e}(),xn=kt,jn={isServer:!kt,useCSSOMInjection:!Pt},Cn=function(){function e(e,t,n){void 0===e&&(e=jt),void 0===t&&(t={});var r=this;this.options=me(me({},jn),e),this.gs=t,this.names=new Map(n),this.server=!!e.isServer,!this.server&&kt&&xn&&(xn=!1,function(e){for(var t=document.querySelectorAll(bn),n=0,r=t.length;n<r;n++){var o=t[n];o&&o.getAttribute(gt)!==wt&&(wn(e,o),o.parentNode&&o.parentNode.removeChild(o))}}(this)),cn(this,(function(){return function(e){for(var t=e.getTag(),n=t.length,r=\"\",o=function(n){var o=function(e){return dn.get(e)}(n);if(void 0===o)return\"continue\";var i=e.names.get(o),a=t.getGroup(n);if(void 0===i||0===a.length)return\"continue\";var l=\"\".concat(gt,\".g\").concat(n,'[id=\"').concat(o,'\"]'),u=\"\";void 0!==i&&i.forEach((function(e){e.length>0&&(u+=\"\".concat(e,\",\"))})),r+=\"\".concat(a).concat(l,'{content:\"').concat(u,'\"}').concat(Et)},i=0;i<n;i++)o(i);return r}(r)}))}return e.registerId=function(e){return hn(e)},e.prototype.reconstructWithOptions=function(t,n){return void 0===n&&(n=!0),new e(me(me({},this.options),t),this.gs,n&&this.names||void 0)},e.prototype.allocateGSInstance=function(e){return this.gs[e]=(this.gs[e]||0)+1},e.prototype.getTag=function(){return this.tag||(this.tag=(e=function(e){var t=e.useCSSOMInjection,n=e.target;return e.isServer?new Pn(n):t?new En(n):new kn(n)}(this.options),new fn(e)));var e},e.prototype.hasNameForId=function(e,t){return this.names.has(e)&&this.names.get(e).has(t)},e.prototype.registerName=function(e,t){if(hn(e),this.names.has(e))this.names.get(e).add(t);else{var n=new Set;n.add(t),this.names.set(e,n)}},e.prototype.insertRules=function(e,t,n){this.registerName(e,t),this.getTag().insertRules(hn(e),n)},e.prototype.clearNames=function(e){this.names.has(e)&&this.names.get(e).clear()},e.prototype.clearRules=function(e){this.getTag().clearGroup(hn(e)),this.clearNames(e)},e.prototype.clearTag=function(){this.tag=void 0},e}(),Tn=/&/g,An=/^\\s*\\/\\/.*$/gm;function Rn(e,t){return e.map((function(e){return\"rule\"===e.type&&(e.value=\"\".concat(t,\" \").concat(e.value),e.value=e.value.replaceAll(\",\",\",\".concat(t,\" \")),e.props=e.props.map((function(e){return\"\".concat(t,\" \").concat(e)}))),Array.isArray(e.children)&&\"@keyframes\"!==e.type&&(e.children=Rn(e.children,t)),e}))}function _n(e){var t,n,r,o=void 0===e?jt:e,i=o.options,a=void 0===i?jt:i,l=o.plugins,u=void 0===l?xt:l,c=function(e,r,o){return o===n||o.startsWith(n)&&o.endsWith(n)&&o.replaceAll(n,\"\").length>0?\".\".concat(t):e},s=u.slice();s.push((function(e){e.type===ke&&e.value.includes(\"&\")&&(e.props[0]=e.props[0].replace(Tn,n).replace(r,c))})),a.prefix&&s.push(pt),s.push(st);var f=function(e,o,i,l){void 0===o&&(o=\"\"),void 0===i&&(i=\"\"),void 0===l&&(l=\"&\"),t=l,n=o,r=new RegExp(\"\\\\\".concat(n,\"\\\\b\"),\"g\");var u=e.replace(An,\"\"),c=dt(i||o?\"\".concat(i,\" \").concat(o,\" { \").concat(u,\" }\"):u);a.namespace&&(c=Rn(c,a.namespace));var f,p,d,y=[];return ct(c,(f=s.concat((d=function(e){return y.push(e)},function(e){e.root||(e=e.return)&&d(e)})),p=Be(f),function(e,t,n,r){for(var o=\"\",i=0;i<p;i++)o+=f[i](e,t,n,r)||\"\";return o})),y};return f.hash=u.length?u.reduce((function(e,t){return t.name||sn(15),zt(e,t.name)}),Lt).toString():\"\",f}var In=new Cn,Nn=_n(),Mn=e.createContext({shouldForwardProp:void 0,styleSheet:In,stylis:Nn}),Dn=(Mn.Consumer,e.createContext(void 0));function Ln(){return(0,e.useContext)(Mn)}function zn(t){var n=(0,e.useState)(t.stylisPlugins),r=n[0],o=n[1],i=Ln().styleSheet,a=(0,e.useMemo)((function(){var e=i;return t.sheet?e=t.sheet:t.target&&(e=e.reconstructWithOptions({target:t.target},!1)),t.disableCSSOMInjection&&(e=e.reconstructWithOptions({useCSSOMInjection:!1})),e}),[t.disableCSSOMInjection,t.sheet,t.target,i]),l=(0,e.useMemo)((function(){return _n({options:{namespace:t.namespace,prefix:t.enableVendorPrefixes},plugins:r})}),[t.enableVendorPrefixes,t.namespace,r]);(0,e.useEffect)((function(){ge()(r,t.stylisPlugins)||o(t.stylisPlugins)}),[t.stylisPlugins]);var u=(0,e.useMemo)((function(){return{shouldForwardProp:t.shouldForwardProp,styleSheet:a,stylis:l}}),[t.shouldForwardProp,a,l]);return e.createElement(Mn.Provider,{value:u},e.createElement(Dn.Provider,{value:l},t.children))}var Bn=function(){function e(e,t){var n=this;this.inject=function(e,t){void 0===t&&(t=Nn);var r=n.name+t.hash;e.hasNameForId(n.id,r)||e.insertRules(n.id,r,t(n.rules,r,\"@keyframes\"))},this.name=e,this.id=\"sc-keyframes-\".concat(e),this.rules=t,cn(this,(function(){throw sn(12,String(n.name))}))}return e.prototype.getName=function(e){return void 0===e&&(e=Nn),this.name+e.hash},e}(),Fn=function(e){return e>=\"A\"&&e<=\"Z\"};function Un(e){for(var t=\"\",n=0;n<e.length;n++){var r=e[n];if(1===n&&\"-\"===r&&\"-\"===e[0])return e;Fn(r)?t+=\"-\"+r.toLowerCase():t+=r}return t.startsWith(\"ms-\")?\"-\"+t:t}var Wn=function(e){return null==e||!1===e||\"\"===e},Hn=function(e){var t,n,r=[];for(var o in e){var i=e[o];e.hasOwnProperty(o)&&!Wn(i)&&(Array.isArray(i)&&i.isCss||nn(i)?r.push(\"\".concat(Un(o),\":\"),i,\";\"):ln(i)?r.push.apply(r,be(be([\"\".concat(o,\" {\")],Hn(i),!1),[\"}\"],!1)):r.push(\"\".concat(Un(o),\": \").concat((t=o,null==(n=i)||\"boolean\"==typeof n||\"\"===n?\"\":\"number\"!=typeof n||0===n||t in vt||t.startsWith(\"--\")?String(n).trim():\"\".concat(n,\"px\")),\";\")))}return r};function Vn(e,t,n,r){return Wn(e)?[]:rn(e)?[\".\".concat(e.styledComponentId)]:nn(e)?!nn(o=e)||o.prototype&&o.prototype.isReactComponent||!t?[e]:Vn(e(t),t,n,r):e instanceof Bn?n?(e.inject(n,r),[e.getName(r)]):[e]:ln(e)?Hn(e):Array.isArray(e)?Array.prototype.concat.apply(xt,e.map((function(e){return Vn(e,t,n,r)}))):[e.toString()];var o}function Gn(e){for(var t=0;t<e.length;t+=1){var n=e[t];if(nn(n)&&!rn(n))return!1}return!0}var qn=Bt(Ot),Qn=function(){function e(e,t,n){this.rules=e,this.staticRulesId=\"\",this.isStatic=(void 0===n||n.isStatic)&&Gn(e),this.componentId=t,this.baseHash=zt(qn,t),this.baseStyle=n,Cn.registerId(t)}return e.prototype.generateAndInjectStyles=function(e,t,n){var r=this.baseStyle?this.baseStyle.generateAndInjectStyles(e,t,n):\"\";if(this.isStatic&&!n.hash)if(this.staticRulesId&&t.hasNameForId(this.componentId,this.staticRulesId))r=on(r,this.staticRulesId);else{var o=an(Vn(this.rules,e,t,n)),i=Mt(zt(this.baseHash,o)>>>0);if(!t.hasNameForId(this.componentId,i)){var a=n(o,\".\".concat(i),void 0,this.componentId);t.insertRules(this.componentId,i,a)}r=on(r,i),this.staticRulesId=i}else{for(var l=zt(this.baseHash,n.hash),u=\"\",c=0;c<this.rules.length;c++){var s=this.rules[c];if(\"string\"==typeof s)u+=s;else if(s){var f=an(Vn(s,e,t,n));l=zt(l,f+c),u+=f}}if(u){var p=Mt(l>>>0);t.hasNameForId(this.componentId,p)||t.insertRules(this.componentId,p,n(u,\".\".concat(p),void 0,this.componentId)),r=on(r,p)}}return r},e}(),Yn=e.createContext(void 0);Yn.Consumer;var Zn={};function Jn(t,n,r){var o=rn(t),i=t,a=!Ft(t),l=n.attrs,u=void 0===l?xt:l,c=n.componentId,s=void 0===c?function(e,t){var n=\"string\"!=typeof e?\"sc\":Rt(e);Zn[n]=(Zn[n]||0)+1;var r=\"\".concat(n,\"-\").concat(function(e){return Mt(Bt(e)>>>0)}(Ot+n+Zn[n]));return t?\"\".concat(t,\"-\").concat(r):r}(n.displayName,n.parentComponentId):c,f=n.displayName,p=void 0===f?function(e){return Ft(e)?\"styled.\".concat(e):\"Styled(\".concat(function(e){return e.displayName||e.name||\"Component\"}(e),\")\")}(t):f,d=n.displayName&&n.componentId?\"\".concat(Rt(n.displayName),\"-\").concat(n.componentId):n.componentId||s,y=o&&i.attrs?i.attrs.concat(u).filter(Boolean):u,h=n.shouldForwardProp;if(o&&i.shouldForwardProp){var m=i.shouldForwardProp;if(n.shouldForwardProp){var b=n.shouldForwardProp;h=function(e,t){return m(e,t)&&b(e,t)}}else h=m}var v=new Qn(r,d,o?i.componentStyle:void 0);function g(t,n){return function(t,n,r){var o=t.attrs,i=t.componentStyle,a=t.defaultProps,l=t.foldedComponentIds,u=t.styledComponentId,c=t.target,s=e.useContext(Yn),f=Ln(),p=t.shouldForwardProp||f.shouldForwardProp,d=function(e,t,n){for(var r,o=me(me({},t),{className:void 0,theme:n}),i=0;i<e.length;i+=1){var a=nn(r=e[i])?r(o):r;for(var l in a)o[l]=\"className\"===l?on(o[l],a[l]):\"style\"===l?me(me({},o[l]),a[l]):a[l]}return t.className&&(o.className=on(o.className,t.className)),o}(o,n,function(e,t,n){return void 0===n&&(n=jt),e.theme!==n.theme&&e.theme||t||n.theme}(n,s,a)||jt),y=d.as||c,h={};for(var m in d)void 0===d[m]||\"$\"===m[0]||\"as\"===m||\"theme\"===m||(\"forwardedAs\"===m?h.as=d.forwardedAs:p&&!p(m,y)||(h[m]=d[m]));var b=function(e,t){var n=Ln();return e.generateAndInjectStyles(t,n.styleSheet,n.stylis)}(i,d),v=on(l,u);return b&&(v+=\" \"+b),d.className&&(v+=\" \"+d.className),h[Ft(y)&&!Ct.has(y)?\"class\":\"className\"]=v,h.ref=r,(0,e.createElement)(y,h)}(w,t,n)}g.displayName=p;var w=e.forwardRef(g);return w.attrs=y,w.componentStyle=v,w.displayName=p,w.shouldForwardProp=h,w.foldedComponentIds=o?on(i.foldedComponentIds,i.styledComponentId):\"\",w.styledComponentId=d,w.target=o?i.target:t,Object.defineProperty(w,\"defaultProps\",{get:function(){return this._foldedDefaultProps},set:function(e){this._foldedDefaultProps=o?function(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];for(var r=0,o=t;r<o.length;r++)un(e,o[r],!0);return e}({},i.defaultProps,e):e}}),cn(w,(function(){return\".\".concat(w.styledComponentId)})),a&&tn(w,t,{attrs:!0,componentStyle:!0,displayName:!0,foldedComponentIds:!0,shouldForwardProp:!0,styledComponentId:!0,target:!0}),w}function Xn(e,t){for(var n=[e[0]],r=0,o=t.length;r<o;r+=1)n.push(t[r],e[r+1]);return n}new Set;var Kn=function(e){return Object.assign(e,{isCss:!0})};function $n(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];if(nn(e)||ln(e))return Kn(Vn(Xn(xt,be([e],t,!0))));var r=e;return 0===t.length&&1===r.length&&\"string\"==typeof r[0]?Vn(r):Kn(Vn(Xn(r,t)))}function er(e,t,n){if(void 0===n&&(n=jt),!t)throw sn(1,t);var r=function(r){for(var o=[],i=1;i<arguments.length;i++)o[i-1]=arguments[i];return e(t,n,$n.apply(void 0,be([r],o,!1)))};return r.attrs=function(r){return er(e,t,me(me({},n),{attrs:Array.prototype.concat(n.attrs,r).filter(Boolean)}))},r.withConfig=function(r){return er(e,t,me(me({},n),r))},r}var tr=function(e){return er(Jn,e)},nr=tr;Ct.forEach((function(e){nr[e]=tr(e)})),function(){function e(e,t){this.rules=e,this.componentId=t,this.isStatic=Gn(e),Cn.registerId(this.componentId+1)}e.prototype.createStyles=function(e,t,n,r){var o=r(an(Vn(this.rules,t,n,r)),\"\"),i=this.componentId+e;n.insertRules(i,i,o)},e.prototype.removeStyles=function(e,t){t.clearRules(this.componentId+e)},e.prototype.renderStyles=function(e,t,n,r){e>2&&Cn.registerId(this.componentId+e),this.removeStyles(e,n),this.createStyles(e,t,n,r)}}(),function(){function t(){var t=this;this._emitSheetCSS=function(){var e=t.instance.toString(),n=Sn(),r=an([n&&'nonce=\"'.concat(n,'\"'),\"\".concat(gt,'=\"true\"'),\"\".concat(St,'=\"').concat(Ot,'\"')].filter(Boolean),\" \");return\"<style \".concat(r,\">\").concat(e,\"</style>\")},this.getStyleTags=function(){if(t.sealed)throw sn(2);return t._emitSheetCSS()},this.getStyleElement=function(){var n;if(t.sealed)throw sn(2);var r=((n={})[gt]=\"\",n[St]=Ot,n.dangerouslySetInnerHTML={__html:t.instance.toString()},n),o=Sn();return o&&(r.nonce=o),[e.createElement(\"style\",me({},r,{key:\"sc-0-0\"}))]},this.seal=function(){t.sealed=!0},this.instance=new Cn({isServer:!0}),this.sealed=!1}t.prototype.collectStyles=function(t){if(this.sealed)throw sn(2);return e.createElement(zn,{sheet:this.instance},t)},t.prototype.interleaveWithNodeStream=function(e){throw sn(3)}}(),\"__sc-\".concat(gt,\"__\");var rr,or=o(439),ir=\"#4A4A4A\",ar=\"#E2E7EA\",lr=\"#787878\",ur=\"#D1D9DD\",cr=\"#8BC34A\",sr=\"#F44336\",fr=\"#FFFFFF\",pr=\"#EEEEEE\",dr=\"latoregular\",yr=\"latobold\",hr=\"Arial\",mr=\"0 3px 6px 0 rgba(0,0,0,0.16)\",br=\"0 4px 5px 0 rgba(0,0,0,0.14), 0 1px 10px 0 rgba(0,0,0,0.12), 0 2px 4px -1px rgba(0,0,0,0.3)\";function vr(e){return vr=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},vr(e)}function gr(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,wr(r.key),r)}}function wr(e){var t=function(e,t){if(\"object\"!=vr(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,\"string\");if(\"object\"!=vr(r))return r;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return String(e)}(e);return\"symbol\"==vr(t)?t:String(t)}function Sr(e,t){return Sr=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},Sr(e,t)}function Or(e){return Or=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},Or(e)}var Er,kr,Pr=nr.h1(rr||(Er=[\"\\n  font-size: 26px;\\n  font-family: \",\";\\n  flex: 0 0 auto;\\n  margin: 0;\\n  color: \",\";\\n\"],kr||(kr=Er.slice(0)),rr=Object.freeze(Object.defineProperties(Er,{raw:{value:Object.freeze(kr)}}))),dr,ir),xr=function(t){!function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,\"prototype\",{writable:!1}),t&&Sr(e,t)}(l,t);var n,r,o,i,a=(o=l,i=function(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,t=Or(o);if(i){var n=Or(this).constructor;e=Reflect.construct(t,arguments,n)}else e=t.apply(this,arguments);return function(e,t){if(t&&(\"object\"===vr(t)||\"function\"==typeof t))return t;if(void 0!==t)throw new TypeError(\"Derived constructors may only return object or undefined\");return function(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e}(e)}(this,e)});function l(){return function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,l),a.apply(this,arguments)}return n=l,(r=[{key:\"render\",value:function(){return e.createElement(Pr,null,this.props.suiteName,\" Report\")}}])&&gr(n.prototype,r),Object.defineProperty(n,\"prototype\",{writable:!1}),l}(e.Component);const jr=X((function(e){return{suiteName:e.suiteInfo.testSuiteName}}))(xr);function Cr(e){return Cr=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},Cr(e)}var Tr;function Ar(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,Rr(r.key),r)}}function Rr(e){var t=function(e,t){if(\"object\"!=Cr(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,\"string\");if(\"object\"!=Cr(r))return r;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return String(e)}(e);return\"symbol\"==Cr(t)?t:String(t)}function _r(e,t){return _r=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},_r(e,t)}function Ir(e){return Ir=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},Ir(e)}var Nr=nr.h3(Tr||(Tr=function(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}([\"\\n  font-size: 14px;\\n  font-family: \",\";\\n  font-weight: normal;\\n  font-style: normal;\\n  margin: 0;\\n  color: \",\";\\n  flex: 1 0 auto;\\n  padding-left: 15px;\\n  margin-left: 15px;\\n  margin-top: 7px;\\n  position: relative;\\n\\n  :before {\\n    content: '';\\n    width: 2px;\\n    height: 35px;\\n    background: \",\";\\n    display: block;\\n    position: absolute;\\n    left: 0;\\n    top: -10px;\\n  }\\n\"])),hr,lr,ur),Mr=function(t){!function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,\"prototype\",{writable:!1}),t&&_r(e,t)}(l,t);var n,r,o,i,a=(o=l,i=function(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,t=Ir(o);if(i){var n=Ir(this).constructor;e=Reflect.construct(t,arguments,n)}else e=t.apply(this,arguments);return function(e,t){if(t&&(\"object\"===Cr(t)||\"function\"==typeof t))return t;if(void 0!==t)throw new TypeError(\"Derived constructors may only return object or undefined\");return function(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e}(e)}(this,e)});function l(){return function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,l),a.apply(this,arguments)}return n=l,(r=[{key:\"render\",value:function(){return e.createElement(Nr,null,this.props.idConfig)}}])&&Ar(n.prototype,r),Object.defineProperty(n,\"prototype\",{writable:!1}),l}(e.Component);const Dr=X((function(e){return{idConfig:e.suiteInfo.idConfig}}))(Mr);function Lr(e){return Lr=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},Lr(e)}var zr;function Br(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,Fr(r.key),r)}}function Fr(e){var t=function(e,t){if(\"object\"!=Lr(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,\"string\");if(\"object\"!=Lr(r))return r;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return String(e)}(e);return\"symbol\"==Lr(t)?t:String(t)}function Ur(e,t){return Ur=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},Ur(e,t)}function Wr(e){return Wr=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},Wr(e)}var Hr,Vr,Gr=nr.img(zr||(zr=function(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}([\"\\n  display: block;\\n  height: 35px;\\n\"]))),qr=function(t){!function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,\"prototype\",{writable:!1}),t&&Ur(e,t)}(l,t);var n,r,o,i,a=(o=l,i=function(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,t=Wr(o);if(i){var n=Wr(this).constructor;e=Reflect.construct(t,arguments,n)}else e=t.apply(this,arguments);return function(e,t){if(t&&(\"object\"===Lr(t)||\"function\"==typeof t))return t;if(void 0!==t)throw new TypeError(\"Derived constructors may only return object or undefined\");return function(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e}(e)}(this,e)});function l(){return function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,l),a.apply(this,arguments)}return n=l,(r=[{key:\"render\",value:function(){return e.createElement(\"a\",{href:\"https://garris.github.io/BackstopJS/\",target:\"_blank\"},e.createElement(Gr,{src:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAScAAAA8CAYAAAAkPHytAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFFmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDAgNzkuMTYwNDUxLCAyMDE3LzA1LzA2LTAxOjA4OjIxICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgKE1hY2ludG9zaCkiIHhtcDpDcmVhdGVEYXRlPSIyMDE4LTA1LTAyVDE2OjIyOjE0LTA3OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAxOS0wNS0wNVQxODoxMDozNy0wNzowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAxOS0wNS0wNVQxODoxMDozNy0wNzowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo2M2Y0NTdmNi03YTU1LTRmZTAtYTMyNi0wODU5YmEwYjA3OTMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NjNmNDU3ZjYtN2E1NS00ZmUwLWEzMjYtMDg1OWJhMGIwNzkzIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6NjNmNDU3ZjYtN2E1NS00ZmUwLWEzMjYtMDg1OWJhMGIwNzkzIj4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY3JlYXRlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo2M2Y0NTdmNi03YTU1LTRmZTAtYTMyNi0wODU5YmEwYjA3OTMiIHN0RXZ0OndoZW49IjIwMTgtMDUtMDJUMTY6MjI6MTQtMDc6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAoTWFjaW50b3NoKSIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5BUXmqAAAseUlEQVR4nO19eZwcVbX/99xbvUzPTGbNMlkI2SAQwhYSROCx/HDrmu4sz1YU8IELPt8zojzhoT/9OcjT546KiuICqKgwmmWmqwUVRAgGJvu+kJlMtpnMvnZNb1Xn90dXTXp6uiczmZAE6O/nU6lO1b2n7q3p++1zzz3nXGJm5JBDDjmca1AAgIhSr1FamfT/20hntXOd5d6q/cohh7ccmDlJThYo7TNluD6kfto5/fq5gvR+jKVfnFLuXOtXDjm8paFkuEYZDmDoYE4fwOmfgbM/mFPbnd6P0fYJOPv9yCGHtyVsckodrML6LKwjE1ExABMnBrKZJvdsahyZNED7EBk+Ayf6kdof07pv95OQI6occjhjSJ/W2YPVJiaZcl1i+GC2B7GB4YSVOi06U4M6k7aUSkQSw0kXVvvsPqS21cTZI9kccnhbI31aZw9kYd2ThYWFyrRpZYXt7f2x9vb2KJIDVsEJrcKwytufbcI6G0glV/tsk6x9tj/bhCTKPR5XwaRJzo7Gxr4+IGHJSVgybMLNIYccziAyaU6pg9i8+YZrbiovK707noj3GYZ5NByJ7Go52rR1/cZtR5Ac3Ip1tge1mXKkayJnAqn9SCVaxeoTA5CXLbhgxtRpFZe7Xa4FQorpDiELO+fMeOwvz7/8XEo5IDelyyGHs4JUm1P6NEgCcBQWFtykKKKU4CglB830eNzXlk4oiMyee/6m5qY27YWX/rkTQ6dMBoZrUCMN7GyrZtkwGlmpGpME4LD79c6rF10ycVKZ6lSURYqiuAGA2YQgCY8n7yYAL2Iowaa+lxxB5ZDDGUK2aZ0EIGbNmlqmSDEvkUjAMBnC0ouIyO3xeK49//zp77h1ku/vW3bs/N2+fQdbAbiQ1KBSyelMT/FSNSaJZB951qzpky6ZP//DeW7XTVKR0jANJBJGsgYzTMlQpJw3derUsqampg6r7tmcouaQw9samchp0IA8bfLUCiJRnEgY6O3rRWlJCZgZzAwjkQARZOGEwlvesXjRRRNLyx9dt37DDgBuJAnKtkEBw6d3Y9WWsiFdpi3X1uIUALz4yksvmTlz2qecimNaPJFCShZ6ujtQVFIOQVQ8ddKkiqampk4MN5rnkEMOZxDprgT2ZwEA7jxPqRRCJOIxtLW0oLSkZEhlZsBIxOFQlGnz5p3/gHDIH7700qubkZxG2dO7TK4GbwRSp1+DNrN3LL7yyhnTp3xGSlEQTyMlADDNBNrbWlFUXAahCOHJd5Rat1JdDYAcSeWQwxlFJg/xQbuNoggPSQHTZPR0dyEWi8HpdCI9Hs80DUiSBbNnzvjMwJX6NzZs3r4fgLvA6ZTkgsnsJKcTwuFwEABS2CHgYFKYBTNIUexnMgFALA5KxJMX4ACIKPnAOJgAjhOZRHEGiOPxuElxcAwxMxZLtj8Wi5kAYgsWLJg/Y1qSmAxjuLmIJGGgP4ye3q7k/0lACOHBCdtZ6jvJ2ZtyyOEMItO0zj4Ts2kCDAiCPqCjq7MLU6ZMBQ+usp8AA5CC8mZMnXi7R17Y4HIpc4hoAhhkxe5JgImIBIMEAQQiAWYisp5nPZ9NE316FHzClZNBYJhgIjBAJjMzGCaITQaYmU1iMAQxM/UnjERD2cSiOUIKj5kluFmSQEd7GxLx+OA1M8GpRvDUd5JDDjmcQaST05B4uWgk0msaBqQgSCI0Nx/FlCkVQyoQEUzAHOjrGujraSczEZtfWJA3n2Fm0DXS/Rl5yKXBj4JAtldCelFO/kNDrEFi2ARMURzzwl2tiOi9scIJpZyXX+gEDyWaeDyO481NUBwOkCQYpoGIkejN9C5yyCGHMwvbWTE9Rg4ARMvxznbD4IjD4YA7z4P2tnZ0d3dCkARgEZPBic6WY5GutmNuMxHzAMlpHps8aDwffmD4kdIIzmKhGlJmSH1z+GGYYACJ6ICzs+2Ys6e9JQ6Ypt1jRZFoO96M/t4+eDwFkELCMM1IZ2dne9p7SX8/OeSQwxlApsDfwYHYcORI+6LFC4+5XHlzJhQVobOjHQf278PlVy6BokgkTNPsbDsWj+u9HiHO1dkPgQDq7+9ymsyJkolTSEpJA7qOgwf3AwCKiktAJGAmzGNHjjS3WRVPKyFVVlb6Rt1iImbmfgBdzHxY07Su09WOcwE+n6+cma8RQtTV1NS0nO325JAdqqqWENF1UsrGtWvX7jhZeZ/PVw5gmWma1wGYycznE9FUZo4A6CGi/QC2CiFCixYterGqqirrYlmmaZ0d1mFGo9Fwf1jfVJDvmTN5SgWOHTmMzq5O7N61DfMvXoCB/r5YLNzjZhCEwSBJIKGAQGAwwAZMg2HbfAQRSOC0gsEwLQoRhKRWJwSIkjlh2DBgWM/v7+9WXHl5Cak4lF07tkHv1+HyOFFWPjF5PxLZFI1G9ZR3cNoIyjTNmlOsyqqqbgewyuPx/Ki6urrzdLTnbMI0zcuZuYaIfACCZ7s9OYyIi0zTrGHmRwH8R7ZCqqqWAPh/hmF8CoCLiPoB7AKwCcCfiWgKM58PYBEz/x/DMP6rrq7uqNfr/bKmaU8OLnqlwCan1OmLHXZiAHAcaDi0rqRogq+kuDRv0pQKNDcdw/HjzYjFYomKiUXS5XZTfmER8gsnwOXMg3QoEBAwwTATCcTjMUQiOiIDOiJ6GLFYBIbByXnTKZBVkvSSjZREcDnzkJeXhzyPB648NxwOFxQhAEFgk2EYCUQjUfTrfejv6UN3+3F5pKkJelgHAMyYMQseTyFi8ejAkYaj63Airi71XaS+o/GgXkp596j6yVxqmuZUIpoF4APM/GA4HP4vr9f7iVAo9MxpaEsOI0BV1YeJqDUYDP7v2W7LuQ6/33+hYRhBZp4L4BUAvygtLa3+zW9+Ex6h/APMfDuAxysrK2+94447/jW9fKrmZA/G1BAUZefOvYfmz539fHl5ceXcCy5Eb08P+vt7kJfnSkw773xXUVEJFIcjKcBMG79OJ/JEPopQAjYBwzQQHRiAHu5FX18PorqOeDwOk7OTFVucYCYXDWHbvwoLipBfkA+nKw+KIgE7m2eGlTlPQSFKUI5EPI6enm7q6OpGf6+OiRPLcd7M2SAC9PDA83vr6w/hBDGnZ1oYN4iov7a29oWx1quqqrpv48aNPtM0fwzgaVVV8zRNe/J0tCmHzGBmL4AGADlyGgGBQKBI1/UQM88ios9omvbIyerU1NTsA3CX1+utAvAoM7+vs7MzFAgEbq6urh50RkylgnTtyQ7m5dc2bfqjrkcPFRYU4LIrrkRBQREmTZoSLp80lUgoMAyGYSSnV8OOwXsMIgFPfj4mTpmKWXPmY878hTh/3nxMqZiGgqJiuNxukFCs4BMCSQmX042CCUWYUlGBWXMuwLwLF2D2nAswccoUePILICUlDeCmkTwyGcete1IqmDy5AhVTp6K0vAwXLbwCDqcLkcjA4U3b9vzR6n9q+M05sWJXVVWVCAaDq4no3QA6mfmnK1asmH4225RDDgCg6/pDzDybiL4yGmJKRSgUOjR9+vSlRBRi5n8Jh8P3pd5PJ6f0HE0JAOaRIy2dO/e+/n19IHK0pLgYi5dcjYmTJhGbw/2dAEBKgqIoUBwKFEUi1VZuMgaJTDocKCwqxpTp52HW3CRZzZ1/CebMuwRz583HBRdchLkXXow5cy5AxdQZmDChGA6H4wThpC3rCaFAkQqEVEBCZmiZiUQijqlTZ+CKK5fA48lHJBo5duBA48MtLS1dKX1OjQ08Z1bqNE3bKaX8GAB3NBr99NluTw5vbwQCgTxm/giA1tmzZ3/rVGQ89thjcSnlR4moC8ADd955p9u+l23JPJWc4gB48+btB9etr/uf9o7OZ0kobQ6nkzONWUWR6O3tw969e7B582Y0NBxEPB5PTr3SMUSzSnpou5wuuD35SRuS2z1UM+LhhAQAJCTYZDQdO4yt27Zgz+6d6O7oAAkJGmbUMuFyu02Tub2ru/vZDZu3PbR99/6DVp/jGK45nRPakw23211r/SGvPtttyeHtjUgkchGAIiIKPfLII9FTlVNTU9PCzL8GUNTW1rbMvp7NlcD2kjaQHLAEgBoajrQ1NBx5ory8fLX33dcHiicU3mIYJ7QnKQl79u7Frp27EI0OIGEkXbzLy0pxxRWXYerUacOCbtNhsm305oxElA4hFHR1tWPLls1obWmHyYBCwF7HLsyZMxcLFl4KIeWgLEkKYtGBnS+u2/BoR0dHF04Yv9OJ6ZxMMlddXW2oqnqImRec7bbk8PaGaZq2aeHweGVJKVcbhnEPEV0D4A/AcIO4DTtpnE1QdiI5AUBpb2/v6e7tb5xaMWmwgqJI7Nm7G1s2b0WCCS6pYGa5Gw5JaO7uw1///hKWXHkFLpp/gUVa44cQCg4fPoTXXqtDnpLArEl5iBuM1p4IYoaBvXv3IcEJXHHlkhO9IyASix+2iAk4oR0mcCKbQmoeqnNmWmeDmQsBlFRVVSlVVVWZ59YWVqxYURGNRhcQ0SzTNGchmdamF8B+KeUrtbW1Y/5iBQIBqev6vzDzQiFEBSeZvwFAg8fj2fZGujssW7as2DRNFwC9pqamL1PbBgYGbjRNc67VtgIARwEcllJur6mpOZBJrqqqJVJKp/1/wzAUAC6/3z85tdzMmTO7R9ISli1bNscwjJsMw5hGREXM3ArgUH5+/nOjfS8+n69cSplYs2ZNd/p1wzDeJYS4kJmLALQz8zEhxF+DweCx0cg+zdCt84TxCiKi1wHAWvEDMLLmZK/aAcNzczvaWloaE3POSwiQQpLQ1dmJnTt3I86EK6bl455bZmBBhQdSENr641i9pQ1PvLIFCcPAwksWnFSDOhmEUHDoUAM2b9qI9185Ee9eWI5SjwMGAwdadDyx7gj2tYRx8EA9pkyZioqpM8BmAiYzenp763FCQ4pjqNZ02lfpTiduu+22CV1dXbMB7BmJmFasWDE9Go1+ORKJfBSAwsxhJAkkQUSTmHmaYRisqupzDofj02vWrKk/2bNXrlzpqq+vvy8cDq8EMAlADzMfZWYCMBuAW9d1XVXVx4joO6d7wFRWVt4Wi8V+SUR7FUXxARgkJ7/fX2gYxld1Xf8QM08G0Gua5nEAYSKawczliUSCvV7vWinl12trazekia9JJBLXpV2bnUgkjqdeaGho+ACA6vS2+Xy+mw3D+EYsFlsMIEpExwB0EdEUABXhcNhQVTUI4POapjWM1E/TNOsMw9gFwGfJ9jDzFwzD+DwAycxNANoBTARQYZqm4vV6/w7gv0Kh0NaTvMbTBillYyKRAICrxiurpqamKRAIlDmdzsHvdLpBJpu/UyLliAMwd+xpOBKPx48JJRm/e7CxEbo+gDnlefj+B+binbMmoMAl4FYI04ud+Py7zsP975mJbdu2Yd++/ZltUKOEEAqam49hY90GfPy6qfj4jedhSpEbToeExylxxXkT8H/98zC1xI14AmioPwBYq4XxRKL/YMOh162+xVL6lY2YzimC6u7ufg+SPxD/zFZGVdV3RiKRAwBuJ6Lvut3uGaFQqCAUCl0aCoWu1DRtutvtnkFE3wdwQzwe/0cgEJg40nN9Pt+s+vr6bQAeAvCslPKaUChUrGnaJaFQaIGmaR4p5UwA3wVwp2ma9T6f732nq99er/crpmn+loj+5vF4rlu7du0R+97y5cvLEonECwBWAnhGSrkkFAoVhUKhC63+TiwpKSkSQqwkoisMw3hNVVV/2iM+K4S4xT6Q1LY2pF4TQtzidDr/kVqJmcnr9f7IMIznAShCiFsnTZpUrGnaHE3TrtI0bbrT6awgovuZ+VoAOysrKz8y2n5bmtheZn6/EOKTZWVlJZqmnW/JnllWVlZCRHcR0VQAG7xe7+dO9R2PFZYWupGZr1NV9Zbxyquuru586qmn7NjWrJqTnSLE1qBSDeQCQKK/v7+3pye8wZOXPzMWj6GtrRUJENRLSzGtxI2BeAIHW3S4nQoqSlzQ4wm8/6pyBHe1Y8PmzSgszB+VDSodJCS6e7rw6quvYd5kF95z6UQMxBIQBLT2xhGNM6aVOTFlggs3zy/FE+ua0N3dhYGBARQWetDX37/jQOOx4xhKum8KYvJ6vVOY+cdE1EdEVZnKWJ66v0dSq1kSCoUOZSq3atWqowDu9fl8qwzDeCEcDv8K1i91OpYtW3Z+PB5/GUChlPI9tbW1f0kvY3n4Hgbw/2677bbvdHV1hUzTfMbr9V4/nl/zQCDg1HX9l8x8uxDih3l5efem+sIAQCwWW01ECwCs0DQtoye+9aX/cSAQ+FU4HH6FmX+zfPnyxatXr94PAJqmbUot7/V6dSLqCAaDz4/UPlVVfwngLiL65uLFi7+USZtdvXp1K4Dv+3y+3xqG8TsAj6uqSifzVVu+fHlZLBb7MxG95PF4PlFdXT2QXsZyXHwyEAg8MzAw8DPTNL/n9XqNUCj0w5Fkny4IIR5g5ueY+Y8+n29pbW3tP05ea5Sys1zPtHpnH/aAxvY9r78Sj8UibBqIRWOQEKiY4ACbDEGEe367Bz947iDcDgmYQJ6UuKQiH9F4AnUbNqKntxdSjj4mj0ggHothc91rCOsRzJ1cCLciwQCcisRT65rwzdr6QQ/18kIXCMnsA0Y8BsMAjjW1vYjhpJTJbeCcIia/338FgBoAE5j5k9mmTBZpTSeiW7MRUypqa2vXAfgJgPemLuPaqKqqEvF4/ElmLlcUxZuJmNLx1FNP9bpcrqXW9KM2EAg4T1YnEwKBQKmu638F8CEi+s9gMHhPOjEtXbr0Yma+HsC3sxFTKqqrqwecTucKADIajX79VNplw9KA7iKi72ia9sDJ7H+1tbXt+fn5S5HUeh9dvnz5BVmKMgBEo9FvI2nH+7dMxJSK6urqgby8vLsA1AL4js/nOyMLJsFg8Hki+gQR5RmG8XdVVR/3+/3XWlP9cWGk4BF7cNqDNnXrpwSS7gWHe/v7X3U6XZCKAwwTe49HQAIwmVG1Yh4+ftMMxCztiAF0DxhQpIQeDmPzpk1IGGNIkkmEHTu2or2zE4oA+iKJwUbGDMbyJVPwH7ecB8CEIMLBVh0MQBECTqcTsWhk7z/rtm63qqSvzKX2+awTk9/vn+z1eq+urKz8oKqqv08kEpuIqICIrg2FQr/PVo+Z/wXARk3T/j7aZwkh1iG50HFp+r2NGzfezsz/QkQP1dTUvDJamatXr+6QUj4IYHo4HP7X0daz4ff754bD4fXMfDkzV2qa9pNM5eLx+DyrD6P+xV6zZk0jEW0A8N5THUSBQKDANM2HAWxfvHjxF0Zbr7q6ekAI8REAHI1GR3JanElE72fmT6YT8giyDUVRPkFEEcMwHh5tm8aLYDD4uJTyWgAagI8kEol1qqoeVlX14crKSl/6osJokWlal4rUKV4mB03s3rMveN01V79j8uSJ7vb2dmg7OuC/tBSXTS/E1XNKYMJEIsHIc0jsbdHxz/peOAbzQzVj3959uGQUBnIhFBw93IjGhnooAjAEsKWxFw2tOuZM8mAgbmDWxDwIIiiCsLepHy/u7YRCQHFpGZx5eWioP1wTjUYHcEJjyqQ1vWHExMyXeb3eUcm3DI0wTRMA6oUQdwaDwV+PVCcQCOSFw+FLiOhHY2mXaZr91rk0/R4z30NELR6P59tjkQkAiqI8Z5qmAeAmJKeao4LP57vOMIw1VvDotZqm7cxWVgjRb70jzxibtwXAjX6/vwxJ4/KYoOv6HQBKpZS3n0xjSkdtbe3BysrKHzPzfaqqXqRp2p60IgRgITP/YjTabypqampaVFX9CYD7VVWdfTLj++lCTU3NRgA+ywTw7wD+lZk/y8yfNU0TqqoeBvAqgHVE9NJVV121Y6SMBMDImlM6UrWnQXJa9+rWho7O7ucvvngBioqK0N47gM9VH0BoZwf6Y4mkoyUDrxzsxX1/akCXnoAkDGYS2LFjB44fbxlxekck0N/fg61bNsNIioQE0BuJ41t/bsCWxt5B3SccS+DFfe34uvY6OsNxOF0OXLLwUkSjkc3P/f0V264wktb0RqKNiL5/sgPAD4joSSJ6FsB2yw3gSVVV93u93g9lE67rulsI8R9CiJ+NpVFEVJ7put/vn8vMVxLR49XV1bEx9RRJ7QnAxwA8O9o6Xq/3Q4Zh/A3AASnl1SMREwBIKfcDADN/YIzNe8jlcl24aNGi7jHWs3EHER1atGjRc6dSWQjxmPXx9gy3GQCklMNWBUeJ3wKgU3gn48aaNWsaNU17QNO0eQAqhBAB6zvdDGAZM//QNM2tdXV1naqq/sbn8y3OJutkmhMwxEMoowe54+V162sq1XctufGmGyZu3rwFzc0tuOcP+zCrLA8TJzjQMxBHfVsU8YQBhyO5WbDLaQXwFuYjnpImNyOIEIvEMHHyZPT39WFA1xGPR0HEqG/R8YU/7cXMUicm5Clo74/jWGccQgGmTC7HwoULUVxcGtm4edczSK7OnRWtKdkNatI0bcyrKZZbwK1IDvTfeb3e906fPv3jjz322JAXZ+V9+vlY5TPzXZmum6Z5vdXuUZNLOsYSoOz1er8E4CEi0jweT+BkdhYAWLt27RFVVf9gmuYdqqrqs2fPvmc03srWu+pavXr1aJs3CEtDvYqIHj/Zr3821NTUHFBV9XUA149QbPOpyNY0bafX6+3FWY4iCIVCxwH80ToQCASc4XD4CiHEDcz8YWa+3TCM21VVXQ/gQU3ThhD9aMjJhj3FS92CPAFA7q0/3Lqg8cgf5s2bvfKG669HT08Purp70B8OozcWh/QAC6c44HQ6kZfnTh7uPLjc7sFYuUwbEAw+2DRQUlaGq8uvhZGIIxqLITIwgIGIjoHIAOLRGKLROHQGioscmHGBBxOKilBUVASX243m5pbghi079uOEJ/jZ0JpOGdbK2ndWrlz5SENDw0+Y+aNHjx7VAXzqVGXaCd+Y+X5mTvfvAQDYXuhut7vuVJ8zGlgrco8x879Zl+a43e5Ra/VCiJWGYcxg5k/W19ffoqrq7xRFqR5NcrRTga7rFyO5w9Br4xT1GoClGa4TgEhtbe2Yp5spaCSiYTbEswlL+37NOr7l8/kWmKb5MWb+NIA/q6r6JU3TBhcpRktO6f5PqZ7jEoDzTzV/eflTH/3QouKSoncWlxSjpLT0RBqTQSlsnUywmYyny2RrSuaupCGUYWcYIEGD+ZtKUW5XGJyfmlYrGQxJhL6+vgPPv7yx1rp9shW6cxqPPPJItKqq6hN1dXUzAPx7ZWXl08Fg8MVs5X0+33zTNN9JRPNN05xHRJOZeRKAKYZh5ANgIqojooeY+csZRJQD6B2NBnOqUFW1RNf1Vcx8IxF9lZlNZq7q7Oz8KYA7RiOjtra2PRAI3Kzr+ieZ+T5m/nI8Hv+yqqrtzLyeiF4RQrxSVla28YknnoiMt83MPBEAhBDN45FDRM2maRauXLnSlabtMREdyVpxdLIPMvON45HxRqO2tnYXgHsrKyufNE3zz8z8NVVVGzRN+wMwNpsTkD0wOAEg8fy6Tb8diETaiZKkk4gnhh7WhpZ2oG8mCCJE9DB0PQyizI6adiCwaSaSh5FAwjpMI3kNzIgbicje/Q1PdHZ29mGoI6lNTnafUs/nNKxpxJcBgJk/k37fcgq8U1XVfxqGsYeZv22a5jsBdAH4GxF9T0p5u8PhuFRKWaBp2juYOZtDZx4R6VnujRvMPIeZ1zPzNVLK2zRN+8qSJUseIqK/MfPtqqp+bLSyqqurY5qmPRIKhc4jooVCiM8y86tEdD0zf8MwjJfb2tp6VFXVxuswSESF1rn3ZGVHAjP3AUBjY2Nhhnut45EN4DgRFYxTxhlBMBjcpijKe5Ecm98JBAISGNu0DhiuQdkkFQcg9+/f3zzv/KlPLLh43ucEQWYjoGwQBMTjMRxu3I++vjBmX3ARnE7XqAKA00Ek0NLcVr1+w/bdGOqfleqz9abRmlIRCoVeU1W1HcCS1OuBQEBWVlY+A2AFgGeEEF++6qqr/n6qdhEA3QCKxtfa7GDm7wFoF0LcVFtbux5Ikq/f77/dMIytAB5ZunRp3VinZ5YRfSeAHzAzVVZWLgDwTma+GcAyAF5VVdd5PJ73VVdX94+13UKIHsMwYJrmeN/NBACoqKjoSb9BRGXjlD3FClkCAPh8vhtM0ywajS9YKqSUZK8cp8JalfsuEb0QDAZ/PM62oqamZruqqk8z8226rt8C4Lmxrtalfk53K4gDIO0vL77a2toRkspYeS+5gnf0cAMikQgGolEcOdx4SsSkSAX9/f11f37++ZB1KVXDO2fToYwRRwFU2L8yAKDr+leYeYWV+OuDwWDw+XEQE4iolZnz/H7/sF/204TdAJYEg8H1qRetTQ8+DMAZj8erA4HAKWsARMSapu3UNO2xUCh0q8vlmkZEjzHzdeFweNWpOIgSURsAMPN4E/5NB9CTvrBhYdp4BFuZKe3gdhiG8TVmXpv6fRkNTNN0WPKGfI8MwzCZeYXlV3dawMwvAwARJX3XxlofQwd1agiIHUDLtc/945ne3vBuxTF6gpKS0Np8BL3dXZAkIIVAT1cnmo8dy5I4LjOEkIjGYsdfrdvyeDQ6GDuXjZjejKRkw8XMcdtBzwoO/QyANZqmfXUsgoQQGTUAItoKAIlE4opTbaTf73+Xz+f7eBb5X8zmx2M5kX4VwIW6rv80m/yqqqoxfYdXr17doWnaJ4UQ3wDwroGBgVvHUh8AXC7XLgBRZn7HWOumgpnfQUQZV+SYuXA8pAzgfAB7U/5vT0HHRE5CCId1HmIcdrvd9i5F49XwBiGltHfiKQfGTk42UmPQhtmfOjo69PWbNv08Hot1KcrJHXAVRaL5WBNamo8N8XeSUuJ481E0Nx2FECcnOiIB0+TY6/sP/mJ/w5EWq102Qb0pwlRGg7vvvtsBYIYV+Q4AIKKLkZyCrRqrPGZemOm6w+F4Dcn3c9MpNhWGYfzMNM1PZLqXaceNVCxevPh/LPvTbZkIzufzeerq6gxVVcfsIFpeXv4gERnM/K6x1q2uro4RUR2A91ZVVY19igDACi85H8DL2coMDAxk/LucDJWVlfOQnDJutK8RUR8ARCKRMbWXmfOt85CVQ2uRZDszXztOEk191hTr43Hg1MjpZNO7GABj8+bdh/a/3vgr04SRbUs7KQmCgIaGeuzbuxMyfXUPAAmBvXt3o7GhHkRiRC2KSOB4S+szL67ftAVDsw7YxJS+3dObjpgA4NixYzdbeYoG/Y/sFSQiGrMhlZkzBvyuWrXqKBG9DOCOUwnz8Pv9lzLzLGZ+cax1gaT9SUp5OxEdN03zh36/f8jSeG1trU5E7QDGrNk98cQTEWZutFYvxwwhxK8BVGzYsCE9u8GoYJrmvwNgKeVvMtxObm7NnMnN4KTg5K4mEEKsTbl8xHru7DHKmml9HJb3i4j+iGSanA+eSjszPMvWRF8Hxqc5pQ7ydO0pDgC1z76w/nhz62ohJRTlxCFlcl+7jo5ObNm8CXt274QiJUiRECnkkwxFEVCIsGvPDmzevAFd7R1gk0FCQggFQiggK3d4T2/Py2u0F+x90FITyNkEldr2NyWqqqoUZv5f61c/1eHyoHWeMxZ5VuqQi0Yo8iiAOZWVlR8dY1NhGMa9AFhRlDE7htpIsT+5EonEMxl+pZ8DcKOqqmMadABARMVE1JHlXhzAsEDoFPwOQBuAb6xcudI1lueqqnoRgLsBaNmS31n2orsDgcCYjO5W6pvPANiemrPKiiWEtSgwapimeaNVf9iKrpTyl0hOF7+5fPnyUyJ5GytWrJjOzLcS0aG8vLwXgVMnJxvpeZ/sI46k1sJPP712Vd1rr23ZsX0Ldu7chp07t2Hrlk14bf06bKpbj5bW45CC4HQ6EI8ncPRYO7Zsb8DOfW1obgsjnmA4nQ5IIrQeb8aGjeux/tV12LZ5A3bv3I7dO7djx/bN2Lp1y+t/fXHD4ynPtkkym53pTUdQfr+/sK6urhpJTeHh1FQkbrf7dQARABkdKjNh6dKlMwA8SkTfAgAhxLDvg6ZpfyCil5j5W36//8LRyq6srLyLmf9NCPG1bANwtLDsTw8CuDAcDg8JzZFSPsrMEsAzYyEJv9//LmYuY+ZXsxTpQTKBXkZYWtt/MvO8hoaGUa9WBQKBImZ+CkDM6XSuzFKMmfkVAJt0Xf/+GGRLXdd/zszFUsohkQh5eXkagF4i+vRo35Pf758L4H1EtC0YDL6efr+mpqYJwP3MXBaLxf5yqgG+Pp/PE41G/4TkZpwP2nbU8ZBTeloVm6iGJKaLApFX67b+7NDBw4eOHjqEQ42NaG5qQn9f0j4niSCI0N7ei7pN+7F3/1F09oTRG46h/kgPtu9tQ1d3DCQFhExqVf29PTjW3ISDhxpw6FADmpuaW3cdOPqj1tbWbmQ2gKfax1Lb/qbA8uXLJ6mq+jXDMA4DWEZEv1q8ePF/p5ax/qC/Z+YP+Xy+k2YBqKysvMxK0LZWCGFPDzOuEHFyh42wYRgvjBQLZZUlVVU/ZuWdCl111VVfGVUnTwLL/vQ8gA9XVlYO2rCsTAk/ZeZF9fX1Ty5btqz4ZLJ8Pt/NiUTiDwD2l5WV/TJTGSJ6gZnPU1U1q8aoaVo1ku4KH/N6vT/3+XwjBh97vd6Zuq4/B2ChEOLONWvWNGYpSgAgpbwfwB2qqn7PsjNmhd/vL9R1/bfMvJSIvpu+P2J1dXW/EOJhZp538ODBn59Mns/nK08kEr8D4BJCVGUrFwqFfgbgf5n5skQisUFV1cBIctPh9XovNwxjPTMvIaKfBYPBx+17xMygDLaeMYDSDomk/5SCpIu/G4CYUl48q6K84AtEKM/kHhCPGzh+vAv94RiICHF2wwAhzw2UFxMcSmYeFYrsiycc32w82mb7M0UxVGuyNzA4qyt0VjaCNiIaMbOADWaeSETnIbnf/Awk3+dRIrrP9qBNxx133JHf2dm5AcAcZv41Ef1g2rRp++yl6kAg4BwYGLicmT/GzB8hoh8Fg8H7KysrizmZe+k4EX1LCNFTW1v7u1TZlZWV80zTXENE85n5V0T0a4/H80/7Vy4QCDij0egNhmE8yMzXAAg6nc470vNgA0mtJZFI/EVK6autrR31duR+v3+yYRhbmblYUZSra2pqtlvPlrqu/4KZ7ySiDmb+qsvlevayyy5rsDMG3Hnnne729vabTdNcDuBOAFvy8/PV6urqtkzPCgQCpeFweCsRTQawioheAKA7nc4XVq1aNcQzXFXVrwL4IjM3CiEezsvLeyZVrrXD7R1ITrcSzHxXKBRaiyxQVbWBmXeFQiGfqqrvYeZnkAxH+QGA1VZcIIBkjvhYLPYBZv4cM59HRN/SNO2BLH2Suq5rzPweABuklN90u92h1AiAQCAwcWBg4IPM/HlmnklED2uadu+If5hkm+8G8E1mLiaiPcz8NBG9IqU8wsxHamtrdSBplti0adNUwzBuJqK7mfkaIjIBPBgMBh+yF0mY+bSQEzCUnASSBCWRJCcHkkn1xfSK0osnFuXdR0RF6QRFJMBsoqWtB50dYcSRh8JCQlmRPBFynAZFyogh3N8/cPB4nVUiiuGpd1Onnsgs6Y3HaFOlpCBKRN1I5v3eJIQIud3uv5wst4+VPfFeK15pAhGZzNxERG5mLgNARPQsJXN8D2Z5tH7xHkTSZvWqpmk3pMu2AjfvJ6JPWAPBsDyZDQCTkfxb7yCiezVN+1u2Nqqqegsz/3Ws5GTVvQnA35j5QH5+/qJUJ0qv17sUwAMAbMNqnIiaABQxczGSnd/JzE+VlZU9km27bBvWwP+caZpLAVwAAEIINRgMhtLL+ny+K03T/Boz34LkD0kvEXVxMp+52/r/006n80tWZsyR+jhITpbs+cz8RWZ+PzPnEVEfM3cQUTkzF1h/h38A+GIoFBox3s/aAOLLpml+HoAdwtQJoB/ARGb2WO/pEBH9dzAYfHokeWnvoNwwjHuJ6FZmnpV2uxOATkQV1jQcSH7Ha4UQVVYoyyBONznZZ4HhGpQTSYKi86eWXVFS5P4cgQsy7BwOIoGubh16NIKCfJmVSoQUMSFdP97X0PoyTqzM2bamc4qYgOSXYrRlFyxYwONxngSSGyH09fUtZOaZpmnOIKIeImoAsPdUdlxJBTOTNb2bx8wVACQRtUopX1u7du3u0cgIBAJytEnU0lFVVSV27dpF2eovX758UiwWm0tEc5l5ujX4WqSU+0bbvkxgZjqZ+4PP5ysHcB0zT2PmIiFEKxEdmjlz5kuj3dstnZxsLFu2rNgwjCUAzjNNcxKAbiJqJqKXxxok7PP5PKZp+gFczsyTiKiMmfuJqFkIsb6srEwbTxzi0qVLF8bj8csBXILkRgwTrHd3CMAhIcRBIvpHph10gNNLTsAJgrLJSViHPb1zWgfmzJi0aEKB4x4CFWbzAO/T+8FZ4l8UqUQh3I/uO9j8knUplZjieAvYmXJ4+0JV1Xpm3p1OTm8nMPO4V+uGyLPOqaSQGntnEwjqj7Ru6umNfgeE9uE78iYzCmTSqgDA4XCEhZL3iEVMmTSmHDHlkMNbAKeTnIDMBJWaOdMmEm441r6trav/6yzoAEkxRIQgCSns1FGWOAKcTvdxIs8399Q3rUP2qdyb3gM8hxxyOP3kBAx3MUh30LSN1jjS3N3Q1NT/PybL54TiiCsOBU63B1HTid4BkZDSBSkEHA4Xe/IL10chH9zTcNTeoMCWk0ljeivEzuWQw9sapxQXNAqkk0Km6ZUJwNHS1dXd0tX1s4svOO+FQk/+hR19A+8O69HpHV39Slh3HTpvasnzJMWh1w+27IpEIjYJpe/Smx6akiOlHHJ4k+ONIicb6WQEWBsj4ASJKADk7v2H9wDY43Q6XyosLLwKAPr6+zfu2t/faZUnDA9HyaYxpT87hxxyeJPhjSQnxnAPpdRl/VR7lO0XJWKxWHtHR4eW0r5U43p6mt10bSlHTDm8FfCEEOL42W7E2cbpdCXI+oyUzyLl/xIn/KFEykFpdVJj91IJKZt9KUdMOeTwJgczv+HTOuCEBgWc2BzB3iCBUu5nIiak1EtdAcxGSDliyiGHtwjOBDkBJ0gjUyCKTVKpxJVeNxMZ5bSlHHJ4C+NMkZON9ER1qWEvJ5tbZiOjHDHlkMNbEGeanGykE0qqZjWW8jnkkMNbFGeLnGxkIp1M07occsjhbYb/Dz5pslyV7SR4AAAAAElFTkSuQmCC\"}))}}])&&Br(n.prototype,r),Object.defineProperty(n,\"prototype\",{writable:!1}),l}(e.Component);function Qr(e){return Qr=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},Qr(e)}function Yr(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,Zr(r.key),r)}}function Zr(e){var t=function(e,t){if(\"object\"!=Qr(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,\"string\");if(\"object\"!=Qr(r))return r;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return String(e)}(e);return\"symbol\"==Qr(t)?t:String(t)}function Jr(e,t){return Jr=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},Jr(e,t)}function Xr(e){return Xr=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},Xr(e)}function Kr(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}var $r,eo=nr.section(Hr||(Hr=Kr([\"\\n  width: 100%;\\n  margin: 0 auto;\\n  display: flex;\\n  padding: 0 30px;\\n  align-items: center;\\n  box-sizing: border-box;\\n  flex-wrap: wrap;\\n\"]))),to=nr.div(Vr||(Vr=Kr([\"\\n  width: 100%;\\n  height: 3px;\\n  background: \",\";\\n  flex-basis: 100%;\\n  margin: 10px 0;\\n\"])),ur),no=function(t){!function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,\"prototype\",{writable:!1}),t&&Jr(e,t)}(l,t);var n,r,o,i,a=(o=l,i=function(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,t=Xr(o);if(i){var n=Xr(this).constructor;e=Reflect.construct(t,arguments,n)}else e=t.apply(this,arguments);return function(e,t){if(t&&(\"object\"===Qr(t)||\"function\"==typeof t))return t;if(void 0!==t)throw new TypeError(\"Derived constructors may only return object or undefined\");return function(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e}(e)}(this,e)});function l(){return function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,l),a.apply(this,arguments)}return n=l,(r=[{key:\"render\",value:function(){return e.createElement(eo,null,e.createElement(jr,null),e.createElement(Dr,null),e.createElement(qr,null),e.createElement(to,null))}}])&&Yr(n.prototype,r),Object.defineProperty(n,\"prototype\",{writable:!1}),l}(e.Component),ro=function(e){return{type:\"FILTER_TESTS\",status:e}};function oo(e){return oo=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},oo(e)}function io(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,ao(r.key),r)}}function ao(e){var t=function(e,t){if(\"object\"!=oo(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,\"string\");if(\"object\"!=oo(r))return r;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return String(e)}(e);return\"symbol\"==oo(t)?t:String(t)}function lo(e,t){return lo=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},lo(e,t)}function uo(e){return uo=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},uo(e)}var co,so=nr.button($r||($r=function(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}([\"\\n  font-size: 20px;\\n  font-family: \",\";\\n  flex: 0 0 auto;\\n  margin: 0;\\n  background-color: \",\";\\n  border: none;\\n  border-radius: 3px;\\n  box-shadow: \",\";\\n  color: \",\";\\n  margin-right: 15px;\\n  padding: 0px 30px;\\n  opacity: \",\";\\n  outline: none;\\n  height: 100%;\\n  transition: all 0.3s ease-in-out;\\n\\n  &:hover {\\n    cursor: pointer;\\n    box-shadow: \",\";\\n  }\\n\\n  &.pass {\\n    background-color: \",\";\\n    color: \",\";\\n  }\\n\\n  &.fail {\\n    background-color: \",\";\\n    color: \",\";\\n  }\\n\"])),dr,fr,(function(e){return e.selected?\"none\":mr}),ir,(function(e){return e.selected?\"1\":\"0.5\"}),(function(e){return e.selected?\"\":br}),cr,fr,sr,fr),fo=function(t){!function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,\"prototype\",{writable:!1}),t&&lo(e,t)}(l,t);var n,r,o,i,a=(o=l,i=function(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,t=uo(o);if(i){var n=uo(this).constructor;e=Reflect.construct(t,arguments,n)}else e=t.apply(this,arguments);return function(e,t){if(t&&(\"object\"===oo(t)||\"function\"==typeof t))return t;if(void 0!==t)throw new TypeError(\"Derived constructors may only return object or undefined\");return function(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e}(e)}(this,e)});function l(){return function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,l),a.apply(this,arguments)}return n=l,(r=[{key:\"render\",value:function(){var t=this.props,n=t.count,r=t.label,o=t.status;return e.createElement(so,{onClick:this.props.onClick,selected:this.props.selected,className:o},\"all\"!==o?n:\"\",\" \",r)}}])&&io(n.prototype,r),Object.defineProperty(n,\"prototype\",{writable:!1}),l}(e.Component);function po(e){return po=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},po(e)}function yo(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,ho(r.key),r)}}function ho(e){var t=function(e,t){if(\"object\"!=po(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,\"string\");if(\"object\"!=po(r))return r;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return String(e)}(e);return\"symbol\"==po(t)?t:String(t)}function mo(e,t){return mo=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},mo(e,t)}function bo(e){return bo=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},bo(e)}var vo=nr.div(co||(co=function(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}([\"\\n  display: flex;\\n  flex: 0 0 auto;\\n  height: 100%;\\n\"])));function go(t){var n=t.availableStatus.map((function(n){return e.createElement(fo,{status:n.id,key:n.id,label:n.label,selected:t.filterStatus===n.id,count:n.count,onClick:function(){return t.onClick(n.id)}})}));return e.createElement(\"div\",{style:{height:\"100%\"}},n)}var wo=function(t){!function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,\"prototype\",{writable:!1}),t&&mo(e,t)}(l,t);var n,r,o,i,a=(o=l,i=function(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,t=bo(o);if(i){var n=bo(this).constructor;e=Reflect.construct(t,arguments,n)}else e=t.apply(this,arguments);return function(e,t){if(t&&(\"object\"===po(t)||\"function\"==typeof t))return t;if(void 0!==t)throw new TypeError(\"Derived constructors may only return object or undefined\");return function(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e}(e)}(this,e)});function l(){return function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,l),a.apply(this,arguments)}return n=l,(r=[{key:\"render\",value:function(){var t=this.props.tests,n=[{id:\"all\",label:\"all\",count:t.all.length},{id:\"pass\",label:\"passed\",count:t.all.filter((function(e){return\"pass\"===e.status})).length},{id:\"fail\",label:\"failed\",count:t.all.filter((function(e){return\"fail\"===e.status})).length}];return e.createElement(vo,null,e.createElement(go,{availableStatus:n,onClick:this.props.onButtonClick,filterStatus:t.filterStatus}))}}])&&yo(n.prototype,r),Object.defineProperty(n,\"prototype\",{writable:!1}),l}(e.Component);const So=X((function(e){return{tests:e.tests}}),(function(e){return{onButtonClick:function(t){e(ro(t))}}}))(wo);function Oo(e){return Oo=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},Oo(e)}var Eo;function ko(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,Po(r.key),r)}}function Po(e){var t=function(e,t){if(\"object\"!=Oo(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,\"string\");if(\"object\"!=Oo(r))return r;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return String(e)}(e);return\"symbol\"==Oo(t)?t:String(t)}function xo(e,t){return xo=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},xo(e,t)}function jo(e){return jo=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},jo(e)}var Co,To=nr.input(Eo||(Eo=function(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}([\"\\n  display: block;\\n  height: 100%;\\n  border: none;\\n  font-size: 16px;\\n  background-color: \",\";\\n  padding: 0 10px 0 55px;\\n  font-family: \",\";\\n  width: 100%;\\n  box-sizing: border-box;\\n  border-radius: 3px;\\n  background-image: url(\",\");\\n  background-repeat: no-repeat;\\n  background-position-x: 15px;\\n  background-position-y: calc(100% / 2);\\n  background-size: 22px;\\n\\n  &:focus {\\n    outline: none;\\n  }\\n\\n  &::placeholder {\\n    font-family: \",\";\\n    font-weight: 400;\\n    font-style: italic;\\n    color: \",\";\\n  }\\n\"])),pr,dr,\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC4AAAAsCAYAAAAacYo8AAAABGdBTUEAALGPC/xhBQAABf5JREFUWAnVmVlMXFUYx52hgFJZ22ihiAaiVYyJqcaWBzBlp2QolWBilcCb0WhsE2ONdUHTaGLsi74YTJTE5UGaWkDKjiTIA2lMTVVqSzSxGGrbyCJb2Wb8fZd7bi6XWe7QmUk5yZmzfd//+5/vnHu2cdwWhlBYWPgQsAc8Hs8eYqrD4UijfDdxkjhG3RjpMPUtubm5g/X19W7KQQVHUNJ+hKurq++cmJg4DKka4gN+RK1N1+nAKeL7PT09l62NvspRvhrs1uOtLYTn5+fnT0HYhd42i+48pEaJvxNniDG0326S2Ur+ceKLmZmZSdnZ2WdHRkZumNq9Zm/K40VFRWlut7sZwmJYCxBbINND2kxs6+7ulmmxJlRUVMTPzs4WUFlJdKGfogTQuUaswvs/qjpv6YaJ5+fnP4GB0xhNFWDyMk8bY2Ji3mlvb//bmzFvdS6XK45OHEH/NbASRIb8IvEFyH/uTUeT8dXgr764uDhveXm5ExltyDFyISoq6umurq5f/en5a6MD2+fm5hogf1DJgXu0t7f3Q1U2p0F7vLS09L7FxcWzgGzXgc7ExsY+g5f/MwNvJA9pR0FBwXvovin6EHc7nc6DTLcWK57TWuGvLCvH0tKSgGikAT6Zl5fnCgVpsQuep6+v7y3SV6RMR5wrKytflZSUPCxlcwiK+Pj4+BuAPSIAgJ+Li4ur3cgabCbgLc/0+Bj8Br0tnmn5mVXONnE+xp2QPqwDyLJW2draOmcFDFU5KyvrJbB+Ejzs5mDfmPtSZ5s4RN9F/g5Nyek8EcxmITrBhoaGhiXm96smvQ9kz1BlW8Rl3UXhOVGiA1eTk5M/UgDhTHFOP/hndBu7BgYG9il7tojPzMyUMlyxogTxxqamphkFEO4Ue5+YbMiGpQVbxJE0FMifXlWNzG9KSkoflqbFGs6rIGpLuC3i9FobIpkmrKlDkaG8aoXRXSTXodtM5+R5v+QDEtc/CDmSSo9/g7xH8pEM2PxF2WOHTpd8QOJDQ0M7IKzJAbDuwKQAw5wadtmQ5GwfmDjbu3aI0oldCTNBr/Asi4ZdnKfxCehxBJdNaHKWjnjg6GzYZfRlzgf2OHPqH8UUJW2YVDmCqWEXDtq0CejxnJyc6xBUH6QBEEHSsncYdtW0CUicVUWmyiUhCsCjdXV15mtXRPgzVXKUITj8KfmAxEUIYbk0yHK4dXR0tFDykQrl5eXJ2MoTe/A4r66CtohDWG0AQv6pSJEWOwsLC3IBV4crY9e2RTwjI+MHlLWPlF4f2r9//70CGu7AxSUKRx1Vdpjf3xl5lfGXNjY23kDphMgAFIsXjvuTD1UbF5c67GXreF1Mk58Vti2PizBH2U/x9r+SB+xZ7obGEVPqQh0YVdmxlYM8LMuG58WWbeJylMXrR3SCckJr4sCTqZdDmpSVlcmoyrTYIcA47Guzt6XONnERRvlLkm8kjze2sUy18FRxl5RDFeRQB+kvwN8rmJC+FB8f/7IVXzvbWiv9lSH6IJfXYcEUOYAvMxIHrB7xh+Grjdt8CtgnIa2m4SQPTHs7OjouWnWCejsEOBVgWRrVm4rgJRJrePebrK2tPdff3++WymADz3nFnPzkOW+36OKQWRxSxSOTvOGsC7Y9LqR5U5FlcZeOchHwcQyZdzXZYY9xQ2+Wy+46a14qGME9ED4Ojnlj+wvsCp4pzntR0apsEfdGOjo6el9CQsI1lqy3QTqGYfPoTWK4DY+1QeoPXnOvJCYmXp2amkpCLo26e2gvIC9XwjV7AvU9TI9DPDLJGclnCEjcF+nOzk7jjJy/+gBaD5Eyn5YCN8jt6nW8/H1gUf0D8yVoh7RZl2F/jG9Ans+kA+bvwCxm5CE6S2c7SZv4Z+JbVhTb34dPjwdL2mBDBgLOwcHB3SyXT0JsJ1VyZ5WOTDJ95DwtcTg9Pb1XdmXyQQevxG+GdNAMNqiwjvhmIC19XUN8s5BeQ3wzkTaIbzbSQtxZWVmZZN0RZXMxr9MieKsF5/T0dBWkjG18M5AWJ25h8ZfzxwXW2zFI19zqnhbSEv4HOhR+tKGIkEUAAAAASUVORK5CYII=\",hr,lr),Ao=function(t){!function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,\"prototype\",{writable:!1}),t&&xo(e,t)}(l,t);var n,r,o,i,a=(o=l,i=function(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,t=jo(o);if(i){var n=jo(this).constructor;e=Reflect.construct(t,arguments,n)}else e=t.apply(this,arguments);return function(e,t){if(t&&(\"object\"===Oo(t)||\"function\"==typeof t))return t;if(void 0!==t)throw new TypeError(\"Derived constructors may only return object or undefined\");return function(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e}(e)}(this,e)});function l(){return function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,l),a.apply(this,arguments)}return n=l,(r=[{key:\"render\",value:function(){return e.createElement(To,{placeholder:\"Filter tests with search...\",onChange:this.props.onChange.bind(this)})}}])&&ko(n.prototype,r),Object.defineProperty(n,\"prototype\",{writable:!1}),l}(e.Component);function Ro(e){return Ro=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},Ro(e)}function _o(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,Io(r.key),r)}}function Io(e){var t=function(e,t){if(\"object\"!=Ro(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,\"string\");if(\"object\"!=Ro(r))return r;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return String(e)}(e);return\"symbol\"==Ro(t)?t:String(t)}function No(e,t){return No=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},No(e,t)}function Mo(e){return Mo=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},Mo(e)}var Do=nr.div(Co||(Co=function(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}([\"\\n  flex: 1 1 auto;\\n  height: 100%;\\n\"]))),Lo=function(t){!function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,\"prototype\",{writable:!1}),t&&No(e,t)}(l,t);var n,r,o,i,a=(o=l,i=function(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,t=Mo(o);if(i){var n=Mo(this).constructor;e=Reflect.construct(t,arguments,n)}else e=t.apply(this,arguments);return function(e,t){if(t&&(\"object\"===Ro(t)||\"function\"==typeof t))return t;if(void 0!==t)throw new TypeError(\"Derived constructors may only return object or undefined\");return function(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e}(e)}(this,e)});function l(){return function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,l),a.apply(this,arguments)}return n=l,(r=[{key:\"onChange\",value:function(e){var t=e.target.value;t.length>0?this.props.findTest(t):this.props.filterTests(this.props.tests.filterStatus)}},{key:\"render\",value:function(){return e.createElement(Do,null,e.createElement(Ao,{onChange:this.onChange.bind(this)}))}}])&&_o(n.prototype,r),Object.defineProperty(n,\"prototype\",{writable:!1}),l}(e.Component);const zo=X((function(e){return{tests:e.tests}}),(function(e){return{findTest:function(t){e(function(e){return{type:\"SEARCH_TESTS\",value:e}}(t))},filterTests:function(t){e(ro(t))}}}))(Lo);function Bo(e){return Bo=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},Bo(e)}var Fo;function Uo(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,Wo(r.key),r)}}function Wo(e){var t=function(e,t){if(\"object\"!=Bo(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,\"string\");if(\"object\"!=Bo(r))return r;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return String(e)}(e);return\"symbol\"==Bo(t)?t:String(t)}function Ho(e,t){return Ho=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},Ho(e,t)}function Vo(e){return Vo=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},Vo(e)}var Go,qo=nr.button(Fo||(Fo=function(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}([\"\\n  border: none;\\n  height: 100%;\\n  border-radius: 3px;\\n  background: \",\";\\n  margin-left: 15px;\\n  padding: 0 20px;\\n  box-shadow: \",\";\\n  transition: all 0.3s ease-in-out;\\n\\n  &.active {\\n    box-shadow: none;\\n    opacity: 0.6;\\n  }\\n\\n  &:hover {\\n    cursor: pointer;\\n    box-shadow: \",\";\\n  }\\n\\n  &:focus {\\n    outline: none;\\n  }\\n\\n  .icon {\\n    height: 18px;\\n    width: 18px;\\n    display: block;\\n    background-image: url(\",\");\\n    background-size: 100%;\\n    background-repeat: no-repeat;\\n    background-position: center;\\n    margin: 0 auto;\\n    padding-bottom: 5px;\\n  }\\n\\n  .label {\\n    font-family: \",\";\\n    color: \",\";\\n  }\\n\"])),pr,mr,(function(e){return e.selected?\"\":br}),\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAQZJREFUWAndVEESgyAMLB1fxrF9bznyNQudsSq62QZisfWiZiEkm2XdBTze+0eCbgAOMcY7wFThq7AaHZ63SJiQcgsN29A6kjp1y0hiZlz+t35LDLTm/mj/QGYNkxgxEboy4JwbB6Rm1mGpDUgVAboykGujt4AxQRqksMRAQLvT7LJJ/cezMpmWlsh1htYtjUBbj2TPEKMi1FZRXk8mYksGtLW+1ldbsfY0wMSJrdiow3eaUhsT0F8DUyVWbzBrmN6Sgd+0bmjFtdYKuQaANAJonymXhIGj9sPUisvroxXZ/rFzVGJgXnXgV7UVGzFxYitmHZbaqJ1Sfw2wyhkTbD/DJQa+Yq1PGOtJ/BpD3bUAAAAASUVORK5CYII=\",dr,lr),Qo=function(t){!function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,\"prototype\",{writable:!1}),t&&Ho(e,t)}(l,t);var n,r,o,i,a=(o=l,i=function(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,t=Vo(o);if(i){var n=Vo(this).constructor;e=Reflect.construct(t,arguments,n)}else e=t.apply(this,arguments);return function(e,t){if(t&&(\"object\"===Bo(t)||\"function\"==typeof t))return t;if(void 0!==t)throw new TypeError(\"Derived constructors may only return object or undefined\");return function(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e}(e)}(this,e)});function l(){return function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,l),a.apply(this,arguments)}return n=l,(r=[{key:\"render\",value:function(){var t=this.props.active?\"active\":\"\";return e.createElement(qo,{onClick:this.props.onClick,className:t},e.createElement(\"span\",{className:\"icon\"}))}}])&&Uo(n.prototype,r),Object.defineProperty(n,\"prototype\",{writable:!1}),l}(e.Component),Yo=o(635),Zo=o.n(Yo);function Jo(e){return Jo=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},Jo(e)}function Xo(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,Ko(r.key),r)}}function Ko(e){var t=function(e,t){if(\"object\"!=Jo(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,\"string\");if(\"object\"!=Jo(r))return r;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return String(e)}(e);return\"symbol\"==Jo(t)?t:String(t)}function $o(e,t){return $o=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},$o(e,t)}function ei(e){return ei=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},ei(e)}var ti,ni=nr.div(Go||(Go=function(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}([\"\\n  display: flex;\\n  align-items: center;\\n  justify-content: space-between;\\n  padding: 10px 0;\\n\\n  span {\\n    padding-right: 10px;\\n    text-align: left;\\n    font-family: \",\";\\n    color: \",\";\\n    font-size: 14px;\\n  }\\n\"])),dr,ir),ri=function(t){!function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,\"prototype\",{writable:!1}),t&&$o(e,t)}(l,t);var n,r,o,i,a=(o=l,i=function(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,t=ei(o);if(i){var n=ei(this).constructor;e=Reflect.construct(t,arguments,n)}else e=t.apply(this,arguments);return function(e,t){if(t&&(\"object\"===Jo(t)||\"function\"==typeof t))return t;if(void 0!==t)throw new TypeError(\"Derived constructors may only return object or undefined\");return function(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e}(e)}(this,e)});function l(){return function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,l),a.apply(this,arguments)}return n=l,(r=[{key:\"render\",value:function(){var t=this.props,n=t.label,r=t.value,o=t.onToggle;return e.createElement(ni,null,e.createElement(\"span\",null,n),e.createElement(Zo(),{value:r||!1,onToggle:o}))}}])&&Xo(n.prototype,r),Object.defineProperty(n,\"prototype\",{writable:!1}),l}(e.Component);function oi(e){return oi=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},oi(e)}function ii(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,ai(r.key),r)}}function ai(e){var t=function(e,t){if(\"object\"!=oi(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,\"string\");if(\"object\"!=oi(r))return r;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return String(e)}(e);return\"symbol\"==oi(t)?t:String(t)}function li(e,t){return li=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},li(e,t)}function ui(e){return ui=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},ui(e)}var ci=nr.div(ti||(ti=function(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}([\"\\n  display: block;\\n  position: absolute;\\n  width: auto;\\n  min-height: 100px;\\n  background-color: \",\";\\n  box-shadow: \",\";\\n  right: 38px;\\n  margin-top: 20px;\\n  border-radius: 3px;\\n  padding: 10px 25px;\\n  z-index: 10;\\n\\n  /* @TODO: shadow on arrow */\\n  &:before {\\n    content: '';\\n    display: block;\\n    width: 0;\\n    height: 0;\\n    position: absolute;\\n\\n    border-top: 8px solid transparent;\\n    border-bottom: 8px solid \",\";\\n    border-right: 8px solid transparent;\\n    border-left: 8px solid transparent;\\n    right: 30px;\\n    top: -16px;\\n  }\\n\"])),pr,mr,pr),si=function(t){!function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,\"prototype\",{writable:!1}),t&&li(e,t)}(l,t);var n,r,o,i,a=(o=l,i=function(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,t=ui(o);if(i){var n=ui(this).constructor;e=Reflect.construct(t,arguments,n)}else e=t.apply(this,arguments);return function(e,t){if(t&&(\"object\"===oi(t)||\"function\"==typeof t))return t;if(void 0!==t)throw new TypeError(\"Derived constructors may only return object or undefined\");return function(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e}(e)}(this,e)});function l(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,l),(t=a.call(this,e)).state={hideAll:!1},t}return n=l,(r=[{key:\"toggleAll\",value:function(e){this.setState({hideAll:!e}),this.props.toggleAll(e)}},{key:\"onToggle\",value:function(e,t){t||this.setState({hideAll:!1}),this.props.onToggle(e)}},{key:\"render\",value:function(){var t=this.props.settings;return e.createElement(ci,null,e.createElement(ri,{id:\"textInfo\",label:\"Text info\",value:t.textInfo,onToggle:this.onToggle.bind(this,\"textInfo\")}),e.createElement(ri,{id:\"hideAll\",label:\"Hide all images\",value:this.state.hideAll,onToggle:this.toggleAll.bind(this)}),e.createElement(ri,{id:\"refImage\",label:\"Reference image\",value:t.refImage,onToggle:this.onToggle.bind(this,\"refImage\")}),e.createElement(ri,{id:\"testImage\",label:\"Test image\",value:t.testImage,onToggle:this.onToggle.bind(this,\"testImage\")}),e.createElement(ri,{id:\"diffImage\",label:\"Diff image\",value:t.diffImage,onToggle:this.onToggle.bind(this,\"diffImage\")}))}}])&&ii(n.prototype,r),Object.defineProperty(n,\"prototype\",{writable:!1}),l}(e.Component);const fi=X((function(e){return{settings:e.layoutSettings}}),(function(e){return{onToggle:function(t){e(function(e){return{type:\"UPDATE_SETTINGS\",id:e}}(t))},toggleAll:function(t){e(function(e){return{type:\"TOGGLE_ALL_IMAGES\",value:e}}(t))}}}))(si);function pi(e){return pi=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},pi(e)}var di;function yi(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,hi(r.key),r)}}function hi(e){var t=function(e,t){if(\"object\"!=pi(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,\"string\");if(\"object\"!=pi(r))return r;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return String(e)}(e);return\"symbol\"==pi(t)?t:String(t)}function mi(e,t){return mi=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},mi(e,t)}function bi(e){return bi=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},bi(e)}var vi=nr.div(di||(di=function(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}([\"\\n  flex: 0 0 auto;\\n  height: 100%;\\n\"]))),gi=function(t){!function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,\"prototype\",{writable:!1}),t&&mi(e,t)}(l,t);var n,r,o,i,a=(o=l,i=function(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,t=bi(o);if(i){var n=bi(this).constructor;e=Reflect.construct(t,arguments,n)}else e=t.apply(this,arguments);return function(e,t){if(t&&(\"object\"===pi(t)||\"function\"==typeof t))return t;if(void 0!==t)throw new TypeError(\"Derived constructors may only return object or undefined\");return function(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e}(e)}(this,e)});function l(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,l),(t=a.call(this,e)).state={popup:!1},t}return n=l,(r=[{key:\"onButtonClick\",value:function(){this.setState({popup:!this.state.popup})}},{key:\"render\",value:function(){var t=this.state.popup;return e.createElement(vi,null,e.createElement(Qo,{onClick:this.onButtonClick.bind(this),active:this.state.popup}),t&&e.createElement(fi,null))}}])&&yi(n.prototype,r),Object.defineProperty(n,\"prototype\",{writable:!1}),l}(e.Component);const wi=X((function(e){return{}}),(function(e){return{}}))(gi);function Si(e){return Si=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},Si(e)}var Oi;function Ei(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,ki(r.key),r)}}function ki(e){var t=function(e,t){if(\"object\"!=Si(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,\"string\");if(\"object\"!=Si(r))return r;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return String(e)}(e);return\"symbol\"==Si(t)?t:String(t)}function Pi(e,t){return Pi=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},Pi(e,t)}function xi(e){return xi=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},xi(e)}var ji,Ci=nr.section(Oi||(Oi=function(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}([\"\\n  width: 100%;\\n  padding: 10px 30px;\\n  background: \",\";\\n  height: 70px;\\n  display: flex;\\n  box-sizing: border-box;\\n\\n  @media print {\\n    display: none;\\n  }\\n\"])),ar),Ti=function(t){!function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,\"prototype\",{writable:!1}),t&&Pi(e,t)}(l,t);var n,r,o,i,a=(o=l,i=function(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,t=xi(o);if(i){var n=xi(this).constructor;e=Reflect.construct(t,arguments,n)}else e=t.apply(this,arguments);return function(e,t){if(t&&(\"object\"===Si(t)||\"function\"==typeof t))return t;if(void 0!==t)throw new TypeError(\"Derived constructors may only return object or undefined\");return function(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e}(e)}(this,e)});function l(){return function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,l),a.apply(this,arguments)}return n=l,(r=[{key:\"render\",value:function(){return e.createElement(Ci,{style:this.props.style},e.createElement(So,null),e.createElement(zo,null),e.createElement(wi,null))}}])&&Ei(n.prototype,r),Object.defineProperty(n,\"prototype\",{writable:!1}),l}(e.Component);function Ai(e){return Ai=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},Ai(e)}function Ri(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,_i(r.key),r)}}function _i(e){var t=function(e,t){if(\"object\"!=Ai(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,\"string\");if(\"object\"!=Ai(r))return r;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return String(e)}(e);return\"symbol\"==Ai(t)?t:String(t)}function Ii(e,t){return Ii=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},Ii(e,t)}function Ni(e){return Ni=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},Ni(e)}var Mi,Di,Li=nr.section(ji||(ji=function(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}([\"\\n  width: 100%;\\n  margin: 0 auto;\\n  padding: 15px 0;\\n  z-index: 999;\\n  box-sizing: border-box;\\n  position: relative;\\n\"]))),zi=function(t){!function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,\"prototype\",{writable:!1}),t&&Ii(e,t)}(l,t);var n,r,o,i,a=(o=l,i=function(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,t=Ni(o);if(i){var n=Ni(this).constructor;e=Reflect.construct(t,arguments,n)}else e=t.apply(this,arguments);return function(e,t){if(t&&(\"object\"===Ai(t)||\"function\"==typeof t))return t;if(void 0!==t)throw new TypeError(\"Derived constructors may only return object or undefined\");return function(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e}(e)}(this,e)});function l(){return function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,l),a.apply(this,arguments)}return n=l,(r=[{key:\"render\",value:function(){return e.createElement(Li,{className:\"header\"},e.createElement(no,null),e.createElement(or.Le,{topOffset:72},(function(t){t.isSticky,t.wasSticky;var n=t.style;return t.distanceFromTop,t.distanceFromBottom,t.calculatedHeight,e.createElement(Ti,{style:n})})))}}])&&Ri(n.prototype,r),Object.defineProperty(n,\"prototype\",{writable:!1}),l}(e.Component);function Bi(e){return Bi=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},Bi(e)}function Fi(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,Ui(r.key),r)}}function Ui(e){var t=function(e,t){if(\"object\"!=Bi(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,\"string\");if(\"object\"!=Bi(r))return r;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return String(e)}(e);return\"symbol\"==Bi(t)?t:String(t)}function Wi(e,t){return Wi=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},Wi(e,t)}function Hi(e){return Hi=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},Hi(e)}function Vi(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}var Gi=nr.div(Mi||(Mi=Vi([\"\\n  background: transparent;\\n  display: \",\";\\n  padding: 10px;\\n  font-family: \",\";\\n  color: \",\";\\n\"])),(function(e){return e.display?\"block\":\"none\"}),dr,lr),qi=nr.p(Di||(Di=Vi([\"\\n  word-wrap: break-word;\\n  font-family: monospace;\\n  background: rgb(251, 234, 234);\\n  padding: 2ex;\\n  color: brown;\\n  display: \",\";\\n\"])),(function(e){return e.display?\"block\":\"none\"})),Qi=function(t){!function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,\"prototype\",{writable:!1}),t&&Wi(e,t)}(l,t);var n,r,o,i,a=(o=l,i=function(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,t=Hi(o);if(i){var n=Hi(this).constructor;e=Reflect.construct(t,arguments,n)}else e=t.apply(this,arguments);return function(e,t){if(t&&(\"object\"===Bi(t)||\"function\"==typeof t))return t;if(void 0!==t)throw new TypeError(\"Derived constructors may only return object or undefined\");return function(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e}(e)}(this,e)});function l(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,l),(t=a.call(this,e)).state={},t}return n=l,(r=[{key:\"render\",value:function(){var t=this.props.info.error,n=this.props.info.engineErrorMsg,r=!!n||!!t;return e.createElement(Gi,{display:r},e.createElement(qi,{display:n},\"ENGINE ERROR: \",n),e.createElement(qi,{display:t},\"BACKSTOP ERROR: \",t))}}])&&Fi(n.prototype,r),Object.defineProperty(n,\"prototype\",{writable:!1}),l}(e.Component);const Yi=X((function(e){return{settings:e.layoutSettings}}))(Qi);function Zi(e){return Zi=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},Zi(e)}var Ji,Xi;function Ki(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,$i(r.key),r)}}function $i(e){var t=function(e,t){if(\"object\"!=Zi(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,\"string\");if(\"object\"!=Zi(r))return r;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return String(e)}(e);return\"symbol\"==Zi(t)?t:String(t)}function ea(e,t){return ea=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},ea(e,t)}function ta(e){return ta=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},ta(e)}function na(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}var ra,oa,ia,aa=nr.span(Ji||(Ji=na([\"\\n  font-family: \",\";\\n  color: \",\";\\n  font-size: 14px;\\n  padding-right: 8px;\\n\"])),dr,lr),la=nr.span(Xi||(Xi=na([\"\\n  font-family: \",\";\\n  color: \",\";\\n  font-size: 14px;\\n  padding-right: 20px;\\n\"])),yr,ir),ua=function(t){!function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,\"prototype\",{writable:!1}),t&&ea(e,t)}(l,t);var n,r,o,i,a=(o=l,i=function(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,t=ta(o);if(i){var n=ta(this).constructor;e=Reflect.construct(t,arguments,n)}else e=t.apply(this,arguments);return function(e,t){if(t&&(\"object\"===Zi(t)||\"function\"==typeof t))return t;if(void 0!==t)throw new TypeError(\"Derived constructors may only return object or undefined\");return function(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e}(e)}(this,e)});function l(){return function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,l),a.apply(this,arguments)}return n=l,(r=[{key:\"render\",value:function(){var t=this.props,n=t.diff,r=t.suppress;return!n||r?null:e.createElement(\"span\",null,e.createElement(aa,null,\"diff%: \"),e.createElement(la,null,n.misMatchPercentage,\" \"),e.createElement(aa,null,\"diff-x: \"),e.createElement(la,null,n.dimensionDifference.width,\" \"),e.createElement(aa,null,\"diff-y: \"),e.createElement(la,null,n.dimensionDifference.height,\" \"))}}])&&Ki(n.prototype,r),Object.defineProperty(n,\"prototype\",{writable:!1}),l}(e.Component);function ca(e){return ca=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},ca(e)}function sa(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,fa(r.key),r)}}function fa(e){var t=function(e,t){if(\"object\"!=ca(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,\"string\");if(\"object\"!=ca(r))return r;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return String(e)}(e);return\"symbol\"==ca(t)?t:String(t)}function pa(e,t){return pa=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},pa(e,t)}function da(e){return da=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},da(e)}function ya(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}var ha,ma,ba,va=nr.span(ra||(ra=ya([\"\\n  font-family: \",\";\\n  color: \",\";\\n  font-size: 14px;\\n  padding-right: 8px;\\n\"])),dr,lr),ga=nr.span(oa||(oa=ya([\"\\n  font-family: \",\";\\n  color: \",\";\\n  font-size: 14px;\\n  padding-right: 20px;\\n\"])),yr,ir),wa=nr.a(ia||(ia=ya([\"\\n  &::before {\\n    content: \",\";\\n    margin: \",\";\\n  }\\n\"])),(function(e){return e.withSeperator?'\"|\"':\"\"}),(function(e){return e.withSeperator?\"0 10px\":\"\"})),Sa=function(t){!function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,\"prototype\",{writable:!1}),t&&pa(e,t)}(l,t);var n,r,o,i,a=(o=l,i=function(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,t=da(o);if(i){var n=da(this).constructor;e=Reflect.construct(t,arguments,n)}else e=t.apply(this,arguments);return function(e,t){if(t&&(\"object\"===ca(t)||\"function\"==typeof t))return t;if(void 0!==t)throw new TypeError(\"Derived constructors may only return object or undefined\");return function(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e}(e)}(this,e)});function l(){return function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,l),a.apply(this,arguments)}return n=l,(r=[{key:\"render\",value:function(){var t=this.props,n=t.url,r=t.referenceUrl;return e.createElement(\"span\",null,e.createElement(va,null,\"url: \"),e.createElement(ga,null,e.createElement(wa,{href:n,target:\"_blank\"},\"test\"),r&&e.createElement(wa,{withSeperator:!0,href:r,target:\"_blank\"},\"reference\")))}}])&&sa(n.prototype,r),Object.defineProperty(n,\"prototype\",{writable:!1}),l}(e.Component);function Oa(e){return Oa=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},Oa(e)}function Ea(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,ka(r.key),r)}}function ka(e){var t=function(e,t){if(\"object\"!=Oa(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,\"string\");if(\"object\"!=Oa(r))return r;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return String(e)}(e);return\"symbol\"==Oa(t)?t:String(t)}function Pa(e,t){return Pa=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},Pa(e,t)}function xa(e){return xa=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},xa(e)}function ja(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}var Ca=nr.span(ha||(ha=ja([\"\\n  font-family: \",\";\\n  color: \",\";\\n  font-size: 14px;\\n  padding-right: 8px;\\n\"])),dr,lr),Ta=nr.span(ma||(ma=ja([\"\\n  font-family: \",\";\\n  color: \",\";\\n  font-size: 14px;\\n  padding-right: 20px;\\n\"])),yr,ir),Aa=nr.a(ba||(ba=ja([\"\\n  &::before {\\n    content: \",\";\\n    margin: \",\";\\n  }\\n\"])),(function(e){return e.withSeperator?'\"|\"':\"\"}),(function(e){return e.withSeperator?\"0 10px\":\"\"})),Ra=function(t){!function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,\"prototype\",{writable:!1}),t&&Pa(e,t)}(l,t);var n,r,o,i,a=(o=l,i=function(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,t=xa(o);if(i){var n=xa(this).constructor;e=Reflect.construct(t,arguments,n)}else e=t.apply(this,arguments);return function(e,t){if(t&&(\"object\"===Oa(t)||\"function\"==typeof t))return t;if(void 0!==t)throw new TypeError(\"Derived constructors may only return object or undefined\");return function(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e}(e)}(this,e)});function l(){return function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,l),a.apply(this,arguments)}return n=l,(r=[{key:\"onClick\",value:function(e,t){var n=this.props.openLogModal;t.preventDefault(),n(e)}},{key:\"render\",value:function(){var t=this.props,n=t.referenceLog,r=t.testLog;return n||r?e.createElement(\"span\",null,e.createElement(Ca,null,\"browser log: \"),e.createElement(Ta,null,r?e.createElement(Aa,{href:\"#\",onClick:this.onClick.bind(this,r)},\"test\"):[],n?e.createElement(Aa,{withSeperator:!0,href:\"#\",onClick:this.onClick.bind(this,n)},\"reference\"):[])):[]}}])&&Ea(n.prototype,r),Object.defineProperty(n,\"prototype\",{writable:!1}),l}(e.Component);const _a=X((function(e){return{}}),(function(e){return{openLogModal:function(t){e(function(e){return{type:\"OPEN_LOG_MODAL\",value:e}}(t))}}}))(Ra);function Ia(e){return Ia=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},Ia(e)}var Na,Ma,Da,La,za;function Ba(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,Fa(r.key),r)}}function Fa(e){var t=function(e,t){if(\"object\"!=Ia(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,\"string\");if(\"object\"!=Ia(r))return r;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return String(e)}(e);return\"symbol\"==Ia(t)?t:String(t)}function Ua(e,t){return Ua=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},Ua(e,t)}function Wa(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e}function Ha(e){return Ha=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},Ha(e)}function Va(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}var Ga=nr.div(Na||(Na=Va([\"\"]))),qa=nr.div(Ma||(Ma=Va([\"\\n  padding: 5px 0;\\n\"]))),Qa=nr.span(Da||(Da=Va([\"\\n  font-family: \",\";\\n  color: \",\";\\n  font-size: 14px;\\n  padding-right: 8px;\\n\"])),dr,lr),Ya=nr.span(La||(La=Va([\"\\n  font-family: \",\";\\n  color: \",\";\\n  font-size: 14px;\\n  padding-right: 20px;\\n\"])),yr,ir),Za=nr.div(za||(za=Va([\"\\n  display: \",\";\\n  position: absolute;\\n  background-color: \",\";\\n  padding: 10px;\\n  top: -28px;\\n  left: 20px;\\n  box-shadow: 0 3px 6px 0 rgba(0, 0, 0, 0.16);\\n  z-index: 999;\\n\"])),(function(e){return e.showPanel?\"block\":\"none\"}),fr),Ja=function(t){!function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,\"prototype\",{writable:!1}),t&&Ua(e,t)}(l,t);var n,r,o,i,a=(o=l,i=function(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,t=Ha(o);if(i){var n=Ha(this).constructor;e=Reflect.construct(t,arguments,n)}else e=t.apply(this,arguments);return function(e,t){if(t&&(\"object\"===Ia(t)||\"function\"==typeof t))return t;if(void 0!==t)throw new TypeError(\"Derived constructors may only return object or undefined\");return Wa(e)}(this,e)});function l(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,l),(t=a.call(this,e)).state={showPanel:!1},t.showPanel=t.showPanel.bind(Wa(t)),t.hidePanel=t.hidePanel.bind(Wa(t)),t}return n=l,(r=[{key:\"showPanel\",value:function(){this.props.settings.textInfo||this.setState({showPanel:!0})}},{key:\"hidePanel\",value:function(){this.setState({showPanel:!1})}},{key:\"render\",value:function(){var t=this.props.info,n=t.label,r=t.fileName,o=t.selector,i=t.diff,a=t.url,l=t.referenceUrl,u=t.referenceLog,c=t.testLog,s=this.props.settings,f=this.state.showPanel;return e.createElement(Ga,null,e.createElement(qa,{hidden:!s.textInfo},e.createElement(Qa,null,\"label: \"),e.createElement(Ya,null,n),e.createElement(Qa,null,\"selector: \"),e.createElement(Ya,null,o)),e.createElement(qa,null,e.createElement(Qa,null,\"filename: \"),e.createElement(Ya,{onMouseOver:this.showPanel},r)),e.createElement(ua,{suppress:!s.textInfo,diff:i}),e.createElement(Za,{showPanel:f,onMouseLeave:this.hidePanel},e.createElement(qa,null,e.createElement(Qa,null,\"label: \"),e.createElement(Ya,null,n,\" \"),e.createElement(Qa,null,\"selector: \"),e.createElement(Ya,null,o,\" \")),e.createElement(qa,null,e.createElement(Qa,null,\"filename: \"),e.createElement(Ya,null,r,\" \")),e.createElement(qa,null,(u||c)&&e.createElement(_a,{referenceLog:u,testLog:c}),e.createElement(Sa,{url:a,referenceUrl:l}),e.createElement(ua,{diff:i}))))}}])&&Ba(n.prototype,r),Object.defineProperty(n,\"prototype\",{writable:!1}),l}(e.Component);const Xa=X((function(e){return{settings:e.layoutSettings}}))(Ja);var Ka=function(e,t,n,r){return(e/=r/2)<1?n/2*e*e+t:-n/2*(--e*(e-2)-1)+t},$a=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},el=function(){var e=void 0,t=void 0,n=void 0,r=void 0,o=void 0,i=void 0,a=void 0,l=void 0,u=void 0,c=void 0,s=void 0,f=void 0;function p(e){return e.getBoundingClientRect().top+t}function d(n){u||(u=n),s=o(c=n-u,t,a,l),window.scrollTo(0,s),c<l?window.requestAnimationFrame(d):(window.scrollTo(0,t+a),e&&i&&(e.setAttribute(\"tabindex\",\"-1\"),e.focus()),\"function\"==typeof f&&f(),u=!1)}return function(u){var c=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};switch(l=c.duration||1e3,r=c.offset||0,f=c.callback,o=c.easing||Ka,i=c.a11y||!1,t=window.scrollY||window.pageYOffset,void 0===u?\"undefined\":$a(u)){case\"number\":e=void 0,i=!1,n=t+u;break;case\"object\":n=p(e=u);break;case\"string\":e=document.querySelector(u),n=p(e)}switch(a=n-t+r,$a(c.duration)){case\"number\":l=c.duration;break;case\"function\":l=c.duration(a)}window.requestAnimationFrame(d)}}();const tl=el;function nl(e){return nl=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},nl(e)}var rl,ol;function il(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,al(r.key),r)}}function al(e){var t=function(e,t){if(\"object\"!=nl(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,\"string\");if(\"object\"!=nl(r))return r;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return String(e)}(e);return\"symbol\"==nl(t)?t:String(t)}function ll(e,t){return ll=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},ll(e,t)}function ul(e){return ul=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},ul(e)}function cl(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}var sl,fl,pl,dl=nr.div(rl||(rl=cl([\"\\n  a {\\n    display: inline-block;\\n    text-align: right;\\n  }\\n\"]))),yl=nr.div(ol||(ol=cl([\"\\n  background-color: \",\";\\n  background-image: url(\",\");\\n  background-repeat: no-repeat;\\n  background-position: center center;\\n  color: \",\";\\n  border-radius: 3px;\\n  height: 32px;\\n  width: 32px;\\n  margin: 0 0px 0 5px;\\n  transform: \",\";\\n  opacity: \",\";\\n  display: inline-block;\\n\\n  &:hover {\\n    cursor: \",\";\\n    background-color: \",\";\\n  }\\n\"])),pr,\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAABGdBTUEAALGPC/xhBQAAAPdJREFUKBVjZMABEhISOB4/frwcJC0rKxu5YMGCH9iUMmIT9PPz4/369eum////P2NkZPwPVCPNzc3tt2nTps/o6pnQBXx9fUWAmvcBxa/t3bs3Zs+ePbEgNkgMJIeuHsUAJycn6W/fvh0C2roTqDkbZDsIQ9k7QXIgNciGMMM47u7uKkAn7wfyZwI1tMLEYfS9e/f2KSkpcQD5M9TU1LbevXv3HUgObICzs7Pev3//9gD5TUDNU0ES2MD9+/ePAw35AlS7CEjvAfJfMgI1WwIVrwfiHKDmNdg0oosB9YQAxaYAcSAoDKYxMTHFEasZZBhILUgPSC8A/Zdrp6hdBGQAAAAASUVORK5CYII=\",lr,(function(e){return e.prev?\"rotate(0)\":\"rotate(180deg)\"}),(function(e){return e.disabled?\"0.2\":\"1\"}),(function(e){return e.disabled?\"\":\"pointer\"}),(function(e){return e.disabled?\"\".concat(pr):\"\".concat(\"#999999\")})),hl=function(t){!function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,\"prototype\",{writable:!1}),t&&ll(e,t)}(l,t);var n,r,o,i,a=(o=l,i=function(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,t=ul(o);if(i){var n=ul(this).constructor;e=Reflect.construct(t,arguments,n)}else e=t.apply(this,arguments);return function(e,t){if(t&&(\"object\"===nl(t)||\"function\"==typeof t))return t;if(void 0!==t)throw new TypeError(\"Derived constructors may only return object or undefined\");return function(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e}(e)}(this,e)});function l(){return function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,l),a.apply(this,arguments)}return n=l,(r=[{key:\"nextTest\",value:function(){var e=\"#test\".concat(this.props.currentId+1);this.jumpTo(e)}},{key:\"prevTest\",value:function(){var e=\"#test\".concat(this.props.currentId-1);this.jumpTo(e)}},{key:\"jumpTo\",value:function(e){tl(e,{duration:0,offset:-100})}},{key:\"render\",value:function(){var t=this.props,n=t.currentId,r=t.lastId;return e.createElement(dl,null,0===n&&e.createElement(yl,{onClick:this.prevTest.bind(this),prev:!0,disabled:!0}),0!==n&&e.createElement(yl,{onClick:this.prevTest.bind(this),prev:!0}),r!==n&&e.createElement(yl,{onClick:this.nextTest.bind(this)}),r===n&&e.createElement(yl,{onClick:this.nextTest.bind(this),disabled:!0}))}}])&&il(n.prototype,r),Object.defineProperty(n,\"prototype\",{writable:!1}),l}(e.Component),ml=o(82),bl=o.n(ml);function vl(e){return vl=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},vl(e)}function gl(){return gl=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},gl.apply(this,arguments)}function wl(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,Sl(r.key),r)}}function Sl(e){var t=function(e,t){if(\"object\"!=vl(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,\"string\");if(\"object\"!=vl(r))return r;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return String(e)}(e);return\"symbol\"==vl(t)?t:String(t)}function Ol(e,t){return Ol=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},Ol(e,t)}function El(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e}function kl(e){return kl=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},kl(e)}function Pl(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}var xl=nr.img(sl||(sl=Pl([\"\\n  width: auto;\\n  max-width: 100%;\\n  max-height: \",\";\\n\\n  &:hover {\\n    cursor: pointer;\\n  }\\n\"])),(function(e){return e.settings.textInfo?\"150px\":\"400px\"})),jl=nr.div(fl||(fl=Pl([\"\\n  flex: 1 1 auto;\\n  padding: 0 25px;\\n  padding-top: \",\";\\n  text-align: center;\\n\"])),(function(e){return e.withText?\"10px\":\"20px\"})),Cl=nr.span(pl||(pl=Pl([\"\\n  text-align: center;\\n  font-family: \",\";\\n  color: \",\";\\n  display: block;\\n  margin: 0 auto;\\n  text-transform: uppercase;\\n  padding: 5px 0;\\n  padding-bottom: 15px;\\n  font-size: 12px;\\n\"])),dr,lr),Tl={offset:{bottom:-400},partialVisibility:!0},Al=function(t){!function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,\"prototype\",{writable:!1}),t&&Ol(e,t)}(l,t);var n,r,o,i,a=(o=l,i=function(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,t=kl(o);if(i){var n=kl(this).constructor;e=Reflect.construct(t,arguments,n)}else e=t.apply(this,arguments);return function(e,t){if(t&&(\"object\"===vl(t)||\"function\"==typeof t))return t;if(void 0!==t)throw new TypeError(\"Derived constructors may only return object or undefined\");return El(e)}(this,e)});function l(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,l),(t=a.call(this,e)).state={isVisible:!1},t.onLoadError=t.onLoadError.bind(El(t)),t.onChange=t.onChange.bind(El(t)),t}return n=l,(r=[{key:\"onChange\",value:function(e){e&&!this.state.isVisible&&(console.log(\"setting state to visible\"),this.setState({isVisible:!0}))}},{key:\"onLoadError\",value:function(){this.setState({imgLoadError:!0})}},{key:\"render\",value:function(){var t=this.props,n=t.hidden,r=t.settings,o=t.label,i=t.src;return i&&\"../..\"!==i&&!this.state.imgLoadError||(i=\"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\"),e.createElement(bl(),gl({},Tl,{onChange:this.onChange}),this.state.isVisible?e.createElement(jl,{hidden:n,withText:r.textInfo},e.createElement(Cl,null,o),e.createElement(xl,gl({},this.props,{src:i,onError:this.onLoadError}))):e.createElement(\"p\",null,\"Most lemurs only see in one or two colors.\"))}}])&&wl(n.prototype,r),Object.defineProperty(n,\"prototype\",{writable:!1}),l}(e.Component);const Rl=X((function(e){return{settings:e.layoutSettings}}))(Al);function _l(e){return _l=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},_l(e)}var Il;function Nl(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,Ml(r.key),r)}}function Ml(e){var t=function(e,t){if(\"object\"!=_l(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,\"string\");if(\"object\"!=_l(r))return r;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return String(e)}(e);return\"symbol\"==_l(t)?t:String(t)}function Dl(e,t){return Dl=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},Dl(e,t)}function Ll(e){return Ll=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},Ll(e)}var zl=nr.div(Il||(Il=function(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}([\"\\n  position: relative;\\n  display: flex;\\n\"]))),Bl=function(t){!function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,\"prototype\",{writable:!1}),t&&Dl(e,t)}(l,t);var n,r,o,i,a=(o=l,i=function(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,t=Ll(o);if(i){var n=Ll(this).constructor;e=Reflect.construct(t,arguments,n)}else e=t.apply(this,arguments);return function(e,t){if(t&&(\"object\"===_l(t)||\"function\"==typeof t))return t;if(void 0!==t)throw new TypeError(\"Derived constructors may only return object or undefined\");return function(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e}(e)}(this,e)});function l(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,l),(t=a.call(this,e)).state={images:[]},t}return n=l,(r=[{key:\"onImageClick\",value:function(e){var t=this.props.openModal;this.props.info.targetImg=e,t(this.props.info)}},{key:\"render\",value:function(){var t=this,n=this.props.info,r=n.reference,o=n.test,i=this.props,a=i.status,l=i.settings;return this.state.images=[{id:\"refImage\",label:\"Reference\",src:r,visible:l.refImage},{id:\"testImage\",label:\"Test\",src:o,visible:l.testImage}],\"pass\"!==a&&this.state.images.push({id:\"diffImage\",label:\"Diff\",src:this.props.info.diffImage,visible:l.diffImage}),e.createElement(zl,null,this.state.images.map((function(n,r){return e.createElement(Rl,{src:n.src,id:n.id,label:n.label,onClick:t.onImageClick.bind(t,n),key:r,hidden:!n.visible})})))}}])&&Nl(n.prototype,r),Object.defineProperty(n,\"prototype\",{writable:!1}),l}(e.Component);const Fl=X((function(e){return{settings:e.layoutSettings}}),(function(e){return{openModal:function(t){e(function(e){return{type:\"OPEN_SCRUBBER_MODAL\",value:e}}(t))}}}))(Bl);function Ul(e){return Ul=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},Ul(e)}var Wl;function Hl(){Hl=function(){return t};var e,t={},n=Object.prototype,r=n.hasOwnProperty,o=Object.defineProperty||function(e,t,n){e[t]=n.value},i=\"function\"==typeof Symbol?Symbol:{},a=i.iterator||\"@@iterator\",l=i.asyncIterator||\"@@asyncIterator\",u=i.toStringTag||\"@@toStringTag\";function c(e,t,n){return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{c({},\"\")}catch(e){c=function(e,t,n){return e[t]=n}}function s(e,t,n,r){var i=t&&t.prototype instanceof b?t:b,a=Object.create(i.prototype),l=new A(r||[]);return o(a,\"_invoke\",{value:x(e,n,l)}),a}function f(e,t,n){try{return{type:\"normal\",arg:e.call(t,n)}}catch(e){return{type:\"throw\",arg:e}}}t.wrap=s;var p=\"suspendedStart\",d=\"suspendedYield\",y=\"executing\",h=\"completed\",m={};function b(){}function v(){}function g(){}var w={};c(w,a,(function(){return this}));var S=Object.getPrototypeOf,O=S&&S(S(R([])));O&&O!==n&&r.call(O,a)&&(w=O);var E=g.prototype=b.prototype=Object.create(w);function k(e){[\"next\",\"throw\",\"return\"].forEach((function(t){c(e,t,(function(e){return this._invoke(t,e)}))}))}function P(e,t){function n(o,i,a,l){var u=f(e[o],e,i);if(\"throw\"!==u.type){var c=u.arg,s=c.value;return s&&\"object\"==Ul(s)&&r.call(s,\"__await\")?t.resolve(s.__await).then((function(e){n(\"next\",e,a,l)}),(function(e){n(\"throw\",e,a,l)})):t.resolve(s).then((function(e){c.value=e,a(c)}),(function(e){return n(\"throw\",e,a,l)}))}l(u.arg)}var i;o(this,\"_invoke\",{value:function(e,r){function o(){return new t((function(t,o){n(e,r,t,o)}))}return i=i?i.then(o,o):o()}})}function x(t,n,r){var o=p;return function(i,a){if(o===y)throw new Error(\"Generator is already running\");if(o===h){if(\"throw\"===i)throw a;return{value:e,done:!0}}for(r.method=i,r.arg=a;;){var l=r.delegate;if(l){var u=j(l,r);if(u){if(u===m)continue;return u}}if(\"next\"===r.method)r.sent=r._sent=r.arg;else if(\"throw\"===r.method){if(o===p)throw o=h,r.arg;r.dispatchException(r.arg)}else\"return\"===r.method&&r.abrupt(\"return\",r.arg);o=y;var c=f(t,n,r);if(\"normal\"===c.type){if(o=r.done?h:d,c.arg===m)continue;return{value:c.arg,done:r.done}}\"throw\"===c.type&&(o=h,r.method=\"throw\",r.arg=c.arg)}}}function j(t,n){var r=n.method,o=t.iterator[r];if(o===e)return n.delegate=null,\"throw\"===r&&t.iterator.return&&(n.method=\"return\",n.arg=e,j(t,n),\"throw\"===n.method)||\"return\"!==r&&(n.method=\"throw\",n.arg=new TypeError(\"The iterator does not provide a '\"+r+\"' method\")),m;var i=f(o,t.iterator,n.arg);if(\"throw\"===i.type)return n.method=\"throw\",n.arg=i.arg,n.delegate=null,m;var a=i.arg;return a?a.done?(n[t.resultName]=a.value,n.next=t.nextLoc,\"return\"!==n.method&&(n.method=\"next\",n.arg=e),n.delegate=null,m):a:(n.method=\"throw\",n.arg=new TypeError(\"iterator result is not an object\"),n.delegate=null,m)}function C(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function T(e){var t=e.completion||{};t.type=\"normal\",delete t.arg,e.completion=t}function A(e){this.tryEntries=[{tryLoc:\"root\"}],e.forEach(C,this),this.reset(!0)}function R(t){if(t||\"\"===t){var n=t[a];if(n)return n.call(t);if(\"function\"==typeof t.next)return t;if(!isNaN(t.length)){var o=-1,i=function n(){for(;++o<t.length;)if(r.call(t,o))return n.value=t[o],n.done=!1,n;return n.value=e,n.done=!0,n};return i.next=i}}throw new TypeError(Ul(t)+\" is not iterable\")}return v.prototype=g,o(E,\"constructor\",{value:g,configurable:!0}),o(g,\"constructor\",{value:v,configurable:!0}),v.displayName=c(g,u,\"GeneratorFunction\"),t.isGeneratorFunction=function(e){var t=\"function\"==typeof e&&e.constructor;return!!t&&(t===v||\"GeneratorFunction\"===(t.displayName||t.name))},t.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,g):(e.__proto__=g,c(e,u,\"GeneratorFunction\")),e.prototype=Object.create(E),e},t.awrap=function(e){return{__await:e}},k(P.prototype),c(P.prototype,l,(function(){return this})),t.AsyncIterator=P,t.async=function(e,n,r,o,i){void 0===i&&(i=Promise);var a=new P(s(e,n,r,o),i);return t.isGeneratorFunction(n)?a:a.next().then((function(e){return e.done?e.value:a.next()}))},k(E),c(E,u,\"Generator\"),c(E,a,(function(){return this})),c(E,\"toString\",(function(){return\"[object Generator]\"})),t.keys=function(e){var t=Object(e),n=[];for(var r in t)n.push(r);return n.reverse(),function e(){for(;n.length;){var r=n.pop();if(r in t)return e.value=r,e.done=!1,e}return e.done=!0,e}},t.values=R,A.prototype={constructor:A,reset:function(t){if(this.prev=0,this.next=0,this.sent=this._sent=e,this.done=!1,this.delegate=null,this.method=\"next\",this.arg=e,this.tryEntries.forEach(T),!t)for(var n in this)\"t\"===n.charAt(0)&&r.call(this,n)&&!isNaN(+n.slice(1))&&(this[n]=e)},stop:function(){this.done=!0;var e=this.tryEntries[0].completion;if(\"throw\"===e.type)throw e.arg;return this.rval},dispatchException:function(t){if(this.done)throw t;var n=this;function o(r,o){return l.type=\"throw\",l.arg=t,n.next=r,o&&(n.method=\"next\",n.arg=e),!!o}for(var i=this.tryEntries.length-1;i>=0;--i){var a=this.tryEntries[i],l=a.completion;if(\"root\"===a.tryLoc)return o(\"end\");if(a.tryLoc<=this.prev){var u=r.call(a,\"catchLoc\"),c=r.call(a,\"finallyLoc\");if(u&&c){if(this.prev<a.catchLoc)return o(a.catchLoc,!0);if(this.prev<a.finallyLoc)return o(a.finallyLoc)}else if(u){if(this.prev<a.catchLoc)return o(a.catchLoc,!0)}else{if(!c)throw new Error(\"try statement without catch or finally\");if(this.prev<a.finallyLoc)return o(a.finallyLoc)}}}},abrupt:function(e,t){for(var n=this.tryEntries.length-1;n>=0;--n){var o=this.tryEntries[n];if(o.tryLoc<=this.prev&&r.call(o,\"finallyLoc\")&&this.prev<o.finallyLoc){var i=o;break}}i&&(\"break\"===e||\"continue\"===e)&&i.tryLoc<=t&&t<=i.finallyLoc&&(i=null);var a=i?i.completion:{};return a.type=e,a.arg=t,i?(this.method=\"next\",this.next=i.finallyLoc,m):this.complete(a)},complete:function(e,t){if(\"throw\"===e.type)throw e.arg;return\"break\"===e.type||\"continue\"===e.type?this.next=e.arg:\"return\"===e.type?(this.rval=this.arg=e.arg,this.method=\"return\",this.next=\"end\"):\"normal\"===e.type&&t&&(this.next=t),m},finish:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),T(n),m}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if(\"throw\"===r.type){var o=r.arg;T(n)}return o}}throw new Error(\"illegal catch attempt\")},delegateYield:function(t,n,r){return this.delegate={iterator:R(t),resultName:n,nextLoc:r},\"next\"===this.method&&(this.arg=e),m}},t}function Vl(e,t,n,r,o,i,a){try{var l=e[i](a),u=l.value}catch(e){return void n(e)}l.done?t(u):Promise.resolve(u).then(r,o)}function Gl(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,ql(r.key),r)}}function ql(e){var t=function(e,t){if(\"object\"!=Ul(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,\"string\");if(\"object\"!=Ul(r))return r;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return String(e)}(e);return\"symbol\"==Ul(t)?t:String(t)}function Ql(e,t){return Ql=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},Ql(e,t)}function Yl(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e}function Zl(e){return Zl=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},Zl(e)}var Jl=location.port,Xl=Object.freeze({INITIAL:\"Approve\",PENDING:\"Pending...\",FAILED:\"Approve\"}),Kl=nr.button(Wl||(Wl=function(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}([\"\\n  font-size: 12px;\\n  line-height: auto;\\n  font-family: \",\";\\n  background-color: \",\";\\n  border: none;\\n  height: 32px;\\n  border-radius: 3px;\\n  color: \",\";\\n  padding: 5px 5px;\\n\\n  &:hover {\\n    cursor: pointer;\\n    background-color: \",\";\\n  }\\n\\n  &:disabled {\\n    background-color: \",\";\\n    color: \",\";\\n    cursor: default;\\n  }\\n\"])),dr,ur,fr,cr,ar,lr),$l=function(t){!function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,\"prototype\",{writable:!1}),t&&Ql(e,t)}(u,t);var n,r,o,i,a,l=(i=u,a=function(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,t=Zl(i);if(a){var n=Zl(this).constructor;e=Reflect.construct(t,arguments,n)}else e=t.apply(this,arguments);return function(e,t){if(t&&(\"object\"===Ul(t)||\"function\"==typeof t))return t;if(void 0!==t)throw new TypeError(\"Derived constructors may only return object or undefined\");return Yl(e)}(this,e)});function u(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,u),(t=l.call(this,e)).approve=t.approve.bind(Yl(t)),t.state={approveStatus:\"INITIAL\",errorMsg:null},t}return n=u,r=[{key:\"approve\",value:(o=function(e){return function(){var t=this,n=arguments;return new Promise((function(r,o){var i=e.apply(t,n);function a(e){Vl(i,r,o,a,l,\"next\",e)}function l(e){Vl(i,r,o,a,l,\"throw\",e)}a(void 0)}))}}(Hl().mark((function e(){var t,n,r,o;return Hl().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.props.fileName,n=\"\".concat(\"http://127.0.0.1\",\":\").concat(Jl,\"/approve?filter=\").concat(t),this.setState({approveStatus:\"PENDING\"}),e.prev=3,e.next=6,fetch(n,{method:\"POST\"});case 6:if(!(r=e.sent).ok){e.next=12;break}this.setState({approveStatus:\"INITIAL\"}),this.props.approveTest(t,this.props.filterStatus),e.next=16;break;case 12:return e.next=14,r.json();case 14:o=e.sent,this.setState({approveStatus:\"FAILED\",errorMsg:o.error});case 16:e.next=22;break;case 18:e.prev=18,e.t0=e.catch(3),this.setState({approveStatus:\"FAILED\",errorMsg:\"\".concat(e.t0.message,'. 🧐\\nLooks like the \"approve\" operation failed.\\nPlease check that backstopRemote is running.\\n      ')}),alert(this.state.errorMsg);case 22:case\"end\":return e.stop()}}),e,this,[[3,18]])}))),function(){return o.apply(this,arguments)})},{key:\"render\",value:function(){var t=this.state.approveStatus;return e.createElement(\"div\",null,e.createElement(Kl,{onClick:this.approve,disabled:\"APPROVED\"===t||\"PENDING\"===t},Xl[this.state.approveStatus]))}}],r&&Gl(n.prototype,r),Object.defineProperty(n,\"prototype\",{writable:!1}),u}(e.Component);const eu=X((function(e){return{filterStatus:e.tests.filterStatus}}),(function(e){return{approveTest:function(t,n){e(function(e){return{type:\"APPROVE_TEST\",id:e}}(t)),e(ro(n))}}}))($l);function tu(e){return tu=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},tu(e)}var nu,ru;function ou(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,iu(r.key),r)}}function iu(e){var t=function(e,t){if(\"object\"!=tu(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,\"string\");if(\"object\"!=tu(r))return r;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return String(e)}(e);return\"symbol\"==tu(t)?t:String(t)}function au(e,t){return au=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},au(e,t)}function lu(e){return lu=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},lu(e)}function uu(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}var cu,su=nr.div(nu||(nu=uu([\"\\n  position: relative;\\n  margin: 5px auto;\\n  padding: 10px 30px;\\n  background-color: \",\";\\n  box-shadow: \",\";\\n  min-height: 40px;\\n  break-inside: avoid;\\n\\n  &:before {\\n    content: '';\\n    display: block;\\n    width: 8px;\\n    height: 100%;\\n    background-color: \",\";\\n    position: absolute;\\n    top: 0;\\n    left: 0;\\n  }\\n  @media print {\\n    box-shadow: none;\\n  }\\n\"])),\"#FAFAFA\",mr,(function(e){return\"pass\"===e.status?cr:sr})),fu=nr.div(ru||(ru=uu([\"\\n  position: absolute;\\n  right: 10px;\\n  display: flex;\\n\"]))),pu=function(t){!function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,\"prototype\",{writable:!1}),t&&au(e,t)}(l,t);var n,r,o,i,a=(o=l,i=function(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,t=lu(o);if(i){var n=lu(this).constructor;e=Reflect.construct(t,arguments,n)}else e=t.apply(this,arguments);return function(e,t){if(t&&(\"object\"===tu(t)||\"function\"==typeof t))return t;if(void 0!==t)throw new TypeError(\"Derived constructors may only return object or undefined\");return function(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e}(e)}(this,e)});function l(){return function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,l),a.apply(this,arguments)}return n=l,(r=[{key:\"render\",value:function(){var t=this.props.test,n=t.pair,r=t.status,o=this.props.onlyText;return e.createElement(su,{id:this.props.id,status:r},e.createElement(fu,null,\"fail\"===r&&/remote/.test(location.search)&&e.createElement(eu,{fileName:n.fileName}),!o&&e.createElement(hl,{currentId:this.props.numId,lastId:this.props.lastId})),e.createElement(Xa,{info:n}),e.createElement(Fl,{info:n,status:r}),e.createElement(Yi,{info:n,status:r}))}}])&&ou(n.prototype,r),Object.defineProperty(n,\"prototype\",{writable:!1}),l}(e.Component);function du(e){return du=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},du(e)}function yu(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,hu(r.key),r)}}function hu(e){var t=function(e,t){if(\"object\"!=du(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,\"string\");if(\"object\"!=du(r))return r;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return String(e)}(e);return\"symbol\"==du(t)?t:String(t)}function mu(e,t){return mu=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},mu(e,t)}function bu(e){return bu=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},bu(e)}var vu=nr.section(cu||(cu=function(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}([\"\\n  width: 100%;\\n  margin: 0 auto;\\n  margin-top: 20px;\\n  z-index: 1;\\n\"]))),gu=function(t){!function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,\"prototype\",{writable:!1}),t&&mu(e,t)}(l,t);var n,r,o,i,a=(o=l,i=function(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,t=bu(o);if(i){var n=bu(this).constructor;e=Reflect.construct(t,arguments,n)}else e=t.apply(this,arguments);return function(e,t){if(t&&(\"object\"===du(t)||\"function\"==typeof t))return t;if(void 0!==t)throw new TypeError(\"Derived constructors may only return object or undefined\");return function(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e}(e)}(this,e)});function l(){return function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,l),a.apply(this,arguments)}return n=l,(r=[{key:\"render\",value:function(){var t=this.props,n=t.tests,r=t.settings,o=!r.refImage&&!r.testImage&&!r.diffImage;return e.createElement(vu,null,n.map((function(t,n,r){return e.createElement(pu,{id:\"test\".concat(n),numId:n,test:t,key:n,lastId:r.length-1,onlyText:o})})))}}])&&yu(n.prototype,r),Object.defineProperty(n,\"prototype\",{writable:!1}),l}(e.Component);const wu=X((function(e){return{tests:e.tests.filtered,settings:e.layoutSettings}}))(gu);var Su=o(253),Ou=o.n(Su);const Eu=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAzZJREFUeAHlm89q20AQhyv5lBAo+FJCn6GF3nostm+GkIv7kPEll1yMMbnm2pBHKL0ZAkkKubjzE96yUSxpZ2dm9ccLQmtpd2e+T5JtVmz2gcpisTjZbrc/qXq22+2uN5vNbxwfWplMJp+zLLskrqfxeHy1XC7/Znv4OwL/AmBq8IhG6/X6Fp+HUmaz2Q9cXNo+gokYf5GE7zmuvIPHCTSg7QYd8HkIZQ9/4+DBRPWvYM+pflaGpJOnQ5HgwZ+WOcGeE+g1bvvyySFIqIMHM9hzfOHhmaftZUgSGuBfwFywO+iADvO+fDFyWDInAHtOR79fl+pchjcC+i6BCw/edwL6KiEGvlJA3yTEwtcK6IsECXyjgK5LkMIHCeiqBA34YAFdk6AFzxLQFQma8GwBbUvQho8S0JYEC/hoAaklWMGLBKSSYAkvFmAtwRpeRYCVhBTwagK0JaSCVxWgJSElvLoAqYTU8CYCYiW0AW8mgCuhLXhTAaES0A7vIDANj7pfMFNNm+lk7MEpMT8Jab3p6mL8tuAR21wAgtRJwPlySXHlXcwkAhAsVEJKeOSVTECIhNTwyAkvR4+6JLsDjvoRCIV3t2LKR8H8EaiD34M+O3C3x88i/hugrztmtTd9BALg5wADbFv/BcwEhMC71+2cttp3gomAGKCYPhoy1AVIQCR9Y2WoCtAA0BiDI0NNgGbimmM1yVARYJGwxZiHZIgFWCZqObaTIRKQIkHrGNECrBNzVwh7y1hRAiwT8sH9ulVMtgCrRHzYqrpFbJYAiwSqYKuOa+cQLEA7cBVgyHHNXIIEaAYMAQxpo5VTowCtQCFQ3DYaudUK0AjAheK2l+ZYKUA6MBdE0l6S60EBkgElIJK+sTm/ExA7kCR5rb4xub8REDOAVvJa43AZ/gvgdtRK2GIcDkshgNPBImGLMZuYRqPRZLVa3WX75aQPNC1drKj0k0n5gsKPq1VvkPCH4nzLCfJyiPCQiGl34pvjQpalEvM5Hb/Am6Gn8kl0QEc3b18+36fPDRJec6yiJth7B0V1LJ4eBLxjggQ888SF274oVMfi6aviS/BYls9Pp9NPBH5Bt/8r4LF8/h8bZl9WdQoucwAAAABJRU5ErkJggg==\";var ku,Pu,xu,ju,Cu=o(184);function Tu(e){return Tu=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},Tu(e)}function Au(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,Ru(r.key),r)}}function Ru(e){var t=function(e,t){if(\"object\"!=Tu(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,\"string\");if(\"object\"!=Tu(r))return r;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return String(e)}(e);return\"symbol\"==Tu(t)?t:String(t)}function _u(e,t){return _u=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},_u(e,t)}function Iu(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e}function Nu(e){return Nu=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},Nu(e)}function Mu(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}var Du,Lu,zu,Bu=nr.button(ku||(ku=Mu([\"\\n  margin: 1em;\\n  padding: 10px 16px;\\n  height: 32px;\\n  background-color: \",\";\\n  color: \",\";\\n  border-radius: 3px;\\n  text-transform: uppercase;\\n  font-family: \",\";\\n  text-align: center;\\n  font-size: 12px;\\n  border: none;\\n  box-shadow: \",\";\\n\\n  transition: all 100ms ease-in-out;\\n\\n  &:focus {\\n    outline: none;\\n  }\\n\\n  &:hover {\\n    cursor: pointer;\\n    box-shadow: \",\";\\n  }\\n\\n  &.loadingDiverged {\\n    animation: blink normal 1200ms infinite ease-in-out;\\n    background-color: green;\\n  }\\n  @keyframes blink {\\n    0% {\\n      opacity: 1;\\n    }\\n    50% {\\n      opacity: 0.75;\\n    }\\n    100% {\\n      opacity: 1;\\n    }\\n  }\\n\"])),(function(e){return e.selected?lr:pr}),(function(e){return e.selected?pr:lr}),dr,(function(e){return e.selected?\"none\":mr}),(function(e){return e.selected?\"\":br})),Fu=nr.div(Pu||(Pu=Mu([\"\\n  cursor: ew-resize;\\n  padding-bottom: 20px;\\n  overflow: hidden;\\n\\n  .testImage {\\n    opacity: 1;\\n  }\\n\\n  .testImage,\\n  .refImage {\\n    max-width: 100%;\\n  }\\n\"]))),Uu=nr.div(xu||(xu=Mu([\"\\n  display: flex;\\n  justify-content: center;\\n  padding-top: 10px;\\n  padding-bottom: 10px;\\n  position: sticky;\\n  top: 0;\\n  z-index: 5;\\n  background: white;\\n  border-bottom: 1px solid #e4e4e4;\\n\\n\"]))),Wu=nr.div(ju||(ju=Mu([\"\\n  height: 100%;\\n  width: 5px;\\n  background: \",\";\\n  transform: translate(-2.5px, 0);\\n\"])),sr),Hu=function(t){!function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,\"prototype\",{writable:!1}),t&&_u(e,t)}(l,t);var n,r,o,i,a=(o=l,i=function(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,t=Nu(o);if(i){var n=Nu(this).constructor;e=Reflect.construct(t,arguments,n)}else e=t.apply(this,arguments);return function(e,t){if(t&&(\"object\"===Tu(t)||\"function\"==typeof t))return t;if(void 0!==t)throw new TypeError(\"Derived constructors may only return object or undefined\");return Iu(e)}(this,e)});function l(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,l),(t=a.call(this,e)).state={isRefImageMissing:!1,isLoading:!1},t.handleRefImageLoadingError=t.handleRefImageLoadingError.bind(Iu(t)),t.loadingDiverge=t.loadingDiverge.bind(Iu(t)),t}return n=l,r=[{key:\"handleRefImageLoadingError\",value:function(){this.setState({isRefImageMissing:!0})}},{key:\"loadingDiverge\",value:function(e){this.setState({isLoading:!!e})}},{key:\"render\",value:function(){var t=this.props,n=t.scrubberModalMode,r=t.testImageType,o=t.position,i=t.refImage,a=t.testImage,l=t.diffImage,u=t.divergedImage,c=t.showScrubberTestImage,s=t.showScrubberRefImage,f=t.showScrubberDiffImage,p=t.showScrubberDivergedImage,d=t.showScrubber,y=this.props[r],h=l&&l.length>0,m=this,b=this.state.isRefImageMissing||!h,v=!h&&\"SHOW_SCRUBBER_REF_IMAGE\"===n,g=!h&&\"SHOW_SCRUBBER_TEST_IMAGE\"===n;return e.createElement(\"div\",null,e.createElement(Uu,null,h&&e.createElement(\"div\",null,e.createElement(Bu,{selected:\"SHOW_SCRUBBER_REF_IMAGE\"===n,onClick:s},\"REFERENCE\"),e.createElement(Bu,{selected:\"SHOW_SCRUBBER_TEST_IMAGE\"===n,onClick:c},\"TEST\"),e.createElement(Bu,{selected:\"SHOW_SCRUBBER_DIFF_IMAGE\"===n,onClick:f},\"DIFF\"),e.createElement(Bu,{selected:\"SCRUB\"===n,onClick:d},\"SCRUBBER\"),e.createElement(Bu,{selected:\"SHOW_SCRUBBER_DIVERGED_IMAGE\"===n,onClick:function(){if(m.state.isLoading)console.error(\"Diverged process is already running. Please hang on.\");else if(u)p(u);else{p(\"\"),m.loadingDiverge(!0);var e=document.images.isolatedRefImage,t=document.images.isolatedTestImage,n=e.height,r=e.width,o=new Worker(\"divergedWorker.js\");o.addEventListener(\"message\",(function(e){for(var t=e.data,o=function(e,t){return Gu(null,e,t).createImageData(t,e)}(n,r),i=t.length-1;i>=0;i--)o.data[i]=t[i];var a=Gu(null,n,r);a.putImageData(o,0,0);var l=a.canvas.toDataURL(\"image/png\");p(l),m.loadingDiverge(!1)}),!1),o.addEventListener(\"error\",(function(e){p(\"\"),m.loadingDiverge(!1),console.error(e)})),o.postMessage({divergedInput:[Vu(Gu(e)),Vu(Gu(t)),n,r]})}},className:this.state.isLoading?\"loadingDiverged\":\"\",style:{display:/remote/.test(location.search)?\"\":\"none\"}},this.state.isLoading?\"DIVERGING!\":\"DIVERGED\"))),e.createElement(Fu,null,e.createElement(\"img\",{id:\"isolatedRefImage\",src:i,style:{margin:\"auto\",display:v?\"block\":\"none\"}}),e.createElement(\"img\",{id:\"isolatedTestImage\",className:\"testImage\",src:a,style:{margin:\"auto\",display:g?\"block\":\"none\"}}),e.createElement(\"img\",{className:\"diffImage\",src:l,style:{margin:\"auto\",display:b?\"block\":\"none\"}}),e.createElement(\"div\",{style:{display:b?\"none\":\"block\"}},e.createElement(Cu.Z,{verticalAlign:\"top\",minDistanceToBeginInteraction:0,maxAngleToBeginInteraction:1/0,initialPosition:o,newPosition:o},e.createElement(\"img\",{id:\"scrubberRefImage\",className:\"refImage\",src:i,onError:this.handleRefImageLoadingError}),e.createElement(\"img\",{id:\"scrubberTestImage\",className:\"testImage\",src:y}),e.createElement(Wu,{className:\"slider\"})))))}}],r&&Au(n.prototype,r),Object.defineProperty(n,\"prototype\",{writable:!1}),l}(e.Component);function Vu(e){return e.getImageData(0,0,e.canvas.width,e.canvas.height).data}function Gu(e,t,n){var r=e;e||(r={height:t,width:n});var o=document.createElement(\"canvas\");o.width=r.width,o.height=r.height;var i=o.getContext(\"2d\");return e&&i.drawImage(r,0,0),i}function qu(e){return qu=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},qu(e)}function Qu(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,Yu(r.key),r)}}function Yu(e){var t=function(e,t){if(\"object\"!=qu(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,\"string\");if(\"object\"!=qu(r))return r;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return String(e)}(e);return\"symbol\"==qu(t)?t:String(t)}function Zu(e,t){return Zu=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},Zu(e,t)}function Ju(e){return Ju=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},Ju(e)}function Xu(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}var Ku=nr.div(Du||(Du=Xu([\"\\n  display: block;\\n\"]))),$u=nr.div(Lu||(Lu=Xu([\"\\n  display: flex;\\n  justify-content: space-between;\\n  position: relative;\\n  padding: 15px;\\n  align-items: center;\\n\"]))),ec=nr.button(zu||(zu=Xu([\"\\n  margin-right: 5px;\\n  width: 30px;\\n  height: 30px;\\n  background-image: url(\",\");\\n  background-size: 100%;\\n  background-repeat: no-repeat;\\n  background-color: transparent;\\n  border: none;\\n\\n  &:focus {\\n    outline: none;\\n  }\\n\\n  &:hover {\\n    cursor: pointer;\\n  }\\n\"])),Eu),tc={content:{width:\"100%\",height:\"100%\",top:\"0\",left:\"0\",border:\"none\",borderRadius:\"none\",padding:\"0px\",boxSizing:\"border-box\"}},nc=function(t){!function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,\"prototype\",{writable:!1}),t&&Zu(e,t)}(l,t);var n,r,o,i,a=(o=l,i=function(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,t=Ju(o);if(i){var n=Ju(this).constructor;e=Reflect.construct(t,arguments,n)}else e=t.apply(this,arguments);return function(e,t){if(t&&(\"object\"===qu(t)||\"function\"==typeof t))return t;if(void 0!==t)throw new TypeError(\"Derived constructors may only return object or undefined\");return function(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e}(e)}(this,e)});function l(){return function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,l),a.apply(this,arguments)}return n=l,r=[{key:\"render\",value:function(){var t=this.props.scrubber.test,n=t.reference,r=t.test,o=t.diffImage,i=t.divergedImage,a=this.props.scrubber,l=a.visible,u=a.position,c=a.testImageType,s=a.scrubberModalMode,f=this.props,p=f.closeModal,d=f.showScrubberTestImage,y=f.showScrubberRefImage,h=f.showScrubberDiffImage,m=f.showScrubberDivergedImage,b=f.showScrubber;return e.createElement(Ku,null,e.createElement(Ou(),{isOpen:l,onRequestClose:p,style:tc,contentLabel:\"Example Modal\"},e.createElement($u,null,e.createElement(qr,null),e.createElement(ec,{onClick:p})),e.createElement(Hu,{scrubberModalMode:s,testImageType:c,testImage:r,refImage:n,diffImage:o,divergedImage:i,position:u,showScrubberTestImage:d,showScrubberRefImage:y,showScrubberDiffImage:h,showScrubberDivergedImage:m,showScrubber:b})))}}],r&&Qu(n.prototype,r),Object.defineProperty(n,\"prototype\",{writable:!1}),l}(e.Component);const rc=X((function(e){return{scrubber:e.scrubber}}),(function(e){return{closeModal:function(){e({type:\"CLOSE_SCRUBBER_MODAL\",value:!1})},showScrubberTestImage:function(t){e({type:\"SHOW_SCRUBBER_TEST_IMAGE\",value:t})},showScrubberRefImage:function(t){e({type:\"SHOW_SCRUBBER_REF_IMAGE\",value:t})},showScrubberDiffImage:function(t){e({type:\"SHOW_SCRUBBER_DIFF_IMAGE\",value:t})},showScrubberDivergedImage:function(t){e({type:\"SHOW_SCRUBBER_DIVERGED_IMAGE\",value:t})},showScrubber:function(t){e({type:\"SHOW_SCRUBBER\",value:t})}}}))(nc);function oc(e){return oc=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},oc(e)}var ic,ac,lc,uc;function cc(){cc=function(){return t};var e,t={},n=Object.prototype,r=n.hasOwnProperty,o=Object.defineProperty||function(e,t,n){e[t]=n.value},i=\"function\"==typeof Symbol?Symbol:{},a=i.iterator||\"@@iterator\",l=i.asyncIterator||\"@@asyncIterator\",u=i.toStringTag||\"@@toStringTag\";function c(e,t,n){return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{c({},\"\")}catch(e){c=function(e,t,n){return e[t]=n}}function s(e,t,n,r){var i=t&&t.prototype instanceof b?t:b,a=Object.create(i.prototype),l=new A(r||[]);return o(a,\"_invoke\",{value:x(e,n,l)}),a}function f(e,t,n){try{return{type:\"normal\",arg:e.call(t,n)}}catch(e){return{type:\"throw\",arg:e}}}t.wrap=s;var p=\"suspendedStart\",d=\"suspendedYield\",y=\"executing\",h=\"completed\",m={};function b(){}function v(){}function g(){}var w={};c(w,a,(function(){return this}));var S=Object.getPrototypeOf,O=S&&S(S(R([])));O&&O!==n&&r.call(O,a)&&(w=O);var E=g.prototype=b.prototype=Object.create(w);function k(e){[\"next\",\"throw\",\"return\"].forEach((function(t){c(e,t,(function(e){return this._invoke(t,e)}))}))}function P(e,t){function n(o,i,a,l){var u=f(e[o],e,i);if(\"throw\"!==u.type){var c=u.arg,s=c.value;return s&&\"object\"==oc(s)&&r.call(s,\"__await\")?t.resolve(s.__await).then((function(e){n(\"next\",e,a,l)}),(function(e){n(\"throw\",e,a,l)})):t.resolve(s).then((function(e){c.value=e,a(c)}),(function(e){return n(\"throw\",e,a,l)}))}l(u.arg)}var i;o(this,\"_invoke\",{value:function(e,r){function o(){return new t((function(t,o){n(e,r,t,o)}))}return i=i?i.then(o,o):o()}})}function x(t,n,r){var o=p;return function(i,a){if(o===y)throw new Error(\"Generator is already running\");if(o===h){if(\"throw\"===i)throw a;return{value:e,done:!0}}for(r.method=i,r.arg=a;;){var l=r.delegate;if(l){var u=j(l,r);if(u){if(u===m)continue;return u}}if(\"next\"===r.method)r.sent=r._sent=r.arg;else if(\"throw\"===r.method){if(o===p)throw o=h,r.arg;r.dispatchException(r.arg)}else\"return\"===r.method&&r.abrupt(\"return\",r.arg);o=y;var c=f(t,n,r);if(\"normal\"===c.type){if(o=r.done?h:d,c.arg===m)continue;return{value:c.arg,done:r.done}}\"throw\"===c.type&&(o=h,r.method=\"throw\",r.arg=c.arg)}}}function j(t,n){var r=n.method,o=t.iterator[r];if(o===e)return n.delegate=null,\"throw\"===r&&t.iterator.return&&(n.method=\"return\",n.arg=e,j(t,n),\"throw\"===n.method)||\"return\"!==r&&(n.method=\"throw\",n.arg=new TypeError(\"The iterator does not provide a '\"+r+\"' method\")),m;var i=f(o,t.iterator,n.arg);if(\"throw\"===i.type)return n.method=\"throw\",n.arg=i.arg,n.delegate=null,m;var a=i.arg;return a?a.done?(n[t.resultName]=a.value,n.next=t.nextLoc,\"return\"!==n.method&&(n.method=\"next\",n.arg=e),n.delegate=null,m):a:(n.method=\"throw\",n.arg=new TypeError(\"iterator result is not an object\"),n.delegate=null,m)}function C(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function T(e){var t=e.completion||{};t.type=\"normal\",delete t.arg,e.completion=t}function A(e){this.tryEntries=[{tryLoc:\"root\"}],e.forEach(C,this),this.reset(!0)}function R(t){if(t||\"\"===t){var n=t[a];if(n)return n.call(t);if(\"function\"==typeof t.next)return t;if(!isNaN(t.length)){var o=-1,i=function n(){for(;++o<t.length;)if(r.call(t,o))return n.value=t[o],n.done=!1,n;return n.value=e,n.done=!0,n};return i.next=i}}throw new TypeError(oc(t)+\" is not iterable\")}return v.prototype=g,o(E,\"constructor\",{value:g,configurable:!0}),o(g,\"constructor\",{value:v,configurable:!0}),v.displayName=c(g,u,\"GeneratorFunction\"),t.isGeneratorFunction=function(e){var t=\"function\"==typeof e&&e.constructor;return!!t&&(t===v||\"GeneratorFunction\"===(t.displayName||t.name))},t.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,g):(e.__proto__=g,c(e,u,\"GeneratorFunction\")),e.prototype=Object.create(E),e},t.awrap=function(e){return{__await:e}},k(P.prototype),c(P.prototype,l,(function(){return this})),t.AsyncIterator=P,t.async=function(e,n,r,o,i){void 0===i&&(i=Promise);var a=new P(s(e,n,r,o),i);return t.isGeneratorFunction(n)?a:a.next().then((function(e){return e.done?e.value:a.next()}))},k(E),c(E,u,\"Generator\"),c(E,a,(function(){return this})),c(E,\"toString\",(function(){return\"[object Generator]\"})),t.keys=function(e){var t=Object(e),n=[];for(var r in t)n.push(r);return n.reverse(),function e(){for(;n.length;){var r=n.pop();if(r in t)return e.value=r,e.done=!1,e}return e.done=!0,e}},t.values=R,A.prototype={constructor:A,reset:function(t){if(this.prev=0,this.next=0,this.sent=this._sent=e,this.done=!1,this.delegate=null,this.method=\"next\",this.arg=e,this.tryEntries.forEach(T),!t)for(var n in this)\"t\"===n.charAt(0)&&r.call(this,n)&&!isNaN(+n.slice(1))&&(this[n]=e)},stop:function(){this.done=!0;var e=this.tryEntries[0].completion;if(\"throw\"===e.type)throw e.arg;return this.rval},dispatchException:function(t){if(this.done)throw t;var n=this;function o(r,o){return l.type=\"throw\",l.arg=t,n.next=r,o&&(n.method=\"next\",n.arg=e),!!o}for(var i=this.tryEntries.length-1;i>=0;--i){var a=this.tryEntries[i],l=a.completion;if(\"root\"===a.tryLoc)return o(\"end\");if(a.tryLoc<=this.prev){var u=r.call(a,\"catchLoc\"),c=r.call(a,\"finallyLoc\");if(u&&c){if(this.prev<a.catchLoc)return o(a.catchLoc,!0);if(this.prev<a.finallyLoc)return o(a.finallyLoc)}else if(u){if(this.prev<a.catchLoc)return o(a.catchLoc,!0)}else{if(!c)throw new Error(\"try statement without catch or finally\");if(this.prev<a.finallyLoc)return o(a.finallyLoc)}}}},abrupt:function(e,t){for(var n=this.tryEntries.length-1;n>=0;--n){var o=this.tryEntries[n];if(o.tryLoc<=this.prev&&r.call(o,\"finallyLoc\")&&this.prev<o.finallyLoc){var i=o;break}}i&&(\"break\"===e||\"continue\"===e)&&i.tryLoc<=t&&t<=i.finallyLoc&&(i=null);var a=i?i.completion:{};return a.type=e,a.arg=t,i?(this.method=\"next\",this.next=i.finallyLoc,m):this.complete(a)},complete:function(e,t){if(\"throw\"===e.type)throw e.arg;return\"break\"===e.type||\"continue\"===e.type?this.next=e.arg:\"return\"===e.type?(this.rval=this.arg=e.arg,this.method=\"return\",this.next=\"end\"):\"normal\"===e.type&&t&&(this.next=t),m},finish:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),T(n),m}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if(\"throw\"===r.type){var o=r.arg;T(n)}return o}}throw new Error(\"illegal catch attempt\")},delegateYield:function(t,n,r){return this.delegate={iterator:R(t),resultName:n,nextLoc:r},\"next\"===this.method&&(this.arg=e),m}},t}function sc(e,t,n,r,o,i,a){try{var l=e[i](a),u=l.value}catch(e){return void n(e)}l.done?t(u):Promise.resolve(u).then(r,o)}function fc(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,pc(r.key),r)}}function pc(e){var t=function(e,t){if(\"object\"!=oc(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,\"string\");if(\"object\"!=oc(r))return r;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return String(e)}(e);return\"symbol\"==oc(t)?t:String(t)}function dc(e,t){return dc=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},dc(e,t)}function yc(e){return yc=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},yc(e)}function hc(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}var mc=nr.div(ic||(ic=hc([\"\\n  display: block;\\n\"]))),bc=nr.textarea(ac||(ac=hc([\"\\ndisplay: block;\\nwidth: 90%;\\nheight: 50%;\\nmargin 0 auto;\\n\\n\"]))),vc=nr.div(lc||(lc=hc([\"\\n  display: flex;\\n  justify-content: space-between;\\n  position: relative;\\n  padding: 15px;\\n  align-items: center;\\n\"]))),gc=nr.button(uc||(uc=hc([\"\\n  margin-right: 5px;\\n  width: 30px;\\n  height: 30px;\\n  background-image: url(\",\");\\n  background-size: 100%;\\n  background-repeat: no-repeat;\\n  background-color: transparent;\\n  border: none;\\n\\n  &:focus {\\n    outline: none;\\n  }\\n\\n  &:hover {\\n    cursor: pointer;\\n  }\\n\"])),Eu),wc={content:{width:\"100%\",height:\"100%\",top:\"0\",left:\"0\",border:\"none\",borderRadius:\"none\",padding:\"0px\",boxSizing:\"border-box\"}},Sc=function(t){!function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,\"prototype\",{writable:!1}),t&&dc(e,t)}(l,t);var n,r,o,i,a=(o=l,i=function(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,t=yc(o);if(i){var n=yc(this).constructor;e=Reflect.construct(t,arguments,n)}else e=t.apply(this,arguments);return function(e,t){if(t&&(\"object\"===oc(t)||\"function\"==typeof t))return t;if(void 0!==t)throw new TypeError(\"Derived constructors may only return object or undefined\");return function(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e}(e)}(this,e)});function l(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,l),(t=a.call(this,e)).state={logLines:null},t}return n=l,r=[{key:\"render\",value:function(){var t=this.props.logs.visible,n=this.state.logLines,r=n&&n.map((function(e){return e[2]})).join(\"\\n\"),o=r||\"Loading Logs...\";return e.createElement(mc,null,e.createElement(Ou(),{isOpen:t,onAfterOpen:this.afterOpenModal.bind(this),onRequestClose:this.clearAndCloseModal.bind(this),style:wc,contentLabel:\"Example Modal\"},e.createElement(vc,null,e.createElement(qr,null),e.createElement(gc,{onClick:this.clearAndCloseModal.bind(this)})),e.createElement(bc,{value:o})))}},{key:\"clearAndCloseModal\",value:function(){var e=this.props.closeModal;this.setState({logLines:null}),e()}},{key:\"afterOpenModal\",value:function(){var e=this,t=this.props.logs.logs;fetch(t).then(function(){var t=function(e){return function(){var t=this,n=arguments;return new Promise((function(r,o){var i=e.apply(t,n);function a(e){sc(i,r,o,a,l,\"next\",e)}function l(e){sc(i,r,o,a,l,\"throw\",e)}a(void 0)}))}}(cc().mark((function t(n){var r;return cc().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(!n.ok){t.next=7;break}return t.next=3,n.json();case 3:r=t.sent,e.setState({logLines:r}),t.next=8;break;case 7:e.setState({logLines:[[\"\",\"\",\"error fetching logs: \".concat(n.statusText)]]});case 8:case\"end\":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}()).catch((function(t){var n=[[\"\",\"\",\"error fetching logs: \".concat(t.message)]];location.protocol.startsWith(\"file\")&&(n.push([\"\",\"\",\"This feature requires Backstop Remote running in a seprate terminal window.\"]),n.push([\"\",\"\",\"e.g. `backstop remote --config=<your config>`\"]),n.push([\"\",\"\",\"Please see the docs for more info.\"])),e.setState({logLines:n})}))}}],r&&fc(n.prototype,r),Object.defineProperty(n,\"prototype\",{writable:!1}),l}(e.Component);const Oc=X((function(e){return{logs:e.logs}}),(function(e){return{closeModal:function(){e({type:\"CLOSE_LOG_MODAL\",value:!1})}}}))(Sc);function Ec(e){return Ec=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},Ec(e)}var kc;function Pc(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,xc(r.key),r)}}function xc(e){var t=function(e,t){if(\"object\"!=Ec(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,\"string\");if(\"object\"!=Ec(r))return r;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return String(e)}(e);return\"symbol\"==Ec(t)?t:String(t)}function jc(e,t){return jc=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},jc(e,t)}function Cc(e){return Cc=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},Cc(e)}var Tc=nr.section(kc||(kc=function(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}([\"\\n  padding: 0 30px;\\n\"]))),Ac=function(t){!function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,\"prototype\",{writable:!1}),t&&jc(e,t)}(l,t);var n,r,o,i,a=(o=l,i=function(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,t=Cc(o);if(i){var n=Cc(this).constructor;e=Reflect.construct(t,arguments,n)}else e=t.apply(this,arguments);return function(e,t){if(t&&(\"object\"===Ec(t)||\"function\"==typeof t))return t;if(void 0!==t)throw new TypeError(\"Derived constructors may only return object or undefined\");return function(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e}(e)}(this,e)});function l(){return function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,l),a.apply(this,arguments)}return n=l,(r=[{key:\"render\",value:function(){return e.createElement(or.L9,null,e.createElement(zi,null),e.createElement(Tc,null,e.createElement(wu,null)),e.createElement(rc,null),e.createElement(Oc,null))}}])&&Pc(n.prototype,r),Object.defineProperty(n,\"prototype\",{writable:!1}),l}(e.Component);t.render(e.createElement(K,{store:he},e.createElement(Ac,null)),document.getElementById(\"root\"))})()})();"
  },
  {
    "path": "compare/output/index_bundle.js.LICENSE.txt",
    "content": "/*!\n  Copyright (c) 2015 Jed Watson.\n  Based on code that is Copyright 2013-2015, Facebook, Inc.\n  All rights reserved.\n*/\n\n/*!\n * Adapted from jQuery UI core\n *\n * http://jqueryui.com\n *\n * Copyright 2014 jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/category/ui-core/\n */\n\n/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */\n\n/**\n * @license React\n * react-dom.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @license React\n * react.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @license React\n * scheduler.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * @license React\n * use-sync-external-store-with-selector.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n"
  },
  {
    "path": "compare/src/.eslintrc",
    "content": "{\n  \"extends\": \"../../.eslintrc\",\n  \"parserOptions\": {\n    \"ecmaFeatures\": {\n      \"jsx\": true\n    },\n    \"sourceType\": \"module\"\n  },\n  \"env\": {\n    \"browser\": true,\n    \"node\": false\n  },\n  \"plugins\": [\n    \"react\"\n  ],\n  \"rules\": {\n    \"react/jsx-uses-react\": 2,\n    \"react/jsx-uses-vars\": 2\n  }\n}\n"
  },
  {
    "path": "compare/src/actions/index.js",
    "content": "export const approveTest = id => {\n  return {\n    type: 'APPROVE_TEST',\n    id\n  };\n};\n\nexport const filterTests = status => {\n  return {\n    type: 'FILTER_TESTS',\n    status\n  };\n};\n\nexport const findTests = value => {\n  return {\n    type: 'SEARCH_TESTS',\n    value\n  };\n};\n\nexport const updateSettings = id => {\n  return {\n    type: 'UPDATE_SETTINGS',\n    id\n  };\n};\n\nexport const toggleAllImages = value => {\n  return {\n    type: 'TOGGLE_ALL_IMAGES',\n    value\n  };\n};\n\nexport const openModal = value => {\n  return {\n    type: 'OPEN_SCRUBBER_MODAL',\n    value\n  };\n};\n\nexport const closeModal = value => {\n  return {\n    type: 'CLOSE_SCRUBBER_MODAL',\n    value\n  };\n};\n\nexport const showScrubberTestImage = value => {\n  return {\n    type: 'SHOW_SCRUBBER_TEST_IMAGE',\n    value\n  };\n};\n\nexport const showScrubberRefImage = value => {\n  return {\n    type: 'SHOW_SCRUBBER_REF_IMAGE',\n    value\n  };\n};\n\nexport const showScrubberDiffImage = value => {\n  return {\n    type: 'SHOW_SCRUBBER_DIFF_IMAGE',\n    value\n  };\n};\n\nexport const showScrubberDivergedImage = value => {\n  return {\n    type: 'SHOW_SCRUBBER_DIVERGED_IMAGE',\n    value\n  };\n};\n\nexport const showScrubber = value => {\n  return {\n    type: 'SHOW_SCRUBBER',\n    value\n  };\n};\n\nexport const openLogModal = value => {\n  return {\n    type: 'OPEN_LOG_MODAL',\n    value\n  };\n};\n\nexport const closeLogModal = value => {\n  return {\n    type: 'CLOSE_LOG_MODAL',\n    value\n  };\n};\n"
  },
  {
    "path": "compare/src/components/App.js",
    "content": "import React from 'react';\nimport styled from 'styled-components';\n// ESLint\n/* eslint-disable no-unused-vars */\nimport { StickyContainer } from 'react-sticky';\n\nimport Header from './ecosystems/Header';\nimport List from './ecosystems/List';\nimport ScrubberModal from './ecosystems/ScrubberModal';\nimport LogModal from './ecosystems/LogModal';\n\nconst Wrapper = styled.section`\n  padding: 0 30px;\n`;\n\nexport default class App extends React.Component {\n  render () {\n    return (\n      <StickyContainer>\n        <Header />\n        <Wrapper>\n          <List />\n        </Wrapper>\n        <ScrubberModal />\n        <LogModal />\n      </StickyContainer>\n    );\n  }\n}\n"
  },
  {
    "path": "compare/src/components/atoms/ButtonFilter.js",
    "content": "import React from 'react';\nimport styled from 'styled-components';\n\nimport { colors, fonts, shadows } from '../../styles';\n\nconst Button = styled.button`\n  font-size: 20px;\n  font-family: ${fonts.latoRegular};\n  flex: 0 0 auto;\n  margin: 0;\n  background-color: ${colors.white};\n  border: none;\n  border-radius: 3px;\n  box-shadow: ${props => (props.selected ? 'none' : shadows.shadow01)};\n  color: ${colors.primaryText};\n  margin-right: 15px;\n  padding: 0px 30px;\n  opacity: ${props => (props.selected ? '1' : '0.5')};\n  outline: none;\n  height: 100%;\n  transition: all 0.3s ease-in-out;\n\n  &:hover {\n    cursor: pointer;\n    box-shadow: ${props => (!props.selected ? shadows.shadow02 : '')};\n  }\n\n  &.pass {\n    background-color: ${colors.green};\n    color: ${colors.white};\n  }\n\n  &.fail {\n    background-color: ${colors.red};\n    color: ${colors.white};\n  }\n`;\n\nexport default class ButtonFilter extends React.Component {\n  render () {\n    const { count, label, status } = this.props;\n\n    return (\n      <Button\n        onClick={this.props.onClick}\n        selected={this.props.selected}\n        className={status}\n      >\n        {status !== 'all' ? count : ''} {label}\n      </Button>\n    );\n  }\n}\n"
  },
  {
    "path": "compare/src/components/atoms/ButtonSettings.js",
    "content": "import React from 'react';\nimport styled from 'styled-components';\n\nimport { colors, fonts, shadows } from '../../styles';\n\nimport settingsIcon from '../../assets/icons/settings.png';\n\nconst Button = styled.button`\n  border: none;\n  height: 100%;\n  border-radius: 3px;\n  background: ${colors.lightGray};\n  margin-left: 15px;\n  padding: 0 20px;\n  box-shadow: ${shadows.shadow01};\n  transition: all 0.3s ease-in-out;\n\n  &.active {\n    box-shadow: none;\n    opacity: 0.6;\n  }\n\n  &:hover {\n    cursor: pointer;\n    box-shadow: ${props => (!props.selected ? shadows.shadow02 : '')};\n  }\n\n  &:focus {\n    outline: none;\n  }\n\n  .icon {\n    height: 18px;\n    width: 18px;\n    display: block;\n    background-image: url(${settingsIcon});\n    background-size: 100%;\n    background-repeat: no-repeat;\n    background-position: center;\n    margin: 0 auto;\n    padding-bottom: 5px;\n  }\n\n  .label {\n    font-family: ${fonts.latoRegular};\n    color: ${colors.secondaryText};\n  }\n`;\n\nexport default class ButtonSettings extends React.Component {\n  render () {\n    const isActive = this.props.active ? 'active' : '';\n\n    return (\n      <Button onClick={this.props.onClick} className={isActive}>\n        <span className=\"icon\" />\n        {/* <span className=\"label\">settings</span> */}\n      </Button>\n    );\n  }\n}\n"
  },
  {
    "path": "compare/src/components/atoms/DiffDetails.js",
    "content": "import React from 'react';\nimport styled from 'styled-components';\nimport { colors, fonts } from '../../styles';\n\nconst Label = styled.span`\n  font-family: ${fonts.latoRegular};\n  color: ${colors.secondaryText};\n  font-size: 14px;\n  padding-right: 8px;\n`;\n\nconst Value = styled.span`\n  font-family: ${fonts.latoBold};\n  color: ${colors.primaryText};\n  font-size: 14px;\n  padding-right: 20px;\n`;\n\nexport default class DiffDetails extends React.Component {\n  render () {\n    const { diff, suppress } = this.props;\n    if (!diff || suppress) {\n      return null;\n    }\n\n    return (\n      <span>\n        <Label>diff%: </Label>\n        <Value>{diff.misMatchPercentage} </Value>\n        <Label>diff-x: </Label>\n        <Value>{diff.dimensionDifference.width} </Value>\n        <Label>diff-y: </Label>\n        <Value>{diff.dimensionDifference.height} </Value>\n      </span>\n    );\n  }\n}\n"
  },
  {
    "path": "compare/src/components/atoms/ErrorMessages.js",
    "content": "import React from 'react';\nimport { connect } from 'react-redux';\nimport styled from 'styled-components';\nimport { colors, fonts } from '../../styles';\n\nconst DetailsPanel = styled.div`\n  background: transparent;\n  display: ${props => (props.display ? 'block' : 'none')};\n  padding: 10px;\n  font-family: ${fonts.latoRegular};\n  color: ${colors.secondaryText};\n`;\n\nconst ErrorMsg = styled.p`\n  word-wrap: break-word;\n  font-family: monospace;\n  background: rgb(251, 234, 234);\n  padding: 2ex;\n  color: brown;\n  display: ${props => (props.display ? 'block' : 'none')};\n`;\n\nclass ErrorMessages extends React.Component {\n  constructor (props) {\n    super(props);\n    this.state = {};\n  }\n\n  render () {\n    const backstopError = this.props.info.error;\n    const engineError = this.props.info.engineErrorMsg;\n    const display = !!engineError || !!backstopError;\n\n    return (\n      <DetailsPanel display={display}>\n        <ErrorMsg display={engineError}>ENGINE ERROR: {engineError}</ErrorMsg>\n        <ErrorMsg display={backstopError}>\n          BACKSTOP ERROR: {backstopError}\n        </ErrorMsg>\n      </DetailsPanel>\n    );\n  }\n}\n\nconst mapStateToProps = state => {\n  return {\n    settings: state.layoutSettings\n  };\n};\n\nconst ErrorMessagesContainer = connect(mapStateToProps)(ErrorMessages);\n\nexport default ErrorMessagesContainer;\n"
  },
  {
    "path": "compare/src/components/atoms/IdContainer.js",
    "content": "import React from 'react';\nimport { connect } from 'react-redux';\nimport styled from 'styled-components';\n\nimport { colors, fonts } from '../../styles';\n\nconst IdTitle = styled.h3`\n  font-size: 14px;\n  font-family: ${fonts.arial};\n  font-weight: normal;\n  font-style: normal;\n  margin: 0;\n  color: ${colors.secondaryText};\n  flex: 1 0 auto;\n  padding-left: 15px;\n  margin-left: 15px;\n  margin-top: 7px;\n  position: relative;\n\n  :before {\n    content: '';\n    width: 2px;\n    height: 35px;\n    background: ${colors.borderGray};\n    display: block;\n    position: absolute;\n    left: 0;\n    top: -10px;\n  }\n`;\n\nclass IdConfig extends React.Component {\n  render () {\n    return <IdTitle>{this.props.idConfig}</IdTitle>;\n  }\n}\n\nconst mapStateToProps = state => {\n  return {\n    idConfig: state.suiteInfo.idConfig\n  };\n};\n\nconst IdContainer = connect(mapStateToProps)(IdConfig);\n\nexport default IdContainer;\n"
  },
  {
    "path": "compare/src/components/atoms/ImagePreview.js",
    "content": "import React from 'react';\nimport { connect } from 'react-redux';\nimport VisibilitySensor from 'react-visibility-sensor';\nimport styled from 'styled-components';\nimport { colors, fonts } from '../../styles';\n\nconst BASE64_PNG_STUB =\n  'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';\n\nconst Image = styled.img`\n  width: auto;\n  max-width: 100%;\n  max-height: ${props => (props.settings.textInfo ? '150px' : '400px')};\n\n  &:hover {\n    cursor: pointer;\n  }\n`;\n\nconst Wrapper = styled.div`\n  flex: 1 1 auto;\n  padding: 0 25px;\n  padding-top: ${props => (props.withText ? '10px' : '20px')};\n  text-align: center;\n`;\n\nconst Label = styled.span`\n  text-align: center;\n  font-family: ${fonts.latoRegular};\n  color: ${colors.secondaryText};\n  display: block;\n  margin: 0 auto;\n  text-transform: uppercase;\n  padding: 5px 0;\n  padding-bottom: 15px;\n  font-size: 12px;\n`;\n\nconst visibilitySensorProps = {\n  offset: {\n    bottom: -400\n  },\n  partialVisibility: true\n};\n\nclass ImagePreview extends React.Component {\n  constructor (props) {\n    super(props);\n    this.state = {\n      isVisible: false\n    };\n    this.onLoadError = this.onLoadError.bind(this);\n    this.onChange = this.onChange.bind(this);\n  }\n\n  onChange (isVisible) {\n    if (isVisible && !this.state.isVisible) {\n      console.log('setting state to visible');\n      this.setState({\n        isVisible: true\n      });\n    }\n  }\n\n  onLoadError () {\n    this.setState({\n      imgLoadError: true\n    });\n  }\n\n  render () {\n    let { hidden, settings, label, src } = this.props;\n    if (!src || src === '../..' || this.state.imgLoadError) {\n      src = BASE64_PNG_STUB;\n    }\n    return (\n      <VisibilitySensor {...visibilitySensorProps} onChange={this.onChange}>\n        {this.state.isVisible\n          ? (\n            <Wrapper hidden={hidden} withText={settings.textInfo}>\n              <Label>{label}</Label>\n              <Image {...this.props} src={src} onError={this.onLoadError} />\n            </Wrapper>\n            )\n          : (<p>Most lemurs only see in one or two colors.</p>)\n        }\n      </VisibilitySensor>\n    );\n  }\n}\n\nconst mapStateToProps = state => {\n  return {\n    settings: state.layoutSettings\n  };\n};\n\nconst ImagePreviewContainer = connect(mapStateToProps)(ImagePreview);\n\nexport default ImagePreviewContainer;\n"
  },
  {
    "path": "compare/src/components/atoms/ImageScrubber.js",
    "content": "import React from 'react';\nimport styled from 'styled-components';\nimport TwentyTwenty from 'backstop-twentytwenty';\nimport { colors, fonts, shadows } from '../../styles';\n\nconst ScrubberViewBtn = styled.button`\n  margin: 1em;\n  padding: 10px 16px;\n  height: 32px;\n  background-color: ${props =>\n    props.selected ? colors.secondaryText : colors.lightGray};\n  color: ${props => (props.selected ? colors.lightGray : colors.secondaryText)};\n  border-radius: 3px;\n  text-transform: uppercase;\n  font-family: ${fonts.latoRegular};\n  text-align: center;\n  font-size: 12px;\n  border: none;\n  box-shadow: ${props => (props.selected ? 'none' : shadows.shadow01)};\n\n  transition: all 100ms ease-in-out;\n\n  &:focus {\n    outline: none;\n  }\n\n  &:hover {\n    cursor: pointer;\n    box-shadow: ${props => (!props.selected ? shadows.shadow02 : '')};\n  }\n\n  &.loadingDiverged {\n    animation: blink normal 1200ms infinite ease-in-out;\n    background-color: green;\n  }\n  @keyframes blink {\n    0% {\n      opacity: 1;\n    }\n    50% {\n      opacity: 0.75;\n    }\n    100% {\n      opacity: 1;\n    }\n  }\n`;\n\nconst Wrapper = styled.div`\n  cursor: ew-resize;\n  padding-bottom: 20px;\n  overflow: hidden;\n\n  .testImage {\n    opacity: 1;\n  }\n\n  .testImage,\n  .refImage {\n    max-width: 100%;\n  }\n`;\n\nconst WrapTitle = styled.div`\n  display: flex;\n  justify-content: center;\n  padding-top: 10px;\n  padding-bottom: 10px;\n  position: sticky;\n  top: 0;\n  z-index: 5;\n  background: white;\n  border-bottom: 1px solid #e4e4e4;\n\n`;\n\nconst SliderBar = styled.div`\n  height: 100%;\n  width: 5px;\n  background: ${colors.red};\n  transform: translate(-2.5px, 0);\n`;\n\nexport default class ImageScrubber extends React.Component {\n  constructor (props) {\n    super(props);\n    this.state = {\n      isRefImageMissing: false,\n      isLoading: false\n    };\n\n    this.handleRefImageLoadingError = this.handleRefImageLoadingError.bind(this);\n    this.loadingDiverge = this.loadingDiverge.bind(this);\n  }\n\n  handleRefImageLoadingError () {\n    this.setState({\n      isRefImageMissing: true\n    });\n  }\n\n  loadingDiverge (torf) {\n    this.setState({\n      isLoading: !!torf\n    });\n  }\n\n  render () {\n    const {\n      scrubberModalMode,\n      testImageType,\n      position,\n      refImage,\n      testImage,\n      diffImage,\n      divergedImage,\n      showScrubberTestImage,\n      showScrubberRefImage,\n      showScrubberDiffImage,\n      showScrubberDivergedImage,\n      showScrubber\n    } = this.props;\n\n    const scrubberTestImageSlug = this.props[testImageType];\n    const hasDiff = diffImage && diffImage.length > 0;\n\n    // only show the diverged option if the report comes from web server\n    function showDivergedOption () {\n      return /remote/.test(location.search);\n    }\n\n    // TODO: halp. i don't haz context.\n    const that = this;\n\n    function divergedWorker () {\n      if (that.state.isLoading) {\n        console.error('Diverged process is already running. Please hang on.');\n        return;\n      }\n\n      if (divergedImage) {\n        showScrubberDivergedImage(divergedImage);\n        return;\n      }\n\n      showScrubberDivergedImage('');\n      that.loadingDiverge(true);\n\n      const refImg = document.images.isolatedRefImage;\n      const testImg = document.images.isolatedTestImage;\n      const h = refImg.height;\n      const w = refImg.width;\n\n      const worker = new Worker('divergedWorker.js');\n\n      worker.addEventListener(\n        'message',\n        function (result) {\n          const divergedImgData = result.data;\n          const clampedImgData = getEmptyImgData(h, w);\n          for (let i = divergedImgData.length - 1; i >= 0; i--) {\n            clampedImgData.data[i] = divergedImgData[i];\n          }\n          const lcsDiffResult = imageToCanvasContext(null, h, w);\n          lcsDiffResult.putImageData(clampedImgData, 0, 0);\n\n          const divergedImageResult = lcsDiffResult.canvas.toDataURL(\n            'image/png'\n          );\n          showScrubberDivergedImage(divergedImageResult);\n          that.loadingDiverge(false);\n        },\n        false\n      );\n\n      worker.addEventListener('error', function (error) {\n        showScrubberDivergedImage('');\n        that.loadingDiverge(false);\n        console.error(error);\n      });\n\n      worker.postMessage({\n        divergedInput: [\n          getImgDataDataFromContext(imageToCanvasContext(refImg)),\n          getImgDataDataFromContext(imageToCanvasContext(testImg)),\n          h,\n          w\n        ]\n      });\n    }\n\n    const dontUseScrubberView = this.state.isRefImageMissing || !hasDiff;\n    const showIsolatedRefImage = !hasDiff && scrubberModalMode === 'SHOW_SCRUBBER_REF_IMAGE';\n    const showIsolatedTestImage = !hasDiff && scrubberModalMode === 'SHOW_SCRUBBER_TEST_IMAGE';\n    return (\n      <div>\n        <WrapTitle>\n          {hasDiff && (\n            <div>\n              <ScrubberViewBtn\n                selected={scrubberModalMode === 'SHOW_SCRUBBER_REF_IMAGE'}\n                onClick={showScrubberRefImage}\n              >\n                REFERENCE\n              </ScrubberViewBtn>\n\n              <ScrubberViewBtn\n                selected={scrubberModalMode === 'SHOW_SCRUBBER_TEST_IMAGE'}\n                onClick={showScrubberTestImage}\n              >\n                TEST\n              </ScrubberViewBtn>\n\n              <ScrubberViewBtn\n                selected={scrubberModalMode === 'SHOW_SCRUBBER_DIFF_IMAGE'}\n                onClick={showScrubberDiffImage}\n              >\n                DIFF\n              </ScrubberViewBtn>\n\n              <ScrubberViewBtn\n                selected={scrubberModalMode === 'SCRUB'}\n                onClick={showScrubber}\n              >\n                SCRUBBER\n              </ScrubberViewBtn>\n\n              <ScrubberViewBtn\n                selected={scrubberModalMode === 'SHOW_SCRUBBER_DIVERGED_IMAGE'}\n                onClick={divergedWorker}\n                className={this.state.isLoading ? 'loadingDiverged' : ''}\n                style={{\n                  display: showDivergedOption() ? '' : 'none'\n                }}\n              >\n                {this.state.isLoading ? 'DIVERGING!' : 'DIVERGED'}\n              </ScrubberViewBtn>\n            </div>\n          )}\n        </WrapTitle>\n        <Wrapper>\n          <img\n            id=\"isolatedRefImage\"\n            src={refImage}\n            style={{\n              margin: 'auto',\n              display: showIsolatedRefImage ? 'block' : 'none'\n            }}\n          />\n          <img\n            id=\"isolatedTestImage\"\n            className=\"testImage\"\n            src={testImage}\n            style={{\n              margin: 'auto',\n              display: showIsolatedTestImage ? 'block' : 'none'\n            }}\n          />\n          <img\n            className=\"diffImage\"\n            src={diffImage}\n            style={{\n              margin: 'auto',\n              display: dontUseScrubberView ? 'block' : 'none'\n            }}\n          />\n          <div\n            style={{\n              display: dontUseScrubberView ? 'none' : 'block'\n            }}\n          >\n            <TwentyTwenty\n              verticalAlign=\"top\"\n              minDistanceToBeginInteraction={0}\n              maxAngleToBeginInteraction={Infinity}\n              initialPosition={position}\n              newPosition={position}\n            >\n              <img\n                id=\"scrubberRefImage\"\n                className=\"refImage\"\n                src={refImage}\n                onError={this.handleRefImageLoadingError}\n              />\n              <img\n                id=\"scrubberTestImage\"\n                className=\"testImage\"\n                src={scrubberTestImageSlug}\n              />\n              <SliderBar className=\"slider\" />\n            </TwentyTwenty>\n          </div>\n        </Wrapper>\n      </div>\n    );\n  }\n}\n\n/**\n * ========= DIVERGED HELPERS ========\n */\nfunction getImgDataDataFromContext (context) {\n  return context.getImageData(0, 0, context.canvas.width, context.canvas.height)\n    .data;\n}\n\nfunction getEmptyImgData (h, w) {\n  const o = imageToCanvasContext(null, h, w);\n  return o.createImageData(w, h);\n}\n\nfunction imageToCanvasContext (_img, h, w) {\n  let img = _img;\n  if (!_img) {\n    img = { height: h, width: w };\n  }\n  const canvas = document.createElement('canvas');\n  canvas.width = img.width;\n  canvas.height = img.height;\n  const context = canvas.getContext('2d');\n  if (_img) {\n    context.drawImage(img, 0, 0);\n  }\n  return context;\n}\n"
  },
  {
    "path": "compare/src/components/atoms/InputTextSearch.js",
    "content": "import React from 'react';\nimport styled from 'styled-components';\n\nimport { colors, fonts } from '../../styles';\n\nimport searchIcon from '../../assets/icons/search.png';\n\nconst Input = styled.input`\n  display: block;\n  height: 100%;\n  border: none;\n  font-size: 16px;\n  background-color: ${colors.lightGray};\n  padding: 0 10px 0 55px;\n  font-family: ${fonts.latoRegular};\n  width: 100%;\n  box-sizing: border-box;\n  border-radius: 3px;\n  background-image: url(${searchIcon});\n  background-repeat: no-repeat;\n  background-position-x: 15px;\n  background-position-y: calc(100% / 2);\n  background-size: 22px;\n\n  &:focus {\n    outline: none;\n  }\n\n  &::placeholder {\n    font-family: ${fonts.arial};\n    font-weight: 400;\n    font-style: italic;\n    color: ${colors.secondaryText};\n  }\n`;\n\nexport default class ButtonFilter extends React.Component {\n  render () {\n    return (\n      <Input\n        placeholder=\"Filter tests with search...\"\n        onChange={this.props.onChange.bind(this)}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "compare/src/components/atoms/LogDetails.js",
    "content": "import React from 'react';\nimport styled from 'styled-components';\nimport { colors, fonts } from '../../styles';\nimport { connect } from 'react-redux';\nimport { openLogModal } from '../../actions';\n\nconst Label = styled.span`\n  font-family: ${fonts.latoRegular};\n  color: ${colors.secondaryText};\n  font-size: 14px;\n  padding-right: 8px;\n`;\n\nconst Value = styled.span`\n  font-family: ${fonts.latoBold};\n  color: ${colors.primaryText};\n  font-size: 14px;\n  padding-right: 20px;\n`;\n\nconst Link = styled.a`\n  &::before {\n    content: ${props => (props.withSeperator ? '\"|\"' : '')};\n    margin: ${props => (props.withSeperator ? '0 10px' : '')};\n  }\n`;\n\nexport class LogDetails extends React.Component {\n  onClick (log, event) {\n    const { openLogModal } = this.props;\n    event.preventDefault();\n    openLogModal(log);\n  }\n\n  render () {\n    const { referenceLog, testLog } = this.props;\n    if (!referenceLog && !testLog) return [];\n    return (\n      <span>\n        <Label>browser log: </Label>\n        <Value>\n        {\n            testLog\n              ? <Link href=\"#\" onClick={ this.onClick.bind(this, testLog) } >\n                  test\n                </Link>\n              : []\n          }\n          {\n            referenceLog\n              ? <Link withSeperator href=\"#\" onClick={ this.onClick.bind(this, referenceLog) } >\n                  reference\n                </Link>\n              : []\n          }\n        </Value>\n      </span>\n    );\n  }\n}\n\nconst mapStateToProps = state => {\n  return {};\n};\n\nconst mapDispatchToProps = dispatch => {\n  return {\n    openLogModal: value => {\n      dispatch(openLogModal(value));\n    }\n  };\n};\n\nconst LogDetailsContainer = connect(mapStateToProps, mapDispatchToProps)(\n  LogDetails\n);\n\nexport default LogDetailsContainer;\n"
  },
  {
    "path": "compare/src/components/atoms/Logo.js",
    "content": "import React from 'react';\nimport styled from 'styled-components';\n\nimport LogoImg from '../../assets/images/logo.png';\n\nconst LogoImage = styled.img`\n  display: block;\n  height: 35px;\n`;\n\nexport default class Logo extends React.Component {\n  render () {\n    return (\n      <a href=\"https://garris.github.io/BackstopJS/\" target=\"_blank\">\n        <LogoImage src={LogoImg} />\n      </a>\n    );\n  }\n}\n"
  },
  {
    "path": "compare/src/components/atoms/NavButtons.js",
    "content": "import React from 'react';\nimport styled from 'styled-components';\n\nimport jump from 'jump.js';\n\nimport { colors } from '../../styles';\nimport iconDown from '../../assets/icons/iconDown.png';\n\nconst Wrapper = styled.div`\n  a {\n    display: inline-block;\n    text-align: right;\n  }\n`;\n\nconst ButtonNav = styled.div`\n  background-color: ${colors.lightGray};\n  background-image: url(${iconDown});\n  background-repeat: no-repeat;\n  background-position: center center;\n  color: ${colors.secondaryText};\n  border-radius: 3px;\n  height: 32px;\n  width: 32px;\n  margin: 0 0px 0 5px;\n  transform: ${props => (props.prev ? 'rotate(0)' : 'rotate(180deg)')};\n  opacity: ${props => (props.disabled ? '0.2' : '1')};\n  display: inline-block;\n\n  &:hover {\n    cursor: ${props => (props.disabled ? '' : 'pointer')};\n    background-color: ${props => (props.disabled ? `${colors.lightGray}` : `${colors.medGray}`)};\n  }\n`;\n\nexport default class NavButtons extends React.Component {\n  nextTest () {\n    const dest = `#test${this.props.currentId + 1}`;\n    this.jumpTo(dest);\n  }\n\n  prevTest () {\n    const dest = `#test${this.props.currentId - 1}`;\n    this.jumpTo(dest);\n  }\n\n  jumpTo (dest) {\n    jump(dest, {\n      duration: 0,\n      offset: -100\n    });\n  }\n\n  render () {\n    const { currentId, lastId } = this.props;\n\n    return (\n      <Wrapper>\n        {currentId === 0 && (\n          <ButtonNav onClick={this.prevTest.bind(this)} prev disabled />\n        )}\n        {currentId !== 0 && (\n          <ButtonNav onClick={this.prevTest.bind(this)} prev />\n        )}\n        {lastId !== currentId && (\n          <ButtonNav onClick={this.nextTest.bind(this)} />\n        )}\n        {lastId === currentId && (\n          <ButtonNav onClick={this.nextTest.bind(this)} disabled />\n        )}\n      </Wrapper>\n    );\n  }\n}\n"
  },
  {
    "path": "compare/src/components/atoms/SettingOption.js",
    "content": "import React from 'react';\nimport styled from 'styled-components';\nimport ToggleButton from 'react-toggle-button';\n\nimport { colors, fonts } from '../../styles';\n\nconst WrapperOption = styled.div`\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  padding: 10px 0;\n\n  span {\n    padding-right: 10px;\n    text-align: left;\n    font-family: ${fonts.latoRegular};\n    color: ${colors.primaryText};\n    font-size: 14px;\n  }\n`;\n\nexport default class SettingOption extends React.Component {\n  render () {\n    const { label, value, onToggle } = this.props;\n\n    return (\n      <WrapperOption>\n        <span>{label}</span>\n\n        <ToggleButton value={value || false} onToggle={onToggle} />\n      </WrapperOption>\n    );\n  }\n}\n"
  },
  {
    "path": "compare/src/components/atoms/SuiteName.js",
    "content": "import React from 'react';\nimport { connect } from 'react-redux';\nimport styled from 'styled-components';\n\nimport { colors, fonts } from '../../styles';\n\nconst SuiteNameTitle = styled.h1`\n  font-size: 26px;\n  font-family: ${fonts.latoRegular};\n  flex: 0 0 auto;\n  margin: 0;\n  color: ${colors.primaryText};\n`;\n\nclass SuiteName extends React.Component {\n  render () {\n    return <SuiteNameTitle>{this.props.suiteName} Report</SuiteNameTitle>;\n  }\n}\n\nconst mapStateToProps = state => {\n  return {\n    suiteName: state.suiteInfo.testSuiteName\n  };\n};\n\nconst SuiteNameContainer = connect(mapStateToProps)(SuiteName);\n\nexport default SuiteNameContainer;\n"
  },
  {
    "path": "compare/src/components/atoms/TextDetails.js",
    "content": "import React from 'react';\nimport { connect } from 'react-redux';\nimport styled from 'styled-components';\nimport DiffDetails from './DiffDetails';\nimport UrlDetails from './UrlDetails';\nimport LogDetails from './LogDetails';\n\nimport { colors, fonts } from '../../styles';\n\n// styled\nconst WrapperDetails = styled.div``;\n\nconst Row = styled.div`\n  padding: 5px 0;\n`;\n\nconst Label = styled.span`\n  font-family: ${fonts.latoRegular};\n  color: ${colors.secondaryText};\n  font-size: 14px;\n  padding-right: 8px;\n`;\n\nconst Value = styled.span`\n  font-family: ${fonts.latoBold};\n  color: ${colors.primaryText};\n  font-size: 14px;\n  padding-right: 20px;\n`;\n\nconst DetailsPanel = styled.div`\n  display: ${props => (props.showPanel ? 'block' : 'none')};\n  position: absolute;\n  background-color: ${colors.white};\n  padding: 10px;\n  top: -28px;\n  left: 20px;\n  box-shadow: 0 3px 6px 0 rgba(0, 0, 0, 0.16);\n  z-index: 999;\n`;\n\nclass TextDetails extends React.Component {\n  constructor (props) {\n    super(props);\n\n    this.state = {\n      showPanel: false\n    };\n\n    this.showPanel = this.showPanel.bind(this);\n    this.hidePanel = this.hidePanel.bind(this);\n  }\n\n  showPanel () {\n    const { settings } = this.props;\n    if (!settings.textInfo) {\n      this.setState({\n        showPanel: true\n      });\n    }\n  }\n\n  hidePanel () {\n    this.setState({\n      showPanel: false\n    });\n  }\n\n  render () {\n    const {\n      label,\n      fileName,\n      selector,\n      diff,\n      url,\n      referenceUrl,\n      referenceLog,\n      testLog\n    } = this.props.info;\n    const { settings } = this.props;\n    const { showPanel } = this.state;\n\n    return (\n      <WrapperDetails>\n        <Row hidden={!settings.textInfo}>\n          <Label>label: </Label>\n          <Value>{label}</Value>\n          <Label>selector: </Label>\n          <Value>{selector}</Value>\n        </Row>\n        <Row>\n          <Label>filename: </Label>\n          <Value onMouseOver={this.showPanel}>{fileName}</Value>\n        </Row>\n        <DiffDetails suppress={!settings.textInfo} diff={diff} />\n\n        <DetailsPanel {...{ showPanel }} onMouseLeave={this.hidePanel}>\n          <Row>\n            <Label>label: </Label>\n            <Value>{label} </Value>\n            <Label>selector: </Label>\n            <Value>{selector} </Value>\n          </Row>\n          <Row>\n            <Label>filename: </Label>\n            <Value>{fileName} </Value>\n          </Row>\n          <Row>\n            {\n              ((referenceLog || testLog) &&\n                <LogDetails referenceLog={referenceLog} testLog={testLog} />\n              )\n            }\n            <UrlDetails url={url} referenceUrl={referenceUrl} />\n            <DiffDetails diff={diff} />\n          </Row>\n        </DetailsPanel>\n      </WrapperDetails>\n    );\n  }\n}\n\nconst mapStateToProps = state => {\n  return {\n    settings: state.layoutSettings\n  };\n};\n\nconst TextDetailsContainer = connect(mapStateToProps)(TextDetails);\n\nexport default TextDetailsContainer;\n"
  },
  {
    "path": "compare/src/components/atoms/UrlDetails.js",
    "content": "import React from 'react';\nimport styled from 'styled-components';\nimport { colors, fonts } from '../../styles';\n\nconst Label = styled.span`\n  font-family: ${fonts.latoRegular};\n  color: ${colors.secondaryText};\n  font-size: 14px;\n  padding-right: 8px;\n`;\n\nconst Value = styled.span`\n  font-family: ${fonts.latoBold};\n  color: ${colors.primaryText};\n  font-size: 14px;\n  padding-right: 20px;\n`;\n\nconst Link = styled.a`\n  &::before {\n    content: ${props => (props.withSeperator ? '\"|\"' : '')};\n    margin: ${props => (props.withSeperator ? '0 10px' : '')};\n  }\n`;\n\nexport default class DiffDetails extends React.Component {\n  render () {\n    const { url, referenceUrl } = this.props;\n    return (\n      <span>\n        <Label>url: </Label>\n        <Value>\n          <Link href={url} target=\"_blank\">\n            test\n          </Link>\n          {referenceUrl && (\n            <Link withSeperator href={referenceUrl} target=\"_blank\">\n              reference\n            </Link>\n          )}\n        </Value>\n      </span>\n    );\n  }\n}\n"
  },
  {
    "path": "compare/src/components/ecosystems/Header.js",
    "content": "import React from 'react';\nimport styled from 'styled-components';\nimport { Sticky } from 'react-sticky';\n\nimport Topbar from '../organisms/Topbar';\nimport Toolbar from '../organisms/Toolbar';\n\nconst HeaderWrapper = styled.section`\n  width: 100%;\n  margin: 0 auto;\n  padding: 15px 0;\n  z-index: 999;\n  box-sizing: border-box;\n  position: relative;\n`;\n\nexport default class Header extends React.Component {\n  render () {\n    return (\n      <HeaderWrapper className=\"header\">\n        <Topbar />\n        <Sticky topOffset={72}>\n          {({\n            isSticky,\n            wasSticky,\n            style,\n            distanceFromTop,\n            distanceFromBottom,\n            calculatedHeight\n          }) => {\n            return <Toolbar style={style} />;\n          }}\n        </Sticky>\n      </HeaderWrapper>\n    );\n  }\n}\n"
  },
  {
    "path": "compare/src/components/ecosystems/List.js",
    "content": "import React from 'react';\nimport styled from 'styled-components';\nimport { connect } from 'react-redux';\n\n// organisms\nimport TestCard from '../organisms/TestCard';\n\nconst ListWrapper = styled.section`\n  width: 100%;\n  margin: 0 auto;\n  margin-top: 20px;\n  z-index: 1;\n`;\n\nclass List extends React.Component {\n  render () {\n    const { tests, settings } = this.props;\n    const onlyText =\n      !settings.refImage && !settings.testImage && !settings.diffImage;\n\n    return (\n      <ListWrapper>\n        {tests.map((test, i, arr) => (\n          <TestCard\n            id={`test${i}`}\n            numId={i}\n            test={test}\n            key={i}\n            lastId={arr.length - 1}\n            onlyText={onlyText}\n          />\n        ))}\n      </ListWrapper>\n    );\n  }\n}\n\nconst mapStateToProps = state => {\n  return {\n    tests: state.tests.filtered,\n    settings: state.layoutSettings\n  };\n};\n\nconst ListContainer = connect(mapStateToProps)(List);\n\nexport default ListContainer;\n"
  },
  {
    "path": "compare/src/components/ecosystems/LogModal.js",
    "content": "import React from 'react';\nimport { connect } from 'react-redux';\nimport styled from 'styled-components';\nimport Modal from 'react-modal';\nimport {\n  closeLogModal\n} from '../../actions';\n\n// styles & icons\nimport iconClose from '../../assets/icons/close.png';\n\n// atoms\nimport Logo from '../atoms/Logo';\n\nconst Wrapper = styled.div`\n  display: block;\n`;\n\nconst TextArea = styled.textarea`\ndisplay: block;\nwidth: 90%;\nheight: 50%;\nmargin 0 auto;\n\n`;\n\nconst ModalHeader = styled.div`\n  display: flex;\n  justify-content: space-between;\n  position: relative;\n  padding: 15px;\n  align-items: center;\n`;\n\nconst ButtonClose = styled.button`\n  margin-right: 5px;\n  width: 30px;\n  height: 30px;\n  background-image: url(${iconClose});\n  background-size: 100%;\n  background-repeat: no-repeat;\n  background-color: transparent;\n  border: none;\n\n  &:focus {\n    outline: none;\n  }\n\n  &:hover {\n    cursor: pointer;\n  }\n`;\n\nconst customStyles = {\n  content: {\n    width: '100%',\n    height: '100%',\n    top: '0',\n    left: '0',\n    border: 'none',\n    borderRadius: 'none',\n    padding: '0px',\n    boxSizing: 'border-box'\n  }\n};\n\nclass LogModal extends React.Component {\n  constructor (props) {\n    super(props);\n    this.state = { logLines: null };\n  }\n\n  render () {\n    const {\n      visible\n      // logs: logPath\n    } = this.props.logs;\n\n    const logLines = this.state.logLines;\n    const loadedLogs = logLines && logLines.map(it => it[2]).join('\\n');\n    const logs = loadedLogs || 'Loading Logs...';\n\n    return (\n      <Wrapper>\n        <Modal\n          isOpen={visible}\n          onAfterOpen={this.afterOpenModal.bind(this)}\n          onRequestClose={this.clearAndCloseModal.bind(this)}\n          style={customStyles}\n          contentLabel=\"Example Modal\"\n        >\n          <ModalHeader>\n            <Logo />\n            <ButtonClose onClick={this.clearAndCloseModal.bind(this)} />\n          </ModalHeader>\n          <TextArea value={logs}></TextArea>\n        </Modal>\n      </Wrapper>\n    );\n  }\n\n  clearAndCloseModal () {\n    const {\n      closeModal\n    } = this.props;\n\n    this.setState({\n      logLines: null\n    });\n    closeModal();\n  }\n\n  afterOpenModal () {\n    const logPath = this.props.logs.logs;\n    fetch(logPath).then(async (response) => {\n      if (response.ok) {\n        const json = await response.json();\n        this.setState({\n          logLines: json\n        });\n      } else {\n        this.setState({ logLines: [['', '', `error fetching logs: ${response.statusText}`]] });\n      }\n    }).catch(err => {\n      const errorLines = [['', '', `error fetching logs: ${err.message}`]];\n      if (location.protocol.startsWith('file')) {\n        errorLines.push(['', '', 'This feature requires Backstop Remote running in a seprate terminal window.']);\n        errorLines.push(['', '', 'e.g. `backstop remote --config=<your config>`']);\n        errorLines.push(['', '', 'Please see the docs for more info.']);\n      }\n      this.setState({ logLines: errorLines });\n    });\n  }\n}\n\nconst mapStateToProps = state => {\n  return {\n    logs: state.logs\n  };\n};\n\nconst mapDispatchToProps = dispatch => {\n  return {\n    closeModal: () => {\n      dispatch(closeLogModal(false));\n    }\n  };\n};\n\nconst ScrubberModalContainer = connect(mapStateToProps, mapDispatchToProps)(\n  LogModal\n);\n\nexport default ScrubberModalContainer;\n"
  },
  {
    "path": "compare/src/components/ecosystems/ScrubberModal.js",
    "content": "import React from 'react';\nimport { connect } from 'react-redux';\nimport styled from 'styled-components';\nimport Modal from 'react-modal';\nimport {\n  closeModal,\n  showScrubberTestImage,\n  showScrubberRefImage,\n  showScrubberDiffImage,\n  showScrubberDivergedImage,\n  showScrubber\n} from '../../actions';\n\n// styles & icons\nimport iconClose from '../../assets/icons/close.png';\n\n// atoms\nimport Logo from '../atoms/Logo';\nimport ImageScrubber from '../atoms/ImageScrubber';\n\nconst Wrapper = styled.div`\n  display: block;\n`;\n\nconst ModalHeader = styled.div`\n  display: flex;\n  justify-content: space-between;\n  position: relative;\n  padding: 15px;\n  align-items: center;\n`;\n\nconst ButtonClose = styled.button`\n  margin-right: 5px;\n  width: 30px;\n  height: 30px;\n  background-image: url(${iconClose});\n  background-size: 100%;\n  background-repeat: no-repeat;\n  background-color: transparent;\n  border: none;\n\n  &:focus {\n    outline: none;\n  }\n\n  &:hover {\n    cursor: pointer;\n  }\n`;\n\nconst customStyles = {\n  content: {\n    width: '100%',\n    height: '100%',\n    top: '0',\n    left: '0',\n    border: 'none',\n    borderRadius: 'none',\n    padding: '0px',\n    boxSizing: 'border-box'\n  }\n};\n\nclass ScrubberModal extends React.Component {\n  render () {\n    const {\n      reference: refImage,\n      test: testImage,\n      diffImage,\n      divergedImage\n    } = this.props.scrubber.test;\n    const {\n      visible,\n      position,\n      testImageType,\n      scrubberModalMode\n    } = this.props.scrubber;\n    const {\n      closeModal,\n      showScrubberTestImage,\n      showScrubberRefImage,\n      showScrubberDiffImage,\n      showScrubberDivergedImage,\n      showScrubber\n    } = this.props;\n\n    return (\n      <Wrapper>\n        <Modal\n          isOpen={visible}\n          /* onAfterOpen={this.afterOpenModal} */\n          onRequestClose={closeModal}\n          style={customStyles}\n          contentLabel=\"Example Modal\"\n        >\n          <ModalHeader>\n            <Logo />\n            <ButtonClose onClick={closeModal} />\n          </ModalHeader>\n          <ImageScrubber\n            scrubberModalMode={scrubberModalMode}\n            testImageType={testImageType}\n            testImage={testImage}\n            refImage={refImage}\n            diffImage={diffImage}\n            divergedImage={divergedImage}\n            position={position}\n            showScrubberTestImage={showScrubberTestImage}\n            showScrubberRefImage={showScrubberRefImage}\n            showScrubberDiffImage={showScrubberDiffImage}\n            showScrubberDivergedImage={showScrubberDivergedImage}\n            showScrubber={showScrubber}\n          />\n        </Modal>\n      </Wrapper>\n    );\n  }\n}\n\nconst mapStateToProps = state => {\n  return {\n    scrubber: state.scrubber\n  };\n};\n\nconst mapDispatchToProps = dispatch => {\n  return {\n    closeModal: () => {\n      dispatch(closeModal(false));\n    },\n    showScrubberTestImage: val => {\n      dispatch(showScrubberTestImage(val));\n    },\n    showScrubberRefImage: val => {\n      dispatch(showScrubberRefImage(val));\n    },\n    showScrubberDiffImage: val => {\n      dispatch(showScrubberDiffImage(val));\n    },\n    showScrubberDivergedImage: val => {\n      dispatch(showScrubberDivergedImage(val));\n    },\n    showScrubber: val => {\n      dispatch(showScrubber(val));\n    }\n  };\n};\n\nconst ScrubberModalContainer = connect(mapStateToProps, mapDispatchToProps)(\n  ScrubberModal\n);\n\nexport default ScrubberModalContainer;\n"
  },
  {
    "path": "compare/src/components/molecules/ApproveButton.js",
    "content": "import React from 'react';\nimport { connect } from 'react-redux';\nimport styled from 'styled-components';\nimport { approveTest, filterTests } from '../../actions';\nimport { colors, fonts } from '../../styles';\n\nconst REMOTE_HOST = 'http://127.0.0.1';\nconst REMOTE_PORT = location.port;\nconst APPROVE_STATUS_TO_LABEL_MAP = Object.freeze({\n  INITIAL: 'Approve',\n  PENDING: 'Pending...',\n  FAILED: 'Approve'\n});\n\nconst Button = styled.button`\n  font-size: 12px;\n  line-height: auto;\n  font-family: ${fonts.latoRegular};\n  background-color: ${colors.borderGray};\n  border: none;\n  height: 32px;\n  border-radius: 3px;\n  color: ${colors.white};\n  padding: 5px 5px;\n\n  &:hover {\n    cursor: pointer;\n    background-color: ${colors.green};\n  }\n\n  &:disabled {\n    background-color: ${colors.bodyColor};\n    color: ${colors.secondaryText};\n    cursor: default;\n  }\n`;\n\n// const ErrorMsg = styled.div`\n//   word-wrap: break-word;\n//   font-family: monospace;\n//   background: rgb(251, 234, 234);\n//   color: brown;\n//   line-height: 32px;\n// `;\n\nclass ApproveButton extends React.Component {\n  constructor (props) {\n    super(props);\n    this.approve = this.approve.bind(this);\n    this.state = {\n      approveStatus: 'INITIAL',\n      errorMsg: null\n    };\n  }\n\n  async approve () {\n    const { fileName } = this.props;\n    const url = `${REMOTE_HOST}:${REMOTE_PORT}/approve?filter=${fileName}`;\n    this.setState({ approveStatus: 'PENDING' });\n\n    try {\n      const response = await fetch(url, {\n        method: 'POST'\n      });\n\n      if (response.ok) {\n        this.setState({ approveStatus: 'INITIAL' });\n        this.props.approveTest(fileName, this.props.filterStatus);\n      } else {\n        const body = await response.json();\n        this.setState({ approveStatus: 'FAILED', errorMsg: body.error });\n      }\n    } catch (err) {\n      this.setState({\n        approveStatus: 'FAILED',\n        errorMsg: `${err.message}. 🧐\nLooks like the \"approve\" operation failed.\nPlease check that backstopRemote is running.\n      `\n      });\n      alert(this.state.errorMsg);\n    }\n  }\n\n  render () {\n    const { approveStatus } = this.state;\n\n    return (\n      <div>\n        <Button onClick={this.approve} disabled={approveStatus === 'APPROVED' || approveStatus === 'PENDING'}>\n          {APPROVE_STATUS_TO_LABEL_MAP[this.state.approveStatus]}\n        </Button>\n      </div>\n    );\n  }\n}\n\nconst mapStateToProps = state => {\n  return {\n    filterStatus: state.tests.filterStatus\n  };\n};\n\nconst mapDispatchToProps = dispatch => {\n  return {\n    approveTest: (id, filterStatus) => {\n      dispatch(approveTest(id));\n      dispatch(filterTests(filterStatus));\n    }\n  };\n};\n\nconst ApproveButtonContainer = connect(\n  mapStateToProps,\n  mapDispatchToProps\n)(ApproveButton);\nexport default ApproveButtonContainer;\n"
  },
  {
    "path": "compare/src/components/molecules/FiltersSwitch.js",
    "content": "import React from 'react';\nimport { connect } from 'react-redux';\nimport styled from 'styled-components';\nimport { filterTests } from '../../actions';\n\nimport ButtonFilter from '../atoms/ButtonFilter';\n\nconst ButtonsWrapper = styled.div`\n  display: flex;\n  flex: 0 0 auto;\n  height: 100%;\n`;\n\nfunction ButtonsFilter (props) {\n  const availableStatus = props.availableStatus;\n\n  const ListButton = availableStatus.map(status => (\n    <ButtonFilter\n      status={status.id}\n      key={status.id}\n      label={status.label}\n      selected={props.filterStatus === status.id}\n      count={status.count}\n      onClick={() => props.onClick(status.id)}\n    />\n  ));\n\n  return (\n    // change this with React16\n    <div style={{ height: '100%' }}>{ListButton}</div>\n  );\n}\n\nclass FiltersSwitch extends React.Component {\n  render () {\n    const tests = this.props.tests;\n    const availableStatus = [\n      {\n        id: 'all',\n        label: 'all',\n        count: tests.all.length\n      },\n      {\n        id: 'pass',\n        label: 'passed',\n        count: tests.all.filter(e => e.status === 'pass').length\n      },\n      {\n        id: 'fail',\n        label: 'failed',\n        count: tests.all.filter(e => e.status === 'fail').length\n      }\n    ];\n\n    return (\n      <ButtonsWrapper>\n        <ButtonsFilter\n          availableStatus={availableStatus}\n          onClick={this.props.onButtonClick}\n          filterStatus={tests.filterStatus}\n        />\n      </ButtonsWrapper>\n    );\n  }\n}\n\nconst mapStateToProps = state => {\n  return {\n    tests: state.tests\n  };\n};\n\nconst mapDispatchToProps = dispatch => {\n  return {\n    onButtonClick: status => {\n      dispatch(filterTests(status));\n    }\n  };\n};\n\nconst FiltersSwitchContainer = connect(mapStateToProps, mapDispatchToProps)(\n  FiltersSwitch\n);\n\nexport default FiltersSwitchContainer;\n"
  },
  {
    "path": "compare/src/components/molecules/ScrubberButton.js",
    "content": "import React from 'react';\nimport { connect } from 'react-redux';\nimport styled from 'styled-components';\nimport { openModal } from '../../actions';\n\n// styles & icons\nimport { colors, fonts } from '../../styles';\n\nconst Wrapper = styled.div`\n  display: block;\n`;\n\nconst ButtonSD = styled.button`\n  position: absolute;\n  top: 15px;\n  right: ${props => (props.onlyText ? '10px' : '115px')};\n  padding: 10px 20px;\n  background-color: ${colors.lightGray};\n  color: ${colors.secondaryText};\n  border-radius: 3px;\n  text-transform: uppercase;\n  font-family: ${fonts.latoRegular};\n  text-align: center;\n  font-size: 12px;\n  border: none;\n\n  &:focus {\n    outline: none;\n  }\n\n  &:hover {\n    cursor: pointer;\n  }\n\n  @media print {\n    display: none;\n  }\n`;\n\nclass ScrubberButton extends React.Component {\n  onClick () {\n    const { openModal } = this.props;\n    openModal(this.props.info);\n  }\n\n  render () {\n    return (\n      <Wrapper>\n        <ButtonSD\n          onClick={this.onClick.bind(this)}\n          onlyText={this.props.onlyText}\n        >\n          SHOW DIFFS\n        </ButtonSD>\n      </Wrapper>\n    );\n  }\n}\n\nconst mapStateToProps = state => {\n  return {\n    scrubber: state.scrubber\n  };\n};\n\nconst mapDispatchToProps = dispatch => {\n  return {\n    openModal: value => {\n      dispatch(openModal(value));\n    }\n  };\n};\n\nconst ScrubberButtonContainer = connect(mapStateToProps, mapDispatchToProps)(\n  ScrubberButton\n);\n\nexport default ScrubberButtonContainer;\n"
  },
  {
    "path": "compare/src/components/molecules/SettingsContainer.js",
    "content": "import React from 'react';\nimport { connect } from 'react-redux';\nimport styled from 'styled-components';\n// import { findTests } from '../../actions'\n\n// atoms\nimport ButtonSettings from '../atoms/ButtonSettings';\n\n// molecules\nimport SettingsPopup from './SettingsPopup';\n\nconst SettingsWrapper = styled.div`\n  flex: 0 0 auto;\n  height: 100%;\n`;\n\nclass SettingsPanel extends React.Component {\n  constructor (props) {\n    super(props);\n\n    this.state = {\n      popup: false\n    };\n  }\n\n  onButtonClick () {\n    this.setState({\n      popup: !this.state.popup\n    });\n  }\n\n  render () {\n    const popupVisible = this.state.popup;\n\n    return (\n      <SettingsWrapper>\n        <ButtonSettings\n          onClick={this.onButtonClick.bind(this)}\n          active={this.state.popup}\n        />\n        {popupVisible && <SettingsPopup />}\n      </SettingsWrapper>\n    );\n  }\n}\n\nconst mapStateToProps = state => {\n  return {};\n};\n\nconst mapDispatchToProps = dispatch => {\n  return {\n    // onChange: value => {\n    //   dispatch(findTests(value))\n    // }\n  };\n};\n\nconst SettingsContainer = connect(mapStateToProps, mapDispatchToProps)(\n  SettingsPanel\n);\n\nexport default SettingsContainer;\n"
  },
  {
    "path": "compare/src/components/molecules/SettingsPopup.js",
    "content": "import React from 'react';\nimport { connect } from 'react-redux';\nimport styled from 'styled-components';\nimport { updateSettings, toggleAllImages } from '../../actions';\n\nimport { colors, shadows } from '../../styles';\n\nimport SettingOption from '../atoms/SettingOption';\n\nconst PopupWrapper = styled.div`\n  display: block;\n  position: absolute;\n  width: auto;\n  min-height: 100px;\n  background-color: ${colors.lightGray};\n  box-shadow: ${shadows.shadow01};\n  right: 38px;\n  margin-top: 20px;\n  border-radius: 3px;\n  padding: 10px 25px;\n  z-index: 10;\n\n  /* @TODO: shadow on arrow */\n  &:before {\n    content: '';\n    display: block;\n    width: 0;\n    height: 0;\n    position: absolute;\n\n    border-top: 8px solid transparent;\n    border-bottom: 8px solid ${colors.lightGray};\n    border-right: 8px solid transparent;\n    border-left: 8px solid transparent;\n    right: 30px;\n    top: -16px;\n  }\n`;\n\nclass SettingsPopup extends React.Component {\n  constructor (props) {\n    super(props);\n\n    this.state = {\n      hideAll: false\n    };\n  }\n\n  toggleAll (val) {\n    this.setState({\n      hideAll: !val\n    });\n\n    this.props.toggleAll(val);\n  }\n\n  onToggle (id, val) {\n    if (!val) {\n      this.setState({\n        hideAll: false\n      });\n    }\n\n    this.props.onToggle(id);\n  }\n\n  render () {\n    const { settings } = this.props;\n\n    return (\n      <PopupWrapper>\n        <SettingOption\n          id=\"textInfo\"\n          label=\"Text info\"\n          value={settings.textInfo}\n          onToggle={this.onToggle.bind(this, 'textInfo')}\n        />\n        <SettingOption\n          id=\"hideAll\"\n          label=\"Hide all images\"\n          value={this.state.hideAll}\n          onToggle={this.toggleAll.bind(this)}\n        />\n        <SettingOption\n          id=\"refImage\"\n          label=\"Reference image\"\n          value={settings.refImage}\n          onToggle={this.onToggle.bind(this, 'refImage')}\n        />\n        <SettingOption\n          id=\"testImage\"\n          label=\"Test image\"\n          value={settings.testImage}\n          onToggle={this.onToggle.bind(this, 'testImage')}\n        />\n        <SettingOption\n          id=\"diffImage\"\n          label=\"Diff image\"\n          value={settings.diffImage}\n          onToggle={this.onToggle.bind(this, 'diffImage')}\n        />\n      </PopupWrapper>\n    );\n  }\n}\n\nconst mapStateToProps = state => {\n  return {\n    settings: state.layoutSettings\n  };\n};\n\nconst mapDispatchToProps = dispatch => {\n  return {\n    onToggle: id => {\n      dispatch(updateSettings(id));\n    },\n    toggleAll: value => {\n      dispatch(toggleAllImages(value));\n    }\n  };\n};\n\nconst PopupContainer = connect(mapStateToProps, mapDispatchToProps)(\n  SettingsPopup\n);\n\nexport default PopupContainer;\n"
  },
  {
    "path": "compare/src/components/molecules/TestImages.js",
    "content": "import React from 'react';\nimport styled from 'styled-components';\nimport { connect } from 'react-redux';\nimport { openModal } from '../../actions';\n\n// atoms\nimport ImagePreview from '../atoms/ImagePreview';\n\nconst ImagesWrapper = styled.div`\n  position: relative;\n  display: flex;\n`;\n\nclass TestImages extends React.Component {\n  constructor (props) {\n    super(props);\n\n    this.state = {\n      images: []\n    };\n  }\n\n  onImageClick (img) {\n    const { openModal } = this.props;\n    this.props.info.targetImg = img;\n    openModal(this.props.info);\n  }\n\n  render () {\n    const { reference, test } = this.props.info;\n    const { status, settings } = this.props;\n\n    this.state.images = [\n      {\n        id: 'refImage',\n        label: 'Reference',\n        src: reference,\n        visible: settings.refImage\n      },\n      {\n        id: 'testImage',\n        label: 'Test',\n        src: test,\n        visible: settings.testImage\n      }\n    ];\n\n    if (status !== 'pass') {\n      this.state.images.push({\n        id: 'diffImage',\n        label: 'Diff',\n        src: this.props.info.diffImage,\n        visible: settings.diffImage\n      });\n    }\n\n    return (\n      <ImagesWrapper>\n        {this.state.images.map((img, i) => (\n          <ImagePreview\n            src={img.src}\n            id={img.id}\n            label={img.label}\n            onClick={this.onImageClick.bind(this, img)}\n            key={i}\n            hidden={!img.visible}\n          />\n        ))}\n      </ImagesWrapper>\n    );\n  }\n}\n\nconst mapStateToProps = state => {\n  return {\n    settings: state.layoutSettings\n  };\n};\n\nconst mapDispatchToProps = dispatch => {\n  return {\n    openModal: value => {\n      dispatch(openModal(value));\n    }\n  };\n};\n\nconst TestImagesContainer = connect(mapStateToProps, mapDispatchToProps)(\n  TestImages\n);\n\nexport default TestImagesContainer;\n"
  },
  {
    "path": "compare/src/components/molecules/TextSearch.js",
    "content": "import React from 'react';\nimport { connect } from 'react-redux';\nimport styled from 'styled-components';\nimport { findTests, filterTests } from '../../actions';\n\nimport InputTextSearch from '../atoms/InputTextSearch';\n\nconst InputWrapper = styled.div`\n  flex: 1 1 auto;\n  height: 100%;\n`;\n\nclass TextSearch extends React.Component {\n  onChange (event) {\n    const value = event.target.value;\n\n    if (value.length > 0) {\n      this.props.findTest(value);\n    } else {\n      this.props.filterTests(this.props.tests.filterStatus);\n    }\n  }\n\n  render () {\n    return (\n      <InputWrapper>\n        <InputTextSearch onChange={this.onChange.bind(this)} />\n      </InputWrapper>\n    );\n  }\n}\n\nconst mapStateToProps = state => {\n  return {\n    tests: state.tests\n  };\n};\n\nconst mapDispatchToProps = dispatch => {\n  return {\n    findTest: value => {\n      dispatch(findTests(value));\n    },\n    filterTests: status => {\n      dispatch(filterTests(status));\n    }\n  };\n};\n\nconst TextSearchContainer = connect(mapStateToProps, mapDispatchToProps)(\n  TextSearch\n);\n\nexport default TextSearchContainer;\n"
  },
  {
    "path": "compare/src/components/organisms/TestCard.js",
    "content": "import React from 'react';\nimport styled from 'styled-components';\n\nimport { colors, shadows } from '../../styles';\n\n// atoms\nimport ErrorMessages from '../atoms/ErrorMessages';\nimport TextDetails from '../atoms/TextDetails';\nimport NavButtons from '../atoms/NavButtons';\n\n// molecules\nimport TestImages from '../molecules/TestImages';\nimport ApproveButton from '../molecules/ApproveButton';\n\nconst CardWrapper = styled.div`\n  position: relative;\n  margin: 5px auto;\n  padding: 10px 30px;\n  background-color: ${colors.cardWhite};\n  box-shadow: ${shadows.shadow01};\n  min-height: 40px;\n  break-inside: avoid;\n\n  &:before {\n    content: '';\n    display: block;\n    width: 8px;\n    height: 100%;\n    background-color: ${props => props.status === 'pass' ? colors.green : colors.red};\n    position: absolute;\n    top: 0;\n    left: 0;\n  }\n  @media print {\n    box-shadow: none;\n  }\n`;\n\nconst ButtonsWrapper = styled.div`\n  position: absolute;\n  right: 10px;\n  display: flex;\n`;\n\n// only show the diverged option if remote option is found\nfunction isRemoteOption () {\n  return /remote/.test(location.search);\n}\n\nexport default class TestCard extends React.Component {\n  render () {\n    const { pair: info, status } = this.props.test;\n    const onlyText = this.props.onlyText;\n\n    return (\n      <CardWrapper id={this.props.id} status={status}>\n        <ButtonsWrapper>\n          {status === 'fail' && isRemoteOption() && <ApproveButton fileName={info.fileName}/>}\n          {!onlyText && (\n            <NavButtons currentId={this.props.numId} lastId={this.props.lastId} />\n          )}\n        </ButtonsWrapper>\n        <TextDetails info={info} />\n        <TestImages info={info} status={status} />\n        <ErrorMessages info={info} status={status} />\n      </CardWrapper>\n    );\n  }\n}\n"
  },
  {
    "path": "compare/src/components/organisms/Toolbar.js",
    "content": "import React from 'react';\nimport styled from 'styled-components';\n\nimport FiltersSwitchContainer from '../molecules/FiltersSwitch';\nimport TextSearchContainer from '../molecules/TextSearch';\nimport SettingsContainer from '../molecules/SettingsContainer';\n\nimport { colors } from '../../styles';\n\nconst ToolbarWrapper = styled.section`\n  width: 100%;\n  padding: 10px 30px;\n  background: ${colors.bodyColor};\n  height: 70px;\n  display: flex;\n  box-sizing: border-box;\n\n  @media print {\n    display: none;\n  }\n`;\n\nexport default class Toolbar extends React.Component {\n  render () {\n    return (\n      <ToolbarWrapper style={this.props.style}>\n        <FiltersSwitchContainer />\n        <TextSearchContainer />\n        <SettingsContainer />\n      </ToolbarWrapper>\n    );\n  }\n}\n"
  },
  {
    "path": "compare/src/components/organisms/Topbar.js",
    "content": "import React from 'react';\nimport styled from 'styled-components';\n\nimport { colors } from '../../styles';\n\nimport SuiteNameContainer from '../atoms/SuiteName';\nimport IdContainer from '../atoms/IdContainer';\nimport Logo from '../atoms/Logo';\n\nconst TopbarWrapper = styled.section`\n  width: 100%;\n  margin: 0 auto;\n  display: flex;\n  padding: 0 30px;\n  align-items: center;\n  box-sizing: border-box;\n  flex-wrap: wrap;\n`;\n\nconst Separator = styled.div`\n  width: 100%;\n  height: 3px;\n  background: ${colors.borderGray};\n  flex-basis: 100%;\n  margin: 10px 0;\n`;\n\nexport default class Topbar extends React.Component {\n  render () {\n    return (\n      <TopbarWrapper>\n        <SuiteNameContainer />\n        <IdContainer />\n        <Logo />\n        <Separator />\n      </TopbarWrapper>\n    );\n  }\n}\n"
  },
  {
    "path": "compare/src/index.js",
    "content": "import React from 'react';\nimport ReactDOM from 'react-dom';\nimport { Provider } from 'react-redux';\nimport store from './store.js';\n\nimport App from './components/App';\n\nReactDOM.render(\n  <Provider store={store}>\n    <App />\n  </Provider>,\n  document.getElementById('root')\n);\n"
  },
  {
    "path": "compare/src/reducers/index.js",
    "content": "import { combineReducers } from 'redux';\nimport tests from './tests';\nimport suiteInfo from './suiteInfo';\nimport layoutSettings from './layoutSettings';\nimport scrubber from './scrubber';\nimport logs from './logs';\n\nconst rootReducer = combineReducers({\n  suiteInfo,\n  tests,\n  scrubber,\n  logs,\n  layoutSettings\n});\n\nexport default rootReducer;\n"
  },
  {
    "path": "compare/src/reducers/layoutSettings.js",
    "content": "const visibilityFilter = (state = {}, action) => {\n  switch (action.type) {\n    case 'UPDATE_SETTINGS':\n      return Object.assign({}, state, {\n        [action.id]: !state[action.id]\n      });\n\n    case 'TOGGLE_ALL_IMAGES':\n      return Object.assign({}, state, {\n        refImage: action.value,\n        testImage: action.value,\n        diffImage: action.value\n      });\n\n    default:\n      return state;\n  }\n};\n\nexport default visibilityFilter;\n"
  },
  {
    "path": "compare/src/reducers/logs.js",
    "content": "const logs = (state = {}, action) => {\n  switch (action.type) {\n    case 'OPEN_LOG_MODAL':\n      return Object.assign({}, state, {\n        visible: true,\n        logs: action.value\n      });\n\n    case 'CLOSE_LOG_MODAL':\n      return Object.assign({}, state, {\n        visible: false\n      });\n    default:\n      return state;\n  }\n};\n\nexport default logs;\n"
  },
  {
    "path": "compare/src/reducers/scrubber.js",
    "content": "function getPosFromImgId (imgId) {\n  switch (imgId) {\n    case 'refImage':\n      return 100; // just passed the right border\n    case 'testImage':\n      return 0; // just passed the left border\n    case 'diffImage':\n      return 0; // just passed the left border\n    default:\n      return 50; // in the middle\n  }\n}\n\nfunction getModeFromImgId (imgId) {\n  switch (imgId) {\n    case 'refImage':\n      return 'SHOW_SCRUBBER_REF_IMAGE';\n    case 'testImage':\n      return 'SHOW_SCRUBBER_TEST_IMAGE';\n    case 'diffImage':\n      return 'SHOW_SCRUBBER_DIFF_IMAGE';\n    default:\n      return 'SCRUB';\n  }\n}\n\nconst scrubber = (state = {}, action) => {\n  let targetImgId = '';\n  switch (action.type) {\n    case 'OPEN_SCRUBBER_MODAL':\n      try {\n        targetImgId = action.value.targetImg.id;\n      } catch (err) {}\n\n      return Object.assign({}, state, {\n        position: getPosFromImgId(targetImgId),\n        visible: true,\n        test: action.value,\n        testImageType: targetImgId,\n        scrubberModalMode: getModeFromImgId(targetImgId)\n      });\n\n    case 'CLOSE_SCRUBBER_MODAL':\n      return Object.assign({}, state, {\n        visible: false,\n        test: {}\n      });\n\n    case 'SHOW_SCRUBBER_TEST_IMAGE':\n      return Object.assign({}, state, {\n        position: getPosFromImgId('testImage'),\n        scrubberModalMode: action.type,\n        testImageType: 'testImage'\n      });\n\n    case 'SHOW_SCRUBBER_REF_IMAGE':\n      return Object.assign({}, state, {\n        position: getPosFromImgId('refImage'),\n        scrubberModalMode: action.type\n      });\n\n    case 'SHOW_SCRUBBER_DIFF_IMAGE':\n      return Object.assign({}, state, {\n        position: getPosFromImgId('diffImage'),\n        scrubberModalMode: action.type,\n        testImageType: 'diffImage'\n      });\n\n    case 'SHOW_SCRUBBER_DIVERGED_IMAGE':\n      return Object.assign({}, state, {\n        position: getPosFromImgId('diffImage'),\n        scrubberModalMode: action.type,\n        testImageType: 'divergedImage',\n        test: Object.assign({}, state.test, { divergedImage: action.value })\n      });\n\n    case 'SHOW_SCRUBBER':\n      return Object.assign({}, state, {\n        position: getPosFromImgId(),\n        scrubberModalMode: 'SCRUB',\n        testImageType: 'testImage'\n      });\n\n    default:\n      return state;\n  }\n};\n\nexport default scrubber;\n"
  },
  {
    "path": "compare/src/reducers/suiteInfo.js",
    "content": "const suiteInfo = (state = {}, action) => {\n  switch (action.type) {\n    case 'SET_VISIBILITY_FILTER':\n      return action.filter;\n    default:\n      return state;\n  }\n};\n\nexport default suiteInfo;\n"
  },
  {
    "path": "compare/src/reducers/tests.js",
    "content": "const tests = (state = {}, action) => {\n  switch (action.type) {\n    case 'APPROVE_TEST':\n      return Object.assign({}, state, {\n        all: state.all.map(test => {\n          if (test.pair && (test.pair.fileName === action.id)) {\n            return Object.assign({}, test, { status: 'pass' });\n          }\n          return test;\n        })\n      });\n    case 'FILTER_TESTS':\n      if (action.status !== 'all') {\n        return Object.assign({}, state, {\n          filtered: state.all.filter(e => e.status === action.status),\n          filterStatus: action.status\n        });\n      } else {\n        return Object.assign({}, state, {\n          filtered: state.all,\n          filterStatus: action.status\n        });\n      }\n\n    // @TODO: to optimize\n    case 'SEARCH_TESTS':\n      if (action.value.length > 0) {\n        return Object.assign({}, state, {\n          filtered: state.all.filter(e => {\n            const fileName = e.pair.fileName.toLowerCase();\n            const label = e.pair.label.toLowerCase();\n\n            if (state.filterStatus !== 'all') {\n              if (\n                e.status === state.filterStatus &&\n                (label.indexOf(action.value.toLowerCase()) !== -1 ||\n                  fileName.indexOf(action.value.toLowerCase()) !== -1)\n              ) {\n                return true;\n              }\n            } else {\n              if (\n                label.indexOf(action.value.toLowerCase()) !== -1 ||\n                fileName.indexOf(action.value.toLowerCase()) !== -1\n              ) {\n                return true;\n              }\n            }\n            return false;\n          })\n        });\n      }\n      return state;\n\n    default:\n      return state;\n  }\n};\n\nexport default tests;\n"
  },
  {
    "path": "compare/src/store.js",
    "content": "import { createStore } from 'redux';\nimport rootReducer from './reducers';\n\n/**\n * Parses a JSON string from local storage and handles any errors.\n *\n * This function attempts to parse a JSON string provided in `localStorageItem`.\n * If the parsing fails (typically due to corrupt or invalid JSON data),\n * it logs the error, warns the user, and removes the corrupted item from\n * local storage. If parsing is successful, it returns the parsed object.\n * In the case of an error, it returns `false`.\n *\n * @param {string} localStorageItem - The JSON string to parse, typically retrieved from local storage.\n * @returns {object|boolean} The parsed JSON object, or `false` if settings aren't set or parsing fails.\n */\nfunction parseLocalStorage (localStorageItem) {\n  let data;\n  try {\n    data = JSON.parse(localStorageItem);\n  } catch (error) {\n    console.error(error);\n    console.warn('BackstopJS LocalStorage settings appear to be corrupted. Let me fix that for you.');\n    localStorage.removeItem('backstopjs');\n    data = false;\n  }\n  return data;\n}\n\n/**\n * Retrieves the state from local storage, if available.\n * @returns {object|boolean} The persisted state object or false if not available.\n */\nconst localState = localStorage.getItem('backstopjs');\nconst persistedState = localState\n  ? parseLocalStorage(localState)\n  : false;\n\n/**\n * Default state for the Redux store.\n */\nconst defaultState = {\n  suiteInfo: {\n    testSuiteName: window.tests.testSuite,\n    idConfig: window.tests.id\n  },\n  tests: {\n    all: window.tests.tests,\n    filtered: window.tests.tests,\n    filterStatus: 'all'\n  },\n  scrubber: {\n    visible: false,\n    mode: 'scrub',\n    test: {}\n  },\n  layoutSettings: {\n    textInfo: false,\n    refImage: true,\n    testImage: true,\n    diffImage: true\n  }\n};\n\n/**\n * Merges persisted state with default state if available, otherwise uses default state.\n */\nconst state = persistedState\n  ? {\n      ...defaultState,\n      ...persistedState\n    }\n  : defaultState;\n\n/**\n * Creates the Redux store with root reducer, initial state, and devtools extension.\n * TODO: Consider using Redux Toolkit for more efficient and modern state management.\n */\nconst store = createStore(\n  rootReducer,\n  state,\n  window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()\n);\n\n/**\n * Subscribes to store changes to persist layout settings in local storage.\n */\nstore.subscribe(function () {\n  const layoutSettings = store.getState().layoutSettings;\n  const localStateItems = JSON.stringify({\n    layoutSettings\n  });\n  localStorage.setItem('backstopjs', localStateItems);\n});\n\nexport default store;\n"
  },
  {
    "path": "compare/src/styles/index.js",
    "content": "export const colors = {\n  primaryText: '#4A4A4A',\n  bodyColor: '#E2E7EA',\n  secondaryText: '#787878',\n  borderGray: '#D1D9DD',\n  green: '#8BC34A',\n  red: '#F44336',\n  white: '#FFFFFF',\n  cardWhite: '#FAFAFA',\n  lightGray: '#EEEEEE',\n  medGray: '#999999'\n};\n\nexport const fonts = {\n  latoRegular: 'latoregular',\n  latoBold: 'latobold',\n  arial: 'Arial'\n};\n\nexport const shadows = {\n  shadow01: '0 3px 6px 0 rgba(0,0,0,0.16)',\n  shadow02:\n    '0 4px 5px 0 rgba(0,0,0,0.14), 0 1px 10px 0 rgba(0,0,0,0.12), 0 2px 4px -1px rgba(0,0,0,0.3)'\n};\n"
  },
  {
    "path": "compare/webpack.config.js",
    "content": "const path = require('path');\n\nmodule.exports = {\n  mode: 'production',\n  entry: path.join(__dirname, 'src', 'index.js'),\n  devServer: {\n    static: [\n      {\n        directory: path.resolve(__dirname, 'output'),\n        serveIndex: true\n      }, {\n        directory: path.join(__dirname, '../test/configs/backstop_data/html_report'),\n        publicPath: '/'\n      }, {\n        directory: path.join(__dirname, '../test/configs/backstop_data'),\n        publicPath: '/'\n      }\n    ],\n    client: {\n      overlay: {\n        errors: true,\n        warnings: false,\n        runtimeErrors: true\n      }\n    },\n    webSocketServer: false\n  },\n  output: {\n    path: path.resolve(__dirname, 'output'),\n    filename: 'index_bundle.js'\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.?js$/,\n        exclude: /node_modules/,\n        use: {\n          loader: 'babel-loader',\n          options: {\n            presets: ['@babel/preset-env', '@babel/preset-react']\n          }\n        }\n      },\n      {\n        test: /\\.(png|jpg|gif)$/i,\n        type: 'asset/inline'\n      }\n    ]\n  }\n};\n"
  },
  {
    "path": "core/command/approve.js",
    "content": "const fs = require('../util/fs');\nconst path = require('path');\nconst map = require('p-map');\n\nconst FAILED_DIFF_RE = /^failed_diff_/;\nconst FILTER_DEFAULT = /\\w+/;\n\n// This task will copy ALL test bitmap files (from the most recent test directory) to the reference directory overwriting any existing files.\nmodule.exports = {\n  execute: function (config) {\n    // TODO:  IF Exists config.bitmaps_test  &&  list.length > 0n  (otherwise throw)\n    console.log('Copying from ' + config.bitmaps_test + ' to ' + config.bitmaps_reference + '.');\n    return new Promise((resolve, reject) => {\n      fs.readdir(config.bitmaps_test, (err, list) => {\n        if (err) {\n          console.log(err.stack);\n          reject(err);\n        }\n        const src = path.join(config.bitmaps_test, list[list.length - 1]);\n        return fs.readdir(src, (err, files) => {\n          if (err) {\n            console.log(err.stack);\n            reject(err);\n          }\n          console.log('The following files will be promoted to reference...');\n\n          return map(files, (file) => {\n            if (FAILED_DIFF_RE.test(file)) {\n              file = file.replace(FAILED_DIFF_RE, '');\n\n              let imageFilter = FILTER_DEFAULT;\n              if (config.args && config.args.filter) {\n                imageFilter = new RegExp(config.args.filter);\n              }\n              if (imageFilter.test(file)) {\n                console.log('> ', file);\n                return fs.copy(path.join(src, file), path.join(config.bitmaps_reference, file));\n              }\n            }\n            return true;\n          }).then(resolve).catch(reject);\n        });\n      });\n    });\n  }\n};\n"
  },
  {
    "path": "core/command/index.js",
    "content": "const path = require('path');\nconst _ = require('lodash');\nconst logger = require('../util/logger')('COMMAND');\n\n/*\n * Each file included in this folder (except `index.js`) is a command and must export the following object\n * {\n *   execute: (...args) => void  | command itself\n * }\n *\n * The execute function should not have much logic\n */\n\n/* Each and every command defined, including commands used in before/after */\nconst commandNames = [\n  'init',\n  'remote',\n  'openReport',\n  'reference',\n  'report',\n  'test',\n  'approve',\n  'version',\n  'stop'\n];\n\n/* Commands that are only exposed to higher levels */\nconst exposedCommandNames = [\n  'init',\n  'remote',\n  'reference',\n  'test',\n  'openReport',\n  'approve',\n  'version',\n  'stop'\n];\n\n/* Used to convert an array of objects {name, execute} to a unique object {[name]: execute} */\nfunction toObjectReducer (object, command) {\n  object[command.name] = command.execute;\n  return object;\n}\n\nconst commands = commandNames\n  .map(function requireCommand (commandName) {\n    return {\n      name: commandName,\n      commandDefinition: require(path.join(__dirname, commandName))\n    };\n  })\n  .map(function definitionToExecution (command) {\n    return {\n      name: command.name,\n      execute: function execute (config) {\n        config.perf[command.name] = { started: new Date() };\n        logger.info('Executing core for \"' + command.name + '\"');\n\n        let promise = command.commandDefinition.execute(config);\n\n        // If the command didn't return a promise, assume it resolved already\n        if (!promise) {\n          logger.error('Resolved already:' + command.name);\n          promise = Promise.resolve();\n        }\n\n        // Do the catch separately or the main runner\n        // won't be able to catch it a second time\n        promise.catch(function (error) {\n          const perf = (new Date() - config.perf[command.name].started) / 1000;\n          logger.error('Command \"' + command.name + '\" ended with an error after [' + perf + 's]');\n          logger.error(error);\n        });\n\n        return promise.then(function (result) {\n          if (/openReport/.test(command.name)) {\n            return;\n          }\n          const perf = (new Date() - config.perf[command.name].started) / 1000;\n          logger.success('Command \"' + command.name + '\" successfully executed in [' + perf + 's]');\n          return result;\n        });\n      }\n    };\n  })\n  .reduce(toObjectReducer, {});\n\nconst exposedCommands = exposedCommandNames\n  .filter(function commandIsDefined (commandName) {\n    return _.has(commands, commandName);\n  })\n  .map(function (commandName) {\n    return {\n      name: commandName,\n      execute: commands[commandName]\n    };\n  })\n  .reduce(toObjectReducer, {});\n\nfunction execute (commandName, config) {\n  if (!_.has(exposedCommands, commandName)) {\n    if (commandName.charAt(0) === '_' && _.has(commands, commandName.substring(1))) {\n      commandName = commandName.substring(1);\n    } else {\n      throw new Error('The command \"' + commandName + '\" is not exposed publicly.');\n    }\n  }\n\n  return commands[commandName](config);\n}\n\nmodule.exports = execute;\n"
  },
  {
    "path": "core/command/init.js",
    "content": "const fs = require('../util/fs');\nconst logger = require('../util/logger')('init');\n\n/**\n * Copies a boilerplate config file to the current config file location.\n */\nmodule.exports = {\n  execute: function init (config) {\n    const promises = [];\n    if (config.engine_scripts) {\n      logger.log(\"Copying '\" + config.engine_scripts_default + \"' to '\" + config.engine_scripts + \"'\");\n      promises.push(fs.copy(config.engine_scripts_default, config.engine_scripts));\n    } else {\n      logger.error('ERROR: Can\\'t generate a scripts directory. No \\'engine_scripts\\' path property was found in backstop.json.');\n    }\n\n    // Copies a boilerplate config file to the current config file location.\n    promises.push(fs.copy(config.captureConfigFileNameDefault, config.backstopConfigFileName).then(function () {\n      logger.log(\"Configuration file written at '\" + config.backstopConfigFileName + \"'\");\n    }, function (err) {\n      throw err;\n    }));\n\n    return Promise.all(promises);\n  }\n};\n"
  },
  {
    "path": "core/command/openReport.js",
    "content": "const open = require('opn');\nconst logger = require('../util/logger')('openReport');\nconst path = require('path');\nconst http = require('http');\nconst getRemotePort = require('../util/getRemotePort');\nconst BACKSTOP_REPORT_SIGNATURE_RE = /BackstopJS Report/i;\n\nmodule.exports = {\n  execute: function (config) {\n    const port = getRemotePort();\n    const remoteReportUrl = `http://127.0.0.1:${port}/${config.compareReportURL}?remote`;\n    return new Promise(function (resolve, reject) {\n      // would prefer to ping a http://127.0.0.1:${port}/remote with {backstopRemote:ok} response\n      logger.log('Attempting to ping ', remoteReportUrl);\n      http.get(remoteReportUrl, (resp) => {\n        let data = '';\n        resp.on('data', (chunk) => { data += chunk; });\n        resp.on('end', () => {\n          if (BACKSTOP_REPORT_SIGNATURE_RE.test(data)) {\n            logger.log('Remote found. Opening ' + remoteReportUrl);\n            resolve(open(remoteReportUrl, { wait: false }));\n          } else {\n            logger.log('Remote not detected. Opening ' + config.compareReportURL);\n            resolve(open(config.compareReportURL, { wait: false }));\n          }\n        });\n      }).on('error', (err) => {\n        logger.log('Remote not found. Opening ' + config.compareReportURL, 'Error: ' + err.message);\n        resolve(open(path.resolve(config.compareReportURL), { wait: false }));\n      });\n    });\n  }\n};\n"
  },
  {
    "path": "core/command/reference.js",
    "content": "const createBitmaps = require('../util/createBitmaps');\nconst fs = require('../util/fs');\nconst logger = require('../util/logger')('clean');\nconst { shouldRunDocker, runDocker } = require('../util/runDocker');\nconst engineErrors = require('../util/engineErrors');\n\nmodule.exports = {\n  execute: function (config) {\n    if (shouldRunDocker(config)) {\n      return runDocker(config, 'reference');\n    } else {\n      let firstStep;\n      // do not remove reference directory if we are in incremental mode\n      if (config.args.filter || config.args.i) {\n        firstStep = Promise.resolve();\n      } else {\n        firstStep = fs.remove(config.bitmaps_reference).then(function () {\n          logger.success(config.bitmaps_reference + ' was cleaned.');\n        });\n      }\n\n      return firstStep.then(function () {\n        return createBitmaps(config, true);\n      }).then(function () {\n        console.log('\\nRun `$ backstop test` to generate diff report.\\n');\n        return engineErrors(config);\n      });\n    }\n  }\n};\n"
  },
  {
    "path": "core/command/remote.js",
    "content": "const logger = require('../util/logger')('remote');\nconst path = require('path');\nconst { exec } = require('child_process');\nconst getRemotePort = require('../util/getRemotePort');\nconst ssws = require.resolve('super-simple-web-server');\n\nmodule.exports = {\n  execute: function (config) {\n    const MIDDLEWARE_PATH = path.resolve(config.backstop, 'remote');\n    const projectPath = path.resolve(config.projectPath);\n\n    return new Promise(function (resolve, reject) {\n      const port = getRemotePort();\n      const commandStr = `node ${ssws} ${projectPath} ${MIDDLEWARE_PATH} --config=${config.backstopConfigFileName}`;\n      const env = { SSWS_HTTP_PORT: port };\n\n      logger.log(`Starting remote with: ${commandStr} with env ${JSON.stringify(env)}`);\n\n      const child = exec(commandStr, { env: { ...env, PATH: process.env.PATH } }, (error) => {\n        if (error) {\n          logger.log('Error running backstop remote:', error);\n        }\n      });\n\n      child.stdout.on('data', logger.log);\n\n      child.stdout.on('close', data => {\n        logger.log('Backstop remote connection closed.', data);\n        resolve(data);\n      });\n    });\n  }\n};\n"
  },
  {
    "path": "core/command/report.js",
    "content": "const path = require('path');\nconst chalk = require('chalk');\nconst _ = require('lodash');\nconst cloneDeep = require('lodash/cloneDeep');\n\nconst allSettled = require('../util/allSettled');\nconst fs = require('../util/fs');\nconst logger = require('../util/logger')('report');\nconst compare = require('../util/compare/');\n\nfunction replaceInFile (file, search, replace) {\n  return new Promise((resolve, reject) => {\n    fs.readFile(file, 'utf8', function (err, data) {\n      if (err) {\n        reject(err);\n      }\n      const result = data.replace(search, replace);\n\n      fs.writeFile(file, result, 'utf8', function (err) {\n        if (err) reject(err);\n      }).then(() => {\n        resolve();\n      });\n    });\n  });\n}\n\nfunction writeReport (config, reporter) {\n  const promises = [];\n\n  if (config.report && config.report.indexOf('CI') > -1 && config.ciReport.format === 'junit') {\n    promises.push(writeJunitReport(config, reporter));\n  }\n\n  if (config.report && config.report.indexOf('json') > -1) {\n    promises.push(writeJsonReport(config, reporter));\n  }\n\n  promises.push(writeBrowserReport(config, reporter));\n\n  return allSettled(promises);\n}\n\nfunction archiveReport (config) {\n  let archivePath = path.join(config.archivePath, config.screenshotDateTime);\n\n  function toAbsolute (p) {\n    return (path.isAbsolute(p)) ? p : path.join(config.projectPath, p);\n  }\n\n  archivePath = toAbsolute(archivePath);\n\n  return fs.copy(toAbsolute(config.html_report), archivePath).then(function () {\n    const file = path.join(archivePath, path.basename(config.compareConfigFileName));\n    // replace the \"..\\\\\" with \"..\\\\..\\\\\" in the config.js files\n    // on windows double escape in order to work properly\n    const search = path.sep.replace(/\\\\/g, '\\\\\\\\\\\\\\\\');\n    const replace = path.sep.replace(/\\\\/g, '\\\\\\\\');\n    return replaceInFile(file, new RegExp(`\"..${search}`, 'g'), `\"..${replace}..${replace}`);\n  });\n}\n\nfunction writeBrowserReport (config, reporter) {\n  const testConfig = (typeof config.args.config === 'object')\n    ? config.args.config\n    : Object.assign({}, require(config.backstopConfigFileName));\n\n  let browserReporter = cloneDeep(reporter);\n\n  function toAbsolute (p) {\n    return (path.isAbsolute(p)) ? p : path.join(config.projectPath, p);\n  }\n\n  logger.log('Writing browser report');\n\n  return fs.copy(config.comparePath, toAbsolute(config.html_report)).then(function () {\n    // Slurp in logs\n    const promises = [];\n    if (config.scenarioLogsInReports) {\n      _.forEach(browserReporter.tests, test => {\n        const pair = test.pair;\n        const referenceLog = toAbsolute(pair.referenceLog);\n        const testLog = toAbsolute(pair.testLog);\n\n        const report = toAbsolute(config.html_report);\n        pair.referenceLog = path.relative(report, referenceLog);\n        pair.testLog = path.relative(report, testLog);\n\n        const referencePromise = fs.readFile(referenceLog).catch(function (e) {\n          logger.log(`Ignoring error reading reference log: ${referenceLog}`);\n          delete pair.referenceLog;\n          // remove non-existing log paths\n        });\n        const testPromise = fs.readFile(testLog).catch(function (e) {\n          logger.log(`Ignoring error reading test log: ${testLog}`);\n          delete pair.testLog;\n          // remove non-existing log paths\n        });\n        promises.push(referencePromise, testPromise);\n      });\n      return Promise.all(promises);\n    } else {\n      // don't pass log paths to client\n      _.forEach(browserReporter.tests, test => {\n        const pair = test.pair;\n        delete pair.referenceLog;\n        delete pair.testLog;\n      });\n      return Promise.resolve(true);\n    }\n  }).then(function () {\n    logger.log('Resources copied');\n\n    // Fixing URLs in the configuration\n    _.forEach(browserReporter.tests, test => {\n      const report = toAbsolute(config.html_report);\n      const pair = test.pair;\n      pair.reference = path.relative(report, toAbsolute(pair.reference));\n      pair.test = path.relative(report, toAbsolute(pair.test));\n\n      if (pair.diffImage) {\n        pair.diffImage = path.relative(report, toAbsolute(pair.diffImage));\n      }\n    });\n\n    const reportConfigFilename = toAbsolute(config.compareConfigFileName);\n    const testReportJsonName = toAbsolute(config.bitmaps_test + '/' + config.screenshotDateTime + '/report.json');\n\n    // If this is a dynamic test then we assume browserReporter has one scenario with one or more viewport variants.\n    // This scenario with all viewport variants will be appended to any existing report.\n    if (testConfig.dynamicTestId) {\n      try {\n        console.log('Attempting to open: ', testReportJsonName);\n        const testReportJson = require(testReportJsonName);\n        const scenarioFileNames = browserReporter.tests.map(test => test.pair.fileName);\n        testReportJson.tests = testReportJson.tests.filter(test => !scenarioFileNames.includes(test.pair.fileName));\n        browserReporter.tests.map(test => testReportJson.tests.push(test));\n        browserReporter = testReportJson;\n      } catch (err) {\n        console.log('Creating new report.');\n      }\n    }\n\n    const jsonReport = JSON.stringify(browserReporter, null, 2);\n    const jsonpReport = `report(${jsonReport});`;\n\n    const jsonConfigWrite = fs.writeFile(testReportJsonName, jsonReport).then(function () {\n      logger.log('Copied json report to: ' + testReportJsonName);\n    }, function (err) {\n      logger.error('Failed json report copy to: ' + testReportJsonName);\n      throw err;\n    });\n\n    const jsonpConfigWrite = fs.writeFile(toAbsolute(reportConfigFilename), jsonpReport).then(function () {\n      logger.log('Copied jsonp report to: ' + reportConfigFilename);\n    }, function (err) {\n      logger.error('Failed jsonp report copy to: ' + reportConfigFilename);\n      throw err;\n    });\n\n    const promises = [jsonpConfigWrite, jsonConfigWrite];\n\n    return allSettled(promises);\n  }).then(function () {\n    if (config.archiveReport) {\n      archiveReport(config);\n    }\n\n    if (config.openReport && config.report && config.report.indexOf('browser') > -1) {\n      const executeCommand = require('./index');\n      return executeCommand('_openReport', config);\n    }\n  });\n}\n\nfunction writeJunitReport (config, reporter) {\n  logger.log('Writing jUnit Report');\n\n  const builder = require('junit-report-builder');\n  const suite = builder.testSuite()\n    .name(reporter.testSuite);\n\n  _.forEach(reporter.tests, test => {\n    const testCase = suite.testCase()\n      .className(test.pair.selector)\n      .name(' ›› ' + test.pair.label);\n\n    if (!test.passed()) {\n      const error = 'Design deviation ›› ' + test.pair.label + ' (' + test.pair.selector + ') component';\n      testCase.failure(error);\n      testCase.error(error);\n    }\n  });\n\n  return new Promise(function (resolve, reject) {\n    let testReportFilename = config.testReportFileName || config.ciReport.testReportFileName;\n    testReportFilename = testReportFilename.replace(/\\.xml$/, '') + '.xml';\n    const destination = path.join(config.ci_report, testReportFilename);\n\n    try {\n      builder.writeTo(destination);\n      logger.success('jUnit report written to: ' + destination);\n\n      resolve();\n    } catch (e) {\n      return reject(e);\n    }\n  });\n}\n\nfunction writeJsonReport (config, reporter) {\n  const testConfig = (typeof config.args.config === 'object')\n    ? config.args.config\n    : Object.assign({}, require(config.backstopConfigFileName));\n\n  let jsonReporter = cloneDeep(reporter);\n\n  function toAbsolute (p) {\n    return (path.isAbsolute(p)) ? p : path.join(config.projectPath, p);\n  }\n\n  logger.log('Writing json report');\n  return fs.ensureDir(toAbsolute(config.json_report)).then(function () {\n    logger.log('Resources copied');\n\n    // Fixing URLs in the configuration\n    const report = toAbsolute(config.json_report);\n    _.forEach(jsonReporter.tests, test => {\n      const pair = test.pair;\n      pair.reference = path.relative(report, toAbsolute(pair.reference));\n      pair.test = path.relative(report, toAbsolute(pair.test));\n      pair.referenceLog = path.relative(report, toAbsolute(pair.referenceLog));\n      pair.testLog = path.relative(report, toAbsolute(pair.testLog));\n\n      if (pair.diffImage) {\n        pair.diffImage = path.relative(report, toAbsolute(pair.diffImage));\n      }\n    });\n\n    const jsonReportFileName = toAbsolute(config.compareJsonFileName);\n\n    // If this is a dynamic test then we assume jsonReporter has one scenario with one or more viewport variants.\n    // This scenario with all viewport variants will be appended to any existing report.\n    if (testConfig.dynamicTestId) {\n      try {\n        console.log('Attempting to open: ', jsonReportFileName);\n        const jsonReportJson = require(jsonReportFileName);\n        const scenarioFileNames = jsonReporter.tests.map(test => test.pair.fileName);\n        jsonReportJson.tests = jsonReportJson.tests.filter(test => !scenarioFileNames.includes(test.pair.fileName));\n        jsonReporter.tests.map(test => jsonReportJson.tests.push(test));\n        jsonReporter = jsonReportJson;\n      } catch (err) {\n        console.log('Creating new report.');\n      }\n    }\n\n    return fs.writeFile(jsonReportFileName, JSON.stringify(jsonReporter, null, 2)).then(function () {\n      logger.log('Wrote Json report to: ' + jsonReportFileName);\n    }, function (err) {\n      logger.error('Failed writing Json report to: ' + jsonReportFileName);\n      throw err;\n    });\n  });\n}\n\nmodule.exports = {\n  execute: function (config) {\n    return compare(config).then(function (report) {\n      const failed = report.failed();\n      logger.log('Test completed...');\n      logger.log(chalk.green(report.passed() + ' Passed'));\n      logger.log(chalk[(failed ? 'red' : 'green')](+failed + ' Failed'));\n\n      return writeReport(config, report).then(function (results) {\n        for (let i = 0; i < results.length; i++) {\n          if (results[i].state !== 'fulfilled') {\n            logger.error('Failed writing report with error: ' + results[i].value);\n          }\n        }\n\n        if (failed) {\n          logger.error('*** Mismatch errors found ***');\n          // logger.log('For a detailed report run `backstop openReport`\\n');\n          throw new Error('Mismatch errors found.');\n        }\n      });\n    }, function (e) {\n      logger.error('Comparison failed with error:' + e);\n    });\n  }\n};\n"
  },
  {
    "path": "core/command/stop.js",
    "content": "const http = require('http');\nconst getRemotePort = require('../util/getRemotePort');\nconst logger = require('../util/logger')('stop');\n\nmodule.exports = {\n  execute: function () {\n    const port = getRemotePort();\n    const stopUrl = `http://127.0.0.1:${port}/stop`;\n    return new Promise((resolve, reject) => {\n      logger.log('Attempting to ping ', stopUrl);\n      http.get(stopUrl, (resp) => {\n        resp.on('end', () => {\n          logger.log('Stopping backstop remote: success');\n          process.exit(0);\n        });\n      }).on('error', (error) => {\n        // ECONNRESET is expected if the stop command worked correctly\n        if (error.code === 'ECONNRESET') {\n          logger.log('Stopping backstop remote: success');\n          return process.exit(0);\n        }\n        logger.log('Stopping backstop remote: error');\n        reject(error);\n      });\n    });\n  }\n};\n"
  },
  {
    "path": "core/command/test.js",
    "content": "const createBitmaps = require('../util/createBitmaps');\nconst { shouldRunDocker, runDocker } = require('../util/runDocker');\n\n// This task will generate a date-named directory with DOM screenshot files as specified in `./capture/config.json` followed by running a report.\n// NOTE: If there is no bitmaps_reference directory or if the bitmaps_reference directory is empty then a new batch of reference files will be generated in the bitmaps_reference directory.  Reporting will be skipped in this case.\nmodule.exports = {\n  execute: function (config) {\n    const executeCommand = require('./index');\n    if (shouldRunDocker(config)) {\n      return runDocker(config, 'test')\n        .finally(() => {\n          if (config.openReport && config.report && config.report.indexOf('browser') > -1) {\n            executeCommand('_openReport', config);\n          }\n        });\n    } else {\n      return createBitmaps(config, false).then(function () {\n        return executeCommand('_report', config);\n      });\n    }\n  }\n};\n"
  },
  {
    "path": "core/command/version.js",
    "content": "const version = require('../../package.json').version;\n\nmodule.exports = {\n  execute: function (config) {\n    return new Promise((resolve, reject) => {\n      console.log('BackstopJS v' + version);\n      resolve(version);\n    });\n  }\n};\n"
  },
  {
    "path": "core/runner.js",
    "content": "const executeCommand = require('./command/');\nconst makeConfig = require('./util/makeConfig');\n\nmodule.exports = function (command, options) {\n  const config = makeConfig(command, options);\n  return executeCommand(command, config);\n};\n\n/* ***\n// Sample of the config object that is created on `backstop init` by makeConfig()\n\n{ args:\n    { _: [ 'init' ],\n        h: false,\n        help: false,\n        v: false,\n        version: false,\n        i: false,\n        config: 'backstop.json'\n    },\n    backstop: '/Users/gshipon/Development/BackstopJS',\n    projectPath: '/Users/gshipon/Development/BackstopJS/test/configs/test_TBD',\n    perf: { init: { started: 2018-09-23T04:01:09.673Z } },\n    backstopConfigFileName: '/Users/gshipon/Development/BackstopJS/test/configs/test_TBD/backstop.json',\n    bitmaps_reference: '/Users/gshipon/Development/BackstopJS/test/configs/test_TBD/backstop_data/bitmaps_reference',\n    bitmaps_test: '/Users/gshipon/Development/BackstopJS/test/configs/test_TBD/backstop_data/bitmaps_test',\n    ci_report: '/Users/gshipon/Development/BackstopJS/test/configs/test_TBD/backstop_data/ci_report',\n    ciReport:\n    {\n        format: 'junit',\n        testReportFileName: 'xunit',\n        testSuiteName: 'BackstopJS'\n    },\n    html_report: '/Users/gshipon/Development/BackstopJS/test/configs/test_TBD/backstop_data/html_report',\n    openReport: true,\n    compareConfigFileName: '/Users/gshipon/Development/BackstopJS/test/configs/test_TBD/backstop_data/html_report/config.js',\n    compareReportURL: '/Users/gshipon/Development/BackstopJS/test/configs/test_TBD/backstop_data/html_report/index.html',\n    comparePath: '/Users/gshipon/Development/BackstopJS/compare/output',\n    tempCompareConfigFileName: '/var/folders/9h/wrnjdvhj2qj48yj73d9sblsw000gs9/T/118822-2689-1h46kp1.3jzk.json',\n    captureConfigFileName: '/var/folders/9h/wrnjdvhj2qj48yj73d9sblsw000gs9/T/capture/33365765a815d9578b5cde5a8358b4ef3cfe2e90.json',\n    captureConfigFileNameDefault: '/Users/gshipon/Development/BackstopJS/capture/config.default.json',\n    casper_scripts: '/Users/gshipon/Development/BackstopJS/test/configs/test_TBD/backstop_data/casper_scripts',\n    casper_scripts_default: '/Users/gshipon/Development/BackstopJS/capture/casper_scripts',\n    casperFlags: null,\n    engine_scripts: '/Users/gshipon/Development/BackstopJS/test/configs/test_TBD/backstop_data/engine_scripts',\n    engine_scripts_default: '/Users/gshipon/Development/BackstopJS/capture/engine_scripts',\n    id: undefined,\n    engine: null,\n    report: [ 'browser' ],\n    defaultMisMatchThreshold: 0.1,\n    debug: false,\n    resembleOutputOptions: undefined,\n    asyncCompareLimit: undefined,\n    backstopVersion: '3.5.14'\n}\n*** */\n"
  },
  {
    "path": "core/util/BackstopException.js",
    "content": "module.exports = class BackstopException {\n  constructor (msg, scenario, viewport, originalError) {\n    this.msg = msg;\n    this.scenario = scenario;\n    this.viewport = viewport;\n    this.originalError = originalError;\n  }\n\n  toString () {\n    return 'BackstopException: ' +\n      this.scenario.label + ' on ' +\n      this.viewport.label + ': ' +\n      this.originalError.toString();\n  }\n};\n"
  },
  {
    "path": "core/util/Reporter.js",
    "content": "function Test (pair) {\n  this.pair = pair;\n  this.status = 'running';\n}\n\nTest.prototype.passed = function () {\n  return this.status === 'pass';\n};\n\nfunction Reporter (testSuite) {\n  this.testSuite = testSuite;\n  this.tests = [];\n}\n\nReporter.prototype.addTest = function (pair) {\n  const t = new Test(pair);\n  this.tests.push(t);\n\n  return t;\n};\n\nReporter.prototype.passed = function () {\n  return this.tests.filter(test => test.passed()).length;\n};\n\nReporter.prototype.failed = function () {\n  return this.tests.filter(test => !test.passed()).length;\n};\n\nReporter.prototype.getReport = function () {\n  return {\n    testSuite: this.testSuite,\n    tests: this.tests\n  };\n};\n\nmodule.exports = Reporter;\n"
  },
  {
    "path": "core/util/allSettled.js",
    "content": "module.exports = function (promises) {\n  return Promise.all(promises.map(function (promise) {\n    return promise.then(function (value) {\n      return { state: 'fulfilled', value };\n    }).catch(function (reason) {\n      return { state: 'rejected', reason };\n    });\n  }));\n};\n"
  },
  {
    "path": "core/util/compare/compare-hash.js",
    "content": "const crypto = require('crypto');\nconst fs = require('fs');\n\nfunction getFileHash (filename) {\n  if (!filename) {\n    return '';\n  }\n  return new Promise(resolve => {\n    const md5sum = crypto.createHash('md5');\n    const stream = fs.ReadStream(filename);\n\n    stream.on('data', d => md5sum.update(d));\n    stream.on('end', () => resolve(md5sum.digest('hex')));\n  });\n}\n\nmodule.exports = function (refImage, testImage) {\n  return Promise.all([getFileHash(refImage), getFileHash(testImage)])\n    .then(hashes => {\n      if (hashes[0] !== hashes[1]) {\n        throw new Error('Images do not match');\n      }\n      return {\n        isSameDimensions: true,\n        dimensionDifference: { width: 0, height: 0 },\n        misMatchPercentage: '0.00'\n      };\n    });\n};\n"
  },
  {
    "path": "core/util/compare/compare-resemble.js",
    "content": "const resemble = require('@mirzazeyrek/node-resemble-js');\n\nmodule.exports = function (referencePath, testPath, misMatchThreshold, resembleOutputSettings, requireSameDimensions) {\n  return new Promise(function (resolve, reject) {\n    const resembleSettings = resembleOutputSettings || {};\n    resemble.outputSettings(resembleSettings);\n    const comparison = resemble(referencePath).compareTo(testPath);\n\n    if (resembleSettings.ignoreAntialiasing) {\n      comparison.ignoreAntialiasing();\n    }\n\n    comparison.onComplete(data => {\n      const misMatchPercentage = resembleSettings.usePreciseMatching ? data.rawMisMatchPercentage : data.misMatchPercentage;\n      if ((requireSameDimensions === false || data.isSameDimensions === true) && misMatchPercentage <= misMatchThreshold) {\n        return resolve(data);\n      }\n      reject(data);\n    });\n  });\n};\n"
  },
  {
    "path": "core/util/compare/compare.js",
    "content": "const compareHashes = require('./compare-hash');\nconst compareResemble = require('./compare-resemble');\nconst storeFailedDiff = require('./store-failed-diff.js');\n\nprocess.on('message', compare);\n\nfunction compare (data) {\n  const { referencePath, testPath, resembleOutputSettings, pair } = data;\n  const promise = compareHashes(referencePath, testPath)\n    .catch(() => compareResemble(referencePath, testPath, pair.misMatchThreshold, resembleOutputSettings, pair.requireSameDimensions));\n  promise\n    .then(function (data) {\n      pair.diff = data;\n      pair.status = 'pass';\n      return sendMessage(pair);\n    })\n    .catch(function (data) {\n      pair.diff = data;\n      pair.status = 'fail';\n\n      return storeFailedDiff(testPath, data).then(function (compare) {\n        pair.diffImage = compare;\n        return sendMessage(pair);\n      });\n    });\n}\n\nfunction sendMessage (data) {\n  process.send(data);\n}\n"
  },
  {
    "path": "core/util/compare/index.js",
    "content": "const path = require('path');\nconst map = require('p-map');\nconst fs = require('fs');\nconst cp = require('child_process');\n\nconst Reporter = require('./../Reporter');\nconst logger = require('./../logger')('compare');\nconst storeFailedDiffStub = require('./store-failed-diff-stub.js');\n\nconst ASYNC_COMPARE_LIMIT = 20;\n\nfunction comparePair (pair, report, config, compareConfig) {\n  const Test = report.addTest(pair);\n\n  const referencePath = pair.reference ? path.resolve(config.projectPath, pair.reference) : '';\n  const testPath = pair.test ? path.resolve(config.projectPath, pair.test) : '';\n\n  // TEST RUN ERROR/EXCEPTION\n  if (!referencePath || !testPath) {\n    const MSG = `${pair.msg}: ${pair.error}. See scenario – ${pair.scenario.label} (${pair.viewport.label})`;\n    Test.status = 'fail';\n    logger.error(MSG);\n    pair.error = MSG;\n    return Promise.resolve(pair);\n  }\n\n  // REFERENCE NOT FOUND ERROR\n  if (!fs.existsSync(referencePath)) {\n    // save a failed image stub\n    storeFailedDiffStub(testPath);\n\n    Test.status = 'fail';\n    logger.error('Reference image not found ' + pair.fileName);\n    pair.error = 'Reference file not found ' + referencePath;\n    return Promise.resolve(pair);\n  }\n\n  if (!fs.existsSync(testPath)) {\n    Test.status = 'fail';\n    logger.error('Test image not found ' + pair.fileName);\n    pair.error = 'Test file not found ' + testPath;\n    return Promise.resolve(pair);\n  }\n\n  if (pair.expect) {\n    const scenarioCount = compareConfig.testPairs.filter(p => p.label === pair.label && p.viewportLabel === pair.viewportLabel).length;\n    if (scenarioCount !== pair.expect) {\n      Test.status = 'fail';\n      const error = `Expect ${pair.expect} images for scenario \"${pair.label} (${pair.viewportLabel})\", but actually ${scenarioCount} images be found.`;\n      logger.error(error);\n      pair.error = error;\n      return Promise.resolve(pair);\n    }\n  }\n\n  const resembleOutputSettings = config.resembleOutputOptions;\n  return compareImages(referencePath, testPath, pair, resembleOutputSettings, Test);\n}\n\nfunction compareImages (referencePath, testPath, pair, resembleOutputSettings, Test) {\n  return new Promise(function (resolve, reject) {\n    const worker = cp.fork(require.resolve('./compare'));\n    worker.send({\n      referencePath,\n      testPath,\n      resembleOutputSettings,\n      pair\n    });\n\n    worker.on('message', function (data) {\n      worker.kill();\n      Test.status = data.status;\n      pair.diff = data.diff;\n\n      if (data.status === 'fail') {\n        pair.diffImage = data.diffImage;\n        logger.error('ERROR { requireSameDimensions: ' + (data.requireSameDimensions ? 'true' : 'false') + ', size: ' + (data.isSameDimensions ? 'ok' : 'isDifferent') + ', content: ' + data.diff.misMatchPercentage + '%, threshold: ' + pair.misMatchThreshold + '% }: ' + pair.label + ' ' + pair.fileName);\n      } else {\n        logger.success('OK: ' + pair.label + ' ' + pair.fileName);\n      }\n\n      resolve(data);\n    });\n  });\n}\n\nmodule.exports = function (config) {\n  const compareConfig = require(config.tempCompareConfigFileName).compareConfig;\n\n  const report = new Reporter(config.ciReport.testSuiteName);\n  const asyncCompareLimit = config.asyncCompareLimit || ASYNC_COMPARE_LIMIT;\n  report.id = config.id;\n\n  return map(compareConfig.testPairs, pair => comparePair(pair, report, config, compareConfig), { concurrency: asyncCompareLimit })\n    .then(\n      () => report,\n      e => logger.error('The comparison failed with error: ' + e)\n    );\n};\n"
  },
  {
    "path": "core/util/compare/store-failed-diff-stub.js",
    "content": "const fs = require('fs');\nconst path = require('path');\n\n// BASE64_PNG_STUB is 1x1 white pixel\nconst BASE64_PNG_STUB = 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAwMCAO+ip1sAAAAASUVORK5CYII=';\n\n// Utility to ensure `backstop approve` finds a diff image\n// call when no reference image exists.\nmodule.exports = function (testPath) {\n  fs.writeFileSync(getFailedDiffFilename(testPath), BASE64_PNG_STUB, 'base64');\n};\n\nfunction getFailedDiffFilename (testPath) {\n  const lastSlash = testPath.lastIndexOf(path.sep);\n  return testPath.slice(0, lastSlash + 1) + 'failed_diff_' + testPath.slice(lastSlash + 1, testPath.length);\n}\n"
  },
  {
    "path": "core/util/compare/store-failed-diff.js",
    "content": "const streamToPromise = require('./../streamToPromise');\nconst fs = require('fs');\nconst path = require('path');\n\nmodule.exports = function (testPath, data) {\n  const failedDiffFilename = getFailedDiffFilename(testPath);\n  console.log('   See:', failedDiffFilename);\n\n  const failedDiffStream = fs.createWriteStream(failedDiffFilename);\n  const ext = failedDiffFilename.substring(failedDiffFilename.lastIndexOf('.') + 1);\n\n  if (ext === 'png') {\n    const storageStream = data.getDiffImage()\n      .pack()\n      .pipe(failedDiffStream);\n    return streamToPromise(storageStream, failedDiffFilename);\n  }\n\n  if (ext === 'jpg' || ext === 'jpeg') {\n    fs.writeFileSync(failedDiffFilename, data.getDiffImageAsJPEG(85));\n    return Promise.resolve(failedDiffFilename);\n  }\n};\n\nfunction getFailedDiffFilename (testPath) {\n  const lastSlash = testPath.lastIndexOf(path.sep);\n  return testPath.slice(0, lastSlash + 1) + 'failed_diff_' + testPath.slice(lastSlash + 1, testPath.length);\n}\n"
  },
  {
    "path": "core/util/createBitmaps.js",
    "content": "const cloneDeep = require('lodash/cloneDeep');\nconst fs = require('./fs');\nconst _ = require('lodash');\nconst pMap = require('p-map');\n\nconst runPuppet = require('./runPuppet');\nconst { createPlaywrightBrowser, runPlaywright, disposePlaywrightBrowser } = require('./runPlaywright');\n\nconst ensureDirectoryPath = require('./ensureDirectoryPath');\nconst logger = require('./logger')('createBitmaps');\n\nconst CONCURRENCY_DEFAULT = 10;\n\nfunction regexTest (string, search) {\n  const re = new RegExp(search);\n  return re.test(string);\n}\n\nfunction ensureViewportLabel (config) {\n  if (typeof config.viewports === 'object') {\n    config.viewports.forEach(function (viewport) {\n      if (!viewport.label) {\n        viewport.label = viewport.name;\n      }\n    });\n  }\n}\n\nfunction decorateConfigForCapture (config, isReference) {\n  let configJSON;\n\n  if (typeof config.args.config === 'object') {\n    configJSON = config.args.config;\n  } else {\n    configJSON = Object.assign({}, require(config.backstopConfigFileName));\n  }\n  configJSON.scenarios = configJSON.scenarios || [];\n  ensureViewportLabel(configJSON);\n\n  const totalScenarioCount = configJSON.scenarios.length;\n\n  function pad (number) {\n    let r = String(number);\n    if (r.length === 1) {\n      r = '0' + r;\n    }\n    return r;\n  }\n\n  const screenshotNow = new Date();\n  let screenshotDateTime = screenshotNow.getFullYear() + pad(screenshotNow.getMonth() + 1) + pad(screenshotNow.getDate()) + '-' + pad(screenshotNow.getHours()) + pad(screenshotNow.getMinutes()) + pad(screenshotNow.getSeconds());\n  screenshotDateTime = configJSON.dynamicTestId ? configJSON.dynamicTestId : screenshotDateTime;\n  configJSON.screenshotDateTime = screenshotDateTime;\n  config.screenshotDateTime = screenshotDateTime;\n\n  if (configJSON.dynamicTestId) {\n    console.log(`dynamicTestId '${configJSON.dynamicTestId}' found. BackstopJS will run in dynamic-test mode.`);\n  }\n\n  configJSON.env = cloneDeep(config);\n  configJSON.isReference = isReference;\n  configJSON.paths.tempCompareConfigFileName = config.tempCompareConfigFileName;\n  configJSON.defaultMisMatchThreshold = config.defaultMisMatchThreshold;\n  configJSON.backstopConfigFileName = config.backstopConfigFileName;\n  configJSON.defaultRequireSameDimensions = config.defaultRequireSameDimensions;\n\n  if (config.args.filter) {\n    const scenarios = [];\n    config.args.filter.split(',').forEach(function (filteredTest) {\n      configJSON.scenarios.forEach(function (scenario) {\n        if (regexTest(scenario.label, filteredTest)) {\n          scenarios.push(scenario);\n        }\n      });\n    });\n    configJSON.scenarios = scenarios;\n  }\n\n  logger.log('Selected ' + configJSON.scenarios.length + ' of ' + totalScenarioCount + ' scenarios.');\n  return configJSON;\n}\n\nfunction saveViewportIndexes (viewport, index) {\n  return Object.assign({}, viewport, { vIndex: index });\n}\n\nfunction delegateScenarios (config) {\n  const scenarios = [];\n  const scenarioViews = [];\n\n  config.viewports = config.viewports.map(saveViewportIndexes);\n\n  // casper.each(scenarios, function (casper, scenario, i) {\n  config.scenarios.forEach(function (scenario, i) {\n    // var scenarioLabelSafe = makeSafe(scenario.label);\n    scenario.sIndex = i;\n    scenario.selectors = scenario.selectors || [];\n    if (scenario.viewports) {\n      scenario.viewports = scenario.viewports.map(saveViewportIndexes);\n    }\n    scenarios.push(scenario);\n\n    if (!config.isReference && _.has(scenario, 'variants')) {\n      scenario.variants.forEach(function (variant) {\n        // var variantLabelSafe = makeSafe(variant.label);\n        variant._parent = scenario;\n        scenarios.push(scenario);\n      });\n    }\n  });\n\n  let scenarioViewId = 0;\n  scenarios.forEach(function (scenario) {\n    let desiredViewportsForScenario = config.viewports;\n\n    if (scenario.viewports && scenario.viewports.length > 0) {\n      desiredViewportsForScenario = scenario.viewports;\n    }\n\n    desiredViewportsForScenario.forEach(function (viewport) {\n      scenarioViews.push({\n        scenario,\n        viewport,\n        config,\n        id: scenarioViewId++\n      });\n    });\n  });\n\n  const asyncCaptureLimit = config.asyncCaptureLimit === 0 ? 1 : config.asyncCaptureLimit || CONCURRENCY_DEFAULT;\n\n  if (config.engine.startsWith('puppet')) {\n    return pMap(scenarioViews, runPuppet, { concurrency: asyncCaptureLimit });\n  } else if (config.engine.startsWith('play')) {\n    return new Promise((resolve, reject) => {\n      createPlaywrightBrowser(config).then(browser => {\n        console.log('Browser created');\n\n        for (const view of scenarioViews) {\n          view._playwrightBrowser = browser;\n        }\n\n        pMap(scenarioViews, runPlaywright, { concurrency: asyncCaptureLimit }).then(out => {\n          disposePlaywrightBrowser(browser).then(() => resolve(out));\n        }, e => {\n          disposePlaywrightBrowser(browser).then(() => reject(e));\n        });\n      }, e => reject(e));\n    });\n  } else if (/chrom./i.test(config.engine)) {\n    logger.error('Chromy is no longer supported in version 5+. Please use version 4.x.x for chromy support.');\n  } else {\n    logger.error(`Engine \"${(typeof config.engine === 'string' && config.engine) || 'undefined'}\" not recognized! If you require PhantomJS or Slimer support please use backstopjs@3.8.8 or earlier.`);\n  }\n}\n\nfunction writeCompareConfigFile (comparePairsFileName, compareConfig) {\n  const compareConfigJSON = JSON.stringify(compareConfig, null, 2);\n  ensureDirectoryPath(comparePairsFileName);\n  return fs.writeFile(comparePairsFileName, compareConfigJSON);\n}\n\nfunction flatMapTestPairs (rawTestPairs) {\n  return rawTestPairs.reduce((acc, result) => {\n    let testPairs = result.testPairs;\n    if (!testPairs) {\n      testPairs = {\n        diff: {\n          isSameDimensions: '',\n          dimensionDifference: {\n            width: '',\n            height: ''\n          },\n          misMatchPercentage: ''\n        },\n        reference: '',\n        test: '',\n        selector: '',\n        fileName: '',\n        label: '',\n        scenario: result.scenario,\n        viewport: result.viewport,\n        msg: result.msg,\n        error: result.originalError && result.originalError.name\n      };\n    }\n    return acc.concat(testPairs);\n  }, []);\n}\n\nmodule.exports = function (config, isReference) {\n  const promise = delegateScenarios(decorateConfigForCapture(config, isReference))\n    .then(rawTestPairs => {\n      const result = {\n        compareConfig: {\n          testPairs: flatMapTestPairs(rawTestPairs)\n        }\n      };\n      return writeCompareConfigFile(config.tempCompareConfigFileName, result);\n    });\n\n  return promise;\n};\n"
  },
  {
    "path": "core/util/engineErrors.js",
    "content": "module.exports = function (config) {\n  const compareConfig = require(config.tempCompareConfigFileName).compareConfig;\n  const error = compareConfig.testPairs.find(testPair => {\n    return !!testPair.engineErrorMsg;\n  });\n\n  if (error) {\n    return Promise.reject(error);\n  }\n  return Promise.resolve();\n};\n"
  },
  {
    "path": "core/util/engineTools.js",
    "content": "/**\n * @description Retrieves the mismatch threshold based on the given scenario and configuration.\n *\n * @param {Object} scenario - The scenario object, which may contain a misMatchThreshold property.\n * @param {Object} config - The configuration object, which includes misMatchThreshold and defaultMisMatchThreshold properties.\n * @returns {number} The mismatch threshold value.\n */\nfunction getMisMatchThreshHold (scenario, config) {\n  return scenario?.misMatchThreshold ?? config?.misMatchThreshold ?? config?.defaultMisMatchThreshold ?? 0.1;\n}\n\nfunction ensureFileSuffix (filename, suffix) {\n  const re = new RegExp('\\.' + suffix + '$', ''); // eslint-disable-line no-useless-escape\n  return filename.replace(re, '') + '.' + suffix;\n}\n\n// merge both strings while soft-enforcing a single slash between them\nfunction glueStringsWithSlash (stringA, stringB) {\n  return stringA.replace(/\\/$/, '') + '/' + stringB.replace(/^\\//, '');\n}\n\nfunction genHash (str) {\n  let hash = 0;\n  let i;\n  let chr;\n  let len;\n  if (!str) return hash;\n  str = str.toString();\n  for (i = 0, len = str.length; i < len; i++) {\n    chr = str.charCodeAt(i);\n    hash = ((hash << 5) - hash) + chr;\n    hash |= 0; // Convert to 32bit integer\n  }\n  // return a string and replace a negative sign with a zero\n  return hash.toString().replace(/^-/, 0);\n}\n\n/**\n * @description Determines whether the same dimensions are required based on the given scenario and configuration.\n *\n * @param {Object} scenario - The scenario object, which may contain a requireSameDimensions property.\n * @param {Object} config - The configuration object, which includes requireSameDimensions and defaultMisMatchThreshold properties.\n * @returns {boolean} True if the same dimensions are required, otherwise false.\n */\nfunction getRequireSameDimensions (scenario, config) {\n  return scenario?.requireSameDimensions ?? config?.requireSameDimensions ?? config?.defaultRequireSameDimensions ?? true;\n}\n\nfunction getSelectorName (selector) {\n  return selector.replace(/[^a-z0-9_-]/gi, ''); // remove anything that's not a letter or a number\n}\n\nfunction makeSafe (str) {\n  return str.replace(/[ /]/g, '_');\n}\n\nfunction getFilename (fileNameTemplate, outputFileFormatSuffix, configId, scenarioIndex, scenarioLabelSafe, selectorIndex, selectorLabel, viewportIndex, viewportLabel) {\n  let fileName = fileNameTemplate\n    .replace(/\\{configId\\}/, configId)\n    .replace(/\\{scenarioIndex\\}/, scenarioIndex)\n    .replace(/\\{scenarioLabel\\}/, scenarioLabelSafe)\n    .replace(/\\{selectorIndex\\}/, selectorIndex)\n    .replace(/\\{selectorLabel\\}/, selectorLabel)\n    .replace(/\\{viewportIndex\\}/, viewportIndex)\n    .replace(/\\{viewportLabel\\}/, makeSafe(viewportLabel))\n    .replace(/[^a-z0-9_-]/gi, ''); // remove anything that's not a letter or a number or dash or underscore.\n\n  const extRegExp = new RegExp(outputFileFormatSuffix + '$', 'i');\n  if (!extRegExp.test(fileName)) {\n    fileName = fileName + outputFileFormatSuffix;\n  }\n  return fileName;\n}\n\nfunction getEngineOption (config, optionName, fallBack) {\n  if (typeof config.engineOptions === 'object' && config.engineOptions[optionName]) {\n    return config.engineOptions[optionName];\n  }\n  return fallBack;\n}\n\nfunction getScenarioExpect (scenario) {\n  let expect = 0;\n  if (scenario.selectorExpansion && scenario.selectors && scenario.selectors.length && scenario.expect) {\n    expect = scenario.expect;\n  }\n\n  return expect;\n}\n\nfunction generateTestPair (config, scenario, viewport, variantOrScenarioLabelSafe, scenarioLabelSafe, selectorIndex, selector) {\n  const cleanedSelectorName = getSelectorName(selector);\n  const fileName = getFilename(\n    config._fileNameTemplate,\n    config._outputFileFormatSuffix,\n    config._configId,\n    scenario.sIndex,\n    variantOrScenarioLabelSafe,\n    selectorIndex,\n    cleanedSelectorName,\n    viewport.vIndex,\n    viewport.label\n  );\n  const testFilePath = config._bitmapsTestPath + '/' + config.screenshotDateTime + '/' + fileName;\n  const logFileName = getFilename(\n    config._fileNameTemplate,\n    '.log.json',\n    config._configId,\n    scenario.sIndex,\n    variantOrScenarioLabelSafe,\n    selectorIndex,\n    cleanedSelectorName,\n    viewport.vIndex,\n    viewport.label\n  );\n  const testLogFilePath = config._bitmapsTestPath + '/' + config.screenshotDateTime + '/' + logFileName;\n  const referenceFilePath = config._bitmapsReferencePath + '/' + getFilename(\n    config._fileNameTemplate,\n    config._outputFileFormatSuffix,\n    config._configId,\n    scenario.sIndex,\n    scenarioLabelSafe,\n    selectorIndex,\n    cleanedSelectorName,\n    viewport.vIndex,\n    viewport.label\n  );\n  const referenceLogFilePath = config._bitmapsReferencePath + '/' + getFilename(\n    config._fileNameTemplate,\n    '.log.json',\n    config._configId,\n    scenario.sIndex,\n    scenarioLabelSafe,\n    selectorIndex,\n    cleanedSelectorName,\n    viewport.vIndex,\n    viewport.label\n  );\n\n  return {\n    reference: referenceFilePath,\n    referenceLog: referenceLogFilePath,\n    test: testFilePath,\n    testLog: testLogFilePath,\n    selector,\n    fileName,\n    label: scenario.label,\n    requireSameDimensions: getRequireSameDimensions(scenario, config),\n    misMatchThreshold: getMisMatchThreshHold(scenario, config),\n    url: scenario.url,\n    referenceUrl: scenario.referenceUrl,\n    expect: getScenarioExpect(scenario),\n    viewportLabel: viewport.label\n  };\n}\n\nmodule.exports = {\n  generateTestPair,\n  getMisMatchThreshHold,\n  getRequireSameDimensions,\n  ensureFileSuffix,\n  glueStringsWithSlash,\n  genHash,\n  makeSafe,\n  getFilename,\n  getEngineOption,\n  getSelectorName,\n  getScenarioExpect\n};\n"
  },
  {
    "path": "core/util/ensureDirectoryPath.js",
    "content": "const path = require('path');\nconst fs = require('fs');\n\nfunction ensureDirectoryPath (filePath) {\n  const dirname = path.dirname(filePath);\n  if (fs.existsSync(dirname)) {\n    return true;\n  }\n  ensureDirectoryPath(dirname);\n  fs.mkdirSync(dirname);\n}\n\nmodule.exports = function (path) {\n  return ensureDirectoryPath(path);\n};\n"
  },
  {
    "path": "core/util/extendConfig.js",
    "content": "const path = require('path');\nconst temp = require('temp');\nconst fs = require('fs');\nconst hash = require('object-hash');\nconst tmpdir = require('os').tmpdir();\nconst version = require('../../package.json').version;\n\nfunction extendConfig (config, userConfig) {\n  bitmapPaths(config, userConfig);\n  ci(config, userConfig);\n  htmlReport(config, userConfig);\n  jsonReport(config, userConfig);\n  comparePaths(config);\n  captureConfigPaths(config);\n  engine(config, userConfig);\n\n  config.id = userConfig.id;\n  config.engine = userConfig.engine || null;\n  config.report = userConfig.report || ['browser'];\n  config.defaultMisMatchThreshold = 0.1;\n  config.debug = userConfig.debug || false;\n  config.resembleOutputOptions = userConfig.resembleOutputOptions;\n  config.asyncCompareLimit = userConfig.asyncCompareLimit;\n  config.backstopVersion = version;\n  config.dockerCommandTemplate = userConfig.dockerCommandTemplate;\n  config.scenarioLogsInReports = userConfig.scenarioLogsInReports;\n  return config;\n}\n\nfunction bitmapPaths (config, userConfig) {\n  config.bitmaps_reference = path.join(config.projectPath, 'backstop_data', 'bitmaps_reference');\n  config.bitmaps_test = path.join(config.projectPath, 'backstop_data', 'bitmaps_test');\n  if (userConfig.paths) {\n    config.bitmaps_reference = userConfig.paths.bitmaps_reference || config.bitmaps_reference;\n    config.bitmaps_test = userConfig.paths.bitmaps_test || config.bitmaps_test;\n  }\n}\n\nfunction ci (config, userConfig) {\n  config.ci_report = path.join(config.projectPath, 'backstop_data', 'ci_report');\n  if (userConfig.paths) {\n    config.ci_report = userConfig.paths.ci_report || config.ci_report;\n  }\n  config.ciReport = {\n    format: 'junit',\n    testReportFileName: 'xunit',\n    testSuiteName: 'BackstopJS'\n  };\n\n  if (userConfig.ci) {\n    config.ciReport = {\n      format: userConfig.ci.format || config.ciReport.format,\n      testReportFileName: userConfig.ci.testReportFileName || config.ciReport.testReportFileName,\n      testSuiteName: userConfig.ci.testSuiteName || config.ciReport.testSuiteName\n    };\n  }\n}\n\nfunction htmlReport (config, userConfig) {\n  config.html_report = path.join(config.projectPath, 'backstop_data', 'html_report');\n  config.openReport = userConfig.openReport === undefined ? true : userConfig.openReport;\n  config.archivePath = path.join(config.projectPath, 'backstop_data', 'reports');\n  config.archiveReport = userConfig.archiveReport === undefined ? false : userConfig.archiveReport;\n\n  if (userConfig.paths) {\n    config.html_report = userConfig.paths.html_report || config.html_report;\n    config.archivePath = userConfig.paths.reports_archive || config.archivePath;\n  }\n\n  config.compareConfigFileName = path.join(config.html_report, 'config.js');\n  config.compareReportURL = path.join(config.html_report, 'index.html');\n}\n\nfunction jsonReport (config, userConfig) {\n  config.json_report = path.join(config.projectPath, 'backstop_data', 'json_report');\n  if (userConfig.paths) {\n    config.json_report = userConfig.paths.json_report || config.json_report;\n  }\n\n  config.compareJsonFileName = path.join(config.json_report, 'jsonReport.json');\n}\n\nfunction comparePaths (config) {\n  config.comparePath = path.join(config.backstop, 'compare/output');\n  config.tempCompareConfigFileName = temp.path({ suffix: '.json' });\n}\n\nfunction captureConfigPaths (config) {\n  const captureDir = path.join(tmpdir, 'capture');\n  if (!fs.existsSync(captureDir)) {\n    fs.mkdirSync(captureDir);\n  }\n  const configHash = hash(config);\n  config.captureConfigFileName = path.join(tmpdir, 'capture', configHash + '.json');\n  config.captureConfigFileNameDefault = path.join(config.backstop, 'capture', 'config.default.json');\n}\n\nfunction engine (config, userConfig) {\n  config.engine_scripts = path.join(config.projectPath, 'backstop_data', 'engine_scripts');\n  config.engine_scripts_default = path.join(config.backstop, 'capture', 'engine_scripts');\n\n  if (userConfig.paths) {\n    config.engine_scripts = userConfig.paths.engine_scripts || config.engine_scripts;\n  }\n}\n\nmodule.exports = extendConfig;\n"
  },
  {
    "path": "core/util/findExecutable.js",
    "content": "const path = require('path');\n\nmodule.exports = function (module, bin) {\n  try {\n    const pathToExecutableModulePackageJson = require.resolve(path.join(module, 'package.json'));\n    const executableModulePackageJson = require(pathToExecutableModulePackageJson);\n    const relativePathToExecutableBinary = executableModulePackageJson.bin[bin] || executableModulePackageJson.bin;\n    const pathToExecutableModule = pathToExecutableModulePackageJson.replace('package.json', '');\n    return path.join(pathToExecutableModule, relativePathToExecutableBinary);\n  } catch (e) {\n    throw new Error('Couldn\\'t find executable for module \"' + module + '\" and bin \"' + bin + '\"\\n' + e.message);\n  }\n};\n"
  },
  {
    "path": "core/util/fs.js",
    "content": "const fs = require('fs');\nconst fsExtra = require('fs-extra');\nconst promisify = require('./promisify');\n\nconst fsPromisified = {\n  readdir: promisify(fs.readdir),\n  createWriteStream: fs.createWriteStream,\n  existsSync: fs.existsSync,\n  readFile: promisify(fs.readFile),\n  writeFile: promisify(fs.writeFile),\n  ensureDir: promisify(fsExtra.ensureDir),\n  unlink: promisify(fs.unlink),\n  remove: promisify(fsExtra.remove),\n  stat: promisify(fs.stat),\n  copy: promisify(fsExtra.copy),\n  exists: function exists (file) {\n    return fsPromisified.stat(file)\n      .then(function (args) {\n        return args[0];\n      })\n      .catch(function () {\n        return false;\n      });\n  }\n};\n\nmodule.exports = fsPromisified;\n"
  },
  {
    "path": "core/util/getFreePorts.js",
    "content": "const portfinder = require('portfinder');\n/**\n * Gets the free ports.\n *\n * @param      {number}  startingPort    The starting port\n * @param      {number}  requestedPorts  how many ports should we find?\n * @return     {Array}   The free ports.\n */\nmodule.exports = function getFreePorts (startingPort, requestedPorts) {\n  return new Promise((resolve, reject) => {\n    const R = resolve;\n    console.log(`searching for ${requestedPorts} available ports.`);\n    const requestedAmount = requestedPorts;\n    const freePorts = [];\n\n    function findFreePorts (startPort, pointer) {\n      const PTR = pointer || 1;\n      // console.log('freePorts > ', PTR, JSON.stringify(freePorts));\n      if (PTR > requestedAmount) {\n        R(freePorts);\n        return;\n      }\n      portfinder.basePort = startPort;\n      portfinder.getPort(function (err, port) {\n        if (err) {\n          reject(new Error(err));\n        }\n        freePorts[PTR - 1] = port;\n        return findFreePorts(port + 1, PTR + 1);\n      });\n    }\n    findFreePorts(startingPort);\n  });\n};\n"
  },
  {
    "path": "core/util/getRemotePort.js",
    "content": "/**\n * Gets the custom remote port, otherwise return the default (3000).\n *\n * @return     {number}   The remote port.\n */\nmodule.exports = function getRemotePort () {\n  const remotePort = process.env.BACKSTOP_REMOTE_HTTP_PORT || 3000;\n  return remotePort;\n};\n"
  },
  {
    "path": "core/util/isWin.js",
    "content": "module.exports = /^win/.test(process.platform);\n"
  },
  {
    "path": "core/util/logger.js",
    "content": "const chalk = require('chalk');\nconst _ = require('lodash');\nconst makeSpaces = require('./makeSpaces');\n\nfunction identity (string) { return string; }\n\nconst typeToColor = {\n  error: identity,\n  warn: identity,\n  log: identity,\n  info: identity,\n  debug: identity,\n  success: identity\n};\n\nconst typeToTitleColor = {\n  error: chalk.red,\n  warn: chalk.yellow,\n  log: chalk.white,\n  info: chalk.grey,\n  debug: chalk.blue,\n  success: chalk.green\n};\n\nlet longestTitle = 5;\n\nfunction paddedString (length, string) {\n  const padding = makeSpaces(length + 3);\n\n  if (string instanceof Error) {\n    string = string.stack;\n  }\n\n  if (typeof string !== 'string') {\n    return string;\n  }\n\n  const lines = string.split('\\n');\n  const paddedLines = lines\n    .slice(1)\n    .map(function addPadding (string) {\n      return padding + string;\n    });\n  paddedLines.unshift(lines[0]);\n\n  return paddedLines.join('\\n');\n}\n\nfunction message (type, subject, string) {\n  if (!_.has(typeToColor, type)) {\n    type = 'info';\n    console.log(typeToColor.warn('Type ' + type + ' is not defined as logging type'));\n  }\n\n  if (subject.length < longestTitle) {\n    const appendChar = ' ';\n    while (subject.length < longestTitle) {\n      subject = appendChar + subject;\n    }\n  } else {\n    longestTitle = subject.length;\n  }\n\n  console.log(typeToTitleColor[type](subject + ' ') + '| ' + paddedString(longestTitle, typeToColor[type](string)));\n}\n\nmodule.exports = function (subject) {\n  return {\n    error: message.bind(null, 'error', subject),\n    warn: message.bind(null, 'warn', subject),\n    log: message.bind(null, 'log', subject),\n    info: message.bind(null, 'info', subject),\n    debug: message.bind(null, 'debug', subject),\n    success: message.bind(null, 'success', subject)\n  };\n};\n"
  },
  {
    "path": "core/util/makeConfig.js",
    "content": "const path = require('path');\nconst extendConfig = require('./extendConfig');\n\nconst NON_CONFIG_COMMANDS = ['init', 'version', 'stop'];\n\nfunction projectPath (config) {\n  return process.cwd();\n}\n\nfunction loadProjectConfig (command, options, config) {\n  // TEST REPORT FILE NAME\n  const customTestReportFileName = options && (options.testReportFileName || null);\n  if (customTestReportFileName) {\n    config.testReportFileName = options.testReportFileName || null;\n  }\n\n  let customConfigPath = options && (options.backstopConfigFilePath || options.configPath);\n  if (options && typeof options.config === 'string' && !customConfigPath) {\n    customConfigPath = options.config;\n  }\n\n  if (customConfigPath) {\n    if (path.isAbsolute(customConfigPath)) {\n      config.backstopConfigFileName = customConfigPath;\n    } else {\n      config.backstopConfigFileName = path.join(config.projectPath, customConfigPath);\n    }\n  } else {\n    config.backstopConfigFileName = path.join(config.projectPath, 'backstop.json');\n  }\n\n  let userConfig = {};\n  const CMD_REQUIRES_CONFIG = !NON_CONFIG_COMMANDS.includes(command);\n  if (CMD_REQUIRES_CONFIG) {\n    // This flow is confusing -- is checking for !config.backstopConfigFileName more reliable?\n    if (options && typeof options.config === 'object' && options.config.scenarios) {\n      console.log('Object-literal config detected.');\n      if (options.config.debug) {\n        console.log(JSON.stringify(options.config, null, 2));\n      }\n      userConfig = options.config;\n    } else if (config.backstopConfigFileName) {\n      // Remove from cache config content\n      delete require.cache[require.resolve(config.backstopConfigFileName)];\n      console.log('Loading config: ', config.backstopConfigFileName, '\\n');\n      userConfig = require(config.backstopConfigFileName);\n    }\n  }\n\n  return userConfig;\n}\n\nfunction makeConfig (command, options) {\n  const config = {};\n\n  config.args = options || {};\n\n  config.backstop = path.join(__dirname, '../..');\n  config.projectPath = projectPath(config);\n  config.perf = {};\n\n  const userConfig = Object.assign({}, loadProjectConfig(command, options, config));\n\n  return extendConfig(config, userConfig);\n}\n\nmodule.exports = makeConfig;\n"
  },
  {
    "path": "core/util/makeSpaces.js",
    "content": "module.exports = function makeSpaces (length) {\n  let i = 0;\n  let result = '';\n  while (i < length) {\n    result += ' ';\n    i++;\n  }\n  return result;\n};\n"
  },
  {
    "path": "core/util/promisify.js",
    "content": "module.exports = function promisify (func) {\n  return function () {\n    const args = (arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments));\n    return new Promise(function (resolve, reject) {\n      args.push(function (err) {\n        if (err) {\n          reject(err);\n          return;\n        }\n\n        const args = (arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments));\n        resolve(args.slice(1));\n      });\n      func.apply(this, args);\n    });\n  };\n};\n"
  },
  {
    "path": "core/util/remote.js",
    "content": "const fs = require('./fs');\n\n/**\n * Extract jsonReport from the jsonpReport\n *\n * @param {String} jsonpReport - jsonpReport `report(${jsonReport});`\n * @return {Object} an object of jsonReport\n */\nfunction extractReport (jsonpReport) {\n  const jsonReport = jsonpReport.substring(7, jsonpReport.length - 2);\n  return JSON.parse(jsonReport);\n}\n\n/**\n * Helper function to modify the test status of the JSONP report based on the approved file name.\n *\n * @param {String} originalJsonpReport - jsonpReport `report(${jsonReport});`\n * @param {String} approvedFileName - the name of the screenshot that is approved\n * @return {String} jsonpReport - modified jsonpReport\n */\nfunction modifyJsonpReportHelper (originalJsonpReport, approvedFileName) {\n  const report = extractReport(originalJsonpReport);\n  report.tests.forEach(test => {\n    if (test.pair.fileName === approvedFileName) {\n      test.status = 'pass';\n      delete test.pair.diffImage;\n    }\n    return test;\n  });\n\n  const jsonReport = JSON.stringify(report, null, 2);\n  const jsonpReport = `report(${jsonReport});`;\n  return jsonpReport;\n}\n\n/**\n * Modify the test status of the JSONP report based on the approved file name. JSONP is used\n * to create the Backstop report in browser. This function ensures the UI consistency after\n * a user apporves a test in browser and refreshes the report without running a test.\n *\n * @param {Object} params - the input params\n * @param {String} params.reportConfigFilename - the path to the html report config file\n * @param {String} params.approvedFileName - the name of the screenshot that is approved\n * @return {Promise}\n */\nasync function modifyJsonpReport ({ reportConfigFilename, approvedFileName }) {\n  return fs\n    .readFile(reportConfigFilename, 'utf8')\n    .then(content => {\n      const jsonpReport = modifyJsonpReportHelper(content[0], approvedFileName);\n      return fs.writeFile(reportConfigFilename, jsonpReport);\n    })\n    .catch(err => {\n      throw new Error(`Failed to modify the report. ${err.message}.`);\n    });\n}\n\nmodule.exports = {\n  modifyJsonpReport,\n  modifyJsonpReportHelper\n};\n"
  },
  {
    "path": "core/util/runDocker.js",
    "content": "const { spawn } = require('child_process');\nconst version = require('../../package').version;\nconst fs = require('./fs');\n\nconst DEFAULT_DOCKER_COMMAND_TEMPLATE = 'docker run --rm -it --mount type=bind,source=\"{cwd}\",target=/src backstopjs/backstopjs:{version} {backstopCommand} {args}';\n\nmodule.exports.shouldRunDocker = (config) => config.args.docker;\n\nmodule.exports.runDocker = async (config, backstopCommand) => {\n  if (config.args.docker) {\n    // 0th element is node, 1st is backstop, 2nd may be command or an option like --config\n    const args = process.argv.slice(2);\n    args.splice(args.indexOf(backstopCommand), 1);\n\n    const passAlongArgs = args\n      .map(arg => `\"${arg}\"`) // in case of spaces in a command\n      .join(' ')\n      .replace(/--docker/, '--moby');\n\n    // We cannot pass object literals directly to Docker, so if the config is an object (and not a file path) we will output the config to a temporary file.\n    const tmpConfigFile = 'backstop.config-for-docker.json';\n\n    // When calling BackstopJS from node config props will be overridden by the passed config object. e.g. backstop('test', {thisProp:'will be passed to config.args'})\n    let configArgs = '';\n    if (config.args && !config.args._) {\n      const argPromises = Object.keys(config.args)\n        .filter(prop => config.args[prop])\n        .map(async prop => {\n          if (prop === 'config' && typeof config.args[prop] === 'object') {\n            // If config is an object, export it to a json file\n            await fs.writeFile(tmpConfigFile, JSON.stringify(config.args[prop]));\n            config.args[prop] = tmpConfigFile;\n          }\n\n          return `\"--${prop}=${config.args[prop]}\"`;\n        });\n\n      configArgs = await Promise.all(argPromises).then((str) => {\n        return str.join(' ').replace(/--docker/, '--moby');\n      });\n    }\n\n    const backstopArgs = [configArgs, passAlongArgs]\n      .filter(args => args)\n      .join(' ');\n\n    const dockerCommandTemplate = config.dockerCommandTemplate || DEFAULT_DOCKER_COMMAND_TEMPLATE;\n\n    const dockerCommand = dockerCommandTemplate\n      .replace(/{cwd}/g, process.cwd())\n      .replace(/{version}/, version)\n      .replace(/{backstopCommand}/, backstopCommand)\n      .replace(/{args}/, backstopArgs);\n\n    console.log('Delegating command to Docker...', dockerCommand);\n\n    return new Promise((resolve, reject) => {\n      const dockerProcess = spawn(dockerCommand, { stdio: 'inherit', shell: true });\n      dockerProcess.on('error', err => reject(err));\n      dockerProcess.on('exit', async function (code, signal) {\n        if (!config.args.debug && config.args.config === tmpConfigFile) {\n          await fs.unlink(tmpConfigFile);\n        }\n\n        if (code === 0) {\n          resolve();\n        } else {\n          reject(new Error(`${dockerCommand} returned ${code}`));\n        }\n      });\n    });\n  }\n};\n"
  },
  {
    "path": "core/util/runPlaywright.js",
    "content": "const playwright = require('playwright');\n\nconst fs = require('./fs');\nconst path = require('path');\nconst chalk = require('chalk');\nconst _ = require('lodash');\nconst ensureDirectoryPath = require('./ensureDirectoryPath');\nconst injectBackstopTools = require('../../capture/backstopTools.js');\nconst engineTools = require('./engineTools');\n\nconst TEST_TIMEOUT = 60000;\nconst DEFAULT_FILENAME_TEMPLATE = '{configId}_{scenarioLabel}_{selectorIndex}_{selectorLabel}_{viewportIndex}_{viewportLabel}';\nconst DEFAULT_BITMAPS_TEST_DIR = 'bitmaps_test';\nconst DEFAULT_BITMAPS_REFERENCE_DIR = 'bitmaps_reference';\nconst SELECTOR_NOT_FOUND_PATH = '/capture/resources/notFound.png';\nconst HIDDEN_SELECTOR_PATH = '/capture/resources/notVisible.png';\nconst ERROR_SELECTOR_PATH = '/capture/resources/unexpectedErrorSm.png';\nconst BODY_SELECTOR = 'body';\nconst DOCUMENT_SELECTOR = 'document';\nconst NOCLIP_SELECTOR = 'body:noclip';\nconst VIEWPORT_SELECTOR = 'viewport';\n\n/**\n * @method createPlaywrightBrowser\n * @function createPlaywrightBrowser\n * @description Take configuration arguments, sanitize, and create a Playwright browser.\n * @date 12/23/2023 - 10:13:35 PM\n *\n * @async\n * @param {Object} config\n * @returns {import('playwright').Browser}\n */\nmodule.exports.createPlaywrightBrowser = async function (config) {\n  console.log('Creating Browser');\n\n  // Copy and destructure engineOptions for headless mode sanitization\n  let { engineOptions: sanitizedEngineOptions } = JSON.parse(JSON.stringify(config));\n\n  // Destructure other properties to reduce repetition\n  let { browser: browserChoice, headless } = sanitizedEngineOptions;\n\n  // Use Chrommium if no browser set in `engineOptions`\n  if (!browserChoice) {\n    console.warn(chalk.yellow('No Playwright browser specified, assuming Chromium.'));\n    browserChoice = 'chromium';\n  }\n\n  // Warn when using an unrecognized variant of `headless` mode\n  if (typeof headless === 'string' && headless !== 'new') {\n    console.warn(chalk.yellow(`The headless mode, \"${headless}\", may not be supported by Playwright.`));\n  }\n\n  // Error when using unknown `browserChoice`\n  if (!playwright[browserChoice]) {\n    console.error(chalk.red(`Unsupported Playwright browser \"${browserChoice}\"`));\n    return;\n  }\n\n  /**\n   * If headless is defined, and it's not a boolean, proceed with sanitization\n   * of `engineOptions`, setting Playwright to ignore its built in\n   * `--headless` flag. Then, pass the custom `--headless='string'` flag.\n   * NOTE: This is will fail if user defined `headless` mode\n   * is an invalid option for Playwright, but is future-proof if they add something\n   * like 'old' headless mode when 'new' mode is default. A warning is included for this case.\n   */\n  if (typeof headless !== 'undefined' && typeof headless !== 'boolean') {\n    sanitizedEngineOptions = {\n      ...sanitizedEngineOptions,\n      ignoreDefaultArgs: sanitizedEngineOptions.ignoreDefaultArgs ? [...sanitizedEngineOptions.ignoredDefaultArgs, '--headless'] : ['--headless']\n    };\n    sanitizedEngineOptions.args.push(`--headless=${headless}`);\n  }\n\n  /**\n   * @constant playwrightArgs\n   * @type {Object}\n   * @description The arguments to pass Playwright. Sanitizes for `new` headless\n   * mode with Playwright until it is fully supported. `ignoreDefaultArgs:\n   * ['--headless']` silences Playwright's non-boolean warning when passing 'new'.\n   *\n   * @see https://playwright.dev/docs/api/class-browsertype#browser-type-launch-option-headless\n   * @see https://github.com/microsoft/playwright/issues/21194#issuecomment-1444276676\n   *\n   * @example\n   *\n   * ```javascript\n   * {\n   *  args: [ '--no-sandbox', '--headless=new' ],\n   *  headless: true,\n   *  ignoreDefaultArgs: [ '--headless' ]\n   * }\n   * ```\n   */\n  const playwrightArgs = Object.assign(\n    {},\n    sanitizedEngineOptions,\n    {\n      headless: config.debugWindow\n        ? false\n        : typeof headless === 'boolean' ? headless : typeof headless === 'string' ? headless === 'new' ? true : headless : true\n    }\n  );\n  return await playwright[browserChoice].launch(playwrightArgs);\n};\n\nmodule.exports.runPlaywright = function ({ scenario, viewport, config, _playwrightBrowser: browser }) {\n  const scenarioLabelSafe = engineTools.makeSafe(scenario.label);\n  const variantOrScenarioLabelSafe = scenario._parent ? engineTools.makeSafe(scenario._parent.label) : scenarioLabelSafe;\n\n  config._bitmapsTestPath = config.paths.bitmaps_test || DEFAULT_BITMAPS_TEST_DIR;\n  config._bitmapsReferencePath = config.paths.bitmaps_reference || DEFAULT_BITMAPS_REFERENCE_DIR;\n  config._fileNameTemplate = config.fileNameTemplate || DEFAULT_FILENAME_TEMPLATE;\n  config._outputFileFormatSuffix = '.' + ((config.outputFormat && config.outputFormat.match(/jpg|jpeg/)) || 'png');\n  config._configId = config.id || engineTools.genHash(config.backstopConfigFileName);\n\n  return processScenarioView(scenario, variantOrScenarioLabelSafe, scenarioLabelSafe, viewport, config, browser);\n};\n\nmodule.exports.disposePlaywrightBrowser = async function (browser) {\n  console.log('Disposing Browser');\n  await browser.close();\n};\n\nasync function processScenarioView (scenario, variantOrScenarioLabelSafe, scenarioLabelSafe, viewport, config, browser) {\n  const { engineOptions, scenarioDefaults = {} } = config;\n\n  /**\n   * @type {Object}\n   * @description Spread `scenarioDefaults` into the scenario.\n   * @default `scenario`\n   */\n  scenario = {\n    ...scenarioDefaults,\n    ...scenario\n  };\n\n  if (!config.paths) {\n    config.paths = {};\n  }\n\n  if (typeof viewport.label !== 'string') {\n    viewport.label = viewport.name || '';\n  }\n\n  const engineScriptsPath = config.env.engine_scripts || config.env.engine_scripts_default;\n  const isReference = config.isReference;\n\n  const VP_W = viewport.width || viewport.viewport.width;\n  const VP_H = viewport.height || viewport.viewport.height;\n\n  const ignoreHTTPSErrors = engineOptions.ignoreHTTPSErrors ? engineOptions.ignoreHTTPSErrors : true;\n  const storageState = engineOptions.storageState ? engineOptions.storageState : {};\n  const browserContext = await browser.newContext({ ignoreHTTPSErrors, storageState });\n  const page = await browserContext.newPage();\n\n  await page.setViewportSize({ width: VP_W, height: VP_H });\n  page.setDefaultNavigationTimeout(engineTools.getEngineOption(config, 'waitTimeout', TEST_TIMEOUT));\n\n  if (isReference) {\n    console.log(chalk.blue('CREATING NEW REFERENCE FILE'));\n  }\n\n  // --- set up console output and ready event ---\n  const readyEvent = scenario.readyEvent || config.readyEvent;\n  const readyTimeout = scenario.readyTimeout || config.readyTimeout || 30000;\n  let readyResolve, readyPromise, readyTimeoutTimer;\n  if (readyEvent) {\n    readyPromise = new Promise(resolve => {\n      readyResolve = resolve;\n      // fire the ready event after the readyTimeout\n      readyTimeoutTimer = setTimeout(() => {\n        console.error(chalk.red(`ReadyEvent not detected within readyTimeout limit. (${readyTimeout} ms)`), scenario.url);\n        resolve();\n      }, readyTimeout);\n    });\n  }\n\n  page.on('console', msg => {\n    for (let i = 0; i < msg.args().length; ++i) {\n      const line = msg.args()[i];\n      console.log(`Browser Console Log ${i}: ${line}`);\n      if (readyEvent && new RegExp(readyEvent).test(line)) {\n        readyResolve();\n      }\n    }\n  });\n\n  let result;\n  const playwrightCommands = async () => {\n    // --- BEFORE SCRIPT ---\n    const onBeforeScript = scenario.onBeforeScript || config.onBeforeScript;\n    if (onBeforeScript) {\n      const beforeScriptPath = path.resolve(engineScriptsPath, onBeforeScript);\n      if (fs.existsSync(beforeScriptPath)) {\n        await require(beforeScriptPath)(page, scenario, viewport, isReference, browserContext, config);\n      } else {\n        console.warn('WARNING: script not found: ' + beforeScriptPath);\n      }\n    }\n\n    //  --- OPEN URL ---\n    let url = scenario.url;\n    if (isReference && scenario.referenceUrl) {\n      url = scenario.referenceUrl;\n    }\n\n    const gotoParameters = scenario?.engineOptions?.gotoParameters || config?.engineOptions?.gotoParameters || {};\n    await page.goto(translateUrl(url), gotoParameters);\n\n    await injectBackstopTools(page);\n\n    //  --- WAIT FOR READY EVENT ---\n    if (readyEvent) {\n      await page.evaluate(`window._readyEvent = '${readyEvent}'`);\n\n      await readyPromise;\n\n      clearTimeout(readyTimeoutTimer);\n\n      await page.evaluate(_ => console.info('readyEvent ok'));\n    }\n\n    // --- WAIT FOR SELECTOR ---\n    if (scenario.readySelector) {\n      await page.waitForSelector(scenario.readySelector, {\n        timeout: readyTimeout\n      });\n    }\n\n    // --- DELAY ---\n    if (scenario.delay > 0) {\n      await page.waitForTimeout(scenario.delay);\n    }\n\n    // --- REMOVE SELECTORS ---\n    if (_.has(scenario, 'removeSelectors')) {\n      const removeSelectors = async () => {\n        return Promise.all(\n          scenario.removeSelectors.map(async (selector) => {\n            await page\n              .evaluate((sel) => {\n                document.querySelectorAll(sel).forEach(s => {\n                  s.style.cssText = 'display: none !important;';\n                  s.classList.add('__86d');\n                });\n              }, selector);\n          })\n        );\n      };\n\n      await removeSelectors();\n    }\n\n    //  --- ON READY SCRIPT ---\n    const onReadyScript = scenario.onReadyScript || config.onReadyScript;\n    if (onReadyScript) {\n      const readyScriptPath = path.resolve(engineScriptsPath, onReadyScript);\n      if (fs.existsSync(readyScriptPath)) {\n        await require(readyScriptPath)(page, scenario, viewport, isReference, browserContext, config);\n      } else {\n        console.warn('WARNING: script not found: ' + readyScriptPath);\n      }\n    }\n\n    // reinstall tools in case onReadyScript has loaded a new URL.\n    await injectBackstopTools(page);\n\n    // --- HIDE SELECTORS ---\n    if (_.has(scenario, 'hideSelectors')) {\n      const hideSelectors = async () => {\n        return Promise.all(\n          scenario.hideSelectors.map(async (selector) => {\n            await page\n              .evaluate((sel) => {\n                document.querySelectorAll(sel).forEach(s => {\n                  s.style.visibility = 'hidden';\n                });\n              }, selector);\n          })\n        );\n      };\n      await hideSelectors();\n    }\n\n    // --- HANDLE NO-SELECTORS ---\n    if (!_.has(scenario, 'selectors') || !scenario.selectors.length) {\n      scenario.selectors = [DOCUMENT_SELECTOR];\n    }\n\n    await page.evaluate(`window._selectorExpansion = '${scenario.selectorExpansion}'`);\n    await page.evaluate(`window._backstopSelectors = '${scenario.selectors}'`);\n    result = await page.evaluate(() => {\n      if (window._selectorExpansion.toString() === 'true') {\n        window._backstopSelectorsExp = window._backstopTools.expandSelectors(window._backstopSelectors);\n      } else {\n        window._backstopSelectorsExp = window._backstopSelectors;\n      }\n      if (!Array.isArray(window._backstopSelectorsExp)) {\n        window._backstopSelectorsExp = window._backstopSelectorsExp.split(',');\n      }\n      window._backstopSelectorsExpMap = window._backstopSelectorsExp.reduce((acc, selector) => {\n        acc[selector] = {\n          exists: window._backstopTools.exists(selector),\n          isVisible: window._backstopTools.isVisible(selector)\n        };\n        return acc;\n      }, {});\n      return {\n        backstopSelectorsExp: window._backstopSelectorsExp,\n        backstopSelectorsExpMap: window._backstopSelectorsExpMap\n      };\n    });\n  };\n\n  let error;\n  await playwrightCommands().catch(e => {\n    console.log(chalk.red(`Playwright encountered an error while running scenario \"${scenario.label}\"`));\n    console.log(chalk.red(e));\n    error = e;\n  });\n\n  let compareConfig;\n  if (!error) {\n    try {\n      compareConfig = await delegateSelectors(\n        page,\n        browserContext,\n        scenario,\n        viewport,\n        variantOrScenarioLabelSafe,\n        scenarioLabelSafe,\n        config,\n        result.backstopSelectorsExp,\n        result.backstopSelectorsExpMap\n      );\n    } catch (e) {\n      error = e;\n    }\n  } else {\n    await browserContext.close();\n  }\n\n  if (error) {\n    const testPair = engineTools.generateTestPair(config, scenario, viewport, variantOrScenarioLabelSafe, scenarioLabelSafe, 0, `${scenario.selectors.join('__')}`);\n    const filePath = config.isReference ? testPair.reference : testPair.test;\n    testPair.engineErrorMsg = error.message;\n\n    compareConfig = {\n      testPairs: [testPair]\n    };\n    await fs.copy(config.env.backstop + ERROR_SELECTOR_PATH, filePath);\n  }\n\n  return Promise.resolve(compareConfig);\n}\n\n// TODO: Should be in engineTools\nasync function delegateSelectors (\n  page,\n  browserContext,\n  scenario,\n  viewport,\n  variantOrScenarioLabelSafe,\n  scenarioLabelSafe,\n  config,\n  selectors,\n  selectorMap\n) {\n  const compareConfig = { testPairs: [] };\n  let captureDocument = false;\n  let captureViewport = false;\n  const captureList = [];\n  const captureJobs = [];\n\n  selectors.forEach(function (selector, selectorIndex) {\n    const testPair = engineTools.generateTestPair(config, scenario, viewport, variantOrScenarioLabelSafe, scenarioLabelSafe, selectorIndex, selector);\n    const filePath = config.isReference ? testPair.reference : testPair.test;\n\n    if (!config.isReference) {\n      compareConfig.testPairs.push(testPair);\n    }\n\n    selectorMap[selector].filePath = filePath;\n    if (selector === BODY_SELECTOR || selector === DOCUMENT_SELECTOR) {\n      captureDocument = selector;\n    } else if (selector === VIEWPORT_SELECTOR) {\n      captureViewport = selector;\n    } else {\n      captureList.push(selector);\n    }\n  });\n\n  if (captureDocument) {\n    captureJobs.push(function () { return captureScreenshot(page, browserContext, captureDocument, selectorMap, config, [], viewport); });\n  }\n  // TODO: push captureViewport into captureList (instead of calling captureScreenshot()) to improve perf.\n  if (captureViewport) {\n    captureJobs.push(function () { return captureScreenshot(page, browserContext, captureViewport, selectorMap, config, [], viewport); });\n  }\n  if (captureList.length) {\n    captureJobs.push(function () { return captureScreenshot(page, browserContext, null, selectorMap, config, captureList, viewport); });\n  }\n\n  return new Promise(function (resolve, reject) {\n    let job = null;\n    const errors = [];\n    const next = function () {\n      if (captureJobs.length === 0) {\n        if (errors.length === 0) {\n          resolve();\n        } else {\n          reject(errors);\n        }\n        return;\n      }\n      job = captureJobs.shift();\n      job().catch(function (e) {\n        console.log(e);\n        errors.push(e);\n      }).then(function () {\n        next();\n      });\n    };\n    next();\n  }).then(async () => {\n    console.log(chalk.green('x Close Browser'));\n    await browserContext.close();\n  }).catch(async (err) => {\n    console.log(chalk.red(err));\n    await browserContext.close();\n  }).then(_ => compareConfig);\n}\n\nasync function captureScreenshot (page, browserContext, selector, selectorMap, config, selectors, viewport) {\n  let filePath;\n  const fullPage = (selector === NOCLIP_SELECTOR || selector === DOCUMENT_SELECTOR);\n  if (selector) {\n    filePath = selectorMap[selector].filePath;\n    ensureDirectoryPath(filePath);\n\n    try {\n      await page.screenshot({\n        path: filePath,\n        fullPage\n      });\n    } catch (e) {\n      console.log(chalk.red('Error capturing..'), e);\n      return fs.copy(config.env.backstop + ERROR_SELECTOR_PATH, filePath);\n    }\n  } else {\n    // OTHER-SELECTOR screenshot\n    const selectorShot = async (s, path) => {\n      const el = await page.$(s);\n      if (el) {\n        const box = await el.boundingBox();\n        if (box) {\n          // Resize the viewport to screenshot elements outside of the viewport\n          if (config.useBoundingBoxViewportForSelectors !== false) {\n            const bodyHandle = await page.$('body');\n            const boundingBox = await bodyHandle.boundingBox();\n\n            await page.setViewportSize({\n              width: Math.max(viewport.width, Math.ceil(boundingBox.width)),\n              height: Math.max(viewport.height, Math.ceil(boundingBox.height))\n            });\n          }\n\n          const type = el;\n          const params = { captureBeyondViewport: false, path };\n\n          await type.screenshot(params);\n        } else {\n          console.log(chalk.yellow(`Element not visible for capturing: ${s}`));\n          return fs.copy(config.env.backstop + HIDDEN_SELECTOR_PATH, path);\n        }\n      } else {\n        console.log(chalk.magenta(`Element not found for capturing: ${s}`));\n        return fs.copy(config.env.backstop + SELECTOR_NOT_FOUND_PATH, path);\n      }\n    };\n\n    const selectorsShot = async () => {\n      for (let i = 0; i < selectors.length; i++) {\n        const selector = selectors[i];\n        filePath = selectorMap[selector].filePath;\n        ensureDirectoryPath(filePath);\n        try {\n          await selectorShot(selector, filePath);\n        } catch (e) {\n          console.log(chalk.red(`Error capturing Element ${selector}`), e);\n          return fs.copy(config.env.backstop + ERROR_SELECTOR_PATH, filePath);\n        }\n      }\n    };\n    await selectorsShot();\n  }\n}\n\n// handle relative file name\nfunction translateUrl (url) {\n  const RE = /^[./]/;\n  if (RE.test(url)) {\n    const fileUrl = 'file://' + path.join(process.cwd(), url);\n    console.log('Relative filename detected -- translating to ' + fileUrl);\n    return fileUrl;\n  } else {\n    return url;\n  }\n}\n"
  },
  {
    "path": "core/util/runPuppet.js",
    "content": "const puppeteer = require('puppeteer');\n\nconst fs = require('./fs');\nconst path = require('path');\nconst chalk = require('chalk');\nconst _ = require('lodash');\nconst ensureDirectoryPath = require('./ensureDirectoryPath');\nconst injectBackstopTools = require('../../capture/backstopTools.js');\nconst engineTools = require('./engineTools');\n\nconst MIN_CHROME_VERSION = 62;\nconst TEST_TIMEOUT = 60000;\nconst DEFAULT_FILENAME_TEMPLATE = '{configId}_{scenarioLabel}_{selectorIndex}_{selectorLabel}_{viewportIndex}_{viewportLabel}';\nconst DEFAULT_BITMAPS_TEST_DIR = 'bitmaps_test';\nconst DEFAULT_BITMAPS_REFERENCE_DIR = 'bitmaps_reference';\nconst SELECTOR_NOT_FOUND_PATH = '/capture/resources/notFound.png';\nconst HIDDEN_SELECTOR_PATH = '/capture/resources/notVisible.png';\nconst ERROR_SELECTOR_PATH = '/capture/resources/unexpectedErrorSm.png';\nconst BODY_SELECTOR = 'body';\nconst DOCUMENT_SELECTOR = 'document';\nconst NOCLIP_SELECTOR = 'body:noclip';\nconst VIEWPORT_SELECTOR = 'viewport';\n\nmodule.exports = function ({ scenario, viewport, config }) {\n  const scenarioLabelSafe = engineTools.makeSafe(scenario.label);\n  const variantOrScenarioLabelSafe = scenario._parent ? engineTools.makeSafe(scenario._parent.label) : scenarioLabelSafe;\n\n  config._bitmapsTestPath = config.paths.bitmaps_test || DEFAULT_BITMAPS_TEST_DIR;\n  config._bitmapsReferencePath = config.paths.bitmaps_reference || DEFAULT_BITMAPS_REFERENCE_DIR;\n  config._fileNameTemplate = config.fileNameTemplate || DEFAULT_FILENAME_TEMPLATE;\n  config._outputFileFormatSuffix = '.' + ((config.outputFormat && config.outputFormat.match(/jpg|jpeg/)) || 'png');\n  config._configId = config.id || engineTools.genHash(config.backstopConfigFileName);\n\n  const logger = {\n    logged: []\n  };\n  Object.assign(logger, {\n    error: loggerAction.bind(logger, 'error'),\n    warn: loggerAction.bind(logger, 'warn'),\n    log: loggerAction.bind(logger, 'log'),\n    info: loggerAction.bind(logger, 'info')\n  });\n\n  return processScenarioView(scenario, variantOrScenarioLabelSafe, scenarioLabelSafe, viewport, config, logger);\n};\n\nfunction loggerAction (action, color, message, ...rest) {\n  this.logged.push([action, color, message.toString(), JSON.stringify(rest)]);\n  console[action](chalk[color](message), ...rest);\n}\n\nasync function processScenarioView (scenario, variantOrScenarioLabelSafe, scenarioLabelSafe, viewport, config, logger) {\n  const { scenarioDefaults = {} } = config;\n\n  /**\n   * @type {Object}\n   * @description Spread `scenarioDefaults` into the scenario.\n   * @default `scenario`\n   */\n  scenario = {\n    ...scenarioDefaults,\n    ...scenario\n  };\n\n  if (!config.paths) {\n    config.paths = {};\n  }\n\n  if (typeof viewport.label !== 'string') {\n    viewport.label = viewport.name || '';\n  }\n\n  const engineScriptsPath = config.env.engine_scripts || config.env.engine_scripts_default;\n  const isReference = config.isReference;\n\n  const VP_W = viewport.width || viewport.viewport.width;\n  const VP_H = viewport.height || viewport.viewport.height;\n\n  const puppeteerArgs = Object.assign(\n    {},\n    {\n      ignoreHTTPSErrors: true,\n      headless: config.debugWindow ? false : config?.engineOptions?.headless || 'new'\n    },\n    config.engineOptions\n  );\n\n  const browser = await puppeteer.launch(puppeteerArgs);\n  const page = await browser.newPage();\n\n  await page.setViewport({ width: VP_W, height: VP_H });\n  page.setDefaultNavigationTimeout(engineTools.getEngineOption(config, 'waitTimeout', TEST_TIMEOUT));\n\n  if (isReference) {\n    logger.log('blue', 'CREATING NEW REFERENCE FILE');\n  }\n\n  // --- set up console output and ready event ---\n  const readyEvent = scenario.readyEvent || config.readyEvent;\n  const readyTimeout = scenario.readyTimeout || config.readyTimeout || 30000;\n  let readyResolve, readyPromise, readyTimeoutTimer;\n  if (readyEvent) {\n    readyPromise = new Promise(resolve => {\n      readyResolve = resolve;\n      // fire the ready event after the readyTimeout\n      readyTimeoutTimer = setTimeout(() => {\n        logger.error('red', `ReadyEvent not detected within readyTimeout limit. (${readyTimeout} ms)`, scenario.url);\n        resolve();\n      }, readyTimeout);\n    });\n  }\n\n  page.on('console', msg => {\n    for (let i = 0; i < msg.args().length; ++i) {\n      const line = msg.args()[i];\n      logger.log('reset', `Browser Console Log ${i}: ${line}`);\n      if (readyEvent && new RegExp(readyEvent).test(line)) {\n        readyResolve();\n      }\n    }\n  });\n\n  const chromeVersion = await page.evaluate(_ => {\n    const v = navigator.userAgent.match(/Chrom(e|ium)\\/([0-9]+)\\./);\n    return v ? parseInt(v[2], 10) : 0;\n  });\n\n  if (chromeVersion < MIN_CHROME_VERSION) {\n    logger.warn('reset', `***WARNING! CHROME VERSION ${MIN_CHROME_VERSION} OR GREATER IS REQUIRED. PLEASE UPDATE YOUR CHROME APP!***`);\n  }\n\n  let result;\n  const puppetCommands = async () => {\n    // --- BEFORE SCRIPT ---\n    const onBeforeScript = scenario.onBeforeScript || config.onBeforeScript;\n    if (onBeforeScript) {\n      const beforeScriptPath = path.resolve(engineScriptsPath, onBeforeScript);\n      if (fs.existsSync(beforeScriptPath)) {\n        await require(beforeScriptPath)(page, scenario, viewport, isReference, browser, config);\n      } else {\n        logger.warn('reset', 'WARNING: script not found: ' + beforeScriptPath);\n      }\n    }\n\n    //  --- OPEN URL ---\n    let url = scenario.url;\n    if (isReference && scenario.referenceUrl) {\n      url = scenario.referenceUrl;\n    }\n\n    const gotoParameters = scenario?.engineOptions?.gotoParameters || config?.engineOptions?.gotoParameters || {};\n    await page.goto(translateUrl(url, logger), gotoParameters);\n\n    await injectBackstopTools(page);\n\n    //  --- WAIT FOR READY EVENT ---\n    if (readyEvent) {\n      await page.evaluate(`window._readyEvent = '${readyEvent}'`);\n\n      await readyPromise;\n\n      clearTimeout(readyTimeoutTimer);\n\n      // can't use logger here -- this executes on the page\n      await page.evaluate(_ => console.info('readyEvent ok'));\n    }\n\n    // --- WAIT FOR SELECTOR ---\n    if (scenario.readySelector) {\n      await page.waitForSelector(scenario.readySelector, {\n        timeout: readyTimeout\n      });\n    }\n    //\n\n    // --- DELAY ---\n    if (scenario.delay > 0) {\n      await new Promise(resolve => {\n        setTimeout(resolve, scenario.delay);\n      });\n    }\n\n    // --- REMOVE SELECTORS ---\n    if (_.has(scenario, 'removeSelectors')) {\n      const removeSelectors = async () => {\n        return Promise.all(\n          scenario.removeSelectors.map(async (selector) => {\n            await page\n              .evaluate((sel) => {\n                document.querySelectorAll(sel).forEach(s => {\n                  s.style.cssText = 'display: none !important;';\n                  s.classList.add('__86d');\n                });\n              }, selector);\n          })\n        );\n      };\n\n      await removeSelectors();\n    }\n\n    //  --- ON READY SCRIPT ---\n    const onReadyScript = scenario.onReadyScript || config.onReadyScript;\n    if (onReadyScript) {\n      const readyScriptPath = path.resolve(engineScriptsPath, onReadyScript);\n      if (fs.existsSync(readyScriptPath)) {\n        await require(readyScriptPath)(page, scenario, viewport, isReference, browser, config);\n      } else {\n        logger.warn('reset', 'WARNING: script not found: ' + readyScriptPath);\n      }\n    }\n\n    // reinstall tools in case onReadyScript has loaded a new URL.\n    await injectBackstopTools(page);\n\n    // --- HIDE SELECTORS ---\n    if (_.has(scenario, 'hideSelectors')) {\n      const hideSelectors = async () => {\n        return Promise.all(\n          scenario.hideSelectors.map(async (selector) => {\n            await page\n              .evaluate((sel) => {\n                document.querySelectorAll(sel).forEach(s => {\n                  s.style.visibility = 'hidden';\n                });\n              }, selector);\n          })\n        );\n      };\n      await hideSelectors();\n    }\n\n    // --- HANDLE NO-SELECTORS ---\n    if (!_.has(scenario, 'selectors') || !scenario.selectors.length) {\n      scenario.selectors = [DOCUMENT_SELECTOR];\n    }\n\n    await page.evaluate(`window._selectorExpansion = '${scenario.selectorExpansion}'`);\n    await page.evaluate(`window._backstopSelectors = '${scenario.selectors}'`);\n    result = await page.evaluate(() => {\n      if (window._selectorExpansion.toString() === 'true') {\n        window._backstopSelectorsExp = window._backstopTools.expandSelectors(window._backstopSelectors);\n      } else {\n        window._backstopSelectorsExp = window._backstopSelectors;\n      }\n      if (!Array.isArray(window._backstopSelectorsExp)) {\n        window._backstopSelectorsExp = window._backstopSelectorsExp.split(',');\n      }\n      window._backstopSelectorsExpMap = window._backstopSelectorsExp.reduce((acc, selector) => {\n        acc[selector] = {\n          exists: window._backstopTools.exists(selector),\n          isVisible: window._backstopTools.isVisible(selector)\n        };\n        return acc;\n      }, {});\n      return {\n        backstopSelectorsExp: window._backstopSelectorsExp,\n        backstopSelectorsExpMap: window._backstopSelectorsExpMap\n      };\n    });\n  };\n\n  let error;\n  await puppetCommands().catch(e => {\n    logger.log('red', `Puppeteer encountered an error while running scenario \"${scenario.label}\"`);\n    logger.log('red', e);\n    error = e;\n  });\n\n  let compareConfig;\n  if (!error) {\n    try {\n      compareConfig = await delegateSelectors(\n        page,\n        browser,\n        scenario,\n        viewport,\n        variantOrScenarioLabelSafe,\n        scenarioLabelSafe,\n        config,\n        result.backstopSelectorsExp,\n        result.backstopSelectorsExpMap,\n        logger\n      );\n    } catch (e) {\n      error = e;\n    }\n  } else {\n    await browser.close();\n  }\n\n  if (error) {\n    const testPair = engineTools.generateTestPair(config, scenario, viewport, variantOrScenarioLabelSafe, scenarioLabelSafe, 0, `${scenario.selectors.join('__')}`);\n    const filePath = config.isReference ? testPair.reference : testPair.test;\n    const logFilePath = config.isReference ? testPair.referenceLog : testPair.testLog;\n    testPair.engineErrorMsg = error.message;\n\n    compareConfig = {\n      testPairs: [testPair]\n    };\n    await writeScenarioLogs(config, logFilePath, logger);\n    await fs.copy(config.env.backstop + ERROR_SELECTOR_PATH, filePath);\n  }\n\n  return Promise.resolve(compareConfig);\n}\n\n// TODO: Should be in engineTools\nasync function delegateSelectors (\n  page,\n  browser,\n  scenario,\n  viewport,\n  variantOrScenarioLabelSafe,\n  scenarioLabelSafe,\n  config,\n  selectors,\n  selectorMap,\n  logger\n) {\n  const compareConfig = { testPairs: [] };\n  let captureDocument = false;\n  let captureViewport = false;\n  const captureList = [];\n  const captureJobs = [];\n\n  selectors.forEach(function (selector, selectorIndex) {\n    const testPair = engineTools.generateTestPair(config, scenario, viewport, variantOrScenarioLabelSafe, scenarioLabelSafe, selectorIndex, selector);\n    const filePath = config.isReference ? testPair.reference : testPair.test;\n    const logFilePath = config.isReference ? testPair.referenceLog : testPair.testLog;\n\n    if (!config.isReference) {\n      compareConfig.testPairs.push(testPair);\n    }\n\n    selectorMap[selector].filePath = filePath;\n    selectorMap[selector].logFilePath = logFilePath;\n    if (selector === BODY_SELECTOR || selector === DOCUMENT_SELECTOR) {\n      captureDocument = selector;\n    } else if (selector === VIEWPORT_SELECTOR) {\n      captureViewport = selector;\n    } else {\n      captureList.push(selector);\n    }\n  });\n\n  if (captureDocument) {\n    captureJobs.push(function () { return captureScreenshot(page, browser, captureDocument, selectorMap, config, [], viewport, logger); });\n  }\n  // TODO: push captureViewport into captureList (instead of calling captureScreenshot()) to improve perf.\n  if (captureViewport) {\n    captureJobs.push(function () { return captureScreenshot(page, browser, captureViewport, selectorMap, config, [], viewport, logger); });\n  }\n  if (captureList.length) {\n    captureJobs.push(function () { return captureScreenshot(page, browser, null, selectorMap, config, captureList, viewport, logger); });\n  }\n\n  return new Promise(function (resolve, reject) {\n    let job = null;\n    const errors = [];\n    const next = function () {\n      if (captureJobs.length === 0) {\n        if (errors.length === 0) {\n          resolve();\n        } else {\n          reject(errors);\n        }\n        return;\n      }\n      job = captureJobs.shift();\n      job().catch(function (e) {\n        logger.log('reset', e);\n        errors.push(e);\n      }).then(function () {\n        next();\n      });\n    };\n    next();\n  }).then(async () => {\n    logger.log('green', 'x Close Browser');\n    await browser.close();\n  }).catch(async (err) => {\n    logger.log('red', err);\n    await browser.close();\n  }).then(_ => compareConfig);\n}\n\nasync function captureScreenshot (page, browser, selector, selectorMap, config, selectors, viewport, logger) {\n  let filePath, logFilePath;\n  const fullPage = (selector === NOCLIP_SELECTOR || selector === DOCUMENT_SELECTOR);\n  if (selector) {\n    filePath = selectorMap[selector].filePath;\n    logFilePath = selectorMap[selector].logFilePath;\n    ensureDirectoryPath(filePath); // logs in same dir\n\n    try {\n      await page.screenshot({\n        path: filePath,\n        fullPage\n      });\n      await writeScenarioLogs(config, logFilePath, logger);\n    } catch (e) {\n      logger.log('red', 'Error capturing..', e);\n      await writeScenarioLogs(config, logFilePath, logger);\n      return fs.copy(config.env.backstop + ERROR_SELECTOR_PATH, filePath);\n    }\n  } else {\n    // OTHER-SELECTOR screenshot\n    const selectorShot = async (s, path, logFilePath) => {\n      const el = await page.$(s);\n      if (el) {\n        const box = await el.boundingBox();\n        if (box) {\n          // Resize the viewport to screenshot elements outside of the viewport\n          if (config.useBoundingBoxViewportForSelectors !== false) {\n            const bodyHandle = await page.$('body');\n            const boundingBox = await bodyHandle.boundingBox();\n\n            await page.setViewport({\n              width: Math.max(viewport.width, Math.ceil(boundingBox.width)),\n              height: Math.max(viewport.height, Math.ceil(boundingBox.height))\n            });\n          }\n\n          const type = config.puppeteerOffscreenCaptureFix ? page : el;\n          const params = config.puppeteerOffscreenCaptureFix\n            ? {\n                captureBeyondViewport: false,\n                path,\n                clip: box\n              }\n            : { captureBeyondViewport: false, path };\n\n          await type.screenshot(params);\n          await writeScenarioLogs(config, logFilePath, logger);\n        } else {\n          logger.log('yellow', `Element not visible for capturing: ${s}`);\n          await writeScenarioLogs(config, logFilePath, logger);\n          return fs.copy(config.env.backstop + HIDDEN_SELECTOR_PATH, path);\n        }\n      } else {\n        logger.log('magenta', `Element not found for capturing: ${s}`);\n        await writeScenarioLogs(config, logFilePath, logger);\n        return fs.copy(config.env.backstop + SELECTOR_NOT_FOUND_PATH, path);\n      }\n    };\n\n    const selectorsShot = async () => {\n      for (let i = 0; i < selectors.length; i++) {\n        const selector = selectors[i];\n        filePath = selectorMap[selector].filePath;\n        logFilePath = selectorMap[selector].logFilePath;\n        ensureDirectoryPath(filePath);\n        try {\n          await selectorShot(selector, filePath, logFilePath);\n        } catch (e) {\n          logger.log('red', `Error capturing Element ${selector}`, e);\n          await writeScenarioLogs(config, logFilePath, logger);\n          return fs.copy(config.env.backstop + ERROR_SELECTOR_PATH, filePath);\n        }\n      }\n    };\n    await selectorsShot();\n  }\n}\n\n// handle relative file name\nfunction translateUrl (url, logger) {\n  const RE = /^[./]/;\n  if (RE.test(url)) {\n    const fileUrl = 'file://' + path.join(process.cwd(), url);\n    logger.log('reset', 'Relative filename detected -- translating to ' + fileUrl);\n    return fileUrl;\n  } else {\n    return url;\n  }\n}\n\nfunction writeScenarioLogs (config, logFilePath, logger) {\n  if (config.scenarioLogsInReports) {\n    return fs.writeFile(logFilePath, JSON.stringify(logger.logged));\n  } else {\n    return Promise.resolve(true);\n  }\n}\n"
  },
  {
    "path": "core/util/streamToPromise.js",
    "content": "module.exports = function onStreamEnd (stream, result) {\n  return new Promise(function (resolve, reject) {\n    if (stream.writable) {\n      stream.on('finish', function () {\n        resolve(result);\n      });\n    }\n\n    if (stream.readable) {\n      stream.on('end', function () {\n        resolve(result);\n      });\n    }\n\n    stream.on('close', function () {\n      resolve(result);\n    });\n\n    stream.on('error', function (error) {\n      reject(error);\n    });\n  });\n};\n"
  },
  {
    "path": "docker/Dockerfile",
    "content": "# use bullseye node base, as debian does provide a chromium for arm64 and amd64 flavour\nFROM node:20-bullseye\n\nARG BACKSTOPJS_VERSION\nARG DEBIAN_FRONTEND=noninteractive\n\nENV BACKSTOPJS_VERSION=$BACKSTOPJS_VERSION\n\n# install chromium and its deps\nRUN apt-get -qq update >/dev/null && apt-get install -qq \\\n  fonts-liberation \\\n  # cyrillic\n  xfonts-cyrillic \\\n  # chinese\n  xfonts-wqy fonts-wqy-zenhei fonts-arphic-ukai fonts-arphic-uming \\\n  # japanese\n  fonts-ipafont-mincho fonts-ipafont-gothic fonts-ipafont fonts-vlgothic \\\n  # korean\n  fonts-unfonts-core fonts-unfonts-extra \\\n  # cjk + emoji font\n  fonts-noto-cjk fonts-noto-color-emoji \\\n  # chromium\n  chromium >/dev/null && apt-get -qq clean >/dev/null && rm -rf /var/lib/apt/lists/*\n\n# skip download, we already have it installed\nENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true\n# playwright shared browser path (does install a 2nd chromium - can't be skipped)\nENV PLAYWRIGHT_BROWSERS_PATH=/opt/pw-browsers\nRUN mkdir ${PLAYWRIGHT_BROWSERS_PATH} && npm install -g --unsafe-perm=true --allow-root backstopjs@${BACKSTOPJS_VERSION} && npx --yes --verbose --foreground-scripts playwright install --with-deps\n\n# set executable path\nENV PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium\nWORKDIR /src\n\nENTRYPOINT [\"backstop\"]\n"
  },
  {
    "path": "docker/README.md",
    "content": "# BackstopJS Docker Image\n\nA self-contained Docker image to run [BackstopJS](https://github.com/garris/BackstopJS) with no external dependencies.\n\n[Visual Regression Testing with BackstopJS in a Docker container](https://blog.docksal.io/visual-regression-testing-with-backstopjs-in-a-docker-container-dfd1b9ae8582)\n\nFeatures:\n\n- [BackstopJS 3.x](https://github.com/garris/BackstopJS)\n- [Chrome-headless](https://www.google.com/chrome/browser/canary.html)\n\n\n## Versions\n\n- `backstopjs/backstopjs` - BackstopJS v3 with Chrome Headless support\n\n\n## Usage\n\nUse this image as if you were using a binary.  \nWorking directory is expected to be mounted at `/src` in the container.\n\n```\n$ docker run --rm -v $(pwd):/src backstopjs/backstopjs --version\nBackstopJS v3.x.x\n\n# On Windows use:\n$(pwd -W)\n```\n\nYou can also add a shell alias (in `.bashrc`, `.zshrc`, etc.) for convenience.\n\n```\nalias backstop='docker run --rm -v $(pwd):/src backstopjs/backstopjs \"$@\"'\n```\n\nRestart your shell or open a new one, then\n\n```\n$ backstopjs --version\nBackstopJS v3.x.x\n```\n\n\n## Sample test\n\n```\ndocker run --rm -v $(pwd):/src backstopjs/backstopjs init\ndocker run --rm -v $(pwd):/src backstopjs/backstopjs reference\ndocker run --rm -v $(pwd):/src backstopjs/backstopjs test\n```\n\n\n## Browser engines\n\nBy default BackstopJS is using Headless Chrome to take screenshots.\n\nChrome is pre-installed in the container.\n\n\n## Limitations\n\n`backstop openReport` is not (yet) supported.\n\n\n## Debugging\n\nThe following command will start a bash session in the container.\n\n```\ndocker run --rm -v $(pwd):/src -it --entrypoint=bash backstopjs/backstopjs\n```\n\n\n## Jenkins Guide\nYou could get a Jenkins Guide here: [Jenkins Guide](../examples/Jenkins)\n\n## MultiArch Build\n\nYour docker setup should have buildx support to be able to build that.\n\n```\ndocker buildx create --name mybuilder --use --bootstrap\n```\n\nBuild + Push:\n\n```\nexport BACKSTOPJS_VERSION=6.1.4\ndocker buildx build --push --build-arg BACKSTOPJS_VERSION --platform linux/amd64,linux/arm64 --tag backstopjs/backstopjs:$BACKSTOPJS_VERSION docker\n\n```\n\n### local load to your registry\n\nbuild + load it to your registry (load does not support more than 1 platform, push does https://github.com/docker/buildx/issues/59):\n\nAMD64:\n\n```\nexport BACKSTOPJS_VERSION=6.1.4\ndocker buildx build --build-arg BACKSTOPJS_VERSION --platform linux/amd64 --load --tag backstopjs/backstopjs:$BACKSTOPJS_VERSION docker\n```\n\nARM64:\n\n```\nexport BACKSTOPJS_VERSION=6.1.4\ndocker buildx build --build-arg BACKSTOPJS_VERSION --platform linux/arm64 --load --tag backstopjs/backstopjs:$BACKSTOPJS_VERSION docker\n```\n\n"
  },
  {
    "path": "docker/burn-docker-builder.sh",
    "content": "#!/usr/bin/env bash\necho starting a fire\nset -e\nset -o errexit\n\ndocker stop `docker ps -qa` > /dev/null 2>&1; ## Stop all running containers\ndocker buildx stop; ## Stop the buildx builder\ndocker system prune --all --force --volumes; ## Remove all volumes, images, and containers\ndocker buildx rm --all-inactive --force; ## Remove all buildx builders\ndocker buildx prune --all --force; ## Prune buildx builder caches\n\necho builders are burned\n"
  },
  {
    "path": "docker/hooks/build",
    "content": "#!/bin/bash\nBACKSTOPJS_VERSION=$(grep -Po '(?<=\"version\": \")[^\"]*' $(dirname \"$0\")/../../package.json)\n\ndocker build --build-arg BACKSTOPJS_VERSION=$BACKSTOPJS_VERSION -t $IMAGE_NAME .\n"
  },
  {
    "path": "docker/hooks/post_push",
    "content": "#!/bin/bash\nBACKSTOPJS_VERSION=$(grep -Po '(?<=\"version\": \")[^\"]*' $(dirname \"$0\")/../../package.json)\n\ndocker tag $IMAGE_NAME $DOCKER_REPO:$BACKSTOPJS_VERSION\ndocker push $DOCKER_REPO:$BACKSTOPJS_VERSION\n\ndocker tag $IMAGE_NAME $DOCKER_REPO:latest\ndocker push $DOCKER_REPO:latest\n"
  },
  {
    "path": "docker/xvfb-run",
    "content": "#!/bin/sh\n\n# $Id: xvfb-run 2027 2004-11-16 14:54:16Z branden $\n\n# This script starts an instance of Xvfb, the \"fake\" X server, runs a command\n# with that server available, and kills the X server when done.  The return\n# value of the command becomes the return value of this script, except in cases\n# where this script encounters an error.\n#\n# If anyone is using this to build a Debian package, make sure the package\n# Build-Depends on xvfb, xbase-clients, and xfonts-base.\n\nset -e\n\nPROGNAME=xvfb-run\nSERVERNUM=99\nAUTHFILE=\nERRORFILE=/dev/null\nSTARTWAIT=3\nSCREEN_WIDTH=${SCREEN_WIDTH:-'1920'}\nSCREEN_HEIGHT=${SCREEN_HEIGHT:-'1080'}\nXVFBARGS=\"-screen 0, ${SCREEN_WIDTH}x${SCREEN_HEIGHT}x24\"\nLISTENTCP=\"-nolisten tcp\"\nXAUTHPROTO=.\n\necho \"Using screen size ${SCREEN_WIDTH}x${SCREEN_HEIGHT}\"\n# Query the terminal to establish a default number of columns to use for\n# displaying messages to the user.  This is used only as a fallback in the event\n# the COLUMNS variable is not set.  ($COLUMNS can react to SIGWINCH while the\n# script is running, and this cannot, only being calculated once.)\nDEFCOLUMNS=$(stty size 2>/dev/null | awk '{print $2}') || true\nif ! expr \"$DEFCOLUMNS\" : \"[[:digit:]]\\+$\" >/dev/null 2>&1; then\n    DEFCOLUMNS=80\nfi\n\n# Display a message, wrapping lines at the terminal width.\nmessage () {\n    echo \"$PROGNAME: $*\" | fmt -t -w ${COLUMNS:-$DEFCOLUMNS}\n}\n\n# Display an error message.\nerror () {\n    message \"error: $*\" >&2\n}\n\n# Display a usage message.\nusage () {\n    if [ -n \"$*\" ]; then\n        message \"usage error: $*\"\n    fi\n    cat <<EOF\nUsage: $PROGNAME [OPTION ...] COMMAND\nRun COMMAND (usually an X client) in a virtual X server environment.\nOptions:\n-a        --auto-servernum          try to get a free server number, starting at\n                                    --server-num\n-e FILE   --error-file=FILE         file used to store xauth errors and Xvfb\n                                    output (default: $ERRORFILE)\n-f FILE   --auth-file=FILE          file used to store auth cookie\n                                    (default: ./.Xauthority)\n-h        --help                    display this usage message and exit\n-n NUM    --server-num=NUM          server number to use (default: $SERVERNUM)\n-l        --listen-tcp              enable TCP port listening in the X server\n-p PROTO  --xauth-protocol=PROTO    X authority protocol name to use\n                                    (default: xauth command's default)\n-s ARGS   --server-args=ARGS        arguments (other than server number and\n                                    \"-nolisten tcp\") to pass to the Xvfb server\n                                    (default: \"$XVFBARGS\")\n-w DELAY  --wait=DELAY              delay in seconds to wait for Xvfb to start\n                                    before running COMMAND (default: $STARTWAIT)\nEOF\n}\n\n# Find a free server number by looking at .X*-lock files in /tmp.\nfind_free_servernum() {\n    # Sadly, the \"local\" keyword is not POSIX.  Leave the next line commented in\n    # the hope Debian Policy eventually changes to allow it in /bin/sh scripts\n    # anyway.\n    #local i\n\n    i=$SERVERNUM\n    while [ -f /tmp/.X$i-lock ]; do\n        i=$(($i + 1))\n    done\n    echo $i\n}\n\n# Clean up files\nclean_up() {\n    if [ -e \"$AUTHFILE\" ]; then\n        XAUTHORITY=$AUTHFILE xauth remove \":$SERVERNUM\" >>\"$ERRORFILE\" 2>&1\n    fi\n    if [ -n \"$XVFB_RUN_TMPDIR\" ]; then\n        if ! rm -r \"$XVFB_RUN_TMPDIR\"; then\n            error \"problem while cleaning up temporary directory\"\n            exit 5\n        fi\n    fi\n}\n\n# Parse the command line.\nARGS=$(getopt --options +ae:f:hn:lp:s:w: \\\n       --long auto-servernum,error-file:,auth-file:,help,server-num:,listen-tcp,xauth-protocol:,server-args:,wait: \\\n       --name \"$PROGNAME\" -- \"$@\")\nGETOPT_STATUS=$?\n\nif [ $GETOPT_STATUS -ne 0 ]; then\n    error \"internal error; getopt exited with status $GETOPT_STATUS\"\n    exit 6\nfi\n\neval set -- \"$ARGS\"\n\nwhile :; do\n    case \"$1\" in\n        -a|--auto-servernum) SERVERNUM=$(find_free_servernum); AUTONUM=\"yes\" ;;\n        -e|--error-file) ERRORFILE=\"$2\"; shift ;;\n        -f|--auth-file) AUTHFILE=\"$2\"; shift ;;\n        -h|--help) SHOWHELP=\"yes\" ;;\n        -n|--server-num) SERVERNUM=\"$2\"; shift ;;\n        -l|--listen-tcp) LISTENTCP=\"\" ;;\n        -p|--xauth-protocol) XAUTHPROTO=\"$2\"; shift ;;\n        -s|--server-args) XVFBARGS=\"$2\"; shift ;;\n        -w|--wait) STARTWAIT=\"$2\"; shift ;;\n        --) shift; break ;;\n        *) error \"internal error; getopt permitted \\\"$1\\\" unexpectedly\"\n           exit 6\n           ;;\n    esac\n    shift\ndone\n\nif [ \"$SHOWHELP\" ]; then\n    usage\n    exit 0\nfi\n\nif [ -z \"$*\" ]; then\n    usage \"need a command to run\" >&2\n    exit 2\nfi\n\nif ! which xauth >/dev/null; then\n    error \"xauth command not found\"\n    exit 3\nfi\n\n# tidy up after ourselves\ntrap clean_up EXIT\n\n# If the user did not specify an X authorization file to use, set up a temporary\n# directory to house one.\nif [ -z \"$AUTHFILE\" ]; then\n    XVFB_RUN_TMPDIR=\"$(mktemp -d -t $PROGNAME.XXXXXX)\"\n    # Create empty file to avoid xauth warning\n    AUTHFILE=$(touch \"$XVFB_RUN_TMPDIR/Xauthority\")\nfi\n\n# Start Xvfb.\nMCOOKIE=$(mcookie)\ntries=10\nwhile [ $tries -gt 0 ]; do\n    tries=$(( $tries - 1 ))\n    XAUTHORITY=$AUTHFILE xauth source - << EOF >>\"$ERRORFILE\" 2>&1\nadd :$SERVERNUM $XAUTHPROTO $MCOOKIE\nEOF\n    XAUTHORITY=$AUTHFILE Xvfb \":$SERVERNUM\" $XVFBARGS $LISTENTCP >>\"$ERRORFILE\" 2>&1 &\n    XVFBPID=$!\n\n    sleep \"$STARTWAIT\"\n    if kill -0 $XVFBPID 2>/dev/null; then\n        break\n    elif [ -n \"$AUTONUM\" ]; then\n        # The display is in use so try another one (if '-a' was specified).\n        SERVERNUM=$((SERVERNUM + 1))\n        SERVERNUM=$(find_free_servernum)\n        continue\n    fi\n    error \"Xvfb failed to start\" >&2\n    exit 1\ndone\n\n# Start the command and save its exit status.\nset +e\nDISPLAY=:$SERVERNUM XAUTHORITY=$AUTHFILE \"$@\" 2>&1\nRETVAL=$?\nset -e\n\n# Kill Xvfb now that the command has exited.\nkill $XVFBPID\n\n# Return the executed command's exit status.\nexit $RETVAL\n\n# vim:set ai et sts=4 sw=4 tw=80:"
  },
  {
    "path": "examples/Jenkins/README.md",
    "content": "# Jenkins Integration\n\nHere, we use the DooD (Docker-outside-of-Docker) to run the jenkins.\n\nFor more info about DooD, we **HIGHLY** suggest to read [the blog](https://container-solutions.com/running-docker-in-jenkins-in-docker/) first.\n> Here, what we do more is we fix the \"sudo\" security issue\n\n## Content\n- [Pre Conditions](#pre-conditions)\n- [Jenkins Master](#jenkins-master)\n- [Jenkins Slave](#jenkins-slave)\n- [Run BackstopJS](#run-backstopjs)\n\n## Pre Conditions\n1. Download docker bin file to the **HOST Machine**, from here: [Linux](https://download.docker.com/linux/static/stable/x86_64/), [Mac](https://download.docker.com/mac/static/stable/x86_64/)\n2. Download & Install docker to the **HOST Machine**: [Linux](https://docs.docker.com/install/linux/docker-ce/centos/), [Mac](https://download.docker.com/mac/stable/Docker.dmg)\n\n## Jenkins Master\n1. Pull the latest Jenkins LTS: \n   ```\n   docker pull jenkins/jenkins:lts\n   ```\n\n2. Use --group-add to give jenkins user to have permission to run docker\n   \n   Run the command to see which group id the container automatically created when we map the **-v /var/run/docker.sock:/var/run/docker.sock**\n   \n   > Note: If the OS is **MAC**, change ownership of the /var/run/docker.sock to your current user: ``sudo chown `id -u`:staff /var/run/docker.sock``\n   \n   ```\n   docker run \\\n        -ti \\\n        -v /var/run/docker.sock:/var/run/docker.sock \\\n        --rm \\\n        jenkins/jenkins:lts bash -c \"ls -l /var/run/docker.sock\"\n   ```\n   \n   You will get the result as bellow, mark down the group id. Normally speaking, the id should be 999 or 998.\n\n   <sub>srw-rw---- 1 root **999** 0 Jun 16 19:18 /var/run/docker.sock</sub>\n\n3. Run Jenkins - Master\n   \n   - For more info about how to use the jenkins/jenkins:lts, please refer to: [https://github.com/jenkinsci/docker/blob/master/README.md](https://github.com/jenkinsci/docker/blob/master/README.md)\n\n   - Here, create a '~/jenkins_home' docker volume on the HOST machine, that will survive the container stop/restart/deletion.\n   \n   - Get the group-id from step 2, for example 999\n   \n   ``` \n   docker run \\\n       -p 8080:8080 \\\n       -p 50000:50000 \\\n       -v ~/jenkins_home:/var/jenkins_home \\\n       -v /var/run/docker.sock:/var/run/docker.sock \\\n       -v ~/Downloads/docker/docker:/usr/bin/docker \\\n       --name jenkins2 \\\n       -d \\\n       --rm \\\n       --group-add 999 \\\n       jenkins/jenkins:lts\n   ```\n   \n4. Open [http://127.0.0.1:8080/](http://127.0.0.1:8080/), and follow the jenkins guid to finish the installation.\n5. Install Additional Plugins in [http://127.0.0.1:8080/pluginManager/available](http://127.0.0.1:8080/pluginManager/available) with \"Install without restart\":\n   - HTML Publisher\n   - Post build task\n6. Go to [http://127.0.0.1:8080/script](http://127.0.0.1:8080/script), and execute the command to avoid blank html report issue.\n    ```\n    System.setProperty(\"hudson.model.DirectoryBrowserSupport.CSP\",\" \")\n    ```\n7. Create a Slave node\n   - Go to [http://127.0.0.1:8080/computer/](http://127.0.0.1:8080/computer/)\n   - Click \"New Node\", enter \"Slave 1\" to set as following: \n     ![Screenshot](Attachments/Jenkins_NewNodeName.png)\n   - Set \"Remote root directory\" to \"/home/jenkins\", and set \"Launch agent via Java Web Start\" as following:\n     ![Screenshot](Attachments/Jenkins_ConfigNewNode.png)\n   - Click Save, and mark the secret for later use as following:\n     ![Screenshot](Attachments/Jenkins_AgentSecret.png)\n    \n## Jenkins Slave\n1. Pull the latest Jenkins jnlp-slave: \n   ```\n   docker pull jenkins/jnlp-slave\n   ```\n\n2. Use --group-add to give jenkins user to have permission to run docker\n   \n   Run the command to see which group id the container automatically created when we map the **-v /var/run/docker.sock:/var/run/docker.sock**\n   \n   > Note: If the OS is **MAC**, change ownership of the /var/run/docker.sock to your current user: ``sudo chown `id -u`:staff /var/run/docker.sock``\n   \n   ```\n   docker run \\\n        -ti \\\n        -v /var/run/docker.sock:/var/run/docker.sock \\\n        --rm \\\n        jenkins/jenkins:lts bash -c \"ls -l /var/run/docker.sock\"\n   ```\n   \n   You will get the result as bellow, mark down the group id. Normally speaking, the id should be 999 or 998.\n\n   <sub>srw-rw---- 1 root **999** 0 Jun 16 19:18 /var/run/docker.sock</sub>\n   \n3. Start container for agent:\n   - For more info about how to use jenkins/jnlp-slave, please refer to: [https://github.com/jenkinsci/docker-jnlp-slave](https://github.com/jenkinsci/docker-jnlp-slave)\n   \n   - The master url should be **172.17.0.1:8080** between the docker containers\n   \n   - Get the group-id from step 2, for example 999\n   \n   ```\n   docker run \\\n        -v ~/jenkins_home:/home/jenkins \\\n        -v /var/run/docker.sock:/var/run/docker.sock \\\n        -v YOUR_DOCKER_BIN_FILE:/usr/bin/docker \\\n        --name jenkins_agent_1 \\\n        -d \\\n        --rm \\\n        --group-add 999 \\\n        jenkins/jnlp-slave -url http://172.17.0.1:8080 YOUR_SECRET Slave1\n   ```\n   For example:\n   ```\n   docker run \\\n        -v ~/jenkins_home:/home/jenkins \\\n        -v /var/run/docker.sock:/var/run/docker.sock \\\n        -v ~/Downloads/docker/docker:/usr/bin/docker \\\n        --name jenkins_agent_1 \\\n        -d \\\n        --rm \\\n        --group-add 999 \\\n        jenkins/jnlp-slave -url http://172.17.0.1:8080 127b664578e071d8c5f78bc1f7c43500d1acefc043bff3572f880919a4595010 Slave1\n   ```\n4. You could see your agent working as below.\n   ![Screenshot](Attachments/Jenkins_SlaveReady.png)\n\n## Run BackstopJS\n1. Go to [http://127.0.0.1:8080/newJob](http://127.0.0.1:8080/newJob), and select a \"Freestyle project\" to create a job\n   ![Screenshot](Attachments/Jenkins_BackstopJob.png)\n2. Configure\n   - General: Set a project name **Backstop**, and set \"Restrict where this project can be run\" to \"visual-regression-testing\"\n     ![Screenshot](Attachments/Jenkins_General.png)\n   - Source Code Management: For a instance, you could clone or folk [https://github.com/garris/BackstopJS](https://github.com/garris/BackstopJS), and then set as following with your own git credential\n     ![Screenshot](Attachments/Jenkins_SourceControlManagement.png)\n   - Build Triggers: For examples, \n     1) You could run daily test by setting: **Build periodically** to **H 08 * * 1-5**\n     2) You could Select **Poll SCM** and write \"H/5 * * * *\". This tells Jenkins to “ask” your repository every 5 minutes if there are changes. If there are any, trigger the job.\n   - Build: Add **Execute Shell**, and add following for a sample.\n     \n     **IMPORTANT**: Because we use DooD, you need to mount volumes to the container by using --volumes-from \\<container name\\> to make user the data is there.\n       \n     ```\n     set +x\n     docker pull backstopjs/backstopjs:latest\n     docker run \\\n         --workdir ${WORKSPACE} \\\n         --volumes-from jenkins_agent_1 \\\n         --rm \\\n         --shm-size 2048m \\\n         --name backstopjs \\\n         --entrypoint=sh \\\n         backstopjs/backstopjs:latest \\\n         -c \"cd examples/Jenkins/Sample/; backstop test\"\n         \n     # Debug Purpose: It will keep container there until job aborted\n     # docker run \\\n     #    --workdir ${WORKSPACE} \\\n     #    --volumes-from jenkins_agent_1 \\\n     #    --rm \\\n     #    --shm-size 2048m \\\n     #    --name backstopjs \\\n     #    --entrypoint=sh \\\n     #    backstopjs/backstopjs:latest \\\n     #    -c \"cd examples/Jenkins/Sample/; while true; do sleep 1; done\"\n     ```\n   - Post-build Actions: \n     1) Add **Post build task** to delete the not exiting container\n        ```\n        if [ \"$(docker ps -q -f name=backstopjs)\" ]; then\n            docker rm -f backstopjs\n        fi\n        ```\n        ![Screenshot](Attachments/Jenkins_PostBuildActions_DeleteContainer.png)\n        \n     2) Add **Post build task** to avoid JUnite Test Report issue \"Test reports were found but none of them are new. Did tests run?\"\n        ``` \n        cd docker/Jenkins/Sample/backstop_data/ci_report\n        touch *.xml\n        ```\n        ![Screenshot](Attachments/Jenkins_PostBuildActions_AvoidJUnitReportIssue.png)\n        \n     3) Add **Publish HTML reports**, and set as following.\n        Note: The **HTML directory to archive** is: docker/Jenkins/Sample/backstop_data/ \n        ![Screenshot](Attachments/Jenkins_PostBuildActions_PublishHTML.png)\n        \n     4) Add **Publish JUnit test result report**, and set as following\n        ![Screenshot](Attachments/Jenkins_PostBuildActions_PublishJUnit.png)\n     \n3. Run build - Get the HTML Report & JUnit Report\n   ![Screenshot](Attachments/Jenkins_Report.png)\n"
  },
  {
    "path": "examples/Jenkins/Sample/backstop.json",
    "content": "{\n  \"id\": \"demo\",\n  \"viewports\": [\n    {\n      \"label\": \"PC\",\n      \"width\": 1920,\n      \"height\": 1080\n    },\n    {\n      \"label\": \"iPhone6,6s,7,8\",\n      \"width\": 375,\n      \"height\": 667\n    }\n  ],\n  \"onBeforeScript\": \"puppet/onBefore.js\",\n  \"onReadyScript\": \"puppet/onReady.js\",\n  \"scenarios\": [\n    {\n      \"label\": \"demo\",\n      \"cookiePath\": \"\",\n      \"url\": \"https://garris.github.io/BackstopJS/\",\n      \"referenceUrl\": \"\",\n      \"readyEvent\": \"\",\n      \"readySelector\": \"\",\n      \"delay\": 1000,\n      \"hideSelectors\": [],\n      \"removeSelectors\": [],\n      \"hoverSelector\": \"\",\n      \"clickSelector\": \"\",\n      \"postInteractionWait\": 1000,\n      \"selectors\": [],\n      \"selectorExpansion\": true,\n      \"misMatchThreshold\": 0.1,\n      \"requireSameDimensions\": true\n    }\n  ],\n  \"paths\": {\n    \"bitmaps_reference\": \"backstop_data/bitmaps_reference\",\n    \"bitmaps_test\": \"backstop_data/bitmaps_test\",\n    \"engine_scripts\": \"backstop_data/engine_scripts\",\n    \"html_report\": \"backstop_data/html_report\",\n    \"ci_report\": \"backstop_data/ci_report\"\n  },\n  \"report\": [\"CI\"],\n  \"engine\": \"puppeteer\",\n  \"engineOptions\": {\n    \"ignoreHTTPSErrors\": true,\n    \"slowMo\": 500,\n    \"args\": [\n      \"--no-sandbox\",\n      \"--disable-setuid-sandbox\",\n      \"--disable-gpu\",\n      \"--force-device-scale-factor=1\",\n      \"--disable-infobars=true\",\n      \"--hide-scrollbars\"\n    ]\n  },\n  \"asyncCaptureLimit\": 2,\n  \"asyncCompareLimit\": 20,\n  \"debug\": false,\n  \"debugWindow\": false\n}\n"
  },
  {
    "path": "examples/Jenkins/Sample/backstop_data/engine_scripts/puppet/clickAndHoverHelper.js",
    "content": "module.exports = async (page, scenario) => {\n  const hoverSelector = scenario.hoverSelector;\n  const clickSelector = scenario.clickSelector;\n  const postInteractionWait = scenario.postInteractionWait; // selector [str] | ms [int]\n\n  if (hoverSelector) {\n    await page.waitForSelector(hoverSelector);\n    await page.hover(hoverSelector);\n  }\n\n  if (clickSelector) {\n    await page.waitForSelector(clickSelector);\n    await page.click(clickSelector);\n  }\n\n  if (postInteractionWait) {\n    await new Promise(resolve => {\n      setTimeout(resolve, postInteractionWait);\n    });\n  }\n};\n"
  },
  {
    "path": "examples/Jenkins/Sample/backstop_data/engine_scripts/puppet/ignoreCSP.js",
    "content": "/**\n * IGNORE CSP HEADERS\n * Listen to all requests. If a request matches scenario.url\n * then fetch the request again manually, strip out CSP headers\n * and respond to the original request without CSP headers.\n * Allows `ignoreHTTPSErrors: true` BUT... requires `debugWindow: true`\n *\n * see https://github.com/GoogleChrome/puppeteer/issues/1229#issuecomment-380133332\n * this is the workaround until Page.setBypassCSP lands... https://github.com/GoogleChrome/puppeteer/pull/2324\n *\n * @param      {REQUEST}  request\n * @return     {VOID}\n *\n * Use this in an onBefore script E.G.\n  ```\n  module.exports = async function(page, scenario) {\n    require('./removeCSP')(page, scenario);\n  }\n  ```\n *\n */\n\nconst fetch = require('node-fetch');\nconst https = require('https');\nconst agent = new https.Agent({\n  rejectUnauthorized: false\n});\n\nmodule.exports = async function (page, scenario) {\n  const intercept = async (request, targetUrl) => {\n    const requestUrl = request.url();\n\n    // FIND TARGET URL REQUEST\n    if (requestUrl === targetUrl) {\n      const cookiesList = await page.cookies(requestUrl);\n      const cookies = cookiesList.map(cookie => `${cookie.name}=${cookie.value}`).join('; ');\n      const headers = Object.assign(request.headers(), { cookie: cookies });\n      const options = {\n        headers: headers,\n        body: request.postData(),\n        method: request.method(),\n        follow: 20,\n        agent\n      };\n\n      const result = await fetch(requestUrl, options);\n\n      const buffer = await result.buffer();\n      const cleanedHeaders = result.headers._headers || {};\n      cleanedHeaders['content-security-policy'] = '';\n      await request.respond({\n        body: buffer,\n        headers: cleanedHeaders,\n        status: result.status\n      });\n    } else {\n      request.continue();\n    }\n  };\n\n  await page.setRequestInterception(true);\n  page.on('request', req => {\n    intercept(req, scenario.url);\n  });\n};\n"
  },
  {
    "path": "examples/Jenkins/Sample/backstop_data/engine_scripts/puppet/interceptImages.js",
    "content": "/**\n * INTERCEPT IMAGES\n * Listen to all requests. If a request matches IMAGE_URL_RE\n * then stub the image with data from IMAGE_STUB_URL\n *\n * Use this in an onBefore script E.G.\n  ```\n  module.exports = async function(page, scenario) {\n    require('./interceptImages')(page, scenario);\n  }\n  ```\n *\n */\n\nconst fs = require('fs');\nconst path = require('path');\n\nconst IMAGE_URL_RE = /\\.gif|\\.jpg|\\.png/i;\nconst IMAGE_STUB_URL = path.resolve(__dirname, '../../imageStub.jpg');\nconst IMAGE_DATA_BUFFER = fs.readFileSync(IMAGE_STUB_URL);\nconst HEADERS_STUB = {};\n\nmodule.exports = async function (page, scenario) {\n  const intercept = async (request, targetUrl) => {\n    if (IMAGE_URL_RE.test(request.url())) {\n      await request.respond({\n        body: IMAGE_DATA_BUFFER,\n        headers: HEADERS_STUB,\n        status: 200\n      });\n    } else {\n      request.continue();\n    }\n  };\n  await page.setRequestInterception(true);\n  page.on('request', intercept);\n};\n"
  },
  {
    "path": "examples/Jenkins/Sample/backstop_data/engine_scripts/puppet/loadCookies.js",
    "content": "const fs = require('fs');\n\nmodule.exports = async (page, scenario) => {\n  let cookies = [];\n  const cookiePath = scenario.cookiePath;\n\n  // READ COOKIES FROM FILE IF EXISTS\n  if (fs.existsSync(cookiePath)) {\n    cookies = JSON.parse(fs.readFileSync(cookiePath));\n  }\n\n  // MUNGE COOKIE DOMAIN\n  cookies = cookies.map(cookie => {\n    if (cookie.domain.startsWith('http://') || cookie.domain.startsWith('https://')) {\n      cookie.url = cookie.domain;\n    } else {\n      cookie.url = 'https://' + cookie.domain;\n    }\n    delete cookie.domain;\n    return cookie;\n  });\n\n  // SET COOKIES\n  const setCookies = async () => {\n    return Promise.all(\n      cookies.map(async (cookie) => {\n        await page.setCookie(cookie);\n      })\n    );\n  };\n  await setCookies();\n  console.log('Cookie state restored with:', JSON.stringify(cookies, null, 2));\n};\n"
  },
  {
    "path": "examples/Jenkins/Sample/backstop_data/engine_scripts/puppet/onBefore.js",
    "content": "module.exports = async (page, scenario, vp) => {\n  await require('./loadCookies')(page, scenario);\n\n  // Emulate iPhone\n  if (vp.label == 'iPhone6,6s,7,8') {\n    await page.setUserAgent('Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1');\n  }\n\n  // Custom Timeout\n  await page.setDefaultNavigationTimeout(300000);\n};\n"
  },
  {
    "path": "examples/Jenkins/Sample/backstop_data/engine_scripts/puppet/onReady.js",
    "content": "module.exports = async (page, scenario, vp) => {\n  console.log('SCENARIO > ' + scenario.label);\n  await require('./clickAndHoverHelper')(page, scenario);\n\n  // add more ready handlers here...\n};\n"
  },
  {
    "path": "examples/angularAppWithCssTransitions/backstopConfig_1.json",
    "content": "{\n  \"viewports\": [\n    {\n      \"name\": \"phone\",\n      \"width\": 320,\n      \"height\": 480\n    },\n    {\n      \"name\": \"tablet_v\",\n      \"width\": 568,\n      \"height\": 1024\n    },\n    {\n      \"name\": \"tablet_h\",\n      \"width\": 1024,\n      \"height\": 768\n    }\n  ],\n  \"scenarios\": [\n    {\n      \"label\": \"measure twice\",\n      \"url\": \"test/simple.html\",\n      \"hideSelectors\": [\n      ],\n      \"removeSelectors\": [\n      ],\n      \"selectors\": [\n        \".page-header h1\",\n        \".page-header small\",\n        \".graph:nth-of-type(1)\",\n        \".graph:nth-of-type(2)\",\n        \"body\",\n        \"nav\"\n      ],\n      \"readyEvent\": \"backstop.ready\",\n      \"delay\": 10,\n      \"misMatchThreshold\" : 0.1\n    }\n  ],\n  \"paths\": {\n    \"bitmaps_reference\": \"../../backstop_data/bitmaps_reference\",\n    \"bitmaps_test\": \"../../backstop_data/bitmaps_test\",\n    \"compare_data\": \"../../backstop_data/bitmaps_test/compare.json\"\n  }\n}\n"
  },
  {
    "path": "examples/angularAppWithCssTransitions/backstopConfig_2.json",
    "content": "{\n  \"viewports\": [\n    {\n      \"name\": \"phone\",\n      \"width\": 320,\n      \"height\": 480\n    },\n    {\n      \"name\": \"tablet_h\",\n      \"width\": 1024,\n      \"height\": 768\n    }\n  ],\n  \"scenarios\": [\n    {\n      \"label\": \"measure twice\",\n      \"url\": \"test/simple.html#testHash\",\n      \"hideSelectors\": [\n      ],\n      \"removeSelectors\": [\n      ],\n      \"selectors\": [\n        \"body\"\n      ],\n      \"readyEvent\": \"backstop.ready\",\n      \"delay\": 10,\n      \"misMatchThreshold\" : 0.1\n    }\n  ],\n  \"paths\": {\n    \"bitmaps_reference\": \"../../backstop_data/bitmaps_reference\",\n    \"bitmaps_test\": \"../../backstop_data/bitmaps_test\",\n    \"compare_data\": \"../../backstop_data/bitmaps_test/compare.json\"\n  }\n}\n"
  },
  {
    "path": "examples/angularAppWithCssTransitions/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <title>Bootstrap 101 Template</title>\n\n\t<script src=\"./angular.min.js\"></script>\n    <link rel=\"stylesheet\" href=\"./bootstrap.min.css\">\n\n    <style type=\"text/css\">\n\n    \tp{padding: 10px}\n\n\t    .graph{\n\t    \tmargin-bottom: 30px;\n\t    \tbackground-color: #eee;\n\t    \toverflow: auto;\n\t    }\n\n      .graph p{\n\t    \tpadding: 10px 10px 20px;\n\t    }\n\n  \t\t.page-header small{\n  \t\t\twhite-space: nowrap;\n  \t\t}\n\n      nav span {\n        line-height: 4em;\n      }\n\n      @-webkit-keyframes fadeIn { from { opacity:0; transform: translate3d(0,-20px,0);} to { opacity:1; transform: translate3d(0px,0,0);} }\n      @-moz-keyframes fadeIn { from { opacity:0; } to { opacity:1; } }\n      @keyframes fadeIn { from { opacity:0; } to { opacity:1; } }\n\n      .fade-in {\n         opacity:0;\n         -webkit-animation:fadeIn .3s ease-out 1 forwards 1s;\n         -moz-animation:fadeIn .3s ease-out 1 forwards 1s;\n         animation:fadeIn .3s ease-out 1 forwards 1s;\n      }\n      .animateWait{\n         -webkit-animation-delay:2s;\n         -moz-animation-delay:2s;\n         animation-delay:2s;\n      }\n\n    </style>\n\n  </head>\n\n\n  <body ng-app=\"myApp\" ng-controller=\"MyCtrlr\">\n\n\n\t<div class=\"container\">\n\n\n    <nav class=\"navbar navbar-default isBig\" ng-if=\"isBig\">\n      <div class=\"container-fluid\">\n        <span>This is the header. It will only be rendered in the DOM if the window is greater than 768px.</span>\n      </div>\n    </nav>\n\n\t\t<div class=\"page-header\">\n\t\t  <h1>Measure Twice</h1>\n      <small class=\"hidden-xs\">and cut once.</small>\n\t\t</div>\n\n\t    <div class=\"row\">\n\t\t    <div class=\"col-sm-6 graph fade-in\" animated=\"first\">\n\t\t\t    <h2>Minima veniam</h2>\n  \t\t\t\t<p>1) Sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?</p>\n\n\t\t    </div>\n\t\t    <div class=\"col-sm-6 graph fade-in animateWait\" animated=\"second\">\n  \t\t    <h2>Nisi ut aliquid?</h2>\n  \t\t\t\t<p>1) Sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?</p>\n\n\t\t    </div>\n\t    </div>\n\n\t    <div class=\"row\">\n\n\t    \t<div class=\"col-sm-12\">\n\t    \t\t<p><strong>Timestamp:</strong> {{timeStr}}</p>\n\t    \t\t<p><strong>User agent:</strong> {{userAgentStr}}</p>\n\t    \t\t<p><strong>Cookie:</strong> {{cookieStr}}</p>\n\t    \t</div>\n\n\t    </div>\n\t</div>\n\n\n\n\n\n  </body>\n</html>\n\n\n<script type=\"text/javascript\">\n\n\tconsole.log('The DOM is loaded.')\n\n\tmyApp = angular.module('myApp', []);\n\n\tmyApp.controller('MyCtrlr', ['$scope',function($scope){\n\n        const IS_BIG_CUTOFF = 768;\n\n        $scope.allDone = function () {\n\t\t\tconsole.log('backstop.ready');\n\t\t}\n\n\t\t$scope.timeStr = new Date().getTime();\n\t\t$scope.userAgentStr = navigator.userAgent;\n\t\t$scope.cookieStr = document.cookie||'No data found.';\n\n    $scope.isBig = window.innerWidth > IS_BIG_CUTOFF;\n\n\t}]);\n\n\n\tmyApp.directive('animated', function(){\n\t\treturn{\n\t\t\trestrict:'A',\n\t\t\tlink:function(scope, el, attrs){\n\n\t\t\t\tel.on('webkitAnimationEnd mozAnimationEnd msAnimationEnd oAnimationEnd animationEnd',function(evt){\n\n\t\t\t\t\tconsole.log('Transition',attrs.animated,evt);\n\n\t\t\t\t\tif(attrs.animated==='second'){\n\t\t\t\t\t\tscope.allDone();\n\t\t\t\t\t}\n\n\t\t\t\t})\n\n\n\t\t\t}\n\t\t}\n\t});\n\n\n\n</script>\n\n\n"
  },
  {
    "path": "examples/featureTests/dist/css/bootstrap-theme.css",
    "content": "/*!\n * Bootstrap v3.3.1 (http://getbootstrap.com)\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, .2);\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n}\n.btn-default .badge,\n.btn-primary .badge,\n.btn-success .badge,\n.btn-info .badge,\n.btn-warning .badge,\n.btn-danger .badge {\n  text-shadow: none;\n}\n.btn:active,\n.btn.active {\n  background-image: none;\n}\n.btn-default {\n  text-shadow: 0 1px 0 #fff;\n  background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n  background-image:      -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0));\n  background-image:         linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #dbdbdb;\n  border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n  background-color: #e0e0e0;\n  background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n  background-color: #e0e0e0;\n  border-color: #dbdbdb;\n}\n.btn-default:disabled,\n.btn-default[disabled] {\n  background-color: #e0e0e0;\n  background-image: none;\n}\n.btn-primary {\n  background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);\n  background-image:      -o-linear-gradient(top, #337ab7 0%, #265a88 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88));\n  background-image:         linear-gradient(to bottom, #337ab7 0%, #265a88 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #245580;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n  background-color: #265a88;\n  background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n  background-color: #265a88;\n  border-color: #245580;\n}\n.btn-primary:disabled,\n.btn-primary[disabled] {\n  background-color: #265a88;\n  background-image: none;\n}\n.btn-success {\n  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n  background-image:      -o-linear-gradient(top, #5cb85c 0%, #419641 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641));\n  background-image:         linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n  background-color: #419641;\n  background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n  background-color: #419641;\n  border-color: #3e8f3e;\n}\n.btn-success:disabled,\n.btn-success[disabled] {\n  background-color: #419641;\n  background-image: none;\n}\n.btn-info {\n  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n  background-image:      -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2));\n  background-image:         linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n  background-color: #2aabd2;\n  background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n  background-color: #2aabd2;\n  border-color: #28a4c9;\n}\n.btn-info:disabled,\n.btn-info[disabled] {\n  background-color: #2aabd2;\n  background-image: none;\n}\n.btn-warning {\n  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n  background-image:      -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316));\n  background-image:         linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n  background-color: #eb9316;\n  background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n  background-color: #eb9316;\n  border-color: #e38d13;\n}\n.btn-warning:disabled,\n.btn-warning[disabled] {\n  background-color: #eb9316;\n  background-image: none;\n}\n.btn-danger {\n  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n  background-image:      -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a));\n  background-image:         linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n  background-color: #c12e2a;\n  background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n  background-color: #c12e2a;\n  border-color: #b92c28;\n}\n.btn-danger:disabled,\n.btn-danger[disabled] {\n  background-color: #c12e2a;\n  background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);\n          box-shadow: 0 1px 2px rgba(0, 0, 0, .075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  background-color: #e8e8e8;\n  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n  background-image:      -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));\n  background-image:         linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n  background-repeat: repeat-x;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  background-color: #2e6da4;\n  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n  background-image:      -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));\n  background-image:         linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n  background-repeat: repeat-x;\n}\n.navbar-default {\n  background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%);\n  background-image:      -o-linear-gradient(top, #fff 0%, #f8f8f8 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8));\n  background-image:         linear-gradient(to bottom, #fff 0%, #f8f8f8 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .active > a {\n  background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n  background-image:      -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2));\n  background-image:         linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n  background-repeat: repeat-x;\n  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n  text-shadow: 0 1px 0 rgba(255, 255, 255, .25);\n}\n.navbar-inverse {\n  background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);\n  background-image:      -o-linear-gradient(top, #3c3c3c 0%, #222 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222));\n  background-image:         linear-gradient(to bottom, #3c3c3c 0%, #222 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .active > a {\n  background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n  background-image:      -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f));\n  background-image:         linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n  background-repeat: repeat-x;\n  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);\n          box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, .25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  border-radius: 0;\n}\n@media (max-width: 767px) {\n  .navbar .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #fff;\n    background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n    background-image:      -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n    background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));\n    background-image:         linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n    background-repeat: repeat-x;\n  }\n}\n.alert {\n  text-shadow: 0 1px 0 rgba(255, 255, 255, .2);\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);\n}\n.alert-success {\n  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n  background-image:      -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc));\n  background-image:         linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n  background-repeat: repeat-x;\n  border-color: #b2dba1;\n}\n.alert-info {\n  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n  background-image:      -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0));\n  background-image:         linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n  background-repeat: repeat-x;\n  border-color: #9acfea;\n}\n.alert-warning {\n  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n  background-image:      -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0));\n  background-image:         linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n  background-repeat: repeat-x;\n  border-color: #f5e79e;\n}\n.alert-danger {\n  background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n  background-image:      -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3));\n  background-image:         linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n  background-repeat: repeat-x;\n  border-color: #dca7a7;\n}\n.progress {\n  background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n  background-image:      -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5));\n  background-image:         linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n  background-repeat: repeat-x;\n}\n.progress-bar {\n  background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);\n  background-image:      -o-linear-gradient(top, #337ab7 0%, #286090 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090));\n  background-image:         linear-gradient(to bottom, #337ab7 0%, #286090 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);\n  background-repeat: repeat-x;\n}\n.progress-bar-success {\n  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n  background-image:      -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44));\n  background-image:         linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n  background-repeat: repeat-x;\n}\n.progress-bar-info {\n  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n  background-image:      -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5));\n  background-image:         linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n  background-repeat: repeat-x;\n}\n.progress-bar-warning {\n  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n  background-image:      -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f));\n  background-image:         linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n  background-repeat: repeat-x;\n}\n.progress-bar-danger {\n  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n  background-image:      -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c));\n  background-image:         linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n  background-repeat: repeat-x;\n}\n.progress-bar-striped {\n  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);\n  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);\n  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);\n}\n.list-group {\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);\n          box-shadow: 0 1px 2px rgba(0, 0, 0, .075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  text-shadow: 0 -1px 0 #286090;\n  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n  background-image:      -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a));\n  background-image:         linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);\n  background-repeat: repeat-x;\n  border-color: #2b669a;\n}\n.list-group-item.active .badge,\n.list-group-item.active:hover .badge,\n.list-group-item.active:focus .badge {\n  text-shadow: none;\n}\n.panel {\n  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05);\n          box-shadow: 0 1px 2px rgba(0, 0, 0, .05);\n}\n.panel-default > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n  background-image:      -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));\n  background-image:         linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n  background-repeat: repeat-x;\n}\n.panel-primary > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n  background-image:      -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));\n  background-image:         linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n  background-repeat: repeat-x;\n}\n.panel-success > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n  background-image:      -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6));\n  background-image:         linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n  background-repeat: repeat-x;\n}\n.panel-info > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n  background-image:      -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3));\n  background-image:         linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n  background-repeat: repeat-x;\n}\n.panel-warning > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n  background-image:      -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc));\n  background-image:         linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n  background-repeat: repeat-x;\n}\n.panel-danger > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n  background-image:      -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc));\n  background-image:         linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n  background-repeat: repeat-x;\n}\n.well {\n  background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n  background-image:      -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5));\n  background-image:         linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n  background-repeat: repeat-x;\n  border-color: #dcdcdc;\n  -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);\n          box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */\n"
  },
  {
    "path": "examples/featureTests/dist/css/bootstrap.css",
    "content": "/*!\n * Bootstrap v3.3.1 (http://getbootstrap.com)\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n/*! normalize.css v3.0.2 | MIT License | git.io/normalize */\nhtml {\n  font-family: sans-serif;\n  -webkit-text-size-adjust: 100%;\n      -ms-text-size-adjust: 100%;\n}\nbody {\n  margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n  display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n  display: inline-block;\n  vertical-align: baseline;\n}\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n[hidden],\ntemplate {\n  display: none;\n}\na {\n  background-color: transparent;\n}\na:active,\na:hover {\n  outline: 0;\n}\nabbr[title] {\n  border-bottom: 1px dotted;\n}\nb,\nstrong {\n  font-weight: bold;\n}\ndfn {\n  font-style: italic;\n}\nh1 {\n  margin: .67em 0;\n  font-size: 2em;\n}\nmark {\n  color: #000;\n  background: #ff0;\n}\nsmall {\n  font-size: 80%;\n}\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\nsup {\n  top: -.5em;\n}\nsub {\n  bottom: -.25em;\n}\nimg {\n  border: 0;\n}\nsvg:not(:root) {\n  overflow: hidden;\n}\nfigure {\n  margin: 1em 40px;\n}\nhr {\n  height: 0;\n  -webkit-box-sizing: content-box;\n     -moz-box-sizing: content-box;\n          box-sizing: content-box;\n}\npre {\n  overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  margin: 0;\n  font: inherit;\n  color: inherit;\n}\nbutton {\n  overflow: visible;\n}\nbutton,\nselect {\n  text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  -webkit-appearance: button;\n  cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  padding: 0;\n  border: 0;\n}\ninput {\n  line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n  padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\ninput[type=\"search\"] {\n  -webkit-box-sizing: content-box;\n     -moz-box-sizing: content-box;\n          box-sizing: content-box;\n  -webkit-appearance: textfield;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\nfieldset {\n  padding: .35em .625em .75em;\n  margin: 0 2px;\n  border: 1px solid #c0c0c0;\n}\nlegend {\n  padding: 0;\n  border: 0;\n}\ntextarea {\n  overflow: auto;\n}\noptgroup {\n  font-weight: bold;\n}\ntable {\n  border-spacing: 0;\n  border-collapse: collapse;\n}\ntd,\nth {\n  padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n  *,\n  *:before,\n  *:after {\n    color: #000 !important;\n    text-shadow: none !important;\n    background: transparent !important;\n    -webkit-box-shadow: none !important;\n            box-shadow: none !important;\n  }\n  a,\n  a:visited {\n    text-decoration: underline;\n  }\n  a[href]:after {\n    content: \" (\" attr(href) \")\";\n  }\n  abbr[title]:after {\n    content: \" (\" attr(title) \")\";\n  }\n  a[href^=\"#\"]:after,\n  a[href^=\"javascript:\"]:after {\n    content: \"\";\n  }\n  pre,\n  blockquote {\n    border: 1px solid #999;\n\n    page-break-inside: avoid;\n  }\n  thead {\n    display: table-header-group;\n  }\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n  img {\n    max-width: 100% !important;\n  }\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n  select {\n    background: #fff !important;\n  }\n  .navbar {\n    display: none;\n  }\n  .btn > .caret,\n  .dropup > .btn > .caret {\n    border-top-color: #000 !important;\n  }\n  .label {\n    border: 1px solid #000;\n  }\n  .table {\n    border-collapse: collapse !important;\n  }\n  .table td,\n  .table th {\n    background-color: #fff !important;\n  }\n  .table-bordered th,\n  .table-bordered td {\n    border: 1px solid #ddd !important;\n  }\n}\n@font-face {\n  font-family: 'Glyphicons Halflings';\n\n  src: url('../fonts/glyphicons-halflings-regular.eot');\n  src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), 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');\n}\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n  content: \"\\2a\";\n}\n.glyphicon-plus:before {\n  content: \"\\2b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n  content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n  content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n  content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n  content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n  content: \"\\270f\";\n}\n.glyphicon-glass:before {\n  content: \"\\e001\";\n}\n.glyphicon-music:before {\n  content: \"\\e002\";\n}\n.glyphicon-search:before {\n  content: \"\\e003\";\n}\n.glyphicon-heart:before {\n  content: \"\\e005\";\n}\n.glyphicon-star:before {\n  content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n  content: \"\\e007\";\n}\n.glyphicon-user:before {\n  content: \"\\e008\";\n}\n.glyphicon-film:before {\n  content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n  content: \"\\e010\";\n}\n.glyphicon-th:before {\n  content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n  content: \"\\e012\";\n}\n.glyphicon-ok:before {\n  content: \"\\e013\";\n}\n.glyphicon-remove:before {\n  content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n  content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n  content: \"\\e016\";\n}\n.glyphicon-off:before {\n  content: \"\\e017\";\n}\n.glyphicon-signal:before {\n  content: \"\\e018\";\n}\n.glyphicon-cog:before {\n  content: \"\\e019\";\n}\n.glyphicon-trash:before {\n  content: \"\\e020\";\n}\n.glyphicon-home:before {\n  content: \"\\e021\";\n}\n.glyphicon-file:before {\n  content: \"\\e022\";\n}\n.glyphicon-time:before {\n  content: \"\\e023\";\n}\n.glyphicon-road:before {\n  content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n  content: \"\\e025\";\n}\n.glyphicon-download:before {\n  content: \"\\e026\";\n}\n.glyphicon-upload:before {\n  content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n  content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n  content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n  content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n  content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n  content: \"\\e032\";\n}\n.glyphicon-lock:before {\n  content: \"\\e033\";\n}\n.glyphicon-flag:before {\n  content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n  content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n  content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n  content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n  content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n  content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n  content: \"\\e040\";\n}\n.glyphicon-tag:before {\n  content: \"\\e041\";\n}\n.glyphicon-tags:before {\n  content: \"\\e042\";\n}\n.glyphicon-book:before {\n  content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n  content: \"\\e044\";\n}\n.glyphicon-print:before {\n  content: \"\\e045\";\n}\n.glyphicon-camera:before {\n  content: \"\\e046\";\n}\n.glyphicon-font:before {\n  content: \"\\e047\";\n}\n.glyphicon-bold:before {\n  content: \"\\e048\";\n}\n.glyphicon-italic:before {\n  content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n  content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n  content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n  content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n  content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n  content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n  content: \"\\e055\";\n}\n.glyphicon-list:before {\n  content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n  content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n  content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n  content: \"\\e059\";\n}\n.glyphicon-picture:before {\n  content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n  content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n  content: \"\\e063\";\n}\n.glyphicon-tint:before {\n  content: \"\\e064\";\n}\n.glyphicon-edit:before {\n  content: \"\\e065\";\n}\n.glyphicon-share:before {\n  content: \"\\e066\";\n}\n.glyphicon-check:before {\n  content: \"\\e067\";\n}\n.glyphicon-move:before {\n  content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n  content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n  content: \"\\e070\";\n}\n.glyphicon-backward:before {\n  content: \"\\e071\";\n}\n.glyphicon-play:before {\n  content: \"\\e072\";\n}\n.glyphicon-pause:before {\n  content: \"\\e073\";\n}\n.glyphicon-stop:before {\n  content: \"\\e074\";\n}\n.glyphicon-forward:before {\n  content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n  content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n  content: \"\\e077\";\n}\n.glyphicon-eject:before {\n  content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n  content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n  content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n  content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n  content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n  content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n  content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n  content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n  content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n  content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n  content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n  content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n  content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n  content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n  content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n  content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n  content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n  content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n  content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n  content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n  content: \"\\e101\";\n}\n.glyphicon-gift:before {\n  content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n  content: \"\\e103\";\n}\n.glyphicon-fire:before {\n  content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n  content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n  content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n  content: \"\\e107\";\n}\n.glyphicon-plane:before {\n  content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n  content: \"\\e109\";\n}\n.glyphicon-random:before {\n  content: \"\\e110\";\n}\n.glyphicon-comment:before {\n  content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n  content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n  content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n  content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n  content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n  content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n  content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n  content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n  content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n  content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n  content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n  content: \"\\e122\";\n}\n.glyphicon-bell:before {\n  content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n  content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n  content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n  content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n  content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n  content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n  content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n  content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n  content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n  content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n  content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n  content: \"\\e134\";\n}\n.glyphicon-globe:before {\n  content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n  content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n  content: \"\\e137\";\n}\n.glyphicon-filter:before {\n  content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n  content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n  content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n  content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n  content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n  content: \"\\e143\";\n}\n.glyphicon-link:before {\n  content: \"\\e144\";\n}\n.glyphicon-phone:before {\n  content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n  content: \"\\e146\";\n}\n.glyphicon-usd:before {\n  content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n  content: \"\\e149\";\n}\n.glyphicon-sort:before {\n  content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n  content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n  content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n  content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n  content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n  content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n  content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n  content: \"\\e157\";\n}\n.glyphicon-expand:before {\n  content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n  content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n  content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n  content: \"\\e161\";\n}\n.glyphicon-flash:before {\n  content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n  content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n  content: \"\\e164\";\n}\n.glyphicon-record:before {\n  content: \"\\e165\";\n}\n.glyphicon-save:before {\n  content: \"\\e166\";\n}\n.glyphicon-open:before {\n  content: \"\\e167\";\n}\n.glyphicon-saved:before {\n  content: \"\\e168\";\n}\n.glyphicon-import:before {\n  content: \"\\e169\";\n}\n.glyphicon-export:before {\n  content: \"\\e170\";\n}\n.glyphicon-send:before {\n  content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n  content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n  content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n  content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n  content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n  content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n  content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n  content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n  content: \"\\e179\";\n}\n.glyphicon-header:before {\n  content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n  content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n  content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n  content: \"\\e183\";\n}\n.glyphicon-tower:before {\n  content: \"\\e184\";\n}\n.glyphicon-stats:before {\n  content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n  content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n  content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n  content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n  content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n  content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n  content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n  content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n  content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n  content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n  content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n  content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n  content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n  content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n  content: \"\\e200\";\n}\n* {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n*:before,\n*:after {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\nhtml {\n  font-size: 10px;\n\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #333;\n  background-color: #fff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\na {\n  color: #337ab7;\n  text-decoration: none;\n}\na:hover,\na:focus {\n  color: #23527c;\n  text-decoration: underline;\n}\na:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\nfigure {\n  margin: 0;\n}\nimg {\n  vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  display: block;\n  max-width: 100%;\n  height: auto;\n}\n.img-rounded {\n  border-radius: 6px;\n}\n.img-thumbnail {\n  display: inline-block;\n  max-width: 100%;\n  height: auto;\n  padding: 4px;\n  line-height: 1.42857143;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-radius: 4px;\n  -webkit-transition: all .2s ease-in-out;\n       -o-transition: all .2s ease-in-out;\n          transition: all .2s ease-in-out;\n}\n.img-circle {\n  border-radius: 50%;\n}\nhr {\n  margin-top: 20px;\n  margin-bottom: 20px;\n  border: 0;\n  border-top: 1px solid #eee;\n}\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n  position: static;\n  width: auto;\n  height: auto;\n  margin: 0;\n  overflow: visible;\n  clip: auto;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n  font-family: inherit;\n  font-weight: 500;\n  line-height: 1.1;\n  color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n  font-weight: normal;\n  line-height: 1;\n  color: #777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n  margin-top: 20px;\n  margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n  font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n  font-size: 75%;\n}\nh1,\n.h1 {\n  font-size: 36px;\n}\nh2,\n.h2 {\n  font-size: 30px;\n}\nh3,\n.h3 {\n  font-size: 24px;\n}\nh4,\n.h4 {\n  font-size: 18px;\n}\nh5,\n.h5 {\n  font-size: 14px;\n}\nh6,\n.h6 {\n  font-size: 12px;\n}\np {\n  margin: 0 0 10px;\n}\n.lead {\n  margin-bottom: 20px;\n  font-size: 16px;\n  font-weight: 300;\n  line-height: 1.4;\n}\n@media (min-width: 768px) {\n  .lead {\n    font-size: 21px;\n  }\n}\nsmall,\n.small {\n  font-size: 85%;\n}\nmark,\n.mark {\n  padding: .2em;\n  background-color: #fcf8e3;\n}\n.text-left {\n  text-align: left;\n}\n.text-right {\n  text-align: right;\n}\n.text-center {\n  text-align: center;\n}\n.text-justify {\n  text-align: justify;\n}\n.text-nowrap {\n  white-space: nowrap;\n}\n.text-lowercase {\n  text-transform: lowercase;\n}\n.text-uppercase {\n  text-transform: uppercase;\n}\n.text-capitalize {\n  text-transform: capitalize;\n}\n.text-muted {\n  color: #777;\n}\n.text-primary {\n  color: #337ab7;\n}\na.text-primary:hover {\n  color: #286090;\n}\n.text-success {\n  color: #3c763d;\n}\na.text-success:hover {\n  color: #2b542c;\n}\n.text-info {\n  color: #31708f;\n}\na.text-info:hover {\n  color: #245269;\n}\n.text-warning {\n  color: #8a6d3b;\n}\na.text-warning:hover {\n  color: #66512c;\n}\n.text-danger {\n  color: #a94442;\n}\na.text-danger:hover {\n  color: #843534;\n}\n.bg-primary {\n  color: #fff;\n  background-color: #337ab7;\n}\na.bg-primary:hover {\n  background-color: #286090;\n}\n.bg-success {\n  background-color: #dff0d8;\n}\na.bg-success:hover {\n  background-color: #c1e2b3;\n}\n.bg-info {\n  background-color: #d9edf7;\n}\na.bg-info:hover {\n  background-color: #afd9ee;\n}\n.bg-warning {\n  background-color: #fcf8e3;\n}\na.bg-warning:hover {\n  background-color: #f7ecb5;\n}\n.bg-danger {\n  background-color: #f2dede;\n}\na.bg-danger:hover {\n  background-color: #e4b9b9;\n}\n.page-header {\n  padding-bottom: 9px;\n  margin: 40px 0 20px;\n  border-bottom: 1px solid #eee;\n}\nul,\nol {\n  margin-top: 0;\n  margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n  margin-bottom: 0;\n}\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n.list-inline {\n  padding-left: 0;\n  margin-left: -5px;\n  list-style: none;\n}\n.list-inline > li {\n  display: inline-block;\n  padding-right: 5px;\n  padding-left: 5px;\n}\ndl {\n  margin-top: 0;\n  margin-bottom: 20px;\n}\ndt,\ndd {\n  line-height: 1.42857143;\n}\ndt {\n  font-weight: bold;\n}\ndd {\n  margin-left: 0;\n}\n@media (min-width: 768px) {\n  .dl-horizontal dt {\n    float: left;\n    width: 160px;\n    overflow: hidden;\n    clear: left;\n    text-align: right;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n  .dl-horizontal dd {\n    margin-left: 180px;\n  }\n}\nabbr[title],\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted #777;\n}\n.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\nblockquote {\n  padding: 10px 20px;\n  margin: 0 0 20px;\n  font-size: 17.5px;\n  border-left: 5px solid #eee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n  margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n  display: block;\n  font-size: 80%;\n  line-height: 1.42857143;\n  color: #777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n  content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  text-align: right;\n  border-right: 5px solid #eee;\n  border-left: 0;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n  content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n  content: '\\00A0 \\2014';\n}\naddress {\n  margin-bottom: 20px;\n  font-style: normal;\n  line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n  font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #c7254e;\n  background-color: #f9f2f4;\n  border-radius: 4px;\n}\nkbd {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #fff;\n  background-color: #333;\n  border-radius: 3px;\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);\n          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);\n}\nkbd kbd {\n  padding: 0;\n  font-size: 100%;\n  font-weight: bold;\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\npre {\n  display: block;\n  padding: 9.5px;\n  margin: 0 0 10px;\n  font-size: 13px;\n  line-height: 1.42857143;\n  color: #333;\n  word-break: break-all;\n  word-wrap: break-word;\n  background-color: #f5f5f5;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n}\npre code {\n  padding: 0;\n  font-size: inherit;\n  color: inherit;\n  white-space: pre-wrap;\n  background-color: transparent;\n  border-radius: 0;\n}\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\n.container {\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n@media (min-width: 768px) {\n  .container {\n    width: 750px;\n  }\n}\n@media (min-width: 992px) {\n  .container {\n    width: 970px;\n  }\n}\n@media (min-width: 1200px) {\n  .container {\n    width: 1170px;\n  }\n}\n.container-fluid {\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n.row {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n  position: relative;\n  min-height: 1px;\n  padding-right: 15px;\n  padding-left: 15px;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n  float: left;\n}\n.col-xs-12 {\n  width: 100%;\n}\n.col-xs-11 {\n  width: 91.66666667%;\n}\n.col-xs-10 {\n  width: 83.33333333%;\n}\n.col-xs-9 {\n  width: 75%;\n}\n.col-xs-8 {\n  width: 66.66666667%;\n}\n.col-xs-7 {\n  width: 58.33333333%;\n}\n.col-xs-6 {\n  width: 50%;\n}\n.col-xs-5 {\n  width: 41.66666667%;\n}\n.col-xs-4 {\n  width: 33.33333333%;\n}\n.col-xs-3 {\n  width: 25%;\n}\n.col-xs-2 {\n  width: 16.66666667%;\n}\n.col-xs-1 {\n  width: 8.33333333%;\n}\n.col-xs-pull-12 {\n  right: 100%;\n}\n.col-xs-pull-11 {\n  right: 91.66666667%;\n}\n.col-xs-pull-10 {\n  right: 83.33333333%;\n}\n.col-xs-pull-9 {\n  right: 75%;\n}\n.col-xs-pull-8 {\n  right: 66.66666667%;\n}\n.col-xs-pull-7 {\n  right: 58.33333333%;\n}\n.col-xs-pull-6 {\n  right: 50%;\n}\n.col-xs-pull-5 {\n  right: 41.66666667%;\n}\n.col-xs-pull-4 {\n  right: 33.33333333%;\n}\n.col-xs-pull-3 {\n  right: 25%;\n}\n.col-xs-pull-2 {\n  right: 16.66666667%;\n}\n.col-xs-pull-1 {\n  right: 8.33333333%;\n}\n.col-xs-pull-0 {\n  right: auto;\n}\n.col-xs-push-12 {\n  left: 100%;\n}\n.col-xs-push-11 {\n  left: 91.66666667%;\n}\n.col-xs-push-10 {\n  left: 83.33333333%;\n}\n.col-xs-push-9 {\n  left: 75%;\n}\n.col-xs-push-8 {\n  left: 66.66666667%;\n}\n.col-xs-push-7 {\n  left: 58.33333333%;\n}\n.col-xs-push-6 {\n  left: 50%;\n}\n.col-xs-push-5 {\n  left: 41.66666667%;\n}\n.col-xs-push-4 {\n  left: 33.33333333%;\n}\n.col-xs-push-3 {\n  left: 25%;\n}\n.col-xs-push-2 {\n  left: 16.66666667%;\n}\n.col-xs-push-1 {\n  left: 8.33333333%;\n}\n.col-xs-push-0 {\n  left: auto;\n}\n.col-xs-offset-12 {\n  margin-left: 100%;\n}\n.col-xs-offset-11 {\n  margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n  margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n  margin-left: 75%;\n}\n.col-xs-offset-8 {\n  margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n  margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n  margin-left: 50%;\n}\n.col-xs-offset-5 {\n  margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n  margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n  margin-left: 25%;\n}\n.col-xs-offset-2 {\n  margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n  margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n  margin-left: 0;\n}\n@media (min-width: 768px) {\n  .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n    float: left;\n  }\n  .col-sm-12 {\n    width: 100%;\n  }\n  .col-sm-11 {\n    width: 91.66666667%;\n  }\n  .col-sm-10 {\n    width: 83.33333333%;\n  }\n  .col-sm-9 {\n    width: 75%;\n  }\n  .col-sm-8 {\n    width: 66.66666667%;\n  }\n  .col-sm-7 {\n    width: 58.33333333%;\n  }\n  .col-sm-6 {\n    width: 50%;\n  }\n  .col-sm-5 {\n    width: 41.66666667%;\n  }\n  .col-sm-4 {\n    width: 33.33333333%;\n  }\n  .col-sm-3 {\n    width: 25%;\n  }\n  .col-sm-2 {\n    width: 16.66666667%;\n  }\n  .col-sm-1 {\n    width: 8.33333333%;\n  }\n  .col-sm-pull-12 {\n    right: 100%;\n  }\n  .col-sm-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-sm-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-sm-pull-9 {\n    right: 75%;\n  }\n  .col-sm-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-sm-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-sm-pull-6 {\n    right: 50%;\n  }\n  .col-sm-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-sm-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-sm-pull-3 {\n    right: 25%;\n  }\n  .col-sm-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-sm-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-sm-pull-0 {\n    right: auto;\n  }\n  .col-sm-push-12 {\n    left: 100%;\n  }\n  .col-sm-push-11 {\n    left: 91.66666667%;\n  }\n  .col-sm-push-10 {\n    left: 83.33333333%;\n  }\n  .col-sm-push-9 {\n    left: 75%;\n  }\n  .col-sm-push-8 {\n    left: 66.66666667%;\n  }\n  .col-sm-push-7 {\n    left: 58.33333333%;\n  }\n  .col-sm-push-6 {\n    left: 50%;\n  }\n  .col-sm-push-5 {\n    left: 41.66666667%;\n  }\n  .col-sm-push-4 {\n    left: 33.33333333%;\n  }\n  .col-sm-push-3 {\n    left: 25%;\n  }\n  .col-sm-push-2 {\n    left: 16.66666667%;\n  }\n  .col-sm-push-1 {\n    left: 8.33333333%;\n  }\n  .col-sm-push-0 {\n    left: auto;\n  }\n  .col-sm-offset-12 {\n    margin-left: 100%;\n  }\n  .col-sm-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-sm-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-sm-offset-9 {\n    margin-left: 75%;\n  }\n  .col-sm-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-sm-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-sm-offset-6 {\n    margin-left: 50%;\n  }\n  .col-sm-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-sm-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-sm-offset-3 {\n    margin-left: 25%;\n  }\n  .col-sm-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-sm-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-sm-offset-0 {\n    margin-left: 0;\n  }\n}\n@media (min-width: 992px) {\n  .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n    float: left;\n  }\n  .col-md-12 {\n    width: 100%;\n  }\n  .col-md-11 {\n    width: 91.66666667%;\n  }\n  .col-md-10 {\n    width: 83.33333333%;\n  }\n  .col-md-9 {\n    width: 75%;\n  }\n  .col-md-8 {\n    width: 66.66666667%;\n  }\n  .col-md-7 {\n    width: 58.33333333%;\n  }\n  .col-md-6 {\n    width: 50%;\n  }\n  .col-md-5 {\n    width: 41.66666667%;\n  }\n  .col-md-4 {\n    width: 33.33333333%;\n  }\n  .col-md-3 {\n    width: 25%;\n  }\n  .col-md-2 {\n    width: 16.66666667%;\n  }\n  .col-md-1 {\n    width: 8.33333333%;\n  }\n  .col-md-pull-12 {\n    right: 100%;\n  }\n  .col-md-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-md-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-md-pull-9 {\n    right: 75%;\n  }\n  .col-md-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-md-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-md-pull-6 {\n    right: 50%;\n  }\n  .col-md-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-md-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-md-pull-3 {\n    right: 25%;\n  }\n  .col-md-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-md-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-md-pull-0 {\n    right: auto;\n  }\n  .col-md-push-12 {\n    left: 100%;\n  }\n  .col-md-push-11 {\n    left: 91.66666667%;\n  }\n  .col-md-push-10 {\n    left: 83.33333333%;\n  }\n  .col-md-push-9 {\n    left: 75%;\n  }\n  .col-md-push-8 {\n    left: 66.66666667%;\n  }\n  .col-md-push-7 {\n    left: 58.33333333%;\n  }\n  .col-md-push-6 {\n    left: 50%;\n  }\n  .col-md-push-5 {\n    left: 41.66666667%;\n  }\n  .col-md-push-4 {\n    left: 33.33333333%;\n  }\n  .col-md-push-3 {\n    left: 25%;\n  }\n  .col-md-push-2 {\n    left: 16.66666667%;\n  }\n  .col-md-push-1 {\n    left: 8.33333333%;\n  }\n  .col-md-push-0 {\n    left: auto;\n  }\n  .col-md-offset-12 {\n    margin-left: 100%;\n  }\n  .col-md-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-md-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-md-offset-9 {\n    margin-left: 75%;\n  }\n  .col-md-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-md-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-md-offset-6 {\n    margin-left: 50%;\n  }\n  .col-md-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-md-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-md-offset-3 {\n    margin-left: 25%;\n  }\n  .col-md-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-md-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-md-offset-0 {\n    margin-left: 0;\n  }\n}\n@media (min-width: 1200px) {\n  .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n    float: left;\n  }\n  .col-lg-12 {\n    width: 100%;\n  }\n  .col-lg-11 {\n    width: 91.66666667%;\n  }\n  .col-lg-10 {\n    width: 83.33333333%;\n  }\n  .col-lg-9 {\n    width: 75%;\n  }\n  .col-lg-8 {\n    width: 66.66666667%;\n  }\n  .col-lg-7 {\n    width: 58.33333333%;\n  }\n  .col-lg-6 {\n    width: 50%;\n  }\n  .col-lg-5 {\n    width: 41.66666667%;\n  }\n  .col-lg-4 {\n    width: 33.33333333%;\n  }\n  .col-lg-3 {\n    width: 25%;\n  }\n  .col-lg-2 {\n    width: 16.66666667%;\n  }\n  .col-lg-1 {\n    width: 8.33333333%;\n  }\n  .col-lg-pull-12 {\n    right: 100%;\n  }\n  .col-lg-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-lg-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-lg-pull-9 {\n    right: 75%;\n  }\n  .col-lg-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-lg-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-lg-pull-6 {\n    right: 50%;\n  }\n  .col-lg-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-lg-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-lg-pull-3 {\n    right: 25%;\n  }\n  .col-lg-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-lg-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-lg-pull-0 {\n    right: auto;\n  }\n  .col-lg-push-12 {\n    left: 100%;\n  }\n  .col-lg-push-11 {\n    left: 91.66666667%;\n  }\n  .col-lg-push-10 {\n    left: 83.33333333%;\n  }\n  .col-lg-push-9 {\n    left: 75%;\n  }\n  .col-lg-push-8 {\n    left: 66.66666667%;\n  }\n  .col-lg-push-7 {\n    left: 58.33333333%;\n  }\n  .col-lg-push-6 {\n    left: 50%;\n  }\n  .col-lg-push-5 {\n    left: 41.66666667%;\n  }\n  .col-lg-push-4 {\n    left: 33.33333333%;\n  }\n  .col-lg-push-3 {\n    left: 25%;\n  }\n  .col-lg-push-2 {\n    left: 16.66666667%;\n  }\n  .col-lg-push-1 {\n    left: 8.33333333%;\n  }\n  .col-lg-push-0 {\n    left: auto;\n  }\n  .col-lg-offset-12 {\n    margin-left: 100%;\n  }\n  .col-lg-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-lg-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-lg-offset-9 {\n    margin-left: 75%;\n  }\n  .col-lg-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-lg-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-lg-offset-6 {\n    margin-left: 50%;\n  }\n  .col-lg-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-lg-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-lg-offset-3 {\n    margin-left: 25%;\n  }\n  .col-lg-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-lg-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-lg-offset-0 {\n    margin-left: 0;\n  }\n}\ntable {\n  background-color: transparent;\n}\ncaption {\n  padding-top: 8px;\n  padding-bottom: 8px;\n  color: #777;\n  text-align: left;\n}\nth {\n  text-align: left;\n}\n.table {\n  width: 100%;\n  max-width: 100%;\n  margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n  padding: 8px;\n  line-height: 1.42857143;\n  vertical-align: top;\n  border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n  vertical-align: bottom;\n  border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n  border-top: 0;\n}\n.table > tbody + tbody {\n  border-top: 2px solid #ddd;\n}\n.table .table {\n  background-color: #fff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n  padding: 5px;\n}\n.table-bordered {\n  border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n  border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n  border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-child(odd) {\n  background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n  background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n  position: static;\n  display: table-column;\n  float: none;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n  position: static;\n  display: table-cell;\n  float: none;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n  background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n  background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n  background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n  background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n  background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n  background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n  background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n  background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n  background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n  background-color: #ebcccc;\n}\n.table-responsive {\n  min-height: .01%;\n  overflow-x: auto;\n}\n@media screen and (max-width: 767px) {\n  .table-responsive {\n    width: 100%;\n    margin-bottom: 15px;\n    overflow-y: hidden;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    border: 1px solid #ddd;\n  }\n  .table-responsive > .table {\n    margin-bottom: 0;\n  }\n  .table-responsive > .table > thead > tr > th,\n  .table-responsive > .table > tbody > tr > th,\n  .table-responsive > .table > tfoot > tr > th,\n  .table-responsive > .table > thead > tr > td,\n  .table-responsive > .table > tbody > tr > td,\n  .table-responsive > .table > tfoot > tr > td {\n    white-space: nowrap;\n  }\n  .table-responsive > .table-bordered {\n    border: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:first-child,\n  .table-responsive > .table-bordered > tbody > tr > th:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n  .table-responsive > .table-bordered > thead > tr > td:first-child,\n  .table-responsive > .table-bordered > tbody > tr > td:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n    border-left: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:last-child,\n  .table-responsive > .table-bordered > tbody > tr > th:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n  .table-responsive > .table-bordered > thead > tr > td:last-child,\n  .table-responsive > .table-bordered > tbody > tr > td:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n    border-right: 0;\n  }\n  .table-responsive > .table-bordered > tbody > tr:last-child > th,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n  .table-responsive > .table-bordered > tbody > tr:last-child > td,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n    border-bottom: 0;\n  }\n}\nfieldset {\n  min-width: 0;\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 20px;\n  font-size: 21px;\n  line-height: inherit;\n  color: #333;\n  border: 0;\n  border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n  display: inline-block;\n  max-width: 100%;\n  margin-bottom: 5px;\n  font-weight: bold;\n}\ninput[type=\"search\"] {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9;\n  line-height: normal;\n}\ninput[type=\"file\"] {\n  display: block;\n}\ninput[type=\"range\"] {\n  display: block;\n  width: 100%;\n}\nselect[multiple],\nselect[size] {\n  height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\noutput {\n  display: block;\n  padding-top: 7px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #555;\n}\n.form-control {\n  display: block;\n  width: 100%;\n  height: 34px;\n  padding: 6px 12px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #555;\n  background-color: #fff;\n  background-image: none;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n  -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;\n       -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n          transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n  border-color: #66afe9;\n  outline: 0;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);\n          box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);\n}\n.form-control::-moz-placeholder {\n  color: #999;\n  opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n  color: #999;\n}\n.form-control::-webkit-input-placeholder {\n  color: #999;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n  cursor: not-allowed;\n  background-color: #eee;\n  opacity: 1;\n}\ntextarea.form-control {\n  height: auto;\n}\ninput[type=\"search\"] {\n  -webkit-appearance: none;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n  input[type=\"date\"],\n  input[type=\"time\"],\n  input[type=\"datetime-local\"],\n  input[type=\"month\"] {\n    line-height: 34px;\n  }\n  input[type=\"date\"].input-sm,\n  input[type=\"time\"].input-sm,\n  input[type=\"datetime-local\"].input-sm,\n  input[type=\"month\"].input-sm {\n    line-height: 30px;\n  }\n  input[type=\"date\"].input-lg,\n  input[type=\"time\"].input-lg,\n  input[type=\"datetime-local\"].input-lg,\n  input[type=\"month\"].input-lg {\n    line-height: 46px;\n  }\n}\n.form-group {\n  margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n  position: relative;\n  display: block;\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n  min-height: 20px;\n  padding-left: 20px;\n  margin-bottom: 0;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  position: absolute;\n  margin-top: 4px \\9;\n  margin-left: -20px;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  font-weight: normal;\n  vertical-align: middle;\n  cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n  cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n  cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n  cursor: not-allowed;\n}\n.form-control-static {\n  padding-top: 7px;\n  padding-bottom: 7px;\n  margin-bottom: 0;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n  padding-right: 0;\n  padding-left: 0;\n}\n.input-sm,\n.form-group-sm .form-control {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\nselect.input-sm,\nselect.form-group-sm .form-control {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.input-sm,\ntextarea.form-group-sm .form-control,\nselect[multiple].input-sm,\nselect[multiple].form-group-sm .form-control {\n  height: auto;\n}\n.input-lg,\n.form-group-lg .form-control {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\nselect.input-lg,\nselect.form-group-lg .form-control {\n  height: 46px;\n  line-height: 46px;\n}\ntextarea.input-lg,\ntextarea.form-group-lg .form-control,\nselect[multiple].input-lg,\nselect[multiple].form-group-lg .form-control {\n  height: auto;\n}\n.has-feedback {\n  position: relative;\n}\n.has-feedback .form-control {\n  padding-right: 42.5px;\n}\n.form-control-feedback {\n  position: absolute;\n  top: 0;\n  right: 0;\n  z-index: 2;\n  display: block;\n  width: 34px;\n  height: 34px;\n  line-height: 34px;\n  text-align: center;\n  pointer-events: none;\n}\n.input-lg + .form-control-feedback {\n  width: 46px;\n  height: 46px;\n  line-height: 46px;\n}\n.input-sm + .form-control-feedback {\n  width: 30px;\n  height: 30px;\n  line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n  color: #3c763d;\n}\n.has-success .form-control {\n  border-color: #3c763d;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-success .form-control:focus {\n  border-color: #2b542c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #3c763d;\n}\n.has-success .form-control-feedback {\n  color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n  color: #8a6d3b;\n}\n.has-warning .form-control {\n  border-color: #8a6d3b;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-warning .form-control:focus {\n  border-color: #66512c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #8a6d3b;\n}\n.has-warning .form-control-feedback {\n  color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n  color: #a94442;\n}\n.has-error .form-control {\n  border-color: #a94442;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-error .form-control:focus {\n  border-color: #843534;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #a94442;\n}\n.has-error .form-control-feedback {\n  color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n  top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n  top: 0;\n}\n.help-block {\n  display: block;\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: #737373;\n}\n@media (min-width: 768px) {\n  .form-inline .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .form-inline .form-control-static {\n    display: inline-block;\n  }\n  .form-inline .input-group {\n    display: inline-table;\n    vertical-align: middle;\n  }\n  .form-inline .input-group .input-group-addon,\n  .form-inline .input-group .input-group-btn,\n  .form-inline .input-group .form-control {\n    width: auto;\n  }\n  .form-inline .input-group > .form-control {\n    width: 100%;\n  }\n  .form-inline .control-label {\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .radio,\n  .form-inline .checkbox {\n    display: inline-block;\n    margin-top: 0;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .radio label,\n  .form-inline .checkbox label {\n    padding-left: 0;\n  }\n  .form-inline .radio input[type=\"radio\"],\n  .form-inline .checkbox input[type=\"checkbox\"] {\n    position: relative;\n    margin-left: 0;\n  }\n  .form-inline .has-feedback .form-control-feedback {\n    top: 0;\n  }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n  padding-top: 7px;\n  margin-top: 0;\n  margin-bottom: 0;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n  min-height: 27px;\n}\n.form-horizontal .form-group {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n@media (min-width: 768px) {\n  .form-horizontal .control-label {\n    padding-top: 7px;\n    margin-bottom: 0;\n    text-align: right;\n  }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n  right: 15px;\n}\n@media (min-width: 768px) {\n  .form-horizontal .form-group-lg .control-label {\n    padding-top: 14.3px;\n  }\n}\n@media (min-width: 768px) {\n  .form-horizontal .form-group-sm .control-label {\n    padding-top: 6px;\n  }\n}\n.btn {\n  display: inline-block;\n  padding: 6px 12px;\n  margin-bottom: 0;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1.42857143;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: middle;\n  -ms-touch-action: manipulation;\n      touch-action: manipulation;\n  cursor: pointer;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n  color: #333;\n  text-decoration: none;\n}\n.btn:active,\n.btn.active {\n  background-image: none;\n  outline: 0;\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n  pointer-events: none;\n  cursor: not-allowed;\n  filter: alpha(opacity=65);\n  -webkit-box-shadow: none;\n          box-shadow: none;\n  opacity: .65;\n}\n.btn-default {\n  color: #333;\n  background-color: #fff;\n  border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus,\n.btn-default.focus,\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n  color: #333;\n  background-color: #e6e6e6;\n  border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n  background-image: none;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n  background-color: #fff;\n  border-color: #ccc;\n}\n.btn-default .badge {\n  color: #fff;\n  background-color: #333;\n}\n.btn-primary {\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #2e6da4;\n}\n.btn-primary:hover,\n.btn-primary:focus,\n.btn-primary.focus,\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n  color: #fff;\n  background-color: #286090;\n  border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n  background-image: none;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n  background-color: #337ab7;\n  border-color: #2e6da4;\n}\n.btn-primary .badge {\n  color: #337ab7;\n  background-color: #fff;\n}\n.btn-success {\n  color: #fff;\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n.btn-success:hover,\n.btn-success:focus,\n.btn-success.focus,\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n  color: #fff;\n  background-color: #449d44;\n  border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n  background-image: none;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n.btn-success .badge {\n  color: #5cb85c;\n  background-color: #fff;\n}\n.btn-info {\n  color: #fff;\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n.btn-info:hover,\n.btn-info:focus,\n.btn-info.focus,\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n  color: #fff;\n  background-color: #31b0d5;\n  border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n  background-image: none;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n.btn-info .badge {\n  color: #5bc0de;\n  background-color: #fff;\n}\n.btn-warning {\n  color: #fff;\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n.btn-warning:hover,\n.btn-warning:focus,\n.btn-warning.focus,\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n  color: #fff;\n  background-color: #ec971f;\n  border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n  background-image: none;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n.btn-warning .badge {\n  color: #f0ad4e;\n  background-color: #fff;\n}\n.btn-danger {\n  color: #fff;\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n.btn-danger:hover,\n.btn-danger:focus,\n.btn-danger.focus,\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n  color: #fff;\n  background-color: #c9302c;\n  border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n  background-image: none;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n.btn-danger .badge {\n  color: #d9534f;\n  background-color: #fff;\n}\n.btn-link {\n  font-weight: normal;\n  color: #337ab7;\n  border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n  background-color: transparent;\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n  border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n  color: #23527c;\n  text-decoration: underline;\n  background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n  color: #777;\n  text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n  padding: 1px 5px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.btn-block {\n  display: block;\n  width: 100%;\n}\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n.fade {\n  opacity: 0;\n  -webkit-transition: opacity .15s linear;\n       -o-transition: opacity .15s linear;\n          transition: opacity .15s linear;\n}\n.fade.in {\n  opacity: 1;\n}\n.collapse {\n  display: none;\n  visibility: hidden;\n}\n.collapse.in {\n  display: block;\n  visibility: visible;\n}\ntr.collapse.in {\n  display: table-row;\n}\ntbody.collapse.in {\n  display: table-row-group;\n}\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  -webkit-transition-timing-function: ease;\n       -o-transition-timing-function: ease;\n          transition-timing-function: ease;\n  -webkit-transition-duration: .35s;\n       -o-transition-duration: .35s;\n          transition-duration: .35s;\n  -webkit-transition-property: height, visibility;\n       -o-transition-property: height, visibility;\n          transition-property: height, visibility;\n}\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top: 4px solid;\n  border-right: 4px solid transparent;\n  border-left: 4px solid transparent;\n}\n.dropdown {\n  position: relative;\n}\n.dropdown-toggle:focus {\n  outline: 0;\n}\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0;\n  font-size: 14px;\n  text-align: left;\n  list-style: none;\n  background-color: #fff;\n  -webkit-background-clip: padding-box;\n          background-clip: padding-box;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, .15);\n  border-radius: 4px;\n  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);\n          box-shadow: 0 6px 12px rgba(0, 0, 0, .175);\n}\n.dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n.dropdown-menu .divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n  display: block;\n  padding: 3px 20px;\n  clear: both;\n  font-weight: normal;\n  line-height: 1.42857143;\n  color: #333;\n  white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  color: #262626;\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  color: #fff;\n  text-decoration: none;\n  background-color: #337ab7;\n  outline: 0;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  color: #777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n  background-image: none;\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.open > .dropdown-menu {\n  display: block;\n}\n.open > a {\n  outline: 0;\n}\n.dropdown-menu-right {\n  right: 0;\n  left: auto;\n}\n.dropdown-menu-left {\n  right: auto;\n  left: 0;\n}\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: 12px;\n  line-height: 1.42857143;\n  color: #777;\n  white-space: nowrap;\n}\n.dropdown-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 990;\n}\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n  content: \"\";\n  border-top: 0;\n  border-bottom: 4px solid;\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-bottom: 1px;\n}\n@media (min-width: 768px) {\n  .navbar-right .dropdown-menu {\n    right: 0;\n    left: auto;\n  }\n  .navbar-right .dropdown-menu-left {\n    right: auto;\n    left: 0;\n  }\n}\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n  position: relative;\n  float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n  z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n  margin-left: -1px;\n}\n.btn-toolbar {\n  margin-left: -5px;\n}\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n  float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n  margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n.btn-group > .btn:first-child {\n  margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group > .btn-group {\n  float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group > .btn-group:first-child > .btn:last-child,\n.btn-group > .btn-group:first-child > .dropdown-toggle {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.btn-group > .btn-group:last-child > .btn:first-child {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n  padding-right: 8px;\n  padding-left: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-right: 12px;\n  padding-left: 12px;\n}\n.btn-group.open .dropdown-toggle {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n.btn .caret {\n  margin-left: 0;\n}\n.btn-lg .caret {\n  border-width: 5px 5px 0;\n  border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n  border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n  display: block;\n  float: none;\n  width: 100%;\n  max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n  float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n  margin-top: -1px;\n  margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n  border-bottom-left-radius: 4px;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  table-layout: fixed;\n  border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n  display: table-cell;\n  float: none;\n  width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n  width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n  left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n  position: absolute;\n  clip: rect(0, 0, 0, 0);\n  pointer-events: none;\n}\n.input-group {\n  position: relative;\n  display: table;\n  border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n  float: none;\n  padding-right: 0;\n  padding-left: 0;\n}\n.input-group .form-control {\n  position: relative;\n  z-index: 2;\n  float: left;\n  width: 100%;\n  margin-bottom: 0;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n  height: 46px;\n  line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n  height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n  height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle;\n}\n.input-group-addon {\n  padding: 6px 12px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1;\n  color: #555;\n  text-align: center;\n  background-color: #eee;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n}\n.input-group-addon.input-sm {\n  padding: 5px 10px;\n  font-size: 12px;\n  border-radius: 3px;\n}\n.input-group-addon.input-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n  margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.input-group-addon:first-child {\n  border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.input-group-addon:last-child {\n  border-left: 0;\n}\n.input-group-btn {\n  position: relative;\n  font-size: 0;\n  white-space: nowrap;\n}\n.input-group-btn > .btn {\n  position: relative;\n}\n.input-group-btn > .btn + .btn {\n  margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n  z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n  margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n  margin-left: -1px;\n}\n.nav {\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n.nav > li {\n  position: relative;\n  display: block;\n}\n.nav > li > a {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n  text-decoration: none;\n  background-color: #eee;\n}\n.nav > li.disabled > a {\n  color: #777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n  color: #777;\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n  background-color: #eee;\n  border-color: #337ab7;\n}\n.nav .nav-divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n.nav > li > a > img {\n  max-width: none;\n}\n.nav-tabs {\n  border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n  float: left;\n  margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n  margin-right: 2px;\n  line-height: 1.42857143;\n  border: 1px solid transparent;\n  border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n  border-color: #eee #eee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n  color: #555;\n  cursor: default;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-bottom-color: transparent;\n}\n.nav-tabs.nav-justified {\n  width: 100%;\n  border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n  float: none;\n}\n.nav-tabs.nav-justified > li > a {\n  margin-bottom: 5px;\n  text-align: center;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n  .nav-tabs.nav-justified > li > a {\n    margin-bottom: 0;\n  }\n}\n.nav-tabs.nav-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n  border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li > a {\n    border-bottom: 1px solid #ddd;\n    border-radius: 4px 4px 0 0;\n  }\n  .nav-tabs.nav-justified > .active > a,\n  .nav-tabs.nav-justified > .active > a:hover,\n  .nav-tabs.nav-justified > .active > a:focus {\n    border-bottom-color: #fff;\n  }\n}\n.nav-pills > li {\n  float: left;\n}\n.nav-pills > li > a {\n  border-radius: 4px;\n}\n.nav-pills > li + li {\n  margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n  color: #fff;\n  background-color: #337ab7;\n}\n.nav-stacked > li {\n  float: none;\n}\n.nav-stacked > li + li {\n  margin-top: 2px;\n  margin-left: 0;\n}\n.nav-justified {\n  width: 100%;\n}\n.nav-justified > li {\n  float: none;\n}\n.nav-justified > li > a {\n  margin-bottom: 5px;\n  text-align: center;\n}\n.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\n@media (min-width: 768px) {\n  .nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n  .nav-justified > li > a {\n    margin-bottom: 0;\n  }\n}\n.nav-tabs-justified {\n  border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n  border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n  .nav-tabs-justified > li > a {\n    border-bottom: 1px solid #ddd;\n    border-radius: 4px 4px 0 0;\n  }\n  .nav-tabs-justified > .active > a,\n  .nav-tabs-justified > .active > a:hover,\n  .nav-tabs-justified > .active > a:focus {\n    border-bottom-color: #fff;\n  }\n}\n.tab-content > .tab-pane {\n  display: none;\n  visibility: hidden;\n}\n.tab-content > .active {\n  display: block;\n  visibility: visible;\n}\n.nav-tabs .dropdown-menu {\n  margin-top: -1px;\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.navbar {\n  position: relative;\n  min-height: 50px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n  .navbar {\n    border-radius: 4px;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-header {\n    float: left;\n  }\n}\n.navbar-collapse {\n  padding-right: 15px;\n  padding-left: 15px;\n  overflow-x: visible;\n  -webkit-overflow-scrolling: touch;\n  border-top: 1px solid transparent;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);\n}\n.navbar-collapse.in {\n  overflow-y: auto;\n}\n@media (min-width: 768px) {\n  .navbar-collapse {\n    width: auto;\n    border-top: 0;\n    -webkit-box-shadow: none;\n            box-shadow: none;\n  }\n  .navbar-collapse.collapse {\n    display: block !important;\n    height: auto !important;\n    padding-bottom: 0;\n    overflow: visible !important;\n    visibility: visible !important;\n  }\n  .navbar-collapse.in {\n    overflow-y: visible;\n  }\n  .navbar-fixed-top .navbar-collapse,\n  .navbar-static-top .navbar-collapse,\n  .navbar-fixed-bottom .navbar-collapse {\n    padding-right: 0;\n    padding-left: 0;\n  }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n  max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n  .navbar-fixed-top .navbar-collapse,\n  .navbar-fixed-bottom .navbar-collapse {\n    max-height: 200px;\n  }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n@media (min-width: 768px) {\n  .container > .navbar-header,\n  .container-fluid > .navbar-header,\n  .container > .navbar-collapse,\n  .container-fluid > .navbar-collapse {\n    margin-right: 0;\n    margin-left: 0;\n  }\n}\n.navbar-static-top {\n  z-index: 1000;\n  border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n  .navbar-static-top {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: 1030;\n}\n@media (min-width: 768px) {\n  .navbar-fixed-top,\n  .navbar-fixed-bottom {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top {\n  top: 0;\n  border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0;\n  border-width: 1px 0 0;\n}\n.navbar-brand {\n  float: left;\n  height: 50px;\n  padding: 15px 15px;\n  font-size: 18px;\n  line-height: 20px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n  text-decoration: none;\n}\n.navbar-brand > img {\n  display: block;\n}\n@media (min-width: 768px) {\n  .navbar > .container .navbar-brand,\n  .navbar > .container-fluid .navbar-brand {\n    margin-left: -15px;\n  }\n}\n.navbar-toggle {\n  position: relative;\n  float: right;\n  padding: 9px 10px;\n  margin-top: 8px;\n  margin-right: 15px;\n  margin-bottom: 8px;\n  background-color: transparent;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.navbar-toggle:focus {\n  outline: 0;\n}\n.navbar-toggle .icon-bar {\n  display: block;\n  width: 22px;\n  height: 2px;\n  border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n  margin-top: 4px;\n}\n@media (min-width: 768px) {\n  .navbar-toggle {\n    display: none;\n  }\n}\n.navbar-nav {\n  margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n  padding-top: 10px;\n  padding-bottom: 10px;\n  line-height: 20px;\n}\n@media (max-width: 767px) {\n  .navbar-nav .open .dropdown-menu {\n    position: static;\n    float: none;\n    width: auto;\n    margin-top: 0;\n    background-color: transparent;\n    border: 0;\n    -webkit-box-shadow: none;\n            box-shadow: none;\n  }\n  .navbar-nav .open .dropdown-menu > li > a,\n  .navbar-nav .open .dropdown-menu .dropdown-header {\n    padding: 5px 15px 5px 25px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a {\n    line-height: 20px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-nav .open .dropdown-menu > li > a:focus {\n    background-image: none;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-nav {\n    float: left;\n    margin: 0;\n  }\n  .navbar-nav > li {\n    float: left;\n  }\n  .navbar-nav > li > a {\n    padding-top: 15px;\n    padding-bottom: 15px;\n  }\n}\n.navbar-form {\n  padding: 10px 15px;\n  margin-top: 8px;\n  margin-right: -15px;\n  margin-bottom: 8px;\n  margin-left: -15px;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);\n}\n@media (min-width: 768px) {\n  .navbar-form .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .navbar-form .form-control-static {\n    display: inline-block;\n  }\n  .navbar-form .input-group {\n    display: inline-table;\n    vertical-align: middle;\n  }\n  .navbar-form .input-group .input-group-addon,\n  .navbar-form .input-group .input-group-btn,\n  .navbar-form .input-group .form-control {\n    width: auto;\n  }\n  .navbar-form .input-group > .form-control {\n    width: 100%;\n  }\n  .navbar-form .control-label {\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .radio,\n  .navbar-form .checkbox {\n    display: inline-block;\n    margin-top: 0;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .radio label,\n  .navbar-form .checkbox label {\n    padding-left: 0;\n  }\n  .navbar-form .radio input[type=\"radio\"],\n  .navbar-form .checkbox input[type=\"checkbox\"] {\n    position: relative;\n    margin-left: 0;\n  }\n  .navbar-form .has-feedback .form-control-feedback {\n    top: 0;\n  }\n}\n@media (max-width: 767px) {\n  .navbar-form .form-group {\n    margin-bottom: 5px;\n  }\n  .navbar-form .form-group:last-child {\n    margin-bottom: 0;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-form {\n    width: auto;\n    padding-top: 0;\n    padding-bottom: 0;\n    margin-right: 0;\n    margin-left: 0;\n    border: 0;\n    -webkit-box-shadow: none;\n            box-shadow: none;\n  }\n}\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  border-top-left-radius: 4px;\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.navbar-btn {\n  margin-top: 8px;\n  margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n  margin-top: 14px;\n  margin-bottom: 14px;\n}\n.navbar-text {\n  margin-top: 15px;\n  margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n  .navbar-text {\n    float: left;\n    margin-right: 15px;\n    margin-left: 15px;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-left {\n    float: left !important;\n  }\n  .navbar-right {\n    float: right !important;\n    margin-right: -15px;\n  }\n  .navbar-right ~ .navbar-right {\n    margin-right: 0;\n  }\n}\n.navbar-default {\n  background-color: #f8f8f8;\n  border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n  color: #777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n  color: #5e5e5e;\n  background-color: transparent;\n}\n.navbar-default .navbar-text {\n  color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n  color: #777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n  color: #333;\n  background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n  color: #555;\n  background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n  color: #ccc;\n  background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n  border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n  background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n  background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n  border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n  color: #555;\n  background-color: #e7e7e7;\n}\n@media (max-width: 767px) {\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n    color: #777;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #333;\n    background-color: transparent;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #555;\n    background-color: #e7e7e7;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #ccc;\n    background-color: transparent;\n  }\n}\n.navbar-default .navbar-link {\n  color: #777;\n}\n.navbar-default .navbar-link:hover {\n  color: #333;\n}\n.navbar-default .btn-link {\n  color: #777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n  color: #333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n  color: #ccc;\n}\n.navbar-inverse {\n  background-color: #222;\n  border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n  color: #fff;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n  color: #fff;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n  color: #fff;\n  background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n  color: #444;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n  border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n  background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n  background-color: #fff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n  border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n  color: #fff;\n  background-color: #080808;\n}\n@media (max-width: 767px) {\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n    border-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n    background-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n    color: #9d9d9d;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #fff;\n    background-color: transparent;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #fff;\n    background-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #444;\n    background-color: transparent;\n  }\n}\n.navbar-inverse .navbar-link {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n  color: #fff;\n}\n.navbar-inverse .btn-link {\n  color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n  color: #fff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n  color: #444;\n}\n.breadcrumb {\n  padding: 8px 15px;\n  margin-bottom: 20px;\n  list-style: none;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n}\n.breadcrumb > li {\n  display: inline-block;\n}\n.breadcrumb > li + li:before {\n  padding: 0 5px;\n  color: #ccc;\n  content: \"/\\00a0\";\n}\n.breadcrumb > .active {\n  color: #777;\n}\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: 20px 0;\n  border-radius: 4px;\n}\n.pagination > li {\n  display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n  position: relative;\n  float: left;\n  padding: 6px 12px;\n  margin-left: -1px;\n  line-height: 1.42857143;\n  color: #337ab7;\n  text-decoration: none;\n  background-color: #fff;\n  border: 1px solid #ddd;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n  margin-left: 0;\n  border-top-left-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n  color: #23527c;\n  background-color: #eee;\n  border-color: #ddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n  z-index: 2;\n  color: #fff;\n  cursor: default;\n  background-color: #337ab7;\n  border-color: #337ab7;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n  color: #777;\n  cursor: not-allowed;\n  background-color: #fff;\n  border-color: #ddd;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n  padding: 10px 16px;\n  font-size: 18px;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n  border-top-left-radius: 6px;\n  border-bottom-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n  border-top-right-radius: 6px;\n  border-bottom-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n  padding: 5px 10px;\n  font-size: 12px;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n  border-top-left-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n  border-top-right-radius: 3px;\n  border-bottom-right-radius: 3px;\n}\n.pager {\n  padding-left: 0;\n  margin: 20px 0;\n  text-align: center;\n  list-style: none;\n}\n.pager li {\n  display: inline;\n}\n.pager li > a,\n.pager li > span {\n  display: inline-block;\n  padding: 5px 14px;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n  text-decoration: none;\n  background-color: #eee;\n}\n.pager .next > a,\n.pager .next > span {\n  float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n  float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n  color: #777;\n  cursor: not-allowed;\n  background-color: #fff;\n}\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: #fff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n  color: #fff;\n  text-decoration: none;\n  cursor: pointer;\n}\n.label:empty {\n  display: none;\n}\n.btn .label {\n  position: relative;\n  top: -1px;\n}\n.label-default {\n  background-color: #777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n  background-color: #5e5e5e;\n}\n.label-primary {\n  background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n  background-color: #286090;\n}\n.label-success {\n  background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n  background-color: #449d44;\n}\n.label-info {\n  background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n  background-color: #31b0d5;\n}\n.label-warning {\n  background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n  background-color: #ec971f;\n}\n.label-danger {\n  background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n  background-color: #c9302c;\n}\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: 12px;\n  font-weight: bold;\n  line-height: 1;\n  color: #fff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  background-color: #777;\n  border-radius: 10px;\n}\n.badge:empty {\n  display: none;\n}\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n.btn-xs .badge {\n  top: 0;\n  padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n  color: #fff;\n  text-decoration: none;\n  cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n  color: #337ab7;\n  background-color: #fff;\n}\n.list-group-item > .badge {\n  float: right;\n}\n.list-group-item > .badge + .badge {\n  margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n  margin-left: 3px;\n}\n.jumbotron {\n  padding: 30px 15px;\n  margin-bottom: 30px;\n  color: inherit;\n  background-color: #eee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n  color: inherit;\n}\n.jumbotron p {\n  margin-bottom: 15px;\n  font-size: 21px;\n  font-weight: 200;\n}\n.jumbotron > hr {\n  border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n  border-radius: 6px;\n}\n.jumbotron .container {\n  max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n  .jumbotron {\n    padding: 48px 0;\n  }\n  .container .jumbotron,\n  .container-fluid .jumbotron {\n    padding-right: 60px;\n    padding-left: 60px;\n  }\n  .jumbotron h1,\n  .jumbotron .h1 {\n    font-size: 63px;\n  }\n}\n.thumbnail {\n  display: block;\n  padding: 4px;\n  margin-bottom: 20px;\n  line-height: 1.42857143;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-radius: 4px;\n  -webkit-transition: border .2s ease-in-out;\n       -o-transition: border .2s ease-in-out;\n          transition: border .2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n  margin-right: auto;\n  margin-left: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n  border-color: #337ab7;\n}\n.thumbnail .caption {\n  padding: 9px;\n  color: #333;\n}\n.alert {\n  padding: 15px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.alert h4 {\n  margin-top: 0;\n  color: inherit;\n}\n.alert .alert-link {\n  font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n  margin-bottom: 0;\n}\n.alert > p + p {\n  margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n  padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n  position: relative;\n  top: -2px;\n  right: -21px;\n  color: inherit;\n}\n.alert-success {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n.alert-success hr {\n  border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n  color: #2b542c;\n}\n.alert-info {\n  color: #31708f;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n.alert-info hr {\n  border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n  color: #245269;\n}\n.alert-warning {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n}\n.alert-warning hr {\n  border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n  color: #66512c;\n}\n.alert-danger {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #ebccd1;\n}\n.alert-danger hr {\n  border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n  color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n@-o-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n.progress {\n  height: 20px;\n  margin-bottom: 20px;\n  overflow: hidden;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);\n          box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);\n}\n.progress-bar {\n  float: left;\n  width: 0;\n  height: 100%;\n  font-size: 12px;\n  line-height: 20px;\n  color: #fff;\n  text-align: center;\n  background-color: #337ab7;\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);\n          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);\n  -webkit-transition: width .6s ease;\n       -o-transition: width .6s ease;\n          transition: width .6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n  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);\n  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);\n  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);\n  -webkit-background-size: 40px 40px;\n          background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n  -webkit-animation: progress-bar-stripes 2s linear infinite;\n       -o-animation: progress-bar-stripes 2s linear infinite;\n          animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n  background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n  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);\n  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);\n  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);\n}\n.progress-bar-info {\n  background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n  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);\n  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);\n  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);\n}\n.progress-bar-warning {\n  background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n  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);\n  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);\n  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);\n}\n.progress-bar-danger {\n  background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n  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);\n  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);\n  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);\n}\n.media {\n  margin-top: 15px;\n}\n.media:first-child {\n  margin-top: 0;\n}\n.media-right,\n.media > .pull-right {\n  padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n  padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n  display: table-cell;\n  vertical-align: top;\n}\n.media-middle {\n  vertical-align: middle;\n}\n.media-bottom {\n  vertical-align: bottom;\n}\n.media-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n.list-group {\n  padding-left: 0;\n  margin-bottom: 20px;\n}\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n  margin-bottom: -1px;\n  background-color: #fff;\n  border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n  border-top-left-radius: 4px;\n  border-top-right-radius: 4px;\n}\n.list-group-item:last-child {\n  margin-bottom: 0;\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\na.list-group-item {\n  color: #555;\n}\na.list-group-item .list-group-item-heading {\n  color: #333;\n}\na.list-group-item:hover,\na.list-group-item:focus {\n  color: #555;\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n  color: #777;\n  cursor: not-allowed;\n  background-color: #eee;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n  color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n  color: #777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  z-index: 2;\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n  color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n  color: #c7ddef;\n}\n.list-group-item-success {\n  color: #3c763d;\n  background-color: #dff0d8;\n}\na.list-group-item-success {\n  color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-success:hover,\na.list-group-item-success:focus {\n  color: #3c763d;\n  background-color: #d0e9c6;\n}\na.list-group-item-success.active,\na.list-group-item-success.active:hover,\na.list-group-item-success.active:focus {\n  color: #fff;\n  background-color: #3c763d;\n  border-color: #3c763d;\n}\n.list-group-item-info {\n  color: #31708f;\n  background-color: #d9edf7;\n}\na.list-group-item-info {\n  color: #31708f;\n}\na.list-group-item-info .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-info:hover,\na.list-group-item-info:focus {\n  color: #31708f;\n  background-color: #c4e3f3;\n}\na.list-group-item-info.active,\na.list-group-item-info.active:hover,\na.list-group-item-info.active:focus {\n  color: #fff;\n  background-color: #31708f;\n  border-color: #31708f;\n}\n.list-group-item-warning {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n}\na.list-group-item-warning {\n  color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-warning:hover,\na.list-group-item-warning:focus {\n  color: #8a6d3b;\n  background-color: #faf2cc;\n}\na.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus {\n  color: #fff;\n  background-color: #8a6d3b;\n  border-color: #8a6d3b;\n}\n.list-group-item-danger {\n  color: #a94442;\n  background-color: #f2dede;\n}\na.list-group-item-danger {\n  color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-danger:hover,\na.list-group-item-danger:focus {\n  color: #a94442;\n  background-color: #ebcccc;\n}\na.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus {\n  color: #fff;\n  background-color: #a94442;\n  border-color: #a94442;\n}\n.list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3;\n}\n.panel {\n  margin-bottom: 20px;\n  background-color: #fff;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05);\n          box-shadow: 0 1px 1px rgba(0, 0, 0, .05);\n}\n.panel-body {\n  padding: 15px;\n}\n.panel-heading {\n  padding: 10px 15px;\n  border-bottom: 1px solid transparent;\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n  color: inherit;\n}\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: 16px;\n  color: inherit;\n}\n.panel-title > a {\n  color: inherit;\n}\n.panel-footer {\n  padding: 10px 15px;\n  background-color: #f5f5f5;\n  border-top: 1px solid #ddd;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n  margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n  border-width: 1px 0;\n  border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n  border-top: 0;\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n  border-bottom: 0;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n  border-top-width: 0;\n}\n.list-group + .panel-footer {\n  border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n  margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n  padding-right: 15px;\n  padding-left: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n  border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n  border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n  border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n  border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n  border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n  border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n  border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n  border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n  border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n  border-bottom: 0;\n}\n.panel > .table-responsive {\n  margin-bottom: 0;\n  border: 0;\n}\n.panel-group {\n  margin-bottom: 20px;\n}\n.panel-group .panel {\n  margin-bottom: 0;\n  border-radius: 4px;\n}\n.panel-group .panel + .panel {\n  margin-top: 5px;\n}\n.panel-group .panel-heading {\n  border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n  border-top: 1px solid #ddd;\n}\n.panel-group .panel-footer {\n  border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n  border-bottom: 1px solid #ddd;\n}\n.panel-default {\n  border-color: #ddd;\n}\n.panel-default > .panel-heading {\n  color: #333;\n  background-color: #f5f5f5;\n  border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n  color: #f5f5f5;\n  background-color: #333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #ddd;\n}\n.panel-primary {\n  border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n  color: #337ab7;\n  background-color: #fff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #337ab7;\n}\n.panel-success {\n  border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n  color: #dff0d8;\n  background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #d6e9c6;\n}\n.panel-info {\n  border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n  color: #31708f;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n  color: #d9edf7;\n  background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #bce8f1;\n}\n.panel-warning {\n  border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n  color: #fcf8e3;\n  background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #faebcc;\n}\n.panel-danger {\n  border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n  color: #f2dede;\n  background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n  position: relative;\n  display: block;\n  height: 0;\n  padding: 0;\n  overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  border: 0;\n}\n.embed-responsive.embed-responsive-16by9 {\n  padding-bottom: 56.25%;\n}\n.embed-responsive.embed-responsive-4by3 {\n  padding-bottom: 75%;\n}\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border: 1px solid #e3e3e3;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);\n}\n.well blockquote {\n  border-color: #ddd;\n  border-color: rgba(0, 0, 0, .15);\n}\n.well-lg {\n  padding: 24px;\n  border-radius: 6px;\n}\n.well-sm {\n  padding: 9px;\n  border-radius: 3px;\n}\n.close {\n  float: right;\n  font-size: 21px;\n  font-weight: bold;\n  line-height: 1;\n  color: #000;\n  text-shadow: 0 1px 0 #fff;\n  filter: alpha(opacity=20);\n  opacity: .2;\n}\n.close:hover,\n.close:focus {\n  color: #000;\n  text-decoration: none;\n  cursor: pointer;\n  filter: alpha(opacity=50);\n  opacity: .5;\n}\nbutton.close {\n  -webkit-appearance: none;\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n}\n.modal-open {\n  overflow: hidden;\n}\n.modal {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  display: none;\n  overflow: hidden;\n  -webkit-overflow-scrolling: touch;\n  outline: 0;\n}\n.modal.fade .modal-dialog {\n  -webkit-transition: -webkit-transform .3s ease-out;\n       -o-transition:      -o-transform .3s ease-out;\n          transition:         transform .3s ease-out;\n  -webkit-transform: translate(0, -25%);\n      -ms-transform: translate(0, -25%);\n       -o-transform: translate(0, -25%);\n          transform: translate(0, -25%);\n}\n.modal.in .modal-dialog {\n  -webkit-transform: translate(0, 0);\n      -ms-transform: translate(0, 0);\n       -o-transform: translate(0, 0);\n          transform: translate(0, 0);\n}\n.modal-open .modal {\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: 10px;\n}\n.modal-content {\n  position: relative;\n  background-color: #fff;\n  -webkit-background-clip: padding-box;\n          background-clip: padding-box;\n  border: 1px solid #999;\n  border: 1px solid rgba(0, 0, 0, .2);\n  border-radius: 6px;\n  outline: 0;\n  -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5);\n          box-shadow: 0 3px 9px rgba(0, 0, 0, .5);\n}\n.modal-backdrop {\n  position: absolute;\n  top: 0;\n  right: 0;\n  left: 0;\n  background-color: #000;\n}\n.modal-backdrop.fade {\n  filter: alpha(opacity=0);\n  opacity: 0;\n}\n.modal-backdrop.in {\n  filter: alpha(opacity=50);\n  opacity: .5;\n}\n.modal-header {\n  min-height: 16.42857143px;\n  padding: 15px;\n  border-bottom: 1px solid #e5e5e5;\n}\n.modal-header .close {\n  margin-top: -2px;\n}\n.modal-title {\n  margin: 0;\n  line-height: 1.42857143;\n}\n.modal-body {\n  position: relative;\n  padding: 15px;\n}\n.modal-footer {\n  padding: 15px;\n  text-align: right;\n  border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n  margin-bottom: 0;\n  margin-left: 5px;\n}\n.modal-footer .btn-group .btn + .btn {\n  margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n  margin-left: 0;\n}\n.modal-scrollbar-measure {\n  position: absolute;\n  top: -9999px;\n  width: 50px;\n  height: 50px;\n  overflow: scroll;\n}\n@media (min-width: 768px) {\n  .modal-dialog {\n    width: 600px;\n    margin: 30px auto;\n  }\n  .modal-content {\n    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5);\n            box-shadow: 0 5px 15px rgba(0, 0, 0, .5);\n  }\n  .modal-sm {\n    width: 300px;\n  }\n}\n@media (min-width: 992px) {\n  .modal-lg {\n    width: 900px;\n  }\n}\n.tooltip {\n  position: absolute;\n  z-index: 1070;\n  display: block;\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 12px;\n  font-weight: normal;\n  line-height: 1.4;\n  visibility: visible;\n  filter: alpha(opacity=0);\n  opacity: 0;\n}\n.tooltip.in {\n  filter: alpha(opacity=90);\n  opacity: .9;\n}\n.tooltip.top {\n  padding: 5px 0;\n  margin-top: -3px;\n}\n.tooltip.right {\n  padding: 0 5px;\n  margin-left: 3px;\n}\n.tooltip.bottom {\n  padding: 5px 0;\n  margin-top: 3px;\n}\n.tooltip.left {\n  padding: 0 5px;\n  margin-left: -3px;\n}\n.tooltip-inner {\n  max-width: 200px;\n  padding: 3px 8px;\n  color: #fff;\n  text-align: center;\n  text-decoration: none;\n  background-color: #000;\n  border-radius: 4px;\n}\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n  bottom: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n  right: 5px;\n  bottom: 0;\n  margin-bottom: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n  bottom: 0;\n  left: 5px;\n  margin-bottom: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.right .tooltip-arrow {\n  top: 50%;\n  left: 0;\n  margin-top: -5px;\n  border-width: 5px 5px 5px 0;\n  border-right-color: #000;\n}\n.tooltip.left .tooltip-arrow {\n  top: 50%;\n  right: 0;\n  margin-top: -5px;\n  border-width: 5px 0 5px 5px;\n  border-left-color: #000;\n}\n.tooltip.bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n  top: 0;\n  right: 5px;\n  margin-top: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n  top: 0;\n  left: 5px;\n  margin-top: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1060;\n  display: none;\n  max-width: 276px;\n  padding: 1px;\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1.42857143;\n  text-align: left;\n  white-space: normal;\n  background-color: #fff;\n  -webkit-background-clip: padding-box;\n          background-clip: padding-box;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, .2);\n  border-radius: 6px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2);\n          box-shadow: 0 5px 10px rgba(0, 0, 0, .2);\n}\n.popover.top {\n  margin-top: -10px;\n}\n.popover.right {\n  margin-left: 10px;\n}\n.popover.bottom {\n  margin-top: 10px;\n}\n.popover.left {\n  margin-left: -10px;\n}\n.popover-title {\n  padding: 8px 14px;\n  margin: 0;\n  font-size: 14px;\n  background-color: #f7f7f7;\n  border-bottom: 1px solid #ebebeb;\n  border-radius: 5px 5px 0 0;\n}\n.popover-content {\n  padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n  position: absolute;\n  display: block;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.popover > .arrow {\n  border-width: 11px;\n}\n.popover > .arrow:after {\n  content: \"\";\n  border-width: 10px;\n}\n.popover.top > .arrow {\n  bottom: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-top-color: #999;\n  border-top-color: rgba(0, 0, 0, .25);\n  border-bottom-width: 0;\n}\n.popover.top > .arrow:after {\n  bottom: 1px;\n  margin-left: -10px;\n  content: \" \";\n  border-top-color: #fff;\n  border-bottom-width: 0;\n}\n.popover.right > .arrow {\n  top: 50%;\n  left: -11px;\n  margin-top: -11px;\n  border-right-color: #999;\n  border-right-color: rgba(0, 0, 0, .25);\n  border-left-width: 0;\n}\n.popover.right > .arrow:after {\n  bottom: -10px;\n  left: 1px;\n  content: \" \";\n  border-right-color: #fff;\n  border-left-width: 0;\n}\n.popover.bottom > .arrow {\n  top: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-top-width: 0;\n  border-bottom-color: #999;\n  border-bottom-color: rgba(0, 0, 0, .25);\n}\n.popover.bottom > .arrow:after {\n  top: 1px;\n  margin-left: -10px;\n  content: \" \";\n  border-top-width: 0;\n  border-bottom-color: #fff;\n}\n.popover.left > .arrow {\n  top: 50%;\n  right: -11px;\n  margin-top: -11px;\n  border-right-width: 0;\n  border-left-color: #999;\n  border-left-color: rgba(0, 0, 0, .25);\n}\n.popover.left > .arrow:after {\n  right: 1px;\n  bottom: -10px;\n  content: \" \";\n  border-right-width: 0;\n  border-left-color: #fff;\n}\n.carousel {\n  position: relative;\n}\n.carousel-inner {\n  position: relative;\n  width: 100%;\n  overflow: hidden;\n}\n.carousel-inner > .item {\n  position: relative;\n  display: none;\n  -webkit-transition: .6s ease-in-out left;\n       -o-transition: .6s ease-in-out left;\n          transition: .6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n  .carousel-inner > .item {\n    -webkit-transition: -webkit-transform .6s ease-in-out;\n         -o-transition:      -o-transform .6s ease-in-out;\n            transition:         transform .6s ease-in-out;\n\n    -webkit-backface-visibility: hidden;\n            backface-visibility: hidden;\n    -webkit-perspective: 1000;\n            perspective: 1000;\n  }\n  .carousel-inner > .item.next,\n  .carousel-inner > .item.active.right {\n    left: 0;\n    -webkit-transform: translate3d(100%, 0, 0);\n            transform: translate3d(100%, 0, 0);\n  }\n  .carousel-inner > .item.prev,\n  .carousel-inner > .item.active.left {\n    left: 0;\n    -webkit-transform: translate3d(-100%, 0, 0);\n            transform: translate3d(-100%, 0, 0);\n  }\n  .carousel-inner > .item.next.left,\n  .carousel-inner > .item.prev.right,\n  .carousel-inner > .item.active {\n    left: 0;\n    -webkit-transform: translate3d(0, 0, 0);\n            transform: translate3d(0, 0, 0);\n  }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  display: block;\n}\n.carousel-inner > .active {\n  left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n.carousel-inner > .next {\n  left: 100%;\n}\n.carousel-inner > .prev {\n  left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n  left: 0;\n}\n.carousel-inner > .active.left {\n  left: -100%;\n}\n.carousel-inner > .active.right {\n  left: 100%;\n}\n.carousel-control {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  width: 15%;\n  font-size: 20px;\n  color: #fff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, .6);\n  filter: alpha(opacity=50);\n  opacity: .5;\n}\n.carousel-control.left {\n  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);\n  background-image:      -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);\n  background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001)));\n  background-image:         linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n  background-repeat: repeat-x;\n}\n.carousel-control.right {\n  right: 0;\n  left: auto;\n  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);\n  background-image:      -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);\n  background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5)));\n  background-image:         linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n  background-repeat: repeat-x;\n}\n.carousel-control:hover,\n.carousel-control:focus {\n  color: #fff;\n  text-decoration: none;\n  filter: alpha(opacity=90);\n  outline: 0;\n  opacity: .9;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n  position: absolute;\n  top: 50%;\n  z-index: 5;\n  display: inline-block;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n  left: 50%;\n  margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n  right: 50%;\n  margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n  width: 20px;\n  height: 20px;\n  margin-top: -10px;\n  font-family: serif;\n}\n.carousel-control .icon-prev:before {\n  content: '\\2039';\n}\n.carousel-control .icon-next:before {\n  content: '\\203a';\n}\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  padding-left: 0;\n  margin-left: -30%;\n  text-align: center;\n  list-style: none;\n}\n.carousel-indicators li {\n  display: inline-block;\n  width: 10px;\n  height: 10px;\n  margin: 1px;\n  text-indent: -999px;\n  cursor: pointer;\n  background-color: #000 \\9;\n  background-color: rgba(0, 0, 0, 0);\n  border: 1px solid #fff;\n  border-radius: 10px;\n}\n.carousel-indicators .active {\n  width: 12px;\n  height: 12px;\n  margin: 0;\n  background-color: #fff;\n}\n.carousel-caption {\n  position: absolute;\n  right: 15%;\n  bottom: 20px;\n  left: 15%;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: #fff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, .6);\n}\n.carousel-caption .btn {\n  text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-prev,\n  .carousel-control .icon-next {\n    width: 30px;\n    height: 30px;\n    margin-top: -15px;\n    font-size: 30px;\n  }\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .icon-prev {\n    margin-left: -15px;\n  }\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-next {\n    margin-right: -15px;\n  }\n  .carousel-caption {\n    right: 20%;\n    left: 20%;\n    padding-bottom: 30px;\n  }\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \" \";\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-footer:after {\n  clear: both;\n}\n.center-block {\n  display: block;\n  margin-right: auto;\n  margin-left: auto;\n}\n.pull-right {\n  float: right !important;\n}\n.pull-left {\n  float: left !important;\n}\n.hide {\n  display: none !important;\n}\n.show {\n  display: block !important;\n}\n.invisible {\n  visibility: hidden;\n}\n.text-hide {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n.hidden {\n  display: none !important;\n  visibility: hidden !important;\n}\n.affix {\n  position: fixed;\n}\n@-ms-viewport {\n  width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n  display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n  display: none !important;\n}\n@media (max-width: 767px) {\n  .visible-xs {\n    display: block !important;\n  }\n  table.visible-xs {\n    display: table;\n  }\n  tr.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-xs,\n  td.visible-xs {\n    display: table-cell !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-block {\n    display: block !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-inline {\n    display: inline !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm {\n    display: block !important;\n  }\n  table.visible-sm {\n    display: table;\n  }\n  tr.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-sm,\n  td.visible-sm {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-block {\n    display: block !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md {\n    display: block !important;\n  }\n  table.visible-md {\n    display: table;\n  }\n  tr.visible-md {\n    display: table-row !important;\n  }\n  th.visible-md,\n  td.visible-md {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-block {\n    display: block !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg {\n    display: block !important;\n  }\n  table.visible-lg {\n    display: table;\n  }\n  tr.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-lg,\n  td.visible-lg {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-block {\n    display: block !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (max-width: 767px) {\n  .hidden-xs {\n    display: none !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-sm {\n    display: none !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-md {\n    display: none !important;\n  }\n}\n@media (min-width: 1200px) {\n  .hidden-lg {\n    display: none !important;\n  }\n}\n.visible-print {\n  display: none !important;\n}\n@media print {\n  .visible-print {\n    display: block !important;\n  }\n  table.visible-print {\n    display: table;\n  }\n  tr.visible-print {\n    display: table-row !important;\n  }\n  th.visible-print,\n  td.visible-print {\n    display: table-cell !important;\n  }\n}\n.visible-print-block {\n  display: none !important;\n}\n@media print {\n  .visible-print-block {\n    display: block !important;\n  }\n}\n.visible-print-inline {\n  display: none !important;\n}\n@media print {\n  .visible-print-inline {\n    display: inline !important;\n  }\n}\n.visible-print-inline-block {\n  display: none !important;\n}\n@media print {\n  .visible-print-inline-block {\n    display: inline-block !important;\n  }\n}\n@media print {\n  .hidden-print {\n    display: none !important;\n  }\n}\n/*# sourceMappingURL=bootstrap.css.map */\n"
  },
  {
    "path": "examples/featureTests/dist/js/bootstrap.js",
    "content": "/*!\n * Bootstrap v3.3.1 (http://getbootstrap.com)\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\nif (typeof jQuery === 'undefined') {\n  throw new Error('Bootstrap\\'s JavaScript requires jQuery')\n}\n\n+function ($) {\n  var version = $.fn.jquery.split(' ')[0].split('.')\n  if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1)) {\n    throw new Error('Bootstrap\\'s JavaScript requires jQuery version 1.9.1 or higher')\n  }\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: transition.js v3.3.1\n * http://getbootstrap.com/javascript/#transitions\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)\n  // ============================================================\n\n  function transitionEnd() {\n    var el = document.createElement('bootstrap')\n\n    var transEndEventNames = {\n      WebkitTransition : 'webkitTransitionEnd',\n      MozTransition    : 'transitionend',\n      OTransition      : 'oTransitionEnd otransitionend',\n      transition       : 'transitionend'\n    }\n\n    for (var name in transEndEventNames) {\n      if (el.style[name] !== undefined) {\n        return { end: transEndEventNames[name] }\n      }\n    }\n\n    return false // explicit for ie8 (  ._.)\n  }\n\n  // http://blog.alexmaccaw.com/css-transitions\n  $.fn.emulateTransitionEnd = function (duration) {\n    var called = false\n    var $el = this\n    $(this).one('bsTransitionEnd', function () { called = true })\n    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }\n    setTimeout(callback, duration)\n    return this\n  }\n\n  $(function () {\n    $.support.transition = transitionEnd()\n\n    if (!$.support.transition) return\n\n    $.event.special.bsTransitionEnd = {\n      bindType: $.support.transition.end,\n      delegateType: $.support.transition.end,\n      handle: function (e) {\n        if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)\n      }\n    }\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: alert.js v3.3.1\n * http://getbootstrap.com/javascript/#alerts\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // ALERT CLASS DEFINITION\n  // ======================\n\n  var dismiss = '[data-dismiss=\"alert\"]'\n  var Alert   = function (el) {\n    $(el).on('click', dismiss, this.close)\n  }\n\n  Alert.VERSION = '3.3.1'\n\n  Alert.TRANSITION_DURATION = 150\n\n  Alert.prototype.close = function (e) {\n    var $this    = $(this)\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    var $parent = $(selector)\n\n    if (e) e.preventDefault()\n\n    if (!$parent.length) {\n      $parent = $this.closest('.alert')\n    }\n\n    $parent.trigger(e = $.Event('close.bs.alert'))\n\n    if (e.isDefaultPrevented()) return\n\n    $parent.removeClass('in')\n\n    function removeElement() {\n      // detach from parent, fire event then clean up data\n      $parent.detach().trigger('closed.bs.alert').remove()\n    }\n\n    $.support.transition && $parent.hasClass('fade') ?\n      $parent\n        .one('bsTransitionEnd', removeElement)\n        .emulateTransitionEnd(Alert.TRANSITION_DURATION) :\n      removeElement()\n  }\n\n\n  // ALERT PLUGIN DEFINITION\n  // =======================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.alert')\n\n      if (!data) $this.data('bs.alert', (data = new Alert(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  var old = $.fn.alert\n\n  $.fn.alert             = Plugin\n  $.fn.alert.Constructor = Alert\n\n\n  // ALERT NO CONFLICT\n  // =================\n\n  $.fn.alert.noConflict = function () {\n    $.fn.alert = old\n    return this\n  }\n\n\n  // ALERT DATA-API\n  // ==============\n\n  $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: button.js v3.3.1\n * http://getbootstrap.com/javascript/#buttons\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // BUTTON PUBLIC CLASS DEFINITION\n  // ==============================\n\n  var Button = function (element, options) {\n    this.$element  = $(element)\n    this.options   = $.extend({}, Button.DEFAULTS, options)\n    this.isLoading = false\n  }\n\n  Button.VERSION  = '3.3.1'\n\n  Button.DEFAULTS = {\n    loadingText: 'loading...'\n  }\n\n  Button.prototype.setState = function (state) {\n    var d    = 'disabled'\n    var $el  = this.$element\n    var val  = $el.is('input') ? 'val' : 'html'\n    var data = $el.data()\n\n    state = state + 'Text'\n\n    if (data.resetText == null) $el.data('resetText', $el[val]())\n\n    // push to event loop to allow forms to submit\n    setTimeout($.proxy(function () {\n      $el[val](data[state] == null ? this.options[state] : data[state])\n\n      if (state == 'loadingText') {\n        this.isLoading = true\n        $el.addClass(d).attr(d, d)\n      } else if (this.isLoading) {\n        this.isLoading = false\n        $el.removeClass(d).removeAttr(d)\n      }\n    }, this), 0)\n  }\n\n  Button.prototype.toggle = function () {\n    var changed = true\n    var $parent = this.$element.closest('[data-toggle=\"buttons\"]')\n\n    if ($parent.length) {\n      var $input = this.$element.find('input')\n      if ($input.prop('type') == 'radio') {\n        if ($input.prop('checked') && this.$element.hasClass('active')) changed = false\n        else $parent.find('.active').removeClass('active')\n      }\n      if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change')\n    } else {\n      this.$element.attr('aria-pressed', !this.$element.hasClass('active'))\n    }\n\n    if (changed) this.$element.toggleClass('active')\n  }\n\n\n  // BUTTON PLUGIN DEFINITION\n  // ========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.button')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.button', (data = new Button(this, options)))\n\n      if (option == 'toggle') data.toggle()\n      else if (option) data.setState(option)\n    })\n  }\n\n  var old = $.fn.button\n\n  $.fn.button             = Plugin\n  $.fn.button.Constructor = Button\n\n\n  // BUTTON NO CONFLICT\n  // ==================\n\n  $.fn.button.noConflict = function () {\n    $.fn.button = old\n    return this\n  }\n\n\n  // BUTTON DATA-API\n  // ===============\n\n  $(document)\n    .on('click.bs.button.data-api', '[data-toggle^=\"button\"]', function (e) {\n      var $btn = $(e.target)\n      if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')\n      Plugin.call($btn, 'toggle')\n      e.preventDefault()\n    })\n    .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^=\"button\"]', function (e) {\n      $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))\n    })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: carousel.js v3.3.1\n * http://getbootstrap.com/javascript/#carousel\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // CAROUSEL CLASS DEFINITION\n  // =========================\n\n  var Carousel = function (element, options) {\n    this.$element    = $(element)\n    this.$indicators = this.$element.find('.carousel-indicators')\n    this.options     = options\n    this.paused      =\n    this.sliding     =\n    this.interval    =\n    this.$active     =\n    this.$items      = null\n\n    this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))\n\n    this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element\n      .on('mouseenter.bs.carousel', $.proxy(this.pause, this))\n      .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))\n  }\n\n  Carousel.VERSION  = '3.3.1'\n\n  Carousel.TRANSITION_DURATION = 600\n\n  Carousel.DEFAULTS = {\n    interval: 5000,\n    pause: 'hover',\n    wrap: true,\n    keyboard: true\n  }\n\n  Carousel.prototype.keydown = function (e) {\n    if (/input|textarea/i.test(e.target.tagName)) return\n    switch (e.which) {\n      case 37: this.prev(); break\n      case 39: this.next(); break\n      default: return\n    }\n\n    e.preventDefault()\n  }\n\n  Carousel.prototype.cycle = function (e) {\n    e || (this.paused = false)\n\n    this.interval && clearInterval(this.interval)\n\n    this.options.interval\n      && !this.paused\n      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))\n\n    return this\n  }\n\n  Carousel.prototype.getItemIndex = function (item) {\n    this.$items = item.parent().children('.item')\n    return this.$items.index(item || this.$active)\n  }\n\n  Carousel.prototype.getItemForDirection = function (direction, active) {\n    var delta = direction == 'prev' ? -1 : 1\n    var activeIndex = this.getItemIndex(active)\n    var itemIndex = (activeIndex + delta) % this.$items.length\n    return this.$items.eq(itemIndex)\n  }\n\n  Carousel.prototype.to = function (pos) {\n    var that        = this\n    var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))\n\n    if (pos > (this.$items.length - 1) || pos < 0) return\n\n    if (this.sliding)       return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, \"slid\"\n    if (activeIndex == pos) return this.pause().cycle()\n\n    return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))\n  }\n\n  Carousel.prototype.pause = function (e) {\n    e || (this.paused = true)\n\n    if (this.$element.find('.next, .prev').length && $.support.transition) {\n      this.$element.trigger($.support.transition.end)\n      this.cycle(true)\n    }\n\n    this.interval = clearInterval(this.interval)\n\n    return this\n  }\n\n  Carousel.prototype.next = function () {\n    if (this.sliding) return\n    return this.slide('next')\n  }\n\n  Carousel.prototype.prev = function () {\n    if (this.sliding) return\n    return this.slide('prev')\n  }\n\n  Carousel.prototype.slide = function (type, next) {\n    var $active   = this.$element.find('.item.active')\n    var $next     = next || this.getItemForDirection(type, $active)\n    var isCycling = this.interval\n    var direction = type == 'next' ? 'left' : 'right'\n    var fallback  = type == 'next' ? 'first' : 'last'\n    var that      = this\n\n    if (!$next.length) {\n      if (!this.options.wrap) return\n      $next = this.$element.find('.item')[fallback]()\n    }\n\n    if ($next.hasClass('active')) return (this.sliding = false)\n\n    var relatedTarget = $next[0]\n    var slideEvent = $.Event('slide.bs.carousel', {\n      relatedTarget: relatedTarget,\n      direction: direction\n    })\n    this.$element.trigger(slideEvent)\n    if (slideEvent.isDefaultPrevented()) return\n\n    this.sliding = true\n\n    isCycling && this.pause()\n\n    if (this.$indicators.length) {\n      this.$indicators.find('.active').removeClass('active')\n      var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])\n      $nextIndicator && $nextIndicator.addClass('active')\n    }\n\n    var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, \"slid\"\n    if ($.support.transition && this.$element.hasClass('slide')) {\n      $next.addClass(type)\n      $next[0].offsetWidth // force reflow\n      $active.addClass(direction)\n      $next.addClass(direction)\n      $active\n        .one('bsTransitionEnd', function () {\n          $next.removeClass([type, direction].join(' ')).addClass('active')\n          $active.removeClass(['active', direction].join(' '))\n          that.sliding = false\n          setTimeout(function () {\n            that.$element.trigger(slidEvent)\n          }, 0)\n        })\n        .emulateTransitionEnd(Carousel.TRANSITION_DURATION)\n    } else {\n      $active.removeClass('active')\n      $next.addClass('active')\n      this.sliding = false\n      this.$element.trigger(slidEvent)\n    }\n\n    isCycling && this.cycle()\n\n    return this\n  }\n\n\n  // CAROUSEL PLUGIN DEFINITION\n  // ==========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.carousel')\n      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)\n      var action  = typeof option == 'string' ? option : options.slide\n\n      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))\n      if (typeof option == 'number') data.to(option)\n      else if (action) data[action]()\n      else if (options.interval) data.pause().cycle()\n    })\n  }\n\n  var old = $.fn.carousel\n\n  $.fn.carousel             = Plugin\n  $.fn.carousel.Constructor = Carousel\n\n\n  // CAROUSEL NO CONFLICT\n  // ====================\n\n  $.fn.carousel.noConflict = function () {\n    $.fn.carousel = old\n    return this\n  }\n\n\n  // CAROUSEL DATA-API\n  // =================\n\n  var clickHandler = function (e) {\n    var href\n    var $this   = $(this)\n    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) // strip for ie7\n    if (!$target.hasClass('carousel')) return\n    var options = $.extend({}, $target.data(), $this.data())\n    var slideIndex = $this.attr('data-slide-to')\n    if (slideIndex) options.interval = false\n\n    Plugin.call($target, options)\n\n    if (slideIndex) {\n      $target.data('bs.carousel').to(slideIndex)\n    }\n\n    e.preventDefault()\n  }\n\n  $(document)\n    .on('click.bs.carousel.data-api', '[data-slide]', clickHandler)\n    .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)\n\n  $(window).on('load', function () {\n    $('[data-ride=\"carousel\"]').each(function () {\n      var $carousel = $(this)\n      Plugin.call($carousel, $carousel.data())\n    })\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: collapse.js v3.3.1\n * http://getbootstrap.com/javascript/#collapse\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // COLLAPSE PUBLIC CLASS DEFINITION\n  // ================================\n\n  var Collapse = function (element, options) {\n    this.$element      = $(element)\n    this.options       = $.extend({}, Collapse.DEFAULTS, options)\n    this.$trigger      = $(this.options.trigger).filter('[href=\"#' + element.id + '\"], [data-target=\"#' + element.id + '\"]')\n    this.transitioning = null\n\n    if (this.options.parent) {\n      this.$parent = this.getParent()\n    } else {\n      this.addAriaAndCollapsedClass(this.$element, this.$trigger)\n    }\n\n    if (this.options.toggle) this.toggle()\n  }\n\n  Collapse.VERSION  = '3.3.1'\n\n  Collapse.TRANSITION_DURATION = 350\n\n  Collapse.DEFAULTS = {\n    toggle: true,\n    trigger: '[data-toggle=\"collapse\"]'\n  }\n\n  Collapse.prototype.dimension = function () {\n    var hasWidth = this.$element.hasClass('width')\n    return hasWidth ? 'width' : 'height'\n  }\n\n  Collapse.prototype.show = function () {\n    if (this.transitioning || this.$element.hasClass('in')) return\n\n    var activesData\n    var actives = this.$parent && this.$parent.find('> .panel').children('.in, .collapsing')\n\n    if (actives && actives.length) {\n      activesData = actives.data('bs.collapse')\n      if (activesData && activesData.transitioning) return\n    }\n\n    var startEvent = $.Event('show.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    if (actives && actives.length) {\n      Plugin.call(actives, 'hide')\n      activesData || actives.data('bs.collapse', null)\n    }\n\n    var dimension = this.dimension()\n\n    this.$element\n      .removeClass('collapse')\n      .addClass('collapsing')[dimension](0)\n      .attr('aria-expanded', true)\n\n    this.$trigger\n      .removeClass('collapsed')\n      .attr('aria-expanded', true)\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.$element\n        .removeClass('collapsing')\n        .addClass('collapse in')[dimension]('')\n      this.transitioning = 0\n      this.$element\n        .trigger('shown.bs.collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    var scrollSize = $.camelCase(['scroll', dimension].join('-'))\n\n    this.$element\n      .one('bsTransitionEnd', $.proxy(complete, this))\n      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])\n  }\n\n  Collapse.prototype.hide = function () {\n    if (this.transitioning || !this.$element.hasClass('in')) return\n\n    var startEvent = $.Event('hide.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    var dimension = this.dimension()\n\n    this.$element[dimension](this.$element[dimension]())[0].offsetHeight\n\n    this.$element\n      .addClass('collapsing')\n      .removeClass('collapse in')\n      .attr('aria-expanded', false)\n\n    this.$trigger\n      .addClass('collapsed')\n      .attr('aria-expanded', false)\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.transitioning = 0\n      this.$element\n        .removeClass('collapsing')\n        .addClass('collapse')\n        .trigger('hidden.bs.collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    this.$element\n      [dimension](0)\n      .one('bsTransitionEnd', $.proxy(complete, this))\n      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)\n  }\n\n  Collapse.prototype.toggle = function () {\n    this[this.$element.hasClass('in') ? 'hide' : 'show']()\n  }\n\n  Collapse.prototype.getParent = function () {\n    return $(this.options.parent)\n      .find('[data-toggle=\"collapse\"][data-parent=\"' + this.options.parent + '\"]')\n      .each($.proxy(function (i, element) {\n        var $element = $(element)\n        this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)\n      }, this))\n      .end()\n  }\n\n  Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {\n    var isOpen = $element.hasClass('in')\n\n    $element.attr('aria-expanded', isOpen)\n    $trigger\n      .toggleClass('collapsed', !isOpen)\n      .attr('aria-expanded', isOpen)\n  }\n\n  function getTargetFromTrigger($trigger) {\n    var href\n    var target = $trigger.attr('data-target')\n      || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '') // strip for ie7\n\n    return $(target)\n  }\n\n\n  // COLLAPSE PLUGIN DEFINITION\n  // ==========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.collapse')\n      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\n      if (!data && options.toggle && option == 'show') options.toggle = false\n      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.collapse\n\n  $.fn.collapse             = Plugin\n  $.fn.collapse.Constructor = Collapse\n\n\n  // COLLAPSE NO CONFLICT\n  // ====================\n\n  $.fn.collapse.noConflict = function () {\n    $.fn.collapse = old\n    return this\n  }\n\n\n  // COLLAPSE DATA-API\n  // =================\n\n  $(document).on('click.bs.collapse.data-api', '[data-toggle=\"collapse\"]', function (e) {\n    var $this   = $(this)\n\n    if (!$this.attr('data-target')) e.preventDefault()\n\n    var $target = getTargetFromTrigger($this)\n    var data    = $target.data('bs.collapse')\n    var option  = data ? 'toggle' : $.extend({}, $this.data(), { trigger: this })\n\n    Plugin.call($target, option)\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: dropdown.js v3.3.1\n * http://getbootstrap.com/javascript/#dropdowns\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // DROPDOWN CLASS DEFINITION\n  // =========================\n\n  var backdrop = '.dropdown-backdrop'\n  var toggle   = '[data-toggle=\"dropdown\"]'\n  var Dropdown = function (element) {\n    $(element).on('click.bs.dropdown', this.toggle)\n  }\n\n  Dropdown.VERSION = '3.3.1'\n\n  Dropdown.prototype.toggle = function (e) {\n    var $this = $(this)\n\n    if ($this.is('.disabled, :disabled')) return\n\n    var $parent  = getParent($this)\n    var isActive = $parent.hasClass('open')\n\n    clearMenus()\n\n    if (!isActive) {\n      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {\n        // if mobile we use a backdrop because click events don't delegate\n        $('<div class=\"dropdown-backdrop\"/>').insertAfter($(this)).on('click', clearMenus)\n      }\n\n      var relatedTarget = { relatedTarget: this }\n      $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))\n\n      if (e.isDefaultPrevented()) return\n\n      $this\n        .trigger('focus')\n        .attr('aria-expanded', 'true')\n\n      $parent\n        .toggleClass('open')\n        .trigger('shown.bs.dropdown', relatedTarget)\n    }\n\n    return false\n  }\n\n  Dropdown.prototype.keydown = function (e) {\n    if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return\n\n    var $this = $(this)\n\n    e.preventDefault()\n    e.stopPropagation()\n\n    if ($this.is('.disabled, :disabled')) return\n\n    var $parent  = getParent($this)\n    var isActive = $parent.hasClass('open')\n\n    if ((!isActive && e.which != 27) || (isActive && e.which == 27)) {\n      if (e.which == 27) $parent.find(toggle).trigger('focus')\n      return $this.trigger('click')\n    }\n\n    var desc = ' li:not(.divider):visible a'\n    var $items = $parent.find('[role=\"menu\"]' + desc + ', [role=\"listbox\"]' + desc)\n\n    if (!$items.length) return\n\n    var index = $items.index(e.target)\n\n    if (e.which == 38 && index > 0)                 index--                        // up\n    if (e.which == 40 && index < $items.length - 1) index++                        // down\n    if (!~index)                                      index = 0\n\n    $items.eq(index).trigger('focus')\n  }\n\n  function clearMenus(e) {\n    if (e && e.which === 3) return\n    $(backdrop).remove()\n    $(toggle).each(function () {\n      var $this         = $(this)\n      var $parent       = getParent($this)\n      var relatedTarget = { relatedTarget: this }\n\n      if (!$parent.hasClass('open')) return\n\n      $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))\n\n      if (e.isDefaultPrevented()) return\n\n      $this.attr('aria-expanded', 'false')\n      $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget)\n    })\n  }\n\n  function getParent($this) {\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    var $parent = selector && $(selector)\n\n    return $parent && $parent.length ? $parent : $this.parent()\n  }\n\n\n  // DROPDOWN PLUGIN DEFINITION\n  // ==========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.dropdown')\n\n      if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  var old = $.fn.dropdown\n\n  $.fn.dropdown             = Plugin\n  $.fn.dropdown.Constructor = Dropdown\n\n\n  // DROPDOWN NO CONFLICT\n  // ====================\n\n  $.fn.dropdown.noConflict = function () {\n    $.fn.dropdown = old\n    return this\n  }\n\n\n  // APPLY TO STANDARD DROPDOWN ELEMENTS\n  // ===================================\n\n  $(document)\n    .on('click.bs.dropdown.data-api', clearMenus)\n    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })\n    .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)\n    .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)\n    .on('keydown.bs.dropdown.data-api', '[role=\"menu\"]', Dropdown.prototype.keydown)\n    .on('keydown.bs.dropdown.data-api', '[role=\"listbox\"]', Dropdown.prototype.keydown)\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: modal.js v3.3.1\n * http://getbootstrap.com/javascript/#modals\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // MODAL CLASS DEFINITION\n  // ======================\n\n  var Modal = function (element, options) {\n    this.options        = options\n    this.$body          = $(document.body)\n    this.$element       = $(element)\n    this.$backdrop      =\n    this.isShown        = null\n    this.scrollbarWidth = 0\n\n    if (this.options.remote) {\n      this.$element\n        .find('.modal-content')\n        .load(this.options.remote, $.proxy(function () {\n          this.$element.trigger('loaded.bs.modal')\n        }, this))\n    }\n  }\n\n  Modal.VERSION  = '3.3.1'\n\n  Modal.TRANSITION_DURATION = 300\n  Modal.BACKDROP_TRANSITION_DURATION = 150\n\n  Modal.DEFAULTS = {\n    backdrop: true,\n    keyboard: true,\n    show: true\n  }\n\n  Modal.prototype.toggle = function (_relatedTarget) {\n    return this.isShown ? this.hide() : this.show(_relatedTarget)\n  }\n\n  Modal.prototype.show = function (_relatedTarget) {\n    var that = this\n    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })\n\n    this.$element.trigger(e)\n\n    if (this.isShown || e.isDefaultPrevented()) return\n\n    this.isShown = true\n\n    this.checkScrollbar()\n    this.setScrollbar()\n    this.$body.addClass('modal-open')\n\n    this.escape()\n    this.resize()\n\n    this.$element.on('click.dismiss.bs.modal', '[data-dismiss=\"modal\"]', $.proxy(this.hide, this))\n\n    this.backdrop(function () {\n      var transition = $.support.transition && that.$element.hasClass('fade')\n\n      if (!that.$element.parent().length) {\n        that.$element.appendTo(that.$body) // don't move modals dom position\n      }\n\n      that.$element\n        .show()\n        .scrollTop(0)\n\n      if (that.options.backdrop) that.adjustBackdrop()\n      that.adjustDialog()\n\n      if (transition) {\n        that.$element[0].offsetWidth // force reflow\n      }\n\n      that.$element\n        .addClass('in')\n        .attr('aria-hidden', false)\n\n      that.enforceFocus()\n\n      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })\n\n      transition ?\n        that.$element.find('.modal-dialog') // wait for modal to slide in\n          .one('bsTransitionEnd', function () {\n            that.$element.trigger('focus').trigger(e)\n          })\n          .emulateTransitionEnd(Modal.TRANSITION_DURATION) :\n        that.$element.trigger('focus').trigger(e)\n    })\n  }\n\n  Modal.prototype.hide = function (e) {\n    if (e) e.preventDefault()\n\n    e = $.Event('hide.bs.modal')\n\n    this.$element.trigger(e)\n\n    if (!this.isShown || e.isDefaultPrevented()) return\n\n    this.isShown = false\n\n    this.escape()\n    this.resize()\n\n    $(document).off('focusin.bs.modal')\n\n    this.$element\n      .removeClass('in')\n      .attr('aria-hidden', true)\n      .off('click.dismiss.bs.modal')\n\n    $.support.transition && this.$element.hasClass('fade') ?\n      this.$element\n        .one('bsTransitionEnd', $.proxy(this.hideModal, this))\n        .emulateTransitionEnd(Modal.TRANSITION_DURATION) :\n      this.hideModal()\n  }\n\n  Modal.prototype.enforceFocus = function () {\n    $(document)\n      .off('focusin.bs.modal') // guard against infinite focus loop\n      .on('focusin.bs.modal', $.proxy(function (e) {\n        if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {\n          this.$element.trigger('focus')\n        }\n      }, this))\n  }\n\n  Modal.prototype.escape = function () {\n    if (this.isShown && this.options.keyboard) {\n      this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {\n        e.which == 27 && this.hide()\n      }, this))\n    } else if (!this.isShown) {\n      this.$element.off('keydown.dismiss.bs.modal')\n    }\n  }\n\n  Modal.prototype.resize = function () {\n    if (this.isShown) {\n      $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))\n    } else {\n      $(window).off('resize.bs.modal')\n    }\n  }\n\n  Modal.prototype.hideModal = function () {\n    var that = this\n    this.$element.hide()\n    this.backdrop(function () {\n      that.$body.removeClass('modal-open')\n      that.resetAdjustments()\n      that.resetScrollbar()\n      that.$element.trigger('hidden.bs.modal')\n    })\n  }\n\n  Modal.prototype.removeBackdrop = function () {\n    this.$backdrop && this.$backdrop.remove()\n    this.$backdrop = null\n  }\n\n  Modal.prototype.backdrop = function (callback) {\n    var that = this\n    var animate = this.$element.hasClass('fade') ? 'fade' : ''\n\n    if (this.isShown && this.options.backdrop) {\n      var doAnimate = $.support.transition && animate\n\n      this.$backdrop = $('<div class=\"modal-backdrop ' + animate + '\" />')\n        .prependTo(this.$element)\n        .on('click.dismiss.bs.modal', $.proxy(function (e) {\n          if (e.target !== e.currentTarget) return\n          this.options.backdrop == 'static'\n            ? this.$element[0].focus.call(this.$element[0])\n            : this.hide.call(this)\n        }, this))\n\n      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow\n\n      this.$backdrop.addClass('in')\n\n      if (!callback) return\n\n      doAnimate ?\n        this.$backdrop\n          .one('bsTransitionEnd', callback)\n          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :\n        callback()\n\n    } else if (!this.isShown && this.$backdrop) {\n      this.$backdrop.removeClass('in')\n\n      var callbackRemove = function () {\n        that.removeBackdrop()\n        callback && callback()\n      }\n      $.support.transition && this.$element.hasClass('fade') ?\n        this.$backdrop\n          .one('bsTransitionEnd', callbackRemove)\n          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :\n        callbackRemove()\n\n    } else if (callback) {\n      callback()\n    }\n  }\n\n  // these following methods are used to handle overflowing modals\n\n  Modal.prototype.handleUpdate = function () {\n    if (this.options.backdrop) this.adjustBackdrop()\n    this.adjustDialog()\n  }\n\n  Modal.prototype.adjustBackdrop = function () {\n    this.$backdrop\n      .css('height', 0)\n      .css('height', this.$element[0].scrollHeight)\n  }\n\n  Modal.prototype.adjustDialog = function () {\n    var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight\n\n    this.$element.css({\n      paddingLeft:  !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',\n      paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''\n    })\n  }\n\n  Modal.prototype.resetAdjustments = function () {\n    this.$element.css({\n      paddingLeft: '',\n      paddingRight: ''\n    })\n  }\n\n  Modal.prototype.checkScrollbar = function () {\n    this.bodyIsOverflowing = document.body.scrollHeight > document.documentElement.clientHeight\n    this.scrollbarWidth = this.measureScrollbar()\n  }\n\n  Modal.prototype.setScrollbar = function () {\n    var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)\n    if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)\n  }\n\n  Modal.prototype.resetScrollbar = function () {\n    this.$body.css('padding-right', '')\n  }\n\n  Modal.prototype.measureScrollbar = function () { // thx walsh\n    var scrollDiv = document.createElement('div')\n    scrollDiv.className = 'modal-scrollbar-measure'\n    this.$body.append(scrollDiv)\n    var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth\n    this.$body[0].removeChild(scrollDiv)\n    return scrollbarWidth\n  }\n\n\n  // MODAL PLUGIN DEFINITION\n  // =======================\n\n  function Plugin(option, _relatedTarget) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.modal')\n      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\n      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))\n      if (typeof option == 'string') data[option](_relatedTarget)\n      else if (options.show) data.show(_relatedTarget)\n    })\n  }\n\n  var old = $.fn.modal\n\n  $.fn.modal             = Plugin\n  $.fn.modal.Constructor = Modal\n\n\n  // MODAL NO CONFLICT\n  // =================\n\n  $.fn.modal.noConflict = function () {\n    $.fn.modal = old\n    return this\n  }\n\n\n  // MODAL DATA-API\n  // ==============\n\n  $(document).on('click.bs.modal.data-api', '[data-toggle=\"modal\"]', function (e) {\n    var $this   = $(this)\n    var href    = $this.attr('href')\n    var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\\s]+$)/, ''))) // strip for ie7\n    var option  = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())\n\n    if ($this.is('a')) e.preventDefault()\n\n    $target.one('show.bs.modal', function (showEvent) {\n      if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown\n      $target.one('hidden.bs.modal', function () {\n        $this.is(':visible') && $this.trigger('focus')\n      })\n    })\n    Plugin.call($target, option, this)\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: tooltip.js v3.3.1\n * http://getbootstrap.com/javascript/#tooltip\n * Inspired by the original jQuery.tipsy by Jason Frame\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // TOOLTIP PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Tooltip = function (element, options) {\n    this.type       =\n    this.options    =\n    this.enabled    =\n    this.timeout    =\n    this.hoverState =\n    this.$element   = null\n\n    this.init('tooltip', element, options)\n  }\n\n  Tooltip.VERSION  = '3.3.1'\n\n  Tooltip.TRANSITION_DURATION = 150\n\n  Tooltip.DEFAULTS = {\n    animation: true,\n    placement: 'top',\n    selector: false,\n    template: '<div class=\"tooltip\" role=\"tooltip\"><div class=\"tooltip-arrow\"></div><div class=\"tooltip-inner\"></div></div>',\n    trigger: 'hover focus',\n    title: '',\n    delay: 0,\n    html: false,\n    container: false,\n    viewport: {\n      selector: 'body',\n      padding: 0\n    }\n  }\n\n  Tooltip.prototype.init = function (type, element, options) {\n    this.enabled   = true\n    this.type      = type\n    this.$element  = $(element)\n    this.options   = this.getOptions(options)\n    this.$viewport = this.options.viewport && $(this.options.viewport.selector || this.options.viewport)\n\n    var triggers = this.options.trigger.split(' ')\n\n    for (var i = triggers.length; i--;) {\n      var trigger = triggers[i]\n\n      if (trigger == 'click') {\n        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))\n      } else if (trigger != 'manual') {\n        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focusin'\n        var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'\n\n        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))\n        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))\n      }\n    }\n\n    this.options.selector ?\n      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :\n      this.fixTitle()\n  }\n\n  Tooltip.prototype.getDefaults = function () {\n    return Tooltip.DEFAULTS\n  }\n\n  Tooltip.prototype.getOptions = function (options) {\n    options = $.extend({}, this.getDefaults(), this.$element.data(), options)\n\n    if (options.delay && typeof options.delay == 'number') {\n      options.delay = {\n        show: options.delay,\n        hide: options.delay\n      }\n    }\n\n    return options\n  }\n\n  Tooltip.prototype.getDelegateOptions = function () {\n    var options  = {}\n    var defaults = this.getDefaults()\n\n    this._options && $.each(this._options, function (key, value) {\n      if (defaults[key] != value) options[key] = value\n    })\n\n    return options\n  }\n\n  Tooltip.prototype.enter = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget).data('bs.' + this.type)\n\n    if (self && self.$tip && self.$tip.is(':visible')) {\n      self.hoverState = 'in'\n      return\n    }\n\n    if (!self) {\n      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())\n      $(obj.currentTarget).data('bs.' + this.type, self)\n    }\n\n    clearTimeout(self.timeout)\n\n    self.hoverState = 'in'\n\n    if (!self.options.delay || !self.options.delay.show) return self.show()\n\n    self.timeout = setTimeout(function () {\n      if (self.hoverState == 'in') self.show()\n    }, self.options.delay.show)\n  }\n\n  Tooltip.prototype.leave = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget).data('bs.' + this.type)\n\n    if (!self) {\n      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())\n      $(obj.currentTarget).data('bs.' + this.type, self)\n    }\n\n    clearTimeout(self.timeout)\n\n    self.hoverState = 'out'\n\n    if (!self.options.delay || !self.options.delay.hide) return self.hide()\n\n    self.timeout = setTimeout(function () {\n      if (self.hoverState == 'out') self.hide()\n    }, self.options.delay.hide)\n  }\n\n  Tooltip.prototype.show = function () {\n    var e = $.Event('show.bs.' + this.type)\n\n    if (this.hasContent() && this.enabled) {\n      this.$element.trigger(e)\n\n      var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])\n      if (e.isDefaultPrevented() || !inDom) return\n      var that = this\n\n      var $tip = this.tip()\n\n      var tipId = this.getUID(this.type)\n\n      this.setContent()\n      $tip.attr('id', tipId)\n      this.$element.attr('aria-describedby', tipId)\n\n      if (this.options.animation) $tip.addClass('fade')\n\n      var placement = typeof this.options.placement == 'function' ?\n        this.options.placement.call(this, $tip[0], this.$element[0]) :\n        this.options.placement\n\n      var autoToken = /\\s?auto?\\s?/i\n      var autoPlace = autoToken.test(placement)\n      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'\n\n      $tip\n        .detach()\n        .css({ top: 0, left: 0, display: 'block' })\n        .addClass(placement)\n        .data('bs.' + this.type, this)\n\n      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)\n\n      var pos          = this.getPosition()\n      var actualWidth  = $tip[0].offsetWidth\n      var actualHeight = $tip[0].offsetHeight\n\n      if (autoPlace) {\n        var orgPlacement = placement\n        var $container   = this.options.container ? $(this.options.container) : this.$element.parent()\n        var containerDim = this.getPosition($container)\n\n        placement = placement == 'bottom' && pos.bottom + actualHeight > containerDim.bottom ? 'top'    :\n                    placement == 'top'    && pos.top    - actualHeight < containerDim.top    ? 'bottom' :\n                    placement == 'right'  && pos.right  + actualWidth  > containerDim.width  ? 'left'   :\n                    placement == 'left'   && pos.left   - actualWidth  < containerDim.left   ? 'right'  :\n                    placement\n\n        $tip\n          .removeClass(orgPlacement)\n          .addClass(placement)\n      }\n\n      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)\n\n      this.applyPlacement(calculatedOffset, placement)\n\n      var complete = function () {\n        var prevHoverState = that.hoverState\n        that.$element.trigger('shown.bs.' + that.type)\n        that.hoverState = null\n\n        if (prevHoverState == 'out') that.leave(that)\n      }\n\n      $.support.transition && this.$tip.hasClass('fade') ?\n        $tip\n          .one('bsTransitionEnd', complete)\n          .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :\n        complete()\n    }\n  }\n\n  Tooltip.prototype.applyPlacement = function (offset, placement) {\n    var $tip   = this.tip()\n    var width  = $tip[0].offsetWidth\n    var height = $tip[0].offsetHeight\n\n    // manually read margins because getBoundingClientRect includes difference\n    var marginTop = parseInt($tip.css('margin-top'), 10)\n    var marginLeft = parseInt($tip.css('margin-left'), 10)\n\n    // we must check for NaN for ie 8/9\n    if (isNaN(marginTop))  marginTop  = 0\n    if (isNaN(marginLeft)) marginLeft = 0\n\n    offset.top  = offset.top  + marginTop\n    offset.left = offset.left + marginLeft\n\n    // $.fn.offset doesn't round pixel values\n    // so we use setOffset directly with our own function B-0\n    $.offset.setOffset($tip[0], $.extend({\n      using: function (props) {\n        $tip.css({\n          top: Math.round(props.top),\n          left: Math.round(props.left)\n        })\n      }\n    }, offset), 0)\n\n    $tip.addClass('in')\n\n    // check to see if placing tip in new offset caused the tip to resize itself\n    var actualWidth  = $tip[0].offsetWidth\n    var actualHeight = $tip[0].offsetHeight\n\n    if (placement == 'top' && actualHeight != height) {\n      offset.top = offset.top + height - actualHeight\n    }\n\n    var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)\n\n    if (delta.left) offset.left += delta.left\n    else offset.top += delta.top\n\n    var isVertical          = /top|bottom/.test(placement)\n    var arrowDelta          = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight\n    var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'\n\n    $tip.offset(offset)\n    this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)\n  }\n\n  Tooltip.prototype.replaceArrow = function (delta, dimension, isHorizontal) {\n    this.arrow()\n      .css(isHorizontal ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')\n      .css(isHorizontal ? 'top' : 'left', '')\n  }\n\n  Tooltip.prototype.setContent = function () {\n    var $tip  = this.tip()\n    var title = this.getTitle()\n\n    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)\n    $tip.removeClass('fade in top bottom left right')\n  }\n\n  Tooltip.prototype.hide = function (callback) {\n    var that = this\n    var $tip = this.tip()\n    var e    = $.Event('hide.bs.' + this.type)\n\n    function complete() {\n      if (that.hoverState != 'in') $tip.detach()\n      that.$element\n        .removeAttr('aria-describedby')\n        .trigger('hidden.bs.' + that.type)\n      callback && callback()\n    }\n\n    this.$element.trigger(e)\n\n    if (e.isDefaultPrevented()) return\n\n    $tip.removeClass('in')\n\n    $.support.transition && this.$tip.hasClass('fade') ?\n      $tip\n        .one('bsTransitionEnd', complete)\n        .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :\n      complete()\n\n    this.hoverState = null\n\n    return this\n  }\n\n  Tooltip.prototype.fixTitle = function () {\n    var $e = this.$element\n    if ($e.attr('title') || typeof ($e.attr('data-original-title')) != 'string') {\n      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')\n    }\n  }\n\n  Tooltip.prototype.hasContent = function () {\n    return this.getTitle()\n  }\n\n  Tooltip.prototype.getPosition = function ($element) {\n    $element   = $element || this.$element\n\n    var el     = $element[0]\n    var isBody = el.tagName == 'BODY'\n\n    var elRect    = el.getBoundingClientRect()\n    if (elRect.width == null) {\n      // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093\n      elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })\n    }\n    var elOffset  = isBody ? { top: 0, left: 0 } : $element.offset()\n    var scroll    = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }\n    var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null\n\n    return $.extend({}, elRect, scroll, outerDims, elOffset)\n  }\n\n  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {\n    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2  } :\n           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2  } :\n           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :\n        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width   }\n\n  }\n\n  Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {\n    var delta = { top: 0, left: 0 }\n    if (!this.$viewport) return delta\n\n    var viewportPadding = this.options.viewport && this.options.viewport.padding || 0\n    var viewportDimensions = this.getPosition(this.$viewport)\n\n    if (/right|left/.test(placement)) {\n      var topEdgeOffset    = pos.top - viewportPadding - viewportDimensions.scroll\n      var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight\n      if (topEdgeOffset < viewportDimensions.top) { // top overflow\n        delta.top = viewportDimensions.top - topEdgeOffset\n      } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow\n        delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset\n      }\n    } else {\n      var leftEdgeOffset  = pos.left - viewportPadding\n      var rightEdgeOffset = pos.left + viewportPadding + actualWidth\n      if (leftEdgeOffset < viewportDimensions.left) { // left overflow\n        delta.left = viewportDimensions.left - leftEdgeOffset\n      } else if (rightEdgeOffset > viewportDimensions.width) { // right overflow\n        delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset\n      }\n    }\n\n    return delta\n  }\n\n  Tooltip.prototype.getTitle = function () {\n    var title\n    var $e = this.$element\n    var o  = this.options\n\n    title = $e.attr('data-original-title')\n      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)\n\n    return title\n  }\n\n  Tooltip.prototype.getUID = function (prefix) {\n    do prefix += ~~(Math.random() * 1000000)\n    while (document.getElementById(prefix))\n    return prefix\n  }\n\n  Tooltip.prototype.tip = function () {\n    return (this.$tip = this.$tip || $(this.options.template))\n  }\n\n  Tooltip.prototype.arrow = function () {\n    return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))\n  }\n\n  Tooltip.prototype.enable = function () {\n    this.enabled = true\n  }\n\n  Tooltip.prototype.disable = function () {\n    this.enabled = false\n  }\n\n  Tooltip.prototype.toggleEnabled = function () {\n    this.enabled = !this.enabled\n  }\n\n  Tooltip.prototype.toggle = function (e) {\n    var self = this\n    if (e) {\n      self = $(e.currentTarget).data('bs.' + this.type)\n      if (!self) {\n        self = new this.constructor(e.currentTarget, this.getDelegateOptions())\n        $(e.currentTarget).data('bs.' + this.type, self)\n      }\n    }\n\n    self.tip().hasClass('in') ? self.leave(self) : self.enter(self)\n  }\n\n  Tooltip.prototype.destroy = function () {\n    var that = this\n    clearTimeout(this.timeout)\n    this.hide(function () {\n      that.$element.off('.' + that.type).removeData('bs.' + that.type)\n    })\n  }\n\n\n  // TOOLTIP PLUGIN DEFINITION\n  // =========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this    = $(this)\n      var data     = $this.data('bs.tooltip')\n      var options  = typeof option == 'object' && option\n      var selector = options && options.selector\n\n      if (!data && option == 'destroy') return\n      if (selector) {\n        if (!data) $this.data('bs.tooltip', (data = {}))\n        if (!data[selector]) data[selector] = new Tooltip(this, options)\n      } else {\n        if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))\n      }\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.tooltip\n\n  $.fn.tooltip             = Plugin\n  $.fn.tooltip.Constructor = Tooltip\n\n\n  // TOOLTIP NO CONFLICT\n  // ===================\n\n  $.fn.tooltip.noConflict = function () {\n    $.fn.tooltip = old\n    return this\n  }\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: popover.js v3.3.1\n * http://getbootstrap.com/javascript/#popovers\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // POPOVER PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Popover = function (element, options) {\n    this.init('popover', element, options)\n  }\n\n  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')\n\n  Popover.VERSION  = '3.3.1'\n\n  Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {\n    placement: 'right',\n    trigger: 'click',\n    content: '',\n    template: '<div class=\"popover\" role=\"tooltip\"><div class=\"arrow\"></div><h3 class=\"popover-title\"></h3><div class=\"popover-content\"></div></div>'\n  })\n\n\n  // NOTE: POPOVER EXTENDS tooltip.js\n  // ================================\n\n  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)\n\n  Popover.prototype.constructor = Popover\n\n  Popover.prototype.getDefaults = function () {\n    return Popover.DEFAULTS\n  }\n\n  Popover.prototype.setContent = function () {\n    var $tip    = this.tip()\n    var title   = this.getTitle()\n    var content = this.getContent()\n\n    $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)\n    $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events\n      this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'\n    ](content)\n\n    $tip.removeClass('fade top bottom left right in')\n\n    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do\n    // this manually by checking the contents.\n    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()\n  }\n\n  Popover.prototype.hasContent = function () {\n    return this.getTitle() || this.getContent()\n  }\n\n  Popover.prototype.getContent = function () {\n    var $e = this.$element\n    var o  = this.options\n\n    return $e.attr('data-content')\n      || (typeof o.content == 'function' ?\n            o.content.call($e[0]) :\n            o.content)\n  }\n\n  Popover.prototype.arrow = function () {\n    return (this.$arrow = this.$arrow || this.tip().find('.arrow'))\n  }\n\n  Popover.prototype.tip = function () {\n    if (!this.$tip) this.$tip = $(this.options.template)\n    return this.$tip\n  }\n\n\n  // POPOVER PLUGIN DEFINITION\n  // =========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this    = $(this)\n      var data     = $this.data('bs.popover')\n      var options  = typeof option == 'object' && option\n      var selector = options && options.selector\n\n      if (!data && option == 'destroy') return\n      if (selector) {\n        if (!data) $this.data('bs.popover', (data = {}))\n        if (!data[selector]) data[selector] = new Popover(this, options)\n      } else {\n        if (!data) $this.data('bs.popover', (data = new Popover(this, options)))\n      }\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.popover\n\n  $.fn.popover             = Plugin\n  $.fn.popover.Constructor = Popover\n\n\n  // POPOVER NO CONFLICT\n  // ===================\n\n  $.fn.popover.noConflict = function () {\n    $.fn.popover = old\n    return this\n  }\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: scrollspy.js v3.3.1\n * http://getbootstrap.com/javascript/#scrollspy\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // SCROLLSPY CLASS DEFINITION\n  // ==========================\n\n  function ScrollSpy(element, options) {\n    var process  = $.proxy(this.process, this)\n\n    this.$body          = $('body')\n    this.$scrollElement = $(element).is('body') ? $(window) : $(element)\n    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)\n    this.selector       = (this.options.target || '') + ' .nav li > a'\n    this.offsets        = []\n    this.targets        = []\n    this.activeTarget   = null\n    this.scrollHeight   = 0\n\n    this.$scrollElement.on('scroll.bs.scrollspy', process)\n    this.refresh()\n    this.process()\n  }\n\n  ScrollSpy.VERSION  = '3.3.1'\n\n  ScrollSpy.DEFAULTS = {\n    offset: 10\n  }\n\n  ScrollSpy.prototype.getScrollHeight = function () {\n    return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)\n  }\n\n  ScrollSpy.prototype.refresh = function () {\n    var offsetMethod = 'offset'\n    var offsetBase   = 0\n\n    if (!$.isWindow(this.$scrollElement[0])) {\n      offsetMethod = 'position'\n      offsetBase   = this.$scrollElement.scrollTop()\n    }\n\n    this.offsets = []\n    this.targets = []\n    this.scrollHeight = this.getScrollHeight()\n\n    var self     = this\n\n    this.$body\n      .find(this.selector)\n      .map(function () {\n        var $el   = $(this)\n        var href  = $el.data('target') || $el.attr('href')\n        var $href = /^#./.test(href) && $(href)\n\n        return ($href\n          && $href.length\n          && $href.is(':visible')\n          && [[$href[offsetMethod]().top + offsetBase, href]]) || null\n      })\n      .sort(function (a, b) { return a[0] - b[0] })\n      .each(function () {\n        self.offsets.push(this[0])\n        self.targets.push(this[1])\n      })\n  }\n\n  ScrollSpy.prototype.process = function () {\n    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset\n    var scrollHeight = this.getScrollHeight()\n    var maxScroll    = this.options.offset + scrollHeight - this.$scrollElement.height()\n    var offsets      = this.offsets\n    var targets      = this.targets\n    var activeTarget = this.activeTarget\n    var i\n\n    if (this.scrollHeight != scrollHeight) {\n      this.refresh()\n    }\n\n    if (scrollTop >= maxScroll) {\n      return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)\n    }\n\n    if (activeTarget && scrollTop < offsets[0]) {\n      this.activeTarget = null\n      return this.clear()\n    }\n\n    for (i = offsets.length; i--;) {\n      activeTarget != targets[i]\n        && scrollTop >= offsets[i]\n        && (!offsets[i + 1] || scrollTop <= offsets[i + 1])\n        && this.activate(targets[i])\n    }\n  }\n\n  ScrollSpy.prototype.activate = function (target) {\n    this.activeTarget = target\n\n    this.clear()\n\n    var selector = this.selector +\n        '[data-target=\"' + target + '\"],' +\n        this.selector + '[href=\"' + target + '\"]'\n\n    var active = $(selector)\n      .parents('li')\n      .addClass('active')\n\n    if (active.parent('.dropdown-menu').length) {\n      active = active\n        .closest('li.dropdown')\n        .addClass('active')\n    }\n\n    active.trigger('activate.bs.scrollspy')\n  }\n\n  ScrollSpy.prototype.clear = function () {\n    $(this.selector)\n      .parentsUntil(this.options.target, '.active')\n      .removeClass('active')\n  }\n\n\n  // SCROLLSPY PLUGIN DEFINITION\n  // ===========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.scrollspy')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.scrollspy\n\n  $.fn.scrollspy             = Plugin\n  $.fn.scrollspy.Constructor = ScrollSpy\n\n\n  // SCROLLSPY NO CONFLICT\n  // =====================\n\n  $.fn.scrollspy.noConflict = function () {\n    $.fn.scrollspy = old\n    return this\n  }\n\n\n  // SCROLLSPY DATA-API\n  // ==================\n\n  $(window).on('load.bs.scrollspy.data-api', function () {\n    $('[data-spy=\"scroll\"]').each(function () {\n      var $spy = $(this)\n      Plugin.call($spy, $spy.data())\n    })\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: tab.js v3.3.1\n * http://getbootstrap.com/javascript/#tabs\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // TAB CLASS DEFINITION\n  // ====================\n\n  var Tab = function (element) {\n    this.element = $(element)\n  }\n\n  Tab.VERSION = '3.3.1'\n\n  Tab.TRANSITION_DURATION = 150\n\n  Tab.prototype.show = function () {\n    var $this    = this.element\n    var $ul      = $this.closest('ul:not(.dropdown-menu)')\n    var selector = $this.data('target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    if ($this.parent('li').hasClass('active')) return\n\n    var $previous = $ul.find('.active:last a')\n    var hideEvent = $.Event('hide.bs.tab', {\n      relatedTarget: $this[0]\n    })\n    var showEvent = $.Event('show.bs.tab', {\n      relatedTarget: $previous[0]\n    })\n\n    $previous.trigger(hideEvent)\n    $this.trigger(showEvent)\n\n    if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return\n\n    var $target = $(selector)\n\n    this.activate($this.closest('li'), $ul)\n    this.activate($target, $target.parent(), function () {\n      $previous.trigger({\n        type: 'hidden.bs.tab',\n        relatedTarget: $this[0]\n      })\n      $this.trigger({\n        type: 'shown.bs.tab',\n        relatedTarget: $previous[0]\n      })\n    })\n  }\n\n  Tab.prototype.activate = function (element, container, callback) {\n    var $active    = container.find('> .active')\n    var transition = callback\n      && $.support.transition\n      && (($active.length && $active.hasClass('fade')) || !!container.find('> .fade').length)\n\n    function next() {\n      $active\n        .removeClass('active')\n        .find('> .dropdown-menu > .active')\n          .removeClass('active')\n        .end()\n        .find('[data-toggle=\"tab\"]')\n          .attr('aria-expanded', false)\n\n      element\n        .addClass('active')\n        .find('[data-toggle=\"tab\"]')\n          .attr('aria-expanded', true)\n\n      if (transition) {\n        element[0].offsetWidth // reflow for transition\n        element.addClass('in')\n      } else {\n        element.removeClass('fade')\n      }\n\n      if (element.parent('.dropdown-menu')) {\n        element\n          .closest('li.dropdown')\n            .addClass('active')\n          .end()\n          .find('[data-toggle=\"tab\"]')\n            .attr('aria-expanded', true)\n      }\n\n      callback && callback()\n    }\n\n    $active.length && transition ?\n      $active\n        .one('bsTransitionEnd', next)\n        .emulateTransitionEnd(Tab.TRANSITION_DURATION) :\n      next()\n\n    $active.removeClass('in')\n  }\n\n\n  // TAB PLUGIN DEFINITION\n  // =====================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.tab')\n\n      if (!data) $this.data('bs.tab', (data = new Tab(this)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.tab\n\n  $.fn.tab             = Plugin\n  $.fn.tab.Constructor = Tab\n\n\n  // TAB NO CONFLICT\n  // ===============\n\n  $.fn.tab.noConflict = function () {\n    $.fn.tab = old\n    return this\n  }\n\n\n  // TAB DATA-API\n  // ============\n\n  var clickHandler = function (e) {\n    e.preventDefault()\n    Plugin.call($(this), 'show')\n  }\n\n  $(document)\n    .on('click.bs.tab.data-api', '[data-toggle=\"tab\"]', clickHandler)\n    .on('click.bs.tab.data-api', '[data-toggle=\"pill\"]', clickHandler)\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: affix.js v3.3.1\n * http://getbootstrap.com/javascript/#affix\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // AFFIX CLASS DEFINITION\n  // ======================\n\n  var Affix = function (element, options) {\n    this.options = $.extend({}, Affix.DEFAULTS, options)\n\n    this.$target = $(this.options.target)\n      .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))\n      .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))\n\n    this.$element     = $(element)\n    this.affixed      =\n    this.unpin        =\n    this.pinnedOffset = null\n\n    this.checkPosition()\n  }\n\n  Affix.VERSION  = '3.3.1'\n\n  Affix.RESET    = 'affix affix-top affix-bottom'\n\n  Affix.DEFAULTS = {\n    offset: 0,\n    target: window\n  }\n\n  Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {\n    var scrollTop    = this.$target.scrollTop()\n    var position     = this.$element.offset()\n    var targetHeight = this.$target.height()\n\n    if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false\n\n    if (this.affixed == 'bottom') {\n      if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'\n      return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'\n    }\n\n    var initializing   = this.affixed == null\n    var colliderTop    = initializing ? scrollTop : position.top\n    var colliderHeight = initializing ? targetHeight : height\n\n    if (offsetTop != null && colliderTop <= offsetTop) return 'top'\n    if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'\n\n    return false\n  }\n\n  Affix.prototype.getPinnedOffset = function () {\n    if (this.pinnedOffset) return this.pinnedOffset\n    this.$element.removeClass(Affix.RESET).addClass('affix')\n    var scrollTop = this.$target.scrollTop()\n    var position  = this.$element.offset()\n    return (this.pinnedOffset = position.top - scrollTop)\n  }\n\n  Affix.prototype.checkPositionWithEventLoop = function () {\n    setTimeout($.proxy(this.checkPosition, this), 1)\n  }\n\n  Affix.prototype.checkPosition = function () {\n    if (!this.$element.is(':visible')) return\n\n    var height       = this.$element.height()\n    var offset       = this.options.offset\n    var offsetTop    = offset.top\n    var offsetBottom = offset.bottom\n    var scrollHeight = $('body').height()\n\n    if (typeof offset != 'object')         offsetBottom = offsetTop = offset\n    if (typeof offsetTop == 'function')    offsetTop    = offset.top(this.$element)\n    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)\n\n    var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)\n\n    if (this.affixed != affix) {\n      if (this.unpin != null) this.$element.css('top', '')\n\n      var affixType = 'affix' + (affix ? '-' + affix : '')\n      var e         = $.Event(affixType + '.bs.affix')\n\n      this.$element.trigger(e)\n\n      if (e.isDefaultPrevented()) return\n\n      this.affixed = affix\n      this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null\n\n      this.$element\n        .removeClass(Affix.RESET)\n        .addClass(affixType)\n        .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')\n    }\n\n    if (affix == 'bottom') {\n      this.$element.offset({\n        top: scrollHeight - height - offsetBottom\n      })\n    }\n  }\n\n\n  // AFFIX PLUGIN DEFINITION\n  // =======================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.affix')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.affix\n\n  $.fn.affix             = Plugin\n  $.fn.affix.Constructor = Affix\n\n\n  // AFFIX NO CONFLICT\n  // =================\n\n  $.fn.affix.noConflict = function () {\n    $.fn.affix = old\n    return this\n  }\n\n\n  // AFFIX DATA-API\n  // ==============\n\n  $(window).on('load', function () {\n    $('[data-spy=\"affix\"]').each(function () {\n      var $spy = $(this)\n      var data = $spy.data()\n\n      data.offset = data.offset || {}\n\n      if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom\n      if (data.offsetTop    != null) data.offset.top    = data.offsetTop\n\n      Plugin.call($spy, data)\n    })\n  })\n\n}(jQuery);\n"
  },
  {
    "path": "examples/featureTests/dist/js/npm.js",
    "content": "// This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment.\nrequire('../../js/transition.js')\nrequire('../../js/alert.js')\nrequire('../../js/button.js')\nrequire('../../js/carousel.js')\nrequire('../../js/collapse.js')\nrequire('../../js/dropdown.js')\nrequire('../../js/modal.js')\nrequire('../../js/tooltip.js')\nrequire('../../js/popover.js')\nrequire('../../js/scrollspy.js')\nrequire('../../js/tab.js')\nrequire('../../js/affix.js')"
  },
  {
    "path": "examples/featureTests/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"description\" content=\"\">\n    <meta name=\"author\" content=\"\">\n    <!-- <link rel=\"icon\" href=\"../../favicon.ico\"> -->\n\n    <title>Jumbotron Template for Bootstrap</title>\n\n    <!-- Bootstrap core CSS -->\n    <link href=\"dist/css/bootstrap.min.css\" rel=\"stylesheet\">\n    <style type=\"text/css\">\n      body {\n        padding-top: 50px;\n        padding-bottom: 20px;\n        background-color: #e0e0e0;\n      }\n      .displayNone {\n        display: none;\n      }\n\n/*\n      .col-md-4 {\n        width: 100% !important;\n      }\n*/\n    </style>\n  </head>\n\n  <body class='loading'>\n\n    <nav class=\"navbar navbar-inverse navbar-fixed-top\" role=\"navigation\">\n      <div class=\"container\">\n        <div class=\"navbar-header\">\n          <button type=\"button\" class=\"navbar-toggle collapsed\" data-toggle=\"collapse\" data-target=\"#navbar\" aria-expanded=\"false\" aria-controls=\"navbar\">\n            <span class=\"sr-only\">Toggle navigation</span>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n          </button>\n          <a class=\"navbar-brand\" href=\"#\">Project name</a>\n        </div>\n        <div id=\"navbar\" class=\"navbar-collapse collapse\">\n          <form class=\"navbar-form navbar-right\" role=\"form\">\n            <div class=\"form-group\">\n              <input type=\"text\" placeholder=\"Email\" class=\"form-control\">\n            </div>\n            <div class=\"form-group\">\n              <input type=\"password\" placeholder=\"Password\" class=\"form-control\">\n            </div>\n            <button type=\"submit\" class=\"btn btn-success\">Sign in</button>\n          </form>\n        </div><!--/.navbar-collapse -->\n      </div>\n    </nav>\n\n    <!-- Main jumbotron for a primary marketing message or call to action -->\n    <div class=\"jumbotron\">\n      <div class=\"container\">\n        <h1>Hello, world!</h1>\n        <p>This is a template for a simple marketing or informational website. It includes a large callout called a jumbotron and three supporting pieces of content. Use it as a starting point to create something more unique.</p>\n        <p><a class=\"btn btn-primary btn-lg\" href=\"#\" role=\"button\">Learn more &raquo;</a></p>\n      </div>\n    </div>\n\n    <div class=\"container\">\n      <!-- Example row of columns -->\n      <div class=\"row\">\n        <div class=\"col-md-4\">\n          <h2>Heading ONE</h2>\n          <p>Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui. </p>\n          <p><a class=\"btn btn-default\" href=\"#\" role=\"button\">View details &raquo;</a></p>\n        </div>\n        <div class=\"col-md-4\">\n          <h2>Heading TWO</h2>\n          <p>Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui. </p>\n          <p><a class=\"btn btn-default\" href=\"#\" role=\"button\">View details &raquo;</a></p>\n       </div>\n        <div class=\"col-md-4\">\n          <h2>Heading THREE</h2>\n          <p>Donec sed odio dui. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Vestibulum id ligula porta felis euismod semper. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.</p>\n          <p><a class=\"btn btn-default\" href=\"#\" role=\"button\">View details &raquo;</a></p>\n        </div>\n      </div>\n\n      <hr>\n\n      <footer>\n        <p class=\"displayNone\">I'm not visible.</p>\n        <p>&copy; Company 2014</p>\n      </footer>\n    </div> <!-- /container -->\n\n\n    <!-- Bootstrap core JavaScript\n    ================================================== -->\n    <!-- Placed at the end of the document so the pages load faster -->\n    <!-- <script src=\"https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js\"></script>\n    <script src=\"dist/js/bootstrap.min.js\"></script> -->\n    <!-- IE10 viewport hack for Surface/desktop Windows 8 bug\n    <script src=\"../../assets/js/ie10-viewport-bug-workaround.js\"></script> -->\n  </body>\n</html>\n\n<script type=\"text/javascript\">\n  setTimeout(function(){\n    document.getElementsByTagName('h1')[0].style.color = 'deeppink';\n    document.getElementsByTagName('h2')[0].innerText = 'H2 ONE ' + document.cookie;\n    document.getElementsByTagName('body')[0].classList.add('_READY');\n    console.log('_READY')\n  }, 2000)\n</script>\n"
  },
  {
    "path": "examples/featureTests/readme.md",
    "content": "\n### My Cool Project\n\n\n\n"
  },
  {
    "path": "examples/jsBasedConfig/backstopConfig.js",
    "content": "module.exports = {\n  id: 'test',\n  viewports: [\n    {\n      name: 'phone',\n      width: 320,\n      height: 480\n    },\n    {\n      name: 'tablet_v',\n      width: 568,\n      height: 1024\n    },\n    {\n      name: 'tablet_h',\n      width: 1024,\n      height: 768\n    }\n  ],\n  scenarios: [\n    {\n      label: 'My Homepage',\n      url: 'https://garris.github.io/BackstopJS/',\n      hideSelectors: [],\n      removeSelectors: [],\n      selectorExpansion: true,\n      selectors: [\n        'body',\n        '.jumbotron',\n        '.firstPanel > div',\n        '.secondPanel'\n      ],\n      readyEvent: null,\n      delay: 500,\n      misMatchThreshold: 0.1,\n      onBeforeScript: 'onBefore.js',\n      onReadyScript: 'onReady.js'\n    }\n  ],\n  paths: {\n    bitmaps_reference: 'backstop_data/bitmaps_reference',\n    bitmaps_test: 'backstop_data/bitmaps_test',\n    html_report: 'backstop_data/html_report',\n    ci_report: 'backstop_data/ci_report'\n  },\n  report: ['browser'],\n  debug: false\n};\n"
  },
  {
    "path": "examples/jsBasedConfig/readme.md",
    "content": "BackstopJS allows you to import all config parameters as a node module (as an option instead of JSON) which allows you to use comments, variables and logic etc. inside of your config.\n\nTo use a js module based config file, explicitly specify your config filepath when running a command. e.g.\n\n```sh\n$ backstop test --config=backstopTests/backstopConfig\n```\n_1. You don't actually need to specify a file extension as part of your config parameter -- but you can add one if you like._\n\n_2. See the the main readme for more info on setting the config file path._\n"
  },
  {
    "path": "examples/myCoolProject/dist/css/bootstrap-theme.css",
    "content": "/*!\n * Bootstrap v3.3.1 (http://getbootstrap.com)\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, .2);\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n}\n.btn-default .badge,\n.btn-primary .badge,\n.btn-success .badge,\n.btn-info .badge,\n.btn-warning .badge,\n.btn-danger .badge {\n  text-shadow: none;\n}\n.btn:active,\n.btn.active {\n  background-image: none;\n}\n.btn-default {\n  text-shadow: 0 1px 0 #fff;\n  background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n  background-image:      -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0));\n  background-image:         linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #dbdbdb;\n  border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n  background-color: #e0e0e0;\n  background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n  background-color: #e0e0e0;\n  border-color: #dbdbdb;\n}\n.btn-default:disabled,\n.btn-default[disabled] {\n  background-color: #e0e0e0;\n  background-image: none;\n}\n.btn-primary {\n  background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);\n  background-image:      -o-linear-gradient(top, #337ab7 0%, #265a88 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88));\n  background-image:         linear-gradient(to bottom, #337ab7 0%, #265a88 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #245580;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n  background-color: #265a88;\n  background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n  background-color: #265a88;\n  border-color: #245580;\n}\n.btn-primary:disabled,\n.btn-primary[disabled] {\n  background-color: #265a88;\n  background-image: none;\n}\n.btn-success {\n  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n  background-image:      -o-linear-gradient(top, #5cb85c 0%, #419641 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641));\n  background-image:         linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n  background-color: #419641;\n  background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n  background-color: #419641;\n  border-color: #3e8f3e;\n}\n.btn-success:disabled,\n.btn-success[disabled] {\n  background-color: #419641;\n  background-image: none;\n}\n.btn-info {\n  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n  background-image:      -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2));\n  background-image:         linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n  background-color: #2aabd2;\n  background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n  background-color: #2aabd2;\n  border-color: #28a4c9;\n}\n.btn-info:disabled,\n.btn-info[disabled] {\n  background-color: #2aabd2;\n  background-image: none;\n}\n.btn-warning {\n  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n  background-image:      -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316));\n  background-image:         linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n  background-color: #eb9316;\n  background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n  background-color: #eb9316;\n  border-color: #e38d13;\n}\n.btn-warning:disabled,\n.btn-warning[disabled] {\n  background-color: #eb9316;\n  background-image: none;\n}\n.btn-danger {\n  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n  background-image:      -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a));\n  background-image:         linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n  background-color: #c12e2a;\n  background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n  background-color: #c12e2a;\n  border-color: #b92c28;\n}\n.btn-danger:disabled,\n.btn-danger[disabled] {\n  background-color: #c12e2a;\n  background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);\n          box-shadow: 0 1px 2px rgba(0, 0, 0, .075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  background-color: #e8e8e8;\n  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n  background-image:      -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));\n  background-image:         linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n  background-repeat: repeat-x;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  background-color: #2e6da4;\n  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n  background-image:      -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));\n  background-image:         linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n  background-repeat: repeat-x;\n}\n.navbar-default {\n  background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%);\n  background-image:      -o-linear-gradient(top, #fff 0%, #f8f8f8 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8));\n  background-image:         linear-gradient(to bottom, #fff 0%, #f8f8f8 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .active > a {\n  background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n  background-image:      -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2));\n  background-image:         linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n  background-repeat: repeat-x;\n  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n  text-shadow: 0 1px 0 rgba(255, 255, 255, .25);\n}\n.navbar-inverse {\n  background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);\n  background-image:      -o-linear-gradient(top, #3c3c3c 0%, #222 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222));\n  background-image:         linear-gradient(to bottom, #3c3c3c 0%, #222 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .active > a {\n  background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n  background-image:      -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f));\n  background-image:         linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n  background-repeat: repeat-x;\n  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);\n          box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, .25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  border-radius: 0;\n}\n@media (max-width: 767px) {\n  .navbar .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #fff;\n    background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n    background-image:      -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n    background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));\n    background-image:         linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n    background-repeat: repeat-x;\n  }\n}\n.alert {\n  text-shadow: 0 1px 0 rgba(255, 255, 255, .2);\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);\n}\n.alert-success {\n  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n  background-image:      -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc));\n  background-image:         linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n  background-repeat: repeat-x;\n  border-color: #b2dba1;\n}\n.alert-info {\n  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n  background-image:      -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0));\n  background-image:         linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n  background-repeat: repeat-x;\n  border-color: #9acfea;\n}\n.alert-warning {\n  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n  background-image:      -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0));\n  background-image:         linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n  background-repeat: repeat-x;\n  border-color: #f5e79e;\n}\n.alert-danger {\n  background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n  background-image:      -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3));\n  background-image:         linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n  background-repeat: repeat-x;\n  border-color: #dca7a7;\n}\n.progress {\n  background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n  background-image:      -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5));\n  background-image:         linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n  background-repeat: repeat-x;\n}\n.progress-bar {\n  background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);\n  background-image:      -o-linear-gradient(top, #337ab7 0%, #286090 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090));\n  background-image:         linear-gradient(to bottom, #337ab7 0%, #286090 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);\n  background-repeat: repeat-x;\n}\n.progress-bar-success {\n  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n  background-image:      -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44));\n  background-image:         linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n  background-repeat: repeat-x;\n}\n.progress-bar-info {\n  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n  background-image:      -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5));\n  background-image:         linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n  background-repeat: repeat-x;\n}\n.progress-bar-warning {\n  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n  background-image:      -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f));\n  background-image:         linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n  background-repeat: repeat-x;\n}\n.progress-bar-danger {\n  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n  background-image:      -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c));\n  background-image:         linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n  background-repeat: repeat-x;\n}\n.progress-bar-striped {\n  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);\n  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);\n  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);\n}\n.list-group {\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);\n          box-shadow: 0 1px 2px rgba(0, 0, 0, .075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  text-shadow: 0 -1px 0 #286090;\n  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n  background-image:      -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a));\n  background-image:         linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);\n  background-repeat: repeat-x;\n  border-color: #2b669a;\n}\n.list-group-item.active .badge,\n.list-group-item.active:hover .badge,\n.list-group-item.active:focus .badge {\n  text-shadow: none;\n}\n.panel {\n  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05);\n          box-shadow: 0 1px 2px rgba(0, 0, 0, .05);\n}\n.panel-default > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n  background-image:      -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));\n  background-image:         linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n  background-repeat: repeat-x;\n}\n.panel-primary > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n  background-image:      -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));\n  background-image:         linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n  background-repeat: repeat-x;\n}\n.panel-success > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n  background-image:      -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6));\n  background-image:         linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n  background-repeat: repeat-x;\n}\n.panel-info > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n  background-image:      -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3));\n  background-image:         linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n  background-repeat: repeat-x;\n}\n.panel-warning > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n  background-image:      -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc));\n  background-image:         linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n  background-repeat: repeat-x;\n}\n.panel-danger > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n  background-image:      -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc));\n  background-image:         linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n  background-repeat: repeat-x;\n}\n.well {\n  background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n  background-image:      -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5));\n  background-image:         linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n  background-repeat: repeat-x;\n  border-color: #dcdcdc;\n  -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);\n          box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */\n"
  },
  {
    "path": "examples/myCoolProject/dist/css/bootstrap.css",
    "content": "/*!\n * Bootstrap v3.3.1 (http://getbootstrap.com)\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n/*! normalize.css v3.0.2 | MIT License | git.io/normalize */\nhtml {\n  font-family: sans-serif;\n  -webkit-text-size-adjust: 100%;\n      -ms-text-size-adjust: 100%;\n}\nbody {\n  margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n  display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n  display: inline-block;\n  vertical-align: baseline;\n}\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n[hidden],\ntemplate {\n  display: none;\n}\na {\n  background-color: transparent;\n}\na:active,\na:hover {\n  outline: 0;\n}\nabbr[title] {\n  border-bottom: 1px dotted;\n}\nb,\nstrong {\n  font-weight: bold;\n}\ndfn {\n  font-style: italic;\n}\nh1 {\n  margin: .67em 0;\n  font-size: 2em;\n}\nmark {\n  color: #000;\n  background: #ff0;\n}\nsmall {\n  font-size: 80%;\n}\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\nsup {\n  top: -.5em;\n}\nsub {\n  bottom: -.25em;\n}\nimg {\n  border: 0;\n}\nsvg:not(:root) {\n  overflow: hidden;\n}\nfigure {\n  margin: 1em 40px;\n}\nhr {\n  height: 0;\n  -webkit-box-sizing: content-box;\n     -moz-box-sizing: content-box;\n          box-sizing: content-box;\n}\npre {\n  overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  margin: 0;\n  font: inherit;\n  color: inherit;\n}\nbutton {\n  overflow: visible;\n}\nbutton,\nselect {\n  text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  -webkit-appearance: button;\n  cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  padding: 0;\n  border: 0;\n}\ninput {\n  line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n  padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\ninput[type=\"search\"] {\n  -webkit-box-sizing: content-box;\n     -moz-box-sizing: content-box;\n          box-sizing: content-box;\n  -webkit-appearance: textfield;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\nfieldset {\n  padding: .35em .625em .75em;\n  margin: 0 2px;\n  border: 1px solid #c0c0c0;\n}\nlegend {\n  padding: 0;\n  border: 0;\n}\ntextarea {\n  overflow: auto;\n}\noptgroup {\n  font-weight: bold;\n}\ntable {\n  border-spacing: 0;\n  border-collapse: collapse;\n}\ntd,\nth {\n  padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n  *,\n  *:before,\n  *:after {\n    color: #000 !important;\n    text-shadow: none !important;\n    background: transparent !important;\n    -webkit-box-shadow: none !important;\n            box-shadow: none !important;\n  }\n  a,\n  a:visited {\n    text-decoration: underline;\n  }\n  a[href]:after {\n    content: \" (\" attr(href) \")\";\n  }\n  abbr[title]:after {\n    content: \" (\" attr(title) \")\";\n  }\n  a[href^=\"#\"]:after,\n  a[href^=\"javascript:\"]:after {\n    content: \"\";\n  }\n  pre,\n  blockquote {\n    border: 1px solid #999;\n\n    page-break-inside: avoid;\n  }\n  thead {\n    display: table-header-group;\n  }\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n  img {\n    max-width: 100% !important;\n  }\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n  select {\n    background: #fff !important;\n  }\n  .navbar {\n    display: none;\n  }\n  .btn > .caret,\n  .dropup > .btn > .caret {\n    border-top-color: #000 !important;\n  }\n  .label {\n    border: 1px solid #000;\n  }\n  .table {\n    border-collapse: collapse !important;\n  }\n  .table td,\n  .table th {\n    background-color: #fff !important;\n  }\n  .table-bordered th,\n  .table-bordered td {\n    border: 1px solid #ddd !important;\n  }\n}\n@font-face {\n  font-family: 'Glyphicons Halflings';\n\n  src: url('../fonts/glyphicons-halflings-regular.eot');\n  src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), 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');\n}\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n  content: \"\\2a\";\n}\n.glyphicon-plus:before {\n  content: \"\\2b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n  content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n  content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n  content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n  content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n  content: \"\\270f\";\n}\n.glyphicon-glass:before {\n  content: \"\\e001\";\n}\n.glyphicon-music:before {\n  content: \"\\e002\";\n}\n.glyphicon-search:before {\n  content: \"\\e003\";\n}\n.glyphicon-heart:before {\n  content: \"\\e005\";\n}\n.glyphicon-star:before {\n  content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n  content: \"\\e007\";\n}\n.glyphicon-user:before {\n  content: \"\\e008\";\n}\n.glyphicon-film:before {\n  content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n  content: \"\\e010\";\n}\n.glyphicon-th:before {\n  content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n  content: \"\\e012\";\n}\n.glyphicon-ok:before {\n  content: \"\\e013\";\n}\n.glyphicon-remove:before {\n  content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n  content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n  content: \"\\e016\";\n}\n.glyphicon-off:before {\n  content: \"\\e017\";\n}\n.glyphicon-signal:before {\n  content: \"\\e018\";\n}\n.glyphicon-cog:before {\n  content: \"\\e019\";\n}\n.glyphicon-trash:before {\n  content: \"\\e020\";\n}\n.glyphicon-home:before {\n  content: \"\\e021\";\n}\n.glyphicon-file:before {\n  content: \"\\e022\";\n}\n.glyphicon-time:before {\n  content: \"\\e023\";\n}\n.glyphicon-road:before {\n  content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n  content: \"\\e025\";\n}\n.glyphicon-download:before {\n  content: \"\\e026\";\n}\n.glyphicon-upload:before {\n  content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n  content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n  content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n  content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n  content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n  content: \"\\e032\";\n}\n.glyphicon-lock:before {\n  content: \"\\e033\";\n}\n.glyphicon-flag:before {\n  content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n  content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n  content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n  content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n  content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n  content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n  content: \"\\e040\";\n}\n.glyphicon-tag:before {\n  content: \"\\e041\";\n}\n.glyphicon-tags:before {\n  content: \"\\e042\";\n}\n.glyphicon-book:before {\n  content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n  content: \"\\e044\";\n}\n.glyphicon-print:before {\n  content: \"\\e045\";\n}\n.glyphicon-camera:before {\n  content: \"\\e046\";\n}\n.glyphicon-font:before {\n  content: \"\\e047\";\n}\n.glyphicon-bold:before {\n  content: \"\\e048\";\n}\n.glyphicon-italic:before {\n  content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n  content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n  content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n  content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n  content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n  content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n  content: \"\\e055\";\n}\n.glyphicon-list:before {\n  content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n  content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n  content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n  content: \"\\e059\";\n}\n.glyphicon-picture:before {\n  content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n  content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n  content: \"\\e063\";\n}\n.glyphicon-tint:before {\n  content: \"\\e064\";\n}\n.glyphicon-edit:before {\n  content: \"\\e065\";\n}\n.glyphicon-share:before {\n  content: \"\\e066\";\n}\n.glyphicon-check:before {\n  content: \"\\e067\";\n}\n.glyphicon-move:before {\n  content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n  content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n  content: \"\\e070\";\n}\n.glyphicon-backward:before {\n  content: \"\\e071\";\n}\n.glyphicon-play:before {\n  content: \"\\e072\";\n}\n.glyphicon-pause:before {\n  content: \"\\e073\";\n}\n.glyphicon-stop:before {\n  content: \"\\e074\";\n}\n.glyphicon-forward:before {\n  content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n  content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n  content: \"\\e077\";\n}\n.glyphicon-eject:before {\n  content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n  content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n  content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n  content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n  content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n  content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n  content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n  content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n  content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n  content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n  content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n  content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n  content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n  content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n  content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n  content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n  content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n  content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n  content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n  content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n  content: \"\\e101\";\n}\n.glyphicon-gift:before {\n  content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n  content: \"\\e103\";\n}\n.glyphicon-fire:before {\n  content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n  content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n  content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n  content: \"\\e107\";\n}\n.glyphicon-plane:before {\n  content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n  content: \"\\e109\";\n}\n.glyphicon-random:before {\n  content: \"\\e110\";\n}\n.glyphicon-comment:before {\n  content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n  content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n  content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n  content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n  content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n  content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n  content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n  content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n  content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n  content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n  content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n  content: \"\\e122\";\n}\n.glyphicon-bell:before {\n  content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n  content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n  content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n  content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n  content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n  content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n  content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n  content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n  content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n  content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n  content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n  content: \"\\e134\";\n}\n.glyphicon-globe:before {\n  content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n  content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n  content: \"\\e137\";\n}\n.glyphicon-filter:before {\n  content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n  content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n  content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n  content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n  content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n  content: \"\\e143\";\n}\n.glyphicon-link:before {\n  content: \"\\e144\";\n}\n.glyphicon-phone:before {\n  content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n  content: \"\\e146\";\n}\n.glyphicon-usd:before {\n  content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n  content: \"\\e149\";\n}\n.glyphicon-sort:before {\n  content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n  content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n  content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n  content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n  content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n  content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n  content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n  content: \"\\e157\";\n}\n.glyphicon-expand:before {\n  content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n  content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n  content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n  content: \"\\e161\";\n}\n.glyphicon-flash:before {\n  content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n  content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n  content: \"\\e164\";\n}\n.glyphicon-record:before {\n  content: \"\\e165\";\n}\n.glyphicon-save:before {\n  content: \"\\e166\";\n}\n.glyphicon-open:before {\n  content: \"\\e167\";\n}\n.glyphicon-saved:before {\n  content: \"\\e168\";\n}\n.glyphicon-import:before {\n  content: \"\\e169\";\n}\n.glyphicon-export:before {\n  content: \"\\e170\";\n}\n.glyphicon-send:before {\n  content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n  content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n  content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n  content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n  content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n  content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n  content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n  content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n  content: \"\\e179\";\n}\n.glyphicon-header:before {\n  content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n  content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n  content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n  content: \"\\e183\";\n}\n.glyphicon-tower:before {\n  content: \"\\e184\";\n}\n.glyphicon-stats:before {\n  content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n  content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n  content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n  content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n  content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n  content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n  content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n  content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n  content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n  content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n  content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n  content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n  content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n  content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n  content: \"\\e200\";\n}\n* {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n*:before,\n*:after {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\nhtml {\n  font-size: 10px;\n\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #333;\n  background-color: #fff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\na {\n  color: #337ab7;\n  text-decoration: none;\n}\na:hover,\na:focus {\n  color: #23527c;\n  text-decoration: underline;\n}\na:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\nfigure {\n  margin: 0;\n}\nimg {\n  vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  display: block;\n  max-width: 100%;\n  height: auto;\n}\n.img-rounded {\n  border-radius: 6px;\n}\n.img-thumbnail {\n  display: inline-block;\n  max-width: 100%;\n  height: auto;\n  padding: 4px;\n  line-height: 1.42857143;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-radius: 4px;\n  -webkit-transition: all .2s ease-in-out;\n       -o-transition: all .2s ease-in-out;\n          transition: all .2s ease-in-out;\n}\n.img-circle {\n  border-radius: 50%;\n}\nhr {\n  margin-top: 20px;\n  margin-bottom: 20px;\n  border: 0;\n  border-top: 1px solid #eee;\n}\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n  position: static;\n  width: auto;\n  height: auto;\n  margin: 0;\n  overflow: visible;\n  clip: auto;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n  font-family: inherit;\n  font-weight: 500;\n  line-height: 1.1;\n  color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n  font-weight: normal;\n  line-height: 1;\n  color: #777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n  margin-top: 20px;\n  margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n  font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n  font-size: 75%;\n}\nh1,\n.h1 {\n  font-size: 36px;\n}\nh2,\n.h2 {\n  font-size: 30px;\n}\nh3,\n.h3 {\n  font-size: 24px;\n}\nh4,\n.h4 {\n  font-size: 18px;\n}\nh5,\n.h5 {\n  font-size: 14px;\n}\nh6,\n.h6 {\n  font-size: 12px;\n}\np {\n  margin: 0 0 10px;\n}\n.lead {\n  margin-bottom: 20px;\n  font-size: 16px;\n  font-weight: 300;\n  line-height: 1.4;\n}\n@media (min-width: 768px) {\n  .lead {\n    font-size: 21px;\n  }\n}\nsmall,\n.small {\n  font-size: 85%;\n}\nmark,\n.mark {\n  padding: .2em;\n  background-color: #fcf8e3;\n}\n.text-left {\n  text-align: left;\n}\n.text-right {\n  text-align: right;\n}\n.text-center {\n  text-align: center;\n}\n.text-justify {\n  text-align: justify;\n}\n.text-nowrap {\n  white-space: nowrap;\n}\n.text-lowercase {\n  text-transform: lowercase;\n}\n.text-uppercase {\n  text-transform: uppercase;\n}\n.text-capitalize {\n  text-transform: capitalize;\n}\n.text-muted {\n  color: #777;\n}\n.text-primary {\n  color: #337ab7;\n}\na.text-primary:hover {\n  color: #286090;\n}\n.text-success {\n  color: #3c763d;\n}\na.text-success:hover {\n  color: #2b542c;\n}\n.text-info {\n  color: #31708f;\n}\na.text-info:hover {\n  color: #245269;\n}\n.text-warning {\n  color: #8a6d3b;\n}\na.text-warning:hover {\n  color: #66512c;\n}\n.text-danger {\n  color: #a94442;\n}\na.text-danger:hover {\n  color: #843534;\n}\n.bg-primary {\n  color: #fff;\n  background-color: #337ab7;\n}\na.bg-primary:hover {\n  background-color: #286090;\n}\n.bg-success {\n  background-color: #dff0d8;\n}\na.bg-success:hover {\n  background-color: #c1e2b3;\n}\n.bg-info {\n  background-color: #d9edf7;\n}\na.bg-info:hover {\n  background-color: #afd9ee;\n}\n.bg-warning {\n  background-color: #fcf8e3;\n}\na.bg-warning:hover {\n  background-color: #f7ecb5;\n}\n.bg-danger {\n  background-color: #f2dede;\n}\na.bg-danger:hover {\n  background-color: #e4b9b9;\n}\n.page-header {\n  padding-bottom: 9px;\n  margin: 40px 0 20px;\n  border-bottom: 1px solid #eee;\n}\nul,\nol {\n  margin-top: 0;\n  margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n  margin-bottom: 0;\n}\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n.list-inline {\n  padding-left: 0;\n  margin-left: -5px;\n  list-style: none;\n}\n.list-inline > li {\n  display: inline-block;\n  padding-right: 5px;\n  padding-left: 5px;\n}\ndl {\n  margin-top: 0;\n  margin-bottom: 20px;\n}\ndt,\ndd {\n  line-height: 1.42857143;\n}\ndt {\n  font-weight: bold;\n}\ndd {\n  margin-left: 0;\n}\n@media (min-width: 768px) {\n  .dl-horizontal dt {\n    float: left;\n    width: 160px;\n    overflow: hidden;\n    clear: left;\n    text-align: right;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n  .dl-horizontal dd {\n    margin-left: 180px;\n  }\n}\nabbr[title],\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted #777;\n}\n.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\nblockquote {\n  padding: 10px 20px;\n  margin: 0 0 20px;\n  font-size: 17.5px;\n  border-left: 5px solid #eee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n  margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n  display: block;\n  font-size: 80%;\n  line-height: 1.42857143;\n  color: #777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n  content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  text-align: right;\n  border-right: 5px solid #eee;\n  border-left: 0;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n  content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n  content: '\\00A0 \\2014';\n}\naddress {\n  margin-bottom: 20px;\n  font-style: normal;\n  line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n  font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #c7254e;\n  background-color: #f9f2f4;\n  border-radius: 4px;\n}\nkbd {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #fff;\n  background-color: #333;\n  border-radius: 3px;\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);\n          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);\n}\nkbd kbd {\n  padding: 0;\n  font-size: 100%;\n  font-weight: bold;\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\npre {\n  display: block;\n  padding: 9.5px;\n  margin: 0 0 10px;\n  font-size: 13px;\n  line-height: 1.42857143;\n  color: #333;\n  word-break: break-all;\n  word-wrap: break-word;\n  background-color: #f5f5f5;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n}\npre code {\n  padding: 0;\n  font-size: inherit;\n  color: inherit;\n  white-space: pre-wrap;\n  background-color: transparent;\n  border-radius: 0;\n}\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\n.container {\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n@media (min-width: 768px) {\n  .container {\n    width: 750px;\n  }\n}\n@media (min-width: 992px) {\n  .container {\n    width: 970px;\n  }\n}\n@media (min-width: 1200px) {\n  .container {\n    width: 1170px;\n  }\n}\n.container-fluid {\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n.row {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n  position: relative;\n  min-height: 1px;\n  padding-right: 15px;\n  padding-left: 15px;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n  float: left;\n}\n.col-xs-12 {\n  width: 100%;\n}\n.col-xs-11 {\n  width: 91.66666667%;\n}\n.col-xs-10 {\n  width: 83.33333333%;\n}\n.col-xs-9 {\n  width: 75%;\n}\n.col-xs-8 {\n  width: 66.66666667%;\n}\n.col-xs-7 {\n  width: 58.33333333%;\n}\n.col-xs-6 {\n  width: 50%;\n}\n.col-xs-5 {\n  width: 41.66666667%;\n}\n.col-xs-4 {\n  width: 33.33333333%;\n}\n.col-xs-3 {\n  width: 25%;\n}\n.col-xs-2 {\n  width: 16.66666667%;\n}\n.col-xs-1 {\n  width: 8.33333333%;\n}\n.col-xs-pull-12 {\n  right: 100%;\n}\n.col-xs-pull-11 {\n  right: 91.66666667%;\n}\n.col-xs-pull-10 {\n  right: 83.33333333%;\n}\n.col-xs-pull-9 {\n  right: 75%;\n}\n.col-xs-pull-8 {\n  right: 66.66666667%;\n}\n.col-xs-pull-7 {\n  right: 58.33333333%;\n}\n.col-xs-pull-6 {\n  right: 50%;\n}\n.col-xs-pull-5 {\n  right: 41.66666667%;\n}\n.col-xs-pull-4 {\n  right: 33.33333333%;\n}\n.col-xs-pull-3 {\n  right: 25%;\n}\n.col-xs-pull-2 {\n  right: 16.66666667%;\n}\n.col-xs-pull-1 {\n  right: 8.33333333%;\n}\n.col-xs-pull-0 {\n  right: auto;\n}\n.col-xs-push-12 {\n  left: 100%;\n}\n.col-xs-push-11 {\n  left: 91.66666667%;\n}\n.col-xs-push-10 {\n  left: 83.33333333%;\n}\n.col-xs-push-9 {\n  left: 75%;\n}\n.col-xs-push-8 {\n  left: 66.66666667%;\n}\n.col-xs-push-7 {\n  left: 58.33333333%;\n}\n.col-xs-push-6 {\n  left: 50%;\n}\n.col-xs-push-5 {\n  left: 41.66666667%;\n}\n.col-xs-push-4 {\n  left: 33.33333333%;\n}\n.col-xs-push-3 {\n  left: 25%;\n}\n.col-xs-push-2 {\n  left: 16.66666667%;\n}\n.col-xs-push-1 {\n  left: 8.33333333%;\n}\n.col-xs-push-0 {\n  left: auto;\n}\n.col-xs-offset-12 {\n  margin-left: 100%;\n}\n.col-xs-offset-11 {\n  margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n  margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n  margin-left: 75%;\n}\n.col-xs-offset-8 {\n  margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n  margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n  margin-left: 50%;\n}\n.col-xs-offset-5 {\n  margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n  margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n  margin-left: 25%;\n}\n.col-xs-offset-2 {\n  margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n  margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n  margin-left: 0;\n}\n@media (min-width: 768px) {\n  .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n    float: left;\n  }\n  .col-sm-12 {\n    width: 100%;\n  }\n  .col-sm-11 {\n    width: 91.66666667%;\n  }\n  .col-sm-10 {\n    width: 83.33333333%;\n  }\n  .col-sm-9 {\n    width: 75%;\n  }\n  .col-sm-8 {\n    width: 66.66666667%;\n  }\n  .col-sm-7 {\n    width: 58.33333333%;\n  }\n  .col-sm-6 {\n    width: 50%;\n  }\n  .col-sm-5 {\n    width: 41.66666667%;\n  }\n  .col-sm-4 {\n    width: 33.33333333%;\n  }\n  .col-sm-3 {\n    width: 25%;\n  }\n  .col-sm-2 {\n    width: 16.66666667%;\n  }\n  .col-sm-1 {\n    width: 8.33333333%;\n  }\n  .col-sm-pull-12 {\n    right: 100%;\n  }\n  .col-sm-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-sm-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-sm-pull-9 {\n    right: 75%;\n  }\n  .col-sm-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-sm-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-sm-pull-6 {\n    right: 50%;\n  }\n  .col-sm-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-sm-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-sm-pull-3 {\n    right: 25%;\n  }\n  .col-sm-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-sm-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-sm-pull-0 {\n    right: auto;\n  }\n  .col-sm-push-12 {\n    left: 100%;\n  }\n  .col-sm-push-11 {\n    left: 91.66666667%;\n  }\n  .col-sm-push-10 {\n    left: 83.33333333%;\n  }\n  .col-sm-push-9 {\n    left: 75%;\n  }\n  .col-sm-push-8 {\n    left: 66.66666667%;\n  }\n  .col-sm-push-7 {\n    left: 58.33333333%;\n  }\n  .col-sm-push-6 {\n    left: 50%;\n  }\n  .col-sm-push-5 {\n    left: 41.66666667%;\n  }\n  .col-sm-push-4 {\n    left: 33.33333333%;\n  }\n  .col-sm-push-3 {\n    left: 25%;\n  }\n  .col-sm-push-2 {\n    left: 16.66666667%;\n  }\n  .col-sm-push-1 {\n    left: 8.33333333%;\n  }\n  .col-sm-push-0 {\n    left: auto;\n  }\n  .col-sm-offset-12 {\n    margin-left: 100%;\n  }\n  .col-sm-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-sm-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-sm-offset-9 {\n    margin-left: 75%;\n  }\n  .col-sm-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-sm-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-sm-offset-6 {\n    margin-left: 50%;\n  }\n  .col-sm-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-sm-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-sm-offset-3 {\n    margin-left: 25%;\n  }\n  .col-sm-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-sm-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-sm-offset-0 {\n    margin-left: 0;\n  }\n}\n@media (min-width: 992px) {\n  .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n    float: left;\n  }\n  .col-md-12 {\n    width: 100%;\n  }\n  .col-md-11 {\n    width: 91.66666667%;\n  }\n  .col-md-10 {\n    width: 83.33333333%;\n  }\n  .col-md-9 {\n    width: 75%;\n  }\n  .col-md-8 {\n    width: 66.66666667%;\n  }\n  .col-md-7 {\n    width: 58.33333333%;\n  }\n  .col-md-6 {\n    width: 50%;\n  }\n  .col-md-5 {\n    width: 41.66666667%;\n  }\n  .col-md-4 {\n    width: 33.33333333%;\n  }\n  .col-md-3 {\n    width: 25%;\n  }\n  .col-md-2 {\n    width: 16.66666667%;\n  }\n  .col-md-1 {\n    width: 8.33333333%;\n  }\n  .col-md-pull-12 {\n    right: 100%;\n  }\n  .col-md-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-md-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-md-pull-9 {\n    right: 75%;\n  }\n  .col-md-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-md-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-md-pull-6 {\n    right: 50%;\n  }\n  .col-md-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-md-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-md-pull-3 {\n    right: 25%;\n  }\n  .col-md-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-md-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-md-pull-0 {\n    right: auto;\n  }\n  .col-md-push-12 {\n    left: 100%;\n  }\n  .col-md-push-11 {\n    left: 91.66666667%;\n  }\n  .col-md-push-10 {\n    left: 83.33333333%;\n  }\n  .col-md-push-9 {\n    left: 75%;\n  }\n  .col-md-push-8 {\n    left: 66.66666667%;\n  }\n  .col-md-push-7 {\n    left: 58.33333333%;\n  }\n  .col-md-push-6 {\n    left: 50%;\n  }\n  .col-md-push-5 {\n    left: 41.66666667%;\n  }\n  .col-md-push-4 {\n    left: 33.33333333%;\n  }\n  .col-md-push-3 {\n    left: 25%;\n  }\n  .col-md-push-2 {\n    left: 16.66666667%;\n  }\n  .col-md-push-1 {\n    left: 8.33333333%;\n  }\n  .col-md-push-0 {\n    left: auto;\n  }\n  .col-md-offset-12 {\n    margin-left: 100%;\n  }\n  .col-md-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-md-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-md-offset-9 {\n    margin-left: 75%;\n  }\n  .col-md-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-md-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-md-offset-6 {\n    margin-left: 50%;\n  }\n  .col-md-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-md-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-md-offset-3 {\n    margin-left: 25%;\n  }\n  .col-md-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-md-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-md-offset-0 {\n    margin-left: 0;\n  }\n}\n@media (min-width: 1200px) {\n  .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n    float: left;\n  }\n  .col-lg-12 {\n    width: 100%;\n  }\n  .col-lg-11 {\n    width: 91.66666667%;\n  }\n  .col-lg-10 {\n    width: 83.33333333%;\n  }\n  .col-lg-9 {\n    width: 75%;\n  }\n  .col-lg-8 {\n    width: 66.66666667%;\n  }\n  .col-lg-7 {\n    width: 58.33333333%;\n  }\n  .col-lg-6 {\n    width: 50%;\n  }\n  .col-lg-5 {\n    width: 41.66666667%;\n  }\n  .col-lg-4 {\n    width: 33.33333333%;\n  }\n  .col-lg-3 {\n    width: 25%;\n  }\n  .col-lg-2 {\n    width: 16.66666667%;\n  }\n  .col-lg-1 {\n    width: 8.33333333%;\n  }\n  .col-lg-pull-12 {\n    right: 100%;\n  }\n  .col-lg-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-lg-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-lg-pull-9 {\n    right: 75%;\n  }\n  .col-lg-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-lg-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-lg-pull-6 {\n    right: 50%;\n  }\n  .col-lg-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-lg-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-lg-pull-3 {\n    right: 25%;\n  }\n  .col-lg-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-lg-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-lg-pull-0 {\n    right: auto;\n  }\n  .col-lg-push-12 {\n    left: 100%;\n  }\n  .col-lg-push-11 {\n    left: 91.66666667%;\n  }\n  .col-lg-push-10 {\n    left: 83.33333333%;\n  }\n  .col-lg-push-9 {\n    left: 75%;\n  }\n  .col-lg-push-8 {\n    left: 66.66666667%;\n  }\n  .col-lg-push-7 {\n    left: 58.33333333%;\n  }\n  .col-lg-push-6 {\n    left: 50%;\n  }\n  .col-lg-push-5 {\n    left: 41.66666667%;\n  }\n  .col-lg-push-4 {\n    left: 33.33333333%;\n  }\n  .col-lg-push-3 {\n    left: 25%;\n  }\n  .col-lg-push-2 {\n    left: 16.66666667%;\n  }\n  .col-lg-push-1 {\n    left: 8.33333333%;\n  }\n  .col-lg-push-0 {\n    left: auto;\n  }\n  .col-lg-offset-12 {\n    margin-left: 100%;\n  }\n  .col-lg-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-lg-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-lg-offset-9 {\n    margin-left: 75%;\n  }\n  .col-lg-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-lg-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-lg-offset-6 {\n    margin-left: 50%;\n  }\n  .col-lg-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-lg-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-lg-offset-3 {\n    margin-left: 25%;\n  }\n  .col-lg-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-lg-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-lg-offset-0 {\n    margin-left: 0;\n  }\n}\ntable {\n  background-color: transparent;\n}\ncaption {\n  padding-top: 8px;\n  padding-bottom: 8px;\n  color: #777;\n  text-align: left;\n}\nth {\n  text-align: left;\n}\n.table {\n  width: 100%;\n  max-width: 100%;\n  margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n  padding: 8px;\n  line-height: 1.42857143;\n  vertical-align: top;\n  border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n  vertical-align: bottom;\n  border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n  border-top: 0;\n}\n.table > tbody + tbody {\n  border-top: 2px solid #ddd;\n}\n.table .table {\n  background-color: #fff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n  padding: 5px;\n}\n.table-bordered {\n  border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n  border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n  border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-child(odd) {\n  background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n  background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n  position: static;\n  display: table-column;\n  float: none;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n  position: static;\n  display: table-cell;\n  float: none;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n  background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n  background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n  background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n  background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n  background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n  background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n  background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n  background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n  background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n  background-color: #ebcccc;\n}\n.table-responsive {\n  min-height: .01%;\n  overflow-x: auto;\n}\n@media screen and (max-width: 767px) {\n  .table-responsive {\n    width: 100%;\n    margin-bottom: 15px;\n    overflow-y: hidden;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    border: 1px solid #ddd;\n  }\n  .table-responsive > .table {\n    margin-bottom: 0;\n  }\n  .table-responsive > .table > thead > tr > th,\n  .table-responsive > .table > tbody > tr > th,\n  .table-responsive > .table > tfoot > tr > th,\n  .table-responsive > .table > thead > tr > td,\n  .table-responsive > .table > tbody > tr > td,\n  .table-responsive > .table > tfoot > tr > td {\n    white-space: nowrap;\n  }\n  .table-responsive > .table-bordered {\n    border: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:first-child,\n  .table-responsive > .table-bordered > tbody > tr > th:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n  .table-responsive > .table-bordered > thead > tr > td:first-child,\n  .table-responsive > .table-bordered > tbody > tr > td:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n    border-left: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:last-child,\n  .table-responsive > .table-bordered > tbody > tr > th:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n  .table-responsive > .table-bordered > thead > tr > td:last-child,\n  .table-responsive > .table-bordered > tbody > tr > td:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n    border-right: 0;\n  }\n  .table-responsive > .table-bordered > tbody > tr:last-child > th,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n  .table-responsive > .table-bordered > tbody > tr:last-child > td,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n    border-bottom: 0;\n  }\n}\nfieldset {\n  min-width: 0;\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 20px;\n  font-size: 21px;\n  line-height: inherit;\n  color: #333;\n  border: 0;\n  border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n  display: inline-block;\n  max-width: 100%;\n  margin-bottom: 5px;\n  font-weight: bold;\n}\ninput[type=\"search\"] {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9;\n  line-height: normal;\n}\ninput[type=\"file\"] {\n  display: block;\n}\ninput[type=\"range\"] {\n  display: block;\n  width: 100%;\n}\nselect[multiple],\nselect[size] {\n  height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\noutput {\n  display: block;\n  padding-top: 7px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #555;\n}\n.form-control {\n  display: block;\n  width: 100%;\n  height: 34px;\n  padding: 6px 12px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #555;\n  background-color: #fff;\n  background-image: none;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n  -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;\n       -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n          transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n  border-color: #66afe9;\n  outline: 0;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);\n          box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);\n}\n.form-control::-moz-placeholder {\n  color: #999;\n  opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n  color: #999;\n}\n.form-control::-webkit-input-placeholder {\n  color: #999;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n  cursor: not-allowed;\n  background-color: #eee;\n  opacity: 1;\n}\ntextarea.form-control {\n  height: auto;\n}\ninput[type=\"search\"] {\n  -webkit-appearance: none;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n  input[type=\"date\"],\n  input[type=\"time\"],\n  input[type=\"datetime-local\"],\n  input[type=\"month\"] {\n    line-height: 34px;\n  }\n  input[type=\"date\"].input-sm,\n  input[type=\"time\"].input-sm,\n  input[type=\"datetime-local\"].input-sm,\n  input[type=\"month\"].input-sm {\n    line-height: 30px;\n  }\n  input[type=\"date\"].input-lg,\n  input[type=\"time\"].input-lg,\n  input[type=\"datetime-local\"].input-lg,\n  input[type=\"month\"].input-lg {\n    line-height: 46px;\n  }\n}\n.form-group {\n  margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n  position: relative;\n  display: block;\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n  min-height: 20px;\n  padding-left: 20px;\n  margin-bottom: 0;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  position: absolute;\n  margin-top: 4px \\9;\n  margin-left: -20px;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  font-weight: normal;\n  vertical-align: middle;\n  cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n  cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n  cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n  cursor: not-allowed;\n}\n.form-control-static {\n  padding-top: 7px;\n  padding-bottom: 7px;\n  margin-bottom: 0;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n  padding-right: 0;\n  padding-left: 0;\n}\n.input-sm,\n.form-group-sm .form-control {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\nselect.input-sm,\nselect.form-group-sm .form-control {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.input-sm,\ntextarea.form-group-sm .form-control,\nselect[multiple].input-sm,\nselect[multiple].form-group-sm .form-control {\n  height: auto;\n}\n.input-lg,\n.form-group-lg .form-control {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\nselect.input-lg,\nselect.form-group-lg .form-control {\n  height: 46px;\n  line-height: 46px;\n}\ntextarea.input-lg,\ntextarea.form-group-lg .form-control,\nselect[multiple].input-lg,\nselect[multiple].form-group-lg .form-control {\n  height: auto;\n}\n.has-feedback {\n  position: relative;\n}\n.has-feedback .form-control {\n  padding-right: 42.5px;\n}\n.form-control-feedback {\n  position: absolute;\n  top: 0;\n  right: 0;\n  z-index: 2;\n  display: block;\n  width: 34px;\n  height: 34px;\n  line-height: 34px;\n  text-align: center;\n  pointer-events: none;\n}\n.input-lg + .form-control-feedback {\n  width: 46px;\n  height: 46px;\n  line-height: 46px;\n}\n.input-sm + .form-control-feedback {\n  width: 30px;\n  height: 30px;\n  line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n  color: #3c763d;\n}\n.has-success .form-control {\n  border-color: #3c763d;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-success .form-control:focus {\n  border-color: #2b542c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #3c763d;\n}\n.has-success .form-control-feedback {\n  color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n  color: #8a6d3b;\n}\n.has-warning .form-control {\n  border-color: #8a6d3b;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-warning .form-control:focus {\n  border-color: #66512c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #8a6d3b;\n}\n.has-warning .form-control-feedback {\n  color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n  color: #a94442;\n}\n.has-error .form-control {\n  border-color: #a94442;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-error .form-control:focus {\n  border-color: #843534;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #a94442;\n}\n.has-error .form-control-feedback {\n  color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n  top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n  top: 0;\n}\n.help-block {\n  display: block;\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: #737373;\n}\n@media (min-width: 768px) {\n  .form-inline .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .form-inline .form-control-static {\n    display: inline-block;\n  }\n  .form-inline .input-group {\n    display: inline-table;\n    vertical-align: middle;\n  }\n  .form-inline .input-group .input-group-addon,\n  .form-inline .input-group .input-group-btn,\n  .form-inline .input-group .form-control {\n    width: auto;\n  }\n  .form-inline .input-group > .form-control {\n    width: 100%;\n  }\n  .form-inline .control-label {\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .radio,\n  .form-inline .checkbox {\n    display: inline-block;\n    margin-top: 0;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .radio label,\n  .form-inline .checkbox label {\n    padding-left: 0;\n  }\n  .form-inline .radio input[type=\"radio\"],\n  .form-inline .checkbox input[type=\"checkbox\"] {\n    position: relative;\n    margin-left: 0;\n  }\n  .form-inline .has-feedback .form-control-feedback {\n    top: 0;\n  }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n  padding-top: 7px;\n  margin-top: 0;\n  margin-bottom: 0;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n  min-height: 27px;\n}\n.form-horizontal .form-group {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n@media (min-width: 768px) {\n  .form-horizontal .control-label {\n    padding-top: 7px;\n    margin-bottom: 0;\n    text-align: right;\n  }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n  right: 15px;\n}\n@media (min-width: 768px) {\n  .form-horizontal .form-group-lg .control-label {\n    padding-top: 14.3px;\n  }\n}\n@media (min-width: 768px) {\n  .form-horizontal .form-group-sm .control-label {\n    padding-top: 6px;\n  }\n}\n.btn {\n  display: inline-block;\n  padding: 6px 12px;\n  margin-bottom: 0;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1.42857143;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: middle;\n  -ms-touch-action: manipulation;\n      touch-action: manipulation;\n  cursor: pointer;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n  color: #333;\n  text-decoration: none;\n}\n.btn:active,\n.btn.active {\n  background-image: none;\n  outline: 0;\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n  pointer-events: none;\n  cursor: not-allowed;\n  filter: alpha(opacity=65);\n  -webkit-box-shadow: none;\n          box-shadow: none;\n  opacity: .65;\n}\n.btn-default {\n  color: #333;\n  background-color: #fff;\n  border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus,\n.btn-default.focus,\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n  color: #333;\n  background-color: #e6e6e6;\n  border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n  background-image: none;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n  background-color: #fff;\n  border-color: #ccc;\n}\n.btn-default .badge {\n  color: #fff;\n  background-color: #333;\n}\n.btn-primary {\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #2e6da4;\n}\n.btn-primary:hover,\n.btn-primary:focus,\n.btn-primary.focus,\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n  color: #fff;\n  background-color: #286090;\n  border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n  background-image: none;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n  background-color: #337ab7;\n  border-color: #2e6da4;\n}\n.btn-primary .badge {\n  color: #337ab7;\n  background-color: #fff;\n}\n.btn-success {\n  color: #fff;\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n.btn-success:hover,\n.btn-success:focus,\n.btn-success.focus,\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n  color: #fff;\n  background-color: #449d44;\n  border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n  background-image: none;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n.btn-success .badge {\n  color: #5cb85c;\n  background-color: #fff;\n}\n.btn-info {\n  color: #fff;\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n.btn-info:hover,\n.btn-info:focus,\n.btn-info.focus,\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n  color: #fff;\n  background-color: #31b0d5;\n  border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n  background-image: none;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n.btn-info .badge {\n  color: #5bc0de;\n  background-color: #fff;\n}\n.btn-warning {\n  color: #fff;\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n.btn-warning:hover,\n.btn-warning:focus,\n.btn-warning.focus,\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n  color: #fff;\n  background-color: #ec971f;\n  border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n  background-image: none;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n.btn-warning .badge {\n  color: #f0ad4e;\n  background-color: #fff;\n}\n.btn-danger {\n  color: #fff;\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n.btn-danger:hover,\n.btn-danger:focus,\n.btn-danger.focus,\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n  color: #fff;\n  background-color: #c9302c;\n  border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n  background-image: none;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n.btn-danger .badge {\n  color: #d9534f;\n  background-color: #fff;\n}\n.btn-link {\n  font-weight: normal;\n  color: #337ab7;\n  border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n  background-color: transparent;\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n  border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n  color: #23527c;\n  text-decoration: underline;\n  background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n  color: #777;\n  text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n  padding: 1px 5px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.btn-block {\n  display: block;\n  width: 100%;\n}\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n.fade {\n  opacity: 0;\n  -webkit-transition: opacity .15s linear;\n       -o-transition: opacity .15s linear;\n          transition: opacity .15s linear;\n}\n.fade.in {\n  opacity: 1;\n}\n.collapse {\n  display: none;\n  visibility: hidden;\n}\n.collapse.in {\n  display: block;\n  visibility: visible;\n}\ntr.collapse.in {\n  display: table-row;\n}\ntbody.collapse.in {\n  display: table-row-group;\n}\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  -webkit-transition-timing-function: ease;\n       -o-transition-timing-function: ease;\n          transition-timing-function: ease;\n  -webkit-transition-duration: .35s;\n       -o-transition-duration: .35s;\n          transition-duration: .35s;\n  -webkit-transition-property: height, visibility;\n       -o-transition-property: height, visibility;\n          transition-property: height, visibility;\n}\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top: 4px solid;\n  border-right: 4px solid transparent;\n  border-left: 4px solid transparent;\n}\n.dropdown {\n  position: relative;\n}\n.dropdown-toggle:focus {\n  outline: 0;\n}\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0;\n  font-size: 14px;\n  text-align: left;\n  list-style: none;\n  background-color: #fff;\n  -webkit-background-clip: padding-box;\n          background-clip: padding-box;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, .15);\n  border-radius: 4px;\n  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);\n          box-shadow: 0 6px 12px rgba(0, 0, 0, .175);\n}\n.dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n.dropdown-menu .divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n  display: block;\n  padding: 3px 20px;\n  clear: both;\n  font-weight: normal;\n  line-height: 1.42857143;\n  color: #333;\n  white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  color: #262626;\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  color: #fff;\n  text-decoration: none;\n  background-color: #337ab7;\n  outline: 0;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  color: #777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n  background-image: none;\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.open > .dropdown-menu {\n  display: block;\n}\n.open > a {\n  outline: 0;\n}\n.dropdown-menu-right {\n  right: 0;\n  left: auto;\n}\n.dropdown-menu-left {\n  right: auto;\n  left: 0;\n}\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: 12px;\n  line-height: 1.42857143;\n  color: #777;\n  white-space: nowrap;\n}\n.dropdown-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 990;\n}\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n  content: \"\";\n  border-top: 0;\n  border-bottom: 4px solid;\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-bottom: 1px;\n}\n@media (min-width: 768px) {\n  .navbar-right .dropdown-menu {\n    right: 0;\n    left: auto;\n  }\n  .navbar-right .dropdown-menu-left {\n    right: auto;\n    left: 0;\n  }\n}\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n  position: relative;\n  float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n  z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n  margin-left: -1px;\n}\n.btn-toolbar {\n  margin-left: -5px;\n}\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n  float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n  margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n.btn-group > .btn:first-child {\n  margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group > .btn-group {\n  float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group > .btn-group:first-child > .btn:last-child,\n.btn-group > .btn-group:first-child > .dropdown-toggle {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.btn-group > .btn-group:last-child > .btn:first-child {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n  padding-right: 8px;\n  padding-left: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-right: 12px;\n  padding-left: 12px;\n}\n.btn-group.open .dropdown-toggle {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n.btn .caret {\n  margin-left: 0;\n}\n.btn-lg .caret {\n  border-width: 5px 5px 0;\n  border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n  border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n  display: block;\n  float: none;\n  width: 100%;\n  max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n  float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n  margin-top: -1px;\n  margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n  border-bottom-left-radius: 4px;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  table-layout: fixed;\n  border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n  display: table-cell;\n  float: none;\n  width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n  width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n  left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n  position: absolute;\n  clip: rect(0, 0, 0, 0);\n  pointer-events: none;\n}\n.input-group {\n  position: relative;\n  display: table;\n  border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n  float: none;\n  padding-right: 0;\n  padding-left: 0;\n}\n.input-group .form-control {\n  position: relative;\n  z-index: 2;\n  float: left;\n  width: 100%;\n  margin-bottom: 0;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n  height: 46px;\n  line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n  height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n  height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle;\n}\n.input-group-addon {\n  padding: 6px 12px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1;\n  color: #555;\n  text-align: center;\n  background-color: #eee;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n}\n.input-group-addon.input-sm {\n  padding: 5px 10px;\n  font-size: 12px;\n  border-radius: 3px;\n}\n.input-group-addon.input-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n  margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.input-group-addon:first-child {\n  border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.input-group-addon:last-child {\n  border-left: 0;\n}\n.input-group-btn {\n  position: relative;\n  font-size: 0;\n  white-space: nowrap;\n}\n.input-group-btn > .btn {\n  position: relative;\n}\n.input-group-btn > .btn + .btn {\n  margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n  z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n  margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n  margin-left: -1px;\n}\n.nav {\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n.nav > li {\n  position: relative;\n  display: block;\n}\n.nav > li > a {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n  text-decoration: none;\n  background-color: #eee;\n}\n.nav > li.disabled > a {\n  color: #777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n  color: #777;\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n  background-color: #eee;\n  border-color: #337ab7;\n}\n.nav .nav-divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n.nav > li > a > img {\n  max-width: none;\n}\n.nav-tabs {\n  border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n  float: left;\n  margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n  margin-right: 2px;\n  line-height: 1.42857143;\n  border: 1px solid transparent;\n  border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n  border-color: #eee #eee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n  color: #555;\n  cursor: default;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-bottom-color: transparent;\n}\n.nav-tabs.nav-justified {\n  width: 100%;\n  border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n  float: none;\n}\n.nav-tabs.nav-justified > li > a {\n  margin-bottom: 5px;\n  text-align: center;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n  .nav-tabs.nav-justified > li > a {\n    margin-bottom: 0;\n  }\n}\n.nav-tabs.nav-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n  border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li > a {\n    border-bottom: 1px solid #ddd;\n    border-radius: 4px 4px 0 0;\n  }\n  .nav-tabs.nav-justified > .active > a,\n  .nav-tabs.nav-justified > .active > a:hover,\n  .nav-tabs.nav-justified > .active > a:focus {\n    border-bottom-color: #fff;\n  }\n}\n.nav-pills > li {\n  float: left;\n}\n.nav-pills > li > a {\n  border-radius: 4px;\n}\n.nav-pills > li + li {\n  margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n  color: #fff;\n  background-color: #337ab7;\n}\n.nav-stacked > li {\n  float: none;\n}\n.nav-stacked > li + li {\n  margin-top: 2px;\n  margin-left: 0;\n}\n.nav-justified {\n  width: 100%;\n}\n.nav-justified > li {\n  float: none;\n}\n.nav-justified > li > a {\n  margin-bottom: 5px;\n  text-align: center;\n}\n.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\n@media (min-width: 768px) {\n  .nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n  .nav-justified > li > a {\n    margin-bottom: 0;\n  }\n}\n.nav-tabs-justified {\n  border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n  border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n  .nav-tabs-justified > li > a {\n    border-bottom: 1px solid #ddd;\n    border-radius: 4px 4px 0 0;\n  }\n  .nav-tabs-justified > .active > a,\n  .nav-tabs-justified > .active > a:hover,\n  .nav-tabs-justified > .active > a:focus {\n    border-bottom-color: #fff;\n  }\n}\n.tab-content > .tab-pane {\n  display: none;\n  visibility: hidden;\n}\n.tab-content > .active {\n  display: block;\n  visibility: visible;\n}\n.nav-tabs .dropdown-menu {\n  margin-top: -1px;\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.navbar {\n  position: relative;\n  min-height: 50px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n  .navbar {\n    border-radius: 4px;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-header {\n    float: left;\n  }\n}\n.navbar-collapse {\n  padding-right: 15px;\n  padding-left: 15px;\n  overflow-x: visible;\n  -webkit-overflow-scrolling: touch;\n  border-top: 1px solid transparent;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);\n}\n.navbar-collapse.in {\n  overflow-y: auto;\n}\n@media (min-width: 768px) {\n  .navbar-collapse {\n    width: auto;\n    border-top: 0;\n    -webkit-box-shadow: none;\n            box-shadow: none;\n  }\n  .navbar-collapse.collapse {\n    display: block !important;\n    height: auto !important;\n    padding-bottom: 0;\n    overflow: visible !important;\n    visibility: visible !important;\n  }\n  .navbar-collapse.in {\n    overflow-y: visible;\n  }\n  .navbar-fixed-top .navbar-collapse,\n  .navbar-static-top .navbar-collapse,\n  .navbar-fixed-bottom .navbar-collapse {\n    padding-right: 0;\n    padding-left: 0;\n  }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n  max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n  .navbar-fixed-top .navbar-collapse,\n  .navbar-fixed-bottom .navbar-collapse {\n    max-height: 200px;\n  }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n@media (min-width: 768px) {\n  .container > .navbar-header,\n  .container-fluid > .navbar-header,\n  .container > .navbar-collapse,\n  .container-fluid > .navbar-collapse {\n    margin-right: 0;\n    margin-left: 0;\n  }\n}\n.navbar-static-top {\n  z-index: 1000;\n  border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n  .navbar-static-top {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: 1030;\n}\n@media (min-width: 768px) {\n  .navbar-fixed-top,\n  .navbar-fixed-bottom {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top {\n  top: 0;\n  border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0;\n  border-width: 1px 0 0;\n}\n.navbar-brand {\n  float: left;\n  height: 50px;\n  padding: 15px 15px;\n  font-size: 18px;\n  line-height: 20px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n  text-decoration: none;\n}\n.navbar-brand > img {\n  display: block;\n}\n@media (min-width: 768px) {\n  .navbar > .container .navbar-brand,\n  .navbar > .container-fluid .navbar-brand {\n    margin-left: -15px;\n  }\n}\n.navbar-toggle {\n  position: relative;\n  float: right;\n  padding: 9px 10px;\n  margin-top: 8px;\n  margin-right: 15px;\n  margin-bottom: 8px;\n  background-color: transparent;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.navbar-toggle:focus {\n  outline: 0;\n}\n.navbar-toggle .icon-bar {\n  display: block;\n  width: 22px;\n  height: 2px;\n  border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n  margin-top: 4px;\n}\n@media (min-width: 768px) {\n  .navbar-toggle {\n    display: none;\n  }\n}\n.navbar-nav {\n  margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n  padding-top: 10px;\n  padding-bottom: 10px;\n  line-height: 20px;\n}\n@media (max-width: 767px) {\n  .navbar-nav .open .dropdown-menu {\n    position: static;\n    float: none;\n    width: auto;\n    margin-top: 0;\n    background-color: transparent;\n    border: 0;\n    -webkit-box-shadow: none;\n            box-shadow: none;\n  }\n  .navbar-nav .open .dropdown-menu > li > a,\n  .navbar-nav .open .dropdown-menu .dropdown-header {\n    padding: 5px 15px 5px 25px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a {\n    line-height: 20px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-nav .open .dropdown-menu > li > a:focus {\n    background-image: none;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-nav {\n    float: left;\n    margin: 0;\n  }\n  .navbar-nav > li {\n    float: left;\n  }\n  .navbar-nav > li > a {\n    padding-top: 15px;\n    padding-bottom: 15px;\n  }\n}\n.navbar-form {\n  padding: 10px 15px;\n  margin-top: 8px;\n  margin-right: -15px;\n  margin-bottom: 8px;\n  margin-left: -15px;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);\n}\n@media (min-width: 768px) {\n  .navbar-form .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .navbar-form .form-control-static {\n    display: inline-block;\n  }\n  .navbar-form .input-group {\n    display: inline-table;\n    vertical-align: middle;\n  }\n  .navbar-form .input-group .input-group-addon,\n  .navbar-form .input-group .input-group-btn,\n  .navbar-form .input-group .form-control {\n    width: auto;\n  }\n  .navbar-form .input-group > .form-control {\n    width: 100%;\n  }\n  .navbar-form .control-label {\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .radio,\n  .navbar-form .checkbox {\n    display: inline-block;\n    margin-top: 0;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .radio label,\n  .navbar-form .checkbox label {\n    padding-left: 0;\n  }\n  .navbar-form .radio input[type=\"radio\"],\n  .navbar-form .checkbox input[type=\"checkbox\"] {\n    position: relative;\n    margin-left: 0;\n  }\n  .navbar-form .has-feedback .form-control-feedback {\n    top: 0;\n  }\n}\n@media (max-width: 767px) {\n  .navbar-form .form-group {\n    margin-bottom: 5px;\n  }\n  .navbar-form .form-group:last-child {\n    margin-bottom: 0;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-form {\n    width: auto;\n    padding-top: 0;\n    padding-bottom: 0;\n    margin-right: 0;\n    margin-left: 0;\n    border: 0;\n    -webkit-box-shadow: none;\n            box-shadow: none;\n  }\n}\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  border-top-left-radius: 4px;\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.navbar-btn {\n  margin-top: 8px;\n  margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n  margin-top: 14px;\n  margin-bottom: 14px;\n}\n.navbar-text {\n  margin-top: 15px;\n  margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n  .navbar-text {\n    float: left;\n    margin-right: 15px;\n    margin-left: 15px;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-left {\n    float: left !important;\n  }\n  .navbar-right {\n    float: right !important;\n    margin-right: -15px;\n  }\n  .navbar-right ~ .navbar-right {\n    margin-right: 0;\n  }\n}\n.navbar-default {\n  background-color: #f8f8f8;\n  border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n  color: #777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n  color: #5e5e5e;\n  background-color: transparent;\n}\n.navbar-default .navbar-text {\n  color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n  color: #777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n  color: #333;\n  background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n  color: #555;\n  background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n  color: #ccc;\n  background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n  border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n  background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n  background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n  border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n  color: #555;\n  background-color: #e7e7e7;\n}\n@media (max-width: 767px) {\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n    color: #777;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #333;\n    background-color: transparent;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #555;\n    background-color: #e7e7e7;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #ccc;\n    background-color: transparent;\n  }\n}\n.navbar-default .navbar-link {\n  color: #777;\n}\n.navbar-default .navbar-link:hover {\n  color: #333;\n}\n.navbar-default .btn-link {\n  color: #777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n  color: #333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n  color: #ccc;\n}\n.navbar-inverse {\n  background-color: #222;\n  border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n  color: #fff;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n  color: #fff;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n  color: #fff;\n  background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n  color: #444;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n  border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n  background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n  background-color: #fff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n  border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n  color: #fff;\n  background-color: #080808;\n}\n@media (max-width: 767px) {\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n    border-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n    background-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n    color: #9d9d9d;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #fff;\n    background-color: transparent;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #fff;\n    background-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #444;\n    background-color: transparent;\n  }\n}\n.navbar-inverse .navbar-link {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n  color: #fff;\n}\n.navbar-inverse .btn-link {\n  color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n  color: #fff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n  color: #444;\n}\n.breadcrumb {\n  padding: 8px 15px;\n  margin-bottom: 20px;\n  list-style: none;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n}\n.breadcrumb > li {\n  display: inline-block;\n}\n.breadcrumb > li + li:before {\n  padding: 0 5px;\n  color: #ccc;\n  content: \"/\\00a0\";\n}\n.breadcrumb > .active {\n  color: #777;\n}\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: 20px 0;\n  border-radius: 4px;\n}\n.pagination > li {\n  display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n  position: relative;\n  float: left;\n  padding: 6px 12px;\n  margin-left: -1px;\n  line-height: 1.42857143;\n  color: #337ab7;\n  text-decoration: none;\n  background-color: #fff;\n  border: 1px solid #ddd;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n  margin-left: 0;\n  border-top-left-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n  color: #23527c;\n  background-color: #eee;\n  border-color: #ddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n  z-index: 2;\n  color: #fff;\n  cursor: default;\n  background-color: #337ab7;\n  border-color: #337ab7;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n  color: #777;\n  cursor: not-allowed;\n  background-color: #fff;\n  border-color: #ddd;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n  padding: 10px 16px;\n  font-size: 18px;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n  border-top-left-radius: 6px;\n  border-bottom-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n  border-top-right-radius: 6px;\n  border-bottom-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n  padding: 5px 10px;\n  font-size: 12px;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n  border-top-left-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n  border-top-right-radius: 3px;\n  border-bottom-right-radius: 3px;\n}\n.pager {\n  padding-left: 0;\n  margin: 20px 0;\n  text-align: center;\n  list-style: none;\n}\n.pager li {\n  display: inline;\n}\n.pager li > a,\n.pager li > span {\n  display: inline-block;\n  padding: 5px 14px;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n  text-decoration: none;\n  background-color: #eee;\n}\n.pager .next > a,\n.pager .next > span {\n  float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n  float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n  color: #777;\n  cursor: not-allowed;\n  background-color: #fff;\n}\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: #fff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n  color: #fff;\n  text-decoration: none;\n  cursor: pointer;\n}\n.label:empty {\n  display: none;\n}\n.btn .label {\n  position: relative;\n  top: -1px;\n}\n.label-default {\n  background-color: #777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n  background-color: #5e5e5e;\n}\n.label-primary {\n  background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n  background-color: #286090;\n}\n.label-success {\n  background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n  background-color: #449d44;\n}\n.label-info {\n  background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n  background-color: #31b0d5;\n}\n.label-warning {\n  background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n  background-color: #ec971f;\n}\n.label-danger {\n  background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n  background-color: #c9302c;\n}\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: 12px;\n  font-weight: bold;\n  line-height: 1;\n  color: #fff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  background-color: #777;\n  border-radius: 10px;\n}\n.badge:empty {\n  display: none;\n}\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n.btn-xs .badge {\n  top: 0;\n  padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n  color: #fff;\n  text-decoration: none;\n  cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n  color: #337ab7;\n  background-color: #fff;\n}\n.list-group-item > .badge {\n  float: right;\n}\n.list-group-item > .badge + .badge {\n  margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n  margin-left: 3px;\n}\n.jumbotron {\n  padding: 30px 15px;\n  margin-bottom: 30px;\n  color: inherit;\n  background-color: #eee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n  color: inherit;\n}\n.jumbotron p {\n  margin-bottom: 15px;\n  font-size: 21px;\n  font-weight: 200;\n}\n.jumbotron > hr {\n  border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n  border-radius: 6px;\n}\n.jumbotron .container {\n  max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n  .jumbotron {\n    padding: 48px 0;\n  }\n  .container .jumbotron,\n  .container-fluid .jumbotron {\n    padding-right: 60px;\n    padding-left: 60px;\n  }\n  .jumbotron h1,\n  .jumbotron .h1 {\n    font-size: 63px;\n  }\n}\n.thumbnail {\n  display: block;\n  padding: 4px;\n  margin-bottom: 20px;\n  line-height: 1.42857143;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-radius: 4px;\n  -webkit-transition: border .2s ease-in-out;\n       -o-transition: border .2s ease-in-out;\n          transition: border .2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n  margin-right: auto;\n  margin-left: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n  border-color: #337ab7;\n}\n.thumbnail .caption {\n  padding: 9px;\n  color: #333;\n}\n.alert {\n  padding: 15px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.alert h4 {\n  margin-top: 0;\n  color: inherit;\n}\n.alert .alert-link {\n  font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n  margin-bottom: 0;\n}\n.alert > p + p {\n  margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n  padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n  position: relative;\n  top: -2px;\n  right: -21px;\n  color: inherit;\n}\n.alert-success {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n.alert-success hr {\n  border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n  color: #2b542c;\n}\n.alert-info {\n  color: #31708f;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n.alert-info hr {\n  border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n  color: #245269;\n}\n.alert-warning {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n}\n.alert-warning hr {\n  border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n  color: #66512c;\n}\n.alert-danger {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #ebccd1;\n}\n.alert-danger hr {\n  border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n  color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n@-o-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n.progress {\n  height: 20px;\n  margin-bottom: 20px;\n  overflow: hidden;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);\n          box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);\n}\n.progress-bar {\n  float: left;\n  width: 0;\n  height: 100%;\n  font-size: 12px;\n  line-height: 20px;\n  color: #fff;\n  text-align: center;\n  background-color: #337ab7;\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);\n          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);\n  -webkit-transition: width .6s ease;\n       -o-transition: width .6s ease;\n          transition: width .6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n  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);\n  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);\n  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);\n  -webkit-background-size: 40px 40px;\n          background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n  -webkit-animation: progress-bar-stripes 2s linear infinite;\n       -o-animation: progress-bar-stripes 2s linear infinite;\n          animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n  background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n  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);\n  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);\n  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);\n}\n.progress-bar-info {\n  background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n  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);\n  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);\n  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);\n}\n.progress-bar-warning {\n  background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n  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);\n  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);\n  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);\n}\n.progress-bar-danger {\n  background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n  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);\n  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);\n  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);\n}\n.media {\n  margin-top: 15px;\n}\n.media:first-child {\n  margin-top: 0;\n}\n.media-right,\n.media > .pull-right {\n  padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n  padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n  display: table-cell;\n  vertical-align: top;\n}\n.media-middle {\n  vertical-align: middle;\n}\n.media-bottom {\n  vertical-align: bottom;\n}\n.media-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n.list-group {\n  padding-left: 0;\n  margin-bottom: 20px;\n}\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n  margin-bottom: -1px;\n  background-color: #fff;\n  border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n  border-top-left-radius: 4px;\n  border-top-right-radius: 4px;\n}\n.list-group-item:last-child {\n  margin-bottom: 0;\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\na.list-group-item {\n  color: #555;\n}\na.list-group-item .list-group-item-heading {\n  color: #333;\n}\na.list-group-item:hover,\na.list-group-item:focus {\n  color: #555;\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n  color: #777;\n  cursor: not-allowed;\n  background-color: #eee;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n  color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n  color: #777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  z-index: 2;\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n  color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n  color: #c7ddef;\n}\n.list-group-item-success {\n  color: #3c763d;\n  background-color: #dff0d8;\n}\na.list-group-item-success {\n  color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-success:hover,\na.list-group-item-success:focus {\n  color: #3c763d;\n  background-color: #d0e9c6;\n}\na.list-group-item-success.active,\na.list-group-item-success.active:hover,\na.list-group-item-success.active:focus {\n  color: #fff;\n  background-color: #3c763d;\n  border-color: #3c763d;\n}\n.list-group-item-info {\n  color: #31708f;\n  background-color: #d9edf7;\n}\na.list-group-item-info {\n  color: #31708f;\n}\na.list-group-item-info .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-info:hover,\na.list-group-item-info:focus {\n  color: #31708f;\n  background-color: #c4e3f3;\n}\na.list-group-item-info.active,\na.list-group-item-info.active:hover,\na.list-group-item-info.active:focus {\n  color: #fff;\n  background-color: #31708f;\n  border-color: #31708f;\n}\n.list-group-item-warning {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n}\na.list-group-item-warning {\n  color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-warning:hover,\na.list-group-item-warning:focus {\n  color: #8a6d3b;\n  background-color: #faf2cc;\n}\na.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus {\n  color: #fff;\n  background-color: #8a6d3b;\n  border-color: #8a6d3b;\n}\n.list-group-item-danger {\n  color: #a94442;\n  background-color: #f2dede;\n}\na.list-group-item-danger {\n  color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-danger:hover,\na.list-group-item-danger:focus {\n  color: #a94442;\n  background-color: #ebcccc;\n}\na.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus {\n  color: #fff;\n  background-color: #a94442;\n  border-color: #a94442;\n}\n.list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3;\n}\n.panel {\n  margin-bottom: 20px;\n  background-color: #fff;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05);\n          box-shadow: 0 1px 1px rgba(0, 0, 0, .05);\n}\n.panel-body {\n  padding: 15px;\n}\n.panel-heading {\n  padding: 10px 15px;\n  border-bottom: 1px solid transparent;\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n  color: inherit;\n}\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: 16px;\n  color: inherit;\n}\n.panel-title > a {\n  color: inherit;\n}\n.panel-footer {\n  padding: 10px 15px;\n  background-color: #f5f5f5;\n  border-top: 1px solid #ddd;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n  margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n  border-width: 1px 0;\n  border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n  border-top: 0;\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n  border-bottom: 0;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n  border-top-width: 0;\n}\n.list-group + .panel-footer {\n  border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n  margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n  padding-right: 15px;\n  padding-left: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n  border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n  border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n  border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n  border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n  border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n  border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n  border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n  border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n  border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n  border-bottom: 0;\n}\n.panel > .table-responsive {\n  margin-bottom: 0;\n  border: 0;\n}\n.panel-group {\n  margin-bottom: 20px;\n}\n.panel-group .panel {\n  margin-bottom: 0;\n  border-radius: 4px;\n}\n.panel-group .panel + .panel {\n  margin-top: 5px;\n}\n.panel-group .panel-heading {\n  border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n  border-top: 1px solid #ddd;\n}\n.panel-group .panel-footer {\n  border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n  border-bottom: 1px solid #ddd;\n}\n.panel-default {\n  border-color: #ddd;\n}\n.panel-default > .panel-heading {\n  color: #333;\n  background-color: #f5f5f5;\n  border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n  color: #f5f5f5;\n  background-color: #333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #ddd;\n}\n.panel-primary {\n  border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n  color: #337ab7;\n  background-color: #fff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #337ab7;\n}\n.panel-success {\n  border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n  color: #dff0d8;\n  background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #d6e9c6;\n}\n.panel-info {\n  border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n  color: #31708f;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n  color: #d9edf7;\n  background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #bce8f1;\n}\n.panel-warning {\n  border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n  color: #fcf8e3;\n  background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #faebcc;\n}\n.panel-danger {\n  border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n  color: #f2dede;\n  background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n  position: relative;\n  display: block;\n  height: 0;\n  padding: 0;\n  overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  border: 0;\n}\n.embed-responsive.embed-responsive-16by9 {\n  padding-bottom: 56.25%;\n}\n.embed-responsive.embed-responsive-4by3 {\n  padding-bottom: 75%;\n}\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border: 1px solid #e3e3e3;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);\n}\n.well blockquote {\n  border-color: #ddd;\n  border-color: rgba(0, 0, 0, .15);\n}\n.well-lg {\n  padding: 24px;\n  border-radius: 6px;\n}\n.well-sm {\n  padding: 9px;\n  border-radius: 3px;\n}\n.close {\n  float: right;\n  font-size: 21px;\n  font-weight: bold;\n  line-height: 1;\n  color: #000;\n  text-shadow: 0 1px 0 #fff;\n  filter: alpha(opacity=20);\n  opacity: .2;\n}\n.close:hover,\n.close:focus {\n  color: #000;\n  text-decoration: none;\n  cursor: pointer;\n  filter: alpha(opacity=50);\n  opacity: .5;\n}\nbutton.close {\n  -webkit-appearance: none;\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n}\n.modal-open {\n  overflow: hidden;\n}\n.modal {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  display: none;\n  overflow: hidden;\n  -webkit-overflow-scrolling: touch;\n  outline: 0;\n}\n.modal.fade .modal-dialog {\n  -webkit-transition: -webkit-transform .3s ease-out;\n       -o-transition:      -o-transform .3s ease-out;\n          transition:         transform .3s ease-out;\n  -webkit-transform: translate(0, -25%);\n      -ms-transform: translate(0, -25%);\n       -o-transform: translate(0, -25%);\n          transform: translate(0, -25%);\n}\n.modal.in .modal-dialog {\n  -webkit-transform: translate(0, 0);\n      -ms-transform: translate(0, 0);\n       -o-transform: translate(0, 0);\n          transform: translate(0, 0);\n}\n.modal-open .modal {\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: 10px;\n}\n.modal-content {\n  position: relative;\n  background-color: #fff;\n  -webkit-background-clip: padding-box;\n          background-clip: padding-box;\n  border: 1px solid #999;\n  border: 1px solid rgba(0, 0, 0, .2);\n  border-radius: 6px;\n  outline: 0;\n  -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5);\n          box-shadow: 0 3px 9px rgba(0, 0, 0, .5);\n}\n.modal-backdrop {\n  position: absolute;\n  top: 0;\n  right: 0;\n  left: 0;\n  background-color: #000;\n}\n.modal-backdrop.fade {\n  filter: alpha(opacity=0);\n  opacity: 0;\n}\n.modal-backdrop.in {\n  filter: alpha(opacity=50);\n  opacity: .5;\n}\n.modal-header {\n  min-height: 16.42857143px;\n  padding: 15px;\n  border-bottom: 1px solid #e5e5e5;\n}\n.modal-header .close {\n  margin-top: -2px;\n}\n.modal-title {\n  margin: 0;\n  line-height: 1.42857143;\n}\n.modal-body {\n  position: relative;\n  padding: 15px;\n}\n.modal-footer {\n  padding: 15px;\n  text-align: right;\n  border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n  margin-bottom: 0;\n  margin-left: 5px;\n}\n.modal-footer .btn-group .btn + .btn {\n  margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n  margin-left: 0;\n}\n.modal-scrollbar-measure {\n  position: absolute;\n  top: -9999px;\n  width: 50px;\n  height: 50px;\n  overflow: scroll;\n}\n@media (min-width: 768px) {\n  .modal-dialog {\n    width: 600px;\n    margin: 30px auto;\n  }\n  .modal-content {\n    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5);\n            box-shadow: 0 5px 15px rgba(0, 0, 0, .5);\n  }\n  .modal-sm {\n    width: 300px;\n  }\n}\n@media (min-width: 992px) {\n  .modal-lg {\n    width: 900px;\n  }\n}\n.tooltip {\n  position: absolute;\n  z-index: 1070;\n  display: block;\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 12px;\n  font-weight: normal;\n  line-height: 1.4;\n  visibility: visible;\n  filter: alpha(opacity=0);\n  opacity: 0;\n}\n.tooltip.in {\n  filter: alpha(opacity=90);\n  opacity: .9;\n}\n.tooltip.top {\n  padding: 5px 0;\n  margin-top: -3px;\n}\n.tooltip.right {\n  padding: 0 5px;\n  margin-left: 3px;\n}\n.tooltip.bottom {\n  padding: 5px 0;\n  margin-top: 3px;\n}\n.tooltip.left {\n  padding: 0 5px;\n  margin-left: -3px;\n}\n.tooltip-inner {\n  max-width: 200px;\n  padding: 3px 8px;\n  color: #fff;\n  text-align: center;\n  text-decoration: none;\n  background-color: #000;\n  border-radius: 4px;\n}\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n  bottom: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n  right: 5px;\n  bottom: 0;\n  margin-bottom: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n  bottom: 0;\n  left: 5px;\n  margin-bottom: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.right .tooltip-arrow {\n  top: 50%;\n  left: 0;\n  margin-top: -5px;\n  border-width: 5px 5px 5px 0;\n  border-right-color: #000;\n}\n.tooltip.left .tooltip-arrow {\n  top: 50%;\n  right: 0;\n  margin-top: -5px;\n  border-width: 5px 0 5px 5px;\n  border-left-color: #000;\n}\n.tooltip.bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n  top: 0;\n  right: 5px;\n  margin-top: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n  top: 0;\n  left: 5px;\n  margin-top: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1060;\n  display: none;\n  max-width: 276px;\n  padding: 1px;\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1.42857143;\n  text-align: left;\n  white-space: normal;\n  background-color: #fff;\n  -webkit-background-clip: padding-box;\n          background-clip: padding-box;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, .2);\n  border-radius: 6px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2);\n          box-shadow: 0 5px 10px rgba(0, 0, 0, .2);\n}\n.popover.top {\n  margin-top: -10px;\n}\n.popover.right {\n  margin-left: 10px;\n}\n.popover.bottom {\n  margin-top: 10px;\n}\n.popover.left {\n  margin-left: -10px;\n}\n.popover-title {\n  padding: 8px 14px;\n  margin: 0;\n  font-size: 14px;\n  background-color: #f7f7f7;\n  border-bottom: 1px solid #ebebeb;\n  border-radius: 5px 5px 0 0;\n}\n.popover-content {\n  padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n  position: absolute;\n  display: block;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.popover > .arrow {\n  border-width: 11px;\n}\n.popover > .arrow:after {\n  content: \"\";\n  border-width: 10px;\n}\n.popover.top > .arrow {\n  bottom: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-top-color: #999;\n  border-top-color: rgba(0, 0, 0, .25);\n  border-bottom-width: 0;\n}\n.popover.top > .arrow:after {\n  bottom: 1px;\n  margin-left: -10px;\n  content: \" \";\n  border-top-color: #fff;\n  border-bottom-width: 0;\n}\n.popover.right > .arrow {\n  top: 50%;\n  left: -11px;\n  margin-top: -11px;\n  border-right-color: #999;\n  border-right-color: rgba(0, 0, 0, .25);\n  border-left-width: 0;\n}\n.popover.right > .arrow:after {\n  bottom: -10px;\n  left: 1px;\n  content: \" \";\n  border-right-color: #fff;\n  border-left-width: 0;\n}\n.popover.bottom > .arrow {\n  top: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-top-width: 0;\n  border-bottom-color: #999;\n  border-bottom-color: rgba(0, 0, 0, .25);\n}\n.popover.bottom > .arrow:after {\n  top: 1px;\n  margin-left: -10px;\n  content: \" \";\n  border-top-width: 0;\n  border-bottom-color: #fff;\n}\n.popover.left > .arrow {\n  top: 50%;\n  right: -11px;\n  margin-top: -11px;\n  border-right-width: 0;\n  border-left-color: #999;\n  border-left-color: rgba(0, 0, 0, .25);\n}\n.popover.left > .arrow:after {\n  right: 1px;\n  bottom: -10px;\n  content: \" \";\n  border-right-width: 0;\n  border-left-color: #fff;\n}\n.carousel {\n  position: relative;\n}\n.carousel-inner {\n  position: relative;\n  width: 100%;\n  overflow: hidden;\n}\n.carousel-inner > .item {\n  position: relative;\n  display: none;\n  -webkit-transition: .6s ease-in-out left;\n       -o-transition: .6s ease-in-out left;\n          transition: .6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n  .carousel-inner > .item {\n    -webkit-transition: -webkit-transform .6s ease-in-out;\n         -o-transition:      -o-transform .6s ease-in-out;\n            transition:         transform .6s ease-in-out;\n\n    -webkit-backface-visibility: hidden;\n            backface-visibility: hidden;\n    -webkit-perspective: 1000;\n            perspective: 1000;\n  }\n  .carousel-inner > .item.next,\n  .carousel-inner > .item.active.right {\n    left: 0;\n    -webkit-transform: translate3d(100%, 0, 0);\n            transform: translate3d(100%, 0, 0);\n  }\n  .carousel-inner > .item.prev,\n  .carousel-inner > .item.active.left {\n    left: 0;\n    -webkit-transform: translate3d(-100%, 0, 0);\n            transform: translate3d(-100%, 0, 0);\n  }\n  .carousel-inner > .item.next.left,\n  .carousel-inner > .item.prev.right,\n  .carousel-inner > .item.active {\n    left: 0;\n    -webkit-transform: translate3d(0, 0, 0);\n            transform: translate3d(0, 0, 0);\n  }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  display: block;\n}\n.carousel-inner > .active {\n  left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n.carousel-inner > .next {\n  left: 100%;\n}\n.carousel-inner > .prev {\n  left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n  left: 0;\n}\n.carousel-inner > .active.left {\n  left: -100%;\n}\n.carousel-inner > .active.right {\n  left: 100%;\n}\n.carousel-control {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  width: 15%;\n  font-size: 20px;\n  color: #fff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, .6);\n  filter: alpha(opacity=50);\n  opacity: .5;\n}\n.carousel-control.left {\n  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);\n  background-image:      -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);\n  background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001)));\n  background-image:         linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n  background-repeat: repeat-x;\n}\n.carousel-control.right {\n  right: 0;\n  left: auto;\n  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);\n  background-image:      -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);\n  background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5)));\n  background-image:         linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n  background-repeat: repeat-x;\n}\n.carousel-control:hover,\n.carousel-control:focus {\n  color: #fff;\n  text-decoration: none;\n  filter: alpha(opacity=90);\n  outline: 0;\n  opacity: .9;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n  position: absolute;\n  top: 50%;\n  z-index: 5;\n  display: inline-block;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n  left: 50%;\n  margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n  right: 50%;\n  margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n  width: 20px;\n  height: 20px;\n  margin-top: -10px;\n  font-family: serif;\n}\n.carousel-control .icon-prev:before {\n  content: '\\2039';\n}\n.carousel-control .icon-next:before {\n  content: '\\203a';\n}\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  padding-left: 0;\n  margin-left: -30%;\n  text-align: center;\n  list-style: none;\n}\n.carousel-indicators li {\n  display: inline-block;\n  width: 10px;\n  height: 10px;\n  margin: 1px;\n  text-indent: -999px;\n  cursor: pointer;\n  background-color: #000 \\9;\n  background-color: rgba(0, 0, 0, 0);\n  border: 1px solid #fff;\n  border-radius: 10px;\n}\n.carousel-indicators .active {\n  width: 12px;\n  height: 12px;\n  margin: 0;\n  background-color: #fff;\n}\n.carousel-caption {\n  position: absolute;\n  right: 15%;\n  bottom: 20px;\n  left: 15%;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: #fff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, .6);\n}\n.carousel-caption .btn {\n  text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-prev,\n  .carousel-control .icon-next {\n    width: 30px;\n    height: 30px;\n    margin-top: -15px;\n    font-size: 30px;\n  }\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .icon-prev {\n    margin-left: -15px;\n  }\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-next {\n    margin-right: -15px;\n  }\n  .carousel-caption {\n    right: 20%;\n    left: 20%;\n    padding-bottom: 30px;\n  }\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \" \";\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-footer:after {\n  clear: both;\n}\n.center-block {\n  display: block;\n  margin-right: auto;\n  margin-left: auto;\n}\n.pull-right {\n  float: right !important;\n}\n.pull-left {\n  float: left !important;\n}\n.hide {\n  display: none !important;\n}\n.show {\n  display: block !important;\n}\n.invisible {\n  visibility: hidden;\n}\n.text-hide {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n.hidden {\n  display: none !important;\n  visibility: hidden !important;\n}\n.affix {\n  position: fixed;\n}\n@-ms-viewport {\n  width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n  display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n  display: none !important;\n}\n@media (max-width: 767px) {\n  .visible-xs {\n    display: block !important;\n  }\n  table.visible-xs {\n    display: table;\n  }\n  tr.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-xs,\n  td.visible-xs {\n    display: table-cell !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-block {\n    display: block !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-inline {\n    display: inline !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm {\n    display: block !important;\n  }\n  table.visible-sm {\n    display: table;\n  }\n  tr.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-sm,\n  td.visible-sm {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-block {\n    display: block !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md {\n    display: block !important;\n  }\n  table.visible-md {\n    display: table;\n  }\n  tr.visible-md {\n    display: table-row !important;\n  }\n  th.visible-md,\n  td.visible-md {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-block {\n    display: block !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg {\n    display: block !important;\n  }\n  table.visible-lg {\n    display: table;\n  }\n  tr.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-lg,\n  td.visible-lg {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-block {\n    display: block !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (max-width: 767px) {\n  .hidden-xs {\n    display: none !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-sm {\n    display: none !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-md {\n    display: none !important;\n  }\n}\n@media (min-width: 1200px) {\n  .hidden-lg {\n    display: none !important;\n  }\n}\n.visible-print {\n  display: none !important;\n}\n@media print {\n  .visible-print {\n    display: block !important;\n  }\n  table.visible-print {\n    display: table;\n  }\n  tr.visible-print {\n    display: table-row !important;\n  }\n  th.visible-print,\n  td.visible-print {\n    display: table-cell !important;\n  }\n}\n.visible-print-block {\n  display: none !important;\n}\n@media print {\n  .visible-print-block {\n    display: block !important;\n  }\n}\n.visible-print-inline {\n  display: none !important;\n}\n@media print {\n  .visible-print-inline {\n    display: inline !important;\n  }\n}\n.visible-print-inline-block {\n  display: none !important;\n}\n@media print {\n  .visible-print-inline-block {\n    display: inline-block !important;\n  }\n}\n@media print {\n  .hidden-print {\n    display: none !important;\n  }\n}\n/*# sourceMappingURL=bootstrap.css.map */\n"
  },
  {
    "path": "examples/myCoolProject/dist/js/bootstrap.js",
    "content": "/*!\n * Bootstrap v3.3.1 (http://getbootstrap.com)\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\nif (typeof jQuery === 'undefined') {\n  throw new Error('Bootstrap\\'s JavaScript requires jQuery')\n}\n\n+function ($) {\n  var version = $.fn.jquery.split(' ')[0].split('.')\n  if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1)) {\n    throw new Error('Bootstrap\\'s JavaScript requires jQuery version 1.9.1 or higher')\n  }\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: transition.js v3.3.1\n * http://getbootstrap.com/javascript/#transitions\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)\n  // ============================================================\n\n  function transitionEnd() {\n    var el = document.createElement('bootstrap')\n\n    var transEndEventNames = {\n      WebkitTransition : 'webkitTransitionEnd',\n      MozTransition    : 'transitionend',\n      OTransition      : 'oTransitionEnd otransitionend',\n      transition       : 'transitionend'\n    }\n\n    for (var name in transEndEventNames) {\n      if (el.style[name] !== undefined) {\n        return { end: transEndEventNames[name] }\n      }\n    }\n\n    return false // explicit for ie8 (  ._.)\n  }\n\n  // http://blog.alexmaccaw.com/css-transitions\n  $.fn.emulateTransitionEnd = function (duration) {\n    var called = false\n    var $el = this\n    $(this).one('bsTransitionEnd', function () { called = true })\n    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }\n    setTimeout(callback, duration)\n    return this\n  }\n\n  $(function () {\n    $.support.transition = transitionEnd()\n\n    if (!$.support.transition) return\n\n    $.event.special.bsTransitionEnd = {\n      bindType: $.support.transition.end,\n      delegateType: $.support.transition.end,\n      handle: function (e) {\n        if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)\n      }\n    }\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: alert.js v3.3.1\n * http://getbootstrap.com/javascript/#alerts\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // ALERT CLASS DEFINITION\n  // ======================\n\n  var dismiss = '[data-dismiss=\"alert\"]'\n  var Alert   = function (el) {\n    $(el).on('click', dismiss, this.close)\n  }\n\n  Alert.VERSION = '3.3.1'\n\n  Alert.TRANSITION_DURATION = 150\n\n  Alert.prototype.close = function (e) {\n    var $this    = $(this)\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    var $parent = $(selector)\n\n    if (e) e.preventDefault()\n\n    if (!$parent.length) {\n      $parent = $this.closest('.alert')\n    }\n\n    $parent.trigger(e = $.Event('close.bs.alert'))\n\n    if (e.isDefaultPrevented()) return\n\n    $parent.removeClass('in')\n\n    function removeElement() {\n      // detach from parent, fire event then clean up data\n      $parent.detach().trigger('closed.bs.alert').remove()\n    }\n\n    $.support.transition && $parent.hasClass('fade') ?\n      $parent\n        .one('bsTransitionEnd', removeElement)\n        .emulateTransitionEnd(Alert.TRANSITION_DURATION) :\n      removeElement()\n  }\n\n\n  // ALERT PLUGIN DEFINITION\n  // =======================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.alert')\n\n      if (!data) $this.data('bs.alert', (data = new Alert(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  var old = $.fn.alert\n\n  $.fn.alert             = Plugin\n  $.fn.alert.Constructor = Alert\n\n\n  // ALERT NO CONFLICT\n  // =================\n\n  $.fn.alert.noConflict = function () {\n    $.fn.alert = old\n    return this\n  }\n\n\n  // ALERT DATA-API\n  // ==============\n\n  $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: button.js v3.3.1\n * http://getbootstrap.com/javascript/#buttons\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // BUTTON PUBLIC CLASS DEFINITION\n  // ==============================\n\n  var Button = function (element, options) {\n    this.$element  = $(element)\n    this.options   = $.extend({}, Button.DEFAULTS, options)\n    this.isLoading = false\n  }\n\n  Button.VERSION  = '3.3.1'\n\n  Button.DEFAULTS = {\n    loadingText: 'loading...'\n  }\n\n  Button.prototype.setState = function (state) {\n    var d    = 'disabled'\n    var $el  = this.$element\n    var val  = $el.is('input') ? 'val' : 'html'\n    var data = $el.data()\n\n    state = state + 'Text'\n\n    if (data.resetText == null) $el.data('resetText', $el[val]())\n\n    // push to event loop to allow forms to submit\n    setTimeout($.proxy(function () {\n      $el[val](data[state] == null ? this.options[state] : data[state])\n\n      if (state == 'loadingText') {\n        this.isLoading = true\n        $el.addClass(d).attr(d, d)\n      } else if (this.isLoading) {\n        this.isLoading = false\n        $el.removeClass(d).removeAttr(d)\n      }\n    }, this), 0)\n  }\n\n  Button.prototype.toggle = function () {\n    var changed = true\n    var $parent = this.$element.closest('[data-toggle=\"buttons\"]')\n\n    if ($parent.length) {\n      var $input = this.$element.find('input')\n      if ($input.prop('type') == 'radio') {\n        if ($input.prop('checked') && this.$element.hasClass('active')) changed = false\n        else $parent.find('.active').removeClass('active')\n      }\n      if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change')\n    } else {\n      this.$element.attr('aria-pressed', !this.$element.hasClass('active'))\n    }\n\n    if (changed) this.$element.toggleClass('active')\n  }\n\n\n  // BUTTON PLUGIN DEFINITION\n  // ========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.button')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.button', (data = new Button(this, options)))\n\n      if (option == 'toggle') data.toggle()\n      else if (option) data.setState(option)\n    })\n  }\n\n  var old = $.fn.button\n\n  $.fn.button             = Plugin\n  $.fn.button.Constructor = Button\n\n\n  // BUTTON NO CONFLICT\n  // ==================\n\n  $.fn.button.noConflict = function () {\n    $.fn.button = old\n    return this\n  }\n\n\n  // BUTTON DATA-API\n  // ===============\n\n  $(document)\n    .on('click.bs.button.data-api', '[data-toggle^=\"button\"]', function (e) {\n      var $btn = $(e.target)\n      if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')\n      Plugin.call($btn, 'toggle')\n      e.preventDefault()\n    })\n    .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^=\"button\"]', function (e) {\n      $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))\n    })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: carousel.js v3.3.1\n * http://getbootstrap.com/javascript/#carousel\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // CAROUSEL CLASS DEFINITION\n  // =========================\n\n  var Carousel = function (element, options) {\n    this.$element    = $(element)\n    this.$indicators = this.$element.find('.carousel-indicators')\n    this.options     = options\n    this.paused      =\n    this.sliding     =\n    this.interval    =\n    this.$active     =\n    this.$items      = null\n\n    this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))\n\n    this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element\n      .on('mouseenter.bs.carousel', $.proxy(this.pause, this))\n      .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))\n  }\n\n  Carousel.VERSION  = '3.3.1'\n\n  Carousel.TRANSITION_DURATION = 600\n\n  Carousel.DEFAULTS = {\n    interval: 5000,\n    pause: 'hover',\n    wrap: true,\n    keyboard: true\n  }\n\n  Carousel.prototype.keydown = function (e) {\n    if (/input|textarea/i.test(e.target.tagName)) return\n    switch (e.which) {\n      case 37: this.prev(); break\n      case 39: this.next(); break\n      default: return\n    }\n\n    e.preventDefault()\n  }\n\n  Carousel.prototype.cycle = function (e) {\n    e || (this.paused = false)\n\n    this.interval && clearInterval(this.interval)\n\n    this.options.interval\n      && !this.paused\n      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))\n\n    return this\n  }\n\n  Carousel.prototype.getItemIndex = function (item) {\n    this.$items = item.parent().children('.item')\n    return this.$items.index(item || this.$active)\n  }\n\n  Carousel.prototype.getItemForDirection = function (direction, active) {\n    var delta = direction == 'prev' ? -1 : 1\n    var activeIndex = this.getItemIndex(active)\n    var itemIndex = (activeIndex + delta) % this.$items.length\n    return this.$items.eq(itemIndex)\n  }\n\n  Carousel.prototype.to = function (pos) {\n    var that        = this\n    var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))\n\n    if (pos > (this.$items.length - 1) || pos < 0) return\n\n    if (this.sliding)       return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, \"slid\"\n    if (activeIndex == pos) return this.pause().cycle()\n\n    return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))\n  }\n\n  Carousel.prototype.pause = function (e) {\n    e || (this.paused = true)\n\n    if (this.$element.find('.next, .prev').length && $.support.transition) {\n      this.$element.trigger($.support.transition.end)\n      this.cycle(true)\n    }\n\n    this.interval = clearInterval(this.interval)\n\n    return this\n  }\n\n  Carousel.prototype.next = function () {\n    if (this.sliding) return\n    return this.slide('next')\n  }\n\n  Carousel.prototype.prev = function () {\n    if (this.sliding) return\n    return this.slide('prev')\n  }\n\n  Carousel.prototype.slide = function (type, next) {\n    var $active   = this.$element.find('.item.active')\n    var $next     = next || this.getItemForDirection(type, $active)\n    var isCycling = this.interval\n    var direction = type == 'next' ? 'left' : 'right'\n    var fallback  = type == 'next' ? 'first' : 'last'\n    var that      = this\n\n    if (!$next.length) {\n      if (!this.options.wrap) return\n      $next = this.$element.find('.item')[fallback]()\n    }\n\n    if ($next.hasClass('active')) return (this.sliding = false)\n\n    var relatedTarget = $next[0]\n    var slideEvent = $.Event('slide.bs.carousel', {\n      relatedTarget: relatedTarget,\n      direction: direction\n    })\n    this.$element.trigger(slideEvent)\n    if (slideEvent.isDefaultPrevented()) return\n\n    this.sliding = true\n\n    isCycling && this.pause()\n\n    if (this.$indicators.length) {\n      this.$indicators.find('.active').removeClass('active')\n      var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])\n      $nextIndicator && $nextIndicator.addClass('active')\n    }\n\n    var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, \"slid\"\n    if ($.support.transition && this.$element.hasClass('slide')) {\n      $next.addClass(type)\n      $next[0].offsetWidth // force reflow\n      $active.addClass(direction)\n      $next.addClass(direction)\n      $active\n        .one('bsTransitionEnd', function () {\n          $next.removeClass([type, direction].join(' ')).addClass('active')\n          $active.removeClass(['active', direction].join(' '))\n          that.sliding = false\n          setTimeout(function () {\n            that.$element.trigger(slidEvent)\n          }, 0)\n        })\n        .emulateTransitionEnd(Carousel.TRANSITION_DURATION)\n    } else {\n      $active.removeClass('active')\n      $next.addClass('active')\n      this.sliding = false\n      this.$element.trigger(slidEvent)\n    }\n\n    isCycling && this.cycle()\n\n    return this\n  }\n\n\n  // CAROUSEL PLUGIN DEFINITION\n  // ==========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.carousel')\n      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)\n      var action  = typeof option == 'string' ? option : options.slide\n\n      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))\n      if (typeof option == 'number') data.to(option)\n      else if (action) data[action]()\n      else if (options.interval) data.pause().cycle()\n    })\n  }\n\n  var old = $.fn.carousel\n\n  $.fn.carousel             = Plugin\n  $.fn.carousel.Constructor = Carousel\n\n\n  // CAROUSEL NO CONFLICT\n  // ====================\n\n  $.fn.carousel.noConflict = function () {\n    $.fn.carousel = old\n    return this\n  }\n\n\n  // CAROUSEL DATA-API\n  // =================\n\n  var clickHandler = function (e) {\n    var href\n    var $this   = $(this)\n    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) // strip for ie7\n    if (!$target.hasClass('carousel')) return\n    var options = $.extend({}, $target.data(), $this.data())\n    var slideIndex = $this.attr('data-slide-to')\n    if (slideIndex) options.interval = false\n\n    Plugin.call($target, options)\n\n    if (slideIndex) {\n      $target.data('bs.carousel').to(slideIndex)\n    }\n\n    e.preventDefault()\n  }\n\n  $(document)\n    .on('click.bs.carousel.data-api', '[data-slide]', clickHandler)\n    .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)\n\n  $(window).on('load', function () {\n    $('[data-ride=\"carousel\"]').each(function () {\n      var $carousel = $(this)\n      Plugin.call($carousel, $carousel.data())\n    })\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: collapse.js v3.3.1\n * http://getbootstrap.com/javascript/#collapse\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // COLLAPSE PUBLIC CLASS DEFINITION\n  // ================================\n\n  var Collapse = function (element, options) {\n    this.$element      = $(element)\n    this.options       = $.extend({}, Collapse.DEFAULTS, options)\n    this.$trigger      = $(this.options.trigger).filter('[href=\"#' + element.id + '\"], [data-target=\"#' + element.id + '\"]')\n    this.transitioning = null\n\n    if (this.options.parent) {\n      this.$parent = this.getParent()\n    } else {\n      this.addAriaAndCollapsedClass(this.$element, this.$trigger)\n    }\n\n    if (this.options.toggle) this.toggle()\n  }\n\n  Collapse.VERSION  = '3.3.1'\n\n  Collapse.TRANSITION_DURATION = 350\n\n  Collapse.DEFAULTS = {\n    toggle: true,\n    trigger: '[data-toggle=\"collapse\"]'\n  }\n\n  Collapse.prototype.dimension = function () {\n    var hasWidth = this.$element.hasClass('width')\n    return hasWidth ? 'width' : 'height'\n  }\n\n  Collapse.prototype.show = function () {\n    if (this.transitioning || this.$element.hasClass('in')) return\n\n    var activesData\n    var actives = this.$parent && this.$parent.find('> .panel').children('.in, .collapsing')\n\n    if (actives && actives.length) {\n      activesData = actives.data('bs.collapse')\n      if (activesData && activesData.transitioning) return\n    }\n\n    var startEvent = $.Event('show.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    if (actives && actives.length) {\n      Plugin.call(actives, 'hide')\n      activesData || actives.data('bs.collapse', null)\n    }\n\n    var dimension = this.dimension()\n\n    this.$element\n      .removeClass('collapse')\n      .addClass('collapsing')[dimension](0)\n      .attr('aria-expanded', true)\n\n    this.$trigger\n      .removeClass('collapsed')\n      .attr('aria-expanded', true)\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.$element\n        .removeClass('collapsing')\n        .addClass('collapse in')[dimension]('')\n      this.transitioning = 0\n      this.$element\n        .trigger('shown.bs.collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    var scrollSize = $.camelCase(['scroll', dimension].join('-'))\n\n    this.$element\n      .one('bsTransitionEnd', $.proxy(complete, this))\n      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])\n  }\n\n  Collapse.prototype.hide = function () {\n    if (this.transitioning || !this.$element.hasClass('in')) return\n\n    var startEvent = $.Event('hide.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    var dimension = this.dimension()\n\n    this.$element[dimension](this.$element[dimension]())[0].offsetHeight\n\n    this.$element\n      .addClass('collapsing')\n      .removeClass('collapse in')\n      .attr('aria-expanded', false)\n\n    this.$trigger\n      .addClass('collapsed')\n      .attr('aria-expanded', false)\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.transitioning = 0\n      this.$element\n        .removeClass('collapsing')\n        .addClass('collapse')\n        .trigger('hidden.bs.collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    this.$element\n      [dimension](0)\n      .one('bsTransitionEnd', $.proxy(complete, this))\n      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)\n  }\n\n  Collapse.prototype.toggle = function () {\n    this[this.$element.hasClass('in') ? 'hide' : 'show']()\n  }\n\n  Collapse.prototype.getParent = function () {\n    return $(this.options.parent)\n      .find('[data-toggle=\"collapse\"][data-parent=\"' + this.options.parent + '\"]')\n      .each($.proxy(function (i, element) {\n        var $element = $(element)\n        this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)\n      }, this))\n      .end()\n  }\n\n  Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {\n    var isOpen = $element.hasClass('in')\n\n    $element.attr('aria-expanded', isOpen)\n    $trigger\n      .toggleClass('collapsed', !isOpen)\n      .attr('aria-expanded', isOpen)\n  }\n\n  function getTargetFromTrigger($trigger) {\n    var href\n    var target = $trigger.attr('data-target')\n      || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '') // strip for ie7\n\n    return $(target)\n  }\n\n\n  // COLLAPSE PLUGIN DEFINITION\n  // ==========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.collapse')\n      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\n      if (!data && options.toggle && option == 'show') options.toggle = false\n      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.collapse\n\n  $.fn.collapse             = Plugin\n  $.fn.collapse.Constructor = Collapse\n\n\n  // COLLAPSE NO CONFLICT\n  // ====================\n\n  $.fn.collapse.noConflict = function () {\n    $.fn.collapse = old\n    return this\n  }\n\n\n  // COLLAPSE DATA-API\n  // =================\n\n  $(document).on('click.bs.collapse.data-api', '[data-toggle=\"collapse\"]', function (e) {\n    var $this   = $(this)\n\n    if (!$this.attr('data-target')) e.preventDefault()\n\n    var $target = getTargetFromTrigger($this)\n    var data    = $target.data('bs.collapse')\n    var option  = data ? 'toggle' : $.extend({}, $this.data(), { trigger: this })\n\n    Plugin.call($target, option)\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: dropdown.js v3.3.1\n * http://getbootstrap.com/javascript/#dropdowns\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // DROPDOWN CLASS DEFINITION\n  // =========================\n\n  var backdrop = '.dropdown-backdrop'\n  var toggle   = '[data-toggle=\"dropdown\"]'\n  var Dropdown = function (element) {\n    $(element).on('click.bs.dropdown', this.toggle)\n  }\n\n  Dropdown.VERSION = '3.3.1'\n\n  Dropdown.prototype.toggle = function (e) {\n    var $this = $(this)\n\n    if ($this.is('.disabled, :disabled')) return\n\n    var $parent  = getParent($this)\n    var isActive = $parent.hasClass('open')\n\n    clearMenus()\n\n    if (!isActive) {\n      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {\n        // if mobile we use a backdrop because click events don't delegate\n        $('<div class=\"dropdown-backdrop\"/>').insertAfter($(this)).on('click', clearMenus)\n      }\n\n      var relatedTarget = { relatedTarget: this }\n      $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))\n\n      if (e.isDefaultPrevented()) return\n\n      $this\n        .trigger('focus')\n        .attr('aria-expanded', 'true')\n\n      $parent\n        .toggleClass('open')\n        .trigger('shown.bs.dropdown', relatedTarget)\n    }\n\n    return false\n  }\n\n  Dropdown.prototype.keydown = function (e) {\n    if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return\n\n    var $this = $(this)\n\n    e.preventDefault()\n    e.stopPropagation()\n\n    if ($this.is('.disabled, :disabled')) return\n\n    var $parent  = getParent($this)\n    var isActive = $parent.hasClass('open')\n\n    if ((!isActive && e.which != 27) || (isActive && e.which == 27)) {\n      if (e.which == 27) $parent.find(toggle).trigger('focus')\n      return $this.trigger('click')\n    }\n\n    var desc = ' li:not(.divider):visible a'\n    var $items = $parent.find('[role=\"menu\"]' + desc + ', [role=\"listbox\"]' + desc)\n\n    if (!$items.length) return\n\n    var index = $items.index(e.target)\n\n    if (e.which == 38 && index > 0)                 index--                        // up\n    if (e.which == 40 && index < $items.length - 1) index++                        // down\n    if (!~index)                                      index = 0\n\n    $items.eq(index).trigger('focus')\n  }\n\n  function clearMenus(e) {\n    if (e && e.which === 3) return\n    $(backdrop).remove()\n    $(toggle).each(function () {\n      var $this         = $(this)\n      var $parent       = getParent($this)\n      var relatedTarget = { relatedTarget: this }\n\n      if (!$parent.hasClass('open')) return\n\n      $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))\n\n      if (e.isDefaultPrevented()) return\n\n      $this.attr('aria-expanded', 'false')\n      $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget)\n    })\n  }\n\n  function getParent($this) {\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    var $parent = selector && $(selector)\n\n    return $parent && $parent.length ? $parent : $this.parent()\n  }\n\n\n  // DROPDOWN PLUGIN DEFINITION\n  // ==========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.dropdown')\n\n      if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  var old = $.fn.dropdown\n\n  $.fn.dropdown             = Plugin\n  $.fn.dropdown.Constructor = Dropdown\n\n\n  // DROPDOWN NO CONFLICT\n  // ====================\n\n  $.fn.dropdown.noConflict = function () {\n    $.fn.dropdown = old\n    return this\n  }\n\n\n  // APPLY TO STANDARD DROPDOWN ELEMENTS\n  // ===================================\n\n  $(document)\n    .on('click.bs.dropdown.data-api', clearMenus)\n    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })\n    .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)\n    .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)\n    .on('keydown.bs.dropdown.data-api', '[role=\"menu\"]', Dropdown.prototype.keydown)\n    .on('keydown.bs.dropdown.data-api', '[role=\"listbox\"]', Dropdown.prototype.keydown)\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: modal.js v3.3.1\n * http://getbootstrap.com/javascript/#modals\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // MODAL CLASS DEFINITION\n  // ======================\n\n  var Modal = function (element, options) {\n    this.options        = options\n    this.$body          = $(document.body)\n    this.$element       = $(element)\n    this.$backdrop      =\n    this.isShown        = null\n    this.scrollbarWidth = 0\n\n    if (this.options.remote) {\n      this.$element\n        .find('.modal-content')\n        .load(this.options.remote, $.proxy(function () {\n          this.$element.trigger('loaded.bs.modal')\n        }, this))\n    }\n  }\n\n  Modal.VERSION  = '3.3.1'\n\n  Modal.TRANSITION_DURATION = 300\n  Modal.BACKDROP_TRANSITION_DURATION = 150\n\n  Modal.DEFAULTS = {\n    backdrop: true,\n    keyboard: true,\n    show: true\n  }\n\n  Modal.prototype.toggle = function (_relatedTarget) {\n    return this.isShown ? this.hide() : this.show(_relatedTarget)\n  }\n\n  Modal.prototype.show = function (_relatedTarget) {\n    var that = this\n    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })\n\n    this.$element.trigger(e)\n\n    if (this.isShown || e.isDefaultPrevented()) return\n\n    this.isShown = true\n\n    this.checkScrollbar()\n    this.setScrollbar()\n    this.$body.addClass('modal-open')\n\n    this.escape()\n    this.resize()\n\n    this.$element.on('click.dismiss.bs.modal', '[data-dismiss=\"modal\"]', $.proxy(this.hide, this))\n\n    this.backdrop(function () {\n      var transition = $.support.transition && that.$element.hasClass('fade')\n\n      if (!that.$element.parent().length) {\n        that.$element.appendTo(that.$body) // don't move modals dom position\n      }\n\n      that.$element\n        .show()\n        .scrollTop(0)\n\n      if (that.options.backdrop) that.adjustBackdrop()\n      that.adjustDialog()\n\n      if (transition) {\n        that.$element[0].offsetWidth // force reflow\n      }\n\n      that.$element\n        .addClass('in')\n        .attr('aria-hidden', false)\n\n      that.enforceFocus()\n\n      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })\n\n      transition ?\n        that.$element.find('.modal-dialog') // wait for modal to slide in\n          .one('bsTransitionEnd', function () {\n            that.$element.trigger('focus').trigger(e)\n          })\n          .emulateTransitionEnd(Modal.TRANSITION_DURATION) :\n        that.$element.trigger('focus').trigger(e)\n    })\n  }\n\n  Modal.prototype.hide = function (e) {\n    if (e) e.preventDefault()\n\n    e = $.Event('hide.bs.modal')\n\n    this.$element.trigger(e)\n\n    if (!this.isShown || e.isDefaultPrevented()) return\n\n    this.isShown = false\n\n    this.escape()\n    this.resize()\n\n    $(document).off('focusin.bs.modal')\n\n    this.$element\n      .removeClass('in')\n      .attr('aria-hidden', true)\n      .off('click.dismiss.bs.modal')\n\n    $.support.transition && this.$element.hasClass('fade') ?\n      this.$element\n        .one('bsTransitionEnd', $.proxy(this.hideModal, this))\n        .emulateTransitionEnd(Modal.TRANSITION_DURATION) :\n      this.hideModal()\n  }\n\n  Modal.prototype.enforceFocus = function () {\n    $(document)\n      .off('focusin.bs.modal') // guard against infinite focus loop\n      .on('focusin.bs.modal', $.proxy(function (e) {\n        if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {\n          this.$element.trigger('focus')\n        }\n      }, this))\n  }\n\n  Modal.prototype.escape = function () {\n    if (this.isShown && this.options.keyboard) {\n      this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {\n        e.which == 27 && this.hide()\n      }, this))\n    } else if (!this.isShown) {\n      this.$element.off('keydown.dismiss.bs.modal')\n    }\n  }\n\n  Modal.prototype.resize = function () {\n    if (this.isShown) {\n      $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))\n    } else {\n      $(window).off('resize.bs.modal')\n    }\n  }\n\n  Modal.prototype.hideModal = function () {\n    var that = this\n    this.$element.hide()\n    this.backdrop(function () {\n      that.$body.removeClass('modal-open')\n      that.resetAdjustments()\n      that.resetScrollbar()\n      that.$element.trigger('hidden.bs.modal')\n    })\n  }\n\n  Modal.prototype.removeBackdrop = function () {\n    this.$backdrop && this.$backdrop.remove()\n    this.$backdrop = null\n  }\n\n  Modal.prototype.backdrop = function (callback) {\n    var that = this\n    var animate = this.$element.hasClass('fade') ? 'fade' : ''\n\n    if (this.isShown && this.options.backdrop) {\n      var doAnimate = $.support.transition && animate\n\n      this.$backdrop = $('<div class=\"modal-backdrop ' + animate + '\" />')\n        .prependTo(this.$element)\n        .on('click.dismiss.bs.modal', $.proxy(function (e) {\n          if (e.target !== e.currentTarget) return\n          this.options.backdrop == 'static'\n            ? this.$element[0].focus.call(this.$element[0])\n            : this.hide.call(this)\n        }, this))\n\n      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow\n\n      this.$backdrop.addClass('in')\n\n      if (!callback) return\n\n      doAnimate ?\n        this.$backdrop\n          .one('bsTransitionEnd', callback)\n          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :\n        callback()\n\n    } else if (!this.isShown && this.$backdrop) {\n      this.$backdrop.removeClass('in')\n\n      var callbackRemove = function () {\n        that.removeBackdrop()\n        callback && callback()\n      }\n      $.support.transition && this.$element.hasClass('fade') ?\n        this.$backdrop\n          .one('bsTransitionEnd', callbackRemove)\n          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :\n        callbackRemove()\n\n    } else if (callback) {\n      callback()\n    }\n  }\n\n  // these following methods are used to handle overflowing modals\n\n  Modal.prototype.handleUpdate = function () {\n    if (this.options.backdrop) this.adjustBackdrop()\n    this.adjustDialog()\n  }\n\n  Modal.prototype.adjustBackdrop = function () {\n    this.$backdrop\n      .css('height', 0)\n      .css('height', this.$element[0].scrollHeight)\n  }\n\n  Modal.prototype.adjustDialog = function () {\n    var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight\n\n    this.$element.css({\n      paddingLeft:  !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',\n      paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''\n    })\n  }\n\n  Modal.prototype.resetAdjustments = function () {\n    this.$element.css({\n      paddingLeft: '',\n      paddingRight: ''\n    })\n  }\n\n  Modal.prototype.checkScrollbar = function () {\n    this.bodyIsOverflowing = document.body.scrollHeight > document.documentElement.clientHeight\n    this.scrollbarWidth = this.measureScrollbar()\n  }\n\n  Modal.prototype.setScrollbar = function () {\n    var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)\n    if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)\n  }\n\n  Modal.prototype.resetScrollbar = function () {\n    this.$body.css('padding-right', '')\n  }\n\n  Modal.prototype.measureScrollbar = function () { // thx walsh\n    var scrollDiv = document.createElement('div')\n    scrollDiv.className = 'modal-scrollbar-measure'\n    this.$body.append(scrollDiv)\n    var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth\n    this.$body[0].removeChild(scrollDiv)\n    return scrollbarWidth\n  }\n\n\n  // MODAL PLUGIN DEFINITION\n  // =======================\n\n  function Plugin(option, _relatedTarget) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.modal')\n      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\n      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))\n      if (typeof option == 'string') data[option](_relatedTarget)\n      else if (options.show) data.show(_relatedTarget)\n    })\n  }\n\n  var old = $.fn.modal\n\n  $.fn.modal             = Plugin\n  $.fn.modal.Constructor = Modal\n\n\n  // MODAL NO CONFLICT\n  // =================\n\n  $.fn.modal.noConflict = function () {\n    $.fn.modal = old\n    return this\n  }\n\n\n  // MODAL DATA-API\n  // ==============\n\n  $(document).on('click.bs.modal.data-api', '[data-toggle=\"modal\"]', function (e) {\n    var $this   = $(this)\n    var href    = $this.attr('href')\n    var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\\s]+$)/, ''))) // strip for ie7\n    var option  = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())\n\n    if ($this.is('a')) e.preventDefault()\n\n    $target.one('show.bs.modal', function (showEvent) {\n      if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown\n      $target.one('hidden.bs.modal', function () {\n        $this.is(':visible') && $this.trigger('focus')\n      })\n    })\n    Plugin.call($target, option, this)\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: tooltip.js v3.3.1\n * http://getbootstrap.com/javascript/#tooltip\n * Inspired by the original jQuery.tipsy by Jason Frame\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // TOOLTIP PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Tooltip = function (element, options) {\n    this.type       =\n    this.options    =\n    this.enabled    =\n    this.timeout    =\n    this.hoverState =\n    this.$element   = null\n\n    this.init('tooltip', element, options)\n  }\n\n  Tooltip.VERSION  = '3.3.1'\n\n  Tooltip.TRANSITION_DURATION = 150\n\n  Tooltip.DEFAULTS = {\n    animation: true,\n    placement: 'top',\n    selector: false,\n    template: '<div class=\"tooltip\" role=\"tooltip\"><div class=\"tooltip-arrow\"></div><div class=\"tooltip-inner\"></div></div>',\n    trigger: 'hover focus',\n    title: '',\n    delay: 0,\n    html: false,\n    container: false,\n    viewport: {\n      selector: 'body',\n      padding: 0\n    }\n  }\n\n  Tooltip.prototype.init = function (type, element, options) {\n    this.enabled   = true\n    this.type      = type\n    this.$element  = $(element)\n    this.options   = this.getOptions(options)\n    this.$viewport = this.options.viewport && $(this.options.viewport.selector || this.options.viewport)\n\n    var triggers = this.options.trigger.split(' ')\n\n    for (var i = triggers.length; i--;) {\n      var trigger = triggers[i]\n\n      if (trigger == 'click') {\n        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))\n      } else if (trigger != 'manual') {\n        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focusin'\n        var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'\n\n        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))\n        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))\n      }\n    }\n\n    this.options.selector ?\n      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :\n      this.fixTitle()\n  }\n\n  Tooltip.prototype.getDefaults = function () {\n    return Tooltip.DEFAULTS\n  }\n\n  Tooltip.prototype.getOptions = function (options) {\n    options = $.extend({}, this.getDefaults(), this.$element.data(), options)\n\n    if (options.delay && typeof options.delay == 'number') {\n      options.delay = {\n        show: options.delay,\n        hide: options.delay\n      }\n    }\n\n    return options\n  }\n\n  Tooltip.prototype.getDelegateOptions = function () {\n    var options  = {}\n    var defaults = this.getDefaults()\n\n    this._options && $.each(this._options, function (key, value) {\n      if (defaults[key] != value) options[key] = value\n    })\n\n    return options\n  }\n\n  Tooltip.prototype.enter = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget).data('bs.' + this.type)\n\n    if (self && self.$tip && self.$tip.is(':visible')) {\n      self.hoverState = 'in'\n      return\n    }\n\n    if (!self) {\n      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())\n      $(obj.currentTarget).data('bs.' + this.type, self)\n    }\n\n    clearTimeout(self.timeout)\n\n    self.hoverState = 'in'\n\n    if (!self.options.delay || !self.options.delay.show) return self.show()\n\n    self.timeout = setTimeout(function () {\n      if (self.hoverState == 'in') self.show()\n    }, self.options.delay.show)\n  }\n\n  Tooltip.prototype.leave = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget).data('bs.' + this.type)\n\n    if (!self) {\n      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())\n      $(obj.currentTarget).data('bs.' + this.type, self)\n    }\n\n    clearTimeout(self.timeout)\n\n    self.hoverState = 'out'\n\n    if (!self.options.delay || !self.options.delay.hide) return self.hide()\n\n    self.timeout = setTimeout(function () {\n      if (self.hoverState == 'out') self.hide()\n    }, self.options.delay.hide)\n  }\n\n  Tooltip.prototype.show = function () {\n    var e = $.Event('show.bs.' + this.type)\n\n    if (this.hasContent() && this.enabled) {\n      this.$element.trigger(e)\n\n      var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])\n      if (e.isDefaultPrevented() || !inDom) return\n      var that = this\n\n      var $tip = this.tip()\n\n      var tipId = this.getUID(this.type)\n\n      this.setContent()\n      $tip.attr('id', tipId)\n      this.$element.attr('aria-describedby', tipId)\n\n      if (this.options.animation) $tip.addClass('fade')\n\n      var placement = typeof this.options.placement == 'function' ?\n        this.options.placement.call(this, $tip[0], this.$element[0]) :\n        this.options.placement\n\n      var autoToken = /\\s?auto?\\s?/i\n      var autoPlace = autoToken.test(placement)\n      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'\n\n      $tip\n        .detach()\n        .css({ top: 0, left: 0, display: 'block' })\n        .addClass(placement)\n        .data('bs.' + this.type, this)\n\n      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)\n\n      var pos          = this.getPosition()\n      var actualWidth  = $tip[0].offsetWidth\n      var actualHeight = $tip[0].offsetHeight\n\n      if (autoPlace) {\n        var orgPlacement = placement\n        var $container   = this.options.container ? $(this.options.container) : this.$element.parent()\n        var containerDim = this.getPosition($container)\n\n        placement = placement == 'bottom' && pos.bottom + actualHeight > containerDim.bottom ? 'top'    :\n                    placement == 'top'    && pos.top    - actualHeight < containerDim.top    ? 'bottom' :\n                    placement == 'right'  && pos.right  + actualWidth  > containerDim.width  ? 'left'   :\n                    placement == 'left'   && pos.left   - actualWidth  < containerDim.left   ? 'right'  :\n                    placement\n\n        $tip\n          .removeClass(orgPlacement)\n          .addClass(placement)\n      }\n\n      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)\n\n      this.applyPlacement(calculatedOffset, placement)\n\n      var complete = function () {\n        var prevHoverState = that.hoverState\n        that.$element.trigger('shown.bs.' + that.type)\n        that.hoverState = null\n\n        if (prevHoverState == 'out') that.leave(that)\n      }\n\n      $.support.transition && this.$tip.hasClass('fade') ?\n        $tip\n          .one('bsTransitionEnd', complete)\n          .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :\n        complete()\n    }\n  }\n\n  Tooltip.prototype.applyPlacement = function (offset, placement) {\n    var $tip   = this.tip()\n    var width  = $tip[0].offsetWidth\n    var height = $tip[0].offsetHeight\n\n    // manually read margins because getBoundingClientRect includes difference\n    var marginTop = parseInt($tip.css('margin-top'), 10)\n    var marginLeft = parseInt($tip.css('margin-left'), 10)\n\n    // we must check for NaN for ie 8/9\n    if (isNaN(marginTop))  marginTop  = 0\n    if (isNaN(marginLeft)) marginLeft = 0\n\n    offset.top  = offset.top  + marginTop\n    offset.left = offset.left + marginLeft\n\n    // $.fn.offset doesn't round pixel values\n    // so we use setOffset directly with our own function B-0\n    $.offset.setOffset($tip[0], $.extend({\n      using: function (props) {\n        $tip.css({\n          top: Math.round(props.top),\n          left: Math.round(props.left)\n        })\n      }\n    }, offset), 0)\n\n    $tip.addClass('in')\n\n    // check to see if placing tip in new offset caused the tip to resize itself\n    var actualWidth  = $tip[0].offsetWidth\n    var actualHeight = $tip[0].offsetHeight\n\n    if (placement == 'top' && actualHeight != height) {\n      offset.top = offset.top + height - actualHeight\n    }\n\n    var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)\n\n    if (delta.left) offset.left += delta.left\n    else offset.top += delta.top\n\n    var isVertical          = /top|bottom/.test(placement)\n    var arrowDelta          = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight\n    var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'\n\n    $tip.offset(offset)\n    this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)\n  }\n\n  Tooltip.prototype.replaceArrow = function (delta, dimension, isHorizontal) {\n    this.arrow()\n      .css(isHorizontal ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')\n      .css(isHorizontal ? 'top' : 'left', '')\n  }\n\n  Tooltip.prototype.setContent = function () {\n    var $tip  = this.tip()\n    var title = this.getTitle()\n\n    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)\n    $tip.removeClass('fade in top bottom left right')\n  }\n\n  Tooltip.prototype.hide = function (callback) {\n    var that = this\n    var $tip = this.tip()\n    var e    = $.Event('hide.bs.' + this.type)\n\n    function complete() {\n      if (that.hoverState != 'in') $tip.detach()\n      that.$element\n        .removeAttr('aria-describedby')\n        .trigger('hidden.bs.' + that.type)\n      callback && callback()\n    }\n\n    this.$element.trigger(e)\n\n    if (e.isDefaultPrevented()) return\n\n    $tip.removeClass('in')\n\n    $.support.transition && this.$tip.hasClass('fade') ?\n      $tip\n        .one('bsTransitionEnd', complete)\n        .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :\n      complete()\n\n    this.hoverState = null\n\n    return this\n  }\n\n  Tooltip.prototype.fixTitle = function () {\n    var $e = this.$element\n    if ($e.attr('title') || typeof ($e.attr('data-original-title')) != 'string') {\n      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')\n    }\n  }\n\n  Tooltip.prototype.hasContent = function () {\n    return this.getTitle()\n  }\n\n  Tooltip.prototype.getPosition = function ($element) {\n    $element   = $element || this.$element\n\n    var el     = $element[0]\n    var isBody = el.tagName == 'BODY'\n\n    var elRect    = el.getBoundingClientRect()\n    if (elRect.width == null) {\n      // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093\n      elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })\n    }\n    var elOffset  = isBody ? { top: 0, left: 0 } : $element.offset()\n    var scroll    = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }\n    var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null\n\n    return $.extend({}, elRect, scroll, outerDims, elOffset)\n  }\n\n  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {\n    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2  } :\n           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2  } :\n           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :\n        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width   }\n\n  }\n\n  Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {\n    var delta = { top: 0, left: 0 }\n    if (!this.$viewport) return delta\n\n    var viewportPadding = this.options.viewport && this.options.viewport.padding || 0\n    var viewportDimensions = this.getPosition(this.$viewport)\n\n    if (/right|left/.test(placement)) {\n      var topEdgeOffset    = pos.top - viewportPadding - viewportDimensions.scroll\n      var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight\n      if (topEdgeOffset < viewportDimensions.top) { // top overflow\n        delta.top = viewportDimensions.top - topEdgeOffset\n      } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow\n        delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset\n      }\n    } else {\n      var leftEdgeOffset  = pos.left - viewportPadding\n      var rightEdgeOffset = pos.left + viewportPadding + actualWidth\n      if (leftEdgeOffset < viewportDimensions.left) { // left overflow\n        delta.left = viewportDimensions.left - leftEdgeOffset\n      } else if (rightEdgeOffset > viewportDimensions.width) { // right overflow\n        delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset\n      }\n    }\n\n    return delta\n  }\n\n  Tooltip.prototype.getTitle = function () {\n    var title\n    var $e = this.$element\n    var o  = this.options\n\n    title = $e.attr('data-original-title')\n      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)\n\n    return title\n  }\n\n  Tooltip.prototype.getUID = function (prefix) {\n    do prefix += ~~(Math.random() * 1000000)\n    while (document.getElementById(prefix))\n    return prefix\n  }\n\n  Tooltip.prototype.tip = function () {\n    return (this.$tip = this.$tip || $(this.options.template))\n  }\n\n  Tooltip.prototype.arrow = function () {\n    return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))\n  }\n\n  Tooltip.prototype.enable = function () {\n    this.enabled = true\n  }\n\n  Tooltip.prototype.disable = function () {\n    this.enabled = false\n  }\n\n  Tooltip.prototype.toggleEnabled = function () {\n    this.enabled = !this.enabled\n  }\n\n  Tooltip.prototype.toggle = function (e) {\n    var self = this\n    if (e) {\n      self = $(e.currentTarget).data('bs.' + this.type)\n      if (!self) {\n        self = new this.constructor(e.currentTarget, this.getDelegateOptions())\n        $(e.currentTarget).data('bs.' + this.type, self)\n      }\n    }\n\n    self.tip().hasClass('in') ? self.leave(self) : self.enter(self)\n  }\n\n  Tooltip.prototype.destroy = function () {\n    var that = this\n    clearTimeout(this.timeout)\n    this.hide(function () {\n      that.$element.off('.' + that.type).removeData('bs.' + that.type)\n    })\n  }\n\n\n  // TOOLTIP PLUGIN DEFINITION\n  // =========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this    = $(this)\n      var data     = $this.data('bs.tooltip')\n      var options  = typeof option == 'object' && option\n      var selector = options && options.selector\n\n      if (!data && option == 'destroy') return\n      if (selector) {\n        if (!data) $this.data('bs.tooltip', (data = {}))\n        if (!data[selector]) data[selector] = new Tooltip(this, options)\n      } else {\n        if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))\n      }\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.tooltip\n\n  $.fn.tooltip             = Plugin\n  $.fn.tooltip.Constructor = Tooltip\n\n\n  // TOOLTIP NO CONFLICT\n  // ===================\n\n  $.fn.tooltip.noConflict = function () {\n    $.fn.tooltip = old\n    return this\n  }\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: popover.js v3.3.1\n * http://getbootstrap.com/javascript/#popovers\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // POPOVER PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Popover = function (element, options) {\n    this.init('popover', element, options)\n  }\n\n  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')\n\n  Popover.VERSION  = '3.3.1'\n\n  Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {\n    placement: 'right',\n    trigger: 'click',\n    content: '',\n    template: '<div class=\"popover\" role=\"tooltip\"><div class=\"arrow\"></div><h3 class=\"popover-title\"></h3><div class=\"popover-content\"></div></div>'\n  })\n\n\n  // NOTE: POPOVER EXTENDS tooltip.js\n  // ================================\n\n  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)\n\n  Popover.prototype.constructor = Popover\n\n  Popover.prototype.getDefaults = function () {\n    return Popover.DEFAULTS\n  }\n\n  Popover.prototype.setContent = function () {\n    var $tip    = this.tip()\n    var title   = this.getTitle()\n    var content = this.getContent()\n\n    $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)\n    $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events\n      this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'\n    ](content)\n\n    $tip.removeClass('fade top bottom left right in')\n\n    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do\n    // this manually by checking the contents.\n    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()\n  }\n\n  Popover.prototype.hasContent = function () {\n    return this.getTitle() || this.getContent()\n  }\n\n  Popover.prototype.getContent = function () {\n    var $e = this.$element\n    var o  = this.options\n\n    return $e.attr('data-content')\n      || (typeof o.content == 'function' ?\n            o.content.call($e[0]) :\n            o.content)\n  }\n\n  Popover.prototype.arrow = function () {\n    return (this.$arrow = this.$arrow || this.tip().find('.arrow'))\n  }\n\n  Popover.prototype.tip = function () {\n    if (!this.$tip) this.$tip = $(this.options.template)\n    return this.$tip\n  }\n\n\n  // POPOVER PLUGIN DEFINITION\n  // =========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this    = $(this)\n      var data     = $this.data('bs.popover')\n      var options  = typeof option == 'object' && option\n      var selector = options && options.selector\n\n      if (!data && option == 'destroy') return\n      if (selector) {\n        if (!data) $this.data('bs.popover', (data = {}))\n        if (!data[selector]) data[selector] = new Popover(this, options)\n      } else {\n        if (!data) $this.data('bs.popover', (data = new Popover(this, options)))\n      }\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.popover\n\n  $.fn.popover             = Plugin\n  $.fn.popover.Constructor = Popover\n\n\n  // POPOVER NO CONFLICT\n  // ===================\n\n  $.fn.popover.noConflict = function () {\n    $.fn.popover = old\n    return this\n  }\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: scrollspy.js v3.3.1\n * http://getbootstrap.com/javascript/#scrollspy\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // SCROLLSPY CLASS DEFINITION\n  // ==========================\n\n  function ScrollSpy(element, options) {\n    var process  = $.proxy(this.process, this)\n\n    this.$body          = $('body')\n    this.$scrollElement = $(element).is('body') ? $(window) : $(element)\n    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)\n    this.selector       = (this.options.target || '') + ' .nav li > a'\n    this.offsets        = []\n    this.targets        = []\n    this.activeTarget   = null\n    this.scrollHeight   = 0\n\n    this.$scrollElement.on('scroll.bs.scrollspy', process)\n    this.refresh()\n    this.process()\n  }\n\n  ScrollSpy.VERSION  = '3.3.1'\n\n  ScrollSpy.DEFAULTS = {\n    offset: 10\n  }\n\n  ScrollSpy.prototype.getScrollHeight = function () {\n    return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)\n  }\n\n  ScrollSpy.prototype.refresh = function () {\n    var offsetMethod = 'offset'\n    var offsetBase   = 0\n\n    if (!$.isWindow(this.$scrollElement[0])) {\n      offsetMethod = 'position'\n      offsetBase   = this.$scrollElement.scrollTop()\n    }\n\n    this.offsets = []\n    this.targets = []\n    this.scrollHeight = this.getScrollHeight()\n\n    var self     = this\n\n    this.$body\n      .find(this.selector)\n      .map(function () {\n        var $el   = $(this)\n        var href  = $el.data('target') || $el.attr('href')\n        var $href = /^#./.test(href) && $(href)\n\n        return ($href\n          && $href.length\n          && $href.is(':visible')\n          && [[$href[offsetMethod]().top + offsetBase, href]]) || null\n      })\n      .sort(function (a, b) { return a[0] - b[0] })\n      .each(function () {\n        self.offsets.push(this[0])\n        self.targets.push(this[1])\n      })\n  }\n\n  ScrollSpy.prototype.process = function () {\n    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset\n    var scrollHeight = this.getScrollHeight()\n    var maxScroll    = this.options.offset + scrollHeight - this.$scrollElement.height()\n    var offsets      = this.offsets\n    var targets      = this.targets\n    var activeTarget = this.activeTarget\n    var i\n\n    if (this.scrollHeight != scrollHeight) {\n      this.refresh()\n    }\n\n    if (scrollTop >= maxScroll) {\n      return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)\n    }\n\n    if (activeTarget && scrollTop < offsets[0]) {\n      this.activeTarget = null\n      return this.clear()\n    }\n\n    for (i = offsets.length; i--;) {\n      activeTarget != targets[i]\n        && scrollTop >= offsets[i]\n        && (!offsets[i + 1] || scrollTop <= offsets[i + 1])\n        && this.activate(targets[i])\n    }\n  }\n\n  ScrollSpy.prototype.activate = function (target) {\n    this.activeTarget = target\n\n    this.clear()\n\n    var selector = this.selector +\n        '[data-target=\"' + target + '\"],' +\n        this.selector + '[href=\"' + target + '\"]'\n\n    var active = $(selector)\n      .parents('li')\n      .addClass('active')\n\n    if (active.parent('.dropdown-menu').length) {\n      active = active\n        .closest('li.dropdown')\n        .addClass('active')\n    }\n\n    active.trigger('activate.bs.scrollspy')\n  }\n\n  ScrollSpy.prototype.clear = function () {\n    $(this.selector)\n      .parentsUntil(this.options.target, '.active')\n      .removeClass('active')\n  }\n\n\n  // SCROLLSPY PLUGIN DEFINITION\n  // ===========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.scrollspy')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.scrollspy\n\n  $.fn.scrollspy             = Plugin\n  $.fn.scrollspy.Constructor = ScrollSpy\n\n\n  // SCROLLSPY NO CONFLICT\n  // =====================\n\n  $.fn.scrollspy.noConflict = function () {\n    $.fn.scrollspy = old\n    return this\n  }\n\n\n  // SCROLLSPY DATA-API\n  // ==================\n\n  $(window).on('load.bs.scrollspy.data-api', function () {\n    $('[data-spy=\"scroll\"]').each(function () {\n      var $spy = $(this)\n      Plugin.call($spy, $spy.data())\n    })\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: tab.js v3.3.1\n * http://getbootstrap.com/javascript/#tabs\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // TAB CLASS DEFINITION\n  // ====================\n\n  var Tab = function (element) {\n    this.element = $(element)\n  }\n\n  Tab.VERSION = '3.3.1'\n\n  Tab.TRANSITION_DURATION = 150\n\n  Tab.prototype.show = function () {\n    var $this    = this.element\n    var $ul      = $this.closest('ul:not(.dropdown-menu)')\n    var selector = $this.data('target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    if ($this.parent('li').hasClass('active')) return\n\n    var $previous = $ul.find('.active:last a')\n    var hideEvent = $.Event('hide.bs.tab', {\n      relatedTarget: $this[0]\n    })\n    var showEvent = $.Event('show.bs.tab', {\n      relatedTarget: $previous[0]\n    })\n\n    $previous.trigger(hideEvent)\n    $this.trigger(showEvent)\n\n    if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return\n\n    var $target = $(selector)\n\n    this.activate($this.closest('li'), $ul)\n    this.activate($target, $target.parent(), function () {\n      $previous.trigger({\n        type: 'hidden.bs.tab',\n        relatedTarget: $this[0]\n      })\n      $this.trigger({\n        type: 'shown.bs.tab',\n        relatedTarget: $previous[0]\n      })\n    })\n  }\n\n  Tab.prototype.activate = function (element, container, callback) {\n    var $active    = container.find('> .active')\n    var transition = callback\n      && $.support.transition\n      && (($active.length && $active.hasClass('fade')) || !!container.find('> .fade').length)\n\n    function next() {\n      $active\n        .removeClass('active')\n        .find('> .dropdown-menu > .active')\n          .removeClass('active')\n        .end()\n        .find('[data-toggle=\"tab\"]')\n          .attr('aria-expanded', false)\n\n      element\n        .addClass('active')\n        .find('[data-toggle=\"tab\"]')\n          .attr('aria-expanded', true)\n\n      if (transition) {\n        element[0].offsetWidth // reflow for transition\n        element.addClass('in')\n      } else {\n        element.removeClass('fade')\n      }\n\n      if (element.parent('.dropdown-menu')) {\n        element\n          .closest('li.dropdown')\n            .addClass('active')\n          .end()\n          .find('[data-toggle=\"tab\"]')\n            .attr('aria-expanded', true)\n      }\n\n      callback && callback()\n    }\n\n    $active.length && transition ?\n      $active\n        .one('bsTransitionEnd', next)\n        .emulateTransitionEnd(Tab.TRANSITION_DURATION) :\n      next()\n\n    $active.removeClass('in')\n  }\n\n\n  // TAB PLUGIN DEFINITION\n  // =====================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.tab')\n\n      if (!data) $this.data('bs.tab', (data = new Tab(this)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.tab\n\n  $.fn.tab             = Plugin\n  $.fn.tab.Constructor = Tab\n\n\n  // TAB NO CONFLICT\n  // ===============\n\n  $.fn.tab.noConflict = function () {\n    $.fn.tab = old\n    return this\n  }\n\n\n  // TAB DATA-API\n  // ============\n\n  var clickHandler = function (e) {\n    e.preventDefault()\n    Plugin.call($(this), 'show')\n  }\n\n  $(document)\n    .on('click.bs.tab.data-api', '[data-toggle=\"tab\"]', clickHandler)\n    .on('click.bs.tab.data-api', '[data-toggle=\"pill\"]', clickHandler)\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: affix.js v3.3.1\n * http://getbootstrap.com/javascript/#affix\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // AFFIX CLASS DEFINITION\n  // ======================\n\n  var Affix = function (element, options) {\n    this.options = $.extend({}, Affix.DEFAULTS, options)\n\n    this.$target = $(this.options.target)\n      .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))\n      .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))\n\n    this.$element     = $(element)\n    this.affixed      =\n    this.unpin        =\n    this.pinnedOffset = null\n\n    this.checkPosition()\n  }\n\n  Affix.VERSION  = '3.3.1'\n\n  Affix.RESET    = 'affix affix-top affix-bottom'\n\n  Affix.DEFAULTS = {\n    offset: 0,\n    target: window\n  }\n\n  Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {\n    var scrollTop    = this.$target.scrollTop()\n    var position     = this.$element.offset()\n    var targetHeight = this.$target.height()\n\n    if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false\n\n    if (this.affixed == 'bottom') {\n      if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'\n      return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'\n    }\n\n    var initializing   = this.affixed == null\n    var colliderTop    = initializing ? scrollTop : position.top\n    var colliderHeight = initializing ? targetHeight : height\n\n    if (offsetTop != null && colliderTop <= offsetTop) return 'top'\n    if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'\n\n    return false\n  }\n\n  Affix.prototype.getPinnedOffset = function () {\n    if (this.pinnedOffset) return this.pinnedOffset\n    this.$element.removeClass(Affix.RESET).addClass('affix')\n    var scrollTop = this.$target.scrollTop()\n    var position  = this.$element.offset()\n    return (this.pinnedOffset = position.top - scrollTop)\n  }\n\n  Affix.prototype.checkPositionWithEventLoop = function () {\n    setTimeout($.proxy(this.checkPosition, this), 1)\n  }\n\n  Affix.prototype.checkPosition = function () {\n    if (!this.$element.is(':visible')) return\n\n    var height       = this.$element.height()\n    var offset       = this.options.offset\n    var offsetTop    = offset.top\n    var offsetBottom = offset.bottom\n    var scrollHeight = $('body').height()\n\n    if (typeof offset != 'object')         offsetBottom = offsetTop = offset\n    if (typeof offsetTop == 'function')    offsetTop    = offset.top(this.$element)\n    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)\n\n    var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)\n\n    if (this.affixed != affix) {\n      if (this.unpin != null) this.$element.css('top', '')\n\n      var affixType = 'affix' + (affix ? '-' + affix : '')\n      var e         = $.Event(affixType + '.bs.affix')\n\n      this.$element.trigger(e)\n\n      if (e.isDefaultPrevented()) return\n\n      this.affixed = affix\n      this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null\n\n      this.$element\n        .removeClass(Affix.RESET)\n        .addClass(affixType)\n        .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')\n    }\n\n    if (affix == 'bottom') {\n      this.$element.offset({\n        top: scrollHeight - height - offsetBottom\n      })\n    }\n  }\n\n\n  // AFFIX PLUGIN DEFINITION\n  // =======================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.affix')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.affix\n\n  $.fn.affix             = Plugin\n  $.fn.affix.Constructor = Affix\n\n\n  // AFFIX NO CONFLICT\n  // =================\n\n  $.fn.affix.noConflict = function () {\n    $.fn.affix = old\n    return this\n  }\n\n\n  // AFFIX DATA-API\n  // ==============\n\n  $(window).on('load', function () {\n    $('[data-spy=\"affix\"]').each(function () {\n      var $spy = $(this)\n      var data = $spy.data()\n\n      data.offset = data.offset || {}\n\n      if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom\n      if (data.offsetTop    != null) data.offset.top    = data.offsetTop\n\n      Plugin.call($spy, data)\n    })\n  })\n\n}(jQuery);\n"
  },
  {
    "path": "examples/myCoolProject/dist/js/npm.js",
    "content": "// This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment.\nrequire('../../js/transition.js')\nrequire('../../js/alert.js')\nrequire('../../js/button.js')\nrequire('../../js/carousel.js')\nrequire('../../js/collapse.js')\nrequire('../../js/dropdown.js')\nrequire('../../js/modal.js')\nrequire('../../js/tooltip.js')\nrequire('../../js/popover.js')\nrequire('../../js/scrollspy.js')\nrequire('../../js/tab.js')\nrequire('../../js/affix.js')"
  },
  {
    "path": "examples/myCoolProject/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"description\" content=\"\">\n    <meta name=\"author\" content=\"\">\n    <!-- <link rel=\"icon\" href=\"../../favicon.ico\"> -->\n\n    <title>Jumbotron Template for Bootstrap</title>\n\n    <!-- Bootstrap core CSS -->\n    <link href=\"dist/css/bootstrap.min.css\" rel=\"stylesheet\">\n<script type=\"text/javascript\">setTimeout(function(){console.log('_READY')},1000)</script>\n    <style type=\"text/css\">\n      body {\n        padding-top: 50px;\n        padding-bottom: 20px;\n      }\n\n/*\n      .col-md-4 {\n        width: 100% !important;\n      }\n*/\n    </style>\n  </head>\n\n  <body>\n\n    <nav class=\"navbar navbar-inverse navbar-fixed-top\" role=\"navigation\">\n      <div class=\"container\">\n        <div class=\"navbar-header\">\n          <button type=\"button\" class=\"navbar-toggle collapsed\" data-toggle=\"collapse\" data-target=\"#navbar\" aria-expanded=\"false\" aria-controls=\"navbar\">\n            <span class=\"sr-only\">Toggle navigation</span>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n          </button>\n          <a class=\"navbar-brand\" href=\"#\">Project name</a>\n        </div>\n        <div id=\"navbar\" class=\"navbar-collapse collapse\">\n          <form class=\"navbar-form navbar-right\" role=\"form\">\n            <div class=\"form-group\">\n              <input type=\"text\" placeholder=\"Email\" class=\"form-control\">\n            </div>\n            <div class=\"form-group\">\n              <input type=\"password\" placeholder=\"Password\" class=\"form-control\">\n            </div>\n            <button type=\"submit\" class=\"btn btn-success\">Sign in</button>\n          </form>\n        </div><!--/.navbar-collapse -->\n      </div>\n    </nav>\n\n    <!-- Main jumbotron for a primary marketing message or call to action -->\n    <div class=\"jumbotron\">\n      <div class=\"container\">\n        <h1>Hello, world!</h1>\n        <p>This is a template for a simple marketing or informational website. It includes a large callout called a jumbotron and three supporting pieces of content. Use it as a starting point to create something more unique.</p>\n        <p><a class=\"btn btn-primary btn-lg\" href=\"#\" role=\"button\">Learn more &raquo;</a></p>\n      </div>\n    </div>\n\n    <div class=\"container\">\n      <!-- Example row of columns -->\n      <div class=\"row\">\n        <div class=\"col-md-4\">\n          <h2>Heading</h2>\n          <p>Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui. </p>\n          <p><a class=\"btn btn-default\" href=\"#\" role=\"button\">View details &raquo;</a></p>\n        </div>\n        <div class=\"col-md-4\">\n          <h2>Heading</h2>\n          <p>Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui. </p>\n          <p><a class=\"btn btn-default\" href=\"#\" role=\"button\">View details &raquo;</a></p>\n       </div>\n        <div class=\"col-md-4\">\n          <h2>Heading</h2>\n          <p>Donec sed odio dui. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Vestibulum id ligula porta felis euismod semper. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.</p>\n          <p><a class=\"btn btn-default\" href=\"#\" role=\"button\">View details &raquo;</a></p>\n        </div>\n      </div>\n\n      <hr>\n\n      <footer>\n        <p>&copy; Company 2014</p>\n      </footer>\n    </div> <!-- /container -->\n\n\n    <!-- Bootstrap core JavaScript\n    ================================================== -->\n    <!-- Placed at the end of the document so the pages load faster -->\n    <!-- <script src=\"https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js\"></script>\n    <script src=\"dist/js/bootstrap.min.js\"></script> -->\n    <!-- IE10 viewport hack for Surface/desktop Windows 8 bug\n    <script src=\"../../assets/js/ie10-viewport-bug-workaround.js\"></script> -->\n  </body>\n</html>\n"
  },
  {
    "path": "examples/myCoolProject/readme.md",
    "content": "\n### My Cool Project\n\ndo `backstop init`  then replace scenario with...\n\n```\n    {\n      \"label\": \"My Homepage\",\n      \"url\": \"index.html\",\n      \"hideSelectors\": [],\n      \"removeSelectors\": [],\n      \"selectors\": [\n        \"nav\",\n        \".jumbotron\",\n        \"body .col-md-4:nth-of-type(1)\",\n        \"body .col-md-4:nth-of-type(2)\",\n        \"body .col-md-4:nth-of-type(3)\",\n        \"footer\"\n      ],\n      \"readyEvent\": null,\n      \"delay\": 500,\n      \"misMatchThreshold\" : 0.1,\n      \"onBeforeScript\": \"onBefore.js\",\n      \"onReadyScript\": \"onReady.js\"\n    }\n\n```\n\n\n"
  },
  {
    "path": "examples/nodeIntegration/backstop.config.js",
    "content": "module.exports = options => {\n  return {\n    id: `${options.project}_test`,\n    viewports: [\n      {\n        name: 'tablet',\n        width: 1024,\n        height: 768\n      }\n    ],\n    scenarios: options.scenarios,\n    paths: {\n      bitmaps_reference: `backstop_data/${options.project}/bitmaps_reference`,\n      bitmaps_test: `backstop_data/${options.project}/bitmaps_test`,\n      html_report: `backstop_data/${options.project}/html_report`,\n      ci_report: `backstop_data/${options.project}/ci_report`\n    },\n    report: ['browser', 'CI'],\n    debug: false\n  };\n};\n"
  },
  {
    "path": "examples/nodeIntegration/backstop.js",
    "content": "const _ = require('lodash');\nconst fs = require('fs');\nconst args = require('yargs').argv;\nconst projectPath = `public/${args.p}`;\nconst backstop = require('backstopjs');\n\nconst filesToIgnore = {\n  'first-project': [\n    'ignore-me.html'\n  ],\n  'second-project': [\n    'ignore-me.html'\n  ],\n  'third-project': [\n    'ignore-me.html'\n  ]\n};\n\nconst projectConfig = require('./backstop.config.js')({\n  'project': args.p,\n  'scenarios': getScenariosForProject(projectPath)\n});\n\nlet commandToRun = '';\n\nif (args.reference) {\n  commandToRun = 'reference';\n}\n\nif (args.test) {\n  commandToRun = 'test';\n}\n\nif (args.openReport) {\n  commandToRun = 'openReport';\n}\n\nif (commandToRun !== '') {\n  backstop(commandToRun, { config: projectConfig });\n}\n\nfunction getScenariosForProject (projectPath) {\n  const files = fs.readdirSync(projectPath);\n\n  let scenarios;\n\n  _.remove(files, isFileToIgnore);\n\n  scenarios = files.map(file => {\n    const scenarioLabel = file.split('.')[0].split('-').join(' ');\n\n    return {\n      'label': scenarioLabel,\n      'url': `http://localhost:8000/${projectPath}/${file}`,\n      'delay': 500,\n      'misMatchThreshold': 0.1\n    };\n  });\n\n  return scenarios;\n}\n\nfunction isFileToIgnore (file) {\n  let shouldBeRemoved = false;\n\n  // make sure we only have html files\n  if (file.indexOf('.html') === -1) {\n    shouldBeRemoved = true;\n  }\n\n  // exclude files by name\n  if (filesToIgnore[args.p] && filesToIgnore[args.p].indexOf(file) > -1) {\n    shouldBeRemoved = true;\n  }\n\n  return shouldBeRemoved;\n}\n"
  },
  {
    "path": "examples/nodeIntegration/package.json",
    "content": "{\n  \"name\": \"node-integration\",\n  \"version\": \"1.0.0\",\n  \"description\": \"A simple example of using BackstopJS with NodeJS and passing the config some parameters\",\n  \"main\": \"backstop.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"keywords\": [\n    \"backstopjs\",\n    \"regression testing\"\n  ],\n  \"author\": \"Alex Bondarev\",\n  \"license\": \"ISC\",\n  \"devDependencies\": {\n    \"backstopjs\": \"^2.3.7\",\n    \"koa\": \"^1.2.4\",\n    \"koa-serve\": \"^0.1.7\",\n    \"lodash\": \"^4.17.4\",\n    \"yargs\": \"^6.6.0\"\n  }\n}\n"
  },
  {
    "path": "examples/nodeIntegration/public/first-project/about-us.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\"\n          content=\"width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n    <title>First project - About Us</title>\n</head>\n<body>\n<h1>My first project</h1>\n<h2>About us</h2>\n<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Alias aliquid, aspernatur assumenda autem deserunt dignissimos eligendi et expedita impedit laudantium maxime modi nemo neque obcaecati quis quo soluta sunt voluptatem.</p>\n</body>\n</html>"
  },
  {
    "path": "examples/nodeIntegration/public/first-project/homepage.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\"\n          content=\"width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n    <title>First project - homepage</title>\n</head>\n<body>\n<h1>My first project</h1>\n<h2>Homepage</h2>\n<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Alias aliquid, aspernatur assumenda autem deserunt dignissimos eligendi et expedita impedit laudantium maxime modi nemo neque obcaecati quis quo soluta sunt voluptatem.</p>\n<h2>Heading</h2>\n<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Incidunt, labore, voluptate! Consequatur dolores ducimus error est et fugit ipsam, odit omnis placeat quam sit temporibus ut. Commodi dolores eos possimus?</p>\n</body>\n</html>"
  },
  {
    "path": "examples/nodeIntegration/public/first-project/ignore-me.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\"\n          content=\"width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n    <title>This page should not be tested</title>\n</head>\n<body>\n<h1>Do not test me</h1>\n</body>\n</html>"
  },
  {
    "path": "examples/nodeIntegration/public/second-project/contact-us.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\"\n          content=\"width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n    <title>Second project - Contact Us</title>\n</head>\n<body>\n<h1>My second project</h1>\n<h2>Contact us</h2>\n<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Alias aliquid, aspernatur assumenda autem deserunt dignissimos eligendi et expedita impedit laudantium maxime modi nemo neque obcaecati quis quo soluta sunt voluptatem.</p>\n</body>\n</html>"
  },
  {
    "path": "examples/nodeIntegration/public/second-project/dummy.json",
    "content": "{\n    \"foo\": \"bar\"\n}"
  },
  {
    "path": "examples/nodeIntegration/public/second-project/ignore-me.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\"\n          content=\"width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n    <title>This page should not be tested</title>\n</head>\n<body>\n<h1>Do not test me</h1>\n</body>\n</html>"
  },
  {
    "path": "examples/nodeIntegration/public/second-project/index.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\"\n          content=\"width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n    <title>Second project - index page</title>\n</head>\n<body>\n<h1>My second project</h1>\n<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Alias aliquid, aspernatur assumenda autem deserunt dignissimos eligendi et expedita impedit laudantium maxime modi nemo neque obcaecati quis quo soluta sunt voluptatem.</p>\n<h2>Heading</h2>\n<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Incidunt, labore, voluptate! Consequatur dolores ducimus error est et fugit ipsam, odit omnis placeat quam sit temporibus ut. Commodi dolores eos possimus?</p>\n</body>\n</html>"
  },
  {
    "path": "examples/nodeIntegration/public/third-project/ignore-me.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\"\n          content=\"width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n    <title>This page should not be tested</title>\n</head>\n<body>\n<h1>Do not test me</h1>\n</body>\n</html>"
  },
  {
    "path": "examples/nodeIntegration/public/third-project/terms-of-use.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\"\n          content=\"width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n    <title>Third project - Terms Of Use page</title>\n</head>\n<body>\n<h1>My third project</h1>\n<h2>Terms of use</h2>\n<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Alias aliquid, aspernatur assumenda autem deserunt dignissimos eligendi et expedita impedit laudantium maxime modi nemo neque obcaecati quis quo soluta sunt voluptatem.</p>\n<h2>Heading</h2>\n<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Incidunt, labore, voluptate! Consequatur dolores ducimus error est et fugit ipsam, odit omnis placeat quam sit temporibus ut. Commodi dolores eos possimus?</p>\n</body>\n</html>"
  },
  {
    "path": "examples/nodeIntegration/readme.md",
    "content": "# NodeJS example\n\nWe have 3 separate projects in the `public` folder: `first-project`, `second-project` and `third-project`. They all have the same structure and for the sake of easiness, they are extremely simple.\n\nOur job is to ask BackstopJS to test all (or some) of the files in any project we want using the same config file and generate the `scenarios` on-the-fly.\n\n## Prerequisites\n1. `cd path/to/examples/nodeIntegration`\n2. `npm install`\n3. `node server.js`\n4. Verify that the page loads by browsing `http://localhost:8000/public/second-project/`. If it doesn't load for you, please debug :)\n\n## Importing a config file and passing it some parameters\n\nMake sure you have done the Prerequisites part above and you have Koa serving the `public` folder.\n\nThen in a new console window `cd` into `nodeIntegration` and run\n\n```\nnode backstop.js --reference -p second-project\n```\n\nThis will generate the reference files for the `second-project` under the `backstop_data/second-project` folder for you.\n\nRun\n\n```\nnode backstop.js --test -p second-project\n```\n\nto test. It should pass :)\n\nUse `--reference`, `--test` and `--openReport` to specify which BackstopJS command you need to run. Use `-p` to specify the project folder you'd like to test.\n\nThus we are able to use _one_ config for _all_ the projects that need the same config. You can test this by changing the `-p` parameter.\n\n##### NB\nProject root folders sometimes contain files that should not be tested (e.g. `package.json`), or other files we'd like not to test. Since we generate the scenarios automatically using `fs.readdirSync`, we'll need to filter the results.\n\nPlease take a look at the `filesToIgnore` constant in the `backstop.js` file where we specify the files to ignore and the `isFileToIgnore` function that does the filtering. In this example I use `lodash` to get the needed result.\n\nThis is why when you test the `second-project`, you get only 2 tests, the `ignore-me.html` and `dummy.json` files are ignored.\n"
  },
  {
    "path": "examples/nodeIntegration/server.js",
    "content": "const koa = require('koa');\nconst serve = require('koa-serve');\n\nconst app = koa();\n\napp.use(serve('public'));\n\napp.listen(8000, () => {\n  console.log('Koa is listening at localhost:8000');\n});\n"
  },
  {
    "path": "examples/responsiveDemo/backstop.json",
    "content": "{\n  \"id\": \"responsiveDemoPage\",\n  \"viewports\": [\n    {\n      \"label\": \"phone\",\n      \"width\": 320,\n      \"height\": 480\n    },\n    {\n      \"label\": \"tablet\",\n      \"width\": 1024,\n      \"height\": 768\n    }\n  ],\n  \"onBeforeScript\": \"puppet/onBefore.js\",\n  \"onReadyScript\": \"puppet/onReady.js\",\n  \"scenarios\": [\n    {\n      \"label\": \"comparePage\",\n      \"cookiePath\": \"backstop_data/engine_scripts/cookies.json\",\n      \"url\": \"http://127.0.0.1:3000/\",\n      \"referenceUrl\": \"\",\n      \"readyEvent\": \"\",\n      \"readySelector\": \"\",\n      \"delay\": 100,\n      \"hideSelectors\": [],\n      \"removeSelectors\": [],\n      \"hoverSelector\": \"\",\n      \"clickSelector\": \"\",\n      \"postInteractionWait\": 0,\n      \"selectors\": [],\n      \"selectorExpansion\": true,\n      \"expect\": 0,\n      \"misMatchThreshold\" : 0.1,\n      \"requireSameDimensions\": true\n    }\n  ],\n  \"paths\": {\n    \"bitmaps_reference\": \"backstop_data/bitmaps_reference\",\n    \"bitmaps_test\": \"backstop_data/bitmaps_test\",\n    \"engine_scripts\": \"backstop_data/engine_scripts\",\n    \"html_report\": \"backstop_data/html_report\",\n    \"ci_report\": \"backstop_data/ci_report\"\n  },\n  \"report\": [\"browser\"],\n  \"engine\": \"puppeteer\",\n  \"engineOptions\": {\n    \"args\": [\"--no-sandbox\"]\n  },\n  \"asyncCaptureLimit\": 5,\n  \"asyncCompareLimit\": 50,\n  \"debug\": false,\n  \"debugWindow\": false\n}\n"
  },
  {
    "path": "examples/responsiveDemo/backstop_data/engine_scripts/cookies.json",
    "content": "[\n  {\n    \"domain\": \".www.yourdomain.com\",\n    \"path\": \"/\",\n    \"name\": \"yourCookieName\",\n    \"value\": \"yourCookieValue\",\n    \"expirationDate\": 1798790400,\n    \"hostOnly\": false,\n    \"httpOnly\": false,\n    \"secure\": false,\n    \"session\": false,\n    \"sameSite\": \"no_restriction\"\n  }\n]\n"
  },
  {
    "path": "examples/responsiveDemo/backstop_data/engine_scripts/puppet/clickAndHoverHelper.js",
    "content": "module.exports = async (page, scenario) => {\n  const hoverSelector = scenario.hoverSelectors || scenario.hoverSelector;\n  const clickSelector = scenario.clickSelectors || scenario.clickSelector;\n  const scrollToSelector = scenario.scrollToSelector;\n  const postInteractionWait = scenario.postInteractionWait; // selector [str] | ms [int]\n\n  if (hoverSelector) {\n    for (const hoverSelectorIndex of [].concat(hoverSelector)) {\n      await page.waitForSelector(hoverSelectorIndex);\n      await page.hover(hoverSelectorIndex);\n    }\n  }\n\n  if (clickSelector) {\n    for (const clickSelectorIndex of [].concat(clickSelector)) {\n      await page.waitForSelector(clickSelectorIndex);\n      await page.click(clickSelectorIndex);\n    }\n  }\n\n  if (postInteractionWait) {\n    await new Promise(resolve => {\n      setTimeout(resolve, postInteractionWait);\n    });\n  }\n\n  if (scrollToSelector) {\n    await page.waitForSelector(scrollToSelector);\n    await page.evaluate(scrollToSelector => {\n      document.querySelector(scrollToSelector).scrollIntoView();\n    }, scrollToSelector);\n  }\n};\n"
  },
  {
    "path": "examples/responsiveDemo/backstop_data/engine_scripts/puppet/ignoreCSP.js",
    "content": "/**\n * IGNORE CSP HEADERS\n * Listen to all requests. If a request matches scenario.url\n * then fetch the request again manually, strip out CSP headers\n * and respond to the original request without CSP headers.\n * Allows `ignoreHTTPSErrors: true` BUT... requires `debugWindow: true`\n *\n * see https://github.com/GoogleChrome/puppeteer/issues/1229#issuecomment-380133332\n * this is the workaround until Page.setBypassCSP lands... https://github.com/GoogleChrome/puppeteer/pull/2324\n *\n * @param      {REQUEST}  request\n * @return     {VOID}\n *\n * Use this in an onBefore script E.G.\n  ```\n  module.exports = async function(page, scenario) {\n    require('./removeCSP')(page, scenario);\n  }\n  ```\n *\n */\n\nconst fetch = require('node-fetch');\nconst https = require('https');\nconst agent = new https.Agent({\n  rejectUnauthorized: false\n});\n\nmodule.exports = async function (page, scenario) {\n  const intercept = async (request, targetUrl) => {\n    const requestUrl = request.url();\n\n    // FIND TARGET URL REQUEST\n    if (requestUrl === targetUrl) {\n      const cookiesList = await page.cookies(requestUrl);\n      const cookies = cookiesList.map(cookie => `${cookie.name}=${cookie.value}`).join('; ');\n      const headers = Object.assign(request.headers(), { cookie: cookies });\n      const options = {\n        headers,\n        body: request.postData(),\n        method: request.method(),\n        follow: 20,\n        agent\n      };\n\n      const result = await fetch(requestUrl, options);\n\n      const buffer = await result.buffer();\n      const cleanedHeaders = result.headers._headers || {};\n      cleanedHeaders['content-security-policy'] = '';\n      await request.respond({\n        body: buffer,\n        headers: cleanedHeaders,\n        status: result.status\n      });\n    } else {\n      request.continue();\n    }\n  };\n\n  await page.setRequestInterception(true);\n  page.on('request', req => {\n    intercept(req, scenario.url);\n  });\n};\n"
  },
  {
    "path": "examples/responsiveDemo/backstop_data/engine_scripts/puppet/interceptImages.js",
    "content": "/**\n * INTERCEPT IMAGES\n * Listen to all requests. If a request matches IMAGE_URL_RE\n * then stub the image with data from IMAGE_STUB_URL\n *\n * Use this in an onBefore script E.G.\n  ```\n  module.exports = async function(page, scenario) {\n    require('./interceptImages')(page, scenario);\n  }\n  ```\n *\n */\n\nconst fs = require('fs');\nconst path = require('path');\n\nconst IMAGE_URL_RE = /\\.gif|\\.jpg|\\.png/i;\nconst IMAGE_STUB_URL = path.resolve(__dirname, '../../imageStub.jpg');\nconst IMAGE_DATA_BUFFER = fs.readFileSync(IMAGE_STUB_URL);\nconst HEADERS_STUB = {};\n\nmodule.exports = async function (page, scenario) {\n  const intercept = async (request, targetUrl) => {\n    if (IMAGE_URL_RE.test(request.url())) {\n      await request.respond({\n        body: IMAGE_DATA_BUFFER,\n        headers: HEADERS_STUB,\n        status: 200\n      });\n    } else {\n      request.continue();\n    }\n  };\n  await page.setRequestInterception(true);\n  page.on('request', intercept);\n};\n"
  },
  {
    "path": "examples/responsiveDemo/backstop_data/engine_scripts/puppet/loadCookies.js",
    "content": "const fs = require('fs');\n\nmodule.exports = async (page, scenario) => {\n  let cookies = [];\n  const cookiePath = scenario.cookiePath;\n\n  // READ COOKIES FROM FILE IF EXISTS\n  if (fs.existsSync(cookiePath)) {\n    cookies = JSON.parse(fs.readFileSync(cookiePath));\n  }\n\n  // MUNGE COOKIE DOMAIN\n  cookies = cookies.map(cookie => {\n    if (cookie.domain.startsWith('http://') || cookie.domain.startsWith('https://')) {\n      cookie.url = cookie.domain;\n    } else {\n      cookie.url = 'https://' + cookie.domain;\n    }\n    delete cookie.domain;\n    return cookie;\n  });\n\n  // SET COOKIES\n  const setCookies = async () => {\n    return Promise.all(\n      cookies.map(async (cookie) => {\n        await page.setCookie(cookie);\n      })\n    );\n  };\n  await setCookies();\n  console.log('Cookie state restored with:', JSON.stringify(cookies, null, 2));\n};\n"
  },
  {
    "path": "examples/responsiveDemo/backstop_data/engine_scripts/puppet/onBefore.js",
    "content": "module.exports = async (page, scenario, vp) => {\n  await require('./loadCookies')(page, scenario);\n};\n"
  },
  {
    "path": "examples/responsiveDemo/backstop_data/engine_scripts/puppet/onReady.js",
    "content": "module.exports = async (page, scenario, vp) => {\n  console.log('SCENARIO > ' + scenario.label);\n  await require('./clickAndHoverHelper')(page, scenario);\n\n  // add more ready handlers here...\n};\n"
  },
  {
    "path": "examples/responsiveDemo/index.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n    <meta name=\"description\" content=\"\">\n    <meta name=\"author\" content=\"\">\n    <link rel=\"icon\" href=\"favicon.ico\">\n\n    <title>Pricing example for BackstopJS</title>\n\n    <!-- Bootstrap core CSS -->\n    <link href=\"dist/css/bootstrap.min.css\" rel=\"stylesheet\">\n\n    <!-- Custom styles for this template -->\n    <link href=\"responsiveDemo.css\" rel=\"stylesheet\">\n\n    <style type=\"text/css\">\n      body .card {\n        /*line-height: 1.6;*/\n      }\n      .doNotRazz {\n        width: 100%;\n      }\n    </style>\n  </head>\n\n  <body>\n<!-- Modal -->\n<div class=\"modal fade\" id=\"exampleModalCenter\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"exampleModalCenterTitle\" aria-hidden=\"true\">\n  <div class=\"modal-dialog modal-dialog-centered\" role=\"document\">\n    <div class=\"modal-content\">\n      <div class=\"modal-header\">\n        <h5 class=\"modal-title\" id=\"exampleModalLongTitle\">Modal title</h5>\n        <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\">\n          <span aria-hidden=\"true\">&times;</span>\n        </button>\n      </div>\n      <div class=\"modal-body\">\n        <img class=\"doNotRazz\" src=\"./do_not_razz_the_lemur.png\">\n      </div>\n      <div class=\"modal-footer\">\n        <button type=\"button\" class=\"btn btn-secondary\" data-dismiss=\"modal\">Nope</button>\n        <button type=\"button\" class=\"btn btn-primary\"  data-dismiss=\"modal\">OK</button>\n      </div>\n    </div>\n  </div>\n</div>\n\n\n<!-- CONTENT -->\n    <div class=\"d-flex flex-column flex-md-row align-items-center p-3 px-md-4 mb-3 bg-white border-bottom box-shadow\">\n      <h5 class=\"my-0 mr-md-auto font-weight-normal\">BackstopJS</h5>\n      <nav class=\"my-2 my-md-0 mr-md-3\">\n        <a class=\"p-2 text-dark\" href=\"#\">Features</a>\n        <a class=\"p-2 text-dark\" href=\"#\">Enterprise</a>\n        <a class=\"p-2 text-dark\" href=\"#\">Support</a>\n        <a class=\"p-2 text-dark\" href=\"#\">Pricing</a>\n      </nav>\n      <!-- <a class=\"btn btn-outline-primary\" href=\"#\">Sign up</a> -->\n      <button type=\"button\" class=\"btn btn-primary\" data-toggle=\"modal\" data-target=\"#exampleModalCenter\">\n        Sign up\n      </button>\n    </div>\n\n    <div class=\"pricing-header px-3 py-3 pt-md-5 pb-md-4 mx-auto text-center\">\n      <h1 class=\"display-4\">BackstopJS Pricing</h1>\n      <p class=\"lead\">High quality automated visual regression testing for the unimaginably low price of $0/mo! Get with the leemur -- and <code>npm install backstopjs</code> today!</p>\n    </div>\n\n    <div class=\"container\">\n      <div class=\"card-deck mb-3 text-center\">\n        <div class=\"card mb-4 box-shadow\">\n          <div class=\"card-header\">\n            <h4 class=\"my-0 font-weight-normal\">Free</h4>\n          </div>\n          <div class=\"card-body\">\n            <h1 class=\"card-title pricing-card-title\">$0 <small class=\"text-muted\">/ mo</small></h1>\n            <ul class=\"list-unstyled mt-3 mb-4\">\n              <li>10 users included</li>\n              <li>Bring your own storage</li>\n              <li>Strong community support</li>\n            </ul>\n            <button type=\"button\" class=\"btn btn-lg btn-block btn-outline-primary\">Sign up for free</button>\n          </div>\n        </div>\n        <div class=\"card mb-4 box-shadow\">\n          <div class=\"card-header\">\n            <h4 class=\"my-0 font-weight-normal\">Still Free...</h4>\n          </div>\n          <div class=\"card-body\">\n            <h1 class=\"card-title pricing-card-title\">$0 <small class=\"text-muted\">/ mo</small></h1>\n            <ul class=\"list-unstyled mt-3 mb-4\">\n              <li>100 users included</li>\n              <li>Bring your own storage</li>\n              <li>Strong community support</li>\n            </ul>\n            <button type=\"button\" class=\"btn btn-lg btn-block btn-primary\">Get started</button>\n          </div>\n        </div>\n        <div class=\"card mb-4 box-shadow\">\n          <div class=\"card-header\">\n            <h4 class=\"my-0 font-weight-normal\">Crazy Free!</h4>\n          </div>\n          <div class=\"card-body\">\n            <h1 class=\"card-title pricing-card-title\">$0 <small class=\"text-muted\">/ mo</small></h1>\n            <ul class=\"list-unstyled mt-3 mb-4\">\n              <li>10,000 users included</li>\n              <li>Bring your own storage</li>\n              <li>Strong community support</li>\n            </ul>\n            <button type=\"button\" class=\"btn btn-lg btn-block btn-primary\">Contact us</button>\n          </div>\n        </div>\n      </div>\n\n      <footer class=\"pt-4 my-md-5 pt-md-5 border-top\">\n        <div class=\"row\">\n          <div class=\"col-12 col-md\">\n            <img class=\"mb-2\" src=\"https://getbootstrap.com/assets/brand/bootstrap-solid.svg\" alt=\"\" width=\"24\" height=\"24\">\n            <small class=\"d-block mb-3 text-muted\">&copy; 2017-2018</small>\n          </div>\n          <div class=\"col-6 col-md\">\n            <h5>Features</h5>\n            <ul class=\"list-unstyled text-small\">\n              <li><a class=\"text-muted\" href=\"#\">Cool stuff</a></li>\n              <li><a class=\"text-muted\" href=\"#\">Random feature</a></li>\n              <li><a class=\"text-muted\" href=\"#\">Team feature</a></li>\n              <li><a class=\"text-muted\" href=\"#\">Stuff for developers</a></li>\n              <li><a class=\"text-muted\" href=\"#\">Another one</a></li>\n              <li><a class=\"text-muted\" href=\"#\">Last time</a></li>\n            </ul>\n          </div>\n          <div class=\"col-6 col-md\">\n            <h5>Resources</h5>\n            <ul class=\"list-unstyled text-small\">\n              <li><a class=\"text-muted\" href=\"#\">Resource</a></li>\n              <li><a class=\"text-muted\" href=\"#\">Resource name</a></li>\n              <li><a class=\"text-muted\" href=\"#\">Another resource</a></li>\n              <li><a class=\"text-muted\" href=\"#\">Final resource</a></li>\n            </ul>\n          </div>\n          <div class=\"col-6 col-md\">\n            <h5>About</h5>\n            <ul class=\"list-unstyled text-small\">\n              <li><a class=\"text-muted\" href=\"#\">Team</a></li>\n              <li><a class=\"text-muted\" href=\"#\">Locations</a></li>\n              <li><a class=\"text-muted\" href=\"#\">Privacy</a></li>\n              <li><a class=\"text-muted\" href=\"#\">Terms</a></li>\n            </ul>\n          </div>\n        </div>\n      </footer>\n    </div>\n\n\n    <!-- Bootstrap core JavaScript\n    ================================================== -->\n    <!-- Placed at the end of the document so the pages load faster -->\n    <script src=\"https://code.jquery.com/jquery-3.2.1.slim.min.js\" integrity=\"sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN\" crossorigin=\"anonymous\"></script>\n    <script>window.jQuery || document.write('<script src=\"assets/js/vendor/jquery-slim.min.js\"><\\/script>')</script>\n    <script src=\"assets/js/vendor/popper.min.js\"></script>\n    <script src=\"dist/js/bootstrap.min.js\"></script>\n    <script src=\"assets/js/vendor/holder.min.js\"></script>\n    <script>\n      Holder.addTheme('thumb', {\n        bg: '#55595c',\n        fg: '#eceeef',\n        text: 'Thumbnail'\n      });\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "examples/responsiveDemo/package.json",
    "content": "{\n  \"name\": \"responsivedemo\",\n  \"version\": \"1.0.0\",\n  \"description\": \"\",\n  \"main\": \"index.html\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\",\n    \"serve\": \"node ./node_modules/super-simple-web-server/ ./\",\n    \"reference\": \"node ../../cli/index.js reference\"\n  },\n  \"author\": \"\",\n  \"license\": \"ISC\",\n  \"dependencies\": {\n    \"super-simple-web-server\": \"^1.0.0\"\n  }\n}\n"
  },
  {
    "path": "examples/responsiveDemo/readme.md",
    "content": "Start me with...\n\n```\nnpm run serve\n```\n\n...then you can see me here...\n\n[http://127.0.0.1:3000]()\n\nKeep on truckin!"
  },
  {
    "path": "examples/responsiveDemo/responsiveDemo.css",
    "content": "html {\n  font-size: 14px;\n}\n@media (min-width: 768px) {\n  html {\n    font-size: 16px;\n  }\n}\n\n.container {\n  max-width: 960px;\n}\n\n.pricing-header {\n  max-width: 700px;\n}\n\n.card-deck .card {\n  min-width: 220px;\n}\n\n.border-top { border-top: 1px solid #e5e5e5; }\n.border-bottom { border-bottom: 1px solid #e5e5e5; }\n\n.box-shadow { box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .05); }\n\ncode { background-color: #eeeeee; }\n"
  },
  {
    "path": "examples/simpleReactApp/assets/css/styles.css",
    "content": ".container {\n\tmax-width: 980px;\n\ttext-align: center;\n\tmargin: 20px auto;\n}\n\nh1 {\n\tmargin-bottom: 20px;\n  text-shadow: 0 0 1px rgba(120, 120, 120, 19);\n}\n\n#geocoding_form {\n\tmargin: 40px auto 60px;\n}\n\n#address {\n\tborder-radius: 3px;\n}\n\n.input-group {\n\tmargin-left: 4%;\n}\n\n.glyphicon {\n\tfont-size: 18px;\n\tz-index: 20;\n\tcursor: pointer;\n}\n\n.glyphicon-search{\n\tposition: relative;\n\tright: 30px;\n}\n\n.current-location {\n\tmargin-top: 30px;\n}\n\n#save-location {\n\tdisplay: inline;\n\tmargin: 10px auto;\n\tline-height: 1.4;\n}\n\n.current-location .glyphicon-star,\n.current-location .glyphicon-star-empty {\n\tdisplay: inline-block;\n\tmargin-left: 10px;\n\tfont-size: 22px;\n\tvertical-align: text-bottom;\n}\n\n.glyphicon-menu-right {\n\tposition: absolute;\n\ttop: 50%;\n\tright: 10px;\n\tmargin-top: -9px;\n}\n\n.map-holder {\n\tmax-width: 500px;\n\theight: 350px;\n\tmargin: 0 auto;\n\tbackground-color: #FCFCFC;\n\tposition: relative;\n\tborder-radius: 2px;\n}\n\n.map-holder p {\n\tposition: absolute;\n\twidth: 84px;\n\theight: 22px;\n\tleft: 50%;\n\ttop: 50%;\n\tmargin: -11px auto 0 -42px;\n\tfont-size: 20px;\n\tcolor: #969FA8;\n}\n\n#map {\n\tmax-width: 500px;\n\theight: 350px;\n\tmargin: 0 auto;\n}\n\n.list-group {\n\tpadding: 0 15px;\n\tmargin-top: 50px;\n}\n\n.list-group-item {\n\tposition: relative;\n\tpadding: 10px 20px;\n}\n\na.list-group-item {\n\tcursor: pointer;\n}\n\na.list-group-item:hover {\n\tbackground-color: #F7FBFF;\n}\n\na.active-location {\n\tbackground-color: #EEF6FF;\n}\n\na.active-location:hover {\n\tbackground-color: #EBF3FC;\n}\n\na.list-group-item span.createdAt {\n\tdisplay: block;\n\tcolor: #969FA8;\n\tz-index: -1;\n}\n"
  },
  {
    "path": "examples/simpleReactApp/backstop.json",
    "content": "{\n  \"viewports\": [\n    {\n      \"name\": \"phone\",\n      \"width\": 320,\n      \"height\": 480\n    },\n    {\n      \"name\": \"tablet_v\",\n      \"width\": 568,\n      \"height\": 1024\n    },\n    {\n      \"name\": \"tablet_h\",\n      \"width\": 1024,\n      \"height\": 768\n    }\n  ],\n  \"scenarios\": [\n    {\n      \"label\": \"My Homepage\",\n      \"url\": \"index.html\",\n      \"hideSelectors\": [],\n      \"removeSelectors\": [],\n      \"selectors\": [\n        \"#main\"\n      ],\n      \"readyEvent\": \"gmapResponded\",\n      \"delay\": 100,\n      \"misMatchThreshold\" : 0,\n      \"onBeforeScript\": \"onBefore.js\",\n      \"onReadyScript\": \"onReady.js\"\n    }\n  ],\n  \"paths\": {\n    \"bitmaps_reference\": \"backstop_data/bitmaps_reference\",\n    \"bitmaps_test\": \"backstop_data/bitmaps_test\",\n    \"html_report\": \"backstop_data/html_report\",\n    \"ci_report\": \"backstop_data/ci_report\"\n  },\n  \"report\": [\"browser\"],\n  \"resembleOutputOptions\": {\n    \"ignoreAntialiasing\": true,\n    \"usePreciseMatching\": true\n  },\n  \"debug\": false\n}\n"
  },
  {
    "path": "examples/simpleReactApp/compiled.js",
    "content": "(function e (t, n, r) { function s (o, u) { if (!n[o]) { if (!t[o]) { var a = typeof require === 'function' && require; if (!u && a) return a(o, !0); if (i) return i(o, !0); var f = new Error(\"Cannot find module '\" + o + \"'\"); throw f.code = 'MODULE_NOT_FOUND', f; } var l = n[o] = { exports: {} }; t[o][0].call(l.exports, function (e) { var n = t[o][1][e]; return s(n || e); }, l, l.exports, e, t, n, r); } return n[o].exports; } var i = typeof require === 'function' && require; for (var o = 0; o < r.length; o++)s(r[o]); return s; })({ 1: [function (require, module, exports) { var React = require('react'); var Search = require('./Search'); var Map = require('./Map'); var CurrentLocation = require('./CurrentLocation'); var LocationList = require('./LocationList'); var App = React.createClass({ displayName: 'App', getInitialState: function () { var favorites = []; if (localStorage.favorites) { favorites = JSON.parse(localStorage.favorites); } return { favorites: favorites, currentAddress: 'Paris, France', mapCoordinates: { lat: 48.856614, lng: 2.3522219 } }; }, toggleFavorite: function (address) { if (this.isAddressInFavorites(address)) { this.removeFromFavorites(address); } else { this.addToFavorites(address); } }, addToFavorites: function (address) { var favorites = this.state.favorites; favorites.push({ address: address, timestamp: Date.now() }); this.setState({ favorites: favorites }); localStorage.favorites = JSON.stringify(favorites); }, removeFromFavorites: function (address) { var favorites = this.state.favorites; var index = -1; for (var i = 0; i < favorites.length; i++) { if (favorites[i].address == address) { index = i; break; } } if (index !== -1) { favorites.splice(index, 1); this.setState({ favorites: favorites }); localStorage.favorites = JSON.stringify(favorites); } }, isAddressInFavorites: function (address) { var favorites = this.state.favorites; for (var i = 0; i < favorites.length; i++) { if (favorites[i].address == address) { return true; } } return false; }, searchForAddress: function (address) { var self = this; GMaps.geocode({ address: address, callback: function (results, status) { if (status !== 'OK') return; var latlng = results[0].geometry.location; self.setState({ currentAddress: results[0].formatted_address, mapCoordinates: { lat: latlng.lat(), lng: latlng.lng() } }); setTimeout(function () { console.log('gmapResponded'); }, 1e3); } }); }, componentDidMount: function () { var that = this; setTimeout(function () { that.searchForAddress('San Francisco'); }, 2e3); }, render: function () { return React.createElement('div', null, React.createElement('h1', null, 'Your Google Maps Locations'), React.createElement(Search, { onSearch: this.searchForAddress }), React.createElement(Map, { lat: this.state.mapCoordinates.lat, lng: this.state.mapCoordinates.lng }), React.createElement(CurrentLocation, { address: this.state.currentAddress, favorite: this.isAddressInFavorites(this.state.currentAddress), onFavoriteToggle: this.toggleFavorite }), React.createElement(LocationList, { locations: this.state.favorites, activeLocationAddress: this.state.currentAddress, onClick: this.searchForAddress })); } }); module.exports = App; }, { './CurrentLocation': 2, './LocationList': 4, './Map': 5, './Search': 6, react: 163 }],\n  2: [function (require, module, exports) { var React = require('react'); var CurrentLocation = React.createClass({ displayName: 'CurrentLocation', toggleFavorite: function () { this.props.onFavoriteToggle(this.props.address); }, render: function () { var starClassName = 'glyphicon glyphicon-star-empty'; if (this.props.favorite) { starClassName = 'glyphicon glyphicon-star'; } return React.createElement('div', { className: 'col-xs-12 col-md-6 col-md-offset-3 current-location' }, React.createElement('h4', { id: 'save-location' }, this.props.address), React.createElement('span', { className: starClassName, onClick: this.toggleFavorite, 'aria-hidden': 'true' })); } }); module.exports = CurrentLocation; }, { react: 163 }],\n  3: [function (require, module, exports) { var React = require('react'); var LocationItem = require('./LocationItem'); var moment = require('moment'); var LocationItem = React.createClass({ displayName: 'LocationItem', handleClick: function () { this.props.onClick(this.props.address); }, render: function () { var cn = 'list-group-item'; if (this.props.active) { cn += ' active-location'; } return React.createElement('a', { className: cn, onClick: this.handleClick }, this.props.address, React.createElement('span', { className: 'createdAt' }, moment(this.props.timestamp).fromNow()), React.createElement('span', { className: 'glyphicon glyphicon-menu-right' })); } }); module.exports = LocationItem; }, { './LocationItem': 3, moment: 8, react: 163 }],\n  4: [function (require, module, exports) { var React = require('react'); var LocationItem = require('./LocationItem'); var LocationList = React.createClass({ displayName: 'LocationList', render: function () { var self = this; var locations = this.props.locations.map(function (l) { var active = self.props.activeLocationAddress == l.address; return React.createElement(LocationItem, { address: l.address, timestamp: l.timestamp, active: active, onClick: self.props.onClick }); }); if (!locations.length) { return null; } return React.createElement('div', { className: 'list-group col-xs-12 col-md-6 col-md-offset-3' }, React.createElement('span', { className: 'list-group-item active' }, 'Saved Locations'), locations); } }); module.exports = LocationList; }, { './LocationItem': 3, react: 163 }],\n  5: [function (require, module, exports) { var React = require('react'); var Map = React.createClass({ displayName: 'Map', componentDidMount: function () { this.componentDidUpdate(); }, componentDidUpdate: function () { if (this.lastLat == this.props.lat && this.lastLng == this.props.lng) { return; } this.lastLat = this.props.lat; this.lastLng = this.props.lng; var map = new GMaps({ el: '#map', lat: this.props.lat, lng: this.props.lng }); map.addMarker({ lat: this.props.lat, lng: this.props.lng }); }, render: function () { return React.createElement('div', { className: 'map-holder' }, React.createElement('p', null, 'Loading...'), React.createElement('div', { id: 'map' })); } }); module.exports = Map; }, { react: 163 }],\n  6: [function (require, module, exports) { var React = require('react'); var Search = React.createClass({ displayName: 'Search', getInitialState: function () { return { value: '' }; }, handleChange: function (event) { this.setState({ value: event.target.value }); }, handleSubmit: function (event) { event.preventDefault(); this.props.onSearch(this.state.value); this.getDOMNode().querySelector('input').blur(); }, render: function () { return React.createElement('form', { id: 'geocoding_form', className: 'form-horizontal', onSubmit: this.handleSubmit }, React.createElement('div', { className: 'form-group' }, React.createElement('div', { className: 'col-xs-12 col-md-6 col-md-offset-3' }, React.createElement('div', { className: 'input-group' }, React.createElement('input', { type: 'text', className: 'form-control', id: 'address', placeholder: 'Find a location...', value: this.state.value, onChange: this.handleChange }), React.createElement('span', { className: 'input-group-btn' }, React.createElement('span', { className: 'glyphicon glyphicon-search', 'aria-hidden': 'true' })))))); } }); module.exports = Search; }, { react: 163 }],\n  7: [function (require, module, exports) { var React = require('react'); var App = require('./components/App'); React.render(React.createElement(App, null), document.getElementById('main')); }, { './components/App': 1, react: 163 }],\n  8: [function (require, module, exports) {\n    (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : global.moment = factory(); })(this, function () {\n      'use strict'; var hookCallback; function utils_hooks__hooks () { return hookCallback.apply(null, arguments); } function setHookCallback (callback) { hookCallback = callback; } function isArray (input) { return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]'; } function isObject (input) { return Object.prototype.toString.call(input) === '[object Object]'; } function isObjectEmpty (obj) { var k; for (k in obj) { return false; } return true; } function isDate (input) { return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]'; } function map (arr, fn) { var res = []; var i; for (i = 0; i < arr.length; ++i) { res.push(fn(arr[i], i)); } return res; } function hasOwnProp (a, b) { return Object.prototype.hasOwnProperty.call(a, b); } function extend (a, b) { for (var i in b) { if (hasOwnProp(b, i)) { a[i] = b[i]; } } if (hasOwnProp(b, 'toString')) { a.toString = b.toString; } if (hasOwnProp(b, 'valueOf')) { a.valueOf = b.valueOf; } return a; } function create_utc__createUTC (input, format, locale, strict) { return createLocalOrUTC(input, format, locale, strict, true).utc(); } function defaultParsingFlags () { return { empty: false, unusedTokens: [], unusedInput: [], overflow: -2, charsLeftOver: 0, nullInput: false, invalidMonth: null, invalidFormat: false, userInvalidated: false, iso: false, parsedDateParts: [], meridiem: null }; } function getParsingFlags (m) { if (m._pf == null) { m._pf = defaultParsingFlags(); } return m._pf; } var some; if (Array.prototype.some) { some = Array.prototype.some; } else { some = function (fun) { var t = Object(this); var len = t.length >>> 0; for (var i = 0; i < len; i++) { if (i in t && fun.call(this, t[i], i, t)) { return true; } } return false; }; } function valid__isValid (m) { if (m._isValid == null) { var flags = getParsingFlags(m); var parsedParts = some.call(flags.parsedDateParts, function (i) { return i != null; }); m._isValid = !isNaN(m._d.getTime()) && flags.overflow < 0 && !flags.empty && !flags.invalidMonth && !flags.invalidWeekday && !flags.nullInput && !flags.invalidFormat && !flags.userInvalidated && (!flags.meridiem || flags.meridiem && parsedParts); if (m._strict) { m._isValid = m._isValid && flags.charsLeftOver === 0 && flags.unusedTokens.length === 0 && flags.bigHour === undefined; } } return m._isValid; } function valid__createInvalid (flags) { var m = create_utc__createUTC(NaN); if (flags != null) { extend(getParsingFlags(m), flags); } else { getParsingFlags(m).userInvalidated = true; } return m; } function isUndefined (input) { return input === void 0; } var momentProperties = utils_hooks__hooks.momentProperties = []; function copyConfig (to, from) { var i, prop, val; if (!isUndefined(from._isAMomentObject)) { to._isAMomentObject = from._isAMomentObject; } if (!isUndefined(from._i)) { to._i = from._i; } if (!isUndefined(from._f)) { to._f = from._f; } if (!isUndefined(from._l)) { to._l = from._l; } if (!isUndefined(from._strict)) { to._strict = from._strict; } if (!isUndefined(from._tzm)) { to._tzm = from._tzm; } if (!isUndefined(from._isUTC)) { to._isUTC = from._isUTC; } if (!isUndefined(from._offset)) { to._offset = from._offset; } if (!isUndefined(from._pf)) { to._pf = getParsingFlags(from); } if (!isUndefined(from._locale)) { to._locale = from._locale; } if (momentProperties.length > 0) { for (i in momentProperties) { prop = momentProperties[i]; val = from[prop]; if (!isUndefined(val)) { to[prop] = val; } } } return to; } var updateInProgress = false; function Moment (config) { copyConfig(this, config); this._d = new Date(config._d != null ? config._d.getTime() : NaN); if (updateInProgress === false) { updateInProgress = true; utils_hooks__hooks.updateOffset(this); updateInProgress = false; } } function isMoment (obj) { return obj instanceof Moment || obj != null && obj._isAMomentObject != null; } function absFloor (number) { if (number < 0) { return Math.ceil(number) || 0; } else { return Math.floor(number); } } function toInt (argumentForCoercion) { var coercedNumber = +argumentForCoercion; var value = 0; if (coercedNumber !== 0 && isFinite(coercedNumber)) { value = absFloor(coercedNumber); } return value; } function compareArrays (array1, array2, dontConvert) { var len = Math.min(array1.length, array2.length); var lengthDiff = Math.abs(array1.length - array2.length); var diffs = 0; var i; for (i = 0; i < len; i++) { if (dontConvert && array1[i] !== array2[i] || !dontConvert && toInt(array1[i]) !== toInt(array2[i])) { diffs++; } } return diffs + lengthDiff; } function warn (msg) { if (utils_hooks__hooks.suppressDeprecationWarnings === false && typeof console !== 'undefined' && console.warn) { console.warn('Deprecation warning: ' + msg); } } function deprecate (msg, fn) { var firstTime = true; return extend(function () { if (utils_hooks__hooks.deprecationHandler != null) { utils_hooks__hooks.deprecationHandler(null, msg); } if (firstTime) { warn(msg + '\\nArguments: ' + Array.prototype.slice.call(arguments).join(', ') + '\\n' + (new Error()).stack); firstTime = false; } return fn.apply(this, arguments); }, fn); } var deprecations = {}; function deprecateSimple (name, msg) { if (utils_hooks__hooks.deprecationHandler != null) { utils_hooks__hooks.deprecationHandler(name, msg); } if (!deprecations[name]) { warn(msg); deprecations[name] = true; } }utils_hooks__hooks.suppressDeprecationWarnings = false; utils_hooks__hooks.deprecationHandler = null; function isFunction (input) { return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]'; } function locale_set__set (config) { var prop, i; for (i in config) { prop = config[i]; if (isFunction(prop)) { this[i] = prop; } else { this['_' + i] = prop; } } this._config = config; this._ordinalParseLenient = new RegExp(this._ordinalParse.source + '|' + /\\d{1,2}/.source); } function mergeConfigs (parentConfig, childConfig) { var res = extend({}, parentConfig); var prop; for (prop in childConfig) { if (hasOwnProp(childConfig, prop)) { if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) { res[prop] = {}; extend(res[prop], parentConfig[prop]); extend(res[prop], childConfig[prop]); } else if (childConfig[prop] != null) { res[prop] = childConfig[prop]; } else { delete res[prop]; } } } for (prop in parentConfig) { if (hasOwnProp(parentConfig, prop) && !hasOwnProp(childConfig, prop) && isObject(parentConfig[prop])) { res[prop] = extend({}, res[prop]); } } return res; } function Locale (config) { if (config != null) { this.set(config); } } var keys; if (Object.keys) { keys = Object.keys; } else { keys = function (obj) { var i; var res = []; for (i in obj) { if (hasOwnProp(obj, i)) { res.push(i); } } return res; }; } var defaultCalendar = { sameDay: '[Today at] LT', nextDay: '[Tomorrow at] LT', nextWeek: 'dddd [at] LT', lastDay: '[Yesterday at] LT', lastWeek: '[Last] dddd [at] LT', sameElse: 'L' }; function locale_calendar__calendar (key, mom, now) { var output = this._calendar[key] || this._calendar['sameElse']; return isFunction(output) ? output.call(mom, now) : output; } var defaultLongDateFormat = { LTS: 'h:mm:ss A', LT: 'h:mm A', L: 'MM/DD/YYYY', LL: 'MMMM D, YYYY', LLL: 'MMMM D, YYYY h:mm A', LLLL: 'dddd, MMMM D, YYYY h:mm A' }; function longDateFormat (key) { var format = this._longDateFormat[key]; var formatUpper = this._longDateFormat[key.toUpperCase()]; if (format || !formatUpper) { return format; } this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) { return val.slice(1); }); return this._longDateFormat[key]; } var defaultInvalidDate = 'Invalid date'; function invalidDate () { return this._invalidDate; } var defaultOrdinal = '%d'; var defaultOrdinalParse = /\\d{1,2}/; function ordinal (number) { return this._ordinal.replace('%d', number); } var defaultRelativeTime = { future: 'in %s', past: '%s ago', s: 'a few seconds', m: 'a minute', mm: '%d minutes', h: 'an hour', hh: '%d hours', d: 'a day', dd: '%d days', M: 'a month', MM: '%d months', y: 'a year', yy: '%d years' }; function relative__relativeTime (number, withoutSuffix, string, isFuture) { var output = this._relativeTime[string]; return isFunction(output) ? output(number, withoutSuffix, string, isFuture) : output.replace(/%d/i, number); } function pastFuture (diff, output) { var format = this._relativeTime[diff > 0 ? 'future' : 'past']; return isFunction(format) ? format(output) : format.replace(/%s/i, output); } var aliases = {}; function addUnitAlias (unit, shorthand) { var lowerCase = unit.toLowerCase(); aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit; } function normalizeUnits (units) { return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined; } function normalizeObjectUnits (inputObject) { var normalizedInput = {}; var normalizedProp; var prop; for (prop in inputObject) { if (hasOwnProp(inputObject, prop)) { normalizedProp = normalizeUnits(prop); if (normalizedProp) { normalizedInput[normalizedProp] = inputObject[prop]; } } } return normalizedInput; } var priorities = {}; function addUnitPriority (unit, priority) { priorities[unit] = priority; } function getPrioritizedUnits (unitsObj) { var units = []; for (var u in unitsObj) { units.push({ unit: u, priority: priorities[u] }); }units.sort(function (a, b) { return a.priority - b.priority; }); return units; } function makeGetSet (unit, keepTime) { return function (value) { if (value != null) { get_set__set(this, unit, value); utils_hooks__hooks.updateOffset(this, keepTime); return this; } else { return get_set__get(this, unit); } }; } function get_set__get (mom, unit) { return mom.isValid() ? mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN; } function get_set__set (mom, unit, value) { if (mom.isValid()) { mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); } } function stringGet (units) { units = normalizeUnits(units); if (isFunction(this[units])) { return this[units](); } return this; } function stringSet (units, value) { if (typeof units === 'object') { units = normalizeObjectUnits(units); var prioritized = getPrioritizedUnits(units); for (var i = 0; i < prioritized.length; i++) { this[prioritized[i].unit](units[prioritized[i].unit]); } } else { units = normalizeUnits(units); if (isFunction(this[units])) { return this[units](value); } } return this; } function zeroFill (number, targetLength, forceSign) { var absNumber = '' + Math.abs(number); var zerosToFill = targetLength - absNumber.length; var sign = number >= 0; return (sign ? forceSign ? '+' : '' : '-') + Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber; } var formattingTokens = /(\\[[^\\[]*\\])|(\\\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g; var localFormattingTokens = /(\\[[^\\[]*\\])|(\\\\)?(LTS|LT|LL?L?L?|l{1,4})/g; var formatFunctions = {}; var formatTokenFunctions = {}; function addFormatToken (token, padded, ordinal, callback) { var func = callback; if (typeof callback === 'string') { func = function () { return this[callback](); }; } if (token) { formatTokenFunctions[token] = func; } if (padded) { formatTokenFunctions[padded[0]] = function () { return zeroFill(func.apply(this, arguments), padded[1], padded[2]); }; } if (ordinal) { formatTokenFunctions[ordinal] = function () { return this.localeData().ordinal(func.apply(this, arguments), token); }; } } function removeFormattingTokens (input) { if (input.match(/\\[[\\s\\S]/)) { return input.replace(/^\\[|\\]$/g, ''); } return input.replace(/\\\\/g, ''); } function makeFormatFunction (format) { var array = format.match(formattingTokens); var i; var length; for (i = 0, length = array.length; i < length; i++) { if (formatTokenFunctions[array[i]]) { array[i] = formatTokenFunctions[array[i]]; } else { array[i] = removeFormattingTokens(array[i]); } } return function (mom) { var output = ''; var i; for (i = 0; i < length; i++) { output += array[i] instanceof Function ? array[i].call(mom, format) : array[i]; } return output; }; } function formatMoment (m, format) { if (!m.isValid()) { return m.localeData().invalidDate(); }format = expandFormat(format, m.localeData()); formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format); return formatFunctions[format](m); } function expandFormat (format, locale) { var i = 5; function replaceLongDateFormatTokens (input) { return locale.longDateFormat(input) || input; }localFormattingTokens.lastIndex = 0; while (i >= 0 && localFormattingTokens.test(format)) { format = format.replace(localFormattingTokens, replaceLongDateFormatTokens); localFormattingTokens.lastIndex = 0; i -= 1; } return format; } var match1 = /\\d/; var match2 = /\\d\\d/; var match3 = /\\d{3}/; var match4 = /\\d{4}/; var match6 = /[+-]?\\d{6}/; var match1to2 = /\\d\\d?/; var match3to4 = /\\d\\d\\d\\d?/; var match5to6 = /\\d\\d\\d\\d\\d\\d?/; var match1to3 = /\\d{1,3}/; var match1to4 = /\\d{1,4}/; var match1to6 = /[+-]?\\d{1,6}/; var matchUnsigned = /\\d+/; var matchSigned = /[+-]?\\d+/; var matchOffset = /Z|[+-]\\d\\d:?\\d\\d/gi; var matchShortOffset = /Z|[+-]\\d\\d(?::?\\d\\d)?/gi; var matchTimestamp = /[+-]?\\d+(\\.\\d{1,3})?/; var matchWord = /[0-9]*['a-z\\u00A0-\\u05FF\\u0700-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]+|[\\u0600-\\u06FF\\/]+(\\s*?[\\u0600-\\u06FF]+){1,2}/i; var regexes = {}; function addRegexToken (token, regex, strictRegex) { regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) { return isStrict && strictRegex ? strictRegex : regex; }; } function getParseRegexForToken (token, config) { if (!hasOwnProp(regexes, token)) { return new RegExp(unescapeFormat(token)); } return regexes[token](config._strict, config._locale); } function unescapeFormat (s) { return regexEscape(s.replace('\\\\', '').replace(/\\\\(\\[)|\\\\(\\])|\\[([^\\]\\[]*)\\]|\\\\(.)/g, function (matched, p1, p2, p3, p4) { return p1 || p2 || p3 || p4; })); } function regexEscape (s) { return s.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&'); } var tokens = {}; function addParseToken (token, callback) { var i; var func = callback; if (typeof token === 'string') { token = [token]; } if (typeof callback === 'number') { func = function (input, array) { array[callback] = toInt(input); }; } for (i = 0; i < token.length; i++) { tokens[token[i]] = func; } } function addWeekParseToken (token, callback) { addParseToken(token, function (input, array, config, token) { config._w = config._w || {}; callback(input, config._w, config, token); }); } function addTimeToArrayFromToken (token, input, config) { if (input != null && hasOwnProp(tokens, token)) { tokens[token](input, config._a, config, token); } } var YEAR = 0; var MONTH = 1; var DATE = 2; var HOUR = 3; var MINUTE = 4; var SECOND = 5; var MILLISECOND = 6; var WEEK = 7; var WEEKDAY = 8; var indexOf; if (Array.prototype.indexOf) { indexOf = Array.prototype.indexOf; } else { indexOf = function (o) { var i; for (i = 0; i < this.length; ++i) { if (this[i] === o) { return i; } } return -1; }; } function daysInMonth (year, month) { return new Date(Date.UTC(year, month + 1, 0)).getUTCDate(); }addFormatToken('M', ['MM', 2], 'Mo', function () { return this.month() + 1; }); addFormatToken('MMM', 0, 0, function (format) { return this.localeData().monthsShort(this, format); }); addFormatToken('MMMM', 0, 0, function (format) { return this.localeData().months(this, format); }); addUnitAlias('month', 'M'); addUnitPriority('month', 8); addRegexToken('M', match1to2); addRegexToken('MM', match1to2, match2); addRegexToken('MMM', function (isStrict, locale) { return locale.monthsShortRegex(isStrict); }); addRegexToken('MMMM', function (isStrict, locale) { return locale.monthsRegex(isStrict); }); addParseToken(['M', 'MM'], function (input, array) { array[MONTH] = toInt(input) - 1; }); addParseToken(['MMM', 'MMMM'], function (input, array, config, token) { var month = config._locale.monthsParse(input, token, config._strict); if (month != null) { array[MONTH] = month; } else { getParsingFlags(config).invalidMonth = input; } }); var MONTHS_IN_FORMAT = /D[oD]?(\\[[^\\[\\]]*\\]|\\s+)+MMMM?/; var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'); function localeMonths (m, format) { return isArray(this._months) ? this._months[m.month()] : this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()]; } var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'); function localeMonthsShort (m, format) { return isArray(this._monthsShort) ? this._monthsShort[m.month()] : this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()]; } function units_month__handleStrictParse (monthName, format, strict) { var i; var ii; var mom; var llc = monthName.toLocaleLowerCase(); if (!this._monthsParse) { this._monthsParse = []; this._longMonthsParse = []; this._shortMonthsParse = []; for (i = 0; i < 12; ++i) { mom = create_utc__createUTC([2e3, i]); this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase(); this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase(); } } if (strict) { if (format === 'MMM') { ii = indexOf.call(this._shortMonthsParse, llc); return ii !== -1 ? ii : null; } else { ii = indexOf.call(this._longMonthsParse, llc); return ii !== -1 ? ii : null; } } else { if (format === 'MMM') { ii = indexOf.call(this._shortMonthsParse, llc); if (ii !== -1) { return ii; }ii = indexOf.call(this._longMonthsParse, llc); return ii !== -1 ? ii : null; } else { ii = indexOf.call(this._longMonthsParse, llc); if (ii !== -1) { return ii; }ii = indexOf.call(this._shortMonthsParse, llc); return ii !== -1 ? ii : null; } } } function localeMonthsParse (monthName, format, strict) { var i, mom, regex; if (this._monthsParseExact) { return units_month__handleStrictParse.call(this, monthName, format, strict); } if (!this._monthsParse) { this._monthsParse = []; this._longMonthsParse = []; this._shortMonthsParse = []; } for (i = 0; i < 12; i++) { mom = create_utc__createUTC([2e3, i]); if (strict && !this._longMonthsParse[i]) { this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i'); this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i'); } if (!strict && !this._monthsParse[i]) { regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); } if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) { return i; } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) { return i; } else if (!strict && this._monthsParse[i].test(monthName)) { return i; } } } function setMonth (mom, value) { var dayOfMonth; if (!mom.isValid()) { return mom; } if (typeof value === 'string') { if (/^\\d+$/.test(value)) { value = toInt(value); } else { value = mom.localeData().monthsParse(value); if (typeof value !== 'number') { return mom; } } }dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value)); mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); return mom; } function getSetMonth (value) { if (value != null) { setMonth(this, value); utils_hooks__hooks.updateOffset(this, true); return this; } else { return get_set__get(this, 'Month'); } } function getDaysInMonth () { return daysInMonth(this.year(), this.month()); } var defaultMonthsShortRegex = matchWord; function monthsShortRegex (isStrict) { if (this._monthsParseExact) { if (!hasOwnProp(this, '_monthsRegex')) { computeMonthsParse.call(this); } if (isStrict) { return this._monthsShortStrictRegex; } else { return this._monthsShortRegex; } } else { if (!hasOwnProp(this, '_monthsShortRegex')) { this._monthsShortRegex = defaultMonthsShortRegex; } return this._monthsShortStrictRegex && isStrict ? this._monthsShortStrictRegex : this._monthsShortRegex; } } var defaultMonthsRegex = matchWord; function monthsRegex (isStrict) { if (this._monthsParseExact) { if (!hasOwnProp(this, '_monthsRegex')) { computeMonthsParse.call(this); } if (isStrict) { return this._monthsStrictRegex; } else { return this._monthsRegex; } } else { if (!hasOwnProp(this, '_monthsRegex')) { this._monthsRegex = defaultMonthsRegex; } return this._monthsStrictRegex && isStrict ? this._monthsStrictRegex : this._monthsRegex; } } function computeMonthsParse () { function cmpLenRev (a, b) { return b.length - a.length; } var shortPieces = []; var longPieces = []; var mixedPieces = []; var i; var mom; for (i = 0; i < 12; i++) { mom = create_utc__createUTC([2e3, i]); shortPieces.push(this.monthsShort(mom, '')); longPieces.push(this.months(mom, '')); mixedPieces.push(this.months(mom, '')); mixedPieces.push(this.monthsShort(mom, '')); }shortPieces.sort(cmpLenRev); longPieces.sort(cmpLenRev); mixedPieces.sort(cmpLenRev); for (i = 0; i < 12; i++) { shortPieces[i] = regexEscape(shortPieces[i]); longPieces[i] = regexEscape(longPieces[i]); } for (i = 0; i < 24; i++) { mixedPieces[i] = regexEscape(mixedPieces[i]); } this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); this._monthsShortRegex = this._monthsRegex; this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); }addFormatToken('Y', 0, 0, function () { var y = this.year(); return y <= 9999 ? '' + y : '+' + y; }); addFormatToken(0, ['YY', 2], 0, function () { return this.year() % 100; }); addFormatToken(0, ['YYYY', 4], 0, 'year'); addFormatToken(0, ['YYYYY', 5], 0, 'year'); addFormatToken(0, ['YYYYYY', 6, true], 0, 'year'); addUnitAlias('year', 'y'); addUnitPriority('year', 1); addRegexToken('Y', matchSigned); addRegexToken('YY', match1to2, match2); addRegexToken('YYYY', match1to4, match4); addRegexToken('YYYYY', match1to6, match6); addRegexToken('YYYYYY', match1to6, match6); addParseToken(['YYYYY', 'YYYYYY'], YEAR); addParseToken('YYYY', function (input, array) { array[YEAR] = input.length === 2 ? utils_hooks__hooks.parseTwoDigitYear(input) : toInt(input); }); addParseToken('YY', function (input, array) { array[YEAR] = utils_hooks__hooks.parseTwoDigitYear(input); }); addParseToken('Y', function (input, array) { array[YEAR] = parseInt(input, 10); }); function daysInYear (year) { return isLeapYear(year) ? 366 : 365; } function isLeapYear (year) { return year % 4 === 0 && year % 100 !== 0 || year % 400 === 0; }utils_hooks__hooks.parseTwoDigitYear = function (input) { return toInt(input) + (toInt(input) > 68 ? 1900 : 2e3); }; var getSetYear = makeGetSet('FullYear', true); function getIsLeapYear () { return isLeapYear(this.year()); } function createDate (y, m, d, h, M, s, ms) { var date = new Date(y, m, d, h, M, s, ms); if (y < 100 && y >= 0 && isFinite(date.getFullYear())) { date.setFullYear(y); } return date; } function createUTCDate (y) { var date = new Date(Date.UTC.apply(null, arguments)); if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) { date.setUTCFullYear(y); } return date; } function firstWeekOffset (year, dow, doy) { var fwd = 7 + dow - doy; var fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7; return -fwdlw + fwd - 1; } function dayOfYearFromWeeks (year, week, weekday, dow, doy) { var localWeekday = (7 + weekday - dow) % 7; var weekOffset = firstWeekOffset(year, dow, doy); var dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset; var resYear; var resDayOfYear; if (dayOfYear <= 0) { resYear = year - 1; resDayOfYear = daysInYear(resYear) + dayOfYear; } else if (dayOfYear > daysInYear(year)) { resYear = year + 1; resDayOfYear = dayOfYear - daysInYear(year); } else { resYear = year; resDayOfYear = dayOfYear; } return { year: resYear, dayOfYear: resDayOfYear }; } function weekOfYear (mom, dow, doy) { var weekOffset = firstWeekOffset(mom.year(), dow, doy); var week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1; var resWeek; var resYear; if (week < 1) { resYear = mom.year() - 1; resWeek = week + weeksInYear(resYear, dow, doy); } else if (week > weeksInYear(mom.year(), dow, doy)) { resWeek = week - weeksInYear(mom.year(), dow, doy); resYear = mom.year() + 1; } else { resYear = mom.year(); resWeek = week; } return { week: resWeek, year: resYear }; } function weeksInYear (year, dow, doy) { var weekOffset = firstWeekOffset(year, dow, doy); var weekOffsetNext = firstWeekOffset(year + 1, dow, doy); return (daysInYear(year) - weekOffset + weekOffsetNext) / 7; }addFormatToken('w', ['ww', 2], 'wo', 'week'); addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek'); addUnitAlias('week', 'w'); addUnitAlias('isoWeek', 'W'); addUnitPriority('week', 5); addUnitPriority('isoWeek', 5); addRegexToken('w', match1to2); addRegexToken('ww', match1to2, match2); addRegexToken('W', match1to2); addRegexToken('WW', match1to2, match2); addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) { week[token.substr(0, 1)] = toInt(input); }); function localeWeek (mom) { return weekOfYear(mom, this._week.dow, this._week.doy).week; } var defaultLocaleWeek = { dow: 0, doy: 6 }; function localeFirstDayOfWeek () { return this._week.dow; } function localeFirstDayOfYear () { return this._week.doy; } function getSetWeek (input) { var week = this.localeData().week(this); return input == null ? week : this.add((input - week) * 7, 'd'); } function getSetISOWeek (input) { var week = weekOfYear(this, 1, 4).week; return input == null ? week : this.add((input - week) * 7, 'd'); }addFormatToken('d', 0, 'do', 'day'); addFormatToken('dd', 0, 0, function (format) { return this.localeData().weekdaysMin(this, format); }); addFormatToken('ddd', 0, 0, function (format) { return this.localeData().weekdaysShort(this, format); }); addFormatToken('dddd', 0, 0, function (format) { return this.localeData().weekdays(this, format); }); addFormatToken('e', 0, 0, 'weekday'); addFormatToken('E', 0, 0, 'isoWeekday'); addUnitAlias('day', 'd'); addUnitAlias('weekday', 'e'); addUnitAlias('isoWeekday', 'E'); addUnitPriority('day', 11); addUnitPriority('weekday', 11); addUnitPriority('isoWeekday', 11); addRegexToken('d', match1to2); addRegexToken('e', match1to2); addRegexToken('E', match1to2); addRegexToken('dd', function (isStrict, locale) { return locale.weekdaysMinRegex(isStrict); }); addRegexToken('ddd', function (isStrict, locale) { return locale.weekdaysShortRegex(isStrict); }); addRegexToken('dddd', function (isStrict, locale) { return locale.weekdaysRegex(isStrict); }); addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) { var weekday = config._locale.weekdaysParse(input, token, config._strict); if (weekday != null) { week.d = weekday; } else { getParsingFlags(config).invalidWeekday = input; } }); addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) { week[token] = toInt(input); }); function parseWeekday (input, locale) { if (typeof input !== 'string') { return input; } if (!isNaN(input)) { return parseInt(input, 10); }input = locale.weekdaysParse(input); if (typeof input === 'number') { return input; } return null; } function parseIsoWeekday (input, locale) { if (typeof input === 'string') { return locale.weekdaysParse(input) % 7 || 7; } return isNaN(input) ? null : input; } var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'); function localeWeekdays (m, format) { return isArray(this._weekdays) ? this._weekdays[m.day()] : this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()]; } var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'); function localeWeekdaysShort (m) { return this._weekdaysShort[m.day()]; } var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'); function localeWeekdaysMin (m) { return this._weekdaysMin[m.day()]; } function day_of_week__handleStrictParse (weekdayName, format, strict) {\n        var i; var ii; var mom; var llc = weekdayName.toLocaleLowerCase(); if (!this._weekdaysParse) { this._weekdaysParse = []; this._shortWeekdaysParse = []; this._minWeekdaysParse = []; for (i = 0; i < 7; ++i) { mom = create_utc__createUTC([2e3, 1]).day(i); this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase(); this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase(); this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase(); } } if (strict) {\n          if (format === 'dddd') { ii = indexOf.call(this._weekdaysParse, llc); return ii !== -1 ? ii : null; } else if (format === 'ddd') { ii = indexOf.call(this._shortWeekdaysParse, llc); return ii !== -1 ? ii : null; } else { ii = indexOf.call(this._minWeekdaysParse, llc); return ii !== -1 ? ii : null; }\n        } else { if (format === 'dddd') { ii = indexOf.call(this._weekdaysParse, llc); if (ii !== -1) { return ii; }ii = indexOf.call(this._shortWeekdaysParse, llc); if (ii !== -1) { return ii; }ii = indexOf.call(this._minWeekdaysParse, llc); return ii !== -1 ? ii : null; } else if (format === 'ddd') { ii = indexOf.call(this._shortWeekdaysParse, llc); if (ii !== -1) { return ii; }ii = indexOf.call(this._weekdaysParse, llc); if (ii !== -1) { return ii; }ii = indexOf.call(this._minWeekdaysParse, llc); return ii !== -1 ? ii : null; } else { ii = indexOf.call(this._minWeekdaysParse, llc); if (ii !== -1) { return ii; }ii = indexOf.call(this._weekdaysParse, llc); if (ii !== -1) { return ii; }ii = indexOf.call(this._shortWeekdaysParse, llc); return ii !== -1 ? ii : null; } }\n      } function localeWeekdaysParse (weekdayName, format, strict) { var i, mom, regex; if (this._weekdaysParseExact) { return day_of_week__handleStrictParse.call(this, weekdayName, format, strict); } if (!this._weekdaysParse) { this._weekdaysParse = []; this._minWeekdaysParse = []; this._shortWeekdaysParse = []; this._fullWeekdaysParse = []; } for (i = 0; i < 7; i++) { mom = create_utc__createUTC([2e3, 1]).day(i); if (strict && !this._fullWeekdaysParse[i]) { this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '.?') + '$', 'i'); this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '.?') + '$', 'i'); this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '.?') + '$', 'i'); } if (!this._weekdaysParse[i]) { regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); } if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) { return i; } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) { return i; } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) { return i; } else if (!strict && this._weekdaysParse[i].test(weekdayName)) { return i; } } } function getSetDayOfWeek (input) { if (!this.isValid()) { return input != null ? this : NaN; } var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); if (input != null) { input = parseWeekday(input, this.localeData()); return this.add(input - day, 'd'); } else { return day; } } function getSetLocaleDayOfWeek (input) { if (!this.isValid()) { return input != null ? this : NaN; } var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; return input == null ? weekday : this.add(input - weekday, 'd'); } function getSetISODayOfWeek (input) { if (!this.isValid()) { return input != null ? this : NaN; } if (input != null) { var weekday = parseIsoWeekday(input, this.localeData()); return this.day(this.day() % 7 ? weekday : weekday - 7); } else { return this.day() || 7; } } var defaultWeekdaysRegex = matchWord; function weekdaysRegex (isStrict) { if (this._weekdaysParseExact) { if (!hasOwnProp(this, '_weekdaysRegex')) { computeWeekdaysParse.call(this); } if (isStrict) { return this._weekdaysStrictRegex; } else { return this._weekdaysRegex; } } else { if (!hasOwnProp(this, '_weekdaysRegex')) { this._weekdaysRegex = defaultWeekdaysRegex; } return this._weekdaysStrictRegex && isStrict ? this._weekdaysStrictRegex : this._weekdaysRegex; } } var defaultWeekdaysShortRegex = matchWord; function weekdaysShortRegex (isStrict) { if (this._weekdaysParseExact) { if (!hasOwnProp(this, '_weekdaysRegex')) { computeWeekdaysParse.call(this); } if (isStrict) { return this._weekdaysShortStrictRegex; } else { return this._weekdaysShortRegex; } } else { if (!hasOwnProp(this, '_weekdaysShortRegex')) { this._weekdaysShortRegex = defaultWeekdaysShortRegex; } return this._weekdaysShortStrictRegex && isStrict ? this._weekdaysShortStrictRegex : this._weekdaysShortRegex; } } var defaultWeekdaysMinRegex = matchWord; function weekdaysMinRegex (isStrict) { if (this._weekdaysParseExact) { if (!hasOwnProp(this, '_weekdaysRegex')) { computeWeekdaysParse.call(this); } if (isStrict) { return this._weekdaysMinStrictRegex; } else { return this._weekdaysMinRegex; } } else { if (!hasOwnProp(this, '_weekdaysMinRegex')) { this._weekdaysMinRegex = defaultWeekdaysMinRegex; } return this._weekdaysMinStrictRegex && isStrict ? this._weekdaysMinStrictRegex : this._weekdaysMinRegex; } } function computeWeekdaysParse () { function cmpLenRev (a, b) { return b.length - a.length; } var minPieces = []; var shortPieces = []; var longPieces = []; var mixedPieces = []; var i; var mom; var minp; var shortp; var longp; for (i = 0; i < 7; i++) { mom = create_utc__createUTC([2e3, 1]).day(i); minp = this.weekdaysMin(mom, ''); shortp = this.weekdaysShort(mom, ''); longp = this.weekdays(mom, ''); minPieces.push(minp); shortPieces.push(shortp); longPieces.push(longp); mixedPieces.push(minp); mixedPieces.push(shortp); mixedPieces.push(longp); }minPieces.sort(cmpLenRev); shortPieces.sort(cmpLenRev); longPieces.sort(cmpLenRev); mixedPieces.sort(cmpLenRev); for (i = 0; i < 7; i++) { shortPieces[i] = regexEscape(shortPieces[i]); longPieces[i] = regexEscape(longPieces[i]); mixedPieces[i] = regexEscape(mixedPieces[i]); } this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); this._weekdaysShortRegex = this._weekdaysRegex; this._weekdaysMinRegex = this._weekdaysRegex; this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i'); } function hFormat () { return this.hours() % 12 || 12; } function kFormat () { return this.hours() || 24; }addFormatToken('H', ['HH', 2], 0, 'hour'); addFormatToken('h', ['hh', 2], 0, hFormat); addFormatToken('k', ['kk', 2], 0, kFormat); addFormatToken('hmm', 0, 0, function () { return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2); }); addFormatToken('hmmss', 0, 0, function () { return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) + zeroFill(this.seconds(), 2); }); addFormatToken('Hmm', 0, 0, function () { return '' + this.hours() + zeroFill(this.minutes(), 2); }); addFormatToken('Hmmss', 0, 0, function () { return '' + this.hours() + zeroFill(this.minutes(), 2) + zeroFill(this.seconds(), 2); }); function meridiem (token, lowercase) { addFormatToken(token, 0, 0, function () { return this.localeData().meridiem(this.hours(), this.minutes(), lowercase); }); }meridiem('a', true); meridiem('A', false); addUnitAlias('hour', 'h'); addUnitPriority('hour', 13); function matchMeridiem (isStrict, locale) { return locale._meridiemParse; }addRegexToken('a', matchMeridiem); addRegexToken('A', matchMeridiem); addRegexToken('H', match1to2); addRegexToken('h', match1to2); addRegexToken('HH', match1to2, match2); addRegexToken('hh', match1to2, match2); addRegexToken('hmm', match3to4); addRegexToken('hmmss', match5to6); addRegexToken('Hmm', match3to4); addRegexToken('Hmmss', match5to6); addParseToken(['H', 'HH'], HOUR); addParseToken(['a', 'A'], function (input, array, config) { config._isPm = config._locale.isPM(input); config._meridiem = input; }); addParseToken(['h', 'hh'], function (input, array, config) { array[HOUR] = toInt(input); getParsingFlags(config).bigHour = true; }); addParseToken('hmm', function (input, array, config) { var pos = input.length - 2; array[HOUR] = toInt(input.substr(0, pos)); array[MINUTE] = toInt(input.substr(pos)); getParsingFlags(config).bigHour = true; }); addParseToken('hmmss', function (input, array, config) { var pos1 = input.length - 4; var pos2 = input.length - 2; array[HOUR] = toInt(input.substr(0, pos1)); array[MINUTE] = toInt(input.substr(pos1, 2)); array[SECOND] = toInt(input.substr(pos2)); getParsingFlags(config).bigHour = true; }); addParseToken('Hmm', function (input, array, config) { var pos = input.length - 2; array[HOUR] = toInt(input.substr(0, pos)); array[MINUTE] = toInt(input.substr(pos)); }); addParseToken('Hmmss', function (input, array, config) { var pos1 = input.length - 4; var pos2 = input.length - 2; array[HOUR] = toInt(input.substr(0, pos1)); array[MINUTE] = toInt(input.substr(pos1, 2)); array[SECOND] = toInt(input.substr(pos2)); }); function localeIsPM (input) { return (input + '').toLowerCase().charAt(0) === 'p'; } var defaultLocaleMeridiemParse = /[ap]\\.?m?\\.?/i; function localeMeridiem (hours, minutes, isLower) { if (hours > 11) { return isLower ? 'pm' : 'PM'; } else { return isLower ? 'am' : 'AM'; } } var getSetHour = makeGetSet('Hours', true); var baseConfig = { calendar: defaultCalendar, longDateFormat: defaultLongDateFormat, invalidDate: defaultInvalidDate, ordinal: defaultOrdinal, ordinalParse: defaultOrdinalParse, relativeTime: defaultRelativeTime, months: defaultLocaleMonths, monthsShort: defaultLocaleMonthsShort, week: defaultLocaleWeek, weekdays: defaultLocaleWeekdays, weekdaysMin: defaultLocaleWeekdaysMin, weekdaysShort: defaultLocaleWeekdaysShort, meridiemParse: defaultLocaleMeridiemParse }; var locales = {}; var globalLocale; function normalizeLocale (key) { return key ? key.toLowerCase().replace('_', '-') : key; } function chooseLocale (names) { var i = 0; var j; var next; var locale; var split; while (i < names.length) { split = normalizeLocale(names[i]).split('-'); j = split.length; next = normalizeLocale(names[i + 1]); next = next ? next.split('-') : null; while (j > 0) { locale = loadLocale(split.slice(0, j).join('-')); if (locale) { return locale; } if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) { break; }j--; }i++; } return null; } function loadLocale (name) { var oldLocale = null; if (!locales[name] && typeof module !== 'undefined' && module && module.exports) { try { oldLocale = globalLocale._abbr; require('./locale/' + name); locale_locales__getSetGlobalLocale(oldLocale); } catch (e) {} } return locales[name]; } function locale_locales__getSetGlobalLocale (key, values) { var data; if (key) { if (isUndefined(values)) { data = locale_locales__getLocale(key); } else { data = defineLocale(key, values); } if (data) { globalLocale = data; } } return globalLocale._abbr; } function defineLocale (name, config) { if (config !== null) { var parentConfig = baseConfig; config.abbr = name; if (locales[name] != null) { deprecateSimple('defineLocaleOverride', 'use moment.updateLocale(localeName, config) to change ' + 'an existing locale. moment.defineLocale(localeName, ' + 'config) should only be used for creating a new locale ' + 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.'); parentConfig = locales[name]._config; } else if (config.parentLocale != null) { if (locales[config.parentLocale] != null) { parentConfig = locales[config.parentLocale]._config; } else { deprecateSimple('parentLocaleUndefined', 'specified parentLocale is not defined yet. See http://momentjs.com/guides/#/warnings/parent-locale/'); } }locales[name] = new Locale(mergeConfigs(parentConfig, config)); locale_locales__getSetGlobalLocale(name); return locales[name]; } else { delete locales[name]; return null; } } function updateLocale (name, config) { if (config != null) { var locale; var parentConfig = baseConfig; if (locales[name] != null) { parentConfig = locales[name]._config; }config = mergeConfigs(parentConfig, config); locale = new Locale(config); locale.parentLocale = locales[name]; locales[name] = locale; locale_locales__getSetGlobalLocale(name); } else { if (locales[name] != null) { if (locales[name].parentLocale != null) { locales[name] = locales[name].parentLocale; } else if (locales[name] != null) { delete locales[name]; } } } return locales[name]; } function locale_locales__getLocale (key) { var locale; if (key && key._locale && key._locale._abbr) { key = key._locale._abbr; } if (!key) { return globalLocale; } if (!isArray(key)) { locale = loadLocale(key); if (locale) { return locale; }key = [key]; } return chooseLocale(key); } function locale_locales__listLocales () { return keys(locales); } function checkOverflow (m) { var overflow; var a = m._a; if (a && getParsingFlags(m).overflow === -2) { overflow = a[MONTH] < 0 || a[MONTH] > 11 ? MONTH : a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE : a[HOUR] < 0 || a[HOUR] > 24 || a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0) ? HOUR : a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE : a[SECOND] < 0 || a[SECOND] > 59 ? SECOND : a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND : -1; if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { overflow = DATE; } if (getParsingFlags(m)._overflowWeeks && overflow === -1) { overflow = WEEK; } if (getParsingFlags(m)._overflowWeekday && overflow === -1) { overflow = WEEKDAY; }getParsingFlags(m).overflow = overflow; } return m; } var extendedIsoRegex = /^\\s*((?:[+-]\\d{6}|\\d{4})-(?:\\d\\d-\\d\\d|W\\d\\d-\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?::\\d\\d(?::\\d\\d(?:[.,]\\d+)?)?)?)([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?/; var basicIsoRegex = /^\\s*((?:[+-]\\d{6}|\\d{4})(?:\\d\\d\\d\\d|W\\d\\d\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?:\\d\\d(?:\\d\\d(?:[.,]\\d+)?)?)?)([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?/; var tzRegex = /Z|[+-]\\d\\d(?::?\\d\\d)?/; var isoDates = [['YYYYYY-MM-DD', /[+-]\\d{6}-\\d\\d-\\d\\d/], ['YYYY-MM-DD', /\\d{4}-\\d\\d-\\d\\d/], ['GGGG-[W]WW-E', /\\d{4}-W\\d\\d-\\d/], ['GGGG-[W]WW', /\\d{4}-W\\d\\d/, false], ['YYYY-DDD', /\\d{4}-\\d{3}/], ['YYYY-MM', /\\d{4}-\\d\\d/, false], ['YYYYYYMMDD', /[+-]\\d{10}/], ['YYYYMMDD', /\\d{8}/], ['GGGG[W]WWE', /\\d{4}W\\d{3}/], ['GGGG[W]WW', /\\d{4}W\\d{2}/, false], ['YYYYDDD', /\\d{7}/]]; var isoTimes = [['HH:mm:ss.SSSS', /\\d\\d:\\d\\d:\\d\\d\\.\\d+/], ['HH:mm:ss,SSSS', /\\d\\d:\\d\\d:\\d\\d,\\d+/], ['HH:mm:ss', /\\d\\d:\\d\\d:\\d\\d/], ['HH:mm', /\\d\\d:\\d\\d/], ['HHmmss.SSSS', /\\d\\d\\d\\d\\d\\d\\.\\d+/], ['HHmmss,SSSS', /\\d\\d\\d\\d\\d\\d,\\d+/], ['HHmmss', /\\d\\d\\d\\d\\d\\d/], ['HHmm', /\\d\\d\\d\\d/], ['HH', /\\d\\d/]]; var aspNetJsonRegex = /^\\/?Date\\((\\-?\\d+)/i; function configFromISO (config) { var i; var l; var string = config._i; var match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string); var allowTime; var dateFormat; var timeFormat; var tzFormat; if (match) { getParsingFlags(config).iso = true; for (i = 0, l = isoDates.length; i < l; i++) { if (isoDates[i][1].exec(match[1])) { dateFormat = isoDates[i][0]; allowTime = isoDates[i][2] !== false; break; } } if (dateFormat == null) { config._isValid = false; return; } if (match[3]) { for (i = 0, l = isoTimes.length; i < l; i++) { if (isoTimes[i][1].exec(match[3])) { timeFormat = (match[2] || ' ') + isoTimes[i][0]; break; } } if (timeFormat == null) { config._isValid = false; return; } } if (!allowTime && timeFormat != null) { config._isValid = false; return; } if (match[4]) { if (tzRegex.exec(match[4])) { tzFormat = 'Z'; } else { config._isValid = false; return; } }config._f = dateFormat + (timeFormat || '') + (tzFormat || ''); configFromStringAndFormat(config); } else { config._isValid = false; } } function configFromString (config) { var matched = aspNetJsonRegex.exec(config._i); if (matched !== null) { config._d = new Date(+matched[1]); return; }configFromISO(config); if (config._isValid === false) { delete config._isValid; utils_hooks__hooks.createFromInputFallback(config); } }utils_hooks__hooks.createFromInputFallback = deprecate('moment construction falls back to js Date. This is ' + 'discouraged and will be removed in upcoming major ' + 'release. Please refer to ' + 'http://momentjs.com/guides/#/warnings/js-date/ for more info.', function (config) { config._d = new Date(config._i + (config._useUTC ? ' UTC' : '')); }); function defaults (a, b, c) { if (a != null) { return a; } if (b != null) { return b; } return c; } function currentDateArray (config) { var nowValue = new Date(utils_hooks__hooks.now()); if (config._useUTC) { return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()]; } return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()]; } function configFromArray (config) { var i; var date; var input = []; var currentDate; var yearToUse; if (config._d) { return; }currentDate = currentDateArray(config); if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { dayOfYearFromWeekInfo(config); } if (config._dayOfYear) { yearToUse = defaults(config._a[YEAR], currentDate[YEAR]); if (config._dayOfYear > daysInYear(yearToUse)) { getParsingFlags(config)._overflowDayOfYear = true; }date = createUTCDate(yearToUse, 0, config._dayOfYear); config._a[MONTH] = date.getUTCMonth(); config._a[DATE] = date.getUTCDate(); } for (i = 0; i < 3 && config._a[i] == null; ++i) { config._a[i] = input[i] = currentDate[i]; } for (;i < 7; i++) { config._a[i] = input[i] = config._a[i] == null ? i === 2 ? 1 : 0 : config._a[i]; } if (config._a[HOUR] === 24 && config._a[MINUTE] === 0 && config._a[SECOND] === 0 && config._a[MILLISECOND] === 0) { config._nextDay = true; config._a[HOUR] = 0; }config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input); if (config._tzm != null) { config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); } if (config._nextDay) { config._a[HOUR] = 24; } } function dayOfYearFromWeekInfo (config) { var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow; w = config._w; if (w.GG != null || w.W != null || w.E != null) { dow = 1; doy = 4; weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(local__createLocal(), 1, 4).year); week = defaults(w.W, 1); weekday = defaults(w.E, 1); if (weekday < 1 || weekday > 7) { weekdayOverflow = true; } } else { dow = config._locale._week.dow; doy = config._locale._week.doy; weekYear = defaults(w.gg, config._a[YEAR], weekOfYear(local__createLocal(), dow, doy).year); week = defaults(w.w, 1); if (w.d != null) { weekday = w.d; if (weekday < 0 || weekday > 6) { weekdayOverflow = true; } } else if (w.e != null) { weekday = w.e + dow; if (w.e < 0 || w.e > 6) { weekdayOverflow = true; } } else { weekday = dow; } } if (week < 1 || week > weeksInYear(weekYear, dow, doy)) { getParsingFlags(config)._overflowWeeks = true; } else if (weekdayOverflow != null) { getParsingFlags(config)._overflowWeekday = true; } else { temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy); config._a[YEAR] = temp.year; config._dayOfYear = temp.dayOfYear; } }utils_hooks__hooks.ISO_8601 = function () {}; function configFromStringAndFormat (config) { if (config._f === utils_hooks__hooks.ISO_8601) { configFromISO(config); return; }config._a = []; getParsingFlags(config).empty = true; var string = '' + config._i; var i; var parsedInput; var tokens; var token; var skipped; var stringLength = string.length; var totalParsedInputLength = 0; tokens = expandFormat(config._f, config._locale).match(formattingTokens) || []; for (i = 0; i < tokens.length; i++) { token = tokens[i]; parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; if (parsedInput) { skipped = string.substr(0, string.indexOf(parsedInput)); if (skipped.length > 0) { getParsingFlags(config).unusedInput.push(skipped); }string = string.slice(string.indexOf(parsedInput) + parsedInput.length); totalParsedInputLength += parsedInput.length; } if (formatTokenFunctions[token]) { if (parsedInput) { getParsingFlags(config).empty = false; } else { getParsingFlags(config).unusedTokens.push(token); }addTimeToArrayFromToken(token, parsedInput, config); } else if (config._strict && !parsedInput) { getParsingFlags(config).unusedTokens.push(token); } }getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength; if (string.length > 0) { getParsingFlags(config).unusedInput.push(string); } if (config._a[HOUR] <= 12 && getParsingFlags(config).bigHour === true && config._a[HOUR] > 0) { getParsingFlags(config).bigHour = undefined; }getParsingFlags(config).parsedDateParts = config._a.slice(0); getParsingFlags(config).meridiem = config._meridiem; config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem); configFromArray(config); checkOverflow(config); } function meridiemFixWrap (locale, hour, meridiem) { var isPm; if (meridiem == null) { return hour; } if (locale.meridiemHour != null) { return locale.meridiemHour(hour, meridiem); } else if (locale.isPM != null) { isPm = locale.isPM(meridiem); if (isPm && hour < 12) { hour += 12; } if (!isPm && hour === 12) { hour = 0; } return hour; } else { return hour; } } function configFromStringAndArray (config) { var tempConfig, bestMoment, scoreToBeat, i, currentScore; if (config._f.length === 0) { getParsingFlags(config).invalidFormat = true; config._d = new Date(NaN); return; } for (i = 0; i < config._f.length; i++) { currentScore = 0; tempConfig = copyConfig({}, config); if (config._useUTC != null) { tempConfig._useUTC = config._useUTC; }tempConfig._f = config._f[i]; configFromStringAndFormat(tempConfig); if (!valid__isValid(tempConfig)) { continue; }currentScore += getParsingFlags(tempConfig).charsLeftOver; currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10; getParsingFlags(tempConfig).score = currentScore; if (scoreToBeat == null || currentScore < scoreToBeat) { scoreToBeat = currentScore; bestMoment = tempConfig; } }extend(config, bestMoment || tempConfig); } function configFromObject (config) { if (config._d) { return; } var i = normalizeObjectUnits(config._i); config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) { return obj && parseInt(obj, 10); }); configFromArray(config); } function createFromConfig (config) { var res = new Moment(checkOverflow(prepareConfig(config))); if (res._nextDay) { res.add(1, 'd'); res._nextDay = undefined; } return res; } function prepareConfig (config) { var input = config._i; var format = config._f; config._locale = config._locale || locale_locales__getLocale(config._l); if (input === null || format === undefined && input === '') { return valid__createInvalid({ nullInput: true }); } if (typeof input === 'string') { config._i = input = config._locale.preparse(input); } if (isMoment(input)) { return new Moment(checkOverflow(input)); } else if (isArray(format)) { configFromStringAndArray(config); } else if (isDate(input)) { config._d = input; } else if (format) { configFromStringAndFormat(config); } else { configFromInput(config); } if (!valid__isValid(config)) { config._d = null; } return config; } function configFromInput (config) { var input = config._i; if (input === undefined) { config._d = new Date(utils_hooks__hooks.now()); } else if (isDate(input)) { config._d = new Date(input.valueOf()); } else if (typeof input === 'string') { configFromString(config); } else if (isArray(input)) { config._a = map(input.slice(0), function (obj) { return parseInt(obj, 10); }); configFromArray(config); } else if (typeof input === 'object') { configFromObject(config); } else if (typeof input === 'number') { config._d = new Date(input); } else { utils_hooks__hooks.createFromInputFallback(config); } } function createLocalOrUTC (input, format, locale, strict, isUTC) { var c = {}; if (typeof locale === 'boolean') { strict = locale; locale = undefined; } if (isObject(input) && isObjectEmpty(input) || isArray(input) && input.length === 0) { input = undefined; }c._isAMomentObject = true; c._useUTC = c._isUTC = isUTC; c._l = locale; c._i = input; c._f = format; c._strict = strict; return createFromConfig(c); } function local__createLocal (input, format, locale, strict) { return createLocalOrUTC(input, format, locale, strict, false); } var prototypeMin = deprecate('moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/', function () { var other = local__createLocal.apply(null, arguments); if (this.isValid() && other.isValid()) { return other < this ? this : other; } else { return valid__createInvalid(); } }); var prototypeMax = deprecate('moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/', function () { var other = local__createLocal.apply(null, arguments); if (this.isValid() && other.isValid()) { return other > this ? this : other; } else { return valid__createInvalid(); } }); function pickBy (fn, moments) { var res, i; if (moments.length === 1 && isArray(moments[0])) { moments = moments[0]; } if (!moments.length) { return local__createLocal(); }res = moments[0]; for (i = 1; i < moments.length; ++i) { if (!moments[i].isValid() || moments[i][fn](res)) { res = moments[i]; } } return res; } function min () { var args = [].slice.call(arguments, 0); return pickBy('isBefore', args); } function max () { var args = [].slice.call(arguments, 0); return pickBy('isAfter', args); } var now = function () { return Date.now ? Date.now() : +new Date(); }; function Duration (duration) { var normalizedInput = normalizeObjectUnits(duration); var years = normalizedInput.year || 0; var quarters = normalizedInput.quarter || 0; var months = normalizedInput.month || 0; var weeks = normalizedInput.week || 0; var days = normalizedInput.day || 0; var hours = normalizedInput.hour || 0; var minutes = normalizedInput.minute || 0; var seconds = normalizedInput.second || 0; var milliseconds = normalizedInput.millisecond || 0; this._milliseconds = +milliseconds + seconds * 1e3 + minutes * 6e4 + hours * 1e3 * 60 * 60; this._days = +days + weeks * 7; this._months = +months + quarters * 3 + years * 12; this._data = {}; this._locale = locale_locales__getLocale(); this._bubble(); } function isDuration (obj) { return obj instanceof Duration; } function offset (token, separator) { addFormatToken(token, 0, 0, function () { var offset = this.utcOffset(); var sign = '+'; if (offset < 0) { offset = -offset; sign = '-'; } return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~offset % 60, 2); }); }offset('Z', ':'); offset('ZZ', ''); addRegexToken('Z', matchShortOffset); addRegexToken('ZZ', matchShortOffset); addParseToken(['Z', 'ZZ'], function (input, array, config) { config._useUTC = true; config._tzm = offsetFromString(matchShortOffset, input); }); var chunkOffset = /([\\+\\-]|\\d\\d)/gi; function offsetFromString (matcher, string) { var matches = (string || '').match(matcher) || []; var chunk = matches[matches.length - 1] || []; var parts = (chunk + '').match(chunkOffset) || ['-', 0, 0]; var minutes = +(parts[1] * 60) + toInt(parts[2]); return parts[0] === '+' ? minutes : -minutes; } function cloneWithOffset (input, model) { var res, diff; if (model._isUTC) { res = model.clone(); diff = (isMoment(input) || isDate(input) ? input.valueOf() : local__createLocal(input).valueOf()) - res.valueOf(); res._d.setTime(res._d.valueOf() + diff); utils_hooks__hooks.updateOffset(res, false); return res; } else { return local__createLocal(input).local(); } } function getDateOffset (m) { return -Math.round(m._d.getTimezoneOffset() / 15) * 15; }utils_hooks__hooks.updateOffset = function () {}; function getSetOffset (input, keepLocalTime) { var offset = this._offset || 0; var localAdjust; if (!this.isValid()) { return input != null ? this : NaN; } if (input != null) { if (typeof input === 'string') { input = offsetFromString(matchShortOffset, input); } else if (Math.abs(input) < 16) { input = input * 60; } if (!this._isUTC && keepLocalTime) { localAdjust = getDateOffset(this); } this._offset = input; this._isUTC = true; if (localAdjust != null) { this.add(localAdjust, 'm'); } if (offset !== input) { if (!keepLocalTime || this._changeInProgress) { add_subtract__addSubtract(this, create__createDuration(input - offset, 'm'), 1, false); } else if (!this._changeInProgress) { this._changeInProgress = true; utils_hooks__hooks.updateOffset(this, true); this._changeInProgress = null; } } return this; } else { return this._isUTC ? offset : getDateOffset(this); } } function getSetZone (input, keepLocalTime) { if (input != null) { if (typeof input !== 'string') { input = -input; } this.utcOffset(input, keepLocalTime); return this; } else { return -this.utcOffset(); } } function setOffsetToUTC (keepLocalTime) { return this.utcOffset(0, keepLocalTime); } function setOffsetToLocal (keepLocalTime) { if (this._isUTC) { this.utcOffset(0, keepLocalTime); this._isUTC = false; if (keepLocalTime) { this.subtract(getDateOffset(this), 'm'); } } return this; } function setOffsetToParsedOffset () { if (this._tzm) { this.utcOffset(this._tzm); } else if (typeof this._i === 'string') { this.utcOffset(offsetFromString(matchOffset, this._i)); } return this; } function hasAlignedHourOffset (input) { if (!this.isValid()) { return false; }input = input ? local__createLocal(input).utcOffset() : 0; return (this.utcOffset() - input) % 60 === 0; } function isDaylightSavingTime () { return this.utcOffset() > this.clone().month(0).utcOffset() || this.utcOffset() > this.clone().month(5).utcOffset(); } function isDaylightSavingTimeShifted () { if (!isUndefined(this._isDSTShifted)) { return this._isDSTShifted; } var c = {}; copyConfig(c, this); c = prepareConfig(c); if (c._a) { var other = c._isUTC ? create_utc__createUTC(c._a) : local__createLocal(c._a); this._isDSTShifted = this.isValid() && compareArrays(c._a, other.toArray()) > 0; } else { this._isDSTShifted = false; } return this._isDSTShifted; } function isLocal () { return this.isValid() ? !this._isUTC : false; } function isUtcOffset () { return this.isValid() ? this._isUTC : false; } function isUtc () { return this.isValid() ? this._isUTC && this._offset === 0 : false; } var aspNetRegex = /^(\\-)?(?:(\\d*)[. ])?(\\d+)\\:(\\d+)(?:\\:(\\d+)\\.?(\\d{3})?\\d*)?$/; var isoRegex = /^(-)?P(?:(-?[0-9,.]*)Y)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)W)?(?:(-?[0-9,.]*)D)?(?:T(?:(-?[0-9,.]*)H)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)S)?)?$/; function create__createDuration (input, key) { var duration = input; var match = null; var sign; var ret; var diffRes; if (isDuration(input)) { duration = { ms: input._milliseconds, d: input._days, M: input._months }; } else if (typeof input === 'number') { duration = {}; if (key) { duration[key] = input; } else { duration.milliseconds = input; } } else if (match = aspNetRegex.exec(input)) { sign = match[1] === '-' ? -1 : 1; duration = { y: 0, d: toInt(match[DATE]) * sign, h: toInt(match[HOUR]) * sign, m: toInt(match[MINUTE]) * sign, s: toInt(match[SECOND]) * sign, ms: toInt(match[MILLISECOND]) * sign }; } else if (match = isoRegex.exec(input)) { sign = match[1] === '-' ? -1 : 1; duration = { y: parseIso(match[2], sign), M: parseIso(match[3], sign), w: parseIso(match[4], sign), d: parseIso(match[5], sign), h: parseIso(match[6], sign), m: parseIso(match[7], sign), s: parseIso(match[8], sign) }; } else if (duration == null) { duration = {}; } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) { diffRes = momentsDifference(local__createLocal(duration.from), local__createLocal(duration.to)); duration = {}; duration.ms = diffRes.milliseconds; duration.M = diffRes.months; }ret = new Duration(duration); if (isDuration(input) && hasOwnProp(input, '_locale')) { ret._locale = input._locale; } return ret; }create__createDuration.fn = Duration.prototype; function parseIso (inp, sign) { var res = inp && parseFloat(inp.replace(',', '.')); return (isNaN(res) ? 0 : res) * sign; } function positiveMomentsDifference (base, other) { var res = { milliseconds: 0, months: 0 }; res.months = other.month() - base.month() + (other.year() - base.year()) * 12; if (base.clone().add(res.months, 'M').isAfter(other)) { --res.months; }res.milliseconds = +other - +base.clone().add(res.months, 'M'); return res; } function momentsDifference (base, other) { var res; if (!(base.isValid() && other.isValid())) { return { milliseconds: 0, months: 0 }; }other = cloneWithOffset(other, base); if (base.isBefore(other)) { res = positiveMomentsDifference(base, other); } else { res = positiveMomentsDifference(other, base); res.milliseconds = -res.milliseconds; res.months = -res.months; } return res; } function absRound (number) { if (number < 0) { return Math.round(-1 * number) * -1; } else { return Math.round(number); } } function createAdder (direction, name) { return function (val, period) { var dur, tmp; if (period !== null && !isNaN(+period)) { deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' + 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.'); tmp = val; val = period; period = tmp; }val = typeof val === 'string' ? +val : val; dur = create__createDuration(val, period); add_subtract__addSubtract(this, dur, direction); return this; }; } function add_subtract__addSubtract (mom, duration, isAdding, updateOffset) { var milliseconds = duration._milliseconds; var days = absRound(duration._days); var months = absRound(duration._months); if (!mom.isValid()) { return; }updateOffset = updateOffset == null ? true : updateOffset; if (milliseconds) { mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding); } if (days) { get_set__set(mom, 'Date', get_set__get(mom, 'Date') + days * isAdding); } if (months) { setMonth(mom, get_set__get(mom, 'Month') + months * isAdding); } if (updateOffset) { utils_hooks__hooks.updateOffset(mom, days || months); } } var add_subtract__add = createAdder(1, 'add'); var add_subtract__subtract = createAdder(-1, 'subtract'); function getCalendarFormat (myMoment, now) { var diff = myMoment.diff(now, 'days', true); return diff < -6 ? 'sameElse' : diff < -1 ? 'lastWeek' : diff < 0 ? 'lastDay' : diff < 1 ? 'sameDay' : diff < 2 ? 'nextDay' : diff < 7 ? 'nextWeek' : 'sameElse'; } function moment_calendar__calendar (time, formats) { var now = time || local__createLocal(); var sod = cloneWithOffset(now, this).startOf('day'); var format = utils_hooks__hooks.calendarFormat(this, sod) || 'sameElse'; var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]); return this.format(output || this.localeData().calendar(format, this, local__createLocal(now))); } function clone () { return new Moment(this); } function isAfter (input, units) { var localInput = isMoment(input) ? input : local__createLocal(input); if (!(this.isValid() && localInput.isValid())) { return false; }units = normalizeUnits(!isUndefined(units) ? units : 'millisecond'); if (units === 'millisecond') { return this.valueOf() > localInput.valueOf(); } else { return localInput.valueOf() < this.clone().startOf(units).valueOf(); } } function isBefore (input, units) { var localInput = isMoment(input) ? input : local__createLocal(input); if (!(this.isValid() && localInput.isValid())) { return false; }units = normalizeUnits(!isUndefined(units) ? units : 'millisecond'); if (units === 'millisecond') { return this.valueOf() < localInput.valueOf(); } else { return this.clone().endOf(units).valueOf() < localInput.valueOf(); } } function isBetween (from, to, units, inclusivity) { inclusivity = inclusivity || '()'; return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) && (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units)); } function isSame (input, units) { var localInput = isMoment(input) ? input : local__createLocal(input); var inputMs; if (!(this.isValid() && localInput.isValid())) { return false; }units = normalizeUnits(units || 'millisecond'); if (units === 'millisecond') { return this.valueOf() === localInput.valueOf(); } else { inputMs = localInput.valueOf(); return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf(); } } function isSameOrAfter (input, units) { return this.isSame(input, units) || this.isAfter(input, units); } function isSameOrBefore (input, units) { return this.isSame(input, units) || this.isBefore(input, units); } function diff (input, units, asFloat) {\n        var that, zoneDelta, delta, output; if (!this.isValid()) { return NaN; }that = cloneWithOffset(input, this); if (!that.isValid()) { return NaN; }zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4; units = normalizeUnits(units); if (units === 'year' || units === 'month' || units === 'quarter') { output = monthDiff(this, that); if (units === 'quarter') { output = output / 3; } else if (units === 'year') { output = output / 12; } } else {\n          delta = this - that; output = units === 'second' ? delta / 1e3 : units === 'minute' ? delta / 6e4 : units === 'hour' ? delta / 36e5 : units === 'day' ? (delta - zoneDelta) / 864e5 : units === 'week' ? (delta - zoneDelta) / 6048e5 : delta;\n        } return asFloat ? output : absFloor(output);\n      } function monthDiff (a, b) { var wholeMonthDiff = (b.year() - a.year()) * 12 + (b.month() - a.month()); var anchor = a.clone().add(wholeMonthDiff, 'months'); var anchor2; var adjust; if (b - anchor < 0) { anchor2 = a.clone().add(wholeMonthDiff - 1, 'months'); adjust = (b - anchor) / (anchor - anchor2); } else { anchor2 = a.clone().add(wholeMonthDiff + 1, 'months'); adjust = (b - anchor) / (anchor2 - anchor); } return -(wholeMonthDiff + adjust) || 0; }utils_hooks__hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ'; utils_hooks__hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]'; function toString () { return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); } function moment_format__toISOString () { var m = this.clone().utc(); if (m.year() > 0 && m.year() <= 9999) { if (isFunction(Date.prototype.toISOString)) { return this.toDate().toISOString(); } else { return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); } } else { return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); } } function format (inputString) { if (!inputString) { inputString = this.isUtc() ? utils_hooks__hooks.defaultFormatUtc : utils_hooks__hooks.defaultFormat; } var output = formatMoment(this, inputString); return this.localeData().postformat(output); } function from (time, withoutSuffix) { if (this.isValid() && (isMoment(time) && time.isValid() || local__createLocal(time).isValid())) { return create__createDuration({ to: this, from: time }).locale(this.locale()).humanize(!withoutSuffix); } else { return this.localeData().invalidDate(); } } function fromNow (withoutSuffix) { return this.from(local__createLocal(), withoutSuffix); } function to (time, withoutSuffix) { if (this.isValid() && (isMoment(time) && time.isValid() || local__createLocal(time).isValid())) { return create__createDuration({ from: this, to: time }).locale(this.locale()).humanize(!withoutSuffix); } else { return this.localeData().invalidDate(); } } function toNow (withoutSuffix) { return this.to(local__createLocal(), withoutSuffix); } function locale (key) { var newLocaleData; if (key === undefined) { return this._locale._abbr; } else { newLocaleData = locale_locales__getLocale(key); if (newLocaleData != null) { this._locale = newLocaleData; } return this; } } var lang = deprecate('moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.', function (key) { if (key === undefined) { return this.localeData(); } else { return this.locale(key); } }); function localeData () { return this._locale; } function startOf (units) { units = normalizeUnits(units); switch (units) { case 'year':this.month(0); case 'quarter':case 'month':this.date(1); case 'week':case 'isoWeek':case 'day':case 'date':this.hours(0); case 'hour':this.minutes(0); case 'minute':this.seconds(0); case 'second':this.milliseconds(0); } if (units === 'week') { this.weekday(0); } if (units === 'isoWeek') { this.isoWeekday(1); } if (units === 'quarter') { this.month(Math.floor(this.month() / 3) * 3); } return this; } function endOf (units) { units = normalizeUnits(units); if (units === undefined || units === 'millisecond') { return this; } if (units === 'date') { units = 'day'; } return this.startOf(units).add(1, units === 'isoWeek' ? 'week' : units).subtract(1, 'ms'); } function to_type__valueOf () { return this._d.valueOf() - (this._offset || 0) * 6e4; } function unix () { return Math.floor(this.valueOf() / 1e3); } function toDate () { return new Date(this.valueOf()); } function toArray () { var m = this; return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()]; } function toObject () { var m = this; return { years: m.year(), months: m.month(), date: m.date(), hours: m.hours(), minutes: m.minutes(), seconds: m.seconds(), milliseconds: m.milliseconds() }; } function toJSON () { return this.isValid() ? this.toISOString() : null; } function moment_valid__isValid () { return valid__isValid(this); } function parsingFlags () { return extend({}, getParsingFlags(this)); } function invalidAt () { return getParsingFlags(this).overflow; } function creationData () { return { input: this._i, format: this._f, locale: this._locale, isUTC: this._isUTC, strict: this._strict }; }addFormatToken(0, ['gg', 2], 0, function () { return this.weekYear() % 100; }); addFormatToken(0, ['GG', 2], 0, function () { return this.isoWeekYear() % 100; }); function addWeekYearFormatToken (token, getter) { addFormatToken(0, [token, token.length], 0, getter); }addWeekYearFormatToken('gggg', 'weekYear'); addWeekYearFormatToken('ggggg', 'weekYear'); addWeekYearFormatToken('GGGG', 'isoWeekYear'); addWeekYearFormatToken('GGGGG', 'isoWeekYear'); addUnitAlias('weekYear', 'gg'); addUnitAlias('isoWeekYear', 'GG'); addUnitPriority('weekYear', 1); addUnitPriority('isoWeekYear', 1); addRegexToken('G', matchSigned); addRegexToken('g', matchSigned); addRegexToken('GG', match1to2, match2); addRegexToken('gg', match1to2, match2); addRegexToken('GGGG', match1to4, match4); addRegexToken('gggg', match1to4, match4); addRegexToken('GGGGG', match1to6, match6); addRegexToken('ggggg', match1to6, match6); addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) { week[token.substr(0, 2)] = toInt(input); }); addWeekParseToken(['gg', 'GG'], function (input, week, config, token) { week[token] = utils_hooks__hooks.parseTwoDigitYear(input); }); function getSetWeekYear (input) { return getSetWeekYearHelper.call(this, input, this.week(), this.weekday(), this.localeData()._week.dow, this.localeData()._week.doy); } function getSetISOWeekYear (input) { return getSetWeekYearHelper.call(this, input, this.isoWeek(), this.isoWeekday(), 1, 4); } function getISOWeeksInYear () { return weeksInYear(this.year(), 1, 4); } function getWeeksInYear () { var weekInfo = this.localeData()._week; return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); } function getSetWeekYearHelper (input, week, weekday, dow, doy) { var weeksTarget; if (input == null) { return weekOfYear(this, dow, doy).year; } else { weeksTarget = weeksInYear(input, dow, doy); if (week > weeksTarget) { week = weeksTarget; } return setWeekAll.call(this, input, week, weekday, dow, doy); } } function setWeekAll (weekYear, week, weekday, dow, doy) { var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy); var date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear); this.year(date.getUTCFullYear()); this.month(date.getUTCMonth()); this.date(date.getUTCDate()); return this; }addFormatToken('Q', 0, 'Qo', 'quarter'); addUnitAlias('quarter', 'Q'); addUnitPriority('quarter', 7); addRegexToken('Q', match1); addParseToken('Q', function (input, array) { array[MONTH] = (toInt(input) - 1) * 3; }); function getSetQuarter (input) { return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3); }addFormatToken('D', ['DD', 2], 'Do', 'date'); addUnitAlias('date', 'D'); addUnitPriority('date', 9); addRegexToken('D', match1to2); addRegexToken('DD', match1to2, match2); addRegexToken('Do', function (isStrict, locale) { return isStrict ? locale._ordinalParse : locale._ordinalParseLenient; }); addParseToken(['D', 'DD'], DATE); addParseToken('Do', function (input, array) { array[DATE] = toInt(input.match(match1to2)[0], 10); }); var getSetDayOfMonth = makeGetSet('Date', true); addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear'); addUnitAlias('dayOfYear', 'DDD'); addUnitPriority('dayOfYear', 4); addRegexToken('DDD', match1to3); addRegexToken('DDDD', match3); addParseToken(['DDD', 'DDDD'], function (input, array, config) { config._dayOfYear = toInt(input); }); function getSetDayOfYear (input) { var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1; return input == null ? dayOfYear : this.add(input - dayOfYear, 'd'); }addFormatToken('m', ['mm', 2], 0, 'minute'); addUnitAlias('minute', 'm'); addUnitPriority('minute', 14); addRegexToken('m', match1to2); addRegexToken('mm', match1to2, match2); addParseToken(['m', 'mm'], MINUTE); var getSetMinute = makeGetSet('Minutes', false); addFormatToken('s', ['ss', 2], 0, 'second'); addUnitAlias('second', 's'); addUnitPriority('second', 15); addRegexToken('s', match1to2); addRegexToken('ss', match1to2, match2); addParseToken(['s', 'ss'], SECOND); var getSetSecond = makeGetSet('Seconds', false); addFormatToken('S', 0, 0, function () { return ~~(this.millisecond() / 100); }); addFormatToken(0, ['SS', 2], 0, function () { return ~~(this.millisecond() / 10); }); addFormatToken(0, ['SSS', 3], 0, 'millisecond'); addFormatToken(0, ['SSSS', 4], 0, function () { return this.millisecond() * 10; }); addFormatToken(0, ['SSSSS', 5], 0, function () { return this.millisecond() * 100; }); addFormatToken(0, ['SSSSSS', 6], 0, function () { return this.millisecond() * 1e3; }); addFormatToken(0, ['SSSSSSS', 7], 0, function () { return this.millisecond() * 1e4; }); addFormatToken(0, ['SSSSSSSS', 8], 0, function () { return this.millisecond() * 1e5; }); addFormatToken(0, ['SSSSSSSSS', 9], 0, function () { return this.millisecond() * 1e6; }); addUnitAlias('millisecond', 'ms'); addUnitPriority('millisecond', 16); addRegexToken('S', match1to3, match1); addRegexToken('SS', match1to3, match2); addRegexToken('SSS', match1to3, match3); var token; for (token = 'SSSS'; token.length <= 9; token += 'S') { addRegexToken(token, matchUnsigned); } function parseMs (input, array) { array[MILLISECOND] = toInt(('0.' + input) * 1e3); } for (token = 'S'; token.length <= 9; token += 'S') { addParseToken(token, parseMs); } var getSetMillisecond = makeGetSet('Milliseconds', false); addFormatToken('z', 0, 0, 'zoneAbbr'); addFormatToken('zz', 0, 0, 'zoneName'); function getZoneAbbr () { return this._isUTC ? 'UTC' : ''; } function getZoneName () { return this._isUTC ? 'Coordinated Universal Time' : ''; } var momentPrototype__proto = Moment.prototype; momentPrototype__proto.add = add_subtract__add; momentPrototype__proto.calendar = moment_calendar__calendar; momentPrototype__proto.clone = clone; momentPrototype__proto.diff = diff; momentPrototype__proto.endOf = endOf; momentPrototype__proto.format = format; momentPrototype__proto.from = from; momentPrototype__proto.fromNow = fromNow; momentPrototype__proto.to = to; momentPrototype__proto.toNow = toNow; momentPrototype__proto.get = stringGet; momentPrototype__proto.invalidAt = invalidAt; momentPrototype__proto.isAfter = isAfter; momentPrototype__proto.isBefore = isBefore; momentPrototype__proto.isBetween = isBetween; momentPrototype__proto.isSame = isSame; momentPrototype__proto.isSameOrAfter = isSameOrAfter; momentPrototype__proto.isSameOrBefore = isSameOrBefore; momentPrototype__proto.isValid = moment_valid__isValid; momentPrototype__proto.lang = lang; momentPrototype__proto.locale = locale; momentPrototype__proto.localeData = localeData; momentPrototype__proto.max = prototypeMax; momentPrototype__proto.min = prototypeMin; momentPrototype__proto.parsingFlags = parsingFlags; momentPrototype__proto.set = stringSet; momentPrototype__proto.startOf = startOf; momentPrototype__proto.subtract = add_subtract__subtract; momentPrototype__proto.toArray = toArray; momentPrototype__proto.toObject = toObject; momentPrototype__proto.toDate = toDate; momentPrototype__proto.toISOString = moment_format__toISOString; momentPrototype__proto.toJSON = toJSON; momentPrototype__proto.toString = toString; momentPrototype__proto.unix = unix; momentPrototype__proto.valueOf = to_type__valueOf; momentPrototype__proto.creationData = creationData; momentPrototype__proto.year = getSetYear; momentPrototype__proto.isLeapYear = getIsLeapYear; momentPrototype__proto.weekYear = getSetWeekYear; momentPrototype__proto.isoWeekYear = getSetISOWeekYear; momentPrototype__proto.quarter = momentPrototype__proto.quarters = getSetQuarter; momentPrototype__proto.month = getSetMonth; momentPrototype__proto.daysInMonth = getDaysInMonth; momentPrototype__proto.week = momentPrototype__proto.weeks = getSetWeek; momentPrototype__proto.isoWeek = momentPrototype__proto.isoWeeks = getSetISOWeek; momentPrototype__proto.weeksInYear = getWeeksInYear; momentPrototype__proto.isoWeeksInYear = getISOWeeksInYear; momentPrototype__proto.date = getSetDayOfMonth; momentPrototype__proto.day = momentPrototype__proto.days = getSetDayOfWeek; momentPrototype__proto.weekday = getSetLocaleDayOfWeek; momentPrototype__proto.isoWeekday = getSetISODayOfWeek; momentPrototype__proto.dayOfYear = getSetDayOfYear; momentPrototype__proto.hour = momentPrototype__proto.hours = getSetHour; momentPrototype__proto.minute = momentPrototype__proto.minutes = getSetMinute; momentPrototype__proto.second = momentPrototype__proto.seconds = getSetSecond; momentPrototype__proto.millisecond = momentPrototype__proto.milliseconds = getSetMillisecond; momentPrototype__proto.utcOffset = getSetOffset; momentPrototype__proto.utc = setOffsetToUTC; momentPrototype__proto.local = setOffsetToLocal; momentPrototype__proto.parseZone = setOffsetToParsedOffset; momentPrototype__proto.hasAlignedHourOffset = hasAlignedHourOffset; momentPrototype__proto.isDST = isDaylightSavingTime; momentPrototype__proto.isLocal = isLocal; momentPrototype__proto.isUtcOffset = isUtcOffset; momentPrototype__proto.isUtc = isUtc; momentPrototype__proto.isUTC = isUtc; momentPrototype__proto.zoneAbbr = getZoneAbbr; momentPrototype__proto.zoneName = getZoneName; momentPrototype__proto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth); momentPrototype__proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth); momentPrototype__proto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear); momentPrototype__proto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone); momentPrototype__proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted); var momentPrototype = momentPrototype__proto; function moment__createUnix (input) { return local__createLocal(input * 1e3); } function moment__createInZone () { return local__createLocal.apply(null, arguments).parseZone(); } function preParsePostFormat (string) { return string; } var prototype__proto = Locale.prototype; prototype__proto.calendar = locale_calendar__calendar; prototype__proto.longDateFormat = longDateFormat; prototype__proto.invalidDate = invalidDate; prototype__proto.ordinal = ordinal; prototype__proto.preparse = preParsePostFormat; prototype__proto.postformat = preParsePostFormat; prototype__proto.relativeTime = relative__relativeTime; prototype__proto.pastFuture = pastFuture; prototype__proto.set = locale_set__set; prototype__proto.months = localeMonths; prototype__proto.monthsShort = localeMonthsShort; prototype__proto.monthsParse = localeMonthsParse; prototype__proto.monthsRegex = monthsRegex; prototype__proto.monthsShortRegex = monthsShortRegex; prototype__proto.week = localeWeek; prototype__proto.firstDayOfYear = localeFirstDayOfYear; prototype__proto.firstDayOfWeek = localeFirstDayOfWeek; prototype__proto.weekdays = localeWeekdays; prototype__proto.weekdaysMin = localeWeekdaysMin; prototype__proto.weekdaysShort = localeWeekdaysShort; prototype__proto.weekdaysParse = localeWeekdaysParse; prototype__proto.weekdaysRegex = weekdaysRegex; prototype__proto.weekdaysShortRegex = weekdaysShortRegex; prototype__proto.weekdaysMinRegex = weekdaysMinRegex; prototype__proto.isPM = localeIsPM; prototype__proto.meridiem = localeMeridiem; function lists__get (format, index, field, setter) { var locale = locale_locales__getLocale(); var utc = create_utc__createUTC().set(setter, index); return locale[field](utc, format); } function listMonthsImpl (format, index, field) { if (typeof format === 'number') { index = format; format = undefined; }format = format || ''; if (index != null) { return lists__get(format, index, field, 'month'); } var i; var out = []; for (i = 0; i < 12; i++) { out[i] = lists__get(format, i, field, 'month'); } return out; } function listWeekdaysImpl (localeSorted, format, index, field) { if (typeof localeSorted === 'boolean') { if (typeof format === 'number') { index = format; format = undefined; }format = format || ''; } else { format = localeSorted; index = format; localeSorted = false; if (typeof format === 'number') { index = format; format = undefined; }format = format || ''; } var locale = locale_locales__getLocale(); var shift = localeSorted ? locale._week.dow : 0; if (index != null) { return lists__get(format, (index + shift) % 7, field, 'day'); } var i; var out = []; for (i = 0; i < 7; i++) { out[i] = lists__get(format, (i + shift) % 7, field, 'day'); } return out; } function lists__listMonths (format, index) { return listMonthsImpl(format, index, 'months'); } function lists__listMonthsShort (format, index) { return listMonthsImpl(format, index, 'monthsShort'); } function lists__listWeekdays (localeSorted, format, index) { return listWeekdaysImpl(localeSorted, format, index, 'weekdays'); } function lists__listWeekdaysShort (localeSorted, format, index) { return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort'); } function lists__listWeekdaysMin (localeSorted, format, index) { return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin'); }locale_locales__getSetGlobalLocale('en', { ordinalParse: /\\d{1,2}(th|st|nd|rd)/, ordinal: function (number) { var b = number % 10; var output = toInt(number % 100 / 10) === 1 ? 'th' : b === 1 ? 'st' : b === 2 ? 'nd' : b === 3 ? 'rd' : 'th'; return number + output; } }); utils_hooks__hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', locale_locales__getSetGlobalLocale); utils_hooks__hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', locale_locales__getLocale); var mathAbs = Math.abs; function duration_abs__abs () { var data = this._data; this._milliseconds = mathAbs(this._milliseconds); this._days = mathAbs(this._days); this._months = mathAbs(this._months); data.milliseconds = mathAbs(data.milliseconds); data.seconds = mathAbs(data.seconds); data.minutes = mathAbs(data.minutes); data.hours = mathAbs(data.hours); data.months = mathAbs(data.months); data.years = mathAbs(data.years); return this; } function duration_add_subtract__addSubtract (duration, input, value, direction) { var other = create__createDuration(input, value); duration._milliseconds += direction * other._milliseconds; duration._days += direction * other._days; duration._months += direction * other._months; return duration._bubble(); } function duration_add_subtract__add (input, value) { return duration_add_subtract__addSubtract(this, input, value, 1); } function duration_add_subtract__subtract (input, value) { return duration_add_subtract__addSubtract(this, input, value, -1); } function absCeil (number) { if (number < 0) { return Math.floor(number); } else { return Math.ceil(number); } } function bubble () { var milliseconds = this._milliseconds; var days = this._days; var months = this._months; var data = this._data; var seconds, minutes, hours, years, monthsFromDays; if (!(milliseconds >= 0 && days >= 0 && months >= 0 || milliseconds <= 0 && days <= 0 && months <= 0)) { milliseconds += absCeil(monthsToDays(months) + days) * 864e5; days = 0; months = 0; }data.milliseconds = milliseconds % 1e3; seconds = absFloor(milliseconds / 1e3); data.seconds = seconds % 60; minutes = absFloor(seconds / 60); data.minutes = minutes % 60; hours = absFloor(minutes / 60); data.hours = hours % 24; days += absFloor(hours / 24); monthsFromDays = absFloor(daysToMonths(days)); months += monthsFromDays; days -= absCeil(monthsToDays(monthsFromDays)); years = absFloor(months / 12); months %= 12; data.days = days; data.months = months; data.years = years; return this; } function daysToMonths (days) { return days * 4800 / 146097; } function monthsToDays (months) { return months * 146097 / 4800; } function as (units) { var days; var months; var milliseconds = this._milliseconds; units = normalizeUnits(units); if (units === 'month' || units === 'year') { days = this._days + milliseconds / 864e5; months = this._months + daysToMonths(days); return units === 'month' ? months : months / 12; } else { days = this._days + Math.round(monthsToDays(this._months)); switch (units) { case 'week':return days / 7 + milliseconds / 6048e5; case 'day':return days + milliseconds / 864e5; case 'hour':return days * 24 + milliseconds / 36e5; case 'minute':return days * 1440 + milliseconds / 6e4; case 'second':return days * 86400 + milliseconds / 1e3; case 'millisecond':return Math.floor(days * 864e5) + milliseconds; default:throw new Error('Unknown unit ' + units); } } } function duration_as__valueOf () { return this._milliseconds + this._days * 864e5 + this._months % 12 * 2592e6 + toInt(this._months / 12) * 31536e6; } function makeAs (alias) { return function () { return this.as(alias); }; } var asMilliseconds = makeAs('ms'); var asSeconds = makeAs('s'); var asMinutes = makeAs('m'); var asHours = makeAs('h'); var asDays = makeAs('d'); var asWeeks = makeAs('w'); var asMonths = makeAs('M'); var asYears = makeAs('y'); function duration_get__get (units) { units = normalizeUnits(units); return this[units + 's'](); } function makeGetter (name) { return function () { return this._data[name]; }; } var milliseconds = makeGetter('milliseconds'); var seconds = makeGetter('seconds'); var minutes = makeGetter('minutes'); var hours = makeGetter('hours'); var days = makeGetter('days'); var months = makeGetter('months'); var years = makeGetter('years'); function weeks () { return absFloor(this.days() / 7); } var round = Math.round; var thresholds = { s: 45, m: 45, h: 22, d: 26, M: 11 }; function substituteTimeAgo (string, number, withoutSuffix, isFuture, locale) { return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture); } function duration_humanize__relativeTime (posNegDuration, withoutSuffix, locale) { var duration = create__createDuration(posNegDuration).abs(); var seconds = round(duration.as('s')); var minutes = round(duration.as('m')); var hours = round(duration.as('h')); var days = round(duration.as('d')); var months = round(duration.as('M')); var years = round(duration.as('y')); var a = seconds < thresholds.s && ['s', seconds] || minutes <= 1 && ['m'] || minutes < thresholds.m && ['mm', minutes] || hours <= 1 && ['h'] || hours < thresholds.h && ['hh', hours] || days <= 1 && ['d'] || days < thresholds.d && ['dd', days] || months <= 1 && ['M'] || months < thresholds.M && ['MM', months] || years <= 1 && ['y'] || ['yy', years]; a[2] = withoutSuffix; a[3] = +posNegDuration > 0; a[4] = locale; return substituteTimeAgo.apply(null, a); } function duration_humanize__getSetRelativeTimeRounding (roundingFunction) { if (roundingFunction === undefined) { return round; } if (typeof roundingFunction === 'function') { round = roundingFunction; return true; } return false; } function duration_humanize__getSetRelativeTimeThreshold (threshold, limit) { if (thresholds[threshold] === undefined) { return false; } if (limit === undefined) { return thresholds[threshold]; }thresholds[threshold] = limit; return true; } function humanize (withSuffix) { var locale = this.localeData(); var output = duration_humanize__relativeTime(this, !withSuffix, locale); if (withSuffix) { output = locale.pastFuture(+this, output); } return locale.postformat(output); } var iso_string__abs = Math.abs; function iso_string__toISOString () { var seconds = iso_string__abs(this._milliseconds) / 1e3; var days = iso_string__abs(this._days); var months = iso_string__abs(this._months); var minutes, hours, years; minutes = absFloor(seconds / 60); hours = absFloor(minutes / 60); seconds %= 60; minutes %= 60; years = absFloor(months / 12); months %= 12; var Y = years; var M = months; var D = days; var h = hours; var m = minutes; var s = seconds; var total = this.asSeconds(); if (!total) { return 'P0D'; } return (total < 0 ? '-' : '') + 'P' + (Y ? Y + 'Y' : '') + (M ? M + 'M' : '') + (D ? D + 'D' : '') + (h || m || s ? 'T' : '') + (h ? h + 'H' : '') + (m ? m + 'M' : '') + (s ? s + 'S' : ''); } var duration_prototype__proto = Duration.prototype; duration_prototype__proto.abs = duration_abs__abs; duration_prototype__proto.add = duration_add_subtract__add; duration_prototype__proto.subtract = duration_add_subtract__subtract; duration_prototype__proto.as = as; duration_prototype__proto.asMilliseconds = asMilliseconds; duration_prototype__proto.asSeconds = asSeconds; duration_prototype__proto.asMinutes = asMinutes; duration_prototype__proto.asHours = asHours; duration_prototype__proto.asDays = asDays; duration_prototype__proto.asWeeks = asWeeks; duration_prototype__proto.asMonths = asMonths; duration_prototype__proto.asYears = asYears; duration_prototype__proto.valueOf = duration_as__valueOf; duration_prototype__proto._bubble = bubble; duration_prototype__proto.get = duration_get__get; duration_prototype__proto.milliseconds = milliseconds; duration_prototype__proto.seconds = seconds; duration_prototype__proto.minutes = minutes; duration_prototype__proto.hours = hours; duration_prototype__proto.days = days; duration_prototype__proto.weeks = weeks; duration_prototype__proto.months = months; duration_prototype__proto.years = years; duration_prototype__proto.humanize = humanize; duration_prototype__proto.toISOString = iso_string__toISOString; duration_prototype__proto.toString = iso_string__toISOString; duration_prototype__proto.toJSON = iso_string__toISOString; duration_prototype__proto.locale = locale; duration_prototype__proto.localeData = localeData; duration_prototype__proto.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', iso_string__toISOString); duration_prototype__proto.lang = lang; addFormatToken('X', 0, 0, 'unix'); addFormatToken('x', 0, 0, 'valueOf'); addRegexToken('x', matchSigned); addRegexToken('X', matchTimestamp); addParseToken('X', function (input, array, config) { config._d = new Date(parseFloat(input, 10) * 1e3); }); addParseToken('x', function (input, array, config) { config._d = new Date(toInt(input)); }); utils_hooks__hooks.version = '2.14.1'; setHookCallback(local__createLocal); utils_hooks__hooks.fn = momentPrototype; utils_hooks__hooks.min = min; utils_hooks__hooks.max = max; utils_hooks__hooks.now = now; utils_hooks__hooks.utc = create_utc__createUTC; utils_hooks__hooks.unix = moment__createUnix; utils_hooks__hooks.months = lists__listMonths; utils_hooks__hooks.isDate = isDate; utils_hooks__hooks.locale = locale_locales__getSetGlobalLocale; utils_hooks__hooks.invalid = valid__createInvalid; utils_hooks__hooks.duration = create__createDuration; utils_hooks__hooks.isMoment = isMoment; utils_hooks__hooks.weekdays = lists__listWeekdays; utils_hooks__hooks.parseZone = moment__createInZone; utils_hooks__hooks.localeData = locale_locales__getLocale; utils_hooks__hooks.isDuration = isDuration; utils_hooks__hooks.monthsShort = lists__listMonthsShort; utils_hooks__hooks.weekdaysMin = lists__listWeekdaysMin; utils_hooks__hooks.defineLocale = defineLocale; utils_hooks__hooks.updateLocale = updateLocale; utils_hooks__hooks.locales = locale_locales__listLocales; utils_hooks__hooks.weekdaysShort = lists__listWeekdaysShort; utils_hooks__hooks.normalizeUnits = normalizeUnits; utils_hooks__hooks.relativeTimeRounding = duration_humanize__getSetRelativeTimeRounding; utils_hooks__hooks.relativeTimeThreshold = duration_humanize__getSetRelativeTimeThreshold; utils_hooks__hooks.calendarFormat = getCalendarFormat; utils_hooks__hooks.prototype = momentPrototype; var _moment = utils_hooks__hooks; return _moment;\n    });\n  }, {}],\n  9: [function (require, module, exports) { 'use strict'; var focusNode = require('./focusNode'); var AutoFocusMixin = { componentDidMount: function () { if (this.props.autoFocus) { focusNode(this.getDOMNode()); } } }; module.exports = AutoFocusMixin; }, { './focusNode': 127 }],\n  10: [function (require, module, exports) { 'use strict'; var EventConstants = require('./EventConstants'); var EventPropagators = require('./EventPropagators'); var ExecutionEnvironment = require('./ExecutionEnvironment'); var FallbackCompositionState = require('./FallbackCompositionState'); var SyntheticCompositionEvent = require('./SyntheticCompositionEvent'); var SyntheticInputEvent = require('./SyntheticInputEvent'); var keyOf = require('./keyOf'); var END_KEYCODES = [9, 13, 27, 32]; var START_KEYCODE = 229; var canUseCompositionEvent = ExecutionEnvironment.canUseDOM && 'CompositionEvent' in window; var documentMode = null; if (ExecutionEnvironment.canUseDOM && 'documentMode' in document) { documentMode = document.documentMode; } var canUseTextInputEvent = ExecutionEnvironment.canUseDOM && 'TextEvent' in window && !documentMode && !isPresto(); var useFallbackCompositionData = ExecutionEnvironment.canUseDOM && (!canUseCompositionEvent || documentMode && documentMode > 8 && documentMode <= 11); function isPresto () { var opera = window.opera; return typeof opera === 'object' && typeof opera.version === 'function' && parseInt(opera.version(), 10) <= 12; } var SPACEBAR_CODE = 32; var SPACEBAR_CHAR = String.fromCharCode(SPACEBAR_CODE); var topLevelTypes = EventConstants.topLevelTypes; var eventTypes = { beforeInput: { phasedRegistrationNames: { bubbled: keyOf({ onBeforeInput: null }), captured: keyOf({ onBeforeInputCapture: null }) }, dependencies: [topLevelTypes.topCompositionEnd, topLevelTypes.topKeyPress, topLevelTypes.topTextInput, topLevelTypes.topPaste] }, compositionEnd: { phasedRegistrationNames: { bubbled: keyOf({ onCompositionEnd: null }), captured: keyOf({ onCompositionEndCapture: null }) }, dependencies: [topLevelTypes.topBlur, topLevelTypes.topCompositionEnd, topLevelTypes.topKeyDown, topLevelTypes.topKeyPress, topLevelTypes.topKeyUp, topLevelTypes.topMouseDown] }, compositionStart: { phasedRegistrationNames: { bubbled: keyOf({ onCompositionStart: null }), captured: keyOf({ onCompositionStartCapture: null }) }, dependencies: [topLevelTypes.topBlur, topLevelTypes.topCompositionStart, topLevelTypes.topKeyDown, topLevelTypes.topKeyPress, topLevelTypes.topKeyUp, topLevelTypes.topMouseDown] }, compositionUpdate: { phasedRegistrationNames: { bubbled: keyOf({ onCompositionUpdate: null }), captured: keyOf({ onCompositionUpdateCapture: null }) }, dependencies: [topLevelTypes.topBlur, topLevelTypes.topCompositionUpdate, topLevelTypes.topKeyDown, topLevelTypes.topKeyPress, topLevelTypes.topKeyUp, topLevelTypes.topMouseDown] } }; var hasSpaceKeypress = false; function isKeypressCommand (nativeEvent) { return (nativeEvent.ctrlKey || nativeEvent.altKey || nativeEvent.metaKey) && !(nativeEvent.ctrlKey && nativeEvent.altKey); } function getCompositionEventType (topLevelType) { switch (topLevelType) { case topLevelTypes.topCompositionStart:return eventTypes.compositionStart; case topLevelTypes.topCompositionEnd:return eventTypes.compositionEnd; case topLevelTypes.topCompositionUpdate:return eventTypes.compositionUpdate; } } function isFallbackCompositionStart (topLevelType, nativeEvent) { return topLevelType === topLevelTypes.topKeyDown && nativeEvent.keyCode === START_KEYCODE; } function isFallbackCompositionEnd (topLevelType, nativeEvent) { switch (topLevelType) { case topLevelTypes.topKeyUp:return END_KEYCODES.indexOf(nativeEvent.keyCode) !== -1; case topLevelTypes.topKeyDown:return nativeEvent.keyCode !== START_KEYCODE; case topLevelTypes.topKeyPress:case topLevelTypes.topMouseDown:case topLevelTypes.topBlur:return true; default:return false; } } function getDataFromCustomEvent (nativeEvent) { var detail = nativeEvent.detail; if (typeof detail === 'object' && 'data' in detail) { return detail.data; } return null; } var currentComposition = null; function extractCompositionEvent (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent) { var eventType; var fallbackData; if (canUseCompositionEvent) { eventType = getCompositionEventType(topLevelType); } else if (!currentComposition) { if (isFallbackCompositionStart(topLevelType, nativeEvent)) { eventType = eventTypes.compositionStart; } } else if (isFallbackCompositionEnd(topLevelType, nativeEvent)) { eventType = eventTypes.compositionEnd; } if (!eventType) { return null; } if (useFallbackCompositionData) { if (!currentComposition && eventType === eventTypes.compositionStart) { currentComposition = FallbackCompositionState.getPooled(topLevelTarget); } else if (eventType === eventTypes.compositionEnd) { if (currentComposition) { fallbackData = currentComposition.getData(); } } } var event = SyntheticCompositionEvent.getPooled(eventType, topLevelTargetID, nativeEvent); if (fallbackData) { event.data = fallbackData; } else { var customData = getDataFromCustomEvent(nativeEvent); if (customData !== null) { event.data = customData; } }EventPropagators.accumulateTwoPhaseDispatches(event); return event; } function getNativeBeforeInputChars (topLevelType, nativeEvent) { switch (topLevelType) { case topLevelTypes.topCompositionEnd:return getDataFromCustomEvent(nativeEvent); case topLevelTypes.topKeyPress:var which = nativeEvent.which; if (which !== SPACEBAR_CODE) { return null; }hasSpaceKeypress = true; return SPACEBAR_CHAR; case topLevelTypes.topTextInput:var chars = nativeEvent.data; if (chars === SPACEBAR_CHAR && hasSpaceKeypress) { return null; } return chars; default:return null; } } function getFallbackBeforeInputChars (topLevelType, nativeEvent) { if (currentComposition) { if (topLevelType === topLevelTypes.topCompositionEnd || isFallbackCompositionEnd(topLevelType, nativeEvent)) { var chars = currentComposition.getData(); FallbackCompositionState.release(currentComposition); currentComposition = null; return chars; } return null; } switch (topLevelType) { case topLevelTypes.topPaste:return null; case topLevelTypes.topKeyPress:if (nativeEvent.which && !isKeypressCommand(nativeEvent)) { return String.fromCharCode(nativeEvent.which); } return null; case topLevelTypes.topCompositionEnd:return useFallbackCompositionData ? null : nativeEvent.data; default:return null; } } function extractBeforeInputEvent (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent) { var chars; if (canUseTextInputEvent) { chars = getNativeBeforeInputChars(topLevelType, nativeEvent); } else { chars = getFallbackBeforeInputChars(topLevelType, nativeEvent); } if (!chars) { return null; } var event = SyntheticInputEvent.getPooled(eventTypes.beforeInput, topLevelTargetID, nativeEvent); event.data = chars; EventPropagators.accumulateTwoPhaseDispatches(event); return event; } var BeforeInputEventPlugin = { eventTypes: eventTypes, extractEvents: function (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent) { return [extractCompositionEvent(topLevelType, topLevelTarget, topLevelTargetID, nativeEvent), extractBeforeInputEvent(topLevelType, topLevelTarget, topLevelTargetID, nativeEvent)]; } }; module.exports = BeforeInputEventPlugin; }, { './EventConstants': 22,\n    './EventPropagators': 27,\n    './ExecutionEnvironment': 28,\n    './FallbackCompositionState': 29,\n    './SyntheticCompositionEvent': 101,\n    './SyntheticInputEvent': 105,\n    './keyOf': 149 }],\n  11: [function (require, module, exports) { 'use strict'; var isUnitlessNumber = { boxFlex: true, boxFlexGroup: true, columnCount: true, flex: true, flexGrow: true, flexPositive: true, flexShrink: true, flexNegative: true, fontWeight: true, lineClamp: true, lineHeight: true, opacity: true, order: true, orphans: true, widows: true, zIndex: true, zoom: true, fillOpacity: true, strokeDashoffset: true, strokeOpacity: true, strokeWidth: true }; function prefixKey (prefix, key) { return prefix + key.charAt(0).toUpperCase() + key.substring(1); } var prefixes = ['Webkit', 'ms', 'Moz', 'O']; Object.keys(isUnitlessNumber).forEach(function (prop) { prefixes.forEach(function (prefix) { isUnitlessNumber[prefixKey(prefix, prop)] = isUnitlessNumber[prop]; }); }); var shorthandPropertyExpansions = { background: { backgroundImage: true, backgroundPosition: true, backgroundRepeat: true, backgroundColor: true }, border: { borderWidth: true, borderStyle: true, borderColor: true }, borderBottom: { borderBottomWidth: true, borderBottomStyle: true, borderBottomColor: true }, borderLeft: { borderLeftWidth: true, borderLeftStyle: true, borderLeftColor: true }, borderRight: { borderRightWidth: true, borderRightStyle: true, borderRightColor: true }, borderTop: { borderTopWidth: true, borderTopStyle: true, borderTopColor: true }, font: { fontStyle: true, fontVariant: true, fontWeight: true, fontSize: true, lineHeight: true, fontFamily: true } }; var CSSProperty = { isUnitlessNumber: isUnitlessNumber, shorthandPropertyExpansions: shorthandPropertyExpansions }; module.exports = CSSProperty; }, {}],\n  12: [function (require, module, exports) { 'use strict'; var CSSProperty = require('./CSSProperty'); var ExecutionEnvironment = require('./ExecutionEnvironment'); var camelizeStyleName = require('./camelizeStyleName'); var dangerousStyleValue = require('./dangerousStyleValue'); var hyphenateStyleName = require('./hyphenateStyleName'); var memoizeStringOnly = require('./memoizeStringOnly'); var warning = require('./warning'); var processStyleName = memoizeStringOnly(function (styleName) { return hyphenateStyleName(styleName); }); var styleFloatAccessor = 'cssFloat'; if (ExecutionEnvironment.canUseDOM) { if (document.documentElement.style.cssFloat === undefined) { styleFloatAccessor = 'styleFloat'; } } if ('production' !== 'production') { var badVendoredStyleNamePattern = /^(?:webkit|moz|o)[A-Z]/; var badStyleValueWithSemicolonPattern = /;\\s*$/; var warnedStyleNames = {}; var warnedStyleValues = {}; var warnHyphenatedStyleName = function (name) { if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) { return; }warnedStyleNames[name] = true; 'production' !== 'production' ? warning(false, 'Unsupported style property %s. Did you mean %s?', name, camelizeStyleName(name)) : null; }; var warnBadVendoredStyleName = function (name) { if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) { return; }warnedStyleNames[name] = true; 'production' !== 'production' ? warning(false, 'Unsupported vendor-prefixed style property %s. Did you mean %s?', name, name.charAt(0).toUpperCase() + name.slice(1)) : null; }; var warnStyleValueWithSemicolon = function (name, value) { if (warnedStyleValues.hasOwnProperty(value) && warnedStyleValues[value]) { return; }warnedStyleValues[value] = true; 'production' !== 'production' ? warning(false, \"Style property values shouldn't contain a semicolon. \" + 'Try \"%s: %s\" instead.', name, value.replace(badStyleValueWithSemicolonPattern, '')) : null; }; var warnValidStyle = function (name, value) { if (name.indexOf('-') > -1) { warnHyphenatedStyleName(name); } else if (badVendoredStyleNamePattern.test(name)) { warnBadVendoredStyleName(name); } else if (badStyleValueWithSemicolonPattern.test(value)) { warnStyleValueWithSemicolon(name, value); } }; } var CSSPropertyOperations = { createMarkupForStyles: function (styles) { var serialized = ''; for (var styleName in styles) { if (!styles.hasOwnProperty(styleName)) { continue; } var styleValue = styles[styleName]; if ('production' !== 'production') { warnValidStyle(styleName, styleValue); } if (styleValue != null) { serialized += processStyleName(styleName) + ':'; serialized += dangerousStyleValue(styleName, styleValue) + ';'; } } return serialized || null; }, setValueForStyles: function (node, styles) { var style = node.style; for (var styleName in styles) { if (!styles.hasOwnProperty(styleName)) { continue; } if ('production' !== 'production') { warnValidStyle(styleName, styles[styleName]); } var styleValue = dangerousStyleValue(styleName, styles[styleName]); if (styleName === 'float') { styleName = styleFloatAccessor; } if (styleValue) { style[styleName] = styleValue; } else { var expansion = CSSProperty.shorthandPropertyExpansions[styleName]; if (expansion) { for (var individualStyleName in expansion) { style[individualStyleName] = ''; } } else { style[styleName] = ''; } } } } }; module.exports = CSSPropertyOperations; }, { './CSSProperty': 11, './ExecutionEnvironment': 28, './camelizeStyleName': 116, './dangerousStyleValue': 121, './hyphenateStyleName': 141, './memoizeStringOnly': 151, './warning': 162 }],\n  13: [function (require, module, exports) { 'use strict'; var PooledClass = require('./PooledClass'); var assign = require('./Object.assign'); var invariant = require('./invariant'); function CallbackQueue () { this._callbacks = null; this._contexts = null; }assign(CallbackQueue.prototype, { enqueue: function (callback, context) { this._callbacks = this._callbacks || []; this._contexts = this._contexts || []; this._callbacks.push(callback); this._contexts.push(context); }, notifyAll: function () { var callbacks = this._callbacks; var contexts = this._contexts; if (callbacks) { 'production' !== 'production' ? invariant(callbacks.length === contexts.length, 'Mismatched list of contexts in callback queue') : invariant(callbacks.length === contexts.length); this._callbacks = null; this._contexts = null; for (var i = 0, l = callbacks.length; i < l; i++) { callbacks[i].call(contexts[i]); }callbacks.length = 0; contexts.length = 0; } }, reset: function () { this._callbacks = null; this._contexts = null; }, destructor: function () { this.reset(); } }); PooledClass.addPoolingTo(CallbackQueue); module.exports = CallbackQueue; }, { './Object.assign': 34, './PooledClass': 35, './invariant': 143 }],\n  14: [function (require, module, exports) { 'use strict'; var EventConstants = require('./EventConstants'); var EventPluginHub = require('./EventPluginHub'); var EventPropagators = require('./EventPropagators'); var ExecutionEnvironment = require('./ExecutionEnvironment'); var ReactUpdates = require('./ReactUpdates'); var SyntheticEvent = require('./SyntheticEvent'); var isEventSupported = require('./isEventSupported'); var isTextInputElement = require('./isTextInputElement'); var keyOf = require('./keyOf'); var topLevelTypes = EventConstants.topLevelTypes; var eventTypes = { change: { phasedRegistrationNames: { bubbled: keyOf({ onChange: null }), captured: keyOf({ onChangeCapture: null }) }, dependencies: [topLevelTypes.topBlur, topLevelTypes.topChange, topLevelTypes.topClick, topLevelTypes.topFocus, topLevelTypes.topInput, topLevelTypes.topKeyDown, topLevelTypes.topKeyUp, topLevelTypes.topSelectionChange] } }; var activeElement = null; var activeElementID = null; var activeElementValue = null; var activeElementValueProp = null; function shouldUseChangeEvent (elem) { return elem.nodeName === 'SELECT' || elem.nodeName === 'INPUT' && elem.type === 'file'; } var doesChangeEventBubble = false; if (ExecutionEnvironment.canUseDOM) { doesChangeEventBubble = isEventSupported('change') && (!('documentMode' in document) || document.documentMode > 8); } function manualDispatchChangeEvent (nativeEvent) { var event = SyntheticEvent.getPooled(eventTypes.change, activeElementID, nativeEvent); EventPropagators.accumulateTwoPhaseDispatches(event); ReactUpdates.batchedUpdates(runEventInBatch, event); } function runEventInBatch (event) { EventPluginHub.enqueueEvents(event); EventPluginHub.processEventQueue(); } function startWatchingForChangeEventIE8 (target, targetID) { activeElement = target; activeElementID = targetID; activeElement.attachEvent('onchange', manualDispatchChangeEvent); } function stopWatchingForChangeEventIE8 () { if (!activeElement) { return; }activeElement.detachEvent('onchange', manualDispatchChangeEvent); activeElement = null; activeElementID = null; } function getTargetIDForChangeEvent (topLevelType, topLevelTarget, topLevelTargetID) { if (topLevelType === topLevelTypes.topChange) { return topLevelTargetID; } } function handleEventsForChangeEventIE8 (topLevelType, topLevelTarget, topLevelTargetID) { if (topLevelType === topLevelTypes.topFocus) { stopWatchingForChangeEventIE8(); startWatchingForChangeEventIE8(topLevelTarget, topLevelTargetID); } else if (topLevelType === topLevelTypes.topBlur) { stopWatchingForChangeEventIE8(); } } var isInputEventSupported = false; if (ExecutionEnvironment.canUseDOM) { isInputEventSupported = isEventSupported('input') && (!('documentMode' in document) || document.documentMode > 9); } var newValueProp = { get: function () { return activeElementValueProp.get.call(this); }, set: function (val) { activeElementValue = '' + val; activeElementValueProp.set.call(this, val); } }; function startWatchingForValueChange (target, targetID) { activeElement = target; activeElementID = targetID; activeElementValue = target.value; activeElementValueProp = Object.getOwnPropertyDescriptor(target.constructor.prototype, 'value'); Object.defineProperty(activeElement, 'value', newValueProp); activeElement.attachEvent('onpropertychange', handlePropertyChange); } function stopWatchingForValueChange () { if (!activeElement) { return; } delete activeElement.value; activeElement.detachEvent('onpropertychange', handlePropertyChange); activeElement = null; activeElementID = null; activeElementValue = null; activeElementValueProp = null; } function handlePropertyChange (nativeEvent) { if (nativeEvent.propertyName !== 'value') { return; } var value = nativeEvent.srcElement.value; if (value === activeElementValue) { return; }activeElementValue = value; manualDispatchChangeEvent(nativeEvent); } function getTargetIDForInputEvent (topLevelType, topLevelTarget, topLevelTargetID) { if (topLevelType === topLevelTypes.topInput) { return topLevelTargetID; } } function handleEventsForInputEventIE (topLevelType, topLevelTarget, topLevelTargetID) { if (topLevelType === topLevelTypes.topFocus) { stopWatchingForValueChange(); startWatchingForValueChange(topLevelTarget, topLevelTargetID); } else if (topLevelType === topLevelTypes.topBlur) { stopWatchingForValueChange(); } } function getTargetIDForInputEventIE (topLevelType, topLevelTarget, topLevelTargetID) { if (topLevelType === topLevelTypes.topSelectionChange || topLevelType === topLevelTypes.topKeyUp || topLevelType === topLevelTypes.topKeyDown) { if (activeElement && activeElement.value !== activeElementValue) { activeElementValue = activeElement.value; return activeElementID; } } } function shouldUseClickEvent (elem) { return elem.nodeName === 'INPUT' && (elem.type === 'checkbox' || elem.type === 'radio'); } function getTargetIDForClickEvent (topLevelType, topLevelTarget, topLevelTargetID) { if (topLevelType === topLevelTypes.topClick) { return topLevelTargetID; } } var ChangeEventPlugin = { eventTypes: eventTypes, extractEvents: function (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent) { var getTargetIDFunc, handleEventFunc; if (shouldUseChangeEvent(topLevelTarget)) { if (doesChangeEventBubble) { getTargetIDFunc = getTargetIDForChangeEvent; } else { handleEventFunc = handleEventsForChangeEventIE8; } } else if (isTextInputElement(topLevelTarget)) { if (isInputEventSupported) { getTargetIDFunc = getTargetIDForInputEvent; } else { getTargetIDFunc = getTargetIDForInputEventIE; handleEventFunc = handleEventsForInputEventIE; } } else if (shouldUseClickEvent(topLevelTarget)) { getTargetIDFunc = getTargetIDForClickEvent; } if (getTargetIDFunc) { var targetID = getTargetIDFunc(topLevelType, topLevelTarget, topLevelTargetID); if (targetID) { var event = SyntheticEvent.getPooled(eventTypes.change, targetID, nativeEvent); EventPropagators.accumulateTwoPhaseDispatches(event); return event; } } if (handleEventFunc) { handleEventFunc(topLevelType, topLevelTarget, topLevelTargetID); } } }; module.exports = ChangeEventPlugin; }, { './EventConstants': 22, './EventPluginHub': 24, './EventPropagators': 27, './ExecutionEnvironment': 28, './ReactUpdates': 95, './SyntheticEvent': 103, './isEventSupported': 144, './isTextInputElement': 146, './keyOf': 149 }],\n  15: [function (require, module, exports) { 'use strict'; var nextReactRootIndex = 0; var ClientReactRootIndex = { createReactRootIndex: function () { return nextReactRootIndex++; } }; module.exports = ClientReactRootIndex; }, {}],\n  16: [function (require, module, exports) { 'use strict'; var Danger = require('./Danger'); var ReactMultiChildUpdateTypes = require('./ReactMultiChildUpdateTypes'); var setTextContent = require('./setTextContent'); var invariant = require('./invariant'); function insertChildAt (parentNode, childNode, index) { parentNode.insertBefore(childNode, parentNode.childNodes[index] || null); } var DOMChildrenOperations = { dangerouslyReplaceNodeWithMarkup: Danger.dangerouslyReplaceNodeWithMarkup, updateTextContent: setTextContent, processUpdates: function (updates, markupList) { var update; var initialChildren = null; var updatedChildren = null; for (var i = 0; i < updates.length; i++) { update = updates[i]; if (update.type === ReactMultiChildUpdateTypes.MOVE_EXISTING || update.type === ReactMultiChildUpdateTypes.REMOVE_NODE) { var updatedIndex = update.fromIndex; var updatedChild = update.parentNode.childNodes[updatedIndex]; var parentID = update.parentID; 'production' !== 'production' ? invariant(updatedChild, 'processUpdates(): Unable to find child %s of element. This ' + 'probably means the DOM was unexpectedly mutated (e.g., by the ' + 'browser), usually due to forgetting a <tbody> when using tables, ' + 'nesting tags like <form>, <p>, or <a>, or using non-SVG elements ' + 'in an <svg> parent. Try inspecting the child nodes of the element ' + 'with React ID `%s`.', updatedIndex, parentID) : invariant(updatedChild); initialChildren = initialChildren || {}; initialChildren[parentID] = initialChildren[parentID] || []; initialChildren[parentID][updatedIndex] = updatedChild; updatedChildren = updatedChildren || []; updatedChildren.push(updatedChild); } } var renderedMarkup = Danger.dangerouslyRenderMarkup(markupList); if (updatedChildren) { for (var j = 0; j < updatedChildren.length; j++) { updatedChildren[j].parentNode.removeChild(updatedChildren[j]); } } for (var k = 0; k < updates.length; k++) { update = updates[k]; switch (update.type) { case ReactMultiChildUpdateTypes.INSERT_MARKUP:insertChildAt(update.parentNode, renderedMarkup[update.markupIndex], update.toIndex); break; case ReactMultiChildUpdateTypes.MOVE_EXISTING:insertChildAt(update.parentNode, initialChildren[update.parentID][update.fromIndex], update.toIndex); break; case ReactMultiChildUpdateTypes.TEXT_CONTENT:setTextContent(update.parentNode, update.textContent); break; case ReactMultiChildUpdateTypes.REMOVE_NODE:break; } } } }; module.exports = DOMChildrenOperations; }, { './Danger': 19, './ReactMultiChildUpdateTypes': 80, './invariant': 143, './setTextContent': 157 }],\n  17: [function (require, module, exports) { 'use strict'; var invariant = require('./invariant'); function checkMask (value, bitmask) { return (value & bitmask) === bitmask; } var DOMPropertyInjection = { MUST_USE_ATTRIBUTE: 1, MUST_USE_PROPERTY: 2, HAS_SIDE_EFFECTS: 4, HAS_BOOLEAN_VALUE: 8, HAS_NUMERIC_VALUE: 16, HAS_POSITIVE_NUMERIC_VALUE: 32 | 16, HAS_OVERLOADED_BOOLEAN_VALUE: 64, injectDOMPropertyConfig: function (domPropertyConfig) { var Properties = domPropertyConfig.Properties || {}; var DOMAttributeNames = domPropertyConfig.DOMAttributeNames || {}; var DOMPropertyNames = domPropertyConfig.DOMPropertyNames || {}; var DOMMutationMethods = domPropertyConfig.DOMMutationMethods || {}; if (domPropertyConfig.isCustomAttribute) { DOMProperty._isCustomAttributeFunctions.push(domPropertyConfig.isCustomAttribute); } for (var propName in Properties) { 'production' !== 'production' ? invariant(!DOMProperty.isStandardName.hasOwnProperty(propName), \"injectDOMPropertyConfig(...): You're trying to inject DOM property \" + \"'%s' which has already been injected. You may be accidentally \" + 'injecting the same DOM property config twice, or you may be ' + 'injecting two configs that have conflicting property names.', propName) : invariant(!DOMProperty.isStandardName.hasOwnProperty(propName)); DOMProperty.isStandardName[propName] = true; var lowerCased = propName.toLowerCase(); DOMProperty.getPossibleStandardName[lowerCased] = propName; if (DOMAttributeNames.hasOwnProperty(propName)) { var attributeName = DOMAttributeNames[propName]; DOMProperty.getPossibleStandardName[attributeName] = propName; DOMProperty.getAttributeName[propName] = attributeName; } else { DOMProperty.getAttributeName[propName] = lowerCased; }DOMProperty.getPropertyName[propName] = DOMPropertyNames.hasOwnProperty(propName) ? DOMPropertyNames[propName] : propName; if (DOMMutationMethods.hasOwnProperty(propName)) { DOMProperty.getMutationMethod[propName] = DOMMutationMethods[propName]; } else { DOMProperty.getMutationMethod[propName] = null; } var propConfig = Properties[propName]; DOMProperty.mustUseAttribute[propName] = checkMask(propConfig, DOMPropertyInjection.MUST_USE_ATTRIBUTE); DOMProperty.mustUseProperty[propName] = checkMask(propConfig, DOMPropertyInjection.MUST_USE_PROPERTY); DOMProperty.hasSideEffects[propName] = checkMask(propConfig, DOMPropertyInjection.HAS_SIDE_EFFECTS); DOMProperty.hasBooleanValue[propName] = checkMask(propConfig, DOMPropertyInjection.HAS_BOOLEAN_VALUE); DOMProperty.hasNumericValue[propName] = checkMask(propConfig, DOMPropertyInjection.HAS_NUMERIC_VALUE); DOMProperty.hasPositiveNumericValue[propName] = checkMask(propConfig, DOMPropertyInjection.HAS_POSITIVE_NUMERIC_VALUE); DOMProperty.hasOverloadedBooleanValue[propName] = checkMask(propConfig, DOMPropertyInjection.HAS_OVERLOADED_BOOLEAN_VALUE); 'production' !== 'production' ? invariant(!DOMProperty.mustUseAttribute[propName] || !DOMProperty.mustUseProperty[propName], 'DOMProperty: Cannot require using both attribute and property: %s', propName) : invariant(!DOMProperty.mustUseAttribute[propName] || !DOMProperty.mustUseProperty[propName]); 'production' !== 'production' ? invariant(DOMProperty.mustUseProperty[propName] || !DOMProperty.hasSideEffects[propName], 'DOMProperty: Properties that have side effects must use property: %s', propName) : invariant(DOMProperty.mustUseProperty[propName] || !DOMProperty.hasSideEffects[propName]); 'production' !== 'production' ? invariant(!!DOMProperty.hasBooleanValue[propName] + !!DOMProperty.hasNumericValue[propName] + !!DOMProperty.hasOverloadedBooleanValue[propName] <= 1, 'DOMProperty: Value can be one of boolean, overloaded boolean, or ' + 'numeric value, but not a combination: %s', propName) : invariant(!!DOMProperty.hasBooleanValue[propName] + !!DOMProperty.hasNumericValue[propName] + !!DOMProperty.hasOverloadedBooleanValue[propName] <= 1); } } }; var defaultValueCache = {}; var DOMProperty = { ID_ATTRIBUTE_NAME: 'data-reactid', isStandardName: {}, getPossibleStandardName: {}, getAttributeName: {}, getPropertyName: {}, getMutationMethod: {}, mustUseAttribute: {}, mustUseProperty: {}, hasSideEffects: {}, hasBooleanValue: {}, hasNumericValue: {}, hasPositiveNumericValue: {}, hasOverloadedBooleanValue: {}, _isCustomAttributeFunctions: [], isCustomAttribute: function (attributeName) { for (var i = 0; i < DOMProperty._isCustomAttributeFunctions.length; i++) { var isCustomAttributeFn = DOMProperty._isCustomAttributeFunctions[i]; if (isCustomAttributeFn(attributeName)) { return true; } } return false; }, getDefaultValueForProperty: function (nodeName, prop) { var nodeDefaults = defaultValueCache[nodeName]; var testElement; if (!nodeDefaults) { defaultValueCache[nodeName] = nodeDefaults = {}; } if (!(prop in nodeDefaults)) { testElement = document.createElement(nodeName); nodeDefaults[prop] = testElement[prop]; } return nodeDefaults[prop]; }, injection: DOMPropertyInjection }; module.exports = DOMProperty; }, { './invariant': 143 }],\n  18: [function (require, module, exports) { 'use strict'; var DOMProperty = require('./DOMProperty'); var quoteAttributeValueForBrowser = require('./quoteAttributeValueForBrowser'); var warning = require('./warning'); function shouldIgnoreValue (name, value) { return value == null || DOMProperty.hasBooleanValue[name] && !value || DOMProperty.hasNumericValue[name] && isNaN(value) || DOMProperty.hasPositiveNumericValue[name] && value < 1 || DOMProperty.hasOverloadedBooleanValue[name] && value === false; } if ('production' !== 'production') { var reactProps = { children: true, dangerouslySetInnerHTML: true, key: true, ref: true }; var warnedProperties = {}; var warnUnknownProperty = function (name) { if (reactProps.hasOwnProperty(name) && reactProps[name] || warnedProperties.hasOwnProperty(name) && warnedProperties[name]) { return; }warnedProperties[name] = true; var lowerCasedName = name.toLowerCase(); var standardName = DOMProperty.isCustomAttribute(lowerCasedName) ? lowerCasedName : DOMProperty.getPossibleStandardName.hasOwnProperty(lowerCasedName) ? DOMProperty.getPossibleStandardName[lowerCasedName] : null; 'production' !== 'production' ? warning(standardName == null, 'Unknown DOM property %s. Did you mean %s?', name, standardName) : null; }; } var DOMPropertyOperations = { createMarkupForID: function (id) { return DOMProperty.ID_ATTRIBUTE_NAME + '=' + quoteAttributeValueForBrowser(id); }, createMarkupForProperty: function (name, value) { if (DOMProperty.isStandardName.hasOwnProperty(name) && DOMProperty.isStandardName[name]) { if (shouldIgnoreValue(name, value)) { return ''; } var attributeName = DOMProperty.getAttributeName[name]; if (DOMProperty.hasBooleanValue[name] || DOMProperty.hasOverloadedBooleanValue[name] && value === true) { return attributeName; } return attributeName + '=' + quoteAttributeValueForBrowser(value); } else if (DOMProperty.isCustomAttribute(name)) { if (value == null) { return ''; } return name + '=' + quoteAttributeValueForBrowser(value); } else if ('production' !== 'production') { warnUnknownProperty(name); } return null; }, setValueForProperty: function (node, name, value) { if (DOMProperty.isStandardName.hasOwnProperty(name) && DOMProperty.isStandardName[name]) { var mutationMethod = DOMProperty.getMutationMethod[name]; if (mutationMethod) { mutationMethod(node, value); } else if (shouldIgnoreValue(name, value)) { this.deleteValueForProperty(node, name); } else if (DOMProperty.mustUseAttribute[name]) { node.setAttribute(DOMProperty.getAttributeName[name], '' + value); } else { var propName = DOMProperty.getPropertyName[name]; if (!DOMProperty.hasSideEffects[name] || '' + node[propName] !== '' + value) { node[propName] = value; } } } else if (DOMProperty.isCustomAttribute(name)) { if (value == null) { node.removeAttribute(name); } else { node.setAttribute(name, '' + value); } } else if ('production' !== 'production') { warnUnknownProperty(name); } }, deleteValueForProperty: function (node, name) { if (DOMProperty.isStandardName.hasOwnProperty(name) && DOMProperty.isStandardName[name]) { var mutationMethod = DOMProperty.getMutationMethod[name]; if (mutationMethod) { mutationMethod(node, undefined); } else if (DOMProperty.mustUseAttribute[name]) { node.removeAttribute(DOMProperty.getAttributeName[name]); } else { var propName = DOMProperty.getPropertyName[name]; var defaultValue = DOMProperty.getDefaultValueForProperty(node.nodeName, propName); if (!DOMProperty.hasSideEffects[name] || '' + node[propName] !== defaultValue) { node[propName] = defaultValue; } } } else if (DOMProperty.isCustomAttribute(name)) { node.removeAttribute(name); } else if ('production' !== 'production') { warnUnknownProperty(name); } } }; module.exports = DOMPropertyOperations; }, { './DOMProperty': 17, './quoteAttributeValueForBrowser': 155, './warning': 162 }],\n  19: [function (require, module, exports) { 'use strict'; var ExecutionEnvironment = require('./ExecutionEnvironment'); var createNodesFromMarkup = require('./createNodesFromMarkup'); var emptyFunction = require('./emptyFunction'); var getMarkupWrap = require('./getMarkupWrap'); var invariant = require('./invariant'); var OPEN_TAG_NAME_EXP = /^(<[^ \\/>]+)/; var RESULT_INDEX_ATTR = 'data-danger-index'; function getNodeName (markup) { return markup.substring(1, markup.indexOf(' ')); } var Danger = { dangerouslyRenderMarkup: function (markupList) { 'production' !== 'production' ? invariant(ExecutionEnvironment.canUseDOM, 'dangerouslyRenderMarkup(...): Cannot render markup in a worker ' + 'thread. Make sure `window` and `document` are available globally ' + 'before requiring React when unit testing or use ' + 'React.renderToString for server rendering.') : invariant(ExecutionEnvironment.canUseDOM); var nodeName; var markupByNodeName = {}; for (var i = 0; i < markupList.length; i++) { 'production' !== 'production' ? invariant(markupList[i], 'dangerouslyRenderMarkup(...): Missing markup.') : invariant(markupList[i]); nodeName = getNodeName(markupList[i]); nodeName = getMarkupWrap(nodeName) ? nodeName : '*'; markupByNodeName[nodeName] = markupByNodeName[nodeName] || []; markupByNodeName[nodeName][i] = markupList[i]; } var resultList = []; var resultListAssignmentCount = 0; for (nodeName in markupByNodeName) { if (!markupByNodeName.hasOwnProperty(nodeName)) { continue; } var markupListByNodeName = markupByNodeName[nodeName]; var resultIndex; for (resultIndex in markupListByNodeName) { if (markupListByNodeName.hasOwnProperty(resultIndex)) { var markup = markupListByNodeName[resultIndex]; markupListByNodeName[resultIndex] = markup.replace(OPEN_TAG_NAME_EXP, '$1 ' + RESULT_INDEX_ATTR + '=\"' + resultIndex + '\" '); } } var renderNodes = createNodesFromMarkup(markupListByNodeName.join(''), emptyFunction); for (var j = 0; j < renderNodes.length; ++j) { var renderNode = renderNodes[j]; if (renderNode.hasAttribute && renderNode.hasAttribute(RESULT_INDEX_ATTR)) { resultIndex = +renderNode.getAttribute(RESULT_INDEX_ATTR); renderNode.removeAttribute(RESULT_INDEX_ATTR); 'production' !== 'production' ? invariant(!resultList.hasOwnProperty(resultIndex), 'Danger: Assigning to an already-occupied result index.') : invariant(!resultList.hasOwnProperty(resultIndex)); resultList[resultIndex] = renderNode; resultListAssignmentCount += 1; } else if ('production' !== 'production') { console.error('Danger: Discarding unexpected node:', renderNode); } } }'production' !== 'production' ? invariant(resultListAssignmentCount === resultList.length, 'Danger: Did not assign to every index of resultList.') : invariant(resultListAssignmentCount === resultList.length); 'production' !== 'production' ? invariant(resultList.length === markupList.length, 'Danger: Expected markup to render %s nodes, but rendered %s.', markupList.length, resultList.length) : invariant(resultList.length === markupList.length); return resultList; }, dangerouslyReplaceNodeWithMarkup: function (oldChild, markup) { 'production' !== 'production' ? invariant(ExecutionEnvironment.canUseDOM, 'dangerouslyReplaceNodeWithMarkup(...): Cannot render markup in a ' + 'worker thread. Make sure `window` and `document` are available ' + 'globally before requiring React when unit testing or use ' + 'React.renderToString for server rendering.') : invariant(ExecutionEnvironment.canUseDOM); 'production' !== 'production' ? invariant(markup, 'dangerouslyReplaceNodeWithMarkup(...): Missing markup.') : invariant(markup); 'production' !== 'production' ? invariant(oldChild.tagName.toLowerCase() !== 'html', 'dangerouslyReplaceNodeWithMarkup(...): Cannot replace markup of the ' + '<html> node. This is because browser quirks make this unreliable ' + 'and/or slow. If you want to render to the root you must use ' + 'server rendering. See React.renderToString().') : invariant(oldChild.tagName.toLowerCase() !== 'html'); var newChild = createNodesFromMarkup(markup, emptyFunction)[0]; oldChild.parentNode.replaceChild(newChild, oldChild); } }; module.exports = Danger; }, { './ExecutionEnvironment': 28, './createNodesFromMarkup': 120, './emptyFunction': 122, './getMarkupWrap': 135, './invariant': 143 }],\n  20: [function (require, module, exports) { 'use strict'; var keyOf = require('./keyOf'); var DefaultEventPluginOrder = [keyOf({ ResponderEventPlugin: null }), keyOf({ SimpleEventPlugin: null }), keyOf({ TapEventPlugin: null }), keyOf({ EnterLeaveEventPlugin: null }), keyOf({ ChangeEventPlugin: null }), keyOf({ SelectEventPlugin: null }), keyOf({ BeforeInputEventPlugin: null }), keyOf({ AnalyticsEventPlugin: null }), keyOf({ MobileSafariClickEventPlugin: null })]; module.exports = DefaultEventPluginOrder; }, { './keyOf': 149 }],\n  21: [function (require, module, exports) { 'use strict'; var EventConstants = require('./EventConstants'); var EventPropagators = require('./EventPropagators'); var SyntheticMouseEvent = require('./SyntheticMouseEvent'); var ReactMount = require('./ReactMount'); var keyOf = require('./keyOf'); var topLevelTypes = EventConstants.topLevelTypes; var getFirstReactDOM = ReactMount.getFirstReactDOM; var eventTypes = { mouseEnter: { registrationName: keyOf({ onMouseEnter: null }), dependencies: [topLevelTypes.topMouseOut, topLevelTypes.topMouseOver] }, mouseLeave: { registrationName: keyOf({ onMouseLeave: null }), dependencies: [topLevelTypes.topMouseOut, topLevelTypes.topMouseOver] } }; var extractedEvents = [null, null]; var EnterLeaveEventPlugin = { eventTypes: eventTypes, extractEvents: function (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent) { if (topLevelType === topLevelTypes.topMouseOver && (nativeEvent.relatedTarget || nativeEvent.fromElement)) { return null; } if (topLevelType !== topLevelTypes.topMouseOut && topLevelType !== topLevelTypes.topMouseOver) { return null; } var win; if (topLevelTarget.window === topLevelTarget) { win = topLevelTarget; } else { var doc = topLevelTarget.ownerDocument; if (doc) { win = doc.defaultView || doc.parentWindow; } else { win = window; } } var from, to; if (topLevelType === topLevelTypes.topMouseOut) { from = topLevelTarget; to = getFirstReactDOM(nativeEvent.relatedTarget || nativeEvent.toElement) || win; } else { from = win; to = topLevelTarget; } if (from === to) { return null; } var fromID = from ? ReactMount.getID(from) : ''; var toID = to ? ReactMount.getID(to) : ''; var leave = SyntheticMouseEvent.getPooled(eventTypes.mouseLeave, fromID, nativeEvent); leave.type = 'mouseleave'; leave.target = from; leave.relatedTarget = to; var enter = SyntheticMouseEvent.getPooled(eventTypes.mouseEnter, toID, nativeEvent); enter.type = 'mouseenter'; enter.target = to; enter.relatedTarget = from; EventPropagators.accumulateEnterLeaveDispatches(leave, enter, fromID, toID); extractedEvents[0] = leave; extractedEvents[1] = enter; return extractedEvents; } }; module.exports = EnterLeaveEventPlugin; }, { './EventConstants': 22, './EventPropagators': 27, './ReactMount': 78, './SyntheticMouseEvent': 107, './keyOf': 149 }],\n  22: [function (require, module, exports) { 'use strict'; var keyMirror = require('./keyMirror'); var PropagationPhases = keyMirror({ bubbled: null, captured: null }); var topLevelTypes = keyMirror({ topBlur: null, topChange: null, topClick: null, topCompositionEnd: null, topCompositionStart: null, topCompositionUpdate: null, topContextMenu: null, topCopy: null, topCut: null, topDoubleClick: null, topDrag: null, topDragEnd: null, topDragEnter: null, topDragExit: null, topDragLeave: null, topDragOver: null, topDragStart: null, topDrop: null, topError: null, topFocus: null, topInput: null, topKeyDown: null, topKeyPress: null, topKeyUp: null, topLoad: null, topMouseDown: null, topMouseMove: null, topMouseOut: null, topMouseOver: null, topMouseUp: null, topPaste: null, topReset: null, topScroll: null, topSelectionChange: null, topSubmit: null, topTextInput: null, topTouchCancel: null, topTouchEnd: null, topTouchMove: null, topTouchStart: null, topWheel: null }); var EventConstants = { topLevelTypes: topLevelTypes, PropagationPhases: PropagationPhases }; module.exports = EventConstants; }, { './keyMirror': 148 }],\n  23: [function (require, module, exports) { var emptyFunction = require('./emptyFunction'); var EventListener = { listen: function (target, eventType, callback) { if (target.addEventListener) { target.addEventListener(eventType, callback, false); return { remove: function () { target.removeEventListener(eventType, callback, false); } }; } else if (target.attachEvent) { target.attachEvent('on' + eventType, callback); return { remove: function () { target.detachEvent('on' + eventType, callback); } }; } }, capture: function (target, eventType, callback) { if (!target.addEventListener) { if ('production' !== 'production') { console.error('Attempted to listen to events during the capture phase on a ' + 'browser that does not support the capture phase. Your application ' + 'will not receive some events.'); } return { remove: emptyFunction }; } else { target.addEventListener(eventType, callback, true); return { remove: function () { target.removeEventListener(eventType, callback, true); } }; } }, registerDefault: function () {} }; module.exports = EventListener; }, { './emptyFunction': 122 }],\n  24: [function (require, module, exports) {\n    'use strict'; var EventPluginRegistry = require('./EventPluginRegistry'); var EventPluginUtils = require('./EventPluginUtils'); var accumulateInto = require('./accumulateInto'); var forEachAccumulated = require('./forEachAccumulated'); var invariant = require('./invariant'); var listenerBank = {}; var eventQueue = null; var executeDispatchesAndRelease = function (event) { if (event) { var executeDispatch = EventPluginUtils.executeDispatch; var PluginModule = EventPluginRegistry.getPluginModuleForEvent(event); if (PluginModule && PluginModule.executeDispatch) { executeDispatch = PluginModule.executeDispatch; }EventPluginUtils.executeDispatchesInOrder(event, executeDispatch); if (!event.isPersistent()) { event.constructor.release(event); } } }; var InstanceHandle = null; function validateInstanceHandle () { var valid = InstanceHandle && InstanceHandle.traverseTwoPhase && InstanceHandle.traverseEnterLeave; 'production' !== 'production' ? invariant(valid, 'InstanceHandle not injected before use!') : invariant(valid); } var EventPluginHub = { injection: { injectMount: EventPluginUtils.injection.injectMount,\n      injectInstanceHandle: function (InjectedInstanceHandle) { InstanceHandle = InjectedInstanceHandle; if ('production' !== 'production') { validateInstanceHandle(); } },\n      getInstanceHandle: function () {\n        if ('production' !== 'production') {\n          validateInstanceHandle();\n        } return InstanceHandle;\n      },\n      injectEventPluginOrder: EventPluginRegistry.injectEventPluginOrder,\n      injectEventPluginsByName: EventPluginRegistry.injectEventPluginsByName },\n    eventNameDispatchConfigs: EventPluginRegistry.eventNameDispatchConfigs,\n    registrationNameModules: EventPluginRegistry.registrationNameModules,\n    putListener: function (id, registrationName, listener) { 'production' !== 'production' ? invariant(!listener || typeof listener === 'function', 'Expected %s listener to be a function, instead got type %s', registrationName, typeof listener) : invariant(!listener || typeof listener === 'function'); var bankForRegistrationName = listenerBank[registrationName] || (listenerBank[registrationName] = {}); bankForRegistrationName[id] = listener; },\n    getListener: function (id, registrationName) { var bankForRegistrationName = listenerBank[registrationName]; return bankForRegistrationName && bankForRegistrationName[id]; },\n    deleteListener: function (id, registrationName) { var bankForRegistrationName = listenerBank[registrationName]; if (bankForRegistrationName) { delete bankForRegistrationName[id]; } },\n    deleteAllListeners: function (id) { for (var registrationName in listenerBank) { delete listenerBank[registrationName][id]; } },\n    extractEvents: function (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent) { var events; var plugins = EventPluginRegistry.plugins; for (var i = 0, l = plugins.length; i < l; i++) { var possiblePlugin = plugins[i]; if (possiblePlugin) { var extractedEvents = possiblePlugin.extractEvents(topLevelType, topLevelTarget, topLevelTargetID, nativeEvent); if (extractedEvents) { events = accumulateInto(events, extractedEvents); } } } return events; },\n    enqueueEvents: function (events) { if (events) { eventQueue = accumulateInto(eventQueue, events); } },\n    processEventQueue: function () { var processingEventQueue = eventQueue; eventQueue = null; forEachAccumulated(processingEventQueue, executeDispatchesAndRelease); 'production' !== 'production' ? invariant(!eventQueue, 'processEventQueue(): Additional events were enqueued while processing ' + 'an event queue. Support for this has not yet been implemented.') : invariant(!eventQueue); },\n    __purge: function () { listenerBank = {}; },\n    __getListenerBank: function () { return listenerBank; } }; module.exports = EventPluginHub;\n  }, { './EventPluginRegistry': 25, './EventPluginUtils': 26, './accumulateInto': 113, './forEachAccumulated': 128, './invariant': 143 }],\n  25: [function (require, module, exports) { 'use strict'; var invariant = require('./invariant'); var EventPluginOrder = null; var namesToPlugins = {}; function recomputePluginOrdering () { if (!EventPluginOrder) { return; } for (var pluginName in namesToPlugins) { var PluginModule = namesToPlugins[pluginName]; var pluginIndex = EventPluginOrder.indexOf(pluginName); 'production' !== 'production' ? invariant(pluginIndex > -1, 'EventPluginRegistry: Cannot inject event plugins that do not exist in ' + 'the plugin ordering, `%s`.', pluginName) : invariant(pluginIndex > -1); if (EventPluginRegistry.plugins[pluginIndex]) { continue; }'production' !== 'production' ? invariant(PluginModule.extractEvents, 'EventPluginRegistry: Event plugins must implement an `extractEvents` ' + 'method, but `%s` does not.', pluginName) : invariant(PluginModule.extractEvents); EventPluginRegistry.plugins[pluginIndex] = PluginModule; var publishedEvents = PluginModule.eventTypes; for (var eventName in publishedEvents) { 'production' !== 'production' ? invariant(publishEventForPlugin(publishedEvents[eventName], PluginModule, eventName), 'EventPluginRegistry: Failed to publish event `%s` for plugin `%s`.', eventName, pluginName) : invariant(publishEventForPlugin(publishedEvents[eventName], PluginModule, eventName)); } } } function publishEventForPlugin (dispatchConfig, PluginModule, eventName) { 'production' !== 'production' ? invariant(!EventPluginRegistry.eventNameDispatchConfigs.hasOwnProperty(eventName), 'EventPluginHub: More than one plugin attempted to publish the same ' + 'event name, `%s`.', eventName) : invariant(!EventPluginRegistry.eventNameDispatchConfigs.hasOwnProperty(eventName)); EventPluginRegistry.eventNameDispatchConfigs[eventName] = dispatchConfig; var phasedRegistrationNames = dispatchConfig.phasedRegistrationNames; if (phasedRegistrationNames) { for (var phaseName in phasedRegistrationNames) { if (phasedRegistrationNames.hasOwnProperty(phaseName)) { var phasedRegistrationName = phasedRegistrationNames[phaseName]; publishRegistrationName(phasedRegistrationName, PluginModule, eventName); } } return true; } else if (dispatchConfig.registrationName) { publishRegistrationName(dispatchConfig.registrationName, PluginModule, eventName); return true; } return false; } function publishRegistrationName (registrationName, PluginModule, eventName) { 'production' !== 'production' ? invariant(!EventPluginRegistry.registrationNameModules[registrationName], 'EventPluginHub: More than one plugin attempted to publish the same ' + 'registration name, `%s`.', registrationName) : invariant(!EventPluginRegistry.registrationNameModules[registrationName]); EventPluginRegistry.registrationNameModules[registrationName] = PluginModule; EventPluginRegistry.registrationNameDependencies[registrationName] = PluginModule.eventTypes[eventName].dependencies; } var EventPluginRegistry = { plugins: [], eventNameDispatchConfigs: {}, registrationNameModules: {}, registrationNameDependencies: {}, injectEventPluginOrder: function (InjectedEventPluginOrder) { 'production' !== 'production' ? invariant(!EventPluginOrder, 'EventPluginRegistry: Cannot inject event plugin ordering more than ' + 'once. You are likely trying to load more than one copy of React.') : invariant(!EventPluginOrder); EventPluginOrder = Array.prototype.slice.call(InjectedEventPluginOrder); recomputePluginOrdering(); }, injectEventPluginsByName: function (injectedNamesToPlugins) { var isOrderingDirty = false; for (var pluginName in injectedNamesToPlugins) { if (!injectedNamesToPlugins.hasOwnProperty(pluginName)) { continue; } var PluginModule = injectedNamesToPlugins[pluginName]; if (!namesToPlugins.hasOwnProperty(pluginName) || namesToPlugins[pluginName] !== PluginModule) { 'production' !== 'production' ? invariant(!namesToPlugins[pluginName], 'EventPluginRegistry: Cannot inject two different event plugins ' + 'using the same name, `%s`.', pluginName) : invariant(!namesToPlugins[pluginName]); namesToPlugins[pluginName] = PluginModule; isOrderingDirty = true; } } if (isOrderingDirty) { recomputePluginOrdering(); } }, getPluginModuleForEvent: function (event) { var dispatchConfig = event.dispatchConfig; if (dispatchConfig.registrationName) { return EventPluginRegistry.registrationNameModules[dispatchConfig.registrationName] || null; } for (var phase in dispatchConfig.phasedRegistrationNames) { if (!dispatchConfig.phasedRegistrationNames.hasOwnProperty(phase)) { continue; } var PluginModule = EventPluginRegistry.registrationNameModules[dispatchConfig.phasedRegistrationNames[phase]]; if (PluginModule) { return PluginModule; } } return null; }, _resetEventPlugins: function () { EventPluginOrder = null; for (var pluginName in namesToPlugins) { if (namesToPlugins.hasOwnProperty(pluginName)) { delete namesToPlugins[pluginName]; } }EventPluginRegistry.plugins.length = 0; var eventNameDispatchConfigs = EventPluginRegistry.eventNameDispatchConfigs; for (var eventName in eventNameDispatchConfigs) { if (eventNameDispatchConfigs.hasOwnProperty(eventName)) { delete eventNameDispatchConfigs[eventName]; } } var registrationNameModules = EventPluginRegistry.registrationNameModules; for (var registrationName in registrationNameModules) { if (registrationNameModules.hasOwnProperty(registrationName)) { delete registrationNameModules[registrationName]; } } } }; module.exports = EventPluginRegistry; }, { './invariant': 143 }],\n  26: [function (require, module, exports) { 'use strict'; var EventConstants = require('./EventConstants'); var invariant = require('./invariant'); var injection = { Mount: null, injectMount: function (InjectedMount) { injection.Mount = InjectedMount; if ('production' !== 'production') { 'production' !== 'production' ? invariant(InjectedMount && InjectedMount.getNode, 'EventPluginUtils.injection.injectMount(...): Injected Mount module ' + 'is missing getNode.') : invariant(InjectedMount && InjectedMount.getNode); } } }; var topLevelTypes = EventConstants.topLevelTypes; function isEndish (topLevelType) { return topLevelType === topLevelTypes.topMouseUp || topLevelType === topLevelTypes.topTouchEnd || topLevelType === topLevelTypes.topTouchCancel; } function isMoveish (topLevelType) { return topLevelType === topLevelTypes.topMouseMove || topLevelType === topLevelTypes.topTouchMove; } function isStartish (topLevelType) { return topLevelType === topLevelTypes.topMouseDown || topLevelType === topLevelTypes.topTouchStart; } var validateEventDispatches; if ('production' !== 'production') { validateEventDispatches = function (event) { var dispatchListeners = event._dispatchListeners; var dispatchIDs = event._dispatchIDs; var listenersIsArr = Array.isArray(dispatchListeners); var idsIsArr = Array.isArray(dispatchIDs); var IDsLen = idsIsArr ? dispatchIDs.length : dispatchIDs ? 1 : 0; var listenersLen = listenersIsArr ? dispatchListeners.length : dispatchListeners ? 1 : 0; 'production' !== 'production' ? invariant(idsIsArr === listenersIsArr && IDsLen === listenersLen, 'EventPluginUtils: Invalid `event`.') : invariant(idsIsArr === listenersIsArr && IDsLen === listenersLen); }; } function forEachEventDispatch (event, cb) { var dispatchListeners = event._dispatchListeners; var dispatchIDs = event._dispatchIDs; if ('production' !== 'production') { validateEventDispatches(event); } if (Array.isArray(dispatchListeners)) { for (var i = 0; i < dispatchListeners.length; i++) { if (event.isPropagationStopped()) { break; }cb(event, dispatchListeners[i], dispatchIDs[i]); } } else if (dispatchListeners) { cb(event, dispatchListeners, dispatchIDs); } } function executeDispatch (event, listener, domID) { event.currentTarget = injection.Mount.getNode(domID); var returnValue = listener(event, domID); event.currentTarget = null; return returnValue; } function executeDispatchesInOrder (event, cb) { forEachEventDispatch(event, cb); event._dispatchListeners = null; event._dispatchIDs = null; } function executeDispatchesInOrderStopAtTrueImpl (event) { var dispatchListeners = event._dispatchListeners; var dispatchIDs = event._dispatchIDs; if ('production' !== 'production') { validateEventDispatches(event); } if (Array.isArray(dispatchListeners)) { for (var i = 0; i < dispatchListeners.length; i++) { if (event.isPropagationStopped()) { break; } if (dispatchListeners[i](event, dispatchIDs[i])) { return dispatchIDs[i]; } } } else if (dispatchListeners) { if (dispatchListeners(event, dispatchIDs)) { return dispatchIDs; } } return null; } function executeDispatchesInOrderStopAtTrue (event) { var ret = executeDispatchesInOrderStopAtTrueImpl(event); event._dispatchIDs = null; event._dispatchListeners = null; return ret; } function executeDirectDispatch (event) { if ('production' !== 'production') { validateEventDispatches(event); } var dispatchListener = event._dispatchListeners; var dispatchID = event._dispatchIDs; 'production' !== 'production' ? invariant(!Array.isArray(dispatchListener), 'executeDirectDispatch(...): Invalid `event`.') : invariant(!Array.isArray(dispatchListener)); var res = dispatchListener ? dispatchListener(event, dispatchID) : null; event._dispatchListeners = null; event._dispatchIDs = null; return res; } function hasDispatches (event) { return !!event._dispatchListeners; } var EventPluginUtils = { isEndish: isEndish, isMoveish: isMoveish, isStartish: isStartish, executeDirectDispatch: executeDirectDispatch, executeDispatch: executeDispatch, executeDispatchesInOrder: executeDispatchesInOrder, executeDispatchesInOrderStopAtTrue: executeDispatchesInOrderStopAtTrue, hasDispatches: hasDispatches, injection: injection, useTouchEvents: false }; module.exports = EventPluginUtils; }, { './EventConstants': 22, './invariant': 143 }],\n  27: [function (require, module, exports) { 'use strict'; var EventConstants = require('./EventConstants'); var EventPluginHub = require('./EventPluginHub'); var accumulateInto = require('./accumulateInto'); var forEachAccumulated = require('./forEachAccumulated'); var PropagationPhases = EventConstants.PropagationPhases; var getListener = EventPluginHub.getListener; function listenerAtPhase (id, event, propagationPhase) { var registrationName = event.dispatchConfig.phasedRegistrationNames[propagationPhase]; return getListener(id, registrationName); } function accumulateDirectionalDispatches (domID, upwards, event) { if ('production' !== 'production') { if (!domID) { throw new Error('Dispatching id must not be null'); } } var phase = upwards ? PropagationPhases.bubbled : PropagationPhases.captured; var listener = listenerAtPhase(domID, event, phase); if (listener) { event._dispatchListeners = accumulateInto(event._dispatchListeners, listener); event._dispatchIDs = accumulateInto(event._dispatchIDs, domID); } } function accumulateTwoPhaseDispatchesSingle (event) { if (event && event.dispatchConfig.phasedRegistrationNames) { EventPluginHub.injection.getInstanceHandle().traverseTwoPhase(event.dispatchMarker, accumulateDirectionalDispatches, event); } } function accumulateDispatches (id, ignoredDirection, event) { if (event && event.dispatchConfig.registrationName) { var registrationName = event.dispatchConfig.registrationName; var listener = getListener(id, registrationName); if (listener) { event._dispatchListeners = accumulateInto(event._dispatchListeners, listener); event._dispatchIDs = accumulateInto(event._dispatchIDs, id); } } } function accumulateDirectDispatchesSingle (event) { if (event && event.dispatchConfig.registrationName) { accumulateDispatches(event.dispatchMarker, null, event); } } function accumulateTwoPhaseDispatches (events) { forEachAccumulated(events, accumulateTwoPhaseDispatchesSingle); } function accumulateEnterLeaveDispatches (leave, enter, fromID, toID) { EventPluginHub.injection.getInstanceHandle().traverseEnterLeave(fromID, toID, accumulateDispatches, leave, enter); } function accumulateDirectDispatches (events) { forEachAccumulated(events, accumulateDirectDispatchesSingle); } var EventPropagators = { accumulateTwoPhaseDispatches: accumulateTwoPhaseDispatches, accumulateDirectDispatches: accumulateDirectDispatches, accumulateEnterLeaveDispatches: accumulateEnterLeaveDispatches }; module.exports = EventPropagators; }, { './EventConstants': 22, './EventPluginHub': 24, './accumulateInto': 113, './forEachAccumulated': 128 }],\n  28: [function (require, module, exports) { 'use strict'; var canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement); var ExecutionEnvironment = { canUseDOM: canUseDOM, canUseWorkers: typeof Worker !== 'undefined', canUseEventListeners: canUseDOM && !!(window.addEventListener || window.attachEvent), canUseViewport: canUseDOM && !!window.screen, isInWorker: !canUseDOM }; module.exports = ExecutionEnvironment; }, {}],\n  29: [function (require, module, exports) { 'use strict'; var PooledClass = require('./PooledClass'); var assign = require('./Object.assign'); var getTextContentAccessor = require('./getTextContentAccessor'); function FallbackCompositionState (root) { this._root = root; this._startText = this.getText(); this._fallbackText = null; }assign(FallbackCompositionState.prototype, { getText: function () { if ('value' in this._root) { return this._root.value; } return this._root[getTextContentAccessor()]; }, getData: function () { if (this._fallbackText) { return this._fallbackText; } var start; var startValue = this._startText; var startLength = startValue.length; var end; var endValue = this.getText(); var endLength = endValue.length; for (start = 0; start < startLength; start++) { if (startValue[start] !== endValue[start]) { break; } } var minEnd = startLength - start; for (end = 1; end <= minEnd; end++) { if (startValue[startLength - end] !== endValue[endLength - end]) { break; } } var sliceTail = end > 1 ? 1 - end : undefined; this._fallbackText = endValue.slice(start, sliceTail); return this._fallbackText; } }); PooledClass.addPoolingTo(FallbackCompositionState); module.exports = FallbackCompositionState; }, { './Object.assign': 34, './PooledClass': 35, './getTextContentAccessor': 138 }],\n  30: [function (require, module, exports) { 'use strict'; var DOMProperty = require('./DOMProperty'); var ExecutionEnvironment = require('./ExecutionEnvironment'); var MUST_USE_ATTRIBUTE = DOMProperty.injection.MUST_USE_ATTRIBUTE; var MUST_USE_PROPERTY = DOMProperty.injection.MUST_USE_PROPERTY; var HAS_BOOLEAN_VALUE = DOMProperty.injection.HAS_BOOLEAN_VALUE; var HAS_SIDE_EFFECTS = DOMProperty.injection.HAS_SIDE_EFFECTS; var HAS_NUMERIC_VALUE = DOMProperty.injection.HAS_NUMERIC_VALUE; var HAS_POSITIVE_NUMERIC_VALUE = DOMProperty.injection.HAS_POSITIVE_NUMERIC_VALUE; var HAS_OVERLOADED_BOOLEAN_VALUE = DOMProperty.injection.HAS_OVERLOADED_BOOLEAN_VALUE; var hasSVG; if (ExecutionEnvironment.canUseDOM) { var implementation = document.implementation; hasSVG = implementation && implementation.hasFeature && implementation.hasFeature('http://www.w3.org/TR/SVG11/feature#BasicStructure', '1.1'); } var HTMLDOMPropertyConfig = { isCustomAttribute: RegExp.prototype.test.bind(/^(data|aria)-[a-z_][a-z\\d_.\\-]*$/), Properties: { accept: null, acceptCharset: null, accessKey: null, action: null, allowFullScreen: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE, allowTransparency: MUST_USE_ATTRIBUTE, alt: null, async: HAS_BOOLEAN_VALUE, autoComplete: null, autoPlay: HAS_BOOLEAN_VALUE, cellPadding: null, cellSpacing: null, charSet: MUST_USE_ATTRIBUTE, checked: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE, classID: MUST_USE_ATTRIBUTE, className: hasSVG ? MUST_USE_ATTRIBUTE : MUST_USE_PROPERTY, cols: MUST_USE_ATTRIBUTE | HAS_POSITIVE_NUMERIC_VALUE, colSpan: null, content: null, contentEditable: null, contextMenu: MUST_USE_ATTRIBUTE, controls: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE, coords: null, crossOrigin: null, data: null, dateTime: MUST_USE_ATTRIBUTE, defer: HAS_BOOLEAN_VALUE, dir: null, disabled: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE, download: HAS_OVERLOADED_BOOLEAN_VALUE, draggable: null, encType: null, form: MUST_USE_ATTRIBUTE, formAction: MUST_USE_ATTRIBUTE, formEncType: MUST_USE_ATTRIBUTE, formMethod: MUST_USE_ATTRIBUTE, formNoValidate: HAS_BOOLEAN_VALUE, formTarget: MUST_USE_ATTRIBUTE, frameBorder: MUST_USE_ATTRIBUTE, headers: null, height: MUST_USE_ATTRIBUTE, hidden: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE, high: null, href: null, hrefLang: null, htmlFor: null, httpEquiv: null, icon: null, id: MUST_USE_PROPERTY, label: null, lang: null, list: MUST_USE_ATTRIBUTE, loop: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE, low: null, manifest: MUST_USE_ATTRIBUTE, marginHeight: null, marginWidth: null, max: null, maxLength: MUST_USE_ATTRIBUTE, media: MUST_USE_ATTRIBUTE, mediaGroup: null, method: null, min: null, multiple: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE, muted: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE, name: null, noValidate: HAS_BOOLEAN_VALUE, open: HAS_BOOLEAN_VALUE, optimum: null, pattern: null, placeholder: null, poster: null, preload: null, radioGroup: null, readOnly: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE, rel: null, required: HAS_BOOLEAN_VALUE, role: MUST_USE_ATTRIBUTE, rows: MUST_USE_ATTRIBUTE | HAS_POSITIVE_NUMERIC_VALUE, rowSpan: null, sandbox: null, scope: null, scoped: HAS_BOOLEAN_VALUE, scrolling: null, seamless: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE, selected: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE, shape: null, size: MUST_USE_ATTRIBUTE | HAS_POSITIVE_NUMERIC_VALUE, sizes: MUST_USE_ATTRIBUTE, span: HAS_POSITIVE_NUMERIC_VALUE, spellCheck: null, src: null, srcDoc: MUST_USE_PROPERTY, srcSet: MUST_USE_ATTRIBUTE, start: HAS_NUMERIC_VALUE, step: null, style: null, tabIndex: null, target: null, title: null, type: null, useMap: null, value: MUST_USE_PROPERTY | HAS_SIDE_EFFECTS, width: MUST_USE_ATTRIBUTE, wmode: MUST_USE_ATTRIBUTE, autoCapitalize: null, autoCorrect: null, itemProp: MUST_USE_ATTRIBUTE, itemScope: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE, itemType: MUST_USE_ATTRIBUTE, itemID: MUST_USE_ATTRIBUTE, itemRef: MUST_USE_ATTRIBUTE, property: null, unselectable: MUST_USE_ATTRIBUTE }, DOMAttributeNames: { acceptCharset: 'accept-charset', className: 'class', htmlFor: 'for', httpEquiv: 'http-equiv' }, DOMPropertyNames: { autoCapitalize: 'autocapitalize', autoComplete: 'autocomplete', autoCorrect: 'autocorrect', autoFocus: 'autofocus', autoPlay: 'autoplay', encType: 'encoding', hrefLang: 'hreflang', radioGroup: 'radiogroup', spellCheck: 'spellcheck', srcDoc: 'srcdoc', srcSet: 'srcset' } }; module.exports = HTMLDOMPropertyConfig; }, { './DOMProperty': 17, './ExecutionEnvironment': 28 }],\n  31: [function (require, module, exports) { 'use strict'; var ReactPropTypes = require('./ReactPropTypes'); var invariant = require('./invariant'); var hasReadOnlyValue = { button: true, checkbox: true, image: true, hidden: true, radio: true, reset: true, submit: true }; function _assertSingleLink (input) { 'production' !== 'production' ? invariant(input.props.checkedLink == null || input.props.valueLink == null, 'Cannot provide a checkedLink and a valueLink. If you want to use ' + \"checkedLink, you probably don't want to use valueLink and vice versa.\") : invariant(input.props.checkedLink == null || input.props.valueLink == null); } function _assertValueLink (input) { _assertSingleLink(input); 'production' !== 'production' ? invariant(input.props.value == null && input.props.onChange == null, 'Cannot provide a valueLink and a value or onChange event. If you want ' + \"to use value or onChange, you probably don't want to use valueLink.\") : invariant(input.props.value == null && input.props.onChange == null); } function _assertCheckedLink (input) { _assertSingleLink(input); 'production' !== 'production' ? invariant(input.props.checked == null && input.props.onChange == null, 'Cannot provide a checkedLink and a checked property or onChange event. ' + \"If you want to use checked or onChange, you probably don't want to \" + 'use checkedLink') : invariant(input.props.checked == null && input.props.onChange == null); } function _handleLinkedValueChange (e) { this.props.valueLink.requestChange(e.target.value); } function _handleLinkedCheckChange (e) { this.props.checkedLink.requestChange(e.target.checked); } var LinkedValueUtils = { Mixin: { propTypes: { value: function (props, propName, componentName) { if (!props[propName] || hasReadOnlyValue[props.type] || props.onChange || props.readOnly || props.disabled) { return null; } return new Error('You provided a `value` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultValue`. Otherwise, ' + 'set either `onChange` or `readOnly`.'); }, checked: function (props, propName, componentName) { if (!props[propName] || props.onChange || props.readOnly || props.disabled) { return null; } return new Error('You provided a `checked` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultChecked`. Otherwise, ' + 'set either `onChange` or `readOnly`.'); }, onChange: ReactPropTypes.func } }, getValue: function (input) { if (input.props.valueLink) { _assertValueLink(input); return input.props.valueLink.value; } return input.props.value; }, getChecked: function (input) { if (input.props.checkedLink) { _assertCheckedLink(input); return input.props.checkedLink.value; } return input.props.checked; }, getOnChange: function (input) { if (input.props.valueLink) { _assertValueLink(input); return _handleLinkedValueChange; } else if (input.props.checkedLink) { _assertCheckedLink(input); return _handleLinkedCheckChange; } return input.props.onChange; } }; module.exports = LinkedValueUtils; }, { './ReactPropTypes': 86, './invariant': 143 }],\n  32: [function (require, module, exports) { 'use strict'; var ReactBrowserEventEmitter = require('./ReactBrowserEventEmitter'); var accumulateInto = require('./accumulateInto'); var forEachAccumulated = require('./forEachAccumulated'); var invariant = require('./invariant'); function remove (event) { event.remove(); } var LocalEventTrapMixin = { trapBubbledEvent: function (topLevelType, handlerBaseName) { 'production' !== 'production' ? invariant(this.isMounted(), 'Must be mounted to trap events') : invariant(this.isMounted()); var node = this.getDOMNode(); 'production' !== 'production' ? invariant(node, 'LocalEventTrapMixin.trapBubbledEvent(...): Requires node to be rendered.') : invariant(node); var listener = ReactBrowserEventEmitter.trapBubbledEvent(topLevelType, handlerBaseName, node); this._localEventListeners = accumulateInto(this._localEventListeners, listener); }, componentWillUnmount: function () { if (this._localEventListeners) { forEachAccumulated(this._localEventListeners, remove); } } }; module.exports = LocalEventTrapMixin; }, { './ReactBrowserEventEmitter': 38, './accumulateInto': 113, './forEachAccumulated': 128, './invariant': 143 }],\n  33: [function (require, module, exports) { 'use strict'; var EventConstants = require('./EventConstants'); var emptyFunction = require('./emptyFunction'); var topLevelTypes = EventConstants.topLevelTypes; var MobileSafariClickEventPlugin = { eventTypes: null, extractEvents: function (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent) { if (topLevelType === topLevelTypes.topTouchStart) { var target = nativeEvent.target; if (target && !target.onclick) { target.onclick = emptyFunction; } } } }; module.exports = MobileSafariClickEventPlugin; }, { './EventConstants': 22, './emptyFunction': 122 }],\n  34: [function (require, module, exports) { 'use strict'; function assign (target, sources) { if (target == null) { throw new TypeError('Object.assign target cannot be null or undefined'); } var to = Object(target); var hasOwnProperty = Object.prototype.hasOwnProperty; for (var nextIndex = 1; nextIndex < arguments.length; nextIndex++) { var nextSource = arguments[nextIndex]; if (nextSource == null) { continue; } var from = Object(nextSource); for (var key in from) { if (hasOwnProperty.call(from, key)) { to[key] = from[key]; } } } return to; }module.exports = assign; }, {}],\n  35: [function (require, module, exports) { 'use strict'; var invariant = require('./invariant'); var oneArgumentPooler = function (copyFieldsFrom) { var Klass = this; if (Klass.instancePool.length) { var instance = Klass.instancePool.pop(); Klass.call(instance, copyFieldsFrom); return instance; } else { return new Klass(copyFieldsFrom); } }; var twoArgumentPooler = function (a1, a2) { var Klass = this; if (Klass.instancePool.length) { var instance = Klass.instancePool.pop(); Klass.call(instance, a1, a2); return instance; } else { return new Klass(a1, a2); } }; var threeArgumentPooler = function (a1, a2, a3) { var Klass = this; if (Klass.instancePool.length) { var instance = Klass.instancePool.pop(); Klass.call(instance, a1, a2, a3); return instance; } else { return new Klass(a1, a2, a3); } }; var fiveArgumentPooler = function (a1, a2, a3, a4, a5) { var Klass = this; if (Klass.instancePool.length) { var instance = Klass.instancePool.pop(); Klass.call(instance, a1, a2, a3, a4, a5); return instance; } else { return new Klass(a1, a2, a3, a4, a5); } }; var standardReleaser = function (instance) { var Klass = this; 'production' !== 'production' ? invariant(instance instanceof Klass, 'Trying to release an instance into a pool of a different type.') : invariant(instance instanceof Klass); if (instance.destructor) { instance.destructor(); } if (Klass.instancePool.length < Klass.poolSize) { Klass.instancePool.push(instance); } }; var DEFAULT_POOL_SIZE = 10; var DEFAULT_POOLER = oneArgumentPooler; var addPoolingTo = function (CopyConstructor, pooler) { var NewKlass = CopyConstructor; NewKlass.instancePool = []; NewKlass.getPooled = pooler || DEFAULT_POOLER; if (!NewKlass.poolSize) { NewKlass.poolSize = DEFAULT_POOL_SIZE; }NewKlass.release = standardReleaser; return NewKlass; }; var PooledClass = { addPoolingTo: addPoolingTo, oneArgumentPooler: oneArgumentPooler, twoArgumentPooler: twoArgumentPooler, threeArgumentPooler: threeArgumentPooler, fiveArgumentPooler: fiveArgumentPooler }; module.exports = PooledClass; }, { './invariant': 143 }],\n  36: [function (require, module, exports) { 'use strict'; var EventPluginUtils = require('./EventPluginUtils'); var ReactChildren = require('./ReactChildren'); var ReactComponent = require('./ReactComponent'); var ReactClass = require('./ReactClass'); var ReactContext = require('./ReactContext'); var ReactCurrentOwner = require('./ReactCurrentOwner'); var ReactElement = require('./ReactElement'); var ReactElementValidator = require('./ReactElementValidator'); var ReactDOM = require('./ReactDOM'); var ReactDOMTextComponent = require('./ReactDOMTextComponent'); var ReactDefaultInjection = require('./ReactDefaultInjection'); var ReactInstanceHandles = require('./ReactInstanceHandles'); var ReactMount = require('./ReactMount'); var ReactPerf = require('./ReactPerf'); var ReactPropTypes = require('./ReactPropTypes'); var ReactReconciler = require('./ReactReconciler'); var ReactServerRendering = require('./ReactServerRendering'); var assign = require('./Object.assign'); var findDOMNode = require('./findDOMNode'); var onlyChild = require('./onlyChild'); ReactDefaultInjection.inject(); var createElement = ReactElement.createElement; var createFactory = ReactElement.createFactory; var cloneElement = ReactElement.cloneElement; if ('production' !== 'production') { createElement = ReactElementValidator.createElement; createFactory = ReactElementValidator.createFactory; cloneElement = ReactElementValidator.cloneElement; } var render = ReactPerf.measure('React', 'render', ReactMount.render); var React = { Children: { map: ReactChildren.map, forEach: ReactChildren.forEach, count: ReactChildren.count, only: onlyChild }, Component: ReactComponent, DOM: ReactDOM, PropTypes: ReactPropTypes, initializeTouchEvents: function (shouldUseTouch) { EventPluginUtils.useTouchEvents = shouldUseTouch; }, createClass: ReactClass.createClass, createElement: createElement, cloneElement: cloneElement, createFactory: createFactory, createMixin: function (mixin) { return mixin; }, constructAndRenderComponent: ReactMount.constructAndRenderComponent, constructAndRenderComponentByID: ReactMount.constructAndRenderComponentByID, findDOMNode: findDOMNode, render: render, renderToString: ReactServerRendering.renderToString, renderToStaticMarkup: ReactServerRendering.renderToStaticMarkup, unmountComponentAtNode: ReactMount.unmountComponentAtNode, isValidElement: ReactElement.isValidElement, withContext: ReactContext.withContext, __spread: assign }; if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' && typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.inject === 'function') { __REACT_DEVTOOLS_GLOBAL_HOOK__.inject({ CurrentOwner: ReactCurrentOwner, InstanceHandles: ReactInstanceHandles, Mount: ReactMount, Reconciler: ReactReconciler, TextComponent: ReactDOMTextComponent }); } if ('production' !== 'production') { var ExecutionEnvironment = require('./ExecutionEnvironment'); if (ExecutionEnvironment.canUseDOM && window.top === window.self) { if (navigator.userAgent.indexOf('Chrome') > -1) { if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined') { console.debug('Download the React DevTools for a better development experience: ' + 'https://fb.me/react-devtools'); } } var expectedFeatures = [Array.isArray, Array.prototype.every, Array.prototype.forEach, Array.prototype.indexOf, Array.prototype.map, Date.now, Function.prototype.bind, Object.keys, String.prototype.split, String.prototype.trim, Object.create, Object.freeze]; for (var i = 0; i < expectedFeatures.length; i++) { if (!expectedFeatures[i]) { console.error('One or more ES5 shim/shams expected by React are not available: ' + 'https://fb.me/react-warning-polyfills'); break; } } } }React.version = '0.13.3'; module.exports = React; }, { './EventPluginUtils': 26, './ExecutionEnvironment': 28, './Object.assign': 34, './ReactChildren': 40, './ReactClass': 41, './ReactComponent': 42, './ReactContext': 46, './ReactCurrentOwner': 47, './ReactDOM': 48, './ReactDOMTextComponent': 59, './ReactDefaultInjection': 62, './ReactElement': 65, './ReactElementValidator': 66, './ReactInstanceHandles': 74, './ReactMount': 78, './ReactPerf': 83, './ReactPropTypes': 86, './ReactReconciler': 89, './ReactServerRendering': 92, './findDOMNode': 125, './onlyChild': 152 }],\n  37: [function (require, module, exports) { 'use strict'; var findDOMNode = require('./findDOMNode'); var ReactBrowserComponentMixin = { getDOMNode: function () { return findDOMNode(this); } }; module.exports = ReactBrowserComponentMixin; }, { './findDOMNode': 125 }],\n  38: [function (require, module, exports) {\n    'use strict'; var EventConstants = require('./EventConstants'); var EventPluginHub = require('./EventPluginHub'); var EventPluginRegistry = require('./EventPluginRegistry'); var ReactEventEmitterMixin = require('./ReactEventEmitterMixin'); var ViewportMetrics = require('./ViewportMetrics'); var assign = require('./Object.assign'); var isEventSupported = require('./isEventSupported'); var alreadyListeningTo = {}; var isMonitoringScrollValue = false; var reactTopListenersCounter = 0; var topEventMapping = { topBlur: 'blur', topChange: 'change', topClick: 'click', topCompositionEnd: 'compositionend', topCompositionStart: 'compositionstart', topCompositionUpdate: 'compositionupdate', topContextMenu: 'contextmenu', topCopy: 'copy', topCut: 'cut', topDoubleClick: 'dblclick', topDrag: 'drag', topDragEnd: 'dragend', topDragEnter: 'dragenter', topDragExit: 'dragexit', topDragLeave: 'dragleave', topDragOver: 'dragover', topDragStart: 'dragstart', topDrop: 'drop', topFocus: 'focus', topInput: 'input', topKeyDown: 'keydown', topKeyPress: 'keypress', topKeyUp: 'keyup', topMouseDown: 'mousedown', topMouseMove: 'mousemove', topMouseOut: 'mouseout', topMouseOver: 'mouseover', topMouseUp: 'mouseup', topPaste: 'paste', topScroll: 'scroll', topSelectionChange: 'selectionchange', topTextInput: 'textInput', topTouchCancel: 'touchcancel', topTouchEnd: 'touchend', topTouchMove: 'touchmove', topTouchStart: 'touchstart', topWheel: 'wheel' }; var topListenersIDKey = '_reactListenersID' + String(Math.random()).slice(2); function getListeningForDocument (mountAt) {\n      if (!Object.prototype.hasOwnProperty.call(mountAt, topListenersIDKey)) {\n        mountAt[topListenersIDKey] = reactTopListenersCounter++; alreadyListeningTo[mountAt[topListenersIDKey]] = {};\n      } return alreadyListeningTo[mountAt[topListenersIDKey]];\n    } var ReactBrowserEventEmitter = assign({}, ReactEventEmitterMixin, { ReactEventListener: null, injection: { injectReactEventListener: function (ReactEventListener) { ReactEventListener.setHandleTopLevel(ReactBrowserEventEmitter.handleTopLevel); ReactBrowserEventEmitter.ReactEventListener = ReactEventListener; } }, setEnabled: function (enabled) { if (ReactBrowserEventEmitter.ReactEventListener) { ReactBrowserEventEmitter.ReactEventListener.setEnabled(enabled); } }, isEnabled: function () { return !!(ReactBrowserEventEmitter.ReactEventListener && ReactBrowserEventEmitter.ReactEventListener.isEnabled()); }, listenTo: function (registrationName, contentDocumentHandle) { var mountAt = contentDocumentHandle; var isListening = getListeningForDocument(mountAt); var dependencies = EventPluginRegistry.registrationNameDependencies[registrationName]; var topLevelTypes = EventConstants.topLevelTypes; for (var i = 0, l = dependencies.length; i < l; i++) { var dependency = dependencies[i]; if (!(isListening.hasOwnProperty(dependency) && isListening[dependency])) { if (dependency === topLevelTypes.topWheel) { if (isEventSupported('wheel')) { ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(topLevelTypes.topWheel, 'wheel', mountAt); } else if (isEventSupported('mousewheel')) { ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(topLevelTypes.topWheel, 'mousewheel', mountAt); } else { ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(topLevelTypes.topWheel, 'DOMMouseScroll', mountAt); } } else if (dependency === topLevelTypes.topScroll) { if (isEventSupported('scroll', true)) { ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent(topLevelTypes.topScroll, 'scroll', mountAt); } else { ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(topLevelTypes.topScroll, 'scroll', ReactBrowserEventEmitter.ReactEventListener.WINDOW_HANDLE); } } else if (dependency === topLevelTypes.topFocus || dependency === topLevelTypes.topBlur) { if (isEventSupported('focus', true)) { ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent(topLevelTypes.topFocus, 'focus', mountAt); ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent(topLevelTypes.topBlur, 'blur', mountAt); } else if (isEventSupported('focusin')) { ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(topLevelTypes.topFocus, 'focusin', mountAt); ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(topLevelTypes.topBlur, 'focusout', mountAt); }isListening[topLevelTypes.topBlur] = true; isListening[topLevelTypes.topFocus] = true; } else if (topEventMapping.hasOwnProperty(dependency)) { ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(dependency, topEventMapping[dependency], mountAt); }isListening[dependency] = true; } } }, trapBubbledEvent: function (topLevelType, handlerBaseName, handle) { return ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(topLevelType, handlerBaseName, handle); }, trapCapturedEvent: function (topLevelType, handlerBaseName, handle) { return ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent(topLevelType, handlerBaseName, handle); }, ensureScrollValueMonitoring: function () { if (!isMonitoringScrollValue) { var refresh = ViewportMetrics.refreshScrollValues; ReactBrowserEventEmitter.ReactEventListener.monitorScrollValue(refresh); isMonitoringScrollValue = true; } }, eventNameDispatchConfigs: EventPluginHub.eventNameDispatchConfigs, registrationNameModules: EventPluginHub.registrationNameModules, putListener: EventPluginHub.putListener, getListener: EventPluginHub.getListener, deleteListener: EventPluginHub.deleteListener, deleteAllListeners: EventPluginHub.deleteAllListeners }); module.exports = ReactBrowserEventEmitter;\n  }, { './EventConstants': 22, './EventPluginHub': 24, './EventPluginRegistry': 25, './Object.assign': 34, './ReactEventEmitterMixin': 69, './ViewportMetrics': 112, './isEventSupported': 144 }],\n  39: [function (require, module, exports) { 'use strict'; var ReactReconciler = require('./ReactReconciler'); var flattenChildren = require('./flattenChildren'); var instantiateReactComponent = require('./instantiateReactComponent'); var shouldUpdateReactComponent = require('./shouldUpdateReactComponent'); var ReactChildReconciler = { instantiateChildren: function (nestedChildNodes, transaction, context) { var children = flattenChildren(nestedChildNodes); for (var name in children) { if (children.hasOwnProperty(name)) { var child = children[name]; var childInstance = instantiateReactComponent(child, null); children[name] = childInstance; } } return children; }, updateChildren: function (prevChildren, nextNestedChildNodes, transaction, context) { var nextChildren = flattenChildren(nextNestedChildNodes); if (!nextChildren && !prevChildren) { return null; } var name; for (name in nextChildren) { if (!nextChildren.hasOwnProperty(name)) { continue; } var prevChild = prevChildren && prevChildren[name]; var prevElement = prevChild && prevChild._currentElement; var nextElement = nextChildren[name]; if (shouldUpdateReactComponent(prevElement, nextElement)) { ReactReconciler.receiveComponent(prevChild, nextElement, transaction, context); nextChildren[name] = prevChild; } else { if (prevChild) { ReactReconciler.unmountComponent(prevChild, name); } var nextChildInstance = instantiateReactComponent(nextElement, null); nextChildren[name] = nextChildInstance; } } for (name in prevChildren) { if (prevChildren.hasOwnProperty(name) && !(nextChildren && nextChildren.hasOwnProperty(name))) { ReactReconciler.unmountComponent(prevChildren[name]); } } return nextChildren; }, unmountChildren: function (renderedChildren) { for (var name in renderedChildren) { var renderedChild = renderedChildren[name]; ReactReconciler.unmountComponent(renderedChild); } } }; module.exports = ReactChildReconciler; }, { './ReactReconciler': 89, './flattenChildren': 126, './instantiateReactComponent': 142, './shouldUpdateReactComponent': 159 }],\n  40: [function (require, module, exports) { 'use strict'; var PooledClass = require('./PooledClass'); var ReactFragment = require('./ReactFragment'); var traverseAllChildren = require('./traverseAllChildren'); var warning = require('./warning'); var twoArgumentPooler = PooledClass.twoArgumentPooler; var threeArgumentPooler = PooledClass.threeArgumentPooler; function ForEachBookKeeping (forEachFunction, forEachContext) { this.forEachFunction = forEachFunction; this.forEachContext = forEachContext; }PooledClass.addPoolingTo(ForEachBookKeeping, twoArgumentPooler); function forEachSingleChild (traverseContext, child, name, i) { var forEachBookKeeping = traverseContext; forEachBookKeeping.forEachFunction.call(forEachBookKeeping.forEachContext, child, i); } function forEachChildren (children, forEachFunc, forEachContext) { if (children == null) { return children; } var traverseContext = ForEachBookKeeping.getPooled(forEachFunc, forEachContext); traverseAllChildren(children, forEachSingleChild, traverseContext); ForEachBookKeeping.release(traverseContext); } function MapBookKeeping (mapResult, mapFunction, mapContext) { this.mapResult = mapResult; this.mapFunction = mapFunction; this.mapContext = mapContext; }PooledClass.addPoolingTo(MapBookKeeping, threeArgumentPooler); function mapSingleChildIntoContext (traverseContext, child, name, i) { var mapBookKeeping = traverseContext; var mapResult = mapBookKeeping.mapResult; var keyUnique = !mapResult.hasOwnProperty(name); if ('production' !== 'production') { 'production' !== 'production' ? warning(keyUnique, 'ReactChildren.map(...): Encountered two children with the same key, ' + '`%s`. Child keys must be unique; when two children share a key, only ' + 'the first child will be used.', name) : null; } if (keyUnique) { var mappedChild = mapBookKeeping.mapFunction.call(mapBookKeeping.mapContext, child, i); mapResult[name] = mappedChild; } } function mapChildren (children, func, context) { if (children == null) { return children; } var mapResult = {}; var traverseContext = MapBookKeeping.getPooled(mapResult, func, context); traverseAllChildren(children, mapSingleChildIntoContext, traverseContext); MapBookKeeping.release(traverseContext); return ReactFragment.create(mapResult); } function forEachSingleChildDummy (traverseContext, child, name, i) { return null; } function countChildren (children, context) { return traverseAllChildren(children, forEachSingleChildDummy, null); } var ReactChildren = { forEach: forEachChildren, map: mapChildren, count: countChildren }; module.exports = ReactChildren; }, { './PooledClass': 35, './ReactFragment': 71, './traverseAllChildren': 161, './warning': 162 }],\n  41: [function (require, module, exports) { 'use strict'; var ReactComponent = require('./ReactComponent'); var ReactCurrentOwner = require('./ReactCurrentOwner'); var ReactElement = require('./ReactElement'); var ReactErrorUtils = require('./ReactErrorUtils'); var ReactInstanceMap = require('./ReactInstanceMap'); var ReactLifeCycle = require('./ReactLifeCycle'); var ReactPropTypeLocations = require('./ReactPropTypeLocations'); var ReactPropTypeLocationNames = require('./ReactPropTypeLocationNames'); var ReactUpdateQueue = require('./ReactUpdateQueue'); var assign = require('./Object.assign'); var invariant = require('./invariant'); var keyMirror = require('./keyMirror'); var keyOf = require('./keyOf'); var warning = require('./warning'); var MIXINS_KEY = keyOf({ mixins: null }); var SpecPolicy = keyMirror({ DEFINE_ONCE: null, DEFINE_MANY: null, OVERRIDE_BASE: null, DEFINE_MANY_MERGED: null }); var injectedMixins = []; var ReactClassInterface = { mixins: SpecPolicy.DEFINE_MANY, statics: SpecPolicy.DEFINE_MANY, propTypes: SpecPolicy.DEFINE_MANY, contextTypes: SpecPolicy.DEFINE_MANY, childContextTypes: SpecPolicy.DEFINE_MANY, getDefaultProps: SpecPolicy.DEFINE_MANY_MERGED, getInitialState: SpecPolicy.DEFINE_MANY_MERGED, getChildContext: SpecPolicy.DEFINE_MANY_MERGED, render: SpecPolicy.DEFINE_ONCE, componentWillMount: SpecPolicy.DEFINE_MANY, componentDidMount: SpecPolicy.DEFINE_MANY, componentWillReceiveProps: SpecPolicy.DEFINE_MANY, shouldComponentUpdate: SpecPolicy.DEFINE_ONCE, componentWillUpdate: SpecPolicy.DEFINE_MANY, componentDidUpdate: SpecPolicy.DEFINE_MANY, componentWillUnmount: SpecPolicy.DEFINE_MANY, updateComponent: SpecPolicy.OVERRIDE_BASE }; var RESERVED_SPEC_KEYS = { displayName: function (Constructor, displayName) { Constructor.displayName = displayName; }, mixins: function (Constructor, mixins) { if (mixins) { for (var i = 0; i < mixins.length; i++) { mixSpecIntoComponent(Constructor, mixins[i]); } } }, childContextTypes: function (Constructor, childContextTypes) { if ('production' !== 'production') { validateTypeDef(Constructor, childContextTypes, ReactPropTypeLocations.childContext); }Constructor.childContextTypes = assign({}, Constructor.childContextTypes, childContextTypes); }, contextTypes: function (Constructor, contextTypes) { if ('production' !== 'production') { validateTypeDef(Constructor, contextTypes, ReactPropTypeLocations.context); }Constructor.contextTypes = assign({}, Constructor.contextTypes, contextTypes); }, getDefaultProps: function (Constructor, getDefaultProps) { if (Constructor.getDefaultProps) { Constructor.getDefaultProps = createMergedResultFunction(Constructor.getDefaultProps, getDefaultProps); } else { Constructor.getDefaultProps = getDefaultProps; } }, propTypes: function (Constructor, propTypes) { if ('production' !== 'production') { validateTypeDef(Constructor, propTypes, ReactPropTypeLocations.prop); }Constructor.propTypes = assign({}, Constructor.propTypes, propTypes); }, statics: function (Constructor, statics) { mixStaticSpecIntoComponent(Constructor, statics); } }; function validateTypeDef (Constructor, typeDef, location) { for (var propName in typeDef) { if (typeDef.hasOwnProperty(propName)) { 'production' !== 'production' ? warning(typeof typeDef[propName] === 'function', '%s: %s type `%s` is invalid; it must be a function, usually from ' + 'React.PropTypes.', Constructor.displayName || 'ReactClass', ReactPropTypeLocationNames[location], propName) : null; } } } function validateMethodOverride (proto, name) { var specPolicy = ReactClassInterface.hasOwnProperty(name) ? ReactClassInterface[name] : null; if (ReactClassMixin.hasOwnProperty(name)) { 'production' !== 'production' ? invariant(specPolicy === SpecPolicy.OVERRIDE_BASE, 'ReactClassInterface: You are attempting to override ' + '`%s` from your class specification. Ensure that your method names ' + 'do not overlap with React methods.', name) : invariant(specPolicy === SpecPolicy.OVERRIDE_BASE); } if (proto.hasOwnProperty(name)) { 'production' !== 'production' ? invariant(specPolicy === SpecPolicy.DEFINE_MANY || specPolicy === SpecPolicy.DEFINE_MANY_MERGED, 'ReactClassInterface: You are attempting to define ' + '`%s` on your component more than once. This conflict may be due ' + 'to a mixin.', name) : invariant(specPolicy === SpecPolicy.DEFINE_MANY || specPolicy === SpecPolicy.DEFINE_MANY_MERGED); } } function mixSpecIntoComponent (Constructor, spec) { if (!spec) { return; }'production' !== 'production' ? invariant(typeof spec !== 'function', \"ReactClass: You're attempting to \" + 'use a component class as a mixin. Instead, just use a regular object.') : invariant(typeof spec !== 'function'); 'production' !== 'production' ? invariant(!ReactElement.isValidElement(spec), \"ReactClass: You're attempting to \" + 'use a component as a mixin. Instead, just use a regular object.') : invariant(!ReactElement.isValidElement(spec)); var proto = Constructor.prototype; if (spec.hasOwnProperty(MIXINS_KEY)) { RESERVED_SPEC_KEYS.mixins(Constructor, spec.mixins); } for (var name in spec) { if (!spec.hasOwnProperty(name)) { continue; } if (name === MIXINS_KEY) { continue; } var property = spec[name]; validateMethodOverride(proto, name); if (RESERVED_SPEC_KEYS.hasOwnProperty(name)) { RESERVED_SPEC_KEYS[name](Constructor, property); } else { var isReactClassMethod = ReactClassInterface.hasOwnProperty(name); var isAlreadyDefined = proto.hasOwnProperty(name); var markedDontBind = property && property.__reactDontBind; var isFunction = typeof property === 'function'; var shouldAutoBind = isFunction && !isReactClassMethod && !isAlreadyDefined && !markedDontBind; if (shouldAutoBind) { if (!proto.__reactAutoBindMap) { proto.__reactAutoBindMap = {}; }proto.__reactAutoBindMap[name] = property; proto[name] = property; } else { if (isAlreadyDefined) { var specPolicy = ReactClassInterface[name]; 'production' !== 'production' ? invariant(isReactClassMethod && (specPolicy === SpecPolicy.DEFINE_MANY_MERGED || specPolicy === SpecPolicy.DEFINE_MANY), 'ReactClass: Unexpected spec policy %s for key %s ' + 'when mixing in component specs.', specPolicy, name) : invariant(isReactClassMethod && (specPolicy === SpecPolicy.DEFINE_MANY_MERGED || specPolicy === SpecPolicy.DEFINE_MANY)); if (specPolicy === SpecPolicy.DEFINE_MANY_MERGED) { proto[name] = createMergedResultFunction(proto[name], property); } else if (specPolicy === SpecPolicy.DEFINE_MANY) { proto[name] = createChainedFunction(proto[name], property); } } else { proto[name] = property; if ('production' !== 'production') { if (typeof property === 'function' && spec.displayName) { proto[name].displayName = spec.displayName + '_' + name; } } } } } } } function mixStaticSpecIntoComponent (Constructor, statics) { if (!statics) { return; } for (var name in statics) { var property = statics[name]; if (!statics.hasOwnProperty(name)) { continue; } var isReserved = name in RESERVED_SPEC_KEYS; 'production' !== 'production' ? invariant(!isReserved, 'ReactClass: You are attempting to define a reserved ' + 'property, `%s`, that shouldn\\'t be on the \"statics\" key. Define it ' + 'as an instance property instead; it will still be accessible on the ' + 'constructor.', name) : invariant(!isReserved); var isInherited = name in Constructor; 'production' !== 'production' ? invariant(!isInherited, 'ReactClass: You are attempting to define ' + '`%s` on your component more than once. This conflict may be ' + 'due to a mixin.', name) : invariant(!isInherited); Constructor[name] = property; } } function mergeIntoWithNoDuplicateKeys (one, two) { 'production' !== 'production' ? invariant(one && two && typeof one === 'object' && typeof two === 'object', 'mergeIntoWithNoDuplicateKeys(): Cannot merge non-objects.') : invariant(one && two && typeof one === 'object' && typeof two === 'object'); for (var key in two) { if (two.hasOwnProperty(key)) { 'production' !== 'production' ? invariant(one[key] === undefined, 'mergeIntoWithNoDuplicateKeys(): ' + 'Tried to merge two objects with the same key: `%s`. This conflict ' + 'may be due to a mixin; in particular, this may be caused by two ' + 'getInitialState() or getDefaultProps() methods returning objects ' + 'with clashing keys.', key) : invariant(one[key] === undefined); one[key] = two[key]; } } return one; } function createMergedResultFunction (one, two) { return function mergedResult () { var a = one.apply(this, arguments); var b = two.apply(this, arguments); if (a == null) { return b; } else if (b == null) { return a; } var c = {}; mergeIntoWithNoDuplicateKeys(c, a); mergeIntoWithNoDuplicateKeys(c, b); return c; }; } function createChainedFunction (one, two) { return function chainedFunction () { one.apply(this, arguments); two.apply(this, arguments); }; } function bindAutoBindMethod (component, method) { var boundMethod = method.bind(component); if ('production' !== 'production') { boundMethod.__reactBoundContext = component; boundMethod.__reactBoundMethod = method; boundMethod.__reactBoundArguments = null; var componentName = component.constructor.displayName; var _bind = boundMethod.bind; boundMethod.bind = function (newThis) { for (var args = [], $__0 = 1, $__1 = arguments.length; $__0 < $__1; $__0++)args.push(arguments[$__0]); if (newThis !== component && newThis !== null) { 'production' !== 'production' ? warning(false, 'bind(): React component methods may only be bound to the ' + 'component instance. See %s', componentName) : null; } else if (!args.length) { 'production' !== 'production' ? warning(false, 'bind(): You are binding a component method to the component. ' + 'React does this for you automatically in a high-performance ' + 'way, so you can safely remove this call. See %s', componentName) : null; return boundMethod; } var reboundMethod = _bind.apply(boundMethod, arguments); reboundMethod.__reactBoundContext = component; reboundMethod.__reactBoundMethod = method; reboundMethod.__reactBoundArguments = args; return reboundMethod; }; } return boundMethod; } function bindAutoBindMethods (component) { for (var autoBindKey in component.__reactAutoBindMap) { if (component.__reactAutoBindMap.hasOwnProperty(autoBindKey)) { var method = component.__reactAutoBindMap[autoBindKey]; component[autoBindKey] = bindAutoBindMethod(component, ReactErrorUtils.guard(method, component.constructor.displayName + '.' + autoBindKey)); } } } var typeDeprecationDescriptor = { enumerable: false, get: function () { var displayName = this.displayName || this.name || 'Component'; 'production' !== 'production' ? warning(false, '%s.type is deprecated. Use %s directly to access the class.', displayName, displayName) : null; Object.defineProperty(this, 'type', { value: this }); return this; } }; var ReactClassMixin = { replaceState: function (newState, callback) { ReactUpdateQueue.enqueueReplaceState(this, newState); if (callback) { ReactUpdateQueue.enqueueCallback(this, callback); } }, isMounted: function () { if ('production' !== 'production') { var owner = ReactCurrentOwner.current; if (owner !== null) { 'production' !== 'production' ? warning(owner._warnedAboutRefsInRender, '%s is accessing isMounted inside its render() function. ' + 'render() should be a pure function of props and state. It should ' + 'never access something that requires stale data from the previous ' + 'render, such as refs. Move this logic to componentDidMount and ' + 'componentDidUpdate instead.', owner.getName() || 'A component') : null; owner._warnedAboutRefsInRender = true; } } var internalInstance = ReactInstanceMap.get(this); return internalInstance && internalInstance !== ReactLifeCycle.currentlyMountingInstance; }, setProps: function (partialProps, callback) { ReactUpdateQueue.enqueueSetProps(this, partialProps); if (callback) { ReactUpdateQueue.enqueueCallback(this, callback); } }, replaceProps: function (newProps, callback) { ReactUpdateQueue.enqueueReplaceProps(this, newProps); if (callback) { ReactUpdateQueue.enqueueCallback(this, callback); } } }; var ReactClassComponent = function () {}; assign(ReactClassComponent.prototype, ReactComponent.prototype, ReactClassMixin); var ReactClass = { createClass: function (spec) { var Constructor = function (props, context) { if ('production' !== 'production') { 'production' !== 'production' ? warning(this instanceof Constructor, 'Something is calling a React component directly. Use a factory or ' + 'JSX instead. See: https://fb.me/react-legacyfactory') : null; } if (this.__reactAutoBindMap) { bindAutoBindMethods(this); } this.props = props; this.context = context; this.state = null; var initialState = this.getInitialState ? this.getInitialState() : null; if ('production' !== 'production') { if (typeof initialState === 'undefined' && this.getInitialState._isMockFunction) { initialState = null; } }'production' !== 'production' ? invariant(typeof initialState === 'object' && !Array.isArray(initialState), '%s.getInitialState(): must return an object or null', Constructor.displayName || 'ReactCompositeComponent') : invariant(typeof initialState === 'object' && !Array.isArray(initialState)); this.state = initialState; }; Constructor.prototype = new ReactClassComponent(); Constructor.prototype.constructor = Constructor; injectedMixins.forEach(mixSpecIntoComponent.bind(null, Constructor)); mixSpecIntoComponent(Constructor, spec); if (Constructor.getDefaultProps) { Constructor.defaultProps = Constructor.getDefaultProps(); } if ('production' !== 'production') { if (Constructor.getDefaultProps) { Constructor.getDefaultProps.isReactClassApproved = {}; } if (Constructor.prototype.getInitialState) { Constructor.prototype.getInitialState.isReactClassApproved = {}; } }'production' !== 'production' ? invariant(Constructor.prototype.render, 'createClass(...): Class specification must implement a `render` method.') : invariant(Constructor.prototype.render); if ('production' !== 'production') { 'production' !== 'production' ? warning(!Constructor.prototype.componentShouldUpdate, '%s has a method called ' + 'componentShouldUpdate(). Did you mean shouldComponentUpdate()? ' + 'The name is phrased as a question because the function is ' + 'expected to return a value.', spec.displayName || 'A component') : null; } for (var methodName in ReactClassInterface) { if (!Constructor.prototype[methodName]) { Constructor.prototype[methodName] = null; } }Constructor.type = Constructor; if ('production' !== 'production') { try { Object.defineProperty(Constructor, 'type', typeDeprecationDescriptor); } catch (x) {} } return Constructor; }, injection: { injectMixin: function (mixin) { injectedMixins.push(mixin); } } }; module.exports = ReactClass; }, { './Object.assign': 34, './ReactComponent': 42, './ReactCurrentOwner': 47, './ReactElement': 65, './ReactErrorUtils': 68, './ReactInstanceMap': 75, './ReactLifeCycle': 76, './ReactPropTypeLocationNames': 84, './ReactPropTypeLocations': 85, './ReactUpdateQueue': 94, './invariant': 143, './keyMirror': 148, './keyOf': 149, './warning': 162 }],\n  42: [function (require, module, exports) { 'use strict'; var ReactUpdateQueue = require('./ReactUpdateQueue'); var invariant = require('./invariant'); var warning = require('./warning'); function ReactComponent (props, context) { this.props = props; this.context = context; }ReactComponent.prototype.setState = function (partialState, callback) { 'production' !== 'production' ? invariant(typeof partialState === 'object' || typeof partialState === 'function' || partialState == null, 'setState(...): takes an object of state variables to update or a ' + 'function which returns an object of state variables.') : invariant(typeof partialState === 'object' || typeof partialState === 'function' || partialState == null); if ('production' !== 'production') { 'production' !== 'production' ? warning(partialState != null, 'setState(...): You passed an undefined or null state object; ' + 'instead, use forceUpdate().') : null; }ReactUpdateQueue.enqueueSetState(this, partialState); if (callback) { ReactUpdateQueue.enqueueCallback(this, callback); } }; ReactComponent.prototype.forceUpdate = function (callback) { ReactUpdateQueue.enqueueForceUpdate(this); if (callback) { ReactUpdateQueue.enqueueCallback(this, callback); } }; if ('production' !== 'production') { var deprecatedAPIs = { getDOMNode: ['getDOMNode', 'Use React.findDOMNode(component) instead.'], isMounted: ['isMounted', 'Instead, make sure to clean up subscriptions and pending requests in ' + 'componentWillUnmount to prevent memory leaks.'], replaceProps: ['replaceProps', 'Instead, call React.render again at the top level.'], replaceState: ['replaceState', 'Refactor your code to use setState instead (see ' + 'https://github.com/facebook/react/issues/3236).'], setProps: ['setProps', 'Instead, call React.render again at the top level.'] }; var defineDeprecationWarning = function (methodName, info) { try { Object.defineProperty(ReactComponent.prototype, methodName, { get: function () { 'production' !== 'production' ? warning(false, '%s(...) is deprecated in plain JavaScript React classes. %s', info[0], info[1]) : null; return undefined; } }); } catch (x) {} }; for (var fnName in deprecatedAPIs) { if (deprecatedAPIs.hasOwnProperty(fnName)) { defineDeprecationWarning(fnName, deprecatedAPIs[fnName]); } } }module.exports = ReactComponent; }, { './ReactUpdateQueue': 94, './invariant': 143, './warning': 162 }],\n  43: [function (require, module, exports) { 'use strict'; var ReactDOMIDOperations = require('./ReactDOMIDOperations'); var ReactMount = require('./ReactMount'); var ReactComponentBrowserEnvironment = { processChildrenUpdates: ReactDOMIDOperations.dangerouslyProcessChildrenUpdates, replaceNodeWithMarkupByID: ReactDOMIDOperations.dangerouslyReplaceNodeWithMarkupByID, unmountIDFromEnvironment: function (rootNodeID) { ReactMount.purgeID(rootNodeID); } }; module.exports = ReactComponentBrowserEnvironment; }, { './ReactDOMIDOperations': 52, './ReactMount': 78 }],\n  44: [function (require, module, exports) { 'use strict'; var invariant = require('./invariant'); var injected = false; var ReactComponentEnvironment = { unmountIDFromEnvironment: null, replaceNodeWithMarkupByID: null, processChildrenUpdates: null, injection: { injectEnvironment: function (environment) { 'production' !== 'production' ? invariant(!injected, 'ReactCompositeComponent: injectEnvironment() can only be called once.') : invariant(!injected); ReactComponentEnvironment.unmountIDFromEnvironment = environment.unmountIDFromEnvironment; ReactComponentEnvironment.replaceNodeWithMarkupByID = environment.replaceNodeWithMarkupByID; ReactComponentEnvironment.processChildrenUpdates = environment.processChildrenUpdates; injected = true; } } }; module.exports = ReactComponentEnvironment; }, { './invariant': 143 }],\n  45: [function (require, module, exports) {\n    'use strict'; var ReactComponentEnvironment = require('./ReactComponentEnvironment'); var ReactContext = require('./ReactContext'); var ReactCurrentOwner = require('./ReactCurrentOwner'); var ReactElement = require('./ReactElement'); var ReactElementValidator = require('./ReactElementValidator'); var ReactInstanceMap = require('./ReactInstanceMap'); var ReactLifeCycle = require('./ReactLifeCycle'); var ReactNativeComponent = require('./ReactNativeComponent'); var ReactPerf = require('./ReactPerf'); var ReactPropTypeLocations = require('./ReactPropTypeLocations'); var ReactPropTypeLocationNames = require('./ReactPropTypeLocationNames'); var ReactReconciler = require('./ReactReconciler'); var ReactUpdates = require('./ReactUpdates'); var assign = require('./Object.assign'); var emptyObject = require('./emptyObject'); var invariant = require('./invariant'); var shouldUpdateReactComponent = require('./shouldUpdateReactComponent'); var warning = require('./warning'); function getDeclarationErrorAddendum (component) { var owner = component._currentElement._owner || null; if (owner) { var name = owner.getName(); if (name) { return ' Check the render method of `' + name + '`.'; } } return ''; } var nextMountID = 1; var ReactCompositeComponentMixin = { construct: function (element) { this._currentElement = element; this._rootNodeID = null; this._instance = null; this._pendingElement = null; this._pendingStateQueue = null; this._pendingReplaceState = false; this._pendingForceUpdate = false; this._renderedComponent = null; this._context = null; this._mountOrder = 0; this._isTopLevel = false; this._pendingCallbacks = null; },\n      mountComponent: function (rootID, transaction, context) { this._context = context; this._mountOrder = nextMountID++; this._rootNodeID = rootID; var publicProps = this._processProps(this._currentElement.props); var publicContext = this._processContext(this._currentElement._context); var Component = ReactNativeComponent.getComponentClassForElement(this._currentElement); var inst = new Component(publicProps, publicContext); if ('production' !== 'production') { 'production' !== 'production' ? warning(inst.render != null, '%s(...): No `render` method found on the returned component ' + 'instance: you may have forgotten to define `render` in your ' + 'component or you may have accidentally tried to render an element ' + \"whose type is a function that isn't a React component.\", Component.displayName || Component.name || 'Component') : null; }inst.props = publicProps; inst.context = publicContext; inst.refs = emptyObject; this._instance = inst; ReactInstanceMap.set(inst, this); if ('production' !== 'production') { this._warnIfContextsDiffer(this._currentElement._context, context); } if ('production' !== 'production') { 'production' !== 'production' ? warning(!inst.getInitialState || inst.getInitialState.isReactClassApproved, 'getInitialState was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Did you mean to define a state property instead?', this.getName() || 'a component') : null; 'production' !== 'production' ? warning(!inst.getDefaultProps || inst.getDefaultProps.isReactClassApproved, 'getDefaultProps was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Use a static property to define defaultProps instead.', this.getName() || 'a component') : null; 'production' !== 'production' ? warning(!inst.propTypes, 'propTypes was defined as an instance property on %s. Use a static ' + 'property to define propTypes instead.', this.getName() || 'a component') : null; 'production' !== 'production' ? warning(!inst.contextTypes, 'contextTypes was defined as an instance property on %s. Use a ' + 'static property to define contextTypes instead.', this.getName() || 'a component') : null; 'production' !== 'production' ? warning(typeof inst.componentShouldUpdate !== 'function', '%s has a method called ' + 'componentShouldUpdate(). Did you mean shouldComponentUpdate()? ' + 'The name is phrased as a question because the function is ' + 'expected to return a value.', this.getName() || 'A component') : null; } var initialState = inst.state; if (initialState === undefined) { inst.state = initialState = null; }'production' !== 'production' ? invariant(typeof initialState === 'object' && !Array.isArray(initialState), '%s.state: must be set to an object or null', this.getName() || 'ReactCompositeComponent') : invariant(typeof initialState === 'object' && !Array.isArray(initialState)); this._pendingStateQueue = null; this._pendingReplaceState = false; this._pendingForceUpdate = false; var childContext; var renderedElement; var previouslyMounting = ReactLifeCycle.currentlyMountingInstance; ReactLifeCycle.currentlyMountingInstance = this; try { if (inst.componentWillMount) { inst.componentWillMount(); if (this._pendingStateQueue) { inst.state = this._processPendingState(inst.props, inst.context); } }childContext = this._getValidatedChildContext(context); renderedElement = this._renderValidatedComponent(childContext); } finally { ReactLifeCycle.currentlyMountingInstance = previouslyMounting; } this._renderedComponent = this._instantiateReactComponent(renderedElement, this._currentElement.type); var markup = ReactReconciler.mountComponent(this._renderedComponent, rootID, transaction, this._mergeChildContext(context, childContext)); if (inst.componentDidMount) { transaction.getReactMountReady().enqueue(inst.componentDidMount, inst); } return markup; },\n      unmountComponent: function () { var inst = this._instance; if (inst.componentWillUnmount) { var previouslyUnmounting = ReactLifeCycle.currentlyUnmountingInstance; ReactLifeCycle.currentlyUnmountingInstance = this; try { inst.componentWillUnmount(); } finally { ReactLifeCycle.currentlyUnmountingInstance = previouslyUnmounting; } }ReactReconciler.unmountComponent(this._renderedComponent); this._renderedComponent = null; this._pendingStateQueue = null; this._pendingReplaceState = false; this._pendingForceUpdate = false; this._pendingCallbacks = null; this._pendingElement = null; this._context = null; this._rootNodeID = null; ReactInstanceMap.remove(inst); },\n      _setPropsInternal: function (partialProps, callback) { var element = this._pendingElement || this._currentElement; this._pendingElement = ReactElement.cloneAndReplaceProps(element, assign({}, element.props, partialProps)); ReactUpdates.enqueueUpdate(this, callback); },\n      _maskContext: function (context) { var maskedContext = null; if (typeof this._currentElement.type === 'string') { return emptyObject; } var contextTypes = this._currentElement.type.contextTypes; if (!contextTypes) { return emptyObject; }maskedContext = {}; for (var contextName in contextTypes) { maskedContext[contextName] = context[contextName]; } return maskedContext; },\n      _processContext: function (context) { var maskedContext = this._maskContext(context); if ('production' !== 'production') { var Component = ReactNativeComponent.getComponentClassForElement(this._currentElement); if (Component.contextTypes) { this._checkPropTypes(Component.contextTypes, maskedContext, ReactPropTypeLocations.context); } } return maskedContext; },\n      _getValidatedChildContext: function (currentContext) {\n        var inst = this._instance; var childContext = inst.getChildContext && inst.getChildContext(); if (childContext) { 'production' !== 'production' ? invariant(typeof inst.constructor.childContextTypes === 'object', '%s.getChildContext(): childContextTypes must be defined in order to ' + 'use getChildContext().', this.getName() || 'ReactCompositeComponent') : invariant(typeof inst.constructor.childContextTypes === 'object'); if ('production' !== 'production') { this._checkPropTypes(inst.constructor.childContextTypes, childContext, ReactPropTypeLocations.childContext); } for (var name in childContext) { 'production' !== 'production' ? invariant(name in inst.constructor.childContextTypes, '%s.getChildContext(): key \"%s\" is not defined in childContextTypes.', this.getName() || 'ReactCompositeComponent', name) : invariant(name in inst.constructor.childContextTypes); } return childContext; } return null;\n      },\n      _mergeChildContext: function (currentContext, childContext) { if (childContext) { return assign({}, currentContext, childContext); } return currentContext; },\n      _processProps: function (newProps) { if ('production' !== 'production') { var Component = ReactNativeComponent.getComponentClassForElement(this._currentElement); if (Component.propTypes) { this._checkPropTypes(Component.propTypes, newProps, ReactPropTypeLocations.prop); } } return newProps; },\n      _checkPropTypes: function (propTypes, props, location) { var componentName = this.getName(); for (var propName in propTypes) { if (propTypes.hasOwnProperty(propName)) { var error; try { 'production' !== 'production' ? invariant(typeof propTypes[propName] === 'function', '%s: %s type `%s` is invalid; it must be a function, usually ' + 'from React.PropTypes.', componentName || 'React class', ReactPropTypeLocationNames[location], propName) : invariant(typeof propTypes[propName] === 'function'); error = propTypes[propName](props, propName, componentName, location); } catch (ex) { error = ex; } if (error instanceof Error) { var addendum = getDeclarationErrorAddendum(this); if (location === ReactPropTypeLocations.prop) { 'production' !== 'production' ? warning(false, 'Failed Composite propType: %s%s', error.message, addendum) : null; } else { 'production' !== 'production' ? warning(false, 'Failed Context Types: %s%s', error.message, addendum) : null; } } } } },\n      receiveComponent: function (nextElement, transaction, nextContext) { var prevElement = this._currentElement; var prevContext = this._context; this._pendingElement = null; this.updateComponent(transaction, prevElement, nextElement, prevContext, nextContext); },\n      performUpdateIfNecessary: function (transaction) { if (this._pendingElement != null) { ReactReconciler.receiveComponent(this, this._pendingElement || this._currentElement, transaction, this._context); } if (this._pendingStateQueue !== null || this._pendingForceUpdate) { if ('production' !== 'production') { ReactElementValidator.checkAndWarnForMutatedProps(this._currentElement); } this.updateComponent(transaction, this._currentElement, this._currentElement, this._context, this._context); } },\n      _warnIfContextsDiffer: function (ownerBasedContext, parentBasedContext) { ownerBasedContext = this._maskContext(ownerBasedContext); parentBasedContext = this._maskContext(parentBasedContext); var parentKeys = Object.keys(parentBasedContext).sort(); var displayName = this.getName() || 'ReactCompositeComponent'; for (var i = 0; i < parentKeys.length; i++) { var key = parentKeys[i]; 'production' !== 'production' ? warning(ownerBasedContext[key] === parentBasedContext[key], 'owner-based and parent-based contexts differ ' + '(values: `%s` vs `%s`) for key (%s) while mounting %s ' + '(see: http://fb.me/react-context-by-parent)', ownerBasedContext[key], parentBasedContext[key], key, displayName) : null; } },\n      updateComponent: function (transaction, prevParentElement, nextParentElement, prevUnmaskedContext, nextUnmaskedContext) { var inst = this._instance; var nextContext = inst.context; var nextProps = inst.props; if (prevParentElement !== nextParentElement) { nextContext = this._processContext(nextParentElement._context); nextProps = this._processProps(nextParentElement.props); if ('production' !== 'production') { if (nextUnmaskedContext != null) { this._warnIfContextsDiffer(nextParentElement._context, nextUnmaskedContext); } } if (inst.componentWillReceiveProps) { inst.componentWillReceiveProps(nextProps, nextContext); } } var nextState = this._processPendingState(nextProps, nextContext); var shouldUpdate = this._pendingForceUpdate || !inst.shouldComponentUpdate || inst.shouldComponentUpdate(nextProps, nextState, nextContext); if ('production' !== 'production') { 'production' !== 'production' ? warning(typeof shouldUpdate !== 'undefined', '%s.shouldComponentUpdate(): Returned undefined instead of a ' + 'boolean value. Make sure to return true or false.', this.getName() || 'ReactCompositeComponent') : null; } if (shouldUpdate) { this._pendingForceUpdate = false; this._performComponentUpdate(nextParentElement, nextProps, nextState, nextContext, transaction, nextUnmaskedContext); } else { this._currentElement = nextParentElement; this._context = nextUnmaskedContext; inst.props = nextProps; inst.state = nextState; inst.context = nextContext; } },\n      _processPendingState: function (props, context) { var inst = this._instance; var queue = this._pendingStateQueue; var replace = this._pendingReplaceState; this._pendingReplaceState = false; this._pendingStateQueue = null; if (!queue) { return inst.state; } if (replace && queue.length === 1) { return queue[0]; } var nextState = assign({}, replace ? queue[0] : inst.state); for (var i = replace ? 1 : 0; i < queue.length; i++) { var partial = queue[i]; assign(nextState, typeof partial === 'function' ? partial.call(inst, nextState, props, context) : partial); } return nextState; },\n      _performComponentUpdate: function (nextElement, nextProps, nextState, nextContext, transaction, unmaskedContext) { var inst = this._instance; var prevProps = inst.props; var prevState = inst.state; var prevContext = inst.context; if (inst.componentWillUpdate) { inst.componentWillUpdate(nextProps, nextState, nextContext); } this._currentElement = nextElement; this._context = unmaskedContext; inst.props = nextProps; inst.state = nextState; inst.context = nextContext; this._updateRenderedComponent(transaction, unmaskedContext); if (inst.componentDidUpdate) { transaction.getReactMountReady().enqueue(inst.componentDidUpdate.bind(inst, prevProps, prevState, prevContext), inst); } },\n      _updateRenderedComponent: function (transaction, context) { var prevComponentInstance = this._renderedComponent; var prevRenderedElement = prevComponentInstance._currentElement; var childContext = this._getValidatedChildContext(); var nextRenderedElement = this._renderValidatedComponent(childContext); if (shouldUpdateReactComponent(prevRenderedElement, nextRenderedElement)) { ReactReconciler.receiveComponent(prevComponentInstance, nextRenderedElement, transaction, this._mergeChildContext(context, childContext)); } else { var thisID = this._rootNodeID; var prevComponentID = prevComponentInstance._rootNodeID; ReactReconciler.unmountComponent(prevComponentInstance); this._renderedComponent = this._instantiateReactComponent(nextRenderedElement, this._currentElement.type); var nextMarkup = ReactReconciler.mountComponent(this._renderedComponent, thisID, transaction, this._mergeChildContext(context, childContext)); this._replaceNodeWithMarkupByID(prevComponentID, nextMarkup); } },\n      _replaceNodeWithMarkupByID: function (prevComponentID, nextMarkup) { ReactComponentEnvironment.replaceNodeWithMarkupByID(prevComponentID, nextMarkup); },\n      _renderValidatedComponentWithoutOwnerOrContext: function () { var inst = this._instance; var renderedComponent = inst.render(); if ('production' !== 'production') { if (typeof renderedComponent === 'undefined' && inst.render._isMockFunction) { renderedComponent = null; } } return renderedComponent; },\n      _renderValidatedComponent: function (childContext) { var renderedComponent; var previousContext = ReactContext.current; ReactContext.current = this._mergeChildContext(this._currentElement._context, childContext); ReactCurrentOwner.current = this; try { renderedComponent = this._renderValidatedComponentWithoutOwnerOrContext(); } finally { ReactContext.current = previousContext; ReactCurrentOwner.current = null; }'production' !== 'production' ? invariant(renderedComponent === null || renderedComponent === false || ReactElement.isValidElement(renderedComponent), '%s.render(): A valid ReactComponent must be returned. You may have ' + 'returned undefined, an array or some other invalid object.', this.getName() || 'ReactCompositeComponent') : invariant(renderedComponent === null || renderedComponent === false || ReactElement.isValidElement(renderedComponent)); return renderedComponent; },\n      attachRef: function (ref, component) { var inst = this.getPublicInstance(); var refs = inst.refs === emptyObject ? inst.refs = {} : inst.refs; refs[ref] = component.getPublicInstance(); },\n      detachRef: function (ref) { var refs = this.getPublicInstance().refs; delete refs[ref]; },\n      getName: function () { var type = this._currentElement.type; var constructor = this._instance && this._instance.constructor; return type.displayName || constructor && constructor.displayName || type.name || constructor && constructor.name || null; },\n      getPublicInstance: function () { return this._instance; },\n      _instantiateReactComponent: null }; ReactPerf.measureMethods(ReactCompositeComponentMixin, 'ReactCompositeComponent', { mountComponent: 'mountComponent', updateComponent: 'updateComponent', _renderValidatedComponent: '_renderValidatedComponent' }); var ReactCompositeComponent = { Mixin: ReactCompositeComponentMixin }; module.exports = ReactCompositeComponent;\n  }, { './Object.assign': 34, './ReactComponentEnvironment': 44, './ReactContext': 46, './ReactCurrentOwner': 47, './ReactElement': 65, './ReactElementValidator': 66, './ReactInstanceMap': 75, './ReactLifeCycle': 76, './ReactNativeComponent': 81, './ReactPerf': 83, './ReactPropTypeLocationNames': 84, './ReactPropTypeLocations': 85, './ReactReconciler': 89, './ReactUpdates': 95, './emptyObject': 123, './invariant': 143, './shouldUpdateReactComponent': 159, './warning': 162 }],\n  46: [function (require, module, exports) { 'use strict'; var assign = require('./Object.assign'); var emptyObject = require('./emptyObject'); var warning = require('./warning'); var didWarn = false; var ReactContext = { current: emptyObject, withContext: function (newContext, scopedCallback) { if ('production' !== 'production') { 'production' !== 'production' ? warning(didWarn, 'withContext is deprecated and will be removed in a future version. ' + 'Use a wrapper component with getChildContext instead.') : null; didWarn = true; } var result; var previousContext = ReactContext.current; ReactContext.current = assign({}, previousContext, newContext); try { result = scopedCallback(); } finally { ReactContext.current = previousContext; } return result; } }; module.exports = ReactContext; }, { './Object.assign': 34, './emptyObject': 123, './warning': 162 }],\n  47: [function (require, module, exports) { 'use strict'; var ReactCurrentOwner = { current: null }; module.exports = ReactCurrentOwner; }, {}],\n  48: [function (require, module, exports) { 'use strict'; var ReactElement = require('./ReactElement'); var ReactElementValidator = require('./ReactElementValidator'); var mapObject = require('./mapObject'); function createDOMFactory (tag) { if ('production' !== 'production') { return ReactElementValidator.createFactory(tag); } return ReactElement.createFactory(tag); } var ReactDOM = mapObject({ a: 'a', abbr: 'abbr', address: 'address', area: 'area', article: 'article', aside: 'aside', audio: 'audio', b: 'b', base: 'base', bdi: 'bdi', bdo: 'bdo', big: 'big', blockquote: 'blockquote', body: 'body', br: 'br', button: 'button', canvas: 'canvas', caption: 'caption', cite: 'cite', code: 'code', col: 'col', colgroup: 'colgroup', data: 'data', datalist: 'datalist', dd: 'dd', del: 'del', details: 'details', dfn: 'dfn', dialog: 'dialog', div: 'div', dl: 'dl', dt: 'dt', em: 'em', embed: 'embed', fieldset: 'fieldset', figcaption: 'figcaption', figure: 'figure', footer: 'footer', form: 'form', h1: 'h1', h2: 'h2', h3: 'h3', h4: 'h4', h5: 'h5', h6: 'h6', head: 'head', header: 'header', hr: 'hr', html: 'html', i: 'i', iframe: 'iframe', img: 'img', input: 'input', ins: 'ins', kbd: 'kbd', keygen: 'keygen', label: 'label', legend: 'legend', li: 'li', link: 'link', main: 'main', map: 'map', mark: 'mark', menu: 'menu', menuitem: 'menuitem', meta: 'meta', meter: 'meter', nav: 'nav', noscript: 'noscript', object: 'object', ol: 'ol', optgroup: 'optgroup', option: 'option', output: 'output', p: 'p', param: 'param', picture: 'picture', pre: 'pre', progress: 'progress', q: 'q', rp: 'rp', rt: 'rt', ruby: 'ruby', s: 's', samp: 'samp', script: 'script', section: 'section', select: 'select', small: 'small', source: 'source', span: 'span', strong: 'strong', style: 'style', sub: 'sub', summary: 'summary', sup: 'sup', table: 'table', tbody: 'tbody', td: 'td', textarea: 'textarea', tfoot: 'tfoot', th: 'th', thead: 'thead', time: 'time', title: 'title', tr: 'tr', track: 'track', u: 'u', ul: 'ul', var: 'var', video: 'video', wbr: 'wbr', circle: 'circle', clipPath: 'clipPath', defs: 'defs', ellipse: 'ellipse', g: 'g', line: 'line', linearGradient: 'linearGradient', mask: 'mask', path: 'path', pattern: 'pattern', polygon: 'polygon', polyline: 'polyline', radialGradient: 'radialGradient', rect: 'rect', stop: 'stop', svg: 'svg', text: 'text', tspan: 'tspan' }, createDOMFactory); module.exports = ReactDOM; }, { './ReactElement': 65, './ReactElementValidator': 66, './mapObject': 150 }],\n  49: [function (require, module, exports) { 'use strict'; var AutoFocusMixin = require('./AutoFocusMixin'); var ReactBrowserComponentMixin = require('./ReactBrowserComponentMixin'); var ReactClass = require('./ReactClass'); var ReactElement = require('./ReactElement'); var keyMirror = require('./keyMirror'); var button = ReactElement.createFactory('button'); var mouseListenerNames = keyMirror({ onClick: true, onDoubleClick: true, onMouseDown: true, onMouseMove: true, onMouseUp: true, onClickCapture: true, onDoubleClickCapture: true, onMouseDownCapture: true, onMouseMoveCapture: true, onMouseUpCapture: true }); var ReactDOMButton = ReactClass.createClass({ displayName: 'ReactDOMButton', tagName: 'BUTTON', mixins: [AutoFocusMixin, ReactBrowserComponentMixin], render: function () { var props = {}; for (var key in this.props) { if (this.props.hasOwnProperty(key) && (!this.props.disabled || !mouseListenerNames[key])) { props[key] = this.props[key]; } } return button(props, this.props.children); } }); module.exports = ReactDOMButton; }, { './AutoFocusMixin': 9, './ReactBrowserComponentMixin': 37, './ReactClass': 41, './ReactElement': 65, './keyMirror': 148 }],\n  50: [function (require, module, exports) { 'use strict'; var CSSPropertyOperations = require('./CSSPropertyOperations'); var DOMProperty = require('./DOMProperty'); var DOMPropertyOperations = require('./DOMPropertyOperations'); var ReactBrowserEventEmitter = require('./ReactBrowserEventEmitter'); var ReactComponentBrowserEnvironment = require('./ReactComponentBrowserEnvironment'); var ReactMount = require('./ReactMount'); var ReactMultiChild = require('./ReactMultiChild'); var ReactPerf = require('./ReactPerf'); var assign = require('./Object.assign'); var escapeTextContentForBrowser = require('./escapeTextContentForBrowser'); var invariant = require('./invariant'); var isEventSupported = require('./isEventSupported'); var keyOf = require('./keyOf'); var warning = require('./warning'); var deleteListener = ReactBrowserEventEmitter.deleteListener; var listenTo = ReactBrowserEventEmitter.listenTo; var registrationNameModules = ReactBrowserEventEmitter.registrationNameModules; var CONTENT_TYPES = { string: true, number: true }; var STYLE = keyOf({ style: null }); var ELEMENT_NODE_TYPE = 1; var BackendIDOperations = null; function assertValidProps (props) { if (!props) { return; } if (props.dangerouslySetInnerHTML != null) { 'production' !== 'production' ? invariant(props.children == null, 'Can only set one of `children` or `props.dangerouslySetInnerHTML`.') : invariant(props.children == null); 'production' !== 'production' ? invariant(typeof props.dangerouslySetInnerHTML === 'object' && '__html' in props.dangerouslySetInnerHTML, '`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. ' + 'Please visit https://fb.me/react-invariant-dangerously-set-inner-html ' + 'for more information.') : invariant(typeof props.dangerouslySetInnerHTML === 'object' && '__html' in props.dangerouslySetInnerHTML); } if ('production' !== 'production') { 'production' !== 'production' ? warning(props.innerHTML == null, 'Directly setting property `innerHTML` is not permitted. ' + 'For more information, lookup documentation on `dangerouslySetInnerHTML`.') : null; 'production' !== 'production' ? warning(!props.contentEditable || props.children == null, 'A component is `contentEditable` and contains `children` managed by ' + 'React. It is now your responsibility to guarantee that none of ' + 'those nodes are unexpectedly modified or duplicated. This is ' + 'probably not intentional.') : null; }'production' !== 'production' ? invariant(props.style == null || typeof props.style === 'object', 'The `style` prop expects a mapping from style properties to values, ' + \"not a string. For example, style={{marginRight: spacing + 'em'}} when \" + 'using JSX.') : invariant(props.style == null || typeof props.style === 'object'); } function putListener (id, registrationName, listener, transaction) { if ('production' !== 'production') { 'production' !== 'production' ? warning(registrationName !== 'onScroll' || isEventSupported('scroll', true), \"This browser doesn't support the `onScroll` event\") : null; } var container = ReactMount.findReactContainerForID(id); if (container) { var doc = container.nodeType === ELEMENT_NODE_TYPE ? container.ownerDocument : container; listenTo(registrationName, doc); }transaction.getPutListenerQueue().enqueuePutListener(id, registrationName, listener); } var omittedCloseTags = { area: true, base: true, br: true, col: true, embed: true, hr: true, img: true, input: true, keygen: true, link: true, meta: true, param: true, source: true, track: true, wbr: true }; var VALID_TAG_REGEX = /^[a-zA-Z][a-zA-Z:_\\.\\-\\d]*$/; var validatedTagCache = {}; var hasOwnProperty = {}.hasOwnProperty; function validateDangerousTag (tag) { if (!hasOwnProperty.call(validatedTagCache, tag)) { 'production' !== 'production' ? invariant(VALID_TAG_REGEX.test(tag), 'Invalid tag: %s', tag) : invariant(VALID_TAG_REGEX.test(tag)); validatedTagCache[tag] = true; } } function ReactDOMComponent (tag) { validateDangerousTag(tag); this._tag = tag; this._renderedChildren = null; this._previousStyleCopy = null; this._rootNodeID = null; }ReactDOMComponent.displayName = 'ReactDOMComponent'; ReactDOMComponent.Mixin = { construct: function (element) { this._currentElement = element; }, mountComponent: function (rootID, transaction, context) { this._rootNodeID = rootID; assertValidProps(this._currentElement.props); var closeTag = omittedCloseTags[this._tag] ? '' : '</' + this._tag + '>'; return this._createOpenTagMarkupAndPutListeners(transaction) + this._createContentMarkup(transaction, context) + closeTag; }, _createOpenTagMarkupAndPutListeners: function (transaction) { var props = this._currentElement.props; var ret = '<' + this._tag; for (var propKey in props) { if (!props.hasOwnProperty(propKey)) { continue; } var propValue = props[propKey]; if (propValue == null) { continue; } if (registrationNameModules.hasOwnProperty(propKey)) { putListener(this._rootNodeID, propKey, propValue, transaction); } else { if (propKey === STYLE) { if (propValue) { propValue = this._previousStyleCopy = assign({}, props.style); }propValue = CSSPropertyOperations.createMarkupForStyles(propValue); } var markup = DOMPropertyOperations.createMarkupForProperty(propKey, propValue); if (markup) { ret += ' ' + markup; } } } if (transaction.renderToStaticMarkup) { return ret + '>'; } var markupForID = DOMPropertyOperations.createMarkupForID(this._rootNodeID); return ret + ' ' + markupForID + '>'; }, _createContentMarkup: function (transaction, context) { var prefix = ''; if (this._tag === 'listing' || this._tag === 'pre' || this._tag === 'textarea') { prefix = '\\n'; } var props = this._currentElement.props; var innerHTML = props.dangerouslySetInnerHTML; if (innerHTML != null) { if (innerHTML.__html != null) { return prefix + innerHTML.__html; } } else { var contentToUse = CONTENT_TYPES[typeof props.children] ? props.children : null; var childrenToUse = contentToUse != null ? null : props.children; if (contentToUse != null) { return prefix + escapeTextContentForBrowser(contentToUse); } else if (childrenToUse != null) { var mountImages = this.mountChildren(childrenToUse, transaction, context); return prefix + mountImages.join(''); } } return prefix; }, receiveComponent: function (nextElement, transaction, context) { var prevElement = this._currentElement; this._currentElement = nextElement; this.updateComponent(transaction, prevElement, nextElement, context); }, updateComponent: function (transaction, prevElement, nextElement, context) { assertValidProps(this._currentElement.props); this._updateDOMProperties(prevElement.props, transaction); this._updateDOMChildren(prevElement.props, transaction, context); }, _updateDOMProperties: function (lastProps, transaction) { var nextProps = this._currentElement.props; var propKey; var styleName; var styleUpdates; for (propKey in lastProps) { if (nextProps.hasOwnProperty(propKey) || !lastProps.hasOwnProperty(propKey)) { continue; } if (propKey === STYLE) { var lastStyle = this._previousStyleCopy; for (styleName in lastStyle) { if (lastStyle.hasOwnProperty(styleName)) { styleUpdates = styleUpdates || {}; styleUpdates[styleName] = ''; } } this._previousStyleCopy = null; } else if (registrationNameModules.hasOwnProperty(propKey)) { deleteListener(this._rootNodeID, propKey); } else if (DOMProperty.isStandardName[propKey] || DOMProperty.isCustomAttribute(propKey)) { BackendIDOperations.deletePropertyByID(this._rootNodeID, propKey); } } for (propKey in nextProps) { var nextProp = nextProps[propKey]; var lastProp = propKey === STYLE ? this._previousStyleCopy : lastProps[propKey]; if (!nextProps.hasOwnProperty(propKey) || nextProp === lastProp) { continue; } if (propKey === STYLE) { if (nextProp) { nextProp = this._previousStyleCopy = assign({}, nextProp); } else { this._previousStyleCopy = null; } if (lastProp) { for (styleName in lastProp) { if (lastProp.hasOwnProperty(styleName) && (!nextProp || !nextProp.hasOwnProperty(styleName))) { styleUpdates = styleUpdates || {}; styleUpdates[styleName] = ''; } } for (styleName in nextProp) { if (nextProp.hasOwnProperty(styleName) && lastProp[styleName] !== nextProp[styleName]) { styleUpdates = styleUpdates || {}; styleUpdates[styleName] = nextProp[styleName]; } } } else { styleUpdates = nextProp; } } else if (registrationNameModules.hasOwnProperty(propKey)) { putListener(this._rootNodeID, propKey, nextProp, transaction); } else if (DOMProperty.isStandardName[propKey] || DOMProperty.isCustomAttribute(propKey)) { BackendIDOperations.updatePropertyByID(this._rootNodeID, propKey, nextProp); } } if (styleUpdates) { BackendIDOperations.updateStylesByID(this._rootNodeID, styleUpdates); } }, _updateDOMChildren: function (lastProps, transaction, context) { var nextProps = this._currentElement.props; var lastContent = CONTENT_TYPES[typeof lastProps.children] ? lastProps.children : null; var nextContent = CONTENT_TYPES[typeof nextProps.children] ? nextProps.children : null; var lastHtml = lastProps.dangerouslySetInnerHTML && lastProps.dangerouslySetInnerHTML.__html; var nextHtml = nextProps.dangerouslySetInnerHTML && nextProps.dangerouslySetInnerHTML.__html; var lastChildren = lastContent != null ? null : lastProps.children; var nextChildren = nextContent != null ? null : nextProps.children; var lastHasContentOrHtml = lastContent != null || lastHtml != null; var nextHasContentOrHtml = nextContent != null || nextHtml != null; if (lastChildren != null && nextChildren == null) { this.updateChildren(null, transaction, context); } else if (lastHasContentOrHtml && !nextHasContentOrHtml) { this.updateTextContent(''); } if (nextContent != null) { if (lastContent !== nextContent) { this.updateTextContent('' + nextContent); } } else if (nextHtml != null) { if (lastHtml !== nextHtml) { BackendIDOperations.updateInnerHTMLByID(this._rootNodeID, nextHtml); } } else if (nextChildren != null) { this.updateChildren(nextChildren, transaction, context); } }, unmountComponent: function () { this.unmountChildren(); ReactBrowserEventEmitter.deleteAllListeners(this._rootNodeID); ReactComponentBrowserEnvironment.unmountIDFromEnvironment(this._rootNodeID); this._rootNodeID = null; } }; ReactPerf.measureMethods(ReactDOMComponent, 'ReactDOMComponent', { mountComponent: 'mountComponent', updateComponent: 'updateComponent' }); assign(ReactDOMComponent.prototype, ReactDOMComponent.Mixin, ReactMultiChild.Mixin); ReactDOMComponent.injection = { injectIDOperations: function (IDOperations) { ReactDOMComponent.BackendIDOperations = BackendIDOperations = IDOperations; } }; module.exports = ReactDOMComponent; }, { './CSSPropertyOperations': 12, './DOMProperty': 17, './DOMPropertyOperations': 18, './Object.assign': 34, './ReactBrowserEventEmitter': 38, './ReactComponentBrowserEnvironment': 43, './ReactMount': 78, './ReactMultiChild': 79, './ReactPerf': 83, './escapeTextContentForBrowser': 124, './invariant': 143, './isEventSupported': 144, './keyOf': 149, './warning': 162 }],\n  51: [function (require, module, exports) { 'use strict'; var EventConstants = require('./EventConstants'); var LocalEventTrapMixin = require('./LocalEventTrapMixin'); var ReactBrowserComponentMixin = require('./ReactBrowserComponentMixin'); var ReactClass = require('./ReactClass'); var ReactElement = require('./ReactElement'); var form = ReactElement.createFactory('form'); var ReactDOMForm = ReactClass.createClass({ displayName: 'ReactDOMForm', tagName: 'FORM', mixins: [ReactBrowserComponentMixin, LocalEventTrapMixin], render: function () { return form(this.props); }, componentDidMount: function () { this.trapBubbledEvent(EventConstants.topLevelTypes.topReset, 'reset'); this.trapBubbledEvent(EventConstants.topLevelTypes.topSubmit, 'submit'); } }); module.exports = ReactDOMForm; }, { './EventConstants': 22, './LocalEventTrapMixin': 32, './ReactBrowserComponentMixin': 37, './ReactClass': 41, './ReactElement': 65 }],\n  52: [function (require, module, exports) { 'use strict'; var CSSPropertyOperations = require('./CSSPropertyOperations'); var DOMChildrenOperations = require('./DOMChildrenOperations'); var DOMPropertyOperations = require('./DOMPropertyOperations'); var ReactMount = require('./ReactMount'); var ReactPerf = require('./ReactPerf'); var invariant = require('./invariant'); var setInnerHTML = require('./setInnerHTML'); var INVALID_PROPERTY_ERRORS = { dangerouslySetInnerHTML: '`dangerouslySetInnerHTML` must be set using `updateInnerHTMLByID()`.', style: '`style` must be set using `updateStylesByID()`.' }; var ReactDOMIDOperations = { updatePropertyByID: function (id, name, value) { var node = ReactMount.getNode(id); 'production' !== 'production' ? invariant(!INVALID_PROPERTY_ERRORS.hasOwnProperty(name), 'updatePropertyByID(...): %s', INVALID_PROPERTY_ERRORS[name]) : invariant(!INVALID_PROPERTY_ERRORS.hasOwnProperty(name)); if (value != null) { DOMPropertyOperations.setValueForProperty(node, name, value); } else { DOMPropertyOperations.deleteValueForProperty(node, name); } }, deletePropertyByID: function (id, name, value) { var node = ReactMount.getNode(id); 'production' !== 'production' ? invariant(!INVALID_PROPERTY_ERRORS.hasOwnProperty(name), 'updatePropertyByID(...): %s', INVALID_PROPERTY_ERRORS[name]) : invariant(!INVALID_PROPERTY_ERRORS.hasOwnProperty(name)); DOMPropertyOperations.deleteValueForProperty(node, name, value); }, updateStylesByID: function (id, styles) { var node = ReactMount.getNode(id); CSSPropertyOperations.setValueForStyles(node, styles); }, updateInnerHTMLByID: function (id, html) { var node = ReactMount.getNode(id); setInnerHTML(node, html); }, updateTextContentByID: function (id, content) { var node = ReactMount.getNode(id); DOMChildrenOperations.updateTextContent(node, content); }, dangerouslyReplaceNodeWithMarkupByID: function (id, markup) { var node = ReactMount.getNode(id); DOMChildrenOperations.dangerouslyReplaceNodeWithMarkup(node, markup); }, dangerouslyProcessChildrenUpdates: function (updates, markup) { for (var i = 0; i < updates.length; i++) { updates[i].parentNode = ReactMount.getNode(updates[i].parentID); }DOMChildrenOperations.processUpdates(updates, markup); } }; ReactPerf.measureMethods(ReactDOMIDOperations, 'ReactDOMIDOperations', { updatePropertyByID: 'updatePropertyByID', deletePropertyByID: 'deletePropertyByID', updateStylesByID: 'updateStylesByID', updateInnerHTMLByID: 'updateInnerHTMLByID', updateTextContentByID: 'updateTextContentByID', dangerouslyReplaceNodeWithMarkupByID: 'dangerouslyReplaceNodeWithMarkupByID', dangerouslyProcessChildrenUpdates: 'dangerouslyProcessChildrenUpdates' }); module.exports = ReactDOMIDOperations; }, { './CSSPropertyOperations': 12, './DOMChildrenOperations': 16, './DOMPropertyOperations': 18, './ReactMount': 78, './ReactPerf': 83, './invariant': 143, './setInnerHTML': 156 }],\n  53: [function (require, module, exports) { 'use strict'; var EventConstants = require('./EventConstants'); var LocalEventTrapMixin = require('./LocalEventTrapMixin'); var ReactBrowserComponentMixin = require('./ReactBrowserComponentMixin'); var ReactClass = require('./ReactClass'); var ReactElement = require('./ReactElement'); var iframe = ReactElement.createFactory('iframe'); var ReactDOMIframe = ReactClass.createClass({ displayName: 'ReactDOMIframe', tagName: 'IFRAME', mixins: [ReactBrowserComponentMixin, LocalEventTrapMixin], render: function () { return iframe(this.props); }, componentDidMount: function () { this.trapBubbledEvent(EventConstants.topLevelTypes.topLoad, 'load'); } }); module.exports = ReactDOMIframe; }, { './EventConstants': 22, './LocalEventTrapMixin': 32, './ReactBrowserComponentMixin': 37, './ReactClass': 41, './ReactElement': 65 }],\n  54: [function (require, module, exports) { 'use strict'; var EventConstants = require('./EventConstants'); var LocalEventTrapMixin = require('./LocalEventTrapMixin'); var ReactBrowserComponentMixin = require('./ReactBrowserComponentMixin'); var ReactClass = require('./ReactClass'); var ReactElement = require('./ReactElement'); var img = ReactElement.createFactory('img'); var ReactDOMImg = ReactClass.createClass({ displayName: 'ReactDOMImg', tagName: 'IMG', mixins: [ReactBrowserComponentMixin, LocalEventTrapMixin], render: function () { return img(this.props); }, componentDidMount: function () { this.trapBubbledEvent(EventConstants.topLevelTypes.topLoad, 'load'); this.trapBubbledEvent(EventConstants.topLevelTypes.topError, 'error'); } }); module.exports = ReactDOMImg; }, { './EventConstants': 22, './LocalEventTrapMixin': 32, './ReactBrowserComponentMixin': 37, './ReactClass': 41, './ReactElement': 65 }],\n  55: [function (require, module, exports) { 'use strict'; var AutoFocusMixin = require('./AutoFocusMixin'); var DOMPropertyOperations = require('./DOMPropertyOperations'); var LinkedValueUtils = require('./LinkedValueUtils'); var ReactBrowserComponentMixin = require('./ReactBrowserComponentMixin'); var ReactClass = require('./ReactClass'); var ReactElement = require('./ReactElement'); var ReactMount = require('./ReactMount'); var ReactUpdates = require('./ReactUpdates'); var assign = require('./Object.assign'); var invariant = require('./invariant'); var input = ReactElement.createFactory('input'); var instancesByReactID = {}; function forceUpdateIfMounted () { if (this.isMounted()) { this.forceUpdate(); } } var ReactDOMInput = ReactClass.createClass({ displayName: 'ReactDOMInput', tagName: 'INPUT', mixins: [AutoFocusMixin, LinkedValueUtils.Mixin, ReactBrowserComponentMixin], getInitialState: function () { var defaultValue = this.props.defaultValue; return { initialChecked: this.props.defaultChecked || false, initialValue: defaultValue != null ? defaultValue : null }; }, render: function () { var props = assign({}, this.props); props.defaultChecked = null; props.defaultValue = null; var value = LinkedValueUtils.getValue(this); props.value = value != null ? value : this.state.initialValue; var checked = LinkedValueUtils.getChecked(this); props.checked = checked != null ? checked : this.state.initialChecked; props.onChange = this._handleChange; return input(props, this.props.children); }, componentDidMount: function () { var id = ReactMount.getID(this.getDOMNode()); instancesByReactID[id] = this; }, componentWillUnmount: function () { var rootNode = this.getDOMNode(); var id = ReactMount.getID(rootNode); delete instancesByReactID[id]; }, componentDidUpdate: function (prevProps, prevState, prevContext) { var rootNode = this.getDOMNode(); if (this.props.checked != null) { DOMPropertyOperations.setValueForProperty(rootNode, 'checked', this.props.checked || false); } var value = LinkedValueUtils.getValue(this); if (value != null) { DOMPropertyOperations.setValueForProperty(rootNode, 'value', '' + value); } }, _handleChange: function (event) { var returnValue; var onChange = LinkedValueUtils.getOnChange(this); if (onChange) { returnValue = onChange.call(this, event); }ReactUpdates.asap(forceUpdateIfMounted, this); var name = this.props.name; if (this.props.type === 'radio' && name != null) { var rootNode = this.getDOMNode(); var queryRoot = rootNode; while (queryRoot.parentNode) { queryRoot = queryRoot.parentNode; } var group = queryRoot.querySelectorAll('input[name=' + JSON.stringify('' + name) + '][type=\"radio\"]'); for (var i = 0, groupLen = group.length; i < groupLen; i++) { var otherNode = group[i]; if (otherNode === rootNode || otherNode.form !== rootNode.form) { continue; } var otherID = ReactMount.getID(otherNode); 'production' !== 'production' ? invariant(otherID, 'ReactDOMInput: Mixing React and non-React radio inputs with the ' + 'same `name` is not supported.') : invariant(otherID); var otherInstance = instancesByReactID[otherID]; 'production' !== 'production' ? invariant(otherInstance, 'ReactDOMInput: Unknown radio button ID %s.', otherID) : invariant(otherInstance); ReactUpdates.asap(forceUpdateIfMounted, otherInstance); } } return returnValue; } }); module.exports = ReactDOMInput; }, { './AutoFocusMixin': 9, './DOMPropertyOperations': 18, './LinkedValueUtils': 31, './Object.assign': 34, './ReactBrowserComponentMixin': 37, './ReactClass': 41, './ReactElement': 65, './ReactMount': 78, './ReactUpdates': 95, './invariant': 143\n  }],\n  56: [function (require, module, exports) { 'use strict'; var ReactBrowserComponentMixin = require('./ReactBrowserComponentMixin'); var ReactClass = require('./ReactClass'); var ReactElement = require('./ReactElement'); var warning = require('./warning'); var option = ReactElement.createFactory('option'); var ReactDOMOption = ReactClass.createClass({ displayName: 'ReactDOMOption', tagName: 'OPTION', mixins: [ReactBrowserComponentMixin], componentWillMount: function () { if ('production' !== 'production') { 'production' !== 'production' ? warning(this.props.selected == null, 'Use the `defaultValue` or `value` props on <select> instead of ' + 'setting `selected` on <option>.') : null; } }, render: function () { return option(this.props, this.props.children); } }); module.exports = ReactDOMOption; }, { './ReactBrowserComponentMixin': 37, './ReactClass': 41, './ReactElement': 65, './warning': 162 }],\n  57: [function (require, module, exports) { 'use strict'; var AutoFocusMixin = require('./AutoFocusMixin'); var LinkedValueUtils = require('./LinkedValueUtils'); var ReactBrowserComponentMixin = require('./ReactBrowserComponentMixin'); var ReactClass = require('./ReactClass'); var ReactElement = require('./ReactElement'); var ReactUpdates = require('./ReactUpdates'); var assign = require('./Object.assign'); var select = ReactElement.createFactory('select'); function updateOptionsIfPendingUpdateAndMounted () { if (this._pendingUpdate) { this._pendingUpdate = false; var value = LinkedValueUtils.getValue(this); if (value != null && this.isMounted()) { updateOptions(this, value); } } } function selectValueType (props, propName, componentName) { if (props[propName] == null) { return null; } if (props.multiple) { if (!Array.isArray(props[propName])) { return new Error('The `' + propName + '` prop supplied to <select> must be an array if ' + '`multiple` is true.'); } } else { if (Array.isArray(props[propName])) { return new Error('The `' + propName + '` prop supplied to <select> must be a scalar ' + 'value if `multiple` is false.'); } } } function updateOptions (component, propValue) { var selectedValue, i, l; var options = component.getDOMNode().options; if (component.props.multiple) { selectedValue = {}; for (i = 0, l = propValue.length; i < l; i++) { selectedValue['' + propValue[i]] = true; } for (i = 0, l = options.length; i < l; i++) { var selected = selectedValue.hasOwnProperty(options[i].value); if (options[i].selected !== selected) { options[i].selected = selected; } } } else { selectedValue = '' + propValue; for (i = 0, l = options.length; i < l; i++) { if (options[i].value === selectedValue) { options[i].selected = true; return; } } if (options.length) { options[0].selected = true; } } } var ReactDOMSelect = ReactClass.createClass({ displayName: 'ReactDOMSelect', tagName: 'SELECT', mixins: [AutoFocusMixin, LinkedValueUtils.Mixin, ReactBrowserComponentMixin], propTypes: { defaultValue: selectValueType, value: selectValueType }, render: function () { var props = assign({}, this.props); props.onChange = this._handleChange; props.value = null; return select(props, this.props.children); }, componentWillMount: function () { this._pendingUpdate = false; }, componentDidMount: function () { var value = LinkedValueUtils.getValue(this); if (value != null) { updateOptions(this, value); } else if (this.props.defaultValue != null) { updateOptions(this, this.props.defaultValue); } }, componentDidUpdate: function (prevProps) { var value = LinkedValueUtils.getValue(this); if (value != null) { this._pendingUpdate = false; updateOptions(this, value); } else if (!prevProps.multiple !== !this.props.multiple) { if (this.props.defaultValue != null) { updateOptions(this, this.props.defaultValue); } else { updateOptions(this, this.props.multiple ? [] : ''); } } }, _handleChange: function (event) { var returnValue; var onChange = LinkedValueUtils.getOnChange(this); if (onChange) { returnValue = onChange.call(this, event); } this._pendingUpdate = true; ReactUpdates.asap(updateOptionsIfPendingUpdateAndMounted, this); return returnValue; } }); module.exports = ReactDOMSelect; }, { './AutoFocusMixin': 9, './LinkedValueUtils': 31, './Object.assign': 34, './ReactBrowserComponentMixin': 37, './ReactClass': 41, './ReactElement': 65, './ReactUpdates': 95 }],\n  58: [function (require, module, exports) { 'use strict'; var ExecutionEnvironment = require('./ExecutionEnvironment'); var getNodeForCharacterOffset = require('./getNodeForCharacterOffset'); var getTextContentAccessor = require('./getTextContentAccessor'); function isCollapsed (anchorNode, anchorOffset, focusNode, focusOffset) { return anchorNode === focusNode && anchorOffset === focusOffset; } function getIEOffsets (node) { var selection = document.selection; var selectedRange = selection.createRange(); var selectedLength = selectedRange.text.length; var fromStart = selectedRange.duplicate(); fromStart.moveToElementText(node); fromStart.setEndPoint('EndToStart', selectedRange); var startOffset = fromStart.text.length; var endOffset = startOffset + selectedLength; return { start: startOffset, end: endOffset }; } function getModernOffsets (node) { var selection = window.getSelection && window.getSelection(); if (!selection || selection.rangeCount === 0) { return null; } var anchorNode = selection.anchorNode; var anchorOffset = selection.anchorOffset; var focusNode = selection.focusNode; var focusOffset = selection.focusOffset; var currentRange = selection.getRangeAt(0); var isSelectionCollapsed = isCollapsed(selection.anchorNode, selection.anchorOffset, selection.focusNode, selection.focusOffset); var rangeLength = isSelectionCollapsed ? 0 : currentRange.toString().length; var tempRange = currentRange.cloneRange(); tempRange.selectNodeContents(node); tempRange.setEnd(currentRange.startContainer, currentRange.startOffset); var isTempRangeCollapsed = isCollapsed(tempRange.startContainer, tempRange.startOffset, tempRange.endContainer, tempRange.endOffset); var start = isTempRangeCollapsed ? 0 : tempRange.toString().length; var end = start + rangeLength; var detectionRange = document.createRange(); detectionRange.setStart(anchorNode, anchorOffset); detectionRange.setEnd(focusNode, focusOffset); var isBackward = detectionRange.collapsed; return { start: isBackward ? end : start, end: isBackward ? start : end }; } function setIEOffsets (node, offsets) { var range = document.selection.createRange().duplicate(); var start, end; if (typeof offsets.end === 'undefined') { start = offsets.start; end = start; } else if (offsets.start > offsets.end) { start = offsets.end; end = offsets.start; } else { start = offsets.start; end = offsets.end; }range.moveToElementText(node); range.moveStart('character', start); range.setEndPoint('EndToStart', range); range.moveEnd('character', end - start); range.select(); } function setModernOffsets (node, offsets) { if (!window.getSelection) { return; } var selection = window.getSelection(); var length = node[getTextContentAccessor()].length; var start = Math.min(offsets.start, length); var end = typeof offsets.end === 'undefined' ? start : Math.min(offsets.end, length); if (!selection.extend && start > end) { var temp = end; end = start; start = temp; } var startMarker = getNodeForCharacterOffset(node, start); var endMarker = getNodeForCharacterOffset(node, end); if (startMarker && endMarker) { var range = document.createRange(); range.setStart(startMarker.node, startMarker.offset); selection.removeAllRanges(); if (start > end) { selection.addRange(range); selection.extend(endMarker.node, endMarker.offset); } else { range.setEnd(endMarker.node, endMarker.offset); selection.addRange(range); } } } var useIEOffsets = ExecutionEnvironment.canUseDOM && 'selection' in document && !('getSelection' in window); var ReactDOMSelection = { getOffsets: useIEOffsets ? getIEOffsets : getModernOffsets, setOffsets: useIEOffsets ? setIEOffsets : setModernOffsets }; module.exports = ReactDOMSelection; }, { './ExecutionEnvironment': 28, './getNodeForCharacterOffset': 136, './getTextContentAccessor': 138 }],\n  59: [function (require, module, exports) { 'use strict'; var DOMPropertyOperations = require('./DOMPropertyOperations'); var ReactComponentBrowserEnvironment = require('./ReactComponentBrowserEnvironment'); var ReactDOMComponent = require('./ReactDOMComponent'); var assign = require('./Object.assign'); var escapeTextContentForBrowser = require('./escapeTextContentForBrowser'); var ReactDOMTextComponent = function (props) {}; assign(ReactDOMTextComponent.prototype, { construct: function (text) { this._currentElement = text; this._stringText = '' + text; this._rootNodeID = null; this._mountIndex = 0; }, mountComponent: function (rootID, transaction, context) { this._rootNodeID = rootID; var escapedText = escapeTextContentForBrowser(this._stringText); if (transaction.renderToStaticMarkup) { return escapedText; } return '<span ' + DOMPropertyOperations.createMarkupForID(rootID) + '>' + escapedText + '</span>'; }, receiveComponent: function (nextText, transaction) { if (nextText !== this._currentElement) { this._currentElement = nextText; var nextStringText = '' + nextText; if (nextStringText !== this._stringText) { this._stringText = nextStringText; ReactDOMComponent.BackendIDOperations.updateTextContentByID(this._rootNodeID, nextStringText); } } }, unmountComponent: function () { ReactComponentBrowserEnvironment.unmountIDFromEnvironment(this._rootNodeID); } }); module.exports = ReactDOMTextComponent; }, { './DOMPropertyOperations': 18, './Object.assign': 34, './ReactComponentBrowserEnvironment': 43, './ReactDOMComponent': 50, './escapeTextContentForBrowser': 124 }],\n  60: [function (require, module, exports) { 'use strict'; var AutoFocusMixin = require('./AutoFocusMixin'); var DOMPropertyOperations = require('./DOMPropertyOperations'); var LinkedValueUtils = require('./LinkedValueUtils'); var ReactBrowserComponentMixin = require('./ReactBrowserComponentMixin'); var ReactClass = require('./ReactClass'); var ReactElement = require('./ReactElement'); var ReactUpdates = require('./ReactUpdates'); var assign = require('./Object.assign'); var invariant = require('./invariant'); var warning = require('./warning'); var textarea = ReactElement.createFactory('textarea'); function forceUpdateIfMounted () { if (this.isMounted()) { this.forceUpdate(); } } var ReactDOMTextarea = ReactClass.createClass({ displayName: 'ReactDOMTextarea', tagName: 'TEXTAREA', mixins: [AutoFocusMixin, LinkedValueUtils.Mixin, ReactBrowserComponentMixin], getInitialState: function () { var defaultValue = this.props.defaultValue; var children = this.props.children; if (children != null) { if ('production' !== 'production') { 'production' !== 'production' ? warning(false, 'Use the `defaultValue` or `value` props instead of setting ' + 'children on <textarea>.') : null; }'production' !== 'production' ? invariant(defaultValue == null, 'If you supply `defaultValue` on a <textarea>, do not pass children.') : invariant(defaultValue == null); if (Array.isArray(children)) { 'production' !== 'production' ? invariant(children.length <= 1, '<textarea> can only have at most one child.') : invariant(children.length <= 1); children = children[0]; }defaultValue = '' + children; } if (defaultValue == null) { defaultValue = ''; } var value = LinkedValueUtils.getValue(this); return { initialValue: '' + (value != null ? value : defaultValue) }; }, render: function () { var props = assign({}, this.props); 'production' !== 'production' ? invariant(props.dangerouslySetInnerHTML == null, '`dangerouslySetInnerHTML` does not make sense on <textarea>.') : invariant(props.dangerouslySetInnerHTML == null); props.defaultValue = null; props.value = null; props.onChange = this._handleChange; return textarea(props, this.state.initialValue); }, componentDidUpdate: function (prevProps, prevState, prevContext) { var value = LinkedValueUtils.getValue(this); if (value != null) { var rootNode = this.getDOMNode(); DOMPropertyOperations.setValueForProperty(rootNode, 'value', '' + value); } }, _handleChange: function (event) { var returnValue; var onChange = LinkedValueUtils.getOnChange(this); if (onChange) { returnValue = onChange.call(this, event); }ReactUpdates.asap(forceUpdateIfMounted, this); return returnValue; } }); module.exports = ReactDOMTextarea; }, { './AutoFocusMixin': 9, './DOMPropertyOperations': 18, './LinkedValueUtils': 31, './Object.assign': 34, './ReactBrowserComponentMixin': 37, './ReactClass': 41, './ReactElement': 65, './ReactUpdates': 95, './invariant': 143, './warning': 162 }],\n  61: [function (require, module, exports) { 'use strict'; var ReactUpdates = require('./ReactUpdates'); var Transaction = require('./Transaction'); var assign = require('./Object.assign'); var emptyFunction = require('./emptyFunction'); var RESET_BATCHED_UPDATES = { initialize: emptyFunction, close: function () { ReactDefaultBatchingStrategy.isBatchingUpdates = false; } }; var FLUSH_BATCHED_UPDATES = { initialize: emptyFunction, close: ReactUpdates.flushBatchedUpdates.bind(ReactUpdates) }; var TRANSACTION_WRAPPERS = [FLUSH_BATCHED_UPDATES, RESET_BATCHED_UPDATES]; function ReactDefaultBatchingStrategyTransaction () { this.reinitializeTransaction(); }assign(ReactDefaultBatchingStrategyTransaction.prototype, Transaction.Mixin, { getTransactionWrappers: function () { return TRANSACTION_WRAPPERS; } }); var transaction = new ReactDefaultBatchingStrategyTransaction(); var ReactDefaultBatchingStrategy = { isBatchingUpdates: false, batchedUpdates: function (callback, a, b, c, d) { var alreadyBatchingUpdates = ReactDefaultBatchingStrategy.isBatchingUpdates; ReactDefaultBatchingStrategy.isBatchingUpdates = true; if (alreadyBatchingUpdates) { callback(a, b, c, d); } else { transaction.perform(callback, null, a, b, c, d); } } }; module.exports = ReactDefaultBatchingStrategy; }, { './Object.assign': 34, './ReactUpdates': 95, './Transaction': 111, './emptyFunction': 122 }],\n  62: [function (require, module, exports) { 'use strict'; var BeforeInputEventPlugin = require('./BeforeInputEventPlugin'); var ChangeEventPlugin = require('./ChangeEventPlugin'); var ClientReactRootIndex = require('./ClientReactRootIndex'); var DefaultEventPluginOrder = require('./DefaultEventPluginOrder'); var EnterLeaveEventPlugin = require('./EnterLeaveEventPlugin'); var ExecutionEnvironment = require('./ExecutionEnvironment'); var HTMLDOMPropertyConfig = require('./HTMLDOMPropertyConfig'); var MobileSafariClickEventPlugin = require('./MobileSafariClickEventPlugin'); var ReactBrowserComponentMixin = require('./ReactBrowserComponentMixin'); var ReactClass = require('./ReactClass'); var ReactComponentBrowserEnvironment = require('./ReactComponentBrowserEnvironment'); var ReactDefaultBatchingStrategy = require('./ReactDefaultBatchingStrategy'); var ReactDOMComponent = require('./ReactDOMComponent'); var ReactDOMButton = require('./ReactDOMButton'); var ReactDOMForm = require('./ReactDOMForm'); var ReactDOMImg = require('./ReactDOMImg'); var ReactDOMIDOperations = require('./ReactDOMIDOperations'); var ReactDOMIframe = require('./ReactDOMIframe'); var ReactDOMInput = require('./ReactDOMInput'); var ReactDOMOption = require('./ReactDOMOption'); var ReactDOMSelect = require('./ReactDOMSelect'); var ReactDOMTextarea = require('./ReactDOMTextarea'); var ReactDOMTextComponent = require('./ReactDOMTextComponent'); var ReactElement = require('./ReactElement'); var ReactEventListener = require('./ReactEventListener'); var ReactInjection = require('./ReactInjection'); var ReactInstanceHandles = require('./ReactInstanceHandles'); var ReactMount = require('./ReactMount'); var ReactReconcileTransaction = require('./ReactReconcileTransaction'); var SelectEventPlugin = require('./SelectEventPlugin'); var ServerReactRootIndex = require('./ServerReactRootIndex'); var SimpleEventPlugin = require('./SimpleEventPlugin'); var SVGDOMPropertyConfig = require('./SVGDOMPropertyConfig'); var createFullPageComponent = require('./createFullPageComponent'); function autoGenerateWrapperClass (type) { return ReactClass.createClass({ tagName: type.toUpperCase(), render: function () { return new ReactElement(type, null, null, null, null, this.props); } }); } function inject () { ReactInjection.EventEmitter.injectReactEventListener(ReactEventListener); ReactInjection.EventPluginHub.injectEventPluginOrder(DefaultEventPluginOrder); ReactInjection.EventPluginHub.injectInstanceHandle(ReactInstanceHandles); ReactInjection.EventPluginHub.injectMount(ReactMount); ReactInjection.EventPluginHub.injectEventPluginsByName({ SimpleEventPlugin: SimpleEventPlugin, EnterLeaveEventPlugin: EnterLeaveEventPlugin, ChangeEventPlugin: ChangeEventPlugin, MobileSafariClickEventPlugin: MobileSafariClickEventPlugin, SelectEventPlugin: SelectEventPlugin, BeforeInputEventPlugin: BeforeInputEventPlugin }); ReactInjection.NativeComponent.injectGenericComponentClass(ReactDOMComponent); ReactInjection.NativeComponent.injectTextComponentClass(ReactDOMTextComponent); ReactInjection.NativeComponent.injectAutoWrapper(autoGenerateWrapperClass); ReactInjection.Class.injectMixin(ReactBrowserComponentMixin); ReactInjection.NativeComponent.injectComponentClasses({ button: ReactDOMButton, form: ReactDOMForm, iframe: ReactDOMIframe, img: ReactDOMImg, input: ReactDOMInput, option: ReactDOMOption, select: ReactDOMSelect, textarea: ReactDOMTextarea, html: createFullPageComponent('html'), head: createFullPageComponent('head'), body: createFullPageComponent('body') }); ReactInjection.DOMProperty.injectDOMPropertyConfig(HTMLDOMPropertyConfig); ReactInjection.DOMProperty.injectDOMPropertyConfig(SVGDOMPropertyConfig); ReactInjection.EmptyComponent.injectEmptyComponent('noscript'); ReactInjection.Updates.injectReconcileTransaction(ReactReconcileTransaction); ReactInjection.Updates.injectBatchingStrategy(ReactDefaultBatchingStrategy); ReactInjection.RootIndex.injectCreateReactRootIndex(ExecutionEnvironment.canUseDOM ? ClientReactRootIndex.createReactRootIndex : ServerReactRootIndex.createReactRootIndex); ReactInjection.Component.injectEnvironment(ReactComponentBrowserEnvironment); ReactInjection.DOMComponent.injectIDOperations(ReactDOMIDOperations); if ('production' !== 'production') { var url = ExecutionEnvironment.canUseDOM && window.location.href || ''; if (/[?&]react_perf\\b/.test(url)) { var ReactDefaultPerf = require('./ReactDefaultPerf'); ReactDefaultPerf.start(); } } }module.exports = { inject: inject }; }, { './BeforeInputEventPlugin': 10, './ChangeEventPlugin': 14, './ClientReactRootIndex': 15, './DefaultEventPluginOrder': 20, './EnterLeaveEventPlugin': 21, './ExecutionEnvironment': 28, './HTMLDOMPropertyConfig': 30, './MobileSafariClickEventPlugin': 33, './ReactBrowserComponentMixin': 37, './ReactClass': 41, './ReactComponentBrowserEnvironment': 43, './ReactDOMButton': 49, './ReactDOMComponent': 50, './ReactDOMForm': 51, './ReactDOMIDOperations': 52, './ReactDOMIframe': 53, './ReactDOMImg': 54, './ReactDOMInput': 55, './ReactDOMOption': 56, './ReactDOMSelect': 57, './ReactDOMTextComponent': 59, './ReactDOMTextarea': 60, './ReactDefaultBatchingStrategy': 61, './ReactDefaultPerf': 63, './ReactElement': 65, './ReactEventListener': 70, './ReactInjection': 72, './ReactInstanceHandles': 74, './ReactMount': 78, './ReactReconcileTransaction': 88, './SVGDOMPropertyConfig': 96, './SelectEventPlugin': 97, './ServerReactRootIndex': 98, './SimpleEventPlugin': 99, './createFullPageComponent': 119 }],\n  63: [function (require, module, exports) { 'use strict'; var DOMProperty = require('./DOMProperty'); var ReactDefaultPerfAnalysis = require('./ReactDefaultPerfAnalysis'); var ReactMount = require('./ReactMount'); var ReactPerf = require('./ReactPerf'); var performanceNow = require('./performanceNow'); function roundFloat (val) { return Math.floor(val * 100) / 100; } function addValue (obj, key, val) { obj[key] = (obj[key] || 0) + val; } var ReactDefaultPerf = { _allMeasurements: [], _mountStack: [0], _injected: false, start: function () { if (!ReactDefaultPerf._injected) { ReactPerf.injection.injectMeasure(ReactDefaultPerf.measure); }ReactDefaultPerf._allMeasurements.length = 0; ReactPerf.enableMeasure = true; }, stop: function () { ReactPerf.enableMeasure = false; }, getLastMeasurements: function () { return ReactDefaultPerf._allMeasurements; }, printExclusive: function (measurements) { measurements = measurements || ReactDefaultPerf._allMeasurements; var summary = ReactDefaultPerfAnalysis.getExclusiveSummary(measurements); console.table(summary.map(function (item) { return { 'Component class name': item.componentName, 'Total inclusive time (ms)': roundFloat(item.inclusive), 'Exclusive mount time (ms)': roundFloat(item.exclusive), 'Exclusive render time (ms)': roundFloat(item.render), 'Mount time per instance (ms)': roundFloat(item.exclusive / item.count), 'Render time per instance (ms)': roundFloat(item.render / item.count), Instances: item.count }; })); }, printInclusive: function (measurements) { measurements = measurements || ReactDefaultPerf._allMeasurements; var summary = ReactDefaultPerfAnalysis.getInclusiveSummary(measurements); console.table(summary.map(function (item) { return { 'Owner > component': item.componentName, 'Inclusive time (ms)': roundFloat(item.time), Instances: item.count }; })); console.log('Total time:', ReactDefaultPerfAnalysis.getTotalTime(measurements).toFixed(2) + ' ms'); }, getMeasurementsSummaryMap: function (measurements) { var summary = ReactDefaultPerfAnalysis.getInclusiveSummary(measurements, true); return summary.map(function (item) { return { 'Owner > component': item.componentName, 'Wasted time (ms)': item.time, Instances: item.count }; }); }, printWasted: function (measurements) { measurements = measurements || ReactDefaultPerf._allMeasurements; console.table(ReactDefaultPerf.getMeasurementsSummaryMap(measurements)); console.log('Total time:', ReactDefaultPerfAnalysis.getTotalTime(measurements).toFixed(2) + ' ms'); }, printDOM: function (measurements) { measurements = measurements || ReactDefaultPerf._allMeasurements; var summary = ReactDefaultPerfAnalysis.getDOMSummary(measurements); console.table(summary.map(function (item) { var result = {}; result[DOMProperty.ID_ATTRIBUTE_NAME] = item.id; result['type'] = item.type; result['args'] = JSON.stringify(item.args); return result; })); console.log('Total time:', ReactDefaultPerfAnalysis.getTotalTime(measurements).toFixed(2) + ' ms'); }, _recordWrite: function (id, fnName, totalTime, args) { var writes = ReactDefaultPerf._allMeasurements[ReactDefaultPerf._allMeasurements.length - 1].writes; writes[id] = writes[id] || []; writes[id].push({ type: fnName, time: totalTime, args: args }); }, measure: function (moduleName, fnName, func) { return function () { for (var args = [], $__0 = 0, $__1 = arguments.length; $__0 < $__1; $__0++)args.push(arguments[$__0]); var totalTime; var rv; var start; if (fnName === '_renderNewRootComponent' || fnName === 'flushBatchedUpdates') { ReactDefaultPerf._allMeasurements.push({ exclusive: {}, inclusive: {}, render: {}, counts: {}, writes: {}, displayNames: {}, totalTime: 0 }); start = performanceNow(); rv = func.apply(this, args); ReactDefaultPerf._allMeasurements[ReactDefaultPerf._allMeasurements.length - 1].totalTime = performanceNow() - start; return rv; } else if (fnName === '_mountImageIntoNode' || moduleName === 'ReactDOMIDOperations') { start = performanceNow(); rv = func.apply(this, args); totalTime = performanceNow() - start; if (fnName === '_mountImageIntoNode') { var mountID = ReactMount.getID(args[1]); ReactDefaultPerf._recordWrite(mountID, fnName, totalTime, args[0]); } else if (fnName === 'dangerouslyProcessChildrenUpdates') { args[0].forEach(function (update) { var writeArgs = {}; if (update.fromIndex !== null) { writeArgs.fromIndex = update.fromIndex; } if (update.toIndex !== null) { writeArgs.toIndex = update.toIndex; } if (update.textContent !== null) { writeArgs.textContent = update.textContent; } if (update.markupIndex !== null) { writeArgs.markup = args[1][update.markupIndex]; }ReactDefaultPerf._recordWrite(update.parentID, update.type, totalTime, writeArgs); }); } else { ReactDefaultPerf._recordWrite(args[0], fnName, totalTime, Array.prototype.slice.call(args, 1)); } return rv; } else if (moduleName === 'ReactCompositeComponent' && (fnName === 'mountComponent' || fnName === 'updateComponent' || fnName === '_renderValidatedComponent')) { if (typeof this._currentElement.type === 'string') { return func.apply(this, args); } var rootNodeID = fnName === 'mountComponent' ? args[0] : this._rootNodeID; var isRender = fnName === '_renderValidatedComponent'; var isMount = fnName === 'mountComponent'; var mountStack = ReactDefaultPerf._mountStack; var entry = ReactDefaultPerf._allMeasurements[ReactDefaultPerf._allMeasurements.length - 1]; if (isRender) { addValue(entry.counts, rootNodeID, 1); } else if (isMount) { mountStack.push(0); }start = performanceNow(); rv = func.apply(this, args); totalTime = performanceNow() - start; if (isRender) { addValue(entry.render, rootNodeID, totalTime); } else if (isMount) { var subMountTime = mountStack.pop(); mountStack[mountStack.length - 1] += totalTime; addValue(entry.exclusive, rootNodeID, totalTime - subMountTime); addValue(entry.inclusive, rootNodeID, totalTime); } else { addValue(entry.inclusive, rootNodeID, totalTime); }entry.displayNames[rootNodeID] = { current: this.getName(), owner: this._currentElement._owner ? this._currentElement._owner.getName() : '<root>' }; return rv; } else { return func.apply(this, args); } }; } }; module.exports = ReactDefaultPerf; }, { './DOMProperty': 17, './ReactDefaultPerfAnalysis': 64, './ReactMount': 78, './ReactPerf': 83, './performanceNow': 154 }],\n  64: [function (require, module, exports) { var assign = require('./Object.assign'); var DONT_CARE_THRESHOLD = 1.2; var DOM_OPERATION_TYPES = { _mountImageIntoNode: 'set innerHTML', INSERT_MARKUP: 'set innerHTML', MOVE_EXISTING: 'move', REMOVE_NODE: 'remove', TEXT_CONTENT: 'set textContent', updatePropertyByID: 'update attribute', deletePropertyByID: 'delete attribute', updateStylesByID: 'update styles', updateInnerHTMLByID: 'set innerHTML', dangerouslyReplaceNodeWithMarkupByID: 'replace' }; function getTotalTime (measurements) { var totalTime = 0; for (var i = 0; i < measurements.length; i++) { var measurement = measurements[i]; totalTime += measurement.totalTime; } return totalTime; } function getDOMSummary (measurements) { var items = []; for (var i = 0; i < measurements.length; i++) { var measurement = measurements[i]; var id; for (id in measurement.writes) { measurement.writes[id].forEach(function (write) { items.push({ id: id, type: DOM_OPERATION_TYPES[write.type] || write.type, args: write.args }); }); } } return items; } function getExclusiveSummary (measurements) { var candidates = {}; var displayName; for (var i = 0; i < measurements.length; i++) { var measurement = measurements[i]; var allIDs = assign({}, measurement.exclusive, measurement.inclusive); for (var id in allIDs) { displayName = measurement.displayNames[id].current; candidates[displayName] = candidates[displayName] || { componentName: displayName, inclusive: 0, exclusive: 0, render: 0, count: 0 }; if (measurement.render[id]) { candidates[displayName].render += measurement.render[id]; } if (measurement.exclusive[id]) { candidates[displayName].exclusive += measurement.exclusive[id]; } if (measurement.inclusive[id]) { candidates[displayName].inclusive += measurement.inclusive[id]; } if (measurement.counts[id]) { candidates[displayName].count += measurement.counts[id]; } } } var arr = []; for (displayName in candidates) { if (candidates[displayName].exclusive >= DONT_CARE_THRESHOLD) { arr.push(candidates[displayName]); } }arr.sort(function (a, b) { return b.exclusive - a.exclusive; }); return arr; } function getInclusiveSummary (measurements, onlyClean) { var candidates = {}; var inclusiveKey; for (var i = 0; i < measurements.length; i++) { var measurement = measurements[i]; var allIDs = assign({}, measurement.exclusive, measurement.inclusive); var cleanComponents; if (onlyClean) { cleanComponents = getUnchangedComponents(measurement); } for (var id in allIDs) { if (onlyClean && !cleanComponents[id]) { continue; } var displayName = measurement.displayNames[id]; inclusiveKey = displayName.owner + ' > ' + displayName.current; candidates[inclusiveKey] = candidates[inclusiveKey] || { componentName: inclusiveKey, time: 0, count: 0 }; if (measurement.inclusive[id]) { candidates[inclusiveKey].time += measurement.inclusive[id]; } if (measurement.counts[id]) { candidates[inclusiveKey].count += measurement.counts[id]; } } } var arr = []; for (inclusiveKey in candidates) { if (candidates[inclusiveKey].time >= DONT_CARE_THRESHOLD) { arr.push(candidates[inclusiveKey]); } }arr.sort(function (a, b) { return b.time - a.time; }); return arr; } function getUnchangedComponents (measurement) { var cleanComponents = {}; var dirtyLeafIDs = Object.keys(measurement.writes); var allIDs = assign({}, measurement.exclusive, measurement.inclusive); for (var id in allIDs) { var isDirty = false; for (var i = 0; i < dirtyLeafIDs.length; i++) { if (dirtyLeafIDs[i].indexOf(id) === 0) { isDirty = true; break; } } if (!isDirty && measurement.counts[id] > 0) { cleanComponents[id] = true; } } return cleanComponents; } var ReactDefaultPerfAnalysis = { getExclusiveSummary: getExclusiveSummary, getInclusiveSummary: getInclusiveSummary, getDOMSummary: getDOMSummary, getTotalTime: getTotalTime }; module.exports = ReactDefaultPerfAnalysis; }, { './Object.assign': 34 }],\n  65: [function (require, module, exports) { 'use strict'; var ReactContext = require('./ReactContext'); var ReactCurrentOwner = require('./ReactCurrentOwner'); var assign = require('./Object.assign'); var warning = require('./warning'); var RESERVED_PROPS = { key: true, ref: true }; function defineWarningProperty (object, key) { Object.defineProperty(object, key, { configurable: false, enumerable: true, get: function () { if (!this._store) { return null; } return this._store[key]; }, set: function (value) { 'production' !== 'production' ? warning(false, \"Don't set the %s property of the React element. Instead, \" + 'specify the correct value when initially creating the element.', key) : null; this._store[key] = value; } }); } var useMutationMembrane = false; function defineMutationMembrane (prototype) { try { var pseudoFrozenProperties = { props: true }; for (var key in pseudoFrozenProperties) { defineWarningProperty(prototype, key); }useMutationMembrane = true; } catch (x) {} } var ReactElement = function (type, key, ref, owner, context, props) { this.type = type; this.key = key; this.ref = ref; this._owner = owner; this._context = context; if ('production' !== 'production') { this._store = { props: props, originalProps: assign({}, props) }; try { Object.defineProperty(this._store, 'validated', { configurable: false, enumerable: false, writable: true }); } catch (x) {} this._store.validated = false; if (useMutationMembrane) { Object.freeze(this); return; } } this.props = props; }; ReactElement.prototype = { _isReactElement: true }; if ('production' !== 'production') { defineMutationMembrane(ReactElement.prototype); }ReactElement.createElement = function (type, config, children) { var propName; var props = {}; var key = null; var ref = null; if (config != null) { ref = config.ref === undefined ? null : config.ref; key = config.key === undefined ? null : '' + config.key; for (propName in config) { if (config.hasOwnProperty(propName) && !RESERVED_PROPS.hasOwnProperty(propName)) { props[propName] = config[propName]; } } } var childrenLength = arguments.length - 2; if (childrenLength === 1) { props.children = children; } else if (childrenLength > 1) { var childArray = Array(childrenLength); for (var i = 0; i < childrenLength; i++) { childArray[i] = arguments[i + 2]; }props.children = childArray; } if (type && type.defaultProps) { var defaultProps = type.defaultProps; for (propName in defaultProps) { if (typeof props[propName] === 'undefined') { props[propName] = defaultProps[propName]; } } } return new ReactElement(type, key, ref, ReactCurrentOwner.current, ReactContext.current, props); }; ReactElement.createFactory = function (type) { var factory = ReactElement.createElement.bind(null, type); factory.type = type; return factory; }; ReactElement.cloneAndReplaceProps = function (oldElement, newProps) { var newElement = new ReactElement(oldElement.type, oldElement.key, oldElement.ref, oldElement._owner, oldElement._context, newProps); if ('production' !== 'production') { newElement._store.validated = oldElement._store.validated; } return newElement; }; ReactElement.cloneElement = function (element, config, children) { var propName; var props = assign({}, element.props); var key = element.key; var ref = element.ref; var owner = element._owner; if (config != null) { if (config.ref !== undefined) { ref = config.ref; owner = ReactCurrentOwner.current; } if (config.key !== undefined) { key = '' + config.key; } for (propName in config) { if (config.hasOwnProperty(propName) && !RESERVED_PROPS.hasOwnProperty(propName)) { props[propName] = config[propName]; } } } var childrenLength = arguments.length - 2; if (childrenLength === 1) { props.children = children; } else if (childrenLength > 1) { var childArray = Array(childrenLength); for (var i = 0; i < childrenLength; i++) { childArray[i] = arguments[i + 2]; }props.children = childArray; } return new ReactElement(element.type, key, ref, owner, element._context, props); }; ReactElement.isValidElement = function (object) { var isElement = !!(object && object._isReactElement); return isElement; }; module.exports = ReactElement; }, { './Object.assign': 34, './ReactContext': 46, './ReactCurrentOwner': 47, './warning': 162 }],\n  66: [function (require, module, exports) {\n    'use strict'; var ReactElement = require('./ReactElement'); var ReactFragment = require('./ReactFragment'); var ReactPropTypeLocations = require('./ReactPropTypeLocations'); var ReactPropTypeLocationNames = require('./ReactPropTypeLocationNames'); var ReactCurrentOwner = require('./ReactCurrentOwner'); var ReactNativeComponent = require('./ReactNativeComponent'); var getIteratorFn = require('./getIteratorFn'); var invariant = require('./invariant'); var warning = require('./warning'); function getDeclarationErrorAddendum () { if (ReactCurrentOwner.current) { var name = ReactCurrentOwner.current.getName(); if (name) { return ' Check the render method of `' + name + '`.'; } } return ''; } var ownerHasKeyUseWarning = {}; var loggedTypeFailures = {}; var NUMERIC_PROPERTY_REGEX = /^\\d+$/; function getName (instance) { var publicInstance = instance && instance.getPublicInstance(); if (!publicInstance) { return undefined; } var constructor = publicInstance.constructor; if (!constructor) { return undefined; } return constructor.displayName || constructor.name || undefined; } function getCurrentOwnerDisplayName () { var current = ReactCurrentOwner.current; return current && getName(current) || undefined; } function validateExplicitKey (element, parentType) {\n      if (element._store.validated || element.key != null) { return; }element._store.validated = true;\n      warnAndMonitorForKeyUse('Each child in an array or iterator should have a unique \"key\" prop.', element, parentType);\n    } function validatePropertyKey (name, element, parentType) { if (!NUMERIC_PROPERTY_REGEX.test(name)) { return; }warnAndMonitorForKeyUse('Child objects should have non-numeric keys so ordering is preserved.', element, parentType); } function warnAndMonitorForKeyUse (message, element, parentType) { var ownerName = getCurrentOwnerDisplayName(); var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name; var useName = ownerName || parentName; var memoizer = ownerHasKeyUseWarning[message] || (ownerHasKeyUseWarning[message] = {}); if (memoizer.hasOwnProperty(useName)) { return; }memoizer[useName] = true; var parentOrOwnerAddendum = ownerName ? ' Check the render method of ' + ownerName + '.' : parentName ? ' Check the React.render call using <' + parentName + '>.' : ''; var childOwnerAddendum = ''; if (element && element._owner && element._owner !== ReactCurrentOwner.current) { var childOwnerName = getName(element._owner); childOwnerAddendum = ' It was passed a child from ' + childOwnerName + '.'; }'production' !== 'production' ? warning(false, message + '%s%s See https://fb.me/react-warning-keys for more information.', parentOrOwnerAddendum, childOwnerAddendum) : null; } function validateChildKeys (node, parentType) { if (Array.isArray(node)) { for (var i = 0; i < node.length; i++) { var child = node[i]; if (ReactElement.isValidElement(child)) { validateExplicitKey(child, parentType); } } } else if (ReactElement.isValidElement(node)) { node._store.validated = true; } else if (node) { var iteratorFn = getIteratorFn(node); if (iteratorFn) { if (iteratorFn !== node.entries) { var iterator = iteratorFn.call(node); var step; while (!(step = iterator.next()).done) { if (ReactElement.isValidElement(step.value)) { validateExplicitKey(step.value, parentType); } } } } else if (typeof node === 'object') { var fragment = ReactFragment.extractIfFragment(node); for (var key in fragment) { if (fragment.hasOwnProperty(key)) { validatePropertyKey(key, fragment[key], parentType); } } } } } function checkPropTypes (componentName, propTypes, props, location) { for (var propName in propTypes) { if (propTypes.hasOwnProperty(propName)) { var error; try { 'production' !== 'production' ? invariant(typeof propTypes[propName] === 'function', '%s: %s type `%s` is invalid; it must be a function, usually from ' + 'React.PropTypes.', componentName || 'React class', ReactPropTypeLocationNames[location], propName) : invariant(typeof propTypes[propName] === 'function'); error = propTypes[propName](props, propName, componentName, location); } catch (ex) { error = ex; } if (error instanceof Error && !(error.message in loggedTypeFailures)) { loggedTypeFailures[error.message] = true; var addendum = getDeclarationErrorAddendum(this); 'production' !== 'production' ? warning(false, 'Failed propType: %s%s', error.message, addendum) : null; } } } } var warnedPropsMutations = {}; function warnForPropsMutation (propName, element) { var type = element.type; var elementName = typeof type === 'string' ? type : type.displayName; var ownerName = element._owner ? element._owner.getPublicInstance().constructor.displayName : null; var warningKey = propName + '|' + elementName + '|' + ownerName; if (warnedPropsMutations.hasOwnProperty(warningKey)) { return; }warnedPropsMutations[warningKey] = true; var elementInfo = ''; if (elementName) { elementInfo = ' <' + elementName + ' />'; } var ownerInfo = ''; if (ownerName) { ownerInfo = ' The element was created by ' + ownerName + '.'; }'production' !== 'production' ? warning(false, \"Don't set .props.%s of the React component%s. Instead, specify the \" + 'correct value when initially creating the element or use ' + 'React.cloneElement to make a new element with updated props.%s', propName, elementInfo, ownerInfo) : null; } function is (a, b) { if (a !== a) { return b !== b; } if (a === 0 && b === 0) { return 1 / a === 1 / b; } return a === b; } function checkAndWarnForMutatedProps (element) { if (!element._store) { return; } var originalProps = element._store.originalProps; var props = element.props; for (var propName in props) { if (props.hasOwnProperty(propName)) { if (!originalProps.hasOwnProperty(propName) || !is(originalProps[propName], props[propName])) { warnForPropsMutation(propName, element); originalProps[propName] = props[propName]; } } } } function validatePropTypes (element) { if (element.type == null) { return; } var componentClass = ReactNativeComponent.getComponentClassForElement(element); var name = componentClass.displayName || componentClass.name; if (componentClass.propTypes) { checkPropTypes(name, componentClass.propTypes, element.props, ReactPropTypeLocations.prop); } if (typeof componentClass.getDefaultProps === 'function') { 'production' !== 'production' ? warning(componentClass.getDefaultProps.isReactClassApproved, 'getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.') : null; } } var ReactElementValidator = { checkAndWarnForMutatedProps: checkAndWarnForMutatedProps, createElement: function (type, props, children) { 'production' !== 'production' ? warning(type != null, 'React.createElement: type should not be null or undefined. It should ' + 'be a string (for DOM elements) or a ReactClass (for composite ' + 'components).') : null; var element = ReactElement.createElement.apply(this, arguments); if (element == null) { return element; } for (var i = 2; i < arguments.length; i++) { validateChildKeys(arguments[i], type); }validatePropTypes(element); return element; }, createFactory: function (type) { var validatedFactory = ReactElementValidator.createElement.bind(null, type); validatedFactory.type = type; if ('production' !== 'production') { try { Object.defineProperty(validatedFactory, 'type', { enumerable: false, get: function () { 'production' !== 'production' ? warning(false, 'Factory.type is deprecated. Access the class directly ' + 'before passing it to createFactory.') : null; Object.defineProperty(this, 'type', { value: type }); return type; } }); } catch (x) {} } return validatedFactory; }, cloneElement: function (element, props, children) { var newElement = ReactElement.cloneElement.apply(this, arguments); for (var i = 2; i < arguments.length; i++) { validateChildKeys(arguments[i], newElement.type); }validatePropTypes(newElement); return newElement; } }; module.exports = ReactElementValidator;\n  }, { './ReactCurrentOwner': 47, './ReactElement': 65, './ReactFragment': 71, './ReactNativeComponent': 81, './ReactPropTypeLocationNames': 84, './ReactPropTypeLocations': 85, './getIteratorFn': 134, './invariant': 143, './warning': 162 }],\n  67: [function (require, module, exports) { 'use strict'; var ReactElement = require('./ReactElement'); var ReactInstanceMap = require('./ReactInstanceMap'); var invariant = require('./invariant'); var component; var nullComponentIDsRegistry = {}; var ReactEmptyComponentInjection = { injectEmptyComponent: function (emptyComponent) { component = ReactElement.createFactory(emptyComponent); } }; var ReactEmptyComponentType = function () {}; ReactEmptyComponentType.prototype.componentDidMount = function () { var internalInstance = ReactInstanceMap.get(this); if (!internalInstance) { return; }registerNullComponentID(internalInstance._rootNodeID); }; ReactEmptyComponentType.prototype.componentWillUnmount = function () { var internalInstance = ReactInstanceMap.get(this); if (!internalInstance) { return; }deregisterNullComponentID(internalInstance._rootNodeID); }; ReactEmptyComponentType.prototype.render = function () { 'production' !== 'production' ? invariant(component, 'Trying to return null from a render, but no null placeholder component ' + 'was injected.') : invariant(component); return component(); }; var emptyElement = ReactElement.createElement(ReactEmptyComponentType); function registerNullComponentID (id) { nullComponentIDsRegistry[id] = true; } function deregisterNullComponentID (id) { delete nullComponentIDsRegistry[id]; } function isNullComponentID (id) { return !!nullComponentIDsRegistry[id]; } var ReactEmptyComponent = { emptyElement: emptyElement, injection: ReactEmptyComponentInjection, isNullComponentID: isNullComponentID }; module.exports = ReactEmptyComponent; }, { './ReactElement': 65, './ReactInstanceMap': 75, './invariant': 143 }],\n  68: [function (require, module, exports) { 'use strict'; var ReactErrorUtils = { guard: function (func, name) { return func; } }; module.exports = ReactErrorUtils; }, {}],\n  69: [function (require, module, exports) { 'use strict'; var EventPluginHub = require('./EventPluginHub'); function runEventQueueInBatch (events) { EventPluginHub.enqueueEvents(events); EventPluginHub.processEventQueue(); } var ReactEventEmitterMixin = { handleTopLevel: function (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent) { var events = EventPluginHub.extractEvents(topLevelType, topLevelTarget, topLevelTargetID, nativeEvent); runEventQueueInBatch(events); } }; module.exports = ReactEventEmitterMixin; }, { './EventPluginHub': 24 }],\n  70: [function (require, module, exports) { 'use strict'; var EventListener = require('./EventListener'); var ExecutionEnvironment = require('./ExecutionEnvironment'); var PooledClass = require('./PooledClass'); var ReactInstanceHandles = require('./ReactInstanceHandles'); var ReactMount = require('./ReactMount'); var ReactUpdates = require('./ReactUpdates'); var assign = require('./Object.assign'); var getEventTarget = require('./getEventTarget'); var getUnboundedScrollPosition = require('./getUnboundedScrollPosition'); function findParent (node) { var nodeID = ReactMount.getID(node); var rootID = ReactInstanceHandles.getReactRootIDFromNodeID(nodeID); var container = ReactMount.findReactContainerForID(rootID); var parent = ReactMount.getFirstReactDOM(container); return parent; } function TopLevelCallbackBookKeeping (topLevelType, nativeEvent) { this.topLevelType = topLevelType; this.nativeEvent = nativeEvent; this.ancestors = []; }assign(TopLevelCallbackBookKeeping.prototype, { destructor: function () { this.topLevelType = null; this.nativeEvent = null; this.ancestors.length = 0; } }); PooledClass.addPoolingTo(TopLevelCallbackBookKeeping, PooledClass.twoArgumentPooler); function handleTopLevelImpl (bookKeeping) { var topLevelTarget = ReactMount.getFirstReactDOM(getEventTarget(bookKeeping.nativeEvent)) || window; var ancestor = topLevelTarget; while (ancestor) { bookKeeping.ancestors.push(ancestor); ancestor = findParent(ancestor); } for (var i = 0, l = bookKeeping.ancestors.length; i < l; i++) { topLevelTarget = bookKeeping.ancestors[i]; var topLevelTargetID = ReactMount.getID(topLevelTarget) || ''; ReactEventListener._handleTopLevel(bookKeeping.topLevelType, topLevelTarget, topLevelTargetID, bookKeeping.nativeEvent); } } function scrollValueMonitor (cb) { var scrollPosition = getUnboundedScrollPosition(window); cb(scrollPosition); } var ReactEventListener = { _enabled: true, _handleTopLevel: null, WINDOW_HANDLE: ExecutionEnvironment.canUseDOM ? window : null, setHandleTopLevel: function (handleTopLevel) { ReactEventListener._handleTopLevel = handleTopLevel; }, setEnabled: function (enabled) { ReactEventListener._enabled = !!enabled; }, isEnabled: function () { return ReactEventListener._enabled; }, trapBubbledEvent: function (topLevelType, handlerBaseName, handle) { var element = handle; if (!element) { return null; } return EventListener.listen(element, handlerBaseName, ReactEventListener.dispatchEvent.bind(null, topLevelType)); }, trapCapturedEvent: function (topLevelType, handlerBaseName, handle) { var element = handle; if (!element) { return null; } return EventListener.capture(element, handlerBaseName, ReactEventListener.dispatchEvent.bind(null, topLevelType)); }, monitorScrollValue: function (refresh) { var callback = scrollValueMonitor.bind(null, refresh); EventListener.listen(window, 'scroll', callback); }, dispatchEvent: function (topLevelType, nativeEvent) { if (!ReactEventListener._enabled) { return; } var bookKeeping = TopLevelCallbackBookKeeping.getPooled(topLevelType, nativeEvent); try { ReactUpdates.batchedUpdates(handleTopLevelImpl, bookKeeping); } finally { TopLevelCallbackBookKeeping.release(bookKeeping); } } }; module.exports = ReactEventListener; }, { './EventListener': 23, './ExecutionEnvironment': 28, './Object.assign': 34, './PooledClass': 35, './ReactInstanceHandles': 74, './ReactMount': 78, './ReactUpdates': 95, './getEventTarget': 133, './getUnboundedScrollPosition': 139 }],\n  71: [function (require, module, exports) { 'use strict'; var ReactElement = require('./ReactElement'); var warning = require('./warning'); if ('production' !== 'production') { var fragmentKey = '_reactFragment'; var didWarnKey = '_reactDidWarn'; var canWarnForReactFragment = false; try { var dummy = function () { return 1; }; Object.defineProperty({}, fragmentKey, { enumerable: false, value: true }); Object.defineProperty({}, 'key', { enumerable: true, get: dummy }); canWarnForReactFragment = true; } catch (x) {} var proxyPropertyAccessWithWarning = function (obj, key) { Object.defineProperty(obj, key, { enumerable: true, get: function () { 'production' !== 'production' ? warning(this[didWarnKey], 'A ReactFragment is an opaque type. Accessing any of its ' + 'properties is deprecated. Pass it to one of the React.Children ' + 'helpers.') : null; this[didWarnKey] = true; return this[fragmentKey][key]; }, set: function (value) { 'production' !== 'production' ? warning(this[didWarnKey], 'A ReactFragment is an immutable opaque type. Mutating its ' + 'properties is deprecated.') : null; this[didWarnKey] = true; this[fragmentKey][key] = value; } }); }; var issuedWarnings = {}; var didWarnForFragment = function (fragment) { var fragmentCacheKey = ''; for (var key in fragment) { fragmentCacheKey += key + ':' + typeof fragment[key] + ','; } var alreadyWarnedOnce = !!issuedWarnings[fragmentCacheKey]; issuedWarnings[fragmentCacheKey] = true; return alreadyWarnedOnce; }; } var ReactFragment = { create: function (object) { if ('production' !== 'production') { if (typeof object !== 'object' || !object || Array.isArray(object)) { 'production' !== 'production' ? warning(false, 'React.addons.createFragment only accepts a single object.', object) : null; return object; } if (ReactElement.isValidElement(object)) { 'production' !== 'production' ? warning(false, 'React.addons.createFragment does not accept a ReactElement ' + 'without a wrapper object.') : null; return object; } if (canWarnForReactFragment) { var proxy = {}; Object.defineProperty(proxy, fragmentKey, { enumerable: false, value: object }); Object.defineProperty(proxy, didWarnKey, { writable: true, enumerable: false, value: false }); for (var key in object) { proxyPropertyAccessWithWarning(proxy, key); }Object.preventExtensions(proxy); return proxy; } } return object; }, extract: function (fragment) { if ('production' !== 'production') { if (canWarnForReactFragment) { if (!fragment[fragmentKey]) { 'production' !== 'production' ? warning(didWarnForFragment(fragment), 'Any use of a keyed object should be wrapped in ' + 'React.addons.createFragment(object) before being passed as a ' + 'child.') : null; return fragment; } return fragment[fragmentKey]; } } return fragment; }, extractIfFragment: function (fragment) { if ('production' !== 'production') { if (canWarnForReactFragment) { if (fragment[fragmentKey]) { return fragment[fragmentKey]; } for (var key in fragment) { if (fragment.hasOwnProperty(key) && ReactElement.isValidElement(fragment[key])) { return ReactFragment.extract(fragment); } } } } return fragment; } }; module.exports = ReactFragment; }, { './ReactElement': 65, './warning': 162 }],\n  72: [function (require, module, exports) { 'use strict'; var DOMProperty = require('./DOMProperty'); var EventPluginHub = require('./EventPluginHub'); var ReactComponentEnvironment = require('./ReactComponentEnvironment'); var ReactClass = require('./ReactClass'); var ReactEmptyComponent = require('./ReactEmptyComponent'); var ReactBrowserEventEmitter = require('./ReactBrowserEventEmitter'); var ReactNativeComponent = require('./ReactNativeComponent'); var ReactDOMComponent = require('./ReactDOMComponent'); var ReactPerf = require('./ReactPerf'); var ReactRootIndex = require('./ReactRootIndex'); var ReactUpdates = require('./ReactUpdates'); var ReactInjection = { Component: ReactComponentEnvironment.injection, Class: ReactClass.injection, DOMComponent: ReactDOMComponent.injection, DOMProperty: DOMProperty.injection, EmptyComponent: ReactEmptyComponent.injection, EventPluginHub: EventPluginHub.injection, EventEmitter: ReactBrowserEventEmitter.injection, NativeComponent: ReactNativeComponent.injection, Perf: ReactPerf.injection, RootIndex: ReactRootIndex.injection, Updates: ReactUpdates.injection }; module.exports = ReactInjection; }, { './DOMProperty': 17, './EventPluginHub': 24, './ReactBrowserEventEmitter': 38, './ReactClass': 41, './ReactComponentEnvironment': 44, './ReactDOMComponent': 50, './ReactEmptyComponent': 67, './ReactNativeComponent': 81, './ReactPerf': 83, './ReactRootIndex': 91, './ReactUpdates': 95 }],\n  73: [function (require, module, exports) { 'use strict'; var ReactDOMSelection = require('./ReactDOMSelection'); var containsNode = require('./containsNode'); var focusNode = require('./focusNode'); var getActiveElement = require('./getActiveElement'); function isInDocument (node) { return containsNode(document.documentElement, node); } var ReactInputSelection = { hasSelectionCapabilities: function (elem) { return elem && (elem.nodeName === 'INPUT' && elem.type === 'text' || elem.nodeName === 'TEXTAREA' || elem.contentEditable === 'true'); }, getSelectionInformation: function () { var focusedElem = getActiveElement(); return { focusedElem: focusedElem, selectionRange: ReactInputSelection.hasSelectionCapabilities(focusedElem) ? ReactInputSelection.getSelection(focusedElem) : null }; }, restoreSelection: function (priorSelectionInformation) { var curFocusedElem = getActiveElement(); var priorFocusedElem = priorSelectionInformation.focusedElem; var priorSelectionRange = priorSelectionInformation.selectionRange; if (curFocusedElem !== priorFocusedElem && isInDocument(priorFocusedElem)) { if (ReactInputSelection.hasSelectionCapabilities(priorFocusedElem)) { ReactInputSelection.setSelection(priorFocusedElem, priorSelectionRange); }focusNode(priorFocusedElem); } }, getSelection: function (input) { var selection; if ('selectionStart' in input) { selection = { start: input.selectionStart, end: input.selectionEnd }; } else if (document.selection && input.nodeName === 'INPUT') { var range = document.selection.createRange(); if (range.parentElement() === input) { selection = { start: -range.moveStart('character', -input.value.length), end: -range.moveEnd('character', -input.value.length) }; } } else { selection = ReactDOMSelection.getOffsets(input); } return selection || { start: 0, end: 0 }; }, setSelection: function (input, offsets) { var start = offsets.start; var end = offsets.end; if (typeof end === 'undefined') { end = start; } if ('selectionStart' in input) { input.selectionStart = start; input.selectionEnd = Math.min(end, input.value.length); } else if (document.selection && input.nodeName === 'INPUT') { var range = input.createTextRange(); range.collapse(true); range.moveStart('character', start); range.moveEnd('character', end - start); range.select(); } else { ReactDOMSelection.setOffsets(input, offsets); } } }; module.exports = ReactInputSelection; }, { './ReactDOMSelection': 58, './containsNode': 117, './focusNode': 127, './getActiveElement': 129 }],\n  74: [function (require, module, exports) { 'use strict'; var ReactRootIndex = require('./ReactRootIndex'); var invariant = require('./invariant'); var SEPARATOR = '.'; var SEPARATOR_LENGTH = SEPARATOR.length; var MAX_TREE_DEPTH = 100; function getReactRootIDString (index) { return SEPARATOR + index.toString(36); } function isBoundary (id, index) { return id.charAt(index) === SEPARATOR || index === id.length; } function isValidID (id) { return id === '' || id.charAt(0) === SEPARATOR && id.charAt(id.length - 1) !== SEPARATOR; } function isAncestorIDOf (ancestorID, descendantID) { return descendantID.indexOf(ancestorID) === 0 && isBoundary(descendantID, ancestorID.length); } function getParentID (id) { return id ? id.substr(0, id.lastIndexOf(SEPARATOR)) : ''; } function getNextDescendantID (ancestorID, destinationID) { 'production' !== 'production' ? invariant(isValidID(ancestorID) && isValidID(destinationID), 'getNextDescendantID(%s, %s): Received an invalid React DOM ID.', ancestorID, destinationID) : invariant(isValidID(ancestorID) && isValidID(destinationID)); 'production' !== 'production' ? invariant(isAncestorIDOf(ancestorID, destinationID), 'getNextDescendantID(...): React has made an invalid assumption about ' + 'the DOM hierarchy. Expected `%s` to be an ancestor of `%s`.', ancestorID, destinationID) : invariant(isAncestorIDOf(ancestorID, destinationID)); if (ancestorID === destinationID) { return ancestorID; } var start = ancestorID.length + SEPARATOR_LENGTH; var i; for (i = start; i < destinationID.length; i++) { if (isBoundary(destinationID, i)) { break; } } return destinationID.substr(0, i); } function getFirstCommonAncestorID (oneID, twoID) { var minLength = Math.min(oneID.length, twoID.length); if (minLength === 0) { return ''; } var lastCommonMarkerIndex = 0; for (var i = 0; i <= minLength; i++) { if (isBoundary(oneID, i) && isBoundary(twoID, i)) { lastCommonMarkerIndex = i; } else if (oneID.charAt(i) !== twoID.charAt(i)) { break; } } var longestCommonID = oneID.substr(0, lastCommonMarkerIndex); 'production' !== 'production' ? invariant(isValidID(longestCommonID), 'getFirstCommonAncestorID(%s, %s): Expected a valid React DOM ID: %s', oneID, twoID, longestCommonID) : invariant(isValidID(longestCommonID)); return longestCommonID; } function traverseParentPath (start, stop, cb, arg, skipFirst, skipLast) { start = start || ''; stop = stop || ''; 'production' !== 'production' ? invariant(start !== stop, 'traverseParentPath(...): Cannot traverse from and to the same ID, `%s`.', start) : invariant(start !== stop); var traverseUp = isAncestorIDOf(stop, start); 'production' !== 'production' ? invariant(traverseUp || isAncestorIDOf(start, stop), 'traverseParentPath(%s, %s, ...): Cannot traverse from two IDs that do ' + 'not have a parent path.', start, stop) : invariant(traverseUp || isAncestorIDOf(start, stop)); var depth = 0; var traverse = traverseUp ? getParentID : getNextDescendantID; for (var id = start; ;id = traverse(id, stop)) { var ret; if ((!skipFirst || id !== start) && (!skipLast || id !== stop)) { ret = cb(id, traverseUp, arg); } if (ret === false || id === stop) { break; }'production' !== 'production' ? invariant(depth++ < MAX_TREE_DEPTH, 'traverseParentPath(%s, %s, ...): Detected an infinite loop while ' + 'traversing the React DOM ID tree. This may be due to malformed IDs: %s', start, stop) : invariant(depth++ < MAX_TREE_DEPTH); } } var ReactInstanceHandles = { createReactRootID: function () { return getReactRootIDString(ReactRootIndex.createReactRootIndex()); }, createReactID: function (rootID, name) { return rootID + name; }, getReactRootIDFromNodeID: function (id) { if (id && id.charAt(0) === SEPARATOR && id.length > 1) { var index = id.indexOf(SEPARATOR, 1); return index > -1 ? id.substr(0, index) : id; } return null; }, traverseEnterLeave: function (leaveID, enterID, cb, upArg, downArg) { var ancestorID = getFirstCommonAncestorID(leaveID, enterID); if (ancestorID !== leaveID) { traverseParentPath(leaveID, ancestorID, cb, upArg, false, true); } if (ancestorID !== enterID) { traverseParentPath(ancestorID, enterID, cb, downArg, true, false); } }, traverseTwoPhase: function (targetID, cb, arg) { if (targetID) { traverseParentPath('', targetID, cb, arg, true, false); traverseParentPath(targetID, '', cb, arg, false, true); } }, traverseAncestors: function (targetID, cb, arg) { traverseParentPath('', targetID, cb, arg, true, false); }, _getFirstCommonAncestorID: getFirstCommonAncestorID, _getNextDescendantID: getNextDescendantID, isAncestorIDOf: isAncestorIDOf, SEPARATOR: SEPARATOR }; module.exports = ReactInstanceHandles; }, { './ReactRootIndex': 91, './invariant': 143 }],\n  75: [function (require, module, exports) { 'use strict'; var ReactInstanceMap = { remove: function (key) { key._reactInternalInstance = undefined; }, get: function (key) { return key._reactInternalInstance; }, has: function (key) { return key._reactInternalInstance !== undefined; }, set: function (key, value) { key._reactInternalInstance = value; } }; module.exports = ReactInstanceMap; }, {}],\n  76: [function (require, module, exports) { 'use strict'; var ReactLifeCycle = { currentlyMountingInstance: null, currentlyUnmountingInstance: null }; module.exports = ReactLifeCycle; }, {}],\n  77: [function (require, module, exports) { 'use strict'; var adler32 = require('./adler32'); var ReactMarkupChecksum = { CHECKSUM_ATTR_NAME: 'data-react-checksum', addChecksumToMarkup: function (markup) { var checksum = adler32(markup); return markup.replace('>', ' ' + ReactMarkupChecksum.CHECKSUM_ATTR_NAME + '=\"' + checksum + '\">'); }, canReuseMarkup: function (markup, element) { var existingChecksum = element.getAttribute(ReactMarkupChecksum.CHECKSUM_ATTR_NAME); existingChecksum = existingChecksum && parseInt(existingChecksum, 10); var markupChecksum = adler32(markup); return markupChecksum === existingChecksum; } }; module.exports = ReactMarkupChecksum; }, { './adler32': 114 }],\n  78: [function (require, module, exports) {\n    'use strict'; var DOMProperty = require('./DOMProperty'); var ReactBrowserEventEmitter = require('./ReactBrowserEventEmitter'); var ReactCurrentOwner = require('./ReactCurrentOwner'); var ReactElement = require('./ReactElement'); var ReactElementValidator = require('./ReactElementValidator'); var ReactEmptyComponent = require('./ReactEmptyComponent'); var ReactInstanceHandles = require('./ReactInstanceHandles'); var ReactInstanceMap = require('./ReactInstanceMap'); var ReactMarkupChecksum = require('./ReactMarkupChecksum'); var ReactPerf = require('./ReactPerf'); var ReactReconciler = require('./ReactReconciler'); var ReactUpdateQueue = require('./ReactUpdateQueue'); var ReactUpdates = require('./ReactUpdates'); var emptyObject = require('./emptyObject'); var containsNode = require('./containsNode'); var getReactRootElementInContainer = require('./getReactRootElementInContainer'); var instantiateReactComponent = require('./instantiateReactComponent'); var invariant = require('./invariant'); var setInnerHTML = require('./setInnerHTML'); var shouldUpdateReactComponent = require('./shouldUpdateReactComponent'); var warning = require('./warning'); var SEPARATOR = ReactInstanceHandles.SEPARATOR; var ATTR_NAME = DOMProperty.ID_ATTRIBUTE_NAME; var nodeCache = {}; var ELEMENT_NODE_TYPE = 1; var DOC_NODE_TYPE = 9; var instancesByReactRootID = {}; var containersByReactRootID = {}; if ('production' !== 'production') { var rootElementsByReactRootID = {}; } var findComponentRootReusableArray = []; function firstDifferenceIndex (string1, string2) { var minLen = Math.min(string1.length, string2.length); for (var i = 0; i < minLen; i++) { if (string1.charAt(i) !== string2.charAt(i)) { return i; } } return string1.length === string2.length ? -1 : minLen; } function getReactRootID (container) { var rootElement = getReactRootElementInContainer(container); return rootElement && ReactMount.getID(rootElement); } function getID (node) { var id = internalGetID(node); if (id) { if (nodeCache.hasOwnProperty(id)) { var cached = nodeCache[id]; if (cached !== node) { 'production' !== 'production' ? invariant(!isValid(cached, id), 'ReactMount: Two valid but unequal nodes with the same `%s`: %s', ATTR_NAME, id) : invariant(!isValid(cached, id)); nodeCache[id] = node; } } else { nodeCache[id] = node; } } return id; } function internalGetID (node) { return node && node.getAttribute && node.getAttribute(ATTR_NAME) || ''; } function setID (node, id) { var oldID = internalGetID(node); if (oldID !== id) { delete nodeCache[oldID]; }node.setAttribute(ATTR_NAME, id); nodeCache[id] = node; } function getNode (id) { if (!nodeCache.hasOwnProperty(id) || !isValid(nodeCache[id], id)) { nodeCache[id] = ReactMount.findReactNodeByID(id); } return nodeCache[id]; } function getNodeFromInstance (instance) { var id = ReactInstanceMap.get(instance)._rootNodeID; if (ReactEmptyComponent.isNullComponentID(id)) { return null; } if (!nodeCache.hasOwnProperty(id) || !isValid(nodeCache[id], id)) { nodeCache[id] = ReactMount.findReactNodeByID(id); } return nodeCache[id]; } function isValid (node, id) { if (node) { 'production' !== 'production' ? invariant(internalGetID(node) === id, 'ReactMount: Unexpected modification of `%s`', ATTR_NAME) : invariant(internalGetID(node) === id); var container = ReactMount.findReactContainerForID(id); if (container && containsNode(container, node)) { return true; } } return false; } function purgeID (id) { delete nodeCache[id]; } var deepestNodeSoFar = null; function findDeepestCachedAncestorImpl (ancestorID) { var ancestor = nodeCache[ancestorID]; if (ancestor && isValid(ancestor, ancestorID)) { deepestNodeSoFar = ancestor; } else { return false; } } function findDeepestCachedAncestor (targetID) { deepestNodeSoFar = null; ReactInstanceHandles.traverseAncestors(targetID, findDeepestCachedAncestorImpl); var foundNode = deepestNodeSoFar; deepestNodeSoFar = null; return foundNode; } function mountComponentIntoNode (componentInstance, rootID, container, transaction, shouldReuseMarkup) { var markup = ReactReconciler.mountComponent(componentInstance, rootID, transaction, emptyObject); componentInstance._isTopLevel = true; ReactMount._mountImageIntoNode(markup, container, shouldReuseMarkup); } function batchedMountComponentIntoNode (componentInstance, rootID, container, shouldReuseMarkup) { var transaction = ReactUpdates.ReactReconcileTransaction.getPooled(); transaction.perform(mountComponentIntoNode, null, componentInstance, rootID, container, transaction, shouldReuseMarkup); ReactUpdates.ReactReconcileTransaction.release(transaction); } var ReactMount = { _instancesByReactRootID: instancesByReactRootID,\n      scrollMonitor: function (container, renderCallback) { renderCallback(); },\n      _updateRootComponent: function (prevComponent, nextElement, container, callback) { if ('production' !== 'production') { ReactElementValidator.checkAndWarnForMutatedProps(nextElement); }ReactMount.scrollMonitor(container, function () { ReactUpdateQueue.enqueueElementInternal(prevComponent, nextElement); if (callback) { ReactUpdateQueue.enqueueCallbackInternal(prevComponent, callback); } }); if ('production' !== 'production') { rootElementsByReactRootID[getReactRootID(container)] = getReactRootElementInContainer(container); } return prevComponent; },\n      _registerComponent: function (nextComponent, container) { 'production' !== 'production' ? invariant(container && (container.nodeType === ELEMENT_NODE_TYPE || container.nodeType === DOC_NODE_TYPE), '_registerComponent(...): Target container is not a DOM element.') : invariant(container && (container.nodeType === ELEMENT_NODE_TYPE || container.nodeType === DOC_NODE_TYPE)); ReactBrowserEventEmitter.ensureScrollValueMonitoring(); var reactRootID = ReactMount.registerContainer(container); instancesByReactRootID[reactRootID] = nextComponent; return reactRootID; },\n      _renderNewRootComponent: function (nextElement, container, shouldReuseMarkup) { 'production' !== 'production' ? warning(ReactCurrentOwner.current == null, '_renderNewRootComponent(): Render methods should be a pure function ' + 'of props and state; triggering nested component updates from ' + 'render is not allowed. If necessary, trigger nested updates in ' + 'componentDidUpdate.') : null; var componentInstance = instantiateReactComponent(nextElement, null); var reactRootID = ReactMount._registerComponent(componentInstance, container); ReactUpdates.batchedUpdates(batchedMountComponentIntoNode, componentInstance, reactRootID, container, shouldReuseMarkup); if ('production' !== 'production') { rootElementsByReactRootID[reactRootID] = getReactRootElementInContainer(container); } return componentInstance; },\n      render: function (nextElement, container, callback) { 'production' !== 'production' ? invariant(ReactElement.isValidElement(nextElement), 'React.render(): Invalid component element.%s', typeof nextElement === 'string' ? ' Instead of passing an element string, make sure to instantiate ' + 'it by passing it to React.createElement.' : typeof nextElement === 'function' ? ' Instead of passing a component class, make sure to instantiate ' + 'it by passing it to React.createElement.' : nextElement != null && nextElement.props !== undefined ? ' This may be caused by unintentionally loading two independent ' + 'copies of React.' : '') : invariant(ReactElement.isValidElement(nextElement)); var prevComponent = instancesByReactRootID[getReactRootID(container)]; if (prevComponent) { var prevElement = prevComponent._currentElement; if (shouldUpdateReactComponent(prevElement, nextElement)) { return ReactMount._updateRootComponent(prevComponent, nextElement, container, callback).getPublicInstance(); } else { ReactMount.unmountComponentAtNode(container); } } var reactRootElement = getReactRootElementInContainer(container); var containerHasReactMarkup = reactRootElement && ReactMount.isRenderedByReact(reactRootElement); if ('production' !== 'production') { if (!containerHasReactMarkup || reactRootElement.nextSibling) { var rootElementSibling = reactRootElement; while (rootElementSibling) { if (ReactMount.isRenderedByReact(rootElementSibling)) { 'production' !== 'production' ? warning(false, 'render(): Target node has markup rendered by React, but there ' + 'are unrelated nodes as well. This is most commonly caused by ' + 'white-space inserted around server-rendered markup.') : null; break; }rootElementSibling = rootElementSibling.nextSibling; } } } var shouldReuseMarkup = containerHasReactMarkup && !prevComponent; var component = ReactMount._renderNewRootComponent(nextElement, container, shouldReuseMarkup).getPublicInstance(); if (callback) { callback.call(component); } return component; },\n      constructAndRenderComponent: function (constructor, props, container) { var element = ReactElement.createElement(constructor, props); return ReactMount.render(element, container); },\n      constructAndRenderComponentByID: function (constructor, props, id) { var domNode = document.getElementById(id); 'production' !== 'production' ? invariant(domNode, 'Tried to get element with id of \"%s\" but it is not present on the page.', id) : invariant(domNode); return ReactMount.constructAndRenderComponent(constructor, props, domNode); },\n      registerContainer: function (container) {\n        var reactRootID = getReactRootID(container); if (reactRootID) {\n          reactRootID = ReactInstanceHandles.getReactRootIDFromNodeID(reactRootID);\n        } if (!reactRootID) { reactRootID = ReactInstanceHandles.createReactRootID(); }containersByReactRootID[reactRootID] = container; return reactRootID;\n      },\n      unmountComponentAtNode: function (container) { 'production' !== 'production' ? warning(ReactCurrentOwner.current == null, 'unmountComponentAtNode(): Render methods should be a pure function of ' + 'props and state; triggering nested component updates from render is ' + 'not allowed. If necessary, trigger nested updates in ' + 'componentDidUpdate.') : null; 'production' !== 'production' ? invariant(container && (container.nodeType === ELEMENT_NODE_TYPE || container.nodeType === DOC_NODE_TYPE), 'unmountComponentAtNode(...): Target container is not a DOM element.') : invariant(container && (container.nodeType === ELEMENT_NODE_TYPE || container.nodeType === DOC_NODE_TYPE)); var reactRootID = getReactRootID(container); var component = instancesByReactRootID[reactRootID]; if (!component) { return false; }ReactMount.unmountComponentFromNode(component, container); delete instancesByReactRootID[reactRootID]; delete containersByReactRootID[reactRootID]; if ('production' !== 'production') { delete rootElementsByReactRootID[reactRootID]; } return true; },\n      unmountComponentFromNode: function (instance, container) { ReactReconciler.unmountComponent(instance); if (container.nodeType === DOC_NODE_TYPE) { container = container.documentElement; } while (container.lastChild) { container.removeChild(container.lastChild); } },\n      findReactContainerForID: function (id) { var reactRootID = ReactInstanceHandles.getReactRootIDFromNodeID(id); var container = containersByReactRootID[reactRootID]; if ('production' !== 'production') { var rootElement = rootElementsByReactRootID[reactRootID]; if (rootElement && rootElement.parentNode !== container) { 'production' !== 'production' ? invariant(internalGetID(rootElement) === reactRootID, 'ReactMount: Root element ID differed from reactRootID.') : invariant(internalGetID(rootElement) === reactRootID); var containerChild = container.firstChild; if (containerChild && reactRootID === internalGetID(containerChild)) { rootElementsByReactRootID[reactRootID] = containerChild; } else { 'production' !== 'production' ? warning(false, 'ReactMount: Root element has been removed from its original ' + 'container. New container:', rootElement.parentNode) : null; } } } return container; },\n      findReactNodeByID: function (id) { var reactRoot = ReactMount.findReactContainerForID(id); return ReactMount.findComponentRoot(reactRoot, id); },\n      isRenderedByReact: function (node) { if (node.nodeType !== 1) { return false; } var id = ReactMount.getID(node); return id ? id.charAt(0) === SEPARATOR : false; },\n      getFirstReactDOM: function (node) { var current = node; while (current && current.parentNode !== current) { if (ReactMount.isRenderedByReact(current)) { return current; }current = current.parentNode; } return null; },\n      findComponentRoot: function (ancestorNode, targetID) { var firstChildren = findComponentRootReusableArray; var childIndex = 0; var deepestAncestor = findDeepestCachedAncestor(targetID) || ancestorNode; firstChildren[0] = deepestAncestor.firstChild; firstChildren.length = 1; while (childIndex < firstChildren.length) { var child = firstChildren[childIndex++]; var targetChild; while (child) { var childID = ReactMount.getID(child); if (childID) { if (targetID === childID) { targetChild = child; } else if (ReactInstanceHandles.isAncestorIDOf(childID, targetID)) { firstChildren.length = childIndex = 0; firstChildren.push(child.firstChild); } } else { firstChildren.push(child.firstChild); }child = child.nextSibling; } if (targetChild) { firstChildren.length = 0; return targetChild; } }firstChildren.length = 0; 'production' !== 'production' ? invariant(false, 'findComponentRoot(..., %s): Unable to find element. This probably ' + 'means the DOM was unexpectedly mutated (e.g., by the browser), ' + 'usually due to forgetting a <tbody> when using tables, nesting tags ' + 'like <form>, <p>, or <a>, or using non-SVG elements in an <svg> ' + 'parent. ' + 'Try inspecting the child nodes of the element with React ID `%s`.', targetID, ReactMount.getID(ancestorNode)) : invariant(false); },\n      _mountImageIntoNode: function (markup, container, shouldReuseMarkup) { 'production' !== 'production' ? invariant(container && (container.nodeType === ELEMENT_NODE_TYPE || container.nodeType === DOC_NODE_TYPE), 'mountComponentIntoNode(...): Target container is not valid.') : invariant(container && (container.nodeType === ELEMENT_NODE_TYPE || container.nodeType === DOC_NODE_TYPE)); if (shouldReuseMarkup) { var rootElement = getReactRootElementInContainer(container); if (ReactMarkupChecksum.canReuseMarkup(markup, rootElement)) { return; } else { var checksum = rootElement.getAttribute(ReactMarkupChecksum.CHECKSUM_ATTR_NAME); rootElement.removeAttribute(ReactMarkupChecksum.CHECKSUM_ATTR_NAME); var rootMarkup = rootElement.outerHTML; rootElement.setAttribute(ReactMarkupChecksum.CHECKSUM_ATTR_NAME, checksum); var diffIndex = firstDifferenceIndex(markup, rootMarkup); var difference = ' (client) ' + markup.substring(diffIndex - 20, diffIndex + 20) + '\\n (server) ' + rootMarkup.substring(diffIndex - 20, diffIndex + 20); 'production' !== 'production' ? invariant(container.nodeType !== DOC_NODE_TYPE, \"You're trying to render a component to the document using \" + 'server rendering but the checksum was invalid. This usually ' + 'means you rendered a different component type or props on ' + 'the client from the one on the server, or your render() ' + 'methods are impure. React cannot handle this case due to ' + 'cross-browser quirks by rendering at the document root. You ' + 'should look for environment dependent code in your components ' + 'and ensure the props are the same client and server side:\\n%s', difference) : invariant(container.nodeType !== DOC_NODE_TYPE); if ('production' !== 'production') { 'production' !== 'production' ? warning(false, 'React attempted to reuse markup in a container but the ' + 'checksum was invalid. This generally means that you are ' + 'using server rendering and the markup generated on the ' + 'server was not what the client was expecting. React injected ' + 'new markup to compensate which works but you have lost many ' + 'of the benefits of server rendering. Instead, figure out ' + 'why the markup being generated is different on the client ' + 'or server:\\n%s', difference) : null; } } }'production' !== 'production' ? invariant(container.nodeType !== DOC_NODE_TYPE, \"You're trying to render a component to the document but \" + \"you didn't use server rendering. We can't do this \" + 'without using server rendering due to cross-browser quirks. ' + 'See React.renderToString() for server rendering.') : invariant(container.nodeType !== DOC_NODE_TYPE); setInnerHTML(container, markup); },\n      getReactRootID: getReactRootID,\n      getID: getID,\n      setID: setID,\n      getNode: getNode,\n      getNodeFromInstance: getNodeFromInstance,\n      purgeID: purgeID }; ReactPerf.measureMethods(ReactMount, 'ReactMount', { _renderNewRootComponent: '_renderNewRootComponent', _mountImageIntoNode: '_mountImageIntoNode' }); module.exports = ReactMount;\n  }, { './DOMProperty': 17, './ReactBrowserEventEmitter': 38, './ReactCurrentOwner': 47, './ReactElement': 65, './ReactElementValidator': 66, './ReactEmptyComponent': 67, './ReactInstanceHandles': 74, './ReactInstanceMap': 75, './ReactMarkupChecksum': 77, './ReactPerf': 83, './ReactReconciler': 89, './ReactUpdateQueue': 94, './ReactUpdates': 95, './containsNode': 117, './emptyObject': 123, './getReactRootElementInContainer': 137, './instantiateReactComponent': 142, './invariant': 143, './setInnerHTML': 156, './shouldUpdateReactComponent': 159, './warning': 162 }],\n  79: [function (require, module, exports) { 'use strict'; var ReactComponentEnvironment = require('./ReactComponentEnvironment'); var ReactMultiChildUpdateTypes = require('./ReactMultiChildUpdateTypes'); var ReactReconciler = require('./ReactReconciler'); var ReactChildReconciler = require('./ReactChildReconciler'); var updateDepth = 0; var updateQueue = []; var markupQueue = []; function enqueueMarkup (parentID, markup, toIndex) { updateQueue.push({ parentID: parentID, parentNode: null, type: ReactMultiChildUpdateTypes.INSERT_MARKUP, markupIndex: markupQueue.push(markup) - 1, textContent: null, fromIndex: null, toIndex: toIndex }); } function enqueueMove (parentID, fromIndex, toIndex) { updateQueue.push({ parentID: parentID, parentNode: null, type: ReactMultiChildUpdateTypes.MOVE_EXISTING, markupIndex: null, textContent: null, fromIndex: fromIndex, toIndex: toIndex }); } function enqueueRemove (parentID, fromIndex) { updateQueue.push({ parentID: parentID, parentNode: null, type: ReactMultiChildUpdateTypes.REMOVE_NODE, markupIndex: null, textContent: null, fromIndex: fromIndex, toIndex: null }); } function enqueueTextContent (parentID, textContent) { updateQueue.push({ parentID: parentID, parentNode: null, type: ReactMultiChildUpdateTypes.TEXT_CONTENT, markupIndex: null, textContent: textContent, fromIndex: null, toIndex: null }); } function processQueue () { if (updateQueue.length) { ReactComponentEnvironment.processChildrenUpdates(updateQueue, markupQueue); clearQueue(); } } function clearQueue () { updateQueue.length = 0; markupQueue.length = 0; } var ReactMultiChild = { Mixin: { mountChildren: function (nestedChildren, transaction, context) { var children = ReactChildReconciler.instantiateChildren(nestedChildren, transaction, context); this._renderedChildren = children; var mountImages = []; var index = 0; for (var name in children) { if (children.hasOwnProperty(name)) { var child = children[name]; var rootID = this._rootNodeID + name; var mountImage = ReactReconciler.mountComponent(child, rootID, transaction, context); child._mountIndex = index; mountImages.push(mountImage); index++; } } return mountImages; }, updateTextContent: function (nextContent) { updateDepth++; var errorThrown = true; try { var prevChildren = this._renderedChildren; ReactChildReconciler.unmountChildren(prevChildren); for (var name in prevChildren) { if (prevChildren.hasOwnProperty(name)) { this._unmountChildByName(prevChildren[name], name); } } this.setTextContent(nextContent); errorThrown = false; } finally { updateDepth--; if (!updateDepth) { if (errorThrown) { clearQueue(); } else { processQueue(); } } } }, updateChildren: function (nextNestedChildren, transaction, context) { updateDepth++; var errorThrown = true; try { this._updateChildren(nextNestedChildren, transaction, context); errorThrown = false; } finally { updateDepth--; if (!updateDepth) { if (errorThrown) { clearQueue(); } else { processQueue(); } } } }, _updateChildren: function (nextNestedChildren, transaction, context) { var prevChildren = this._renderedChildren; var nextChildren = ReactChildReconciler.updateChildren(prevChildren, nextNestedChildren, transaction, context); this._renderedChildren = nextChildren; if (!nextChildren && !prevChildren) { return; } var name; var lastIndex = 0; var nextIndex = 0; for (name in nextChildren) { if (!nextChildren.hasOwnProperty(name)) { continue; } var prevChild = prevChildren && prevChildren[name]; var nextChild = nextChildren[name]; if (prevChild === nextChild) { this.moveChild(prevChild, nextIndex, lastIndex); lastIndex = Math.max(prevChild._mountIndex, lastIndex); prevChild._mountIndex = nextIndex; } else { if (prevChild) { lastIndex = Math.max(prevChild._mountIndex, lastIndex); this._unmountChildByName(prevChild, name); } this._mountChildByNameAtIndex(nextChild, name, nextIndex, transaction, context); }nextIndex++; } for (name in prevChildren) { if (prevChildren.hasOwnProperty(name) && !(nextChildren && nextChildren.hasOwnProperty(name))) { this._unmountChildByName(prevChildren[name], name); } } }, unmountChildren: function () { var renderedChildren = this._renderedChildren; ReactChildReconciler.unmountChildren(renderedChildren); this._renderedChildren = null; }, moveChild: function (child, toIndex, lastIndex) { if (child._mountIndex < lastIndex) { enqueueMove(this._rootNodeID, child._mountIndex, toIndex); } }, createChild: function (child, mountImage) { enqueueMarkup(this._rootNodeID, mountImage, child._mountIndex); }, removeChild: function (child) { enqueueRemove(this._rootNodeID, child._mountIndex); }, setTextContent: function (textContent) { enqueueTextContent(this._rootNodeID, textContent); }, _mountChildByNameAtIndex: function (child, name, index, transaction, context) { var rootID = this._rootNodeID + name; var mountImage = ReactReconciler.mountComponent(child, rootID, transaction, context); child._mountIndex = index; this.createChild(child, mountImage); }, _unmountChildByName: function (child, name) { this.removeChild(child); child._mountIndex = null; } } }; module.exports = ReactMultiChild; }, { './ReactChildReconciler': 39, './ReactComponentEnvironment': 44, './ReactMultiChildUpdateTypes': 80, './ReactReconciler': 89 }],\n  80: [function (require, module, exports) { 'use strict'; var keyMirror = require('./keyMirror'); var ReactMultiChildUpdateTypes = keyMirror({ INSERT_MARKUP: null, MOVE_EXISTING: null, REMOVE_NODE: null, TEXT_CONTENT: null }); module.exports = ReactMultiChildUpdateTypes; }, { './keyMirror': 148 }],\n  81: [function (require, module, exports) { 'use strict'; var assign = require('./Object.assign'); var invariant = require('./invariant'); var autoGenerateWrapperClass = null; var genericComponentClass = null; var tagToComponentClass = {}; var textComponentClass = null; var ReactNativeComponentInjection = { injectGenericComponentClass: function (componentClass) { genericComponentClass = componentClass; }, injectTextComponentClass: function (componentClass) { textComponentClass = componentClass; }, injectComponentClasses: function (componentClasses) { assign(tagToComponentClass, componentClasses); }, injectAutoWrapper: function (wrapperFactory) { autoGenerateWrapperClass = wrapperFactory; } }; function getComponentClassForElement (element) { if (typeof element.type === 'function') { return element.type; } var tag = element.type; var componentClass = tagToComponentClass[tag]; if (componentClass == null) { tagToComponentClass[tag] = componentClass = autoGenerateWrapperClass(tag); } return componentClass; } function createInternalComponent (element) { 'production' !== 'production' ? invariant(genericComponentClass, 'There is no registered component for the tag %s', element.type) : invariant(genericComponentClass); return new genericComponentClass(element.type, element.props); } function createInstanceForText (text) { return new textComponentClass(text); } function isTextComponent (component) { return component instanceof textComponentClass; } var ReactNativeComponent = { getComponentClassForElement: getComponentClassForElement, createInternalComponent: createInternalComponent, createInstanceForText: createInstanceForText, isTextComponent: isTextComponent, injection: ReactNativeComponentInjection }; module.exports = ReactNativeComponent; }, { './Object.assign': 34, './invariant': 143 }],\n  82: [function (require, module, exports) { 'use strict'; var invariant = require('./invariant'); var ReactOwner = { isValidOwner: function (object) { return !!(object && typeof object.attachRef === 'function' && typeof object.detachRef === 'function'); }, addComponentAsRefTo: function (component, ref, owner) { 'production' !== 'production' ? invariant(ReactOwner.isValidOwner(owner), 'addComponentAsRefTo(...): Only a ReactOwner can have refs. This ' + \"usually means that you're trying to add a ref to a component that \" + \"doesn't have an owner (that is, was not created inside of another \" + \"component's `render` method). Try rendering this component inside of \" + 'a new top-level component which will hold the ref.') : invariant(ReactOwner.isValidOwner(owner)); owner.attachRef(ref, component); }, removeComponentAsRefFrom: function (component, ref, owner) { 'production' !== 'production' ? invariant(ReactOwner.isValidOwner(owner), 'removeComponentAsRefFrom(...): Only a ReactOwner can have refs. This ' + \"usually means that you're trying to remove a ref to a component that \" + \"doesn't have an owner (that is, was not created inside of another \" + \"component's `render` method). Try rendering this component inside of \" + 'a new top-level component which will hold the ref.') : invariant(ReactOwner.isValidOwner(owner)); if (owner.getPublicInstance().refs[ref] === component.getPublicInstance()) { owner.detachRef(ref); } } }; module.exports = ReactOwner; }, { './invariant': 143 }],\n  83: [function (require, module, exports) { 'use strict'; var ReactPerf = { enableMeasure: false, storedMeasure: _noMeasure, measureMethods: function (object, objectName, methodNames) { if ('production' !== 'production') { for (var key in methodNames) { if (!methodNames.hasOwnProperty(key)) { continue; }object[key] = ReactPerf.measure(objectName, methodNames[key], object[key]); } } }, measure: function (objName, fnName, func) { if ('production' !== 'production') { var measuredFunc = null; var wrapper = function () { if (ReactPerf.enableMeasure) { if (!measuredFunc) { measuredFunc = ReactPerf.storedMeasure(objName, fnName, func); } return measuredFunc.apply(this, arguments); } return func.apply(this, arguments); }; wrapper.displayName = objName + '_' + fnName; return wrapper; } return func; }, injection: { injectMeasure: function (measure) { ReactPerf.storedMeasure = measure; } } }; function _noMeasure (objName, fnName, func) { return func; }module.exports = ReactPerf; }, {}],\n  84: [function (require, module, exports) { 'use strict'; var ReactPropTypeLocationNames = {}; if ('production' !== 'production') { ReactPropTypeLocationNames = { prop: 'prop', context: 'context', childContext: 'child context' }; }module.exports = ReactPropTypeLocationNames; }, {}],\n  85: [function (require, module, exports) { 'use strict'; var keyMirror = require('./keyMirror'); var ReactPropTypeLocations = keyMirror({ prop: null, context: null, childContext: null }); module.exports = ReactPropTypeLocations; }, { './keyMirror': 148 }],\n  86: [function (require, module, exports) { 'use strict'; var ReactElement = require('./ReactElement'); var ReactFragment = require('./ReactFragment'); var ReactPropTypeLocationNames = require('./ReactPropTypeLocationNames'); var emptyFunction = require('./emptyFunction'); var ANONYMOUS = '<<anonymous>>'; var elementTypeChecker = createElementTypeChecker(); var nodeTypeChecker = createNodeChecker(); var ReactPropTypes = { array: createPrimitiveTypeChecker('array'), bool: createPrimitiveTypeChecker('boolean'), func: createPrimitiveTypeChecker('function'), number: createPrimitiveTypeChecker('number'), object: createPrimitiveTypeChecker('object'), string: createPrimitiveTypeChecker('string'), any: createAnyTypeChecker(), arrayOf: createArrayOfTypeChecker, element: elementTypeChecker, instanceOf: createInstanceTypeChecker, node: nodeTypeChecker, objectOf: createObjectOfTypeChecker, oneOf: createEnumTypeChecker, oneOfType: createUnionTypeChecker, shape: createShapeTypeChecker }; function createChainableTypeChecker (validate) { function checkType (isRequired, props, propName, componentName, location) { componentName = componentName || ANONYMOUS; if (props[propName] == null) { var locationName = ReactPropTypeLocationNames[location]; if (isRequired) { return new Error('Required ' + locationName + ' `' + propName + '` was not specified in ' + ('`' + componentName + '`.')); } return null; } else { return validate(props, propName, componentName, location); } } var chainedCheckType = checkType.bind(null, false); chainedCheckType.isRequired = checkType.bind(null, true); return chainedCheckType; } function createPrimitiveTypeChecker (expectedType) { function validate (props, propName, componentName, location) { var propValue = props[propName]; var propType = getPropType(propValue); if (propType !== expectedType) { var locationName = ReactPropTypeLocationNames[location]; var preciseType = getPreciseType(propValue); return new Error('Invalid ' + locationName + ' `' + propName + '` of type `' + preciseType + '` ' + ('supplied to `' + componentName + '`, expected `' + expectedType + '`.')); } return null; } return createChainableTypeChecker(validate); } function createAnyTypeChecker () { return createChainableTypeChecker(emptyFunction.thatReturns(null)); } function createArrayOfTypeChecker (typeChecker) { function validate (props, propName, componentName, location) { var propValue = props[propName]; if (!Array.isArray(propValue)) { var locationName = ReactPropTypeLocationNames[location]; var propType = getPropType(propValue); return new Error('Invalid ' + locationName + ' `' + propName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an array.')); } for (var i = 0; i < propValue.length; i++) { var error = typeChecker(propValue, i, componentName, location); if (error instanceof Error) { return error; } } return null; } return createChainableTypeChecker(validate); } function createElementTypeChecker () { function validate (props, propName, componentName, location) { if (!ReactElement.isValidElement(props[propName])) { var locationName = ReactPropTypeLocationNames[location]; return new Error('Invalid ' + locationName + ' `' + propName + '` supplied to ' + ('`' + componentName + '`, expected a ReactElement.')); } return null; } return createChainableTypeChecker(validate); } function createInstanceTypeChecker (expectedClass) { function validate (props, propName, componentName, location) { if (!(props[propName] instanceof expectedClass)) { var locationName = ReactPropTypeLocationNames[location]; var expectedClassName = expectedClass.name || ANONYMOUS; return new Error('Invalid ' + locationName + ' `' + propName + '` supplied to ' + ('`' + componentName + '`, expected instance of `' + expectedClassName + '`.')); } return null; } return createChainableTypeChecker(validate); } function createEnumTypeChecker (expectedValues) { function validate (props, propName, componentName, location) { var propValue = props[propName]; for (var i = 0; i < expectedValues.length; i++) { if (propValue === expectedValues[i]) { return null; } } var locationName = ReactPropTypeLocationNames[location]; var valuesString = JSON.stringify(expectedValues); return new Error('Invalid ' + locationName + ' `' + propName + '` of value `' + propValue + '` ' + ('supplied to `' + componentName + '`, expected one of ' + valuesString + '.')); } return createChainableTypeChecker(validate); } function createObjectOfTypeChecker (typeChecker) { function validate (props, propName, componentName, location) { var propValue = props[propName]; var propType = getPropType(propValue); if (propType !== 'object') { var locationName = ReactPropTypeLocationNames[location]; return new Error('Invalid ' + locationName + ' `' + propName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an object.')); } for (var key in propValue) { if (propValue.hasOwnProperty(key)) { var error = typeChecker(propValue, key, componentName, location); if (error instanceof Error) { return error; } } } return null; } return createChainableTypeChecker(validate); } function createUnionTypeChecker (arrayOfTypeCheckers) { function validate (props, propName, componentName, location) { for (var i = 0; i < arrayOfTypeCheckers.length; i++) { var checker = arrayOfTypeCheckers[i]; if (checker(props, propName, componentName, location) == null) { return null; } } var locationName = ReactPropTypeLocationNames[location]; return new Error('Invalid ' + locationName + ' `' + propName + '` supplied to ' + ('`' + componentName + '`.')); } return createChainableTypeChecker(validate); } function createNodeChecker () { function validate (props, propName, componentName, location) { if (!isNode(props[propName])) { var locationName = ReactPropTypeLocationNames[location]; return new Error('Invalid ' + locationName + ' `' + propName + '` supplied to ' + ('`' + componentName + '`, expected a ReactNode.')); } return null; } return createChainableTypeChecker(validate); } function createShapeTypeChecker (shapeTypes) { function validate (props, propName, componentName, location) { var propValue = props[propName]; var propType = getPropType(propValue); if (propType !== 'object') { var locationName = ReactPropTypeLocationNames[location]; return new Error('Invalid ' + locationName + ' `' + propName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.')); } for (var key in shapeTypes) { var checker = shapeTypes[key]; if (!checker) { continue; } var error = checker(propValue, key, componentName, location); if (error) { return error; } } return null; } return createChainableTypeChecker(validate); } function isNode (propValue) { switch (typeof propValue) { case 'number':case 'string':case 'undefined':return true; case 'boolean':return !propValue; case 'object':if (Array.isArray(propValue)) { return propValue.every(isNode); } if (propValue === null || ReactElement.isValidElement(propValue)) { return true; }propValue = ReactFragment.extractIfFragment(propValue); for (var k in propValue) { if (!isNode(propValue[k])) { return false; } } return true; default:return false; } } function getPropType (propValue) { var propType = typeof propValue; if (Array.isArray(propValue)) { return 'array'; } if (propValue instanceof RegExp) { return 'object'; } return propType; } function getPreciseType (propValue) { var propType = getPropType(propValue); if (propType === 'object') { if (propValue instanceof Date) { return 'date'; } else if (propValue instanceof RegExp) { return 'regexp'; } } return propType; }module.exports = ReactPropTypes; }, { './ReactElement': 65, './ReactFragment': 71, './ReactPropTypeLocationNames': 84, './emptyFunction': 122 }],\n  87: [function (require, module, exports) { 'use strict'; var PooledClass = require('./PooledClass'); var ReactBrowserEventEmitter = require('./ReactBrowserEventEmitter'); var assign = require('./Object.assign'); function ReactPutListenerQueue () { this.listenersToPut = []; }assign(ReactPutListenerQueue.prototype, { enqueuePutListener: function (rootNodeID, propKey, propValue) { this.listenersToPut.push({ rootNodeID: rootNodeID, propKey: propKey, propValue: propValue }); }, putListeners: function () { for (var i = 0; i < this.listenersToPut.length; i++) { var listenerToPut = this.listenersToPut[i]; ReactBrowserEventEmitter.putListener(listenerToPut.rootNodeID, listenerToPut.propKey, listenerToPut.propValue); } }, reset: function () { this.listenersToPut.length = 0; }, destructor: function () { this.reset(); } }); PooledClass.addPoolingTo(ReactPutListenerQueue); module.exports = ReactPutListenerQueue; }, { './Object.assign': 34, './PooledClass': 35, './ReactBrowserEventEmitter': 38 }],\n  88: [function (require, module, exports) { 'use strict'; var CallbackQueue = require('./CallbackQueue'); var PooledClass = require('./PooledClass'); var ReactBrowserEventEmitter = require('./ReactBrowserEventEmitter'); var ReactInputSelection = require('./ReactInputSelection'); var ReactPutListenerQueue = require('./ReactPutListenerQueue'); var Transaction = require('./Transaction'); var assign = require('./Object.assign'); var SELECTION_RESTORATION = { initialize: ReactInputSelection.getSelectionInformation, close: ReactInputSelection.restoreSelection }; var EVENT_SUPPRESSION = { initialize: function () { var currentlyEnabled = ReactBrowserEventEmitter.isEnabled(); ReactBrowserEventEmitter.setEnabled(false); return currentlyEnabled; }, close: function (previouslyEnabled) { ReactBrowserEventEmitter.setEnabled(previouslyEnabled); } }; var ON_DOM_READY_QUEUEING = { initialize: function () { this.reactMountReady.reset(); }, close: function () { this.reactMountReady.notifyAll(); } }; var PUT_LISTENER_QUEUEING = { initialize: function () { this.putListenerQueue.reset(); }, close: function () { this.putListenerQueue.putListeners(); } }; var TRANSACTION_WRAPPERS = [PUT_LISTENER_QUEUEING, SELECTION_RESTORATION, EVENT_SUPPRESSION, ON_DOM_READY_QUEUEING]; function ReactReconcileTransaction () { this.reinitializeTransaction(); this.renderToStaticMarkup = false; this.reactMountReady = CallbackQueue.getPooled(null); this.putListenerQueue = ReactPutListenerQueue.getPooled(); } var Mixin = { getTransactionWrappers: function () { return TRANSACTION_WRAPPERS; }, getReactMountReady: function () { return this.reactMountReady; }, getPutListenerQueue: function () { return this.putListenerQueue; }, destructor: function () { CallbackQueue.release(this.reactMountReady); this.reactMountReady = null; ReactPutListenerQueue.release(this.putListenerQueue); this.putListenerQueue = null; } }; assign(ReactReconcileTransaction.prototype, Transaction.Mixin, Mixin); PooledClass.addPoolingTo(ReactReconcileTransaction); module.exports = ReactReconcileTransaction; }, { './CallbackQueue': 13, './Object.assign': 34, './PooledClass': 35, './ReactBrowserEventEmitter': 38, './ReactInputSelection': 73, './ReactPutListenerQueue': 87, './Transaction': 111 }],\n  89: [function (require, module, exports) { 'use strict'; var ReactRef = require('./ReactRef'); var ReactElementValidator = require('./ReactElementValidator'); function attachRefs () { ReactRef.attachRefs(this, this._currentElement); } var ReactReconciler = { mountComponent: function (internalInstance, rootID, transaction, context) { var markup = internalInstance.mountComponent(rootID, transaction, context); if ('production' !== 'production') { ReactElementValidator.checkAndWarnForMutatedProps(internalInstance._currentElement); }transaction.getReactMountReady().enqueue(attachRefs, internalInstance); return markup; }, unmountComponent: function (internalInstance) { ReactRef.detachRefs(internalInstance, internalInstance._currentElement); internalInstance.unmountComponent(); }, receiveComponent: function (internalInstance, nextElement, transaction, context) { var prevElement = internalInstance._currentElement; if (nextElement === prevElement && nextElement._owner != null) { return; } if ('production' !== 'production') { ReactElementValidator.checkAndWarnForMutatedProps(nextElement); } var refsChanged = ReactRef.shouldUpdateRefs(prevElement, nextElement); if (refsChanged) { ReactRef.detachRefs(internalInstance, prevElement); }internalInstance.receiveComponent(nextElement, transaction, context); if (refsChanged) { transaction.getReactMountReady().enqueue(attachRefs, internalInstance); } }, performUpdateIfNecessary: function (internalInstance, transaction) { internalInstance.performUpdateIfNecessary(transaction); } }; module.exports = ReactReconciler; }, { './ReactElementValidator': 66, './ReactRef': 90 }],\n  90: [function (require, module, exports) { 'use strict'; var ReactOwner = require('./ReactOwner'); var ReactRef = {}; function attachRef (ref, component, owner) { if (typeof ref === 'function') { ref(component.getPublicInstance()); } else { ReactOwner.addComponentAsRefTo(component, ref, owner); } } function detachRef (ref, component, owner) { if (typeof ref === 'function') { ref(null); } else { ReactOwner.removeComponentAsRefFrom(component, ref, owner); } }ReactRef.attachRefs = function (instance, element) { var ref = element.ref; if (ref != null) { attachRef(ref, instance, element._owner); } }; ReactRef.shouldUpdateRefs = function (prevElement, nextElement) { return nextElement._owner !== prevElement._owner || nextElement.ref !== prevElement.ref; }; ReactRef.detachRefs = function (instance, element) { var ref = element.ref; if (ref != null) { detachRef(ref, instance, element._owner); } }; module.exports = ReactRef; }, { './ReactOwner': 82 }],\n  91: [function (require, module, exports) { 'use strict'; var ReactRootIndexInjection = { injectCreateReactRootIndex: function (_createReactRootIndex) { ReactRootIndex.createReactRootIndex = _createReactRootIndex; } }; var ReactRootIndex = { createReactRootIndex: null, injection: ReactRootIndexInjection }; module.exports = ReactRootIndex; }, {}],\n  92: [function (require, module, exports) { 'use strict'; var ReactElement = require('./ReactElement'); var ReactInstanceHandles = require('./ReactInstanceHandles'); var ReactMarkupChecksum = require('./ReactMarkupChecksum'); var ReactServerRenderingTransaction = require('./ReactServerRenderingTransaction'); var emptyObject = require('./emptyObject'); var instantiateReactComponent = require('./instantiateReactComponent'); var invariant = require('./invariant'); function renderToString (element) { 'production' !== 'production' ? invariant(ReactElement.isValidElement(element), 'renderToString(): You must pass a valid ReactElement.') : invariant(ReactElement.isValidElement(element)); var transaction; try { var id = ReactInstanceHandles.createReactRootID(); transaction = ReactServerRenderingTransaction.getPooled(false); return transaction.perform(function () { var componentInstance = instantiateReactComponent(element, null); var markup = componentInstance.mountComponent(id, transaction, emptyObject); return ReactMarkupChecksum.addChecksumToMarkup(markup); }, null); } finally { ReactServerRenderingTransaction.release(transaction); } } function renderToStaticMarkup (element) { 'production' !== 'production' ? invariant(ReactElement.isValidElement(element), 'renderToStaticMarkup(): You must pass a valid ReactElement.') : invariant(ReactElement.isValidElement(element)); var transaction; try { var id = ReactInstanceHandles.createReactRootID(); transaction = ReactServerRenderingTransaction.getPooled(true); return transaction.perform(function () { var componentInstance = instantiateReactComponent(element, null); return componentInstance.mountComponent(id, transaction, emptyObject); }, null); } finally { ReactServerRenderingTransaction.release(transaction); } }module.exports = { renderToString: renderToString, renderToStaticMarkup: renderToStaticMarkup }; }, { './ReactElement': 65, './ReactInstanceHandles': 74, './ReactMarkupChecksum': 77, './ReactServerRenderingTransaction': 93, './emptyObject': 123, './instantiateReactComponent': 142, './invariant': 143 }],\n  93: [function (require, module, exports) {\n    'use strict'; var PooledClass = require('./PooledClass'); var CallbackQueue = require('./CallbackQueue'); var ReactPutListenerQueue = require('./ReactPutListenerQueue'); var Transaction = require('./Transaction'); var assign = require('./Object.assign'); var emptyFunction = require('./emptyFunction'); var ON_DOM_READY_QUEUEING = { initialize: function () { this.reactMountReady.reset(); }, close: emptyFunction }; var PUT_LISTENER_QUEUEING = { initialize: function () { this.putListenerQueue.reset(); }, close: emptyFunction }; var TRANSACTION_WRAPPERS = [PUT_LISTENER_QUEUEING, ON_DOM_READY_QUEUEING]; function ReactServerRenderingTransaction (renderToStaticMarkup) { this.reinitializeTransaction(); this.renderToStaticMarkup = renderToStaticMarkup; this.reactMountReady = CallbackQueue.getPooled(null); this.putListenerQueue = ReactPutListenerQueue.getPooled(); } var Mixin = { getTransactionWrappers: function () {\n      return TRANSACTION_WRAPPERS;\n    },\n    getReactMountReady: function () { return this.reactMountReady; },\n    getPutListenerQueue: function () { return this.putListenerQueue; },\n    destructor: function () { CallbackQueue.release(this.reactMountReady); this.reactMountReady = null; ReactPutListenerQueue.release(this.putListenerQueue); this.putListenerQueue = null; } }; assign(ReactServerRenderingTransaction.prototype, Transaction.Mixin, Mixin); PooledClass.addPoolingTo(ReactServerRenderingTransaction); module.exports = ReactServerRenderingTransaction;\n  }, { './CallbackQueue': 13, './Object.assign': 34, './PooledClass': 35, './ReactPutListenerQueue': 87, './Transaction': 111, './emptyFunction': 122 }],\n  94: [function (require, module, exports) { 'use strict'; var ReactLifeCycle = require('./ReactLifeCycle'); var ReactCurrentOwner = require('./ReactCurrentOwner'); var ReactElement = require('./ReactElement'); var ReactInstanceMap = require('./ReactInstanceMap'); var ReactUpdates = require('./ReactUpdates'); var assign = require('./Object.assign'); var invariant = require('./invariant'); var warning = require('./warning'); function enqueueUpdate (internalInstance) { if (internalInstance !== ReactLifeCycle.currentlyMountingInstance) { ReactUpdates.enqueueUpdate(internalInstance); } } function getInternalInstanceReadyForUpdate (publicInstance, callerName) { 'production' !== 'production' ? invariant(ReactCurrentOwner.current == null, '%s(...): Cannot update during an existing state transition ' + '(such as within `render`). Render methods should be a pure function ' + 'of props and state.', callerName) : invariant(ReactCurrentOwner.current == null); var internalInstance = ReactInstanceMap.get(publicInstance); if (!internalInstance) { if ('production' !== 'production') { 'production' !== 'production' ? warning(!callerName, '%s(...): Can only update a mounted or mounting component. ' + 'This usually means you called %s() on an unmounted ' + 'component. This is a no-op.', callerName, callerName) : null; } return null; } if (internalInstance === ReactLifeCycle.currentlyUnmountingInstance) { return null; } return internalInstance; } var ReactUpdateQueue = { enqueueCallback: function (publicInstance, callback) { 'production' !== 'production' ? invariant(typeof callback === 'function', 'enqueueCallback(...): You called `setProps`, `replaceProps`, ' + '`setState`, `replaceState`, or `forceUpdate` with a callback that ' + \"isn't callable.\") : invariant(typeof callback === 'function'); var internalInstance = getInternalInstanceReadyForUpdate(publicInstance); if (!internalInstance || internalInstance === ReactLifeCycle.currentlyMountingInstance) { return null; } if (internalInstance._pendingCallbacks) { internalInstance._pendingCallbacks.push(callback); } else { internalInstance._pendingCallbacks = [callback]; }enqueueUpdate(internalInstance); }, enqueueCallbackInternal: function (internalInstance, callback) { 'production' !== 'production' ? invariant(typeof callback === 'function', 'enqueueCallback(...): You called `setProps`, `replaceProps`, ' + '`setState`, `replaceState`, or `forceUpdate` with a callback that ' + \"isn't callable.\") : invariant(typeof callback === 'function'); if (internalInstance._pendingCallbacks) { internalInstance._pendingCallbacks.push(callback); } else { internalInstance._pendingCallbacks = [callback]; }enqueueUpdate(internalInstance); }, enqueueForceUpdate: function (publicInstance) { var internalInstance = getInternalInstanceReadyForUpdate(publicInstance, 'forceUpdate'); if (!internalInstance) { return; }internalInstance._pendingForceUpdate = true; enqueueUpdate(internalInstance); }, enqueueReplaceState: function (publicInstance, completeState) { var internalInstance = getInternalInstanceReadyForUpdate(publicInstance, 'replaceState'); if (!internalInstance) { return; }internalInstance._pendingStateQueue = [completeState]; internalInstance._pendingReplaceState = true; enqueueUpdate(internalInstance); }, enqueueSetState: function (publicInstance, partialState) { var internalInstance = getInternalInstanceReadyForUpdate(publicInstance, 'setState'); if (!internalInstance) { return; } var queue = internalInstance._pendingStateQueue || (internalInstance._pendingStateQueue = []); queue.push(partialState); enqueueUpdate(internalInstance); }, enqueueSetProps: function (publicInstance, partialProps) { var internalInstance = getInternalInstanceReadyForUpdate(publicInstance, 'setProps'); if (!internalInstance) { return; }'production' !== 'production' ? invariant(internalInstance._isTopLevel, 'setProps(...): You called `setProps` on a ' + 'component with a parent. This is an anti-pattern since props will ' + \"get reactively updated when rendered. Instead, change the owner's \" + '`render` method to pass the correct value as props to the component ' + 'where it is created.') : invariant(internalInstance._isTopLevel); var element = internalInstance._pendingElement || internalInstance._currentElement; var props = assign({}, element.props, partialProps); internalInstance._pendingElement = ReactElement.cloneAndReplaceProps(element, props); enqueueUpdate(internalInstance); }, enqueueReplaceProps: function (publicInstance, props) { var internalInstance = getInternalInstanceReadyForUpdate(publicInstance, 'replaceProps'); if (!internalInstance) { return; }'production' !== 'production' ? invariant(internalInstance._isTopLevel, 'replaceProps(...): You called `replaceProps` on a ' + 'component with a parent. This is an anti-pattern since props will ' + \"get reactively updated when rendered. Instead, change the owner's \" + '`render` method to pass the correct value as props to the component ' + 'where it is created.') : invariant(internalInstance._isTopLevel); var element = internalInstance._pendingElement || internalInstance._currentElement; internalInstance._pendingElement = ReactElement.cloneAndReplaceProps(element, props); enqueueUpdate(internalInstance); }, enqueueElementInternal: function (internalInstance, newElement) { internalInstance._pendingElement = newElement; enqueueUpdate(internalInstance); } }; module.exports = ReactUpdateQueue; }, { './Object.assign': 34, './ReactCurrentOwner': 47, './ReactElement': 65, './ReactInstanceMap': 75, './ReactLifeCycle': 76, './ReactUpdates': 95, './invariant': 143, './warning': 162 }],\n  95: [function (require, module, exports) { 'use strict'; var CallbackQueue = require('./CallbackQueue'); var PooledClass = require('./PooledClass'); var ReactCurrentOwner = require('./ReactCurrentOwner'); var ReactPerf = require('./ReactPerf'); var ReactReconciler = require('./ReactReconciler'); var Transaction = require('./Transaction'); var assign = require('./Object.assign'); var invariant = require('./invariant'); var warning = require('./warning'); var dirtyComponents = []; var asapCallbackQueue = CallbackQueue.getPooled(); var asapEnqueued = false; var batchingStrategy = null; function ensureInjected () { 'production' !== 'production' ? invariant(ReactUpdates.ReactReconcileTransaction && batchingStrategy, 'ReactUpdates: must inject a reconcile transaction class and batching ' + 'strategy') : invariant(ReactUpdates.ReactReconcileTransaction && batchingStrategy); } var NESTED_UPDATES = { initialize: function () { this.dirtyComponentsLength = dirtyComponents.length; }, close: function () { if (this.dirtyComponentsLength !== dirtyComponents.length) { dirtyComponents.splice(0, this.dirtyComponentsLength); flushBatchedUpdates(); } else { dirtyComponents.length = 0; } } }; var UPDATE_QUEUEING = { initialize: function () { this.callbackQueue.reset(); }, close: function () { this.callbackQueue.notifyAll(); } }; var TRANSACTION_WRAPPERS = [NESTED_UPDATES, UPDATE_QUEUEING]; function ReactUpdatesFlushTransaction () { this.reinitializeTransaction(); this.dirtyComponentsLength = null; this.callbackQueue = CallbackQueue.getPooled(); this.reconcileTransaction = ReactUpdates.ReactReconcileTransaction.getPooled(); }assign(ReactUpdatesFlushTransaction.prototype, Transaction.Mixin, { getTransactionWrappers: function () { return TRANSACTION_WRAPPERS; }, destructor: function () { this.dirtyComponentsLength = null; CallbackQueue.release(this.callbackQueue); this.callbackQueue = null; ReactUpdates.ReactReconcileTransaction.release(this.reconcileTransaction); this.reconcileTransaction = null; }, perform: function (method, scope, a) { return Transaction.Mixin.perform.call(this, this.reconcileTransaction.perform, this.reconcileTransaction, method, scope, a); } }); PooledClass.addPoolingTo(ReactUpdatesFlushTransaction); function batchedUpdates (callback, a, b, c, d) { ensureInjected(); batchingStrategy.batchedUpdates(callback, a, b, c, d); } function mountOrderComparator (c1, c2) { return c1._mountOrder - c2._mountOrder; } function runBatchedUpdates (transaction) { var len = transaction.dirtyComponentsLength; 'production' !== 'production' ? invariant(len === dirtyComponents.length, \"Expected flush transaction's stored dirty-components length (%s) to \" + 'match dirty-components array length (%s).', len, dirtyComponents.length) : invariant(len === dirtyComponents.length); dirtyComponents.sort(mountOrderComparator); for (var i = 0; i < len; i++) { var component = dirtyComponents[i]; var callbacks = component._pendingCallbacks; component._pendingCallbacks = null; ReactReconciler.performUpdateIfNecessary(component, transaction.reconcileTransaction); if (callbacks) { for (var j = 0; j < callbacks.length; j++) { transaction.callbackQueue.enqueue(callbacks[j], component.getPublicInstance()); } } } } var flushBatchedUpdates = function () { while (dirtyComponents.length || asapEnqueued) { if (dirtyComponents.length) { var transaction = ReactUpdatesFlushTransaction.getPooled(); transaction.perform(runBatchedUpdates, null, transaction); ReactUpdatesFlushTransaction.release(transaction); } if (asapEnqueued) { asapEnqueued = false; var queue = asapCallbackQueue; asapCallbackQueue = CallbackQueue.getPooled(); queue.notifyAll(); CallbackQueue.release(queue); } } }; flushBatchedUpdates = ReactPerf.measure('ReactUpdates', 'flushBatchedUpdates', flushBatchedUpdates); function enqueueUpdate (component) { ensureInjected(); 'production' !== 'production' ? warning(ReactCurrentOwner.current == null, 'enqueueUpdate(): Render methods should be a pure function of props ' + 'and state; triggering nested component updates from render is not ' + 'allowed. If necessary, trigger nested updates in ' + 'componentDidUpdate.') : null; if (!batchingStrategy.isBatchingUpdates) { batchingStrategy.batchedUpdates(enqueueUpdate, component); return; }dirtyComponents.push(component); } function asap (callback, context) { 'production' !== 'production' ? invariant(batchingStrategy.isBatchingUpdates, \"ReactUpdates.asap: Can't enqueue an asap callback in a context where\" + 'updates are not being batched.') : invariant(batchingStrategy.isBatchingUpdates); asapCallbackQueue.enqueue(callback, context); asapEnqueued = true; } var ReactUpdatesInjection = { injectReconcileTransaction: function (ReconcileTransaction) { 'production' !== 'production' ? invariant(ReconcileTransaction, 'ReactUpdates: must provide a reconcile transaction class') : invariant(ReconcileTransaction); ReactUpdates.ReactReconcileTransaction = ReconcileTransaction; }, injectBatchingStrategy: function (_batchingStrategy) { 'production' !== 'production' ? invariant(_batchingStrategy, 'ReactUpdates: must provide a batching strategy') : invariant(_batchingStrategy); 'production' !== 'production' ? invariant(typeof _batchingStrategy.batchedUpdates === 'function', 'ReactUpdates: must provide a batchedUpdates() function') : invariant(typeof _batchingStrategy.batchedUpdates === 'function'); 'production' !== 'production' ? invariant(typeof _batchingStrategy.isBatchingUpdates === 'boolean', 'ReactUpdates: must provide an isBatchingUpdates boolean attribute') : invariant(typeof _batchingStrategy.isBatchingUpdates === 'boolean'); batchingStrategy = _batchingStrategy; } }; var ReactUpdates = { ReactReconcileTransaction: null, batchedUpdates: batchedUpdates, enqueueUpdate: enqueueUpdate, flushBatchedUpdates: flushBatchedUpdates, injection: ReactUpdatesInjection, asap: asap }; module.exports = ReactUpdates; }, { './CallbackQueue': 13, './Object.assign': 34, './PooledClass': 35, './ReactCurrentOwner': 47, './ReactPerf': 83, './ReactReconciler': 89, './Transaction': 111, './invariant': 143, './warning': 162 }],\n  96: [function (require, module, exports) { 'use strict'; var DOMProperty = require('./DOMProperty'); var MUST_USE_ATTRIBUTE = DOMProperty.injection.MUST_USE_ATTRIBUTE; var SVGDOMPropertyConfig = { Properties: { clipPath: MUST_USE_ATTRIBUTE, cx: MUST_USE_ATTRIBUTE, cy: MUST_USE_ATTRIBUTE, d: MUST_USE_ATTRIBUTE, dx: MUST_USE_ATTRIBUTE, dy: MUST_USE_ATTRIBUTE, fill: MUST_USE_ATTRIBUTE, fillOpacity: MUST_USE_ATTRIBUTE, fontFamily: MUST_USE_ATTRIBUTE, fontSize: MUST_USE_ATTRIBUTE, fx: MUST_USE_ATTRIBUTE, fy: MUST_USE_ATTRIBUTE, gradientTransform: MUST_USE_ATTRIBUTE, gradientUnits: MUST_USE_ATTRIBUTE, markerEnd: MUST_USE_ATTRIBUTE, markerMid: MUST_USE_ATTRIBUTE, markerStart: MUST_USE_ATTRIBUTE, offset: MUST_USE_ATTRIBUTE, opacity: MUST_USE_ATTRIBUTE, patternContentUnits: MUST_USE_ATTRIBUTE, patternUnits: MUST_USE_ATTRIBUTE, points: MUST_USE_ATTRIBUTE, preserveAspectRatio: MUST_USE_ATTRIBUTE, r: MUST_USE_ATTRIBUTE, rx: MUST_USE_ATTRIBUTE, ry: MUST_USE_ATTRIBUTE, spreadMethod: MUST_USE_ATTRIBUTE, stopColor: MUST_USE_ATTRIBUTE, stopOpacity: MUST_USE_ATTRIBUTE, stroke: MUST_USE_ATTRIBUTE, strokeDasharray: MUST_USE_ATTRIBUTE, strokeLinecap: MUST_USE_ATTRIBUTE, strokeOpacity: MUST_USE_ATTRIBUTE, strokeWidth: MUST_USE_ATTRIBUTE, textAnchor: MUST_USE_ATTRIBUTE, transform: MUST_USE_ATTRIBUTE, version: MUST_USE_ATTRIBUTE, viewBox: MUST_USE_ATTRIBUTE, x1: MUST_USE_ATTRIBUTE, x2: MUST_USE_ATTRIBUTE, x: MUST_USE_ATTRIBUTE, y1: MUST_USE_ATTRIBUTE, y2: MUST_USE_ATTRIBUTE, y: MUST_USE_ATTRIBUTE }, DOMAttributeNames: { clipPath: 'clip-path', fillOpacity: 'fill-opacity', fontFamily: 'font-family', fontSize: 'font-size', gradientTransform: 'gradientTransform', gradientUnits: 'gradientUnits', markerEnd: 'marker-end', markerMid: 'marker-mid', markerStart: 'marker-start', patternContentUnits: 'patternContentUnits', patternUnits: 'patternUnits', preserveAspectRatio: 'preserveAspectRatio', spreadMethod: 'spreadMethod', stopColor: 'stop-color', stopOpacity: 'stop-opacity', strokeDasharray: 'stroke-dasharray', strokeLinecap: 'stroke-linecap', strokeOpacity: 'stroke-opacity', strokeWidth: 'stroke-width', textAnchor: 'text-anchor', viewBox: 'viewBox' } }; module.exports = SVGDOMPropertyConfig; }, { './DOMProperty': 17 }],\n  97: [function (require, module, exports) { 'use strict'; var EventConstants = require('./EventConstants'); var EventPropagators = require('./EventPropagators'); var ReactInputSelection = require('./ReactInputSelection'); var SyntheticEvent = require('./SyntheticEvent'); var getActiveElement = require('./getActiveElement'); var isTextInputElement = require('./isTextInputElement'); var keyOf = require('./keyOf'); var shallowEqual = require('./shallowEqual'); var topLevelTypes = EventConstants.topLevelTypes; var eventTypes = { select: { phasedRegistrationNames: { bubbled: keyOf({ onSelect: null }), captured: keyOf({ onSelectCapture: null }) }, dependencies: [topLevelTypes.topBlur, topLevelTypes.topContextMenu, topLevelTypes.topFocus, topLevelTypes.topKeyDown, topLevelTypes.topMouseDown, topLevelTypes.topMouseUp, topLevelTypes.topSelectionChange] } }; var activeElement = null; var activeElementID = null; var lastSelection = null; var mouseDown = false; function getSelection (node) { if ('selectionStart' in node && ReactInputSelection.hasSelectionCapabilities(node)) { return { start: node.selectionStart, end: node.selectionEnd }; } else if (window.getSelection) { var selection = window.getSelection(); return { anchorNode: selection.anchorNode, anchorOffset: selection.anchorOffset, focusNode: selection.focusNode, focusOffset: selection.focusOffset }; } else if (document.selection) { var range = document.selection.createRange(); return { parentElement: range.parentElement(), text: range.text, top: range.boundingTop, left: range.boundingLeft }; } } function constructSelectEvent (nativeEvent) { if (mouseDown || activeElement == null || activeElement !== getActiveElement()) { return null; } var currentSelection = getSelection(activeElement); if (!lastSelection || !shallowEqual(lastSelection, currentSelection)) { lastSelection = currentSelection; var syntheticEvent = SyntheticEvent.getPooled(eventTypes.select, activeElementID, nativeEvent); syntheticEvent.type = 'select'; syntheticEvent.target = activeElement; EventPropagators.accumulateTwoPhaseDispatches(syntheticEvent); return syntheticEvent; } } var SelectEventPlugin = { eventTypes: eventTypes, extractEvents: function (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent) { switch (topLevelType) { case topLevelTypes.topFocus:if (isTextInputElement(topLevelTarget) || topLevelTarget.contentEditable === 'true') { activeElement = topLevelTarget; activeElementID = topLevelTargetID; lastSelection = null; } break; case topLevelTypes.topBlur:activeElement = null; activeElementID = null; lastSelection = null; break; case topLevelTypes.topMouseDown:mouseDown = true; break; case topLevelTypes.topContextMenu:case topLevelTypes.topMouseUp:mouseDown = false; return constructSelectEvent(nativeEvent); case topLevelTypes.topSelectionChange:case topLevelTypes.topKeyDown:case topLevelTypes.topKeyUp:return constructSelectEvent(nativeEvent); } } }; module.exports = SelectEventPlugin; }, { './EventConstants': 22, './EventPropagators': 27, './ReactInputSelection': 73, './SyntheticEvent': 103, './getActiveElement': 129, './isTextInputElement': 146, './keyOf': 149, './shallowEqual': 158 }],\n  98: [function (require, module, exports) { 'use strict'; var GLOBAL_MOUNT_POINT_MAX = Math.pow(2, 53); var ServerReactRootIndex = { createReactRootIndex: function () { return Math.ceil(Math.random() * GLOBAL_MOUNT_POINT_MAX); } }; module.exports = ServerReactRootIndex; }, {}],\n  99: [function (require, module, exports) { 'use strict'; var EventConstants = require('./EventConstants'); var EventPluginUtils = require('./EventPluginUtils'); var EventPropagators = require('./EventPropagators'); var SyntheticClipboardEvent = require('./SyntheticClipboardEvent'); var SyntheticEvent = require('./SyntheticEvent'); var SyntheticFocusEvent = require('./SyntheticFocusEvent'); var SyntheticKeyboardEvent = require('./SyntheticKeyboardEvent'); var SyntheticMouseEvent = require('./SyntheticMouseEvent'); var SyntheticDragEvent = require('./SyntheticDragEvent'); var SyntheticTouchEvent = require('./SyntheticTouchEvent'); var SyntheticUIEvent = require('./SyntheticUIEvent'); var SyntheticWheelEvent = require('./SyntheticWheelEvent'); var getEventCharCode = require('./getEventCharCode'); var invariant = require('./invariant'); var keyOf = require('./keyOf'); var warning = require('./warning'); var topLevelTypes = EventConstants.topLevelTypes; var eventTypes = { blur: { phasedRegistrationNames: { bubbled: keyOf({ onBlur: true }), captured: keyOf({ onBlurCapture: true }) } }, click: { phasedRegistrationNames: { bubbled: keyOf({ onClick: true }), captured: keyOf({ onClickCapture: true }) } }, contextMenu: { phasedRegistrationNames: { bubbled: keyOf({ onContextMenu: true }), captured: keyOf({ onContextMenuCapture: true }) } }, copy: { phasedRegistrationNames: { bubbled: keyOf({ onCopy: true }), captured: keyOf({ onCopyCapture: true }) } }, cut: { phasedRegistrationNames: { bubbled: keyOf({ onCut: true }), captured: keyOf({ onCutCapture: true }) } }, doubleClick: { phasedRegistrationNames: { bubbled: keyOf({ onDoubleClick: true }), captured: keyOf({ onDoubleClickCapture: true }) } }, drag: { phasedRegistrationNames: { bubbled: keyOf({ onDrag: true }), captured: keyOf({ onDragCapture: true }) } }, dragEnd: { phasedRegistrationNames: { bubbled: keyOf({ onDragEnd: true }), captured: keyOf({ onDragEndCapture: true }) } }, dragEnter: { phasedRegistrationNames: { bubbled: keyOf({ onDragEnter: true }), captured: keyOf({ onDragEnterCapture: true }) } }, dragExit: { phasedRegistrationNames: { bubbled: keyOf({ onDragExit: true }), captured: keyOf({ onDragExitCapture: true }) } }, dragLeave: { phasedRegistrationNames: { bubbled: keyOf({ onDragLeave: true }), captured: keyOf({ onDragLeaveCapture: true }) } }, dragOver: { phasedRegistrationNames: { bubbled: keyOf({ onDragOver: true }), captured: keyOf({ onDragOverCapture: true }) } }, dragStart: { phasedRegistrationNames: { bubbled: keyOf({ onDragStart: true }), captured: keyOf({ onDragStartCapture: true }) } }, drop: { phasedRegistrationNames: { bubbled: keyOf({ onDrop: true }), captured: keyOf({ onDropCapture: true }) } }, focus: { phasedRegistrationNames: { bubbled: keyOf({ onFocus: true }), captured: keyOf({ onFocusCapture: true }) } }, input: { phasedRegistrationNames: { bubbled: keyOf({ onInput: true }), captured: keyOf({ onInputCapture: true }) } }, keyDown: { phasedRegistrationNames: { bubbled: keyOf({ onKeyDown: true }), captured: keyOf({ onKeyDownCapture: true }) } }, keyPress: { phasedRegistrationNames: { bubbled: keyOf({ onKeyPress: true }), captured: keyOf({ onKeyPressCapture: true }) } }, keyUp: { phasedRegistrationNames: { bubbled: keyOf({ onKeyUp: true }), captured: keyOf({ onKeyUpCapture: true }) } }, load: { phasedRegistrationNames: { bubbled: keyOf({ onLoad: true }), captured: keyOf({ onLoadCapture: true }) } }, error: { phasedRegistrationNames: { bubbled: keyOf({ onError: true }), captured: keyOf({ onErrorCapture: true }) } }, mouseDown: { phasedRegistrationNames: { bubbled: keyOf({ onMouseDown: true }), captured: keyOf({ onMouseDownCapture: true }) } }, mouseMove: { phasedRegistrationNames: { bubbled: keyOf({ onMouseMove: true }), captured: keyOf({ onMouseMoveCapture: true }) } }, mouseOut: { phasedRegistrationNames: { bubbled: keyOf({ onMouseOut: true }), captured: keyOf({ onMouseOutCapture: true }) } }, mouseOver: { phasedRegistrationNames: { bubbled: keyOf({ onMouseOver: true }), captured: keyOf({ onMouseOverCapture: true }) } }, mouseUp: { phasedRegistrationNames: { bubbled: keyOf({ onMouseUp: true }), captured: keyOf({ onMouseUpCapture: true }) } }, paste: { phasedRegistrationNames: { bubbled: keyOf({ onPaste: true }), captured: keyOf({ onPasteCapture: true }) } }, reset: { phasedRegistrationNames: { bubbled: keyOf({ onReset: true }), captured: keyOf({ onResetCapture: true }) } }, scroll: { phasedRegistrationNames: { bubbled: keyOf({ onScroll: true }), captured: keyOf({ onScrollCapture: true }) } }, submit: { phasedRegistrationNames: { bubbled: keyOf({ onSubmit: true }), captured: keyOf({ onSubmitCapture: true }) } }, touchCancel: { phasedRegistrationNames: { bubbled: keyOf({ onTouchCancel: true }), captured: keyOf({ onTouchCancelCapture: true }) } }, touchEnd: { phasedRegistrationNames: { bubbled: keyOf({ onTouchEnd: true }), captured: keyOf({ onTouchEndCapture: true }) } }, touchMove: { phasedRegistrationNames: { bubbled: keyOf({ onTouchMove: true }), captured: keyOf({ onTouchMoveCapture: true }) } }, touchStart: { phasedRegistrationNames: { bubbled: keyOf({ onTouchStart: true }), captured: keyOf({ onTouchStartCapture: true }) } }, wheel: { phasedRegistrationNames: { bubbled: keyOf({ onWheel: true }), captured: keyOf({ onWheelCapture: true }) } } }; var topLevelEventsToDispatchConfig = { topBlur: eventTypes.blur, topClick: eventTypes.click, topContextMenu: eventTypes.contextMenu, topCopy: eventTypes.copy, topCut: eventTypes.cut, topDoubleClick: eventTypes.doubleClick, topDrag: eventTypes.drag, topDragEnd: eventTypes.dragEnd, topDragEnter: eventTypes.dragEnter, topDragExit: eventTypes.dragExit, topDragLeave: eventTypes.dragLeave, topDragOver: eventTypes.dragOver, topDragStart: eventTypes.dragStart, topDrop: eventTypes.drop, topError: eventTypes.error, topFocus: eventTypes.focus, topInput: eventTypes.input, topKeyDown: eventTypes.keyDown, topKeyPress: eventTypes.keyPress, topKeyUp: eventTypes.keyUp, topLoad: eventTypes.load, topMouseDown: eventTypes.mouseDown, topMouseMove: eventTypes.mouseMove, topMouseOut: eventTypes.mouseOut, topMouseOver: eventTypes.mouseOver, topMouseUp: eventTypes.mouseUp, topPaste: eventTypes.paste, topReset: eventTypes.reset, topScroll: eventTypes.scroll, topSubmit: eventTypes.submit, topTouchCancel: eventTypes.touchCancel, topTouchEnd: eventTypes.touchEnd, topTouchMove: eventTypes.touchMove, topTouchStart: eventTypes.touchStart, topWheel: eventTypes.wheel }; for (var type in topLevelEventsToDispatchConfig) { topLevelEventsToDispatchConfig[type].dependencies = [type]; } var SimpleEventPlugin = { eventTypes: eventTypes, executeDispatch: function (event, listener, domID) { var returnValue = EventPluginUtils.executeDispatch(event, listener, domID); 'production' !== 'production' ? warning(typeof returnValue !== 'boolean', 'Returning `false` from an event handler is deprecated and will be ' + 'ignored in a future release. Instead, manually call ' + 'e.stopPropagation() or e.preventDefault(), as appropriate.') : null; if (returnValue === false) { event.stopPropagation(); event.preventDefault(); } }, extractEvents: function (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent) { var dispatchConfig = topLevelEventsToDispatchConfig[topLevelType]; if (!dispatchConfig) { return null; } var EventConstructor; switch (topLevelType) { case topLevelTypes.topInput:case topLevelTypes.topLoad:case topLevelTypes.topError:case topLevelTypes.topReset:case topLevelTypes.topSubmit:EventConstructor = SyntheticEvent; break; case topLevelTypes.topKeyPress:if (getEventCharCode(nativeEvent) === 0) { return null; } case topLevelTypes.topKeyDown:case topLevelTypes.topKeyUp:EventConstructor = SyntheticKeyboardEvent; break; case topLevelTypes.topBlur:case topLevelTypes.topFocus:EventConstructor = SyntheticFocusEvent; break; case topLevelTypes.topClick:if (nativeEvent.button === 2) { return null; } case topLevelTypes.topContextMenu:case topLevelTypes.topDoubleClick:case topLevelTypes.topMouseDown:case topLevelTypes.topMouseMove:case topLevelTypes.topMouseOut:case topLevelTypes.topMouseOver:case topLevelTypes.topMouseUp:EventConstructor = SyntheticMouseEvent; break; case topLevelTypes.topDrag:case topLevelTypes.topDragEnd:case topLevelTypes.topDragEnter:case topLevelTypes.topDragExit:case topLevelTypes.topDragLeave:case topLevelTypes.topDragOver:case topLevelTypes.topDragStart:case topLevelTypes.topDrop:EventConstructor = SyntheticDragEvent; break; case topLevelTypes.topTouchCancel:case topLevelTypes.topTouchEnd:case topLevelTypes.topTouchMove:case topLevelTypes.topTouchStart:EventConstructor = SyntheticTouchEvent; break; case topLevelTypes.topScroll:EventConstructor = SyntheticUIEvent; break; case topLevelTypes.topWheel:EventConstructor = SyntheticWheelEvent; break; case topLevelTypes.topCopy:case topLevelTypes.topCut:case topLevelTypes.topPaste:EventConstructor = SyntheticClipboardEvent; break; }'production' !== 'production' ? invariant(EventConstructor, 'SimpleEventPlugin: Unhandled event type, `%s`.', topLevelType) : invariant(EventConstructor); var event = EventConstructor.getPooled(dispatchConfig, topLevelTargetID, nativeEvent); EventPropagators.accumulateTwoPhaseDispatches(event); return event; } }; module.exports = SimpleEventPlugin; }, { './EventConstants': 22, './EventPluginUtils': 26, './EventPropagators': 27, './SyntheticClipboardEvent': 100, './SyntheticDragEvent': 102, './SyntheticEvent': 103, './SyntheticFocusEvent': 104, './SyntheticKeyboardEvent': 106, './SyntheticMouseEvent': 107, './SyntheticTouchEvent': 108, './SyntheticUIEvent': 109, './SyntheticWheelEvent': 110, './getEventCharCode': 130, './invariant': 143, './keyOf': 149, './warning': 162 }],\n  100: [function (require, module, exports) { 'use strict'; var SyntheticEvent = require('./SyntheticEvent'); var ClipboardEventInterface = { clipboardData: function (event) { return 'clipboardData' in event ? event.clipboardData : window.clipboardData; } }; function SyntheticClipboardEvent (dispatchConfig, dispatchMarker, nativeEvent) { SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent); }SyntheticEvent.augmentClass(SyntheticClipboardEvent, ClipboardEventInterface); module.exports = SyntheticClipboardEvent; }, { './SyntheticEvent': 103 }],\n  101: [function (require, module, exports) { 'use strict'; var SyntheticEvent = require('./SyntheticEvent'); var CompositionEventInterface = { data: null }; function SyntheticCompositionEvent (dispatchConfig, dispatchMarker, nativeEvent) { SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent); }SyntheticEvent.augmentClass(SyntheticCompositionEvent, CompositionEventInterface); module.exports = SyntheticCompositionEvent; }, { './SyntheticEvent': 103 }],\n  102: [function (require, module, exports) { 'use strict'; var SyntheticMouseEvent = require('./SyntheticMouseEvent'); var DragEventInterface = { dataTransfer: null }; function SyntheticDragEvent (dispatchConfig, dispatchMarker, nativeEvent) { SyntheticMouseEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent); }SyntheticMouseEvent.augmentClass(SyntheticDragEvent, DragEventInterface); module.exports = SyntheticDragEvent; }, { './SyntheticMouseEvent': 107 }],\n  103: [function (require, module, exports) { 'use strict'; var PooledClass = require('./PooledClass'); var assign = require('./Object.assign'); var emptyFunction = require('./emptyFunction'); var getEventTarget = require('./getEventTarget'); var EventInterface = { type: null, target: getEventTarget, currentTarget: emptyFunction.thatReturnsNull, eventPhase: null, bubbles: null, cancelable: null, timeStamp: function (event) { return event.timeStamp || Date.now(); }, defaultPrevented: null, isTrusted: null }; function SyntheticEvent (dispatchConfig, dispatchMarker, nativeEvent) { this.dispatchConfig = dispatchConfig; this.dispatchMarker = dispatchMarker; this.nativeEvent = nativeEvent; var Interface = this.constructor.Interface; for (var propName in Interface) { if (!Interface.hasOwnProperty(propName)) { continue; } var normalize = Interface[propName]; if (normalize) { this[propName] = normalize(nativeEvent); } else { this[propName] = nativeEvent[propName]; } } var defaultPrevented = nativeEvent.defaultPrevented != null ? nativeEvent.defaultPrevented : nativeEvent.returnValue === false; if (defaultPrevented) { this.isDefaultPrevented = emptyFunction.thatReturnsTrue; } else { this.isDefaultPrevented = emptyFunction.thatReturnsFalse; } this.isPropagationStopped = emptyFunction.thatReturnsFalse; }assign(SyntheticEvent.prototype, { preventDefault: function () { this.defaultPrevented = true; var event = this.nativeEvent; if (event.preventDefault) { event.preventDefault(); } else { event.returnValue = false; } this.isDefaultPrevented = emptyFunction.thatReturnsTrue; }, stopPropagation: function () { var event = this.nativeEvent; if (event.stopPropagation) { event.stopPropagation(); } else { event.cancelBubble = true; } this.isPropagationStopped = emptyFunction.thatReturnsTrue; }, persist: function () { this.isPersistent = emptyFunction.thatReturnsTrue; }, isPersistent: emptyFunction.thatReturnsFalse, destructor: function () { var Interface = this.constructor.Interface; for (var propName in Interface) { this[propName] = null; } this.dispatchConfig = null; this.dispatchMarker = null; this.nativeEvent = null; } }); SyntheticEvent.Interface = EventInterface; SyntheticEvent.augmentClass = function (Class, Interface) { var Super = this; var prototype = Object.create(Super.prototype); assign(prototype, Class.prototype); Class.prototype = prototype; Class.prototype.constructor = Class; Class.Interface = assign({}, Super.Interface, Interface); Class.augmentClass = Super.augmentClass; PooledClass.addPoolingTo(Class, PooledClass.threeArgumentPooler); }; PooledClass.addPoolingTo(SyntheticEvent, PooledClass.threeArgumentPooler); module.exports = SyntheticEvent; }, { './Object.assign': 34, './PooledClass': 35, './emptyFunction': 122, './getEventTarget': 133 }],\n  104: [function (require, module, exports) { 'use strict'; var SyntheticUIEvent = require('./SyntheticUIEvent'); var FocusEventInterface = { relatedTarget: null }; function SyntheticFocusEvent (dispatchConfig, dispatchMarker, nativeEvent) { SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent); }SyntheticUIEvent.augmentClass(SyntheticFocusEvent, FocusEventInterface); module.exports = SyntheticFocusEvent; }, { './SyntheticUIEvent': 109 }],\n  105: [function (require, module, exports) { 'use strict'; var SyntheticEvent = require('./SyntheticEvent'); var InputEventInterface = { data: null }; function SyntheticInputEvent (dispatchConfig, dispatchMarker, nativeEvent) { SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent); }SyntheticEvent.augmentClass(SyntheticInputEvent, InputEventInterface); module.exports = SyntheticInputEvent; }, { './SyntheticEvent': 103 }],\n  106: [function (require, module, exports) { 'use strict'; var SyntheticUIEvent = require('./SyntheticUIEvent'); var getEventCharCode = require('./getEventCharCode'); var getEventKey = require('./getEventKey'); var getEventModifierState = require('./getEventModifierState'); var KeyboardEventInterface = { key: getEventKey, location: null, ctrlKey: null, shiftKey: null, altKey: null, metaKey: null, repeat: null, locale: null, getModifierState: getEventModifierState, charCode: function (event) { if (event.type === 'keypress') { return getEventCharCode(event); } return 0; }, keyCode: function (event) { if (event.type === 'keydown' || event.type === 'keyup') { return event.keyCode; } return 0; }, which: function (event) { if (event.type === 'keypress') { return getEventCharCode(event); } if (event.type === 'keydown' || event.type === 'keyup') { return event.keyCode; } return 0; } }; function SyntheticKeyboardEvent (dispatchConfig, dispatchMarker, nativeEvent) { SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent); }SyntheticUIEvent.augmentClass(SyntheticKeyboardEvent, KeyboardEventInterface); module.exports = SyntheticKeyboardEvent; }, { './SyntheticUIEvent': 109, './getEventCharCode': 130, './getEventKey': 131, './getEventModifierState': 132 }],\n  107: [function (require, module, exports) {\n    'use strict'; var SyntheticUIEvent = require('./SyntheticUIEvent'); var ViewportMetrics = require('./ViewportMetrics'); var getEventModifierState = require('./getEventModifierState'); var MouseEventInterface = { screenX: null,\n      screenY: null,\n      clientX: null,\n      clientY: null,\n      ctrlKey: null,\n      shiftKey: null,\n      altKey: null,\n      metaKey: null,\n      getModifierState: getEventModifierState,\n      button: function (event) { var button = event.button; if ('which' in event) { return button; } return button === 2 ? 2 : button === 4 ? 1 : 0; },\n      buttons: null,\n      relatedTarget: function (event) {\n        return event.relatedTarget || (event.fromElement === event.srcElement ? event.toElement : event.fromElement);\n      },\n      pageX: function (event) { return 'pageX' in event ? event.pageX : event.clientX + ViewportMetrics.currentScrollLeft; },\n      pageY: function (event) { return 'pageY' in event ? event.pageY : event.clientY + ViewportMetrics.currentScrollTop; } }; function SyntheticMouseEvent (dispatchConfig, dispatchMarker, nativeEvent) { SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent); }SyntheticUIEvent.augmentClass(SyntheticMouseEvent, MouseEventInterface); module.exports = SyntheticMouseEvent;\n  }, { './SyntheticUIEvent': 109, './ViewportMetrics': 112, './getEventModifierState': 132 }],\n  108: [function (require, module, exports) { 'use strict'; var SyntheticUIEvent = require('./SyntheticUIEvent'); var getEventModifierState = require('./getEventModifierState'); var TouchEventInterface = { touches: null, targetTouches: null, changedTouches: null, altKey: null, metaKey: null, ctrlKey: null, shiftKey: null, getModifierState: getEventModifierState }; function SyntheticTouchEvent (dispatchConfig, dispatchMarker, nativeEvent) { SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent); }SyntheticUIEvent.augmentClass(SyntheticTouchEvent, TouchEventInterface); module.exports = SyntheticTouchEvent; }, { './SyntheticUIEvent': 109, './getEventModifierState': 132 }],\n  109: [function (require, module, exports) { 'use strict'; var SyntheticEvent = require('./SyntheticEvent'); var getEventTarget = require('./getEventTarget'); var UIEventInterface = { view: function (event) { if (event.view) { return event.view; } var target = getEventTarget(event); if (target != null && target.window === target) { return target; } var doc = target.ownerDocument; if (doc) { return doc.defaultView || doc.parentWindow; } else { return window; } }, detail: function (event) { return event.detail || 0; } }; function SyntheticUIEvent (dispatchConfig, dispatchMarker, nativeEvent) { SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent); }SyntheticEvent.augmentClass(SyntheticUIEvent, UIEventInterface); module.exports = SyntheticUIEvent; }, { './SyntheticEvent': 103, './getEventTarget': 133 }],\n  110: [function (require, module, exports) { 'use strict'; var SyntheticMouseEvent = require('./SyntheticMouseEvent'); var WheelEventInterface = { deltaX: function (event) { return 'deltaX' in event ? event.deltaX : 'wheelDeltaX' in event ? -event.wheelDeltaX : 0; }, deltaY: function (event) { return 'deltaY' in event ? event.deltaY : 'wheelDeltaY' in event ? -event.wheelDeltaY : 'wheelDelta' in event ? -event.wheelDelta : 0; }, deltaZ: null, deltaMode: null }; function SyntheticWheelEvent (dispatchConfig, dispatchMarker, nativeEvent) { SyntheticMouseEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent); }SyntheticMouseEvent.augmentClass(SyntheticWheelEvent, WheelEventInterface); module.exports = SyntheticWheelEvent; }, { './SyntheticMouseEvent': 107 }],\n  111: [function (require, module, exports) { 'use strict'; var invariant = require('./invariant'); var Mixin = { reinitializeTransaction: function () { this.transactionWrappers = this.getTransactionWrappers(); if (!this.wrapperInitData) { this.wrapperInitData = []; } else { this.wrapperInitData.length = 0; } this._isInTransaction = false; }, _isInTransaction: false, getTransactionWrappers: null, isInTransaction: function () { return !!this._isInTransaction; }, perform: function (method, scope, a, b, c, d, e, f) { 'production' !== 'production' ? invariant(!this.isInTransaction(), 'Transaction.perform(...): Cannot initialize a transaction when there ' + 'is already an outstanding transaction.') : invariant(!this.isInTransaction()); var errorThrown; var ret; try { this._isInTransaction = true; errorThrown = true; this.initializeAll(0); ret = method.call(scope, a, b, c, d, e, f); errorThrown = false; } finally { try { if (errorThrown) { try { this.closeAll(0); } catch (err) {} } else { this.closeAll(0); } } finally { this._isInTransaction = false; } } return ret; }, initializeAll: function (startIndex) { var transactionWrappers = this.transactionWrappers; for (var i = startIndex; i < transactionWrappers.length; i++) { var wrapper = transactionWrappers[i]; try { this.wrapperInitData[i] = Transaction.OBSERVED_ERROR; this.wrapperInitData[i] = wrapper.initialize ? wrapper.initialize.call(this) : null; } finally { if (this.wrapperInitData[i] === Transaction.OBSERVED_ERROR) { try { this.initializeAll(i + 1); } catch (err) {} } } } }, closeAll: function (startIndex) { 'production' !== 'production' ? invariant(this.isInTransaction(), 'Transaction.closeAll(): Cannot close transaction when none are open.') : invariant(this.isInTransaction()); var transactionWrappers = this.transactionWrappers; for (var i = startIndex; i < transactionWrappers.length; i++) { var wrapper = transactionWrappers[i]; var initData = this.wrapperInitData[i]; var errorThrown; try { errorThrown = true; if (initData !== Transaction.OBSERVED_ERROR && wrapper.close) { wrapper.close.call(this, initData); }errorThrown = false; } finally { if (errorThrown) { try { this.closeAll(i + 1); } catch (e) {} } } } this.wrapperInitData.length = 0; } }; var Transaction = { Mixin: Mixin, OBSERVED_ERROR: {} }; module.exports = Transaction; }, { './invariant': 143 }],\n  112: [function (require, module, exports) { 'use strict'; var ViewportMetrics = { currentScrollLeft: 0, currentScrollTop: 0, refreshScrollValues: function (scrollPosition) { ViewportMetrics.currentScrollLeft = scrollPosition.x; ViewportMetrics.currentScrollTop = scrollPosition.y; } }; module.exports = ViewportMetrics; }, {}],\n  113: [function (require, module, exports) { 'use strict'; var invariant = require('./invariant'); function accumulateInto (current, next) { 'production' !== 'production' ? invariant(next != null, 'accumulateInto(...): Accumulated items must not be null or undefined.') : invariant(next != null); if (current == null) { return next; } var currentIsArray = Array.isArray(current); var nextIsArray = Array.isArray(next); if (currentIsArray && nextIsArray) { current.push.apply(current, next); return current; } if (currentIsArray) { current.push(next); return current; } if (nextIsArray) { return [current].concat(next); } return [current, next]; }module.exports = accumulateInto; }, { './invariant': 143 }],\n  114: [function (require, module, exports) { 'use strict'; var MOD = 65521; function adler32 (data) { var a = 1; var b = 0; for (var i = 0; i < data.length; i++) { a = (a + data.charCodeAt(i)) % MOD; b = (b + a) % MOD; } return a | b << 16; }module.exports = adler32; }, {}],\n  115: [function (require, module, exports) { var _hyphenPattern = /-(.)/g; function camelize (string) { return string.replace(_hyphenPattern, function (_, character) { return character.toUpperCase(); }); }module.exports = camelize; }, {}],\n  116: [function (require, module, exports) { 'use strict'; var camelize = require('./camelize'); var msPattern = /^-ms-/; function camelizeStyleName (string) { return camelize(string.replace(msPattern, 'ms-')); }module.exports = camelizeStyleName; }, { './camelize': 115 }],\n  117: [function (require, module, exports) { var isTextNode = require('./isTextNode'); function containsNode (outerNode, innerNode) { if (!outerNode || !innerNode) { return false; } else if (outerNode === innerNode) { return true; } else if (isTextNode(outerNode)) { return false; } else if (isTextNode(innerNode)) { return containsNode(outerNode, innerNode.parentNode); } else if (outerNode.contains) { return outerNode.contains(innerNode); } else if (outerNode.compareDocumentPosition) { return !!(outerNode.compareDocumentPosition(innerNode) & 16); } else { return false; } }module.exports = containsNode; }, { './isTextNode': 147 }],\n  118: [function (require, module, exports) { var toArray = require('./toArray'); function hasArrayNature (obj) { return !!obj && (typeof obj === 'object' || typeof obj === 'function') && 'length' in obj && !('setInterval' in obj) && typeof obj.nodeType !== 'number' && (Array.isArray(obj) || 'callee' in obj || 'item' in obj); } function createArrayFromMixed (obj) { if (!hasArrayNature(obj)) { return [obj]; } else if (Array.isArray(obj)) { return obj.slice(); } else { return toArray(obj); } }module.exports = createArrayFromMixed; }, { './toArray': 160 }],\n  119: [function (require, module, exports) { 'use strict'; var ReactClass = require('./ReactClass'); var ReactElement = require('./ReactElement'); var invariant = require('./invariant'); function createFullPageComponent (tag) { var elementFactory = ReactElement.createFactory(tag); var FullPageComponent = ReactClass.createClass({ tagName: tag.toUpperCase(), displayName: 'ReactFullPageComponent' + tag, componentWillUnmount: function () { 'production' !== 'production' ? invariant(false, '%s tried to unmount. Because of cross-browser quirks it is ' + 'impossible to unmount some top-level components (eg <html>, <head>, ' + 'and <body>) reliably and efficiently. To fix this, have a single ' + 'top-level component that never unmounts render these elements.', this.constructor.displayName) : invariant(false); }, render: function () { return elementFactory(this.props); } }); return FullPageComponent; }module.exports = createFullPageComponent; }, { './ReactClass': 41, './ReactElement': 65, './invariant': 143 }],\n  120: [function (require, module, exports) { var ExecutionEnvironment = require('./ExecutionEnvironment'); var createArrayFromMixed = require('./createArrayFromMixed'); var getMarkupWrap = require('./getMarkupWrap'); var invariant = require('./invariant'); var dummyNode = ExecutionEnvironment.canUseDOM ? document.createElement('div') : null; var nodeNamePattern = /^\\s*<(\\w+)/; function getNodeName (markup) { var nodeNameMatch = markup.match(nodeNamePattern); return nodeNameMatch && nodeNameMatch[1].toLowerCase(); } function createNodesFromMarkup (markup, handleScript) { var node = dummyNode; 'production' !== 'production' ? invariant(!!dummyNode, 'createNodesFromMarkup dummy not initialized') : invariant(!!dummyNode); var nodeName = getNodeName(markup); var wrap = nodeName && getMarkupWrap(nodeName); if (wrap) { node.innerHTML = wrap[1] + markup + wrap[2]; var wrapDepth = wrap[0]; while (wrapDepth--) { node = node.lastChild; } } else { node.innerHTML = markup; } var scripts = node.getElementsByTagName('script'); if (scripts.length) { 'production' !== 'production' ? invariant(handleScript, 'createNodesFromMarkup(...): Unexpected <script> element rendered.') : invariant(handleScript); createArrayFromMixed(scripts).forEach(handleScript); } var nodes = createArrayFromMixed(node.childNodes); while (node.lastChild) { node.removeChild(node.lastChild); } return nodes; }module.exports = createNodesFromMarkup; }, { './ExecutionEnvironment': 28, './createArrayFromMixed': 118, './getMarkupWrap': 135, './invariant': 143 }],\n  121: [function (require, module, exports) { 'use strict'; var CSSProperty = require('./CSSProperty'); var isUnitlessNumber = CSSProperty.isUnitlessNumber; function dangerousStyleValue (name, value) { var isEmpty = value == null || typeof value === 'boolean' || value === ''; if (isEmpty) { return ''; } var isNonNumeric = isNaN(value); if (isNonNumeric || value === 0 || isUnitlessNumber.hasOwnProperty(name) && isUnitlessNumber[name]) { return '' + value; } if (typeof value === 'string') { value = value.trim(); } return value + 'px'; }module.exports = dangerousStyleValue; }, { './CSSProperty': 11 }],\n  122: [function (require, module, exports) { function makeEmptyFunction (arg) { return function () { return arg; }; } function emptyFunction () {}emptyFunction.thatReturns = makeEmptyFunction; emptyFunction.thatReturnsFalse = makeEmptyFunction(false); emptyFunction.thatReturnsTrue = makeEmptyFunction(true); emptyFunction.thatReturnsNull = makeEmptyFunction(null); emptyFunction.thatReturnsThis = function () { return this; }; emptyFunction.thatReturnsArgument = function (arg) { return arg; }; module.exports = emptyFunction; }, {}],\n  123: [function (require, module, exports) { 'use strict'; var emptyObject = {}; if ('production' !== 'production') { Object.freeze(emptyObject); }module.exports = emptyObject; }, {}],\n  124: [function (require, module, exports) { 'use strict'; var ESCAPE_LOOKUP = { '&': '&amp;', '>': '&gt;', '<': '&lt;', '\"': '&quot;', \"'\": '&#x27;' }; var ESCAPE_REGEX = /[&><\"']/g; function escaper (match) { return ESCAPE_LOOKUP[match]; } function escapeTextContentForBrowser (text) { return ('' + text).replace(ESCAPE_REGEX, escaper); }module.exports = escapeTextContentForBrowser; }, {}],\n  125: [function (require, module, exports) { 'use strict'; var ReactCurrentOwner = require('./ReactCurrentOwner'); var ReactInstanceMap = require('./ReactInstanceMap'); var ReactMount = require('./ReactMount'); var invariant = require('./invariant'); var isNode = require('./isNode'); var warning = require('./warning'); function findDOMNode (componentOrElement) { if ('production' !== 'production') { var owner = ReactCurrentOwner.current; if (owner !== null) { 'production' !== 'production' ? warning(owner._warnedAboutRefsInRender, '%s is accessing getDOMNode or findDOMNode inside its render(). ' + 'render() should be a pure function of props and state. It should ' + 'never access something that requires stale data from the previous ' + 'render, such as refs. Move this logic to componentDidMount and ' + 'componentDidUpdate instead.', owner.getName() || 'A component') : null; owner._warnedAboutRefsInRender = true; } } if (componentOrElement == null) { return null; } if (isNode(componentOrElement)) { return componentOrElement; } if (ReactInstanceMap.has(componentOrElement)) { return ReactMount.getNodeFromInstance(componentOrElement); }'production' !== 'production' ? invariant(componentOrElement.render == null || typeof componentOrElement.render !== 'function', 'Component (with keys: %s) contains `render` method ' + 'but is not mounted in the DOM', Object.keys(componentOrElement)) : invariant(componentOrElement.render == null || typeof componentOrElement.render !== 'function'); 'production' !== 'production' ? invariant(false, 'Element appears to be neither ReactComponent nor DOMNode (keys: %s)', Object.keys(componentOrElement)) : invariant(false); }module.exports = findDOMNode; }, { './ReactCurrentOwner': 47, './ReactInstanceMap': 75, './ReactMount': 78, './invariant': 143, './isNode': 145, './warning': 162 }],\n  126: [function (require, module, exports) { 'use strict'; var traverseAllChildren = require('./traverseAllChildren'); var warning = require('./warning'); function flattenSingleChildIntoContext (traverseContext, child, name) { var result = traverseContext; var keyUnique = !result.hasOwnProperty(name); if ('production' !== 'production') { 'production' !== 'production' ? warning(keyUnique, 'flattenChildren(...): Encountered two children with the same key, ' + '`%s`. Child keys must be unique; when two children share a key, only ' + 'the first child will be used.', name) : null; } if (keyUnique && child != null) { result[name] = child; } } function flattenChildren (children) { if (children == null) { return children; } var result = {}; traverseAllChildren(children, flattenSingleChildIntoContext, result); return result; }module.exports = flattenChildren; }, { './traverseAllChildren': 161, './warning': 162 }],\n  127: [function (require, module, exports) { 'use strict'; function focusNode (node) { try { node.focus(); } catch (e) {} }module.exports = focusNode; }, {}],\n  128: [function (require, module, exports) { 'use strict'; var forEachAccumulated = function (arr, cb, scope) { if (Array.isArray(arr)) { arr.forEach(cb, scope); } else if (arr) { cb.call(scope, arr); } }; module.exports = forEachAccumulated; }, {}],\n  129: [function (require, module, exports) { function getActiveElement () { try { return document.activeElement || document.body; } catch (e) { return document.body; } }module.exports = getActiveElement; }, {}],\n  130: [function (require, module, exports) { 'use strict'; function getEventCharCode (nativeEvent) { var charCode; var keyCode = nativeEvent.keyCode; if ('charCode' in nativeEvent) { charCode = nativeEvent.charCode; if (charCode === 0 && keyCode === 13) { charCode = 13; } } else { charCode = keyCode; } if (charCode >= 32 || charCode === 13) { return charCode; } return 0; }module.exports = getEventCharCode; }, {}],\n  131: [function (require, module, exports) { 'use strict'; var getEventCharCode = require('./getEventCharCode'); var normalizeKey = { Esc: 'Escape', Spacebar: ' ', Left: 'ArrowLeft', Up: 'ArrowUp', Right: 'ArrowRight', Down: 'ArrowDown', Del: 'Delete', Win: 'OS', Menu: 'ContextMenu', Apps: 'ContextMenu', Scroll: 'ScrollLock', MozPrintableKey: 'Unidentified' }; var translateToKey = { 8: 'Backspace', 9: 'Tab', 12: 'Clear', 13: 'Enter', 16: 'Shift', 17: 'Control', 18: 'Alt', 19: 'Pause', 20: 'CapsLock', 27: 'Escape', 32: ' ', 33: 'PageUp', 34: 'PageDown', 35: 'End', 36: 'Home', 37: 'ArrowLeft', 38: 'ArrowUp', 39: 'ArrowRight', 40: 'ArrowDown', 45: 'Insert', 46: 'Delete', 112: 'F1', 113: 'F2', 114: 'F3', 115: 'F4', 116: 'F5', 117: 'F6', 118: 'F7', 119: 'F8', 120: 'F9', 121: 'F10', 122: 'F11', 123: 'F12', 144: 'NumLock', 145: 'ScrollLock', 224: 'Meta' }; function getEventKey (nativeEvent) { if (nativeEvent.key) { var key = normalizeKey[nativeEvent.key] || nativeEvent.key; if (key !== 'Unidentified') { return key; } } if (nativeEvent.type === 'keypress') { var charCode = getEventCharCode(nativeEvent); return charCode === 13 ? 'Enter' : String.fromCharCode(charCode); } if (nativeEvent.type === 'keydown' || nativeEvent.type === 'keyup') { return translateToKey[nativeEvent.keyCode] || 'Unidentified'; } return ''; }module.exports = getEventKey; }, { './getEventCharCode': 130 }],\n  132: [function (require, module, exports) { 'use strict'; var modifierKeyToProp = { Alt: 'altKey', Control: 'ctrlKey', Meta: 'metaKey', Shift: 'shiftKey' }; function modifierStateGetter (keyArg) { var syntheticEvent = this; var nativeEvent = syntheticEvent.nativeEvent; if (nativeEvent.getModifierState) { return nativeEvent.getModifierState(keyArg); } var keyProp = modifierKeyToProp[keyArg]; return keyProp ? !!nativeEvent[keyProp] : false; } function getEventModifierState (nativeEvent) { return modifierStateGetter; }module.exports = getEventModifierState; }, {}],\n  133: [function (require, module, exports) { 'use strict'; function getEventTarget (nativeEvent) { var target = nativeEvent.target || nativeEvent.srcElement || window; return target.nodeType === 3 ? target.parentNode : target; }module.exports = getEventTarget; }, {}],\n  134: [function (require, module, exports) { 'use strict'; var ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator; var FAUX_ITERATOR_SYMBOL = '@@iterator'; function getIteratorFn (maybeIterable) { var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]); if (typeof iteratorFn === 'function') { return iteratorFn; } }module.exports = getIteratorFn; }, {}],\n  135: [function (require, module, exports) { var ExecutionEnvironment = require('./ExecutionEnvironment'); var invariant = require('./invariant'); var dummyNode = ExecutionEnvironment.canUseDOM ? document.createElement('div') : null; var shouldWrap = { circle: true, clipPath: true, defs: true, ellipse: true, g: true, line: true, linearGradient: true, path: true, polygon: true, polyline: true, radialGradient: true, rect: true, stop: true, text: true }; var selectWrap = [1, '<select multiple=\"true\">', '</select>']; var tableWrap = [1, '<table>', '</table>']; var trWrap = [3, '<table><tbody><tr>', '</tr></tbody></table>']; var svgWrap = [1, '<svg>', '</svg>']; var markupWrap = { '*': [1, '?<div>', '</div>'], area: [1, '<map>', '</map>'], col: [2, '<table><tbody></tbody><colgroup>', '</colgroup></table>'], legend: [1, '<fieldset>', '</fieldset>'], param: [1, '<object>', '</object>'], tr: [2, '<table><tbody>', '</tbody></table>'], optgroup: selectWrap, option: selectWrap, caption: tableWrap, colgroup: tableWrap, tbody: tableWrap, tfoot: tableWrap, thead: tableWrap, td: trWrap, th: trWrap, circle: svgWrap, clipPath: svgWrap, defs: svgWrap, ellipse: svgWrap, g: svgWrap, line: svgWrap, linearGradient: svgWrap, path: svgWrap, polygon: svgWrap, polyline: svgWrap, radialGradient: svgWrap, rect: svgWrap, stop: svgWrap, text: svgWrap }; function getMarkupWrap (nodeName) { 'production' !== 'production' ? invariant(!!dummyNode, 'Markup wrapping node not initialized') : invariant(!!dummyNode); if (!markupWrap.hasOwnProperty(nodeName)) { nodeName = '*'; } if (!shouldWrap.hasOwnProperty(nodeName)) { if (nodeName === '*') { dummyNode.innerHTML = '<link />'; } else { dummyNode.innerHTML = '<' + nodeName + '></' + nodeName + '>'; }shouldWrap[nodeName] = !dummyNode.firstChild; } return shouldWrap[nodeName] ? markupWrap[nodeName] : null; }module.exports = getMarkupWrap; }, { './ExecutionEnvironment': 28, './invariant': 143 }],\n  136: [function (require, module, exports) { 'use strict'; function getLeafNode (node) { while (node && node.firstChild) { node = node.firstChild; } return node; } function getSiblingNode (node) { while (node) { if (node.nextSibling) { return node.nextSibling; }node = node.parentNode; } } function getNodeForCharacterOffset (root, offset) { var node = getLeafNode(root); var nodeStart = 0; var nodeEnd = 0; while (node) { if (node.nodeType === 3) { nodeEnd = nodeStart + node.textContent.length; if (nodeStart <= offset && nodeEnd >= offset) { return { node: node, offset: offset - nodeStart }; }nodeStart = nodeEnd; }node = getLeafNode(getSiblingNode(node)); } }module.exports = getNodeForCharacterOffset; }, {}],\n  137: [function (require, module, exports) { 'use strict'; var DOC_NODE_TYPE = 9; function getReactRootElementInContainer (container) { if (!container) { return null; } if (container.nodeType === DOC_NODE_TYPE) { return container.documentElement; } else { return container.firstChild; } }module.exports = getReactRootElementInContainer; }, {}],\n  138: [function (require, module, exports) { 'use strict'; var ExecutionEnvironment = require('./ExecutionEnvironment'); var contentKey = null; function getTextContentAccessor () { if (!contentKey && ExecutionEnvironment.canUseDOM) { contentKey = 'textContent' in document.documentElement ? 'textContent' : 'innerText'; } return contentKey; }module.exports = getTextContentAccessor; }, { './ExecutionEnvironment': 28 }],\n  139: [function (require, module, exports) { 'use strict'; function getUnboundedScrollPosition (scrollable) { if (scrollable === window) { return { x: window.pageXOffset || document.documentElement.scrollLeft, y: window.pageYOffset || document.documentElement.scrollTop }; } return { x: scrollable.scrollLeft, y: scrollable.scrollTop }; }module.exports = getUnboundedScrollPosition; }, {}],\n  140: [function (require, module, exports) { var _uppercasePattern = /([A-Z])/g; function hyphenate (string) { return string.replace(_uppercasePattern, '-$1').toLowerCase(); }module.exports = hyphenate; }, {}],\n  141: [function (require, module, exports) { 'use strict'; var hyphenate = require('./hyphenate'); var msPattern = /^ms-/; function hyphenateStyleName (string) { return hyphenate(string).replace(msPattern, '-ms-'); }module.exports = hyphenateStyleName; }, { './hyphenate': 140 }],\n  142: [function (require, module, exports) { 'use strict'; var ReactCompositeComponent = require('./ReactCompositeComponent'); var ReactEmptyComponent = require('./ReactEmptyComponent'); var ReactNativeComponent = require('./ReactNativeComponent'); var assign = require('./Object.assign'); var invariant = require('./invariant'); var warning = require('./warning'); var ReactCompositeComponentWrapper = function () {}; assign(ReactCompositeComponentWrapper.prototype, ReactCompositeComponent.Mixin, { _instantiateReactComponent: instantiateReactComponent }); function isInternalComponentType (type) { return typeof type === 'function' && typeof type.prototype !== 'undefined' && typeof type.prototype.mountComponent === 'function' && typeof type.prototype.receiveComponent === 'function'; } function instantiateReactComponent (node, parentCompositeType) { var instance; if (node === null || node === false) { node = ReactEmptyComponent.emptyElement; } if (typeof node === 'object') { var element = node; if ('production' !== 'production') { 'production' !== 'production' ? warning(element && (typeof element.type === 'function' || typeof element.type === 'string'), 'Only functions or strings can be mounted as React components.') : null; } if (parentCompositeType === element.type && typeof element.type === 'string') { instance = ReactNativeComponent.createInternalComponent(element); } else if (isInternalComponentType(element.type)) { instance = new element.type(element); } else { instance = new ReactCompositeComponentWrapper(); } } else if (typeof node === 'string' || typeof node === 'number') { instance = ReactNativeComponent.createInstanceForText(node); } else { 'production' !== 'production' ? invariant(false, 'Encountered invalid React node of type %s', typeof node) : invariant(false); } if ('production' !== 'production') { 'production' !== 'production' ? warning(typeof instance.construct === 'function' && typeof instance.mountComponent === 'function' && typeof instance.receiveComponent === 'function' && typeof instance.unmountComponent === 'function', 'Only React Components can be mounted.') : null; }instance.construct(node); instance._mountIndex = 0; instance._mountImage = null; if ('production' !== 'production') { instance._isOwnerNecessary = false; instance._warnedAboutRefsInRender = false; } if ('production' !== 'production') { if (Object.preventExtensions) { Object.preventExtensions(instance); } } return instance; }module.exports = instantiateReactComponent; }, { './Object.assign': 34, './ReactCompositeComponent': 45, './ReactEmptyComponent': 67, './ReactNativeComponent': 81, './invariant': 143, './warning': 162 }],\n  143: [function (require, module, exports) { 'use strict'; var invariant = function (condition, format, a, b, c, d, e, f) { if ('production' !== 'production') { if (format === undefined) { throw new Error('invariant requires an error message argument'); } } if (!condition) { var error; if (format === undefined) { error = new Error('Minified exception occurred; use the non-minified dev environment ' + 'for the full error message and additional helpful warnings.'); } else { var args = [a, b, c, d, e, f]; var argIndex = 0; error = new Error('Invariant Violation: ' + format.replace(/%s/g, function () { return args[argIndex++]; })); }error.framesToPop = 1; throw error; } }; module.exports = invariant; }, {}],\n  144: [function (require, module, exports) { 'use strict'; var ExecutionEnvironment = require('./ExecutionEnvironment'); var useHasFeature; if (ExecutionEnvironment.canUseDOM) { useHasFeature = document.implementation && document.implementation.hasFeature && document.implementation.hasFeature('', '') !== true; } function isEventSupported (eventNameSuffix, capture) { if (!ExecutionEnvironment.canUseDOM || capture && !('addEventListener' in document)) { return false; } var eventName = 'on' + eventNameSuffix; var isSupported = eventName in document; if (!isSupported) { var element = document.createElement('div'); element.setAttribute(eventName, 'return;'); isSupported = typeof element[eventName] === 'function'; } if (!isSupported && useHasFeature && eventNameSuffix === 'wheel') { isSupported = document.implementation.hasFeature('Events.wheel', '3.0'); } return isSupported; }module.exports = isEventSupported; }, { './ExecutionEnvironment': 28 }],\n  145: [function (require, module, exports) { function isNode (object) { return !!(object && (typeof Node === 'function' ? object instanceof Node : typeof object === 'object' && typeof object.nodeType === 'number' && typeof object.nodeName === 'string')); }module.exports = isNode; }, {}],\n  146: [function (require, module, exports) { 'use strict'; var supportedInputTypes = { color: true, date: true, datetime: true, 'datetime-local': true, email: true, month: true, number: true, password: true, range: true, search: true, tel: true, text: true, time: true, url: true, week: true }; function isTextInputElement (elem) { return elem && (elem.nodeName === 'INPUT' && supportedInputTypes[elem.type] || elem.nodeName === 'TEXTAREA'); }module.exports = isTextInputElement; }, {}],\n  147: [function (require, module, exports) { var isNode = require('./isNode'); function isTextNode (object) { return isNode(object) && object.nodeType == 3; }module.exports = isTextNode; }, { './isNode': 145 }],\n  148: [function (require, module, exports) { 'use strict'; var invariant = require('./invariant'); var keyMirror = function (obj) { var ret = {}; var key; 'production' !== 'production' ? invariant(obj instanceof Object && !Array.isArray(obj), 'keyMirror(...): Argument must be an object.') : invariant(obj instanceof Object && !Array.isArray(obj)); for (key in obj) { if (!obj.hasOwnProperty(key)) { continue; }ret[key] = key; } return ret; }; module.exports = keyMirror; }, { './invariant': 143 }],\n  149: [function (require, module, exports) { var keyOf = function (oneKeyObj) { var key; for (key in oneKeyObj) { if (!oneKeyObj.hasOwnProperty(key)) { continue; } return key; } return null; }; module.exports = keyOf; }, {}],\n  150: [function (require, module, exports) { 'use strict'; var hasOwnProperty = Object.prototype.hasOwnProperty; function mapObject (object, callback, context) { if (!object) { return null; } var result = {}; for (var name in object) { if (hasOwnProperty.call(object, name)) { result[name] = callback.call(context, object[name], name, object); } } return result; }module.exports = mapObject; }, {}],\n  151: [function (require, module, exports) { 'use strict'; function memoizeStringOnly (callback) { var cache = {}; return function (string) { if (!cache.hasOwnProperty(string)) { cache[string] = callback.call(this, string); } return cache[string]; }; }module.exports = memoizeStringOnly; }, {}],\n  152: [function (require, module, exports) { 'use strict'; var ReactElement = require('./ReactElement'); var invariant = require('./invariant'); function onlyChild (children) { 'production' !== 'production' ? invariant(ReactElement.isValidElement(children), 'onlyChild must be passed a children with exactly one child.') : invariant(ReactElement.isValidElement(children)); return children; }module.exports = onlyChild; }, { './ReactElement': 65, './invariant': 143 }],\n  153: [function (require, module, exports) { 'use strict'; var ExecutionEnvironment = require('./ExecutionEnvironment'); var performance; if (ExecutionEnvironment.canUseDOM) { performance = window.performance || window.msPerformance || window.webkitPerformance; }module.exports = performance || {}; }, { './ExecutionEnvironment': 28 }],\n  154: [function (require, module, exports) { var performance = require('./performance'); if (!performance || !performance.now) { performance = Date; } var performanceNow = performance.now.bind(performance); module.exports = performanceNow; }, { './performance': 153 }],\n  155: [function (require, module, exports) { 'use strict'; var escapeTextContentForBrowser = require('./escapeTextContentForBrowser'); function quoteAttributeValueForBrowser (value) { return '\"' + escapeTextContentForBrowser(value) + '\"'; }module.exports = quoteAttributeValueForBrowser; }, { './escapeTextContentForBrowser': 124 }],\n  156: [function (require, module, exports) { 'use strict'; var ExecutionEnvironment = require('./ExecutionEnvironment'); var WHITESPACE_TEST = /^[ \\r\\n\\t\\f]/; var NONVISIBLE_TEST = /<(!--|link|noscript|meta|script|style)[ \\r\\n\\t\\f\\/>]/; var setInnerHTML = function (node, html) { node.innerHTML = html; }; if (typeof MSApp !== 'undefined' && MSApp.execUnsafeLocalFunction) { setInnerHTML = function (node, html) { MSApp.execUnsafeLocalFunction(function () { node.innerHTML = html; }); }; } if (ExecutionEnvironment.canUseDOM) { var testElement = document.createElement('div'); testElement.innerHTML = ' '; if (testElement.innerHTML === '') { setInnerHTML = function (node, html) { if (node.parentNode) { node.parentNode.replaceChild(node, node); } if (WHITESPACE_TEST.test(html) || html[0] === '<' && NONVISIBLE_TEST.test(html)) { node.innerHTML = '\\ufeff' + html; var textNode = node.firstChild; if (textNode.data.length === 1) { node.removeChild(textNode); } else { textNode.deleteData(0, 1); } } else { node.innerHTML = html; } }; } }module.exports = setInnerHTML; }, { './ExecutionEnvironment': 28 }],\n  157: [function (require, module, exports) { 'use strict'; var ExecutionEnvironment = require('./ExecutionEnvironment'); var escapeTextContentForBrowser = require('./escapeTextContentForBrowser'); var setInnerHTML = require('./setInnerHTML'); var setTextContent = function (node, text) { node.textContent = text; }; if (ExecutionEnvironment.canUseDOM) { if (!('textContent' in document.documentElement)) { setTextContent = function (node, text) { setInnerHTML(node, escapeTextContentForBrowser(text)); }; } }module.exports = setTextContent; }, { './ExecutionEnvironment': 28, './escapeTextContentForBrowser': 124, './setInnerHTML': 156 }],\n  158: [function (require, module, exports) { 'use strict'; function shallowEqual (objA, objB) { if (objA === objB) { return true; } var key; for (key in objA) { if (objA.hasOwnProperty(key) && (!objB.hasOwnProperty(key) || objA[key] !== objB[key])) { return false; } } for (key in objB) { if (objB.hasOwnProperty(key) && !objA.hasOwnProperty(key)) { return false; } } return true; }module.exports = shallowEqual; }, {}],\n  159: [function (require, module, exports) {\n    'use strict'; var warning = require('./warning'); function shouldUpdateReactComponent (prevElement, nextElement) {\n      if (prevElement != null && nextElement != null) {\n        var prevType = typeof prevElement; var nextType = typeof nextElement; if (prevType === 'string' || prevType === 'number') { return nextType === 'string' || nextType === 'number'; } else {\n          if (nextType === 'object' && prevElement.type === nextElement.type && prevElement.key === nextElement.key) {\n            var ownersMatch = prevElement._owner === nextElement._owner; var prevName = null; var nextName = null; var nextDisplayName = null; if ('production' !== 'production') {\n              if (!ownersMatch) {\n                if (prevElement._owner != null && prevElement._owner.getPublicInstance() != null && prevElement._owner.getPublicInstance().constructor != null) { prevName = prevElement._owner.getPublicInstance().constructor.displayName; } if (nextElement._owner != null && nextElement._owner.getPublicInstance() != null && nextElement._owner.getPublicInstance().constructor != null) { nextName = nextElement._owner.getPublicInstance().constructor.displayName; } if (nextElement.type != null && nextElement.type.displayName != null) { nextDisplayName = nextElement.type.displayName; } if (nextElement.type != null && typeof nextElement.type === 'string') { nextDisplayName = nextElement.type; } if (typeof nextElement.type !== 'string' || nextElement.type === 'input' || nextElement.type === 'textarea') {\n                  if (prevElement._owner != null && prevElement._owner._isOwnerNecessary === false || nextElement._owner != null && nextElement._owner._isOwnerNecessary === false) {\n                    if (prevElement._owner != null) { prevElement._owner._isOwnerNecessary = true; } if (nextElement._owner != null) { nextElement._owner._isOwnerNecessary = true; }'production' !== 'production' ? warning(false, '<%s /> is being rendered by both %s and %s using the same ' + 'key (%s) in the same place. Currently, this means that ' + \"they don't preserve state. This behavior should be very \" + \"rare so we're considering deprecating it. Please contact \" + 'the React team and explain your use case so that we can ' + 'take that into consideration.', nextDisplayName || 'Unknown Component', prevName || '[Unknown]', nextName || '[Unknown]', prevElement.key) : null;\n                  }\n                }\n              }\n            } return ownersMatch;\n          }\n        }\n      } return false;\n    }module.exports = shouldUpdateReactComponent;\n  }, { './warning': 162 }],\n  160: [function (require, module, exports) { var invariant = require('./invariant'); function toArray (obj) { var length = obj.length; 'production' !== 'production' ? invariant(!Array.isArray(obj) && (typeof obj === 'object' || typeof obj === 'function'), 'toArray: Array-like object expected') : invariant(!Array.isArray(obj) && (typeof obj === 'object' || typeof obj === 'function')); 'production' !== 'production' ? invariant(typeof length === 'number', 'toArray: Object needs a length property') : invariant(typeof length === 'number'); 'production' !== 'production' ? invariant(length === 0 || length - 1 in obj, 'toArray: Object should have keys for indices') : invariant(length === 0 || length - 1 in obj); if (obj.hasOwnProperty) { try { return Array.prototype.slice.call(obj); } catch (e) {} } var ret = Array(length); for (var ii = 0; ii < length; ii++) { ret[ii] = obj[ii]; } return ret; }module.exports = toArray; }, { './invariant': 143 }],\n  161: [function (require, module, exports) { 'use strict'; var ReactElement = require('./ReactElement'); var ReactFragment = require('./ReactFragment'); var ReactInstanceHandles = require('./ReactInstanceHandles'); var getIteratorFn = require('./getIteratorFn'); var invariant = require('./invariant'); var warning = require('./warning'); var SEPARATOR = ReactInstanceHandles.SEPARATOR; var SUBSEPARATOR = ':'; var userProvidedKeyEscaperLookup = { '=': '=0', '.': '=1', ':': '=2' }; var userProvidedKeyEscapeRegex = /[=.:]/g; var didWarnAboutMaps = false; function userProvidedKeyEscaper (match) { return userProvidedKeyEscaperLookup[match]; } function getComponentKey (component, index) { if (component && component.key != null) { return wrapUserProvidedKey(component.key); } return index.toString(36); } function escapeUserProvidedKey (text) { return ('' + text).replace(userProvidedKeyEscapeRegex, userProvidedKeyEscaper); } function wrapUserProvidedKey (key) { return '$' + escapeUserProvidedKey(key); } function traverseAllChildrenImpl (children, nameSoFar, indexSoFar, callback, traverseContext) { var type = typeof children; if (type === 'undefined' || type === 'boolean') { children = null; } if (children === null || type === 'string' || type === 'number' || ReactElement.isValidElement(children)) { callback(traverseContext, children, nameSoFar === '' ? SEPARATOR + getComponentKey(children, 0) : nameSoFar, indexSoFar); return 1; } var child, nextName, nextIndex; var subtreeCount = 0; if (Array.isArray(children)) { for (var i = 0; i < children.length; i++) { child = children[i]; nextName = (nameSoFar !== '' ? nameSoFar + SUBSEPARATOR : SEPARATOR) + getComponentKey(child, i); nextIndex = indexSoFar + subtreeCount; subtreeCount += traverseAllChildrenImpl(child, nextName, nextIndex, callback, traverseContext); } } else { var iteratorFn = getIteratorFn(children); if (iteratorFn) { var iterator = iteratorFn.call(children); var step; if (iteratorFn !== children.entries) { var ii = 0; while (!(step = iterator.next()).done) { child = step.value; nextName = (nameSoFar !== '' ? nameSoFar + SUBSEPARATOR : SEPARATOR) + getComponentKey(child, ii++); nextIndex = indexSoFar + subtreeCount; subtreeCount += traverseAllChildrenImpl(child, nextName, nextIndex, callback, traverseContext); } } else { if ('production' !== 'production') { 'production' !== 'production' ? warning(didWarnAboutMaps, 'Using Maps as children is not yet fully supported. It is an ' + 'experimental feature that might be removed. Convert it to a ' + 'sequence / iterable of keyed ReactElements instead.') : null; didWarnAboutMaps = true; } while (!(step = iterator.next()).done) { var entry = step.value; if (entry) { child = entry[1]; nextName = (nameSoFar !== '' ? nameSoFar + SUBSEPARATOR : SEPARATOR) + wrapUserProvidedKey(entry[0]) + SUBSEPARATOR + getComponentKey(child, 0); nextIndex = indexSoFar + subtreeCount; subtreeCount += traverseAllChildrenImpl(child, nextName, nextIndex, callback, traverseContext); } } } } else if (type === 'object') { 'production' !== 'production' ? invariant(children.nodeType !== 1, 'traverseAllChildren(...): Encountered an invalid child; DOM ' + 'elements are not valid children of React components.') : invariant(children.nodeType !== 1); var fragment = ReactFragment.extract(children); for (var key in fragment) { if (fragment.hasOwnProperty(key)) { child = fragment[key]; nextName = (nameSoFar !== '' ? nameSoFar + SUBSEPARATOR : SEPARATOR) + wrapUserProvidedKey(key) + SUBSEPARATOR + getComponentKey(child, 0); nextIndex = indexSoFar + subtreeCount; subtreeCount += traverseAllChildrenImpl(child, nextName, nextIndex, callback, traverseContext); } } } } return subtreeCount; } function traverseAllChildren (children, callback, traverseContext) { if (children == null) { return 0; } return traverseAllChildrenImpl(children, '', 0, callback, traverseContext); }module.exports = traverseAllChildren; }, { './ReactElement': 65, './ReactFragment': 71, './ReactInstanceHandles': 74, './getIteratorFn': 134, './invariant': 143, './warning': 162 }],\n  162: [function (require, module, exports) { 'use strict'; var emptyFunction = require('./emptyFunction'); var warning = emptyFunction; if ('production' !== 'production') { warning = function (condition, format) { for (var args = [], $__0 = 2, $__1 = arguments.length; $__0 < $__1; $__0++)args.push(arguments[$__0]); if (format === undefined) { throw new Error('`warning(condition, format, ...args)` requires a warning ' + 'message argument'); } if (format.length < 10 || /^[s\\W]*$/.test(format)) { throw new Error('The warning format should be able to uniquely identify this ' + 'warning. Please, use a more descriptive format than: ' + format); } if (format.indexOf('Failed Composite propType: ') === 0) { return; } if (!condition) { var argIndex = 0; var message = 'Warning: ' + format.replace(/%s/g, function () { return args[argIndex++]; }); console.warn(message); try { throw new Error(message); } catch (x) {} } }; }module.exports = warning; }, { './emptyFunction': 122 }],\n  163: [function (require, module, exports) { module.exports = require('./lib/React'); }, { './lib/React': 36 }] }, {}, [7]);\n"
  },
  {
    "path": "examples/simpleReactApp/components/App.js",
    "content": "const React = require('react');\n\nconst Search = require('./Search');\nconst Map = require('./Map');\nconst CurrentLocation = require('./CurrentLocation');\nconst LocationList = require('./LocationList');\n\nconst App = React.createClass({\n\n  getInitialState() {\n    // Extract the favorite locations from local storage\n\n    let favorites = [];\n\n    if (localStorage.favorites) {\n      favorites = JSON.parse(localStorage.favorites);\n    }\n\n    // Nobody would get mad if we center it on Paris by default\n\n    return {\n      favorites: favorites,\n      currentAddress: 'Paris, France',\n      mapCoordinates: {\n        lat: 48.856614,\n        lng: 2.3522219\n      }\n    };\n  },\n\n  toggleFavorite(address) {\n    if (this.isAddressInFavorites(address)) {\n      this.removeFromFavorites(address);\n    } else {\n      this.addToFavorites(address);\n    }\n  },\n\n  addToFavorites(address) {\n    const favorites = this.state.favorites;\n\n    favorites.push({\n      address: address,\n      timestamp: Date.now()\n    });\n\n    this.setState({\n      favorites: favorites\n    });\n\n    localStorage.favorites = JSON.stringify(favorites);\n  },\n\n  removeFromFavorites(address) {\n    const favorites = this.state.favorites;\n    let index = -1;\n\n    for (let i = 0; i < favorites.length; i++) {\n      if (favorites[i].address == address) {\n        index = i;\n        break;\n      }\n    }\n\n    // If it was found, remove it from the favorites array\n\n    if (index !== -1) {\n      favorites.splice(index, 1);\n\n      this.setState({\n        favorites: favorites\n      });\n\n      localStorage.favorites = JSON.stringify(favorites);\n    }\n  },\n\n  isAddressInFavorites(address) {\n    const favorites = this.state.favorites;\n\n    for (let i = 0; i < favorites.length; i++) {\n      if (favorites[i].address == address) {\n        return true;\n      }\n    }\n\n    return false;\n  },\n\n  searchForAddress(address) {\n    const self = this;\n\n    // We will use GMaps' geocode functionality,\n    // which is built on top of the Google Maps API\n\n    GMaps.geocode({\n      address: address,\n      callback: function (results, status) {\n        if (status !== 'OK') return;\n\n        const latlng = results[0].geometry.location;\n\n        self.setState({\n          currentAddress: results[0].formatted_address,\n          mapCoordinates: {\n            lat: latlng.lat(),\n            lng: latlng.lng()\n          }\n        });\n        setTimeout(function () {\n          console.log('gmapResponded');\n        }, 1000);\n      }\n    });\n  },\n\n  componentDidMount() {\n    const that = this;\n    setTimeout(function () {\n      that.searchForAddress('San Francisco');\n    }, 2000);\n  },\n\n  render() {\n    return (\n\n      <div>\n        <h1>Your Google Maps Locations</h1>\n\n        <Search onSearch={this.searchForAddress}/>\n\n        <Map lat={this.state.mapCoordinates.lat} lng={this.state.mapCoordinates.lng}/>\n\n        <CurrentLocation address={this.state.currentAddress}\n                         favorite={this.isAddressInFavorites(this.state.currentAddress)}\n                         onFavoriteToggle={this.toggleFavorite}/>\n\n        <LocationList locations={this.state.favorites} activeLocationAddress={this.state.currentAddress}\n                      onClick={this.searchForAddress}/>\n\n      </div>\n\n    );\n  }\n\n});\n\nmodule.exports = App;\n"
  },
  {
    "path": "examples/simpleReactApp/components/CurrentLocation.js",
    "content": "const React = require('react');\n\nconst CurrentLocation = React.createClass({\n\n    toggleFavorite() {\n        this.props.onFavoriteToggle(this.props.address);\n    },\n\n    render() {\n        let starClassName = 'glyphicon glyphicon-star-empty';\n\n        if (this.props.favorite) {\n            starClassName = 'glyphicon glyphicon-star';\n        }\n\n        return (\n            <div className=\"col-xs-12 col-md-6 col-md-offset-3 current-location\">\n                <h4 id=\"save-location\">{this.props.address}</h4>\n                <span className={starClassName} onClick={this.toggleFavorite} aria-hidden=\"true\"></span>\n            </div>\n        );\n    }\n\n});\n\nmodule.exports = CurrentLocation;\n"
  },
  {
    "path": "examples/simpleReactApp/components/LocationItem.js",
    "content": "const React = require('react');\nconst moment = require('moment');\n\nconst LocationItem = React.createClass({\n\n  handleClick () {\n    this.props.onClick(this.props.address);\n  },\n\n  render () {\n      let cn = 'list-group-item';\n\n      if (this.props.active) {\n      cn += ' active-location';\n    }\n\n    return (\n      <a className={cn} onClick={this.handleClick}>\n        {this.props.address}\n        <span className=\"createdAt\">{ moment(this.props.timestamp).fromNow() }</span>\n        <span className=\"glyphicon glyphicon-menu-right\"></span>\n      </a>\n    );\n  }\n\n});\n\nmodule.exports = LocationItem;\n"
  },
  {
    "path": "examples/simpleReactApp/components/LocationList.js",
    "content": "const React = require('react');\nconst LocationItem = require('./LocationItem');\n\nconst LocationList = React.createClass({\n\n    render() {\n        const self = this;\n\n        const locations = this.props.locations.map(function (l) {\n            const active = self.props.activeLocationAddress == l.address;\n\n            // Notice that we are passing the onClick callback of this\n            // LocationList to each LocationItem.\n\n            return <LocationItem address={l.address} timestamp={l.timestamp}\n                                 active={active} onClick={self.props.onClick}/>;\n        });\n\n        if (!locations.length) {\n            return null;\n        }\n\n        return (\n            <div className=\"list-group col-xs-12 col-md-6 col-md-offset-3\">\n                <span className=\"list-group-item active\">Saved Locations</span>\n                {locations}\n            </div>\n        );\n    }\n\n});\n\nmodule.exports = LocationList;\n"
  },
  {
    "path": "examples/simpleReactApp/components/Map.js",
    "content": "const React = require('react');\n\nconst Map = React.createClass({\n\n    componentDidMount() {\n        // Only componentDidMount is called when the component is first added to\n        // the page. This is why we are calling the following method manually.\n        // This makes sure that our map initialization code is run the first time.\n\n        this.componentDidUpdate();\n    },\n\n    componentDidUpdate() {\n        if (this.lastLat == this.props.lat && this.lastLng == this.props.lng) {\n            // The map has already been initialized at this address.\n            // Return from this method so that we don't reinitialize it\n            // (and cause it to flicker).\n\n            return;\n        }\n\n        this.lastLat = this.props.lat;\n        this.lastLng = this.props.lng;\n\n        const map = new GMaps({\n            el: '#map',\n            lat: this.props.lat,\n            lng: this.props.lng\n        });\n\n        // Adding a marker to the location we are showing\n\n        map.addMarker({\n            lat: this.props.lat,\n            lng: this.props.lng\n        });\n    },\n\n    render() {\n        return (\n            <div className=\"map-holder\">\n                <p>Loading...</p>\n                <div id=\"map\"></div>\n            </div>\n        );\n    }\n\n});\n\nmodule.exports = Map;\n"
  },
  {
    "path": "examples/simpleReactApp/components/Search.js",
    "content": "const React = require('react');\n\nconst Search = React.createClass({\n\n    getInitialState() {\n        return {value: ''};\n    },\n\n    handleChange(event) {\n        this.setState({value: event.target.value});\n    },\n\n    handleSubmit(event) {\n        event.preventDefault();\n\n        // When the form is submitted, call the onSearch callback that is passed to the component\n\n        this.props.onSearch(this.state.value);\n\n        // Unfocus the text input field\n        this.getDOMNode().querySelector('input').blur();\n    },\n\n    render() {\n        return (\n            <form id=\"geocoding_form\" className=\"form-horizontal\" onSubmit={this.handleSubmit}>\n                <div className=\"form-group\">\n                    <div className=\"col-xs-12 col-md-6 col-md-offset-3\">\n                        <div className=\"input-group\">\n                            <input type=\"text\" className=\"form-control\" id=\"address\" placeholder=\"Find a location...\"\n                                   value={this.state.value} onChange={this.handleChange}/>\n                            <span className=\"input-group-btn\">\n                <span className=\"glyphicon glyphicon-search\" aria-hidden=\"true\"></span>\n              </span>\n                        </div>\n                    </div>\n                </div>\n            </form>\n        );\n    }\n});\n\nmodule.exports = Search;\n"
  },
  {
    "path": "examples/simpleReactApp/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head lang=\"en\">\n\t<meta charset=\"UTF-8\">\n\t<title>Your First Webapp With React</title>\n\t<link href=\"http://maxcdn.bootstrapcdn.com/bootswatch/3.3.4/flatly/bootstrap.min.css\" type=\"text/css\" rel=\"stylesheet\" />\n\t<link href=\"assets/css/styles.css\" type=\"text/css\" rel=\"stylesheet\" />\n</head>\n<body>\n\n\t<div id=\"main\" class=\"container\">\n\n\t\t<!-- The App will be rendered here -->\n\t\t\n\t</div>\n\n\t<!-- Including the Google Maps API and the GMaps library -->\n\t<script src=\"http://maps.google.com/maps/api/js?sensor=true\"></script>\n\t<script src=\"http://cdnjs.cloudflare.com/ajax/libs/gmaps.js/0.4.12/gmaps.min.js\"></script>\n\n\t<!-- Our compiled JavaScript source file -->\n\t<script src=\"./compiled.js\"></script>\n\n</body>\n</html>\n"
  },
  {
    "path": "examples/simpleReactApp/main.js",
    "content": "const React = require('react');\nconst App = require('./components/App');\n\nReact.render(\n  <App />,\n  document.getElementById('main')\n);\n"
  },
  {
    "path": "examples/simpleReactApp/package.json",
    "content": "{\n  \"name\": \"first-webapp-react\",\n  \"version\": \"1.0.0\",\n  \"description\": \"\",\n  \"main\": \"main.js\",\n  \"private\": true,\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\",\n    \"dev-backstop-test\": \"node ../../cli/index.js test\",\n    \"watch\": \"watchify -v -d -t [ reactify --es6 ] main.js -o compiled.js\",\n    \"build\": \"NODE_ENV=production browserify -t [ reactify --es6 ] main.js | uglifyjs > compiled.js && backstop test\"\n  },\n  \"author\": \"Tutorialzine\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"moment\": \"^2.10.2\",\n    \"react\": \"^0.14.0\"\n  },\n  \"devDependencies\": {\n    \"browserify\": \"^9.0.8\",\n    \"reactify\": \"^1.1.0\",\n    \"uglify-js\": \"^2.4.20\",\n    \"watchify\": \"^3.1.2\"\n  }\n}\n"
  },
  {
    "path": "examples/simpleReactApp/readme.md",
    "content": "**This simple project was originally found here...**\n\nhttp://tutorialzine.com/2015/04/first-webapp-react/\n\nInstall:\nmake sure you are in the `simpleReactApp` directory and then...\n`npm install`\n\nthen Build...\n`npm run build`\n\nThen open index.html in your browser.\n\n**Note:** ignore antialiasing is used here. \nSee backstop.json: `\"resembleOutputOptions\": {\"ignoreAntialiasing\": true}`\n\n---\n\n**A BackstopJS test configuration file has already been added to this project.**\n\nTo test, simply run the build command above, and Backstop will open the html report in `./backstop_data/html_report`.\n\nYou can also run `npm run dev-backstop-test`, if you have run `npm install` at the root directory of the BackstopJS directory.\n"
  },
  {
    "path": "index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <!-- Required meta tags -->\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n\n    <!-- Bootstrap CSS -->\n    <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/css/bootstrap.min.css\" integrity=\"sha384-/Y6pD6FV/Vv2HJnA6t+vslU6fwYXjCFtcEpHbNJ0lyAFsXTsjBbfaDjzALeQsN6M\" crossorigin=\"anonymous\">\n\n    <link href=\"https://fonts.googleapis.com/css?family=Encode+Sans:300,200\" rel=\"stylesheet\">\n\n    <link rel=\"stylesheet\" href=\"./assets/styles.css\">\n  </head>\n  <body>\n  \t<div class=\"page-root container-fluid\">\n      <div class=\"row justify-content-center moneyshot\">\n        <div class=\"col-10\">\n          <p class=\"mascotBlock\">\n            <a href=\"https://github.com/garris/BackstopJS\" class=\"lemur-link\">\n              <img id=\"theLemur\" src=\"assets/lemurFace.png\" class='lemurInYourFace' alt=\"\">\n            </a>\n            <img id=\"lemurButt\" src=\"assets/lemurButt.png\" class='lemurButtInYourFace' alt=\"\">\n          </p>\n          <p class=\"logoBlock\">\n            <a href=\"https://github.com/garris/BackstopJS\" class=\"logo-link\">\n              <img src=\"assets/BackstopJS.svg\" class='BackstopJS3' alt=\"BackstopJS\">\n            </a>\n          </p>\n        </div>\n        <h1>Visual regression testing for web apps.</h1>\n      </div>\n      <div class=\"row justify-content-center\">\n        <p class=\"supportsBlock col-10\">\n          Supports screen rendering with <a href=\"https://chromium.googlesource.com/chromium/src/+/lkgr/headless/README.md\" class=\"chrome\">Chrome-headless.</a>\n          Add your own interactions with <a href=\"https://playwright.dev/\" class=\"chrome\">Playwright</a> and <a href=\"https://github.com/GoogleChrome/puppeteer\" class=\"chrome\">Puppeteer</a> scripting.\n        </p>\n      </div>\n      <div class=\"row justify-content-center\">\n        <p class=\"getItBlock col-10\">\n          BackstopJS was created by <a href=\"https://www.linkedin.com/in/garrisshipon/\">Garris Shipon</a> with contributions from <a href=\"https://github.com/garris/BackstopJS/graphs/contributors\">these amazing engineers 💜</a>.\n        </p>\n        <p class=\"getItBlock col-10\">\n          Opensourced under the <a href=\"https://raw.githubusercontent.com/garris/BackstopJS/master/LICENSE\">The MIT License</a>.\n        </p>\n        <p class=\"getItBlock col-10\">\n          <span class=\"cta\"><a href=\"https://github.com/garris/BackstopJS\" class=\"github-link\"><img src=\"assets/github-icon.png\" class=\"github-icon\" alt=\"Get it on GitHub\"></a></span>\n          <span class=\"cta\"><a href=\"https://github.com/garris/BackstopJS\">Get it on github!</a></span>\n        </p>\n        <p class=\"getItBlock cantSeeDis col-10\" style=\"display: none;\">\n          <img src=\"assets/github-icon.png\" class=\"github-icon\" alt=\"Get it on GitHub\">\n        </p>\n      </div>\n    </div>\n    <p id=\"noShow\" style=\"display: none;\">This is text that should not show.</p>\n    <!-- Optional JavaScript -->\n    <!-- jQuery first, then Popper.js, then Bootstrap JS -->\n    <script src=\"https://code.jquery.com/jquery-3.4.1.slim.min.js\" integrity=\"sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n\" crossorigin=\"anonymous\"></script>\n    <script src=\"https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.11.0/umd/popper.min.js\" integrity=\"sha384-b/U6ypiBEHpOf/4+1nzFpr53nxSS+GLCkfwBdFNTxtclqqenISfwAzpKaMNFNmj4\" crossorigin=\"anonymous\"></script>\n    <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/js/bootstrap.min.js\" integrity=\"sha384-h0AbiXch4ZDo7tp9hKZ4TsHbi047NrKGLO3SEJAg45jXxnGIfYzk4Si90RDIqNm1\" crossorigin=\"anonymous\"></script>\n\n  </body>\n</html>\n\n<script type=\"text/javascript\">\n  const READY_LAG_MS = 3000;\n  const READY_TAG = '_the_lemur_is_ready_to_see_you';\n  const OCTOCAT_CLASS_ACTION = 'hideOctocat';\n  const LEMUR_CLASS_ACTION = 'hideLemur';\n  const COOKIE_TEST = /cookie/i;\n  const CLICK_TEST = /click/i;\n  const DELAY_TEST = /delay/i;\n\n  if (COOKIE_TEST.test(window.location.search)) {\n    showCookies();\n  }\n  if (CLICK_TEST.test(window.location.search)) {\n    modifyLemurBehavior();\n  }\n  if (DELAY_TEST.test(window.location.search)) {\n    delayLemurification();\n  }\n\n  function modifyLemurBehavior () {\n    document.body.addEventListener('click', evt => {\n      if (evt.target.id === 'theLemur') {\n        containTheLemur();\n        evt.preventDefault();\n        setTimeout(setReadyFlags, READY_LAG_MS + 1000);\n      } else {\n        releaseTheLemur();\n      }\n    });\n    console.log('lemur behavior is modified');\n  }\n\n  function showCookies () {\n    document.getElementsByClassName('logoBlock')[0].innerText = 'cookies > ' + document.cookie;\n  }\n\n  function setReadyFlags () {\n    console.log(READY_TAG);\n    document.body.classList.add(READY_TAG);\n  }\n\n  function releaseTheLemur () {\n    document.body.classList.remove(LEMUR_CLASS_ACTION);\n  }\n\n  function containTheLemur () {\n    document.body.classList.add(LEMUR_CLASS_ACTION);\n  }\n\n  function hideOctocat () {\n    console.log('hideOctocat')\n    document.body.classList.add(OCTOCAT_CLASS_ACTION);\n  }\n\n  function showOctocat () {\n    document.body.classList.remove(OCTOCAT_CLASS_ACTION);\n  }\n\n  function delayLemurification () {\n    containTheLemur();\n    hideOctocat();\n    setTimeout(releaseTheLemur, READY_LAG_MS);\n    setTimeout(showOctocat, READY_LAG_MS);\n    setTimeout(setReadyFlags, READY_LAG_MS + 1000);\n  }\n</script>\n"
  },
  {
    "path": "old_splash_page_v2.0/css/bootstrap-theme.css",
    "content": "/*!\n * Bootstrap v3.1.1 (http://getbootstrap.com)\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, .2);\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n}\n.btn:active,\n.btn.active {\n  background-image: none;\n}\n.btn-default {\n  text-shadow: 0 1px 0 #fff;\n  background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n  background-image:         linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #dbdbdb;\n  border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n  background-color: #e0e0e0;\n  background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n  background-color: #e0e0e0;\n  border-color: #dbdbdb;\n}\n.btn-primary {\n  background-image: -webkit-linear-gradient(top, #428bca 0%, #2d6ca2 100%);\n  background-image:         linear-gradient(to bottom, #428bca 0%, #2d6ca2 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #2b669a;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n  background-color: #2d6ca2;\n  background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n  background-color: #2d6ca2;\n  border-color: #2b669a;\n}\n.btn-success {\n  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n  background-image:         linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n  background-color: #419641;\n  background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n  background-color: #419641;\n  border-color: #3e8f3e;\n}\n.btn-info {\n  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n  background-image:         linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n  background-color: #2aabd2;\n  background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n  background-color: #2aabd2;\n  border-color: #28a4c9;\n}\n.btn-warning {\n  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n  background-image:         linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n  background-color: #eb9316;\n  background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n  background-color: #eb9316;\n  border-color: #e38d13;\n}\n.btn-danger {\n  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n  background-image:         linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n  background-color: #c12e2a;\n  background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n  background-color: #c12e2a;\n  border-color: #b92c28;\n}\n.thumbnail,\n.img-thumbnail {\n  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);\n          box-shadow: 0 1px 2px rgba(0, 0, 0, .075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  background-color: #e8e8e8;\n  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n  background-image:         linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n  background-repeat: repeat-x;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  background-color: #357ebd;\n  background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%);\n  background-image:         linear-gradient(to bottom, #428bca 0%, #357ebd 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);\n  background-repeat: repeat-x;\n}\n.navbar-default {\n  background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%);\n  background-image:         linear-gradient(to bottom, #fff 0%, #f8f8f8 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);\n}\n.navbar-default .navbar-nav > .active > a {\n  background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%);\n  background-image:         linear-gradient(to bottom, #ebebeb 0%, #f3f3f3 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0);\n  background-repeat: repeat-x;\n  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n  text-shadow: 0 1px 0 rgba(255, 255, 255, .25);\n}\n.navbar-inverse {\n  background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);\n  background-image:         linear-gradient(to bottom, #3c3c3c 0%, #222 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n}\n.navbar-inverse .navbar-nav > .active > a {\n  background-image: -webkit-linear-gradient(top, #222 0%, #282828 100%);\n  background-image:         linear-gradient(to bottom, #222 0%, #282828 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0);\n  background-repeat: repeat-x;\n  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);\n          box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, .25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  border-radius: 0;\n}\n.alert {\n  text-shadow: 0 1px 0 rgba(255, 255, 255, .2);\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);\n}\n.alert-success {\n  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n  background-image:         linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n  background-repeat: repeat-x;\n  border-color: #b2dba1;\n}\n.alert-info {\n  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n  background-image:         linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n  background-repeat: repeat-x;\n  border-color: #9acfea;\n}\n.alert-warning {\n  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n  background-image:         linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n  background-repeat: repeat-x;\n  border-color: #f5e79e;\n}\n.alert-danger {\n  background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n  background-image:         linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n  background-repeat: repeat-x;\n  border-color: #dca7a7;\n}\n.progress {\n  background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n  background-image:         linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n  background-repeat: repeat-x;\n}\n.progress-bar {\n  background-image: -webkit-linear-gradient(top, #428bca 0%, #3071a9 100%);\n  background-image:         linear-gradient(to bottom, #428bca 0%, #3071a9 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0);\n  background-repeat: repeat-x;\n}\n.progress-bar-success {\n  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n  background-image:         linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n  background-repeat: repeat-x;\n}\n.progress-bar-info {\n  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n  background-image:         linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n  background-repeat: repeat-x;\n}\n.progress-bar-warning {\n  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n  background-image:         linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n  background-repeat: repeat-x;\n}\n.progress-bar-danger {\n  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n  background-image:         linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n  background-repeat: repeat-x;\n}\n.list-group {\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);\n          box-shadow: 0 1px 2px rgba(0, 0, 0, .075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  text-shadow: 0 -1px 0 #3071a9;\n  background-image: -webkit-linear-gradient(top, #428bca 0%, #3278b3 100%);\n  background-image:         linear-gradient(to bottom, #428bca 0%, #3278b3 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0);\n  background-repeat: repeat-x;\n  border-color: #3278b3;\n}\n.panel {\n  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05);\n          box-shadow: 0 1px 2px rgba(0, 0, 0, .05);\n}\n.panel-default > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n  background-image:         linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n  background-repeat: repeat-x;\n}\n.panel-primary > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%);\n  background-image:         linear-gradient(to bottom, #428bca 0%, #357ebd 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);\n  background-repeat: repeat-x;\n}\n.panel-success > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n  background-image:         linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n  background-repeat: repeat-x;\n}\n.panel-info > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n  background-image:         linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n  background-repeat: repeat-x;\n}\n.panel-warning > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n  background-image:         linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n  background-repeat: repeat-x;\n}\n.panel-danger > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n  background-image:         linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n  background-repeat: repeat-x;\n}\n.well {\n  background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n  background-image:         linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n  background-repeat: repeat-x;\n  border-color: #dcdcdc;\n  -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);\n          box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */\n"
  },
  {
    "path": "old_splash_page_v2.0/css/bootstrap.css",
    "content": "/*!\n * Bootstrap v3.1.1 (http://getbootstrap.com)\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n/*! normalize.css v3.0.0 | MIT License | git.io/normalize */\nhtml {\n  font-family: sans-serif;\n  -webkit-text-size-adjust: 100%;\n      -ms-text-size-adjust: 100%;\n}\nbody {\n  margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nnav,\nsection,\nsummary {\n  display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n  display: inline-block;\n  vertical-align: baseline;\n}\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n[hidden],\ntemplate {\n  display: none;\n}\na {\n  background: transparent;\n}\na:active,\na:hover {\n  outline: 0;\n}\nabbr[title] {\n  border-bottom: 1px dotted;\n}\nb,\nstrong {\n  font-weight: bold;\n}\ndfn {\n  font-style: italic;\n}\nh1 {\n  margin: .67em 0;\n  font-size: 2em;\n}\nmark {\n  color: #000;\n  background: #ff0;\n}\nsmall {\n  font-size: 80%;\n}\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\nsup {\n  top: -.5em;\n}\nsub {\n  bottom: -.25em;\n}\nimg {\n  border: 0;\n}\nsvg:not(:root) {\n  overflow: hidden;\n}\nfigure {\n  margin: 1em 40px;\n}\nhr {\n  height: 0;\n  -moz-box-sizing: content-box;\n       box-sizing: content-box;\n}\npre {\n  overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  margin: 0;\n  font: inherit;\n  color: inherit;\n}\nbutton {\n  overflow: visible;\n}\nbutton,\nselect {\n  text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  -webkit-appearance: button;\n  cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  padding: 0;\n  border: 0;\n}\ninput {\n  line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  box-sizing: border-box;\n  padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\ninput[type=\"search\"] {\n  -webkit-box-sizing: content-box;\n     -moz-box-sizing: content-box;\n          box-sizing: content-box;\n  -webkit-appearance: textfield;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\nfieldset {\n  padding: .35em .625em .75em;\n  margin: 0 2px;\n  border: 1px solid #c0c0c0;\n}\nlegend {\n  padding: 0;\n  border: 0;\n}\ntextarea {\n  overflow: auto;\n}\noptgroup {\n  font-weight: bold;\n}\ntable {\n  border-spacing: 0;\n  border-collapse: collapse;\n}\ntd,\nth {\n  padding: 0;\n}\n@media print {\n  * {\n    color: #000 !important;\n    text-shadow: none !important;\n    background: transparent !important;\n    box-shadow: none !important;\n  }\n  a,\n  a:visited {\n    text-decoration: underline;\n  }\n  a[href]:after {\n    content: \" (\" attr(href) \")\";\n  }\n  abbr[title]:after {\n    content: \" (\" attr(title) \")\";\n  }\n  a[href^=\"javascript:\"]:after,\n  a[href^=\"#\"]:after {\n    content: \"\";\n  }\n  pre,\n  blockquote {\n    border: 1px solid #999;\n\n    page-break-inside: avoid;\n  }\n  thead {\n    display: table-header-group;\n  }\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n  img {\n    max-width: 100% !important;\n  }\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n  select {\n    background: #fff !important;\n  }\n  .navbar {\n    display: none;\n  }\n  .table td,\n  .table th {\n    background-color: #fff !important;\n  }\n  .btn > .caret,\n  .dropup > .btn > .caret {\n    border-top-color: #000 !important;\n  }\n  .label {\n    border: 1px solid #000;\n  }\n  .table {\n    border-collapse: collapse !important;\n  }\n  .table-bordered th,\n  .table-bordered td {\n    border: 1px solid #ddd !important;\n  }\n}\n* {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n*:before,\n*:after {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\nhtml {\n  font-size: 62.5%;\n\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #333;\n  background-color: #fff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\na {\n  color: #428bca;\n  text-decoration: none;\n}\na:hover,\na:focus {\n  color: #2a6496;\n  text-decoration: underline;\n}\na:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\nfigure {\n  margin: 0;\n}\nimg {\n  vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  display: block;\n  max-width: 100%;\n  height: auto;\n}\n.img-rounded {\n  border-radius: 6px;\n}\n.img-thumbnail {\n  display: inline-block;\n  max-width: 100%;\n  height: auto;\n  padding: 4px;\n  line-height: 1.42857143;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-radius: 4px;\n  -webkit-transition: all .2s ease-in-out;\n          transition: all .2s ease-in-out;\n}\n.img-circle {\n  border-radius: 50%;\n}\nhr {\n  margin-top: 20px;\n  margin-bottom: 20px;\n  border: 0;\n  border-top: 1px solid #eee;\n}\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  border: 0;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n  font-family: inherit;\n  font-weight: 500;\n  line-height: 1.1;\n  color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n  font-weight: normal;\n  line-height: 1;\n  color: #999;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n  margin-top: 20px;\n  margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n  font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n  font-size: 75%;\n}\nh1,\n.h1 {\n  font-size: 36px;\n}\nh2,\n.h2 {\n  font-size: 30px;\n}\nh3,\n.h3 {\n  font-size: 24px;\n}\nh4,\n.h4 {\n  font-size: 18px;\n}\nh5,\n.h5 {\n  font-size: 14px;\n}\nh6,\n.h6 {\n  font-size: 12px;\n}\np {\n  margin: 0 0 10px;\n}\n.lead {\n  margin-bottom: 20px;\n  font-size: 16px;\n  font-weight: 200;\n  line-height: 1.4;\n}\n@media (min-width: 768px) {\n  .lead {\n    font-size: 21px;\n  }\n}\nsmall,\n.small {\n  font-size: 85%;\n}\ncite {\n  font-style: normal;\n}\n.text-left {\n  text-align: left;\n}\n.text-right {\n  text-align: right;\n}\n.text-center {\n  text-align: center;\n}\n.text-justify {\n  text-align: justify;\n}\n.text-muted {\n  color: #999;\n}\n.text-primary {\n  color: #428bca;\n}\na.text-primary:hover {\n  color: #3071a9;\n}\n.text-success {\n  color: #3c763d;\n}\na.text-success:hover {\n  color: #2b542c;\n}\n.text-info {\n  color: #31708f;\n}\na.text-info:hover {\n  color: #245269;\n}\n.text-warning {\n  color: #8a6d3b;\n}\na.text-warning:hover {\n  color: #66512c;\n}\n.text-danger {\n  color: #a94442;\n}\na.text-danger:hover {\n  color: #843534;\n}\n.bg-primary {\n  color: #fff;\n  background-color: #428bca;\n}\na.bg-primary:hover {\n  background-color: #3071a9;\n}\n.bg-success {\n  background-color: #dff0d8;\n}\na.bg-success:hover {\n  background-color: #c1e2b3;\n}\n.bg-info {\n  background-color: #d9edf7;\n}\na.bg-info:hover {\n  background-color: #afd9ee;\n}\n.bg-warning {\n  background-color: #fcf8e3;\n}\na.bg-warning:hover {\n  background-color: #f7ecb5;\n}\n.bg-danger {\n  background-color: #f2dede;\n}\na.bg-danger:hover {\n  background-color: #e4b9b9;\n}\n.page-header {\n  padding-bottom: 9px;\n  margin: 40px 0 20px;\n  border-bottom: 1px solid #eee;\n}\nul,\nol {\n  margin-top: 0;\n  margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n  margin-bottom: 0;\n}\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n.list-inline {\n  padding-left: 0;\n  margin-left: -5px;\n  list-style: none;\n}\n.list-inline > li {\n  display: inline-block;\n  padding-right: 5px;\n  padding-left: 5px;\n}\ndl {\n  margin-top: 0;\n  margin-bottom: 20px;\n}\ndt,\ndd {\n  line-height: 1.42857143;\n}\ndt {\n  font-weight: bold;\n}\ndd {\n  margin-left: 0;\n}\n@media (min-width: 768px) {\n  .dl-horizontal dt {\n    float: left;\n    width: 160px;\n    overflow: hidden;\n    clear: left;\n    text-align: right;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n  .dl-horizontal dd {\n    margin-left: 180px;\n  }\n}\nabbr[title],\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted #999;\n}\n.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\nblockquote {\n  padding: 10px 20px;\n  margin: 0 0 20px;\n  font-size: 17.5px;\n  border-left: 5px solid #eee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n  margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n  display: block;\n  font-size: 80%;\n  line-height: 1.42857143;\n  color: #999;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n  content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  text-align: right;\n  border-right: 5px solid #eee;\n  border-left: 0;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n  content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n  content: '\\00A0 \\2014';\n}\nblockquote:before,\nblockquote:after {\n  content: \"\";\n}\naddress {\n  margin-bottom: 20px;\n  font-style: normal;\n  line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n  font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #c7254e;\n  white-space: nowrap;\n  background-color: #f9f2f4;\n  border-radius: 4px;\n}\nkbd {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #fff;\n  background-color: #333;\n  border-radius: 3px;\n  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);\n}\npre {\n  display: block;\n  padding: 9.5px;\n  margin: 0 0 10px;\n  font-size: 13px;\n  line-height: 1.42857143;\n  color: #333;\n  word-break: break-all;\n  word-wrap: break-word;\n  background-color: #f5f5f5;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n}\npre code {\n  padding: 0;\n  font-size: inherit;\n  color: inherit;\n  white-space: pre-wrap;\n  background-color: transparent;\n  border-radius: 0;\n}\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\n.container {\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n@media (min-width: 768px) {\n  .container {\n    width: 750px;\n  }\n}\n@media (min-width: 992px) {\n  .container {\n    width: 970px;\n  }\n}\n@media (min-width: 1200px) {\n  .container {\n    width: 1170px;\n  }\n}\n.container-fluid {\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n.row {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n  position: relative;\n  min-height: 1px;\n  padding-right: 15px;\n  padding-left: 15px;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n  float: left;\n}\n.col-xs-12 {\n  width: 100%;\n}\n.col-xs-11 {\n  width: 91.66666667%;\n}\n.col-xs-10 {\n  width: 83.33333333%;\n}\n.col-xs-9 {\n  width: 75%;\n}\n.col-xs-8 {\n  width: 66.66666667%;\n}\n.col-xs-7 {\n  width: 58.33333333%;\n}\n.col-xs-6 {\n  width: 50%;\n}\n.col-xs-5 {\n  width: 41.66666667%;\n}\n.col-xs-4 {\n  width: 33.33333333%;\n}\n.col-xs-3 {\n  width: 25%;\n}\n.col-xs-2 {\n  width: 16.66666667%;\n}\n.col-xs-1 {\n  width: 8.33333333%;\n}\n.col-xs-pull-12 {\n  right: 100%;\n}\n.col-xs-pull-11 {\n  right: 91.66666667%;\n}\n.col-xs-pull-10 {\n  right: 83.33333333%;\n}\n.col-xs-pull-9 {\n  right: 75%;\n}\n.col-xs-pull-8 {\n  right: 66.66666667%;\n}\n.col-xs-pull-7 {\n  right: 58.33333333%;\n}\n.col-xs-pull-6 {\n  right: 50%;\n}\n.col-xs-pull-5 {\n  right: 41.66666667%;\n}\n.col-xs-pull-4 {\n  right: 33.33333333%;\n}\n.col-xs-pull-3 {\n  right: 25%;\n}\n.col-xs-pull-2 {\n  right: 16.66666667%;\n}\n.col-xs-pull-1 {\n  right: 8.33333333%;\n}\n.col-xs-pull-0 {\n  right: 0;\n}\n.col-xs-push-12 {\n  left: 100%;\n}\n.col-xs-push-11 {\n  left: 91.66666667%;\n}\n.col-xs-push-10 {\n  left: 83.33333333%;\n}\n.col-xs-push-9 {\n  left: 75%;\n}\n.col-xs-push-8 {\n  left: 66.66666667%;\n}\n.col-xs-push-7 {\n  left: 58.33333333%;\n}\n.col-xs-push-6 {\n  left: 50%;\n}\n.col-xs-push-5 {\n  left: 41.66666667%;\n}\n.col-xs-push-4 {\n  left: 33.33333333%;\n}\n.col-xs-push-3 {\n  left: 25%;\n}\n.col-xs-push-2 {\n  left: 16.66666667%;\n}\n.col-xs-push-1 {\n  left: 8.33333333%;\n}\n.col-xs-push-0 {\n  left: 0;\n}\n.col-xs-offset-12 {\n  margin-left: 100%;\n}\n.col-xs-offset-11 {\n  margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n  margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n  margin-left: 75%;\n}\n.col-xs-offset-8 {\n  margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n  margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n  margin-left: 50%;\n}\n.col-xs-offset-5 {\n  margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n  margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n  margin-left: 25%;\n}\n.col-xs-offset-2 {\n  margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n  margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n  margin-left: 0;\n}\n@media (min-width: 768px) {\n  .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n    float: left;\n  }\n  .col-sm-12 {\n    width: 100%;\n  }\n  .col-sm-11 {\n    width: 91.66666667%;\n  }\n  .col-sm-10 {\n    width: 83.33333333%;\n  }\n  .col-sm-9 {\n    width: 75%;\n  }\n  .col-sm-8 {\n    width: 66.66666667%;\n  }\n  .col-sm-7 {\n    width: 58.33333333%;\n  }\n  .col-sm-6 {\n    width: 50%;\n  }\n  .col-sm-5 {\n    width: 41.66666667%;\n  }\n  .col-sm-4 {\n    width: 33.33333333%;\n  }\n  .col-sm-3 {\n    width: 25%;\n  }\n  .col-sm-2 {\n    width: 16.66666667%;\n  }\n  .col-sm-1 {\n    width: 8.33333333%;\n  }\n  .col-sm-pull-12 {\n    right: 100%;\n  }\n  .col-sm-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-sm-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-sm-pull-9 {\n    right: 75%;\n  }\n  .col-sm-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-sm-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-sm-pull-6 {\n    right: 50%;\n  }\n  .col-sm-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-sm-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-sm-pull-3 {\n    right: 25%;\n  }\n  .col-sm-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-sm-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-sm-pull-0 {\n    right: 0;\n  }\n  .col-sm-push-12 {\n    left: 100%;\n  }\n  .col-sm-push-11 {\n    left: 91.66666667%;\n  }\n  .col-sm-push-10 {\n    left: 83.33333333%;\n  }\n  .col-sm-push-9 {\n    left: 75%;\n  }\n  .col-sm-push-8 {\n    left: 66.66666667%;\n  }\n  .col-sm-push-7 {\n    left: 58.33333333%;\n  }\n  .col-sm-push-6 {\n    left: 50%;\n  }\n  .col-sm-push-5 {\n    left: 41.66666667%;\n  }\n  .col-sm-push-4 {\n    left: 33.33333333%;\n  }\n  .col-sm-push-3 {\n    left: 25%;\n  }\n  .col-sm-push-2 {\n    left: 16.66666667%;\n  }\n  .col-sm-push-1 {\n    left: 8.33333333%;\n  }\n  .col-sm-push-0 {\n    left: 0;\n  }\n  .col-sm-offset-12 {\n    margin-left: 100%;\n  }\n  .col-sm-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-sm-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-sm-offset-9 {\n    margin-left: 75%;\n  }\n  .col-sm-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-sm-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-sm-offset-6 {\n    margin-left: 50%;\n  }\n  .col-sm-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-sm-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-sm-offset-3 {\n    margin-left: 25%;\n  }\n  .col-sm-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-sm-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-sm-offset-0 {\n    margin-left: 0;\n  }\n}\n@media (min-width: 992px) {\n  .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n    float: left;\n  }\n  .col-md-12 {\n    width: 100%;\n  }\n  .col-md-11 {\n    width: 91.66666667%;\n  }\n  .col-md-10 {\n    width: 83.33333333%;\n  }\n  .col-md-9 {\n    width: 75%;\n  }\n  .col-md-8 {\n    width: 66.66666667%;\n  }\n  .col-md-7 {\n    width: 58.33333333%;\n  }\n  .col-md-6 {\n    width: 50%;\n  }\n  .col-md-5 {\n    width: 41.66666667%;\n  }\n  .col-md-4 {\n    width: 33.33333333%;\n  }\n  .col-md-3 {\n    width: 25%;\n  }\n  .col-md-2 {\n    width: 16.66666667%;\n  }\n  .col-md-1 {\n    width: 8.33333333%;\n  }\n  .col-md-pull-12 {\n    right: 100%;\n  }\n  .col-md-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-md-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-md-pull-9 {\n    right: 75%;\n  }\n  .col-md-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-md-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-md-pull-6 {\n    right: 50%;\n  }\n  .col-md-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-md-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-md-pull-3 {\n    right: 25%;\n  }\n  .col-md-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-md-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-md-pull-0 {\n    right: 0;\n  }\n  .col-md-push-12 {\n    left: 100%;\n  }\n  .col-md-push-11 {\n    left: 91.66666667%;\n  }\n  .col-md-push-10 {\n    left: 83.33333333%;\n  }\n  .col-md-push-9 {\n    left: 75%;\n  }\n  .col-md-push-8 {\n    left: 66.66666667%;\n  }\n  .col-md-push-7 {\n    left: 58.33333333%;\n  }\n  .col-md-push-6 {\n    left: 50%;\n  }\n  .col-md-push-5 {\n    left: 41.66666667%;\n  }\n  .col-md-push-4 {\n    left: 33.33333333%;\n  }\n  .col-md-push-3 {\n    left: 25%;\n  }\n  .col-md-push-2 {\n    left: 16.66666667%;\n  }\n  .col-md-push-1 {\n    left: 8.33333333%;\n  }\n  .col-md-push-0 {\n    left: 0;\n  }\n  .col-md-offset-12 {\n    margin-left: 100%;\n  }\n  .col-md-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-md-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-md-offset-9 {\n    margin-left: 75%;\n  }\n  .col-md-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-md-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-md-offset-6 {\n    margin-left: 50%;\n  }\n  .col-md-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-md-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-md-offset-3 {\n    margin-left: 25%;\n  }\n  .col-md-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-md-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-md-offset-0 {\n    margin-left: 0;\n  }\n}\n@media (min-width: 1200px) {\n  .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n    float: left;\n  }\n  .col-lg-12 {\n    width: 100%;\n  }\n  .col-lg-11 {\n    width: 91.66666667%;\n  }\n  .col-lg-10 {\n    width: 83.33333333%;\n  }\n  .col-lg-9 {\n    width: 75%;\n  }\n  .col-lg-8 {\n    width: 66.66666667%;\n  }\n  .col-lg-7 {\n    width: 58.33333333%;\n  }\n  .col-lg-6 {\n    width: 50%;\n  }\n  .col-lg-5 {\n    width: 41.66666667%;\n  }\n  .col-lg-4 {\n    width: 33.33333333%;\n  }\n  .col-lg-3 {\n    width: 25%;\n  }\n  .col-lg-2 {\n    width: 16.66666667%;\n  }\n  .col-lg-1 {\n    width: 8.33333333%;\n  }\n  .col-lg-pull-12 {\n    right: 100%;\n  }\n  .col-lg-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-lg-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-lg-pull-9 {\n    right: 75%;\n  }\n  .col-lg-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-lg-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-lg-pull-6 {\n    right: 50%;\n  }\n  .col-lg-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-lg-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-lg-pull-3 {\n    right: 25%;\n  }\n  .col-lg-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-lg-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-lg-pull-0 {\n    right: 0;\n  }\n  .col-lg-push-12 {\n    left: 100%;\n  }\n  .col-lg-push-11 {\n    left: 91.66666667%;\n  }\n  .col-lg-push-10 {\n    left: 83.33333333%;\n  }\n  .col-lg-push-9 {\n    left: 75%;\n  }\n  .col-lg-push-8 {\n    left: 66.66666667%;\n  }\n  .col-lg-push-7 {\n    left: 58.33333333%;\n  }\n  .col-lg-push-6 {\n    left: 50%;\n  }\n  .col-lg-push-5 {\n    left: 41.66666667%;\n  }\n  .col-lg-push-4 {\n    left: 33.33333333%;\n  }\n  .col-lg-push-3 {\n    left: 25%;\n  }\n  .col-lg-push-2 {\n    left: 16.66666667%;\n  }\n  .col-lg-push-1 {\n    left: 8.33333333%;\n  }\n  .col-lg-push-0 {\n    left: 0;\n  }\n  .col-lg-offset-12 {\n    margin-left: 100%;\n  }\n  .col-lg-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-lg-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-lg-offset-9 {\n    margin-left: 75%;\n  }\n  .col-lg-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-lg-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-lg-offset-6 {\n    margin-left: 50%;\n  }\n  .col-lg-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-lg-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-lg-offset-3 {\n    margin-left: 25%;\n  }\n  .col-lg-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-lg-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-lg-offset-0 {\n    margin-left: 0;\n  }\n}\ntable {\n  max-width: 100%;\n  background-color: transparent;\n}\nth {\n  text-align: left;\n}\n.table {\n  width: 100%;\n  margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n  padding: 8px;\n  line-height: 1.42857143;\n  vertical-align: top;\n  border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n  vertical-align: bottom;\n  border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n  border-top: 0;\n}\n.table > tbody + tbody {\n  border-top: 2px solid #ddd;\n}\n.table .table {\n  background-color: #fff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n  padding: 5px;\n}\n.table-bordered {\n  border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n  border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n  border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-child(odd) > td,\n.table-striped > tbody > tr:nth-child(odd) > th {\n  background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover > td,\n.table-hover > tbody > tr:hover > th {\n  background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n  position: static;\n  display: table-column;\n  float: none;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n  position: static;\n  display: table-cell;\n  float: none;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n  background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr.active:hover > th {\n  background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n  background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr.success:hover > th {\n  background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n  background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr.info:hover > th {\n  background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n  background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr.warning:hover > th {\n  background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n  background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr.danger:hover > th {\n  background-color: #ebcccc;\n}\n@media (max-width: 767px) {\n  .table-responsive {\n    width: 100%;\n    margin-bottom: 15px;\n    overflow-x: scroll;\n    overflow-y: hidden;\n    -webkit-overflow-scrolling: touch;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    border: 1px solid #ddd;\n  }\n  .table-responsive > .table {\n    margin-bottom: 0;\n  }\n  .table-responsive > .table > thead > tr > th,\n  .table-responsive > .table > tbody > tr > th,\n  .table-responsive > .table > tfoot > tr > th,\n  .table-responsive > .table > thead > tr > td,\n  .table-responsive > .table > tbody > tr > td,\n  .table-responsive > .table > tfoot > tr > td {\n    white-space: nowrap;\n  }\n  .table-responsive > .table-bordered {\n    border: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:first-child,\n  .table-responsive > .table-bordered > tbody > tr > th:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n  .table-responsive > .table-bordered > thead > tr > td:first-child,\n  .table-responsive > .table-bordered > tbody > tr > td:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n    border-left: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:last-child,\n  .table-responsive > .table-bordered > tbody > tr > th:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n  .table-responsive > .table-bordered > thead > tr > td:last-child,\n  .table-responsive > .table-bordered > tbody > tr > td:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n    border-right: 0;\n  }\n  .table-responsive > .table-bordered > tbody > tr:last-child > th,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n  .table-responsive > .table-bordered > tbody > tr:last-child > td,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n    border-bottom: 0;\n  }\n}\nfieldset {\n  min-width: 0;\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 20px;\n  font-size: 21px;\n  line-height: inherit;\n  color: #333;\n  border: 0;\n  border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n  display: inline-block;\n  margin-bottom: 5px;\n  font-weight: bold;\n}\ninput[type=\"search\"] {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9;\n  /* IE8-9 */\n  line-height: normal;\n}\ninput[type=\"file\"] {\n  display: block;\n}\ninput[type=\"range\"] {\n  display: block;\n  width: 100%;\n}\nselect[multiple],\nselect[size] {\n  height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\noutput {\n  display: block;\n  padding-top: 7px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #555;\n}\n.form-control {\n  display: block;\n  width: 100%;\n  height: 34px;\n  padding: 6px 12px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #555;\n  background-color: #fff;\n  background-image: none;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n  -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n          transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n  border-color: #66afe9;\n  outline: 0;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);\n          box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);\n}\n.form-control::-moz-placeholder {\n  color: #999;\n  opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n  color: #999;\n}\n.form-control::-webkit-input-placeholder {\n  color: #999;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n  cursor: not-allowed;\n  background-color: #eee;\n  opacity: 1;\n}\ntextarea.form-control {\n  height: auto;\n}\ninput[type=\"search\"] {\n  -webkit-appearance: none;\n}\ninput[type=\"date\"] {\n  line-height: 34px;\n}\n.form-group {\n  margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n  display: block;\n  min-height: 20px;\n  padding-left: 20px;\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n  display: inline;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  float: left;\n  margin-left: -20px;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  font-weight: normal;\n  vertical-align: middle;\n  cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\n.radio[disabled],\n.radio-inline[disabled],\n.checkbox[disabled],\n.checkbox-inline[disabled],\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"],\nfieldset[disabled] .radio,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox,\nfieldset[disabled] .checkbox-inline {\n  cursor: not-allowed;\n}\n.input-sm {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\nselect.input-sm {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n  height: auto;\n}\n.input-lg {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\nselect.input-lg {\n  height: 46px;\n  line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n  height: auto;\n}\n.has-feedback {\n  position: relative;\n}\n.has-feedback .form-control {\n  padding-right: 42.5px;\n}\n.has-feedback .form-control-feedback {\n  position: absolute;\n  top: 25px;\n  right: 0;\n  display: block;\n  width: 34px;\n  height: 34px;\n  line-height: 34px;\n  text-align: center;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline {\n  color: #3c763d;\n}\n.has-success .form-control {\n  border-color: #3c763d;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-success .form-control:focus {\n  border-color: #2b542c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #3c763d;\n}\n.has-success .form-control-feedback {\n  color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline {\n  color: #8a6d3b;\n}\n.has-warning .form-control {\n  border-color: #8a6d3b;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-warning .form-control:focus {\n  border-color: #66512c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #8a6d3b;\n}\n.has-warning .form-control-feedback {\n  color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline {\n  color: #a94442;\n}\n.has-error .form-control {\n  border-color: #a94442;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-error .form-control:focus {\n  border-color: #843534;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #a94442;\n}\n.has-error .form-control-feedback {\n  color: #a94442;\n}\n.form-control-static {\n  margin-bottom: 0;\n}\n.help-block {\n  display: block;\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: #737373;\n}\n@media (min-width: 768px) {\n  .form-inline .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .form-inline .input-group > .form-control {\n    width: 100%;\n  }\n  .form-inline .control-label {\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .radio,\n  .form-inline .checkbox {\n    display: inline-block;\n    padding-left: 0;\n    margin-top: 0;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .radio input[type=\"radio\"],\n  .form-inline .checkbox input[type=\"checkbox\"] {\n    float: none;\n    margin-left: 0;\n  }\n  .form-inline .has-feedback .form-control-feedback {\n    top: 0;\n  }\n}\n.form-horizontal .control-label,\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n  padding-top: 7px;\n  margin-top: 0;\n  margin-bottom: 0;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n  min-height: 27px;\n}\n.form-horizontal .form-group {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n.form-horizontal .form-control-static {\n  padding-top: 7px;\n}\n@media (min-width: 768px) {\n  .form-horizontal .control-label {\n    text-align: right;\n  }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n  top: 0;\n  right: 15px;\n}\n.btn {\n  display: inline-block;\n  padding: 6px 12px;\n  margin-bottom: 0;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1.42857143;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: middle;\n  cursor: pointer;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus {\n  color: #333;\n  text-decoration: none;\n}\n.btn:active,\n.btn.active {\n  background-image: none;\n  outline: 0;\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n  pointer-events: none;\n  cursor: not-allowed;\n  filter: alpha(opacity=65);\n  -webkit-box-shadow: none;\n          box-shadow: none;\n  opacity: .65;\n}\n.btn-default {\n  color: #333;\n  background-color: #fff;\n  border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus,\n.btn-default:active,\n.btn-default.active,\n.open .dropdown-toggle.btn-default {\n  color: #333;\n  background-color: #ebebeb;\n  border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open .dropdown-toggle.btn-default {\n  background-image: none;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n  background-color: #fff;\n  border-color: #ccc;\n}\n.btn-default .badge {\n  color: #fff;\n  background-color: #333;\n}\n.btn-primary {\n  color: #fff;\n  background-color: #428bca;\n  border-color: #357ebd;\n}\n.btn-primary:hover,\n.btn-primary:focus,\n.btn-primary:active,\n.btn-primary.active,\n.open .dropdown-toggle.btn-primary {\n  color: #fff;\n  background-color: #3276b1;\n  border-color: #285e8e;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open .dropdown-toggle.btn-primary {\n  background-image: none;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n  background-color: #428bca;\n  border-color: #357ebd;\n}\n.btn-primary .badge {\n  color: #428bca;\n  background-color: #fff;\n}\n.btn-success {\n  color: #fff;\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n.btn-success:hover,\n.btn-success:focus,\n.btn-success:active,\n.btn-success.active,\n.open .dropdown-toggle.btn-success {\n  color: #fff;\n  background-color: #47a447;\n  border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open .dropdown-toggle.btn-success {\n  background-image: none;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n.btn-success .badge {\n  color: #5cb85c;\n  background-color: #fff;\n}\n.btn-info {\n  color: #fff;\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n.btn-info:hover,\n.btn-info:focus,\n.btn-info:active,\n.btn-info.active,\n.open .dropdown-toggle.btn-info {\n  color: #fff;\n  background-color: #39b3d7;\n  border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open .dropdown-toggle.btn-info {\n  background-image: none;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n.btn-info .badge {\n  color: #5bc0de;\n  background-color: #fff;\n}\n.btn-warning {\n  color: #fff;\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n.btn-warning:hover,\n.btn-warning:focus,\n.btn-warning:active,\n.btn-warning.active,\n.open .dropdown-toggle.btn-warning {\n  color: #fff;\n  background-color: #ed9c28;\n  border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open .dropdown-toggle.btn-warning {\n  background-image: none;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n.btn-warning .badge {\n  color: #f0ad4e;\n  background-color: #fff;\n}\n.btn-danger {\n  color: #fff;\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n.btn-danger:hover,\n.btn-danger:focus,\n.btn-danger:active,\n.btn-danger.active,\n.open .dropdown-toggle.btn-danger {\n  color: #fff;\n  background-color: #d2322d;\n  border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open .dropdown-toggle.btn-danger {\n  background-image: none;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n.btn-danger .badge {\n  color: #d9534f;\n  background-color: #fff;\n}\n.btn-link {\n  font-weight: normal;\n  color: #428bca;\n  cursor: pointer;\n  border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n  background-color: transparent;\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n  border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n  color: #2a6496;\n  text-decoration: underline;\n  background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n  color: #999;\n  text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n  padding: 1px 5px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.btn-block {\n  display: block;\n  width: 100%;\n  padding-right: 0;\n  padding-left: 0;\n}\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n.fade {\n  opacity: 0;\n  -webkit-transition: opacity .15s linear;\n          transition: opacity .15s linear;\n}\n.fade.in {\n  opacity: 1;\n}\n.collapse {\n  display: none;\n}\n.collapse.in {\n  display: block;\n}\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  -webkit-transition: height .35s ease;\n          transition: height .35s ease;\n}\n@font-face {\n  font-family: 'Glyphicons Halflings';\n\n  src: url('../fonts/glyphicons-halflings-regular.eot');\n  src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), 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');\n}\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n  content: \"\\2a\";\n}\n.glyphicon-plus:before {\n  content: \"\\2b\";\n}\n.glyphicon-euro:before {\n  content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n  content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n  content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n  content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n  content: \"\\270f\";\n}\n.glyphicon-glass:before {\n  content: \"\\e001\";\n}\n.glyphicon-music:before {\n  content: \"\\e002\";\n}\n.glyphicon-search:before {\n  content: \"\\e003\";\n}\n.glyphicon-heart:before {\n  content: \"\\e005\";\n}\n.glyphicon-star:before {\n  content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n  content: \"\\e007\";\n}\n.glyphicon-user:before {\n  content: \"\\e008\";\n}\n.glyphicon-film:before {\n  content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n  content: \"\\e010\";\n}\n.glyphicon-th:before {\n  content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n  content: \"\\e012\";\n}\n.glyphicon-ok:before {\n  content: \"\\e013\";\n}\n.glyphicon-remove:before {\n  content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n  content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n  content: \"\\e016\";\n}\n.glyphicon-off:before {\n  content: \"\\e017\";\n}\n.glyphicon-signal:before {\n  content: \"\\e018\";\n}\n.glyphicon-cog:before {\n  content: \"\\e019\";\n}\n.glyphicon-trash:before {\n  content: \"\\e020\";\n}\n.glyphicon-home:before {\n  content: \"\\e021\";\n}\n.glyphicon-file:before {\n  content: \"\\e022\";\n}\n.glyphicon-time:before {\n  content: \"\\e023\";\n}\n.glyphicon-road:before {\n  content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n  content: \"\\e025\";\n}\n.glyphicon-download:before {\n  content: \"\\e026\";\n}\n.glyphicon-upload:before {\n  content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n  content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n  content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n  content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n  content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n  content: \"\\e032\";\n}\n.glyphicon-lock:before {\n  content: \"\\e033\";\n}\n.glyphicon-flag:before {\n  content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n  content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n  content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n  content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n  content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n  content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n  content: \"\\e040\";\n}\n.glyphicon-tag:before {\n  content: \"\\e041\";\n}\n.glyphicon-tags:before {\n  content: \"\\e042\";\n}\n.glyphicon-book:before {\n  content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n  content: \"\\e044\";\n}\n.glyphicon-print:before {\n  content: \"\\e045\";\n}\n.glyphicon-camera:before {\n  content: \"\\e046\";\n}\n.glyphicon-font:before {\n  content: \"\\e047\";\n}\n.glyphicon-bold:before {\n  content: \"\\e048\";\n}\n.glyphicon-italic:before {\n  content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n  content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n  content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n  content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n  content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n  content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n  content: \"\\e055\";\n}\n.glyphicon-list:before {\n  content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n  content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n  content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n  content: \"\\e059\";\n}\n.glyphicon-picture:before {\n  content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n  content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n  content: \"\\e063\";\n}\n.glyphicon-tint:before {\n  content: \"\\e064\";\n}\n.glyphicon-edit:before {\n  content: \"\\e065\";\n}\n.glyphicon-share:before {\n  content: \"\\e066\";\n}\n.glyphicon-check:before {\n  content: \"\\e067\";\n}\n.glyphicon-move:before {\n  content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n  content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n  content: \"\\e070\";\n}\n.glyphicon-backward:before {\n  content: \"\\e071\";\n}\n.glyphicon-play:before {\n  content: \"\\e072\";\n}\n.glyphicon-pause:before {\n  content: \"\\e073\";\n}\n.glyphicon-stop:before {\n  content: \"\\e074\";\n}\n.glyphicon-forward:before {\n  content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n  content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n  content: \"\\e077\";\n}\n.glyphicon-eject:before {\n  content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n  content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n  content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n  content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n  content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n  content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n  content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n  content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n  content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n  content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n  content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n  content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n  content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n  content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n  content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n  content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n  content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n  content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n  content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n  content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n  content: \"\\e101\";\n}\n.glyphicon-gift:before {\n  content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n  content: \"\\e103\";\n}\n.glyphicon-fire:before {\n  content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n  content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n  content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n  content: \"\\e107\";\n}\n.glyphicon-plane:before {\n  content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n  content: \"\\e109\";\n}\n.glyphicon-random:before {\n  content: \"\\e110\";\n}\n.glyphicon-comment:before {\n  content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n  content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n  content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n  content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n  content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n  content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n  content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n  content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n  content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n  content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n  content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n  content: \"\\e122\";\n}\n.glyphicon-bell:before {\n  content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n  content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n  content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n  content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n  content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n  content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n  content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n  content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n  content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n  content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n  content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n  content: \"\\e134\";\n}\n.glyphicon-globe:before {\n  content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n  content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n  content: \"\\e137\";\n}\n.glyphicon-filter:before {\n  content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n  content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n  content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n  content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n  content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n  content: \"\\e143\";\n}\n.glyphicon-link:before {\n  content: \"\\e144\";\n}\n.glyphicon-phone:before {\n  content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n  content: \"\\e146\";\n}\n.glyphicon-usd:before {\n  content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n  content: \"\\e149\";\n}\n.glyphicon-sort:before {\n  content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n  content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n  content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n  content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n  content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n  content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n  content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n  content: \"\\e157\";\n}\n.glyphicon-expand:before {\n  content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n  content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n  content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n  content: \"\\e161\";\n}\n.glyphicon-flash:before {\n  content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n  content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n  content: \"\\e164\";\n}\n.glyphicon-record:before {\n  content: \"\\e165\";\n}\n.glyphicon-save:before {\n  content: \"\\e166\";\n}\n.glyphicon-open:before {\n  content: \"\\e167\";\n}\n.glyphicon-saved:before {\n  content: \"\\e168\";\n}\n.glyphicon-import:before {\n  content: \"\\e169\";\n}\n.glyphicon-export:before {\n  content: \"\\e170\";\n}\n.glyphicon-send:before {\n  content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n  content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n  content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n  content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n  content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n  content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n  content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n  content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n  content: \"\\e179\";\n}\n.glyphicon-header:before {\n  content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n  content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n  content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n  content: \"\\e183\";\n}\n.glyphicon-tower:before {\n  content: \"\\e184\";\n}\n.glyphicon-stats:before {\n  content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n  content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n  content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n  content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n  content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n  content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n  content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n  content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n  content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n  content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n  content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n  content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n  content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n  content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n  content: \"\\e200\";\n}\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top: 4px solid;\n  border-right: 4px solid transparent;\n  border-left: 4px solid transparent;\n}\n.dropdown {\n  position: relative;\n}\n.dropdown-toggle:focus {\n  outline: 0;\n}\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0;\n  font-size: 14px;\n  list-style: none;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, .15);\n  border-radius: 4px;\n  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);\n          box-shadow: 0 6px 12px rgba(0, 0, 0, .175);\n}\n.dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n.dropdown-menu .divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n  display: block;\n  padding: 3px 20px;\n  clear: both;\n  font-weight: normal;\n  line-height: 1.42857143;\n  color: #333;\n  white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  color: #262626;\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  color: #fff;\n  text-decoration: none;\n  background-color: #428bca;\n  outline: 0;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  color: #999;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n  background-image: none;\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.open > .dropdown-menu {\n  display: block;\n}\n.open > a {\n  outline: 0;\n}\n.dropdown-menu-right {\n  right: 0;\n  left: auto;\n}\n.dropdown-menu-left {\n  right: auto;\n  left: 0;\n}\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: 12px;\n  line-height: 1.42857143;\n  color: #999;\n}\n.dropdown-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 990;\n}\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n  content: \"\";\n  border-top: 0;\n  border-bottom: 4px solid;\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-bottom: 1px;\n}\n@media (min-width: 768px) {\n  .navbar-right .dropdown-menu {\n    right: 0;\n    left: auto;\n  }\n  .navbar-right .dropdown-menu-left {\n    right: auto;\n    left: 0;\n  }\n}\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n  position: relative;\n  float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n  z-index: 2;\n}\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus {\n  outline: none;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n  margin-left: -1px;\n}\n.btn-toolbar {\n  margin-left: -5px;\n}\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n  float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n  margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n.btn-group > .btn:first-child {\n  margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group > .btn-group {\n  float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group > .btn-group:first-child > .btn:last-child,\n.btn-group > .btn-group:first-child > .dropdown-toggle {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.btn-group > .btn-group:last-child > .btn:first-child {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n  padding-right: 8px;\n  padding-left: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-right: 12px;\n  padding-left: 12px;\n}\n.btn-group.open .dropdown-toggle {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n.btn .caret {\n  margin-left: 0;\n}\n.btn-lg .caret {\n  border-width: 5px 5px 0;\n  border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n  border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n  display: block;\n  float: none;\n  width: 100%;\n  max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n  float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n  margin-top: -1px;\n  margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n  border-bottom-left-radius: 4px;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  table-layout: fixed;\n  border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n  display: table-cell;\n  float: none;\n  width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n  width: 100%;\n}\n[data-toggle=\"buttons\"] > .btn > input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn > input[type=\"checkbox\"] {\n  display: none;\n}\n.input-group {\n  position: relative;\n  display: table;\n  border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n  float: none;\n  padding-right: 0;\n  padding-left: 0;\n}\n.input-group .form-control {\n  position: relative;\n  z-index: 2;\n  float: left;\n  width: 100%;\n  margin-bottom: 0;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n  height: 46px;\n  line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n  height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n  height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle;\n}\n.input-group-addon {\n  padding: 6px 12px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1;\n  color: #555;\n  text-align: center;\n  background-color: #eee;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n}\n.input-group-addon.input-sm {\n  padding: 5px 10px;\n  font-size: 12px;\n  border-radius: 3px;\n}\n.input-group-addon.input-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n  margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.input-group-addon:first-child {\n  border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.input-group-addon:last-child {\n  border-left: 0;\n}\n.input-group-btn {\n  position: relative;\n  font-size: 0;\n  white-space: nowrap;\n}\n.input-group-btn > .btn {\n  position: relative;\n}\n.input-group-btn > .btn + .btn {\n  margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n  z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n  margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n  margin-left: -1px;\n}\n.nav {\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n.nav > li {\n  position: relative;\n  display: block;\n}\n.nav > li > a {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n  text-decoration: none;\n  background-color: #eee;\n}\n.nav > li.disabled > a {\n  color: #999;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n  color: #999;\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n  background-color: #eee;\n  border-color: #428bca;\n}\n.nav .nav-divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n.nav > li > a > img {\n  max-width: none;\n}\n.nav-tabs {\n  border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n  float: left;\n  margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n  margin-right: 2px;\n  line-height: 1.42857143;\n  border: 1px solid transparent;\n  border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n  border-color: #eee #eee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n  color: #555;\n  cursor: default;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-bottom-color: transparent;\n}\n.nav-tabs.nav-justified {\n  width: 100%;\n  border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n  float: none;\n}\n.nav-tabs.nav-justified > li > a {\n  margin-bottom: 5px;\n  text-align: center;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n  .nav-tabs.nav-justified > li > a {\n    margin-bottom: 0;\n  }\n}\n.nav-tabs.nav-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n  border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li > a {\n    border-bottom: 1px solid #ddd;\n    border-radius: 4px 4px 0 0;\n  }\n  .nav-tabs.nav-justified > .active > a,\n  .nav-tabs.nav-justified > .active > a:hover,\n  .nav-tabs.nav-justified > .active > a:focus {\n    border-bottom-color: #fff;\n  }\n}\n.nav-pills > li {\n  float: left;\n}\n.nav-pills > li > a {\n  border-radius: 4px;\n}\n.nav-pills > li + li {\n  margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n  color: #fff;\n  background-color: #428bca;\n}\n.nav-stacked > li {\n  float: none;\n}\n.nav-stacked > li + li {\n  margin-top: 2px;\n  margin-left: 0;\n}\n.nav-justified {\n  width: 100%;\n}\n.nav-justified > li {\n  float: none;\n}\n.nav-justified > li > a {\n  margin-bottom: 5px;\n  text-align: center;\n}\n.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\n@media (min-width: 768px) {\n  .nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n  .nav-justified > li > a {\n    margin-bottom: 0;\n  }\n}\n.nav-tabs-justified {\n  border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n  border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n  .nav-tabs-justified > li > a {\n    border-bottom: 1px solid #ddd;\n    border-radius: 4px 4px 0 0;\n  }\n  .nav-tabs-justified > .active > a,\n  .nav-tabs-justified > .active > a:hover,\n  .nav-tabs-justified > .active > a:focus {\n    border-bottom-color: #fff;\n  }\n}\n.tab-content > .tab-pane {\n  display: none;\n}\n.tab-content > .active {\n  display: block;\n}\n.nav-tabs .dropdown-menu {\n  margin-top: -1px;\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.navbar {\n  position: relative;\n  min-height: 50px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n  .navbar {\n    border-radius: 4px;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-header {\n    float: left;\n  }\n}\n.navbar-collapse {\n  max-height: 340px;\n  padding-right: 15px;\n  padding-left: 15px;\n  overflow-x: visible;\n  -webkit-overflow-scrolling: touch;\n  border-top: 1px solid transparent;\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);\n}\n.navbar-collapse.in {\n  overflow-y: auto;\n}\n@media (min-width: 768px) {\n  .navbar-collapse {\n    width: auto;\n    border-top: 0;\n    box-shadow: none;\n  }\n  .navbar-collapse.collapse {\n    display: block !important;\n    height: auto !important;\n    padding-bottom: 0;\n    overflow: visible !important;\n  }\n  .navbar-collapse.in {\n    overflow-y: visible;\n  }\n  .navbar-fixed-top .navbar-collapse,\n  .navbar-static-top .navbar-collapse,\n  .navbar-fixed-bottom .navbar-collapse {\n    padding-right: 0;\n    padding-left: 0;\n  }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n@media (min-width: 768px) {\n  .container > .navbar-header,\n  .container-fluid > .navbar-header,\n  .container > .navbar-collapse,\n  .container-fluid > .navbar-collapse {\n    margin-right: 0;\n    margin-left: 0;\n  }\n}\n.navbar-static-top {\n  z-index: 1000;\n  border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n  .navbar-static-top {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: 1030;\n}\n@media (min-width: 768px) {\n  .navbar-fixed-top,\n  .navbar-fixed-bottom {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top {\n  top: 0;\n  border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0;\n  border-width: 1px 0 0;\n}\n.navbar-brand {\n  float: left;\n  height: 50px;\n  padding: 15px 15px;\n  font-size: 18px;\n  line-height: 20px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n  text-decoration: none;\n}\n@media (min-width: 768px) {\n  .navbar > .container .navbar-brand,\n  .navbar > .container-fluid .navbar-brand {\n    margin-left: -15px;\n  }\n}\n.navbar-toggle {\n  position: relative;\n  float: right;\n  padding: 9px 10px;\n  margin-top: 8px;\n  margin-right: 15px;\n  margin-bottom: 8px;\n  background-color: transparent;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.navbar-toggle:focus {\n  outline: none;\n}\n.navbar-toggle .icon-bar {\n  display: block;\n  width: 22px;\n  height: 2px;\n  border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n  margin-top: 4px;\n}\n@media (min-width: 768px) {\n  .navbar-toggle {\n    display: none;\n  }\n}\n.navbar-nav {\n  margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n  padding-top: 10px;\n  padding-bottom: 10px;\n  line-height: 20px;\n}\n@media (max-width: 767px) {\n  .navbar-nav .open .dropdown-menu {\n    position: static;\n    float: none;\n    width: auto;\n    margin-top: 0;\n    background-color: transparent;\n    border: 0;\n    box-shadow: none;\n  }\n  .navbar-nav .open .dropdown-menu > li > a,\n  .navbar-nav .open .dropdown-menu .dropdown-header {\n    padding: 5px 15px 5px 25px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a {\n    line-height: 20px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-nav .open .dropdown-menu > li > a:focus {\n    background-image: none;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-nav {\n    float: left;\n    margin: 0;\n  }\n  .navbar-nav > li {\n    float: left;\n  }\n  .navbar-nav > li > a {\n    padding-top: 15px;\n    padding-bottom: 15px;\n  }\n  .navbar-nav.navbar-right:last-child {\n    margin-right: -15px;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-left {\n    float: left !important;\n  }\n  .navbar-right {\n    float: right !important;\n  }\n}\n.navbar-form {\n  padding: 10px 15px;\n  margin-top: 8px;\n  margin-right: -15px;\n  margin-bottom: 8px;\n  margin-left: -15px;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);\n}\n@media (min-width: 768px) {\n  .navbar-form .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .navbar-form .input-group > .form-control {\n    width: 100%;\n  }\n  .navbar-form .control-label {\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .radio,\n  .navbar-form .checkbox {\n    display: inline-block;\n    padding-left: 0;\n    margin-top: 0;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .radio input[type=\"radio\"],\n  .navbar-form .checkbox input[type=\"checkbox\"] {\n    float: none;\n    margin-left: 0;\n  }\n  .navbar-form .has-feedback .form-control-feedback {\n    top: 0;\n  }\n}\n@media (max-width: 767px) {\n  .navbar-form .form-group {\n    margin-bottom: 5px;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-form {\n    width: auto;\n    padding-top: 0;\n    padding-bottom: 0;\n    margin-right: 0;\n    margin-left: 0;\n    border: 0;\n    -webkit-box-shadow: none;\n            box-shadow: none;\n  }\n  .navbar-form.navbar-right:last-child {\n    margin-right: -15px;\n  }\n}\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.navbar-btn {\n  margin-top: 8px;\n  margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n  margin-top: 14px;\n  margin-bottom: 14px;\n}\n.navbar-text {\n  margin-top: 15px;\n  margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n  .navbar-text {\n    float: left;\n    margin-right: 15px;\n    margin-left: 15px;\n  }\n  .navbar-text.navbar-right:last-child {\n    margin-right: 0;\n  }\n}\n.navbar-default {\n  background-color: #f8f8f8;\n  border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n  color: #777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n  color: #5e5e5e;\n  background-color: transparent;\n}\n.navbar-default .navbar-text {\n  color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n  color: #777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n  color: #333;\n  background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n  color: #555;\n  background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n  color: #ccc;\n  background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n  border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n  background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n  background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n  border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n  color: #555;\n  background-color: #e7e7e7;\n}\n@media (max-width: 767px) {\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n    color: #777;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #333;\n    background-color: transparent;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #555;\n    background-color: #e7e7e7;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #ccc;\n    background-color: transparent;\n  }\n}\n.navbar-default .navbar-link {\n  color: #777;\n}\n.navbar-default .navbar-link:hover {\n  color: #333;\n}\n.navbar-inverse {\n  background-color: #222;\n  border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n  color: #999;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n  color: #fff;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n  color: #999;\n}\n.navbar-inverse .navbar-nav > li > a {\n  color: #999;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n  color: #fff;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n  color: #fff;\n  background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n  color: #444;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n  border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n  background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n  background-color: #fff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n  border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n  color: #fff;\n  background-color: #080808;\n}\n@media (max-width: 767px) {\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n    border-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n    background-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n    color: #999;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #fff;\n    background-color: transparent;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #fff;\n    background-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #444;\n    background-color: transparent;\n  }\n}\n.navbar-inverse .navbar-link {\n  color: #999;\n}\n.navbar-inverse .navbar-link:hover {\n  color: #fff;\n}\n.breadcrumb {\n  padding: 8px 15px;\n  margin-bottom: 20px;\n  list-style: none;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n}\n.breadcrumb > li {\n  display: inline-block;\n}\n.breadcrumb > li + li:before {\n  padding: 0 5px;\n  color: #ccc;\n  content: \"/\\00a0\";\n}\n.breadcrumb > .active {\n  color: #999;\n}\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: 20px 0;\n  border-radius: 4px;\n}\n.pagination > li {\n  display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n  position: relative;\n  float: left;\n  padding: 6px 12px;\n  margin-left: -1px;\n  line-height: 1.42857143;\n  color: #428bca;\n  text-decoration: none;\n  background-color: #fff;\n  border: 1px solid #ddd;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n  margin-left: 0;\n  border-top-left-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n  color: #2a6496;\n  background-color: #eee;\n  border-color: #ddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n  z-index: 2;\n  color: #fff;\n  cursor: default;\n  background-color: #428bca;\n  border-color: #428bca;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n  color: #999;\n  cursor: not-allowed;\n  background-color: #fff;\n  border-color: #ddd;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n  padding: 10px 16px;\n  font-size: 18px;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n  border-top-left-radius: 6px;\n  border-bottom-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n  border-top-right-radius: 6px;\n  border-bottom-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n  padding: 5px 10px;\n  font-size: 12px;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n  border-top-left-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n  border-top-right-radius: 3px;\n  border-bottom-right-radius: 3px;\n}\n.pager {\n  padding-left: 0;\n  margin: 20px 0;\n  text-align: center;\n  list-style: none;\n}\n.pager li {\n  display: inline;\n}\n.pager li > a,\n.pager li > span {\n  display: inline-block;\n  padding: 5px 14px;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n  text-decoration: none;\n  background-color: #eee;\n}\n.pager .next > a,\n.pager .next > span {\n  float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n  float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n  color: #999;\n  cursor: not-allowed;\n  background-color: #fff;\n}\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: #fff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n}\n.label[href]:hover,\n.label[href]:focus {\n  color: #fff;\n  text-decoration: none;\n  cursor: pointer;\n}\n.label:empty {\n  display: none;\n}\n.btn .label {\n  position: relative;\n  top: -1px;\n}\n.label-default {\n  background-color: #999;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n  background-color: #808080;\n}\n.label-primary {\n  background-color: #428bca;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n  background-color: #3071a9;\n}\n.label-success {\n  background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n  background-color: #449d44;\n}\n.label-info {\n  background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n  background-color: #31b0d5;\n}\n.label-warning {\n  background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n  background-color: #ec971f;\n}\n.label-danger {\n  background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n  background-color: #c9302c;\n}\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: 12px;\n  font-weight: bold;\n  line-height: 1;\n  color: #fff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  background-color: #999;\n  border-radius: 10px;\n}\n.badge:empty {\n  display: none;\n}\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n.btn-xs .badge {\n  top: 0;\n  padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n  color: #fff;\n  text-decoration: none;\n  cursor: pointer;\n}\na.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n  color: #428bca;\n  background-color: #fff;\n}\n.nav-pills > li > a > .badge {\n  margin-left: 3px;\n}\n.jumbotron {\n  padding: 30px;\n  margin-bottom: 30px;\n  color: inherit;\n  background-color: #eee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n  color: inherit;\n}\n.jumbotron p {\n  margin-bottom: 15px;\n  font-size: 21px;\n  font-weight: 200;\n}\n.container .jumbotron {\n  border-radius: 6px;\n}\n.jumbotron .container {\n  max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n  .jumbotron {\n    padding-top: 48px;\n    padding-bottom: 48px;\n  }\n  .container .jumbotron {\n    padding-right: 60px;\n    padding-left: 60px;\n  }\n  .jumbotron h1,\n  .jumbotron .h1 {\n    font-size: 63px;\n  }\n}\n.thumbnail {\n  display: block;\n  padding: 4px;\n  margin-bottom: 20px;\n  line-height: 1.42857143;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-radius: 4px;\n  -webkit-transition: all .2s ease-in-out;\n          transition: all .2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n  margin-right: auto;\n  margin-left: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n  border-color: #428bca;\n}\n.thumbnail .caption {\n  padding: 9px;\n  color: #333;\n}\n.alert {\n  padding: 15px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.alert h4 {\n  margin-top: 0;\n  color: inherit;\n}\n.alert .alert-link {\n  font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n  margin-bottom: 0;\n}\n.alert > p + p {\n  margin-top: 5px;\n}\n.alert-dismissable {\n  padding-right: 35px;\n}\n.alert-dismissable .close {\n  position: relative;\n  top: -2px;\n  right: -21px;\n  color: inherit;\n}\n.alert-success {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n.alert-success hr {\n  border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n  color: #2b542c;\n}\n.alert-info {\n  color: #31708f;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n.alert-info hr {\n  border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n  color: #245269;\n}\n.alert-warning {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n}\n.alert-warning hr {\n  border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n  color: #66512c;\n}\n.alert-danger {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #ebccd1;\n}\n.alert-danger hr {\n  border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n  color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n.progress {\n  height: 20px;\n  margin-bottom: 20px;\n  overflow: hidden;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);\n          box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);\n}\n.progress-bar {\n  float: left;\n  width: 0;\n  height: 100%;\n  font-size: 12px;\n  line-height: 20px;\n  color: #fff;\n  text-align: center;\n  background-color: #428bca;\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);\n          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);\n  -webkit-transition: width .6s ease;\n          transition: width .6s ease;\n}\n.progress-striped .progress-bar {\n  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);\n  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);\n  background-size: 40px 40px;\n}\n.progress.active .progress-bar {\n  -webkit-animation: progress-bar-stripes 2s linear infinite;\n          animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n  background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n  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);\n  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);\n}\n.progress-bar-info {\n  background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n  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);\n  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);\n}\n.progress-bar-warning {\n  background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n  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);\n  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);\n}\n.progress-bar-danger {\n  background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n  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);\n  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);\n}\n.media,\n.media-body {\n  overflow: hidden;\n  zoom: 1;\n}\n.media,\n.media .media {\n  margin-top: 15px;\n}\n.media:first-child {\n  margin-top: 0;\n}\n.media-object {\n  display: block;\n}\n.media-heading {\n  margin: 0 0 5px;\n}\n.media > .pull-left {\n  margin-right: 10px;\n}\n.media > .pull-right {\n  margin-left: 10px;\n}\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n.list-group {\n  padding-left: 0;\n  margin-bottom: 20px;\n}\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n  margin-bottom: -1px;\n  background-color: #fff;\n  border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n  border-top-left-radius: 4px;\n  border-top-right-radius: 4px;\n}\n.list-group-item:last-child {\n  margin-bottom: 0;\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n.list-group-item > .badge {\n  float: right;\n}\n.list-group-item > .badge + .badge {\n  margin-right: 5px;\n}\na.list-group-item {\n  color: #555;\n}\na.list-group-item .list-group-item-heading {\n  color: #333;\n}\na.list-group-item:hover,\na.list-group-item:focus {\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\na.list-group-item.active,\na.list-group-item.active:hover,\na.list-group-item.active:focus {\n  z-index: 2;\n  color: #fff;\n  background-color: #428bca;\n  border-color: #428bca;\n}\na.list-group-item.active .list-group-item-heading,\na.list-group-item.active:hover .list-group-item-heading,\na.list-group-item.active:focus .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item.active .list-group-item-text,\na.list-group-item.active:hover .list-group-item-text,\na.list-group-item.active:focus .list-group-item-text {\n  color: #e1edf7;\n}\n.list-group-item-success {\n  color: #3c763d;\n  background-color: #dff0d8;\n}\na.list-group-item-success {\n  color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-success:hover,\na.list-group-item-success:focus {\n  color: #3c763d;\n  background-color: #d0e9c6;\n}\na.list-group-item-success.active,\na.list-group-item-success.active:hover,\na.list-group-item-success.active:focus {\n  color: #fff;\n  background-color: #3c763d;\n  border-color: #3c763d;\n}\n.list-group-item-info {\n  color: #31708f;\n  background-color: #d9edf7;\n}\na.list-group-item-info {\n  color: #31708f;\n}\na.list-group-item-info .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-info:hover,\na.list-group-item-info:focus {\n  color: #31708f;\n  background-color: #c4e3f3;\n}\na.list-group-item-info.active,\na.list-group-item-info.active:hover,\na.list-group-item-info.active:focus {\n  color: #fff;\n  background-color: #31708f;\n  border-color: #31708f;\n}\n.list-group-item-warning {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n}\na.list-group-item-warning {\n  color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-warning:hover,\na.list-group-item-warning:focus {\n  color: #8a6d3b;\n  background-color: #faf2cc;\n}\na.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus {\n  color: #fff;\n  background-color: #8a6d3b;\n  border-color: #8a6d3b;\n}\n.list-group-item-danger {\n  color: #a94442;\n  background-color: #f2dede;\n}\na.list-group-item-danger {\n  color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-danger:hover,\na.list-group-item-danger:focus {\n  color: #a94442;\n  background-color: #ebcccc;\n}\na.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus {\n  color: #fff;\n  background-color: #a94442;\n  border-color: #a94442;\n}\n.list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3;\n}\n.panel {\n  margin-bottom: 20px;\n  background-color: #fff;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05);\n          box-shadow: 0 1px 1px rgba(0, 0, 0, .05);\n}\n.panel-body {\n  padding: 15px;\n}\n.panel-heading {\n  padding: 10px 15px;\n  border-bottom: 1px solid transparent;\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n  color: inherit;\n}\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: 16px;\n  color: inherit;\n}\n.panel-title > a {\n  color: inherit;\n}\n.panel-footer {\n  padding: 10px 15px;\n  background-color: #f5f5f5;\n  border-top: 1px solid #ddd;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .list-group {\n  margin-bottom: 0;\n}\n.panel > .list-group .list-group-item {\n  border-width: 1px 0;\n  border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child {\n  border-top: 0;\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child {\n  border-bottom: 0;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n  border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table {\n  margin-bottom: 0;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n  border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n  border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n  border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive {\n  border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n  border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n  border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n  border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n  border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n  border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n  border-bottom: 0;\n}\n.panel > .table-responsive {\n  margin-bottom: 0;\n  border: 0;\n}\n.panel-group {\n  margin-bottom: 20px;\n}\n.panel-group .panel {\n  margin-bottom: 0;\n  overflow: hidden;\n  border-radius: 4px;\n}\n.panel-group .panel + .panel {\n  margin-top: 5px;\n}\n.panel-group .panel-heading {\n  border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse .panel-body {\n  border-top: 1px solid #ddd;\n}\n.panel-group .panel-footer {\n  border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n  border-bottom: 1px solid #ddd;\n}\n.panel-default {\n  border-color: #ddd;\n}\n.panel-default > .panel-heading {\n  color: #333;\n  background-color: #f5f5f5;\n  border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #ddd;\n}\n.panel-default > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #ddd;\n}\n.panel-primary {\n  border-color: #428bca;\n}\n.panel-primary > .panel-heading {\n  color: #fff;\n  background-color: #428bca;\n  border-color: #428bca;\n}\n.panel-primary > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #428bca;\n}\n.panel-primary > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #428bca;\n}\n.panel-success {\n  border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #d6e9c6;\n}\n.panel-success > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #d6e9c6;\n}\n.panel-info {\n  border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n  color: #31708f;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #bce8f1;\n}\n.panel-info > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #bce8f1;\n}\n.panel-warning {\n  border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #faebcc;\n}\n.panel-warning > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #faebcc;\n}\n.panel-danger {\n  border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #ebccd1;\n}\n.panel-danger > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #ebccd1;\n}\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border: 1px solid #e3e3e3;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);\n}\n.well blockquote {\n  border-color: #ddd;\n  border-color: rgba(0, 0, 0, .15);\n}\n.well-lg {\n  padding: 24px;\n  border-radius: 6px;\n}\n.well-sm {\n  padding: 9px;\n  border-radius: 3px;\n}\n.close {\n  float: right;\n  font-size: 21px;\n  font-weight: bold;\n  line-height: 1;\n  color: #000;\n  text-shadow: 0 1px 0 #fff;\n  filter: alpha(opacity=20);\n  opacity: .2;\n}\n.close:hover,\n.close:focus {\n  color: #000;\n  text-decoration: none;\n  cursor: pointer;\n  filter: alpha(opacity=50);\n  opacity: .5;\n}\nbutton.close {\n  -webkit-appearance: none;\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n}\n.modal-open {\n  overflow: hidden;\n}\n.modal {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1050;\n  display: none;\n  overflow: auto;\n  overflow-y: scroll;\n  -webkit-overflow-scrolling: touch;\n  outline: 0;\n}\n.modal.fade .modal-dialog {\n  -webkit-transition: -webkit-transform .3s ease-out;\n     -moz-transition:    -moz-transform .3s ease-out;\n       -o-transition:      -o-transform .3s ease-out;\n          transition:         transform .3s ease-out;\n  -webkit-transform: translate(0, -25%);\n      -ms-transform: translate(0, -25%);\n          transform: translate(0, -25%);\n}\n.modal.in .modal-dialog {\n  -webkit-transform: translate(0, 0);\n      -ms-transform: translate(0, 0);\n          transform: translate(0, 0);\n}\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: 10px;\n}\n.modal-content {\n  position: relative;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 1px solid #999;\n  border: 1px solid rgba(0, 0, 0, .2);\n  border-radius: 6px;\n  outline: none;\n  -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5);\n          box-shadow: 0 3px 9px rgba(0, 0, 0, .5);\n}\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  background-color: #000;\n}\n.modal-backdrop.fade {\n  filter: alpha(opacity=0);\n  opacity: 0;\n}\n.modal-backdrop.in {\n  filter: alpha(opacity=50);\n  opacity: .5;\n}\n.modal-header {\n  min-height: 16.42857143px;\n  padding: 15px;\n  border-bottom: 1px solid #e5e5e5;\n}\n.modal-header .close {\n  margin-top: -2px;\n}\n.modal-title {\n  margin: 0;\n  line-height: 1.42857143;\n}\n.modal-body {\n  position: relative;\n  padding: 20px;\n}\n.modal-footer {\n  padding: 19px 20px 20px;\n  margin-top: 15px;\n  text-align: right;\n  border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n  margin-bottom: 0;\n  margin-left: 5px;\n}\n.modal-footer .btn-group .btn + .btn {\n  margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n  margin-left: 0;\n}\n@media (min-width: 768px) {\n  .modal-dialog {\n    width: 600px;\n    margin: 30px auto;\n  }\n  .modal-content {\n    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5);\n            box-shadow: 0 5px 15px rgba(0, 0, 0, .5);\n  }\n  .modal-sm {\n    width: 300px;\n  }\n}\n@media (min-width: 992px) {\n  .modal-lg {\n    width: 900px;\n  }\n}\n.tooltip {\n  position: absolute;\n  z-index: 1030;\n  display: block;\n  font-size: 12px;\n  line-height: 1.4;\n  visibility: visible;\n  filter: alpha(opacity=0);\n  opacity: 0;\n}\n.tooltip.in {\n  filter: alpha(opacity=90);\n  opacity: .9;\n}\n.tooltip.top {\n  padding: 5px 0;\n  margin-top: -3px;\n}\n.tooltip.right {\n  padding: 0 5px;\n  margin-left: 3px;\n}\n.tooltip.bottom {\n  padding: 5px 0;\n  margin-top: 3px;\n}\n.tooltip.left {\n  padding: 0 5px;\n  margin-left: -3px;\n}\n.tooltip-inner {\n  max-width: 200px;\n  padding: 3px 8px;\n  color: #fff;\n  text-align: center;\n  text-decoration: none;\n  background-color: #000;\n  border-radius: 4px;\n}\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n  bottom: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n  bottom: 0;\n  left: 5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n  right: 5px;\n  bottom: 0;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.right .tooltip-arrow {\n  top: 50%;\n  left: 0;\n  margin-top: -5px;\n  border-width: 5px 5px 5px 0;\n  border-right-color: #000;\n}\n.tooltip.left .tooltip-arrow {\n  top: 50%;\n  right: 0;\n  margin-top: -5px;\n  border-width: 5px 0 5px 5px;\n  border-left-color: #000;\n}\n.tooltip.bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n  top: 0;\n  left: 5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n  top: 0;\n  right: 5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1010;\n  display: none;\n  max-width: 276px;\n  padding: 1px;\n  text-align: left;\n  white-space: normal;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, .2);\n  border-radius: 6px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2);\n          box-shadow: 0 5px 10px rgba(0, 0, 0, .2);\n}\n.popover.top {\n  margin-top: -10px;\n}\n.popover.right {\n  margin-left: 10px;\n}\n.popover.bottom {\n  margin-top: 10px;\n}\n.popover.left {\n  margin-left: -10px;\n}\n.popover-title {\n  padding: 8px 14px;\n  margin: 0;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 18px;\n  background-color: #f7f7f7;\n  border-bottom: 1px solid #ebebeb;\n  border-radius: 5px 5px 0 0;\n}\n.popover-content {\n  padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n  position: absolute;\n  display: block;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.popover > .arrow {\n  border-width: 11px;\n}\n.popover > .arrow:after {\n  content: \"\";\n  border-width: 10px;\n}\n.popover.top > .arrow {\n  bottom: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-top-color: #999;\n  border-top-color: rgba(0, 0, 0, .25);\n  border-bottom-width: 0;\n}\n.popover.top > .arrow:after {\n  bottom: 1px;\n  margin-left: -10px;\n  content: \" \";\n  border-top-color: #fff;\n  border-bottom-width: 0;\n}\n.popover.right > .arrow {\n  top: 50%;\n  left: -11px;\n  margin-top: -11px;\n  border-right-color: #999;\n  border-right-color: rgba(0, 0, 0, .25);\n  border-left-width: 0;\n}\n.popover.right > .arrow:after {\n  bottom: -10px;\n  left: 1px;\n  content: \" \";\n  border-right-color: #fff;\n  border-left-width: 0;\n}\n.popover.bottom > .arrow {\n  top: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-top-width: 0;\n  border-bottom-color: #999;\n  border-bottom-color: rgba(0, 0, 0, .25);\n}\n.popover.bottom > .arrow:after {\n  top: 1px;\n  margin-left: -10px;\n  content: \" \";\n  border-top-width: 0;\n  border-bottom-color: #fff;\n}\n.popover.left > .arrow {\n  top: 50%;\n  right: -11px;\n  margin-top: -11px;\n  border-right-width: 0;\n  border-left-color: #999;\n  border-left-color: rgba(0, 0, 0, .25);\n}\n.popover.left > .arrow:after {\n  right: 1px;\n  bottom: -10px;\n  content: \" \";\n  border-right-width: 0;\n  border-left-color: #fff;\n}\n.carousel {\n  position: relative;\n}\n.carousel-inner {\n  position: relative;\n  width: 100%;\n  overflow: hidden;\n}\n.carousel-inner > .item {\n  position: relative;\n  display: none;\n  -webkit-transition: .6s ease-in-out left;\n          transition: .6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  line-height: 1;\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  display: block;\n}\n.carousel-inner > .active {\n  left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n.carousel-inner > .next {\n  left: 100%;\n}\n.carousel-inner > .prev {\n  left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n  left: 0;\n}\n.carousel-inner > .active.left {\n  left: -100%;\n}\n.carousel-inner > .active.right {\n  left: 100%;\n}\n.carousel-control {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  width: 15%;\n  font-size: 20px;\n  color: #fff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, .6);\n  filter: alpha(opacity=50);\n  opacity: .5;\n}\n.carousel-control.left {\n  background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, .5) 0%), color-stop(rgba(0, 0, 0, .0001) 100%));\n  background-image:         linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n  background-repeat: repeat-x;\n}\n.carousel-control.right {\n  right: 0;\n  left: auto;\n  background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, .0001) 0%), color-stop(rgba(0, 0, 0, .5) 100%));\n  background-image:         linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n  background-repeat: repeat-x;\n}\n.carousel-control:hover,\n.carousel-control:focus {\n  color: #fff;\n  text-decoration: none;\n  filter: alpha(opacity=90);\n  outline: none;\n  opacity: .9;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n  position: absolute;\n  top: 50%;\n  z-index: 5;\n  display: inline-block;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n  left: 50%;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n  right: 50%;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n  width: 20px;\n  height: 20px;\n  margin-top: -10px;\n  margin-left: -10px;\n  font-family: serif;\n}\n.carousel-control .icon-prev:before {\n  content: '\\2039';\n}\n.carousel-control .icon-next:before {\n  content: '\\203a';\n}\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  padding-left: 0;\n  margin-left: -30%;\n  text-align: center;\n  list-style: none;\n}\n.carousel-indicators li {\n  display: inline-block;\n  width: 10px;\n  height: 10px;\n  margin: 1px;\n  text-indent: -999px;\n  cursor: pointer;\n  background-color: #000 \\9;\n  background-color: rgba(0, 0, 0, 0);\n  border: 1px solid #fff;\n  border-radius: 10px;\n}\n.carousel-indicators .active {\n  width: 12px;\n  height: 12px;\n  margin: 0;\n  background-color: #fff;\n}\n.carousel-caption {\n  position: absolute;\n  right: 15%;\n  bottom: 20px;\n  left: 15%;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: #fff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, .6);\n}\n.carousel-caption .btn {\n  text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-prev,\n  .carousel-control .icon-next {\n    width: 30px;\n    height: 30px;\n    margin-top: -15px;\n    margin-left: -15px;\n    font-size: 30px;\n  }\n  .carousel-caption {\n    right: 20%;\n    left: 20%;\n    padding-bottom: 30px;\n  }\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n.clearfix:before,\n.clearfix:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \" \";\n}\n.clearfix:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-footer:after {\n  clear: both;\n}\n.center-block {\n  display: block;\n  margin-right: auto;\n  margin-left: auto;\n}\n.pull-right {\n  float: right !important;\n}\n.pull-left {\n  float: left !important;\n}\n.hide {\n  display: none !important;\n}\n.show {\n  display: block !important;\n}\n.invisible {\n  visibility: hidden;\n}\n.text-hide {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n.hidden {\n  display: none !important;\n  visibility: hidden !important;\n}\n.affix {\n  position: fixed;\n}\n@-ms-viewport {\n  width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n  display: none !important;\n}\n@media (max-width: 767px) {\n  .visible-xs {\n    display: block !important;\n  }\n  table.visible-xs {\n    display: table;\n  }\n  tr.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-xs,\n  td.visible-xs {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm {\n    display: block !important;\n  }\n  table.visible-sm {\n    display: table;\n  }\n  tr.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-sm,\n  td.visible-sm {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md {\n    display: block !important;\n  }\n  table.visible-md {\n    display: table;\n  }\n  tr.visible-md {\n    display: table-row !important;\n  }\n  th.visible-md,\n  td.visible-md {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg {\n    display: block !important;\n  }\n  table.visible-lg {\n    display: table;\n  }\n  tr.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-lg,\n  td.visible-lg {\n    display: table-cell !important;\n  }\n}\n@media (max-width: 767px) {\n  .hidden-xs {\n    display: none !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-sm {\n    display: none !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-md {\n    display: none !important;\n  }\n}\n@media (min-width: 1200px) {\n  .hidden-lg {\n    display: none !important;\n  }\n}\n.visible-print {\n  display: none !important;\n}\n@media print {\n  .visible-print {\n    display: block !important;\n  }\n  table.visible-print {\n    display: table;\n  }\n  tr.visible-print {\n    display: table-row !important;\n  }\n  th.visible-print,\n  td.visible-print {\n    display: table-cell !important;\n  }\n}\n@media print {\n  .hidden-print {\n    display: none !important;\n  }\n}\n/*# sourceMappingURL=bootstrap.css.map */\n"
  },
  {
    "path": "old_splash_page_v2.0/css/main.css",
    "content": "\n@import url('https://fonts.googleapis.com/css?family=Raleway:100,700,300');\n\n/* ==========================================================================\n   Author's custom styles\n   ========================================================================== */\n\n\n\nbody{\n\t\tbackground: url('../img/backgrounds/cream_dust/cream_dust.png');\n}\n\na{color: #F5A623;}\na:hover{text-decoration: none;}\n\n/*div.col-sm-4{\nmax-width: 320px;\nmargin: auto;\n}*/\n.topHat button{\n\tbox-shadow: 1px 1px 25px rgba(255,255,255,1);\n/*\tfont-family: 'HelveticaNeue-Bold';\t*/\n\tfont-family: 'Raleway' ,'HelveticaNeue' ,'Helvetica Neue',Helvetica,Sans-Serif;\n\tfont-weight: 700;\n}\n\n.topHat h1{\ntext-align: center;\n/*font-family: 'HelveticaNeue-UltraLight';\t*/\nfont-family: 'Raleway' ,'HelveticaNeue' ,'Helvetica Neue',Helvetica,Sans-Serif;\nfont-weight: 100;\ncolor: #4A90E2;\n/* BackstopJS */\nmargin-bottom: 0;\nfont-size: 5em;\ntext-shadow:0 1px 1px #FFFFFF, 0 1px 30px #FFFFFF;\n}\n\n\n.topHat h2{\ntext-align: center;\n/*font-family: 'HelveticaNeue-Bold';\t*/\nfont-family: 'Raleway' ,'HelveticaNeue' ,'Helvetica Neue',Helvetica,Sans-Serif;\nfont-weight: 700;\nfont-size: 1.9em;\ncolor: #F5A623;\n/* Catch CSS curve balls */\nmargin-top: 0;\ntext-shadow:0 1px 1px #fff, 0 1px 12px rgba(255,255,255,.7);\n}\n\n.topHat p, .topHat li{\ntext-align: center;\n/*font-family: 'HelveticaNeue-Light';\t*/\nfont-family: 'Raleway' ,'HelveticaNeue' ,'Helvetica Neue',Helvetica,Sans-Serif;\nfont-weight: 300;\ncolor: #4A4A4A;\n/* Breaking CSS is easy... */\ntext-shadow: 0 1px 1px #fff;\n}\n\n.oneTwoThree strong{\n/*font-family: 'HelveticaNeue-Light';\t*/\nfont-family: 'Raleway' ,'HelveticaNeue' ,'Helvetica Neue',Helvetica,Sans-Serif;\nfont-weight: 300;\n}\n\n.topHat span{\n\twhite-space: nowrap;\n\tmargin: auto .1em;\n}\n\n.topHat button{\n\tmargin-top: .9em;\n}\n\n.jumbotron{\n\t/*background: url('../img/backgrounds/skulls/skulls.png');*/\n\t/*background: url('../img/backgrounds/textured_paper/textured_paper.png');*/\n\t/*background: url('../img/backgrounds/squairy_light/squairy_light.png');*/\n\t/*background: url('../img/backgrounds/fabric_of_squares_gray/fabric_of_squares_gray.png');*/\n\t/*background: url('../img/backgrounds/diagonal_waves/diagonal_waves.png');*/\n\tbackground: url('../img/backgrounds/subtlenet2/subtlenet2.png');\n}\n\nh2{\n/*font-family: 'HelveticaNeue-UltraLight';\t*/\nfont-family: 'Raleway' ,'HelveticaNeue' ,'Helvetica Neue',Helvetica,Sans-Serif;\nfont-weight: 100;\nfont-size: 31px;\ncolor: #000000;\nline-height: 37px;\n/* ONE TWO THREE */\ntext-align: center;\n}\n\n.secondPanel h2 a{\n/*font-family: 'HelveticaNeue-Light';\t*/\nfont-family: 'Raleway' ,'HelveticaNeue' ,'Helvetica Neue',Helvetica,Sans-Serif;\nfont-weight:300;\n\n}\n\nfigcaption{\n/*font-family: 'HelveticaNeue-Light';\t*/\nfont-family: 'Raleway' ,'HelveticaNeue' ,'Helvetica Neue',Helvetica,Sans-Serif;\nfont-weight: 300;\nfont-size: 16px;\ncolor: #4A90E2;\ntext-align: center;\nheight: 11ex;\n}\n\n.oneTwoThree img{\nmargin: auto;\n}\n\n.secondPanel p,\n.oneTwoThree p{\n/*font-family: 'HelveticaNeue-Light';\t*/\nfont-family: 'Raleway' ,'HelveticaNeue' ,'Helvetica Neue',Helvetica,Sans-Serif;\nfont-weight: 300;\nfont-size: 18px;\ncolor: #777;\n/* BackstopJS is a conf: */\nmargin-top: 1em;\n}\n\n.secondPanel h2{\n\ttext-align: left;\n}\n\n.oneTwoThree{\nmax-width: 1024px;\n}\n.oneTwoThree .row{margin-bottom: 4em;}\n\n.finalWords p{\n\ttext-align: center;\n}\n.finalWords h2{\n\tfont-weight: 300;\n}\n\nfooter{\n\tmargin: 50px auto;\n}\n\nfooter p{\n\ttext-align: center;\n/*\tfont-family: 'HelveticaNeue-Light';\t*/\n\tfont-family: 'Raleway' ,'HelveticaNeue' ,'Helvetica Neue',Helvetica,Sans-Serif;\n\tfont-weight: 300;\n\tmargin: 0 auto;\n}\n\n.text-nowrap {\nwhite-space: nowrap;\n}\n\n@media (max-width: 767px){\n\tfigure{\n\t\tmax-width: 400px;\n\t\tmargin: auto;\n\t}\n\t.topHat h1{\n\t\tfont-size: 3em;\n\t}\n\n\t.topHat h2{\n\t\tfont-size: 1.4em;\n\t}\n\t.topHat span{\n\t\t\twhite-space: normal;\n\t}\n\t.topHat p{\n\t\tfont-size: 1.2em;\n\t}\n\t.oneTwoThree .row{\n\t\tmargin-bottom: 0;\n\t}\n\t.oneTwoThree .row.firstPanel>div{\n\t\tmargin-bottom: 5em;\n\t}\n\tfigcaption{\n\t\theight: 8ex;\t\t\n\t}\n}\n"
  },
  {
    "path": "old_splash_page_v2.0/img/backgrounds/cream_dust/readme.txt",
    "content": "\n\n========================================================\n This pattern is downloaded from www.subtlepatterns.com \n If you need more, that's where to get'em.\n ========================================================\n \n "
  },
  {
    "path": "old_splash_page_v2.0/img/backgrounds/subtlenet2/readme.txt",
    "content": "\n\n========================================================\n This pattern is downloaded from www.subtlepatterns.com \n If you need more, that's where to get'em.\n ========================================================\n \n "
  },
  {
    "path": "old_splash_page_v2.0/index.html",
    "content": "<!DOCTYPE html>\n<!--[if lt IE 7]>      <html class=\"no-js lt-ie9 lt-ie8 lt-ie7\"> <![endif]-->\n<!--[if IE 7]>         <html class=\"no-js lt-ie9 lt-ie8\"> <![endif]-->\n<!--[if IE 8]>         <html class=\"no-js lt-ie9\"> <![endif]-->\n<!--[if gt IE 8]><!--> <html class=\"no-js\"> <!--<![endif]-->\n    <head>\n        <meta charset=\"utf-8\">\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\">\n        <title>BackstopJS: Catch CSS curve balls</title>\n        <meta name=\"description\" content=\"\">\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n\n        <link rel=\"stylesheet\" href=\"./css/bootstrap.min.css\">\n        <style>\n/*            body {\n                padding-top: 50px;\n                padding-bottom: 20px;\n            }\n*/\n          .whatsNewInTwo {\n            padding: 0;\n            text-align:center;\n          }\n          .whatsNewInTwo li {\n            display: inline-block;\n          }\n        </style>\n        <!-- <link rel=\"stylesheet\" href=\"./css/bootstrap-theme.min.css\"> -->\n        <link rel=\"stylesheet\" href=\"./css/main.css\">\n\n        <!--[if lt IE 9]>\n            <script src=\"./js/vendor/html5-3.6-respond-1.1.0.min.js\"></script>\n        <![endif]-->\n    </head>\n    <body>\n        <!--[if lt IE 7]>\n            <p class=\"browsehappy\">You are using an <strong>outdated</strong> browser. Please <a href=\"http://browsehappy.com/\">upgrade your browser</a> to improve your experience.</p>\n        <![endif]-->\n\n\n<!--     <div class=\"navbar navbar-inverse navbar-fixed-top\" role=\"navigation\">\n      <div class=\"container\">\n        <div class=\"navbar-header\">\n          <button type=\"button\" class=\"navbar-toggle\" data-toggle=\"collapse\" data-target=\".navbar-collapse\">\n            <span class=\"sr-only\">Toggle navigation</span>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n          </button>\n          <a class=\"navbar-brand\" href=\"#\">Project name</a>\n        </div>\n        <div class=\"navbar-collapse collapse\">\n          <form class=\"navbar-form navbar-right\" role=\"form\">\n            <div class=\"form-group\">\n              <input type=\"text\" placeholder=\"Email\" class=\"form-control\">\n            </div>\n            <div class=\"form-group\">\n              <input type=\"password\" placeholder=\"Password\" class=\"form-control\">\n            </div>\n            <button type=\"submit\" class=\"btn btn-success\">Sign in</button>\n          </form>\n        </div>\n      </div>\n    </div>\n -->\n    <!-- Main jumbotron for a primary marketing message or call to action -->\n\n\n    <div class=\"jumbotron\">\n      <div class=\"container topHat\">\n        <h1>BackstopJS</h1>\n        <h2>Catch CSS curve balls.</h2>\n        <p>\n          <span>Breaking CSS is easy.</span>\n          <span>Checking every responsive page element is hard.</span>\n          <span>That’s why there's BackstopJS.</span>\n        </p>\n        <p>\n          <button type=\"button\" class=\"btn btn-primary\">Get it on Github</button>\n        </p>\n        <p>\n          <strong>News: Version 2.0 available now!</strong>\n          <br/>\n            <ul class=\"whatsNewInTwo\">\n              <li><strong>Here's whats new... </strong></li>\n              <li>All-new, all-optimized CLI core</li>\n              <li>- Huge performance gains</li>\n              <li>- Global or local install options</li>\n              <li>- Invoke from anywhere with <code>`backstop &lt;command&gt;`</code></li>\n              <li>- Incremental reference generation</li>\n              <li>- Scenario filtering</li>\n              <li>- Custom screenshot file naming</li>\n              <li>- More bug fixes than you can shake a stick at</li>\n              <li>- Removed Gulp dependency and more!</li>\n              <li> <strong>Check the documentation for new streamlined install instructions and config changes.</strong></li>\n            </ul>\n        </p>\n      </div>\n    </div>\n\n\n    <div class=\"container oneTwoThree\">\n      <!-- oneTwoThree -->\n      <div class=\"row firstPanel\">\n\n        <div class=\"col-sm-12\">\n          <p>\n              <strong>BackstopJS is the easiest way to visually test lots of web-app URL states:</strong>\n              Simulate user interactions with CasperJS scripts – Inline-CLI reports – Detailed browser reports – jUnit Reports - Add (node module) logic to your config files – Test html5 elements like webfonts and flexbox – plays nice with CI integration, multiple config paths and source control.\n          </p>\n        </div>\n\n        <div class=\"col-sm-4\">\n          <h2>ONE</h2>\n          <figure>\n            <figcaption>\n              BackstopJS Creates reference screenshots of your webpage/web-app at multiple screen sizes.\n            </figcaption>\n            <img src=\"./img/one@2x.png\" class=\"img-responsive\" ></img>\n          </figure>\n          <p>\n            BackstopJS is a config-driven automated screenshot test application for responsive websites and web-applications. Specify a set of DOM elements and viewport sizes and <span>BackstopJS will work like an extra set of eyes on your workflow</span>.\n          </p>\n        </div>\n\n\n        <div class=\"col-sm-4\">\n          <h2>TWO</h2>\n          <figure>\n            <figcaption>\n              After editing your CSS, use BackstopJS to find any unwanted CSS regressions.\n            </figcaption>\n            <img src=\"./img/two@2x.png\" class=\"img-responsive\" ></img>\n          </figure>\n          <p>\n            BackstopJS integrates into your <!-- <a href=\"http://gulpjs.com\">Gulp.js</a>  -->build process and <span>automatically checks your work before you ship it to QA/staging/production</span>. Alternatively, run BackstopJS manually whenever the need arises.\n          </p>\n        </div>\n\n\n\n        <div class=\"col-sm-4\">\n          <h2>THREE</h2>\n          <figure>\n            <figcaption>\n              BackstopJS uses <a href=\"https://github.com/Huddle/Resemble.js\">Resemble.js</a>, <a href=\"http://casperjs.org\">CasperJS</a> and <a href=\"http://phantomjs.org\">PhantomJS</a> to report on visual changes.\n            </figcaption>\n            <img src=\"./img/three@2x.png\" class=\"img-responsive\" ></img>\n          </figure>\n          <p>\n            BackstopJS helps to <span>catch the errors you might otherwise miss</span>. Get a heads-up report for each selector. Quickly zero-in on issues with side-by-side screenshots and diff images.\n          </p>\n        </div>\n\n\n      </div>\n\n      <hr>\n\n      <div class=\"row secondPanel\">\n\n        <div class=\"col-sm-12\">\n          <h2>\n            Is BackstopJS for you?\n          </h2>\n        </div>\n        <div class=\"col-sm-6\">\n\n          <p>\n            Responsive layouts are very difficult to test. It's arguably more tedious to (re)view all of a project's screen elements at every breakpoint than it is to code them in the first place. If you develop responsive UI, you know the worst thing ever is when you've developed a beautiful, rock-solid, responsive CSS layout only to accidentally and un-knowingly hose it by adding a new module or putting in a last-minute tweak. <span class=\"text-nowrap\">:-/</span>\n          </p>\n\n\n        </div>\n\n        <div class=\"col-sm-6\">\n          <p>\n            If that sounds familiar then you are in the right ballpark... BackstopJS is a dead-simple way to add another line of defense between you and those unpredictable CSS curve-balls.\n          </p>\n          <p>\n            BackstopJS may be just the thing if you develop responsive CMS templates (e.g. Wordpress, Drupal), landing pages, static sites, or dynamic web-apps where one greedy selector can wreak havoc on your otherwise well behaved UI.\n          </p>\n          <p>\n\n          </p>\n        </div>\n\n      </div>\n\n\n      <hr>\n\n\n      <div class=\"row finalWords\">\n        <div class=\"col-sm-12 \">\n          <h2>\n            <a href=\"https://github.com/garris/BackstopJS\">Installation, Documentation, Contribution!</a>\n          </h2>\n          <p>\n            And while you're at it, <a href=\"http://tremulajs.org/\">check out TremulaJS</a>, another fine project developed at Art.com labs.\n          </p>\n          <p>\n            BackstopJS was created by <a href=\"http://expanded.me/about/\">Garris Shipon</a>.\n            <!-- TODO Need simple NG here -->\n            <!--  with contributions from  -->\n            <!-- https://api.github.com/repos/garris/backstopjs/contributors -->\n            <!--\n            <ul>\n              <li class=\"contributors\" ng-repeat=\"contributor in contributors\">\n                <img src=\"{{contributor.contribImgSrc}}\" class=\"avatar\" alt=\"\">\n                <a class=\"aname\" href=\"/{{contributor.userName}}\">{{contributor.userName}}</a>\n              </li>\n            </ul>\n             -->\n          </p>\n        </div>\n\n\n      </div>\n\n\n    </div> <!-- /container -->\n\n      <!-- <hr> -->\n\n      <footer>\n        <p>&copy; 2014</p>\n      </footer>\n\n        <script src=\"//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js\"></script>\n        <script>window.jQuery || document.write('<script src=\"./js/vendor/jquery-1.11.1.min.js\"><\\/script>')</script>\n\n        <!--<script src=\"./js/vendor/bootstrap.min.js\"></script>-->\n\n        <script src=\"./js/main.js\"></script>\n\n        <!-- Google Analytics: change UA-XXXXX-X to be your site's ID. -->\n        <script>\n            // (function(b,o,i,l,e,r){b.GoogleAnalyticsObject=l;b[l]||(b[l]=\n            // function(){(b[l].q=b[l].q||[]).push(arguments)});b[l].l=+new Date;\n            // e=o.createElement(i);r=o.getElementsByTagName(i)[0];\n            // e.src='//www.google-analytics.com/analytics.js';\n            // r.parentNode.insertBefore(e,r)}(window,document,'script','ga'));\n            // ga('create','UA-XXXXX-X');ga('send','pageview');\n        </script>\n    </body>\n</html>\n"
  },
  {
    "path": "old_splash_page_v2.0/js/main.js",
    "content": "$('button').click(function () {\n  window.location.href = 'https://github.com/garris/BackstopJS';\n});\n\n// TODO:  modify this for v2.0 content vvvvv\n\nconst READY_LAG_MS = 10000;\nconst READY_TAG = '_the_lemur_is_ready_to_see_you';\nconst LEMUR_CLASS_ACTION = 'hideLemur';\nconst COOKIE_TEST = /cookie/i;\nconst CLICK_TEST = /click/i;\nconst DELAY_TEST = /delay/i;\n\nif (COOKIE_TEST.test(window.location.search)) {\n  showCookies();\n}\nif (CLICK_TEST.test(window.location.search)) {\n  modifyLemurBehavior();\n}\nif (DELAY_TEST.test(window.location.search)) {\n  delayLemurification();\n}\n\nfunction modifyLemurBehavior () {\n  document.body.addEventListener('click', evt => {\n    if (evt.target.id === 'theLemur') {\n      containTheLemur();\n      evt.preventDefault();\n    } else {\n      releaseTheLemur();\n    }\n  });\n  console.log('lemur behavior is modified');\n}\n\nfunction showCookies () {\n  document.getElementsByClassName('logoBlock')[0].innerText = 'cookies > ' + document.cookie;\n}\n\nfunction setReadyFlags () {\n  console.log(READY_TAG);\n  document.body.classList.add(READY_TAG);\n}\n\nfunction releaseTheLemur () {\n  document.body.classList.remove(LEMUR_CLASS_ACTION);\n}\n\nfunction containTheLemur () {\n  document.body.classList.add(LEMUR_CLASS_ACTION);\n}\n\nfunction delayLemurification () {\n  containTheLemur();\n  setTimeout(releaseTheLemur, READY_LAG_MS);\n  setTimeout(setReadyFlags, READY_LAG_MS + 1000);\n}\n"
  },
  {
    "path": "old_splash_page_v2.0/js/vendor/bootstrap.js",
    "content": "/*!\n * Bootstrap v3.1.1 (http://getbootstrap.com)\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\nif (typeof jQuery === 'undefined') { throw new Error('Bootstrap\\'s JavaScript requires jQuery') }\n\n/* ========================================================================\n * Bootstrap: transition.js v3.1.1\n * http://getbootstrap.com/javascript/#transitions\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)\n  // ============================================================\n\n  function transitionEnd() {\n    var el = document.createElement('bootstrap')\n\n    var transEndEventNames = {\n      'WebkitTransition' : 'webkitTransitionEnd',\n      'MozTransition'    : 'transitionend',\n      'OTransition'      : 'oTransitionEnd otransitionend',\n      'transition'       : 'transitionend'\n    }\n\n    for (var name in transEndEventNames) {\n      if (el.style[name] !== undefined) {\n        return { end: transEndEventNames[name] }\n      }\n    }\n\n    return false // explicit for ie8 (  ._.)\n  }\n\n  // http://blog.alexmaccaw.com/css-transitions\n  $.fn.emulateTransitionEnd = function (duration) {\n    var called = false, $el = this\n    $(this).one($.support.transition.end, function () { called = true })\n    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }\n    setTimeout(callback, duration)\n    return this\n  }\n\n  $(function () {\n    $.support.transition = transitionEnd()\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: alert.js v3.1.1\n * http://getbootstrap.com/javascript/#alerts\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // ALERT CLASS DEFINITION\n  // ======================\n\n  var dismiss = '[data-dismiss=\"alert\"]'\n  var Alert   = function (el) {\n    $(el).on('click', dismiss, this.close)\n  }\n\n  Alert.prototype.close = function (e) {\n    var $this    = $(this)\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    var $parent = $(selector)\n\n    if (e) e.preventDefault()\n\n    if (!$parent.length) {\n      $parent = $this.hasClass('alert') ? $this : $this.parent()\n    }\n\n    $parent.trigger(e = $.Event('close.bs.alert'))\n\n    if (e.isDefaultPrevented()) return\n\n    $parent.removeClass('in')\n\n    function removeElement() {\n      $parent.trigger('closed.bs.alert').remove()\n    }\n\n    $.support.transition && $parent.hasClass('fade') ?\n      $parent\n        .one($.support.transition.end, removeElement)\n        .emulateTransitionEnd(150) :\n      removeElement()\n  }\n\n\n  // ALERT PLUGIN DEFINITION\n  // =======================\n\n  var old = $.fn.alert\n\n  $.fn.alert = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.alert')\n\n      if (!data) $this.data('bs.alert', (data = new Alert(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  $.fn.alert.Constructor = Alert\n\n\n  // ALERT NO CONFLICT\n  // =================\n\n  $.fn.alert.noConflict = function () {\n    $.fn.alert = old\n    return this\n  }\n\n\n  // ALERT DATA-API\n  // ==============\n\n  $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: button.js v3.1.1\n * http://getbootstrap.com/javascript/#buttons\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // BUTTON PUBLIC CLASS DEFINITION\n  // ==============================\n\n  var Button = function (element, options) {\n    this.$element  = $(element)\n    this.options   = $.extend({}, Button.DEFAULTS, options)\n    this.isLoading = false\n  }\n\n  Button.DEFAULTS = {\n    loadingText: 'loading...'\n  }\n\n  Button.prototype.setState = function (state) {\n    var d    = 'disabled'\n    var $el  = this.$element\n    var val  = $el.is('input') ? 'val' : 'html'\n    var data = $el.data()\n\n    state = state + 'Text'\n\n    if (!data.resetText) $el.data('resetText', $el[val]())\n\n    $el[val](data[state] || this.options[state])\n\n    // push to event loop to allow forms to submit\n    setTimeout($.proxy(function () {\n      if (state == 'loadingText') {\n        this.isLoading = true\n        $el.addClass(d).attr(d, d)\n      } else if (this.isLoading) {\n        this.isLoading = false\n        $el.removeClass(d).removeAttr(d)\n      }\n    }, this), 0)\n  }\n\n  Button.prototype.toggle = function () {\n    var changed = true\n    var $parent = this.$element.closest('[data-toggle=\"buttons\"]')\n\n    if ($parent.length) {\n      var $input = this.$element.find('input')\n      if ($input.prop('type') == 'radio') {\n        if ($input.prop('checked') && this.$element.hasClass('active')) changed = false\n        else $parent.find('.active').removeClass('active')\n      }\n      if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change')\n    }\n\n    if (changed) this.$element.toggleClass('active')\n  }\n\n\n  // BUTTON PLUGIN DEFINITION\n  // ========================\n\n  var old = $.fn.button\n\n  $.fn.button = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.button')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.button', (data = new Button(this, options)))\n\n      if (option == 'toggle') data.toggle()\n      else if (option) data.setState(option)\n    })\n  }\n\n  $.fn.button.Constructor = Button\n\n\n  // BUTTON NO CONFLICT\n  // ==================\n\n  $.fn.button.noConflict = function () {\n    $.fn.button = old\n    return this\n  }\n\n\n  // BUTTON DATA-API\n  // ===============\n\n  $(document).on('click.bs.button.data-api', '[data-toggle^=button]', function (e) {\n    var $btn = $(e.target)\n    if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')\n    $btn.button('toggle')\n    e.preventDefault()\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: carousel.js v3.1.1\n * http://getbootstrap.com/javascript/#carousel\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // CAROUSEL CLASS DEFINITION\n  // =========================\n\n  var Carousel = function (element, options) {\n    this.$element    = $(element)\n    this.$indicators = this.$element.find('.carousel-indicators')\n    this.options     = options\n    this.paused      =\n    this.sliding     =\n    this.interval    =\n    this.$active     =\n    this.$items      = null\n\n    this.options.pause == 'hover' && this.$element\n      .on('mouseenter', $.proxy(this.pause, this))\n      .on('mouseleave', $.proxy(this.cycle, this))\n  }\n\n  Carousel.DEFAULTS = {\n    interval: 5000,\n    pause: 'hover',\n    wrap: true\n  }\n\n  Carousel.prototype.cycle =  function (e) {\n    e || (this.paused = false)\n\n    this.interval && clearInterval(this.interval)\n\n    this.options.interval\n      && !this.paused\n      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))\n\n    return this\n  }\n\n  Carousel.prototype.getActiveIndex = function () {\n    this.$active = this.$element.find('.item.active')\n    this.$items  = this.$active.parent().children()\n\n    return this.$items.index(this.$active)\n  }\n\n  Carousel.prototype.to = function (pos) {\n    var that        = this\n    var activeIndex = this.getActiveIndex()\n\n    if (pos > (this.$items.length - 1) || pos < 0) return\n\n    if (this.sliding)       return this.$element.one('slid.bs.carousel', function () { that.to(pos) })\n    if (activeIndex == pos) return this.pause().cycle()\n\n    return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))\n  }\n\n  Carousel.prototype.pause = function (e) {\n    e || (this.paused = true)\n\n    if (this.$element.find('.next, .prev').length && $.support.transition) {\n      this.$element.trigger($.support.transition.end)\n      this.cycle(true)\n    }\n\n    this.interval = clearInterval(this.interval)\n\n    return this\n  }\n\n  Carousel.prototype.next = function () {\n    if (this.sliding) return\n    return this.slide('next')\n  }\n\n  Carousel.prototype.prev = function () {\n    if (this.sliding) return\n    return this.slide('prev')\n  }\n\n  Carousel.prototype.slide = function (type, next) {\n    var $active   = this.$element.find('.item.active')\n    var $next     = next || $active[type]()\n    var isCycling = this.interval\n    var direction = type == 'next' ? 'left' : 'right'\n    var fallback  = type == 'next' ? 'first' : 'last'\n    var that      = this\n\n    if (!$next.length) {\n      if (!this.options.wrap) return\n      $next = this.$element.find('.item')[fallback]()\n    }\n\n    if ($next.hasClass('active')) return this.sliding = false\n\n    var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction })\n    this.$element.trigger(e)\n    if (e.isDefaultPrevented()) return\n\n    this.sliding = true\n\n    isCycling && this.pause()\n\n    if (this.$indicators.length) {\n      this.$indicators.find('.active').removeClass('active')\n      this.$element.one('slid.bs.carousel', function () {\n        var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()])\n        $nextIndicator && $nextIndicator.addClass('active')\n      })\n    }\n\n    if ($.support.transition && this.$element.hasClass('slide')) {\n      $next.addClass(type)\n      $next[0].offsetWidth // force reflow\n      $active.addClass(direction)\n      $next.addClass(direction)\n      $active\n        .one($.support.transition.end, function () {\n          $next.removeClass([type, direction].join(' ')).addClass('active')\n          $active.removeClass(['active', direction].join(' '))\n          that.sliding = false\n          setTimeout(function () { that.$element.trigger('slid.bs.carousel') }, 0)\n        })\n        .emulateTransitionEnd($active.css('transition-duration').slice(0, -1) * 1000)\n    } else {\n      $active.removeClass('active')\n      $next.addClass('active')\n      this.sliding = false\n      this.$element.trigger('slid.bs.carousel')\n    }\n\n    isCycling && this.cycle()\n\n    return this\n  }\n\n\n  // CAROUSEL PLUGIN DEFINITION\n  // ==========================\n\n  var old = $.fn.carousel\n\n  $.fn.carousel = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.carousel')\n      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)\n      var action  = typeof option == 'string' ? option : options.slide\n\n      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))\n      if (typeof option == 'number') data.to(option)\n      else if (action) data[action]()\n      else if (options.interval) data.pause().cycle()\n    })\n  }\n\n  $.fn.carousel.Constructor = Carousel\n\n\n  // CAROUSEL NO CONFLICT\n  // ====================\n\n  $.fn.carousel.noConflict = function () {\n    $.fn.carousel = old\n    return this\n  }\n\n\n  // CAROUSEL DATA-API\n  // =================\n\n  $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {\n    var $this   = $(this), href\n    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) //strip for ie7\n    var options = $.extend({}, $target.data(), $this.data())\n    var slideIndex = $this.attr('data-slide-to')\n    if (slideIndex) options.interval = false\n\n    $target.carousel(options)\n\n    if (slideIndex = $this.attr('data-slide-to')) {\n      $target.data('bs.carousel').to(slideIndex)\n    }\n\n    e.preventDefault()\n  })\n\n  $(window).on('load', function () {\n    $('[data-ride=\"carousel\"]').each(function () {\n      var $carousel = $(this)\n      $carousel.carousel($carousel.data())\n    })\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: collapse.js v3.1.1\n * http://getbootstrap.com/javascript/#collapse\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // COLLAPSE PUBLIC CLASS DEFINITION\n  // ================================\n\n  var Collapse = function (element, options) {\n    this.$element      = $(element)\n    this.options       = $.extend({}, Collapse.DEFAULTS, options)\n    this.transitioning = null\n\n    if (this.options.parent) this.$parent = $(this.options.parent)\n    if (this.options.toggle) this.toggle()\n  }\n\n  Collapse.DEFAULTS = {\n    toggle: true\n  }\n\n  Collapse.prototype.dimension = function () {\n    var hasWidth = this.$element.hasClass('width')\n    return hasWidth ? 'width' : 'height'\n  }\n\n  Collapse.prototype.show = function () {\n    if (this.transitioning || this.$element.hasClass('in')) return\n\n    var startEvent = $.Event('show.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    var actives = this.$parent && this.$parent.find('> .panel > .in')\n\n    if (actives && actives.length) {\n      var hasData = actives.data('bs.collapse')\n      if (hasData && hasData.transitioning) return\n      actives.collapse('hide')\n      hasData || actives.data('bs.collapse', null)\n    }\n\n    var dimension = this.dimension()\n\n    this.$element\n      .removeClass('collapse')\n      .addClass('collapsing')\n      [dimension](0)\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.$element\n        .removeClass('collapsing')\n        .addClass('collapse in')\n        [dimension]('auto')\n      this.transitioning = 0\n      this.$element.trigger('shown.bs.collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    var scrollSize = $.camelCase(['scroll', dimension].join('-'))\n\n    this.$element\n      .one($.support.transition.end, $.proxy(complete, this))\n      .emulateTransitionEnd(350)\n      [dimension](this.$element[0][scrollSize])\n  }\n\n  Collapse.prototype.hide = function () {\n    if (this.transitioning || !this.$element.hasClass('in')) return\n\n    var startEvent = $.Event('hide.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    var dimension = this.dimension()\n\n    this.$element\n      [dimension](this.$element[dimension]())\n      [0].offsetHeight\n\n    this.$element\n      .addClass('collapsing')\n      .removeClass('collapse')\n      .removeClass('in')\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.transitioning = 0\n      this.$element\n        .trigger('hidden.bs.collapse')\n        .removeClass('collapsing')\n        .addClass('collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    this.$element\n      [dimension](0)\n      .one($.support.transition.end, $.proxy(complete, this))\n      .emulateTransitionEnd(350)\n  }\n\n  Collapse.prototype.toggle = function () {\n    this[this.$element.hasClass('in') ? 'hide' : 'show']()\n  }\n\n\n  // COLLAPSE PLUGIN DEFINITION\n  // ==========================\n\n  var old = $.fn.collapse\n\n  $.fn.collapse = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.collapse')\n      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\n      if (!data && options.toggle && option == 'show') option = !option\n      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.collapse.Constructor = Collapse\n\n\n  // COLLAPSE NO CONFLICT\n  // ====================\n\n  $.fn.collapse.noConflict = function () {\n    $.fn.collapse = old\n    return this\n  }\n\n\n  // COLLAPSE DATA-API\n  // =================\n\n  $(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) {\n    var $this   = $(this), href\n    var target  = $this.attr('data-target')\n        || e.preventDefault()\n        || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '') //strip for ie7\n    var $target = $(target)\n    var data    = $target.data('bs.collapse')\n    var option  = data ? 'toggle' : $this.data()\n    var parent  = $this.attr('data-parent')\n    var $parent = parent && $(parent)\n\n    if (!data || !data.transitioning) {\n      if ($parent) $parent.find('[data-toggle=collapse][data-parent=\"' + parent + '\"]').not($this).addClass('collapsed')\n      $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed')\n    }\n\n    $target.collapse(option)\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: dropdown.js v3.1.1\n * http://getbootstrap.com/javascript/#dropdowns\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // DROPDOWN CLASS DEFINITION\n  // =========================\n\n  var backdrop = '.dropdown-backdrop'\n  var toggle   = '[data-toggle=dropdown]'\n  var Dropdown = function (element) {\n    $(element).on('click.bs.dropdown', this.toggle)\n  }\n\n  Dropdown.prototype.toggle = function (e) {\n    var $this = $(this)\n\n    if ($this.is('.disabled, :disabled')) return\n\n    var $parent  = getParent($this)\n    var isActive = $parent.hasClass('open')\n\n    clearMenus()\n\n    if (!isActive) {\n      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {\n        // if mobile we use a backdrop because click events don't delegate\n        $('<div class=\"dropdown-backdrop\"/>').insertAfter($(this)).on('click', clearMenus)\n      }\n\n      var relatedTarget = { relatedTarget: this }\n      $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))\n\n      if (e.isDefaultPrevented()) return\n\n      $parent\n        .toggleClass('open')\n        .trigger('shown.bs.dropdown', relatedTarget)\n\n      $this.focus()\n    }\n\n    return false\n  }\n\n  Dropdown.prototype.keydown = function (e) {\n    if (!/(38|40|27)/.test(e.keyCode)) return\n\n    var $this = $(this)\n\n    e.preventDefault()\n    e.stopPropagation()\n\n    if ($this.is('.disabled, :disabled')) return\n\n    var $parent  = getParent($this)\n    var isActive = $parent.hasClass('open')\n\n    if (!isActive || (isActive && e.keyCode == 27)) {\n      if (e.which == 27) $parent.find(toggle).focus()\n      return $this.click()\n    }\n\n    var desc = ' li:not(.divider):visible a'\n    var $items = $parent.find('[role=menu]' + desc + ', [role=listbox]' + desc)\n\n    if (!$items.length) return\n\n    var index = $items.index($items.filter(':focus'))\n\n    if (e.keyCode == 38 && index > 0)                 index--                        // up\n    if (e.keyCode == 40 && index < $items.length - 1) index++                        // down\n    if (!~index)                                      index = 0\n\n    $items.eq(index).focus()\n  }\n\n  function clearMenus(e) {\n    $(backdrop).remove()\n    $(toggle).each(function () {\n      var $parent = getParent($(this))\n      var relatedTarget = { relatedTarget: this }\n      if (!$parent.hasClass('open')) return\n      $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))\n      if (e.isDefaultPrevented()) return\n      $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget)\n    })\n  }\n\n  function getParent($this) {\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\\s]*$)/, '') //strip for ie7\n    }\n\n    var $parent = selector && $(selector)\n\n    return $parent && $parent.length ? $parent : $this.parent()\n  }\n\n\n  // DROPDOWN PLUGIN DEFINITION\n  // ==========================\n\n  var old = $.fn.dropdown\n\n  $.fn.dropdown = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.dropdown')\n\n      if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  $.fn.dropdown.Constructor = Dropdown\n\n\n  // DROPDOWN NO CONFLICT\n  // ====================\n\n  $.fn.dropdown.noConflict = function () {\n    $.fn.dropdown = old\n    return this\n  }\n\n\n  // APPLY TO STANDARD DROPDOWN ELEMENTS\n  // ===================================\n\n  $(document)\n    .on('click.bs.dropdown.data-api', clearMenus)\n    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })\n    .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)\n    .on('keydown.bs.dropdown.data-api', toggle + ', [role=menu], [role=listbox]', Dropdown.prototype.keydown)\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: modal.js v3.1.1\n * http://getbootstrap.com/javascript/#modals\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // MODAL CLASS DEFINITION\n  // ======================\n\n  var Modal = function (element, options) {\n    this.options   = options\n    this.$element  = $(element)\n    this.$backdrop =\n    this.isShown   = null\n\n    if (this.options.remote) {\n      this.$element\n        .find('.modal-content')\n        .load(this.options.remote, $.proxy(function () {\n          this.$element.trigger('loaded.bs.modal')\n        }, this))\n    }\n  }\n\n  Modal.DEFAULTS = {\n    backdrop: true,\n    keyboard: true,\n    show: true\n  }\n\n  Modal.prototype.toggle = function (_relatedTarget) {\n    return this[!this.isShown ? 'show' : 'hide'](_relatedTarget)\n  }\n\n  Modal.prototype.show = function (_relatedTarget) {\n    var that = this\n    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })\n\n    this.$element.trigger(e)\n\n    if (this.isShown || e.isDefaultPrevented()) return\n\n    this.isShown = true\n\n    this.escape()\n\n    this.$element.on('click.dismiss.bs.modal', '[data-dismiss=\"modal\"]', $.proxy(this.hide, this))\n\n    this.backdrop(function () {\n      var transition = $.support.transition && that.$element.hasClass('fade')\n\n      if (!that.$element.parent().length) {\n        that.$element.appendTo(document.body) // don't move modals dom position\n      }\n\n      that.$element\n        .show()\n        .scrollTop(0)\n\n      if (transition) {\n        that.$element[0].offsetWidth // force reflow\n      }\n\n      that.$element\n        .addClass('in')\n        .attr('aria-hidden', false)\n\n      that.enforceFocus()\n\n      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })\n\n      transition ?\n        that.$element.find('.modal-dialog') // wait for modal to slide in\n          .one($.support.transition.end, function () {\n            that.$element.focus().trigger(e)\n          })\n          .emulateTransitionEnd(300) :\n        that.$element.focus().trigger(e)\n    })\n  }\n\n  Modal.prototype.hide = function (e) {\n    if (e) e.preventDefault()\n\n    e = $.Event('hide.bs.modal')\n\n    this.$element.trigger(e)\n\n    if (!this.isShown || e.isDefaultPrevented()) return\n\n    this.isShown = false\n\n    this.escape()\n\n    $(document).off('focusin.bs.modal')\n\n    this.$element\n      .removeClass('in')\n      .attr('aria-hidden', true)\n      .off('click.dismiss.bs.modal')\n\n    $.support.transition && this.$element.hasClass('fade') ?\n      this.$element\n        .one($.support.transition.end, $.proxy(this.hideModal, this))\n        .emulateTransitionEnd(300) :\n      this.hideModal()\n  }\n\n  Modal.prototype.enforceFocus = function () {\n    $(document)\n      .off('focusin.bs.modal') // guard against infinite focus loop\n      .on('focusin.bs.modal', $.proxy(function (e) {\n        if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {\n          this.$element.focus()\n        }\n      }, this))\n  }\n\n  Modal.prototype.escape = function () {\n    if (this.isShown && this.options.keyboard) {\n      this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) {\n        e.which == 27 && this.hide()\n      }, this))\n    } else if (!this.isShown) {\n      this.$element.off('keyup.dismiss.bs.modal')\n    }\n  }\n\n  Modal.prototype.hideModal = function () {\n    var that = this\n    this.$element.hide()\n    this.backdrop(function () {\n      that.removeBackdrop()\n      that.$element.trigger('hidden.bs.modal')\n    })\n  }\n\n  Modal.prototype.removeBackdrop = function () {\n    this.$backdrop && this.$backdrop.remove()\n    this.$backdrop = null\n  }\n\n  Modal.prototype.backdrop = function (callback) {\n    var animate = this.$element.hasClass('fade') ? 'fade' : ''\n\n    if (this.isShown && this.options.backdrop) {\n      var doAnimate = $.support.transition && animate\n\n      this.$backdrop = $('<div class=\"modal-backdrop ' + animate + '\" />')\n        .appendTo(document.body)\n\n      this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {\n        if (e.target !== e.currentTarget) return\n        this.options.backdrop == 'static'\n          ? this.$element[0].focus.call(this.$element[0])\n          : this.hide.call(this)\n      }, this))\n\n      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow\n\n      this.$backdrop.addClass('in')\n\n      if (!callback) return\n\n      doAnimate ?\n        this.$backdrop\n          .one($.support.transition.end, callback)\n          .emulateTransitionEnd(150) :\n        callback()\n\n    } else if (!this.isShown && this.$backdrop) {\n      this.$backdrop.removeClass('in')\n\n      $.support.transition && this.$element.hasClass('fade') ?\n        this.$backdrop\n          .one($.support.transition.end, callback)\n          .emulateTransitionEnd(150) :\n        callback()\n\n    } else if (callback) {\n      callback()\n    }\n  }\n\n\n  // MODAL PLUGIN DEFINITION\n  // =======================\n\n  var old = $.fn.modal\n\n  $.fn.modal = function (option, _relatedTarget) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.modal')\n      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\n      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))\n      if (typeof option == 'string') data[option](_relatedTarget)\n      else if (options.show) data.show(_relatedTarget)\n    })\n  }\n\n  $.fn.modal.Constructor = Modal\n\n\n  // MODAL NO CONFLICT\n  // =================\n\n  $.fn.modal.noConflict = function () {\n    $.fn.modal = old\n    return this\n  }\n\n\n  // MODAL DATA-API\n  // ==============\n\n  $(document).on('click.bs.modal.data-api', '[data-toggle=\"modal\"]', function (e) {\n    var $this   = $(this)\n    var href    = $this.attr('href')\n    var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\\s]+$)/, ''))) //strip for ie7\n    var option  = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())\n\n    if ($this.is('a')) e.preventDefault()\n\n    $target\n      .modal(option, this)\n      .one('hide', function () {\n        $this.is(':visible') && $this.focus()\n      })\n  })\n\n  $(document)\n    .on('show.bs.modal', '.modal', function () { $(document.body).addClass('modal-open') })\n    .on('hidden.bs.modal', '.modal', function () { $(document.body).removeClass('modal-open') })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: tooltip.js v3.1.1\n * http://getbootstrap.com/javascript/#tooltip\n * Inspired by the original jQuery.tipsy by Jason Frame\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // TOOLTIP PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Tooltip = function (element, options) {\n    this.type       =\n    this.options    =\n    this.enabled    =\n    this.timeout    =\n    this.hoverState =\n    this.$element   = null\n\n    this.init('tooltip', element, options)\n  }\n\n  Tooltip.DEFAULTS = {\n    animation: true,\n    placement: 'top',\n    selector: false,\n    template: '<div class=\"tooltip\"><div class=\"tooltip-arrow\"></div><div class=\"tooltip-inner\"></div></div>',\n    trigger: 'hover focus',\n    title: '',\n    delay: 0,\n    html: false,\n    container: false\n  }\n\n  Tooltip.prototype.init = function (type, element, options) {\n    this.enabled  = true\n    this.type     = type\n    this.$element = $(element)\n    this.options  = this.getOptions(options)\n\n    var triggers = this.options.trigger.split(' ')\n\n    for (var i = triggers.length; i--;) {\n      var trigger = triggers[i]\n\n      if (trigger == 'click') {\n        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))\n      } else if (trigger != 'manual') {\n        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focusin'\n        var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'\n\n        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))\n        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))\n      }\n    }\n\n    this.options.selector ?\n      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :\n      this.fixTitle()\n  }\n\n  Tooltip.prototype.getDefaults = function () {\n    return Tooltip.DEFAULTS\n  }\n\n  Tooltip.prototype.getOptions = function (options) {\n    options = $.extend({}, this.getDefaults(), this.$element.data(), options)\n\n    if (options.delay && typeof options.delay == 'number') {\n      options.delay = {\n        show: options.delay,\n        hide: options.delay\n      }\n    }\n\n    return options\n  }\n\n  Tooltip.prototype.getDelegateOptions = function () {\n    var options  = {}\n    var defaults = this.getDefaults()\n\n    this._options && $.each(this._options, function (key, value) {\n      if (defaults[key] != value) options[key] = value\n    })\n\n    return options\n  }\n\n  Tooltip.prototype.enter = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)\n\n    clearTimeout(self.timeout)\n\n    self.hoverState = 'in'\n\n    if (!self.options.delay || !self.options.delay.show) return self.show()\n\n    self.timeout = setTimeout(function () {\n      if (self.hoverState == 'in') self.show()\n    }, self.options.delay.show)\n  }\n\n  Tooltip.prototype.leave = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)\n\n    clearTimeout(self.timeout)\n\n    self.hoverState = 'out'\n\n    if (!self.options.delay || !self.options.delay.hide) return self.hide()\n\n    self.timeout = setTimeout(function () {\n      if (self.hoverState == 'out') self.hide()\n    }, self.options.delay.hide)\n  }\n\n  Tooltip.prototype.show = function () {\n    var e = $.Event('show.bs.' + this.type)\n\n    if (this.hasContent() && this.enabled) {\n      this.$element.trigger(e)\n\n      if (e.isDefaultPrevented()) return\n      var that = this;\n\n      var $tip = this.tip()\n\n      this.setContent()\n\n      if (this.options.animation) $tip.addClass('fade')\n\n      var placement = typeof this.options.placement == 'function' ?\n        this.options.placement.call(this, $tip[0], this.$element[0]) :\n        this.options.placement\n\n      var autoToken = /\\s?auto?\\s?/i\n      var autoPlace = autoToken.test(placement)\n      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'\n\n      $tip\n        .detach()\n        .css({ top: 0, left: 0, display: 'block' })\n        .addClass(placement)\n\n      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)\n\n      var pos          = this.getPosition()\n      var actualWidth  = $tip[0].offsetWidth\n      var actualHeight = $tip[0].offsetHeight\n\n      if (autoPlace) {\n        var $parent = this.$element.parent()\n\n        var orgPlacement = placement\n        var docScroll    = document.documentElement.scrollTop || document.body.scrollTop\n        var parentWidth  = this.options.container == 'body' ? window.innerWidth  : $parent.outerWidth()\n        var parentHeight = this.options.container == 'body' ? window.innerHeight : $parent.outerHeight()\n        var parentLeft   = this.options.container == 'body' ? 0 : $parent.offset().left\n\n        placement = placement == 'bottom' && pos.top   + pos.height  + actualHeight - docScroll > parentHeight  ? 'top'    :\n                    placement == 'top'    && pos.top   - docScroll   - actualHeight < 0                         ? 'bottom' :\n                    placement == 'right'  && pos.right + actualWidth > parentWidth                              ? 'left'   :\n                    placement == 'left'   && pos.left  - actualWidth < parentLeft                               ? 'right'  :\n                    placement\n\n        $tip\n          .removeClass(orgPlacement)\n          .addClass(placement)\n      }\n\n      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)\n\n      this.applyPlacement(calculatedOffset, placement)\n      this.hoverState = null\n\n      var complete = function() {\n        that.$element.trigger('shown.bs.' + that.type)\n      }\n\n      $.support.transition && this.$tip.hasClass('fade') ?\n        $tip\n          .one($.support.transition.end, complete)\n          .emulateTransitionEnd(150) :\n        complete()\n    }\n  }\n\n  Tooltip.prototype.applyPlacement = function (offset, placement) {\n    var replace\n    var $tip   = this.tip()\n    var width  = $tip[0].offsetWidth\n    var height = $tip[0].offsetHeight\n\n    // manually read margins because getBoundingClientRect includes difference\n    var marginTop = parseInt($tip.css('margin-top'), 10)\n    var marginLeft = parseInt($tip.css('margin-left'), 10)\n\n    // we must check for NaN for ie 8/9\n    if (isNaN(marginTop))  marginTop  = 0\n    if (isNaN(marginLeft)) marginLeft = 0\n\n    offset.top  = offset.top  + marginTop\n    offset.left = offset.left + marginLeft\n\n    // $.fn.offset doesn't round pixel values\n    // so we use setOffset directly with our own function B-0\n    $.offset.setOffset($tip[0], $.extend({\n      using: function (props) {\n        $tip.css({\n          top: Math.round(props.top),\n          left: Math.round(props.left)\n        })\n      }\n    }, offset), 0)\n\n    $tip.addClass('in')\n\n    // check to see if placing tip in new offset caused the tip to resize itself\n    var actualWidth  = $tip[0].offsetWidth\n    var actualHeight = $tip[0].offsetHeight\n\n    if (placement == 'top' && actualHeight != height) {\n      replace = true\n      offset.top = offset.top + height - actualHeight\n    }\n\n    if (/bottom|top/.test(placement)) {\n      var delta = 0\n\n      if (offset.left < 0) {\n        delta       = offset.left * -2\n        offset.left = 0\n\n        $tip.offset(offset)\n\n        actualWidth  = $tip[0].offsetWidth\n        actualHeight = $tip[0].offsetHeight\n      }\n\n      this.replaceArrow(delta - width + actualWidth, actualWidth, 'left')\n    } else {\n      this.replaceArrow(actualHeight - height, actualHeight, 'top')\n    }\n\n    if (replace) $tip.offset(offset)\n  }\n\n  Tooltip.prototype.replaceArrow = function (delta, dimension, position) {\n    this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + '%') : '')\n  }\n\n  Tooltip.prototype.setContent = function () {\n    var $tip  = this.tip()\n    var title = this.getTitle()\n\n    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)\n    $tip.removeClass('fade in top bottom left right')\n  }\n\n  Tooltip.prototype.hide = function () {\n    var that = this\n    var $tip = this.tip()\n    var e    = $.Event('hide.bs.' + this.type)\n\n    function complete() {\n      if (that.hoverState != 'in') $tip.detach()\n      that.$element.trigger('hidden.bs.' + that.type)\n    }\n\n    this.$element.trigger(e)\n\n    if (e.isDefaultPrevented()) return\n\n    $tip.removeClass('in')\n\n    $.support.transition && this.$tip.hasClass('fade') ?\n      $tip\n        .one($.support.transition.end, complete)\n        .emulateTransitionEnd(150) :\n      complete()\n\n    this.hoverState = null\n\n    return this\n  }\n\n  Tooltip.prototype.fixTitle = function () {\n    var $e = this.$element\n    if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {\n      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')\n    }\n  }\n\n  Tooltip.prototype.hasContent = function () {\n    return this.getTitle()\n  }\n\n  Tooltip.prototype.getPosition = function () {\n    var el = this.$element[0]\n    return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : {\n      width: el.offsetWidth,\n      height: el.offsetHeight\n    }, this.$element.offset())\n  }\n\n  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {\n    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2  } :\n           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2  } :\n           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :\n        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width   }\n  }\n\n  Tooltip.prototype.getTitle = function () {\n    var title\n    var $e = this.$element\n    var o  = this.options\n\n    title = $e.attr('data-original-title')\n      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)\n\n    return title\n  }\n\n  Tooltip.prototype.tip = function () {\n    return this.$tip = this.$tip || $(this.options.template)\n  }\n\n  Tooltip.prototype.arrow = function () {\n    return this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')\n  }\n\n  Tooltip.prototype.validate = function () {\n    if (!this.$element[0].parentNode) {\n      this.hide()\n      this.$element = null\n      this.options  = null\n    }\n  }\n\n  Tooltip.prototype.enable = function () {\n    this.enabled = true\n  }\n\n  Tooltip.prototype.disable = function () {\n    this.enabled = false\n  }\n\n  Tooltip.prototype.toggleEnabled = function () {\n    this.enabled = !this.enabled\n  }\n\n  Tooltip.prototype.toggle = function (e) {\n    var self = e ? $(e.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type) : this\n    self.tip().hasClass('in') ? self.leave(self) : self.enter(self)\n  }\n\n  Tooltip.prototype.destroy = function () {\n    clearTimeout(this.timeout)\n    this.hide().$element.off('.' + this.type).removeData('bs.' + this.type)\n  }\n\n\n  // TOOLTIP PLUGIN DEFINITION\n  // =========================\n\n  var old = $.fn.tooltip\n\n  $.fn.tooltip = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.tooltip')\n      var options = typeof option == 'object' && option\n\n      if (!data && option == 'destroy') return\n      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.tooltip.Constructor = Tooltip\n\n\n  // TOOLTIP NO CONFLICT\n  // ===================\n\n  $.fn.tooltip.noConflict = function () {\n    $.fn.tooltip = old\n    return this\n  }\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: popover.js v3.1.1\n * http://getbootstrap.com/javascript/#popovers\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // POPOVER PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Popover = function (element, options) {\n    this.init('popover', element, options)\n  }\n\n  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')\n\n  Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {\n    placement: 'right',\n    trigger: 'click',\n    content: '',\n    template: '<div class=\"popover\"><div class=\"arrow\"></div><h3 class=\"popover-title\"></h3><div class=\"popover-content\"></div></div>'\n  })\n\n\n  // NOTE: POPOVER EXTENDS tooltip.js\n  // ================================\n\n  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)\n\n  Popover.prototype.constructor = Popover\n\n  Popover.prototype.getDefaults = function () {\n    return Popover.DEFAULTS\n  }\n\n  Popover.prototype.setContent = function () {\n    var $tip    = this.tip()\n    var title   = this.getTitle()\n    var content = this.getContent()\n\n    $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)\n    $tip.find('.popover-content')[ // we use append for html objects to maintain js events\n      this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'\n    ](content)\n\n    $tip.removeClass('fade top bottom left right in')\n\n    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do\n    // this manually by checking the contents.\n    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()\n  }\n\n  Popover.prototype.hasContent = function () {\n    return this.getTitle() || this.getContent()\n  }\n\n  Popover.prototype.getContent = function () {\n    var $e = this.$element\n    var o  = this.options\n\n    return $e.attr('data-content')\n      || (typeof o.content == 'function' ?\n            o.content.call($e[0]) :\n            o.content)\n  }\n\n  Popover.prototype.arrow = function () {\n    return this.$arrow = this.$arrow || this.tip().find('.arrow')\n  }\n\n  Popover.prototype.tip = function () {\n    if (!this.$tip) this.$tip = $(this.options.template)\n    return this.$tip\n  }\n\n\n  // POPOVER PLUGIN DEFINITION\n  // =========================\n\n  var old = $.fn.popover\n\n  $.fn.popover = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.popover')\n      var options = typeof option == 'object' && option\n\n      if (!data && option == 'destroy') return\n      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.popover.Constructor = Popover\n\n\n  // POPOVER NO CONFLICT\n  // ===================\n\n  $.fn.popover.noConflict = function () {\n    $.fn.popover = old\n    return this\n  }\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: scrollspy.js v3.1.1\n * http://getbootstrap.com/javascript/#scrollspy\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // SCROLLSPY CLASS DEFINITION\n  // ==========================\n\n  function ScrollSpy(element, options) {\n    var href\n    var process  = $.proxy(this.process, this)\n\n    this.$element       = $(element).is('body') ? $(window) : $(element)\n    this.$body          = $('body')\n    this.$scrollElement = this.$element.on('scroll.bs.scroll-spy.data-api', process)\n    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)\n    this.selector       = (this.options.target\n      || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) //strip for ie7\n      || '') + ' .nav li > a'\n    this.offsets        = $([])\n    this.targets        = $([])\n    this.activeTarget   = null\n\n    this.refresh()\n    this.process()\n  }\n\n  ScrollSpy.DEFAULTS = {\n    offset: 10\n  }\n\n  ScrollSpy.prototype.refresh = function () {\n    var offsetMethod = this.$element[0] == window ? 'offset' : 'position'\n\n    this.offsets = $([])\n    this.targets = $([])\n\n    var self     = this\n    var $targets = this.$body\n      .find(this.selector)\n      .map(function () {\n        var $el   = $(this)\n        var href  = $el.data('target') || $el.attr('href')\n        var $href = /^#./.test(href) && $(href)\n\n        return ($href\n          && $href.length\n          && $href.is(':visible')\n          && [[ $href[offsetMethod]().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]]) || null\n      })\n      .sort(function (a, b) { return a[0] - b[0] })\n      .each(function () {\n        self.offsets.push(this[0])\n        self.targets.push(this[1])\n      })\n  }\n\n  ScrollSpy.prototype.process = function () {\n    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset\n    var scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight\n    var maxScroll    = scrollHeight - this.$scrollElement.height()\n    var offsets      = this.offsets\n    var targets      = this.targets\n    var activeTarget = this.activeTarget\n    var i\n\n    if (scrollTop >= maxScroll) {\n      return activeTarget != (i = targets.last()[0]) && this.activate(i)\n    }\n\n    if (activeTarget && scrollTop <= offsets[0]) {\n      return activeTarget != (i = targets[0]) && this.activate(i)\n    }\n\n    for (i = offsets.length; i--;) {\n      activeTarget != targets[i]\n        && scrollTop >= offsets[i]\n        && (!offsets[i + 1] || scrollTop <= offsets[i + 1])\n        && this.activate( targets[i] )\n    }\n  }\n\n  ScrollSpy.prototype.activate = function (target) {\n    this.activeTarget = target\n\n    $(this.selector)\n      .parentsUntil(this.options.target, '.active')\n      .removeClass('active')\n\n    var selector = this.selector +\n        '[data-target=\"' + target + '\"],' +\n        this.selector + '[href=\"' + target + '\"]'\n\n    var active = $(selector)\n      .parents('li')\n      .addClass('active')\n\n    if (active.parent('.dropdown-menu').length) {\n      active = active\n        .closest('li.dropdown')\n        .addClass('active')\n    }\n\n    active.trigger('activate.bs.scrollspy')\n  }\n\n\n  // SCROLLSPY PLUGIN DEFINITION\n  // ===========================\n\n  var old = $.fn.scrollspy\n\n  $.fn.scrollspy = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.scrollspy')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.scrollspy.Constructor = ScrollSpy\n\n\n  // SCROLLSPY NO CONFLICT\n  // =====================\n\n  $.fn.scrollspy.noConflict = function () {\n    $.fn.scrollspy = old\n    return this\n  }\n\n\n  // SCROLLSPY DATA-API\n  // ==================\n\n  $(window).on('load', function () {\n    $('[data-spy=\"scroll\"]').each(function () {\n      var $spy = $(this)\n      $spy.scrollspy($spy.data())\n    })\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: tab.js v3.1.1\n * http://getbootstrap.com/javascript/#tabs\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // TAB CLASS DEFINITION\n  // ====================\n\n  var Tab = function (element) {\n    this.element = $(element)\n  }\n\n  Tab.prototype.show = function () {\n    var $this    = this.element\n    var $ul      = $this.closest('ul:not(.dropdown-menu)')\n    var selector = $this.data('target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') //strip for ie7\n    }\n\n    if ($this.parent('li').hasClass('active')) return\n\n    var previous = $ul.find('.active:last a')[0]\n    var e        = $.Event('show.bs.tab', {\n      relatedTarget: previous\n    })\n\n    $this.trigger(e)\n\n    if (e.isDefaultPrevented()) return\n\n    var $target = $(selector)\n\n    this.activate($this.parent('li'), $ul)\n    this.activate($target, $target.parent(), function () {\n      $this.trigger({\n        type: 'shown.bs.tab',\n        relatedTarget: previous\n      })\n    })\n  }\n\n  Tab.prototype.activate = function (element, container, callback) {\n    var $active    = container.find('> .active')\n    var transition = callback\n      && $.support.transition\n      && $active.hasClass('fade')\n\n    function next() {\n      $active\n        .removeClass('active')\n        .find('> .dropdown-menu > .active')\n        .removeClass('active')\n\n      element.addClass('active')\n\n      if (transition) {\n        element[0].offsetWidth // reflow for transition\n        element.addClass('in')\n      } else {\n        element.removeClass('fade')\n      }\n\n      if (element.parent('.dropdown-menu')) {\n        element.closest('li.dropdown').addClass('active')\n      }\n\n      callback && callback()\n    }\n\n    transition ?\n      $active\n        .one($.support.transition.end, next)\n        .emulateTransitionEnd(150) :\n      next()\n\n    $active.removeClass('in')\n  }\n\n\n  // TAB PLUGIN DEFINITION\n  // =====================\n\n  var old = $.fn.tab\n\n  $.fn.tab = function ( option ) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.tab')\n\n      if (!data) $this.data('bs.tab', (data = new Tab(this)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.tab.Constructor = Tab\n\n\n  // TAB NO CONFLICT\n  // ===============\n\n  $.fn.tab.noConflict = function () {\n    $.fn.tab = old\n    return this\n  }\n\n\n  // TAB DATA-API\n  // ============\n\n  $(document).on('click.bs.tab.data-api', '[data-toggle=\"tab\"], [data-toggle=\"pill\"]', function (e) {\n    e.preventDefault()\n    $(this).tab('show')\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: affix.js v3.1.1\n * http://getbootstrap.com/javascript/#affix\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // AFFIX CLASS DEFINITION\n  // ======================\n\n  var Affix = function (element, options) {\n    this.options = $.extend({}, Affix.DEFAULTS, options)\n    this.$window = $(window)\n      .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))\n      .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))\n\n    this.$element     = $(element)\n    this.affixed      =\n    this.unpin        =\n    this.pinnedOffset = null\n\n    this.checkPosition()\n  }\n\n  Affix.RESET = 'affix affix-top affix-bottom'\n\n  Affix.DEFAULTS = {\n    offset: 0\n  }\n\n  Affix.prototype.getPinnedOffset = function () {\n    if (this.pinnedOffset) return this.pinnedOffset\n    this.$element.removeClass(Affix.RESET).addClass('affix')\n    var scrollTop = this.$window.scrollTop()\n    var position  = this.$element.offset()\n    return (this.pinnedOffset = position.top - scrollTop)\n  }\n\n  Affix.prototype.checkPositionWithEventLoop = function () {\n    setTimeout($.proxy(this.checkPosition, this), 1)\n  }\n\n  Affix.prototype.checkPosition = function () {\n    if (!this.$element.is(':visible')) return\n\n    var scrollHeight = $(document).height()\n    var scrollTop    = this.$window.scrollTop()\n    var position     = this.$element.offset()\n    var offset       = this.options.offset\n    var offsetTop    = offset.top\n    var offsetBottom = offset.bottom\n\n    if (this.affixed == 'top') position.top += scrollTop\n\n    if (typeof offset != 'object')         offsetBottom = offsetTop = offset\n    if (typeof offsetTop == 'function')    offsetTop    = offset.top(this.$element)\n    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)\n\n    var affix = this.unpin   != null && (scrollTop + this.unpin <= position.top) ? false :\n                offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' :\n                offsetTop    != null && (scrollTop <= offsetTop) ? 'top' : false\n\n    if (this.affixed === affix) return\n    if (this.unpin) this.$element.css('top', '')\n\n    var affixType = 'affix' + (affix ? '-' + affix : '')\n    var e         = $.Event(affixType + '.bs.affix')\n\n    this.$element.trigger(e)\n\n    if (e.isDefaultPrevented()) return\n\n    this.affixed = affix\n    this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null\n\n    this.$element\n      .removeClass(Affix.RESET)\n      .addClass(affixType)\n      .trigger($.Event(affixType.replace('affix', 'affixed')))\n\n    if (affix == 'bottom') {\n      this.$element.offset({ top: scrollHeight - offsetBottom - this.$element.height() })\n    }\n  }\n\n\n  // AFFIX PLUGIN DEFINITION\n  // =======================\n\n  var old = $.fn.affix\n\n  $.fn.affix = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.affix')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.affix.Constructor = Affix\n\n\n  // AFFIX NO CONFLICT\n  // =================\n\n  $.fn.affix.noConflict = function () {\n    $.fn.affix = old\n    return this\n  }\n\n\n  // AFFIX DATA-API\n  // ==============\n\n  $(window).on('load', function () {\n    $('[data-spy=\"affix\"]').each(function () {\n      var $spy = $(this)\n      var data = $spy.data()\n\n      data.offset = data.offset || {}\n\n      if (data.offsetBottom) data.offset.bottom = data.offsetBottom\n      if (data.offsetTop)    data.offset.top    = data.offsetTop\n\n      $spy.affix(data)\n    })\n  })\n\n}(jQuery);\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"backstopjs\",\n  \"version\": \"6.3.25\",\n  \"description\": \"BackstopJS: Catch CSS curveballs.\",\n  \"homepage\": \"https://github.com/garris/BackstopJS#readme\",\n  \"bin\": {\n    \"backstop\": \"./cli/index.js\"\n  },\n  \"engines\": {\n    \"node\": \">=16.0.0\",\n    \"npm\": \">=8.0.0\"\n  },\n  \"scripts\": {\n    \"lint\": \"eslint \\\"compare/*.js\\\" \\\"compare/src/**/*.js\\\" \\\"core/**/*.js\\\" \\\"cli/**/*.js\\\" \\\"capture/**/*.js\\\" \\\"test/**/*.js\\\"\",\n    \"format\": \"prettier-eslint --write \\\"compare/src/**/*.js\\\"\",\n    \"init\": \"node ./cli/index.js init\",\n    \"reference\": \"node ./cli/index.js reference\",\n    \"test\": \"node ./cli/index.js test\",\n    \"approve\": \"node ./cli/index.js approve\",\n    \"openReport\": \"node ./cli/index.js openReport\",\n    \"report\": \"node ./cli/index.js openReport\",\n    \"unit-test\": \"mocha --reporter spec --recursive \\\"test/**/*_spec.js\\\" && npm run -s success-message || npm run -s fail-message\",\n    \"precommit\": \"lint-staged\",\n    \"build-compare\": \"cp ./node_modules/diverged/src/diverged.js ./compare/output/ && cp ./node_modules/diff/dist/diff.js ./compare/output/ && webpack --config ./compare/webpack.config.js && npm run -s lint\",\n    \"dev-compare\": \"webpack-dev-server --config ./compare/webpack.config.js\",\n    \"integration-test\": \"rm -rf integrationTestDir && mkdir integrationTestDir && cd integrationTestDir && node ../cli/index.js init && node ../cli/index.js reference && node ../cli/index.js test && node -e \\\"require('../')('test')\\\" && npm --prefix ../ run -s success-message || npm --prefix ../ run -s fail-message\",\n    \"smoke-test\": \"cd test/configs/ && node ../../cli/index.js test --config=backstop_features && npm --prefix ../../ run -s success-message || npm --prefix ../../ run -s caution-message\",\n    \"smoke-test-playwright\": \"cd test/configs/ && node ../../cli/index.js test --config=backstop_features_pw && npm --prefix ../../ run -s fail-message || npm --prefix ../../ run -s caution-message\",\n    \"smoke-test-docker\": \"cd test/configs/ && node ../../cli/index.js test --config=backstop_features --docker && npm --prefix ../../ run -s fail-message || npm --prefix ../../ run -s caution-message\",\n    \"smoke-test-playwright-docker\": \"cd test/configs/ && node ../../cli/index.js test --config=backstop_features_pw --docker && npm --prefix ../../ run -s fail-message || npm --prefix ../../ run -s caution-message\",\n    \"sanity-test\": \"cd test/configs/ && node ../../cli/index.js test && npm --prefix ../../ run -s success-message || npm --prefix ../../ run -s caution-message\",\n    \"reference-test\": \"cd test/configs/ && node ../../cli/index.js reference && node ../../cli/index.js test\",\n    \"sanity-test-playwright\": \"cd test/configs/ && node ../../cli/index.js test --config=playwright && npm --prefix ../../ run -s success-message || npm --prefix ../../ run -s caution-message\",\n    \"sanity-test-docker\": \"cd test/configs/ && node ../../cli/index.js test --docker && npm --prefix ../../ run -s success-message || npm --prefix ../../ run -s caution-message\",\n    \"sanity-test-playwright-docker\": \"cd test/configs/ && node ../../cli/index.js test --config=playwright --docker && npm --prefix ../../ run -s success-message || npm --prefix ../../ run -s caution-message\",\n    \"copy-report-bundle\": \"mkdir -p test/configs/backstop_data/html_report && cp compare/output/index_bundle.js test/configs/backstop_data/html_report/\",\n    \"build-and-copy-report-bundle\": \"npm run build-compare && npm run copy-report-bundle\",\n    \"remote\": \"cd test/configs/ && node ../../cli/index.js remote\",\n    \"stop\": \"cd test/configs/ && node ../../cli/index.js stop\",\n    \"publish-npm\": \"npm publish\",\n    \"build-docker\": \"PV=$(node -p -e \\\"require('./package.json').version\\\"); echo $PV; docker buildx build --platform linux/amd64,linux/arm64 -t backstopjs/backstopjs:$PV --build-arg BACKSTOPJS_VERSION=$PV docker\",\n    \"build-and-load-docker\": \"PV=$(node -p -e \\\"require('./package.json').version\\\"); echo $PV; docker buildx build --load -t backstopjs/backstopjs:$PV docker\",\n    \"publish-docker\": \"PV=$(node -p -e \\\"require('./package.json').version\\\"); echo $PV; docker buildx build --push --platform linux/amd64,linux/arm64 -t backstopjs/backstopjs:$PV --build-arg BACKSTOPJS_VERSION=$PV docker; docker buildx build --push --platform linux/amd64,linux/arm64 -t backstopjs/backstopjs:latest --build-arg BACKSTOPJS_VERSION=$PV docker\",\n    \"build-and-publish\": \"npm run publish-npm && npm run publish-docker\",\n    \"init-docker-builder\": \"docker buildx create --name backstopjsbuilder --use --bootstrap\",\n    \"burn-docker-builder\": \"sh ./docker/burn-docker-builder.sh\",\n    \"success-message\": \"printf \\\"\\\\n\\\\e[32m✓ SUCCESS!\\\\e[0m BackstopJS internal testing passed.\\\\n\\\"\",\n    \"caution-message\": \"printf \\\"\\\\n\\\\e[33m⚠ Notice.\\\\e[0m BackstopJS internal testing exited with a non-success status. This is expected when BackstopJS finds differences.\\\\n\\\"\",\n    \"fail-message\": \"printf \\\"\\\\n\\\\e[31m✖ FAIL!\\\\e[0m BackstopJS internal testing failed. See logs for details.\\\\n\\\"\"\n  },\n  \"lint-staged\": {\n    \"compare/src/**/*.js\": [\n      \"node_modules/.bin/prettier --single-quote --write\",\n      \"git add\"\n    ]\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/garris/backstopjs.git\"\n  },\n  \"author\": \"https://github.com/garris/BackstopJS/graphs/contributors\",\n  \"license\": \"MIT\",\n  \"main\": \"core/runner.js\",\n  \"devDependencies\": {\n    \"@babel/core\": \"^7.23.6\",\n    \"@babel/preset-env\": \"^7.23.6\",\n    \"@babel/preset-react\": \"^7.23.3\",\n    \"assert\": \"^2.1.0\",\n    \"babel-loader\": \"^9.1.3\",\n    \"backstop-twentytwenty\": \"^1.1.0\",\n    \"eslint\": \"^8.56.0\",\n    \"eslint-config-semistandard\": \"17.0.0\",\n    \"eslint-config-standard\": \"17.1.0\",\n    \"eslint-plugin-import\": \"^2.29.1\",\n    \"eslint-plugin-n\": \"^15.0.0\",\n    \"eslint-plugin-node\": \"^11.1.0\",\n    \"eslint-plugin-promise\": \"^6.1.1\",\n    \"eslint-plugin-react\": \"^7.33.2\",\n    \"eslint-plugin-standard\": \"^5.0.0\",\n    \"file-loader\": \"^6.2.0\",\n    \"lint-staged\": \"^15.2.0\",\n    \"mocha\": \"^10.2.0\",\n    \"mockery\": \"^2.1.0\",\n    \"prettier\": \"^3.1.1\",\n    \"prettier-eslint-cli\": \"^8.0.1\",\n    \"react\": \"^18.2.0\",\n    \"react-dom\": \"^18.2.0\",\n    \"react-modal\": \"^3.16.1\",\n    \"react-redux\": \"^9.0.4\",\n    \"react-sticky\": \"^6.0.3\",\n    \"react-toggle-button\": \"^2.2.0\",\n    \"react-visibility-sensor\": \"^5.1.1\",\n    \"redux\": \"^5.0.0\",\n    \"sinon\": \"^17.0.1\",\n    \"styled-components\": \"^6.1.2\",\n    \"url-loader\": \"^4.1.1\",\n    \"webpack\": \"^5.89.0\",\n    \"webpack-cli\": \"^5.1.4\",\n    \"webpack-dev-server\": \"^4.15.1\"\n  },\n  \"dependencies\": {\n    \"@mirzazeyrek/node-resemble-js\": \"^1.2.1\",\n    \"chalk\": \"^4.1.2\",\n    \"diverged\": \"^0.1.3\",\n    \"fs-extra\": \"^11.2.0\",\n    \"jump.js\": \"^1.0.2\",\n    \"junit-report-builder\": \"^3.1.0\",\n    \"lodash\": \"^4.17.21\",\n    \"minimist\": \"^1.2.8\",\n    \"object-hash\": \"3.0.0\",\n    \"opn\": \"^6.0.0\",\n    \"os\": \"^0.1.2\",\n    \"p-map\": \"^4.0.0\",\n    \"path\": \"^0.12.7\",\n    \"playwright\": \"^1.40.1\",\n    \"portfinder\": \"^1.0.32\",\n    \"puppeteer\": \"^22.1.0\",\n    \"super-simple-web-server\": \"^1.1.4\",\n    \"temp\": \"^0.9.4\"\n  }\n}\n"
  },
  {
    "path": "remote/index.js",
    "content": "/* eslint no-console: off */\n'use strict';\n\nconst parseArgs = require('minimist');\nconst argsOptions = parseArgs(process.argv.slice(2), {\n  string: ['config']\n});\nconst PROJECT_PATH = argsOptions._[0];\nconst PATH_TO_CONFIG = argsOptions.config;\nconst _config = require(argsOptions.config);\n\nconst path = require('path');\nconst express = require('express');\nconst backstop = require('../core/runner');\nconst { modifyJsonpReport } = require('../core/util/remote');\n\nconst booleanizeArg = incrementalFlag => [true, 'true'].includes(incrementalFlag);\n\nmodule.exports = function (app) {\n  app._backstop = app._backstop || {};\n  app._backstop.testCtr = 0;\n  app._backstop.tests = {};\n\n  app.use(express.json({ limit: '2mb' })); // support json encoded bodies\n  app.use(express.urlencoded({ extended: true, limit: '2mb' })); // support encoded bodies\n\n  // Handle non-transparent proxy calls from testem (ember compatibility)\n  app.use(function (req, res, next) {\n    req.url = req.url\n      .replace(/\\/backstop\\/backstop_data/, '/backstop_data')\n      .replace(/\\/backstop\\/dview/, '/dview')\n      .replace(/\\/backstop\\/dtest/, '/dtest');\n    next();\n  });\n\n  app.post(['/dtest/:testId/:scenarioId', '/dref/:testId/:scenarioId'], (req, res) => {\n    app._backstop.testCtr++;\n\n    if (!(req.params.testId in app._backstop.tests)) {\n      app._backstop.tests[req.params.testId] = {};\n    }\n    app._backstop.tests[req.params.testId] = {\n      [req.params.scenarioId]: req.body\n    };\n\n    console.log(\n      'Processing dynamic test request for ',\n      `dview/${req.params.testId}/${req.params.scenarioId} `,\n      app._backstop.testCtr\n    );\n    console.log('Loading dynamic config template at ' + PATH_TO_CONFIG);\n\n    const config = JSON.parse(JSON.stringify(_config));\n    config.dynamicTestId = req.params.testId;\n    const s = Object.assign({}, config.scenarios[0], req.body.scenario);\n    s.label = req.body.name;\n    s.url = s.url\n      .replace(/{origin}/, req.body.origin)\n      .replace(/{testId}/, req.params.testId)\n      .replace(/{scenarioId}/, req.params.scenarioId);\n    config.scenarios[0] = s;\n\n    const result = {\n      label: s.label,\n      surl: s.url,\n      testId: req.params.testId,\n      scenarioId: req.params.scenarioId,\n      vid: app._backstop.testCtr\n    };\n\n    const command = req.path.includes('/dref/') ? 'reference' : 'test';\n    backstop(command, { config, i: booleanizeArg(req.body.i) }).then(\n      () => {\n        result.ok = true;\n        res.send(JSON.stringify(result));\n      },\n      () => {\n        result.ok = false;\n        res.send(JSON.stringify(result));\n      }\n    );\n  });\n\n  app.get('/dview/:testId/:scenarioId', (req, res) => {\n    console.log(\n      'Dynamic view request for ' + req.params.testId,\n      req.params.scenarioId\n    );\n    try {\n      res.send(\n        app._backstop.tests[req.params.testId][req.params.scenarioId].content\n      );\n    } catch (err) {\n      console.log(err);\n      res.send(`${req.params.testId} ${req.params.scenarioId}` + err);\n    }\n  });\n\n  app.post('/approve', async (req, res) => {\n    const filter = req.query.filter || '';\n    const config = JSON.parse(JSON.stringify(_config));\n    console.log(`backstop approve --filter=${filter}`);\n\n    try {\n      await backstop('approve', {\n        config,\n        filter\n      });\n\n      const reportConfigFilename = path.join(\n        _config.paths.html_report,\n        'config.js'\n      );\n      await modifyJsonpReport({\n        reportConfigFilename,\n        approvedFileName: filter\n      });\n\n      res.send('OK ' + req.query.filter);\n    } catch (error) {\n      console.log(error);\n      res.status(500).send({ error: error.message });\n    }\n  });\n\n  app.post('/test', async (req, res) => {\n    try {\n      await backstop('test');\n      res.send('OK');\n    } catch (err) {\n      console.log(err);\n      res.send('FAILED ' + err);\n    }\n  });\n\n  app.get('/stop', async (req, res) => {\n    try {\n      await backstop('stop');\n      res.send('OK');\n    } catch (err) {\n      console.log(err);\n      res.send('FAILED ' + err);\n    }\n  });\n\n  app.get('/version', async (req, res) => {\n    try {\n      const version = await backstop('version');\n      res.send('BackstopJS ' + version);\n    } catch (err) {\n      console.log(err);\n      res.send('FAILED ' + err);\n    }\n  });\n};\n"
  },
  {
    "path": "test/.eslintrc",
    "content": "{\n  \"extends\": \"../.eslintrc\",\n  \"env\": {\n    \"mocha\": true\n  }\n}\n"
  },
  {
    "path": "test/cli/index_spec.js",
    "content": "const mockery = require('mockery');\nconst assert = require('assert');\nconst sinon = require('sinon');\n\ndescribe('cli', function () {\n  beforeEach(function () {\n    mockery.enable({ warnOnUnregistered: false, useCleanCache: true });\n  });\n\n  afterEach(function () {\n    mockery.deregisterAll();\n    mockery.disable();\n  });\n\n  it('should call the runner without custom options correctly', function (done) {\n    process.argv = ['node', 'backstop', 'test'];\n    const promiseMock = Promise.resolve();\n    const runnerMock = sinon.stub().returns(promiseMock);\n    mockery.registerMock('../core/runner', runnerMock);\n\n    require('../../cli/index');\n\n    promiseMock.then(() => {\n      assert.strictEqual(process.exitCode, undefined);\n      assert(runnerMock.calledWith('test'));\n      done();\n    });\n  });\n\n  it('should exit with code 1 if runner fails', function (done) {\n    process.argv = ['node', 'backstop', 'test'];\n    const promiseMock = Promise.reject(new Error('errorMock'));\n    const runnerMock = sinon.stub().returns(promiseMock);\n    mockery.registerMock('../core/runner', runnerMock);\n\n    require('../../cli/index');\n\n    promiseMock.catch(() => {\n      assert.strictEqual(process.exitCode, 1);\n      done();\n    });\n  });\n});\n"
  },
  {
    "path": "test/cli/usage_spec.js",
    "content": "const usage = require('../../cli/usage');\nconst assert = require('assert');\n\nconst expectedUsage = /Welcome to BackstopJS/;\n\ndescribe('the cli usage', function () {\n  it('should print usage hints correctly', function () {\n    assert(expectedUsage.test(usage));\n  });\n});\n"
  },
  {
    "path": "test/configs/backstop.json",
    "content": "{\n  \"id\": \"backstop_default\",\n  \"viewports\": [\n    {\n      \"label\": \"phone\",\n      \"width\": 320,\n      \"height\": 480\n    },\n    {\n      \"label\": \"tablet\",\n      \"width\": 1024,\n      \"height\": 768\n    }\n  ],\n  \"onBeforeScript\": \"puppet/onBefore.js\",\n  \"onReadyScript\": \"puppet/onReady.js\",\n  \"scenarios\": [\n    {\n      \"label\": \"BackstopJS Homepage\",\n      \"cookiePath\": \"backstop_data/engine_scripts/cookies.json\",\n      \"url\": \"https://garris.github.io/BackstopJS/\",\n      \"referenceUrl\": \"\",\n      \"readyEvent\": \"\",\n      \"readySelector\": \"\",\n      \"delay\": 0,\n      \"hideSelectors\": [],\n      \"removeSelectors\": [],\n      \"hoverSelector\": \"\",\n      \"clickSelector\": \"\",\n      \"postInteractionWait\": 0,\n      \"selectors\": [],\n      \"selectorExpansion\": true,\n      \"misMatchThreshold\" : 0.1,\n      \"requireSameDimensions\": true\n    }\n  ],\n  \"paths\": {\n    \"bitmaps_reference\": \"backstop_data/bitmaps_reference\",\n    \"bitmaps_test\": \"backstop_data/bitmaps_test\",\n    \"engine_scripts\": \"backstop_data/engine_scripts\",\n    \"html_report\": \"backstop_data/html_report\",\n    \"ci_report\": \"backstop_data/ci_report\"\n  },\n  \"report\": [\"browser\"],\n  \"engine\": \"puppet\",\n  \"engineOptions\": {\n    \"args\": [\"--no-sandbox\"]\n  },\n  \"asyncCaptureLimit\": 5,\n  \"asyncCompareLimit\": 50,\n  \"debug\": false,\n  \"debugWindow\": false,\n  \"archiveReport\": true,\n  \"scenarioLogsInReports\": true\n}\n"
  },
  {
    "path": "test/configs/backstop_alt.js",
    "content": "module.exports = {\n  id: 'puppet_backstop_features',\n  viewports: [\n    {\n      label: 'phone',\n      width: 320,\n      height: 480\n    },\n    {\n      label: 'tablet',\n      width: 1024,\n      height: 768\n    }\n  ],\n  onBeforeScript: 'puppet/onBefore.js',\n  onReadyScript: 'puppet/onReady.js',\n  scenarios: [\n    {\n      label: 'Simple',\n      url: 'https://garris.github.io/BackstopJS/'\n    }\n  ],\n  paths: {\n    bitmaps_reference: 'backstop_data/bitmaps_reference',\n    bitmaps_test: 'backstop_data/bitmaps_test',\n    engine_scripts: 'backstop_data/engine_scripts',\n    html_report: 'backstop_data/html_report',\n    ci_report: 'backstop_data/ci_report'\n  },\n  report: ['browser'],\n  engine: 'puppet',\n  engineOptions: {\n    args: ['--no-sandbox']\n  },\n  asyncCaptureLimit: 10,\n  asyncCompareLimit: 50,\n  debug: false,\n  debugWindow: false\n};\n"
  },
  {
    "path": "test/configs/backstop_data/cookies.json",
    "content": "[\n  {\n    \"domain\": \".garris.github.io\",\n    \"path\": \"/\",\n    \"name\": \"theLemurHasLanded\",\n    \"value\": \"true\",\n    \"expirationDate\": 1798790400,\n    \"hostOnly\": false,\n    \"httpOnly\": false,\n    \"secure\": false,\n    \"session\": false,\n    \"sameSite\": \"Lax\"\n  }\n]\n"
  },
  {
    "path": "test/configs/backstop_data/engine_scripts/cookies.json",
    "content": "[\n  {\n    \"domain\": \".www.yourdomain.com\",\n    \"path\": \"/\",\n    \"name\": \"yourCookieName\",\n    \"value\": \"yourCookieValue\",\n    \"expirationDate\": 1798790400,\n    \"hostOnly\": false,\n    \"httpOnly\": false,\n    \"secure\": false,\n    \"session\": false,\n    \"sameSite\": \"Lax\"\n  }\n]\n"
  },
  {
    "path": "test/configs/backstop_data/engine_scripts/onBefore.js",
    "content": "module.exports = function (engine, scenario, vp) {\n  // This script runs before your app loads. Edit here to log-in, load cookies or set other states required for your test.\n  console.log('onBefore.js has run for ' + vp.label + '.');\n};\n"
  },
  {
    "path": "test/configs/backstop_data/engine_scripts/onReady.js",
    "content": "module.exports = function (engine, scenario, vp) {\n  engine.evaluate(function () {\n    // Your web-app is now loaded. Edit here to simulate user interactions or other state changes in the browser window context.\n  });\n  console.log('onReady.js has run for: ', vp.label);\n};\n"
  },
  {
    "path": "test/configs/backstop_data/engine_scripts/playwright/clickAndHoverHelper.js",
    "content": "module.exports = async (page, scenario) => {\n  const hoverSelector = scenario.hoverSelectors || scenario.hoverSelector;\n  const clickSelector = scenario.clickSelectors || scenario.clickSelector;\n  const keyPressSelector = scenario.keyPressSelectors || scenario.keyPressSelector;\n  const scrollToSelector = scenario.scrollToSelector;\n  const postInteractionWait = scenario.postInteractionWait; // selector [str] | ms [int]\n\n  if (keyPressSelector) {\n    for (const keyPressSelectorItem of [].concat(keyPressSelector)) {\n      await page.waitForSelector(keyPressSelectorItem.selector);\n      await page.type(keyPressSelectorItem.selector, keyPressSelectorItem.keyPress);\n    }\n  }\n\n  if (hoverSelector) {\n    for (const hoverSelectorIndex of [].concat(hoverSelector)) {\n      await page.waitForSelector(hoverSelectorIndex);\n      await page.hover(hoverSelectorIndex);\n    }\n  }\n\n  if (clickSelector) {\n    for (const clickSelectorIndex of [].concat(clickSelector)) {\n      await page.waitForSelector(clickSelectorIndex);\n      await page.click(clickSelectorIndex);\n    }\n  }\n\n  if (postInteractionWait) {\n    if (parseInt(postInteractionWait) > 0) {\n      await page.waitForTimeout(postInteractionWait);\n    } else {\n      await page.waitForSelector(postInteractionWait);\n    }\n  }\n\n  if (scrollToSelector) {\n    await page.waitForSelector(scrollToSelector);\n    await page.evaluate(scrollToSelector => {\n      document.querySelector(scrollToSelector).scrollIntoView();\n    }, scrollToSelector);\n  }\n};\n"
  },
  {
    "path": "test/configs/backstop_data/engine_scripts/playwright/interceptImages.js",
    "content": "/**\n * INTERCEPT IMAGES\n * Listen to all requests. If a request matches IMAGE_URL_RE\n * then stub the image with data from IMAGE_STUB_URL\n *\n * Use this in an onBefore script E.G.\n  ```\n  module.exports = async function(page, scenario) {\n    require('./interceptImages')(page, scenario);\n  }\n  ```\n *\n */\n\nconst fs = require('fs');\nconst path = require('path');\n\nconst IMAGE_URL_RE = /\\.gif|\\.jpg|\\.png/i;\nconst IMAGE_STUB_URL = path.resolve(__dirname, '../../imageStub.jpg');\nconst IMAGE_DATA_BUFFER = fs.readFileSync(IMAGE_STUB_URL);\nconst HEADERS_STUB = {};\n\nmodule.exports = async function (page, scenario) {\n  page.route(IMAGE_URL_RE, route => {\n    route.fulfill({\n      body: IMAGE_DATA_BUFFER,\n      headers: HEADERS_STUB,\n      status: 200\n    });\n  });\n};\n"
  },
  {
    "path": "test/configs/backstop_data/engine_scripts/playwright/loadCookies.js",
    "content": "const fs = require('fs');\n\nmodule.exports = async (browserContext, scenario) => {\n  let cookies = [];\n  const cookiePath = scenario.cookiePath;\n\n  // Read Cookies from File, if exists\n  if (fs.existsSync(cookiePath)) {\n    cookies = JSON.parse(fs.readFileSync(cookiePath));\n  }\n\n  // Add cookies to browser\n  browserContext.addCookies(cookies);\n\n  console.log('Cookie state restored with:', JSON.stringify(cookies, null, 2));\n};\n"
  },
  {
    "path": "test/configs/backstop_data/engine_scripts/playwright/onBefore.js",
    "content": "module.exports = async (page, scenario, viewport, isReference, browserContext) => {\n  await require('./loadCookies')(browserContext, scenario);\n};\n"
  },
  {
    "path": "test/configs/backstop_data/engine_scripts/playwright/onReady.js",
    "content": "module.exports = async (page, scenario, viewport, isReference, browserContext) => {\n  console.log('SCENARIO > ' + scenario.label);\n  await require('./clickAndHoverHelper')(page, scenario);\n\n  // add more ready handlers here...\n};\n"
  },
  {
    "path": "test/configs/backstop_data/engine_scripts/playwright/overrideCSS.js",
    "content": "/**\n * OVERRIDE CSS\n * Apply this CSS to the loaded page, as a way to override styles.\n *\n * Use this in an onReady script E.G.\n  ```\n  module.exports = async function(page, scenario) {\n    await require('./overrideCSS')(page, scenario);\n  }\n  ```\n *\n */\n\nconst BACKSTOP_TEST_CSS_OVERRIDE = `\n  html {\n    background-image: none;\n  }\n`;\n\nmodule.exports = async (page, scenario) => {\n  // inject arbitrary css to override styles\n  await page.addStyleTag({\n    content: BACKSTOP_TEST_CSS_OVERRIDE\n  });\n\n  console.log('BACKSTOP_TEST_CSS_OVERRIDE injected for: ' + scenario.label);\n};\n"
  },
  {
    "path": "test/configs/backstop_data/engine_scripts/puppet/clickAndHoverHelper.js",
    "content": "module.exports = async (page, scenario) => {\n  const hoverSelector = scenario.hoverSelectors || scenario.hoverSelector;\n  const clickSelector = scenario.clickSelectors || scenario.clickSelector;\n  const keyPressSelector = scenario.keyPressSelectors || scenario.keyPressSelector;\n  const scrollToSelector = scenario.scrollToSelector;\n  const postInteractionWait = scenario.postInteractionWait; // selector [str] | ms [int]\n\n  if (keyPressSelector) {\n    for (const keyPressSelectorItem of [].concat(keyPressSelector)) {\n      await page.waitForSelector(keyPressSelectorItem.selector);\n      await page.type(keyPressSelectorItem.selector, keyPressSelectorItem.keyPress);\n    }\n  }\n\n  if (hoverSelector) {\n    await page.waitForSelector(hoverSelector);\n    await page.hover(hoverSelector);\n  }\n\n  if (clickSelector) {\n    await page.waitForSelector(clickSelector);\n    await page.click(clickSelector);\n  }\n\n  if (postInteractionWait) {\n    await new Promise(resolve => {\n      setTimeout(resolve, postInteractionWait);\n    });\n  }\n\n  if (scrollToSelector) {\n    await page.waitForSelector(scrollToSelector);\n    await page.evaluate(scrollToSelector => {\n      document.querySelector(scrollToSelector).scrollIntoView();\n    }, scrollToSelector);\n  }\n};\n"
  },
  {
    "path": "test/configs/backstop_data/engine_scripts/puppet/loadCookies.js",
    "content": "const fs = require('fs');\n\nmodule.exports = async (page, scenario) => {\n  let cookies = [];\n  const cookiePath = scenario.cookiePath;\n\n  // READ COOKIES FROM FILE IF EXISTS\n  if (fs.existsSync(cookiePath)) {\n    cookies = JSON.parse(fs.readFileSync(cookiePath));\n  }\n\n  // // MUNGE COOKIE DOMAIN\n  // cookies = cookies.map(cookie => {\n  //   cookie.url = 'https://' + cookie.domain;\n  //   delete cookie.domain;\n  //   return cookie;\n  // });\n\n  // SET COOKIES\n  const setCookies = async () => {\n    return Promise.all(\n      cookies.map(async (cookie) => {\n        await page.setCookie(cookie);\n      })\n    );\n  };\n\n  await setCookies();\n  console.log('Cookie state restored with:', JSON.stringify(cookies, null, 2));\n};\n"
  },
  {
    "path": "test/configs/backstop_data/engine_scripts/puppet/onBefore.js",
    "content": "module.exports = async (page, scenario, vp) => {\n  await require('./loadCookies')(page, scenario);\n};\n"
  },
  {
    "path": "test/configs/backstop_data/engine_scripts/puppet/onReady.js",
    "content": "module.exports = async (page, scenario, vp) => {\n  console.log('SCENARIO > ' + scenario.label);\n  await require('./clickAndHoverHelper')(page, scenario);\n  await require('./overrideCSS')(page, scenario);\n\n  // add more ready handlers here...\n};\n"
  },
  {
    "path": "test/configs/backstop_data/engine_scripts/puppet/overrideCSS.js",
    "content": "const BACKSTOP_TEST_CSS_OVERRIDE = 'html {background-image: none;}';\n\nmodule.exports = async (page, scenario) => {\n  // inject arbitrary css to override styles\n  await page.evaluate(`window._styleData = '${BACKSTOP_TEST_CSS_OVERRIDE}'`);\n  await page.evaluate(() => {\n    const style = document.createElement('style');\n    style.type = 'text/css';\n    const styleNode = document.createTextNode(window._styleData);\n    style.appendChild(styleNode);\n    document.head.appendChild(style);\n  });\n\n  console.log('BACKSTOP_TEST_CSS_OVERRIDE injected for: ' + scenario.label);\n};\n"
  },
  {
    "path": "test/configs/backstop_fail_cases.js",
    "content": "/**\n * PUT ALL 'FAILING' TESTS IN HERE\n */\n\nconst ENGINE = 'puppet';\nconst SCRIPT_PATH = 'puppet';\n\nmodule.exports = {\n  id: `${ENGINE}_backstop_features`,\n  viewports: [\n    {\n      label: 'phone',\n      width: 320,\n      height: 480\n    },\n    {\n      label: 'tablet',\n      width: 1024,\n      height: 768\n    }\n  ],\n  onBeforeScript: `${SCRIPT_PATH}/onBefore.js`,\n  onReadyScript: `${SCRIPT_PATH}/onReady.js`,\n  scenarios: [\n    {\n      label: 'Simple',\n      url: '../../index.html',\n      selectors: ['.doesNotExist']\n    },\n    {\n      label: 'click',\n      url: '../../index.html?click',\n      clickSelector: '#alsoDoesNotExist',\n      selectors: ['.moneyshot']\n    },\n    {\n      label: 'expect',\n      url: '../../index.html',\n      selectors: ['p'],\n      selectorExpansion: true,\n      expect: 8\n    }\n  ],\n  paths: {\n    bitmaps_reference: 'backstop_data/bitmaps_reference',\n    bitmaps_test: 'backstop_data/bitmaps_test',\n    engine_scripts: 'backstop_data/engine_scripts',\n    html_report: 'backstop_data/html_report',\n    ci_report: 'backstop_data/ci_report'\n  },\n  report: ['browser'],\n  engine: ENGINE,\n  engineOptions: {},\n  asyncCaptureLimit: 10,\n  asyncCompareLimit: 50,\n  debug: false,\n  debugWindow: false\n};\n"
  },
  {
    "path": "test/configs/backstop_features.js",
    "content": "const ENGINE = 'puppet';\nconst SCRIPT_PATH = 'puppet';\nconst URL = 'https://garris.github.io/BackstopJS';\n\nmodule.exports = {\n  id: `${ENGINE}_backstop_features`,\n  viewports: [\n    {\n      label: 'phone',\n      width: 320,\n      height: 480\n    },\n    {\n      label: 'tablet',\n      width: 1024,\n      height: 768\n    }\n  ],\n  onBeforeScript: `${SCRIPT_PATH}/onBefore.js`,\n  onReadyScript: `${SCRIPT_PATH}/onReady.js`,\n  scenarios: [\n    {\n      label: 'Simple',\n      url: `${URL}/index.html`\n    },\n    {\n      label: 'pkra bug test',\n      url: `${URL}/index.html`,\n      selectors: ['#pkratest', '.logoBlock']\n    },\n    {\n      label: 'delay',\n      url: `${URL}/index.html?delay`,\n      delay: 5000,\n      selectors: ['.getItBlock:nth-child(3)']\n    },\n    {\n      label: 'readyEvent',\n      url: `${URL}/index.html?delay`,\n      readyEvent: '_the_lemur_is_ready_to_see_you',\n      selectors: ['.moneyshot']\n    },\n    {\n      label: 'readyEventTimeout',\n      url: `${URL}/index.html?delay`,\n      readyEvent: '_the_lemur_is_ready_to_see_you_timeout',\n      readyTimeout: 2000,\n      selectors: ['.moneyshot']\n    },\n    {\n      label: 'readySelector',\n      url: `${URL}/index.html?delay`,\n      readySelector: '._the_lemur_is_ready_to_see_you',\n      selectors: ['.moneyshot']\n    },\n    {\n      label: 'readySelectorTimeout',\n      url: `${URL}/index.html?delay`,\n      readySelector: '._the_lemur_is_ready_to_see_you_timeout',\n      readyTimeout: 2000,\n      selectors: ['.moneyshot']\n    },\n    {\n      label: 'noDelay',\n      url: `${URL}/index.html?delay`,\n      selectors: ['.getItBlock:nth-child(3)']\n    },\n    {\n      label: 'expanded',\n      url: `${URL}/index.html`,\n      selectors: ['.getItBlock'],\n      selectorExpansion: true,\n      delay: 1000\n    },\n    {\n      label: 'notExpanded',\n      url: `${URL}/index.html`,\n      selectors: ['.getItBlock'],\n      delay: 1000\n    },\n    {\n      label: 'expect',\n      url: `${URL}/index.html`,\n      selectors: ['.getItBlock'],\n      selectorExpansion: true,\n      expect: 4\n    },\n    {\n      label: 'magicSelectors',\n      url: `${URL}/index.html`,\n      selectors: ['document', 'viewport']\n    },\n    {\n      label: 'hideSelectors',\n      url: `${URL}/index.html`,\n      hideSelectors: ['.logo-link', 'p']\n    },\n    {\n      label: 'removeSelectors',\n      url: `${URL}/index.html`,\n      removeSelectors: ['.logo-link', 'p']\n    },\n    {\n      label: 'notFound',\n      url: `${URL}/index.html`,\n      selectors: ['.monkey']\n    },\n    {\n      label: 'notVisible',\n      url: `${URL}/index.html`,\n      selectors: ['#noShow']\n    },\n    {\n      label: 'cookies',\n      cookiePath: 'backstop_data/cookies.json',\n      url: `${URL}/index.html?cookie`,\n      selectors: ['.moneyshot']\n    },\n    // {\n    //   label: 'customReadyScript',\n    //   onReadyScript: `${SCRIPT_PATH}/overrideCSS.js`,\n    //   url: `${URL}/index.html`,\n    //   selectors: ['.moneyshot']\n    // },\n    // {\n    //   label: 'redirect',\n    //   url: `${URL}/index.html`,\n    //   onReadyScript: `${SCRIPT_PATH}/redirect.js`,\n    //   selectors: ['.moneyshot']\n    // },\n    {\n      label: 'hover',\n      url: `${URL}/index.html?click`,\n      hoverSelector: '#theLemur',\n      postInteractionWait: 1000,\n      selectors: ['.moneyshot']\n    },\n    {\n      label: 'click',\n      url: `${URL}/index.html?click`,\n      clickSelector: '#theLemur',\n      postInteractionWait: '._the_lemur_is_ready_to_see_you',\n      selectors: ['.moneyshot']\n    },\n    {\n      label: 'scrollToSelector',\n      url: `${URL}/test/configs/special_cases/scrollToSelector.html`,\n      scrollToSelector: '.lemurFace',\n      selectors: ['.lemurFace']\n    },\n    // {\n    //   label: 'misMatchThreshold_requireSameDimensions',\n    //   url: `${URL}/index.html`,\n    //   referenceUrl: 'https://garris.github.io/BackstopJS/?cookie',\n    //   selectors: ['.moneyshot'],\n    //   misMatchThreshold: 6.0,\n    //   requireSameDimensions: false\n    // },\n    // {\n    //   label: 'misMatchThreshold_realNumberDifference',\n    //   url: `${URL}/index.html`,\n    //   referenceUrl: 'https://garris.github.io/BackstopJS/?cookie',\n    //   selectors: ['.moneyshot'],\n    //   misMatchThreshold: 0.01,\n    //   requireSameDimensions: true\n    // },\n    {\n      label: 'scenarioSpecificViewports',\n      url: `${URL}/index.html`,\n      selectors: ['document', 'viewport'],\n      viewports: [\n        {\n          label: 'Galaxy-S5',\n          width: 360,\n          height: 640\n        }\n      ]\n    },\n    {\n      label: 'scenarioSpecificViewports-withEmptyViewports',\n      url: `${URL}/index.html`,\n      viewports: []\n    },\n    {\n      label: 'scenarioSpecificViewports-withMultipleViewports',\n      url: `${URL}/index.html`,\n      viewports: [\n        {\n          label: 'Pixel-2',\n          width: 411,\n          height: 731\n        },\n        {\n          label: 'Pixel2-XL',\n          width: 411,\n          height: 823\n        },\n        {\n          label: 'iPhone-X',\n          width: 375,\n          height: 812\n        },\n        {\n          label: 'iPad-Pro',\n          width: 1024,\n          height: 1366\n        }\n      ]\n    },\n    {\n      label: 'scenarioSpecificViewports-withExpandSelector',\n      url: `${URL}/index.html`,\n      selectors: ['.getItBlock'],\n      selectorExpansion: true,\n      viewports: [\n        {\n          label: 'iPad-Pro',\n          width: 1024,\n          height: 1366\n        }\n      ]\n    },\n    {\n      label: 'keyPressSelector',\n      url: `${URL}/examples/featureTests/index.html`,\n      keyPressSelectors: [\n        {\n          selector: 'input[placeholder=\"Email\"]',\n          keyPress: 'marcdacz@backstopjs.com'\n        },\n        {\n          selector: 'input[placeholder=\"Password\"]',\n          keyPress: '1234'\n        }\n      ],\n      selectors: ['div[id=navbar]'],\n      postInteractionWait: 1000,\n      misMatchThreshold: 5,\n      viewports: [\n        {\n          label: 'Desktop',\n          width: 800,\n          height: 300\n        }\n      ]\n    }\n  ],\n  paths: {\n    bitmaps_reference: 'backstop_data/bitmaps_reference',\n    bitmaps_test: 'backstop_data/bitmaps_test',\n    engine_scripts: 'backstop_data/engine_scripts',\n    html_report: 'backstop_data/html_report',\n    ci_report: 'backstop_data/ci_report'\n  },\n  report: ['browser', 'json'],\n  engine: ENGINE,\n  engineOptions: {\n    args: ['--no-sandbox']\n  },\n  asyncCaptureLimit: 10,\n  asyncCompareLimit: 50,\n  debug: false,\n  debugWindow: false,\n  scenarioLogsInReports: true\n};\n"
  },
  {
    "path": "test/configs/backstop_features_pw.js",
    "content": "const ENGINE = 'playwright';\nconst BROWSER = 'chromium';\nconst SCRIPT_PATH = 'playwright';\nconst URL = 'https://garris.github.io/BackstopJS';\n\nmodule.exports = {\n  id: `${ENGINE}_${BROWSER}_backstop_features`,\n  viewports: [\n    {\n      label: 'phone',\n      width: 320,\n      height: 480\n    },\n    {\n      label: 'tablet',\n      width: 1024,\n      height: 768\n    }\n  ],\n  onBeforeScript: `${SCRIPT_PATH}/onBefore.js`,\n  onReadyScript: `${SCRIPT_PATH}/onReady.js`,\n  scenarios: [\n    {\n      label: 'Simple',\n      url: `${URL}/index.html`\n    },\n    {\n      label: 'pkra bug test',\n      url: `${URL}/index.html`,\n      selectors: ['#pkratest', '.logoBlock']\n    },\n    {\n      label: 'delay',\n      url: `${URL}/index.html?delay`,\n      delay: 5000,\n      selectors: ['.getItBlock:nth-child(3)']\n    },\n    {\n      label: 'readyEvent',\n      url: `${URL}/index.html?delay`,\n      readyEvent: '_the_lemur_is_ready_to_see_you',\n      selectors: ['.moneyshot']\n    },\n    {\n      label: 'readyEventTimeout',\n      url: `${URL}/index.html?delay`,\n      readyEvent: '_the_lemur_is_ready_to_see_you_timeout',\n      readyTimeout: 2000,\n      selectors: ['.moneyshot']\n    },\n    {\n      label: 'readySelector',\n      url: `${URL}/index.html?delay`,\n      readySelector: '._the_lemur_is_ready_to_see_you',\n      selectors: ['.moneyshot']\n    },\n    {\n      label: 'readySelectorTimeout',\n      url: `${URL}/index.html?delay`,\n      readySelector: '._the_lemur_is_ready_to_see_you_timeout',\n      readyTimeout: 2000,\n      selectors: ['.moneyshot']\n    },\n    {\n      label: 'noDelay',\n      url: `${URL}/index.html?delay`,\n      selectors: ['.getItBlock:nth-child(3)']\n    },\n    {\n      label: 'expanded',\n      url: `${URL}/index.html`,\n      selectors: ['.getItBlock'],\n      selectorExpansion: true,\n      delay: 1000\n    },\n    {\n      label: 'notExpanded',\n      url: `${URL}/index.html`,\n      selectors: ['.getItBlock'],\n      delay: 1000\n    },\n    {\n      label: 'expect',\n      url: `${URL}/index.html`,\n      selectors: ['.getItBlock'],\n      selectorExpansion: true,\n      expect: 4\n    },\n    {\n      label: 'magicSelectors',\n      url: `${URL}/index.html`,\n      selectors: ['document', 'viewport']\n    },\n    {\n      label: 'hideSelectors',\n      url: `${URL}/index.html`,\n      hideSelectors: ['.logo-link', 'p']\n    },\n    {\n      label: 'removeSelectors',\n      url: `${URL}/index.html`,\n      removeSelectors: ['.logo-link', 'p']\n    },\n    {\n      label: 'notFound',\n      url: `${URL}/index.html`,\n      selectors: ['.monkey']\n    },\n    {\n      label: 'notVisible',\n      url: `${URL}/index.html`,\n      selectors: ['#noShow']\n    },\n    {\n      label: 'cookies',\n      cookiePath: 'backstop_data/cookies.json',\n      url: `${URL}/index.html?cookie`,\n      selectors: ['.moneyshot']\n    },\n    // {\n    //   label: 'customReadyScript',\n    //   onReadyScript: `${SCRIPT_PATH}/overrideCSS.js`,\n    //   url: `${URL}/index.html`,\n    //   selectors: ['.moneyshot']\n    // },\n    // {\n    //   label: 'redirect',\n    //   url: `${URL}/index.html`,\n    //   onReadyScript: `${SCRIPT_PATH}/redirect.js`,\n    //   selectors: ['.moneyshot']\n    // },\n    {\n      label: 'hover',\n      url: `${URL}/index.html?click`,\n      hoverSelector: '#theLemur',\n      postInteractionWait: 1000,\n      selectors: ['.moneyshot']\n    },\n    {\n      label: 'click',\n      url: `${URL}/index.html?click`,\n      clickSelector: '#theLemur',\n      postInteractionWait: '._the_lemur_is_ready_to_see_you',\n      selectors: ['.moneyshot']\n    },\n    {\n      label: 'scrollToSelector',\n      url: `${URL}/test/configs/special_cases/scrollToSelector.html`,\n      scrollToSelector: '.lemurFace',\n      selectors: ['.lemurFace']\n    },\n    // {\n    //   label: 'misMatchThreshold_requireSameDimensions',\n    //   url: `${URL}/index.html`,\n    //   referenceUrl: 'https://garris.github.io/BackstopJS/?cookie',\n    //   selectors: ['.moneyshot'],\n    //   misMatchThreshold: 6.0,\n    //   requireSameDimensions: false\n    // },\n    // {\n    //   label: 'misMatchThreshold_realNumberDifference',\n    //   url: `${URL}/index.html`,\n    //   referenceUrl: 'https://garris.github.io/BackstopJS/?cookie',\n    //   selectors: ['.moneyshot'],\n    //   misMatchThreshold: 0.01,\n    //   requireSameDimensions: true\n    // },\n    {\n      label: 'scenarioSpecificViewports',\n      url: `${URL}/index.html`,\n      selectors: ['document', 'viewport'],\n      viewports: [\n        {\n          label: 'Galaxy-S5',\n          width: 360,\n          height: 640\n        }\n      ]\n    },\n    {\n      label: 'scenarioSpecificViewports-withEmptyViewports',\n      url: `${URL}/index.html`,\n      viewports: []\n    },\n    {\n      label: 'scenarioSpecificViewports-withMultipleViewports',\n      url: `${URL}/index.html`,\n      viewports: [\n        {\n          label: 'Pixel-2',\n          width: 411,\n          height: 731\n        },\n        {\n          label: 'Pixel2-XL',\n          width: 411,\n          height: 823\n        },\n        {\n          label: 'iPhone-X',\n          width: 375,\n          height: 812\n        },\n        {\n          label: 'iPad-Pro',\n          width: 1024,\n          height: 1366\n        }\n      ]\n    },\n    {\n      label: 'scenarioSpecificViewports-withExpandSelector',\n      url: `${URL}/index.html`,\n      selectors: ['.getItBlock'],\n      selectorExpansion: true,\n      viewports: [\n        {\n          label: 'iPad-Pro',\n          width: 1024,\n          height: 1366\n        }\n      ]\n    },\n    {\n      label: 'keyPressSelector',\n      url: `${URL}/examples/featureTests/index.html`,\n      keyPressSelectors: [\n        {\n          selector: 'input[placeholder=\"Email\"]',\n          keyPress: 'marcdacz@backstopjs.com'\n        },\n        {\n          selector: 'input[placeholder=\"Password\"]',\n          keyPress: '1234'\n        }\n      ],\n      selectors: ['div[id=navbar]'],\n      postInteractionWait: 1000,\n      misMatchThreshold: 5,\n      viewports: [\n        {\n          label: 'Desktop',\n          width: 800,\n          height: 300\n        }\n      ]\n    }\n  ],\n  paths: {\n    bitmaps_reference: 'backstop_data/bitmaps_reference',\n    bitmaps_test: 'backstop_data/bitmaps_test',\n    engine_scripts: 'backstop_data/engine_scripts',\n    html_report: 'backstop_data/html_report',\n    ci_report: 'backstop_data/ci_report'\n  },\n  report: ['browser', 'json'],\n  engine: `${ENGINE}`,\n  engineOptions: {\n    browser: `${BROWSER}`\n  },\n  asyncCaptureLimit: 10,\n  asyncCompareLimit: 50,\n  debug: false,\n  debugWindow: false\n};\n"
  },
  {
    "path": "test/configs/dynamic_node_app.js",
    "content": "#!/usr/bin/env node\n\n// EXAMPLE COMMAND\n// ~/Development/BackstopJS/test/configs\n// $ node dynamic_node_app --dynamicTestId=6 --testLabel=\"dynamic test\" --scenarioLabel=\"one\" --url=https://garris.github.io/BackstopJS?cookie --command=test\n\n//  THIS IS A DEMO OF DYNAMIC SCENARIO MODE\n//\n// - Each time the above command is run with a unique scenarioLabel and URL a new scenario is created and added to a test identified by dynamicTestId.\n//\n// - In this way you can create an arbitrary test creating new scenarios on-the-fly.\n//\n// - Once you have created initial test data, commands like `--command=approve` will operate as expected using scenario labels defined on the most recent run.\n//\n// - Subsequent `test` runs using a unique dynamicTestId value will create new dynamic scenarios where scenarioLabel and URL values that were approved\n//   on previous runs will compared against the current unique test run.\n//\n// - This mode is intended for integrating with external test runners such as qunit -- like in the https://github.com/garris/ember-backstop project.\n//\n\nconst assert = require('assert').strict;\nconst parseArgs = require('minimist');\nconst backstop = require('../../core/runner');\nconst URL = 'https://garris.github.io/BackstopJS';\n\nconst argsOptions = parseArgs(process.argv.slice(2), {\n  string: ['dynamicTestId', 'testLabel', 'scenarioLabel', 'url', 'command'],\n  default: {\n    url: URL\n  }\n});\n\nconsole.log('Dynamic test example.');\nconsole.log(`config: ${JSON.stringify(argsOptions, null, 2)}`);\n\nassert.ok(argsOptions.dynamicTestId, 'Hold on there: dynamicTestId must represent a unique identifier (string or int) for each test run.');\n\n/**\n * A config used to test explicitly setting a config.\n * @type {Object}\n */\nconst exampleConfig = {\n  i: true, // incremental flag -- suppresses cleaning reference directory during reference command\n  config: {\n    dynamicTestId: argsOptions.dynamicTestId, // when truthy backstop will assume one dynamic scenario which is appended to test report belonging to dynamicTestId\n    id: argsOptions.testLabel,\n    viewports: [\n      {\n        label: 'phone',\n        width: 320,\n        height: 480\n      },\n      {\n        label: 'tablet',\n        width: 1024,\n        height: 768\n      }\n    ],\n    scenarios: [\n      {\n        label: argsOptions.scenarioLabel,\n        url: argsOptions.url\n      }\n    ],\n    paths: {\n      bitmaps_reference: 'backstop_data/bitmaps_reference',\n      bitmaps_test: 'backstop_data/bitmaps_test',\n      engine_scripts: 'backstop_data/engine_scripts',\n      html_report: 'backstop_data/html_report',\n      json_report: 'backstop_data/json_report'\n    },\n    report: ['browser', 'json'],\n    engine: 'puppeteer',\n    asyncCaptureLimit: 5,\n    asyncCompareLimit: 50,\n    debug: false,\n    debugWindow: false\n  }\n};\n\nfunction approve () {\n  backstop('approve', exampleConfig);\n}\n\nfunction open () {\n  backstop('openReport', exampleConfig);\n}\n\nfunction main () {\n  backstop('test', exampleConfig).then(\n    () => {\n      console.log('No changes found.');\n    },\n    () => {\n      console.log('Changes found.');\n    }\n  );\n}\n\nswitch (argsOptions.command) {\n  case 'approve':\n    approve();\n    break;\n  case 'open':\n  case 'openReport':\n    open();\n    break;\n  default:\n    main();\n}\n"
  },
  {
    "path": "test/configs/multi_step node_example.js",
    "content": "const backstop = require('../../core/runner');\n\nconsole.log('Running a multi-step Backstop test. vvv');\n\n// this will run `backstop test` with default config file (./backstop.json in current directory)\nbackstop('test')\n  .catch(approveChanges)\n  .then(() => {\n    // this invocation is equivalent to running `backstop test --config=backstop_features --filter=click`\n    return backstop('test', {\n      filter: 'click',\n      config: 'backstop_features'\n    });\n  })\n  .catch(approveChanges)\n  .then(() => {\n    // this invocation is equivalent to running `backstop test --filter=Delayed` on exampleConfig.\n    return backstop('test', exampleConfig);\n  })\n  .catch(approveChanges);\n\n/**\n * run this to approve changes from the previous run.\n */\nfunction approveChanges () {\n  console.log('Looks like there were some changes detected since last run.');\n  backstop('approve', {\n    config: {\n      id: 'explicity_defined',\n      paths: {\n        bitmaps_reference: 'backstop_data/bitmaps_reference',\n        bitmaps_test: 'backstop_data/bitmaps_test'\n      }\n    }\n  });\n}\n\n/**\n * A config used to test explicity setting a config.\n * @type {Object}\n */\nconst exampleConfig = {\n  filter: 'Delayed',\n  config: {\n    id: 'explicity_defined',\n    viewports: [\n      {\n        label: 'phone',\n        width: 320,\n        height: 480\n      },\n      {\n        label: 'tablet',\n        width: 1024,\n        height: 768\n      }\n    ],\n    onBeforeScript: 'puppeteer/onBefore.js',\n    onReadyScript: 'puppeteer/onReady.js',\n    scenarios: [\n      {\n        label: 'Homepage',\n        cookiePath: 'backstop_data/engine_scripts/cookies.json',\n        url: 'https://garris.github.io/BackstopJS/?delay'\n      },\n      {\n        label: 'Homepage Delayed',\n        cookiePath: 'backstop_data/engine_scripts/cookies.json',\n        url: 'https://garris.github.io/BackstopJS/?delay'\n      }\n    ],\n    paths: {\n      bitmaps_reference: 'backstop_data/bitmaps_reference',\n      bitmaps_test: 'backstop_data/bitmaps_test',\n      engine_scripts: 'backstop_data/engine_scripts',\n      html_report: 'backstop_data/html_report',\n      ci_report: 'backstop_data/ci_report'\n    },\n    report: ['browser'],\n    engine: 'puppeteer',\n    asyncCaptureLimit: 5,\n    asyncCompareLimit: 50,\n    debug: false,\n    debugWindow: false\n  }\n};\n"
  },
  {
    "path": "test/configs/playwright.json",
    "content": "{\n  \"id\": \"backstop_playwright\",\n  \"viewports\": [\n    {\n      \"label\": \"phone\",\n      \"width\": 320,\n      \"height\": 480\n    },\n    {\n      \"label\": \"tablet\",\n      \"width\": 1024,\n      \"height\": 768\n    }\n  ],\n  \"onBeforeScript\": \"playwright/onBefore.js\",\n  \"onReadyScript\": \"playwright/onReady.js\",\n  \"scenarios\": [\n    {\n      \"label\": \"BackstopJS Homepage\",\n      \"cookiePath\": \"backstop_data/engine_scripts/cookies.json\",\n      \"url\": \"https://garris.github.io/BackstopJS/\",\n      \"referenceUrl\": \"\",\n      \"readyEvent\": \"\",\n      \"readySelector\": \"\",\n      \"delay\": 0,\n      \"hideSelectors\": [],\n      \"removeSelectors\": [],\n      \"hoverSelector\": \"\",\n      \"clickSelector\": \"\",\n      \"postInteractionWait\": 0,\n      \"selectors\": [],\n      \"selectorExpansion\": true,\n      \"misMatchThreshold\" : 0.1,\n      \"requireSameDimensions\": true\n    }\n  ],\n  \"paths\": {\n    \"bitmaps_reference\": \"backstop_data/bitmaps_reference\",\n    \"bitmaps_test\": \"backstop_data/bitmaps_test\",\n    \"engine_scripts\": \"backstop_data/engine_scripts\",\n    \"html_report\": \"backstop_data/html_report\",\n    \"ci_report\": \"backstop_data/ci_report\"\n  },\n  \"report\": [\"browser\"],\n  \"engine\": \"playwright\",\n  \"engineOptions\": {\n    \"args\": [\"--no-sandbox\"]\n  },\n  \"asyncCaptureLimit\": 5,\n  \"asyncCompareLimit\": 50,\n  \"debug\": false,\n  \"debugWindow\": false,\n  \"archiveReport\": true,\n  \"scenarioLogsInReports\": true\n}\n"
  },
  {
    "path": "test/configs/remote.js",
    "content": "/* eslint-env browser, node */\n\nmodule.exports = {\n  id: 'backstop-remote',\n  viewports: [\n    {\n      label: 'webview',\n      width: 1440,\n      height: 900\n    }\n  ],\n  onReadyScript: 'puppet/onReady.js',\n  scenarios: [\n    {\n      label: '{testName}',\n      url: '{origin}/backstop/dview/{testId}/{scenarioId}',\n      delay: 500\n    }\n  ],\n  paths: {\n    bitmaps_reference: 'backstop_data/bitmaps_reference',\n    bitmaps_test: 'backstop_data/bitmaps_test',\n    engine_scripts: 'backstop_data/engine_scripts',\n    html_report: 'backstop_data/html_report',\n    ci_report: 'backstop_data/ci_report'\n  },\n  report: [],\n  engine: 'puppet',\n  engineOptions: {\n    args: ['--no-sandbox']\n  },\n  asyncCaptureLimit: 10,\n  asyncCompareLimit: 50,\n  debug: false,\n  debugWindow: false\n};\n"
  },
  {
    "path": "test/configs/responsiveDemo.json",
    "content": "{\n  \"id\": \"responsiveDemoPage\",\n  \"viewports\": [\n    {\n      \"label\": \"phone\",\n      \"width\": 320,\n      \"height\": 480\n    },\n    {\n      \"label\": \"tablet\",\n      \"width\": 1024,\n      \"height\": 768\n    }\n  ],\n  \"onBeforeScript\": \"puppet/onBefore.js\",\n  \"onReadyScript\": \"puppet/onReady.js\",\n  \"scenarios\": [\n    {\n      \"label\": \"comparePage\",\n      \"cookiePath\": \"backstop_data/engine_scripts/cookies.json\",\n      \"url\": \"http://127.0.0.1:3000/responsiveDemoAlias/index.html\",\n      \"referenceUrl\": \"\",\n      \"readyEvent\": \"\",\n      \"readySelector\": \"\",\n      \"delay\": 100,\n      \"hideSelectors\": [],\n      \"removeSelectors\": [],\n      \"hoverSelector\": \"\",\n      \"clickSelector\": \"\",\n      \"postInteractionWait\": 0,\n      \"selectors\": [],\n      \"selectorExpansion\": true,\n      \"expect\": 0,\n      \"misMatchThreshold\" : 0.1,\n      \"requireSameDimensions\": true\n    }\n  ],\n  \"paths\": {\n    \"bitmaps_reference\": \"backstop_data/bitmaps_reference\",\n    \"bitmaps_test\": \"backstop_data/bitmaps_test\",\n    \"engine_scripts\": \"backstop_data/engine_scripts\",\n    \"html_report\": \"backstop_data/html_report\",\n    \"ci_report\": \"backstop_data/ci_report\"\n  },\n  \"report\": [\"browser\"],\n  \"engine\": \"puppeteer\",\n  \"engineOptions\": {\n    \"args\": [\"--no-sandbox\"]\n  },\n  \"asyncCaptureLimit\": 5,\n  \"asyncCompareLimit\": 50,\n  \"debug\": false,\n  \"debugWindow\": false\n}\n"
  },
  {
    "path": "test/configs/responsiveTest.json",
    "content": "{\n  \"id\": \"responsiveDemoPage\",\n  \"viewports\": [\n    {\n      \"label\": \"phone\",\n      \"width\": 320,\n      \"height\": 480\n    },\n    {\n      \"label\": \"tablet\",\n      \"width\": 1024,\n      \"height\": 768\n    }\n  ],\n  \"onBeforeScript\": \"puppet/onBefore.js\",\n  \"onReadyScript\": \"puppet/onReady.js\",\n  \"scenarios\": [\n    {\n      \"label\": \"comparePage\",\n      \"url\": \"../../examples/responsiveDemo/index.html\",\n      \"referenceUrl\": \"\",\n      \"readyEvent\": \"\",\n      \"readySelector\": \"\",\n      \"delay\": 100,\n      \"hideSelectors\": [],\n      \"removeSelectors\": [],\n      \"hoverSelector\": \"\",\n      \"clickSelector\": \"\",\n      \"postInteractionWait\": 0,\n      \"selectors\": [],\n      \"selectorExpansion\": true,\n      \"expect\": 0,\n      \"misMatchThreshold\" : 0.1,\n      \"requireSameDimensions\": true\n    }\n  ],\n  \"paths\": {\n    \"bitmaps_reference\": \"backstop_data/bitmaps_reference\",\n    \"bitmaps_test\": \"backstop_data/bitmaps_test\",\n    \"engine_scripts\": \"backstop_data/engine_scripts\",\n    \"html_report\": \"backstop_data/html_report\",\n    \"ci_report\": \"backstop_data/ci_report\"\n  },\n  \"report\": [\"browser\"],\n  \"engine\": \"puppeteer\",\n  \"engineOptions\": {\n    \"args\": [\"--no-sandbox\"]\n  },\n  \"asyncCaptureLimit\": 5,\n  \"asyncCompareLimit\": 50,\n  \"debug\": false,\n  \"debugWindow\": false\n}\n"
  },
  {
    "path": "test/configs/runFromNode.js",
    "content": "// Go get a hook to BackstopJS\nconst backstop = require('../../core/runner');\n\n// Run BackstopJS with docker\n// NOTE: passing either config file name or actual config object is supported.\nbackstop('reference', {\n  docker: false,\n  config: 'backstop',\n  filter: undefined,\n  i: false\n}).then(\n  () => console.log('nothing new'),\n  () => console.log('changes found')\n);\n"
  },
  {
    "path": "test/configs/special_cases/scrollToSelector.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <style>\n    .scrollable-container {\n      background-color: lightblue;\n      width: 500px;\n      height: 175px;\n      overflow: scroll;\n    }\n\n    .image-box {\n      width: 200px;\n      margin: auto;\n    }\n\n    img.lemurFace {\n      display: block;\n      width: 100%;\n      height: auto;\n    }\n  </style>\n</head>\n<body>\n<div class=\"main-page-layout\">\n  <div class=\"scrollable-container\">\n    <p>\n      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus magna tellus, pellentesque\n      eget sagittis quis, ullamcorper sed sapien. Proin eget mollis nulla. Sed dapibus arcu id\n      pretium ornare. Sed at faucibus tellus. Vestibulum sed efficitur dui, ut dapibus diam.\n      Suspendisse potenti. Curabitur porta, justo quis convallis dictum, nulla ex rutrum ante, eu\n      arius velit dui in libero. Vestibulum eleifend vitae ipsum in mattis. Vivamus sed tempor quam.\n      Quisque vulputate feugiat lobortis. Aliquam erat volutpat.\n    </p>\n\n    <div class=\"image-box\">\n      <img id=\"lemurFace\" src=\"../../../assets/lemurFace.png\" class=\"lemurFace\">\n    </div>\n  </div>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "test/configs/special_cases/scrollToSelector_puppet.js",
    "content": "const ENGINE = 'puppet';\nconst SCRIPT_PATH = 'puppet';\n\nmodule.exports = {\n  id: `${ENGINE}_special_cases`,\n  viewports: [\n    {\n      label: 'phone',\n      width: 320,\n      height: 480\n    },\n    {\n      label: 'tablet',\n      width: 1024,\n      height: 768\n    }\n  ],\n  onBeforeScript: `${SCRIPT_PATH}/onBefore.js`,\n  onReadyScript: `${SCRIPT_PATH}/onReady.js`,\n  scenarios: [\n    {\n      label: 'scrollTo',\n      url: './scrollToSelector.html',\n      scrollToSelector: '.lemurFace',\n      selectors: ['.lemurFace']\n    }\n  ],\n  paths: {\n    bitmaps_reference: '../backstop_data/bitmaps_reference',\n    bitmaps_test: '../backstop_data/bitmaps_test',\n    engine_scripts: '../backstop_data/engine_scripts',\n    html_report: '../backstop_data/html_report',\n    ci_report: '../backstop_data/ci_report'\n  },\n  report: ['browser'],\n  engine: ENGINE,\n  engineOptions: {},\n  asyncCaptureLimit: 10,\n  asyncCompareLimit: 50,\n  debug: false,\n  debugWindow: false\n};\n"
  },
  {
    "path": "test/core/command/report_spec.js",
    "content": "const mockery = require('mockery');\nconst assert = require('assert');\nconst sinon = require('sinon');\n\ndescribe('core report', function () {\n  const config = {\n    report: ['json'],\n    json_report: '/test',\n    compareJsonFileName: '/compareJson',\n    compareConfigFileName: '/compareConfig',\n    html_report: '/html_report',\n    bitmaps_test: '/bitmaps_test',\n    screenshotDateTime: 'screenshotDateTime',\n    args: {\n      config: {}\n    }\n  };\n\n  before(function () {\n    mockery.enable({ warnOnUnregistered: false });\n  });\n\n  after(function () {\n    mockery.disable();\n  });\n\n  it('should generate two json reports and a default browser report when config.report specifies json', function () {\n    const reporterClass = { failed: () => undefined, passed: () => 'passed', getReport: () => { return { test: 123 }; } };\n    const compareMock = sinon.stub().returns(Promise.resolve(reporterClass));\n    const loggerMock = () => {\n      return { log: sinon.stub(), error: sinon.stub() };\n    };\n    const writeFileStub = sinon.stub().returns(Promise.resolve());\n    const fsMock = { ensureDir: () => Promise.resolve(), writeFile: writeFileStub, copy: () => Promise.resolve() };\n    mockery.registerMock('../util/compare/', compareMock);\n    mockery.registerMock('../util/logger', loggerMock);\n    mockery.registerMock('../util/fs', fsMock);\n\n    const report = require('../../../core/command/report');\n\n    return report.execute(config).then(() => {\n      assert.strictEqual(writeFileStub.callCount, 3);\n      assert.strictEqual(writeFileStub.calledWith('/compareJson'), true);\n      assert.strictEqual(writeFileStub.calledWith('/compareConfig'), true);\n      assert.strictEqual(writeFileStub.calledWith('/bitmaps_test/screenshotDateTime/report.json'), true);\n    });\n  });\n});\n"
  },
  {
    "path": "test/core/runner_spec.js",
    "content": "const mockery = require('mockery');\nconst assert = require('assert');\n\ndescribe('the runner', function () {\n  before(function () {\n    mockery.registerMock('./util/makeConfig', function (command, args) {\n      return { command, args };\n    });\n    mockery.registerMock('./command/', function (command, config) {\n      return Promise.resolve({ command, config });\n    });\n    mockery.enable({ warnOnUnregistered: false });\n  });\n\n  after(function () {\n    mockery.disable();\n  });\n\n  it('should call the command/index with the correct config', function () {\n    const runner = require('../../core/runner');\n    return runner('test', {}).then(function (args) {\n      assert.strictEqual(args.command, 'test');\n      assert.deepStrictEqual(args.config, { command: 'test', args: {} });\n    });\n  });\n});\n"
  },
  {
    "path": "test/core/util/backstop.json",
    "content": "{\n\n}\n"
  },
  {
    "path": "test/core/util/compare/compare-hash_spec.js",
    "content": "const compareHash = require('../../../../core/util/compare/compare-hash');\nconst path = require('path');\nconst assert = require('assert');\n\nconst REF_IMG1 = path.join(__dirname, 'refImage-1.png');\nconst REF_IMG1_OPTIMIZED = path.join(__dirname, 'refImage-1-optimized.png');\nconst REF_IMG2 = path.join(__dirname, 'refImage-2.png');\n\ndescribe('compare-hashes', function () {\n  it('should resolve if the same image is compared', function () {\n    const expectedResult = {\n      isSameDimensions: true,\n      dimensionDifference: { width: 0, height: 0 },\n      misMatchPercentage: '0.00'\n    };\n\n    return compareHash(REF_IMG1, REF_IMG1)\n      .then(data => assert.deepStrictEqual(data, expectedResult));\n  });\n  it('should reject if two images have the same content', function (cb) {\n    compareHash(REF_IMG1, REF_IMG1_OPTIMIZED).catch(() => cb());\n  });\n  it('should reject if two images exceed the mismatchThreshold', function (cb) {\n    compareHash(REF_IMG1, REF_IMG2).catch(() => cb());\n  });\n});\n"
  },
  {
    "path": "test/core/util/compare/compare-resemble_spec.js",
    "content": "const compareResemble = require('../../../../core/util/compare/compare-resemble');\nconst path = require('path');\n\nconst REF_IMG1 = path.join(__dirname, 'refImage-1.png');\nconst REF_IMG1_OPTIMIZED = path.join(__dirname, 'refImage-1-optimized.png');\nconst REF_IMG2 = path.join(__dirname, 'refImage-2.png');\nconst REF_IMG3 = path.join(__dirname, 'refImage-3.png');\n\ndescribe('compare-resemble', function () {\n  it('should resolve if the same image is compared', function () {\n    return compareResemble(REF_IMG1, REF_IMG1, 0, {});\n  });\n  it('should resolve if two images have the same content', function () {\n    return compareResemble(REF_IMG1, REF_IMG1_OPTIMIZED, 0, {});\n  });\n  it('should reject if two images exceed the mismatchThreshold', function (cb) {\n    compareResemble(REF_IMG1, REF_IMG2, 0, {}).then(\n      () => cb(new Error('should have rejected')),\n      () => cb()\n    );\n  });\n  it('should use resemble\\'s rounded misMatchPercentage value per default', function () {\n    return compareResemble(REF_IMG1, REF_IMG3, 0, {});\n  });\n  it('should use resemble\\'s more precise rawMisMatchPercentage value if specified', function (cb) {\n    compareResemble(REF_IMG1, REF_IMG3, 0, { usePreciseMatching: true }, true).then(\n      () => cb(new Error('should have rejected')),\n      () => cb()\n    );\n  });\n});\n"
  },
  {
    "path": "test/core/util/compare/compare_spec.js",
    "content": "const mockery = require('mockery');\nconst sinon = require('sinon');\n\ndescribe('compare', function () {\n  let compare;\n  const compareHashes = sinon.stub();\n  const compareResemble = sinon.stub();\n  const error = new Error();\n\n  before(function () {\n    mockery.enable({ warnOnUnregistered: false, warnOnReplace: false, useCleanCache: true });\n    mockery.registerMock('./compare-hash', compareHashes);\n    mockery.registerMock('./compare-resemble', compareResemble);\n    compare = require('../../../../core/util/compare/compare');\n  });\n\n  afterEach(() => {\n    compareResemble.resetBehavior();\n    compareHashes.resetBehavior();\n  });\n\n  after(function () {\n    mockery.disable();\n  });\n\n  it.skip('should resolve if compare-hashes succeed', function () {\n    compareHashes.withArgs('img1.png', 'img2.png').returns(Promise.resolve());\n    compareResemble.returns(Promise.reject(error));\n\n    return compare('img1.png', 'img2.png', 0, {});\n  });\n\n  it.skip('should resolve if compare-hashes fail, but compare-resemble succeeds', function () {\n    compareHashes.returns(Promise.reject(error));\n    compareResemble.withArgs('img1.png', 'img2.png', 0, {}).returns(Promise.resolve());\n\n    return compare('img1.png', 'img2.png', 0, {});\n  });\n\n  it.skip('should reject if compare-hashes and compare-resemble fail', function (cb) {\n    compareHashes.returns(Promise.reject(error));\n    compareResemble.returns(Promise.reject(error));\n\n    compare('img1.png', 'img2.png', 0, {}).catch(() => cb());\n  });\n});\n"
  },
  {
    "path": "test/core/util/engineErrors_spec.js",
    "content": "const engineErrors = require('../../../core/util/engineErrors');\nconst assert = require('assert');\n\ndescribe('core/util/engineErrors', function () {\n  it('should resolve if no engineErrors errors found', function () {\n    const config = {\n      tempCompareConfigFileName: '../../test/core/util/fixtures/engineErrorsSuccess.json'\n    };\n    return engineErrors(config).then(function (args) {\n      assert.strictEqual(args, undefined);\n    });\n  });\n\n  it('should reject if engineErros found', function () {\n    const config = {\n      tempCompareConfigFileName: '../../test/core/util/fixtures/engineErrorsFail.json'\n    };\n    return engineErrors(config).catch(function (args) {\n      assert.strictEqual(args.engineErrorMsg, 'Engine error fail');\n    });\n  });\n});\n"
  },
  {
    "path": "test/core/util/extendConfig_spec.js",
    "content": "const assert = require('assert');\nconst extendConfig = require('../../../core/util/extendConfig');\n\ndescribe('computeConfig_spec', function () {\n  it('should override engine from config file', function () {\n    const actualConfig = extendConfig({ projectPath: process.cwd(), backstop: process.cwd() }, { engine: 'puppet' });\n    assert.strictEqual(actualConfig.engine, 'puppet');\n  });\n\n  it('should override resembleOutputOptions from config file', function () {\n    const actualConfig = extendConfig({\n      projectPath: process.cwd(),\n      backstop: process.cwd()\n    }, { resembleOutputOptions: { transparency: 0.3 } });\n    assert.strictEqual(actualConfig.resembleOutputOptions.transparency, 0.3);\n  });\n});\n"
  },
  {
    "path": "test/core/util/fixtures/engineErrorsFail.json",
    "content": "{\n    \"compareConfig\": {\n      \"testPairs\": [\n        {\n          \"engineErrorMsg\": \"Engine error fail\"\n        }\n      ]\n    }\n  }"
  },
  {
    "path": "test/core/util/fixtures/engineErrorsSuccess.json",
    "content": "{\n    \"compareConfig\": {\n      \"testPairs\": [\n        {\n          \"engineErrorMsg\": \"\"\n        }\n      ]\n    }\n  }"
  },
  {
    "path": "test/core/util/makeConfig_it_spec.js",
    "content": "const assert = require('assert');\nconst path = require('path');\n\nprocess.chdir(__dirname);\n\nconst makeConfig = require('../../../core/util/makeConfig');\nconst { version } = require('../../../package');\nconst configFile = require('./backstop');\n\n// root of backstop dir, not related to cwd\nconst backstopDir = path.resolve(__dirname, '../../..');\n\nconst expectedConfig = {\n  args: {},\n  asyncCompareLimit: undefined,\n  backstop: backstopDir,\n  backstopVersion: version,\n  bitmaps_reference: path.resolve('backstop_data/bitmaps_reference'),\n  bitmaps_test: path.resolve('backstop_data/bitmaps_test'),\n  ci_report: path.resolve('backstop_data/ci_report'),\n  html_report: path.resolve('backstop_data/html_report'),\n  openReport: true,\n  comparePath: path.resolve(backstopDir, 'compare/output'),\n  captureConfigFileNameDefault: path.resolve(\n    backstopDir,\n    'capture/config.default.json'\n  ),\n  engine: null,\n  engine_scripts: path.resolve('backstop_data/engine_scripts'),\n  engine_scripts_default: path.resolve(backstopDir, 'capture/engine_scripts'),\n  perf: {},\n  id: configFile.id,\n  report: ['browser'],\n  ciReport: {\n    format: 'junit',\n    testReportFileName: 'xunit',\n    testSuiteName: 'BackstopJS'\n  },\n  compareConfigFileName: path.resolve('backstop_data/html_report/config.js'),\n  compareReportURL: path.resolve('backstop_data/html_report/index.html'),\n  defaultMisMatchThreshold: 0.1,\n  debug: false,\n  resembleOutputOptions: undefined,\n  scenarioLogsInReports: undefined,\n  dockerCommandTemplate: undefined,\n  archivePath: path.resolve('backstop_data/reports'),\n  archiveReport: false\n};\n\ndescribe('make config it', function () {\n  it('should return the default config correctly', function () {\n    const actualConfig = makeConfig('test');\n\n    assert(actualConfig.tempCompareConfigFileName);\n    delete actualConfig.tempCompareConfigFileName;\n\n    assert(actualConfig.backstopConfigFileName);\n    delete actualConfig.backstopConfigFileName;\n\n    assert(actualConfig.projectPath);\n    delete actualConfig.projectPath;\n\n    assert(actualConfig.captureConfigFileName);\n    delete actualConfig.captureConfigFileName;\n\n    assert(actualConfig.json_report);\n    delete actualConfig.json_report;\n\n    assert(actualConfig.compareJsonFileName);\n    delete actualConfig.compareJsonFileName;\n\n    assert.deepStrictEqual(actualConfig, expectedConfig);\n  });\n});\n"
  },
  {
    "path": "test/core/util/makeConfig_spec.js",
    "content": "const assert = require('assert');\nconst makeConfig = require('../../../core/util/makeConfig');\n\ndescribe('make config', function () {\n  it('should pass the filter arg correctly', function () {\n    const actualConfig = makeConfig('init', { filter: true });\n    assert.strictEqual(actualConfig.args.filter, true);\n  });\n\n  it('should work without an option param', function () {\n    const actualConfig = makeConfig('init');\n    assert.deepStrictEqual(actualConfig.args, {});\n  });\n});\n"
  },
  {
    "path": "test/core/util/remote_spec.js",
    "content": "const assert = require('assert');\nconst { modifyJsonpReportHelper } = require('../../../core/util/remote');\n\nconst originalJsonpReport = `report({\n  \"tests\": [\n    {\n      \"pair\": {\n        \"fileName\": \"scenario_1.png\"\n      },\n      \"status\": \"pass\"\n    },\n    {\n      \"pair\": {\n        \"fileName\": \"scenario_2.png\",\n        \"diffImage\": \"../bitmaps_test/20200217-233748/failed_diff_scenario_2.png\"\n      },\n      \"status\": \"fail\"\n    }\n  ]\n});`;\n\nconst expectedJsonpReport = `report({\n  \"tests\": [\n    {\n      \"pair\": {\n        \"fileName\": \"scenario_1.png\"\n      },\n      \"status\": \"pass\"\n    },\n    {\n      \"pair\": {\n        \"fileName\": \"scenario_2.png\"\n      },\n      \"status\": \"pass\"\n    }\n  ]\n});`;\n\ndescribe('Util | remote', function () {\n  it('should change the approved test status to \"pass\"', function () {\n    const jsonpReport = modifyJsonpReportHelper(originalJsonpReport, 'scenario_2.png');\n    assert.deepStrictEqual(jsonpReport, expectedJsonpReport);\n  });\n});\n"
  },
  {
    "path": "test/core/util/runDocker_spec.js",
    "content": "const mockery = require('mockery');\nconst assert = require('assert');\n\ndescribe('runDocker', function () {\n  beforeEach(function () {\n    mockery.enable({ warnOnUnregistered: false, useCleanCache: true });\n  });\n\n  afterEach(function () {\n    mockery.deregisterAll();\n    mockery.disable();\n  });\n\n  it('should run correct docker command', function (done) {\n    process.cwd = () => '/path/mock';\n    process.argv = ['test'];\n    mockery.registerMock('../../package', { version: 'version.mock' });\n    mockery.registerMock('child_process', {\n      spawn: function (dockerCommand) {\n        assert.strictEqual(\n          dockerCommand,\n          'docker run --rm -it --mount type=bind,source=\"/path/mock\",target=/src backstopjs/backstopjs:version.mock test' +\n          ' \"--moby=true\" \"--config=my_config.json\" \"--filter=my_filter\"');\n        done();\n        return { on: () => {} };\n      }\n    });\n\n    const config = {\n      args: {\n        docker: true,\n        config: 'my_config.json',\n        filter: 'my_filter'\n      }\n    };\n\n    const { runDocker } = require('../../../core/util/runDocker');\n    runDocker(config, 'test');\n  });\n\n  it('should not pass undefined args to docker', function (done) {\n    process.argv = ['test'];\n    mockery.registerMock('child_process', {\n      spawn: function (dockerCommand) {\n        assert(!dockerCommand.includes('--filter'));\n        done();\n        return { on: () => {} };\n      }\n    });\n\n    const config = {\n      args: {\n        docker: true,\n        filter: undefined\n      }\n    };\n\n    const { runDocker } = require('../../../core/util/runDocker');\n    runDocker(config, 'test');\n  });\n\n  it('should create tmp config file if config arg is an object', function (done) {\n    process.argv = ['test'];\n    mockery.registerMock('./fs', {\n      writeFile: function () {\n        return Promise.resolve();\n      }\n    });\n    mockery.registerMock('child_process', {\n      spawn: function (dockerCommand) {\n        assert(dockerCommand.includes('--config=backstop.config-for-docker.json'));\n        done();\n        return { on: () => {} };\n      }\n    });\n\n    const config = {\n      args: {\n        docker: true,\n        config: {\n          id: 'i_am_a_config_object'\n        }\n      }\n    };\n\n    const { runDocker } = require('../../../core/util/runDocker');\n    runDocker(config, 'test');\n  });\n});\n"
  }
]