[
  {
    "path": ".dockerignore",
    "content": ".gitignore\nDockerfile\nMakefile\nREADME.md\nscreenshots/\ntags\n"
  },
  {
    "path": ".gitignore",
    "content": "# See https://help.github.com/ignore-files/ for more about ignoring files.\n\n# dependencies\n/node_modules\n\n# testing\n/coverage\n\n# production\n/build\n\n# misc\n.DS_Store\n.env.local\n.env.development.local\n.env.test.local\n.env.production.local\n\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\ntags\n\n"
  },
  {
    "path": "Dockerfile",
    "content": "FROM ubuntu:16.04\nMAINTAINER ViViDboarder <vividboarder@gmail.com>\n\nRUN apt-get update && \\\n    apt-get install -y curl git xsel && \\\n    curl --silent --location https://deb.nodesource.com/setup_10.x | bash && \\\n    apt-get install -y nodejs && \\\n    apt-get remove --purge -y curl && \\\n    rm -rf /var/lib/apt/lists/*\n\nRUN mkdir -p /usr/src/app\nWORKDIR /usr/src/app\n\nENV CLI_WIDTH 80\nCOPY package.json /usr/src/app\nRUN npm install && npm cache clean --force\nRUN npm install -g serve\n\nEXPOSE 3000\n\nCOPY . /usr/src/app\n\nCMD [ \"./run.sh\" ]\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2017 Hooram Nam\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"
  },
  {
    "path": "Makefile",
    "content": ".PHONY: default build run shell\n\nDOCKER_TAG ?= ownphotos-frontend\n\ndefault: build\n\nbuild:\n\tdocker build -t $(DOCKER_TAG) .\n\nrun: build\n\tdocker run $(DOCKER_TAG)\n\nshell: build\n\tdocker run --rm -it $(DOCKER_TAG) /bin/bash\n"
  },
  {
    "path": "README.md",
    "content": "<div style=\"text-align:center\"><img width=\"100\" src =\"/screenshots/logo.png\"/></div>\n\n# Ownphotos\n\n## What is it?\n\n- Self hosted wannabe Google Photos clone, with a slight focus on cool graphs\n- Django backend & React frontend. \n- In development. \n\n[More detailed info on the backend repo readme](https://github.com/hooram/ownphotos-backend)\n\n"
  },
  {
    "path": "docker-compose.yml",
    "content": "version: '2'\n\nservices:\n\n  proxy:\n    image: guysoft/ownphotos-proxy\n    tty: true\n    container_name: ownphotos-proxy\n    restart: always\n    links:\n      - \"backend:backend\"\n      - \"frontend:frontend\"\n    ports:\n      - \"3000:80\"\n      \n  ownphotos-db:\n    image: postgres\n    container_name: ownphotos-db\n    restart: always\n    environment:\n    # This db password is internal, you can change it if you want, but also change it in ownphotos-backend container\n      - POSTGRES_PASSWORD=AaAa1234\n      - POSTGRES_DB=ownphotos\n    volumes:\n      - ownphotos-data:/var/lib/postgresql/data\n\n  frontend:\n    container_name: ownphotos-frontend\n    image: guysoft/ownphotos-frontend:dev\n    # For development uncomment this and comment the image name above\n    #build: .\n    tty: true\n    environment:\n       # This is the path to the backend host public facing. if your website is ownphotos.org then this should be \"ownphotos.org\".\n       # Default here is assuming you are running on localhost on port 3000 as given in ownphotos-proxy service\n       - BACKEND_HOST=localhost:3000\n    links:\n      - \"backend:backend\"\n\n  backend:\n    image: hooram/ownphotos:dev\n    container_name: ownphotos-backend\n    volumes:\n      # Your photos go here\n      - $HOME/Pictures/:/data\n      - media:/code/media\n    environment:\n      - SECRET_KEY=change_meme\n      # This is backend host from within the service, you dont need to change this\n      - BACKEND_HOST=backend\n      - ADMIN_EMAIL=admin@example.com\n      - ADMIN_USERNAME=admin\n      # Change your admin password!\n      - ADMIN_PASSWORD=admin\n      - DEBUG=true\n      - DB_BACKEND=postgresql\n      - DB_NAME=ownphotos\n      - DB_USER=postgres\n      # This db password is internal, you can change it if you want, but also change it in ownphotos-db container\n      - DB_PASS=AaAa1234\n      - DB_HOST=ownphotos-db\n      - DB_PORT=5432\n      - REDIS_HOST=ownphotos-redis\n      - REDIS_PORT=6379\n      - MAPBOX_API_KEY=CHANGE_MEAAAA\n    links:\n      - \"ownphotos-db:ownphotos-db\"\n      - \"ownphotos-redis:ownphotos-redis\"\n  \n  ownphotos-redis:\n    image: redis\n    container_name: ownphotos-redis\n\nvolumes:\n  ownphotos-data:\n  media:\n"
  },
  {
    "path": "nginx.conf",
    "content": "user  nginx;\nworker_processes  1;\n\nerror_log  /var/log/nginx/error.log debug;\n\nevents {\n    worker_connections  1024;\n}\n\n\nhttp {\n  server {\n    listen 80;\n    location / {\n      proxy_pass http://frontend:3000/;\n    }\n    location /api {\n      proxy_pass http://backend/api;\n    }\n  }\n}\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"ownphotos-frontend\",\n  \"version\": \"0.1.0\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@vx/gradient\": \"0.0.161\",\n    \"@vx/group\": \"0.0.161\",\n    \"@vx/hierarchy\": \"0.0.161\",\n    \"@vx/shape\": \"0.0.162\",\n    \"axios\": \"^0.18.0\",\n    \"bootstrap\": \"^4.1.1\",\n    \"calendar-months\": \"^1.0.1\",\n    \"d3-hierarchy\": \"^1.1.6\",\n    \"d3-shape\": \"^1.2.0\",\n    \"eslint-plugin-import\": \"^2.13.0\",\n    \"eslint-plugin-jsx-a11y\": \"^6.0.3\",\n    \"file-loader\": \"^1.1.11\",\n    \"font-awesome\": \"^4.7.0\",\n    \"immutable\": \"^3.8.1\",\n    \"jwt-decode\": \"^2.2.0\",\n    \"leaflet\": \"^1.3.1\",\n    \"leaflet.markercluster\": \"^1.3.0\",\n    \"lodash\": \"^4.17.10\",\n    \"material-icons-react\": \"^1.0.0\",\n    \"moment\": \"^2.22.2\",\n    \"moment-precise-range-plugin\": \"^1.3.0\",\n    \"prop-types\": \"^15.6.2\",\n    \"react\": \"^16.4.1\",\n    \"react-avatar-editor\": \"^11.0.4\",\n    \"react-calendar-heatmap\": \"^1.6.3\",\n    \"react-content-loader\": \"^3.1.2\",\n    \"react-cookie\": \"^2.2.0\",\n    \"react-d3-graph\": \"1.2.1\",\n    \"react-dimensions\": \"^1.3.0\",\n    \"react-dom\": \"^16.4.1\",\n    \"react-draggable\": \"^3.0.5\",\n    \"react-dropzone\": \"^4.2.12\",\n    \"react-grid-gallery\": \"^0.4.11\",\n    \"react-grid-layout\": \"^0.16.6\",\n    \"react-image-lightbox\": \"https://github.com/hooram/react-image-lightbox\",\n    \"react-keydown\": \"^1.9.4\",\n    \"react-lazyload\": \"^2.2.7\",\n    \"react-leaflet\": \"^1.9.1\",\n    \"react-leaflet-markercluster\": \"^1.1.8\",\n    \"react-modal\": \"^3.4.5\",\n    \"react-placeholder\": \"^3.0.1\",\n    \"react-redux\": \"^5.0.5\",\n    \"react-router-dom\": \"^4.3.1\",\n    \"react-router-redux\": \"^5.0.0-alpha.9\",\n    \"react-scripts\": \"^1.1.4\",\n    \"react-sortable-tree\": \"^2.2.0\",\n    \"react-sortable-tree-theme-file-explorer\": \"^1.1.2\",\n    \"react-transition-group\": \"^2.3.1\",\n    \"react-virtualized\": \"^9.20.0\",\n    \"react-virtualized-item-grid\": \"^1.0.0\",\n    \"react-vis\": \"^1.9.4\",\n    \"react-visibility-sensor\": \"^3.10.0\",\n    \"reapop\": \"^1.2.0\",\n    \"reapop-theme-wybo\": \"^1.0.2\",\n    \"redux\": \"^4.0.0\",\n    \"redux-api-middleware\": \"^2.3.0\",\n    \"redux-logger\": \"^3.0.6\",\n    \"redux-persist\": \"^5.10.0\",\n    \"redux-persist-transform-filter\": \"0.0.16\",\n    \"redux-promise-middleware\": \"^5.1.1\",\n    \"redux-thunk\": \"^2.3.0\",\n    \"rumble-charts\": \"^2.0.0\",\n    \"semantic-ui-css\": \"^2.3.2\",\n    \"semantic-ui-react\": \"^0.80.2\"\n  },\n  \"scripts\": {\n    \"start\": \"react-scripts start\",\n    \"build\": \"react-scripts build\",\n    \"test\": \"react-scripts test --env=jsdom\",\n    \"eject\": \"react-scripts eject\"\n  },\n  \"proxy\": \"http://192.168.1.100:8000/\",\n  \"devDependencies\": {\n    \"eslint\": \"^4.19.1\",\n    \"eslint-plugin-react\": \"^7.10.0\"\n  }\n}\n"
  },
  {
    "path": "public/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=\"theme-color\" content=\"#000000\">\n    <!--\n      manifest.json provides metadata used when your web app is added to the\n      homescreen on Android. See https://developers.google.com/web/fundamentals/engage-and-retain/web-app-manifest/\n    -->\n    <link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.1.0/leaflet.css\" />\n    <!-- <link rel=\"stylesheet\" href=\"https://unpkg.com/react-leaflet-markercluster/dist/styles.min.css\" /> -->\n\n    <style type=\"text/css\">\n      .leaflet-container {\n        height: 250px;\n        width: 100%;\n        z-index: 2;\n        position: relative;\n      }\n    </style>\n    <link rel=\"manifest\" href=\"%PUBLIC_URL%/manifest.json\">\n    <link rel=\"shortcut icon\" href=\"%PUBLIC_URL%/favicon.ico\">\n    <!--\n      Notice the use of %PUBLIC_URL% in the tags above.\n      It will be replaced with the URL of the `public` folder during the build.\n      Only files inside the `public` folder can be referenced from the HTML.\n\n      Unlike \"/favicon.ico\" or \"favicon.ico\", \"%PUBLIC_URL%/favicon.ico\" will\n      work correctly both with client-side routing and a non-root public URL.\n      Learn how to configure a non-root public URL by running `npm run build`.\n    -->\n\n    <title>Ownphotos</title>\n  </head>\n  <body>\n    <noscript>\n      You need to enable JavaScript to run this app.\n    </noscript>\n    <div id=\"root\"></div>\n    <!--\n      This HTML file is a template.\n      If you open it directly in the browser, you will see an empty page.\n\n      You can add webfonts, meta tags, or analytics to this file.\n      The build step will place the bundled scripts into the <body> tag.\n\n      To begin the development, run `npm start` or `yarn start`.\n      To create a production bundle, use `npm run build` or `yarn build`.\n    -->\n  </body>\n</html>\n"
  },
  {
    "path": "public/manifest.json",
    "content": "{\n  \"short_name\": \"Ownphotos\",\n  \"name\": \"Ownphotos\",\n  \"icons\": [\n    {\n      \"src\": \"favicon.ico\",\n      \"sizes\": \"192x192\",\n      \"type\": \"image/png\"\n    }\n  ],\n  \"start_url\": \"./index.html\",\n  \"display\": \"standalone\",\n  \"theme_color\": \"#000000\",\n  \"background_color\": \"#ffffff\"\n}\n"
  },
  {
    "path": "run.sh",
    "content": "#!/usr/bin/env bash\nsed -i \"s@http://192.168.1.100@//${BACKEND_HOST}@g\" src/api_client/apiClient.js\nsed -i \"s@http://192.168.1.100:8000/@http://backend/@g\" package.json\n\n# echo \"building frontend\"\n# npm run build\n# echo \"serving frontend\"\n# serve build -d -l 3000\n\nDANGEROUSLY_DISABLE_HOST_CHECK=true HOST=0.0.0.0 npm start\n\n"
  },
  {
    "path": "semantic/gulpfile.js",
    "content": "/*******************************\n            Set-up\n*******************************/\n\nvar\n  gulp         = require('gulp-help')(require('gulp')),\n\n  // read user config to know what task to load\n  config       = require('./tasks/config/user'),\n\n  // watch changes\n  watch        = require('./tasks/watch'),\n\n  // build all files\n  build        = require('./tasks/build'),\n  buildJS      = require('./tasks/build/javascript'),\n  buildCSS     = require('./tasks/build/css'),\n  buildAssets  = require('./tasks/build/assets'),\n\n  // utility\n  clean        = require('./tasks/clean'),\n  version      = require('./tasks/version'),\n\n  // docs tasks\n  serveDocs    = require('./tasks/docs/serve'),\n  buildDocs    = require('./tasks/docs/build'),\n\n  // rtl\n  buildRTL     = require('./tasks/rtl/build'),\n  watchRTL     = require('./tasks/rtl/watch')\n;\n\n\n/*******************************\n             Tasks\n*******************************/\n\ngulp.task('default', false, [\n  'watch'\n]);\n\ngulp.task('watch', 'Watch for site/theme changes', watch);\n\ngulp.task('build', 'Builds all files from source', build);\ngulp.task('build-javascript', 'Builds all javascript from source', buildJS);\ngulp.task('build-css', 'Builds all css from source', buildCSS);\ngulp.task('build-assets', 'Copies all assets from source', buildAssets);\n\ngulp.task('clean', 'Clean dist folder', clean);\ngulp.task('version', 'Displays current version of Semantic', version);\n\n/*--------------\n      Docs\n---------------*/\n\n/*\n  Lets you serve files to a local documentation instance\n  https://github.com/Semantic-Org/Semantic-UI-Docs/\n*/\n\ngulp.task('serve-docs', 'Serve file changes to SUI Docs', serveDocs);\ngulp.task('build-docs', 'Build all files and add to SUI Docs', buildDocs);\n\n\n/*--------------\n      RTL\n---------------*/\n\nif(config.rtl) {\n  gulp.task('watch-rtl', 'Watch files as RTL', watchRTL);\n  gulp.task('build-rtl', 'Build all files as RTL', buildRTL);\n}\n"
  },
  {
    "path": "semantic/src/definitions/behaviors/api.js",
    "content": "/*!\n * # Semantic UI - API\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n;(function ($, window, document, undefined) {\n\n'use strict';\n\nvar\n  window = (typeof window != 'undefined' && window.Math == Math)\n    ? window\n    : (typeof self != 'undefined' && self.Math == Math)\n      ? self\n      : Function('return this')()\n;\n\n$.api = $.fn.api = function(parameters) {\n\n  var\n    // use window context if none specified\n    $allModules     = $.isFunction(this)\n        ? $(window)\n        : $(this),\n    moduleSelector = $allModules.selector || '',\n    time           = new Date().getTime(),\n    performance    = [],\n\n    query          = arguments[0],\n    methodInvoked  = (typeof query == 'string'),\n    queryArguments = [].slice.call(arguments, 1),\n\n    returnedValue\n  ;\n\n  $allModules\n    .each(function() {\n      var\n        settings          = ( $.isPlainObject(parameters) )\n          ? $.extend(true, {}, $.fn.api.settings, parameters)\n          : $.extend({}, $.fn.api.settings),\n\n        // internal aliases\n        namespace       = settings.namespace,\n        metadata        = settings.metadata,\n        selector        = settings.selector,\n        error           = settings.error,\n        className       = settings.className,\n\n        // define namespaces for modules\n        eventNamespace  = '.' + namespace,\n        moduleNamespace = 'module-' + namespace,\n\n        // element that creates request\n        $module         = $(this),\n        $form           = $module.closest(selector.form),\n\n        // context used for state\n        $context        = (settings.stateContext)\n          ? $(settings.stateContext)\n          : $module,\n\n        // request details\n        ajaxSettings,\n        requestSettings,\n        url,\n        data,\n        requestStartTime,\n\n        // standard module\n        element         = this,\n        context         = $context[0],\n        instance        = $module.data(moduleNamespace),\n        module\n      ;\n\n      module = {\n\n        initialize: function() {\n          if(!methodInvoked) {\n            module.bind.events();\n          }\n          module.instantiate();\n        },\n\n        instantiate: function() {\n          module.verbose('Storing instance of module', module);\n          instance = module;\n          $module\n            .data(moduleNamespace, instance)\n          ;\n        },\n\n        destroy: function() {\n          module.verbose('Destroying previous module for', element);\n          $module\n            .removeData(moduleNamespace)\n            .off(eventNamespace)\n          ;\n        },\n\n        bind: {\n          events: function() {\n            var\n              triggerEvent = module.get.event()\n            ;\n            if( triggerEvent ) {\n              module.verbose('Attaching API events to element', triggerEvent);\n              $module\n                .on(triggerEvent + eventNamespace, module.event.trigger)\n              ;\n            }\n            else if(settings.on == 'now') {\n              module.debug('Querying API endpoint immediately');\n              module.query();\n            }\n          }\n        },\n\n        decode: {\n          json: function(response) {\n            if(response !== undefined && typeof response == 'string') {\n              try {\n               response = JSON.parse(response);\n              }\n              catch(e) {\n                // isnt json string\n              }\n            }\n            return response;\n          }\n        },\n\n        read: {\n          cachedResponse: function(url) {\n            var\n              response\n            ;\n            if(window.Storage === undefined) {\n              module.error(error.noStorage);\n              return;\n            }\n            response = sessionStorage.getItem(url);\n            module.debug('Using cached response', url, response);\n            response = module.decode.json(response);\n            return response;\n          }\n        },\n        write: {\n          cachedResponse: function(url, response) {\n            if(response && response === '') {\n              module.debug('Response empty, not caching', response);\n              return;\n            }\n            if(window.Storage === undefined) {\n              module.error(error.noStorage);\n              return;\n            }\n            if( $.isPlainObject(response) ) {\n              response = JSON.stringify(response);\n            }\n            sessionStorage.setItem(url, response);\n            module.verbose('Storing cached response for url', url, response);\n          }\n        },\n\n        query: function() {\n\n          if(module.is.disabled()) {\n            module.debug('Element is disabled API request aborted');\n            return;\n          }\n\n          if(module.is.loading()) {\n            if(settings.interruptRequests) {\n              module.debug('Interrupting previous request');\n              module.abort();\n            }\n            else {\n              module.debug('Cancelling request, previous request is still pending');\n              return;\n            }\n          }\n\n          // pass element metadata to url (value, text)\n          if(settings.defaultData) {\n            $.extend(true, settings.urlData, module.get.defaultData());\n          }\n\n          // Add form content\n          if(settings.serializeForm) {\n            settings.data = module.add.formData(settings.data);\n          }\n\n          // call beforesend and get any settings changes\n          requestSettings = module.get.settings();\n\n          // check if before send cancelled request\n          if(requestSettings === false) {\n            module.cancelled = true;\n            module.error(error.beforeSend);\n            return;\n          }\n          else {\n            module.cancelled = false;\n          }\n\n          // get url\n          url = module.get.templatedURL();\n\n          if(!url && !module.is.mocked()) {\n            module.error(error.missingURL);\n            return;\n          }\n\n          // replace variables\n          url = module.add.urlData( url );\n          // missing url parameters\n          if( !url && !module.is.mocked()) {\n            return;\n          }\n\n          requestSettings.url = settings.base + url;\n\n          // look for jQuery ajax parameters in settings\n          ajaxSettings = $.extend(true, {}, settings, {\n            type       : settings.method || settings.type,\n            data       : data,\n            url        : settings.base + url,\n            beforeSend : settings.beforeXHR,\n            success    : function() {},\n            failure    : function() {},\n            complete   : function() {}\n          });\n\n          module.debug('Querying URL', ajaxSettings.url);\n          module.verbose('Using AJAX settings', ajaxSettings);\n          if(settings.cache === 'local' && module.read.cachedResponse(url)) {\n            module.debug('Response returned from local cache');\n            module.request = module.create.request();\n            module.request.resolveWith(context, [ module.read.cachedResponse(url) ]);\n            return;\n          }\n\n          if( !settings.throttle ) {\n            module.debug('Sending request', data, ajaxSettings.method);\n            module.send.request();\n          }\n          else {\n            if(!settings.throttleFirstRequest && !module.timer) {\n              module.debug('Sending request', data, ajaxSettings.method);\n              module.send.request();\n              module.timer = setTimeout(function(){}, settings.throttle);\n            }\n            else {\n              module.debug('Throttling request', settings.throttle);\n              clearTimeout(module.timer);\n              module.timer = setTimeout(function() {\n                if(module.timer) {\n                  delete module.timer;\n                }\n                module.debug('Sending throttled request', data, ajaxSettings.method);\n                module.send.request();\n              }, settings.throttle);\n            }\n          }\n\n        },\n\n        should: {\n          removeError: function() {\n            return ( settings.hideError === true || (settings.hideError === 'auto' && !module.is.form()) );\n          }\n        },\n\n        is: {\n          disabled: function() {\n            return ($module.filter(selector.disabled).length > 0);\n          },\n          expectingJSON: function() {\n            return settings.dataType === 'json' || settings.dataType === 'jsonp';\n          },\n          form: function() {\n            return $module.is('form') || $context.is('form');\n          },\n          mocked: function() {\n            return (settings.mockResponse || settings.mockResponseAsync || settings.response || settings.responseAsync);\n          },\n          input: function() {\n            return $module.is('input');\n          },\n          loading: function() {\n            return (module.request)\n              ? (module.request.state() == 'pending')\n              : false\n            ;\n          },\n          abortedRequest: function(xhr) {\n            if(xhr && xhr.readyState !== undefined && xhr.readyState === 0) {\n              module.verbose('XHR request determined to be aborted');\n              return true;\n            }\n            else {\n              module.verbose('XHR request was not aborted');\n              return false;\n            }\n          },\n          validResponse: function(response) {\n            if( (!module.is.expectingJSON()) || !$.isFunction(settings.successTest) ) {\n              module.verbose('Response is not JSON, skipping validation', settings.successTest, response);\n              return true;\n            }\n            module.debug('Checking JSON returned success', settings.successTest, response);\n            if( settings.successTest(response) ) {\n              module.debug('Response passed success test', response);\n              return true;\n            }\n            else {\n              module.debug('Response failed success test', response);\n              return false;\n            }\n          }\n        },\n\n        was: {\n          cancelled: function() {\n            return (module.cancelled || false);\n          },\n          succesful: function() {\n            return (module.request && module.request.state() == 'resolved');\n          },\n          failure: function() {\n            return (module.request && module.request.state() == 'rejected');\n          },\n          complete: function() {\n            return (module.request && (module.request.state() == 'resolved' || module.request.state() == 'rejected') );\n          }\n        },\n\n        add: {\n          urlData: function(url, urlData) {\n            var\n              requiredVariables,\n              optionalVariables\n            ;\n            if(url) {\n              requiredVariables = url.match(settings.regExp.required);\n              optionalVariables = url.match(settings.regExp.optional);\n              urlData           = urlData || settings.urlData;\n              if(requiredVariables) {\n                module.debug('Looking for required URL variables', requiredVariables);\n                $.each(requiredVariables, function(index, templatedString) {\n                  var\n                    // allow legacy {$var} style\n                    variable = (templatedString.indexOf('$') !== -1)\n                      ? templatedString.substr(2, templatedString.length - 3)\n                      : templatedString.substr(1, templatedString.length - 2),\n                    value   = ($.isPlainObject(urlData) && urlData[variable] !== undefined)\n                      ? urlData[variable]\n                      : ($module.data(variable) !== undefined)\n                        ? $module.data(variable)\n                        : ($context.data(variable) !== undefined)\n                          ? $context.data(variable)\n                          : urlData[variable]\n                  ;\n                  // remove value\n                  if(value === undefined) {\n                    module.error(error.requiredParameter, variable, url);\n                    url = false;\n                    return false;\n                  }\n                  else {\n                    module.verbose('Found required variable', variable, value);\n                    value = (settings.encodeParameters)\n                      ? module.get.urlEncodedValue(value)\n                      : value\n                    ;\n                    url = url.replace(templatedString, value);\n                  }\n                });\n              }\n              if(optionalVariables) {\n                module.debug('Looking for optional URL variables', requiredVariables);\n                $.each(optionalVariables, function(index, templatedString) {\n                  var\n                    // allow legacy {/$var} style\n                    variable = (templatedString.indexOf('$') !== -1)\n                      ? templatedString.substr(3, templatedString.length - 4)\n                      : templatedString.substr(2, templatedString.length - 3),\n                    value   = ($.isPlainObject(urlData) && urlData[variable] !== undefined)\n                      ? urlData[variable]\n                      : ($module.data(variable) !== undefined)\n                        ? $module.data(variable)\n                        : ($context.data(variable) !== undefined)\n                          ? $context.data(variable)\n                          : urlData[variable]\n                  ;\n                  // optional replacement\n                  if(value !== undefined) {\n                    module.verbose('Optional variable Found', variable, value);\n                    url = url.replace(templatedString, value);\n                  }\n                  else {\n                    module.verbose('Optional variable not found', variable);\n                    // remove preceding slash if set\n                    if(url.indexOf('/' + templatedString) !== -1) {\n                      url = url.replace('/' + templatedString, '');\n                    }\n                    else {\n                      url = url.replace(templatedString, '');\n                    }\n                  }\n                });\n              }\n            }\n            return url;\n          },\n          formData: function(data) {\n            var\n              canSerialize = ($.fn.serializeObject !== undefined),\n              formData     = (canSerialize)\n                ? $form.serializeObject()\n                : $form.serialize(),\n              hasOtherData\n            ;\n            data         = data || settings.data;\n            hasOtherData = $.isPlainObject(data);\n\n            if(hasOtherData) {\n              if(canSerialize) {\n                module.debug('Extending existing data with form data', data, formData);\n                data = $.extend(true, {}, data, formData);\n              }\n              else {\n                module.error(error.missingSerialize);\n                module.debug('Cant extend data. Replacing data with form data', data, formData);\n                data = formData;\n              }\n            }\n            else {\n              module.debug('Adding form data', formData);\n              data = formData;\n            }\n            return data;\n          }\n        },\n\n        send: {\n          request: function() {\n            module.set.loading();\n            module.request = module.create.request();\n            if( module.is.mocked() ) {\n              module.mockedXHR = module.create.mockedXHR();\n            }\n            else {\n              module.xhr = module.create.xhr();\n            }\n            settings.onRequest.call(context, module.request, module.xhr);\n          }\n        },\n\n        event: {\n          trigger: function(event) {\n            module.query();\n            if(event.type == 'submit' || event.type == 'click') {\n              event.preventDefault();\n            }\n          },\n          xhr: {\n            always: function() {\n              // nothing special\n            },\n            done: function(response, textStatus, xhr) {\n              var\n                context            = this,\n                elapsedTime        = (new Date().getTime() - requestStartTime),\n                timeLeft           = (settings.loadingDuration - elapsedTime),\n                translatedResponse = ( $.isFunction(settings.onResponse) )\n                  ? module.is.expectingJSON()\n                    ? settings.onResponse.call(context, $.extend(true, {}, response))\n                    : settings.onResponse.call(context, response)\n                  : false\n              ;\n              timeLeft = (timeLeft > 0)\n                ? timeLeft\n                : 0\n              ;\n              if(translatedResponse) {\n                module.debug('Modified API response in onResponse callback', settings.onResponse, translatedResponse, response);\n                response = translatedResponse;\n              }\n              if(timeLeft > 0) {\n                module.debug('Response completed early delaying state change by', timeLeft);\n              }\n              setTimeout(function() {\n                if( module.is.validResponse(response) ) {\n                  module.request.resolveWith(context, [response, xhr]);\n                }\n                else {\n                  module.request.rejectWith(context, [xhr, 'invalid']);\n                }\n              }, timeLeft);\n            },\n            fail: function(xhr, status, httpMessage) {\n              var\n                context     = this,\n                elapsedTime = (new Date().getTime() - requestStartTime),\n                timeLeft    = (settings.loadingDuration - elapsedTime)\n              ;\n              timeLeft = (timeLeft > 0)\n                ? timeLeft\n                : 0\n              ;\n              if(timeLeft > 0) {\n                module.debug('Response completed early delaying state change by', timeLeft);\n              }\n              setTimeout(function() {\n                if( module.is.abortedRequest(xhr) ) {\n                  module.request.rejectWith(context, [xhr, 'aborted', httpMessage]);\n                }\n                else {\n                  module.request.rejectWith(context, [xhr, 'error', status, httpMessage]);\n                }\n              }, timeLeft);\n            }\n          },\n          request: {\n            done: function(response, xhr) {\n              module.debug('Successful API Response', response);\n              if(settings.cache === 'local' && url) {\n                module.write.cachedResponse(url, response);\n                module.debug('Saving server response locally', module.cache);\n              }\n              settings.onSuccess.call(context, response, $module, xhr);\n            },\n            complete: function(firstParameter, secondParameter) {\n              var\n                xhr,\n                response\n              ;\n              // have to guess callback parameters based on request success\n              if( module.was.succesful() ) {\n                response = firstParameter;\n                xhr      = secondParameter;\n              }\n              else {\n                xhr      = firstParameter;\n                response = module.get.responseFromXHR(xhr);\n              }\n              module.remove.loading();\n              settings.onComplete.call(context, response, $module, xhr);\n            },\n            fail: function(xhr, status, httpMessage) {\n              var\n                // pull response from xhr if available\n                response     = module.get.responseFromXHR(xhr),\n                errorMessage = module.get.errorFromRequest(response, status, httpMessage)\n              ;\n              if(status == 'aborted') {\n                module.debug('XHR Aborted (Most likely caused by page navigation or CORS Policy)', status, httpMessage);\n                settings.onAbort.call(context, status, $module, xhr);\n                return true;\n              }\n              else if(status == 'invalid') {\n                module.debug('JSON did not pass success test. A server-side error has most likely occurred', response);\n              }\n              else if(status == 'error') {\n                if(xhr !== undefined) {\n                  module.debug('XHR produced a server error', status, httpMessage);\n                  // make sure we have an error to display to console\n                  if( xhr.status != 200 && httpMessage !== undefined && httpMessage !== '') {\n                    module.error(error.statusMessage + httpMessage, ajaxSettings.url);\n                  }\n                  settings.onError.call(context, errorMessage, $module, xhr);\n                }\n              }\n\n              if(settings.errorDuration && status !== 'aborted') {\n                module.debug('Adding error state');\n                module.set.error();\n                if( module.should.removeError() ) {\n                  setTimeout(module.remove.error, settings.errorDuration);\n                }\n              }\n              module.debug('API Request failed', errorMessage, xhr);\n              settings.onFailure.call(context, response, $module, xhr);\n            }\n          }\n        },\n\n        create: {\n\n          request: function() {\n            // api request promise\n            return $.Deferred()\n              .always(module.event.request.complete)\n              .done(module.event.request.done)\n              .fail(module.event.request.fail)\n            ;\n          },\n\n          mockedXHR: function () {\n            var\n              // xhr does not simulate these properties of xhr but must return them\n              textStatus     = false,\n              status         = false,\n              httpMessage    = false,\n              responder      = settings.mockResponse      || settings.response,\n              asyncResponder = settings.mockResponseAsync || settings.responseAsync,\n              asyncCallback,\n              response,\n              mockedXHR\n            ;\n\n            mockedXHR = $.Deferred()\n              .always(module.event.xhr.complete)\n              .done(module.event.xhr.done)\n              .fail(module.event.xhr.fail)\n            ;\n\n            if(responder) {\n              if( $.isFunction(responder) ) {\n                module.debug('Using specified synchronous callback', responder);\n                response = responder.call(context, requestSettings);\n              }\n              else {\n                module.debug('Using settings specified response', responder);\n                response = responder;\n              }\n              // simulating response\n              mockedXHR.resolveWith(context, [ response, textStatus, { responseText: response }]);\n            }\n            else if( $.isFunction(asyncResponder) ) {\n              asyncCallback = function(response) {\n                module.debug('Async callback returned response', response);\n\n                if(response) {\n                  mockedXHR.resolveWith(context, [ response, textStatus, { responseText: response }]);\n                }\n                else {\n                  mockedXHR.rejectWith(context, [{ responseText: response }, status, httpMessage]);\n                }\n              };\n              module.debug('Using specified async response callback', asyncResponder);\n              asyncResponder.call(context, requestSettings, asyncCallback);\n            }\n            return mockedXHR;\n          },\n\n          xhr: function() {\n            var\n              xhr\n            ;\n            // ajax request promise\n            xhr = $.ajax(ajaxSettings)\n              .always(module.event.xhr.always)\n              .done(module.event.xhr.done)\n              .fail(module.event.xhr.fail)\n            ;\n            module.verbose('Created server request', xhr, ajaxSettings);\n            return xhr;\n          }\n        },\n\n        set: {\n          error: function() {\n            module.verbose('Adding error state to element', $context);\n            $context.addClass(className.error);\n          },\n          loading: function() {\n            module.verbose('Adding loading state to element', $context);\n            $context.addClass(className.loading);\n            requestStartTime = new Date().getTime();\n          }\n        },\n\n        remove: {\n          error: function() {\n            module.verbose('Removing error state from element', $context);\n            $context.removeClass(className.error);\n          },\n          loading: function() {\n            module.verbose('Removing loading state from element', $context);\n            $context.removeClass(className.loading);\n          }\n        },\n\n        get: {\n          responseFromXHR: function(xhr) {\n            return $.isPlainObject(xhr)\n              ? (module.is.expectingJSON())\n                ? module.decode.json(xhr.responseText)\n                : xhr.responseText\n              : false\n            ;\n          },\n          errorFromRequest: function(response, status, httpMessage) {\n            return ($.isPlainObject(response) && response.error !== undefined)\n              ? response.error // use json error message\n              : (settings.error[status] !== undefined) // use server error message\n                ? settings.error[status]\n                : httpMessage\n            ;\n          },\n          request: function() {\n            return module.request || false;\n          },\n          xhr: function() {\n            return module.xhr || false;\n          },\n          settings: function() {\n            var\n              runSettings\n            ;\n            runSettings = settings.beforeSend.call(context, settings);\n            if(runSettings) {\n              if(runSettings.success !== undefined) {\n                module.debug('Legacy success callback detected', runSettings);\n                module.error(error.legacyParameters, runSettings.success);\n                runSettings.onSuccess = runSettings.success;\n              }\n              if(runSettings.failure !== undefined) {\n                module.debug('Legacy failure callback detected', runSettings);\n                module.error(error.legacyParameters, runSettings.failure);\n                runSettings.onFailure = runSettings.failure;\n              }\n              if(runSettings.complete !== undefined) {\n                module.debug('Legacy complete callback detected', runSettings);\n                module.error(error.legacyParameters, runSettings.complete);\n                runSettings.onComplete = runSettings.complete;\n              }\n            }\n            if(runSettings === undefined) {\n              module.error(error.noReturnedValue);\n            }\n            if(runSettings === false) {\n              return runSettings;\n            }\n            return (runSettings !== undefined)\n              ? $.extend(true, {}, runSettings)\n              : $.extend(true, {}, settings)\n            ;\n          },\n          urlEncodedValue: function(value) {\n            var\n              decodedValue   = window.decodeURIComponent(value),\n              encodedValue   = window.encodeURIComponent(value),\n              alreadyEncoded = (decodedValue !== value)\n            ;\n            if(alreadyEncoded) {\n              module.debug('URL value is already encoded, avoiding double encoding', value);\n              return value;\n            }\n            module.verbose('Encoding value using encodeURIComponent', value, encodedValue);\n            return encodedValue;\n          },\n          defaultData: function() {\n            var\n              data = {}\n            ;\n            if( !$.isWindow(element) ) {\n              if( module.is.input() ) {\n                data.value = $module.val();\n              }\n              else if( module.is.form() ) {\n\n              }\n              else {\n                data.text = $module.text();\n              }\n            }\n            return data;\n          },\n          event: function() {\n            if( $.isWindow(element) || settings.on == 'now' ) {\n              module.debug('API called without element, no events attached');\n              return false;\n            }\n            else if(settings.on == 'auto') {\n              if( $module.is('input') ) {\n                return (element.oninput !== undefined)\n                  ? 'input'\n                  : (element.onpropertychange !== undefined)\n                    ? 'propertychange'\n                    : 'keyup'\n                ;\n              }\n              else if( $module.is('form') ) {\n                return 'submit';\n              }\n              else {\n                return 'click';\n              }\n            }\n            else {\n              return settings.on;\n            }\n          },\n          templatedURL: function(action) {\n            action = action || $module.data(metadata.action) || settings.action || false;\n            url    = $module.data(metadata.url) || settings.url || false;\n            if(url) {\n              module.debug('Using specified url', url);\n              return url;\n            }\n            if(action) {\n              module.debug('Looking up url for action', action, settings.api);\n              if(settings.api[action] === undefined && !module.is.mocked()) {\n                module.error(error.missingAction, settings.action, settings.api);\n                return;\n              }\n              url = settings.api[action];\n            }\n            else if( module.is.form() ) {\n              url = $module.attr('action') || $context.attr('action') || false;\n              module.debug('No url or action specified, defaulting to form action', url);\n            }\n            return url;\n          }\n        },\n\n        abort: function() {\n          var\n            xhr = module.get.xhr()\n          ;\n          if( xhr && xhr.state() !== 'resolved') {\n            module.debug('Cancelling API request');\n            xhr.abort();\n          }\n        },\n\n        // reset state\n        reset: function() {\n          module.remove.error();\n          module.remove.loading();\n        },\n\n        setting: function(name, value) {\n          module.debug('Changing setting', name, value);\n          if( $.isPlainObject(name) ) {\n            $.extend(true, settings, name);\n          }\n          else if(value !== undefined) {\n            if($.isPlainObject(settings[name])) {\n              $.extend(true, settings[name], value);\n            }\n            else {\n              settings[name] = value;\n            }\n          }\n          else {\n            return settings[name];\n          }\n        },\n        internal: function(name, value) {\n          if( $.isPlainObject(name) ) {\n            $.extend(true, module, name);\n          }\n          else if(value !== undefined) {\n            module[name] = value;\n          }\n          else {\n            return module[name];\n          }\n        },\n        debug: function() {\n          if(!settings.silent && settings.debug) {\n            if(settings.performance) {\n              module.performance.log(arguments);\n            }\n            else {\n              module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');\n              module.debug.apply(console, arguments);\n            }\n          }\n        },\n        verbose: function() {\n          if(!settings.silent && settings.verbose && settings.debug) {\n            if(settings.performance) {\n              module.performance.log(arguments);\n            }\n            else {\n              module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');\n              module.verbose.apply(console, arguments);\n            }\n          }\n        },\n        error: function() {\n          if(!settings.silent) {\n            module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');\n            module.error.apply(console, arguments);\n          }\n        },\n        performance: {\n          log: function(message) {\n            var\n              currentTime,\n              executionTime,\n              previousTime\n            ;\n            if(settings.performance) {\n              currentTime   = new Date().getTime();\n              previousTime  = time || currentTime;\n              executionTime = currentTime - previousTime;\n              time          = currentTime;\n              performance.push({\n                'Name'           : message[0],\n                'Arguments'      : [].slice.call(message, 1) || '',\n                //'Element'        : element,\n                'Execution Time' : executionTime\n              });\n            }\n            clearTimeout(module.performance.timer);\n            module.performance.timer = setTimeout(module.performance.display, 500);\n          },\n          display: function() {\n            var\n              title = settings.name + ':',\n              totalTime = 0\n            ;\n            time = false;\n            clearTimeout(module.performance.timer);\n            $.each(performance, function(index, data) {\n              totalTime += data['Execution Time'];\n            });\n            title += ' ' + totalTime + 'ms';\n            if(moduleSelector) {\n              title += ' \\'' + moduleSelector + '\\'';\n            }\n            if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {\n              console.groupCollapsed(title);\n              if(console.table) {\n                console.table(performance);\n              }\n              else {\n                $.each(performance, function(index, data) {\n                  console.log(data['Name'] + ': ' + data['Execution Time']+'ms');\n                });\n              }\n              console.groupEnd();\n            }\n            performance = [];\n          }\n        },\n        invoke: function(query, passedArguments, context) {\n          var\n            object = instance,\n            maxDepth,\n            found,\n            response\n          ;\n          passedArguments = passedArguments || queryArguments;\n          context         = element         || context;\n          if(typeof query == 'string' && object !== undefined) {\n            query    = query.split(/[\\. ]/);\n            maxDepth = query.length - 1;\n            $.each(query, function(depth, value) {\n              var camelCaseValue = (depth != maxDepth)\n                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)\n                : query\n              ;\n              if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {\n                object = object[camelCaseValue];\n              }\n              else if( object[camelCaseValue] !== undefined ) {\n                found = object[camelCaseValue];\n                return false;\n              }\n              else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {\n                object = object[value];\n              }\n              else if( object[value] !== undefined ) {\n                found = object[value];\n                return false;\n              }\n              else {\n                module.error(error.method, query);\n                return false;\n              }\n            });\n          }\n          if ( $.isFunction( found ) ) {\n            response = found.apply(context, passedArguments);\n          }\n          else if(found !== undefined) {\n            response = found;\n          }\n          if($.isArray(returnedValue)) {\n            returnedValue.push(response);\n          }\n          else if(returnedValue !== undefined) {\n            returnedValue = [returnedValue, response];\n          }\n          else if(response !== undefined) {\n            returnedValue = response;\n          }\n          return found;\n        }\n      };\n\n      if(methodInvoked) {\n        if(instance === undefined) {\n          module.initialize();\n        }\n        module.invoke(query);\n      }\n      else {\n        if(instance !== undefined) {\n          instance.invoke('destroy');\n        }\n        module.initialize();\n      }\n    })\n  ;\n\n  return (returnedValue !== undefined)\n    ? returnedValue\n    : this\n  ;\n};\n\n$.api.settings = {\n\n  name              : 'API',\n  namespace         : 'api',\n\n  debug             : false,\n  verbose           : false,\n  performance       : true,\n\n  // object containing all templates endpoints\n  api               : {},\n\n  // whether to cache responses\n  cache             : true,\n\n  // whether new requests should abort previous requests\n  interruptRequests : true,\n\n  // event binding\n  on                : 'auto',\n\n  // context for applying state classes\n  stateContext      : false,\n\n  // duration for loading state\n  loadingDuration   : 0,\n\n  // whether to hide errors after a period of time\n  hideError         : 'auto',\n\n  // duration for error state\n  errorDuration     : 2000,\n\n  // whether parameters should be encoded with encodeURIComponent\n  encodeParameters  : true,\n\n  // API action to use\n  action            : false,\n\n  // templated URL to use\n  url               : false,\n\n  // base URL to apply to all endpoints\n  base              : '',\n\n  // data that will\n  urlData           : {},\n\n  // whether to add default data to url data\n  defaultData          : true,\n\n  // whether to serialize closest form\n  serializeForm        : false,\n\n  // how long to wait before request should occur\n  throttle             : 0,\n\n  // whether to throttle first request or only repeated\n  throttleFirstRequest : true,\n\n  // standard ajax settings\n  method            : 'get',\n  data              : {},\n  dataType          : 'json',\n\n  // mock response\n  mockResponse      : false,\n  mockResponseAsync : false,\n\n  // aliases for mock\n  response          : false,\n  responseAsync     : false,\n\n  // callbacks before request\n  beforeSend  : function(settings) { return settings; },\n  beforeXHR   : function(xhr) {},\n  onRequest   : function(promise, xhr) {},\n\n  // after request\n  onResponse  : false, // function(response) { },\n\n  // response was successful, if JSON passed validation\n  onSuccess   : function(response, $module) {},\n\n  // request finished without aborting\n  onComplete  : function(response, $module) {},\n\n  // failed JSON success test\n  onFailure   : function(response, $module) {},\n\n  // server error\n  onError     : function(errorMessage, $module) {},\n\n  // request aborted\n  onAbort     : function(errorMessage, $module) {},\n\n  successTest : false,\n\n  // errors\n  error : {\n    beforeSend        : 'The before send function has aborted the request',\n    error             : 'There was an error with your request',\n    exitConditions    : 'API Request Aborted. Exit conditions met',\n    JSONParse         : 'JSON could not be parsed during error handling',\n    legacyParameters  : 'You are using legacy API success callback names',\n    method            : 'The method you called is not defined',\n    missingAction     : 'API action used but no url was defined',\n    missingSerialize  : 'jquery-serialize-object is required to add form data to an existing data object',\n    missingURL        : 'No URL specified for api event',\n    noReturnedValue   : 'The beforeSend callback must return a settings object, beforeSend ignored.',\n    noStorage         : 'Caching responses locally requires session storage',\n    parseError        : 'There was an error parsing your request',\n    requiredParameter : 'Missing a required URL parameter: ',\n    statusMessage     : 'Server gave an error: ',\n    timeout           : 'Your request timed out'\n  },\n\n  regExp  : {\n    required : /\\{\\$*[A-z0-9]+\\}/g,\n    optional : /\\{\\/\\$*[A-z0-9]+\\}/g,\n  },\n\n  className: {\n    loading : 'loading',\n    error   : 'error'\n  },\n\n  selector: {\n    disabled : '.disabled',\n    form      : 'form'\n  },\n\n  metadata: {\n    action  : 'action',\n    url     : 'url'\n  }\n};\n\n\n\n})( jQuery, window, document );\n"
  },
  {
    "path": "semantic/src/definitions/behaviors/form.js",
    "content": "/*!\n * # Semantic UI - Form Validation\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n;(function ($, window, document, undefined) {\n\n'use strict';\n\nwindow = (typeof window != 'undefined' && window.Math == Math)\n  ? window\n  : (typeof self != 'undefined' && self.Math == Math)\n    ? self\n    : Function('return this')()\n;\n\n$.fn.form = function(parameters) {\n  var\n    $allModules      = $(this),\n    moduleSelector   = $allModules.selector || '',\n\n    time             = new Date().getTime(),\n    performance      = [],\n\n    query            = arguments[0],\n    legacyParameters = arguments[1],\n    methodInvoked    = (typeof query == 'string'),\n    queryArguments   = [].slice.call(arguments, 1),\n    returnedValue\n  ;\n  $allModules\n    .each(function() {\n      var\n        $module     = $(this),\n        element     = this,\n\n        formErrors  = [],\n        keyHeldDown = false,\n\n        // set at run-time\n        $field,\n        $group,\n        $message,\n        $prompt,\n        $submit,\n        $clear,\n        $reset,\n\n        settings,\n        validation,\n\n        metadata,\n        selector,\n        className,\n        regExp,\n        error,\n\n        namespace,\n        moduleNamespace,\n        eventNamespace,\n\n        instance,\n        module\n      ;\n\n      module      = {\n\n        initialize: function() {\n\n          // settings grabbed at run time\n          module.get.settings();\n          if(methodInvoked) {\n            if(instance === undefined) {\n              module.instantiate();\n            }\n            module.invoke(query);\n          }\n          else {\n            if(instance !== undefined) {\n              instance.invoke('destroy');\n            }\n            module.verbose('Initializing form validation', $module, settings);\n            module.bindEvents();\n            module.set.defaults();\n            module.instantiate();\n          }\n        },\n\n        instantiate: function() {\n          module.verbose('Storing instance of module', module);\n          instance = module;\n          $module\n            .data(moduleNamespace, module)\n          ;\n        },\n\n        destroy: function() {\n          module.verbose('Destroying previous module', instance);\n          module.removeEvents();\n          $module\n            .removeData(moduleNamespace)\n          ;\n        },\n\n        refresh: function() {\n          module.verbose('Refreshing selector cache');\n          $field      = $module.find(selector.field);\n          $group      = $module.find(selector.group);\n          $message    = $module.find(selector.message);\n          $prompt     = $module.find(selector.prompt);\n\n          $submit     = $module.find(selector.submit);\n          $clear      = $module.find(selector.clear);\n          $reset      = $module.find(selector.reset);\n        },\n\n        submit: function() {\n          module.verbose('Submitting form', $module);\n          $module\n            .submit()\n          ;\n        },\n\n        attachEvents: function(selector, action) {\n          action = action || 'submit';\n          $(selector)\n            .on('click' + eventNamespace, function(event) {\n              module[action]();\n              event.preventDefault();\n            })\n          ;\n        },\n\n        bindEvents: function() {\n          module.verbose('Attaching form events');\n          $module\n            .on('submit' + eventNamespace, module.validate.form)\n            .on('blur'   + eventNamespace, selector.field, module.event.field.blur)\n            .on('click'  + eventNamespace, selector.submit, module.submit)\n            .on('click'  + eventNamespace, selector.reset, module.reset)\n            .on('click'  + eventNamespace, selector.clear, module.clear)\n          ;\n          if(settings.keyboardShortcuts) {\n            $module\n              .on('keydown' + eventNamespace, selector.field, module.event.field.keydown)\n            ;\n          }\n          $field\n            .each(function() {\n              var\n                $input     = $(this),\n                type       = $input.prop('type'),\n                inputEvent = module.get.changeEvent(type, $input)\n              ;\n              $(this)\n                .on(inputEvent + eventNamespace, module.event.field.change)\n              ;\n            })\n          ;\n        },\n\n        clear: function() {\n          $field\n            .each(function () {\n              var\n                $field       = $(this),\n                $element     = $field.parent(),\n                $fieldGroup  = $field.closest($group),\n                $prompt      = $fieldGroup.find(selector.prompt),\n                defaultValue = $field.data(metadata.defaultValue) || '',\n                isCheckbox   = $element.is(selector.uiCheckbox),\n                isDropdown   = $element.is(selector.uiDropdown),\n                isErrored    = $fieldGroup.hasClass(className.error)\n              ;\n              if(isErrored) {\n                module.verbose('Resetting error on field', $fieldGroup);\n                $fieldGroup.removeClass(className.error);\n                $prompt.remove();\n              }\n              if(isDropdown) {\n                module.verbose('Resetting dropdown value', $element, defaultValue);\n                $element.dropdown('clear');\n              }\n              else if(isCheckbox) {\n                $field.prop('checked', false);\n              }\n              else {\n                module.verbose('Resetting field value', $field, defaultValue);\n                $field.val('');\n              }\n            })\n          ;\n        },\n\n        reset: function() {\n          $field\n            .each(function () {\n              var\n                $field       = $(this),\n                $element     = $field.parent(),\n                $fieldGroup  = $field.closest($group),\n                $prompt      = $fieldGroup.find(selector.prompt),\n                defaultValue = $field.data(metadata.defaultValue),\n                isCheckbox   = $element.is(selector.uiCheckbox),\n                isDropdown   = $element.is(selector.uiDropdown),\n                isErrored    = $fieldGroup.hasClass(className.error)\n              ;\n              if(defaultValue === undefined) {\n                return;\n              }\n              if(isErrored) {\n                module.verbose('Resetting error on field', $fieldGroup);\n                $fieldGroup.removeClass(className.error);\n                $prompt.remove();\n              }\n              if(isDropdown) {\n                module.verbose('Resetting dropdown value', $element, defaultValue);\n                $element.dropdown('restore defaults');\n              }\n              else if(isCheckbox) {\n                module.verbose('Resetting checkbox value', $element, defaultValue);\n                $field.prop('checked', defaultValue);\n              }\n              else {\n                module.verbose('Resetting field value', $field, defaultValue);\n                $field.val(defaultValue);\n              }\n            })\n          ;\n        },\n\n        determine: {\n          isValid: function() {\n            var\n              allValid = true\n            ;\n            $.each(validation, function(fieldName, field) {\n              if( !( module.validate.field(field, fieldName, true) ) ) {\n                allValid = false;\n              }\n            });\n            return allValid;\n          }\n        },\n\n        is: {\n          bracketedRule: function(rule) {\n            return (rule.type && rule.type.match(settings.regExp.bracket));\n          },\n          shorthandFields: function(fields) {\n            var\n              fieldKeys = Object.keys(fields),\n              firstRule = fields[fieldKeys[0]]\n            ;\n            return module.is.shorthandRules(firstRule);\n          },\n          // duck type rule test\n          shorthandRules: function(rules) {\n            return (typeof rules == 'string' || $.isArray(rules));\n          },\n          empty: function($field) {\n            if(!$field || $field.length === 0) {\n              return true;\n            }\n            else if($field.is('input[type=\"checkbox\"]')) {\n              return !$field.is(':checked');\n            }\n            else {\n              return module.is.blank($field);\n            }\n          },\n          blank: function($field) {\n            return $.trim($field.val()) === '';\n          },\n          valid: function(field) {\n            var\n              allValid = true\n            ;\n            if(field) {\n              module.verbose('Checking if field is valid', field);\n              return module.validate.field(validation[field], field, false);\n            }\n            else {\n              module.verbose('Checking if form is valid');\n              $.each(validation, function(fieldName, field) {\n                if( !module.is.valid(fieldName) ) {\n                  allValid = false;\n                }\n              });\n              return allValid;\n            }\n          }\n        },\n\n        removeEvents: function() {\n          $module\n            .off(eventNamespace)\n          ;\n          $field\n            .off(eventNamespace)\n          ;\n          $submit\n            .off(eventNamespace)\n          ;\n          $field\n            .off(eventNamespace)\n          ;\n        },\n\n        event: {\n          field: {\n            keydown: function(event) {\n              var\n                $field       = $(this),\n                key          = event.which,\n                isInput      = $field.is(selector.input),\n                isCheckbox   = $field.is(selector.checkbox),\n                isInDropdown = ($field.closest(selector.uiDropdown).length > 0),\n                keyCode      = {\n                  enter  : 13,\n                  escape : 27\n                }\n              ;\n              if( key == keyCode.escape) {\n                module.verbose('Escape key pressed blurring field');\n                $field\n                  .blur()\n                ;\n              }\n              if(!event.ctrlKey && key == keyCode.enter && isInput && !isInDropdown && !isCheckbox) {\n                if(!keyHeldDown) {\n                  $field\n                    .one('keyup' + eventNamespace, module.event.field.keyup)\n                  ;\n                  module.submit();\n                  module.debug('Enter pressed on input submitting form');\n                }\n                keyHeldDown = true;\n              }\n            },\n            keyup: function() {\n              keyHeldDown = false;\n            },\n            blur: function(event) {\n              var\n                $field          = $(this),\n                $fieldGroup     = $field.closest($group),\n                validationRules = module.get.validation($field)\n              ;\n              if( $fieldGroup.hasClass(className.error) ) {\n                module.debug('Revalidating field', $field, validationRules);\n                if(validationRules) {\n                  module.validate.field( validationRules );\n                }\n              }\n              else if(settings.on == 'blur') {\n                if(validationRules) {\n                  module.validate.field( validationRules );\n                }\n              }\n            },\n            change: function(event) {\n              var\n                $field      = $(this),\n                $fieldGroup = $field.closest($group),\n                validationRules = module.get.validation($field)\n              ;\n              if(validationRules && (settings.on == 'change' || ( $fieldGroup.hasClass(className.error) && settings.revalidate) )) {\n                clearTimeout(module.timer);\n                module.timer = setTimeout(function() {\n                  module.debug('Revalidating field', $field,  module.get.validation($field));\n                  module.validate.field( validationRules );\n                }, settings.delay);\n              }\n            }\n          }\n\n        },\n\n        get: {\n          ancillaryValue: function(rule) {\n            if(!rule.type || (!rule.value && !module.is.bracketedRule(rule))) {\n              return false;\n            }\n            return (rule.value !== undefined)\n              ? rule.value\n              : rule.type.match(settings.regExp.bracket)[1] + ''\n            ;\n          },\n          ruleName: function(rule) {\n            if( module.is.bracketedRule(rule) ) {\n              return rule.type.replace(rule.type.match(settings.regExp.bracket)[0], '');\n            }\n            return rule.type;\n          },\n          changeEvent: function(type, $input) {\n            if(type == 'checkbox' || type == 'radio' || type == 'hidden' || $input.is('select')) {\n              return 'change';\n            }\n            else {\n              return module.get.inputEvent();\n            }\n          },\n          inputEvent: function() {\n            return (document.createElement('input').oninput !== undefined)\n              ? 'input'\n              : (document.createElement('input').onpropertychange !== undefined)\n                ? 'propertychange'\n                : 'keyup'\n            ;\n          },\n          fieldsFromShorthand: function(fields) {\n            var\n              fullFields = {}\n            ;\n            $.each(fields, function(name, rules) {\n              if(typeof rules == 'string') {\n                rules = [rules];\n              }\n              fullFields[name] = {\n                rules: []\n              };\n              $.each(rules, function(index, rule) {\n                fullFields[name].rules.push({ type: rule });\n              });\n            });\n            return fullFields;\n          },\n          prompt: function(rule, field) {\n            var\n              ruleName      = module.get.ruleName(rule),\n              ancillary     = module.get.ancillaryValue(rule),\n              $field        = module.get.field(field.identifier),\n              value         = $field.val(),\n              prompt        = $.isFunction(rule.prompt)\n                ? rule.prompt(value)\n                : rule.prompt || settings.prompt[ruleName] || settings.text.unspecifiedRule,\n              requiresValue = (prompt.search('{value}') !== -1),\n              requiresName  = (prompt.search('{name}') !== -1),\n              $label,\n              name\n            ;\n            if(requiresValue) {\n              prompt = prompt.replace('{value}', $field.val());\n            }\n            if(requiresName) {\n              $label = $field.closest(selector.group).find('label').eq(0);\n              name = ($label.length == 1)\n                ? $label.text()\n                : $field.prop('placeholder') || settings.text.unspecifiedField\n              ;\n              prompt = prompt.replace('{name}', name);\n            }\n            prompt = prompt.replace('{identifier}', field.identifier);\n            prompt = prompt.replace('{ruleValue}', ancillary);\n            if(!rule.prompt) {\n              module.verbose('Using default validation prompt for type', prompt, ruleName);\n            }\n            return prompt;\n          },\n          settings: function() {\n            if($.isPlainObject(parameters)) {\n              var\n                keys     = Object.keys(parameters),\n                isLegacySettings = (keys.length > 0)\n                  ? (parameters[keys[0]].identifier !== undefined && parameters[keys[0]].rules !== undefined)\n                  : false,\n                ruleKeys\n              ;\n              if(isLegacySettings) {\n                // 1.x (ducktyped)\n                settings   = $.extend(true, {}, $.fn.form.settings, legacyParameters);\n                validation = $.extend({}, $.fn.form.settings.defaults, parameters);\n                module.error(settings.error.oldSyntax, element);\n                module.verbose('Extending settings from legacy parameters', validation, settings);\n              }\n              else {\n                // 2.x\n                if(parameters.fields && module.is.shorthandFields(parameters.fields)) {\n                  parameters.fields = module.get.fieldsFromShorthand(parameters.fields);\n                }\n                settings   = $.extend(true, {}, $.fn.form.settings, parameters);\n                validation = $.extend({}, $.fn.form.settings.defaults, settings.fields);\n                module.verbose('Extending settings', validation, settings);\n              }\n            }\n            else {\n              settings   = $.fn.form.settings;\n              validation = $.fn.form.settings.defaults;\n              module.verbose('Using default form validation', validation, settings);\n            }\n\n            // shorthand\n            namespace       = settings.namespace;\n            metadata        = settings.metadata;\n            selector        = settings.selector;\n            className       = settings.className;\n            regExp          = settings.regExp;\n            error           = settings.error;\n            moduleNamespace = 'module-' + namespace;\n            eventNamespace  = '.' + namespace;\n\n            // grab instance\n            instance = $module.data(moduleNamespace);\n\n            // refresh selector cache\n            module.refresh();\n          },\n          field: function(identifier) {\n            module.verbose('Finding field with identifier', identifier);\n            identifier = module.escape.string(identifier);\n            if($field.filter('#' + identifier).length > 0 ) {\n              return $field.filter('#' + identifier);\n            }\n            else if( $field.filter('[name=\"' + identifier +'\"]').length > 0 ) {\n              return $field.filter('[name=\"' + identifier +'\"]');\n            }\n            else if( $field.filter('[name=\"' + identifier +'[]\"]').length > 0 ) {\n              return $field.filter('[name=\"' + identifier +'[]\"]');\n            }\n            else if( $field.filter('[data-' + metadata.validate + '=\"'+ identifier +'\"]').length > 0 ) {\n              return $field.filter('[data-' + metadata.validate + '=\"'+ identifier +'\"]');\n            }\n            return $('<input/>');\n          },\n          fields: function(fields) {\n            var\n              $fields = $()\n            ;\n            $.each(fields, function(index, name) {\n              $fields = $fields.add( module.get.field(name) );\n            });\n            return $fields;\n          },\n          validation: function($field) {\n            var\n              fieldValidation,\n              identifier\n            ;\n            if(!validation) {\n              return false;\n            }\n            $.each(validation, function(fieldName, field) {\n              identifier = field.identifier || fieldName;\n              if( module.get.field(identifier)[0] == $field[0] ) {\n                field.identifier = identifier;\n                fieldValidation = field;\n              }\n            });\n            return fieldValidation || false;\n          },\n          value: function (field) {\n            var\n              fields = [],\n              results\n            ;\n            fields.push(field);\n            results = module.get.values.call(element, fields);\n            return results[field];\n          },\n          values: function (fields) {\n            var\n              $fields = $.isArray(fields)\n                ? module.get.fields(fields)\n                : $field,\n              values = {}\n            ;\n            $fields.each(function(index, field) {\n              var\n                $field     = $(field),\n                type       = $field.prop('type'),\n                name       = $field.prop('name'),\n                value      = $field.val(),\n                isCheckbox = $field.is(selector.checkbox),\n                isRadio    = $field.is(selector.radio),\n                isMultiple = (name.indexOf('[]') !== -1),\n                isChecked  = (isCheckbox)\n                  ? $field.is(':checked')\n                  : false\n              ;\n              if(name) {\n                if(isMultiple) {\n                  name = name.replace('[]', '');\n                  if(!values[name]) {\n                    values[name] = [];\n                  }\n                  if(isCheckbox) {\n                    if(isChecked) {\n                      values[name].push(value || true);\n                    }\n                    else {\n                      values[name].push(false);\n                    }\n                  }\n                  else {\n                    values[name].push(value);\n                  }\n                }\n                else {\n                  if(isRadio) {\n                    if(values[name] === undefined || values[name] == false) {\n                      values[name] = (isChecked)\n                        ? value || true\n                        : false\n                      ;\n                    }\n                  }\n                  else if(isCheckbox) {\n                    if(isChecked) {\n                      values[name] = value || true;\n                    }\n                    else {\n                      values[name] = false;\n                    }\n                  }\n                  else {\n                    values[name] = value;\n                  }\n                }\n              }\n            });\n            return values;\n          }\n        },\n\n        has: {\n\n          field: function(identifier) {\n            module.verbose('Checking for existence of a field with identifier', identifier);\n            identifier = module.escape.string(identifier);\n            if(typeof identifier !== 'string') {\n              module.error(error.identifier, identifier);\n            }\n            if($field.filter('#' + identifier).length > 0 ) {\n              return true;\n            }\n            else if( $field.filter('[name=\"' + identifier +'\"]').length > 0 ) {\n              return true;\n            }\n            else if( $field.filter('[data-' + metadata.validate + '=\"'+ identifier +'\"]').length > 0 ) {\n              return true;\n            }\n            return false;\n          }\n\n        },\n\n        escape: {\n          string: function(text) {\n            text =  String(text);\n            return text.replace(regExp.escape, '\\\\$&');\n          }\n        },\n\n        add: {\n          // alias\n          rule: function(name, rules) {\n            module.add.field(name, rules);\n          },\n          field: function(name, rules) {\n            var\n              newValidation = {}\n            ;\n            if(module.is.shorthandRules(rules)) {\n              rules = $.isArray(rules)\n                ? rules\n                : [rules]\n              ;\n              newValidation[name] = {\n                rules: []\n              };\n              $.each(rules, function(index, rule) {\n                newValidation[name].rules.push({ type: rule });\n              });\n            }\n            else {\n              newValidation[name] = rules;\n            }\n            validation = $.extend({}, validation, newValidation);\n            module.debug('Adding rules', newValidation, validation);\n          },\n          fields: function(fields) {\n            var\n              newValidation\n            ;\n            if(fields && module.is.shorthandFields(fields)) {\n              newValidation = module.get.fieldsFromShorthand(fields);\n            }\n            else {\n              newValidation = fields;\n            }\n            validation = $.extend({}, validation, newValidation);\n          },\n          prompt: function(identifier, errors) {\n            var\n              $field       = module.get.field(identifier),\n              $fieldGroup  = $field.closest($group),\n              $prompt      = $fieldGroup.children(selector.prompt),\n              promptExists = ($prompt.length !== 0)\n            ;\n            errors = (typeof errors == 'string')\n              ? [errors]\n              : errors\n            ;\n            module.verbose('Adding field error state', identifier);\n            $fieldGroup\n              .addClass(className.error)\n            ;\n            if(settings.inline) {\n              if(!promptExists) {\n                $prompt = settings.templates.prompt(errors);\n                $prompt\n                  .appendTo($fieldGroup)\n                ;\n              }\n              $prompt\n                .html(errors[0])\n              ;\n              if(!promptExists) {\n                if(settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) {\n                  module.verbose('Displaying error with css transition', settings.transition);\n                  $prompt.transition(settings.transition + ' in', settings.duration);\n                }\n                else {\n                  module.verbose('Displaying error with fallback javascript animation');\n                  $prompt\n                    .fadeIn(settings.duration)\n                  ;\n                }\n              }\n              else {\n                module.verbose('Inline errors are disabled, no inline error added', identifier);\n              }\n            }\n          },\n          errors: function(errors) {\n            module.debug('Adding form error messages', errors);\n            module.set.error();\n            $message\n              .html( settings.templates.error(errors) )\n            ;\n          }\n        },\n\n        remove: {\n          rule: function(field, rule) {\n            var\n              rules = $.isArray(rule)\n                ? rule\n                : [rule]\n            ;\n            if(rule == undefined) {\n              module.debug('Removed all rules');\n              validation[field].rules = [];\n              return;\n            }\n            if(validation[field] == undefined || !$.isArray(validation[field].rules)) {\n              return;\n            }\n            $.each(validation[field].rules, function(index, rule) {\n              if(rules.indexOf(rule.type) !== -1) {\n                module.debug('Removed rule', rule.type);\n                validation[field].rules.splice(index, 1);\n              }\n            });\n          },\n          field: function(field) {\n            var\n              fields = $.isArray(field)\n                ? field\n                : [field]\n            ;\n            $.each(fields, function(index, field) {\n              module.remove.rule(field);\n            });\n          },\n          // alias\n          rules: function(field, rules) {\n            if($.isArray(field)) {\n              $.each(fields, function(index, field) {\n                module.remove.rule(field, rules);\n              });\n            }\n            else {\n              module.remove.rule(field, rules);\n            }\n          },\n          fields: function(fields) {\n            module.remove.field(fields);\n          },\n          prompt: function(identifier) {\n            var\n              $field      = module.get.field(identifier),\n              $fieldGroup = $field.closest($group),\n              $prompt     = $fieldGroup.children(selector.prompt)\n            ;\n            $fieldGroup\n              .removeClass(className.error)\n            ;\n            if(settings.inline && $prompt.is(':visible')) {\n              module.verbose('Removing prompt for field', identifier);\n              if(settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) {\n                $prompt.transition(settings.transition + ' out', settings.duration, function() {\n                  $prompt.remove();\n                });\n              }\n              else {\n                $prompt\n                  .fadeOut(settings.duration, function(){\n                    $prompt.remove();\n                  })\n                ;\n              }\n            }\n          }\n        },\n\n        set: {\n          success: function() {\n            $module\n              .removeClass(className.error)\n              .addClass(className.success)\n            ;\n          },\n          defaults: function () {\n            $field\n              .each(function () {\n                var\n                  $field     = $(this),\n                  isCheckbox = ($field.filter(selector.checkbox).length > 0),\n                  value      = (isCheckbox)\n                    ? $field.is(':checked')\n                    : $field.val()\n                ;\n                $field.data(metadata.defaultValue, value);\n              })\n            ;\n          },\n          error: function() {\n            $module\n              .removeClass(className.success)\n              .addClass(className.error)\n            ;\n          },\n          value: function (field, value) {\n            var\n              fields = {}\n            ;\n            fields[field] = value;\n            return module.set.values.call(element, fields);\n          },\n          values: function (fields) {\n            if($.isEmptyObject(fields)) {\n              return;\n            }\n            $.each(fields, function(key, value) {\n              var\n                $field      = module.get.field(key),\n                $element    = $field.parent(),\n                isMultiple  = $.isArray(value),\n                isCheckbox  = $element.is(selector.uiCheckbox),\n                isDropdown  = $element.is(selector.uiDropdown),\n                isRadio     = ($field.is(selector.radio) && isCheckbox),\n                fieldExists = ($field.length > 0),\n                $multipleField\n              ;\n              if(fieldExists) {\n                if(isMultiple && isCheckbox) {\n                  module.verbose('Selecting multiple', value, $field);\n                  $element.checkbox('uncheck');\n                  $.each(value, function(index, value) {\n                    $multipleField = $field.filter('[value=\"' + value + '\"]');\n                    $element       = $multipleField.parent();\n                    if($multipleField.length > 0) {\n                      $element.checkbox('check');\n                    }\n                  });\n                }\n                else if(isRadio) {\n                  module.verbose('Selecting radio value', value, $field);\n                  $field.filter('[value=\"' + value + '\"]')\n                    .parent(selector.uiCheckbox)\n                      .checkbox('check')\n                  ;\n                }\n                else if(isCheckbox) {\n                  module.verbose('Setting checkbox value', value, $element);\n                  if(value === true) {\n                    $element.checkbox('check');\n                  }\n                  else {\n                    $element.checkbox('uncheck');\n                  }\n                }\n                else if(isDropdown) {\n                  module.verbose('Setting dropdown value', value, $element);\n                  $element.dropdown('set selected', value);\n                }\n                else {\n                  module.verbose('Setting field value', value, $field);\n                  $field.val(value);\n                }\n              }\n            });\n          }\n        },\n\n        validate: {\n\n          form: function(event, ignoreCallbacks) {\n            var\n              values = module.get.values(),\n              apiRequest\n            ;\n\n            // input keydown event will fire submit repeatedly by browser default\n            if(keyHeldDown) {\n              return false;\n            }\n\n            // reset errors\n            formErrors = [];\n            if( module.determine.isValid() ) {\n              module.debug('Form has no validation errors, submitting');\n              module.set.success();\n              if(ignoreCallbacks !== true) {\n                return settings.onSuccess.call(element, event, values);\n              }\n            }\n            else {\n              module.debug('Form has errors');\n              module.set.error();\n              if(!settings.inline) {\n                module.add.errors(formErrors);\n              }\n              // prevent ajax submit\n              if($module.data('moduleApi') !== undefined) {\n                event.stopImmediatePropagation();\n              }\n              if(ignoreCallbacks !== true) {\n                return settings.onFailure.call(element, formErrors, values);\n              }\n            }\n          },\n\n          // takes a validation object and returns whether field passes validation\n          field: function(field, fieldName, showErrors) {\n            showErrors = (showErrors !== undefined)\n              ? showErrors\n              : true\n            ;\n            if(typeof field == 'string') {\n              module.verbose('Validating field', field);\n              fieldName = field;\n              field     = validation[field];\n            }\n            var\n              identifier    = field.identifier || fieldName,\n              $field        = module.get.field(identifier),\n              $dependsField = (field.depends)\n                ? module.get.field(field.depends)\n                : false,\n              fieldValid  = true,\n              fieldErrors = []\n            ;\n            if(!field.identifier) {\n              module.debug('Using field name as identifier', identifier);\n              field.identifier = identifier;\n            }\n            if($field.prop('disabled')) {\n              module.debug('Field is disabled. Skipping', identifier);\n              fieldValid = true;\n            }\n            else if(field.optional && module.is.blank($field)){\n              module.debug('Field is optional and blank. Skipping', identifier);\n              fieldValid = true;\n            }\n            else if(field.depends && module.is.empty($dependsField)) {\n              module.debug('Field depends on another value that is not present or empty. Skipping', $dependsField);\n              fieldValid = true;\n            }\n            else if(field.rules !== undefined) {\n              $.each(field.rules, function(index, rule) {\n                if( module.has.field(identifier) && !( module.validate.rule(field, rule) ) ) {\n                  module.debug('Field is invalid', identifier, rule.type);\n                  fieldErrors.push(module.get.prompt(rule, field));\n                  fieldValid = false;\n                }\n              });\n            }\n            if(fieldValid) {\n              if(showErrors) {\n                module.remove.prompt(identifier, fieldErrors);\n                settings.onValid.call($field);\n              }\n            }\n            else {\n              if(showErrors) {\n                formErrors = formErrors.concat(fieldErrors);\n                module.add.prompt(identifier, fieldErrors);\n                settings.onInvalid.call($field, fieldErrors);\n              }\n              return false;\n            }\n            return true;\n          },\n\n          // takes validation rule and returns whether field passes rule\n          rule: function(field, rule) {\n            var\n              $field       = module.get.field(field.identifier),\n              type         = rule.type,\n              value        = $field.val(),\n              isValid      = true,\n              ancillary    = module.get.ancillaryValue(rule),\n              ruleName     = module.get.ruleName(rule),\n              ruleFunction = settings.rules[ruleName]\n            ;\n            if( !$.isFunction(ruleFunction) ) {\n              module.error(error.noRule, ruleName);\n              return;\n            }\n            // cast to string avoiding encoding special values\n            value = (value === undefined || value === '' || value === null)\n              ? ''\n              : $.trim(value + '')\n            ;\n            return ruleFunction.call($field, value, ancillary);\n          }\n        },\n\n        setting: function(name, value) {\n          if( $.isPlainObject(name) ) {\n            $.extend(true, settings, name);\n          }\n          else if(value !== undefined) {\n            settings[name] = value;\n          }\n          else {\n            return settings[name];\n          }\n        },\n        internal: function(name, value) {\n          if( $.isPlainObject(name) ) {\n            $.extend(true, module, name);\n          }\n          else if(value !== undefined) {\n            module[name] = value;\n          }\n          else {\n            return module[name];\n          }\n        },\n        debug: function() {\n          if(!settings.silent && settings.debug) {\n            if(settings.performance) {\n              module.performance.log(arguments);\n            }\n            else {\n              module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');\n              module.debug.apply(console, arguments);\n            }\n          }\n        },\n        verbose: function() {\n          if(!settings.silent && settings.verbose && settings.debug) {\n            if(settings.performance) {\n              module.performance.log(arguments);\n            }\n            else {\n              module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');\n              module.verbose.apply(console, arguments);\n            }\n          }\n        },\n        error: function() {\n          if(!settings.silent) {\n            module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');\n            module.error.apply(console, arguments);\n          }\n        },\n        performance: {\n          log: function(message) {\n            var\n              currentTime,\n              executionTime,\n              previousTime\n            ;\n            if(settings.performance) {\n              currentTime   = new Date().getTime();\n              previousTime  = time || currentTime;\n              executionTime = currentTime - previousTime;\n              time          = currentTime;\n              performance.push({\n                'Name'           : message[0],\n                'Arguments'      : [].slice.call(message, 1) || '',\n                'Element'        : element,\n                'Execution Time' : executionTime\n              });\n            }\n            clearTimeout(module.performance.timer);\n            module.performance.timer = setTimeout(module.performance.display, 500);\n          },\n          display: function() {\n            var\n              title = settings.name + ':',\n              totalTime = 0\n            ;\n            time = false;\n            clearTimeout(module.performance.timer);\n            $.each(performance, function(index, data) {\n              totalTime += data['Execution Time'];\n            });\n            title += ' ' + totalTime + 'ms';\n            if(moduleSelector) {\n              title += ' \\'' + moduleSelector + '\\'';\n            }\n            if($allModules.length > 1) {\n              title += ' ' + '(' + $allModules.length + ')';\n            }\n            if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {\n              console.groupCollapsed(title);\n              if(console.table) {\n                console.table(performance);\n              }\n              else {\n                $.each(performance, function(index, data) {\n                  console.log(data['Name'] + ': ' + data['Execution Time']+'ms');\n                });\n              }\n              console.groupEnd();\n            }\n            performance = [];\n          }\n        },\n        invoke: function(query, passedArguments, context) {\n          var\n            object = instance,\n            maxDepth,\n            found,\n            response\n          ;\n          passedArguments = passedArguments || queryArguments;\n          context         = element         || context;\n          if(typeof query == 'string' && object !== undefined) {\n            query    = query.split(/[\\. ]/);\n            maxDepth = query.length - 1;\n            $.each(query, function(depth, value) {\n              var camelCaseValue = (depth != maxDepth)\n                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)\n                : query\n              ;\n              if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {\n                object = object[camelCaseValue];\n              }\n              else if( object[camelCaseValue] !== undefined ) {\n                found = object[camelCaseValue];\n                return false;\n              }\n              else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {\n                object = object[value];\n              }\n              else if( object[value] !== undefined ) {\n                found = object[value];\n                return false;\n              }\n              else {\n                return false;\n              }\n            });\n          }\n          if( $.isFunction( found ) ) {\n            response = found.apply(context, passedArguments);\n          }\n          else if(found !== undefined) {\n            response = found;\n          }\n          if($.isArray(returnedValue)) {\n            returnedValue.push(response);\n          }\n          else if(returnedValue !== undefined) {\n            returnedValue = [returnedValue, response];\n          }\n          else if(response !== undefined) {\n            returnedValue = response;\n          }\n          return found;\n        }\n      };\n      module.initialize();\n    })\n  ;\n\n  return (returnedValue !== undefined)\n    ? returnedValue\n    : this\n  ;\n};\n\n$.fn.form.settings = {\n\n  name              : 'Form',\n  namespace         : 'form',\n\n  debug             : false,\n  verbose           : false,\n  performance       : true,\n\n  fields            : false,\n\n  keyboardShortcuts : true,\n  on                : 'submit',\n  inline            : false,\n\n  delay             : 200,\n  revalidate        : true,\n\n  transition        : 'scale',\n  duration          : 200,\n\n  onValid           : function() {},\n  onInvalid         : function() {},\n  onSuccess         : function() { return true; },\n  onFailure         : function() { return false; },\n\n  metadata : {\n    defaultValue : 'default',\n    validate     : 'validate'\n  },\n\n  regExp: {\n    htmlID  : /^[a-zA-Z][\\w:.-]*$/g,\n    bracket : /\\[(.*)\\]/i,\n    decimal : /^\\d+\\.?\\d*$/,\n    email   : /^[a-z0-9!#$%&'*+\\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i,\n    escape  : /[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g,\n    flags   : /^\\/(.*)\\/(.*)?/,\n    integer : /^\\-?\\d+$/,\n    number  : /^\\-?\\d*(\\.\\d+)?$/,\n    url     : /(https?:\\/\\/(?:www\\.|(?!www))[^\\s\\.]+\\.[^\\s]{2,}|www\\.[^\\s]+\\.[^\\s]{2,})/i\n  },\n\n  text: {\n    unspecifiedRule  : 'Please enter a valid value',\n    unspecifiedField : 'This field'\n  },\n\n  prompt: {\n    empty                : '{name} must have a value',\n    checked              : '{name} must be checked',\n    email                : '{name} must be a valid e-mail',\n    url                  : '{name} must be a valid url',\n    regExp               : '{name} is not formatted correctly',\n    integer              : '{name} must be an integer',\n    decimal              : '{name} must be a decimal number',\n    number               : '{name} must be set to a number',\n    is                   : '{name} must be \"{ruleValue}\"',\n    isExactly            : '{name} must be exactly \"{ruleValue}\"',\n    not                  : '{name} cannot be set to \"{ruleValue}\"',\n    notExactly           : '{name} cannot be set to exactly \"{ruleValue}\"',\n    contain              : '{name} must contain \"{ruleValue}\"',\n    containExactly       : '{name} must contain exactly \"{ruleValue}\"',\n    doesntContain        : '{name} cannot contain  \"{ruleValue}\"',\n    doesntContainExactly : '{name} cannot contain exactly \"{ruleValue}\"',\n    minLength            : '{name} must be at least {ruleValue} characters',\n    length               : '{name} must be at least {ruleValue} characters',\n    exactLength          : '{name} must be exactly {ruleValue} characters',\n    maxLength            : '{name} cannot be longer than {ruleValue} characters',\n    match                : '{name} must match {ruleValue} field',\n    different            : '{name} must have a different value than {ruleValue} field',\n    creditCard           : '{name} must be a valid credit card number',\n    minCount             : '{name} must have at least {ruleValue} choices',\n    exactCount           : '{name} must have exactly {ruleValue} choices',\n    maxCount             : '{name} must have {ruleValue} or less choices'\n  },\n\n  selector : {\n    checkbox   : 'input[type=\"checkbox\"], input[type=\"radio\"]',\n    clear      : '.clear',\n    field      : 'input, textarea, select',\n    group      : '.field',\n    input      : 'input',\n    message    : '.error.message',\n    prompt     : '.prompt.label',\n    radio      : 'input[type=\"radio\"]',\n    reset      : '.reset:not([type=\"reset\"])',\n    submit     : '.submit:not([type=\"submit\"])',\n    uiCheckbox : '.ui.checkbox',\n    uiDropdown : '.ui.dropdown'\n  },\n\n  className : {\n    error   : 'error',\n    label   : 'ui prompt label',\n    pressed : 'down',\n    success : 'success'\n  },\n\n  error: {\n    identifier : 'You must specify a string identifier for each field',\n    method     : 'The method you called is not defined.',\n    noRule     : 'There is no rule matching the one you specified',\n    oldSyntax  : 'Starting in 2.0 forms now only take a single settings object. Validation settings converted to new syntax automatically.'\n  },\n\n  templates: {\n\n    // template that produces error message\n    error: function(errors) {\n      var\n        html = '<ul class=\"list\">'\n      ;\n      $.each(errors, function(index, value) {\n        html += '<li>' + value + '</li>';\n      });\n      html += '</ul>';\n      return $(html);\n    },\n\n    // template that produces label\n    prompt: function(errors) {\n      return $('<div/>')\n        .addClass('ui basic red pointing prompt label')\n        .html(errors[0])\n      ;\n    }\n  },\n\n  rules: {\n\n    // is not empty or blank string\n    empty: function(value) {\n      return !(value === undefined || '' === value || $.isArray(value) && value.length === 0);\n    },\n\n    // checkbox checked\n    checked: function() {\n      return ($(this).filter(':checked').length > 0);\n    },\n\n    // is most likely an email\n    email: function(value){\n      return $.fn.form.settings.regExp.email.test(value);\n    },\n\n    // value is most likely url\n    url: function(value) {\n      return $.fn.form.settings.regExp.url.test(value);\n    },\n\n    // matches specified regExp\n    regExp: function(value, regExp) {\n      if(regExp instanceof RegExp) {\n        return value.match(regExp);\n      }\n      var\n        regExpParts = regExp.match($.fn.form.settings.regExp.flags),\n        flags\n      ;\n      // regular expression specified as /baz/gi (flags)\n      if(regExpParts) {\n        regExp = (regExpParts.length >= 2)\n          ? regExpParts[1]\n          : regExp\n        ;\n        flags = (regExpParts.length >= 3)\n          ? regExpParts[2]\n          : ''\n        ;\n      }\n      return value.match( new RegExp(regExp, flags) );\n    },\n\n    // is valid integer or matches range\n    integer: function(value, range) {\n      var\n        intRegExp = $.fn.form.settings.regExp.integer,\n        min,\n        max,\n        parts\n      ;\n      if( !range || ['', '..'].indexOf(range) !== -1) {\n        // do nothing\n      }\n      else if(range.indexOf('..') == -1) {\n        if(intRegExp.test(range)) {\n          min = max = range - 0;\n        }\n      }\n      else {\n        parts = range.split('..', 2);\n        if(intRegExp.test(parts[0])) {\n          min = parts[0] - 0;\n        }\n        if(intRegExp.test(parts[1])) {\n          max = parts[1] - 0;\n        }\n      }\n      return (\n        intRegExp.test(value) &&\n        (min === undefined || value >= min) &&\n        (max === undefined || value <= max)\n      );\n    },\n\n    // is valid number (with decimal)\n    decimal: function(value) {\n      return $.fn.form.settings.regExp.decimal.test(value);\n    },\n\n    // is valid number\n    number: function(value) {\n      return $.fn.form.settings.regExp.number.test(value);\n    },\n\n    // is value (case insensitive)\n    is: function(value, text) {\n      text = (typeof text == 'string')\n        ? text.toLowerCase()\n        : text\n      ;\n      value = (typeof value == 'string')\n        ? value.toLowerCase()\n        : value\n      ;\n      return (value == text);\n    },\n\n    // is value\n    isExactly: function(value, text) {\n      return (value == text);\n    },\n\n    // value is not another value (case insensitive)\n    not: function(value, notValue) {\n      value = (typeof value == 'string')\n        ? value.toLowerCase()\n        : value\n      ;\n      notValue = (typeof notValue == 'string')\n        ? notValue.toLowerCase()\n        : notValue\n      ;\n      return (value != notValue);\n    },\n\n    // value is not another value (case sensitive)\n    notExactly: function(value, notValue) {\n      return (value != notValue);\n    },\n\n    // value contains text (insensitive)\n    contains: function(value, text) {\n      // escape regex characters\n      text = text.replace($.fn.form.settings.regExp.escape, \"\\\\$&\");\n      return (value.search( new RegExp(text, 'i') ) !== -1);\n    },\n\n    // value contains text (case sensitive)\n    containsExactly: function(value, text) {\n      // escape regex characters\n      text = text.replace($.fn.form.settings.regExp.escape, \"\\\\$&\");\n      return (value.search( new RegExp(text) ) !== -1);\n    },\n\n    // value contains text (insensitive)\n    doesntContain: function(value, text) {\n      // escape regex characters\n      text = text.replace($.fn.form.settings.regExp.escape, \"\\\\$&\");\n      return (value.search( new RegExp(text, 'i') ) === -1);\n    },\n\n    // value contains text (case sensitive)\n    doesntContainExactly: function(value, text) {\n      // escape regex characters\n      text = text.replace($.fn.form.settings.regExp.escape, \"\\\\$&\");\n      return (value.search( new RegExp(text) ) === -1);\n    },\n\n    // is at least string length\n    minLength: function(value, requiredLength) {\n      return (value !== undefined)\n        ? (value.length >= requiredLength)\n        : false\n      ;\n    },\n\n    // see rls notes for 2.0.6 (this is a duplicate of minLength)\n    length: function(value, requiredLength) {\n      return (value !== undefined)\n        ? (value.length >= requiredLength)\n        : false\n      ;\n    },\n\n    // is exactly length\n    exactLength: function(value, requiredLength) {\n      return (value !== undefined)\n        ? (value.length == requiredLength)\n        : false\n      ;\n    },\n\n    // is less than length\n    maxLength: function(value, maxLength) {\n      return (value !== undefined)\n        ? (value.length <= maxLength)\n        : false\n      ;\n    },\n\n    // matches another field\n    match: function(value, identifier) {\n      var\n        $form = $(this),\n        matchingValue\n      ;\n      if( $('[data-validate=\"'+ identifier +'\"]').length > 0 ) {\n        matchingValue = $('[data-validate=\"'+ identifier +'\"]').val();\n      }\n      else if($('#' + identifier).length > 0) {\n        matchingValue = $('#' + identifier).val();\n      }\n      else if($('[name=\"' + identifier +'\"]').length > 0) {\n        matchingValue = $('[name=\"' + identifier + '\"]').val();\n      }\n      else if( $('[name=\"' + identifier +'[]\"]').length > 0 ) {\n        matchingValue = $('[name=\"' + identifier +'[]\"]');\n      }\n      return (matchingValue !== undefined)\n        ? ( value.toString() == matchingValue.toString() )\n        : false\n      ;\n    },\n\n    // different than another field\n    different: function(value, identifier) {\n      // use either id or name of field\n      var\n        $form = $(this),\n        matchingValue\n      ;\n      if( $('[data-validate=\"'+ identifier +'\"]').length > 0 ) {\n        matchingValue = $('[data-validate=\"'+ identifier +'\"]').val();\n      }\n      else if($('#' + identifier).length > 0) {\n        matchingValue = $('#' + identifier).val();\n      }\n      else if($('[name=\"' + identifier +'\"]').length > 0) {\n        matchingValue = $('[name=\"' + identifier + '\"]').val();\n      }\n      else if( $('[name=\"' + identifier +'[]\"]').length > 0 ) {\n        matchingValue = $('[name=\"' + identifier +'[]\"]');\n      }\n      return (matchingValue !== undefined)\n        ? ( value.toString() !== matchingValue.toString() )\n        : false\n      ;\n    },\n\n    creditCard: function(cardNumber, cardTypes) {\n      var\n        cards = {\n          visa: {\n            pattern : /^4/,\n            length  : [16]\n          },\n          amex: {\n            pattern : /^3[47]/,\n            length  : [15]\n          },\n          mastercard: {\n            pattern : /^5[1-5]/,\n            length  : [16]\n          },\n          discover: {\n            pattern : /^(6011|622(12[6-9]|1[3-9][0-9]|[2-8][0-9]{2}|9[0-1][0-9]|92[0-5]|64[4-9])|65)/,\n            length  : [16]\n          },\n          unionPay: {\n            pattern : /^(62|88)/,\n            length  : [16, 17, 18, 19]\n          },\n          jcb: {\n            pattern : /^35(2[89]|[3-8][0-9])/,\n            length  : [16]\n          },\n          maestro: {\n            pattern : /^(5018|5020|5038|6304|6759|676[1-3])/,\n            length  : [12, 13, 14, 15, 16, 17, 18, 19]\n          },\n          dinersClub: {\n            pattern : /^(30[0-5]|^36)/,\n            length  : [14]\n          },\n          laser: {\n            pattern : /^(6304|670[69]|6771)/,\n            length  : [16, 17, 18, 19]\n          },\n          visaElectron: {\n            pattern : /^(4026|417500|4508|4844|491(3|7))/,\n            length  : [16]\n          }\n        },\n        valid         = {},\n        validCard     = false,\n        requiredTypes = (typeof cardTypes == 'string')\n          ? cardTypes.split(',')\n          : false,\n        unionPay,\n        validation\n      ;\n\n      if(typeof cardNumber !== 'string' || cardNumber.length === 0) {\n        return;\n      }\n\n      // allow dashes in card\n      cardNumber = cardNumber.replace(/[\\-]/g, '');\n\n      // verify card types\n      if(requiredTypes) {\n        $.each(requiredTypes, function(index, type){\n          // verify each card type\n          validation = cards[type];\n          if(validation) {\n            valid = {\n              length  : ($.inArray(cardNumber.length, validation.length) !== -1),\n              pattern : (cardNumber.search(validation.pattern) !== -1)\n            };\n            if(valid.length && valid.pattern) {\n              validCard = true;\n            }\n          }\n        });\n\n        if(!validCard) {\n          return false;\n        }\n      }\n\n      // skip luhn for UnionPay\n      unionPay = {\n        number  : ($.inArray(cardNumber.length, cards.unionPay.length) !== -1),\n        pattern : (cardNumber.search(cards.unionPay.pattern) !== -1)\n      };\n      if(unionPay.number && unionPay.pattern) {\n        return true;\n      }\n\n      // verify luhn, adapted from  <https://gist.github.com/2134376>\n      var\n        length        = cardNumber.length,\n        multiple      = 0,\n        producedValue = [\n          [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],\n          [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]\n        ],\n        sum           = 0\n      ;\n      while (length--) {\n        sum += producedValue[multiple][parseInt(cardNumber.charAt(length), 10)];\n        multiple ^= 1;\n      }\n      return (sum % 10 === 0 && sum > 0);\n    },\n\n    minCount: function(value, minCount) {\n      if(minCount == 0) {\n        return true;\n      }\n      if(minCount == 1) {\n        return (value !== '');\n      }\n      return (value.split(',').length >= minCount);\n    },\n\n    exactCount: function(value, exactCount) {\n      if(exactCount == 0) {\n        return (value === '');\n      }\n      if(exactCount == 1) {\n        return (value !== '' && value.search(',') === -1);\n      }\n      return (value.split(',').length == exactCount);\n    },\n\n    maxCount: function(value, maxCount) {\n      if(maxCount == 0) {\n        return false;\n      }\n      if(maxCount == 1) {\n        return (value.search(',') === -1);\n      }\n      return (value.split(',').length <= maxCount);\n    }\n  }\n\n};\n\n})( jQuery, window, document );\n"
  },
  {
    "path": "semantic/src/definitions/behaviors/visibility.js",
    "content": "/*!\n * # Semantic UI - Visibility\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n;(function ($, window, document, undefined) {\n\n'use strict';\n\nwindow = (typeof window != 'undefined' && window.Math == Math)\n  ? window\n  : (typeof self != 'undefined' && self.Math == Math)\n    ? self\n    : Function('return this')()\n;\n\n$.fn.visibility = function(parameters) {\n  var\n    $allModules    = $(this),\n    moduleSelector = $allModules.selector || '',\n\n    time           = new Date().getTime(),\n    performance    = [],\n\n    query          = arguments[0],\n    methodInvoked  = (typeof query == 'string'),\n    queryArguments = [].slice.call(arguments, 1),\n    returnedValue,\n\n    moduleCount    = $allModules.length,\n    loadedCount    = 0\n  ;\n\n  $allModules\n    .each(function() {\n      var\n        settings        = ( $.isPlainObject(parameters) )\n          ? $.extend(true, {}, $.fn.visibility.settings, parameters)\n          : $.extend({}, $.fn.visibility.settings),\n\n        className       = settings.className,\n        namespace       = settings.namespace,\n        error           = settings.error,\n        metadata        = settings.metadata,\n\n        eventNamespace  = '.' + namespace,\n        moduleNamespace = 'module-' + namespace,\n\n        $window         = $(window),\n\n        $module         = $(this),\n        $context        = $(settings.context),\n\n        $placeholder,\n\n        selector        = $module.selector || '',\n        instance        = $module.data(moduleNamespace),\n\n        requestAnimationFrame = window.requestAnimationFrame\n          || window.mozRequestAnimationFrame\n          || window.webkitRequestAnimationFrame\n          || window.msRequestAnimationFrame\n          || function(callback) { setTimeout(callback, 0); },\n\n        element         = this,\n        disabled        = false,\n\n        contextObserver,\n        observer,\n        module\n      ;\n\n      module = {\n\n        initialize: function() {\n          module.debug('Initializing', settings);\n\n          module.setup.cache();\n\n          if( module.should.trackChanges() ) {\n\n            if(settings.type == 'image') {\n              module.setup.image();\n            }\n            if(settings.type == 'fixed') {\n              module.setup.fixed();\n            }\n\n            if(settings.observeChanges) {\n              module.observeChanges();\n            }\n            module.bind.events();\n          }\n\n          module.save.position();\n          if( !module.is.visible() ) {\n            module.error(error.visible, $module);\n          }\n\n          if(settings.initialCheck) {\n            module.checkVisibility();\n          }\n          module.instantiate();\n        },\n\n        instantiate: function() {\n          module.debug('Storing instance', module);\n          $module\n            .data(moduleNamespace, module)\n          ;\n          instance = module;\n        },\n\n        destroy: function() {\n          module.verbose('Destroying previous module');\n          if(observer) {\n            observer.disconnect();\n          }\n          if(contextObserver) {\n            contextObserver.disconnect();\n          }\n          $window\n            .off('load'   + eventNamespace, module.event.load)\n            .off('resize' + eventNamespace, module.event.resize)\n          ;\n          $context\n            .off('scroll'       + eventNamespace, module.event.scroll)\n            .off('scrollchange' + eventNamespace, module.event.scrollchange)\n          ;\n          if(settings.type == 'fixed') {\n            module.resetFixed();\n            module.remove.placeholder();\n          }\n          $module\n            .off(eventNamespace)\n            .removeData(moduleNamespace)\n          ;\n        },\n\n        observeChanges: function() {\n          if('MutationObserver' in window) {\n            contextObserver = new MutationObserver(module.event.contextChanged);\n            observer        = new MutationObserver(module.event.changed);\n            contextObserver.observe(document, {\n              childList : true,\n              subtree   : true\n            });\n            observer.observe(element, {\n              childList : true,\n              subtree   : true\n            });\n            module.debug('Setting up mutation observer', observer);\n          }\n        },\n\n        bind: {\n          events: function() {\n            module.verbose('Binding visibility events to scroll and resize');\n            if(settings.refreshOnLoad) {\n              $window\n                .on('load'   + eventNamespace, module.event.load)\n              ;\n            }\n            $window\n              .on('resize' + eventNamespace, module.event.resize)\n            ;\n            // pub/sub pattern\n            $context\n              .off('scroll'      + eventNamespace)\n              .on('scroll'       + eventNamespace, module.event.scroll)\n              .on('scrollchange' + eventNamespace, module.event.scrollchange)\n            ;\n          }\n        },\n\n        event: {\n          changed: function(mutations) {\n            module.verbose('DOM tree modified, updating visibility calculations');\n            module.timer = setTimeout(function() {\n              module.verbose('DOM tree modified, updating sticky menu');\n              module.refresh();\n            }, 100);\n          },\n          contextChanged: function(mutations) {\n            [].forEach.call(mutations, function(mutation) {\n              if(mutation.removedNodes) {\n                [].forEach.call(mutation.removedNodes, function(node) {\n                  if(node == element || $(node).find(element).length > 0) {\n                    module.debug('Element removed from DOM, tearing down events');\n                    module.destroy();\n                  }\n                });\n              }\n            });\n          },\n          resize: function() {\n            module.debug('Window resized');\n            if(settings.refreshOnResize) {\n              requestAnimationFrame(module.refresh);\n            }\n          },\n          load: function() {\n            module.debug('Page finished loading');\n            requestAnimationFrame(module.refresh);\n          },\n          // publishes scrollchange event on one scroll\n          scroll: function() {\n            if(settings.throttle) {\n              clearTimeout(module.timer);\n              module.timer = setTimeout(function() {\n                $context.triggerHandler('scrollchange' + eventNamespace, [ $context.scrollTop() ]);\n              }, settings.throttle);\n            }\n            else {\n              requestAnimationFrame(function() {\n                $context.triggerHandler('scrollchange' + eventNamespace, [ $context.scrollTop() ]);\n              });\n            }\n          },\n          // subscribes to scrollchange\n          scrollchange: function(event, scrollPosition) {\n            module.checkVisibility(scrollPosition);\n          },\n        },\n\n        precache: function(images, callback) {\n          if (!(images instanceof Array)) {\n            images = [images];\n          }\n          var\n            imagesLength  = images.length,\n            loadedCounter = 0,\n            cache         = [],\n            cacheImage    = document.createElement('img'),\n            handleLoad    = function() {\n              loadedCounter++;\n              if (loadedCounter >= images.length) {\n                if ($.isFunction(callback)) {\n                  callback();\n                }\n              }\n            }\n          ;\n          while (imagesLength--) {\n            cacheImage         = document.createElement('img');\n            cacheImage.onload  = handleLoad;\n            cacheImage.onerror = handleLoad;\n            cacheImage.src     = images[imagesLength];\n            cache.push(cacheImage);\n          }\n        },\n\n        enableCallbacks: function() {\n          module.debug('Allowing callbacks to occur');\n          disabled = false;\n        },\n\n        disableCallbacks: function() {\n          module.debug('Disabling all callbacks temporarily');\n          disabled = true;\n        },\n\n        should: {\n          trackChanges: function() {\n            if(methodInvoked) {\n              module.debug('One time query, no need to bind events');\n              return false;\n            }\n            module.debug('Callbacks being attached');\n            return true;\n          }\n        },\n\n        setup: {\n          cache: function() {\n            module.cache = {\n              occurred : {},\n              screen   : {},\n              element  : {},\n            };\n          },\n          image: function() {\n            var\n              src = $module.data(metadata.src)\n            ;\n            if(src) {\n              module.verbose('Lazy loading image', src);\n              settings.once           = true;\n              settings.observeChanges = false;\n\n              // show when top visible\n              settings.onOnScreen = function() {\n                module.debug('Image on screen', element);\n                module.precache(src, function() {\n                  module.set.image(src, function() {\n                    loadedCount++;\n                    if(loadedCount == moduleCount) {\n                      settings.onAllLoaded.call(this);\n                    }\n                    settings.onLoad.call(this);\n                  });\n                });\n              };\n            }\n          },\n          fixed: function() {\n            module.debug('Setting up fixed');\n            settings.once           = false;\n            settings.observeChanges = false;\n            settings.initialCheck   = true;\n            settings.refreshOnLoad  = true;\n            if(!parameters.transition) {\n              settings.transition = false;\n            }\n            module.create.placeholder();\n            module.debug('Added placeholder', $placeholder);\n            settings.onTopPassed = function() {\n              module.debug('Element passed, adding fixed position', $module);\n              module.show.placeholder();\n              module.set.fixed();\n              if(settings.transition) {\n                if($.fn.transition !== undefined) {\n                  $module.transition(settings.transition, settings.duration);\n                }\n              }\n            };\n            settings.onTopPassedReverse = function() {\n              module.debug('Element returned to position, removing fixed', $module);\n              module.hide.placeholder();\n              module.remove.fixed();\n            };\n          }\n        },\n\n        create: {\n          placeholder: function() {\n            module.verbose('Creating fixed position placeholder');\n            $placeholder = $module\n              .clone(false)\n              .css('display', 'none')\n              .addClass(className.placeholder)\n              .insertAfter($module)\n            ;\n          }\n        },\n\n        show: {\n          placeholder: function() {\n            module.verbose('Showing placeholder');\n            $placeholder\n              .css('display', 'block')\n              .css('visibility', 'hidden')\n            ;\n          }\n        },\n        hide: {\n          placeholder: function() {\n            module.verbose('Hiding placeholder');\n            $placeholder\n              .css('display', 'none')\n              .css('visibility', '')\n            ;\n          }\n        },\n\n        set: {\n          fixed: function() {\n            module.verbose('Setting element to fixed position');\n            $module\n              .addClass(className.fixed)\n              .css({\n                position : 'fixed',\n                top      : settings.offset + 'px',\n                left     : 'auto',\n                zIndex   : settings.zIndex\n              })\n            ;\n            settings.onFixed.call(element);\n          },\n          image: function(src, callback) {\n            $module\n              .attr('src', src)\n            ;\n            if(settings.transition) {\n              if( $.fn.transition !== undefined) {\n                if($module.hasClass(className.visible)) {\n                  module.debug('Transition already occurred on this image, skipping animation');\n                  return;\n                }\n                $module.transition(settings.transition, settings.duration, callback);\n              }\n              else {\n                $module.fadeIn(settings.duration, callback);\n              }\n            }\n            else {\n              $module.show();\n            }\n          }\n        },\n\n        is: {\n          onScreen: function() {\n            var\n              calculations   = module.get.elementCalculations()\n            ;\n            return calculations.onScreen;\n          },\n          offScreen: function() {\n            var\n              calculations   = module.get.elementCalculations()\n            ;\n            return calculations.offScreen;\n          },\n          visible: function() {\n            if(module.cache && module.cache.element) {\n              return !(module.cache.element.width === 0 && module.cache.element.offset.top === 0);\n            }\n            return false;\n          },\n          verticallyScrollableContext: function() {\n            var\n              overflowY = ($context.get(0) !== window)\n                ? $context.css('overflow-y')\n                : false\n            ;\n            return (overflowY == 'auto' || overflowY == 'scroll');\n          },\n          horizontallyScrollableContext: function() {\n            var\n              overflowX = ($context.get(0) !== window)\n                ? $context.css('overflow-x')\n                : false\n            ;\n            return (overflowX == 'auto' || overflowX == 'scroll');\n          }\n        },\n\n        refresh: function() {\n          module.debug('Refreshing constants (width/height)');\n          if(settings.type == 'fixed') {\n            module.resetFixed();\n          }\n          module.reset();\n          module.save.position();\n          if(settings.checkOnRefresh) {\n            module.checkVisibility();\n          }\n          settings.onRefresh.call(element);\n        },\n\n        resetFixed: function () {\n          module.remove.fixed();\n          module.remove.occurred();\n        },\n\n        reset: function() {\n          module.verbose('Resetting all cached values');\n          if( $.isPlainObject(module.cache) ) {\n            module.cache.screen = {};\n            module.cache.element = {};\n          }\n        },\n\n        checkVisibility: function(scroll) {\n          module.verbose('Checking visibility of element', module.cache.element);\n\n          if( !disabled && module.is.visible() ) {\n\n            // save scroll position\n            module.save.scroll(scroll);\n\n            // update calculations derived from scroll\n            module.save.calculations();\n\n            // percentage\n            module.passed();\n\n            // reverse (must be first)\n            module.passingReverse();\n            module.topVisibleReverse();\n            module.bottomVisibleReverse();\n            module.topPassedReverse();\n            module.bottomPassedReverse();\n\n            // one time\n            module.onScreen();\n            module.offScreen();\n            module.passing();\n            module.topVisible();\n            module.bottomVisible();\n            module.topPassed();\n            module.bottomPassed();\n\n            // on update callback\n            if(settings.onUpdate) {\n              settings.onUpdate.call(element, module.get.elementCalculations());\n            }\n          }\n        },\n\n        passed: function(amount, newCallback) {\n          var\n            calculations   = module.get.elementCalculations(),\n            amountInPixels\n          ;\n          // assign callback\n          if(amount && newCallback) {\n            settings.onPassed[amount] = newCallback;\n          }\n          else if(amount !== undefined) {\n            return (module.get.pixelsPassed(amount) > calculations.pixelsPassed);\n          }\n          else if(calculations.passing) {\n            $.each(settings.onPassed, function(amount, callback) {\n              if(calculations.bottomVisible || calculations.pixelsPassed > module.get.pixelsPassed(amount)) {\n                module.execute(callback, amount);\n              }\n              else if(!settings.once) {\n                module.remove.occurred(callback);\n              }\n            });\n          }\n        },\n\n        onScreen: function(newCallback) {\n          var\n            calculations = module.get.elementCalculations(),\n            callback     = newCallback || settings.onOnScreen,\n            callbackName = 'onScreen'\n          ;\n          if(newCallback) {\n            module.debug('Adding callback for onScreen', newCallback);\n            settings.onOnScreen = newCallback;\n          }\n          if(calculations.onScreen) {\n            module.execute(callback, callbackName);\n          }\n          else if(!settings.once) {\n            module.remove.occurred(callbackName);\n          }\n          if(newCallback !== undefined) {\n            return calculations.onOnScreen;\n          }\n        },\n\n        offScreen: function(newCallback) {\n          var\n            calculations = module.get.elementCalculations(),\n            callback     = newCallback || settings.onOffScreen,\n            callbackName = 'offScreen'\n          ;\n          if(newCallback) {\n            module.debug('Adding callback for offScreen', newCallback);\n            settings.onOffScreen = newCallback;\n          }\n          if(calculations.offScreen) {\n            module.execute(callback, callbackName);\n          }\n          else if(!settings.once) {\n            module.remove.occurred(callbackName);\n          }\n          if(newCallback !== undefined) {\n            return calculations.onOffScreen;\n          }\n        },\n\n        passing: function(newCallback) {\n          var\n            calculations = module.get.elementCalculations(),\n            callback     = newCallback || settings.onPassing,\n            callbackName = 'passing'\n          ;\n          if(newCallback) {\n            module.debug('Adding callback for passing', newCallback);\n            settings.onPassing = newCallback;\n          }\n          if(calculations.passing) {\n            module.execute(callback, callbackName);\n          }\n          else if(!settings.once) {\n            module.remove.occurred(callbackName);\n          }\n          if(newCallback !== undefined) {\n            return calculations.passing;\n          }\n        },\n\n\n        topVisible: function(newCallback) {\n          var\n            calculations = module.get.elementCalculations(),\n            callback     = newCallback || settings.onTopVisible,\n            callbackName = 'topVisible'\n          ;\n          if(newCallback) {\n            module.debug('Adding callback for top visible', newCallback);\n            settings.onTopVisible = newCallback;\n          }\n          if(calculations.topVisible) {\n            module.execute(callback, callbackName);\n          }\n          else if(!settings.once) {\n            module.remove.occurred(callbackName);\n          }\n          if(newCallback === undefined) {\n            return calculations.topVisible;\n          }\n        },\n\n        bottomVisible: function(newCallback) {\n          var\n            calculations = module.get.elementCalculations(),\n            callback     = newCallback || settings.onBottomVisible,\n            callbackName = 'bottomVisible'\n          ;\n          if(newCallback) {\n            module.debug('Adding callback for bottom visible', newCallback);\n            settings.onBottomVisible = newCallback;\n          }\n          if(calculations.bottomVisible) {\n            module.execute(callback, callbackName);\n          }\n          else if(!settings.once) {\n            module.remove.occurred(callbackName);\n          }\n          if(newCallback === undefined) {\n            return calculations.bottomVisible;\n          }\n        },\n\n        topPassed: function(newCallback) {\n          var\n            calculations = module.get.elementCalculations(),\n            callback     = newCallback || settings.onTopPassed,\n            callbackName = 'topPassed'\n          ;\n          if(newCallback) {\n            module.debug('Adding callback for top passed', newCallback);\n            settings.onTopPassed = newCallback;\n          }\n          if(calculations.topPassed) {\n            module.execute(callback, callbackName);\n          }\n          else if(!settings.once) {\n            module.remove.occurred(callbackName);\n          }\n          if(newCallback === undefined) {\n            return calculations.topPassed;\n          }\n        },\n\n        bottomPassed: function(newCallback) {\n          var\n            calculations = module.get.elementCalculations(),\n            callback     = newCallback || settings.onBottomPassed,\n            callbackName = 'bottomPassed'\n          ;\n          if(newCallback) {\n            module.debug('Adding callback for bottom passed', newCallback);\n            settings.onBottomPassed = newCallback;\n          }\n          if(calculations.bottomPassed) {\n            module.execute(callback, callbackName);\n          }\n          else if(!settings.once) {\n            module.remove.occurred(callbackName);\n          }\n          if(newCallback === undefined) {\n            return calculations.bottomPassed;\n          }\n        },\n\n        passingReverse: function(newCallback) {\n          var\n            calculations = module.get.elementCalculations(),\n            callback     = newCallback || settings.onPassingReverse,\n            callbackName = 'passingReverse'\n          ;\n          if(newCallback) {\n            module.debug('Adding callback for passing reverse', newCallback);\n            settings.onPassingReverse = newCallback;\n          }\n          if(!calculations.passing) {\n            if(module.get.occurred('passing')) {\n              module.execute(callback, callbackName);\n            }\n          }\n          else if(!settings.once) {\n            module.remove.occurred(callbackName);\n          }\n          if(newCallback !== undefined) {\n            return !calculations.passing;\n          }\n        },\n\n\n        topVisibleReverse: function(newCallback) {\n          var\n            calculations = module.get.elementCalculations(),\n            callback     = newCallback || settings.onTopVisibleReverse,\n            callbackName = 'topVisibleReverse'\n          ;\n          if(newCallback) {\n            module.debug('Adding callback for top visible reverse', newCallback);\n            settings.onTopVisibleReverse = newCallback;\n          }\n          if(!calculations.topVisible) {\n            if(module.get.occurred('topVisible')) {\n              module.execute(callback, callbackName);\n            }\n          }\n          else if(!settings.once) {\n            module.remove.occurred(callbackName);\n          }\n          if(newCallback === undefined) {\n            return !calculations.topVisible;\n          }\n        },\n\n        bottomVisibleReverse: function(newCallback) {\n          var\n            calculations = module.get.elementCalculations(),\n            callback     = newCallback || settings.onBottomVisibleReverse,\n            callbackName = 'bottomVisibleReverse'\n          ;\n          if(newCallback) {\n            module.debug('Adding callback for bottom visible reverse', newCallback);\n            settings.onBottomVisibleReverse = newCallback;\n          }\n          if(!calculations.bottomVisible) {\n            if(module.get.occurred('bottomVisible')) {\n              module.execute(callback, callbackName);\n            }\n          }\n          else if(!settings.once) {\n            module.remove.occurred(callbackName);\n          }\n          if(newCallback === undefined) {\n            return !calculations.bottomVisible;\n          }\n        },\n\n        topPassedReverse: function(newCallback) {\n          var\n            calculations = module.get.elementCalculations(),\n            callback     = newCallback || settings.onTopPassedReverse,\n            callbackName = 'topPassedReverse'\n          ;\n          if(newCallback) {\n            module.debug('Adding callback for top passed reverse', newCallback);\n            settings.onTopPassedReverse = newCallback;\n          }\n          if(!calculations.topPassed) {\n            if(module.get.occurred('topPassed')) {\n              module.execute(callback, callbackName);\n            }\n          }\n          else if(!settings.once) {\n            module.remove.occurred(callbackName);\n          }\n          if(newCallback === undefined) {\n            return !calculations.onTopPassed;\n          }\n        },\n\n        bottomPassedReverse: function(newCallback) {\n          var\n            calculations = module.get.elementCalculations(),\n            callback     = newCallback || settings.onBottomPassedReverse,\n            callbackName = 'bottomPassedReverse'\n          ;\n          if(newCallback) {\n            module.debug('Adding callback for bottom passed reverse', newCallback);\n            settings.onBottomPassedReverse = newCallback;\n          }\n          if(!calculations.bottomPassed) {\n            if(module.get.occurred('bottomPassed')) {\n              module.execute(callback, callbackName);\n            }\n          }\n          else if(!settings.once) {\n            module.remove.occurred(callbackName);\n          }\n          if(newCallback === undefined) {\n            return !calculations.bottomPassed;\n          }\n        },\n\n        execute: function(callback, callbackName) {\n          var\n            calculations = module.get.elementCalculations(),\n            screen       = module.get.screenCalculations()\n          ;\n          callback = callback || false;\n          if(callback) {\n            if(settings.continuous) {\n              module.debug('Callback being called continuously', callbackName, calculations);\n              callback.call(element, calculations, screen);\n            }\n            else if(!module.get.occurred(callbackName)) {\n              module.debug('Conditions met', callbackName, calculations);\n              callback.call(element, calculations, screen);\n            }\n          }\n          module.save.occurred(callbackName);\n        },\n\n        remove: {\n          fixed: function() {\n            module.debug('Removing fixed position');\n            $module\n              .removeClass(className.fixed)\n              .css({\n                position : '',\n                top      : '',\n                left     : '',\n                zIndex   : ''\n              })\n            ;\n            settings.onUnfixed.call(element);\n          },\n          placeholder: function() {\n            module.debug('Removing placeholder content');\n            if($placeholder) {\n              $placeholder.remove();\n            }\n          },\n          occurred: function(callback) {\n            if(callback) {\n              var\n                occurred = module.cache.occurred\n              ;\n              if(occurred[callback] !== undefined && occurred[callback] === true) {\n                module.debug('Callback can now be called again', callback);\n                module.cache.occurred[callback] = false;\n              }\n            }\n            else {\n              module.cache.occurred = {};\n            }\n          }\n        },\n\n        save: {\n          calculations: function() {\n            module.verbose('Saving all calculations necessary to determine positioning');\n            module.save.direction();\n            module.save.screenCalculations();\n            module.save.elementCalculations();\n          },\n          occurred: function(callback) {\n            if(callback) {\n              if(module.cache.occurred[callback] === undefined || (module.cache.occurred[callback] !== true)) {\n                module.verbose('Saving callback occurred', callback);\n                module.cache.occurred[callback] = true;\n              }\n            }\n          },\n          scroll: function(scrollPosition) {\n            scrollPosition      = scrollPosition + settings.offset || $context.scrollTop() + settings.offset;\n            module.cache.scroll = scrollPosition;\n          },\n          direction: function() {\n            var\n              scroll     = module.get.scroll(),\n              lastScroll = module.get.lastScroll(),\n              direction\n            ;\n            if(scroll > lastScroll && lastScroll) {\n              direction = 'down';\n            }\n            else if(scroll < lastScroll && lastScroll) {\n              direction = 'up';\n            }\n            else {\n              direction = 'static';\n            }\n            module.cache.direction = direction;\n            return module.cache.direction;\n          },\n          elementPosition: function() {\n            var\n              element = module.cache.element,\n              screen  = module.get.screenSize()\n            ;\n            module.verbose('Saving element position');\n            // (quicker than $.extend)\n            element.fits          = (element.height < screen.height);\n            element.offset        = $module.offset();\n            element.width         = $module.outerWidth();\n            element.height        = $module.outerHeight();\n            // compensate for scroll in context\n            if(module.is.verticallyScrollableContext()) {\n              element.offset.top += $context.scrollTop() - $context.offset().top;\n            }\n            if(module.is.horizontallyScrollableContext()) {\n              element.offset.left += $context.scrollLeft - $context.offset().left;\n            }\n            // store\n            module.cache.element = element;\n            return element;\n          },\n          elementCalculations: function() {\n            var\n              screen     = module.get.screenCalculations(),\n              element    = module.get.elementPosition()\n            ;\n            // offset\n            if(settings.includeMargin) {\n              element.margin        = {};\n              element.margin.top    = parseInt($module.css('margin-top'), 10);\n              element.margin.bottom = parseInt($module.css('margin-bottom'), 10);\n              element.top    = element.offset.top - element.margin.top;\n              element.bottom = element.offset.top + element.height + element.margin.bottom;\n            }\n            else {\n              element.top    = element.offset.top;\n              element.bottom = element.offset.top + element.height;\n            }\n\n            // visibility\n            element.topPassed        = (screen.top >= element.top);\n            element.bottomPassed     = (screen.top >= element.bottom);\n            element.topVisible       = (screen.bottom >= element.top) && !element.topPassed;\n            element.bottomVisible    = (screen.bottom >= element.bottom) && !element.bottomPassed;\n            element.pixelsPassed     = 0;\n            element.percentagePassed = 0;\n\n            // meta calculations\n            element.onScreen  = ((element.topVisible || element.passing) && !element.bottomPassed);\n            element.passing   = (element.topPassed && !element.bottomPassed);\n            element.offScreen = (!element.onScreen);\n\n            // passing calculations\n            if(element.passing) {\n              element.pixelsPassed     = (screen.top - element.top);\n              element.percentagePassed = (screen.top - element.top) / element.height;\n            }\n            module.cache.element = element;\n            module.verbose('Updated element calculations', element);\n            return element;\n          },\n          screenCalculations: function() {\n            var\n              scroll = module.get.scroll()\n            ;\n            module.save.direction();\n            module.cache.screen.top    = scroll;\n            module.cache.screen.bottom = scroll + module.cache.screen.height;\n            return module.cache.screen;\n          },\n          screenSize: function() {\n            module.verbose('Saving window position');\n            module.cache.screen = {\n              height: $context.height()\n            };\n          },\n          position: function() {\n            module.save.screenSize();\n            module.save.elementPosition();\n          }\n        },\n\n        get: {\n          pixelsPassed: function(amount) {\n            var\n              element = module.get.elementCalculations()\n            ;\n            if(amount.search('%') > -1) {\n              return ( element.height * (parseInt(amount, 10) / 100) );\n            }\n            return parseInt(amount, 10);\n          },\n          occurred: function(callback) {\n            return (module.cache.occurred !== undefined)\n              ? module.cache.occurred[callback] || false\n              : false\n            ;\n          },\n          direction: function() {\n            if(module.cache.direction === undefined) {\n              module.save.direction();\n            }\n            return module.cache.direction;\n          },\n          elementPosition: function() {\n            if(module.cache.element === undefined) {\n              module.save.elementPosition();\n            }\n            return module.cache.element;\n          },\n          elementCalculations: function() {\n            if(module.cache.element === undefined) {\n              module.save.elementCalculations();\n            }\n            return module.cache.element;\n          },\n          screenCalculations: function() {\n            if(module.cache.screen === undefined) {\n              module.save.screenCalculations();\n            }\n            return module.cache.screen;\n          },\n          screenSize: function() {\n            if(module.cache.screen === undefined) {\n              module.save.screenSize();\n            }\n            return module.cache.screen;\n          },\n          scroll: function() {\n            if(module.cache.scroll === undefined) {\n              module.save.scroll();\n            }\n            return module.cache.scroll;\n          },\n          lastScroll: function() {\n            if(module.cache.screen === undefined) {\n              module.debug('First scroll event, no last scroll could be found');\n              return false;\n            }\n            return module.cache.screen.top;\n          }\n        },\n\n        setting: function(name, value) {\n          if( $.isPlainObject(name) ) {\n            $.extend(true, settings, name);\n          }\n          else if(value !== undefined) {\n            settings[name] = value;\n          }\n          else {\n            return settings[name];\n          }\n        },\n        internal: function(name, value) {\n          if( $.isPlainObject(name) ) {\n            $.extend(true, module, name);\n          }\n          else if(value !== undefined) {\n            module[name] = value;\n          }\n          else {\n            return module[name];\n          }\n        },\n        debug: function() {\n          if(!settings.silent && settings.debug) {\n            if(settings.performance) {\n              module.performance.log(arguments);\n            }\n            else {\n              module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');\n              module.debug.apply(console, arguments);\n            }\n          }\n        },\n        verbose: function() {\n          if(!settings.silent && settings.verbose && settings.debug) {\n            if(settings.performance) {\n              module.performance.log(arguments);\n            }\n            else {\n              module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');\n              module.verbose.apply(console, arguments);\n            }\n          }\n        },\n        error: function() {\n          if(!settings.silent) {\n            module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');\n            module.error.apply(console, arguments);\n          }\n        },\n        performance: {\n          log: function(message) {\n            var\n              currentTime,\n              executionTime,\n              previousTime\n            ;\n            if(settings.performance) {\n              currentTime   = new Date().getTime();\n              previousTime  = time || currentTime;\n              executionTime = currentTime - previousTime;\n              time          = currentTime;\n              performance.push({\n                'Name'           : message[0],\n                'Arguments'      : [].slice.call(message, 1) || '',\n                'Element'        : element,\n                'Execution Time' : executionTime\n              });\n            }\n            clearTimeout(module.performance.timer);\n            module.performance.timer = setTimeout(module.performance.display, 500);\n          },\n          display: function() {\n            var\n              title = settings.name + ':',\n              totalTime = 0\n            ;\n            time = false;\n            clearTimeout(module.performance.timer);\n            $.each(performance, function(index, data) {\n              totalTime += data['Execution Time'];\n            });\n            title += ' ' + totalTime + 'ms';\n            if(moduleSelector) {\n              title += ' \\'' + moduleSelector + '\\'';\n            }\n            if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {\n              console.groupCollapsed(title);\n              if(console.table) {\n                console.table(performance);\n              }\n              else {\n                $.each(performance, function(index, data) {\n                  console.log(data['Name'] + ': ' + data['Execution Time']+'ms');\n                });\n              }\n              console.groupEnd();\n            }\n            performance = [];\n          }\n        },\n        invoke: function(query, passedArguments, context) {\n          var\n            object = instance,\n            maxDepth,\n            found,\n            response\n          ;\n          passedArguments = passedArguments || queryArguments;\n          context         = element         || context;\n          if(typeof query == 'string' && object !== undefined) {\n            query    = query.split(/[\\. ]/);\n            maxDepth = query.length - 1;\n            $.each(query, function(depth, value) {\n              var camelCaseValue = (depth != maxDepth)\n                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)\n                : query\n              ;\n              if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {\n                object = object[camelCaseValue];\n              }\n              else if( object[camelCaseValue] !== undefined ) {\n                found = object[camelCaseValue];\n                return false;\n              }\n              else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {\n                object = object[value];\n              }\n              else if( object[value] !== undefined ) {\n                found = object[value];\n                return false;\n              }\n              else {\n                module.error(error.method, query);\n                return false;\n              }\n            });\n          }\n          if ( $.isFunction( found ) ) {\n            response = found.apply(context, passedArguments);\n          }\n          else if(found !== undefined) {\n            response = found;\n          }\n          if($.isArray(returnedValue)) {\n            returnedValue.push(response);\n          }\n          else if(returnedValue !== undefined) {\n            returnedValue = [returnedValue, response];\n          }\n          else if(response !== undefined) {\n            returnedValue = response;\n          }\n          return found;\n        }\n      };\n\n      if(methodInvoked) {\n        if(instance === undefined) {\n          module.initialize();\n        }\n        instance.save.scroll();\n        instance.save.calculations();\n        module.invoke(query);\n      }\n      else {\n        if(instance !== undefined) {\n          instance.invoke('destroy');\n        }\n        module.initialize();\n      }\n    })\n  ;\n\n  return (returnedValue !== undefined)\n    ? returnedValue\n    : this\n  ;\n};\n\n$.fn.visibility.settings = {\n\n  name                   : 'Visibility',\n  namespace              : 'visibility',\n\n  debug                  : false,\n  verbose                : false,\n  performance            : true,\n\n  // whether to use mutation observers to follow changes\n  observeChanges         : true,\n\n  // check position immediately on init\n  initialCheck           : true,\n\n  // whether to refresh calculations after all page images load\n  refreshOnLoad          : true,\n\n  // whether to refresh calculations after page resize event\n  refreshOnResize        : true,\n\n  // should call callbacks on refresh event (resize, etc)\n  checkOnRefresh         : true,\n\n  // callback should only occur one time\n  once                   : true,\n\n  // callback should fire continuously whe evaluates to true\n  continuous             : false,\n\n  // offset to use with scroll top\n  offset                 : 0,\n\n  // whether to include margin in elements position\n  includeMargin          : false,\n\n  // scroll context for visibility checks\n  context                : window,\n\n  // visibility check delay in ms (defaults to animationFrame)\n  throttle               : false,\n\n  // special visibility type (image, fixed)\n  type                   : false,\n\n  // z-index to use with visibility 'fixed'\n  zIndex                 : '10',\n\n  // image only animation settings\n  transition             : 'fade in',\n  duration               : 1000,\n\n  // array of callbacks for percentage\n  onPassed               : {},\n\n  // standard callbacks\n  onOnScreen             : false,\n  onOffScreen            : false,\n  onPassing              : false,\n  onTopVisible           : false,\n  onBottomVisible        : false,\n  onTopPassed            : false,\n  onBottomPassed         : false,\n\n  // reverse callbacks\n  onPassingReverse       : false,\n  onTopVisibleReverse    : false,\n  onBottomVisibleReverse : false,\n  onTopPassedReverse     : false,\n  onBottomPassedReverse  : false,\n\n  // special callbacks for image\n  onLoad                 : function() {},\n  onAllLoaded            : function() {},\n\n  // special callbacks for fixed position\n  onFixed                : function() {},\n  onUnfixed              : function() {},\n\n  // utility callbacks\n  onUpdate               : false, // disabled by default for performance\n  onRefresh              : function(){},\n\n  metadata : {\n    src: 'src'\n  },\n\n  className: {\n    fixed       : 'fixed',\n    placeholder : 'placeholder',\n    visible     : 'visible'\n  },\n\n  error : {\n    method  : 'The method you called is not defined.',\n    visible : 'Element is hidden, you must call refresh after element becomes visible'\n  }\n\n};\n\n})( jQuery, window, document );\n"
  },
  {
    "path": "semantic/src/definitions/collections/breadcrumb.less",
    "content": "/*!\n * # Semantic UI - Breadcrumb\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n/*******************************\n            Theme\n*******************************/\n\n@type    : 'collection';\n@element : 'breadcrumb';\n\n@import (multiple) '../../theme.config';\n\n\n/*******************************\n           Breadcrumb\n*******************************/\n\n.ui.breadcrumb {\n  line-height: 1;\n  display: @display;\n  margin: @verticalMargin 0em;\n  vertical-align: @verticalAlign;\n}\n.ui.breadcrumb:first-child {\n  margin-top: 0em;\n}\n.ui.breadcrumb:last-child {\n  margin-bottom: 0em;\n}\n\n/*******************************\n          Content\n*******************************/\n\n/* Divider */\n.ui.breadcrumb .divider {\n  display: inline-block;\n  opacity: @dividerOpacity;\n  margin: 0em @dividerSpacing 0em;\n\n  font-size: @dividerSize;\n  color: @dividerColor;\n  vertical-align: @dividerVerticalAlign;\n}\n\n/* Link */\n.ui.breadcrumb a {\n  color: @linkColor;\n}\n.ui.breadcrumb a:hover {\n  color: @linkHoverColor;\n}\n\n\n/* Icon Divider */\n.ui.breadcrumb .icon.divider {\n  font-size: @iconDividerSize;\n  vertical-align: @iconDividerVerticalAlign;\n}\n\n/* Section */\n.ui.breadcrumb a.section {\n  cursor: pointer;\n}\n.ui.breadcrumb .section {\n  display: inline-block;\n  margin: @sectionMargin;\n  padding: @sectionPadding;\n}\n\n/* Loose Coupling */\n.ui.breadcrumb.segment {\n  display: inline-block;\n  padding: @segmentPadding;\n}\n\n/*******************************\n            States\n*******************************/\n\n.ui.breadcrumb .active.section {\n  font-weight: @activeFontWeight;\n}\n\n\n/*******************************\n           Variations\n*******************************/\n\n.ui.mini.breadcrumb {\n  font-size: @mini;\n}\n.ui.tiny.breadcrumb {\n  font-size: @tiny;\n}\n.ui.small.breadcrumb {\n  font-size: @small;\n}\n.ui.breadcrumb {\n  font-size: @medium;\n}\n.ui.large.breadcrumb {\n  font-size: @large;\n}\n.ui.big.breadcrumb {\n  font-size: @big;\n}\n.ui.huge.breadcrumb {\n  font-size: @huge;\n}\n.ui.massive.breadcrumb {\n  font-size: @massive;\n}\n\n.loadUIOverrides();\n"
  },
  {
    "path": "semantic/src/definitions/collections/form.less",
    "content": "/*!\n * # Semantic UI - Form\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n/*******************************\n            Theme\n*******************************/\n\n@type    : 'collection';\n@element : 'form';\n\n@import (multiple) '../../theme.config';\n\n/*******************************\n            Elements\n*******************************/\n\n/*--------------------\n        Form\n---------------------*/\n\n.ui.form {\n  position: relative;\n  max-width: 100%;\n}\n\n/*--------------------\n        Content\n---------------------*/\n\n.ui.form > p {\n  margin: @paragraphMargin;\n}\n\n/*--------------------\n        Field\n---------------------*/\n\n.ui.form .field {\n  clear: both;\n  margin: @fieldMargin;\n}\n\n.ui.form .field:last-child,\n.ui.form .fields:last-child .field {\n  margin-bottom: 0em;\n}\n\n.ui.form .fields .field {\n  clear: both;\n  margin: 0em;\n}\n\n\n/*--------------------\n        Labels\n---------------------*/\n\n.ui.form .field > label {\n  display: block;\n  margin: @labelMargin;\n  color: @labelColor;\n  font-size: @labelFontSize;\n  font-weight: @labelFontWeight;\n  text-transform: @labelTextTransform;\n}\n\n/*--------------------\n    Standard Inputs\n---------------------*/\n\n\n.ui.form textarea,\n.ui.form input:not([type]),\n.ui.form input[type=\"date\"],\n.ui.form input[type=\"datetime-local\"],\n.ui.form input[type=\"email\"],\n.ui.form input[type=\"number\"],\n.ui.form input[type=\"password\"],\n.ui.form input[type=\"search\"],\n.ui.form input[type=\"tel\"],\n.ui.form input[type=\"time\"],\n.ui.form input[type=\"text\"],\n.ui.form input[type=\"file\"],\n.ui.form input[type=\"url\"] {\n  width: @inputWidth;\n  vertical-align: top;\n}\n\n/* Set max height on unusual input */\n.ui.form ::-webkit-datetime-edit,\n.ui.form ::-webkit-inner-spin-button {\n  height: @inputLineHeight;\n}\n\n.ui.form input:not([type]),\n.ui.form input[type=\"date\"],\n.ui.form input[type=\"datetime-local\"],\n.ui.form input[type=\"email\"],\n.ui.form input[type=\"number\"],\n.ui.form input[type=\"password\"],\n.ui.form input[type=\"search\"],\n.ui.form input[type=\"tel\"],\n.ui.form input[type=\"time\"],\n.ui.form input[type=\"text\"],\n.ui.form input[type=\"file\"],\n.ui.form input[type=\"url\"] {\n  font-family: @inputFont;\n  margin: 0em;\n  outline: none;\n  -webkit-appearance: none;\n  tap-highlight-color:  rgba(255, 255, 255, 0);\n\n  line-height: @inputLineHeight;\n  padding: @inputPadding;\n  font-size: @inputFontSize;\n\n  background: @inputBackground;\n  border: @inputBorder;\n  color: @inputColor;\n  border-radius: @inputBorderRadius;\n  box-shadow: @inputBoxShadow;\n  transition: @inputTransition;\n}\n\n/* Text Area */\n.ui.form textarea {\n  margin: 0em;\n  -webkit-appearance: none;\n  tap-highlight-color:  rgba(255, 255, 255, 0);\n\n  padding: @textAreaPadding;\n  font-size: @textAreaFontSize;\n  background: @textAreaBackground;\n  border: @textAreaBorder;\n  outline: none;\n  color: @inputColor;\n  border-radius: @inputBorderRadius;\n  box-shadow: @inputBoxShadow;\n  transition: @textAreaTransition;\n  font-size: @textAreaFontSize;\n  line-height: @textAreaLineHeight;\n  resize: @textAreaResize;\n}\n.ui.form textarea:not([rows]) {\n  height: @textAreaHeight;\n  min-height: @textAreaMinHeight;\n  max-height: @textAreaMaxHeight;\n}\n\n.ui.form textarea,\n.ui.form input[type=\"checkbox\"] {\n  vertical-align: @checkboxVerticalAlign;\n}\n\n/*--------------------------\n  Input w/ attached Button\n---------------------------*/\n\n.ui.form input.attached {\n  width: auto;\n}\n\n\n/*--------------------\n     Basic Select\n---------------------*/\n\n.ui.form select {\n  display: block;\n  height: auto;\n  width: 100%;\n  background: @selectBackground;\n  border: @selectBorder;\n  border-radius: @selectBorderRadius;\n  box-shadow: @selectBoxShadow;\n  padding: @selectPadding;\n  color: @selectColor;\n  transition: @selectTransition;\n}\n\n/*--------------------\n       Dropdown\n---------------------*/\n\n/* Block */\n.ui.form .field > .selection.dropdown {\n  width: 100%;\n}\n.ui.form .field > .selection.dropdown > .dropdown.icon {\n  float: right;\n}\n\n/* Inline */\n.ui.form .inline.fields .field > .selection.dropdown,\n.ui.form .inline.field > .selection.dropdown {\n  width: auto;\n}\n.ui.form .inline.fields .field > .selection.dropdown > .dropdown.icon,\n.ui.form .inline.field > .selection.dropdown > .dropdown.icon {\n  float: none;\n}\n\n/*--------------------\n       UI Input\n---------------------*/\n\n/* Block */\n.ui.form .field .ui.input,\n.ui.form .fields .field .ui.input,\n.ui.form .wide.field .ui.input {\n  width: 100%;\n}\n\n/* Inline  */\n.ui.form .inline.fields .field:not(.wide) .ui.input,\n.ui.form .inline.field:not(.wide) .ui.input {\n  width: auto;\n  vertical-align: middle;\n}\n\n/* Auto Input */\n.ui.form .fields .field .ui.input input,\n.ui.form .field .ui.input input {\n  width: auto;\n}\n\n/* Full Width Input */\n.ui.form .ten.fields .ui.input input,\n.ui.form .nine.fields .ui.input input,\n.ui.form .eight.fields .ui.input input,\n.ui.form .seven.fields .ui.input input,\n.ui.form .six.fields .ui.input input,\n.ui.form .five.fields .ui.input input,\n.ui.form .four.fields .ui.input input,\n.ui.form .three.fields .ui.input input,\n.ui.form .two.fields .ui.input input,\n.ui.form .wide.field .ui.input input {\n  flex: 1 0 auto;\n  width: 0px;\n}\n\n\n/*--------------------\n   Types of Messages\n---------------------*/\n\n.ui.form .success.message,\n.ui.form .warning.message,\n.ui.form .error.message {\n  display: none;\n}\n\n/* Assumptions */\n.ui.form .message:first-child {\n  margin-top: 0px;\n}\n\n/*--------------------\n   Validation Prompt\n---------------------*/\n\n.ui.form .field .prompt.label {\n  white-space: normal;\n  background: @promptBackground !important;\n  border: @promptBorder !important;\n  color: @promptTextColor !important;\n}\n.ui.form .inline.fields .field .prompt,\n.ui.form .inline.field .prompt {\n  vertical-align: top;\n  margin: @inlinePromptMargin;\n}\n.ui.form .inline.fields .field .prompt:before,\n.ui.form .inline.field .prompt:before {\n  border-width: 0px 0px @inlinePromptBorderWidth @inlinePromptBorderWidth;\n  bottom: auto;\n  right: auto;\n  top: 50%;\n  left: 0em;\n}\n\n\n/*******************************\n            States\n*******************************/\n\n/*--------------------\n      Autofilled\n---------------------*/\n\n.ui.form .field.field input:-webkit-autofill {\n  box-shadow: 0px 0px 0px 100px @inputAutoFillBackground inset !important;\n  border-color: @inputAutoFillBorder !important;\n}\n\n/* Focus */\n.ui.form .field.field input:-webkit-autofill:focus {\n  box-shadow: 0px 0px 0px 100px @inputAutoFillFocusBackground inset !important;\n  border-color: @inputAutoFillFocusBorder !important;\n}\n\n/* Error */\n.ui.form .error.error input:-webkit-autofill {\n  box-shadow: 0px 0px 0px 100px @inputAutoFillErrorBackground inset !important;\n  border-color: @inputAutoFillErrorBorder !important;\n}\n\n\n\n/*--------------------\n      Placeholder\n---------------------*/\n\n/* browsers require these rules separate */\n.ui.form ::-webkit-input-placeholder {\n  color: @inputPlaceholderColor;\n}\n.ui.form :-ms-input-placeholder {\n  color: @inputPlaceholderColor;\n}\n.ui.form ::-moz-placeholder {\n  color: @inputPlaceholderColor;\n}\n\n.ui.form :focus::-webkit-input-placeholder {\n  color: @inputPlaceholderFocusColor;\n}\n.ui.form :focus:-ms-input-placeholder {\n  color: @inputPlaceholderFocusColor;\n}\n.ui.form :focus::-moz-placeholder {\n  color: @inputPlaceholderFocusColor;\n}\n\n/* Error Placeholder */\n.ui.form .error ::-webkit-input-placeholder {\n  color: @inputErrorPlaceholderColor;\n}\n.ui.form .error :-ms-input-placeholder {\n  color: @inputErrorPlaceholderColor !important;\n}\n.ui.form .error ::-moz-placeholder {\n  color: @inputErrorPlaceholderColor;\n}\n\n.ui.form .error :focus::-webkit-input-placeholder {\n  color: @inputErrorPlaceholderFocusColor;\n}\n.ui.form .error :focus:-ms-input-placeholder {\n  color: @inputErrorPlaceholderFocusColor !important;\n}\n.ui.form .error :focus::-moz-placeholder {\n  color: @inputErrorPlaceholderFocusColor;\n}\n\n\n/*--------------------\n        Focus\n---------------------*/\n\n.ui.form input:not([type]):focus,\n.ui.form input[type=\"date\"]:focus,\n.ui.form input[type=\"datetime-local\"]:focus,\n.ui.form input[type=\"email\"]:focus,\n.ui.form input[type=\"number\"]:focus,\n.ui.form input[type=\"password\"]:focus,\n.ui.form input[type=\"search\"]:focus,\n.ui.form input[type=\"tel\"]:focus,\n.ui.form input[type=\"time\"]:focus,\n.ui.form input[type=\"text\"]:focus,\n.ui.form input[type=\"file\"]:focus,\n.ui.form input[type=\"url\"]:focus {\n  color: @inputFocusColor;\n  border-color: @inputFocusBorderColor;\n  border-radius: @inputFocusBorderRadius;\n  background: @inputFocusBackground;\n  box-shadow: @inputFocusBoxShadow;\n}\n.ui.form textarea:focus {\n  color: @textAreaFocusColor;\n  border-color: @textAreaFocusBorderColor;\n  border-radius: @textAreaFocusBorderRadius;\n  background: @textAreaFocusBackground;\n  box-shadow: @textAreaFocusBoxShadow;\n  -webkit-appearance: none;\n}\n\n\n/*--------------------\n        Success\n---------------------*/\n\n/* On Form */\n.ui.form.success .success.message:not(:empty) {\n  display: block;\n}\n.ui.form.success .compact.success.message:not(:empty) {\n  display: inline-block;\n}\n.ui.form.success .icon.success.message:not(:empty) {\n  display: flex;\n}\n\n/*--------------------\n        Warning\n---------------------*/\n\n/* On Form */\n.ui.form.warning .warning.message:not(:empty) {\n  display: block;\n}\n.ui.form.warning .compact.warning.message:not(:empty) {\n  display: inline-block;\n}\n.ui.form.warning .icon.warning.message:not(:empty) {\n  display: flex;\n}\n\n/*--------------------\n        Error\n---------------------*/\n\n/* On Form */\n.ui.form.error .error.message:not(:empty) {\n  display: block;\n}\n.ui.form.error .compact.error.message:not(:empty) {\n  display: inline-block;\n}\n.ui.form.error .icon.error.message:not(:empty) {\n  display: flex;\n}\n\n/* On Field(s) */\n.ui.form .fields.error .field label,\n.ui.form .field.error label,\n.ui.form .fields.error .field .input,\n.ui.form .field.error .input {\n  color: @formErrorColor;\n}\n\n.ui.form .fields.error .field .corner.label,\n.ui.form .field.error .corner.label {\n  border-color: @formErrorColor;\n  color: @white;\n}\n\n.ui.form .fields.error .field textarea,\n.ui.form .fields.error .field select,\n.ui.form .fields.error .field input:not([type]),\n.ui.form .fields.error .field input[type=\"date\"],\n.ui.form .fields.error .field input[type=\"datetime-local\"],\n.ui.form .fields.error .field input[type=\"email\"],\n.ui.form .fields.error .field input[type=\"number\"],\n.ui.form .fields.error .field input[type=\"password\"],\n.ui.form .fields.error .field input[type=\"search\"],\n.ui.form .fields.error .field input[type=\"tel\"],\n.ui.form .fields.error .field input[type=\"time\"],\n.ui.form .fields.error .field input[type=\"text\"],\n.ui.form .fields.error .field input[type=\"file\"],\n.ui.form .fields.error .field input[type=\"url\"],\n.ui.form .field.error textarea,\n.ui.form .field.error select,\n.ui.form .field.error input:not([type]),\n.ui.form .field.error input[type=\"date\"],\n.ui.form .field.error input[type=\"datetime-local\"],\n.ui.form .field.error input[type=\"email\"],\n.ui.form .field.error input[type=\"number\"],\n.ui.form .field.error input[type=\"password\"],\n.ui.form .field.error input[type=\"search\"],\n.ui.form .field.error input[type=\"tel\"],\n.ui.form .field.error input[type=\"time\"],\n.ui.form .field.error input[type=\"text\"],\n.ui.form .field.error input[type=\"file\"],\n.ui.form .field.error input[type=\"url\"] {\n  background: @formErrorBackground;\n  border-color: @formErrorBorder;\n  color: @formErrorColor;\n  border-radius: @inputErrorBorderRadius;\n  box-shadow: @inputErrorBoxShadow;\n}\n.ui.form .field.error textarea:focus,\n.ui.form .field.error select:focus,\n.ui.form .field.error input:not([type]):focus,\n.ui.form .field.error input[type=\"date\"]:focus,\n.ui.form .field.error input[type=\"datetime-local\"]:focus,\n.ui.form .field.error input[type=\"email\"]:focus,\n.ui.form .field.error input[type=\"number\"]:focus,\n.ui.form .field.error input[type=\"password\"]:focus,\n.ui.form .field.error input[type=\"search\"]:focus,\n.ui.form .field.error input[type=\"tel\"]:focus,\n.ui.form .field.error input[type=\"time\"]:focus,\n.ui.form .field.error input[type=\"text\"]:focus,\n.ui.form .field.error input[type=\"file\"]:focus,\n.ui.form .field.error input[type=\"url\"]:focus {\n  background: @inputErrorFocusBackground;\n  border-color: @inputErrorFocusBorder;\n  color: @inputErrorFocusColor;\n\n  -webkit-appearance: none;\n  box-shadow: @inputErrorFocusBoxShadow;\n}\n\n/* Preserve Native Select Stylings */\n.ui.form .field.error select {\n  -webkit-appearance: menulist-button;\n}\n\n/*------------------\n    Dropdown Error\n--------------------*/\n\n.ui.form .fields.error .field .ui.dropdown,\n.ui.form .fields.error .field .ui.dropdown .item,\n.ui.form .field.error .ui.dropdown,\n.ui.form .field.error .ui.dropdown .text,\n.ui.form .field.error .ui.dropdown .item {\n  background: @formErrorBackground;\n  color: @formErrorColor;\n}\n.ui.form .fields.error .field .ui.dropdown,\n.ui.form .field.error .ui.dropdown {\n  border-color: @formErrorBorder !important;\n}\n.ui.form .fields.error .field .ui.dropdown:hover,\n.ui.form .field.error .ui.dropdown:hover {\n  border-color: @formErrorBorder !important;\n}\n.ui.form .fields.error .field .ui.dropdown:hover .menu,\n.ui.form .field.error .ui.dropdown:hover .menu {\n  border-color: @formErrorBorder;\n}\n.ui.form .fields.error .field .ui.multiple.selection.dropdown > .label,\n.ui.form .field.error .ui.multiple.selection.dropdown > .label {\n  background-color: @dropdownErrorLabelBackground;\n  color: @dropdownErrorLabelColor;\n}\n\n/* Hover */\n.ui.form .fields.error .field .ui.dropdown .menu .item:hover,\n.ui.form .field.error .ui.dropdown .menu .item:hover {\n  background-color: @dropdownErrorHoverBackground;\n}\n\n/* Selected */\n.ui.form .fields.error .field .ui.dropdown .menu .selected.item,\n.ui.form .field.error .ui.dropdown .menu .selected.item {\n  background-color: @dropdownErrorSelectedBackground;\n}\n\n\n/* Active */\n.ui.form .fields.error .field .ui.dropdown .menu .active.item,\n.ui.form .field.error .ui.dropdown .menu .active.item {\n  background-color: @dropdownErrorActiveBackground !important;\n}\n\n/*--------------------\n    Checkbox Error\n---------------------*/\n\n.ui.form .fields.error .field .checkbox:not(.toggle):not(.slider) label,\n.ui.form .field.error .checkbox:not(.toggle):not(.slider) label,\n.ui.form .fields.error .field .checkbox:not(.toggle):not(.slider) .box,\n.ui.form .field.error .checkbox:not(.toggle):not(.slider) .box {\n  color: @formErrorColor;\n}\n.ui.form .fields.error .field .checkbox:not(.toggle):not(.slider) label:before,\n.ui.form .field.error .checkbox:not(.toggle):not(.slider) label:before,\n.ui.form .fields.error .field .checkbox:not(.toggle):not(.slider) .box:before,\n.ui.form .field.error .checkbox:not(.toggle):not(.slider) .box:before {\n  background: @formErrorBackground;\n  border-color: @formErrorBorder;\n}\n.ui.form .fields.error .field .checkbox label:after,\n.ui.form .field.error .checkbox label:after,\n.ui.form .fields.error .field .checkbox .box:after,\n.ui.form .field.error .checkbox .box:after {\n  color: @formErrorColor;\n}\n\n/*--------------------\n       Disabled\n---------------------*/\n\n.ui.form .disabled.fields .field,\n.ui.form .disabled.field,\n.ui.form .field :disabled {\n  pointer-events: none;\n  opacity: @disabledOpacity;\n}\n.ui.form .field.disabled > label,\n.ui.form .fields.disabled > label {\n  opacity: @disabledLabelOpacity;\n}\n.ui.form .field.disabled :disabled {\n  opacity: 1;\n}\n\n\n/*--------------\n    Loading\n---------------*/\n\n.ui.loading.form {\n  position: relative;\n  cursor: default;\n  pointer-events: none;\n}\n.ui.loading.form:before {\n  position: absolute;\n  content: '';\n  top: 0%;\n  left: 0%;\n  background: @loaderDimmerColor;\n  width: 100%;\n  height: 100%;\n  z-index: @loaderDimmerZIndex;\n}\n.ui.loading.form:after {\n  position: absolute;\n  content: '';\n  top: 50%;\n  left: 50%;\n\n  margin: @loaderMargin;\n  width: @loaderSize;\n  height: @loaderSize;\n\n  animation: form-spin @loaderSpeed linear;\n  animation-iteration-count: infinite;\n\n  border-radius: @circularRadius;\n\n  border-color: @loaderLineColor @loaderFillColor @loaderFillColor @loaderFillColor;\n  border-style: solid;\n  border-width: @loaderLineWidth;\n\n  box-shadow: 0px 0px 0px 1px transparent;\n  visibility: visible;\n  z-index: @loaderLineZIndex;\n}\n\n@keyframes form-spin {\n  from {\n    transform: rotate(0deg);\n  }\n  to {\n    transform: rotate(360deg);\n  }\n}\n\n\n/*******************************\n         Element Types\n*******************************/\n\n/*--------------------\n     Required Field\n---------------------*/\n\n.ui.form .required.fields:not(.grouped) > .field > label:after,\n.ui.form .required.fields.grouped > label:after,\n.ui.form .required.field > label:after,\n.ui.form .required.fields:not(.grouped) > .field > .checkbox:after,\n.ui.form .required.field > .checkbox:after {\n  margin: @requiredMargin;\n  content: @requiredContent;\n  color: @requiredColor;\n}\n\n.ui.form .required.fields:not(.grouped) > .field > label:after,\n.ui.form .required.fields.grouped > label:after,\n.ui.form .required.field > label:after {\n  display: inline-block;\n  vertical-align: top;\n}\n\n.ui.form .required.fields:not(.grouped) > .field > .checkbox:after,\n.ui.form .required.field > .checkbox:after {\n  position: absolute;\n  top: 0%;\n  left: 100%;\n}\n\n\n/*******************************\n           Variations\n*******************************/\n\n\n/*--------------------\n    Inverted Colors\n---------------------*/\n\n.ui.inverted.form label,\n.ui.form .inverted.segment label,\n.ui.form .inverted.segment .ui.checkbox label,\n.ui.form .inverted.segment .ui.checkbox .box,\n.ui.inverted.form .ui.checkbox label,\n.ui.inverted.form .ui.checkbox .box,\n.ui.inverted.form .inline.fields > label,\n.ui.inverted.form .inline.fields .field > label,\n.ui.inverted.form .inline.fields .field > p,\n.ui.inverted.form .inline.field > label,\n.ui.inverted.form .inline.field > p {\n  color: @invertedLabelColor;\n}\n\n/* Inverted Field */\n.ui.inverted.form input:not([type]),\n.ui.inverted.form input[type=\"date\"],\n.ui.inverted.form input[type=\"datetime-local\"],\n.ui.inverted.form input[type=\"email\"],\n.ui.inverted.form input[type=\"number\"],\n.ui.inverted.form input[type=\"password\"],\n.ui.inverted.form input[type=\"search\"],\n.ui.inverted.form input[type=\"tel\"],\n.ui.inverted.form input[type=\"time\"],\n.ui.inverted.form input[type=\"text\"],\n.ui.inverted.form input[type=\"file\"],\n.ui.inverted.form input[type=\"url\"] {\n  background: @invertedInputBackground;\n  border-color: @invertedInputBorderColor;\n  color: @invertedInputColor;\n  box-shadow: @invertedInputBoxShadow;\n}\n\n\n/*--------------------\n     Field Groups\n---------------------*/\n\n/* Grouped Vertically */\n.ui.form .grouped.fields {\n  display: block;\n  margin: @groupedMargin;\n}\n.ui.form .grouped.fields:last-child {\n  margin-bottom: 0em;\n}\n\n.ui.form .grouped.fields > label {\n  margin: @groupedLabelMargin;\n  color: @groupedLabelColor;\n  font-size: @groupedLabelFontSize;\n  font-weight: @groupedLabelFontWeight;\n  text-transform: @groupedLabelTextTransform;\n}\n\n.ui.form .grouped.fields .field,\n.ui.form .grouped.inline.fields .field {\n  display: block;\n  margin: @groupedFieldMargin;\n  padding: 0em;\n}\n\n/*--------------------\n        Fields\n---------------------*/\n\n/* Split fields */\n.ui.form .fields {\n  display: flex;\n  flex-direction: row;\n  margin: @fieldsMargin;\n}\n.ui.form .fields > .field {\n  flex: 0 1 auto;\n  padding-left: (@gutterWidth / 2);\n  padding-right: (@gutterWidth / 2);\n}\n.ui.form .fields > .field:first-child {\n  border-left: none;\n  box-shadow: none;\n}\n\n/* Other Combinations */\n.ui.form .two.fields > .fields,\n.ui.form .two.fields > .field {\n  width: @twoColumn;\n}\n.ui.form .three.fields > .fields,\n.ui.form .three.fields > .field {\n  width: @threeColumn;\n}\n.ui.form .four.fields > .fields,\n.ui.form .four.fields > .field {\n  width: @fourColumn;\n}\n.ui.form .five.fields > .fields,\n.ui.form .five.fields > .field {\n  width: @fiveColumn;\n}\n.ui.form .six.fields > .fields,\n.ui.form .six.fields > .field {\n  width: @sixColumn;\n}\n.ui.form .seven.fields > .fields,\n.ui.form .seven.fields > .field {\n  width: @sevenColumn;\n}\n.ui.form .eight.fields > .fields,\n.ui.form .eight.fields > .field {\n  width: @eightColumn;\n}\n.ui.form .nine.fields > .fields,\n.ui.form .nine.fields > .field {\n  width: @nineColumn;\n}\n.ui.form .ten.fields > .fields,\n.ui.form .ten.fields > .field {\n  width: @tenColumn;\n}\n\n/* Swap to full width on mobile */\n@media only screen and (max-width : @largestMobileScreen) {\n  .ui.form .fields {\n    flex-wrap: wrap;\n  }\n\n  .ui[class*=\"equal width\"].form:not(.unstackable) .fields > .field,\n  .ui.form:not(.unstackable) [class*=\"equal width\"].fields:not(.unstackable) > .field,\n  .ui.form:not(.unstackable) .two.fields:not(.unstackable) > .fields,\n  .ui.form:not(.unstackable) .two.fields:not(.unstackable) > .field,\n  .ui.form:not(.unstackable) .three.fields:not(.unstackable) > .fields,\n  .ui.form:not(.unstackable) .three.fields:not(.unstackable) > .field,\n  .ui.form:not(.unstackable) .four.fields:not(.unstackable) > .fields,\n  .ui.form:not(.unstackable) .four.fields:not(.unstackable) > .field,\n  .ui.form:not(.unstackable) .five.fields:not(.unstackable) > .fields,\n  .ui.form:not(.unstackable) .five.fields:not(.unstackable) > .field,\n  .ui.form:not(.unstackable) .six.fields:not(.unstackable) > .fields,\n  .ui.form:not(.unstackable) .six.fields:not(.unstackable) > .field,\n  .ui.form:not(.unstackable) .seven.fields:not(.unstackable) > .fields,\n  .ui.form:not(.unstackable) .seven.fields:not(.unstackable) > .field,\n  .ui.form:not(.unstackable) .eight.fields:not(.unstackable) > .fields,\n  .ui.form:not(.unstackable) .eight.fields:not(.unstackable) > .field,\n  .ui.form:not(.unstackable) .nine.fields:not(.unstackable) > .fields,\n  .ui.form:not(.unstackable) .nine.fields:not(.unstackable) > .field,\n  .ui.form:not(.unstackable) .ten.fields:not(.unstackable) > .fields,\n  .ui.form:not(.unstackable) .ten.fields:not(.unstackable) > .field {\n    width: @oneColumn !important;\n    margin: 0em 0em @rowDistance;\n  }\n}\n\n\n/* Sizing Combinations */\n.ui.form .fields .wide.field {\n  width: @oneWide;\n  padding-left: (@gutterWidth / 2);\n  padding-right: (@gutterWidth / 2);\n}\n\n.ui.form .one.wide.field {\n  width: @oneWide !important;\n}\n.ui.form .two.wide.field {\n  width: @twoWide !important;\n}\n.ui.form .three.wide.field {\n  width: @threeWide !important;\n}\n.ui.form .four.wide.field {\n  width: @fourWide !important;\n}\n.ui.form .five.wide.field {\n  width: @fiveWide !important;\n}\n.ui.form .six.wide.field {\n  width: @sixWide !important;\n}\n.ui.form .seven.wide.field {\n  width: @sevenWide !important;\n}\n.ui.form .eight.wide.field {\n  width: @eightWide !important;\n}\n.ui.form .nine.wide.field {\n  width: @nineWide !important;\n}\n.ui.form .ten.wide.field {\n  width: @tenWide !important;\n}\n.ui.form .eleven.wide.field {\n  width: @elevenWide !important;\n}\n.ui.form .twelve.wide.field {\n  width: @twelveWide !important;\n}\n.ui.form .thirteen.wide.field {\n  width: @thirteenWide !important;\n}\n.ui.form .fourteen.wide.field {\n  width: @fourteenWide !important;\n}\n.ui.form .fifteen.wide.field {\n  width: @fifteenWide !important;\n}\n.ui.form .sixteen.wide.field {\n  width: @sixteenWide !important;\n}\n\n/* Swap to full width on mobile */\n@media only screen and (max-width : @largestMobileScreen) {\n  .ui.form:not(.unstackable) .two.fields:not(.unstackable) > .fields,\n  .ui.form:not(.unstackable) .two.fields:not(.unstackable) > .field,\n  .ui.form:not(.unstackable) .three.fields:not(.unstackable) > .fields,\n  .ui.form:not(.unstackable) .three.fields:not(.unstackable) > .field,\n  .ui.form:not(.unstackable) .four.fields:not(.unstackable) > .fields,\n  .ui.form:not(.unstackable) .four.fields:not(.unstackable) > .field,\n  .ui.form:not(.unstackable) .five.fields:not(.unstackable) > .fields,\n  .ui.form:not(.unstackable) .five.fields:not(.unstackable) > .field,\n  .ui.form:not(.unstackable) .fields:not(.unstackable) > .two.wide.field,\n  .ui.form:not(.unstackable) .fields:not(.unstackable) > .three.wide.field,\n  .ui.form:not(.unstackable) .fields:not(.unstackable) > .four.wide.field,\n  .ui.form:not(.unstackable) .fields:not(.unstackable) > .five.wide.field,\n  .ui.form:not(.unstackable) .fields:not(.unstackable) > .six.wide.field,\n  .ui.form:not(.unstackable) .fields:not(.unstackable) > .seven.wide.field,\n  .ui.form:not(.unstackable) .fields:not(.unstackable) > .eight.wide.field,\n  .ui.form:not(.unstackable) .fields:not(.unstackable) > .nine.wide.field,\n  .ui.form:not(.unstackable) .fields:not(.unstackable) > .ten.wide.field,\n  .ui.form:not(.unstackable) .fields:not(.unstackable) > .eleven.wide.field,\n  .ui.form:not(.unstackable) .fields:not(.unstackable) > .twelve.wide.field,\n  .ui.form:not(.unstackable) .fields:not(.unstackable) > .thirteen.wide.field,\n  .ui.form:not(.unstackable) .fields:not(.unstackable) > .fourteen.wide.field,\n  .ui.form:not(.unstackable) .fields:not(.unstackable) > .fifteen.wide.field,\n  .ui.form:not(.unstackable) .fields:not(.unstackable) > .sixteen.wide.field {\n    width: @oneColumn !important;\n  }\n  .ui.form .fields {\n    margin-bottom: 0em;\n  }\n}\n\n/*--------------------\n     Equal Width\n---------------------*/\n\n.ui[class*=\"equal width\"].form .fields > .field,\n.ui.form [class*=\"equal width\"].fields > .field {\n  width: 100%;\n  flex: 1 1 auto;\n}\n\n/*--------------------\n    Inline Fields\n---------------------*/\n\n.ui.form .inline.fields {\n  margin: @fieldMargin;\n  align-items: center;\n}\n.ui.form .inline.fields .field {\n  margin: 0em;\n  padding: @inlineFieldsMargin;\n}\n\n/* Inline Label */\n.ui.form .inline.fields > label,\n.ui.form .inline.fields .field > label,\n.ui.form .inline.fields .field > p,\n.ui.form .inline.field > label,\n.ui.form .inline.field > p {\n  display: inline-block;\n  width: auto;\n  margin-top: 0em;\n  margin-bottom: 0em;\n  vertical-align: baseline;\n  font-size: @inlineLabelFontSize;\n  font-weight: @inlineLabelFontWeight;\n  color: @inlineLabelColor;\n  text-transform: @inlineLabelTextTransform;\n}\n\n/* Grouped Inline Label */\n.ui.form .inline.fields > label {\n  margin: @groupedInlineLabelMargin;\n}\n\n/* Inline Input */\n.ui.form .inline.fields .field > input,\n.ui.form .inline.fields .field > select,\n.ui.form .inline.field > input,\n.ui.form .inline.field > select {\n  display: inline-block;\n  width: auto;\n\n  margin-top: 0em;\n  margin-bottom: 0em;\n\n  vertical-align: middle;\n  font-size: @inlineInputSize;\n}\n\n/* Label */\n.ui.form .inline.fields .field > :first-child,\n.ui.form .inline.field > :first-child {\n  margin: 0em @inlineLabelDistance 0em 0em;\n}\n.ui.form .inline.fields .field > :only-child,\n.ui.form .inline.field > :only-child {\n  margin: 0em;\n}\n\n/* Wide */\n.ui.form .inline.fields .wide.field {\n  display: flex;\n  align-items: center;\n}\n.ui.form .inline.fields .wide.field > input,\n.ui.form .inline.fields .wide.field > select {\n  width: 100%;\n}\n\n\n/*--------------------\n        Sizes\n---------------------*/\n\n.ui.mini.form {\n  font-size: @mini;\n}\n.ui.tiny.form {\n  font-size: @tiny;\n}\n.ui.small.form {\n  font-size: @small;\n}\n.ui.form {\n  font-size: @medium;\n}\n.ui.large.form {\n  font-size: @large;\n}\n.ui.big.form {\n  font-size: @big;\n}\n.ui.huge.form {\n  font-size: @huge;\n}\n.ui.massive.form {\n  font-size: @massive;\n}\n\n.loadUIOverrides();\n"
  },
  {
    "path": "semantic/src/definitions/collections/grid.less",
    "content": "/*!\n * # Semantic UI - Grid\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n/*******************************\n            Theme\n*******************************/\n\n@type    : 'collection';\n@element : 'grid';\n\n@import (multiple) '../../theme.config';\n\n/*******************************\n            Standard\n*******************************/\n\n.ui.grid {\n  display: flex;\n  flex-direction: row;\n  flex-wrap: wrap;\n  align-items: stretch;\n  padding: 0em;\n}\n\n/*----------------------\n      Remove Gutters\n-----------------------*/\n\n.ui.grid {\n  margin-top: -(@rowSpacing / 2);\n  margin-bottom: -(@rowSpacing / 2);\n  margin-left: -(@gutterWidth / 2);\n  margin-right: -(@gutterWidth / 2);\n}\n.ui.relaxed.grid  {\n  margin-left: -(@relaxedGutterWidth / 2);\n  margin-right: -(@relaxedGutterWidth / 2);\n}\n.ui[class*=\"very relaxed\"].grid  {\n  margin-left: -(@veryRelaxedGutterWidth / 2);\n  margin-right: -(@veryRelaxedGutterWidth / 2);\n}\n\n\n/* Preserve Rows Spacing on Consecutive Grids */\n.ui.grid + .grid {\n  margin-top: @consecutiveGridDistance;\n}\n\n/*-------------------\n       Columns\n--------------------*/\n\n/* Standard 16 column */\n.ui.grid > .column:not(.row),\n.ui.grid > .row > .column {\n  position: relative;\n  display: inline-block;\n\n  width: @oneWide;\n  padding-left: (@gutterWidth / 2);\n  padding-right: (@gutterWidth / 2);\n  vertical-align: top;\n}\n\n.ui.grid > * {\n  padding-left: (@gutterWidth / 2);\n  padding-right: (@gutterWidth / 2);\n}\n\n/*-------------------\n        Rows\n--------------------*/\n\n.ui.grid > .row {\n  position: relative;\n  display: flex;\n  flex-direction: row;\n  flex-wrap: wrap;\n  justify-content: inherit;\n  align-items: stretch;\n  width: 100% !important;\n  padding: 0rem;\n  padding-top: (@rowSpacing / 2);\n  padding-bottom: (@rowSpacing / 2);\n}\n\n/*-------------------\n       Columns\n--------------------*/\n\n/* Vertical padding when no rows */\n.ui.grid > .column:not(.row) {\n  padding-top: (@rowSpacing / 2);\n  padding-bottom: (@rowSpacing / 2);\n}\n.ui.grid > .row > .column {\n  margin-top: 0em;\n  margin-bottom: 0em;\n}\n\n/*-------------------\n      Content\n--------------------*/\n\n.ui.grid > .row > img,\n.ui.grid > .row > .column > img {\n  max-width: @columnMaxImageWidth;\n}\n\n/*-------------------\n    Loose Coupling\n--------------------*/\n\n/* Collapse Margin on Consecutive Grid */\n.ui.grid > .ui.grid:first-child {\n  margin-top: 0em;\n}\n.ui.grid > .ui.grid:last-child {\n  margin-bottom: 0em;\n}\n\n/* Segment inside Aligned Grid */\n.ui.grid .aligned.row > .column > .segment:not(.compact):not(.attached),\n.ui.aligned.grid .column > .segment:not(.compact):not(.attached) {\n  width: 100%;\n}\n\n/* Align Dividers with Gutter */\n.ui.grid .row + .ui.divider {\n  flex-grow: 1;\n  margin: (@rowSpacing / 2) (@gutterWidth / 2);\n}\n.ui.grid .column + .ui.vertical.divider {\n  height: ~\"calc(50% - \"(@rowSpacing/2)~\")\";\n}\n\n/* Remove Border on Last Horizontal Segment */\n.ui.grid > .row > .column:last-child > .horizontal.segment,\n.ui.grid > .column:last-child > .horizontal.segment {\n  box-shadow: none;\n}\n\n/*******************************\n           Variations\n*******************************/\n\n\n/*-----------------------\n       Page Grid\n-------------------------*/\n\n@media only screen and (max-width: @largestMobileScreen) {\n  .ui.page.grid {\n    width: @mobileWidth;\n    padding-left: @mobileGutter;\n    padding-right: @mobileGutter;\n    margin-left: 0em;\n    margin-right: 0em;\n  }\n}\n@media only screen and (min-width: @tabletBreakpoint) and (max-width: @largestTabletScreen) {\n  .ui.page.grid {\n    width: @tabletWidth;\n    margin-left: @tabletMargin;\n    margin-right: @tabletMargin;\n    padding-left: @tabletGutter;\n    padding-right: @tabletGutter;\n  }\n}\n@media only screen and (min-width: @computerBreakpoint) and (max-width: @largestSmallMonitor) {\n  .ui.page.grid {\n    width: @computerWidth;\n    margin-left: @computerMargin;\n    margin-right: @computerMargin;\n    padding-left: @computerGutter;\n    padding-right: @computerGutter;\n  }\n}\n@media only screen and (min-width: @largeMonitorBreakpoint) and (max-width: @largestLargeMonitor) {\n  .ui.page.grid {\n    width: @largeMonitorWidth;\n    margin-left: @largeMonitorMargin;\n    margin-right: @largeMonitorMargin;\n    padding-left: @largeMonitorGutter;\n    padding-right: @largeMonitorGutter;\n  }\n}\n@media only screen and (min-width: @widescreenMonitorBreakpoint) {\n  .ui.page.grid {\n    width: @widescreenMonitorWidth;\n    margin-left: @widescreenMargin;\n    margin-right: @widescreenMargin;\n    padding-left: @widescreenMonitorGutter;\n    padding-right: @widescreenMonitorGutter;\n  }\n}\n\n\n/*-------------------\n     Column Count\n--------------------*/\n\n/* Assume full width with one column */\n.ui.grid > .column:only-child,\n.ui.grid > .row > .column:only-child {\n  width: @oneColumn;\n}\n\n/* Grid Based */\n.ui[class*=\"one column\"].grid > .row > .column,\n.ui[class*=\"one column\"].grid > .column:not(.row) {\n  width: @oneColumn;\n}\n.ui[class*=\"two column\"].grid > .row > .column,\n.ui[class*=\"two column\"].grid > .column:not(.row) {\n  width: @twoColumn;\n}\n.ui[class*=\"three column\"].grid > .row > .column,\n.ui[class*=\"three column\"].grid > .column:not(.row) {\n  width: @threeColumn;\n}\n.ui[class*=\"four column\"].grid > .row > .column,\n.ui[class*=\"four column\"].grid > .column:not(.row) {\n  width: @fourColumn;\n}\n.ui[class*=\"five column\"].grid > .row > .column,\n.ui[class*=\"five column\"].grid > .column:not(.row) {\n  width: @fiveColumn;\n}\n.ui[class*=\"six column\"].grid > .row > .column,\n.ui[class*=\"six column\"].grid > .column:not(.row) {\n  width: @sixColumn;\n}\n.ui[class*=\"seven column\"].grid > .row > .column,\n.ui[class*=\"seven column\"].grid > .column:not(.row) {\n  width: @sevenColumn;\n}\n.ui[class*=\"eight column\"].grid > .row > .column,\n.ui[class*=\"eight column\"].grid > .column:not(.row) {\n  width: @eightColumn;\n}\n.ui[class*=\"nine column\"].grid > .row > .column,\n.ui[class*=\"nine column\"].grid > .column:not(.row) {\n  width: @nineColumn;\n}\n.ui[class*=\"ten column\"].grid > .row > .column,\n.ui[class*=\"ten column\"].grid > .column:not(.row) {\n  width: @tenColumn;\n}\n.ui[class*=\"eleven column\"].grid > .row > .column,\n.ui[class*=\"eleven column\"].grid > .column:not(.row) {\n  width: @elevenColumn;\n}\n.ui[class*=\"twelve column\"].grid > .row > .column,\n.ui[class*=\"twelve column\"].grid > .column:not(.row) {\n  width: @twelveColumn;\n}\n.ui[class*=\"thirteen column\"].grid > .row > .column,\n.ui[class*=\"thirteen column\"].grid > .column:not(.row) {\n  width: @thirteenColumn;\n}\n.ui[class*=\"fourteen column\"].grid > .row > .column,\n.ui[class*=\"fourteen column\"].grid > .column:not(.row) {\n  width: @fourteenColumn;\n}\n.ui[class*=\"fifteen column\"].grid > .row > .column,\n.ui[class*=\"fifteen column\"].grid > .column:not(.row) {\n  width: @fifteenColumn;\n}\n.ui[class*=\"sixteen column\"].grid > .row > .column,\n.ui[class*=\"sixteen column\"].grid > .column:not(.row) {\n  width: @sixteenColumn;\n}\n\n/* Row Based Overrides */\n.ui.grid > [class*=\"one column\"].row > .column {\n  width: @oneColumn !important;\n}\n.ui.grid > [class*=\"two column\"].row > .column {\n  width: @twoColumn !important;\n}\n.ui.grid > [class*=\"three column\"].row > .column {\n  width: @threeColumn !important;\n}\n.ui.grid > [class*=\"four column\"].row > .column {\n  width: @fourColumn !important;\n}\n.ui.grid > [class*=\"five column\"].row > .column {\n  width: @fiveColumn !important;\n}\n.ui.grid > [class*=\"six column\"].row > .column {\n  width: @sixColumn !important;\n}\n.ui.grid > [class*=\"seven column\"].row > .column {\n  width: @sevenColumn !important;\n}\n.ui.grid > [class*=\"eight column\"].row > .column {\n  width: @eightColumn !important;\n}\n.ui.grid > [class*=\"nine column\"].row > .column {\n  width: @nineColumn !important;\n}\n.ui.grid > [class*=\"ten column\"].row > .column {\n  width: @tenColumn !important;\n}\n.ui.grid > [class*=\"eleven column\"].row > .column {\n  width: @elevenColumn !important;\n}\n.ui.grid > [class*=\"twelve column\"].row > .column {\n  width: @twelveColumn !important;\n}\n.ui.grid > [class*=\"thirteen column\"].row > .column {\n  width: @thirteenColumn !important;\n}\n.ui.grid > [class*=\"fourteen column\"].row > .column {\n  width: @fourteenColumn !important;\n}\n.ui.grid > [class*=\"fifteen column\"].row > .column {\n  width: @fifteenColumn !important;\n}\n.ui.grid > [class*=\"sixteen column\"].row > .column {\n  width: @sixteenColumn !important;\n}\n\n/* Celled Page */\n.ui.celled.page.grid {\n  box-shadow: none;\n}\n\n/*-------------------\n    Column Width\n--------------------*/\n\n/* Sizing Combinations */\n.ui.grid > .row > [class*=\"one wide\"].column,\n.ui.grid > .column.row > [class*=\"one wide\"].column,\n.ui.grid > [class*=\"one wide\"].column,\n.ui.column.grid > [class*=\"one wide\"].column {\n  width: @oneWide !important;\n}\n.ui.grid > .row > [class*=\"two wide\"].column,\n.ui.grid > .column.row > [class*=\"two wide\"].column,\n.ui.grid > [class*=\"two wide\"].column,\n.ui.column.grid > [class*=\"two wide\"].column {\n  width: @twoWide !important;\n}\n.ui.grid > .row > [class*=\"three wide\"].column,\n.ui.grid > .column.row > [class*=\"three wide\"].column,\n.ui.grid > [class*=\"three wide\"].column,\n.ui.column.grid > [class*=\"three wide\"].column {\n  width: @threeWide !important;\n}\n.ui.grid > .row > [class*=\"four wide\"].column,\n.ui.grid > .column.row > [class*=\"four wide\"].column,\n.ui.grid > [class*=\"four wide\"].column,\n.ui.column.grid > [class*=\"four wide\"].column {\n  width: @fourWide !important;\n}\n.ui.grid > .row > [class*=\"five wide\"].column,\n.ui.grid > .column.row > [class*=\"five wide\"].column,\n.ui.grid > [class*=\"five wide\"].column,\n.ui.column.grid > [class*=\"five wide\"].column {\n  width: @fiveWide !important;\n}\n.ui.grid > .row > [class*=\"six wide\"].column,\n.ui.grid > .column.row > [class*=\"six wide\"].column,\n.ui.grid > [class*=\"six wide\"].column,\n.ui.column.grid > [class*=\"six wide\"].column {\n  width: @sixWide !important;\n}\n.ui.grid > .row > [class*=\"seven wide\"].column,\n.ui.grid > .column.row > [class*=\"seven wide\"].column,\n.ui.grid > [class*=\"seven wide\"].column,\n.ui.column.grid > [class*=\"seven wide\"].column {\n  width: @sevenWide !important;\n}\n.ui.grid > .row > [class*=\"eight wide\"].column,\n.ui.grid > .column.row > [class*=\"eight wide\"].column,\n.ui.grid > [class*=\"eight wide\"].column,\n.ui.column.grid > [class*=\"eight wide\"].column {\n  width: @eightWide !important;\n}\n.ui.grid > .row > [class*=\"nine wide\"].column,\n.ui.grid > .column.row > [class*=\"nine wide\"].column,\n.ui.grid > [class*=\"nine wide\"].column,\n.ui.column.grid > [class*=\"nine wide\"].column {\n  width: @nineWide !important;\n}\n.ui.grid > .row > [class*=\"ten wide\"].column,\n.ui.grid > .column.row > [class*=\"ten wide\"].column,\n.ui.grid > [class*=\"ten wide\"].column,\n.ui.column.grid > [class*=\"ten wide\"].column {\n  width: @tenWide !important;\n}\n.ui.grid > .row > [class*=\"eleven wide\"].column,\n.ui.grid > .column.row > [class*=\"eleven wide\"].column,\n.ui.grid > [class*=\"eleven wide\"].column,\n.ui.column.grid > [class*=\"eleven wide\"].column {\n  width: @elevenWide !important;\n}\n.ui.grid > .row > [class*=\"twelve wide\"].column,\n.ui.grid > .column.row > [class*=\"twelve wide\"].column,\n.ui.grid > [class*=\"twelve wide\"].column,\n.ui.column.grid > [class*=\"twelve wide\"].column {\n  width: @twelveWide !important;\n}\n.ui.grid > .row > [class*=\"thirteen wide\"].column,\n.ui.grid > .column.row > [class*=\"thirteen wide\"].column,\n.ui.grid > [class*=\"thirteen wide\"].column,\n.ui.column.grid > [class*=\"thirteen wide\"].column {\n  width: @thirteenWide !important;\n}\n.ui.grid > .row > [class*=\"fourteen wide\"].column,\n.ui.grid > .column.row > [class*=\"fourteen wide\"].column,\n.ui.grid > [class*=\"fourteen wide\"].column,\n.ui.column.grid > [class*=\"fourteen wide\"].column {\n  width: @fourteenWide !important;\n}\n.ui.grid > .row > [class*=\"fifteen wide\"].column,\n.ui.grid > .column.row > [class*=\"fifteen wide\"].column,\n.ui.grid > [class*=\"fifteen wide\"].column,\n.ui.column.grid > [class*=\"fifteen wide\"].column {\n  width: @fifteenWide !important;\n}\n.ui.grid > .row > [class*=\"sixteen wide\"].column,\n.ui.grid > .column.row > [class*=\"sixteen wide\"].column,\n.ui.grid > [class*=\"sixteen wide\"].column,\n.ui.column.grid > [class*=\"sixteen wide\"].column {\n  width: @sixteenWide !important;\n}\n\n/*----------------------\n    Width per Device\n-----------------------*/\n\n/* Mobile Sizing Combinations */\n@media only screen and (min-width: @mobileBreakpoint) and (max-width: @largestMobileScreen) {\n  .ui.grid > .row > [class*=\"one wide mobile\"].column,\n  .ui.grid > .column.row > [class*=\"one wide mobile\"].column,\n  .ui.grid > [class*=\"one wide mobile\"].column,\n  .ui.column.grid > [class*=\"one wide mobile\"].column {\n    width: @oneWide !important;\n  }\n  .ui.grid > .row > [class*=\"two wide mobile\"].column,\n  .ui.grid > .column.row > [class*=\"two wide mobile\"].column,\n  .ui.grid > [class*=\"two wide mobile\"].column,\n  .ui.column.grid > [class*=\"two wide mobile\"].column {\n    width: @twoWide !important;\n  }\n  .ui.grid > .row > [class*=\"three wide mobile\"].column,\n  .ui.grid > .column.row > [class*=\"three wide mobile\"].column,\n  .ui.grid > [class*=\"three wide mobile\"].column,\n  .ui.column.grid > [class*=\"three wide mobile\"].column {\n    width: @threeWide !important;\n  }\n  .ui.grid > .row > [class*=\"four wide mobile\"].column,\n  .ui.grid > .column.row > [class*=\"four wide mobile\"].column,\n  .ui.grid > [class*=\"four wide mobile\"].column,\n  .ui.column.grid > [class*=\"four wide mobile\"].column {\n    width: @fourWide !important;\n  }\n  .ui.grid > .row > [class*=\"five wide mobile\"].column,\n  .ui.grid > .column.row > [class*=\"five wide mobile\"].column,\n  .ui.grid > [class*=\"five wide mobile\"].column,\n  .ui.column.grid > [class*=\"five wide mobile\"].column {\n    width: @fiveWide !important;\n  }\n  .ui.grid > .row > [class*=\"six wide mobile\"].column,\n  .ui.grid > .column.row > [class*=\"six wide mobile\"].column,\n  .ui.grid > [class*=\"six wide mobile\"].column,\n  .ui.column.grid > [class*=\"six wide mobile\"].column {\n    width: @sixWide !important;\n  }\n  .ui.grid > .row > [class*=\"seven wide mobile\"].column,\n  .ui.grid > .column.row > [class*=\"seven wide mobile\"].column,\n  .ui.grid > [class*=\"seven wide mobile\"].column,\n  .ui.column.grid > [class*=\"seven wide mobile\"].column {\n    width: @sevenWide !important;\n  }\n  .ui.grid > .row > [class*=\"eight wide mobile\"].column,\n  .ui.grid > .column.row > [class*=\"eight wide mobile\"].column,\n  .ui.grid > [class*=\"eight wide mobile\"].column,\n  .ui.column.grid > [class*=\"eight wide mobile\"].column {\n    width: @eightWide !important;\n  }\n  .ui.grid > .row > [class*=\"nine wide mobile\"].column,\n  .ui.grid > .column.row > [class*=\"nine wide mobile\"].column,\n  .ui.grid > [class*=\"nine wide mobile\"].column,\n  .ui.column.grid > [class*=\"nine wide mobile\"].column {\n    width: @nineWide !important;\n  }\n  .ui.grid > .row > [class*=\"ten wide mobile\"].column,\n  .ui.grid > .column.row > [class*=\"ten wide mobile\"].column,\n  .ui.grid > [class*=\"ten wide mobile\"].column,\n  .ui.column.grid > [class*=\"ten wide mobile\"].column {\n    width: @tenWide !important;\n  }\n  .ui.grid > .row > [class*=\"eleven wide mobile\"].column,\n  .ui.grid > .column.row > [class*=\"eleven wide mobile\"].column,\n  .ui.grid > [class*=\"eleven wide mobile\"].column,\n  .ui.column.grid > [class*=\"eleven wide mobile\"].column {\n    width: @elevenWide !important;\n  }\n  .ui.grid > .row > [class*=\"twelve wide mobile\"].column,\n  .ui.grid > .column.row > [class*=\"twelve wide mobile\"].column,\n  .ui.grid > [class*=\"twelve wide mobile\"].column,\n  .ui.column.grid > [class*=\"twelve wide mobile\"].column {\n    width: @twelveWide !important;\n  }\n  .ui.grid > .row > [class*=\"thirteen wide mobile\"].column,\n  .ui.grid > .column.row > [class*=\"thirteen wide mobile\"].column,\n  .ui.grid > [class*=\"thirteen wide mobile\"].column,\n  .ui.column.grid > [class*=\"thirteen wide mobile\"].column {\n    width: @thirteenWide !important;\n  }\n  .ui.grid > .row > [class*=\"fourteen wide mobile\"].column,\n  .ui.grid > .column.row > [class*=\"fourteen wide mobile\"].column,\n  .ui.grid > [class*=\"fourteen wide mobile\"].column,\n  .ui.column.grid > [class*=\"fourteen wide mobile\"].column {\n    width: @fourteenWide !important;\n  }\n  .ui.grid > .row > [class*=\"fifteen wide mobile\"].column,\n  .ui.grid > .column.row > [class*=\"fifteen wide mobile\"].column,\n  .ui.grid > [class*=\"fifteen wide mobile\"].column,\n  .ui.column.grid > [class*=\"fifteen wide mobile\"].column {\n    width: @fifteenWide !important;\n  }\n  .ui.grid > .row > [class*=\"sixteen wide mobile\"].column,\n  .ui.grid > .column.row > [class*=\"sixteen wide mobile\"].column,\n  .ui.grid > [class*=\"sixteen wide mobile\"].column,\n  .ui.column.grid > [class*=\"sixteen wide mobile\"].column {\n    width: @sixteenWide !important;\n  }\n}\n\n/* Tablet Sizing Combinations */\n@media only screen and (min-width: @tabletBreakpoint) and (max-width: @largestTabletScreen) {\n  .ui.grid > .row > [class*=\"one wide tablet\"].column,\n  .ui.grid > .column.row > [class*=\"one wide tablet\"].column,\n  .ui.grid > [class*=\"one wide tablet\"].column,\n  .ui.column.grid > [class*=\"one wide tablet\"].column {\n    width: @oneWide !important;\n  }\n  .ui.grid > .row > [class*=\"two wide tablet\"].column,\n  .ui.grid > .column.row > [class*=\"two wide tablet\"].column,\n  .ui.grid > [class*=\"two wide tablet\"].column,\n  .ui.column.grid > [class*=\"two wide tablet\"].column {\n    width: @twoWide !important;\n  }\n  .ui.grid > .row > [class*=\"three wide tablet\"].column,\n  .ui.grid > .column.row > [class*=\"three wide tablet\"].column,\n  .ui.grid > [class*=\"three wide tablet\"].column,\n  .ui.column.grid > [class*=\"three wide tablet\"].column {\n    width: @threeWide !important;\n  }\n  .ui.grid > .row > [class*=\"four wide tablet\"].column,\n  .ui.grid > .column.row > [class*=\"four wide tablet\"].column,\n  .ui.grid > [class*=\"four wide tablet\"].column,\n  .ui.column.grid > [class*=\"four wide tablet\"].column {\n    width: @fourWide !important;\n  }\n  .ui.grid > .row > [class*=\"five wide tablet\"].column,\n  .ui.grid > .column.row > [class*=\"five wide tablet\"].column,\n  .ui.grid > [class*=\"five wide tablet\"].column,\n  .ui.column.grid > [class*=\"five wide tablet\"].column {\n    width: @fiveWide !important;\n  }\n  .ui.grid > .row > [class*=\"six wide tablet\"].column,\n  .ui.grid > .column.row > [class*=\"six wide tablet\"].column,\n  .ui.grid > [class*=\"six wide tablet\"].column,\n  .ui.column.grid > [class*=\"six wide tablet\"].column {\n    width: @sixWide !important;\n  }\n  .ui.grid > .row > [class*=\"seven wide tablet\"].column,\n  .ui.grid > .column.row > [class*=\"seven wide tablet\"].column,\n  .ui.grid > [class*=\"seven wide tablet\"].column,\n  .ui.column.grid > [class*=\"seven wide tablet\"].column {\n    width: @sevenWide !important;\n  }\n  .ui.grid > .row > [class*=\"eight wide tablet\"].column,\n  .ui.grid > .column.row > [class*=\"eight wide tablet\"].column,\n  .ui.grid > [class*=\"eight wide tablet\"].column,\n  .ui.column.grid > [class*=\"eight wide tablet\"].column {\n    width: @eightWide !important;\n  }\n  .ui.grid > .row > [class*=\"nine wide tablet\"].column,\n  .ui.grid > .column.row > [class*=\"nine wide tablet\"].column,\n  .ui.grid > [class*=\"nine wide tablet\"].column,\n  .ui.column.grid > [class*=\"nine wide tablet\"].column {\n    width: @nineWide !important;\n  }\n  .ui.grid > .row > [class*=\"ten wide tablet\"].column,\n  .ui.grid > .column.row > [class*=\"ten wide tablet\"].column,\n  .ui.grid > [class*=\"ten wide tablet\"].column,\n  .ui.column.grid > [class*=\"ten wide tablet\"].column {\n    width: @tenWide !important;\n  }\n  .ui.grid > .row > [class*=\"eleven wide tablet\"].column,\n  .ui.grid > .column.row > [class*=\"eleven wide tablet\"].column,\n  .ui.grid > [class*=\"eleven wide tablet\"].column,\n  .ui.column.grid > [class*=\"eleven wide tablet\"].column {\n    width: @elevenWide !important;\n  }\n  .ui.grid > .row > [class*=\"twelve wide tablet\"].column,\n  .ui.grid > .column.row > [class*=\"twelve wide tablet\"].column,\n  .ui.grid > [class*=\"twelve wide tablet\"].column,\n  .ui.column.grid > [class*=\"twelve wide tablet\"].column {\n    width: @twelveWide !important;\n  }\n  .ui.grid > .row > [class*=\"thirteen wide tablet\"].column,\n  .ui.grid > .column.row > [class*=\"thirteen wide tablet\"].column,\n  .ui.grid > [class*=\"thirteen wide tablet\"].column,\n  .ui.column.grid > [class*=\"thirteen wide tablet\"].column {\n    width: @thirteenWide !important;\n  }\n  .ui.grid > .row > [class*=\"fourteen wide tablet\"].column,\n  .ui.grid > .column.row > [class*=\"fourteen wide tablet\"].column,\n  .ui.grid > [class*=\"fourteen wide tablet\"].column,\n  .ui.column.grid > [class*=\"fourteen wide tablet\"].column {\n    width: @fourteenWide !important;\n  }\n  .ui.grid > .row > [class*=\"fifteen wide tablet\"].column,\n  .ui.grid > .column.row > [class*=\"fifteen wide tablet\"].column,\n  .ui.grid > [class*=\"fifteen wide tablet\"].column,\n  .ui.column.grid > [class*=\"fifteen wide tablet\"].column {\n    width: @fifteenWide !important;\n  }\n  .ui.grid > .row > [class*=\"sixteen wide tablet\"].column,\n  .ui.grid > .column.row > [class*=\"sixteen wide tablet\"].column,\n  .ui.grid > [class*=\"sixteen wide tablet\"].column,\n  .ui.column.grid > [class*=\"sixteen wide tablet\"].column {\n    width: @sixteenWide !important;\n  }\n}\n\n/* Computer/Desktop Sizing Combinations */\n@media only screen and (min-width: @computerBreakpoint) {\n    .ui.grid > .row > [class*=\"one wide computer\"].column,\n  .ui.grid > .column.row > [class*=\"one wide computer\"].column,\n  .ui.grid > [class*=\"one wide computer\"].column,\n  .ui.column.grid > [class*=\"one wide computer\"].column {\n    width: @oneWide !important;\n  }\n  .ui.grid > .row > [class*=\"two wide computer\"].column,\n  .ui.grid > .column.row > [class*=\"two wide computer\"].column,\n  .ui.grid > [class*=\"two wide computer\"].column,\n  .ui.column.grid > [class*=\"two wide computer\"].column {\n    width: @twoWide !important;\n  }\n  .ui.grid > .row > [class*=\"three wide computer\"].column,\n  .ui.grid > .column.row > [class*=\"three wide computer\"].column,\n  .ui.grid > [class*=\"three wide computer\"].column,\n  .ui.column.grid > [class*=\"three wide computer\"].column {\n    width: @threeWide !important;\n  }\n  .ui.grid > .row > [class*=\"four wide computer\"].column,\n  .ui.grid > .column.row > [class*=\"four wide computer\"].column,\n  .ui.grid > [class*=\"four wide computer\"].column,\n  .ui.column.grid > [class*=\"four wide computer\"].column {\n    width: @fourWide !important;\n  }\n  .ui.grid > .row > [class*=\"five wide computer\"].column,\n  .ui.grid > .column.row > [class*=\"five wide computer\"].column,\n  .ui.grid > [class*=\"five wide computer\"].column,\n  .ui.column.grid > [class*=\"five wide computer\"].column {\n    width: @fiveWide !important;\n  }\n  .ui.grid > .row > [class*=\"six wide computer\"].column,\n  .ui.grid > .column.row > [class*=\"six wide computer\"].column,\n  .ui.grid > [class*=\"six wide computer\"].column,\n  .ui.column.grid > [class*=\"six wide computer\"].column {\n    width: @sixWide !important;\n  }\n  .ui.grid > .row > [class*=\"seven wide computer\"].column,\n  .ui.grid > .column.row > [class*=\"seven wide computer\"].column,\n  .ui.grid > [class*=\"seven wide computer\"].column,\n  .ui.column.grid > [class*=\"seven wide computer\"].column {\n    width: @sevenWide !important;\n  }\n  .ui.grid > .row > [class*=\"eight wide computer\"].column,\n  .ui.grid > .column.row > [class*=\"eight wide computer\"].column,\n  .ui.grid > [class*=\"eight wide computer\"].column,\n  .ui.column.grid > [class*=\"eight wide computer\"].column {\n    width: @eightWide !important;\n  }\n  .ui.grid > .row > [class*=\"nine wide computer\"].column,\n  .ui.grid > .column.row > [class*=\"nine wide computer\"].column,\n  .ui.grid > [class*=\"nine wide computer\"].column,\n  .ui.column.grid > [class*=\"nine wide computer\"].column {\n    width: @nineWide !important;\n  }\n  .ui.grid > .row > [class*=\"ten wide computer\"].column,\n  .ui.grid > .column.row > [class*=\"ten wide computer\"].column,\n  .ui.grid > [class*=\"ten wide computer\"].column,\n  .ui.column.grid > [class*=\"ten wide computer\"].column {\n    width: @tenWide !important;\n  }\n  .ui.grid > .row > [class*=\"eleven wide computer\"].column,\n  .ui.grid > .column.row > [class*=\"eleven wide computer\"].column,\n  .ui.grid > [class*=\"eleven wide computer\"].column,\n  .ui.column.grid > [class*=\"eleven wide computer\"].column {\n    width: @elevenWide !important;\n  }\n  .ui.grid > .row > [class*=\"twelve wide computer\"].column,\n  .ui.grid > .column.row > [class*=\"twelve wide computer\"].column,\n  .ui.grid > [class*=\"twelve wide computer\"].column,\n  .ui.column.grid > [class*=\"twelve wide computer\"].column {\n    width: @twelveWide !important;\n  }\n  .ui.grid > .row > [class*=\"thirteen wide computer\"].column,\n  .ui.grid > .column.row > [class*=\"thirteen wide computer\"].column,\n  .ui.grid > [class*=\"thirteen wide computer\"].column,\n  .ui.column.grid > [class*=\"thirteen wide computer\"].column {\n    width: @thirteenWide !important;\n  }\n  .ui.grid > .row > [class*=\"fourteen wide computer\"].column,\n  .ui.grid > .column.row > [class*=\"fourteen wide computer\"].column,\n  .ui.grid > [class*=\"fourteen wide computer\"].column,\n  .ui.column.grid > [class*=\"fourteen wide computer\"].column {\n    width: @fourteenWide !important;\n  }\n  .ui.grid > .row > [class*=\"fifteen wide computer\"].column,\n  .ui.grid > .column.row > [class*=\"fifteen wide computer\"].column,\n  .ui.grid > [class*=\"fifteen wide computer\"].column,\n  .ui.column.grid > [class*=\"fifteen wide computer\"].column {\n    width: @fifteenWide !important;\n  }\n  .ui.grid > .row > [class*=\"sixteen wide computer\"].column,\n  .ui.grid > .column.row > [class*=\"sixteen wide computer\"].column,\n  .ui.grid > [class*=\"sixteen wide computer\"].column,\n  .ui.column.grid > [class*=\"sixteen wide computer\"].column {\n    width: @sixteenWide !important;\n  }\n}\n\n/* Large Monitor Sizing Combinations */\n@media only screen and (min-width: @largeMonitorBreakpoint) and (max-width: @largestLargeMonitor){\n  .ui.grid > .row > [class*=\"one wide large screen\"].column,\n  .ui.grid > .column.row > [class*=\"one wide large screen\"].column,\n  .ui.grid > [class*=\"one wide large screen\"].column,\n  .ui.column.grid > [class*=\"one wide large screen\"].column {\n    width: @oneWide !important;\n  }\n  .ui.grid > .row > [class*=\"two wide large screen\"].column,\n  .ui.grid > .column.row > [class*=\"two wide large screen\"].column,\n  .ui.grid > [class*=\"two wide large screen\"].column,\n  .ui.column.grid > [class*=\"two wide large screen\"].column {\n    width: @twoWide !important;\n  }\n  .ui.grid > .row > [class*=\"three wide large screen\"].column,\n  .ui.grid > .column.row > [class*=\"three wide large screen\"].column,\n  .ui.grid > [class*=\"three wide large screen\"].column,\n  .ui.column.grid > [class*=\"three wide large screen\"].column {\n    width: @threeWide !important;\n  }\n  .ui.grid > .row > [class*=\"four wide large screen\"].column,\n  .ui.grid > .column.row > [class*=\"four wide large screen\"].column,\n  .ui.grid > [class*=\"four wide large screen\"].column,\n  .ui.column.grid > [class*=\"four wide large screen\"].column {\n    width: @fourWide !important;\n  }\n  .ui.grid > .row > [class*=\"five wide large screen\"].column,\n  .ui.grid > .column.row > [class*=\"five wide large screen\"].column,\n  .ui.grid > [class*=\"five wide large screen\"].column,\n  .ui.column.grid > [class*=\"five wide large screen\"].column {\n    width: @fiveWide !important;\n  }\n  .ui.grid > .row > [class*=\"six wide large screen\"].column,\n  .ui.grid > .column.row > [class*=\"six wide large screen\"].column,\n  .ui.grid > [class*=\"six wide large screen\"].column,\n  .ui.column.grid > [class*=\"six wide large screen\"].column {\n    width: @sixWide !important;\n  }\n  .ui.grid > .row > [class*=\"seven wide large screen\"].column,\n  .ui.grid > .column.row > [class*=\"seven wide large screen\"].column,\n  .ui.grid > [class*=\"seven wide large screen\"].column,\n  .ui.column.grid > [class*=\"seven wide large screen\"].column {\n    width: @sevenWide !important;\n  }\n  .ui.grid > .row > [class*=\"eight wide large screen\"].column,\n  .ui.grid > .column.row > [class*=\"eight wide large screen\"].column,\n  .ui.grid > [class*=\"eight wide large screen\"].column,\n  .ui.column.grid > [class*=\"eight wide large screen\"].column {\n    width: @eightWide !important;\n  }\n  .ui.grid > .row > [class*=\"nine wide large screen\"].column,\n  .ui.grid > .column.row > [class*=\"nine wide large screen\"].column,\n  .ui.grid > [class*=\"nine wide large screen\"].column,\n  .ui.column.grid > [class*=\"nine wide large screen\"].column {\n    width: @nineWide !important;\n  }\n  .ui.grid > .row > [class*=\"ten wide large screen\"].column,\n  .ui.grid > .column.row > [class*=\"ten wide large screen\"].column,\n  .ui.grid > [class*=\"ten wide large screen\"].column,\n  .ui.column.grid > [class*=\"ten wide large screen\"].column {\n    width: @tenWide !important;\n  }\n  .ui.grid > .row > [class*=\"eleven wide large screen\"].column,\n  .ui.grid > .column.row > [class*=\"eleven wide large screen\"].column,\n  .ui.grid > [class*=\"eleven wide large screen\"].column,\n  .ui.column.grid > [class*=\"eleven wide large screen\"].column {\n    width: @elevenWide !important;\n  }\n  .ui.grid > .row > [class*=\"twelve wide large screen\"].column,\n  .ui.grid > .column.row > [class*=\"twelve wide large screen\"].column,\n  .ui.grid > [class*=\"twelve wide large screen\"].column,\n  .ui.column.grid > [class*=\"twelve wide large screen\"].column {\n    width: @twelveWide !important;\n  }\n  .ui.grid > .row > [class*=\"thirteen wide large screen\"].column,\n  .ui.grid > .column.row > [class*=\"thirteen wide large screen\"].column,\n  .ui.grid > [class*=\"thirteen wide large screen\"].column,\n  .ui.column.grid > [class*=\"thirteen wide large screen\"].column {\n    width: @thirteenWide !important;\n  }\n  .ui.grid > .row > [class*=\"fourteen wide large screen\"].column,\n  .ui.grid > .column.row > [class*=\"fourteen wide large screen\"].column,\n  .ui.grid > [class*=\"fourteen wide large screen\"].column,\n  .ui.column.grid > [class*=\"fourteen wide large screen\"].column {\n    width: @fourteenWide !important;\n  }\n  .ui.grid > .row > [class*=\"fifteen wide large screen\"].column,\n  .ui.grid > .column.row > [class*=\"fifteen wide large screen\"].column,\n  .ui.grid > [class*=\"fifteen wide large screen\"].column,\n  .ui.column.grid > [class*=\"fifteen wide large screen\"].column {\n    width: @fifteenWide !important;\n  }\n  .ui.grid > .row > [class*=\"sixteen wide large screen\"].column,\n  .ui.grid > .column.row > [class*=\"sixteen wide large screen\"].column,\n  .ui.grid > [class*=\"sixteen wide large screen\"].column,\n  .ui.column.grid > [class*=\"sixteen wide large screen\"].column {\n    width: @sixteenWide !important;\n  }\n}\n\n/* Widescreen Sizing Combinations */\n@media only screen and (min-width: @widescreenMonitorBreakpoint) {\n  .ui.grid > .row > [class*=\"one wide widescreen\"].column,\n  .ui.grid > .column.row > [class*=\"one wide widescreen\"].column,\n  .ui.grid > [class*=\"one wide widescreen\"].column,\n  .ui.column.grid > [class*=\"one wide widescreen\"].column {\n    width: @oneWide !important;\n  }\n  .ui.grid > .row > [class*=\"two wide widescreen\"].column,\n  .ui.grid > .column.row > [class*=\"two wide widescreen\"].column,\n  .ui.grid > [class*=\"two wide widescreen\"].column,\n  .ui.column.grid > [class*=\"two wide widescreen\"].column {\n    width: @twoWide !important;\n  }\n  .ui.grid > .row > [class*=\"three wide widescreen\"].column,\n  .ui.grid > .column.row > [class*=\"three wide widescreen\"].column,\n  .ui.grid > [class*=\"three wide widescreen\"].column,\n  .ui.column.grid > [class*=\"three wide widescreen\"].column {\n    width: @threeWide !important;\n  }\n  .ui.grid > .row > [class*=\"four wide widescreen\"].column,\n  .ui.grid > .column.row > [class*=\"four wide widescreen\"].column,\n  .ui.grid > [class*=\"four wide widescreen\"].column,\n  .ui.column.grid > [class*=\"four wide widescreen\"].column {\n    width: @fourWide !important;\n  }\n  .ui.grid > .row > [class*=\"five wide widescreen\"].column,\n  .ui.grid > .column.row > [class*=\"five wide widescreen\"].column,\n  .ui.grid > [class*=\"five wide widescreen\"].column,\n  .ui.column.grid > [class*=\"five wide widescreen\"].column {\n    width: @fiveWide !important;\n  }\n  .ui.grid > .row > [class*=\"six wide widescreen\"].column,\n  .ui.grid > .column.row > [class*=\"six wide widescreen\"].column,\n  .ui.grid > [class*=\"six wide widescreen\"].column,\n  .ui.column.grid > [class*=\"six wide widescreen\"].column {\n    width: @sixWide !important;\n  }\n  .ui.grid > .row > [class*=\"seven wide widescreen\"].column,\n  .ui.grid > .column.row > [class*=\"seven wide widescreen\"].column,\n  .ui.grid > [class*=\"seven wide widescreen\"].column,\n  .ui.column.grid > [class*=\"seven wide widescreen\"].column {\n    width: @sevenWide !important;\n  }\n  .ui.grid > .row > [class*=\"eight wide widescreen\"].column,\n  .ui.grid > .column.row > [class*=\"eight wide widescreen\"].column,\n  .ui.grid > [class*=\"eight wide widescreen\"].column,\n  .ui.column.grid > [class*=\"eight wide widescreen\"].column {\n    width: @eightWide !important;\n  }\n  .ui.grid > .row > [class*=\"nine wide widescreen\"].column,\n  .ui.grid > .column.row > [class*=\"nine wide widescreen\"].column,\n  .ui.grid > [class*=\"nine wide widescreen\"].column,\n  .ui.column.grid > [class*=\"nine wide widescreen\"].column {\n    width: @nineWide !important;\n  }\n  .ui.grid > .row > [class*=\"ten wide widescreen\"].column,\n  .ui.grid > .column.row > [class*=\"ten wide widescreen\"].column,\n  .ui.grid > [class*=\"ten wide widescreen\"].column,\n  .ui.column.grid > [class*=\"ten wide widescreen\"].column {\n    width: @tenWide !important;\n  }\n  .ui.grid > .row > [class*=\"eleven wide widescreen\"].column,\n  .ui.grid > .column.row > [class*=\"eleven wide widescreen\"].column,\n  .ui.grid > [class*=\"eleven wide widescreen\"].column,\n  .ui.column.grid > [class*=\"eleven wide widescreen\"].column {\n    width: @elevenWide !important;\n  }\n  .ui.grid > .row > [class*=\"twelve wide widescreen\"].column,\n  .ui.grid > .column.row > [class*=\"twelve wide widescreen\"].column,\n  .ui.grid > [class*=\"twelve wide widescreen\"].column,\n  .ui.column.grid > [class*=\"twelve wide widescreen\"].column {\n    width: @twelveWide !important;\n  }\n  .ui.grid > .row > [class*=\"thirteen wide widescreen\"].column,\n  .ui.grid > .column.row > [class*=\"thirteen wide widescreen\"].column,\n  .ui.grid > [class*=\"thirteen wide widescreen\"].column,\n  .ui.column.grid > [class*=\"thirteen wide widescreen\"].column {\n    width: @thirteenWide !important;\n  }\n  .ui.grid > .row > [class*=\"fourteen wide widescreen\"].column,\n  .ui.grid > .column.row > [class*=\"fourteen wide widescreen\"].column,\n  .ui.grid > [class*=\"fourteen wide widescreen\"].column,\n  .ui.column.grid > [class*=\"fourteen wide widescreen\"].column {\n    width: @fourteenWide !important;\n  }\n  .ui.grid > .row > [class*=\"fifteen wide widescreen\"].column,\n  .ui.grid > .column.row > [class*=\"fifteen wide widescreen\"].column,\n  .ui.grid > [class*=\"fifteen wide widescreen\"].column,\n  .ui.column.grid > [class*=\"fifteen wide widescreen\"].column {\n    width: @fifteenWide !important;\n  }\n  .ui.grid > .row > [class*=\"sixteen wide widescreen\"].column,\n  .ui.grid > .column.row > [class*=\"sixteen wide widescreen\"].column,\n  .ui.grid > [class*=\"sixteen wide widescreen\"].column,\n  .ui.column.grid > [class*=\"sixteen wide widescreen\"].column {\n    width: @sixteenWide !important;\n  }\n}\n\n/*----------------------\n        Centered\n-----------------------*/\n\n.ui.centered.grid,\n.ui.centered.grid > .row,\n.ui.grid > .centered.row {\n  text-align: center;\n  justify-content: center;\n}\n.ui.centered.grid > .column:not(.aligned):not(.justified):not(.row),\n.ui.centered.grid > .row > .column:not(.aligned):not(.justified),\n.ui.grid .centered.row > .column:not(.aligned):not(.justified) {\n  text-align: left;\n}\n\n.ui.grid > .centered.column,\n.ui.grid > .row > .centered.column {\n  display: block;\n  margin-left: auto;\n  margin-right: auto;\n}\n\n/*----------------------\n        Relaxed\n-----------------------*/\n\n.ui.relaxed.grid > .column:not(.row),\n.ui.relaxed.grid > .row > .column,\n.ui.grid > .relaxed.row > .column {\n  padding-left: (@relaxedGutterWidth / 2);\n  padding-right: (@relaxedGutterWidth / 2);\n}\n\n.ui[class*=\"very relaxed\"].grid > .column:not(.row),\n.ui[class*=\"very relaxed\"].grid > .row > .column,\n.ui.grid > [class*=\"very relaxed\"].row > .column {\n  padding-left: (@veryRelaxedGutterWidth / 2);\n  padding-right: (@veryRelaxedGutterWidth / 2);\n}\n\n/* Coupling with UI Divider */\n.ui.relaxed.grid .row + .ui.divider,\n.ui.grid .relaxed.row + .ui.divider {\n  margin-left: (@relaxedGutterWidth / 2);\n  margin-right: (@relaxedGutterWidth / 2);\n}\n.ui[class*=\"very relaxed\"].grid .row + .ui.divider,\n.ui.grid [class*=\"very relaxed\"].row + .ui.divider {\n  margin-left: (@veryRelaxedGutterWidth / 2);\n  margin-right: (@veryRelaxedGutterWidth / 2);\n}\n\n\n/*----------------------\n        Padded\n-----------------------*/\n\n.ui.padded.grid:not(.vertically):not(.horizontally) {\n  margin: 0em !important;\n}\n[class*=\"horizontally padded\"].ui.grid {\n  margin-left: 0em !important;\n  margin-right: 0em !important;\n}\n[class*=\"vertically padded\"].ui.grid {\n  margin-top: 0em !important;\n  margin-bottom: 0em !important;\n}\n\n/*----------------------\n       \"Floated\"\n-----------------------*/\n\n.ui.grid [class*=\"left floated\"].column {\n  margin-right: auto;\n}\n.ui.grid [class*=\"right floated\"].column {\n  margin-left: auto;\n}\n\n\n/*----------------------\n        Divided\n-----------------------*/\n\n.ui.divided.grid:not([class*=\"vertically divided\"]) > .column:not(.row),\n.ui.divided.grid:not([class*=\"vertically divided\"]) > .row > .column {\n  box-shadow: @dividedBorder;\n}\n\n/* Swap from padding to margin on columns to have dividers align */\n.ui[class*=\"vertically divided\"].grid > .column:not(.row),\n.ui[class*=\"vertically divided\"].grid > .row > .column {\n  margin-top: (@rowSpacing / 2);\n  margin-bottom: (@rowSpacing / 2);\n  padding-top: 0rem;\n  padding-bottom: 0rem;\n}\n.ui[class*=\"vertically divided\"].grid > .row {\n  margin-top: 0em;\n  margin-bottom: 0em;\n}\n\n\n\n/* No divider on first column on row */\n.ui.divided.grid:not([class*=\"vertically divided\"]) > .column:first-child,\n.ui.divided.grid:not([class*=\"vertically divided\"]) > .row > .column:first-child {\n  box-shadow: none;\n}\n\n/* No space on top of first row */\n.ui[class*=\"vertically divided\"].grid > .row:first-child > .column {\n  margin-top: 0em;\n}\n\n\n/* Divided Row */\n.ui.grid > .divided.row > .column {\n  box-shadow: @dividedBorder;\n}\n.ui.grid > .divided.row > .column:first-child {\n  box-shadow: none;\n}\n\n/* Vertically Divided */\n.ui[class*=\"vertically divided\"].grid > .row {\n  position: relative;\n}\n.ui[class*=\"vertically divided\"].grid > .row:before {\n  position: absolute;\n  content: \"\";\n  top: 0em;\n  left: 0px;\n\n  width: ~\"calc(100% - \"@gutterWidth~\")\";\n  height: 1px;\n\n  margin: 0% (@gutterWidth / 2);\n  box-shadow: @verticallyDividedBorder;\n}\n\n/* Padded Horizontally Divided */\n[class*=\"horizontally padded\"].ui.divided.grid,\n.ui.padded.divided.grid:not(.vertically):not(.horizontally) {\n  width: 100%;\n}\n\n/* First Row Vertically Divided */\n.ui[class*=\"vertically divided\"].grid > .row:first-child:before {\n  box-shadow: none;\n}\n\n/* Inverted Divided */\n.ui.inverted.divided.grid:not([class*=\"vertically divided\"]) > .column:not(.row),\n.ui.inverted.divided.grid:not([class*=\"vertically divided\"]) > .row > .column {\n  box-shadow: @dividedInvertedBorder;\n}\n.ui.inverted.divided.grid:not([class*=\"vertically divided\"]) > .column:not(.row):first-child,\n.ui.inverted.divided.grid:not([class*=\"vertically divided\"]) > .row > .column:first-child {\n  box-shadow: none;\n}\n.ui.inverted[class*=\"vertically divided\"].grid > .row:before {\n  box-shadow: @verticallyDividedInvertedBorder;\n}\n\n/* Relaxed */\n.ui.relaxed[class*=\"vertically divided\"].grid > .row:before {\n  margin-left: (@relaxedGutterWidth / 2);\n  margin-right: (@relaxedGutterWidth / 2);\n  width: ~\"calc(100% - \"@relaxedGutterWidth~\")\";\n}\n.ui[class*=\"very relaxed\"][class*=\"vertically divided\"].grid > .row:before {\n  margin-left: @veryRelaxedGutterWidth;\n  margin-right: @veryRelaxedGutterWidth;\n  width: ~\"calc(100% - \"@veryRelaxedGutterWidth~\")\";\n}\n\n/*----------------------\n         Celled\n-----------------------*/\n\n.ui.celled.grid {\n  width: 100%;\n  margin: @celledMargin;\n  box-shadow: @celledGridDivider;\n}\n\n.ui.celled.grid > .row {\n  width: 100% !important;\n  margin: 0em;\n  padding: 0em;\n  box-shadow: @celledRowDivider;\n}\n.ui.celled.grid > .column:not(.row),\n.ui.celled.grid > .row > .column {\n  box-shadow: @celledColumnDivider;\n}\n\n.ui.celled.grid > .column:first-child,\n.ui.celled.grid > .row > .column:first-child {\n  box-shadow: none;\n}\n\n.ui.celled.grid > .column:not(.row),\n.ui.celled.grid > .row > .column {\n  padding: @celledPadding;\n}\n.ui.relaxed.celled.grid > .column:not(.row),\n.ui.relaxed.celled.grid > .row > .column {\n  padding: @celledRelaxedPadding;\n}\n.ui[class*=\"very relaxed\"].celled.grid > .column:not(.row),\n.ui[class*=\"very relaxed\"].celled.grid > .row > .column {\n  padding: @celledVeryRelaxedPadding;\n}\n\n/* Internally Celled */\n.ui[class*=\"internally celled\"].grid {\n  box-shadow: none;\n  margin: 0em;\n}\n.ui[class*=\"internally celled\"].grid > .row:first-child {\n  box-shadow: none;\n}\n.ui[class*=\"internally celled\"].grid > .row > .column:first-child {\n  box-shadow: none;\n}\n\n/*----------------------\n   Vertically Aligned\n-----------------------*/\n\n/* Top Aligned */\n.ui[class*=\"top aligned\"].grid > .column:not(.row),\n.ui[class*=\"top aligned\"].grid > .row > .column,\n.ui.grid > [class*=\"top aligned\"].row > .column,\n.ui.grid > [class*=\"top aligned\"].column:not(.row),\n.ui.grid > .row > [class*=\"top aligned\"].column {\n  flex-direction: column;\n  vertical-align: top;\n  align-self: flex-start !important;\n}\n\n/* Middle Aligned */\n.ui[class*=\"middle aligned\"].grid > .column:not(.row),\n.ui[class*=\"middle aligned\"].grid > .row > .column,\n.ui.grid > [class*=\"middle aligned\"].row > .column,\n.ui.grid > [class*=\"middle aligned\"].column:not(.row),\n.ui.grid > .row > [class*=\"middle aligned\"].column {\n  flex-direction: column;\n  vertical-align: middle;\n  align-self: center !important;\n}\n\n/* Bottom Aligned */\n.ui[class*=\"bottom aligned\"].grid > .column:not(.row),\n.ui[class*=\"bottom aligned\"].grid > .row > .column,\n.ui.grid > [class*=\"bottom aligned\"].row > .column,\n.ui.grid > [class*=\"bottom aligned\"].column:not(.row),\n.ui.grid > .row > [class*=\"bottom aligned\"].column {\n  flex-direction: column;\n  vertical-align: bottom;\n  align-self: flex-end !important;\n}\n\n/* Stretched */\n.ui.stretched.grid > .row > .column,\n.ui.stretched.grid > .column,\n.ui.grid > .stretched.row > .column,\n.ui.grid > .stretched.column:not(.row),\n.ui.grid > .row > .stretched.column {\n  display: inline-flex !important;\n  align-self: stretch;\n  flex-direction: column;\n}\n\n.ui.stretched.grid > .row > .column > *,\n.ui.stretched.grid > .column > *,\n.ui.grid > .stretched.row > .column > *,\n.ui.grid > .stretched.column:not(.row) > *,\n.ui.grid > .row > .stretched.column > * {\n  flex-grow: 1;\n}\n\n/*----------------------\n  Horizontally Centered\n-----------------------*/\n\n/* Left Aligned */\n.ui[class*=\"left aligned\"].grid > .column,\n.ui[class*=\"left aligned\"].grid > .row > .column,\n.ui.grid > [class*=\"left aligned\"].row > .column,\n.ui.grid > [class*=\"left aligned\"].column.column,\n.ui.grid > .row > [class*=\"left aligned\"].column.column {\n  text-align: left;\n  align-self: inherit;\n}\n\n/* Center Aligned */\n.ui[class*=\"center aligned\"].grid > .column,\n.ui[class*=\"center aligned\"].grid > .row > .column,\n.ui.grid > [class*=\"center aligned\"].row > .column,\n.ui.grid > [class*=\"center aligned\"].column.column,\n.ui.grid > .row > [class*=\"center aligned\"].column.column {\n  text-align: center;\n  align-self: inherit;\n}\n.ui[class*=\"center aligned\"].grid {\n  justify-content: center;\n}\n\n/* Right Aligned */\n.ui[class*=\"right aligned\"].grid > .column,\n.ui[class*=\"right aligned\"].grid > .row > .column,\n.ui.grid > [class*=\"right aligned\"].row > .column,\n.ui.grid > [class*=\"right aligned\"].column.column,\n.ui.grid > .row > [class*=\"right aligned\"].column.column {\n  text-align: right;\n  align-self: inherit;\n}\n\n/* Justified */\n.ui.justified.grid > .column,\n.ui.justified.grid > .row > .column,\n.ui.grid > .justified.row > .column,\n.ui.grid > .justified.column.column,\n.ui.grid > .row > .justified.column.column {\n  text-align: justify;\n  hyphens: auto;\n}\n\n/*----------------------\n         Colored\n-----------------------*/\n\n.ui.grid > .row > .red.column,\n.ui.grid > .row > .orange.column,\n.ui.grid > .row > .yellow.column,\n.ui.grid > .row > .olive.column,\n.ui.grid > .row > .green.column,\n.ui.grid > .row > .teal.column,\n.ui.grid > .row > .blue.column,\n.ui.grid > .row > .violet.column,\n.ui.grid > .row > .purple.column,\n.ui.grid > .row > .pink.column,\n.ui.grid > .row > .brown.column,\n.ui.grid > .row > .grey.column,\n.ui.grid > .row > .black.column {\n  margin-top: -(@rowSpacing / 2);\n  margin-bottom: -(@rowSpacing / 2);\n  padding-top: (@rowSpacing / 2);\n  padding-bottom: (@rowSpacing / 2);\n}\n\n/* Red */\n.ui.grid > .red.row,\n.ui.grid > .red.column,\n.ui.grid > .row > .red.column {\n  background-color: @red !important;\n  color: @white;\n}\n/* Orange */\n.ui.grid > .orange.row,\n.ui.grid > .orange.column,\n.ui.grid > .row > .orange.column {\n  background-color: @orange !important;\n  color: @white;\n}\n/* Yellow */\n.ui.grid > .yellow.row,\n.ui.grid > .yellow.column,\n.ui.grid > .row > .yellow.column {\n  background-color: @yellow !important;\n  color: @white;\n}\n/* Olive */\n.ui.grid > .olive.row,\n.ui.grid > .olive.column,\n.ui.grid > .row > .olive.column {\n  background-color: @olive !important;\n  color: @white;\n}\n/* Green */\n.ui.grid > .green.row,\n.ui.grid > .green.column,\n.ui.grid > .row > .green.column {\n  background-color: @green !important;\n  color: @white;\n}\n/* Teal */\n.ui.grid > .teal.row,\n.ui.grid > .teal.column,\n.ui.grid > .row > .teal.column {\n  background-color: @teal !important;\n  color: @white;\n}\n/* Blue */\n.ui.grid > .blue.row,\n.ui.grid > .blue.column,\n.ui.grid > .row > .blue.column {\n  background-color: @blue !important;\n  color: @white;\n}\n/* Violet */\n.ui.grid > .violet.row,\n.ui.grid > .violet.column,\n.ui.grid > .row > .violet.column {\n  background-color: @violet !important;\n  color: @white;\n}\n/* Purple */\n.ui.grid > .purple.row,\n.ui.grid > .purple.column,\n.ui.grid > .row > .purple.column {\n  background-color: @purple !important;\n  color: @white;\n}\n/* Pink */\n.ui.grid > .pink.row,\n.ui.grid > .pink.column,\n.ui.grid > .row > .pink.column {\n  background-color: @pink !important;\n  color: @white;\n}\n/* Brown */\n.ui.grid > .brown.row,\n.ui.grid > .brown.column,\n.ui.grid > .row > .brown.column {\n  background-color: @brown !important;\n  color: @white;\n}\n/* Grey */\n.ui.grid > .grey.row,\n.ui.grid > .grey.column,\n.ui.grid > .row > .grey.column {\n  background-color: @grey !important;\n  color: @white;\n}\n/* Black */\n.ui.grid > .black.row,\n.ui.grid > .black.column,\n.ui.grid > .row > .black.column {\n  background-color: @black !important;\n  color: @white;\n}\n\n\n/*----------------------\n      Equal Width\n-----------------------*/\n\n.ui[class*=\"equal width\"].grid > .column:not(.row),\n.ui[class*=\"equal width\"].grid > .row > .column,\n.ui.grid > [class*=\"equal width\"].row > .column {\n  display: inline-block;\n  flex-grow: 1;\n}\n.ui[class*=\"equal width\"].grid > .wide.column,\n.ui[class*=\"equal width\"].grid > .row > .wide.column,\n.ui.grid > [class*=\"equal width\"].row > .wide.column {\n  flex-grow: 0;\n}\n\n\n/*----------------------\n        Reverse\n-----------------------*/\n\n\n/* Mobile */\n@media only screen and (max-width: @largestMobileScreen) {\n  .ui[class*=\"mobile reversed\"].grid,\n  .ui[class*=\"mobile reversed\"].grid > .row,\n  .ui.grid > [class*=\"mobile reversed\"].row {\n    flex-direction: row-reverse;\n  }\n  .ui[class*=\"mobile vertically reversed\"].grid,\n  .ui.stackable[class*=\"mobile reversed\"] {\n    flex-direction: column-reverse;\n  }\n\n  /* Divided Reversed */\n  .ui[class*=\"mobile reversed\"].divided.grid:not([class*=\"vertically divided\"]) > .column:first-child,\n  .ui[class*=\"mobile reversed\"].divided.grid:not([class*=\"vertically divided\"]) > .row > .column:first-child {\n    box-shadow: @dividedBorder;\n  }\n  .ui[class*=\"mobile reversed\"].divided.grid:not([class*=\"vertically divided\"]) > .column:last-child,\n  .ui[class*=\"mobile reversed\"].divided.grid:not([class*=\"vertically divided\"]) > .row > .column:last-child {\n    box-shadow: none;\n  }\n  /* Vertically Divided Reversed */\n  .ui.grid[class*=\"vertically divided\"][class*=\"mobile vertically reversed\"] > .row:first-child:before {\n    box-shadow: @verticallyDividedBorder;\n  }\n  .ui.grid[class*=\"vertically divided\"][class*=\"mobile vertically reversed\"] > .row:last-child:before {\n    box-shadow: none;\n  }\n  /* Celled Reversed */\n  .ui[class*=\"mobile reversed\"].celled.grid > .row > .column:first-child {\n    box-shadow: @celledColumnDivider;\n  }\n  .ui[class*=\"mobile reversed\"].celled.grid > .row > .column:last-child {\n    box-shadow: none;\n  }\n}\n\n/* Tablet */\n@media only screen and (min-width: @tabletBreakpoint) and (max-width: @largestTabletScreen) {\n  .ui[class*=\"tablet reversed\"].grid,\n  .ui[class*=\"tablet reversed\"].grid > .row,\n  .ui.grid > [class*=\"tablet reversed\"].row {\n    flex-direction: row-reverse;\n  }\n  .ui[class*=\"tablet vertically reversed\"].grid {\n    flex-direction: column-reverse;\n  }\n\n  /* Divided Reversed */\n  .ui[class*=\"tablet reversed\"].divided.grid:not([class*=\"vertically divided\"]) > .column:first-child,\n  .ui[class*=\"tablet reversed\"].divided.grid:not([class*=\"vertically divided\"]) > .row > .column:first-child {\n    box-shadow: @dividedBorder;\n  }\n  .ui[class*=\"tablet reversed\"].divided.grid:not([class*=\"vertically divided\"]) > .column:last-child,\n  .ui[class*=\"tablet reversed\"].divided.grid:not([class*=\"vertically divided\"]) > .row > .column:last-child {\n    box-shadow: none;\n  }\n  /* Vertically Divided Reversed */\n  .ui.grid[class*=\"vertically divided\"][class*=\"tablet vertically reversed\"] > .row:first-child:before {\n    box-shadow: @verticallyDividedBorder;\n  }\n  .ui.grid[class*=\"vertically divided\"][class*=\"tablet vertically reversed\"] > .row:last-child:before {\n    box-shadow: none;\n  }\n  /* Celled Reversed */\n  .ui[class*=\"tablet reversed\"].celled.grid > .row > .column:first-child {\n    box-shadow: @celledColumnDivider;\n  }\n  .ui[class*=\"tablet reversed\"].celled.grid > .row > .column:last-child {\n    box-shadow: none;\n  }\n}\n\n/* Computer */\n@media only screen and (min-width: @computerBreakpoint) {\n  .ui[class*=\"computer reversed\"].grid,\n  .ui[class*=\"computer reversed\"].grid > .row,\n  .ui.grid > [class*=\"computer reversed\"].row {\n    flex-direction: row-reverse;\n  }\n  .ui[class*=\"computer vertically reversed\"].grid {\n    flex-direction: column-reverse;\n  }\n\n  /* Divided Reversed */\n  .ui[class*=\"computer reversed\"].divided.grid:not([class*=\"vertically divided\"]) > .column:first-child,\n  .ui[class*=\"computer reversed\"].divided.grid:not([class*=\"vertically divided\"]) > .row > .column:first-child {\n    box-shadow: @dividedBorder;\n  }\n  .ui[class*=\"computer reversed\"].divided.grid:not([class*=\"vertically divided\"]) > .column:last-child,\n  .ui[class*=\"computer reversed\"].divided.grid:not([class*=\"vertically divided\"]) > .row > .column:last-child {\n    box-shadow: none;\n  }\n  /* Vertically Divided Reversed */\n  .ui.grid[class*=\"vertically divided\"][class*=\"computer vertically reversed\"] > .row:first-child:before {\n    box-shadow: @verticallyDividedBorder;\n  }\n  .ui.grid[class*=\"vertically divided\"][class*=\"computer vertically reversed\"] > .row:last-child:before {\n    box-shadow: none;\n  }\n  /* Celled Reversed */\n  .ui[class*=\"computer reversed\"].celled.grid > .row > .column:first-child {\n    box-shadow: @celledColumnDivider;\n  }\n  .ui[class*=\"computer reversed\"].celled.grid > .row > .column:last-child {\n    box-shadow: none;\n  }\n}\n\n\n/*-------------------\n      Doubling\n--------------------*/\n\n/* Tablet Only */\n@media only screen and (min-width: @tabletBreakpoint) and (max-width: @largestTabletScreen) {\n  .ui.doubling.grid {\n    width: auto;\n  }\n  .ui.grid > .doubling.row,\n  .ui.doubling.grid > .row {\n    margin: 0em !important;\n    padding: 0em !important;\n  }\n  .ui.grid > .doubling.row > .column,\n  .ui.doubling.grid > .row > .column {\n    display: inline-block !important;\n    padding-top: (@rowSpacing / 2) !important;\n    padding-bottom: (@rowSpacing / 2) !important;\n    box-shadow: none !important;\n    margin: 0em;\n  }\n  .ui[class*=\"two column\"].doubling.grid > .row > .column,\n  .ui[class*=\"two column\"].doubling.grid > .column:not(.row),\n  .ui.grid > [class*=\"two column\"].doubling.row.row > .column {\n    width: @oneColumn !important;\n  }\n  .ui[class*=\"three column\"].doubling.grid > .row > .column,\n  .ui[class*=\"three column\"].doubling.grid > .column:not(.row),\n  .ui.grid > [class*=\"three column\"].doubling.row.row > .column {\n    width: @twoColumn !important;\n  }\n  .ui[class*=\"four column\"].doubling.grid > .row > .column,\n  .ui[class*=\"four column\"].doubling.grid > .column:not(.row),\n  .ui.grid > [class*=\"four column\"].doubling.row.row > .column {\n    width: @twoColumn !important;\n  }\n  .ui[class*=\"five column\"].doubling.grid > .row > .column,\n  .ui[class*=\"five column\"].doubling.grid > .column:not(.row),\n  .ui.grid > [class*=\"five column\"].doubling.row.row > .column {\n    width: @threeColumn !important;\n  }\n  .ui[class*=\"six column\"].doubling.grid > .row > .column,\n  .ui[class*=\"six column\"].doubling.grid > .column:not(.row),\n  .ui.grid > [class*=\"six column\"].doubling.row.row > .column {\n    width: @threeColumn !important;\n  }\n  .ui[class*=\"seven column\"].doubling.grid > .row > .column,\n  .ui[class*=\"seven column\"].doubling.grid > .column:not(.row),\n  .ui.grid > [class*=\"seven column\"].doubling.row.row > .column {\n    width: @threeColumn !important;\n  }\n  .ui[class*=\"eight column\"].doubling.grid > .row > .column,\n  .ui[class*=\"eight column\"].doubling.grid > .column:not(.row),\n  .ui.grid > [class*=\"eight column\"].doubling.row.row > .column {\n    width: @fourColumn !important;\n  }\n  .ui[class*=\"nine column\"].doubling.grid > .row > .column,\n  .ui[class*=\"nine column\"].doubling.grid > .column:not(.row),\n  .ui.grid > [class*=\"nine column\"].doubling.row.row > .column {\n    width: @fourColumn !important;\n  }\n  .ui[class*=\"ten column\"].doubling.grid > .row > .column,\n  .ui[class*=\"ten column\"].doubling.grid > .column:not(.row),\n  .ui.grid > [class*=\"ten column\"].doubling.row.row > .column {\n    width: @fiveColumn !important;\n  }\n  .ui[class*=\"eleven column\"].doubling.grid > .row > .column,\n  .ui[class*=\"eleven column\"].doubling.grid > .column:not(.row),\n  .ui.grid > [class*=\"eleven column\"].doubling.row.row > .column {\n    width: @fiveColumn !important;\n  }\n  .ui[class*=\"twelve column\"].doubling.grid > .row > .column,\n  .ui[class*=\"twelve column\"].doubling.grid > .column:not(.row),\n  .ui.grid > [class*=\"twelve column\"].doubling.row.row > .column {\n    width: @sixColumn !important;\n  }\n  .ui[class*=\"thirteen column\"].doubling.grid > .row > .column,\n  .ui[class*=\"thirteen column\"].doubling.grid > .column:not(.row),\n  .ui.grid > [class*=\"thirteen column\"].doubling.row.row > .column {\n    width: @sixColumn !important;\n  }\n  .ui[class*=\"fourteen column\"].doubling.grid > .row > .column,\n  .ui[class*=\"fourteen column\"].doubling.grid > .column:not(.row),\n  .ui.grid > [class*=\"fourteen column\"].doubling.row.row > .column {\n    width: @sevenColumn !important;\n  }\n  .ui[class*=\"fifteen column\"].doubling.grid > .row > .column,\n  .ui[class*=\"fifteen column\"].doubling.grid > .column:not(.row),\n  .ui.grid > [class*=\"fifteen column\"].doubling.row.row > .column {\n    width: @sevenColumn !important;\n  }\n  .ui[class*=\"sixteen column\"].doubling.grid > .row > .column,\n  .ui[class*=\"sixteen column\"].doubling.grid > .column:not(.row),\n  .ui.grid > [class*=\"sixteen column\"].doubling.row.row > .column {\n    width: @eightColumn !important;\n  }\n}\n\n/* Mobile Only */\n@media only screen and (max-width: @largestMobileScreen) {\n  .ui.grid > .doubling.row,\n  .ui.doubling.grid > .row {\n    margin: 0em !important;\n    padding: 0em !important;\n  }\n  .ui.grid > .doubling.row > .column,\n  .ui.doubling.grid > .row > .column {\n    padding-top: (@rowSpacing / 2) !important;\n    padding-bottom: (@rowSpacing / 2) !important;\n    margin: 0em !important;\n    box-shadow: none !important;\n  }\n  .ui[class*=\"two column\"].doubling:not(.stackable).grid > .row > .column,\n  .ui[class*=\"two column\"].doubling:not(.stackable).grid > .column:not(.row),\n  .ui.grid > [class*=\"two column\"].doubling:not(.stackable).row.row > .column {\n    width: @oneColumn !important;\n  }\n  .ui[class*=\"three column\"].doubling:not(.stackable).grid > .row > .column,\n  .ui[class*=\"three column\"].doubling:not(.stackable).grid > .column:not(.row),\n  .ui.grid > [class*=\"three column\"].doubling:not(.stackable).row.row > .column {\n    width: @twoColumn !important;\n  }\n  .ui[class*=\"four column\"].doubling:not(.stackable).grid > .row > .column,\n  .ui[class*=\"four column\"].doubling:not(.stackable).grid > .column:not(.row),\n  .ui.grid > [class*=\"four column\"].doubling:not(.stackable).row.row > .column {\n    width: @twoColumn !important;\n  }\n  .ui[class*=\"five column\"].doubling:not(.stackable).grid > .row > .column,\n  .ui[class*=\"five column\"].doubling:not(.stackable).grid > .column:not(.row),\n  .ui.grid > [class*=\"five column\"].doubling:not(.stackable).row.row > .column {\n    width: @twoColumn !important;\n  }\n  .ui[class*=\"six column\"].doubling:not(.stackable).grid > .row > .column,\n  .ui[class*=\"six column\"].doubling:not(.stackable).grid > .column:not(.row),\n  .ui.grid > [class*=\"six column\"].doubling:not(.stackable).row.row > .column {\n    width: @twoColumn !important;\n  }\n  .ui[class*=\"seven column\"].doubling:not(.stackable).grid > .row > .column,\n  .ui[class*=\"seven column\"].doubling:not(.stackable).grid > .column:not(.row),\n  .ui.grid > [class*=\"seven column\"].doubling:not(.stackable).row.row > .column {\n    width: @twoColumn !important;\n  }\n  .ui[class*=\"eight column\"].doubling:not(.stackable).grid > .row > .column,\n  .ui[class*=\"eight column\"].doubling:not(.stackable).grid > .column:not(.row),\n  .ui.grid > [class*=\"eight column\"].doubling:not(.stackable).row.row > .column {\n    width: @twoColumn !important;\n  }\n  .ui[class*=\"nine column\"].doubling:not(.stackable).grid > .row > .column,\n  .ui[class*=\"nine column\"].doubling:not(.stackable).grid > .column:not(.row),\n  .ui.grid > [class*=\"nine column\"].doubling:not(.stackable).row.row > .column {\n    width: @threeColumn !important;\n  }\n  .ui[class*=\"ten column\"].doubling:not(.stackable).grid > .row > .column,\n  .ui[class*=\"ten column\"].doubling:not(.stackable).grid > .column:not(.row),\n  .ui.grid > [class*=\"ten column\"].doubling:not(.stackable).row.row > .column {\n    width: @threeColumn !important;\n  }\n  .ui[class*=\"eleven column\"].doubling:not(.stackable).grid > .row > .column,\n  .ui[class*=\"eleven column\"].doubling:not(.stackable).grid > .column:not(.row),\n  .ui.grid > [class*=\"eleven column\"].doubling:not(.stackable).row.row > .column {\n    width: @threeColumn !important;\n  }\n  .ui[class*=\"twelve column\"].doubling:not(.stackable).grid > .row > .column,\n  .ui[class*=\"twelve column\"].doubling:not(.stackable).grid > .column:not(.row),\n  .ui.grid > [class*=\"twelve column\"].doubling:not(.stackable).row.row > .column {\n    width: @threeColumn !important;\n  }\n  .ui[class*=\"thirteen column\"].doubling:not(.stackable).grid > .row > .column,\n  .ui[class*=\"thirteen column\"].doubling:not(.stackable).grid > .column:not(.row),\n  .ui.grid > [class*=\"thirteen column\"].doubling:not(.stackable).row.row > .column {\n    width: @threeColumn !important;\n  }\n  .ui[class*=\"fourteen column\"].doubling:not(.stackable).grid > .row > .column,\n  .ui[class*=\"fourteen column\"].doubling:not(.stackable).grid > .column:not(.row),\n  .ui.grid > [class*=\"fourteen column\"].doubling:not(.stackable).row.row > .column {\n    width: @fourColumn !important;\n  }\n  .ui[class*=\"fifteen column\"].doubling:not(.stackable).grid > .row > .column,\n  .ui[class*=\"fifteen column\"].doubling:not(.stackable).grid > .column:not(.row),\n  .ui.grid > [class*=\"fifteen column\"].doubling:not(.stackable).row.row > .column {\n    width: @fourColumn !important;\n  }\n  .ui[class*=\"sixteen column\"].doubling:not(.stackable).grid > .row > .column,\n  .ui[class*=\"sixteen column\"].doubling:not(.stackable).grid > .column:not(.row),\n  .ui.grid > [class*=\"sixteen column\"].doubling:not(.stackable).row.row > .column {\n    width: @fourColumn !important;\n  }\n}\n\n/*-------------------\n      Stackable\n--------------------*/\n\n@media only screen and (max-width: @largestMobileScreen) {\n  .ui.stackable.grid {\n    width: auto;\n    margin-left: 0em !important;\n    margin-right: 0em !important;\n  }\n  .ui.stackable.grid > .row > .wide.column,\n  .ui.stackable.grid > .wide.column,\n  .ui.stackable.grid > .column.grid > .column,\n  .ui.stackable.grid > .column.row > .column,\n  .ui.stackable.grid > .row > .column,\n  .ui.stackable.grid > .column:not(.row),\n  .ui.grid > .stackable.stackable.row > .column {\n    width: 100% !important;\n    margin: 0em 0em !important;\n    box-shadow: none !important;\n    padding: (@stackableRowSpacing / 2) (@stackableGutter / 2) !important;\n  }\n  .ui.stackable.grid:not(.vertically) > .row {\n    margin: 0em;\n    padding: 0em;\n  }\n\n  /* Coupling */\n  .ui.container > .ui.stackable.grid > .column,\n  .ui.container > .ui.stackable.grid > .row > .column {\n    padding-left: 0em !important;\n    padding-right: 0em !important;\n  }\n\n  /* Don't pad inside segment or nested grid */\n  .ui.grid .ui.stackable.grid,\n  .ui.segment:not(.vertical) .ui.stackable.page.grid {\n    margin-left: -(@stackableGutter / 2) !important;\n    margin-right: -(@stackableGutter / 2) !important;\n  }\n\n  /* Divided Stackable */\n  .ui.stackable.divided.grid > .row:first-child > .column:first-child,\n  .ui.stackable.celled.grid > .row:first-child > .column:first-child,\n  .ui.stackable.divided.grid > .column:not(.row):first-child,\n  .ui.stackable.celled.grid > .column:not(.row):first-child {\n    border-top: none !important;\n  }\n  .ui.inverted.stackable.celled.grid > .column:not(.row),\n  .ui.inverted.stackable.divided.grid > .column:not(.row),\n  .ui.inverted.stackable.celled.grid > .row > .column,\n  .ui.inverted.stackable.divided.grid > .row > .column {\n    border-top: @stackableInvertedMobileBorder;\n  }\n\n  .ui.stackable.celled.grid > .column:not(.row),\n  .ui.stackable.divided:not(.vertically).grid > .column:not(.row),\n  .ui.stackable.celled.grid > .row > .column,\n  .ui.stackable.divided:not(.vertically).grid > .row > .column {\n    border-top: @stackableMobileBorder;\n    box-shadow: none !important;\n    padding-top: @stackableRowSpacing !important;\n    padding-bottom: @stackableRowSpacing !important;\n  }\n\n  .ui.stackable.celled.grid > .row {\n    box-shadow: none !important;\n  }\n  .ui.stackable.divided:not(.vertically).grid > .column:not(.row),\n  .ui.stackable.divided:not(.vertically).grid > .row > .column {\n    padding-left: 0em !important;\n    padding-right: 0em !important;\n  }\n\n}\n\n/*----------------------\n     Only (Device)\n-----------------------*/\n\n\n/* These include arbitrary class repetitions for forced specificity */\n\n/* Mobile Only Hide */\n@media only screen and (max-width: @largestMobileScreen) {\n  .ui[class*=\"tablet only\"].grid.grid.grid:not(.mobile),\n  .ui.grid.grid.grid > [class*=\"tablet only\"].row:not(.mobile),\n  .ui.grid.grid.grid > [class*=\"tablet only\"].column:not(.mobile),\n  .ui.grid.grid.grid > .row > [class*=\"tablet only\"].column:not(.mobile) {\n    display: none !important;\n  }\n  .ui[class*=\"computer only\"].grid.grid.grid:not(.mobile),\n  .ui.grid.grid.grid > [class*=\"computer only\"].row:not(.mobile),\n  .ui.grid.grid.grid > [class*=\"computer only\"].column:not(.mobile),\n  .ui.grid.grid.grid > .row > [class*=\"computer only\"].column:not(.mobile) {\n    display: none !important;\n  }\n  .ui[class*=\"large screen only\"].grid.grid.grid:not(.mobile),\n  .ui.grid.grid.grid > [class*=\"large screen only\"].row:not(.mobile),\n  .ui.grid.grid.grid > [class*=\"large screen only\"].column:not(.mobile),\n  .ui.grid.grid.grid > .row > [class*=\"large screen only\"].column:not(.mobile) {\n    display: none !important;\n  }\n  .ui[class*=\"widescreen only\"].grid.grid.grid:not(.mobile),\n  .ui.grid.grid.grid > [class*=\"widescreen only\"].row:not(.mobile),\n  .ui.grid.grid.grid > [class*=\"widescreen only\"].column:not(.mobile),\n  .ui.grid.grid.grid > .row > [class*=\"widescreen only\"].column:not(.mobile) {\n    display: none !important;\n  }\n}\n/* Tablet Only Hide */\n@media only screen and (min-width: @tabletBreakpoint) and (max-width: @largestTabletScreen) {\n  .ui[class*=\"mobile only\"].grid.grid.grid:not(.tablet),\n  .ui.grid.grid.grid > [class*=\"mobile only\"].row:not(.tablet),\n  .ui.grid.grid.grid > [class*=\"mobile only\"].column:not(.tablet),\n  .ui.grid.grid.grid > .row > [class*=\"mobile only\"].column:not(.tablet) {\n    display: none !important;\n  }\n  .ui[class*=\"computer only\"].grid.grid.grid:not(.tablet),\n  .ui.grid.grid.grid > [class*=\"computer only\"].row:not(.tablet),\n  .ui.grid.grid.grid > [class*=\"computer only\"].column:not(.tablet),\n  .ui.grid.grid.grid > .row > [class*=\"computer only\"].column:not(.tablet) {\n    display: none !important;\n  }\n  .ui[class*=\"large screen only\"].grid.grid.grid:not(.mobile),\n  .ui.grid.grid.grid > [class*=\"large screen only\"].row:not(.mobile),\n  .ui.grid.grid.grid > [class*=\"large screen only\"].column:not(.mobile),\n  .ui.grid.grid.grid > .row > [class*=\"large screen only\"].column:not(.mobile) {\n    display: none !important;\n  }\n  .ui[class*=\"widescreen only\"].grid.grid.grid:not(.mobile),\n  .ui.grid.grid.grid > [class*=\"widescreen only\"].row:not(.mobile),\n  .ui.grid.grid.grid > [class*=\"widescreen only\"].column:not(.mobile),\n  .ui.grid.grid.grid > .row > [class*=\"widescreen only\"].column:not(.mobile) {\n    display: none !important;\n  }\n}\n\n/* Computer Only Hide */\n@media only screen and (min-width: @computerBreakpoint) and (max-width: @largestSmallMonitor) {\n  .ui[class*=\"mobile only\"].grid.grid.grid:not(.computer),\n  .ui.grid.grid.grid > [class*=\"mobile only\"].row:not(.computer),\n  .ui.grid.grid.grid > [class*=\"mobile only\"].column:not(.computer),\n  .ui.grid.grid.grid > .row > [class*=\"mobile only\"].column:not(.computer) {\n    display: none !important;\n  }\n  .ui[class*=\"tablet only\"].grid.grid.grid:not(.computer),\n  .ui.grid.grid.grid > [class*=\"tablet only\"].row:not(.computer),\n  .ui.grid.grid.grid > [class*=\"tablet only\"].column:not(.computer),\n  .ui.grid.grid.grid > .row > [class*=\"tablet only\"].column:not(.computer) {\n    display: none !important;\n  }\n  .ui[class*=\"large screen only\"].grid.grid.grid:not(.mobile),\n  .ui.grid.grid.grid > [class*=\"large screen only\"].row:not(.mobile),\n  .ui.grid.grid.grid > [class*=\"large screen only\"].column:not(.mobile),\n  .ui.grid.grid.grid > .row > [class*=\"large screen only\"].column:not(.mobile) {\n    display: none !important;\n  }\n  .ui[class*=\"widescreen only\"].grid.grid.grid:not(.mobile),\n  .ui.grid.grid.grid > [class*=\"widescreen only\"].row:not(.mobile),\n  .ui.grid.grid.grid > [class*=\"widescreen only\"].column:not(.mobile),\n  .ui.grid.grid.grid > .row > [class*=\"widescreen only\"].column:not(.mobile) {\n    display: none !important;\n  }\n}\n\n/* Large Screen Only Hide */\n@media only screen and (min-width: @largeMonitorBreakpoint) and (max-width: @largestLargeMonitor) {\n  .ui[class*=\"mobile only\"].grid.grid.grid:not(.computer),\n  .ui.grid.grid.grid > [class*=\"mobile only\"].row:not(.computer),\n  .ui.grid.grid.grid > [class*=\"mobile only\"].column:not(.computer),\n  .ui.grid.grid.grid > .row > [class*=\"mobile only\"].column:not(.computer) {\n    display: none !important;\n  }\n  .ui[class*=\"tablet only\"].grid.grid.grid:not(.computer),\n  .ui.grid.grid.grid > [class*=\"tablet only\"].row:not(.computer),\n  .ui.grid.grid.grid > [class*=\"tablet only\"].column:not(.computer),\n  .ui.grid.grid.grid > .row > [class*=\"tablet only\"].column:not(.computer) {\n    display: none !important;\n  }\n  .ui[class*=\"widescreen only\"].grid.grid.grid:not(.mobile),\n  .ui.grid.grid.grid > [class*=\"widescreen only\"].row:not(.mobile),\n  .ui.grid.grid.grid > [class*=\"widescreen only\"].column:not(.mobile),\n  .ui.grid.grid.grid > .row > [class*=\"widescreen only\"].column:not(.mobile) {\n    display: none !important;\n  }\n}\n\n/* Widescreen Only Hide */\n@media only screen and (min-width: @widescreenMonitorBreakpoint) {\n  .ui[class*=\"mobile only\"].grid.grid.grid:not(.computer),\n  .ui.grid.grid.grid > [class*=\"mobile only\"].row:not(.computer),\n  .ui.grid.grid.grid > [class*=\"mobile only\"].column:not(.computer),\n  .ui.grid.grid.grid > .row > [class*=\"mobile only\"].column:not(.computer) {\n    display: none !important;\n  }\n  .ui[class*=\"tablet only\"].grid.grid.grid:not(.computer),\n  .ui.grid.grid.grid > [class*=\"tablet only\"].row:not(.computer),\n  .ui.grid.grid.grid > [class*=\"tablet only\"].column:not(.computer),\n  .ui.grid.grid.grid > .row > [class*=\"tablet only\"].column:not(.computer) {\n    display: none !important;\n  }\n}\n\n\n.loadUIOverrides();\n"
  },
  {
    "path": "semantic/src/definitions/collections/menu.less",
    "content": "/*\n * # Semantic - Menu\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Copyright 2015 Contributor\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n            Theme\n*******************************/\n\n@type    : 'collection';\n@element : 'menu';\n\n@import (multiple) '../../theme.config';\n\n/*******************************\n            Standard\n*******************************/\n\n/*--------------\n      Menu\n---------------*/\n\n.ui.menu {\n  display: flex;\n  margin: @margin;\n  font-family: @fontFamily;\n  background: @background;\n  font-weight: @fontWeight;\n  border: @border;\n  box-shadow: @boxShadow;\n  border-radius: @borderRadius;\n  min-height: @minHeight;\n}\n\n.ui.menu:after {\n  content: '';\n  display: block;\n  height: 0px;\n  clear: both;\n  visibility: hidden;\n}\n\n.ui.menu:first-child {\n  margin-top: 0rem;\n}\n.ui.menu:last-child {\n  margin-bottom: 0rem;\n}\n\n\n/*--------------\n    Sub-Menu\n---------------*/\n\n.ui.menu .menu {\n  margin: 0em;\n}\n\n.ui.menu:not(.vertical) > .menu {\n  display: flex;\n}\n\n/*--------------\n      Item\n---------------*/\n\n.ui.menu:not(.vertical) .item {\n  display: flex;\n  align-items: center;\n}\n\n.ui.menu .item {\n  position: relative;\n  vertical-align: middle;\n  line-height: 1;\n  text-decoration: none;\n  -webkit-tap-highlight-color: transparent;\n  flex: 0 0 auto;\n  user-select: none;\n\n  background: @itemBackground;\n  padding: @itemVerticalPadding @itemHorizontalPadding;\n  text-transform: @itemTextTransform;\n  color: @itemTextColor;\n  font-weight: @itemFontWeight;\n  transition: @itemTransition;\n}\n\n.ui.menu > .item:first-child {\n  border-radius: @borderRadius 0px 0px @borderRadius;\n}\n\n/* Border */\n.ui.menu .item:before {\n  position: absolute;\n  content: '';\n  top: 0%;\n  right: 0px;\n  height: 100%;\n\n  width: @dividerSize;\n  background: @dividerBackground;\n}\n\n/*--------------\n  Text Content\n---------------*/\n\n.ui.menu .text.item > *,\n.ui.menu .item > a:not(.ui),\n.ui.menu .item > p:only-child {\n  user-select: text;\n  line-height: @textLineHeight;\n}\n.ui.menu .item > p:first-child {\n  margin-top: 0;\n}\n.ui.menu .item > p:last-child {\n  margin-bottom: 0;\n}\n\n/*--------------\n      Icons\n---------------*/\n\n.ui.menu .item > i.icon {\n  opacity: @iconOpacity;\n  float: @iconFloat;\n  margin: @iconMargin;\n}\n\n/*--------------\n     Button\n---------------*/\n\n.ui.menu:not(.vertical) .item > .button {\n  position: relative;\n  top: @buttonOffset;\n  margin: @buttonMargin;\n  padding-bottom: @buttonVerticalPadding;\n  padding-top: @buttonVerticalPadding;\n  font-size: @buttonSize;\n}\n\n/*----------------\n Grid / Container\n-----------------*/\n\n.ui.menu >  .grid,\n.ui.menu > .container {\n  display: flex;\n  align-items: inherit;\n  flex-direction: inherit;\n}\n\n/*--------------\n     Inputs\n---------------*/\n\n.ui.menu .item > .input {\n  width: 100%;\n}\n.ui.menu:not(.vertical) .item > .input {\n  position: relative;\n  top: @inputOffset;\n  margin: @inputVerticalMargin 0em;\n}\n.ui.menu .item > .input input {\n  font-size: @inputSize;\n  padding-top: @inputVerticalPadding;\n  padding-bottom: @inputVerticalPadding;\n}\n\n\n/*--------------\n     Header\n---------------*/\n\n.ui.menu .header.item,\n.ui.vertical.menu .header.item {\n  margin: 0em;\n  background: @headerBackground;\n  text-transform: @headerTextTransform;\n  font-weight: @headerWeight;\n}\n\n.ui.vertical.menu .item > .header:not(.ui) {\n  margin: @verticalHeaderMargin;\n  font-size: @verticalHeaderFontSize;\n  font-weight: @verticalHeaderFontWeight;\n}\n\n/*--------------\n    Dropdowns\n---------------*/\n\n\n/* Dropdown Icon */\n.ui.menu .item > i.dropdown.icon {\n  padding: 0em;\n  float: @dropdownIconFloat;\n  margin: 0em 0em 0em @dropdownIconDistance;\n}\n\n/* Menu */\n.ui.menu .dropdown.item .menu {\n  min-width: ~\"calc(100% - 1px)\";\n  border-radius: 0em 0em @dropdownMenuBorderRadius @dropdownMenuBorderRadius;\n  background: @dropdownBackground;\n  margin: @dropdownMenuDistance 0px 0px;\n  box-shadow: @dropdownMenuBoxShadow;\n  flex-direction: column !important;\n}\n\n\n/* Menu Items */\n.ui.menu .ui.dropdown .menu > .item {\n  margin: 0;\n  text-align: left;\n  font-size: @dropdownItemFontSize !important;\n  padding: @dropdownItemPadding !important;\n  background: @dropdownItemBackground !important;\n  color: @dropdownItemColor !important;\n  text-transform: @dropdownItemTextTransform !important;\n  font-weight: @dropdownItemFontWeight !important;\n  box-shadow: @dropdownItemBoxShadow !important;\n  transition: @dropdownItemTransition !important;\n}\n.ui.menu .ui.dropdown .menu > .item:hover {\n  background: @dropdownHoveredItemBackground !important;\n  color: @dropdownHoveredItemColor !important;\n}\n.ui.menu .ui.dropdown .menu > .selected.item {\n  background: @dropdownSelectedItemBackground !important;\n  color: @dropdownSelectedItemColor !important;\n}\n.ui.menu .ui.dropdown .menu > .active.item {\n  background: @dropdownActiveItemBackground !important;\n  font-weight: @dropdownActiveItemFontWeight !important;\n  color: @dropdownActiveItemColor !important;\n}\n\n.ui.menu .ui.dropdown.item .menu .item:not(.filtered) {\n  display: block;\n}\n.ui.menu .ui.dropdown .menu > .item .icon:not(.dropdown) {\n  display: inline-block;\n  font-size: @dropdownItemIconFontSize !important;\n  float: @dropdownItemIconFloat;\n  margin: @dropdownItemIconMargin;\n}\n\n\n/* Secondary */\n.ui.secondary.menu .dropdown.item > .menu,\n.ui.text.menu .dropdown.item > .menu {\n  border-radius: @dropdownMenuBorderRadius;\n  margin-top: @secondaryDropdownMenuDistance;\n}\n\n/* Pointing */\n.ui.menu .pointing.dropdown.item .menu {\n  margin-top: @pointingDropdownMenuDistance;\n}\n\n/* Inverted */\n.ui.inverted.menu .search.dropdown.item > .search,\n.ui.inverted.menu .search.dropdown.item > .text {\n  color: @invertedSelectionDropdownColor;\n}\n\n/* Vertical */\n.ui.vertical.menu .dropdown.item > .icon {\n  float: right;\n  content: \"\\f0da\";\n  margin-left: 1em;\n}\n.ui.vertical.menu .dropdown.item .menu {\n  left: 100%;\n  min-width: 0;\n  margin: 0em 0em 0em @dropdownMenuDistance;\n  box-shadow: @dropdownVerticalMenuBoxShadow;\n  border-radius: 0em @dropdownMenuBorderRadius @dropdownMenuBorderRadius @dropdownMenuBorderRadius;\n}\n.ui.vertical.menu .dropdown.item.upward .menu {\n  bottom: 0;\n}\n.ui.vertical.menu .dropdown.item:not(.upward) .menu {\n  top: 0;\n}\n.ui.vertical.menu .active.dropdown.item {\n  border-top-right-radius: 0em;\n  border-bottom-right-radius: 0em;\n}\n.ui.vertical.menu .dropdown.active.item {\n  box-shadow: none;\n}\n\n/* Evenly Divided */\n.ui.item.menu .dropdown .menu .item {\n  width: 100%;\n}\n\n/*--------------\n     Labels\n---------------*/\n\n.ui.menu .item > .label {\n  background: @labelBackground;\n  color: @labelTextColor;\n  margin-left: @labelTextMargin;\n  padding: @labelVerticalPadding @labelHorizontalPadding;\n}\n.ui.vertical.menu .item > .label {\n  background: @labelBackground;\n  color: @labelTextColor;\n  margin-top: @labelOffset;\n  margin-bottom: @labelOffset;\n  padding: @labelVerticalPadding @labelHorizontalPadding;\n}\n.ui.menu .item > .floating.label {\n  padding: @labelVerticalPadding @labelHorizontalPadding;\n}\n\n/*--------------\n     Images\n---------------*/\n\n.ui.menu .item > img:not(.ui) {\n  display: inline-block;\n  vertical-align: middle;\n  margin: @imageMargin;\n  width: @imageWidth;\n}\n.ui.vertical.menu .item > img:not(.ui):only-child {\n  display: block;\n  max-width: 100%;\n  width: @verticalImageWidth;\n}\n\n/*******************************\n          Coupling\n*******************************/\n\n/*--------------\n     List\n---------------*/\n\n/* Menu divider shouldnt apply */\n.ui.menu .list .item:before {\n  background: none !important;\n}\n\n/*--------------\n     Sidebar\n---------------*/\n\n/* Show vertical dividers below last */\n\n.ui.vertical.sidebar.menu > .item:first-child:before {\n  display: block !important;\n}\n.ui.vertical.sidebar.menu > .item::before {\n  top: auto;\n  bottom: 0px;\n}\n\n/*--------------\n    Container\n---------------*/\n\n@media only screen and (max-width: @largestMobileScreen) {\n  .ui.menu > .ui.container {\n    width: 100% !important;\n    margin-left: 0em !important;\n    margin-right: 0em !important;\n  }\n}\n@media only screen and (min-width: @tabletBreakpoint) {\n  .ui.menu:not(.secondary):not(.text):not(.tabular):not(.borderless) > .container > .item:not(.right):not(.borderless):first-child {\n    border-left: @dividerSize solid @dividerBackground;\n  }\n}\n\n\n/*******************************\n             States\n*******************************/\n\n/*--------------\n      Hover\n---------------*/\n\n\n.ui.link.menu .item:hover,\n.ui.menu .dropdown.item:hover,\n.ui.menu .link.item:hover,\n.ui.menu a.item:hover {\n  cursor: pointer;\n  background: @hoverItemBackground;\n  color: @hoverItemTextColor;\n}\n\n\n/*--------------\n     Pressed\n---------------*/\n\n.ui.link.menu .item:active,\n.ui.menu .link.item:active,\n.ui.menu a.item:active {\n  background: @pressedItemBackground;\n  color: @pressedItemTextColor;\n}\n\n\n/*--------------\n     Active\n---------------*/\n\n.ui.menu .active.item  {\n  background: @activeItemBackground;\n  color: @activeItemTextColor;\n  font-weight: @activeItemFontWeight;\n  box-shadow: @activeItemBoxShadow;\n}\n.ui.menu .active.item > i.icon {\n  opacity: @activeIconOpacity;\n}\n\n/*--------------\n  Active Hover\n---------------*/\n\n.ui.menu .active.item:hover,\n.ui.vertical.menu .active.item:hover {\n  background-color: @activeHoverItemBackground;\n  color: @activeHoverItemColor;\n}\n\n\n/*--------------\n     Disabled\n---------------*/\n\n.ui.menu .item.disabled,\n.ui.menu .item.disabled:hover {\n  cursor: default !important;\n  background-color: transparent !important;\n  color: @disabledTextColor !important;\n}\n\n\n/*******************************\n             Types\n*******************************/\n\n/*------------------\nFloated Menu / Item\n-------------------*/\n\n/* Left Floated */\n.ui.menu:not(.vertical) .left.item,\n.ui.menu:not(.vertical) .left.menu {\n  display: flex;\n  margin-right: auto !important;\n}\n/* Right Floated */\n.ui.menu:not(.vertical) .right.item,\n.ui.menu:not(.vertical) .right.menu {\n  display: flex;\n  margin-left: auto !important;\n}\n\n/* Swapped Borders */\n.ui.menu .right.item::before,\n.ui.menu .right.menu > .item::before {\n  right: auto;\n  left: 0;\n}\n\n\n/*--------------\n    Vertical\n---------------*/\n\n.ui.vertical.menu {\n  display: block;\n  flex-direction: column;\n  background: @verticalBackground;\n  box-shadow: @verticalBoxShadow;\n}\n\n/*--- Item ---*/\n.ui.vertical.menu .item {\n  display: block;\n  background: @verticalItemBackground;\n  border-top: none;\n  border-right: none;\n}\n.ui.vertical.menu > .item:first-child {\n  border-radius: @borderRadius @borderRadius 0px 0px;\n}\n.ui.vertical.menu > .item:last-child {\n  border-radius: 0px 0px @borderRadius @borderRadius;\n}\n\n/*--- Label ---*/\n.ui.vertical.menu .item > .label {\n  float: right;\n  text-align: center;\n}\n\n/*--- Icon ---*/\n.ui.vertical.menu .item > i.icon {\n  width: @iconWidth;\n  float: @verticalIconFloat;\n  margin: @verticalIconMargin;\n}\n.ui.vertical.menu .item > .label + i.icon {\n  float: @labelAndIconFloat;\n  margin: @labelAndIconMargin;\n}\n\n\n/*--- Border ---*/\n.ui.vertical.menu .item:before {\n  position: absolute;\n  content: '';\n  top: 0%;\n  left: 0px;\n  width: 100%;\n  height: @dividerSize;\n  background: @verticalDividerBackground;\n}\n\n.ui.vertical.menu .item:first-child:before {\n  display: none !important;\n}\n\n\n/*--- Sub Menu ---*/\n.ui.vertical.menu .item > .menu {\n  margin: @subMenuMargin;\n}\n.ui.vertical.menu .menu .item {\n  background: none;\n  padding: @subMenuVerticalPadding @subMenuHorizontalPadding;\n  font-size: @subMenuFontSize;\n  color: @subMenuTextColor;\n}\n.ui.vertical.menu .item .menu a.item:hover,\n.ui.vertical.menu .item .menu .link.item:hover {\n  color: @darkTextColor;\n}\n.ui.vertical.menu .menu .item:before {\n  display: none;\n}\n\n/* Vertical Active */\n.ui.vertical.menu .active.item {\n  background: @activeItemBackground;\n  border-radius: 0em;\n  box-shadow: @verticalActiveBoxShadow;\n}\n.ui.vertical.menu > .active.item:first-child {\n  border-radius: @borderRadius @borderRadius 0em 0em;\n}\n.ui.vertical.menu > .active.item:last-child {\n  border-radius: 0em 0em @borderRadius @borderRadius;\n}\n.ui.vertical.menu > .active.item:only-child {\n  border-radius: @borderRadius;\n}\n.ui.vertical.menu .active.item .menu .active.item {\n  border-left: none;\n}\n.ui.vertical.menu .item .menu .active.item {\n  background-color: @subMenuActiveBackground;\n  font-weight: @subMenuActiveFontWeight;\n  color: @subMenuActiveTextColor;\n}\n\n\n/*--------------\n     Tabular\n---------------*/\n\n.ui.tabular.menu {\n  border-radius: 0em;\n  box-shadow: none !important;\n  border: none;\n  background: @tabularBackground;\n  border-bottom: @tabularBorderWidth solid @tabularBorderColor;\n}\n.ui.tabular.fluid.menu {\n  width: @tabularFluidWidth !important;\n}\n.ui.tabular.menu .item {\n  background: transparent;\n  border-bottom: none;\n\n  border-left: @tabularBorderWidth solid transparent;\n  border-right: @tabularBorderWidth solid transparent;\n  border-top: @tabularOppositeBorderWidth solid transparent;\n  padding: @tabularVerticalPadding @tabularHorizontalPadding;\n  color: @tabularTextColor;\n}\n.ui.tabular.menu .item:before {\n  display: none;\n}\n\n/* Hover */\n.ui.tabular.menu .item:hover {\n  background-color: transparent;\n  color: @tabularHoveredTextColor;\n}\n\n/* Active */\n.ui.tabular.menu .active.item {\n  background: @tabularActiveBackground;\n  color: @tabularActiveColor;\n  border-top-width: @tabularBorderWidth;\n  border-color: @tabularBorderColor;\n  font-weight: @tabularActiveWeight;\n  margin-bottom: -@tabularBorderWidth;\n  box-shadow: @tabularActiveBoxShadow;\n  border-radius: @tabularBorderRadius @tabularBorderRadius 0px 0px !important;\n}\n\n/* Coupling with segment for attachment */\n.ui.tabular.menu + .attached:not(.top).segment,\n.ui.tabular.menu + .attached:not(.top).segment + .attached:not(.top).segment {\n  border-top: none;\n  margin-left: 0px;\n  margin-top: 0px;\n  margin-right: 0px;\n  width: 100%;\n}\n.top.attached.segment + .ui.bottom.tabular.menu {\n  position: relative;\n  width: @tabularFluidWidth;\n  left: -@tabularFluidOffset;\n}\n\n/* Bottom Vertical Tabular */\n.ui.bottom.tabular.menu {\n  background: @tabularBackground;\n  border-radius: 0em;\n  box-shadow: none !important;\n  border-bottom: none;\n  border-top: @tabularBorderWidth solid @tabularBorderColor;\n}\n.ui.bottom.tabular.menu .item {\n  background: none;\n  border-left: @tabularBorderWidth solid transparent;\n  border-right: @tabularBorderWidth solid transparent;\n  border-bottom: @tabularBorderWidth solid transparent;\n  border-top: none;\n}\n.ui.bottom.tabular.menu .active.item {\n  background: @tabularActiveBackground;\n  color: @tabularActiveColor;\n  border-color: @tabularBorderColor;\n  margin: -@tabularBorderWidth 0px 0px 0px;\n  border-radius: 0px 0px @tabularBorderRadius @tabularBorderRadius !important;\n}\n\n/* Vertical Tabular (Left) */\n.ui.vertical.tabular.menu {\n  background: @tabularVerticalBackground;\n  border-radius: 0em;\n  box-shadow: none !important;\n  border-bottom: none;\n  border-right: @tabularBorderWidth solid @tabularBorderColor;\n}\n.ui.vertical.tabular.menu .item {\n  background: none;\n  border-left: @tabularBorderWidth solid transparent;\n  border-bottom: @tabularBorderWidth solid transparent;\n  border-top: @tabularBorderWidth solid transparent;\n  border-right: none;\n}\n.ui.vertical.tabular.menu .active.item {\n  background: @tabularActiveBackground;\n  color: @tabularActiveColor;\n  border-color: @tabularBorderColor;\n  margin: 0px -@tabularBorderWidth 0px 0px;\n  border-radius: @tabularBorderRadius 0px 0px @tabularBorderRadius !important;\n}\n\n/* Vertical Right Tabular */\n.ui.vertical.right.tabular.menu {\n  background: @tabularVerticalBackground;\n  border-radius: 0em;\n  box-shadow: none !important;\n  border-bottom: none;\n  border-right: none;\n  border-left: @tabularBorderWidth solid @tabularBorderColor;\n}\n.ui.vertical.right.tabular.menu .item {\n  background: none;\n  border-right: @tabularBorderWidth solid transparent;\n  border-bottom: @tabularBorderWidth solid transparent;\n  border-top: @tabularBorderWidth solid transparent;\n  border-left: none;\n}\n.ui.vertical.right.tabular.menu .active.item {\n  background: @tabularActiveBackground;\n  color: @tabularActiveColor;\n  border-color: @tabularBorderColor;\n  margin: 0px 0px 0px -@tabularBorderWidth;\n  border-radius: 0px @tabularBorderRadius @tabularBorderRadius 0px !important;\n}\n\n/* Dropdown */\n.ui.tabular.menu .active.dropdown.item {\n  margin-bottom: 0px;\n  border-left: @tabularBorderWidth solid transparent;\n  border-right: @tabularBorderWidth solid transparent;\n  border-top: @tabularOppositeBorderWidth solid transparent;\n  border-bottom: none;\n}\n\n\n\n/*--------------\n   Pagination\n---------------*/\n\n.ui.pagination.menu {\n  margin: 0em;\n  display: inline-flex;\n  vertical-align: middle;\n}\n.ui.pagination.menu .item:last-child {\n  border-radius: 0em @borderRadius @borderRadius 0em;\n}\n.ui.compact.menu .item:last-child {\n  border-radius: 0em @borderRadius @borderRadius 0em;\n}\n.ui.pagination.menu .item:last-child:before {\n  display: none;\n}\n\n.ui.pagination.menu .item {\n  min-width: @paginationMinWidth;\n  text-align: center;\n}\n.ui.pagination.menu .icon.item i.icon {\n  vertical-align: top;\n}\n\n/* Active */\n.ui.pagination.menu .active.item {\n  border-top: none;\n  padding-top: @itemVerticalPadding;\n  background-color: @paginationActiveBackground;\n  color: @paginationActiveTextColor;\n  box-shadow: none;\n}\n\n/*--------------\n   Secondary\n---------------*/\n\n.ui.secondary.menu {\n  background: @secondaryBackground;\n  margin-left: -@secondaryItemSpacing;\n  margin-right: -@secondaryItemSpacing;\n  border-radius: 0em;\n  border: none;\n  box-shadow: none;\n}\n\n/* Item */\n.ui.secondary.menu .item {\n  align-self: center;\n  box-shadow: none;\n  border: none;\n  padding: @secondaryItemPadding;\n  margin: @secondaryItemMargin;\n  background: @secondaryItemBackground;\n  transition: @secondaryItemTransition;\n  border-radius: @secondaryItemBorderRadius;\n}\n\n/* No Divider */\n.ui.secondary.menu .item:before {\n  display: none !important;\n}\n\n/* Header */\n.ui.secondary.menu .header.item {\n  border-radius: 0em;\n  border-right: @secondaryHeaderBorder;\n  background: @secondaryHeaderBackground;\n}\n\n/* Image */\n.ui.secondary.menu .item > img:not(.ui) {\n  margin: 0em;\n}\n\n/* Hover */\n.ui.secondary.menu .dropdown.item:hover,\n.ui.secondary.menu .link.item:hover,\n.ui.secondary.menu a.item:hover {\n  background: @secondaryHoverItemBackground;\n  color: @secondaryHoverItemColor;\n}\n\n/* Active */\n.ui.secondary.menu .active.item {\n  box-shadow: none;\n  background: @secondaryActiveItemBackground;\n  color: @secondaryActiveItemColor;\n  border-radius: @secondaryItemBorderRadius;\n}\n\n/* Active Hover */\n.ui.secondary.menu .active.item:hover {\n  box-shadow: none;\n  background: @secondaryActiveHoverItemBackground;\n  color: @secondaryActiveHoverItemColor;\n}\n\n\n/* Inverted */\n.ui.secondary.inverted.menu .link.item,\n.ui.secondary.inverted.menu a.item {\n  color: @secondaryInvertedColor !important;\n}\n.ui.secondary.inverted.menu .dropdown.item:hover,\n.ui.secondary.inverted.menu .link.item:hover,\n.ui.secondary.inverted.menu a.item:hover {\n  background: @secondaryInvertedHoverBackground;\n  color: @secondaryInvertedHoverColor !important;\n}\n.ui.secondary.inverted.menu .active.item {\n  background: @secondaryInvertedActiveBackground;\n  color: @secondaryInvertedActiveColor !important;\n}\n\n/* Fix item margins */\n.ui.secondary.item.menu {\n  margin-left: 0em;\n  margin-right: 0em;\n}\n.ui.secondary.item.menu .item:last-child {\n  margin-right: 0em;\n}\n.ui.secondary.attached.menu {\n  box-shadow: none;\n}\n\n/* Sub Menu */\n.ui.vertical.secondary.menu .item:not(.dropdown) > .menu {\n  margin: @secondaryMenuSubMenuMargin;\n}\n.ui.vertical.secondary.menu .item:not(.dropdown) > .menu > .item {\n  margin: @secondaryMenuSubMenuItemMargin;\n  padding: @secondaryMenuSubMenuItemPadding;\n}\n\n\n/*---------------------\n   Secondary Vertical\n-----------------------*/\n\n.ui.secondary.vertical.menu > .item {\n  border: none;\n  margin: @secondaryVerticalItemMargin;\n  border-radius: @secondaryVerticalItemBorderRadius !important;\n}\n.ui.secondary.vertical.menu > .header.item {\n  border-radius: 0em;\n}\n\n/* Sub Menu */\n.ui.vertical.secondary.menu .item > .menu .item {\n  background-color: transparent;\n}\n\n/* Inverted */\n.ui.secondary.inverted.menu {\n  background-color: transparent;\n}\n\n/*---------------------\n   Secondary Pointing\n-----------------------*/\n\n.ui.secondary.pointing.menu {\n  margin-left: 0em;\n  margin-right: 0em;\n  border-bottom: @secondaryPointingBorderWidth solid @secondaryPointingBorderColor;\n}\n\n.ui.secondary.pointing.menu .item {\n  border-bottom-color: transparent;\n  border-bottom-style: solid;\n  border-radius: 0em;\n  align-self: flex-end;\n\n  margin: 0em 0em -@secondaryPointingBorderWidth;\n  padding: @secondaryPointingItemVerticalPadding @secondaryPointingItemHorizontalPadding;\n  border-bottom-width: @secondaryPointingBorderWidth;\n  transition: @secondaryItemTransition;\n}\n\n/* Item Types */\n.ui.secondary.pointing.menu .header.item {\n  color: @secondaryPointingHeaderColor !important;\n}\n.ui.secondary.pointing.menu .text.item {\n  box-shadow: none !important;\n}\n.ui.secondary.pointing.menu .item:after {\n  display: none;\n}\n\n/* Hover */\n.ui.secondary.pointing.menu .dropdown.item:hover,\n.ui.secondary.pointing.menu .link.item:hover,\n.ui.secondary.pointing.menu a.item:hover {\n  background-color: transparent;\n  color: @secondaryPointingHoverTextColor;\n}\n\n/* Pressed */\n.ui.secondary.pointing.menu .dropdown.item:active,\n.ui.secondary.pointing.menu .link.item:active,\n.ui.secondary.pointing.menu a.item:active {\n  background-color: transparent;\n  border-color: @secondaryPointingBorderColor;\n}\n\n/* Active */\n.ui.secondary.pointing.menu .active.item {\n  background-color: transparent;\n  box-shadow: none;\n  border-color: @secondaryPointingActiveBorderColor;\n  font-weight: @secondaryPointingActiveFontWeight;\n  color: @secondaryPointingActiveTextColor;\n}\n\n/* Active Hover */\n.ui.secondary.pointing.menu .active.item:hover {\n  border-color: @secondaryPointingActiveHoverBorderColor;\n  color: @secondaryPointingActiveHoverTextColor;\n}\n\n/* Active Dropdown */\n.ui.secondary.pointing.menu .active.dropdown.item {\n  border-color: @secondaryPointingActiveDropdownBorderColor;\n}\n\n/* Vertical Pointing */\n.ui.secondary.vertical.pointing.menu {\n  border-bottom-width: 0px;\n  border-right-width: @secondaryPointingBorderWidth;\n  border-right-style: solid;\n  border-right-color: @secondaryPointingBorderColor;\n}\n.ui.secondary.vertical.pointing.menu .item {\n  border-bottom: none;\n  border-right-style: solid;\n  border-right-color: transparent;\n  border-radius: 0em !important;\n  margin: @secondaryVerticalPointingItemMargin;\n  border-right-width: @secondaryPointingBorderWidth;\n}\n\n/* Vertical Active */\n.ui.secondary.vertical.pointing.menu .active.item {\n  border-color: @secondaryPointingActiveBorderColor;\n}\n\n/* Inverted */\n.ui.secondary.inverted.pointing.menu {\n  border-color: @secondaryPointingInvertedBorderColor;\n}\n\n.ui.secondary.inverted.pointing.menu {\n  border-width: @secondaryPointingBorderWidth;\n  border-color: @secondaryPointingBorderColor;\n}\n.ui.secondary.inverted.pointing.menu .item {\n  color: @secondaryPointingInvertedItemTextColor;\n}\n.ui.secondary.inverted.pointing.menu .header.item {\n  color: @secondaryPointingInvertedItemHeaderColor !important;\n}\n\n/* Hover */\n.ui.secondary.inverted.pointing.menu .link.item:hover,\n.ui.secondary.inverted.pointing.menu a.item:hover {\n  color: @secondaryPointingInvertedItemHoverTextColor;\n}\n\n\n/* Active */\n.ui.secondary.inverted.pointing.menu .active.item {\n  border-color: @secondaryPointingInvertedActiveBorderColor;\n  color: @secondaryPointingInvertedActiveColor;\n}\n\n/*--------------\n    Text Menu\n---------------*/\n\n.ui.text.menu {\n  background: none transparent;\n  border-radius: 0px;\n  box-shadow: none;\n  border: none;\n\n  margin: @textMenuMargin;\n}\n.ui.text.menu .item {\n  border-radius: 0px;\n  box-shadow: none;\n  align-self: center;\n  margin: @textMenuItemMargin;\n  padding: @textMenuItemPadding;\n  font-weight: @textMenuItemFontWeight;\n  color: @textMenuItemColor;\n  transition: @textMenuItemTransition;\n}\n\n/* Border */\n.ui.text.menu .item:before,\n.ui.text.menu .menu .item:before {\n  display: none !important;\n}\n\n/* Header */\n.ui.text.menu .header.item {\n  background-color: transparent;\n  opacity: 1;\n  color: @textMenuHeaderColor;\n  font-size: @textMenuHeaderSize;\n  text-transform: @textMenuHeaderTextTransform;\n  font-weight: @textMenuHeaderFontWeight;\n}\n\n/* Image */\n.ui.text.menu .item > img:not(.ui) {\n  margin: 0em;\n}\n\n/*--- fluid text ---*/\n.ui.text.item.menu .item {\n  margin: 0em;\n}\n\n/*--- vertical text ---*/\n.ui.vertical.text.menu {\n  margin: @textVerticalMenuMargin;\n}\n.ui.vertical.text.menu:first-child {\n  margin-top: 0rem;\n}\n.ui.vertical.text.menu:last-child {\n  margin-bottom: 0rem;\n}\n.ui.vertical.text.menu .item {\n  margin: @textVerticalMenuItemMargin;\n  padding-left: 0em;\n  padding-right: 0em;\n}\n.ui.vertical.text.menu .item > i.icon {\n  float: @textVerticalMenuIconFloat;\n  margin: @iconMargin;\n}\n.ui.vertical.text.menu .header.item {\n  margin: @textVerticalMenuHeaderMargin;\n}\n\n/* Vertical Sub Menu */\n.ui.vertical.text.menu .item:not(.dropdown) > .menu {\n  margin: @textMenuSubMenuMargin;\n}\n.ui.vertical.text.menu .item:not(.dropdown) > .menu > .item {\n  margin: @textMenuSubMenuItemMargin;\n  padding: @textMenuSubMenuItemPadding;\n}\n\n/*--- hover ---*/\n.ui.text.menu .item:hover {\n  opacity: 1;\n  background-color: transparent;\n}\n\n/*--- active ---*/\n.ui.text.menu .active.item {\n  background-color: transparent;\n  border: none;\n  box-shadow: none;\n  font-weight: @textMenuActiveItemFontWeight;\n  color: @textMenuActiveItemColor;\n}\n\n/*--- active hover ---*/\n.ui.text.menu .active.item:hover {\n  background-color: transparent;\n}\n\n/* Disable Bariations */\n.ui.text.pointing.menu .active.item:after {\n  box-shadow: none;\n}\n.ui.text.attached.menu {\n  box-shadow: none;\n}\n\n/* Inverted */\n.ui.inverted.text.menu,\n.ui.inverted.text.menu .item,\n.ui.inverted.text.menu .item:hover,\n.ui.inverted.text.menu .active.item {\n  background-color: transparent !important;\n}\n\n/* Fluid */\n.ui.fluid.text.menu {\n  margin-left: 0em;\n  margin-right: 0em;\n}\n\n/*--------------\n    Icon Only\n---------------*/\n\n/* Vertical Menu */\n.ui.vertical.icon.menu {\n  display: inline-block;\n  width: auto;\n}\n\n/* Item */\n.ui.icon.menu .item {\n  height: auto;\n  text-align: @iconMenuTextAlign;\n  color: @iconMenuItemColor;\n}\n\n/* Icon */\n.ui.icon.menu .item > .icon:not(.dropdown) {\n  margin: 0;\n  opacity: 1;\n}\n\n/* Icon Gylph */\n.ui.icon.menu .icon:before {\n  opacity: 1;\n}\n\n/* (x) Item Icon */\n.ui.menu .icon.item > .icon {\n  width: auto;\n  margin: 0em auto;\n}\n\n/* Vertical Icon */\n.ui.vertical.icon.menu .item > .icon:not(.dropdown) {\n  display: block;\n  opacity: 1;\n  margin: 0em auto;\n  float: none;\n}\n\n/* Inverted */\n.ui.inverted.icon.menu .item {\n  color: @iconMenuInvertedItemColor;\n}\n\n/*--------------\n   Labeled Icon\n---------------*/\n\n/* Menu */\n.ui.labeled.icon.menu {\n  text-align: center;\n}\n\n/* Item */\n.ui.labeled.icon.menu  .item {\n  min-width: @labeledIconMinWidth;\n  flex-direction: column;\n}\n\n/* Icon */\n.ui.labeled.icon.menu .item > .icon:not(.dropdown) {\n  height: 1em;\n  display: block;\n  font-size: @labeledIconSize !important;\n  margin: 0em auto @labeledIconTextMargin !important;\n}\n\n/* Fluid */\n.ui.fluid.labeled.icon.menu > .item {\n  min-width: 0em;\n}\n\n\n/*******************************\n           Variations\n*******************************/\n\n/*--------------\n    Stackable\n---------------*/\n\n@media only screen and (max-width: @largestMobileScreen) {\n  .ui.stackable.menu {\n    flex-direction: column;\n  }\n  .ui.stackable.menu .item {\n    width: 100% !important;\n  }\n  .ui.stackable.menu .item:before {\n    position: absolute;\n    content: '';\n    top: auto;\n    bottom: 0px;\n    left: 0px;\n    width: 100%;\n    height: @dividerSize;\n    background: @verticalDividerBackground;\n  }\n\n  .ui.stackable.menu .left.menu,\n  .ui.stackable.menu .left.item {\n    margin-right: 0 !important;\n  }\n  .ui.stackable.menu .right.menu,\n  .ui.stackable.menu .right.item {\n    margin-left: 0 !important;\n  }\n\n  .ui.stackable.menu .right.menu,\n  .ui.stackable.menu .left.menu {\n    flex-direction: column;\n  }\n}\n\n/*--------------\n     Colors\n---------------*/\n\n/*--- Standard Colors  ---*/\n.ui.menu .red.active.item,\n.ui.red.menu .active.item {\n  border-color: @red !important;\n  color: @red !important;\n}\n.ui.menu .orange.active.item,\n.ui.orange.menu .active.item {\n  border-color: @orange !important;\n  color: @orange !important;\n}\n.ui.menu .yellow.active.item,\n.ui.yellow.menu .active.item {\n  border-color: @yellow !important;\n  color: @yellow !important;\n}\n.ui.menu .olive.active.item,\n.ui.olive.menu .active.item {\n  border-color: @olive !important;\n  color: @olive !important;\n}\n.ui.menu .green.active.item,\n.ui.green.menu .active.item {\n  border-color: @green !important;\n  color: @green !important;\n}\n.ui.menu .teal.active.item,\n.ui.teal.menu .active.item {\n  border-color: @teal !important;\n  color: @teal !important;\n}\n.ui.menu .blue.active.item,\n.ui.blue.menu .active.item {\n  border-color: @blue !important;\n  color: @blue !important;\n}\n.ui.menu .violet.active.item,\n.ui.violet.menu .active.item {\n  border-color: @violet !important;\n  color: @violet !important;\n}\n.ui.menu .purple.active.item,\n.ui.purple.menu .active.item {\n  border-color: @purple !important;\n  color: @purple !important;\n}\n.ui.menu .pink.active.item,\n.ui.pink.menu .active.item {\n  border-color: @pink !important;\n  color: @pink !important;\n}\n.ui.menu .brown.active.item,\n.ui.brown.menu .active.item {\n  border-color: @brown !important;\n  color: @brown !important;\n}\n.ui.menu .grey.active.item,\n.ui.grey.menu .active.item {\n  border-color: @grey !important;\n  color: @grey !important;\n}\n\n\n/*--------------\n    Inverted\n---------------*/\n\n.ui.inverted.menu {\n  border: @invertedBorder;\n  background: @invertedBackground;\n  box-shadow: @invertedBoxShadow;\n}\n\n/* Menu Item */\n.ui.inverted.menu .item,\n.ui.inverted.menu .item > a:not(.ui) {\n  background: @invertedItemBackground;\n  color: @invertedItemTextColor;\n}\n.ui.inverted.menu .item.menu {\n  background: @invertedSubMenuBackground;\n}\n\n/*--- Border ---*/\n.ui.inverted.menu .item:before {\n  background: @invertedDividerBackground;\n}\n.ui.vertical.inverted.menu .item:before {\n  background: @invertedVerticalDividerBackground;\n}\n\n/* Sub Menu */\n.ui.vertical.inverted.menu .menu .item,\n.ui.vertical.inverted.menu .menu .item a:not(.ui) {\n  color: @invertedSubMenuColor;\n}\n\n/* Header */\n.ui.inverted.menu .header.item {\n  margin: 0em;\n  background: @invertedHeaderBackground;\n  box-shadow: none;\n}\n\n/* Disabled */\n.ui.inverted.menu .item.disabled,\n.ui.inverted.menu .item.disabled:hover {\n  color: @invertedDisabledTextColor;\n}\n\n/*--- Hover ---*/\n.ui.link.inverted.menu .item:hover,\n.ui.inverted.menu .dropdown.item:hover,\n.ui.inverted.menu .link.item:hover,\n.ui.inverted.menu a.item:hover {\n  background: @invertedHoverBackground;\n  color: @invertedHoverColor;\n}\n.ui.vertical.inverted.menu .item .menu a.item:hover,\n.ui.vertical.inverted.menu .item .menu .link.item:hover {\n  background: @invertedSubMenuBackground;\n  color: @invertedSubMenuHoverColor;\n}\n\n/*--- Pressed ---*/\n.ui.inverted.menu a.item:active,\n.ui.inverted.menu .link.item:active{\n  background: @invertedMenuPressedBackground;\n  color: @invertedMenuPressedColor;\n}\n\n/*--- Active ---*/\n.ui.inverted.menu .active.item {\n  background: @invertedActiveBackground;\n  color: @invertedActiveColor !important;\n}\n.ui.inverted.vertical.menu .item .menu .active.item {\n  background: @invertedSubMenuActiveBackground;\n  color: @invertedSubMenuActiveColor;\n}\n.ui.inverted.pointing.menu .active.item:after {\n  background: @invertedArrowActiveColor !important;\n  margin: 0em !important;\n  box-shadow: none !important;\n  border: none !important;\n}\n\n/*--- Active Hover ---*/\n.ui.inverted.menu .active.item:hover {\n  background: @invertedActiveHoverBackground;\n  color: @invertedActiveHoverColor !important;\n}\n.ui.inverted.pointing.menu .active.item:hover:after {\n  background: @invertedArrowActiveHoverColor !important;\n}\n\n\n/*--------------\n     Floated\n---------------*/\n\n.ui.floated.menu {\n  float: left;\n  margin: 0rem @floatedDistance 0rem 0rem;\n}\n.ui.floated.menu .item:last-child:before {\n  display: none;\n}\n\n.ui.right.floated.menu {\n  float: right;\n  margin: 0rem 0rem 0rem @floatedDistance;\n}\n\n\n/*--------------\n    Inverted\n---------------*/\n\n/* Red */\n.ui.inverted.menu .red.active.item,\n.ui.inverted.red.menu {\n  background-color: @red;\n}\n.ui.inverted.red.menu .item:before {\n  background-color: @invertedColoredDividerBackground;\n}\n.ui.inverted.red.menu .active.item {\n  background-color: @invertedColoredActiveBackground !important;\n}\n\n/* Orange */\n.ui.inverted.menu .orange.active.item,\n.ui.inverted.orange.menu {\n  background-color: @orange;\n}\n.ui.inverted.orange.menu .item:before {\n  background-color: @invertedColoredDividerBackground;\n}\n.ui.inverted.orange.menu .active.item {\n  background-color: @invertedColoredActiveBackground !important;\n}\n\n/* Yellow */\n.ui.inverted.menu .yellow.active.item,\n.ui.inverted.yellow.menu {\n  background-color: @yellow;\n}\n.ui.inverted.yellow.menu .item:before {\n  background-color: @invertedColoredDividerBackground;\n}\n.ui.inverted.yellow.menu .active.item {\n  background-color: @invertedColoredActiveBackground !important;\n}\n\n/* Olive */\n.ui.inverted.menu .olive.active.item,\n.ui.inverted.olive.menu {\n  background-color: @olive;\n}\n.ui.inverted.olive.menu .item:before {\n  background-color: @invertedColoredDividerBackground;\n}\n.ui.inverted.olive.menu .active.item {\n  background-color: @invertedColoredActiveBackground !important;\n}\n\n/* Green */\n.ui.inverted.menu .green.active.item,\n.ui.inverted.green.menu {\n  background-color: @green;\n}\n.ui.inverted.green.menu .item:before {\n  background-color: @invertedColoredDividerBackground;\n}\n.ui.inverted.green.menu .active.item {\n  background-color: @invertedColoredActiveBackground !important;\n}\n\n/* Teal */\n.ui.inverted.menu .teal.active.item,\n.ui.inverted.teal.menu {\n  background-color: @teal;\n}\n.ui.inverted.teal.menu .item:before {\n  background-color: @invertedColoredDividerBackground;\n}\n.ui.inverted.teal.menu .active.item {\n  background-color: @invertedColoredActiveBackground !important;\n}\n\n/* Blue */\n.ui.inverted.menu .blue.active.item,\n.ui.inverted.blue.menu {\n  background-color: @blue;\n}\n.ui.inverted.blue.menu .item:before {\n  background-color: @invertedColoredDividerBackground;\n}\n.ui.inverted.blue.menu .active.item {\n  background-color: @invertedColoredActiveBackground !important;\n}\n\n/* Violet */\n.ui.inverted.menu .violet.active.item,\n.ui.inverted.violet.menu {\n  background-color: @violet;\n}\n.ui.inverted.violet.menu .item:before {\n  background-color: @invertedColoredDividerBackground;\n}\n.ui.inverted.violet.menu .active.item {\n  background-color: @invertedColoredActiveBackground !important;\n}\n\n/* Purple */\n.ui.inverted.menu .purple.active.item,\n.ui.inverted.purple.menu {\n  background-color: @purple;\n}\n.ui.inverted.purple.menu .item:before {\n  background-color: @invertedColoredDividerBackground;\n}\n.ui.inverted.purple.menu .active.item {\n  background-color: @invertedColoredActiveBackground !important;\n}\n\n/* Pink */\n.ui.inverted.menu .pink.active.item,\n.ui.inverted.pink.menu {\n  background-color: @pink;\n}\n.ui.inverted.pink.menu .item:before {\n  background-color: @invertedColoredDividerBackground;\n}\n.ui.inverted.pink.menu .active.item {\n  background-color: @invertedColoredActiveBackground !important;\n}\n\n/* Brown */\n.ui.inverted.menu .brown.active.item,\n.ui.inverted.brown.menu {\n  background-color: @brown;\n}\n.ui.inverted.brown.menu .item:before {\n  background-color: @invertedColoredDividerBackground;\n}\n.ui.inverted.brown.menu .active.item {\n  background-color: @invertedColoredActiveBackground !important;\n}\n\n/* Grey */\n.ui.inverted.menu .grey.active.item,\n.ui.inverted.grey.menu {\n  background-color: @grey;\n}\n.ui.inverted.grey.menu .item:before {\n  background-color: @invertedColoredDividerBackground;\n}\n.ui.inverted.grey.menu .active.item {\n  background-color: @invertedColoredActiveBackground !important;\n}\n\n\n/*--------------\n     Fitted\n---------------*/\n\n.ui.fitted.menu .item,\n.ui.fitted.menu .item .menu .item,\n.ui.menu .fitted.item {\n  padding: 0em;\n}\n.ui.horizontally.fitted.menu .item,\n.ui.horizontally.fitted.menu .item .menu .item,\n.ui.menu .horizontally.fitted.item {\n  padding-top: @itemVerticalPadding;\n  padding-bottom: @itemVerticalPadding;\n}\n.ui.vertically.fitted.menu .item,\n.ui.vertically.fitted.menu .item .menu .item,\n.ui.menu .vertically.fitted.item {\n  padding-left: @itemHorizontalPadding;\n  padding-right: @itemHorizontalPadding;\n}\n\n/*--------------\n   Borderless\n---------------*/\n\n.ui.borderless.menu .item:before,\n.ui.borderless.menu .item .menu .item:before,\n.ui.menu .borderless.item:before {\n  background: none !important;\n}\n\n/*-------------------\n       Compact\n--------------------*/\n\n.ui.compact.menu {\n  display: inline-flex;\n  margin: 0em;\n  vertical-align: middle;\n}\n.ui.compact.vertical.menu {\n  display: inline-block;\n}\n.ui.compact.menu .item:last-child {\n  border-radius: 0em @borderRadius @borderRadius 0em;\n}\n.ui.compact.menu .item:last-child:before {\n  display: none;\n}\n.ui.compact.vertical.menu {\n  width: auto !important;\n}\n.ui.compact.vertical.menu .item:last-child::before {\n  display: block;\n}\n\n/*-------------------\n        Fluid\n--------------------*/\n\n.ui.menu.fluid,\n.ui.vertical.menu.fluid {\n  width: 100% !important;\n}\n\n\n/*-------------------\n      Evenly Sized\n--------------------*/\n\n.ui.item.menu,\n.ui.item.menu .item {\n  width: 100%;\n  padding-left: 0em !important;\n  padding-right: 0em !important;\n  margin-left: 0em !important;\n  margin-right: 0em !important;\n  text-align: center;\n  justify-content: center;\n}\n.ui.attached.item.menu {\n  margin: 0em @attachedHorizontalOffset !important;\n}\n\n.ui.item.menu .item:last-child:before {\n  display: none;\n}\n\n.ui.menu.two.item .item {\n  width: 50%;\n}\n.ui.menu.three.item .item {\n  width: 33.333%;\n}\n.ui.menu.four.item .item {\n  width: 25%;\n}\n.ui.menu.five.item .item {\n  width: 20%;\n}\n.ui.menu.six.item .item {\n  width: 16.666%;\n}\n.ui.menu.seven.item .item {\n  width: 14.285%;\n}\n.ui.menu.eight.item .item {\n  width: 12.500%;\n}\n.ui.menu.nine.item .item {\n  width: 11.11%;\n}\n.ui.menu.ten.item .item {\n  width: 10.0%;\n}\n.ui.menu.eleven.item .item {\n  width: 9.09%;\n}\n.ui.menu.twelve.item .item {\n  width: 8.333%;\n}\n\n/*--------------\n     Fixed\n---------------*/\n\n.ui.menu.fixed {\n  position: fixed;\n  z-index: 101;\n  margin: 0em;\n  width: 100%;\n}\n.ui.menu.fixed,\n.ui.menu.fixed .item:first-child,\n.ui.menu.fixed .item:last-child {\n  border-radius: 0px !important;\n}\n\n.ui.fixed.menu,\n.ui[class*=\"top fixed\"].menu {\n  top: 0px;\n  left: 0px;\n  right: auto;\n  bottom: auto;\n}\n.ui[class*=\"top fixed\"].menu {\n  border-top: none;\n  border-left: none;\n  border-right: none;\n}\n.ui[class*=\"right fixed\"].menu {\n  border-top: none;\n  border-bottom: none;\n  border-right: none;\n  top: 0px;\n  right: 0px;\n  left: auto;\n  bottom: auto;\n  width: auto;\n  height: 100%;\n}\n.ui[class*=\"bottom fixed\"].menu {\n  border-bottom: none;\n  border-left: none;\n  border-right: none;\n  bottom: 0px;\n  left: 0px;\n  top: auto;\n  right: auto;\n}\n.ui[class*=\"left fixed\"].menu {\n  border-top: none;\n  border-bottom: none;\n  border-left: none;\n  top: 0px;\n  left: 0px;\n  right: auto;\n  bottom: auto;\n  width: auto;\n  height: 100%;\n}\n\n/* Coupling with Grid */\n.ui.fixed.menu + .ui.grid {\n  padding-top: @fixedPrecedingGridMargin;\n}\n\n\n/*-------------------\n       Pointing\n--------------------*/\n\n.ui.pointing.menu .item:after {\n  visibility: hidden;\n  position: absolute;\n  content: '';\n  top: 100%;\n  left: 50%;\n  transform: translateX(-50%) translateY(-50%) rotate(45deg);\n  background: none;\n\n  margin: (@arrowBorderWidth / 2) 0em 0em;\n  width: @arrowSize;\n  height: @arrowSize;\n\n  border: none;\n  border-bottom: @arrowBorder;\n  border-right: @arrowBorder;\n\n  z-index: @arrowZIndex;\n  transition: @arrowTransition;\n}\n.ui.vertical.pointing.menu .item:after {\n  position: absolute;\n  top: 50%;\n  right: 0%;\n  bottom: auto;\n  left: auto;\n\n  transform: translateX(50%) translateY(-50%) rotate(45deg);\n  margin: 0em -(@arrowBorderWidth / 2) 0em 0em;\n\n  border: none;\n  border-top: @arrowBorder;\n  border-right: @arrowBorder;\n}\n\n/* Active */\n.ui.pointing.menu .active.item:after {\n  visibility: visible;\n}\n.ui.pointing.menu .active.dropdown.item:after {\n  visibility: hidden;\n}\n\n/* Don't double up pointers */\n.ui.pointing.menu .dropdown.active.item:after,\n.ui.pointing.menu .active.item .menu .active.item:after {\n  display: none;\n}\n\n/* Colors */\n.ui.pointing.menu .active.item:hover:after {\n  background-color: @arrowHoverColor;\n}\n.ui.pointing.menu .active.item:after {\n  background-color: @arrowActiveColor;\n}\n.ui.pointing.menu .active.item:hover:after {\n  background-color: @arrowActiveHoverColor;\n}\n\n.ui.vertical.pointing.menu .active.item:hover:after {\n  background-color: @arrowVerticalHoverColor;\n}\n.ui.vertical.pointing.menu .active.item:after {\n  background-color: @arrowVerticalActiveColor;\n}\n.ui.vertical.pointing.menu .menu .active.item:after {\n  background-color: @arrowVerticalSubMenuColor;\n}\n\n\n\n/*--------------\n    Attached\n---------------*/\n\n/* Middle */\n.ui.attached.menu {\n  top: 0px;\n  bottom: 0px;\n  border-radius: 0px;\n  margin: 0em @attachedHorizontalOffset;\n  width: @attachedWidth;\n  max-width: @attachedWidth;\n  box-shadow: @attachedBoxShadow;\n}\n.ui.attached + .ui.attached.menu:not(.top) {\n  border-top: none;\n}\n\n/* Top */\n.ui[class*=\"top attached\"].menu {\n  bottom: 0px;\n  margin-bottom: 0em;\n  top: @attachedTopOffset;\n  margin-top: @verticalMargin;\n  border-radius: @borderRadius @borderRadius 0em 0em;\n}\n.ui.menu[class*=\"top attached\"]:first-child {\n  margin-top: 0em;\n}\n\n/* Bottom */\n.ui[class*=\"bottom attached\"].menu {\n  bottom: 0px;\n  margin-top: 0em;\n  top: @attachedBottomOffset;\n  margin-bottom: @verticalMargin;\n  box-shadow: @attachedBottomBoxShadow;\n  border-radius: 0em 0em @borderRadius @borderRadius;\n}\n.ui[class*=\"bottom attached\"].menu:last-child {\n  margin-bottom: 0em;\n}\n\n/* Attached Menu Item */\n.ui.top.attached.menu > .item:first-child {\n  border-radius: @borderRadius 0em 0em 0em;\n}\n.ui.bottom.attached.menu > .item:first-child {\n  border-radius: 0em 0em 0em @borderRadius;\n}\n\n/* Tabular Attached */\n.ui.attached.menu:not(.tabular) {\n  border: @attachedBorder;\n}\n.ui.attached.inverted.menu {\n  border: none;\n}\n.ui.attached.tabular.menu {\n  margin-left: 0;\n  margin-right: 0;\n  width: 100%;\n}\n\n/*--------------\n     Sizes\n---------------*/\n\n/* Mini */\n.ui.mini.menu {\n  font-size: @mini;\n}\n.ui.mini.vertical.menu {\n  width: @miniWidth;\n}\n\n/* Tiny */\n.ui.tiny.menu {\n  font-size: @tiny;\n}\n.ui.tiny.vertical.menu {\n  width: @tinyWidth;\n}\n\n/* Small */\n.ui.small.menu {\n  font-size: @small;\n}\n.ui.small.vertical.menu {\n  width: @smallWidth;\n}\n\n/* Medium */\n.ui.menu {\n  font-size: @medium;\n}\n.ui.vertical.menu {\n  width: @mediumWidth;\n}\n\n/* Large */\n.ui.large.menu {\n  font-size: @large;\n}\n.ui.large.vertical.menu {\n  width: @largeWidth;\n}\n\n/* Huge */\n.ui.huge.menu {\n  font-size: @huge;\n}\n.ui.huge.vertical.menu {\n  width: @hugeWidth;\n}\n\n/* Big */\n.ui.big.menu {\n  font-size: @big;\n}\n.ui.big.vertical.menu {\n  width: @bigWidth;\n}\n\n/* Massive */\n.ui.massive.menu {\n  font-size: @massive;\n}\n.ui.massive.vertical.menu {\n  width: @massiveWidth;\n}\n\n.loadUIOverrides();\n"
  },
  {
    "path": "semantic/src/definitions/collections/message.less",
    "content": "/*!\n * # Semantic UI - Message\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n/*******************************\n            Theme\n*******************************/\n\n@type    : 'collection';\n@element : 'message';\n\n@import (multiple) '../../theme.config';\n\n/*******************************\n            Message\n*******************************/\n\n.ui.message {\n  position: relative;\n  min-height: 1em;\n  margin: @verticalMargin 0em;\n  background: @background;\n  padding: @padding;\n  line-height: @lineHeight;\n  color: @textColor;\n  transition: @transition;\n  border-radius: @borderRadius;\n  box-shadow: @boxShadow;\n}\n\n.ui.message:first-child {\n  margin-top: 0em;\n}\n.ui.message:last-child {\n  margin-bottom: 0em;\n}\n\n\n/*--------------\n     Content\n---------------*/\n\n/* Header */\n.ui.message .header {\n  display: @headerDisplay;\n  font-family: @headerFont;\n  font-weight: @headerFontWeight;\n  margin: @headerMargin;\n}\n\n/* Default font size */\n.ui.message .header:not(.ui) {\n  font-size: @headerFontSize;\n}\n\n/* Paragraph */\n.ui.message p {\n  opacity: @messageTextOpacity;\n  margin: @messageParagraphMargin 0em;\n}\n.ui.message p:first-child {\n  margin-top: 0em;\n}\n.ui.message p:last-child {\n  margin-bottom: 0em;\n}\n.ui.message .header + p {\n  margin-top: @headerParagraphDistance;\n}\n\n/* List */\n.ui.message .list:not(.ui) {\n  text-align: left;\n  padding: 0em;\n  opacity: @listOpacity;\n  list-style-position: @listStylePosition;\n  margin: @listMargin 0em 0em;\n}\n.ui.message .list:not(.ui):first-child {\n  margin-top: 0em;\n}\n.ui.message .list:not(.ui):last-child {\n  margin-bottom: 0em;\n}\n.ui.message .list:not(.ui) li {\n  position: relative;\n  list-style-type: none;\n  margin: 0em 0em @listItemMargin @listItemIndent;\n  padding: 0em;\n}\n.ui.message .list:not(.ui) li:before {\n  position: absolute;\n  content: '•';\n  left: -1em;\n  height: 100%;\n  vertical-align: baseline;\n}\n.ui.message .list:not(.ui) li:last-child {\n  margin-bottom: 0em;\n}\n\n\n/* Icon */\n.ui.message > .icon {\n  margin-right: @iconDistance;\n}\n\n/* Close Icon */\n.ui.message > .close.icon {\n  cursor: pointer;\n  position: absolute;\n  margin: 0em;\n  top: @closeTopDistance;\n  right: @closeRightDistance;\n  opacity: @closeOpacity;\n  transition: @closeTransition;\n}\n.ui.message > .close.icon:hover {\n  opacity: 1;\n}\n\n/* First / Last Element */\n.ui.message > :first-child {\n  margin-top: 0em;\n}\n.ui.message > :last-child {\n  margin-bottom: 0em;\n}\n\n/*******************************\n            Coupling\n*******************************/\n\n.ui.dropdown .menu > .message {\n  margin: 0px -@borderWidth;\n}\n\n/*******************************\n            States\n*******************************/\n\n/*--------------\n    Visible\n---------------*/\n\n.ui.visible.visible.visible.visible.message {\n  display: block;\n}\n\n.ui.icon.visible.visible.visible.visible.message {\n  display: flex;\n}\n\n/*--------------\n     Hidden\n---------------*/\n\n.ui.hidden.hidden.hidden.hidden.message {\n  display: none;\n}\n\n\n/*******************************\n            Variations\n*******************************/\n\n/*--------------\n    Compact\n---------------*/\n\n.ui.compact.message {\n  display: inline-block;\n}\n.ui.compact.icon.message {\n  display: inline-flex;\n}\n\n\n/*--------------\n    Attached\n---------------*/\n\n.ui.attached.message {\n  margin-bottom: @attachedYOffset;\n  border-radius: @borderRadius @borderRadius 0em 0em;\n  box-shadow: @attachedBoxShadow;\n  margin-left: @attachedXOffset;\n  margin-right: @attachedXOffset;\n}\n.ui.attached + .ui.attached.message:not(.top):not(.bottom) {\n  margin-top: @attachedYOffset;\n  border-radius: 0em;\n}\n.ui.bottom.attached.message {\n  margin-top: @attachedYOffset;\n  border-radius: 0em 0em @borderRadius @borderRadius;\n  box-shadow: @attachedBottomBoxShadow;\n}\n.ui.bottom.attached.message:not(:last-child) {\n  margin-bottom: @verticalMargin;\n}\n.ui.attached.icon.message {\n  width: auto;\n}\n\n\n/*--------------\n      Icon\n---------------*/\n\n.ui.icon.message {\n  display: flex;\n  width: 100%;\n  align-items: center;\n}\n.ui.icon.message > .icon:not(.close) {\n  display: block;\n  flex: 0 0 auto;\n  width: auto;\n  line-height: 1;\n  vertical-align: @iconVerticalAlign;\n  font-size: @iconSize;\n  opacity: @iconOpacity;\n}\n.ui.icon.message > .content {\n  display: block;\n  flex: 1 1 auto;\n  vertical-align: @iconVerticalAlign;\n}\n\n\n.ui.icon.message .icon:not(.close) + .content {\n  padding-left: @iconContentDistance;\n}\n.ui.icon.message .circular.icon {\n  width: 1em;\n}\n\n/*--------------\n    Floating\n---------------*/\n\n.ui.floating.message {\n  box-shadow: @floatingBoxShadow;\n}\n\n\n/*--------------\n     Colors\n---------------*/\n\n.ui.black.message {\n  background-color: @black;\n  color: @invertedTextColor;\n}\n\n/*--------------\n     Types\n---------------*/\n\n/* Positive */\n.ui.positive.message {\n  background-color: @positiveBackgroundColor;\n  color: @positiveTextColor;\n}\n.ui.positive.message,\n.ui.attached.positive.message {\n  box-shadow: @positiveBoxShadow;\n}\n.ui.positive.message .header {\n  color: @positiveHeaderColor;\n}\n\n/* Negative */\n.ui.negative.message {\n  background-color: @negativeBackgroundColor;\n  color: @negativeTextColor;\n}\n.ui.negative.message,\n.ui.attached.negative.message {\n  box-shadow: @negativeBoxShadow;\n}\n.ui.negative.message .header {\n  color: @negativeHeaderColor;\n}\n\n/* Info */\n.ui.info.message {\n  background-color: @infoBackgroundColor;\n  color: @infoTextColor;\n}\n.ui.info.message,\n.ui.attached.info.message {\n  box-shadow: @infoBoxShadow;\n}\n.ui.info.message .header {\n  color: @infoHeaderColor;\n}\n\n/* Warning */\n.ui.warning.message {\n  background-color: @warningBackgroundColor;\n  color: @warningTextColor;\n}\n.ui.warning.message,\n.ui.attached.warning.message {\n  box-shadow: @warningBoxShadow;\n}\n.ui.warning.message .header {\n  color: @warningHeaderColor;\n}\n\n/* Error */\n.ui.error.message {\n  background-color: @errorBackgroundColor;\n  color: @errorTextColor;\n}\n.ui.error.message,\n.ui.attached.error.message {\n  box-shadow: @errorBoxShadow;\n}\n.ui.error.message .header {\n  color: @errorHeaderColor;\n}\n\n/* Success */\n.ui.success.message {\n  background-color: @successBackgroundColor;\n  color: @successTextColor;\n}\n.ui.success.message,\n.ui.attached.success.message {\n  box-shadow: @successBoxShadow;\n}\n.ui.success.message .header {\n  color: @successHeaderColor;\n}\n\n\n/* Colors */\n.ui.inverted.message,\n.ui.black.message {\n  background-color: @black;\n  color: @invertedTextColor;\n}\n\n.ui.red.message {\n  background-color: @redBackground;\n  color: @redTextColor;\n  box-shadow: @redBoxShadow;\n}\n.ui.red.message .header {\n  color: @redHeaderColor;\n}\n\n.ui.orange.message {\n  background-color: @orangeBackground;\n  color: @orangeTextColor;\n  box-shadow: @orangeBoxShadow;\n}\n.ui.orange.message .header {\n  color: @orangeHeaderColor;\n}\n\n.ui.yellow.message {\n  background-color: @yellowBackground;\n  color: @yellowTextColor;\n  box-shadow: @yellowBoxShadow;\n}\n.ui.yellow.message .header {\n  color: @yellowHeaderColor;\n}\n\n.ui.olive.message {\n  background-color: @oliveBackground;\n  color: @oliveTextColor;\n  box-shadow: @oliveBoxShadow;\n}\n.ui.olive.message .header {\n  color: @oliveHeaderColor;\n}\n\n.ui.green.message {\n  background-color: @greenBackground;\n  color: @greenTextColor;\n  box-shadow: @greenBoxShadow;\n}\n.ui.green.message .header {\n  color: @greenHeaderColor;\n}\n\n.ui.teal.message {\n  background-color: @tealBackground;\n  color: @tealTextColor;\n  box-shadow: @tealBoxShadow;\n}\n.ui.teal.message .header {\n  color: @tealHeaderColor;\n}\n\n.ui.blue.message {\n  background-color: @blueBackground;\n  color: @blueTextColor;\n  box-shadow: @blueBoxShadow;\n}\n.ui.blue.message .header {\n  color: @blueHeaderColor;\n}\n\n.ui.violet.message {\n  background-color: @violetBackground;\n  color: @violetTextColor;\n  box-shadow: @violetBoxShadow;\n}\n.ui.violet.message .header {\n  color: @violetHeaderColor;\n}\n\n.ui.purple.message {\n  background-color: @purpleBackground;\n  color: @purpleTextColor;\n  box-shadow: @purpleBoxShadow;\n}\n.ui.purple.message .header {\n  color: @purpleHeaderColor;\n}\n\n.ui.pink.message {\n  background-color: @pinkBackground;\n  color: @pinkTextColor;\n  box-shadow: @pinkBoxShadow;\n}\n.ui.pink.message .header {\n  color: @pinkHeaderColor;\n}\n\n.ui.brown.message {\n  background-color: @brownBackground;\n  color: @brownTextColor;\n  box-shadow: @brownBoxShadow;\n}\n.ui.brown.message .header {\n  color: @brownHeaderColor;\n}\n\n/*--------------\n     Sizes\n---------------*/\n\n.ui.mini.message {\n  font-size: @relativeMini;\n}\n.ui.tiny.message {\n  font-size: @relativeTiny;\n}\n.ui.small.message {\n  font-size: @relativeSmall;\n}\n.ui.message {\n  font-size: @relativeMedium;\n}\n.ui.large.message {\n  font-size: @relativeLarge;\n}\n.ui.big.message {\n  font-size: @relativeBig;\n}\n.ui.huge.message {\n  font-size: @relativeHuge;\n}\n.ui.massive.message {\n  font-size: @relativeMassive;\n}\n\n.loadUIOverrides();\n"
  },
  {
    "path": "semantic/src/definitions/collections/table.less",
    "content": "/*!\n * # Semantic UI - Table\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n            Theme\n*******************************/\n\n@type    : 'collection';\n@element : 'table';\n\n@import (multiple) '../../theme.config';\n\n/*******************************\n             Table\n*******************************/\n\n/* Prototype */\n.ui.table {\n  width: 100%;\n  background: @background;\n  margin: @margin;\n  border: @border;\n  box-shadow: @boxShadow;\n  border-radius: @borderRadius;\n  text-align: @textAlign;\n  color: @color;\n  border-collapse: @borderCollapse;\n  border-spacing: @borderSpacing;\n}\n\n.ui.table:first-child {\n  margin-top: 0em;\n}\n.ui.table:last-child {\n  margin-bottom: 0em;\n}\n\n/*******************************\n             Parts\n*******************************/\n\n/* Table Content */\n.ui.table th,\n.ui.table td {\n  transition: @transition;\n}\n\n/* Headers */\n.ui.table thead {\n  box-shadow: @headerBoxShadow;\n}\n.ui.table thead th {\n  cursor: auto;\n  background: @headerBackground;\n  text-align: @headerAlign;\n  color: @headerColor;\n  padding: @headerVerticalPadding @headerHorizontalPadding;\n  vertical-align: @headerVerticalAlign;\n  font-style: @headerFontStyle;\n  font-weight: @headerFontWeight;\n  text-transform: @headerTextTransform;\n  border-bottom: @headerBorder;\n  border-left: @headerDivider;\n}\n\n.ui.table thead tr > th:first-child {\n  border-left: none;\n}\n\n.ui.table thead tr:first-child > th:first-child {\n  border-radius: @borderRadius 0em 0em 0em;\n}\n.ui.table thead tr:first-child > th:last-child {\n  border-radius: 0em @borderRadius 0em 0em;\n}\n.ui.table thead tr:first-child > th:only-child {\n  border-radius: @borderRadius @borderRadius 0em 0em;\n}\n\n/* Footer */\n.ui.table tfoot {\n  box-shadow: @footerBoxShadow;\n}\n.ui.table tfoot th {\n  cursor: auto;\n  border-top: @footerBorder;\n  background: @footerBackground;\n  text-align: @footerAlign;\n  color: @footerColor;\n  padding: @footerVerticalPadding @footerHorizontalPadding;\n  vertical-align: @footerVerticalAlign;\n  font-style: @footerFontStyle;\n  font-weight: @footerFontWeight;\n  text-transform: @footerTextTransform;\n}\n.ui.table tfoot tr > th:first-child {\n  border-left: none;\n}\n.ui.table tfoot tr:first-child > th:first-child {\n  border-radius: 0em 0em 0em @borderRadius;\n}\n.ui.table tfoot tr:first-child > th:last-child {\n  border-radius: 0em 0em @borderRadius 0em;\n}\n.ui.table tfoot tr:first-child > th:only-child {\n  border-radius: 0em 0em @borderRadius @borderRadius;\n}\n\n/* Table Row */\n.ui.table tr td {\n  border-top: @rowBorder;\n}\n.ui.table tr:first-child td {\n  border-top: none;\n}\n\n/* Repeated tbody */\n.ui.table tbody + tbody tr:first-child td {\n  border-top: @rowBorder;\n}\n\n/* Table Cells */\n.ui.table td {\n  padding: @cellVerticalPadding @cellHorizontalPadding;\n  text-align: @cellTextAlign;\n}\n\n/* Icons */\n.ui.table > .icon {\n  vertical-align: @iconVerticalAlign;\n}\n.ui.table > .icon:only-child {\n  margin: 0em;\n}\n\n/* Table Segment */\n.ui.table.segment {\n  padding: 0em;\n}\n.ui.table.segment:after {\n  display: none;\n}\n.ui.table.segment.stacked:after {\n  display: block;\n}\n\n\n/* Responsive */\n@media only screen and (max-width : @largestMobileScreen) {\n  .ui.table:not(.unstackable) {\n    width: 100%;\n  }\n  .ui.table:not(.unstackable) tbody,\n  .ui.table:not(.unstackable) tr,\n  .ui.table:not(.unstackable) tr > th,\n  .ui.table:not(.unstackable) tr > td  {\n    display: block !important;\n    width: auto !important;\n    display: block !important;\n  }\n\n  .ui.table:not(.unstackable) {\n    padding: 0em;\n  }\n  .ui.table:not(.unstackable) thead {\n    display: @responsiveHeaderDisplay;\n  }\n  .ui.table:not(.unstackable) tfoot {\n    display: @responsiveFooterDisplay;\n  }\n  .ui.table:not(.unstackable) tr {\n    padding-top: @responsiveRowVerticalPadding;\n    padding-bottom: @responsiveRowVerticalPadding;\n    box-shadow: @responsiveRowBoxShadow;\n  }\n\n  .ui.table:not(.unstackable) tr > th,\n  .ui.table:not(.unstackable) tr > td {\n    background: none;\n    border: none !important;\n    padding: @responsiveCellVerticalPadding @responsiveCellHorizontalPadding !important;\n    box-shadow: @responsiveCellBoxShadow;\n  }\n  .ui.table:not(.unstackable) th:first-child,\n  .ui.table:not(.unstackable) td:first-child {\n    font-weight: @responsiveCellHeaderFontWeight;\n  }\n\n  /* Definition Table */\n  .ui.definition.table:not(.unstackable) thead th:first-child {\n    box-shadow: none !important;\n  }\n}\n\n\n/*******************************\n            Coupling\n*******************************/\n\n/* UI Image */\n.ui.table th .image,\n.ui.table th .image img,\n.ui.table td .image,\n.ui.table td .image img {\n  max-width: none;\n}\n\n\n/*******************************\n             Types\n*******************************/\n\n/*--------------\n    Complex\n---------------*/\n\n.ui.structured.table {\n  border-collapse: collapse;\n}\n.ui.structured.table thead th {\n  border-left: @headerDivider;\n  border-right: @headerDivider;\n}\n.ui.structured.sortable.table thead th {\n  border-left: @sortableBorder;\n  border-right: @sortableBorder;\n}\n.ui.structured.basic.table th {\n  border-left: @basicTableHeaderDivider;\n  border-right: @basicTableHeaderDivider;\n}\n.ui.structured.celled.table tr th,\n.ui.structured.celled.table tr td {\n  border-left: @cellBorder;\n  border-right: @cellBorder;\n}\n\n/*--------------\n   Definition\n---------------*/\n\n.ui.definition.table thead:not(.full-width) th:first-child {\n  pointer-events: none;\n  background: @definitionHeaderBackground;\n  font-weight: @definitionHeaderFontWeight;\n  color: @definitionHeaderColor;\n  box-shadow: -@borderWidth -@borderWidth 0px @borderWidth @definitionPageBackground;\n}\n\n.ui.definition.table tfoot:not(.full-width) th:first-child {\n  pointer-events: none;\n  background: @definitionFooterBackground;\n  font-weight: @definitionFooterColor;\n  color: @definitionFooterFontWeight;\n  box-shadow: @borderWidth @borderWidth 0px @borderWidth @definitionPageBackground;\n}\n\n/* Remove Border */\n.ui.celled.definition.table thead:not(.full-width) th:first-child {\n  box-shadow: 0px -@borderWidth 0px @borderWidth @definitionPageBackground;\n}\n.ui.celled.definition.table tfoot:not(.full-width) th:first-child {\n  box-shadow: 0px @borderWidth 0px @borderWidth @definitionPageBackground;\n}\n\n/* Highlight Defining Column */\n.ui.definition.table tr td:first-child:not(.ignored),\n.ui.definition.table tr td.definition {\n  background: @definitionColumnBackground;\n  font-weight: @definitionColumnFontWeight;\n  color: @definitionColumnColor;\n  text-transform: @definitionColumnTextTransform;\n  box-shadow: @definitionColumnBoxShadow;\n  text-align: @definitionColumnTextAlign;\n  font-size: @definitionColumnFontSize;\n  padding-left: @definitionColumnHorizontalPadding;\n  padding-right: @definitionColumnHorizontalPadding;\n}\n\n\n/* Fix 2nd Column */\n.ui.definition.table thead:not(.full-width) th:nth-child(2) {\n  border-left: @borderWidth solid @borderColor;\n}\n.ui.definition.table tfoot:not(.full-width) th:nth-child(2) {\n  border-left: @borderWidth solid @borderColor;\n}\n.ui.definition.table td:nth-child(2) {\n  border-left: @borderWidth solid @borderColor;\n}\n\n\n/*******************************\n             States\n*******************************/\n\n/*--------------\n    Positive\n---------------*/\n\n.ui.table tr.positive,\n.ui.table td.positive {\n  box-shadow: @positiveBoxShadow;\n}\n.ui.table tr.positive,\n.ui.table td.positive {\n  background: @positiveBackgroundColor !important;\n  color: @positiveColor !important;\n}\n\n/*--------------\n     Negative\n---------------*/\n\n.ui.table tr.negative,\n.ui.table td.negative {\n  box-shadow: @negativeBoxShadow;\n}\n.ui.table tr.negative,\n.ui.table td.negative {\n  background: @negativeBackgroundColor !important;\n  color: @negativeColor !important;\n}\n\n/*--------------\n      Error\n---------------*/\n\n.ui.table tr.error,\n.ui.table td.error {\n  box-shadow: @errorBoxShadow;\n}\n.ui.table tr.error,\n.ui.table td.error {\n  background: @errorBackgroundColor !important;\n  color: @errorColor !important;\n}\n/*--------------\n     Warning\n---------------*/\n\n.ui.table tr.warning,\n.ui.table td.warning {\n  box-shadow: @warningBoxShadow;\n}\n.ui.table tr.warning,\n.ui.table td.warning {\n  background: @warningBackgroundColor !important;\n  color: @warningColor !important;\n}\n\n/*--------------\n     Active\n---------------*/\n\n.ui.table tr.active,\n.ui.table td.active {\n  box-shadow: @activeBoxShadow;\n}\n.ui.table tr.active,\n.ui.table td.active {\n  background: @activeBackgroundColor !important;\n  color: @activeColor !important;\n}\n\n\n\n/*--------------\n     Disabled\n---------------*/\n\n.ui.table tr.disabled td,\n.ui.table tr td.disabled,\n.ui.table tr.disabled:hover,\n.ui.table tr:hover td.disabled {\n  pointer-events: none;\n  color: @disabledTextColor;\n}\n\n/*******************************\n          Variations\n*******************************/\n\n/*--------------\n    Stackable\n---------------*/\n\n@media only screen and (max-width : @largestTabletScreen) {\n\n  .ui[class*=\"tablet stackable\"].table,\n  .ui[class*=\"tablet stackable\"].table tbody,\n  .ui[class*=\"tablet stackable\"].table tr,\n  .ui[class*=\"tablet stackable\"].table tr > th,\n  .ui[class*=\"tablet stackable\"].table tr > td  {\n    display: block !important;\n    width: 100% !important;\n    display: block !important;\n  }\n\n  .ui[class*=\"tablet stackable\"].table {\n    padding: 0em;\n  }\n  .ui[class*=\"tablet stackable\"].table thead {\n    display: @responsiveHeaderDisplay;\n  }\n  .ui[class*=\"tablet stackable\"].table tfoot {\n    display: @responsiveFooterDisplay;\n  }\n  .ui[class*=\"tablet stackable\"].table tr {\n    padding-top: @responsiveRowVerticalPadding;\n    padding-bottom: @responsiveRowVerticalPadding;\n    box-shadow: @responsiveRowBoxShadow;\n  }\n  .ui[class*=\"tablet stackable\"].table tr > th,\n  .ui[class*=\"tablet stackable\"].table tr > td {\n    background: none;\n    border: none !important;\n    padding: @responsiveCellVerticalPadding @responsiveCellHorizontalPadding;\n    box-shadow: @responsiveCellBoxShadow;\n  }\n\n  /* Definition Table */\n  .ui.definition[class*=\"tablet stackable\"].table thead th:first-child {\n    box-shadow: none !important;\n  }\n}\n\n/*--------------\n Text Alignment\n---------------*/\n\n.ui.table[class*=\"left aligned\"],\n.ui.table [class*=\"left aligned\"] {\n  text-align: left;\n}\n.ui.table[class*=\"center aligned\"],\n.ui.table [class*=\"center aligned\"] {\n  text-align: center;\n}\n.ui.table[class*=\"right aligned\"],\n.ui.table [class*=\"right aligned\"] {\n  text-align: right;\n}\n\n/*------------------\n Vertical Alignment\n------------------*/\n\n.ui.table[class*=\"top aligned\"],\n.ui.table [class*=\"top aligned\"] {\n  vertical-align: top;\n}\n.ui.table[class*=\"middle aligned\"],\n.ui.table [class*=\"middle aligned\"] {\n  vertical-align: middle;\n}\n.ui.table[class*=\"bottom aligned\"],\n.ui.table [class*=\"bottom aligned\"] {\n  vertical-align: bottom;\n}\n\n/*--------------\n    Collapsing\n---------------*/\n\n.ui.table th.collapsing,\n.ui.table td.collapsing {\n  width: 1px;\n  white-space: nowrap;\n}\n\n/*--------------\n     Fixed\n---------------*/\n\n.ui.fixed.table {\n  table-layout: fixed;\n}\n\n.ui.fixed.table th,\n.ui.fixed.table td {\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n\n\n/*--------------\n   Selectable\n---------------*/\n\n.ui.selectable.table tbody tr:hover,\n.ui.table tbody tr td.selectable:hover {\n  background: @selectableBackground !important;\n  color: @selectableTextColor !important;\n}\n.ui.selectable.inverted.table tbody tr:hover,\n.ui.inverted.table tbody tr td.selectable:hover {\n  background: @selectableInvertedBackground !important;\n  color: @selectableInvertedTextColor !important;\n}\n\n/* Selectable Cell Link */\n.ui.table tbody tr td.selectable {\n  padding: 0em;\n}\n.ui.table tbody tr td.selectable > a:not(.ui) {\n  display: block;\n  color: inherit;\n  padding: @cellVerticalPadding @cellHorizontalPadding;\n}\n\n/* Other States */\n.ui.selectable.table tr.error:hover,\n.ui.table tr td.selectable.error:hover,\n.ui.selectable.table tr:hover td.error {\n  background: @errorBackgroundHover !important;\n  color: @errorColorHover !important;\n}\n.ui.selectable.table tr.warning:hover,\n.ui.table tr td.selectable.warning:hover,\n.ui.selectable.table tr:hover td.warning {\n  background: @warningBackgroundHover !important;\n  color: @warningColorHover !important;\n}\n.ui.selectable.table tr.active:hover,\n.ui.table tr td.selectable.active:hover,\n.ui.selectable.table tr:hover td.active {\n  background: @activeBackgroundColor !important;\n  color: @activeColor !important;\n}\n.ui.selectable.table tr.positive:hover,\n.ui.table tr td.selectable.positive:hover,\n.ui.selectable.table tr:hover td.positive {\n  background: @positiveBackgroundHover !important;\n  color: @positiveColorHover !important;\n}\n.ui.selectable.table tr.negative:hover,\n.ui.table tr td.selectable.negative:hover,\n.ui.selectable.table tr:hover td.negative {\n  background: @negativeBackgroundHover !important;\n  color: @negativeColorHover !important;\n}\n\n\n\n/*-------------------\n      Attached\n--------------------*/\n\n/* Middle */\n.ui.attached.table {\n  top: 0px;\n  bottom: 0px;\n  border-radius: 0px;\n  margin: 0em @attachedHorizontalOffset;\n  width: @attachedWidth;\n  max-width: @attachedWidth;\n  box-shadow: @attachedBoxShadow;\n  border: @attachedBorder;\n}\n.ui.attached + .ui.attached.table:not(.top) {\n  border-top: none;\n}\n\n/* Top */\n.ui[class*=\"top attached\"].table {\n  bottom: 0px;\n  margin-bottom: 0em;\n  top: @attachedTopOffset;\n  margin-top: @verticalMargin;\n  border-radius: @borderRadius @borderRadius 0em 0em;\n}\n.ui.table[class*=\"top attached\"]:first-child {\n  margin-top: 0em;\n}\n\n/* Bottom */\n.ui[class*=\"bottom attached\"].table {\n  bottom: 0px;\n  margin-top: 0em;\n  top: @attachedBottomOffset;\n  margin-bottom: @verticalMargin;\n  box-shadow: @attachedBottomBoxShadow;\n  border-radius: 0em 0em @borderRadius @borderRadius;\n}\n.ui[class*=\"bottom attached\"].table:last-child {\n  margin-bottom: 0em;\n}\n\n/*--------------\n     Striped\n---------------*/\n\n/* Table Striping */\n.ui.striped.table > tr:nth-child(2n),\n.ui.striped.table tbody tr:nth-child(2n) {\n  background-color: @stripedBackground;\n}\n\n/* Stripes */\n.ui.inverted.striped.table > tr:nth-child(2n),\n.ui.inverted.striped.table tbody tr:nth-child(2n) {\n  background-color: @invertedStripedBackground;\n}\n\n/* Allow striped active hover */\n.ui.striped.selectable.selectable.selectable.table tbody tr.active:hover {\n  background: @activeBackgroundHover !important;\n  color: @activeColorHover !important;\n}\n\n/*--------------\n   Single Line\n---------------*/\n\n.ui.table[class*=\"single line\"],\n.ui.table [class*=\"single line\"] {\n  white-space: nowrap;\n}\n.ui.table[class*=\"single line\"],\n.ui.table [class*=\"single line\"] {\n  white-space: nowrap;\n}\n\n/*-------------------\n       Colors\n--------------------*/\n\n/* Red */\n.ui.red.table {\n  border-top: @coloredBorderSize solid @red;\n}\n.ui.inverted.red.table {\n  background-color: @red !important;\n  color: @white !important;\n}\n\n/* Orange */\n.ui.orange.table {\n  border-top: @coloredBorderSize solid @orange;\n}\n.ui.inverted.orange.table {\n  background-color: @orange !important;\n  color: @white !important;\n}\n\n/* Yellow */\n.ui.yellow.table {\n  border-top: @coloredBorderSize solid @yellow;\n}\n.ui.inverted.yellow.table {\n  background-color: @yellow !important;\n  color: @white !important;\n}\n\n/* Olive */\n.ui.olive.table {\n  border-top: @coloredBorderSize solid @olive;\n}\n.ui.inverted.olive.table {\n  background-color: @olive !important;\n  color: @white !important;\n}\n\n/* Green */\n.ui.green.table {\n  border-top: @coloredBorderSize solid @green;\n}\n.ui.inverted.green.table {\n  background-color: @green !important;\n  color: @white !important;\n}\n\n/* Teal */\n.ui.teal.table {\n  border-top: @coloredBorderSize solid @teal;\n}\n.ui.inverted.teal.table {\n  background-color: @teal !important;\n  color: @white !important;\n}\n\n/* Blue */\n.ui.blue.table {\n  border-top: @coloredBorderSize solid @blue;\n}\n.ui.inverted.blue.table {\n  background-color: @blue !important;\n  color: @white !important;\n}\n\n/* Violet */\n.ui.violet.table {\n  border-top: @coloredBorderSize solid @violet;\n}\n.ui.inverted.violet.table {\n  background-color: @violet !important;\n  color: @white !important;\n}\n\n/* Purple */\n.ui.purple.table {\n  border-top: @coloredBorderSize solid @purple;\n}\n.ui.inverted.purple.table {\n  background-color: @purple !important;\n  color: @white !important;\n}\n\n/* Pink */\n.ui.pink.table {\n  border-top: @coloredBorderSize solid @pink;\n}\n.ui.inverted.pink.table {\n  background-color: @pink !important;\n  color: @white !important;\n}\n\n/* Brown */\n.ui.brown.table {\n  border-top: @coloredBorderSize solid @brown;\n}\n.ui.inverted.brown.table {\n  background-color: @brown !important;\n  color: @white !important;\n}\n\n/* Grey */\n.ui.grey.table {\n  border-top: @coloredBorderSize solid @grey;\n}\n.ui.inverted.grey.table {\n  background-color: @grey !important;\n  color: @white !important;\n}\n\n/* Black */\n.ui.black.table {\n  border-top: @coloredBorderSize solid @black;\n}\n.ui.inverted.black.table {\n  background-color: @black !important;\n  color: @white !important;\n}\n\n\n/*--------------\n  Column Count\n---------------*/\n\n/* Grid Based */\n.ui.one.column.table td {\n  width: @oneColumn;\n}\n.ui.two.column.table td {\n  width: @twoColumn;\n}\n.ui.three.column.table td {\n  width: @threeColumn;\n}\n.ui.four.column.table td {\n  width: @fourColumn;\n}\n.ui.five.column.table td {\n  width: @fiveColumn;\n}\n.ui.six.column.table td {\n  width: @sixColumn;\n}\n.ui.seven.column.table td {\n  width: @sevenColumn;\n}\n.ui.eight.column.table td {\n  width: @eightColumn;\n}\n.ui.nine.column.table td {\n  width: @nineColumn;\n}\n.ui.ten.column.table td {\n  width: @tenColumn;\n}\n.ui.eleven.column.table td {\n  width: @elevenColumn;\n}\n.ui.twelve.column.table td {\n  width: @twelveColumn;\n}\n.ui.thirteen.column.table td {\n  width: @thirteenColumn;\n}\n.ui.fourteen.column.table td {\n  width: @fourteenColumn;\n}\n.ui.fifteen.column.table td {\n  width: @fifteenColumn;\n}\n.ui.sixteen.column.table td {\n  width: @sixteenColumn;\n}\n\n/* Column Width */\n.ui.table th.one.wide,\n.ui.table td.one.wide {\n  width: @oneWide;\n}\n.ui.table th.two.wide,\n.ui.table td.two.wide {\n  width: @twoWide;\n}\n.ui.table th.three.wide,\n.ui.table td.three.wide {\n  width: @threeWide;\n}\n.ui.table th.four.wide,\n.ui.table td.four.wide {\n  width: @fourWide;\n}\n.ui.table th.five.wide,\n.ui.table td.five.wide {\n  width: @fiveWide;\n}\n.ui.table th.six.wide,\n.ui.table td.six.wide {\n  width: @sixWide;\n}\n.ui.table th.seven.wide,\n.ui.table td.seven.wide {\n  width: @sevenWide;\n}\n.ui.table th.eight.wide,\n.ui.table td.eight.wide {\n  width: @eightWide;\n}\n.ui.table th.nine.wide,\n.ui.table td.nine.wide {\n  width: @nineWide;\n}\n.ui.table th.ten.wide,\n.ui.table td.ten.wide {\n  width: @tenWide;\n}\n.ui.table th.eleven.wide,\n.ui.table td.eleven.wide {\n  width: @elevenWide;\n}\n.ui.table th.twelve.wide,\n.ui.table td.twelve.wide {\n  width: @twelveWide;\n}\n.ui.table th.thirteen.wide,\n.ui.table td.thirteen.wide {\n  width: @thirteenWide;\n}\n.ui.table th.fourteen.wide,\n.ui.table td.fourteen.wide {\n  width: @fourteenWide;\n}\n.ui.table th.fifteen.wide,\n.ui.table td.fifteen.wide {\n  width: @fifteenWide;\n}\n.ui.table th.sixteen.wide,\n.ui.table td.sixteen.wide {\n  width: @sixteenWide;\n}\n\n/*--------------\n    Sortable\n---------------*/\n\n.ui.sortable.table thead th {\n  cursor: pointer;\n  white-space: nowrap;\n  border-left: @sortableBorder;\n  color: @sortableColor;\n}\n.ui.sortable.table thead th:first-child {\n  border-left: none;\n}\n.ui.sortable.table thead th.sorted,\n.ui.sortable.table thead th.sorted:hover {\n  user-select: none;\n}\n\n.ui.sortable.table thead th:after {\n  display: none;\n  font-style: normal;\n  font-weight: @normal;\n  text-decoration: inherit;\n  content: '';\n  height: 1em;\n  width: @sortableIconWidth;\n  opacity: @sortableIconOpacity;\n  margin: 0em 0em 0em @sortableIconDistance;\n  font-family: @sortableIconFont;\n}\n.ui.sortable.table thead th.ascending:after {\n  content: @sortableIconAscending;\n}\n.ui.sortable.table thead th.descending:after {\n  content: @sortableIconDescending;\n}\n\n/* Hover */\n.ui.sortable.table th.disabled:hover {\n  cursor: auto;\n  color: @sortableDisabledColor;\n}\n.ui.sortable.table thead th:hover {\n  background: @sortableHoverBackground;\n  color: @sortableHoverColor;\n}\n\n/* Sorted */\n.ui.sortable.table thead th.sorted {\n  background: @sortableActiveBackground;\n  color: @sortableActiveColor;\n}\n.ui.sortable.table thead th.sorted:after {\n  display: inline-block;\n}\n\n/* Sorted Hover */\n.ui.sortable.table thead th.sorted:hover {\n  background: @sortableActiveHoverBackground;\n  color: @sortableActiveHoverColor;\n}\n\n/* Inverted */\n.ui.inverted.sortable.table thead th.sorted {\n  background: @sortableInvertedActiveBackground;\n  color: @sortableInvertedActiveColor;\n}\n.ui.inverted.sortable.table thead th:hover {\n  background: @sortableInvertedHoverBackground;\n  color: @sortableInvertedHoverColor;\n}\n.ui.inverted.sortable.table thead th {\n  border-left-color: @sortableInvertedBorderColor;\n  border-right-color: @sortableInvertedBorderColor;\n}\n\n\n/*--------------\n    Inverted\n---------------*/\n\n/* Text Color */\n.ui.inverted.table {\n  background: @invertedBackground;\n  color: @invertedCellColor;\n  border: @invertedBorder;\n}\n.ui.inverted.table th {\n  background-color: @invertedHeaderBackground;\n  border-color: @invertedHeaderBorderColor !important;\n  color: @invertedHeaderColor !important;\n}\n.ui.inverted.table tr td {\n  border-color: @invertedCellBorderColor !important;\n}\n\n.ui.inverted.table tr.disabled td,\n.ui.inverted.table tr td.disabled,\n.ui.inverted.table tr.disabled:hover td,\n.ui.inverted.table tr:hover td.disabled {\n  pointer-events: none;\n  color: @invertedDisabledTextColor;\n}\n\n/* Definition */\n.ui.inverted.definition.table tfoot:not(.full-width) th:first-child,\n.ui.inverted.definition.table thead:not(.full-width) th:first-child {\n  background: @definitionPageBackground;\n}\n.ui.inverted.definition.table tr td:first-child {\n  background: @invertedDefinitionColumnBackground;\n  color: @invertedDefinitionColumnColor;\n}\n\n/*--------------\n   Collapsing\n---------------*/\n\n.ui.collapsing.table {\n  width: auto;\n}\n\n/*--------------\n      Basic\n---------------*/\n\n.ui.basic.table {\n  background: @basicTableBackground;\n  border: @basicTableBorder;\n  box-shadow: @basicBoxShadow;\n}\n.ui.basic.table thead,\n.ui.basic.table tfoot {\n  box-shadow: none;\n}\n.ui.basic.table th {\n  background: @basicTableHeaderBackground;\n  border-left: @basicTableHeaderDivider;\n}\n.ui.basic.table tbody tr {\n  border-bottom: @basicTableCellBorder;\n}\n.ui.basic.table td {\n  background: @basicTableCellBackground;\n}\n.ui.basic.striped.table tbody tr:nth-child(2n) {\n  background-color: @basicTableStripedBackground !important;\n}\n\n/* Very Basic */\n.ui[class*=\"very basic\"].table {\n  border: none;\n}\n.ui[class*=\"very basic\"].table:not(.sortable):not(.striped) th,\n.ui[class*=\"very basic\"].table:not(.sortable):not(.striped) td {\n  padding: @basicTableCellPadding;\n}\n.ui[class*=\"very basic\"].table:not(.sortable):not(.striped) th:first-child,\n.ui[class*=\"very basic\"].table:not(.sortable):not(.striped) td:first-child {\n  padding-left: 0em;\n}\n.ui[class*=\"very basic\"].table:not(.sortable):not(.striped) th:last-child,\n.ui[class*=\"very basic\"].table:not(.sortable):not(.striped) td:last-child {\n  padding-right: 0em;\n}\n.ui[class*=\"very basic\"].table:not(.sortable):not(.striped) thead tr:first-child th {\n  padding-top: 0em;\n}\n\n/*--------------\n     Celled\n---------------*/\n\n.ui.celled.table tr th,\n.ui.celled.table tr td {\n  border-left: @cellBorder;\n}\n.ui.celled.table tr th:first-child,\n.ui.celled.table tr td:first-child {\n  border-left: none;\n}\n\n/*--------------\n     Padded\n---------------*/\n\n.ui.padded.table th {\n  padding-left: @paddedHorizontalPadding;\n  padding-right: @paddedHorizontalPadding;\n}\n.ui.padded.table th,\n.ui.padded.table td {\n  padding: @paddedVerticalPadding @paddedHorizontalPadding;\n}\n\n/* Very */\n.ui[class*=\"very padded\"].table th {\n  padding-left: @veryPaddedHorizontalPadding;\n  padding-right: @veryPaddedHorizontalPadding;\n}\n.ui[class*=\"very padded\"].table td {\n  padding: @veryPaddedVerticalPadding @veryPaddedHorizontalPadding;\n}\n\n/*--------------\n     Compact\n---------------*/\n\n.ui.compact.table th {\n  padding-left: @compactHorizontalPadding;\n  padding-right: @compactHorizontalPadding;\n}\n.ui.compact.table td {\n  padding: @compactVerticalPadding @compactHorizontalPadding;\n}\n\n/* Very */\n.ui[class*=\"very compact\"].table th {\n  padding-left: @veryCompactHorizontalPadding;\n  padding-right: @veryCompactHorizontalPadding;\n}\n.ui[class*=\"very compact\"].table td {\n  padding: @veryCompactVerticalPadding @veryCompactHorizontalPadding;\n}\n\n/*--------------\n      Sizes\n---------------*/\n\n/* Small */\n.ui.small.table {\n  font-size: @small;\n}\n\n/* Standard */\n.ui.table {\n  font-size: @medium;\n}\n\n/* Large */\n.ui.large.table {\n  font-size: @large;\n}\n\n.loadUIOverrides();\n"
  },
  {
    "path": "semantic/src/definitions/elements/button.less",
    "content": "/*!\n * # Semantic UI - Button\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n/*******************************\n            Theme\n*******************************/\n\n@type    : 'element';\n@element : 'button';\n\n@import (multiple) '../../theme.config';\n\n/*******************************\n            Button\n*******************************/\n\n.ui.button {\n  cursor: pointer;\n  display: inline-block;\n\n  min-height: 1em;\n\n  outline: none;\n  border: none;\n  vertical-align: @verticalAlign;\n  background: @background;\n  color: @textColor;\n\n  font-family: @fontFamily;\n\n  margin: 0em @horizontalMargin @verticalMargin 0em;\n  padding: @verticalPadding @horizontalPadding (@verticalPadding + @shadowOffset);\n\n  text-transform: @textTransform;\n  text-shadow: @textShadow;\n  font-weight: @fontWeight;\n  line-height: @lineHeight;\n  font-style: normal;\n  text-align: center;\n  text-decoration: none;\n\n  border-radius: @borderRadius;\n  box-shadow: @boxShadow;\n\n  user-select: none;\n  transition: @transition;\n  will-change: @willChange;\n\n  -webkit-tap-highlight-color: @tapColor;\n}\n\n\n/*******************************\n            States\n*******************************/\n\n/*--------------\n      Hover\n---------------*/\n\n.ui.button:hover {\n  background-color: @hoverBackgroundColor;\n  background-image: @hoverBackgroundImage;\n  box-shadow: @hoverBoxShadow;\n  color: @hoverColor;\n}\n\n.ui.button:hover .icon {\n  opacity: @iconHoverOpacity;\n}\n\n/*--------------\n      Focus\n---------------*/\n\n.ui.button:focus {\n  background-color: @focusBackgroundColor;\n  color: @focusColor;\n  background-image: @focusBackgroundImage !important;\n  box-shadow: @focusBoxShadow !important;\n}\n\n.ui.button:focus .icon {\n  opacity: @iconFocusOpacity;\n}\n\n/*--------------\n      Down\n---------------*/\n\n.ui.button:active,\n.ui.active.button:active {\n  background-color: @downBackgroundColor;\n  background-image: @downBackgroundImage;\n  color: @downColor;\n  box-shadow: @downBoxShadow;\n}\n\n/*--------------\n     Active\n---------------*/\n\n.ui.active.button {\n  background-color: @activeBackgroundColor;\n  background-image: @activeBackgroundImage;\n  box-shadow: @activeBoxShadow;\n  color: @activeColor;\n}\n.ui.active.button:hover {\n  background-color: @activeHoverBackgroundColor;\n  background-image: @activeHoverBackgroundImage;\n  color: @activeHoverColor;\n}\n.ui.active.button:active {\n  background-color: @activeBackgroundColor;\n  background-image: @activeBackgroundImage;\n}\n\n\n/*--------------\n    Loading\n---------------*/\n\n/* Specificity hack */\n.ui.loading.loading.loading.loading.loading.loading.button {\n  position: relative;\n  cursor: default;\n  text-shadow: none !important;\n  color: transparent !important;\n  opacity: @loadingOpacity;\n  pointer-events: @loadingPointerEvents;\n  transition: @loadingTransition;\n}\n.ui.loading.button:before {\n  position: absolute;\n  content: '';\n  top: 50%;\n  left: 50%;\n\n  margin: @loaderMargin;\n  width: @loaderSize;\n  height: @loaderSize;\n\n  border-radius: @circularRadius;\n  border: @loaderLineWidth solid @invertedLoaderFillColor;\n}\n.ui.loading.button:after {\n  position: absolute;\n  content: '';\n  top: 50%;\n  left: 50%;\n\n  margin: @loaderMargin;\n  width: @loaderSize;\n  height: @loaderSize;\n\n  animation: button-spin @loaderSpeed linear;\n  animation-iteration-count: infinite;\n\n  border-radius: @circularRadius;\n\n  border-color: @invertedLoaderLineColor transparent transparent;\n  border-style: solid;\n  border-width: @loaderLineWidth;\n\n  box-shadow: 0px 0px 0px 1px transparent;\n}\n.ui.labeled.icon.loading.button .icon {\n  background-color: transparent;\n  box-shadow: none;\n}\n\n@keyframes button-spin {\n  from {\n    transform: rotate(0deg);\n  }\n  to {\n    transform: rotate(360deg);\n  }\n}\n\n.ui.basic.loading.button:not(.inverted):before {\n  border-color: @loaderFillColor;\n}\n.ui.basic.loading.button:not(.inverted):after {\n  border-top-color: @loaderLineColor;\n}\n\n/*-------------------\n      Disabled\n--------------------*/\n\n.ui.buttons .disabled.button,\n.ui.disabled.button,\n.ui.button:disabled,\n.ui.disabled.button:hover,\n.ui.disabled.active.button {\n  cursor: default;\n  opacity: @disabledOpacity !important;\n  background-image: none !important;\n  box-shadow: none !important;\n  pointer-events: none !important;\n}\n\n/* Basic Group With Disabled */\n.ui.basic.buttons .ui.disabled.button {\n  border-color: @disabledBorderColor;\n}\n\n/*******************************\n             Types\n*******************************/\n\n/*-------------------\n       Animated\n--------------------*/\n\n.ui.animated.button {\n  position: relative;\n  overflow: hidden;\n  padding-right: 0em !important;\n  vertical-align: @animatedVerticalAlign;\n  z-index: @animatedZIndex;\n}\n\n.ui.animated.button .content {\n  will-change: transform, opacity;\n}\n.ui.animated.button .visible.content {\n  position: relative;\n  margin-right: @horizontalPadding;\n}\n.ui.animated.button .hidden.content {\n  position: absolute;\n  width: 100%;\n}\n\n/* Horizontal */\n.ui.animated.button .visible.content,\n.ui.animated.button .hidden.content {\n  transition: right @animationDuration @animationEasing 0s;\n}\n.ui.animated.button .visible.content {\n  left: auto;\n  right: 0%;\n}\n.ui.animated.button .hidden.content {\n  top: 50%;\n  left: auto;\n  right: -100%;\n  margin-top: -(@lineHeight / 2);\n}\n.ui.animated.button:focus .visible.content,\n.ui.animated.button:hover .visible.content {\n  left: auto;\n  right: 200%;\n}\n.ui.animated.button:focus .hidden.content,\n.ui.animated.button:hover .hidden.content {\n  left: auto;\n  right: 0%;\n}\n\n/* Vertical */\n.ui.vertical.animated.button .visible.content,\n.ui.vertical.animated.button .hidden.content {\n  transition: top @animationDuration @animationEasing, transform @animationDuration @animationEasing;\n}\n.ui.vertical.animated.button .visible.content {\n  transform: translateY(0%);\n  right: auto;\n}\n.ui.vertical.animated.button .hidden.content {\n  top: -50%;\n  left: 0%;\n  right: auto;\n}\n.ui.vertical.animated.button:focus .visible.content,\n.ui.vertical.animated.button:hover .visible.content {\n  transform: translateY(200%);\n  right: auto;\n}\n.ui.vertical.animated.button:focus .hidden.content,\n.ui.vertical.animated.button:hover .hidden.content {\n  top: 50%;\n  right: auto;\n}\n\n/* Fade */\n.ui.fade.animated.button .visible.content,\n.ui.fade.animated.button .hidden.content {\n  transition: opacity @animationDuration @animationEasing, transform @animationDuration @animationEasing;\n}\n.ui.fade.animated.button .visible.content {\n  left: auto;\n  right: auto;\n  opacity: 1;\n  transform: scale(1);\n}\n.ui.fade.animated.button .hidden.content {\n  opacity: 0;\n  left: 0%;\n  right: auto;\n  transform: scale(@fadeScaleHigh);\n}\n.ui.fade.animated.button:focus .visible.content,\n.ui.fade.animated.button:hover .visible.content {\n  left: auto;\n  right: auto;\n  opacity: 0;\n  transform: scale(@fadeScaleLow);\n}\n.ui.fade.animated.button:focus .hidden.content,\n.ui.fade.animated.button:hover .hidden.content {\n  left: 0%;\n  right: auto;\n  opacity: 1;\n  transform: scale(1);\n}\n\n/*-------------------\n       Inverted\n--------------------*/\n\n.ui.inverted.button {\n  box-shadow: 0px 0px 0px @invertedBorderSize @white inset !important;\n  background: transparent none;\n  color: @white;\n  text-shadow: none !important;\n}\n\n/* Group */\n.ui.inverted.buttons .button {\n  margin: @invertedGroupButtonOffset;\n}\n.ui.inverted.buttons .button:first-child {\n  margin-left: 0em;\n}\n.ui.inverted.vertical.buttons .button {\n  margin: @invertedVerticalGroupButtonOffset;\n}\n.ui.inverted.vertical.buttons .button:first-child {\n  margin-top: 0em;\n}\n\n/* States */\n\n/* Hover */\n.ui.inverted.button:hover {\n  background: @white;\n  box-shadow: 0px 0px 0px @invertedBorderSize @white inset !important;\n  color: @hoverColor;\n}\n\n/* Active / Focus */\n.ui.inverted.button:focus,\n.ui.inverted.button.active {\n  background: @white;\n  box-shadow: 0px 0px 0px @invertedBorderSize @white inset !important;\n  color: @focusColor;\n}\n\n/* Active Focus */\n.ui.inverted.button.active:focus {\n  background: @midWhite;\n  box-shadow: 0px 0px 0px @invertedBorderSize @midWhite inset !important;\n  color: @focusColor;\n}\n\n\n/*-------------------\n    Labeled Button\n--------------------*/\n\n.ui.labeled.button:not(.icon) {\n  display: inline-flex;\n  flex-direction: row;\n  background: none !important;\n  padding: 0px !important;\n  border: none !important;\n  box-shadow: none !important;\n}\n\n.ui.labeled.button > .button {\n  margin: 0px;\n}\n.ui.labeled.button > .label {\n  display: flex;\n  align-items: @labeledLabelAlign;\n  margin: 0px 0px 0px @labeledLabelBorderOffset !important;\n  font-size: @labeledLabelFontSize;\n  padding: @labeledLabelPadding;\n  font-size: @labeledLabelFontSize;\n  border-color: @labeledLabelBorderColor;\n}\n\n/* Tag */\n.ui.labeled.button > .tag.label:before {\n  width: @labeledTagLabelSize;\n  height: @labeledTagLabelSize;\n}\n\n/* Right */\n.ui.labeled.button:not([class*=\"left labeled\"]) > .button {\n  border-top-right-radius: 0px;\n  border-bottom-right-radius: 0px;\n}\n.ui.labeled.button:not([class*=\"left labeled\"]) > .label {\n  border-top-left-radius: 0px;\n  border-bottom-left-radius: 0px;\n}\n\n/* Left Side */\n.ui[class*=\"left labeled\"].button > .button {\n  border-top-left-radius: 0px;\n  border-bottom-left-radius: 0px;\n}\n.ui[class*=\"left labeled\"].button > .label {\n  border-top-right-radius: 0px;\n  border-bottom-right-radius: 0px;\n}\n\n/*-------------------\n       Social\n--------------------*/\n\n/* Facebook */\n.ui.facebook.button {\n  background-color: @facebookColor;\n  color: @invertedTextColor;\n  text-shadow: @invertedTextShadow;\n  background-image: @coloredBackgroundImage;\n  box-shadow: @coloredBoxShadow;\n}\n.ui.facebook.button:hover {\n  background-color: @facebookHoverColor;\n  color: @invertedTextColor;\n  text-shadow: @invertedTextShadow;\n}\n.ui.facebook.button:active {\n  background-color: @facebookDownColor;\n  color: @invertedTextColor;\n  text-shadow: @invertedTextShadow;\n}\n\n/* Twitter */\n.ui.twitter.button {\n  background-color: @twitterColor;\n  color: @invertedTextColor;\n  text-shadow: @invertedTextShadow;\n  background-image: @coloredBackgroundImage;\n  box-shadow: @coloredBoxShadow;\n}\n.ui.twitter.button:hover {\n  background-color: @twitterHoverColor;\n  color: @invertedTextColor;\n  text-shadow: @invertedTextShadow;\n}\n.ui.twitter.button:active {\n  background-color: @twitterDownColor;\n  color: @invertedTextColor;\n  text-shadow: @invertedTextShadow;\n}\n\n/* Google Plus */\n.ui.google.plus.button {\n  background-color: @googlePlusColor;\n  color: @invertedTextColor;\n  text-shadow: @invertedTextShadow;\n  background-image: @coloredBackgroundImage;\n  box-shadow: @coloredBoxShadow;\n}\n.ui.google.plus.button:hover {\n  background-color: @googlePlusHoverColor;\n  color: @invertedTextColor;\n  text-shadow: @invertedTextShadow;\n}\n.ui.google.plus.button:active {\n  background-color: @googlePlusDownColor;\n  color: @invertedTextColor;\n  text-shadow: @invertedTextShadow;\n}\n\n/* Linked In */\n.ui.linkedin.button {\n  background-color: @linkedInColor;\n  color: @invertedTextColor;\n  text-shadow: @invertedTextShadow;\n}\n.ui.linkedin.button:hover {\n  background-color: @linkedInHoverColor;\n  color: @invertedTextColor;\n  text-shadow: @invertedTextShadow;\n}\n.ui.linkedin.button:active {\n  background-color: @linkedInDownColor;\n  color: @invertedTextColor;\n  text-shadow: @invertedTextShadow;\n}\n\n/* YouTube */\n.ui.youtube.button {\n  background-color: @youtubeColor;\n  color: @invertedTextColor;\n  text-shadow: @invertedTextShadow;\n  background-image: @coloredBackgroundImage;\n  box-shadow: @coloredBoxShadow;\n}\n.ui.youtube.button:hover {\n  background-color: @youtubeHoverColor;\n  color: @invertedTextColor;\n  text-shadow: @invertedTextShadow;\n}\n.ui.youtube.button:active {\n  background-color: @youtubeDownColor;\n  color: @invertedTextColor;\n  text-shadow: @invertedTextShadow;\n}\n\n/* Instagram */\n.ui.instagram.button {\n  background-color: @instagramColor;\n  color: @invertedTextColor;\n  text-shadow: @invertedTextShadow;\n  background-image: @coloredBackgroundImage;\n  box-shadow: @coloredBoxShadow;\n}\n.ui.instagram.button:hover {\n  background-color: @instagramHoverColor;\n  color: @invertedTextColor;\n  text-shadow: @invertedTextShadow;\n}\n.ui.instagram.button:active {\n  background-color: @instagramDownColor;\n  color: @invertedTextColor;\n  text-shadow: @invertedTextShadow;\n}\n\n/* Pinterest */\n.ui.pinterest.button {\n  background-color: @pinterestColor;\n  color: @invertedTextColor;\n  text-shadow: @invertedTextShadow;\n  background-image: @coloredBackgroundImage;\n  box-shadow: @coloredBoxShadow;\n}\n.ui.pinterest.button:hover {\n  background-color: @pinterestHoverColor;\n  color: @invertedTextColor;\n  text-shadow: @invertedTextShadow;\n}\n.ui.pinterest.button:active {\n  background-color: @pinterestDownColor;\n  color: @invertedTextColor;\n  text-shadow: @invertedTextShadow;\n}\n\n/* VK */\n.ui.vk.button {\n  background-color: #4D7198;\n  color: @white;\n  background-image: @coloredBackgroundImage;\n  box-shadow: @coloredBoxShadow;\n}\n.ui.vk.button:hover {\n  background-color: @vkHoverColor;\n  color: @white;\n}\n.ui.vk.button:active {\n  background-color: @vkDownColor;\n  color: @white;\n}\n\n/*--------------\n     Icon\n---------------*/\n\n.ui.button > .icon:not(.button) {\n  height: @iconHeight;\n  opacity: @iconOpacity;\n  margin: @iconMargin;\n  transition: @iconTransition;\n  vertical-align: @iconVerticalAlign;\n  color: @iconColor;\n}\n\n.ui.button:not(.icon) > .icon:not(.button):not(.dropdown) {\n  margin: @iconMargin;\n}\n.ui.button:not(.icon) > .right.icon:not(.button):not(.dropdown) {\n  margin: @rightIconMargin;\n}\n\n/*******************************\n           Variations\n*******************************/\n\n\n/*-------------------\n       Floated\n--------------------*/\n\n.ui[class*=\"left floated\"].buttons,\n.ui[class*=\"left floated\"].button {\n  float: left;\n  margin-left: 0em;\n  margin-right: @floatedMargin;\n}\n.ui[class*=\"right floated\"].buttons,\n.ui[class*=\"right floated\"].button {\n  float: right;\n  margin-right: 0em;\n  margin-left: @floatedMargin;\n}\n\n/*-------------------\n       Compact\n--------------------*/\n\n.ui.compact.buttons .button,\n.ui.compact.button {\n  padding: @compactVerticalPadding @compactHorizontalPadding ( @compactVerticalPadding + @shadowOffset );\n}\n.ui.compact.icon.buttons .button,\n.ui.compact.icon.button {\n  padding: @compactVerticalPadding @compactVerticalPadding ( @compactVerticalPadding + @shadowOffset );\n}\n.ui.compact.labeled.icon.buttons .button,\n.ui.compact.labeled.icon.button {\n  padding: @compactVerticalPadding (@compactHorizontalPadding + @labeledIconWidth) ( @compactVerticalPadding + @shadowOffset );\n}\n\n/*-------------------\n        Sizes\n--------------------*/\n\n.ui.mini.buttons .button,\n.ui.mini.buttons .or,\n.ui.mini.button {\n  font-size: @mini;\n}\n.ui.tiny.buttons .button,\n.ui.tiny.buttons .or,\n.ui.tiny.button {\n  font-size: @tiny;\n}\n.ui.small.buttons .button,\n.ui.small.buttons .or,\n.ui.small.button {\n  font-size: @small;\n}\n.ui.buttons .button,\n.ui.buttons .or,\n.ui.button {\n  font-size: @medium;\n}\n.ui.large.buttons .button,\n.ui.large.buttons .or,\n.ui.large.button {\n  font-size: @large;\n}\n.ui.big.buttons .button,\n.ui.big.buttons .or,\n.ui.big.button {\n  font-size: @big;\n}\n.ui.huge.buttons .button,\n.ui.huge.buttons .or,\n.ui.huge.button {\n  font-size: @huge;\n}\n.ui.massive.buttons .button,\n.ui.massive.buttons .or,\n.ui.massive.button {\n  font-size: @massive;\n}\n\n/*--------------\n    Icon Only\n---------------*/\n\n.ui.icon.buttons .button,\n.ui.icon.button {\n  padding: @verticalPadding @verticalPadding ( @verticalPadding + @shadowOffset );\n}\n.ui.icon.buttons .button > .icon,\n.ui.icon.button > .icon {\n  opacity: @iconButtonOpacity;\n  margin: 0em !important;\n  vertical-align: top;\n}\n\n\n/*-------------------\n        Basic\n--------------------*/\n\n.ui.basic.buttons .button,\n.ui.basic.button {\n  background: @basicBackground !important;\n  color: @basicTextColor !important;\n  font-weight: @basicFontWeight;\n  border-radius: @basicBorderRadius;\n  text-transform: @basicTextTransform;\n  text-shadow: none !important;\n  box-shadow: @basicBoxShadow;\n}\n.ui.basic.buttons {\n  box-shadow: @basicGroupBoxShadow;\n  border: @basicGroupBorder;\n  border-radius: @borderRadius;\n}\n.ui.basic.buttons .button {\n  border-radius: 0em;\n}\n\n.ui.basic.buttons .button:hover,\n.ui.basic.button:hover {\n  background: @basicHoverBackground !important;\n  color: @basicHoverTextColor !important;\n  box-shadow: @basicHoverBoxShadow;\n}\n.ui.basic.buttons .button:focus,\n.ui.basic.button:focus {\n  background: @basicFocusBackground !important;\n  color: @basicFocusTextColor !important;\n  box-shadow: @basicFocusBoxShadow;\n}\n.ui.basic.buttons .button:active,\n.ui.basic.button:active {\n  background: @basicDownBackground !important;\n  color: @basicDownTextColor !important;\n  box-shadow: @basicDownBoxShadow;\n}\n.ui.basic.buttons .active.button,\n.ui.basic.active.button {\n  background: @basicActiveBackground !important;\n  box-shadow: @basicActiveBoxShadow !important;\n  color: @basicActiveTextColor !important;\n}\n.ui.basic.buttons .active.button:hover,\n.ui.basic.active.button:hover {\n  background-color: @transparentBlack;\n}\n\n/* Vertical */\n.ui.basic.buttons .button:hover {\n  box-shadow: @basicHoverBoxShadow inset;\n}\n.ui.basic.buttons .button:active {\n  box-shadow: @basicDownBoxShadow inset;\n}\n.ui.basic.buttons .active.button {\n  box-shadow: @basicActiveBoxShadow !important;\n}\n\n/* Standard Basic Inverted */\n.ui.basic.inverted.buttons .button,\n.ui.basic.inverted.button {\n  background-color: transparent !important;\n  color: @offWhite !important;\n  box-shadow: @basicInvertedBoxShadow !important;\n}\n.ui.basic.inverted.buttons .button:hover,\n.ui.basic.inverted.button:hover {\n  color: @white !important;\n  box-shadow: @basicInvertedHoverBoxShadow !important;\n}\n.ui.basic.inverted.buttons .button:focus,\n.ui.basic.inverted.button:focus {\n  color: @white !important;\n  box-shadow: @basicInvertedFocusBoxShadow !important;\n}\n.ui.basic.inverted.buttons .button:active,\n.ui.basic.inverted.button:active {\n  background-color: @transparentWhite !important;\n  color: @white !important;\n  box-shadow: @basicInvertedDownBoxShadow !important;\n}\n.ui.basic.inverted.buttons .active.button,\n.ui.basic.inverted.active.button {\n  background-color: @transparentWhite;\n  color: @invertedTextColor;\n  text-shadow: @invertedTextShadow;\n  box-shadow: @basicInvertedActiveBoxShadow;\n}\n.ui.basic.inverted.buttons .active.button:hover,\n.ui.basic.inverted.active.button:hover {\n  background-color: @strongTransparentWhite;\n  box-shadow: @basicInvertedHoverBoxShadow !important;\n}\n\n\n/* Basic Group */\n.ui.basic.buttons .button {\n  border-left: @basicGroupBorder;\n  box-shadow: none;\n}\n.ui.basic.vertical.buttons .button {\n  border-left: none;\n}\n.ui.basic.vertical.buttons .button {\n  border-left-width: 0px;\n  border-top: @basicGroupBorder;\n}\n.ui.basic.vertical.buttons .button:first-child {\n  border-top-width: 0px;\n}\n\n\n\n/*--------------\n  Labeled Icon\n---------------*/\n\n.ui.labeled.icon.buttons .button,\n.ui.labeled.icon.button {\n  position: relative;\n  padding-left: @labeledIconPadding !important;\n  padding-right: @horizontalPadding !important;\n}\n\n/* Left Labeled */\n.ui.labeled.icon.buttons > .button > .icon,\n.ui.labeled.icon.button > .icon {\n  position: absolute;\n  height: 100%;\n  line-height: 1;\n  border-radius: 0px;\n  border-top-left-radius: inherit;\n  border-bottom-left-radius: inherit;\n  text-align: center;\n\n  margin: @labeledIconMargin;\n  width: @labeledIconWidth;\n  background-color: @labeledIconBackgroundColor;\n  color: @labeledIconColor;\n  box-shadow: @labeledIconLeftShadow;\n}\n\n/* Left Labeled */\n.ui.labeled.icon.buttons > .button > .icon,\n.ui.labeled.icon.button > .icon {\n  top: 0em;\n  left: 0em;\n}\n\n/* Right Labeled */\n.ui[class*=\"right labeled\"].icon.button {\n  padding-right: @labeledIconPadding !important;\n  padding-left: @horizontalPadding !important;\n}\n.ui[class*=\"right labeled\"].icon.button > .icon {\n  left: auto;\n  right: 0em;\n  border-radius: 0px;\n  border-top-right-radius: inherit;\n  border-bottom-right-radius: inherit;\n  box-shadow: @labeledIconRightShadow;\n}\n\n\n.ui.labeled.icon.buttons > .button > .icon:before,\n.ui.labeled.icon.button > .icon:before,\n.ui.labeled.icon.buttons > .button > .icon:after,\n.ui.labeled.icon.button > .icon:after {\n  display: block;\n  position: absolute;\n  width: 100%;\n  top: 50%;\n  text-align: center;\n  transform: translateY(-50%);\n}\n\n.ui.labeled.icon.buttons .button > .icon {\n  border-radius: 0em;\n}\n.ui.labeled.icon.buttons .button:first-child > .icon {\n  border-top-left-radius: @borderRadius;\n  border-bottom-left-radius: @borderRadius;\n}\n.ui.labeled.icon.buttons .button:last-child > .icon {\n  border-top-right-radius: @borderRadius;\n  border-bottom-right-radius: @borderRadius;\n}\n.ui.vertical.labeled.icon.buttons .button:first-child > .icon {\n  border-radius: 0em;\n  border-top-left-radius: @borderRadius;\n}\n.ui.vertical.labeled.icon.buttons .button:last-child > .icon {\n  border-radius: 0em;\n  border-bottom-left-radius: @borderRadius;\n}\n\n/* Fluid Labeled */\n.ui.fluid[class*=\"left labeled\"].icon.button,\n.ui.fluid[class*=\"right labeled\"].icon.button {\n  padding-left: @horizontalPadding !important;\n  padding-right: @horizontalPadding !important;\n}\n\n\n\n\n/*--------------\n     Toggle\n---------------*/\n\n/* Toggle (Modifies active state to give affordances) */\n.ui.toggle.buttons .active.button,\n.ui.buttons .button.toggle.active,\n.ui.button.toggle.active {\n  background-color: @positiveColor !important;\n  box-shadow: none !important;\n  text-shadow: @invertedTextShadow;\n  color: @invertedTextColor !important;\n}\n.ui.button.toggle.active:hover {\n  background-color: @positiveColorHover !important;\n  text-shadow: @invertedTextShadow;\n  color: @invertedTextColor !important;\n}\n\n/*--------------\n    Circular\n---------------*/\n\n.ui.circular.button {\n  border-radius: 10em;\n}\n.ui.circular.button > .icon {\n  width: 1em;\n  vertical-align: baseline;\n}\n\n\n/*-------------------\n      Or Buttons\n--------------------*/\n\n.ui.buttons .or {\n  position: relative;\n  width: @orGap;\n  height: @orHeight;\n  z-index: @orZIndex;\n}\n.ui.buttons .or:before {\n  position: absolute;\n  text-align: center;\n  border-radius: @circularRadius;\n\n  content: @orText;\n  top: 50%;\n  left: 50%;\n  background-color: @orBackgroundColor;\n  text-shadow: @orTextShadow;\n\n  margin-top: @orVerticalOffset;\n  margin-left: @orHorizontalOffset;\n\n  width: @orCircleSize;\n  height: @orCircleSize;\n\n  line-height: @orLineHeight;\n  color: @orTextColor;\n\n  font-style: @orTextStyle;\n  font-weight: @orTextWeight;\n\n  box-shadow: @orBoxShadow;\n}\n.ui.buttons .or[data-text]:before {\n  content: attr(data-text);\n}\n\n/* Fluid Or */\n.ui.fluid.buttons .or {\n  width: 0em !important;\n}\n.ui.fluid.buttons .or:after {\n  display: none;\n}\n\n\n/*-------------------\n       Attached\n--------------------*/\n\n\n/* Singular */\n.ui.attached.button {\n  position: relative;\n  display: block;\n  margin: 0em;\n  border-radius: 0em;\n  box-shadow: @attachedBoxShadow !important;\n}\n\n/* Top / Bottom */\n.ui.attached.top.button {\n  border-radius: @borderRadius @borderRadius 0em 0em;\n}\n.ui.attached.bottom.button {\n  border-radius: 0em 0em @borderRadius @borderRadius;\n}\n\n/* Left / Right */\n.ui.left.attached.button {\n  display: inline-block;\n  border-left: none;\n  text-align: right;\n\n  padding-right: @attachedHorizontalPadding;\n  border-radius: @borderRadius 0em 0em @borderRadius;\n}\n.ui.right.attached.button {\n  display: inline-block;\n  text-align: left;\n  padding-left: @attachedHorizontalPadding;\n  border-radius: 0em @borderRadius @borderRadius 0em;\n}\n\n/* Plural */\n.ui.attached.buttons {\n  position: relative;\n  display: flex;\n  border-radius: 0em;\n  width: auto !important;\n  z-index: @attachedZIndex;\n  margin-left: @attachedOffset;\n  margin-right: @attachedOffset;\n}\n.ui.attached.buttons .button {\n  margin: 0em;\n}\n.ui.attached.buttons .button:first-child {\n  border-radius: 0em;\n}\n.ui.attached.buttons .button:last-child {\n  border-radius: 0em;\n}\n\n/* Top / Bottom */\n.ui[class*=\"top attached\"].buttons {\n  margin-bottom: @attachedOffset;\n  border-radius: @borderRadius @borderRadius 0em 0em;\n}\n.ui[class*=\"top attached\"].buttons .button:first-child {\n  border-radius: @borderRadius 0em 0em 0em;\n}\n.ui[class*=\"top attached\"].buttons .button:last-child {\n  border-radius: 0em @borderRadius 0em 0em;\n}\n\n.ui[class*=\"bottom attached\"].buttons {\n  margin-top: @attachedOffset;\n  border-radius: 0em 0em @borderRadius @borderRadius;\n}\n.ui[class*=\"bottom attached\"].buttons .button:first-child {\n  border-radius: 0em 0em 0em @borderRadius;\n}\n.ui[class*=\"bottom attached\"].buttons .button:last-child {\n  border-radius: 0em 0em @borderRadius 0em;\n}\n\n/* Left / Right */\n.ui[class*=\"left attached\"].buttons {\n  display: inline-flex;\n  margin-right: 0em;\n  margin-left: @attachedOffset;\n  border-radius: 0em @borderRadius @borderRadius 0em;\n}\n.ui[class*=\"left attached\"].buttons .button:first-child {\n  margin-left: @attachedOffset;\n  border-radius: 0em @borderRadius 0em 0em;\n}\n.ui[class*=\"left attached\"].buttons .button:last-child {\n  margin-left: @attachedOffset;\n  border-radius: 0em 0em @borderRadius 0em;\n}\n\n.ui[class*=\"right attached\"].buttons {\n  display: inline-flex;\n  margin-left: 0em;\n  margin-right: @attachedOffset;\n  border-radius: @borderRadius 0em 0em @borderRadius;\n}\n.ui[class*=\"right attached\"].buttons .button:first-child {\n  margin-left: @attachedOffset;\n  border-radius: @borderRadius 0em 0em 0em;\n}\n.ui[class*=\"right attached\"].buttons .button:last-child {\n  margin-left: @attachedOffset;\n  border-radius: 0em 0em 0em @borderRadius;\n}\n\n/*-------------------\n        Fluid\n--------------------*/\n\n.ui.fluid.buttons,\n.ui.fluid.button {\n  width: 100%;\n}\n.ui.fluid.button {\n  display: block;\n}\n\n.ui.two.buttons {\n  width: 100%;\n}\n.ui.two.buttons > .button {\n  width: 50%;\n}\n\n.ui.three.buttons {\n  width: 100%;\n}\n.ui.three.buttons > .button {\n  width: 33.333%;\n}\n\n.ui.four.buttons {\n  width: 100%;\n}\n.ui.four.buttons > .button {\n  width: 25%;\n}\n\n.ui.five.buttons {\n  width: 100%;\n}\n.ui.five.buttons > .button {\n  width: 20%;\n}\n\n.ui.six.buttons {\n  width: 100%;\n}\n.ui.six.buttons > .button {\n  width: 16.666%;\n}\n\n.ui.seven.buttons {\n  width: 100%;\n}\n.ui.seven.buttons > .button {\n  width: 14.285%;\n}\n\n.ui.eight.buttons {\n  width: 100%;\n}\n.ui.eight.buttons > .button {\n  width: 12.500%;\n}\n\n.ui.nine.buttons {\n  width: 100%;\n}\n.ui.nine.buttons > .button {\n  width: 11.11%;\n}\n\n.ui.ten.buttons {\n  width: 100%;\n}\n.ui.ten.buttons > .button {\n  width: 10%;\n}\n\n.ui.eleven.buttons {\n  width: 100%;\n}\n.ui.eleven.buttons > .button {\n  width: 9.09%;\n}\n\n.ui.twelve.buttons {\n  width: 100%;\n}\n.ui.twelve.buttons > .button {\n  width: 8.3333%;\n}\n\n/* Fluid Vertical Buttons */\n.ui.fluid.vertical.buttons,\n.ui.fluid.vertical.buttons > .button {\n  display: flex;\n  width: auto;\n}\n\n.ui.two.vertical.buttons > .button {\n  height: 50%;\n}\n.ui.three.vertical.buttons > .button {\n  height: 33.333%;\n}\n.ui.four.vertical.buttons > .button {\n  height: 25%;\n}\n.ui.five.vertical.buttons > .button {\n  height: 20%;\n}\n.ui.six.vertical.buttons > .button {\n  height: 16.666%;\n}\n.ui.seven.vertical.buttons > .button {\n  height: 14.285%;\n}\n.ui.eight.vertical.buttons > .button {\n  height: 12.500%;\n}\n.ui.nine.vertical.buttons > .button {\n  height: 11.11%;\n}\n.ui.ten.vertical.buttons > .button {\n  height: 10%;\n}\n.ui.eleven.vertical.buttons > .button {\n  height: 9.09%;\n}\n.ui.twelve.vertical.buttons > .button {\n  height: 8.3333%;\n}\n\n\n/*-------------------\n       Colors\n--------------------*/\n\n/*--- Black ---*/\n.ui.black.buttons .button,\n.ui.black.button {\n  background-color: @black;\n  color: @blackTextColor;\n  text-shadow: @blackTextShadow;\n  background-image: @coloredBackgroundImage;\n}\n.ui.black.button {\n  box-shadow: @coloredBoxShadow;\n}\n.ui.black.buttons .button:hover,\n.ui.black.button:hover {\n  background-color: @blackHover;\n  color: @blackTextColor;\n  text-shadow: @blackTextShadow;\n}\n.ui.black.buttons .button:focus,\n.ui.black.button:focus {\n  background-color: @blackFocus;\n  color: @blackTextColor;\n  text-shadow: @blackTextShadow;\n}\n.ui.black.buttons .button:active,\n.ui.black.button:active {\n  background-color: @blackDown;\n  color: @blackTextColor;\n  text-shadow: @blackTextShadow;\n}\n.ui.black.buttons .active.button,\n.ui.black.buttons .active.button:active,\n.ui.black.active.button,\n.ui.black.button .active.button:active {\n  background-color: @blackActive;\n  color: @blackTextColor;\n  text-shadow: @blackTextShadow;\n}\n\n/* Basic */\n.ui.basic.black.buttons .button,\n.ui.basic.black.button {\n  box-shadow: 0px 0px 0px @basicBorderSize @black inset !important;\n  color: @black !important;\n}\n.ui.basic.black.buttons .button:hover,\n.ui.basic.black.button:hover {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @blackHover inset !important;\n  color: @blackHover !important;\n}\n.ui.basic.black.buttons .button:focus,\n.ui.basic.black.button:focus {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @blackFocus inset !important;\n  color: @blackHover !important;\n}\n.ui.basic.black.buttons .active.button,\n.ui.basic.black.active.button {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @blackActive inset !important;\n  color: @blackDown !important;\n}\n.ui.basic.black.buttons .button:active,\n.ui.basic.black.button:active {\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @blackDown inset !important;\n  color: @blackDown !important;\n}\n.ui.buttons:not(.vertical) > .basic.black.button:not(:first-child) {\n  margin-left: -@basicColoredBorderSize;\n}\n\n/* Inverted */\n.ui.inverted.black.buttons .button,\n.ui.inverted.black.button {\n  background-color: transparent;\n  box-shadow: 0px 0px 0px @invertedBorderSize @solidBorderColor inset !important;\n  color: @invertedTextColor;\n}\n.ui.inverted.black.buttons .button:hover,\n.ui.inverted.black.button:hover,\n.ui.inverted.black.buttons .button:focus,\n.ui.inverted.black.button:focus,\n.ui.inverted.black.buttons .button.active,\n.ui.inverted.black.button.active,\n.ui.inverted.black.buttons .button:active,\n.ui.inverted.black.button:active {\n  box-shadow: none !important;\n  color: @lightBlackTextColor;\n}\n.ui.inverted.black.buttons .button:hover,\n.ui.inverted.black.button:hover {\n  background-color: @lightBlackHover;\n}\n.ui.inverted.black.buttons .button:focus,\n.ui.inverted.black.button:focus {\n  background-color: @lightBlackFocus;\n}\n.ui.inverted.black.buttons .active.button,\n.ui.inverted.black.active.button {\n  background-color: @lightBlackActive;\n}\n.ui.inverted.black.buttons .button:active,\n.ui.inverted.black.button:active {\n  background-color: @lightBlackDown;\n}\n\n/* Inverted Basic */\n.ui.inverted.black.basic.buttons .button,\n.ui.inverted.black.buttons .basic.button,\n.ui.inverted.black.basic.button {\n  background-color: transparent;\n  box-shadow: @basicInvertedBoxShadow !important;\n  color: @white !important;\n}\n.ui.inverted.black.basic.buttons .button:hover,\n.ui.inverted.black.buttons .basic.button:hover,\n.ui.inverted.black.basic.button:hover {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightBlackHover inset !important;\n  color: @white !important;\n}\n.ui.inverted.black.basic.buttons .button:focus,\n.ui.inverted.black.basic.buttons .button:focus,\n.ui.inverted.black.basic.button:focus {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightBlackFocus inset !important;\n  color: @lightBlack !important;\n}\n.ui.inverted.black.basic.buttons .active.button,\n.ui.inverted.black.buttons .basic.active.button,\n.ui.inverted.black.basic.active.button {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightBlackActive inset !important;\n  color: @white !important;\n}\n.ui.inverted.black.basic.buttons .button:active,\n.ui.inverted.black.buttons .basic.button:active,\n.ui.inverted.black.basic.button:active {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightBlackDown inset !important;\n  color: @white !important;\n}\n\n/*--- Grey ---*/\n.ui.grey.buttons .button,\n.ui.grey.button {\n  background-color: @grey;\n  color: @greyTextColor;\n  text-shadow: @greyTextShadow;\n  background-image: @coloredBackgroundImage;\n}\n.ui.grey.button {\n  box-shadow: @coloredBoxShadow;\n}\n.ui.grey.buttons .button:hover,\n.ui.grey.button:hover {\n  background-color: @greyHover;\n  color: @greyTextColor;\n  text-shadow: @greyTextShadow;\n}\n.ui.grey.buttons .button:focus,\n.ui.grey.button:focus {\n  background-color: @greyFocus;\n  color: @greyTextColor;\n  text-shadow: @greyTextShadow;\n}\n.ui.grey.buttons .button:active,\n.ui.grey.button:active {\n  background-color: @greyDown;\n  color: @greyTextColor;\n  text-shadow: @greyTextShadow;\n}\n.ui.grey.buttons .active.button,\n.ui.grey.buttons .active.button:active,\n.ui.grey.active.button,\n.ui.grey.button .active.button:active {\n  background-color: @greyActive;\n  color: @greyTextColor;\n  text-shadow: @greyTextShadow;\n}\n\n/* Basic */\n.ui.basic.grey.buttons .button,\n.ui.basic.grey.button {\n  box-shadow: 0px 0px 0px @basicBorderSize @grey inset !important;\n  color: @grey !important;\n}\n.ui.basic.grey.buttons .button:hover,\n.ui.basic.grey.button:hover {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @greyHover inset !important;\n  color: @greyHover !important;\n}\n.ui.basic.grey.buttons .button:focus,\n.ui.basic.grey.button:focus {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @greyFocus inset !important;\n  color: @greyHover !important;\n}\n.ui.basic.grey.buttons .active.button,\n.ui.basic.grey.active.button {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @greyActive inset !important;\n  color: @greyDown !important;\n}\n.ui.basic.grey.buttons .button:active,\n.ui.basic.grey.button:active {\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @greyDown inset !important;\n  color: @greyDown !important;\n}\n.ui.buttons:not(.vertical) > .basic.grey.button:not(:first-child) {\n  margin-left: -@basicColoredBorderSize;\n}\n\n/* Inverted */\n.ui.inverted.grey.buttons .button,\n.ui.inverted.grey.button {\n  background-color: transparent;\n  box-shadow: 0px 0px 0px @invertedBorderSize @solidBorderColor inset !important;\n  color: @invertedTextColor;\n}\n.ui.inverted.grey.buttons .button:hover,\n.ui.inverted.grey.button:hover,\n.ui.inverted.grey.buttons .button:focus,\n.ui.inverted.grey.button:focus,\n.ui.inverted.grey.buttons .button.active,\n.ui.inverted.grey.button.active,\n.ui.inverted.grey.buttons .button:active,\n.ui.inverted.grey.button:active {\n  box-shadow: none !important;\n  color: @lightGreyTextColor;\n}\n.ui.inverted.grey.buttons .button:hover,\n.ui.inverted.grey.button:hover {\n  background-color: @lightGreyHover;\n}\n.ui.inverted.grey.buttons .button:focus,\n.ui.inverted.grey.button:focus {\n  background-color: @lightGreyFocus;\n}\n.ui.inverted.grey.buttons .active.button,\n.ui.inverted.grey.active.button {\n  background-color: @lightGreyActive;\n}\n.ui.inverted.grey.buttons .button:active,\n.ui.inverted.grey.button:active {\n  background-color: @lightGreyDown;\n}\n\n/* Inverted Basic */\n.ui.inverted.grey.basic.buttons .button,\n.ui.inverted.grey.buttons .basic.button,\n.ui.inverted.grey.basic.button {\n  background-color: transparent;\n  box-shadow: @basicInvertedBoxShadow !important;\n  color: @white !important;\n}\n.ui.inverted.grey.basic.buttons .button:hover,\n.ui.inverted.grey.buttons .basic.button:hover,\n.ui.inverted.grey.basic.button:hover {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightGreyHover inset !important;\n  color: @white !important;\n}\n.ui.inverted.grey.basic.buttons .button:focus,\n.ui.inverted.grey.basic.buttons .button:focus,\n.ui.inverted.grey.basic.button:focus {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightGreyFocus inset !important;\n  color: @lightGrey !important;\n}\n.ui.inverted.grey.basic.buttons .active.button,\n.ui.inverted.grey.buttons .basic.active.button,\n.ui.inverted.grey.basic.active.button {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightGreyActive inset !important;\n  color: @white !important;\n}\n.ui.inverted.grey.basic.buttons .button:active,\n.ui.inverted.grey.buttons .basic.button:active,\n.ui.inverted.grey.basic.button:active {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightGreyDown inset !important;\n  color: @white !important;\n}\n\n\n/*--- Brown ---*/\n.ui.brown.buttons .button,\n.ui.brown.button {\n  background-color: @brown;\n  color: @brownTextColor;\n  text-shadow: @brownTextShadow;\n  background-image: @coloredBackgroundImage;\n}\n.ui.brown.button {\n  box-shadow: @coloredBoxShadow;\n}\n.ui.brown.buttons .button:hover,\n.ui.brown.button:hover {\n  background-color: @brownHover;\n  color: @brownTextColor;\n  text-shadow: @brownTextShadow;\n}\n.ui.brown.buttons .button:focus,\n.ui.brown.button:focus {\n  background-color: @brownFocus;\n  color: @brownTextColor;\n  text-shadow: @brownTextShadow;\n}\n.ui.brown.buttons .button:active,\n.ui.brown.button:active {\n  background-color: @brownDown;\n  color: @brownTextColor;\n  text-shadow: @brownTextShadow;\n}\n.ui.brown.buttons .active.button,\n.ui.brown.buttons .active.button:active,\n.ui.brown.active.button,\n.ui.brown.button .active.button:active {\n  background-color: @brownActive;\n  color: @brownTextColor;\n  text-shadow: @brownTextShadow;\n}\n\n/* Basic */\n.ui.basic.brown.buttons .button,\n.ui.basic.brown.button {\n  box-shadow: 0px 0px 0px @basicBorderSize @brown inset !important;\n  color: @brown !important;\n}\n.ui.basic.brown.buttons .button:hover,\n.ui.basic.brown.button:hover {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @brownHover inset !important;\n  color: @brownHover !important;\n}\n.ui.basic.brown.buttons .button:focus,\n.ui.basic.brown.button:focus {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @brownFocus inset !important;\n  color: @brownHover !important;\n}\n.ui.basic.brown.buttons .active.button,\n.ui.basic.brown.active.button {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @brownActive inset !important;\n  color: @brownDown !important;\n}\n.ui.basic.brown.buttons .button:active,\n.ui.basic.brown.button:active {\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @brownDown inset !important;\n  color: @brownDown !important;\n}\n.ui.buttons:not(.vertical) > .basic.brown.button:not(:first-child) {\n  margin-left: -@basicColoredBorderSize;\n}\n\n/* Inverted */\n.ui.inverted.brown.buttons .button,\n.ui.inverted.brown.button {\n  background-color: transparent;\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightBrown inset !important;\n  color: @lightBrown;\n}\n.ui.inverted.brown.buttons .button:hover,\n.ui.inverted.brown.button:hover,\n.ui.inverted.brown.buttons .button:focus,\n.ui.inverted.brown.button:focus,\n.ui.inverted.brown.buttons .button.active,\n.ui.inverted.brown.button.active,\n.ui.inverted.brown.buttons .button:active,\n.ui.inverted.brown.button:active {\n  box-shadow: none !important;\n  color: @lightBrownTextColor;\n}\n.ui.inverted.brown.buttons .button:hover,\n.ui.inverted.brown.button:hover {\n  background-color: @lightBrownHover;\n}\n.ui.inverted.brown.buttons .button:focus,\n.ui.inverted.brown.button:focus {\n  background-color: @lightBrownFocus;\n}\n.ui.inverted.brown.buttons .active.button,\n.ui.inverted.brown.active.button {\n  background-color: @lightBrownActive;\n}\n.ui.inverted.brown.buttons .button:active,\n.ui.inverted.brown.button:active {\n  background-color: @lightBrownDown;\n}\n\n/* Inverted Basic */\n.ui.inverted.brown.basic.buttons .button,\n.ui.inverted.brown.buttons .basic.button,\n.ui.inverted.brown.basic.button {\n  background-color: transparent;\n  box-shadow: @basicInvertedBoxShadow !important;\n  color: @white !important;\n}\n.ui.inverted.brown.basic.buttons .button:hover,\n.ui.inverted.brown.buttons .basic.button:hover,\n.ui.inverted.brown.basic.button:hover {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightBrownHover inset !important;\n  color: @lightBrown !important;\n}\n.ui.inverted.brown.basic.buttons .button:focus,\n.ui.inverted.brown.basic.buttons .button:focus,\n.ui.inverted.brown.basic.button:focus {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightBrownFocus inset !important;\n  color: @lightBrown !important;\n}\n.ui.inverted.brown.basic.buttons .active.button,\n.ui.inverted.brown.buttons .basic.active.button,\n.ui.inverted.brown.basic.active.button {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightBrownActive inset !important;\n  color: @lightBrown !important;\n}\n.ui.inverted.brown.basic.buttons .button:active,\n.ui.inverted.brown.buttons .basic.button:active,\n.ui.inverted.brown.basic.button:active {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightBrownDown inset !important;\n  color: @lightBrown !important;\n}\n\n/*--- Blue ---*/\n.ui.blue.buttons .button,\n.ui.blue.button {\n  background-color: @blue;\n  color: @blueTextColor;\n  text-shadow: @blueTextShadow;\n  background-image: @coloredBackgroundImage;\n}\n.ui.blue.button {\n  box-shadow: @coloredBoxShadow;\n}\n.ui.blue.buttons .button:hover,\n.ui.blue.button:hover {\n  background-color: @blueHover;\n  color: @blueTextColor;\n  text-shadow: @blueTextShadow;\n}\n.ui.blue.buttons .button:focus,\n.ui.blue.button:focus {\n  background-color: @blueFocus;\n  color: @blueTextColor;\n  text-shadow: @blueTextShadow;\n}\n.ui.blue.buttons .button:active,\n.ui.blue.button:active {\n  background-color: @blueDown;\n  color: @blueTextColor;\n  text-shadow: @blueTextShadow;\n}\n.ui.blue.buttons .active.button,\n.ui.blue.buttons .active.button:active,\n.ui.blue.active.button,\n.ui.blue.button .active.button:active {\n  background-color: @blueActive;\n  color: @blueTextColor;\n  text-shadow: @blueTextShadow;\n}\n\n/* Basic */\n.ui.basic.blue.buttons .button,\n.ui.basic.blue.button {\n  box-shadow: 0px 0px 0px @basicBorderSize @blue inset !important;\n  color: @blue !important;\n}\n.ui.basic.blue.buttons .button:hover,\n.ui.basic.blue.button:hover {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @blueHover inset !important;\n  color: @blueHover !important;\n}\n.ui.basic.blue.buttons .button:focus,\n.ui.basic.blue.button:focus {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @blueFocus inset !important;\n  color: @blueHover !important;\n}\n.ui.basic.blue.buttons .active.button,\n.ui.basic.blue.active.button {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @blueActive inset !important;\n  color: @blueDown !important;\n}\n.ui.basic.blue.buttons .button:active,\n.ui.basic.blue.button:active {\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @blueDown inset !important;\n  color: @blueDown !important;\n}\n.ui.buttons:not(.vertical) > .basic.blue.button:not(:first-child) {\n  margin-left: -@basicColoredBorderSize;\n}\n\n/* Inverted */\n.ui.inverted.blue.buttons .button,\n.ui.inverted.blue.button {\n  background-color: transparent;\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightBlue inset !important;\n  color: @lightBlue;\n}\n.ui.inverted.blue.buttons .button:hover,\n.ui.inverted.blue.button:hover,\n.ui.inverted.blue.buttons .button:focus,\n.ui.inverted.blue.button:focus,\n.ui.inverted.blue.buttons .button.active,\n.ui.inverted.blue.button.active,\n.ui.inverted.blue.buttons .button:active,\n.ui.inverted.blue.button:active {\n  box-shadow: none !important;\n  color: @lightBlueTextColor;\n}\n.ui.inverted.blue.buttons .button:hover,\n.ui.inverted.blue.button:hover {\n  background-color: @lightBlueHover;\n}\n.ui.inverted.blue.buttons .button:focus,\n.ui.inverted.blue.button:focus {\n  background-color: @lightBlueFocus;\n}\n.ui.inverted.blue.buttons .active.button,\n.ui.inverted.blue.active.button {\n  background-color: @lightBlueActive;\n}\n.ui.inverted.blue.buttons .button:active,\n.ui.inverted.blue.button:active {\n  background-color: @lightBlueDown;\n}\n\n/* Inverted Basic */\n.ui.inverted.blue.basic.buttons .button,\n.ui.inverted.blue.buttons .basic.button,\n.ui.inverted.blue.basic.button {\n  background-color: transparent;\n  box-shadow: @basicInvertedBoxShadow !important;\n  color: @white !important;\n}\n.ui.inverted.blue.basic.buttons .button:hover,\n.ui.inverted.blue.buttons .basic.button:hover,\n.ui.inverted.blue.basic.button:hover {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightBlueHover inset !important;\n  color: @lightBlue !important;\n}\n.ui.inverted.blue.basic.buttons .button:focus,\n.ui.inverted.blue.basic.buttons .button:focus,\n.ui.inverted.blue.basic.button:focus {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightBlueFocus inset !important;\n  color: @lightBlue !important;\n}\n.ui.inverted.blue.basic.buttons .active.button,\n.ui.inverted.blue.buttons .basic.active.button,\n.ui.inverted.blue.basic.active.button {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightBlueActive inset !important;\n  color: @lightBlue !important;\n}\n.ui.inverted.blue.basic.buttons .button:active,\n.ui.inverted.blue.buttons .basic.button:active,\n.ui.inverted.blue.basic.button:active {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightBlueDown inset !important;\n  color: @lightBlue !important;\n}\n\n/*--- Green ---*/\n.ui.green.buttons .button,\n.ui.green.button {\n  background-color: @green;\n  color: @greenTextColor;\n  text-shadow: @greenTextShadow;\n  background-image: @coloredBackgroundImage;\n}\n.ui.green.button {\n  box-shadow: @coloredBoxShadow;\n}\n.ui.green.buttons .button:hover,\n.ui.green.button:hover {\n  background-color: @greenHover;\n  color: @greenTextColor;\n  text-shadow: @greenTextShadow;\n}\n.ui.green.buttons .button:focus,\n.ui.green.button:focus {\n  background-color: @greenFocus;\n  color: @greenTextColor;\n  text-shadow: @greenTextShadow;\n}\n.ui.green.buttons .button:active,\n.ui.green.button:active {\n  background-color: @greenDown;\n  color: @greenTextColor;\n  text-shadow: @greenTextShadow;\n}\n.ui.green.buttons .active.button,\n.ui.green.buttons .active.button:active,\n.ui.green.active.button,\n.ui.green.button .active.button:active {\n  background-color: @greenActive;\n  color: @greenTextColor;\n  text-shadow: @greenTextShadow;\n}\n\n\n/* Basic */\n.ui.basic.green.buttons .button,\n.ui.basic.green.button {\n  box-shadow: 0px 0px 0px @basicBorderSize @green inset !important;\n  color: @green !important;\n}\n.ui.basic.green.buttons .button:hover,\n.ui.basic.green.button:hover {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @greenHover inset !important;\n  color: @greenHover !important;\n}\n.ui.basic.green.buttons .button:focus,\n.ui.basic.green.button:focus {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @greenFocus inset !important;\n  color: @greenHover !important;\n}\n.ui.basic.green.buttons .active.button,\n.ui.basic.green.active.button {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @greenActive inset !important;\n  color: @greenDown !important;\n}\n.ui.basic.green.buttons .button:active,\n.ui.basic.green.button:active {\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @greenDown inset !important;\n  color: @greenDown !important;\n}\n.ui.buttons:not(.vertical) > .basic.green.button:not(:first-child) {\n  margin-left: -@basicColoredBorderSize;\n}\n\n/* Inverted */\n.ui.inverted.green.buttons .button,\n.ui.inverted.green.button {\n  background-color: transparent;\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightGreen inset !important;\n  color: @lightGreen;\n}\n.ui.inverted.green.buttons .button:hover,\n.ui.inverted.green.button:hover,\n.ui.inverted.green.buttons .button:focus,\n.ui.inverted.green.button:focus,\n.ui.inverted.green.buttons .button.active,\n.ui.inverted.green.button.active,\n.ui.inverted.green.buttons .button:active,\n.ui.inverted.green.button:active {\n  box-shadow: none !important;\n  color: @greenTextColor;\n}\n.ui.inverted.green.buttons .button:hover,\n.ui.inverted.green.button:hover {\n  background-color: @lightGreenHover;\n}\n.ui.inverted.green.buttons .button:focus,\n.ui.inverted.green.button:focus {\n  background-color: @lightGreenFocus;\n}\n.ui.inverted.green.buttons .active.button,\n.ui.inverted.green.active.button {\n  background-color: @lightGreenActive;\n}\n.ui.inverted.green.buttons .button:active,\n.ui.inverted.green.button:active {\n  background-color: @lightGreenDown;\n}\n\n/* Inverted Basic */\n.ui.inverted.green.basic.buttons .button,\n.ui.inverted.green.buttons .basic.button,\n.ui.inverted.green.basic.button {\n  background-color: transparent;\n  box-shadow: @basicInvertedBoxShadow !important;\n  color: @white !important;\n}\n.ui.inverted.green.basic.buttons .button:hover,\n.ui.inverted.green.buttons .basic.button:hover,\n.ui.inverted.green.basic.button:hover {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightGreenHover inset !important;\n  color: @lightGreen !important;\n}\n.ui.inverted.green.basic.buttons .button:focus,\n.ui.inverted.green.basic.buttons .button:focus,\n.ui.inverted.green.basic.button:focus {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightGreenFocus inset !important;\n  color: @lightGreen !important;\n}\n.ui.inverted.green.basic.buttons .active.button,\n.ui.inverted.green.buttons .basic.active.button,\n.ui.inverted.green.basic.active.button {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightGreenActive inset !important;\n  color: @lightGreen !important;\n}\n.ui.inverted.green.basic.buttons .button:active,\n.ui.inverted.green.buttons .basic.button:active,\n.ui.inverted.green.basic.button:active {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightGreenDown inset !important;\n  color: @lightGreen !important;\n}\n\n/*--- Orange ---*/\n.ui.orange.buttons .button,\n.ui.orange.button {\n  background-color: @orange;\n  color: @orangeTextColor;\n  text-shadow: @orangeTextShadow;\n  background-image: @coloredBackgroundImage;\n}\n.ui.orange.button {\n  box-shadow: @coloredBoxShadow;\n}\n.ui.orange.buttons .button:hover,\n.ui.orange.button:hover {\n  background-color: @orangeHover;\n  color: @orangeTextColor;\n  text-shadow: @orangeTextShadow;\n}\n.ui.orange.buttons .button:focus,\n.ui.orange.button:focus {\n  background-color: @orangeFocus;\n  color: @orangeTextColor;\n  text-shadow: @orangeTextShadow;\n}\n.ui.orange.buttons .button:active,\n.ui.orange.button:active {\n  background-color: @orangeDown;\n  color: @orangeTextColor;\n  text-shadow: @orangeTextShadow;\n}\n.ui.orange.buttons .active.button,\n.ui.orange.buttons .active.button:active,\n.ui.orange.active.button,\n.ui.orange.button .active.button:active {\n  background-color: @orangeActive;\n  color: @orangeTextColor;\n  text-shadow: @orangeTextShadow;\n}\n\n/* Basic */\n.ui.basic.orange.buttons .button,\n.ui.basic.orange.button {\n  box-shadow: 0px 0px 0px @basicBorderSize @orange inset !important;\n  color: @orange !important;\n}\n.ui.basic.orange.buttons .button:hover,\n.ui.basic.orange.button:hover {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @orangeHover inset !important;\n  color: @orangeHover !important;\n}\n.ui.basic.orange.buttons .button:focus,\n.ui.basic.orange.button:focus {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @orangeFocus inset !important;\n  color: @orangeHover !important;\n}\n.ui.basic.orange.buttons .active.button,\n.ui.basic.orange.active.button {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @orangeActive inset !important;\n  color: @orangeDown !important;\n}\n.ui.basic.orange.buttons .button:active,\n.ui.basic.orange.button:active {\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @orangeDown inset !important;\n  color: @orangeDown !important;\n}\n.ui.buttons:not(.vertical) > .basic.orange.button:not(:first-child) {\n  margin-left: -@basicColoredBorderSize;\n}\n\n/* Inverted */\n.ui.inverted.orange.buttons .button,\n.ui.inverted.orange.button {\n  background-color: transparent;\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightOrange inset !important;\n  color: @lightOrange;\n}\n.ui.inverted.orange.buttons .button:hover,\n.ui.inverted.orange.button:hover,\n.ui.inverted.orange.buttons .button:focus,\n.ui.inverted.orange.button:focus,\n.ui.inverted.orange.buttons .button.active,\n.ui.inverted.orange.button.active,\n.ui.inverted.orange.buttons .button:active,\n.ui.inverted.orange.button:active {\n  box-shadow: none !important;\n  color: @lightOrangeTextColor;\n}\n.ui.inverted.orange.buttons .button:hover,\n.ui.inverted.orange.button:hover {\n  background-color: @lightOrangeHover;\n}\n.ui.inverted.orange.buttons .button:focus,\n.ui.inverted.orange.button:focus {\n  background-color: @lightOrangeFocus;\n}\n.ui.inverted.orange.buttons .active.button,\n.ui.inverted.orange.active.button {\n  background-color: @lightOrangeActive;\n}\n.ui.inverted.orange.buttons .button:active,\n.ui.inverted.orange.button:active {\n  background-color: @lightOrangeDown;\n}\n\n/* Inverted Basic */\n.ui.inverted.orange.basic.buttons .button,\n.ui.inverted.orange.buttons .basic.button,\n.ui.inverted.orange.basic.button {\n  background-color: transparent;\n  box-shadow: @basicInvertedBoxShadow !important;\n  color: @white !important;\n}\n.ui.inverted.orange.basic.buttons .button:hover,\n.ui.inverted.orange.buttons .basic.button:hover,\n.ui.inverted.orange.basic.button:hover {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightOrangeHover inset !important;\n  color: @lightOrange !important;\n}\n.ui.inverted.orange.basic.buttons .button:focus,\n.ui.inverted.orange.basic.buttons .button:focus,\n.ui.inverted.orange.basic.button:focus {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightOrangeFocus inset !important;\n  color: @lightOrange !important;\n}\n.ui.inverted.orange.basic.buttons .active.button,\n.ui.inverted.orange.buttons .basic.active.button,\n.ui.inverted.orange.basic.active.button {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightOrangeActive inset !important;\n  color: @lightOrange !important;\n}\n.ui.inverted.orange.basic.buttons .button:active,\n.ui.inverted.orange.buttons .basic.button:active,\n.ui.inverted.orange.basic.button:active {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightOrangeDown inset !important;\n  color: @lightOrange !important;\n}\n\n/*--- Pink ---*/\n.ui.pink.buttons .button,\n.ui.pink.button {\n  background-color: @pink;\n  color: @pinkTextColor;\n  text-shadow: @pinkTextShadow;\n  background-image: @coloredBackgroundImage;\n}\n.ui.pink.button {\n  box-shadow: @coloredBoxShadow;\n}\n.ui.pink.buttons .button:hover,\n.ui.pink.button:hover {\n  background-color: @pinkHover;\n  color: @pinkTextColor;\n  text-shadow: @pinkTextShadow;\n}\n.ui.pink.buttons .button:focus,\n.ui.pink.button:focus {\n  background-color: @pinkFocus;\n  color: @pinkTextColor;\n  text-shadow: @pinkTextShadow;\n}\n.ui.pink.buttons .button:active,\n.ui.pink.button:active {\n  background-color: @pinkDown;\n  color: @pinkTextColor;\n  text-shadow: @pinkTextShadow;\n}\n.ui.pink.buttons .active.button,\n.ui.pink.buttons .active.button:active,\n.ui.pink.active.button,\n.ui.pink.button .active.button:active {\n  background-color: @pinkActive;\n  color: @pinkTextColor;\n  text-shadow: @pinkTextShadow;\n}\n\n/* Basic */\n.ui.basic.pink.buttons .button,\n.ui.basic.pink.button {\n  box-shadow: 0px 0px 0px @basicBorderSize @pink inset !important;\n  color: @pink !important;\n}\n.ui.basic.pink.buttons .button:hover,\n.ui.basic.pink.button:hover {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @pinkHover inset !important;\n  color: @pinkHover !important;\n}\n.ui.basic.pink.buttons .button:focus,\n.ui.basic.pink.button:focus {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @pinkFocus inset !important;\n  color: @pinkHover !important;\n}\n.ui.basic.pink.buttons .active.button,\n.ui.basic.pink.active.button {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @pinkActive inset !important;\n  color: @pinkDown !important;\n}\n.ui.basic.pink.buttons .button:active,\n.ui.basic.pink.button:active {\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @pinkDown inset !important;\n  color: @pinkDown !important;\n}\n.ui.buttons:not(.vertical) > .basic.pink.button:not(:first-child) {\n  margin-left: -@basicColoredBorderSize;\n}\n\n/* Inverted */\n.ui.inverted.pink.buttons .button,\n.ui.inverted.pink.button {\n  background-color: transparent;\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightPink inset !important;\n  color: @lightPink;\n}\n.ui.inverted.pink.buttons .button:hover,\n.ui.inverted.pink.button:hover,\n.ui.inverted.pink.buttons .button:focus,\n.ui.inverted.pink.button:focus,\n.ui.inverted.pink.buttons .button.active,\n.ui.inverted.pink.button.active,\n.ui.inverted.pink.buttons .button:active,\n.ui.inverted.pink.button:active {\n  box-shadow: none !important;\n  color: @lightPinkTextColor;\n}\n.ui.inverted.pink.buttons .button:hover,\n.ui.inverted.pink.button:hover {\n  background-color: @lightPinkHover;\n}\n.ui.inverted.pink.buttons .button:focus,\n.ui.inverted.pink.button:focus {\n  background-color: @lightPinkFocus;\n}\n.ui.inverted.pink.buttons .active.button,\n.ui.inverted.pink.active.button {\n  background-color: @lightPinkActive;\n}\n.ui.inverted.pink.buttons .button:active,\n.ui.inverted.pink.button:active {\n  background-color: @lightPinkDown;\n}\n\n/* Inverted Basic */\n.ui.inverted.pink.basic.buttons .button,\n.ui.inverted.pink.buttons .basic.button,\n.ui.inverted.pink.basic.button {\n  background-color: transparent;\n  box-shadow: @basicInvertedBoxShadow !important;\n  color: @white !important;\n}\n.ui.inverted.pink.basic.buttons .button:hover,\n.ui.inverted.pink.buttons .basic.button:hover,\n.ui.inverted.pink.basic.button:hover {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightPinkHover inset !important;\n  color: @lightPink !important;\n}\n.ui.inverted.pink.basic.buttons .button:focus,\n.ui.inverted.pink.basic.buttons .button:focus,\n.ui.inverted.pink.basic.button:focus {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightPinkFocus inset !important;\n  color: @lightPink !important;\n}\n.ui.inverted.pink.basic.buttons .active.button,\n.ui.inverted.pink.buttons .basic.active.button,\n.ui.inverted.pink.basic.active.button {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightPinkActive inset !important;\n  color: @lightPink !important;\n}\n.ui.inverted.pink.basic.buttons .button:active,\n.ui.inverted.pink.buttons .basic.button:active,\n.ui.inverted.pink.basic.button:active {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightPinkDown inset !important;\n  color: @lightPink !important;\n}\n\n\n/*--- Violet ---*/\n.ui.violet.buttons .button,\n.ui.violet.button {\n  background-color: @violet;\n  color: @violetTextColor;\n  text-shadow: @violetTextShadow;\n  background-image: @coloredBackgroundImage;\n}\n.ui.violet.button {\n  box-shadow: @coloredBoxShadow;\n}\n.ui.violet.buttons .button:hover,\n.ui.violet.button:hover {\n  background-color: @violetHover;\n  color: @violetTextColor;\n  text-shadow: @violetTextShadow;\n}\n.ui.violet.buttons .button:focus,\n.ui.violet.button:focus {\n  background-color: @violetFocus;\n  color: @violetTextColor;\n  text-shadow: @violetTextShadow;\n}\n.ui.violet.buttons .button:active,\n.ui.violet.button:active {\n  background-color: @violetDown;\n  color: @violetTextColor;\n  text-shadow: @violetTextShadow;\n}\n.ui.violet.buttons .active.button,\n.ui.violet.buttons .active.button:active,\n.ui.violet.active.button,\n.ui.violet.button .active.button:active {\n  background-color: @violetActive;\n  color: @violetTextColor;\n  text-shadow: @violetTextShadow;\n}\n\n/* Basic */\n.ui.basic.violet.buttons .button,\n.ui.basic.violet.button {\n  box-shadow: 0px 0px 0px @basicBorderSize @violet inset !important;\n  color: @violet !important;\n}\n.ui.basic.violet.buttons .button:hover,\n.ui.basic.violet.button:hover {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @violetHover inset !important;\n  color: @violetHover !important;\n}\n.ui.basic.violet.buttons .button:focus,\n.ui.basic.violet.button:focus {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @violetFocus inset !important;\n  color: @violetHover !important;\n}\n.ui.basic.violet.buttons .active.button,\n.ui.basic.violet.active.button {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @violetActive inset !important;\n  color: @violetDown !important;\n}\n.ui.basic.violet.buttons .button:active,\n.ui.basic.violet.button:active {\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @violetDown inset !important;\n  color: @violetDown !important;\n}\n.ui.buttons:not(.vertical) > .basic.violet.button:not(:first-child) {\n  margin-left: -@basicColoredBorderSize;\n}\n\n/* Inverted */\n.ui.inverted.violet.buttons .button,\n.ui.inverted.violet.button {\n  background-color: transparent;\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightViolet inset !important;\n  color: @lightViolet;\n}\n.ui.inverted.violet.buttons .button:hover,\n.ui.inverted.violet.button:hover,\n.ui.inverted.violet.buttons .button:focus,\n.ui.inverted.violet.button:focus,\n.ui.inverted.violet.buttons .button.active,\n.ui.inverted.violet.button.active,\n.ui.inverted.violet.buttons .button:active,\n.ui.inverted.violet.button:active {\n  box-shadow: none !important;\n  color: @lightVioletTextColor;\n}\n.ui.inverted.violet.buttons .button:hover,\n.ui.inverted.violet.button:hover {\n  background-color: @lightVioletHover;\n}\n.ui.inverted.violet.buttons .button:focus,\n.ui.inverted.violet.button:focus {\n  background-color: @lightVioletFocus;\n}\n.ui.inverted.violet.buttons .active.button,\n.ui.inverted.violet.active.button {\n  background-color: @lightVioletActive;\n}\n.ui.inverted.violet.buttons .button:active,\n.ui.inverted.violet.button:active {\n  background-color: @lightVioletDown;\n}\n\n/* Inverted Basic */\n.ui.inverted.violet.basic.buttons .button,\n.ui.inverted.violet.buttons .basic.button,\n.ui.inverted.violet.basic.button {\n  background-color: transparent;\n  box-shadow: @basicInvertedBoxShadow !important;\n  color: @white !important;\n}\n.ui.inverted.violet.basic.buttons .button:hover,\n.ui.inverted.violet.buttons .basic.button:hover,\n.ui.inverted.violet.basic.button:hover {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightVioletHover inset !important;\n  color: @lightViolet !important;\n}\n.ui.inverted.violet.basic.buttons .button:focus,\n.ui.inverted.violet.basic.buttons .button:focus,\n.ui.inverted.violet.basic.button:focus {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightVioletFocus inset !important;\n  color: @lightViolet !important;\n}\n.ui.inverted.violet.basic.buttons .active.button,\n.ui.inverted.violet.buttons .basic.active.button,\n.ui.inverted.violet.basic.active.button {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightVioletActive inset !important;\n  color: @lightViolet !important;\n}\n.ui.inverted.violet.basic.buttons .button:active,\n.ui.inverted.violet.buttons .basic.button:active,\n.ui.inverted.violet.basic.button:active {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightVioletDown inset !important;\n  color: @lightViolet !important;\n}\n\n/*--- Purple ---*/\n.ui.purple.buttons .button,\n.ui.purple.button {\n  background-color: @purple;\n  color: @purpleTextColor;\n  text-shadow: @purpleTextShadow;\n  background-image: @coloredBackgroundImage;\n}\n.ui.purple.button {\n  box-shadow: @coloredBoxShadow;\n}\n.ui.purple.buttons .button:hover,\n.ui.purple.button:hover {\n  background-color: @purpleHover;\n  color: @purpleTextColor;\n  text-shadow: @purpleTextShadow;\n}\n.ui.purple.buttons .button:focus,\n.ui.purple.button:focus {\n  background-color: @purpleFocus;\n  color: @purpleTextColor;\n  text-shadow: @purpleTextShadow;\n}\n.ui.purple.buttons .button:active,\n.ui.purple.button:active {\n  background-color: @purpleDown;\n  color: @purpleTextColor;\n  text-shadow: @purpleTextShadow;\n}\n.ui.purple.buttons .active.button,\n.ui.purple.buttons .active.button:active,\n.ui.purple.active.button,\n.ui.purple.button .active.button:active {\n  background-color: @purpleActive;\n  color: @purpleTextColor;\n  text-shadow: @purpleTextShadow;\n}\n\n/* Basic */\n.ui.basic.purple.buttons .button,\n.ui.basic.purple.button {\n  box-shadow: 0px 0px 0px @basicBorderSize @purple inset !important;\n  color: @purple !important;\n}\n.ui.basic.purple.buttons .button:hover,\n.ui.basic.purple.button:hover {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @purpleHover inset !important;\n  color: @purpleHover !important;\n}\n.ui.basic.purple.buttons .button:focus,\n.ui.basic.purple.button:focus {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @purpleFocus inset !important;\n  color: @purpleHover !important;\n}\n.ui.basic.purple.buttons .active.button,\n.ui.basic.purple.active.button {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @purpleActive inset !important;\n  color: @purpleDown !important;\n}\n.ui.basic.purple.buttons .button:active,\n.ui.basic.purple.button:active {\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @purpleDown inset !important;\n  color: @purpleDown !important;\n}\n.ui.buttons:not(.vertical) > .basic.purple.button:not(:first-child) {\n  margin-left: -@basicColoredBorderSize;\n}\n\n/* Inverted */\n.ui.inverted.purple.buttons .button,\n.ui.inverted.purple.button {\n  background-color: transparent;\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightPurple inset !important;\n  color: @lightPurple;\n}\n.ui.inverted.purple.buttons .button:hover,\n.ui.inverted.purple.button:hover,\n.ui.inverted.purple.buttons .button:focus,\n.ui.inverted.purple.button:focus,\n.ui.inverted.purple.buttons .button.active,\n.ui.inverted.purple.button.active,\n.ui.inverted.purple.buttons .button:active,\n.ui.inverted.purple.button:active {\n  box-shadow: none !important;\n  color: @lightPurpleTextColor;\n}\n.ui.inverted.purple.buttons .button:hover,\n.ui.inverted.purple.button:hover {\n  background-color: @lightPurpleHover;\n}\n.ui.inverted.purple.buttons .button:focus,\n.ui.inverted.purple.button:focus {\n  background-color: @lightPurpleFocus;\n}\n.ui.inverted.purple.buttons .active.button,\n.ui.inverted.purple.active.button {\n  background-color: @lightPurpleActive;\n}\n.ui.inverted.purple.buttons .button:active,\n.ui.inverted.purple.button:active {\n  background-color: @lightPurpleDown;\n}\n\n/* Inverted Basic */\n.ui.inverted.purple.basic.buttons .button,\n.ui.inverted.purple.buttons .basic.button,\n.ui.inverted.purple.basic.button {\n  background-color: transparent;\n  box-shadow: @basicInvertedBoxShadow !important;\n  color: @white !important;\n}\n.ui.inverted.purple.basic.buttons .button:hover,\n.ui.inverted.purple.buttons .basic.button:hover,\n.ui.inverted.purple.basic.button:hover {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightPurpleHover inset !important;\n  color: @lightPurple !important;\n}\n.ui.inverted.purple.basic.buttons .button:focus,\n.ui.inverted.purple.basic.buttons .button:focus,\n.ui.inverted.purple.basic.button:focus {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightPurpleFocus inset !important;\n  color: @lightPurple !important;\n}\n.ui.inverted.purple.basic.buttons .active.button,\n.ui.inverted.purple.buttons .basic.active.button,\n.ui.inverted.purple.basic.active.button {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightPurpleActive inset !important;\n  color: @lightPurple !important;\n}\n.ui.inverted.purple.basic.buttons .button:active,\n.ui.inverted.purple.buttons .basic.button:active,\n.ui.inverted.purple.basic.button:active {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightPurpleDown inset !important;\n  color: @lightPurple !important;\n}\n\n/*--- Red ---*/\n.ui.red.buttons .button,\n.ui.red.button {\n  background-color: @red;\n  color: @redTextColor;\n  text-shadow: @redTextShadow;\n  background-image: @coloredBackgroundImage;\n}\n.ui.red.button {\n  box-shadow: @coloredBoxShadow;\n}\n.ui.red.buttons .button:hover,\n.ui.red.button:hover {\n  background-color: @redHover;\n  color: @redTextColor;\n  text-shadow: @redTextShadow;\n}\n.ui.red.buttons .button:focus,\n.ui.red.button:focus {\n  background-color: @redFocus;\n  color: @redTextColor;\n  text-shadow: @redTextShadow;\n}\n.ui.red.buttons .button:active,\n.ui.red.button:active {\n  background-color: @redDown;\n  color: @redTextColor;\n  text-shadow: @redTextShadow;\n}\n.ui.red.buttons .active.button,\n.ui.red.buttons .active.button:active,\n.ui.red.active.button,\n.ui.red.button .active.button:active {\n  background-color: @redActive;\n  color: @redTextColor;\n  text-shadow: @redTextShadow;\n}\n\n/* Basic */\n.ui.basic.red.buttons .button,\n.ui.basic.red.button {\n  box-shadow: 0px 0px 0px @basicBorderSize @red inset !important;\n  color: @red !important;\n}\n.ui.basic.red.buttons .button:hover,\n.ui.basic.red.button:hover {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @redHover inset !important;\n  color: @redHover !important;\n}\n.ui.basic.red.buttons .button:focus,\n.ui.basic.red.button:focus {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @redFocus inset !important;\n  color: @redHover !important;\n}\n.ui.basic.red.buttons .active.button,\n.ui.basic.red.active.button {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @redActive inset !important;\n  color: @redDown !important;\n}\n.ui.basic.red.buttons .button:active,\n.ui.basic.red.button:active {\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @redDown inset !important;\n  color: @redDown !important;\n}\n.ui.buttons:not(.vertical) > .basic.red.button:not(:first-child) {\n  margin-left: -@basicColoredBorderSize;\n}\n\n/* Inverted */\n.ui.inverted.red.buttons .button,\n.ui.inverted.red.button {\n  background-color: transparent;\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightRed inset !important;\n  color: @lightRed;\n}\n.ui.inverted.red.buttons .button:hover,\n.ui.inverted.red.button:hover,\n.ui.inverted.red.buttons .button:focus,\n.ui.inverted.red.button:focus,\n.ui.inverted.red.buttons .button.active,\n.ui.inverted.red.button.active,\n.ui.inverted.red.buttons .button:active,\n.ui.inverted.red.button:active {\n  box-shadow: none !important;\n  color: @lightRedTextColor;\n}\n.ui.inverted.red.buttons .button:hover,\n.ui.inverted.red.button:hover {\n  background-color: @lightRedHover;\n}\n.ui.inverted.red.buttons .button:focus,\n.ui.inverted.red.button:focus {\n  background-color: @lightRedFocus;\n}\n.ui.inverted.red.buttons .active.button,\n.ui.inverted.red.active.button {\n  background-color: @lightRedActive;\n}\n.ui.inverted.red.buttons .button:active,\n.ui.inverted.red.button:active {\n  background-color: @lightRedDown;\n}\n\n/* Inverted Basic */\n.ui.inverted.red.basic.buttons .button,\n.ui.inverted.red.buttons .basic.button,\n.ui.inverted.red.basic.button {\n  background-color: transparent;\n  box-shadow: @basicInvertedBoxShadow !important;\n  color: @white !important;\n}\n.ui.inverted.red.basic.buttons .button:hover,\n.ui.inverted.red.buttons .basic.button:hover,\n.ui.inverted.red.basic.button:hover {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightRedHover inset !important;\n  color: @lightRed !important;\n}\n.ui.inverted.red.basic.buttons .button:focus,\n.ui.inverted.red.basic.buttons .button:focus,\n.ui.inverted.red.basic.button:focus {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightRedFocus inset !important;\n  color: @lightRed !important;\n}\n.ui.inverted.red.basic.buttons .active.button,\n.ui.inverted.red.buttons .basic.active.button,\n.ui.inverted.red.basic.active.button {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightRedActive inset !important;\n  color: @lightRed !important;\n}\n.ui.inverted.red.basic.buttons .button:active,\n.ui.inverted.red.buttons .basic.button:active,\n.ui.inverted.red.basic.button:active {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightRedDown inset !important;\n  color: @lightRed !important;\n}\n\n\n/*--- Teal ---*/\n.ui.teal.buttons .button,\n.ui.teal.button {\n  background-color: @teal;\n  color: @tealTextColor;\n  text-shadow: @tealTextShadow;\n  background-image: @coloredBackgroundImage;\n}\n.ui.teal.button {\n  box-shadow: @coloredBoxShadow;\n}\n.ui.teal.buttons .button:hover,\n.ui.teal.button:hover {\n  background-color: @tealHover;\n  color: @tealTextColor;\n  text-shadow: @tealTextShadow;\n}\n.ui.teal.buttons .button:focus,\n.ui.teal.button:focus {\n  background-color: @tealFocus;\n  color: @tealTextColor;\n  text-shadow: @tealTextShadow;\n}\n.ui.teal.buttons .button:active,\n.ui.teal.button:active {\n  background-color: @tealDown;\n  color: @tealTextColor;\n  text-shadow: @tealTextShadow;\n}\n.ui.teal.buttons .active.button,\n.ui.teal.buttons .active.button:active,\n.ui.teal.active.button,\n.ui.teal.button .active.button:active {\n  background-color: @tealActive;\n  color: @tealTextColor;\n  text-shadow: @tealTextShadow;\n}\n\n/* Basic */\n.ui.basic.teal.buttons .button,\n.ui.basic.teal.button {\n  box-shadow: 0px 0px 0px @basicBorderSize @teal inset !important;\n  color: @teal !important;\n}\n.ui.basic.teal.buttons .button:hover,\n.ui.basic.teal.button:hover {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @tealHover inset !important;\n  color: @tealHover !important;\n}\n.ui.basic.teal.buttons .button:focus,\n.ui.basic.teal.button:focus {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @tealFocus inset !important;\n  color: @tealHover !important;\n}\n.ui.basic.teal.buttons .active.button,\n.ui.basic.teal.active.button {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @tealActive inset !important;\n  color: @tealDown !important;\n}\n.ui.basic.teal.buttons .button:active,\n.ui.basic.teal.button:active {\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @tealDown inset !important;\n  color: @tealDown !important;\n}\n.ui.buttons:not(.vertical) > .basic.teal.button:not(:first-child) {\n  margin-left: -@basicColoredBorderSize;\n}\n\n/* Inverted */\n.ui.inverted.teal.buttons .button,\n.ui.inverted.teal.button {\n  background-color: transparent;\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightTeal inset !important;\n  color: @lightTeal;\n}\n.ui.inverted.teal.buttons .button:hover,\n.ui.inverted.teal.button:hover,\n.ui.inverted.teal.buttons .button:focus,\n.ui.inverted.teal.button:focus,\n.ui.inverted.teal.buttons .button.active,\n.ui.inverted.teal.button.active,\n.ui.inverted.teal.buttons .button:active,\n.ui.inverted.teal.button:active {\n  box-shadow: none !important;\n  color: @lightTealTextColor;\n}\n.ui.inverted.teal.buttons .button:hover,\n.ui.inverted.teal.button:hover {\n  background-color: @lightTealHover;\n}\n.ui.inverted.teal.buttons .button:focus,\n.ui.inverted.teal.button:focus {\n  background-color: @lightTealFocus;\n}\n.ui.inverted.teal.buttons .active.button,\n.ui.inverted.teal.active.button {\n  background-color: @lightTealActive;\n}\n.ui.inverted.teal.buttons .button:active,\n.ui.inverted.teal.button:active {\n  background-color: @lightTealDown;\n}\n\n/* Inverted Basic */\n.ui.inverted.teal.basic.buttons .button,\n.ui.inverted.teal.buttons .basic.button,\n.ui.inverted.teal.basic.button {\n  background-color: transparent;\n  box-shadow: @basicInvertedBoxShadow !important;\n  color: @white !important;\n}\n.ui.inverted.teal.basic.buttons .button:hover,\n.ui.inverted.teal.buttons .basic.button:hover,\n.ui.inverted.teal.basic.button:hover {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightTealHover inset !important;\n  color: @lightTeal !important;\n}\n.ui.inverted.teal.basic.buttons .button:focus,\n.ui.inverted.teal.basic.buttons .button:focus,\n.ui.inverted.teal.basic.button:focus {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightTealFocus inset !important;\n  color: @lightTeal !important;\n}\n.ui.inverted.teal.basic.buttons .active.button,\n.ui.inverted.teal.buttons .basic.active.button,\n.ui.inverted.teal.basic.active.button {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightTealActive inset !important;\n  color: @lightTeal !important;\n}\n.ui.inverted.teal.basic.buttons .button:active,\n.ui.inverted.teal.buttons .basic.button:active,\n.ui.inverted.teal.basic.button:active {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightTealDown inset !important;\n  color: @lightTeal !important;\n}\n\n\n/*--- Olive ---*/\n.ui.olive.buttons .button,\n.ui.olive.button {\n  background-color: @olive;\n  color: @oliveTextColor;\n  text-shadow: @oliveTextShadow;\n  background-image: @coloredBackgroundImage;\n}\n.ui.olive.button {\n  box-shadow: @coloredBoxShadow;\n}\n.ui.olive.buttons .button:hover,\n.ui.olive.button:hover {\n  background-color: @oliveHover;\n  color: @oliveTextColor;\n  text-shadow: @oliveTextShadow;\n}\n.ui.olive.buttons .button:focus,\n.ui.olive.button:focus {\n  background-color: @oliveFocus;\n  color: @oliveTextColor;\n  text-shadow: @oliveTextShadow;\n}\n.ui.olive.buttons .button:active,\n.ui.olive.button:active {\n  background-color: @oliveDown;\n  color: @oliveTextColor;\n  text-shadow: @oliveTextShadow;\n}\n.ui.olive.buttons .active.button,\n.ui.olive.buttons .active.button:active,\n.ui.olive.active.button,\n.ui.olive.button .active.button:active {\n  background-color: @oliveActive;\n  color: @oliveTextColor;\n  text-shadow: @oliveTextShadow;\n}\n\n/* Basic */\n.ui.basic.olive.buttons .button,\n.ui.basic.olive.button {\n  box-shadow: 0px 0px 0px @basicBorderSize @olive inset !important;\n  color: @olive !important;\n}\n.ui.basic.olive.buttons .button:hover,\n.ui.basic.olive.button:hover {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @oliveHover inset !important;\n  color: @oliveHover !important;\n}\n.ui.basic.olive.buttons .button:focus,\n.ui.basic.olive.button:focus {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @oliveFocus inset !important;\n  color: @oliveHover !important;\n}\n.ui.basic.olive.buttons .active.button,\n.ui.basic.olive.active.button {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @oliveActive inset !important;\n  color: @oliveDown !important;\n}\n.ui.basic.olive.buttons .button:active,\n.ui.basic.olive.button:active {\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @oliveDown inset !important;\n  color: @oliveDown !important;\n}\n.ui.buttons:not(.vertical) > .basic.olive.button:not(:first-child) {\n  margin-left: -@basicColoredBorderSize;\n}\n\n/* Inverted */\n.ui.inverted.olive.buttons .button,\n.ui.inverted.olive.button {\n  background-color: transparent;\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightOlive inset !important;\n  color: @lightOlive;\n}\n.ui.inverted.olive.buttons .button:hover,\n.ui.inverted.olive.button:hover,\n.ui.inverted.olive.buttons .button:focus,\n.ui.inverted.olive.button:focus,\n.ui.inverted.olive.buttons .button.active,\n.ui.inverted.olive.button.active,\n.ui.inverted.olive.buttons .button:active,\n.ui.inverted.olive.button:active {\n  box-shadow: none !important;\n  color: @lightOliveTextColor;\n}\n.ui.inverted.olive.buttons .button:hover,\n.ui.inverted.olive.button:hover {\n  background-color: @lightOliveHover;\n}\n.ui.inverted.olive.buttons .button:focus,\n.ui.inverted.olive.button:focus {\n  background-color: @lightOliveFocus;\n}\n.ui.inverted.olive.buttons .active.button,\n.ui.inverted.olive.active.button {\n  background-color: @lightOliveActive;\n}\n.ui.inverted.olive.buttons .button:active,\n.ui.inverted.olive.button:active {\n  background-color: @lightOliveDown;\n}\n\n/* Inverted Basic */\n.ui.inverted.olive.basic.buttons .button,\n.ui.inverted.olive.buttons .basic.button,\n.ui.inverted.olive.basic.button {\n  background-color: transparent;\n  box-shadow: @basicInvertedBoxShadow !important;\n  color: @white !important;\n}\n.ui.inverted.olive.basic.buttons .button:hover,\n.ui.inverted.olive.buttons .basic.button:hover,\n.ui.inverted.olive.basic.button:hover {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightOliveHover inset !important;\n  color: @lightOlive !important;\n}\n.ui.inverted.olive.basic.buttons .button:focus,\n.ui.inverted.olive.basic.buttons .button:focus,\n.ui.inverted.olive.basic.button:focus {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightOliveFocus inset !important;\n  color: @lightOlive !important;\n}\n.ui.inverted.olive.basic.buttons .active.button,\n.ui.inverted.olive.buttons .basic.active.button,\n.ui.inverted.olive.basic.active.button {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightOliveActive inset !important;\n  color: @lightOlive !important;\n}\n.ui.inverted.olive.basic.buttons .button:active,\n.ui.inverted.olive.buttons .basic.button:active,\n.ui.inverted.olive.basic.button:active {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightOliveDown inset !important;\n  color: @lightOlive !important;\n}\n\n/*--- Yellow ---*/\n.ui.yellow.buttons .button,\n.ui.yellow.button {\n  background-color: @yellow;\n  color: @yellowTextColor;\n  text-shadow: @yellowTextShadow;\n  background-image: @coloredBackgroundImage;\n}\n.ui.yellow.button {\n  box-shadow: @coloredBoxShadow;\n}\n.ui.yellow.buttons .button:hover,\n.ui.yellow.button:hover {\n  background-color: @yellowHover;\n  color: @yellowTextColor;\n  text-shadow: @yellowTextShadow;\n}\n.ui.yellow.buttons .button:focus,\n.ui.yellow.button:focus {\n  background-color: @yellowFocus;\n  color: @yellowTextColor;\n  text-shadow: @yellowTextShadow;\n}\n.ui.yellow.buttons .button:active,\n.ui.yellow.button:active {\n  background-color: @yellowDown;\n  color: @yellowTextColor;\n  text-shadow: @yellowTextShadow;\n}\n.ui.yellow.buttons .active.button,\n.ui.yellow.buttons .active.button:active,\n.ui.yellow.active.button,\n.ui.yellow.button .active.button:active {\n  background-color: @yellowActive;\n  color: @yellowTextColor;\n  text-shadow: @yellowTextShadow;\n}\n\n/* Basic */\n.ui.basic.yellow.buttons .button,\n.ui.basic.yellow.button {\n  box-shadow: 0px 0px 0px @basicBorderSize @yellow inset !important;\n  color: @yellow !important;\n}\n.ui.basic.yellow.buttons .button:hover,\n.ui.basic.yellow.button:hover {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @yellowHover inset !important;\n  color: @yellowHover !important;\n}\n.ui.basic.yellow.buttons .button:focus,\n.ui.basic.yellow.button:focus {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @yellowFocus inset !important;\n  color: @yellowHover !important;\n}\n.ui.basic.yellow.buttons .active.button,\n.ui.basic.yellow.active.button {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @yellowActive inset !important;\n  color: @yellowDown !important;\n}\n.ui.basic.yellow.buttons .button:active,\n.ui.basic.yellow.button:active {\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @yellowDown inset !important;\n  color: @yellowDown !important;\n}\n.ui.buttons:not(.vertical) > .basic.yellow.button:not(:first-child) {\n  margin-left: -@basicColoredBorderSize;\n}\n\n/* Inverted */\n.ui.inverted.yellow.buttons .button,\n.ui.inverted.yellow.button {\n  background-color: transparent;\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightYellow inset !important;\n  color: @lightYellow;\n}\n.ui.inverted.yellow.buttons .button:hover,\n.ui.inverted.yellow.button:hover,\n.ui.inverted.yellow.buttons .button:focus,\n.ui.inverted.yellow.button:focus,\n.ui.inverted.yellow.buttons .button.active,\n.ui.inverted.yellow.button.active,\n.ui.inverted.yellow.buttons .button:active,\n.ui.inverted.yellow.button:active {\n  box-shadow: none !important;\n  color: @lightYellowTextColor;\n}\n.ui.inverted.yellow.buttons .button:hover,\n.ui.inverted.yellow.button:hover {\n  background-color: @lightYellowHover;\n}\n.ui.inverted.yellow.buttons .button:focus,\n.ui.inverted.yellow.button:focus {\n  background-color: @lightYellowFocus;\n}\n.ui.inverted.yellow.buttons .active.button,\n.ui.inverted.yellow.active.button {\n  background-color: @lightYellowActive;\n}\n.ui.inverted.yellow.buttons .button:active,\n.ui.inverted.yellow.button:active {\n  background-color: @lightYellowDown;\n}\n\n/* Inverted Basic */\n.ui.inverted.yellow.basic.buttons .button,\n.ui.inverted.yellow.buttons .basic.button,\n.ui.inverted.yellow.basic.button {\n  background-color: transparent;\n  box-shadow: @basicInvertedBoxShadow !important;\n  color: @white !important;\n}\n.ui.inverted.yellow.basic.buttons .button:hover,\n.ui.inverted.yellow.buttons .basic.button:hover,\n.ui.inverted.yellow.basic.button:hover {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightYellowHover inset !important;\n  color: @lightYellow !important;\n}\n.ui.inverted.yellow.basic.buttons .button:focus,\n.ui.inverted.yellow.basic.buttons .button:focus,\n.ui.inverted.yellow.basic.button:focus {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightYellowFocus inset !important;\n  color: @lightYellow !important;\n}\n.ui.inverted.yellow.basic.buttons .active.button,\n.ui.inverted.yellow.buttons .basic.active.button,\n.ui.inverted.yellow.basic.active.button {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightYellowActive inset !important;\n  color: @lightYellow !important;\n}\n.ui.inverted.yellow.basic.buttons .button:active,\n.ui.inverted.yellow.buttons .basic.button:active,\n.ui.inverted.yellow.basic.button:active {\n  box-shadow: 0px 0px 0px @invertedBorderSize @lightYellowDown inset !important;\n  color: @lightYellow !important;\n}\n\n\n/*-------------------\n       Primary\n--------------------*/\n\n/*--- Standard ---*/\n.ui.primary.buttons .button,\n.ui.primary.button {\n  background-color: @primaryColor;\n  color: @primaryTextColor;\n  text-shadow: @primaryTextShadow;\n  background-image: @coloredBackgroundImage;\n}\n.ui.primary.button {\n  box-shadow: @coloredBoxShadow;\n}\n.ui.primary.buttons .button:hover,\n.ui.primary.button:hover {\n  background-color: @primaryColorHover;\n  color: @primaryTextColor;\n  text-shadow: @primaryTextShadow;\n}\n.ui.primary.buttons .button:focus,\n.ui.primary.button:focus {\n  background-color: @primaryColorFocus;\n  color: @primaryTextColor;\n  text-shadow: @primaryTextShadow;\n}\n.ui.primary.buttons .button:active,\n.ui.primary.button:active {\n  background-color: @primaryColorDown;\n  color: @primaryTextColor;\n  text-shadow: @primaryTextShadow;\n}\n.ui.primary.buttons .active.button,\n.ui.primary.buttons .active.button:active,\n.ui.primary.active.button,\n.ui.primary.button .active.button:active {\n  background-color: @primaryColorActive;\n  color: @primaryTextColor;\n  text-shadow: @primaryTextShadow;\n}\n\n/* Basic */\n.ui.basic.primary.buttons .button,\n.ui.basic.primary.button {\n  box-shadow: 0px 0px 0px @basicBorderSize @primaryColor inset !important;\n  color: @primaryColor !important;\n}\n.ui.basic.primary.buttons .button:hover,\n.ui.basic.primary.button:hover {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @primaryColorHover inset !important;\n  color: @primaryColorHover !important;\n}\n.ui.basic.primary.buttons .button:focus,\n.ui.basic.primary.button:focus {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @primaryColorFocus inset !important;\n  color: @primaryColorHover !important;\n}\n.ui.basic.primary.buttons .active.button,\n.ui.basic.primary.active.button {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @primaryColorActive inset !important;\n  color: @primaryColorDown !important;\n}\n.ui.basic.primary.buttons .button:active,\n.ui.basic.primary.button:active {\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @primaryColorDown inset !important;\n  color: @primaryColorDown !important;\n}\n.ui.buttons:not(.vertical) > .basic.primary.button:not(:first-child) {\n  margin-left: -@basicColoredBorderSize;\n}\n\n/*-------------------\n      Secondary\n--------------------*/\n\n/* Standard */\n.ui.secondary.buttons .button,\n.ui.secondary.button {\n  background-color: @secondaryColor;\n  color: @secondaryTextColor;\n  text-shadow: @secondaryTextShadow;\n  background-image: @coloredBackgroundImage;\n}\n.ui.secondary.button {\n  box-shadow: @coloredBoxShadow;\n}\n.ui.secondary.buttons .button:hover,\n.ui.secondary.button:hover {\n  background-color: @secondaryColorHover;\n  color: @secondaryTextColor;\n  text-shadow: @secondaryTextShadow;\n}\n.ui.secondary.buttons .button:focus,\n.ui.secondary.button:focus {\n  background-color: @secondaryColorFocus;\n  color: @secondaryTextColor;\n  text-shadow: @secondaryTextShadow;\n}\n.ui.secondary.buttons .button:active,\n.ui.secondary.button:active {\n  background-color: @secondaryColorDown;\n  color: @secondaryTextColor;\n  text-shadow: @secondaryTextShadow;\n}\n.ui.secondary.buttons .active.button,\n.ui.secondary.buttons .active.button:active,\n.ui.secondary.active.button,\n.ui.secondary.button .active.button:active {\n  background-color: @secondaryColorActive;\n  color: @secondaryTextColor;\n  text-shadow: @secondaryTextShadow;\n}\n\n/* Basic */\n.ui.basic.secondary.buttons .button,\n.ui.basic.secondary.button {\n  box-shadow: 0px 0px 0px @basicBorderSize @secondaryColor inset !important;\n  color: @secondaryColor !important;\n}\n.ui.basic.secondary.buttons .button:hover,\n.ui.basic.secondary.button:hover {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @secondaryColorHover inset !important;\n  color: @secondaryColorHover !important;\n}\n.ui.basic.secondary.buttons .button:focus,\n.ui.basic.secondary.button:focus {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @secondaryColorFocus inset !important;\n  color: @secondaryColorHover !important;\n}\n.ui.basic.secondary.buttons .active.button,\n.ui.basic.secondary.active.button {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @secondaryColorActive inset !important;\n  color: @secondaryColorDown !important;\n}\n.ui.basic.secondary.buttons .button:active,\n.ui.basic.secondary.button:active {\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @secondaryColorDown inset !important;\n  color: @secondaryColorDown !important;\n}\n.ui.buttons:not(.vertical) > .basic.primary.button:not(:first-child) {\n  margin-left: -@basicColoredBorderSize;\n}\n\n/*---------------\n    Positive\n----------------*/\n\n/* Standard */\n.ui.positive.buttons .button,\n.ui.positive.button {\n  background-color: @positiveColor;\n  color: @positiveTextColor;\n  text-shadow: @positiveTextShadow;\n  background-image: @coloredBackgroundImage;\n}\n.ui.positive.button {\n  box-shadow: @coloredBoxShadow;\n}\n.ui.positive.buttons .button:hover,\n.ui.positive.button:hover {\n  background-color: @positiveColorHover;\n  color: @positiveTextColor;\n  text-shadow: @positiveTextShadow;\n}\n.ui.positive.buttons .button:focus,\n.ui.positive.button:focus {\n  background-color: @positiveColorFocus;\n  color: @positiveTextColor;\n  text-shadow: @positiveTextShadow;\n}\n.ui.positive.buttons .button:active,\n.ui.positive.button:active {\n  background-color: @positiveColorDown;\n  color: @positiveTextColor;\n  text-shadow: @positiveTextShadow;\n}\n.ui.positive.buttons .active.button,\n.ui.positive.buttons .active.button:active,\n.ui.positive.active.button,\n.ui.positive.button .active.button:active {\n  background-color: @positiveColorActive;\n  color: @positiveTextColor;\n  text-shadow: @positiveTextShadow;\n}\n\n/* Basic */\n.ui.basic.positive.buttons .button,\n.ui.basic.positive.button {\n  box-shadow: 0px 0px 0px @basicBorderSize @positiveColor inset !important;\n  color: @positiveColor !important;\n}\n.ui.basic.positive.buttons .button:hover,\n.ui.basic.positive.button:hover {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @positiveColorHover inset !important;\n  color: @positiveColorHover !important;\n}\n.ui.basic.positive.buttons .button:focus,\n.ui.basic.positive.button:focus {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @positiveColorFocus inset !important;\n  color: @positiveColorHover !important;\n}\n.ui.basic.positive.buttons .active.button,\n.ui.basic.positive.active.button {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @positiveColorActive inset !important;\n  color: @positiveColorDown !important;\n}\n.ui.basic.positive.buttons .button:active,\n.ui.basic.positive.button:active {\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @positiveColorDown inset !important;\n  color: @positiveColorDown !important;\n}\n.ui.buttons:not(.vertical) > .basic.primary.button:not(:first-child) {\n  margin-left: -@basicColoredBorderSize;\n}\n\n/*---------------\n     Negative\n----------------*/\n\n/* Standard */\n.ui.negative.buttons .button,\n.ui.negative.button {\n  background-color: @negativeColor;\n  color: @negativeTextColor;\n  text-shadow: @negativeTextShadow;\n  background-image: @coloredBackgroundImage;\n}\n.ui.negative.button {\n  box-shadow: @coloredBoxShadow;\n}\n.ui.negative.buttons .button:hover,\n.ui.negative.button:hover {\n  background-color: @negativeColorHover;\n  color: @negativeTextColor;\n  text-shadow: @negativeTextShadow;\n}\n.ui.negative.buttons .button:focus,\n.ui.negative.button:focus {\n  background-color: @negativeColorFocus;\n  color: @negativeTextColor;\n  text-shadow: @negativeTextShadow;\n}\n.ui.negative.buttons .button:active,\n.ui.negative.button:active {\n  background-color: @negativeColorDown;\n  color: @negativeTextColor;\n  text-shadow: @negativeTextShadow;\n}\n.ui.negative.buttons .active.button,\n.ui.negative.buttons .active.button:active,\n.ui.negative.active.button,\n.ui.negative.button .active.button:active {\n  background-color: @negativeColorActive;\n  color: @negativeTextColor;\n  text-shadow: @negativeTextShadow;\n}\n\n/* Basic */\n.ui.basic.negative.buttons .button,\n.ui.basic.negative.button {\n  box-shadow: 0px 0px 0px @basicBorderSize @negativeColor inset !important;\n  color: @negativeColor !important;\n}\n.ui.basic.negative.buttons .button:hover,\n.ui.basic.negative.button:hover {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @negativeColorHover inset !important;\n  color: @negativeColorHover !important;\n}\n.ui.basic.negative.buttons .button:focus,\n.ui.basic.negative.button:focus {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @negativeColorFocus inset !important;\n  color: @negativeColorHover !important;\n}\n.ui.basic.negative.buttons .active.button,\n.ui.basic.negative.active.button {\n  background: transparent !important;\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @negativeColorActive inset !important;\n  color: @negativeColorDown !important;\n}\n.ui.basic.negative.buttons .button:active,\n.ui.basic.negative.button:active {\n  box-shadow: 0px 0px 0px @basicColoredBorderSize @negativeColorDown inset !important;\n  color: @negativeColorDown !important;\n}\n.ui.buttons:not(.vertical) > .basic.primary.button:not(:first-child) {\n  margin-left: -@basicColoredBorderSize;\n}\n\n/*******************************\n            Groups\n*******************************/\n\n.ui.buttons {\n  display: inline-flex;\n  flex-direction: row;\n  font-size: 0em;\n  vertical-align: baseline;\n  margin: @verticalMargin @horizontalMargin 0em 0em;\n}\n.ui.buttons:not(.basic):not(.inverted) {\n  box-shadow: @groupBoxShadow;\n}\n\n/* Clearfix */\n.ui.buttons:after {\n  content: \".\";\n  display: block;\n  height: 0;\n  clear: both;\n  visibility: hidden;\n}\n\n/* Standard Group */\n.ui.buttons .button {\n  flex: 1 0 auto;\n  margin: 0em;\n  border-radius: 0em;\n  margin: @groupButtonOffset;\n}\n.ui.buttons > .ui.button:not(.basic):not(.inverted),\n.ui.buttons:not(.basic):not(.inverted) > .button {\n  box-shadow: @groupButtonBoxShadow;\n}\n\n.ui.buttons .button:first-child {\n  border-left: none;\n  margin-left: 0em;\n  border-top-left-radius: @borderRadius;\n  border-bottom-left-radius: @borderRadius;\n}\n.ui.buttons .button:last-child {\n  border-top-right-radius: @borderRadius;\n  border-bottom-right-radius: @borderRadius;\n}\n\n/* Vertical  Style */\n.ui.vertical.buttons {\n  display: inline-flex;\n  flex-direction: column;\n}\n.ui.vertical.buttons .button {\n  display: block;\n  float: none;\n  width: 100%;\n  margin: @verticalGroupOffset;\n  box-shadow: @verticalBoxShadow;\n  border-radius: 0em;\n}\n.ui.vertical.buttons .button:first-child {\n  border-top-left-radius: @borderRadius;\n  border-top-right-radius: @borderRadius;\n}\n.ui.vertical.buttons .button:last-child {\n  margin-bottom: 0px;\n  border-bottom-left-radius: @borderRadius;\n  border-bottom-right-radius: @borderRadius;\n}\n.ui.vertical.buttons .button:only-child {\n  border-radius: @borderRadius;\n}\n\n.loadUIOverrides();\n\n"
  },
  {
    "path": "semantic/src/definitions/elements/container.less",
    "content": "/*!\n * # Semantic UI - Container\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n/*******************************\n            Theme\n*******************************/\n\n@type    : 'element';\n@element : 'container';\n\n@import (multiple) '../../theme.config';\n\n/*******************************\n            Container\n*******************************/\n\n/* All Sizes */\n.ui.container {\n  display: block;\n  max-width: @maxWidth !important;\n}\n\n/* Mobile */\n@media only screen and (max-width: @largestMobileScreen) {\n  .ui.container {\n    width: @mobileWidth !important;\n    margin-left: @mobileGutter !important;\n    margin-right: @mobileGutter !important;\n  }\n  .ui.grid.container {\n    width: @mobileGridWidth !important;\n  }\n  .ui.relaxed.grid.container {\n    width: @mobileRelaxedGridWidth !important;\n  }\n  .ui.very.relaxed.grid.container {\n    width: @mobileVeryRelaxedGridWidth !important;\n  }\n}\n\n/* Tablet */\n@media only screen and (min-width: @tabletBreakpoint) and (max-width: @largestTabletScreen) {\n  .ui.container {\n    width: @tabletWidth;\n    margin-left: @tabletGutter !important;\n    margin-right: @tabletGutter !important;\n  }\n  .ui.grid.container {\n    width: @tabletGridWidth !important;\n  }\n  .ui.relaxed.grid.container {\n    width: @tabletRelaxedGridWidth !important;\n  }\n  .ui.very.relaxed.grid.container {\n    width: @tabletVeryRelaxedGridWidth !important;\n  }\n}\n\n/* Small Monitor */\n@media only screen and (min-width: @computerBreakpoint) and (max-width: @largestSmallMonitor) {\n  .ui.container {\n    width: @computerWidth;\n    margin-left: @computerGutter !important;\n    margin-right: @computerGutter !important;\n  }\n  .ui.grid.container {\n    width: @computerGridWidth !important;\n  }\n  .ui.relaxed.grid.container {\n    width: @computerRelaxedGridWidth !important;\n  }\n  .ui.very.relaxed.grid.container {\n    width: @computerVeryRelaxedGridWidth !important;\n  }\n}\n\n/* Large Monitor */\n@media only screen and (min-width: @largeMonitorBreakpoint) {\n  .ui.container {\n    width: @largeMonitorWidth;\n    margin-left: @largeMonitorGutter !important;\n    margin-right: @largeMonitorGutter !important;\n  }\n  .ui.grid.container {\n    width: @largeMonitorGridWidth !important;\n  }\n  .ui.relaxed.grid.container {\n    width: @largeMonitorRelaxedGridWidth !important;\n  }\n  .ui.very.relaxed.grid.container {\n    width: @largeMonitorVeryRelaxedGridWidth !important;\n  }\n}\n\n/*******************************\n             Types\n*******************************/\n\n\n/* Text Container */\n.ui.text.container {\n  font-family: @textFontFamily;\n  max-width: @textWidth !important;\n  line-height: @textLineHeight;\n}\n\n.ui.text.container {\n  font-size: @textSize;\n}\n\n/* Fluid */\n.ui.fluid.container {\n  width: 100%;\n}\n\n\n/*******************************\n           Variations\n*******************************/\n\n.ui[class*=\"left aligned\"].container {\n  text-align: left;\n}\n.ui[class*=\"center aligned\"].container {\n  text-align: center;\n}\n.ui[class*=\"right aligned\"].container {\n  text-align: right;\n}\n.ui.justified.container {\n  text-align: justify;\n  hyphens: auto;\n}\n\n\n.loadUIOverrides();\n"
  },
  {
    "path": "semantic/src/definitions/elements/divider.less",
    "content": "/*!\n * # Semantic UI - Divider\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n/*******************************\n            Theme\n*******************************/\n\n@type    : 'element';\n@element : 'divider';\n\n@import (multiple) '../../theme.config';\n\n\n/*******************************\n            Divider\n*******************************/\n\n.ui.divider {\n  margin: @margin;\n\n  line-height: 1;\n  height: 0em;\n\n  font-weight: @fontWeight;\n  text-transform: @textTransform;\n  letter-spacing: @letterSpacing;\n  color: @color;\n\n  user-select: none;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\n/*--------------\n      Basic\n---------------*/\n\n.ui.divider:not(.vertical):not(.horizontal) {\n  border-top: @shadowWidth solid @shadowColor;\n  border-bottom: @highlightWidth solid @highlightColor;\n}\n\n/*--------------\n    Coupling\n---------------*/\n\n/* Allow divider between each column row */\n.ui.grid > .column + .divider,\n.ui.grid > .row > .column + .divider {\n  left: auto;\n}\n\n/*--------------\n   Horizontal\n---------------*/\n\n.ui.horizontal.divider {\n  display: table;\n  white-space: nowrap;\n\n  height: auto;\n  margin: @horizontalMargin;\n  line-height: 1;\n  text-align: center;\n}\n\n.ui.horizontal.divider:before,\n.ui.horizontal.divider:after {\n  content: '';\n  display: table-cell;\n  position: relative;\n  top: 50%;\n  width: 50%;\n  background-repeat: no-repeat;\n}\n\n.ui.horizontal.divider:before {\n  background-position: right @horizontalDividerMargin top 50%;\n}\n.ui.horizontal.divider:after {\n  background-position: left @horizontalDividerMargin top 50%;\n}\n\n/*--------------\n    Vertical\n---------------*/\n\n.ui.vertical.divider {\n  position: absolute;\n  z-index: 2;\n  top: 50%;\n  left: 50%;\n\n  margin: 0rem;\n  padding: 0em;\n  width: auto;\n  height: 50%;\n\n  line-height: 0em;\n  text-align: center;\n  transform: translateX(-50%);\n}\n\n.ui.vertical.divider:before,\n.ui.vertical.divider:after {\n  position: absolute;\n  left: 50%;\n  content: '';\n  z-index: 3;\n\n  border-left: @shadowWidth solid @shadowColor;\n  border-right: @highlightWidth solid @highlightColor;\n\n  width: 0%;\n  height: @verticalDividerHeight;\n}\n\n.ui.vertical.divider:before {\n  top: -100%;\n}\n.ui.vertical.divider:after {\n  top: auto;\n  bottom: 0px;\n}\n\n/* Inside grid */\n@media only screen and (max-width : @largestMobileScreen) {\n\n  .ui.stackable.grid .ui.vertical.divider,\n  .ui.grid .stackable.row .ui.vertical.divider {\n    display: table;\n    white-space: nowrap;\n    height: auto;\n    margin: @horizontalMargin;\n    overflow: hidden;\n    line-height: 1;\n    text-align: center;\n    position: static;\n    top: 0;\n    left: 0;\n    transform: none;\n  }\n\n  .ui.stackable.grid .ui.vertical.divider:before,\n  .ui.grid .stackable.row .ui.vertical.divider:before,\n  .ui.stackable.grid .ui.vertical.divider:after,\n  .ui.grid .stackable.row .ui.vertical.divider:after {\n    position: static;\n    left: 0;\n    border-left: none;\n    border-right: none;\n    content: '';\n    display: table-cell;\n    position: relative;\n    top: 50%;\n    width: 50%;\n    background-repeat: no-repeat;\n  }\n\n  .ui.stackable.grid .ui.vertical.divider:before,\n  .ui.grid .stackable.row .ui.vertical.divider:before {\n    background-position: right @horizontalDividerMargin top 50%;\n  }\n  .ui.stackable.grid .ui.vertical.divider:after,\n  .ui.grid .stackable.row .ui.vertical.divider:after {\n    background-position: left @horizontalDividerMargin top 50%;\n  }\n}\n\n/*--------------\n      Icon\n---------------*/\n\n.ui.divider > .icon {\n  margin: @dividerIconMargin;\n  font-size: @dividerIconSize;\n  height: 1em;\n  vertical-align: middle;\n}\n\n/*******************************\n          Variations\n*******************************/\n\n/*--------------\n    Hidden\n---------------*/\n\n.ui.hidden.divider {\n  border-color: transparent !important;\n}\n.ui.hidden.divider:before,\n.ui.hidden.divider:after {\n  display: none;\n}\n\n/*--------------\n    Inverted\n---------------*/\n\n.ui.divider.inverted,\n.ui.vertical.inverted.divider,\n.ui.horizontal.inverted.divider {\n  color: @invertedTextColor;\n}\n.ui.divider.inverted,\n.ui.divider.inverted:after,\n.ui.divider.inverted:before {\n  border-top-color: @invertedShadowColor !important;\n  border-left-color: @invertedShadowColor !important;\n  border-bottom-color: @invertedHighlightColor !important;\n  border-right-color: @invertedHighlightColor !important;\n}\n\n/*--------------\n    Fitted\n---------------*/\n\n.ui.fitted.divider {\n  margin: 0em;\n}\n\n/*--------------\n    Clearing\n---------------*/\n\n.ui.clearing.divider {\n  clear: both;\n}\n\n/*--------------\n    Section\n---------------*/\n\n.ui.section.divider {\n  margin-top: @sectionMargin;\n  margin-bottom: @sectionMargin;\n}\n\n/*--------------\n     Sizes\n---------------*/\n\n.ui.divider {\n  font-size: @medium;\n}\n\n\n.loadUIOverrides();\n"
  },
  {
    "path": "semantic/src/definitions/elements/flag.less",
    "content": "/*!\n * # Semantic UI - Flag\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n            Theme\n*******************************/\n\n@type    : 'element';\n@element : 'flag';\n\n@import (multiple) '../../theme.config';\n\n\n/*******************************\n             Flag\n*******************************/\n\ni.flag:not(.icon) {\n  display: inline-block;\n\n  width: @width;\n  height: @height;\n\n  line-height: @height;\n  vertical-align: @verticalAlign;\n  margin: 0em @margin 0em 0em;\n\n  text-decoration: inherit;\n\n  speak: none;\n  font-smoothing: antialiased;\n  backface-visibility: hidden;\n}\n\n/* Sprite */\ni.flag:not(.icon):before {\n  display: inline-block;\n  content: '';\n  background: url(@spritePath) no-repeat -108px -1976px;\n  width: @width;\n  height: @height;\n}\n\n.loadUIOverrides();\n"
  },
  {
    "path": "semantic/src/definitions/elements/header.less",
    "content": "/*!\n * # Semantic UI - Header\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n            Theme\n*******************************/\n\n@type    : 'element';\n@element : 'header';\n\n@import (multiple) '../../theme.config';\n\n\n/*******************************\n            Header\n*******************************/\n\n/* Standard */\n.ui.header {\n  border: none;\n  margin: @margin;\n  padding: @verticalPadding @horizontalPadding;\n  font-family: @fontFamily;\n  font-weight: @fontWeight;\n  line-height: @lineHeight;\n  text-transform: @textTransform;\n  color: @textColor;\n}\n\n.ui.header:first-child {\n  margin-top: @firstMargin;\n}\n.ui.header:last-child {\n  margin-bottom: @lastMargin;\n}\n\n/*--------------\n   Sub Header\n---------------*/\n\n.ui.header .sub.header {\n  display: block;\n  font-weight: @normal;\n  padding: 0em;\n  margin: @subHeaderMargin;\n  font-size: @subHeaderFontSize;\n  line-height: @subHeaderLineHeight;\n  color: @subHeaderColor;\n}\n\n/*--------------\n      Icon\n---------------*/\n\n.ui.header > .icon {\n  display: table-cell;\n  opacity: @iconOpacity;\n  font-size: @iconSize;\n  padding-top: @iconOffset;\n  vertical-align: @iconAlignment;\n}\n\n/* With Text Node */\n.ui.header .icon:only-child {\n  display: inline-block;\n  padding: 0em;\n  margin-right: @iconMargin;\n}\n\n/*-------------------\n        Image\n--------------------*/\n\n.ui.header > .image:not(.icon),\n.ui.header > img {\n  display: inline-block;\n  margin-top: @imageOffset;\n  width: @imageWidth;\n  height: @imageHeight;\n  vertical-align: @imageAlignment;\n}\n.ui.header > .image:not(.icon):only-child,\n.ui.header > img:only-child {\n  margin-right: @imageMargin;\n}\n\n/*--------------\n     Content\n---------------*/\n\n.ui.header .content {\n  display: inline-block;\n  vertical-align: @contentAlignment;\n}\n\n/* After Image */\n.ui.header > img + .content,\n.ui.header > .image + .content {\n  padding-left: @imageMargin;\n  vertical-align: @contentImageAlignment;\n}\n\n/* After Icon */\n.ui.header > .icon + .content {\n  padding-left: @iconMargin;\n  display: table-cell;\n  vertical-align: @contentIconAlignment;\n}\n\n\n/*--------------\n Loose Coupling\n---------------*/\n\n.ui.header .ui.label {\n  font-size: @labelSize;\n  margin-left: @labelDistance;\n  vertical-align: @labelVerticalAlign;\n}\n\n/* Positioning */\n.ui.header + p {\n  margin-top: @nextParagraphDistance;\n}\n\n\n\n/*******************************\n            Types\n*******************************/\n\n\n/*--------------\n     Page\n---------------*/\n\nh1.ui.header {\n  font-size: @h1;\n}\nh2.ui.header {\n  font-size: @h2;\n}\nh3.ui.header {\n  font-size: @h3;\n}\nh4.ui.header {\n  font-size: @h4;\n}\nh5.ui.header {\n  font-size: @h5;\n}\n\n\n/* Sub Header */\nh1.ui.header .sub.header {\n  font-size: @h1SubHeaderFontSize;\n}\nh2.ui.header .sub.header {\n  font-size: @h2SubHeaderFontSize;\n}\nh3.ui.header .sub.header {\n  font-size: @h3SubHeaderFontSize;\n}\nh4.ui.header .sub.header {\n  font-size: @h4SubHeaderFontSize;\n}\nh5.ui.header .sub.header {\n  font-size: @h5SubHeaderFontSize;\n}\n\n\n/*--------------\n Content Heading\n---------------*/\n\n.ui.huge.header {\n  min-height: 1em;\n  font-size: @hugeFontSize;\n}\n.ui.large.header {\n  font-size: @largeFontSize;\n}\n.ui.medium.header {\n  font-size: @mediumFontSize;\n}\n.ui.small.header {\n  font-size: @smallFontSize;\n}\n.ui.tiny.header {\n  font-size: @tinyFontSize;\n}\n\n/* Sub Header */\n.ui.huge.header .sub.header {\n  font-size: @hugeSubHeaderFontSize;\n}\n.ui.large.header .sub.header {\n  font-size: @hugeSubHeaderFontSize;\n}\n.ui.header .sub.header {\n  font-size: @subHeaderFontSize;\n}\n.ui.small.header .sub.header {\n  font-size: @smallSubHeaderFontSize;\n}\n.ui.tiny.header .sub.header {\n  font-size: @tinySubHeaderFontSize;\n}\n\n/*--------------\n   Sub Heading\n---------------*/\n\n.ui.sub.header {\n  padding: 0em;\n  margin-bottom: @subHeadingDistance;\n  font-weight: @subHeadingFontWeight;\n  font-size: @subHeadingFontSize;\n  text-transform: @subHeadingTextTransform;\n  color: @subHeadingColor;\n}\n\n.ui.small.sub.header {\n  font-size: @smallSubHeadingSize;\n}\n.ui.sub.header {\n  font-size: @subHeadingFontSize;\n}\n.ui.large.sub.header {\n  font-size: @largeSubHeadingSize;\n}\n.ui.huge.sub.header {\n  font-size: @hugeSubHeadingSize;\n}\n\n\n\n/*-------------------\n        Icon\n--------------------*/\n\n.ui.icon.header {\n  display: inline-block;\n  text-align: center;\n  margin: @iconHeaderTopMargin 0em @iconHeaderBottomMargin;\n}\n.ui.icon.header:after {\n  content: '';\n  display: block;\n  height: 0px;\n  clear: both;\n  visibility: hidden;\n}\n\n.ui.icon.header:first-child {\n  margin-top: @iconHeaderFirstMargin;\n}\n.ui.icon.header .icon {\n  float: none;\n  display: block;\n  width: auto;\n  height: auto;\n  line-height: 1;\n  padding: 0em;\n  font-size: @iconHeaderSize;\n  margin: 0em auto @iconHeaderMargin;\n  opacity: @iconHeaderOpacity;\n}\n.ui.icon.header .content {\n  display: block;\n  padding: 0em;\n}\n.ui.icon.header .circular.icon {\n  font-size: @circularHeaderIconSize;\n}\n.ui.icon.header .square.icon {\n  font-size: @squareHeaderIconSize;\n}\n.ui.block.icon.header .icon {\n  margin-bottom: 0em;\n}\n.ui.icon.header.aligned {\n  margin-left: auto;\n  margin-right: auto;\n  display: block;\n}\n\n/*******************************\n            States\n*******************************/\n\n.ui.disabled.header {\n  opacity: @disabledOpacity;\n}\n\n\n/*******************************\n           Variations\n*******************************/\n\n/*-------------------\n      Inverted\n--------------------*/\n\n.ui.inverted.header {\n  color: @invertedColor;\n}\n.ui.inverted.header .sub.header {\n  color: @invertedSubHeaderColor;\n}\n.ui.inverted.attached.header {\n  background: @invertedAttachedBackground;\n  box-shadow: none;\n  border-color: transparent;\n}\n.ui.inverted.block.header {\n  background: @invertedBlockBackground;\n  box-shadow: none;\n}\n.ui.inverted.block.header {\n  border-bottom: none;\n}\n\n\n/*-------------------\n       Colors\n--------------------*/\n\n/*--- Red ---*/\n.ui.red.header {\n  color: @red !important;\n}\na.ui.red.header:hover {\n  color: @redHover !important;\n}\n.ui.red.dividing.header {\n  border-bottom: @dividedColoredBorderWidth solid @red;\n}\n\n/* Inverted */\n.ui.inverted.red.header {\n  color: @lightRed !important;\n}\na.ui.inverted.red.header:hover {\n  color: @lightRedHover !important;\n}\n\n/*--- Orange ---*/\n.ui.orange.header {\n  color: @orange !important;\n}\na.ui.orange.header:hover {\n  color: @orangeHover !important;\n}\n.ui.orange.dividing.header {\n  border-bottom: @dividedColoredBorderWidth solid @orange;\n}\n/* Inverted */\n.ui.inverted.orange.header {\n  color: @lightOrange !important;\n}\na.ui.inverted.orange.header:hover {\n  color: @lightOrangeHover !important;\n}\n\n/*--- Olive ---*/\n.ui.olive.header {\n  color: @olive !important;\n}\na.ui.olive.header:hover {\n  color: @oliveHover !important;\n}\n.ui.olive.dividing.header {\n  border-bottom: @dividedColoredBorderWidth solid @olive;\n}\n/* Inverted */\n.ui.inverted.olive.header {\n  color: @lightOlive !important;\n}\na.ui.inverted.olive.header:hover {\n  color: @lightOliveHover !important;\n}\n\n/*--- Yellow ---*/\n.ui.yellow.header {\n  color: @yellow !important;\n}\na.ui.yellow.header:hover {\n  color: @yellowHover !important;\n}\n.ui.yellow.dividing.header {\n  border-bottom: @dividedColoredBorderWidth solid @yellow;\n}\n/* Inverted */\n.ui.inverted.yellow.header {\n  color: @lightYellow !important;\n}\na.ui.inverted.yellow.header:hover {\n  color: @lightYellowHover !important;\n}\n\n/*--- Green ---*/\n.ui.green.header {\n  color: @green !important;\n}\na.ui.green.header:hover {\n  color: @greenHover !important;\n}\n.ui.green.dividing.header {\n  border-bottom: @dividedColoredBorderWidth solid @green;\n}\n/* Inverted */\n.ui.inverted.green.header {\n  color: @lightGreen !important;\n}\na.ui.inverted.green.header:hover {\n  color: @lightGreenHover !important;\n}\n\n/*--- Teal ---*/\n.ui.teal.header {\n  color: @teal !important;\n}\na.ui.teal.header:hover {\n  color: @tealHover !important;\n}\n.ui.teal.dividing.header {\n  border-bottom: @dividedColoredBorderWidth solid @teal;\n}\n/* Inverted */\n.ui.inverted.teal.header {\n  color: @lightTeal !important;\n}\na.ui.inverted.teal.header:hover {\n  color: @lightTealHover !important;\n}\n\n/*--- Blue ---*/\n.ui.blue.header {\n  color: @blue !important;\n}\na.ui.blue.header:hover {\n  color: @blueHover !important;\n}\n.ui.blue.dividing.header {\n  border-bottom: @dividedColoredBorderWidth solid @blue;\n}\n/* Inverted */\n.ui.inverted.blue.header {\n  color: @lightBlue !important;\n}\na.ui.inverted.blue.header:hover {\n  color: @lightBlueHover !important;\n}\n\n/*--- Violet ---*/\n.ui.violet.header {\n  color: @violet !important;\n}\na.ui.violet.header:hover {\n  color: @violetHover !important;\n}\n.ui.violet.dividing.header {\n  border-bottom: @dividedColoredBorderWidth solid @violet;\n}\n/* Inverted */\n.ui.inverted.violet.header {\n  color: @lightViolet !important;\n}\na.ui.inverted.violet.header:hover {\n  color: @lightVioletHover !important;\n}\n\n/*--- Purple ---*/\n.ui.purple.header {\n  color: @purple !important;\n}\na.ui.purple.header:hover {\n  color: @purpleHover !important;\n}\n.ui.purple.dividing.header {\n  border-bottom: @dividedColoredBorderWidth solid @purple;\n}\n/* Inverted */\n.ui.inverted.purple.header {\n  color: @lightPurple !important;\n}\na.ui.inverted.purple.header:hover {\n  color: @lightPurpleHover !important;\n}\n\n/*--- Pink ---*/\n.ui.pink.header {\n  color: @pink !important;\n}\na.ui.pink.header:hover {\n  color: @pinkHover !important;\n}\n.ui.pink.dividing.header {\n  border-bottom: @dividedColoredBorderWidth solid @pink;\n}\n/* Inverted */\n.ui.inverted.pink.header {\n  color: @lightPink !important;\n}\na.ui.inverted.pink.header:hover {\n  color: @lightPinkHover !important;\n}\n\n/*--- Brown ---*/\n.ui.brown.header {\n  color: @brown !important;\n}\na.ui.brown.header:hover {\n  color: @brownHover !important;\n}\n.ui.brown.dividing.header {\n  border-bottom: @dividedColoredBorderWidth solid @brown;\n}\n/* Inverted */\n.ui.inverted.brown.header {\n  color: @lightBrown !important;\n}\na.ui.inverted.brown.header:hover {\n  color: @lightBrownHover !important;\n}\n\n/*--- Grey ---*/\n.ui.grey.header {\n  color: @grey !important;\n}\na.ui.grey.header:hover {\n  color: @greyHover !important;\n}\n.ui.grey.dividing.header {\n  border-bottom: @dividedColoredBorderWidth solid @grey;\n}\n/* Inverted */\n.ui.inverted.grey.header {\n  color: @lightGrey !important;\n}\na.ui.inverted.grey.header:hover {\n  color: @lightGreyHover !important;\n}\n\n\n/*-------------------\n       Aligned\n--------------------*/\n\n.ui.left.aligned.header {\n  text-align: left;\n}\n.ui.right.aligned.header {\n  text-align: right;\n}\n.ui.centered.header,\n.ui.center.aligned.header {\n  text-align: center;\n}\n.ui.justified.header {\n  text-align: justify;\n}\n.ui.justified.header:after {\n  display: inline-block;\n  content: '';\n  width: 100%;\n}\n\n/*-------------------\n       Floated\n--------------------*/\n\n.ui.floated.header,\n.ui[class*=\"left floated\"].header {\n  float: left;\n  margin-top: 0em;\n  margin-right: @floatedMargin;\n}\n.ui[class*=\"right floated\"].header {\n  float: right;\n  margin-top: 0em;\n  margin-left: @floatedMargin;\n}\n\n/*-------------------\n       Fitted\n--------------------*/\n\n.ui.fitted.header {\n  padding: 0em;\n}\n\n\n/*-------------------\n      Dividing\n--------------------*/\n\n.ui.dividing.header {\n  padding-bottom: @dividedBorderPadding;\n  border-bottom: @dividedBorder;\n}\n.ui.dividing.header .sub.header {\n  padding-bottom: @dividedSubHeaderPadding;\n}\n.ui.dividing.header .icon {\n  margin-bottom: @dividedIconPadding;\n}\n\n.ui.inverted.dividing.header {\n  border-bottom-color: @invertedDividedBorderColor;\n}\n\n\n/*-------------------\n        Block\n--------------------*/\n\n.ui.block.header {\n  background: @blockBackground;\n  padding: @blockVerticalPadding @blockHorizontalPadding;\n  box-shadow: @blockBoxShadow;\n  border: @blockBorder;\n  border-radius: @blockBorderRadius;\n}\n\n.ui.tiny.block.header {\n  font-size: @tinyBlock;\n}\n.ui.small.block.header {\n  font-size: @smallBlock;\n}\n.ui.block.header:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6) {\n  font-size: @mediumBlock;\n}\n.ui.large.block.header {\n  font-size: @largeBlock;\n}\n.ui.huge.block.header {\n  font-size: @hugeBlock;\n}\n\n/*-------------------\n       Attached\n--------------------*/\n\n.ui.attached.header {\n  background: @attachedBackground;\n  padding: @attachedVerticalPadding @attachedHorizontalPadding;\n  margin-left: @attachedOffset;\n  margin-right: @attachedOffset;\n  box-shadow: @attachedBoxShadow;\n  border: @attachedBorder;\n}\n.ui.attached.block.header {\n  background: @blockBackground;\n}\n\n.ui.attached:not(.top):not(.bottom).header {\n  margin-top: 0em;\n  margin-bottom: 0em;\n  border-top: none;\n  border-radius: 0em;\n}\n.ui.top.attached.header {\n  margin-bottom: 0em;\n  border-radius: @attachedBorderRadius @attachedBorderRadius 0em 0em;\n}\n.ui.bottom.attached.header {\n  margin-top: 0em;\n  border-top: none;\n  border-radius: 0em 0em @attachedBorderRadius @attachedBorderRadius;\n}\n\n/* Attached Sizes */\n.ui.tiny.attached.header {\n  font-size: @tinyAttachedSize;\n}\n.ui.small.attached.header {\n  font-size: @smallAttachedSize;\n}\n.ui.attached.header:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6) {\n  font-size: @mediumAttachedSize;\n}\n.ui.large.attached.header {\n  font-size: @largeAttachedSize;\n}\n.ui.huge.attached.header {\n  font-size: @hugeAttachedSize;\n}\n\n/*-------------------\n        Sizing\n--------------------*/\n\n.ui.header:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6) {\n  font-size: @mediumFontSize;\n}\n\n.loadUIOverrides();\n"
  },
  {
    "path": "semantic/src/definitions/elements/icon.less",
    "content": "/*!\n * # Semantic UI - Icon\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n            Theme\n*******************************/\n\n@type    : 'element';\n@element : 'icon';\n\n@import (multiple) '../../theme.config';\n\n\n/*******************************\n             Icon\n*******************************/\n\n@font-face {\n  font-family: 'Icons';\n  src: @fallbackSRC;\n  src: @src;\n  font-style: normal;\n  font-weight: @normal;\n  font-variant: normal;\n  text-decoration: inherit;\n  text-transform: none;\n}\n\ni.icon {\n  display: inline-block;\n  opacity: @opacity;\n\n  margin: 0em @distanceFromText 0em 0em;\n\n  width: @width;\n  height: @height;\n\n  font-family: 'Icons';\n  font-style: normal;\n  font-weight: @normal;\n  text-decoration: inherit;\n  text-align: center;\n\n  speak: none;\n  font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  -webkit-font-smoothing: antialiased;\n  backface-visibility: hidden;\n}\n\ni.icon:before {\n  background: none !important;\n}\n\n/*******************************\n             Types\n*******************************/\n\n/*--------------\n    Loading\n---------------*/\n\ni.icon.loading {\n  height: 1em;\n  line-height: 1;\n  animation: icon-loading @loadingDuration linear infinite;\n}\n@keyframes icon-loading {\n from {\n    transform: rotate(0deg);\n }\n to {\n    transform: rotate(360deg);\n }\n}\n\n/*******************************\n             States\n*******************************/\n\ni.icon.hover {\n  opacity: 1 !important;\n}\n\ni.icon.active {\n  opacity: 1 !important;\n}\n\ni.emphasized.icon {\n  opacity: 1 !important;\n}\n\ni.disabled.icon {\n  opacity: @disabledOpacity !important;\n}\n\n\n/*******************************\n           Variations\n*******************************/\n\n\n/*-------------------\n        Fitted\n--------------------*/\n\ni.fitted.icon {\n  width: auto;\n  margin: 0em !important;\n}\n\n/*-------------------\n         Link\n--------------------*/\n\ni.link.icon, i.link.icons {\n  cursor: pointer;\n  opacity: @linkOpacity;\n  transition: opacity @defaultDuration @defaultEasing;\n}\ni.link.icon:hover, i.link.icons:hover {\n  opacity: 1 !important;\n}\n\n/*-------------------\n      Circular\n--------------------*/\n\ni.circular.icon {\n  border-radius: 500em !important;\n  line-height: 1 !important;\n\n  padding: @circularPadding !important;\n  box-shadow: @circularShadow;\n\n  width: @circularSize !important;\n  height: @circularSize !important;\n}\ni.circular.inverted.icon {\n  border: none;\n  box-shadow: none;\n}\n\n/*-------------------\n      Flipped\n--------------------*/\n\ni.flipped.icon,\ni.horizontally.flipped.icon {\n  transform: scale(-1, 1);\n}\ni.vertically.flipped.icon {\n  transform: scale(1, -1);\n}\n\n/*-------------------\n      Rotated\n--------------------*/\n\ni.rotated.icon,\ni.right.rotated.icon,\ni.clockwise.rotated.icon {\n  transform: rotate(90deg);\n}\n\ni.left.rotated.icon,\ni.counterclockwise.rotated.icon {\n  transform: rotate(-90deg);\n}\n\n/*-------------------\n      Bordered\n--------------------*/\n\ni.bordered.icon {\n  line-height: 1;\n  vertical-align: baseline;\n\n  width: @borderedSize;\n  height: @borderedSize;\n  padding: @borderedVerticalPadding @borderedHorizontalPadding !important;\n  box-shadow: @borderedShadow;\n}\ni.bordered.inverted.icon {\n  border: none;\n  box-shadow: none;\n}\n\n/*-------------------\n      Inverted\n--------------------*/\n\n/* Inverted Shapes */\ni.inverted.bordered.icon,\ni.inverted.circular.icon {\n  background-color: @black !important;\n  color: @white !important;\n}\n\ni.inverted.icon {\n  color: @white;\n}\n\n\n/*-------------------\n       Colors\n--------------------*/\n\n/* Red */\ni.red.icon {\n  color: @red !important;\n}\ni.inverted.red.icon {\n  color: @lightRed !important;\n}\ni.inverted.bordered.red.icon,\ni.inverted.circular.red.icon {\n  background-color: @red !important;\n  color: @white !important;\n}\n\n/* Orange */\ni.orange.icon {\n  color: @orange !important;\n}\ni.inverted.orange.icon {\n  color: @lightOrange !important;\n}\ni.inverted.bordered.orange.icon,\ni.inverted.circular.orange.icon {\n  background-color: @orange !important;\n  color: @white !important;\n}\n\n/* Yellow */\ni.yellow.icon {\n  color: @yellow !important;\n}\ni.inverted.yellow.icon {\n  color: @lightYellow !important;\n}\ni.inverted.bordered.yellow.icon,\ni.inverted.circular.yellow.icon {\n  background-color: @yellow !important;\n  color: @white !important;\n}\n\n/* Olive */\ni.olive.icon {\n  color: @olive !important;\n}\ni.inverted.olive.icon {\n  color: @lightOlive !important;\n}\ni.inverted.bordered.olive.icon,\ni.inverted.circular.olive.icon {\n  background-color: @olive !important;\n  color: @white !important;\n}\n\n/* Green */\ni.green.icon {\n  color: @green !important;\n}\ni.inverted.green.icon {\n  color: @lightGreen !important;\n}\ni.inverted.bordered.green.icon,\ni.inverted.circular.green.icon {\n  background-color: @green !important;\n  color: @white !important;\n}\n\n/* Teal */\ni.teal.icon {\n  color: @teal !important;\n}\ni.inverted.teal.icon {\n  color: @lightTeal !important;\n}\ni.inverted.bordered.teal.icon,\ni.inverted.circular.teal.icon {\n  background-color: @teal !important;\n  color: @white !important;\n}\n\n/* Blue */\ni.blue.icon {\n  color: @blue !important;\n}\ni.inverted.blue.icon {\n  color: @lightBlue !important;\n}\ni.inverted.bordered.blue.icon,\ni.inverted.circular.blue.icon {\n  background-color: @blue !important;\n  color: @white !important;\n}\n\n/* Violet */\ni.violet.icon {\n  color: @violet !important;\n}\ni.inverted.violet.icon {\n  color: @lightViolet !important;\n}\ni.inverted.bordered.violet.icon,\ni.inverted.circular.violet.icon {\n  background-color: @violet !important;\n  color: @white !important;\n}\n\n/* Purple */\ni.purple.icon {\n  color: @purple !important;\n}\ni.inverted.purple.icon {\n  color: @lightPurple !important;\n}\ni.inverted.bordered.purple.icon,\ni.inverted.circular.purple.icon {\n  background-color: @purple !important;\n  color: @white !important;\n}\n\n/* Pink */\ni.pink.icon {\n  color: @pink !important;\n}\ni.inverted.pink.icon {\n  color: @lightPink !important;\n}\ni.inverted.bordered.pink.icon,\ni.inverted.circular.pink.icon {\n  background-color: @pink !important;\n  color: @white !important;\n}\n\n/* Brown */\ni.brown.icon {\n  color: @brown !important;\n}\ni.inverted.brown.icon {\n  color: @lightBrown !important;\n}\ni.inverted.bordered.brown.icon,\ni.inverted.circular.brown.icon {\n  background-color: @brown !important;\n  color: @white !important;\n}\n\n/* Grey */\ni.grey.icon {\n  color: @grey !important;\n}\ni.inverted.grey.icon {\n  color: @lightGrey !important;\n}\ni.inverted.bordered.grey.icon,\ni.inverted.circular.grey.icon {\n  background-color: @grey !important;\n  color: @white !important;\n}\n\n/* Black */\ni.black.icon {\n  color: @black !important;\n}\ni.inverted.black.icon {\n  color: @lightBlack !important;\n}\ni.inverted.bordered.black.icon,\ni.inverted.circular.black.icon {\n  background-color: @black !important;\n  color: @white !important;\n}\n\n/*-------------------\n        Sizes\n--------------------*/\n\ni.mini.icon,\ni.mini.icons {\n  line-height: 1;\n  font-size: @mini;\n}\ni.tiny.icon,\ni.tiny.icons {\n  line-height: 1;\n  font-size: @tiny;\n}\ni.small.icon,\ni.small.icons {\n  line-height: 1;\n  font-size: @small;\n}\ni.icon,\ni.icons {\n  font-size: @medium;\n}\ni.large.icon,\ni.large.icons {\n  line-height: 1;\n  vertical-align: middle;\n  font-size: @large;\n}\ni.big.icon,\ni.big.icons {\n  line-height: 1;\n  vertical-align: middle;\n  font-size: @big;\n}\ni.huge.icon,\ni.huge.icons {\n  line-height: 1;\n  vertical-align: middle;\n  font-size: @huge;\n}\ni.massive.icon,\ni.massive.icons {\n  line-height: 1;\n  vertical-align: middle;\n  font-size: @massive;\n}\n\n/*******************************\n            Groups\n*******************************/\n\ni.icons {\n  display: inline-block;\n  position: relative;\n  line-height: 1;\n}\n\ni.icons .icon {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  transform: translateX(-50%) translateY(-50%);\n  margin: 0em;\n  margin: 0;\n}\n\ni.icons .icon:first-child {\n  position: static;\n  width: auto;\n  height: auto;\n  vertical-align: top;\n  transform: none;\n  margin-right: @distanceFromText;\n}\n\n/* Corner Icon */\ni.icons .corner.icon {\n  top: auto;\n  left: auto;\n  right: 0;\n  bottom: 0;\n  transform: none;\n  font-size: @cornerIconSize;\n  text-shadow: @cornerIconShadow;\n}\ni.icons .top.right.corner.icon {\n  top: 0;\n  left: auto;\n  right: 0;\n  bottom: auto;\n}\ni.icons .top.left.corner.icon {\n  top: 0;\n  left: 0;\n  right: auto;\n  bottom: auto;\n}\ni.icons .bottom.left.corner.icon {\n  top: auto;\n  left: 0;\n  right: auto;\n  bottom: 0;\n}\ni.icons .bottom.right.corner.icon {\n  top: auto;\n  left: auto;\n  right: 0;\n  bottom: 0;\n}\n\ni.icons .inverted.corner.icon {\n  text-shadow: @cornerIconInvertedShadow;\n}\n\n.loadUIOverrides();\n"
  },
  {
    "path": "semantic/src/definitions/elements/image.less",
    "content": "/*!\n * # Semantic UI - Image\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n            Theme\n*******************************/\n\n@type    : 'element';\n@element : 'image';\n\n@import (multiple) '../../theme.config';\n\n\n/*******************************\n             Image\n*******************************/\n\n.ui.image {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle;\n  max-width: 100%;\n  background-color: @placeholderColor;\n}\n\nimg.ui.image {\n  display: block;\n}\n\n.ui.image svg,\n.ui.image img {\n  display: block;\n  max-width: 100%;\n  height: auto;\n}\n\n\n/*******************************\n            States\n*******************************/\n\n.ui.hidden.images,\n.ui.hidden.image {\n  display: none;\n}\n.ui.hidden.transition.images,\n.ui.hidden.transition.image {\n  display: block;\n  visibility: hidden;\n}\n.ui.images > .hidden.transition {\n  display: inline-block;\n  visibility: hidden;\n}\n\n\n.ui.disabled.images,\n.ui.disabled.image {\n  cursor: default;\n  opacity: @disabledOpacity;\n}\n\n\n/*******************************\n          Variations\n*******************************/\n\n\n/*--------------\n     Inline\n---------------*/\n\n.ui.inline.image,\n.ui.inline.image svg,\n.ui.inline.image img {\n  display: inline-block;\n}\n\n/*------------------\n  Vertical Aligned\n-------------------*/\n\n.ui.top.aligned.images .image,\n.ui.top.aligned.image,\n.ui.top.aligned.image svg,\n.ui.top.aligned.image img {\n  display: inline-block;\n  vertical-align: top;\n}\n.ui.middle.aligned.images .image,\n.ui.middle.aligned.image,\n.ui.middle.aligned.image svg,\n.ui.middle.aligned.image img {\n  display: inline-block;\n  vertical-align: middle;\n}\n.ui.bottom.aligned.images .image,\n.ui.bottom.aligned.image,\n.ui.bottom.aligned.image svg,\n.ui.bottom.aligned.image img {\n  display: inline-block;\n  vertical-align: bottom;\n}\n\n/*--------------\n     Rounded\n---------------*/\n\n.ui.rounded.images .image,\n.ui.rounded.image,\n.ui.rounded.images .image > *,\n.ui.rounded.image > * {\n  border-radius: @roundedBorderRadius;\n}\n\n/*--------------\n    Bordered\n---------------*/\n\n.ui.bordered.images .image,\n.ui.bordered.images img,\n.ui.bordered.images svg,\n.ui.bordered.image img,\n.ui.bordered.image svg,\nimg.ui.bordered.image {\n  border: @imageBorder;\n}\n\n/*--------------\n    Circular\n---------------*/\n\n.ui.circular.images,\n.ui.circular.image {\n  overflow: hidden;\n}\n\n.ui.circular.images .image,\n.ui.circular.image,\n.ui.circular.images .image > *,\n.ui.circular.image > * {\n  -webkit-border-radius: @circularRadius;\n  -moz-border-radius: @circularRadius;\n  border-radius: @circularRadius;\n}\n\n/*--------------\n     Fluid\n---------------*/\n\n.ui.fluid.images,\n.ui.fluid.image,\n.ui.fluid.images img,\n.ui.fluid.images svg,\n.ui.fluid.image svg,\n.ui.fluid.image img {\n  display: block;\n  width: 100%;\n  height: auto;\n}\n\n\n/*--------------\n     Avatar\n---------------*/\n\n.ui.avatar.images .image,\n.ui.avatar.images img,\n.ui.avatar.images svg,\n.ui.avatar.image img,\n.ui.avatar.image svg,\n.ui.avatar.image {\n  margin-right: @avatarMargin;\n\n  display: inline-block;\n  width: @avatarSize;\n  height: @avatarSize;\n\n  -webkit-border-radius: @circularRadius;\n  -moz-border-radius: @circularRadius;\n  border-radius: @circularRadius;\n}\n\n/*-------------------\n       Spaced\n--------------------*/\n\n.ui.spaced.image {\n  display: inline-block !important;\n  margin-left: @spacedDistance;\n  margin-right: @spacedDistance;\n}\n\n.ui[class*=\"left spaced\"].image {\n  margin-left: @spacedDistance;\n  margin-right: 0em;\n}\n\n.ui[class*=\"right spaced\"].image {\n  margin-left: 0em;\n  margin-right: @spacedDistance;\n}\n\n/*-------------------\n       Floated\n--------------------*/\n\n.ui.floated.image,\n.ui.floated.images {\n  float: left;\n  margin-right: @floatedHorizontalMargin;\n  margin-bottom: @floatedVerticalMargin;\n}\n.ui.right.floated.images,\n.ui.right.floated.image {\n  float: right;\n  margin-right: 0em;\n  margin-bottom: @floatedVerticalMargin;\n  margin-left: @floatedHorizontalMargin;\n}\n\n.ui.floated.images:last-child,\n.ui.floated.image:last-child {\n  margin-bottom: 0em;\n}\n\n\n.ui.centered.images,\n.ui.centered.image {\n  margin-left: auto;\n  margin-right: auto;\n}\n\n/*--------------\n     Sizes\n---------------*/\n\n.ui.mini.images .image,\n.ui.mini.images img,\n.ui.mini.images svg,\n.ui.mini.image {\n  width: @miniWidth;\n  height: auto;\n  font-size: @mini;\n}\n.ui.tiny.images .image,\n.ui.tiny.images img,\n.ui.tiny.images svg,\n.ui.tiny.image {\n  width: @tinyWidth;\n  height: auto;\n  font-size: @tiny;\n}\n.ui.small.images .image,\n.ui.small.images img,\n.ui.small.images svg,\n.ui.small.image {\n  width: @smallWidth;\n  height: auto;\n  font-size: @small;\n}\n.ui.medium.images .image,\n.ui.medium.images img,\n.ui.medium.images svg,\n.ui.medium.image {\n  width: @mediumWidth;\n  height: auto;\n  font-size: @medium;\n}\n.ui.large.images .image,\n.ui.large.images img,\n.ui.large.images svg,\n.ui.large.image {\n  width: @largeWidth;\n  height: auto;\n  font-size: @large;\n}\n.ui.big.images .image,\n.ui.big.images img,\n.ui.big.images svg,\n.ui.big.image {\n  width: @bigWidth;\n  height: auto;\n  font-size: @big;\n}\n.ui.huge.images .image,\n.ui.huge.images img,\n.ui.huge.images svg,\n.ui.huge.image {\n  width: @hugeWidth;\n  height: auto;\n  font-size: @huge;\n}\n.ui.massive.images .image,\n.ui.massive.images img,\n.ui.massive.images svg,\n.ui.massive.image {\n  width: @massiveWidth;\n  height: auto;\n  font-size: @massive;\n}\n\n\n/*******************************\n              Groups\n*******************************/\n\n.ui.images {\n  font-size: 0em;\n  margin: 0em -@imageHorizontalMargin 0rem;\n}\n\n.ui.images .image,\n.ui.images > img,\n.ui.images > svg {\n  display: inline-block;\n  margin: 0em @imageHorizontalMargin @imageVerticalMargin;\n}\n\n.loadUIOverrides();\n"
  },
  {
    "path": "semantic/src/definitions/elements/input.less",
    "content": "/*!\n * # Semantic UI - Input\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n/*******************************\n            Theme\n*******************************/\n\n@type    : 'element';\n@element : 'input';\n\n@import (multiple) '../../theme.config';\n\n\n/*******************************\n           Standard\n*******************************/\n\n\n/*--------------------\n        Inputs\n---------------------*/\n\n.ui.input {\n  position: relative;\n  font-weight: @normal;\n  font-style: normal;\n  display: inline-flex;\n  color: @inputColor;\n}\n.ui.input > input {\n  margin: 0em;\n  max-width: 100%;\n  flex: 1 0 auto;\n  outline: none;\n  -webkit-tap-highlight-color: rgba(255, 255, 255, 0);\n  text-align: @textAlign;\n  line-height: @lineHeight;\n\n  font-family: @inputFont;\n  padding: @padding;\n\n  background: @background;\n  border: @border;\n  color: @inputColor;\n  border-radius: @borderRadius;\n  transition: @transition;\n\n  box-shadow: @boxShadow;\n}\n\n\n/*--------------------\n      Placeholder\n---------------------*/\n\n/* browsers require these rules separate */\n\n.ui.input > input::-webkit-input-placeholder {\n  color: @placeholderColor;\n}\n.ui.input > input::-moz-placeholder {\n  color: @placeholderColor;\n}\n.ui.input > input:-ms-input-placeholder {\n  color: @placeholderColor;\n}\n\n\n/*******************************\n            States\n*******************************/\n\n/*--------------------\n        Disabled\n---------------------*/\n\n.ui.disabled.input,\n.ui.input:not(.disabled) input[disabled] {\n  opacity: @disabledOpacity;\n}\n\n.ui.disabled.input > input,\n.ui.input:not(.disabled) input[disabled] {\n  pointer-events: none;\n}\n\n/*--------------------\n        Active\n---------------------*/\n\n.ui.input > input:active,\n.ui.input.down input {\n  border-color: @downBorderColor;\n  background: @downBackground;\n  color: @downColor;\n  box-shadow: @downBoxShadow;\n}\n\n/*--------------------\n       Loading\n---------------------*/\n\n.ui.loading.loading.input > i.icon:before {\n  position: absolute;\n  content: '';\n  top: 50%;\n  left: 50%;\n\n  margin: @loaderMargin;\n  width: @loaderSize;\n  height: @loaderSize;\n\n  border-radius: @circularRadius;\n  border: @loaderLineWidth solid @loaderFillColor;\n}\n.ui.loading.loading.input > i.icon:after {\n  position: absolute;\n  content: '';\n  top: 50%;\n  left: 50%;\n\n  margin: @loaderMargin;\n  width: @loaderSize;\n  height: @loaderSize;\n\n  animation: button-spin @loaderSpeed linear;\n  animation-iteration-count: infinite;\n\n  border-radius: @circularRadius;\n\n  border-color: @loaderLineColor transparent transparent;\n  border-style: solid;\n  border-width: @loaderLineWidth;\n\n  box-shadow: 0px 0px 0px 1px transparent;\n}\n\n\n/*--------------------\n        Focus\n---------------------*/\n\n.ui.input.focus > input,\n.ui.input > input:focus  {\n  border-color: @focusBorderColor;\n  background: @focusBackground;\n  color: @focusColor;\n  box-shadow: @focusBoxShadow;\n}\n.ui.input.focus > input::-webkit-input-placeholder,\n.ui.input > input:focus::-webkit-input-placeholder {\n  color: @placeholderFocusColor;\n}\n.ui.input.focus > input::-moz-placeholder,\n.ui.input > input:focus::-moz-placeholder {\n  color: @placeholderFocusColor;\n}\n.ui.input.focus > input:-ms-input-placeholder,\n.ui.input > input:focus:-ms-input-placeholder {\n  color: @placeholderFocusColor;\n}\n\n\n\n/*--------------------\n        Error\n---------------------*/\n\n.ui.input.error > input {\n  background-color: @errorBackground;\n  border-color: @errorBorder;\n  color: @errorColor;\n  box-shadow: @errorBoxShadow;\n}\n\n/* Error Placeholder */\n.ui.input.error > input::-webkit-input-placeholder {\n  color: @placeholderErrorColor;\n}\n.ui.input.error > input::-moz-placeholder {\n  color: @placeholderErrorColor;\n}\n.ui.input.error > input:-ms-input-placeholder {\n  color: @placeholderErrorColor !important;\n}\n\n/* Focused Error Placeholder */\n.ui.input.error > input:focus::-webkit-input-placeholder {\n  color: @placeholderErrorFocusColor;\n}\n.ui.input.error > input:focus::-moz-placeholder {\n  color: @placeholderErrorFocusColor;\n}\n.ui.input.error > input:focus:-ms-input-placeholder {\n  color: @placeholderErrorFocusColor !important;\n}\n\n/*******************************\n           Variations\n*******************************/\n\n/*--------------------\n      Transparent\n---------------------*/\n\n\n.ui.transparent.input > input {\n  border-color: transparent !important;\n  background-color: transparent !important;\n  padding: 0em !important;\n  box-shadow: none !important;\n  border-radius: 0px !important;\n}\n\n/* Transparent Icon */\n.ui.transparent.icon.input > i.icon {\n  width: @transparentIconWidth;\n}\n.ui.transparent.icon.input > input {\n  padding-left: 0em !important;\n  padding-right: @transparentIconMargin !important;\n}\n.ui.transparent[class*=\"left icon\"].input > input {\n  padding-left: @transparentIconMargin !important;\n  padding-right: 0em !important;\n}\n\n/* Transparent Inverted */\n.ui.transparent.inverted.input {\n  color: @transparentInvertedColor;\n}\n.ui.transparent.inverted.input > input {\n  color: inherit;\n}\n\n.ui.transparent.inverted.input > input::-webkit-input-placeholder {\n  color: @transparentInvertedPlaceholderColor;\n}\n.ui.transparent.inverted.input > input::-moz-placeholder {\n  color: @transparentInvertedPlaceholderColor;\n}\n.ui.transparent.inverted.input > input:-ms-input-placeholder {\n  color: @transparentInvertedPlaceholderColor;\n}\n\n\n/*--------------------\n         Icon\n---------------------*/\n\n.ui.icon.input > i.icon {\n  cursor: default;\n  position: absolute;\n  line-height: 1;\n  text-align: center;\n  top: 0px;\n  right: 0px;\n  margin: 0em;\n  height: 100%;\n\n  width: @iconWidth;\n  opacity: @iconOpacity;\n  border-radius: 0em @borderRadius @borderRadius 0em;\n  transition: @iconTransition;\n}\n.ui.icon.input > i.icon:not(.link) {\n  pointer-events: none;\n}\n.ui.icon.input > input {\n  padding-right: @iconMargin !important;\n}\n\n.ui.icon.input > i.icon:before,\n.ui.icon.input > i.icon:after {\n  left: 0;\n  position: absolute;\n  text-align: center;\n  top: 50%;\n  width: 100%;\n  margin-top: @iconOffset;\n}\n.ui.icon.input > i.link.icon {\n  cursor: pointer;\n}\n.ui.icon.input > i.circular.icon {\n  top: @circularIconVerticalOffset;\n  right: @circularIconHorizontalOffset;\n}\n\n/* Left Icon Input */\n.ui[class*=\"left icon\"].input > i.icon {\n  right: auto;\n  left: @borderWidth;\n  border-radius: @borderRadius 0em 0em @borderRadius;\n}\n.ui[class*=\"left icon\"].input > i.circular.icon {\n  right: auto;\n  left: @circularIconHorizontalOffset;\n}\n.ui[class*=\"left icon\"].input > input {\n  padding-left: @iconMargin !important;\n  padding-right: @horizontalPadding !important;\n}\n\n/* Focus */\n.ui.icon.input > input:focus ~ i.icon {\n  opacity: 1;\n}\n\n/*--------------------\n        Labeled\n---------------------*/\n\n/* Adjacent Label */\n.ui.labeled.input > .label {\n  flex: 0 0 auto;\n  margin: 0;\n  font-size: @relativeMedium;\n}\n.ui.labeled.input > .label:not(.corner) {\n  padding-top: @verticalPadding;\n  padding-bottom: @verticalPadding;\n}\n\n/* Regular Label on Left */\n.ui.labeled.input:not([class*=\"corner labeled\"]) .label:first-child {\n  border-top-right-radius: 0px;\n  border-bottom-right-radius: 0px;\n}\n.ui.labeled.input:not([class*=\"corner labeled\"]) .label:first-child + input {\n  border-top-left-radius: 0px;\n  border-bottom-left-radius: 0px;\n  border-left-color: transparent;\n}\n.ui.labeled.input:not([class*=\"corner labeled\"]) .label:first-child + input:focus {\n  border-left-color: @focusBorderColor;\n}\n\n/* Regular Label on Right */\n.ui[class*=\"right labeled\"].input > input {\n  border-top-right-radius: 0px !important;\n  border-bottom-right-radius: 0px !important;\n  border-right-color: transparent !important;\n}\n.ui[class*=\"right labeled\"].input > input + .label {\n  border-top-left-radius: 0px;\n  border-bottom-left-radius: 0px;\n}\n\n.ui[class*=\"right labeled\"].input > input:focus {\n  border-right-color: @focusBorderColor !important;\n}\n\n/* Corner Label */\n.ui.labeled.input .corner.label {\n  top: @labelCornerTop;\n  right: @labelCornerRight;\n  font-size: @labelCornerSize;\n  border-radius: 0em @borderRadius 0em 0em;\n}\n\n/* Spacing with corner label */\n.ui[class*=\"corner labeled\"]:not([class*=\"left corner labeled\"]).labeled.input > input {\n  padding-right: @labeledMargin !important;\n}\n.ui[class*=\"corner labeled\"].icon.input:not([class*=\"left corner labeled\"]) > input {\n  padding-right: @labeledIconInputMargin !important;\n}\n.ui[class*=\"corner labeled\"].icon.input:not([class*=\"left corner labeled\"]) > .icon {\n  margin-right: @labeledIconMargin;\n}\n\n/* Left Labeled */\n.ui[class*=\"left corner labeled\"].labeled.input > input {\n  padding-left: @labeledMargin !important;\n}\n.ui[class*=\"left corner labeled\"].icon.input > input {\n  padding-left: @labeledIconInputMargin !important;\n}\n.ui[class*=\"left corner labeled\"].icon.input > .icon {\n  margin-left: @labeledIconMargin;\n}\n\n/* Corner Label Position  */\n.ui.input > .ui.corner.label {\n  top: @borderWidth;\n  right: @borderWidth;\n}\n.ui.input > .ui.left.corner.label {\n  right: auto;\n  left: @borderWidth;\n}\n\n\n/*--------------------\n        Action\n---------------------*/\n\n.ui.action.input > .button,\n.ui.action.input > .buttons {\n  display: flex;\n  align-items: center;\n  flex: 0 0 auto;\n}\n.ui.action.input > .button,\n.ui.action.input > .buttons > .button {\n  padding-top: @verticalPadding;\n  padding-bottom: @verticalPadding;\n  margin: 0;\n}\n\n/* Button on Right */\n.ui.action.input:not([class*=\"left action\"]) > input {\n  border-top-right-radius: 0px !important;\n  border-bottom-right-radius: 0px !important;\n  border-right-color: transparent !important;\n}\n.ui.action.input:not([class*=\"left action\"]) > .dropdown:not(:first-child),\n.ui.action.input:not([class*=\"left action\"]) > .button:not(:first-child),\n.ui.action.input:not([class*=\"left action\"]) > .buttons:not(:first-child) > .button {\n  border-radius: 0px;\n}\n.ui.action.input:not([class*=\"left action\"]) > .dropdown:last-child,\n.ui.action.input:not([class*=\"left action\"]) > .button:last-child,\n.ui.action.input:not([class*=\"left action\"]) > .buttons:last-child > .button {\n  border-radius: 0px @borderRadius @borderRadius 0px;\n}\n\n/* Input Focus */\n.ui.action.input:not([class*=\"left action\"]) > input:focus {\n  border-right-color: @focusBorderColor !important;\n}\n\n/* Button on Left */\n.ui[class*=\"left action\"].input > input {\n  border-top-left-radius: 0px !important;\n  border-bottom-left-radius: 0px !important;\n  border-left-color: transparent !important;\n}\n.ui[class*=\"left action\"].input > .dropdown,\n.ui[class*=\"left action\"].input > .button,\n.ui[class*=\"left action\"].input > .buttons > .button {\n  border-radius: 0px;\n}\n.ui[class*=\"left action\"].input > .dropdown:first-child,\n.ui[class*=\"left action\"].input > .button:first-child,\n.ui[class*=\"left action\"].input > .buttons:first-child > .button {\n  border-radius: @borderRadius 0px 0px @borderRadius;\n}\n/* Input Focus */\n.ui[class*=\"left action\"].input > input:focus {\n  border-left-color: @focusBorderColor !important;\n}\n\n/*--------------------\n       Inverted\n---------------------*/\n\n/* Standard */\n.ui.inverted.input > input {\n  border: none;\n}\n\n/*--------------------\n        Fluid\n---------------------*/\n\n.ui.fluid.input {\n  display: flex;\n}\n.ui.fluid.input > input {\n  width: 0px !important;\n}\n\n/*--------------------\n        Size\n---------------------*/\n\n.ui.mini.input {\n  font-size: @relativeMini;\n}\n.ui.small.input {\n  font-size: @relativeSmall;\n}\n.ui.input {\n  font-size: @relativeMedium;\n}\n.ui.large.input {\n  font-size: @relativeLarge;\n}\n.ui.big.input {\n  font-size: @relativeBig;\n}\n.ui.huge.input {\n  font-size: @relativeHuge;\n}\n.ui.massive.input {\n  font-size: @relativeMassive;\n}\n\n.loadUIOverrides();\n"
  },
  {
    "path": "semantic/src/definitions/elements/label.less",
    "content": "/*!\n * # Semantic UI - Label\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n            Theme\n*******************************/\n\n@type    : 'element';\n@element : 'label';\n\n@import (multiple) '../../theme.config';\n\n/*******************************\n            Label\n*******************************/\n\n.ui.label {\n  display: inline-block;\n  line-height: 1;\n  vertical-align: @verticalAlign;\n\n  margin: @verticalMargin @horizontalMargin;\n\n  background-color: @backgroundColor;\n  background-image: @backgroundImage;\n  padding: @verticalPadding @horizontalPadding;\n  color: @color;\n\n  text-transform: @textTransform;\n  font-weight: @fontWeight;\n\n  border: @border;\n  border-radius: @borderRadius;\n  transition: @transition;\n}\n\n.ui.label:first-child {\n  margin-left: 0em;\n}\n.ui.label:last-child {\n  margin-right: 0em;\n}\n\n/* Link */\na.ui.label {\n  cursor: pointer;\n}\n\n/* Inside Link */\n.ui.label > a {\n  cursor: pointer;\n  color: inherit;\n  opacity: @linkOpacity;\n  transition: @linkTransition;\n}\n.ui.label > a:hover {\n  opacity: 1;\n}\n\n/* Image */\n.ui.label > img {\n  width: auto !important;\n  vertical-align: middle;\n  height: @imageHeight !important;\n}\n\n/* Icon */\n.ui.label > .icon {\n  width: auto;\n  margin: 0em @iconDistance 0em 0em;\n}\n\n/* Detail */\n.ui.label > .detail {\n  display: inline-block;\n  vertical-align: top;\n  font-weight: @detailFontWeight;\n  margin-left: @detailMargin;\n  opacity: @detailOpacity;\n}\n.ui.label > .detail .icon {\n  margin: 0em @detailIconDistance 0em 0em;\n}\n\n\n/* Removable label */\n.ui.label > .close.icon,\n.ui.label > .delete.icon {\n  cursor: pointer;\n  margin-right: 0em;\n  margin-left: @deleteMargin;\n  font-size: @deleteSize;\n  opacity: @deleteOpacity;\n  transition: @deleteTransition;\n}\n.ui.label > .delete.icon:hover {\n  opacity: 1;\n}\n\n/*-------------------\n       Group\n--------------------*/\n\n.ui.labels > .label {\n  margin: 0em @groupHorizontalMargin @groupVerticalMargin 0em;\n}\n\n\n/*-------------------\n       Coupling\n--------------------*/\n\n.ui.header > .ui.label {\n  margin-top: @lineHeightOffset;\n}\n\n\n/* Remove border radius on attached segment */\n.ui.attached.segment > .ui.top.left.attached.label,\n.ui.bottom.attached.segment > .ui.top.left.attached.label  {\n  border-top-left-radius: 0;\n}\n.ui.attached.segment > .ui.top.right.attached.label,\n.ui.bottom.attached.segment > .ui.top.right.attached.label  {\n  border-top-right-radius: 0;\n}\n.ui.top.attached.segment > .ui.bottom.left.attached.label  {\n  border-bottom-left-radius: 0;\n}\n.ui.top.attached.segment > .ui.bottom.right.attached.label  {\n  border-bottom-right-radius: 0;\n}\n\n/* Padding on next content after a label */\n.ui.top.attached.label:first-child + :not(.attached),\n.ui.top.attached.label + [class*=\"right floated\"] + * {\n  margin-top: @attachedSegmentPadding !important;\n}\n.ui.bottom.attached.label:first-child ~ :last-child:not(.attached) {\n  margin-top: 0em;\n  margin-bottom: @attachedSegmentPadding !important;\n}\n\n\n/*******************************\n             Types\n*******************************/\n\n.ui.image.label {\n  width: auto !important;\n  margin-top: 0em;\n  margin-bottom: 0em;\n  max-width: 9999px;\n  vertical-align: baseline;\n  text-transform: none;\n\n  background: @imageLabelBackground;\n  padding: @imageLabelPadding;\n  border-radius: @imageLabelBorderRadius;\n  box-shadow: @imageLabelBoxShadow;\n}\n\n.ui.image.label img {\n  display: inline-block;\n  vertical-align: top;\n\n  height: @imageLabelImageHeight;\n  margin: @imageLabelImageMargin;\n  border-radius: @imageLabelImageBorderRadius;\n}\n\n.ui.image.label .detail {\n  background: @imageLabelDetailBackground;\n  margin: @imageLabelDetailMargin;\n  padding: @imageLabelDetailPadding;\n  border-radius: 0em @imageLabelBorderRadius @imageLabelBorderRadius 0em;\n}\n\n/*-------------------\n         Tag\n--------------------*/\n\n.ui.tag.labels .label,\n.ui.tag.label {\n  margin-left: 1em;\n  position: relative;\n  padding-left: @tagHorizontalPadding;\n  padding-right: @tagHorizontalPadding;\n\n  border-radius: 0em @borderRadius @borderRadius 0em;\n  transition: @tagTransition;\n}\n.ui.tag.labels .label:before,\n.ui.tag.label:before {\n    position: absolute;\n    transform: translateY(-50%) translateX(50%) rotate(-45deg);\n\n    top: @tagTriangleTopOffset;\n    right: @tagTriangleRightOffset;\n    content: '';\n\n    background-color: inherit;\n    background-image: @tagTriangleBackgroundImage;\n\n    width: @tagTriangleSize;\n    height: @tagTriangleSize;\n    transition: @tagTransition;\n}\n\n\n.ui.tag.labels .label:after,\n.ui.tag.label:after {\n  position: absolute;\n  content: '';\n  top: 50%;\n  left: -(@tagCircleSize / 2);\n\n  margin-top: -(@tagCircleSize / 2);\n  background-color: @tagCircleColor !important;\n  width: @tagCircleSize;\n  height: @tagCircleSize;\n\n  box-shadow: @tagCircleBoxShadow;\n  border-radius: @circularRadius;\n}\n\n\n/*-------------------\n    Corner Label\n--------------------*/\n\n.ui.corner.label {\n  position: absolute;\n  top: 0em;\n  right: 0em;\n  margin: 0em;\n  padding: 0em;\n  text-align: center;\n\n  border-color: @backgroundColor;\n\n  width: @cornerTriangleSize;\n  height: @cornerTriangleSize;\n  z-index: @cornerTriangleZIndex;\n  transition: @cornerTriangleTransition;\n}\n\n/* Icon Label */\n.ui.corner.label{\n  background-color: transparent !important;\n}\n.ui.corner.label:after {\n  position: absolute;\n  content: \"\";\n  right: 0em;\n  top: 0em;\n  z-index: -1;\n\n  width: 0em;\n  height: 0em;\n  background-color: transparent !important;\n\n  border-top: 0em solid transparent;\n  border-right: @cornerTriangleSize solid transparent;\n  border-bottom: @cornerTriangleSize solid transparent;\n  border-left: 0em solid transparent;\n\n  border-right-color: inherit;\n  transition: @cornerTriangleTransition;\n}\n\n.ui.corner.label .icon {\n  cursor: default;\n  position: relative;\n  top: @cornerIconTopOffset;\n  left: @cornerIconLeftOffset;\n  font-size: @cornerIconSize;\n  margin: 0em;\n}\n\n/* Left Corner */\n.ui.left.corner.label,\n.ui.left.corner.label:after {\n  right: auto;\n  left: 0em;\n}\n.ui.left.corner.label:after {\n  border-top: @cornerTriangleSize solid transparent;\n  border-right: @cornerTriangleSize solid transparent;\n  border-bottom: 0em solid transparent;\n  border-left: 0em solid transparent;\n\n  border-top-color: inherit;\n}\n.ui.left.corner.label .icon {\n  left: -@cornerIconLeftOffset;\n}\n\n/* Segment */\n.ui.segment > .ui.corner.label {\n  top: -1px;\n  right: -1px;\n}\n.ui.segment > .ui.left.corner.label {\n  right: auto;\n  left: -1px;\n}\n\n/*-------------------\n       Ribbon\n--------------------*/\n\n.ui.ribbon.label {\n  position: relative;\n  margin: 0em;\n  min-width: max-content;\n  border-radius: 0em @borderRadius @borderRadius 0em;\n  border-color: @ribbonShadowColor;\n}\n\n.ui.ribbon.label:after {\n  position: absolute;\n  content: '';\n\n  top: 100%;\n  left: 0%;\n  background-color: transparent !important;\n\n  border-style: solid;\n  border-width: 0em @ribbonTriangleSize @ribbonTriangleSize 0em;\n  border-color: transparent;\n  border-right-color: inherit;\n\n  width: 0em;\n  height: 0em;\n}\n/* Positioning */\n.ui.ribbon.label {\n  left: @ribbonOffset;\n  margin-right: -@ribbonTriangleSize;\n  padding-left: @ribbonDistance;\n  padding-right: @ribbonTriangleSize;\n}\n.ui[class*=\"right ribbon\"].label {\n  left: @rightRibbonOffset;\n  padding-left: @ribbonTriangleSize;\n  padding-right: @ribbonDistance;\n}\n\n/* Right Ribbon */\n.ui[class*=\"right ribbon\"].label {\n  text-align: left;\n  transform: translateX(-100%);\n  border-radius: @borderRadius 0em 0em @borderRadius;\n}\n.ui[class*=\"right ribbon\"].label:after {\n  left: auto;\n  right: 0%;\n\n  border-style: solid;\n  border-width: @ribbonTriangleSize @ribbonTriangleSize 0em 0em;\n  border-color: transparent;\n  border-top-color: inherit;\n}\n\n/* Inside Table */\n.ui.image > .ribbon.label,\n.ui.card .image > .ribbon.label {\n  position: absolute;\n  top: @ribbonImageTopDistance;\n}\n.ui.card .image > .ui.ribbon.label,\n.ui.image > .ui.ribbon.label {\n  left: @ribbonImageOffset;\n}\n.ui.card .image > .ui[class*=\"right ribbon\"].label,\n.ui.image > .ui[class*=\"right ribbon\"].label {\n  left: @rightRibbonImageOffset;\n  padding-left: @horizontalPadding;\n}\n\n/* Inside Table */\n.ui.table td > .ui.ribbon.label {\n  left: @ribbonTableOffset;\n}\n.ui.table td > .ui[class*=\"right ribbon\"].label {\n  left: @rightRibbonTableOffset;\n  padding-left: @horizontalPadding;\n}\n\n\n/*-------------------\n      Attached\n--------------------*/\n\n.ui[class*=\"top attached\"].label,\n.ui.attached.label {\n  width: 100%;\n  position: absolute;\n  margin: 0em;\n  top: 0em;\n  left: 0em;\n\n  padding: @attachedVerticalPadding @attachedHorizontalPadding;\n\n  border-radius: @attachedCornerBorderRadius @attachedCornerBorderRadius 0em 0em;\n}\n.ui[class*=\"bottom attached\"].label {\n  top: auto;\n  bottom: 0em;\n  border-radius: 0em 0em @attachedCornerBorderRadius @attachedCornerBorderRadius;\n}\n\n.ui[class*=\"top left attached\"].label {\n  width: auto;\n  margin-top: 0em !important;\n  border-radius: @attachedCornerBorderRadius 0em @attachedBorderRadius 0em;\n}\n\n.ui[class*=\"top right attached\"].label {\n  width: auto;\n  left: auto;\n  right: 0em;\n  border-radius: 0em @attachedCornerBorderRadius 0em @attachedBorderRadius;\n}\n.ui[class*=\"bottom left attached\"].label {\n  width: auto;\n  top: auto;\n  bottom: 0em;\n  border-radius: 0em @attachedBorderRadius 0em @attachedCornerBorderRadius;\n}\n.ui[class*=\"bottom right attached\"].label {\n  top: auto;\n  bottom: 0em;\n  left: auto;\n  right: 0em;\n  width: auto;\n  border-radius: @attachedBorderRadius 0em @attachedCornerBorderRadius 0em;\n}\n\n\n/*******************************\n             States\n*******************************/\n\n/*-------------------\n      Disabled\n--------------------*/\n\n.ui.label.disabled {\n  opacity: 0.5;\n}\n\n/*-------------------\n        Hover\n--------------------*/\n\na.ui.labels .label:hover,\na.ui.label:hover {\n  background-color: @labelHoverBackgroundColor;\n  border-color: @labelHoverBackgroundColor;\n\n  background-image: @labelHoverBackgroundImage;\n  color: @labelHoverTextColor;\n}\n.ui.labels a.label:hover:before,\na.ui.label:hover:before {\n  color: @labelHoverTextColor;\n}\n\n/*-------------------\n        Active\n--------------------*/\n\n.ui.active.label {\n  background-color: @labelActiveBackgroundColor;\n  border-color: @labelActiveBackgroundColor;\n\n  background-image: @labelActiveBackgroundImage;\n  color: @labelActiveTextColor;\n}\n.ui.active.label:before {\n  background-color: @labelActiveBackgroundColor;\n  background-image: @labelActiveBackgroundImage;\n  color: @labelActiveTextColor;\n}\n\n/*-------------------\n     Active Hover\n--------------------*/\n\na.ui.labels .active.label:hover,\na.ui.active.label:hover {\n  background-color: @labelActiveHoverBackgroundColor;\n  border-color: @labelActiveHoverBackgroundColor;\n\n  background-image: @labelActiveHoverBackgroundImage;\n  color: @labelActiveHoverTextColor;\n}\n.ui.labels a.active.label:ActiveHover:before,\na.ui.active.label:ActiveHover:before {\n  background-color: @labelActiveHoverBackgroundColor;\n  background-image: @labelActiveHoverBackgroundImage;\n  color: @labelActiveHoverTextColor;\n}\n\n\n/*-------------------\n      Visible\n--------------------*/\n\n.ui.labels.visible .label,\n.ui.label.visible:not(.dropdown) {\n  display: inline-block !important;\n}\n\n/*-------------------\n      Hidden\n--------------------*/\n\n.ui.labels.hidden .label,\n.ui.label.hidden {\n  display: none !important;\n}\n\n\n/*******************************\n           Variations\n*******************************/\n\n\n/*-------------------\n       Colors\n--------------------*/\n\n/*--- Red ---*/\n.ui.red.labels .label,\n.ui.red.label {\n  background-color: @red !important;\n  border-color: @red !important;\n  color: @redTextColor !important;\n}\n/* Link */\n.ui.red.labels .label:hover,\na.ui.red.label:hover{\n  background-color: @redHover !important;\n  border-color: @redHover !important;\n  color: @redHoverTextColor !important;\n}\n/* Corner */\n.ui.red.corner.label,\n.ui.red.corner.label:hover {\n  background-color: transparent !important;\n}\n/* Ribbon */\n.ui.red.ribbon.label {\n  border-color: @redRibbonShadow !important;\n}\n/* Basic */\n.ui.basic.red.label {\n  background-color: @white !important;\n  color: @red !important;\n  border-color: @red !important;\n}\n.ui.basic.red.labels a.label:hover,\na.ui.basic.red.label:hover {\n  background-color: @white !important;\n  color: @redHover !important;\n  border-color: @redHover !important;\n}\n\n/*--- Orange ---*/\n.ui.orange.labels .label,\n.ui.orange.label {\n  background-color: @orange !important;\n  border-color: @orange !important;\n  color: @orangeTextColor !important;\n}\n/* Link */\n.ui.orange.labels .label:hover,\na.ui.orange.label:hover{\n  background-color: @orangeHover !important;\n  border-color: @orangeHover !important;\n  color: @orangeHoverTextColor !important;\n}\n/* Corner */\n.ui.orange.corner.label,\n.ui.orange.corner.label:hover {\n  background-color: transparent !important;\n}\n/* Ribbon */\n.ui.orange.ribbon.label {\n  border-color: @orangeRibbonShadow !important;\n}\n/* Basic */\n.ui.basic.orange.label {\n  background-color: @white !important;\n  color: @orange !important;\n  border-color: @orange !important;\n}\n.ui.basic.orange.labels a.label:hover,\na.ui.basic.orange.label:hover {\n  background-color: @white !important;\n  color: @orangeHover !important;\n  border-color: @orangeHover !important;\n}\n\n/*--- Yellow ---*/\n.ui.yellow.labels .label,\n.ui.yellow.label {\n  background-color: @yellow !important;\n  border-color: @yellow !important;\n  color: @yellowTextColor !important;\n}\n/* Link */\n.ui.yellow.labels .label:hover,\na.ui.yellow.label:hover{\n  background-color: @yellowHover !important;\n  border-color: @yellowHover !important;\n  color: @yellowHoverTextColor !important;\n}\n/* Corner */\n.ui.yellow.corner.label,\n.ui.yellow.corner.label:hover {\n  background-color: transparent !important;\n}\n/* Ribbon */\n.ui.yellow.ribbon.label {\n  border-color: @yellowRibbonShadow !important;\n}\n/* Basic */\n.ui.basic.yellow.label {\n  background-color: @white !important;\n  color: @yellow !important;\n  border-color: @yellow !important;\n}\n.ui.basic.yellow.labels a.label:hover,\na.ui.basic.yellow.label:hover {\n  background-color: @white !important;\n  color: @yellowHover !important;\n  border-color: @yellowHover !important;\n}\n\n/*--- Olive ---*/\n.ui.olive.labels .label,\n.ui.olive.label {\n  background-color: @olive !important;\n  border-color: @olive !important;\n  color: @oliveTextColor !important;\n}\n/* Link */\n.ui.olive.labels .label:hover,\na.ui.olive.label:hover{\n  background-color: @oliveHover !important;\n  border-color: @oliveHover !important;\n  color: @oliveHoverTextColor !important;\n}\n/* Corner */\n.ui.olive.corner.label,\n.ui.olive.corner.label:hover {\n  background-color: transparent !important;\n}\n/* Ribbon */\n.ui.olive.ribbon.label {\n  border-color: @greenRibbonShadow !important;\n}\n/* Basic */\n.ui.basic.olive.label {\n  background-color: @white !important;\n  color: @olive !important;\n  border-color: @olive !important;\n}\n.ui.basic.olive.labels a.label:hover,\na.ui.basic.olive.label:hover {\n  background-color: @white !important;\n  color: @oliveHover !important;\n  border-color: @oliveHover !important;\n}\n\n/*--- Green ---*/\n.ui.green.labels .label,\n.ui.green.label {\n  background-color: @green !important;\n  border-color: @green !important;\n  color: @greenTextColor !important;\n}\n/* Link */\n.ui.green.labels .label:hover,\na.ui.green.label:hover{\n  background-color: @greenHover !important;\n  border-color: @greenHover !important;\n  color: @greenHoverTextColor !important;\n}\n/* Corner */\n.ui.green.corner.label,\n.ui.green.corner.label:hover {\n  background-color: transparent !important;\n}\n/* Ribbon */\n.ui.green.ribbon.label {\n  border-color: @greenRibbonShadow !important;\n}\n/* Basic */\n.ui.basic.green.label {\n  background-color: @white !important;\n  color: @green !important;\n  border-color: @green !important;\n}\n.ui.basic.green.labels a.label:hover,\na.ui.basic.green.label:hover {\n  background-color: @white !important;\n  color: @greenHover !important;\n  border-color: @greenHover !important;\n}\n\n/*--- Teal ---*/\n.ui.teal.labels .label,\n.ui.teal.label {\n  background-color: @teal !important;\n  border-color: @teal !important;\n  color: @tealTextColor !important;\n}\n/* Link */\n.ui.teal.labels .label:hover,\na.ui.teal.label:hover{\n  background-color: @tealHover !important;\n  border-color: @tealHover !important;\n  color: @tealHoverTextColor !important;\n}\n/* Corner */\n.ui.teal.corner.label,\n.ui.teal.corner.label:hover {\n  background-color: transparent !important;\n}\n/* Ribbon */\n.ui.teal.ribbon.label {\n  border-color: @tealRibbonShadow !important;\n}\n/* Basic */\n.ui.basic.teal.label {\n  background-color: @white !important;\n  color: @teal !important;\n  border-color: @teal !important;\n}\n.ui.basic.teal.labels a.label:hover,\na.ui.basic.teal.label:hover {\n  background-color: @white !important;\n  color: @tealHover !important;\n  border-color: @tealHover !important;\n}\n\n/*--- Blue ---*/\n.ui.blue.labels .label,\n.ui.blue.label {\n  background-color: @blue !important;\n  border-color: @blue !important;\n  color: @blueTextColor !important;\n}\n/* Link */\n.ui.blue.labels .label:hover,\na.ui.blue.label:hover{\n  background-color: @blueHover !important;\n  border-color: @blueHover !important;\n  color: @blueHoverTextColor !important;\n}\n/* Corner */\n.ui.blue.corner.label,\n.ui.blue.corner.label:hover {\n  background-color: transparent !important;\n}\n/* Ribbon */\n.ui.blue.ribbon.label {\n  border-color: @blueRibbonShadow !important;\n}\n/* Basic */\n.ui.basic.blue.label {\n  background-color: @white !important;\n  color: @blue !important;\n  border-color: @blue !important;\n}\n.ui.basic.blue.labels a.label:hover,\na.ui.basic.blue.label:hover {\n  background-color: @white !important;\n  color: @blueHover !important;\n  border-color: @blueHover !important;\n}\n\n/*--- Violet ---*/\n.ui.violet.labels .label,\n.ui.violet.label {\n  background-color: @violet !important;\n  border-color: @violet !important;\n  color: @violetTextColor !important;\n}\n/* Link */\n.ui.violet.labels .label:hover,\na.ui.violet.label:hover{\n  background-color: @violetHover !important;\n  border-color: @violetHover !important;\n  color: @violetHoverTextColor !important;\n}\n/* Corner */\n.ui.violet.corner.label,\n.ui.violet.corner.label:hover {\n  background-color: transparent !important;\n}\n/* Ribbon */\n.ui.violet.ribbon.label {\n  border-color: @violetRibbonShadow !important;\n}\n/* Basic */\n.ui.basic.violet.label {\n  background-color: @white !important;\n  color: @violet !important;\n  border-color: @violet !important;\n}\n.ui.basic.violet.labels a.label:hover,\na.ui.basic.violet.label:hover {\n  background-color: @white !important;\n  color: @violetHover !important;\n  border-color: @violetHover !important;\n}\n\n/*--- Purple ---*/\n.ui.purple.labels .label,\n.ui.purple.label {\n  background-color: @purple !important;\n  border-color: @purple !important;\n  color: @purpleTextColor !important;\n}\n/* Link */\n.ui.purple.labels .label:hover,\na.ui.purple.label:hover{\n  background-color: @purpleHover !important;\n  border-color: @purpleHover !important;\n  color: @purpleHoverTextColor !important;\n}\n/* Corner */\n.ui.purple.corner.label,\n.ui.purple.corner.label:hover {\n  background-color: transparent !important;\n}\n/* Ribbon */\n.ui.purple.ribbon.label {\n  border-color: @purpleRibbonShadow !important;\n}\n/* Basic */\n.ui.basic.purple.label {\n  background-color: @white !important;\n  color: @purple !important;\n  border-color: @purple !important;\n}\n.ui.basic.purple.labels a.label:hover,\na.ui.basic.purple.label:hover {\n  background-color: @white !important;\n  color: @purpleHover !important;\n  border-color: @purpleHover !important;\n}\n\n/*--- Pink ---*/\n.ui.pink.labels .label,\n.ui.pink.label {\n  background-color: @pink !important;\n  border-color: @pink !important;\n  color: @pinkTextColor !important;\n}\n/* Link */\n.ui.pink.labels .label:hover,\na.ui.pink.label:hover{\n  background-color: @pinkHover !important;\n  border-color: @pinkHover !important;\n  color: @pinkHoverTextColor !important;\n}\n/* Corner */\n.ui.pink.corner.label,\n.ui.pink.corner.label:hover {\n  background-color: transparent !important;\n}\n/* Ribbon */\n.ui.pink.ribbon.label {\n  border-color: @pinkRibbonShadow !important;\n}\n/* Basic */\n.ui.basic.pink.label {\n  background-color: @white !important;\n  color: @pink !important;\n  border-color: @pink !important;\n}\n.ui.basic.pink.labels a.label:hover,\na.ui.basic.pink.label:hover {\n  background-color: @white !important;\n  color: @pinkHover !important;\n  border-color: @pinkHover !important;\n}\n\n/*--- Brown ---*/\n.ui.brown.labels .label,\n.ui.brown.label {\n  background-color: @brown !important;\n  border-color: @brown !important;\n  color: @brownTextColor !important;\n}\n/* Link */\n.ui.brown.labels .label:hover,\na.ui.brown.label:hover{\n  background-color: @brownHover !important;\n  border-color: @brownHover !important;\n  color: @brownHoverTextColor !important;\n}\n/* Corner */\n.ui.brown.corner.label,\n.ui.brown.corner.label:hover {\n  background-color: transparent !important;\n}\n/* Ribbon */\n.ui.brown.ribbon.label {\n  border-color: @brownRibbonShadow !important;\n}\n/* Basic */\n.ui.basic.brown.label {\n  background-color: @white !important;\n  color: @brown !important;\n  border-color: @brown !important;\n}\n.ui.basic.brown.labels a.label:hover,\na.ui.basic.brown.label:hover {\n  background-color: @white !important;\n  color: @brownHover !important;\n  border-color: @brownHover !important;\n}\n\n/*--- Grey ---*/\n.ui.grey.labels .label,\n.ui.grey.label {\n  background-color: @grey !important;\n  border-color: @grey !important;\n  color: @greyTextColor !important;\n}\n/* Link */\n.ui.grey.labels .label:hover,\na.ui.grey.label:hover{\n  background-color: @greyHover !important;\n  border-color: @greyHover !important;\n  color: @greyHoverTextColor !important;\n}\n/* Corner */\n.ui.grey.corner.label,\n.ui.grey.corner.label:hover {\n  background-color: transparent !important;\n}\n/* Ribbon */\n.ui.grey.ribbon.label {\n  border-color: @brownRibbonShadow !important;\n}\n/* Basic */\n.ui.basic.grey.label {\n  background-color: @white !important;\n  color: @grey !important;\n  border-color: @grey !important;\n}\n.ui.basic.grey.labels a.label:hover,\na.ui.basic.grey.label:hover {\n  background-color: @white !important;\n  color: @greyHover !important;\n  border-color: @greyHover !important;\n}\n\n/*--- Black ---*/\n.ui.black.labels .label,\n.ui.black.label {\n  background-color: @black !important;\n  border-color: @black !important;\n  color: @blackTextColor !important;\n}\n/* Link */\n.ui.black.labels .label:hover,\na.ui.black.label:hover{\n  background-color: @blackHover !important;\n  border-color: @blackHover !important;\n  color: @blackHoverTextColor !important;\n}\n/* Corner */\n.ui.black.corner.label,\n.ui.black.corner.label:hover {\n  background-color: transparent !important;\n}\n/* Ribbon */\n.ui.black.ribbon.label {\n  border-color: @brownRibbonShadow !important;\n}\n/* Basic */\n.ui.basic.black.label {\n  background-color: @white !important;\n  color: @black !important;\n  border-color: @black !important;\n}\n.ui.basic.black.labels a.label:hover,\na.ui.basic.black.label:hover {\n  background-color: @white !important;\n  color: @blackHover !important;\n  border-color: @blackHover !important;\n}\n\n\n/*-------------------\n        Basic\n--------------------*/\n\n.ui.basic.label {\n  background: @basicBackground;\n  border: @basicBorder;\n  color: @basicColor;\n  box-shadow: @basicBoxShadow;\n}\n\n/* Link */\na.ui.basic.label:hover {\n  text-decoration: none;\n  background: @basicHoverBackground;\n  color: @basicHoverColor;\n  box-shadow: @basicHoverBorder;\n  box-shadow: @basicHoverBoxShadow;\n}\n\n/* Pointing */\n.ui.basic.pointing.label:before {\n  border-color: inherit;\n}\n\n\n/*-------------------\n       Fluid\n--------------------*/\n\n.ui.label.fluid,\n.ui.fluid.labels > .label {\n  width: 100%;\n  box-sizing: border-box;\n}\n\n/*-------------------\n       Inverted\n--------------------*/\n\n.ui.inverted.labels .label,\n.ui.inverted.label {\n  color: @invertedTextColor !important;\n}\n\n/*-------------------\n     Horizontal\n--------------------*/\n\n.ui.horizontal.labels .label,\n.ui.horizontal.label {\n  margin: 0em @horizontalLabelMargin 0em 0em;\n\n  padding: @horizontalLabelVerticalPadding @horizontalPadding;\n  min-width: @horizontalLabelMinWidth;\n  text-align: center;\n}\n\n\n/*-------------------\n       Circular\n--------------------*/\n\n.ui.circular.labels .label,\n.ui.circular.label {\n  min-width: @circularMinSize;\n  min-height: @circularMinSize;\n\n  padding: @circularPadding !important;\n\n  line-height: 1em;\n  text-align: center;\n  border-radius: @circularRadius;\n}\n.ui.empty.circular.labels .label,\n.ui.empty.circular.label {\n  min-width: 0em;\n  min-height: 0em;\n  overflow: hidden;\n  width: @emptyCircleSize;\n  height: @emptyCircleSize;\n  vertical-align: baseline;\n}\n\n/*-------------------\n       Pointing\n--------------------*/\n\n.ui.pointing.label {\n  position: relative;\n}\n\n.ui.attached.pointing.label {\n  position: absolute;\n}\n\n.ui.pointing.label:before {\n  background-color: inherit;\n  background-image: inherit;\n  border-width: none;\n  border-style: solid;\n  border-color: @pointingBorderColor;\n}\n/* Arrow */\n.ui.pointing.label:before {\n  position: absolute;\n  content: '';\n  transform: rotate(45deg);\n  background-image: none;\n\n  z-index: @pointingTriangleZIndex;\n  width: @pointingTriangleSize;\n  height: @pointingTriangleSize;\n  transition: @pointingTriangleTransition;\n}\n\n/*--- Above ---*/\n.ui.pointing.label,\n.ui[class*=\"pointing above\"].label {\n  margin-top: @pointingVerticalDistance;\n}\n.ui.pointing.label:before,\n.ui[class*=\"pointing above\"].label:before {\n  border-width: @borderWidth 0px 0px @borderWidth;\n  transform: translateX(-50%) translateY(-50%) rotate(45deg);\n  top: 0%;\n  left: 50%;\n}\n/*--- Below ---*/\n.ui[class*=\"bottom pointing\"].label,\n.ui[class*=\"pointing below\"].label {\n  margin-top: 0em;\n  margin-bottom: @pointingVerticalDistance;\n}\n.ui[class*=\"bottom pointing\"].label:before,\n.ui[class*=\"pointing below\"].label:before {\n  border-width: 0px @borderWidth @borderWidth 0px;\n  top: auto;\n  right: auto;\n  transform: translateX(-50%) translateY(-50%) rotate(45deg);\n  top: 100%;\n  left: 50%;\n}\n/*--- Left ---*/\n.ui[class*=\"left pointing\"].label {\n  margin-top: 0em;\n  margin-left: @pointingHorizontalDistance;\n}\n.ui[class*=\"left pointing\"].label:before {\n  border-width: 0px 0px @borderWidth @borderWidth;\n  transform: translateX(-50%) translateY(-50%) rotate(45deg);\n  bottom: auto;\n  right: auto;\n  top: 50%;\n  left: 0em;\n}\n/*--- Right ---*/\n.ui[class*=\"right pointing\"].label {\n  margin-top: 0em;\n  margin-right: @pointingHorizontalDistance;\n}\n.ui[class*=\"right pointing\"].label:before {\n  border-width: @borderWidth @borderWidth 0px 0px;\n  transform: translateX(50%) translateY(-50%) rotate(45deg);\n  top: 50%;\n  right: 0%;\n  bottom: auto;\n  left: auto;\n}\n\n/* Basic Pointing */\n\n/*--- Above ---*/\n.ui.basic.pointing.label:before,\n.ui.basic[class*=\"pointing above\"].label:before {\n  margin-top: @basicPointingTriangleOffset;\n}\n/*--- Below ---*/\n.ui.basic[class*=\"bottom pointing\"].label:before,\n.ui.basic[class*=\"pointing below\"].label:before {\n  bottom: auto;\n  top: 100%;\n  margin-top: -@basicPointingTriangleOffset;\n}\n/*--- Left ---*/\n.ui.basic[class*=\"left pointing\"].label:before {\n  top: 50%;\n  left: @basicPointingTriangleOffset;\n}\n/*--- Right ---*/\n.ui.basic[class*=\"right pointing\"].label:before {\n  top: 50%;\n  right: @basicPointingTriangleOffset;\n}\n\n\n/*------------------\n   Floating Label\n-------------------*/\n\n.ui.floating.label {\n  position: absolute;\n  z-index: @floatingZIndex;\n  top: @floatingTopOffset;\n  left: 100%;\n  margin: 0em 0em 0em @floatingLeftOffset !important;\n}\n\n/*-------------------\n        Sizes\n--------------------*/\n\n.ui.mini.labels .label,\n.ui.mini.label {\n  font-size: @mini;\n}\n.ui.tiny.labels .label,\n.ui.tiny.label {\n  font-size: @tiny;\n}\n.ui.small.labels .label,\n.ui.small.label {\n  font-size: @small;\n}\n.ui.labels .label,\n.ui.label {\n  font-size: @medium;\n}\n.ui.large.labels .label,\n.ui.large.label {\n  font-size: @large;\n}\n.ui.big.labels .label,\n.ui.big.label {\n  font-size: @big;\n}\n.ui.huge.labels .label,\n.ui.huge.label {\n  font-size: @huge;\n}\n.ui.massive.labels .label,\n.ui.massive.label {\n  font-size: @massive;\n}\n\n.loadUIOverrides();\n"
  },
  {
    "path": "semantic/src/definitions/elements/list.less",
    "content": "/*!\n * # Semantic UI - List\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n/*******************************\n            Theme\n*******************************/\n\n@type    : 'element';\n@element : 'list';\n\n@import (multiple) '../../theme.config';\n\n/*******************************\n            List\n*******************************/\n\nul.ui.list,\nol.ui.list,\n.ui.list {\n  list-style-type: @listStyleType;\n  margin: @margin;\n  padding: @verticalPadding @horizontalPadding;\n}\n\nul.ui.list:first-child,\nol.ui.list:first-child,\n.ui.list:first-child {\n  margin-top: 0em;\n  padding-top: 0em;\n}\n\nul.ui.list:last-child,\nol.ui.list:last-child,\n.ui.list:last-child {\n  margin-bottom: 0em;\n  padding-bottom: 0em;\n}\n\n/*******************************\n            Content\n*******************************/\n\n/* List Item */\nul.ui.list li,\nol.ui.list li,\n.ui.list > .item,\n.ui.list .list > .item {\n  display: list-item;\n  table-layout: fixed;\n  list-style-type: @listStyleType;\n  list-style-position: @listStylePosition;\n\n  padding: @itemPadding;\n  line-height: @itemLineHeight;\n}\n\nul.ui.list > li:first-child:after,\nol.ui.list > li:first-child:after,\n.ui.list > .list > .item,\n.ui.list > .item:after {\n  content: '';\n  display: block;\n  height: 0;\n  clear: both;\n  visibility: hidden;\n}\n\nul.ui.list li:first-child,\nol.ui.list li:first-child,\n.ui.list .list > .item:first-child,\n.ui.list > .item:first-child {\n  padding-top: 0em;\n}\nul.ui.list li:last-child,\nol.ui.list li:last-child,\n.ui.list .list > .item:last-child,\n.ui.list > .item:last-child {\n  padding-bottom: 0em;\n}\n\n/* Child List */\nul.ui.list ul,\nol.ui.list ol,\n.ui.list .list {\n  clear: both;\n  margin: 0em;\n  padding: @childListPadding;\n}\n\n/* Child Item */\nul.ui.list ul li,\nol.ui.list ol li,\n.ui.list .list > .item {\n  padding: @childItemPadding;\n  line-height: @childItemLineHeight;\n}\n\n\n/* Icon */\n.ui.list .list > .item > i.icon,\n.ui.list > .item > i.icon {\n  display: table-cell;\n  margin: 0em;\n  padding-top: @iconOffset;\n  padding-right: @iconDistance;\n  vertical-align: @iconContentVerticalAlign;\n  transition: @iconTransition;\n}\n.ui.list .list > .item > i.icon:only-child,\n.ui.list > .item > i.icon:only-child {\n  display: inline-block;\n  vertical-align: @iconVerticalAlign;\n}\n\n\n/* Image */\n.ui.list .list > .item > .image,\n.ui.list > .item > .image {\n  display: table-cell;\n  background-color: transparent;\n  margin: 0em;\n  vertical-align: @imageAlign;\n}\n.ui.list .list > .item > .image:not(:only-child):not(img),\n.ui.list > .item > .image:not(:only-child):not(img) {\n  padding-right: @imageDistance;\n}\n.ui.list .list > .item > .image img,\n.ui.list > .item > .image img {\n  vertical-align: @imageAlign;\n}\n\n.ui.list .list > .item > img.image,\n.ui.list .list > .item > .image:only-child,\n.ui.list > .item > img.image,\n.ui.list > .item > .image:only-child {\n  display: inline-block;\n}\n\n/* Content */\n.ui.list .list > .item > .content,\n.ui.list > .item > .content {\n  line-height: @contentLineHeight;\n}\n.ui.list .list > .item > .image + .content,\n.ui.list .list > .item > .icon + .content,\n.ui.list > .item > .image + .content,\n.ui.list > .item > .icon + .content {\n  display: table-cell;\n  padding: 0em 0em 0em @contentDistance;\n  vertical-align: @contentVerticalAlign;\n}\n.ui.list .list > .item > img.image + .content,\n.ui.list > .item > img.image + .content {\n  display: inline-block;\n}\n.ui.list .list > .item > .content > .list,\n.ui.list > .item > .content > .list {\n  margin-left: 0em;\n  padding-left: 0em;\n}\n\n/* Header */\n.ui.list .list > .item .header,\n.ui.list > .item .header {\n  display: block;\n  margin: 0em;\n  font-family: @itemHeaderFontFamily;\n  font-weight: @itemHeaderFontWeight;\n  color: @itemHeaderColor;\n}\n\n/* Description */\n.ui.list .list > .item .description,\n.ui.list > .item .description {\n  display: block;\n  color: @itemDescriptionColor;\n}\n\n/* Child Link */\n.ui.list > .item a,\n.ui.list .list > .item a {\n  cursor: pointer;\n}\n\n/* Linking Item */\n.ui.list .list > a.item,\n.ui.list > a.item {\n  cursor: pointer;\n  color: @itemLinkColor;\n}\n.ui.list .list > a.item:hover,\n.ui.list > a.item:hover {\n  color: @itemLinkHoverColor;\n}\n\n/* Linked Item Icons */\n.ui.list .list > a.item i.icon,\n.ui.list > a.item i.icon {\n  color: @itemLinkIconColor;\n}\n\n/* Header Link */\n.ui.list .list > .item a.header,\n.ui.list > .item a.header {\n  cursor: pointer;\n  color: @itemHeaderLinkColor !important;\n}\n.ui.list .list > .item a.header:hover,\n.ui.list > .item a.header:hover {\n  color: @itemHeaderLinkHoverColor !important;\n}\n\n/* Floated Content */\n.ui[class*=\"left floated\"].list {\n  float: left;\n}\n.ui[class*=\"right floated\"].list {\n  float: right;\n}\n\n.ui.list .list > .item [class*=\"left floated\"],\n.ui.list > .item [class*=\"left floated\"] {\n  float: left;\n  margin: @leftFloatMargin;\n}\n.ui.list .list > .item [class*=\"right floated\"],\n.ui.list > .item [class*=\"right floated\"] {\n  float: right;\n  margin: @rightFloatMargin;\n}\n\n/*******************************\n            Coupling\n*******************************/\n\n.ui.menu .ui.list > .item,\n.ui.menu .ui.list .list > .item {\n  display: list-item;\n  table-layout: fixed;\n  background-color: transparent;\n\n  list-style-type: @listStyleType;\n  list-style-position: @listStylePosition;\n\n  padding: @itemVerticalPadding @itemHorizontalPadding;\n  line-height: @itemLineHeight;\n}\n.ui.menu .ui.list .list > .item:before,\n.ui.menu .ui.list > .item:before {\n  border: none;\n  background: none;\n}\n.ui.menu .ui.list .list > .item:first-child,\n.ui.menu .ui.list > .item:first-child {\n  padding-top: 0em;\n}\n.ui.menu .ui.list .list > .item:last-child,\n.ui.menu .ui.list > .item:last-child {\n  padding-bottom: 0em;\n}\n\n\n/*******************************\n            Types\n*******************************/\n\n/*-------------------\n      Horizontal\n--------------------*/\n\n.ui.horizontal.list {\n  display: inline-block;\n  font-size: 0em;\n}\n.ui.horizontal.list > .item {\n  display: inline-block;\n  margin-left: @horizontalSpacing;\n  font-size: 1rem;\n}\n.ui.horizontal.list:not(.celled) > .item:first-child {\n  margin-left: 0em !important;\n  padding-left: 0em !important;\n}\n.ui.horizontal.list .list {\n  padding-left: 0em;\n  padding-bottom: 0em;\n}\n\n.ui.horizontal.list > .item > .image,\n.ui.horizontal.list .list > .item > .image,\n.ui.horizontal.list > .item > .icon,\n.ui.horizontal.list .list > .item > .icon,\n.ui.horizontal.list > .item > .content,\n.ui.horizontal.list .list > .item > .content {\n  vertical-align: @horizontalVerticalAlign;\n}\n\n/* Padding on all elements */\n.ui.horizontal.list > .item:first-child,\n.ui.horizontal.list > .item:last-child {\n  padding-top: @itemVerticalPadding;\n  padding-bottom: @itemVerticalPadding;\n}\n\n/* Horizontal List */\n.ui.horizontal.list > .item > i.icon {\n  margin: 0em;\n  padding: 0em @horizontalIconDistance 0em 0em;\n}\n.ui.horizontal.list > .item > .icon,\n.ui.horizontal.list > .item > .icon + .content {\n  float: none;\n  display: inline-block;\n}\n\n\n/*******************************\n             States\n*******************************/\n\n/*-------------------\n       Disabled\n--------------------*/\n\n.ui.list .list > .disabled.item,\n.ui.list > .disabled.item {\n  pointer-events: none;\n  color: @disabledColor !important;\n}\n.ui.inverted.list .list > .disabled.item,\n.ui.inverted.list > .disabled.item {\n  color: @invertedDisabledColor !important;\n}\n\n/*-------------------\n        Hover\n--------------------*/\n\n.ui.list .list > a.item:hover .icon,\n.ui.list > a.item:hover .icon {\n  color: @itemLinkIconHoverColor;\n}\n\n\n/*******************************\n           Variations\n*******************************/\n\n/*-------------------\n       Inverted\n--------------------*/\n\n.ui.inverted.list .list > a.item > .icon,\n.ui.inverted.list > a.item > .icon {\n  color: @invertedIconLinkColor;\n}\n.ui.inverted.list .list > .item .header,\n.ui.inverted.list > .item .header {\n  color: @invertedHeaderColor;\n}\n.ui.inverted.list .list > .item .description,\n.ui.inverted.list > .item .description {\n  color: @invertedDescriptionColor;\n}\n\n/* Item Link */\n.ui.inverted.list .list > a.item,\n.ui.inverted.list > a.item {\n  cursor: pointer;\n  color: @invertedItemLinkColor;\n}\n.ui.inverted.list .list > a.item:hover,\n.ui.inverted.list > a.item:hover {\n  color: @invertedItemLinkHoverColor;\n}\n\n\n/* Linking Content */\n.ui.inverted.list .item a:not(.ui) {\n  color: @invertedItemLinkColor !important;\n}\n.ui.inverted.list .item a:not(.ui):hover {\n  color: @invertedItemLinkHoverColor !important;\n}\n\n/*-------------------\n       Aligned\n--------------------*/\n\n.ui.list[class*=\"top aligned\"] .image,\n.ui.list[class*=\"top aligned\"] .content,\n.ui.list [class*=\"top aligned\"] {\n  vertical-align: top !important;\n}\n.ui.list[class*=\"middle aligned\"] .image,\n.ui.list[class*=\"middle aligned\"] .content,\n.ui.list [class*=\"middle aligned\"] {\n  vertical-align: middle !important;\n}\n.ui.list[class*=\"bottom aligned\"] .image,\n.ui.list[class*=\"bottom aligned\"] .content,\n.ui.list [class*=\"bottom aligned\"] {\n  vertical-align: bottom !important;\n}\n\n/*-------------------\n       Link\n--------------------*/\n\n.ui.link.list .item,\n.ui.link.list a.item,\n.ui.link.list .item a:not(.ui) {\n  color: @linkListItemColor;\n  transition: @linkListTransition;\n}\n.ui.link.list.list a.item:hover,\n.ui.link.list.list .item a:not(.ui):hover {\n  color: @linkListItemHoverColor;\n}\n.ui.link.list.list a.item:active,\n.ui.link.list.list .item a:not(.ui):active {\n  color: @linkListItemDownColor;\n}\n.ui.link.list.list .active.item,\n.ui.link.list.list .active.item a:not(.ui) {\n  color: @linkListItemActiveColor;\n}\n\n/* Inverted */\n.ui.inverted.link.list .item,\n.ui.inverted.link.list a.item,\n.ui.inverted.link.list .item a:not(.ui) {\n  color: @invertedLinkListItemColor;\n}\n.ui.inverted.link.list.list a.item:hover,\n.ui.inverted.link.list.list .item a:not(.ui):hover {\n  color: @invertedLinkListItemHoverColor;\n}\n.ui.inverted.link.list.list a.item:active,\n.ui.inverted.link.list.list .item a:not(.ui):active {\n  color: @invertedLinkListItemDownColor;\n}\n.ui.inverted.link.list.list a.active.item,\n.ui.inverted.link.list.list .active.item a:not(.ui) {\n  color: @invertedLinkListItemActiveColor;\n}\n\n/*-------------------\n      Selection\n--------------------*/\n\n.ui.selection.list .list > .item,\n.ui.selection.list > .item {\n  cursor: pointer;\n  background: @selectionListBackground;\n  padding: @selectionListItemVerticalPadding @selectionListItemHorizontalPadding;\n  margin: @selectionListItemMargin;\n  color: @selectionListColor;\n  border-radius: @selectionListItemBorderRadius;\n  transition: @selectionListTransition;\n}\n.ui.selection.list .list > .item:last-child,\n.ui.selection.list > .item:last-child {\n  margin-bottom: 0em;\n}\n.ui.selection.list.list > .item:hover,\n.ui.selection.list > .item:hover {\n  background: @selectionListHoverBackground;\n  color: @selectionListHoverColor;\n}\n.ui.selection.list .list > .item:active,\n.ui.selection.list > .item:active {\n  background: @selectionListDownBackground;\n  color: @selectionListDownColor;\n}\n.ui.selection.list .list > .item.active,\n.ui.selection.list > .item.active {\n  background: @selectionListActiveBackground;\n  color: @selectionListActiveColor;\n}\n\n/* Inverted */\n.ui.inverted.selection.list > .item,\n.ui.inverted.selection.list > .item {\n  background: @invertedSelectionListBackground;\n  color: @invertedSelectionListColor;\n}\n.ui.inverted.selection.list > .item:hover,\n.ui.inverted.selection.list > .item:hover {\n  background: @invertedSelectionListHoverBackground;\n  color: @invertedSelectionListHoverColor;\n}\n.ui.inverted.selection.list > .item:active,\n.ui.inverted.selection.list > .item:active {\n  background: @invertedSelectionListDownBackground;\n  color: @invertedSelectionListDownColor;\n}\n.ui.inverted.selection.list > .item.active,\n.ui.inverted.selection.list > .item.active {\n  background: @invertedSelectionListActiveBackground;\n  color: @invertedSelectionListActiveColor;\n}\n\n/* Celled / Divided Selection List */\n.ui.celled.selection.list .list > .item,\n.ui.divided.selection.list .list > .item,\n.ui.celled.selection.list > .item,\n.ui.divided.selection.list > .item {\n  border-radius: 0em;\n}\n\n/*-------------------\n       Animated\n--------------------*/\n\n.ui.animated.list > .item {\n  transition: @animatedListTransition;\n}\n.ui.animated.list:not(.horizontal) > .item:hover {\n  padding-left: @animatedListIndent;\n}\n\n/*-------------------\n       Fitted\n--------------------*/\n.ui.fitted.list:not(.selection) .list > .item,\n.ui.fitted.list:not(.selection) > .item {\n  padding-left: 0em;\n  padding-right: 0em;\n}\n.ui.fitted.selection.list .list > .item,\n.ui.fitted.selection.list > .item {\n  margin-left: -@selectionListItemHorizontalPadding;\n  margin-right: -@selectionListItemHorizontalPadding;\n}\n\n/*-------------------\n      Bulleted\n--------------------*/\n\nul.ui.list,\n.ui.bulleted.list {\n  margin-left: @bulletDistance;\n}\nul.ui.list li,\n.ui.bulleted.list .list > .item,\n.ui.bulleted.list > .item {\n  position: relative;\n}\nul.ui.list li:before,\n.ui.bulleted.list .list > .item:before,\n.ui.bulleted.list > .item:before {\n  user-select: none;\n  pointer-events: none;\n  position: absolute;\n  top: auto;\n  left: auto;\n  font-weight: @normal;\n  margin-left: @bulletOffset;\n  content: @bulletCharacter;\n  opacity: @bulletOpacity;\n  color: @bulletColor;\n  vertical-align: @bulletVerticalAlign;\n}\n\nul.ui.list li:before,\n.ui.bulleted.list .list > a.item:before,\n.ui.bulleted.list > a.item:before {\n  color: @bulletLinkColor;\n}\n\nul.ui.list ul,\n.ui.bulleted.list .list {\n  padding-left: @bulletChildDistance;\n}\n\n/* Horizontal Bulleted */\nul.ui.horizontal.bulleted.list,\n.ui.horizontal.bulleted.list {\n  margin-left: 0em;\n}\nul.ui.horizontal.bulleted.list li,\n.ui.horizontal.bulleted.list > .item {\n  margin-left: @horizontalBulletSpacing;\n}\nul.ui.horizontal.bulleted.list li:first-child,\n.ui.horizontal.bulleted.list > .item:first-child {\n  margin-left: 0em;\n}\nul.ui.horizontal.bulleted.list li::before,\n.ui.horizontal.bulleted.list > .item::before {\n  color: @horizontalBulletColor;\n}\nul.ui.horizontal.bulleted.list li:first-child::before,\n.ui.horizontal.bulleted.list > .item:first-child::before {\n  display: none;\n}\n\n/*-------------------\n       Ordered\n--------------------*/\n\nol.ui.list,\n.ui.ordered.list,\n.ui.ordered.list .list,\nol.ui.list ol {\n  counter-reset: ordered;\n  margin-left: @orderedCountDistance;\n  list-style-type: none;\n}\nol.ui.list li,\n.ui.ordered.list .list > .item,\n.ui.ordered.list > .item {\n  list-style-type: none;\n  position: relative;\n}\nol.ui.list li:before,\n.ui.ordered.list .list > .item:before,\n.ui.ordered.list > .item:before {\n  position: absolute;\n  top: auto;\n  left: auto;\n  user-select: none;\n  pointer-events: none;\n  margin-left: -(@orderedCountDistance);\n  counter-increment: @orderedCountName;\n  content: @orderedCountContent;\n  text-align: @orderedCountTextAlign;\n  color: @orderedCountColor;\n  vertical-align: @orderedCountVerticalAlign;\n  opacity: @orderedCountOpacity;\n}\n\nol.ui.inverted.list li:before,\n.ui.ordered.inverted.list .list > .item:before,\n.ui.ordered.inverted.list > .item:before {\n  color: @orderedInvertedCountColor;\n}\n\n/* Value */\n.ui.ordered.list > .list > .item[data-value],\n.ui.ordered.list > .item[data-value] {\n  content: attr(data-value);\n}\nol.ui.list li[value]:before {\n  content: attr(value);\n}\n\n/* Child Lists */\nol.ui.list ol,\n.ui.ordered.list .list {\n  margin-left: @orderedChildCountDistance;\n}\nol.ui.list ol li:before,\n.ui.ordered.list .list > .item:before {\n  margin-left: @orderedChildCountOffset;\n}\n\n/* Horizontal Ordered */\nol.ui.horizontal.list,\n.ui.ordered.horizontal.list {\n  margin-left: 0em;\n}\nol.ui.horizontal.list li:before,\n.ui.ordered.horizontal.list .list > .item:before,\n.ui.ordered.horizontal.list > .item:before {\n  position: static;\n  margin: 0em @horizontalOrderedCountDistance 0em 0em;\n}\n\n/*-------------------\n       Divided\n--------------------*/\n\n.ui.divided.list > .item {\n  border-top: @dividedBorder;\n}\n.ui.divided.list .list > .item {\n  border-top: @dividedChildListBorder;\n}\n.ui.divided.list .item .list > .item {\n  border-top: @dividedChildItemBorder;\n}\n.ui.divided.list .list > .item:first-child,\n.ui.divided.list > .item:first-child {\n  border-top: none;\n}\n\n/* Sub Menu */\n.ui.divided.list:not(.horizontal) .list > .item:first-child {\n  border-top-width: @dividedBorderWidth;\n}\n\n/* Divided bulleted */\n.ui.divided.bulleted.list:not(.horizontal),\n.ui.divided.bulleted.list .list {\n  margin-left: 0em;\n  padding-left: 0em;\n}\n.ui.divided.bulleted.list > .item:not(.horizontal) {\n  padding-left: @bulletDistance;\n}\n\n/* Divided Ordered */\n.ui.divided.ordered.list {\n  margin-left: 0em;\n}\n.ui.divided.ordered.list .list > .item,\n.ui.divided.ordered.list > .item {\n  padding-left: @orderedCountDistance;\n}\n.ui.divided.ordered.list .item .list {\n  margin-left: 0em;\n  margin-right: 0em;\n  padding-bottom: @itemVerticalPadding;\n}\n.ui.divided.ordered.list .item .list > .item {\n  padding-left: @orderedChildCountDistance;\n}\n\n/* Divided Selection */\n.ui.divided.selection.list .list > .item,\n.ui.divided.selection.list > .item {\n  margin: 0em;\n  border-radius: 0em;\n}\n\n/* Divided horizontal */\n.ui.divided.horizontal.list {\n  margin-left: 0em;\n}\n.ui.divided.horizontal.list > .item:not(:first-child) {\n  padding-left: @horizontalDividedSpacing;\n}\n.ui.divided.horizontal.list > .item:not(:last-child) {\n  padding-right: @horizontalDividedSpacing;\n}\n.ui.divided.horizontal.list > .item {\n  border-top: none;\n  border-left: @dividedBorder;\n  margin: 0em;\n  line-height: @horizontalDividedLineHeight;\n}\n.ui.horizontal.divided.list > .item:first-child {\n  border-left: none;\n}\n/* Inverted */\n.ui.divided.inverted.list > .item,\n.ui.divided.inverted.list > .list,\n.ui.divided.inverted.horizontal.list > .item {\n  border-color: @dividedInvertedBorderColor;\n}\n\n\n/*-------------------\n        Celled\n--------------------*/\n\n.ui.celled.list > .item,\n.ui.celled.list > .list {\n  border-top: @celledBorder;\n  padding-left: @celledHorizontalPadding;\n  padding-right: @celledHorizontalPadding;\n}\n.ui.celled.list > .item:last-child {\n  border-bottom: @celledBorder;\n}\n\n/* Padding on all elements */\n.ui.celled.list > .item:first-child,\n.ui.celled.list > .item:last-child {\n  padding-top: @itemVerticalPadding;\n  padding-bottom: @itemVerticalPadding;\n}\n\n/* Sub Menu */\n.ui.celled.list .item .list > .item {\n  border-width: 0px;\n}\n.ui.celled.list .list > .item:first-child {\n  border-top-width: 0px;\n}\n\n/* Celled Bulleted */\n.ui.celled.bulleted.list {\n  margin-left: 0em;\n}\n.ui.celled.bulleted.list .list > .item,\n.ui.celled.bulleted.list > .item {\n  padding-left: (@bulletDistance);\n}\n.ui.celled.bulleted.list .item .list {\n  margin-left: -(@bulletDistance);\n  margin-right: -(@bulletDistance);\n  padding-bottom: @itemVerticalPadding;\n}\n\n/* Celled Ordered */\n.ui.celled.ordered.list {\n  margin-left: 0em;\n}\n.ui.celled.ordered.list .list > .item,\n.ui.celled.ordered.list > .item {\n  padding-left: @orderedCountDistance;\n}\n.ui.celled.ordered.list .item .list {\n  margin-left: 0em;\n  margin-right: 0em;\n  padding-bottom: @itemVerticalPadding;\n}\n.ui.celled.ordered.list .list > .item {\n  padding-left: @orderedChildCountDistance;\n}\n\n/* Celled Horizontal */\n.ui.horizontal.celled.list {\n  margin-left: 0em;\n}\n.ui.horizontal.celled.list .list > .item,\n.ui.horizontal.celled.list > .item {\n  border-top: none;\n  border-left: @celledBorder;\n  margin: 0em;\n  padding-left: @horizontalCelledSpacing;\n  padding-right: @horizontalCelledSpacing;\n\n  line-height: @horizontalCelledLineHeight;\n}\n.ui.horizontal.celled.list .list > .item:last-child,\n.ui.horizontal.celled.list > .item:last-child {\n  border-bottom: none;\n  border-right: @celledBorder;\n}\n\n/* Inverted */\n.ui.celled.inverted.list > .item,\n.ui.celled.inverted.list > .list {\n  border-color: @celledInvertedBorder;\n}\n.ui.celled.inverted.horizontal.list .list > .item,\n.ui.celled.inverted.horizontal.list > .item {\n  border-color: @celledInvertedBorder;\n}\n\n/*-------------------\n       Relaxed\n--------------------*/\n\n.ui.relaxed.list:not(.horizontal) > .item:not(:first-child) {\n  padding-top: @relaxedItemVerticalPadding;\n}\n.ui.relaxed.list:not(.horizontal) > .item:not(:last-child) {\n  padding-bottom: @relaxedItemVerticalPadding;\n}\n.ui.horizontal.relaxed.list .list > .item:not(:first-child),\n.ui.horizontal.relaxed.list > .item:not(:first-child) {\n  padding-left: @relaxedHorizontalPadding;\n}\n.ui.horizontal.relaxed.list .list > .item:not(:last-child),\n.ui.horizontal.relaxed.list > .item:not(:last-child) {\n  padding-right: @relaxedHorizontalPadding;\n}\n\n/* Very Relaxed */\n.ui[class*=\"very relaxed\"].list:not(.horizontal) > .item:not(:first-child) {\n  padding-top: @veryRelaxedItemVerticalPadding;\n}\n.ui[class*=\"very relaxed\"].list:not(.horizontal) > .item:not(:last-child) {\n  padding-bottom: @veryRelaxedItemVerticalPadding;\n}\n.ui.horizontal[class*=\"very relaxed\"].list .list > .item:not(:first-child),\n.ui.horizontal[class*=\"very relaxed\"].list > .item:not(:first-child) {\n  padding-left: @veryRelaxedHorizontalPadding;\n}\n.ui.horizontal[class*=\"very relaxed\"].list .list > .item:not(:last-child),\n.ui.horizontal[class*=\"very relaxed\"].list > .item:not(:last-child) {\n  padding-right: @veryRelaxedHorizontalPadding;\n}\n\n/*-------------------\n      Sizes\n--------------------*/\n\n.ui.mini.list {\n  font-size: @relativeMini;\n}\n.ui.tiny.list {\n  font-size: @relativeTiny;\n}\n.ui.small.list {\n  font-size: @relativeSmall;\n}\n.ui.list {\n  font-size: @relativeMedium;\n}\n.ui.large.list {\n  font-size: @relativeLarge;\n}\n.ui.big.list {\n  font-size: @relativeBig;\n}\n.ui.huge.list {\n  font-size: @relativeHuge;\n}\n.ui.massive.list {\n  font-size: @relativeMassive;\n}\n\n.ui.mini.horizontal.list .list > .item,\n.ui.mini.horizontal.list > .item {\n  font-size: @mini;\n}\n.ui.tiny.horizontal.list .list > .item,\n.ui.tiny.horizontal.list > .item {\n  font-size: @tiny;\n}\n.ui.small.horizontal.list .list > .item,\n.ui.small.horizontal.list > .item {\n  font-size: @small;\n}\n.ui.horizontal.list .list > .item,\n.ui.horizontal.list > .item {\n  font-size: @medium;\n}\n.ui.large.horizontal.list .list > .item,\n.ui.large.horizontal.list > .item {\n  font-size: @large;\n}\n.ui.big.horizontal.list .list > .item,\n.ui.big.horizontal.list > .item {\n  font-size: @big;\n}\n.ui.huge.horizontal.list .list > .item,\n.ui.huge.horizontal.list > .item {\n  font-size: @huge;\n}\n.ui.massive.horizontal.list .list > .item,\n.ui.massive.horizontal.list > .item {\n  font-size: @massive;\n}\n\n.loadUIOverrides();\n\n"
  },
  {
    "path": "semantic/src/definitions/elements/loader.less",
    "content": "/*!\n * # Semantic UI - Loader\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n/*******************************\n            Theme\n*******************************/\n\n@type    : 'element';\n@element : 'loader';\n\n@import (multiple) '../../theme.config';\n\n/*******************************\n            Loader\n*******************************/\n\n\n/* Standard Size */\n.ui.loader {\n  display: none;\n  position: absolute;\n  top: @loaderTopOffset;\n  left: @loaderLeftOffset;\n  margin: 0px;\n  text-align: center;\n  z-index: 1000;\n  transform: translateX(-50%) translateY(-50%);\n}\n\n/* Static Shape */\n.ui.loader:before {\n  position: absolute;\n  content: '';\n  top: 0%;\n  left: 50%;\n  width: 100%;\n  height: 100%;\n\n  border-radius: @circularRadius;\n  border: @loaderLineWidth solid @loaderFillColor;\n}\n\n/* Active Shape */\n.ui.loader:after {\n  position: absolute;\n  content: '';\n  top: 0%;\n  left: 50%;\n  width: 100%;\n  height: 100%;\n\n  animation: loader @loaderSpeed linear;\n  animation-iteration-count: infinite;\n\n  border-radius: @circularRadius;\n\n  border-color: @shapeBorderColor;\n  border-style: solid;\n  border-width: @loaderLineWidth;\n\n  box-shadow: 0px 0px 0px 1px transparent;\n}\n\n/* Active Animation */\n@keyframes loader {\n  from {\n    transform: rotate(0deg);\n  }\n  to {\n    transform: rotate(360deg);\n  }\n}\n\n/* Sizes */\n.ui.mini.loader:before,\n.ui.mini.loader:after {\n  width: @mini;\n  height: @mini;\n  margin: @miniOffset;\n}\n.ui.tiny.loader:before,\n.ui.tiny.loader:after {\n  width: @tiny;\n  height: @tiny;\n  margin: @tinyOffset;\n}\n.ui.small.loader:before,\n.ui.small.loader:after {\n  width: @small;\n  height: @small;\n  margin: @smallOffset;\n}\n.ui.loader:before,\n.ui.loader:after {\n  width: @medium;\n  height: @medium;\n  margin: @mediumOffset;\n}\n.ui.large.loader:before,\n.ui.large.loader:after {\n  width: @large;\n  height: @large;\n  margin: @largeOffset;\n}\n.ui.big.loader:before,\n.ui.big.loader:after {\n  width: @big;\n  height: @big;\n  margin: @bigOffset;\n}\n.ui.huge.loader:before,\n.ui.huge.loader:after {\n  width: @huge;\n  height: @huge;\n  margin: @hugeOffset;\n}\n.ui.massive.loader:before,\n.ui.massive.loader:after {\n  width: @massive;\n  height: @massive;\n  margin: @massiveOffset;\n}\n\n/*-------------------\n      Coupling\n--------------------*/\n\n/* Show inside active dimmer */\n.ui.dimmer .loader {\n  display: block;\n}\n\n/* Black Dimmer */\n.ui.dimmer .ui.loader {\n  color: @invertedLoaderTextColor;\n}\n.ui.dimmer .ui.loader:before {\n  border-color: @invertedLoaderFillColor;\n}\n.ui.dimmer .ui.loader:after {\n  border-color: @invertedShapeBorderColor;\n}\n\n/* White Dimmer (Inverted) */\n.ui.inverted.dimmer .ui.loader {\n  color: @loaderTextColor;\n}\n.ui.inverted.dimmer .ui.loader:before {\n  border-color: @loaderFillColor;\n}\n.ui.inverted.dimmer .ui.loader:after {\n  border-color: @shapeBorderColor;\n}\n\n/*******************************\n             Types\n*******************************/\n\n\n/*-------------------\n        Text\n--------------------*/\n\n.ui.text.loader {\n  width: auto !important;\n  height: auto !important;\n  text-align: center;\n  font-style: normal;\n}\n\n\n/*******************************\n            States\n*******************************/\n\n.ui.indeterminate.loader:after {\n  animation-direction: @indeterminateDirection;\n  animation-duration: @indeterminateSpeed;\n}\n\n.ui.loader.active,\n.ui.loader.visible {\n  display: block;\n}\n.ui.loader.disabled,\n.ui.loader.hidden {\n  display: none;\n}\n\n/*******************************\n            Variations\n*******************************/\n\n\n/*-------------------\n        Sizes\n--------------------*/\n\n\n/* Loader */\n.ui.inverted.dimmer .ui.mini.loader,\n.ui.mini.loader {\n  width: @mini;\n  height: @mini;\n  font-size: @miniFontSize;\n}\n.ui.inverted.dimmer .ui.tiny.loader,\n.ui.tiny.loader {\n  width: @tiny;\n  height: @tiny;\n  font-size: @tinyFontSize;\n}\n.ui.inverted.dimmer .ui.small.loader,\n.ui.small.loader {\n  width: @small;\n  height: @small;\n  font-size: @smallFontSize;\n}\n.ui.inverted.dimmer .ui.loader,\n.ui.loader {\n  width: @medium;\n  height: @medium;\n  font-size: @mediumFontSize;\n}\n.ui.inverted.dimmer .ui.large.loader,\n.ui.large.loader {\n  width: @large;\n  height: @large;\n  font-size: @largeFontSize;\n}\n.ui.inverted.dimmer .ui.big.loader,\n.ui.big.loader {\n  width: @big;\n  height: @big;\n  font-size: @bigFontSize;\n}\n.ui.inverted.dimmer .ui.huge.loader,\n.ui.huge.loader {\n  width: @huge;\n  height: @huge;\n  font-size: @hugeFontSize;\n}\n.ui.inverted.dimmer .ui.massive.loader,\n.ui.massive.loader {\n  width: @massive;\n  height: @massive;\n  font-size: @massiveFontSize;\n}\n\n/* Text Loader */\n.ui.mini.text.loader {\n  min-width: @mini;\n  padding-top: (@mini + @textDistance);\n}\n.ui.tiny.text.loader {\n  min-width: @tiny;\n  padding-top: (@tiny + @textDistance);\n}\n.ui.small.text.loader {\n  min-width: @small;\n  padding-top: (@small + @textDistance);\n}\n.ui.text.loader {\n  min-width: @medium;\n  padding-top: (@medium + @textDistance);\n}\n.ui.large.text.loader {\n  min-width: @large;\n  padding-top: (@large + @textDistance);\n}\n.ui.big.text.loader {\n  min-width: @big;\n  padding-top: (@big + @textDistance);\n}\n.ui.huge.text.loader {\n  min-width: @huge;\n  padding-top: (@huge + @textDistance);\n}\n.ui.massive.text.loader {\n  min-width: @massive;\n  padding-top: (@massive + @textDistance);\n}\n\n\n/*-------------------\n       Inverted\n--------------------*/\n\n.ui.inverted.loader {\n  color: @invertedLoaderTextColor\n}\n.ui.inverted.loader:before {\n  border-color: @invertedLoaderFillColor;\n}\n.ui.inverted.loader:after {\n  border-top-color: @invertedLoaderLineColor;\n}\n\n/*-------------------\n       Inline\n--------------------*/\n\n.ui.inline.loader {\n  position: relative;\n  vertical-align: @inlineVerticalAlign;\n  margin: @inlineMargin;\n  left: 0em;\n  top: 0em;\n  transform: none;\n}\n\n.ui.inline.loader.active,\n.ui.inline.loader.visible {\n  display: inline-block;\n}\n\n/* Centered Inline */\n.ui.centered.inline.loader.active,\n.ui.centered.inline.loader.visible {\n  display: block;\n  margin-left: auto;\n  margin-right: auto;\n}\n\n\n.loadUIOverrides();\n"
  },
  {
    "path": "semantic/src/definitions/elements/rail.less",
    "content": "/*!\n * # Semantic UI - Rail\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n/*******************************\n            Theme\n*******************************/\n\n@type    : 'element';\n@element : 'rail';\n\n@import (multiple) '../../theme.config';\n\n/*******************************\n             Rails\n*******************************/\n\n.ui.rail {\n  position: absolute;\n  top: 0%;\n  width: @width;\n  height: @height;\n}\n\n.ui.left.rail {\n  left: auto;\n  right: 100%;\n  padding: 0em @splitDistance 0em 0em;\n  margin: 0em @splitDistance 0em 0em;\n}\n\n.ui.right.rail {\n  left: 100%;\n  right: auto;\n  padding: 0em 0em 0em @splitDistance;\n  margin: 0em 0em 0em @splitDistance;\n}\n\n/*******************************\n           Variations\n*******************************/\n\n/*--------------\n     Internal\n---------------*/\n\n.ui.left.internal.rail {\n  left: 0%;\n  right: auto;\n  padding: 0em 0em 0em @splitDistance;\n  margin: 0em 0em 0em @splitDistance;\n}\n\n.ui.right.internal.rail {\n  left: auto;\n  right: 0%;\n  padding: 0em @splitDistance 0em 0em;\n  margin: 0em @splitDistance 0em 0em;\n}\n\n\n/*--------------\n    Dividing\n---------------*/\n\n.ui.dividing.rail {\n  width: @dividingWidth;\n}\n.ui.left.dividing.rail {\n  padding: 0em @splitDividingDistance 0em 0em;\n  margin: 0em @splitDividingDistance 0em 0em;\n  border-right: @dividingBorder;\n}\n.ui.right.dividing.rail {\n  border-left: @dividingBorder;\n  padding: 0em 0em 0em @splitDividingDistance;\n  margin: 0em 0em 0em @splitDividingDistance;\n}\n\n/*--------------\n    Distance\n---------------*/\n\n.ui.close.rail {\n  width: @closeWidth;\n}\n.ui.close.left.rail {\n  padding: 0em @splitCloseDistance 0em 0em;\n  margin: 0em @splitCloseDistance 0em 0em;\n}\n.ui.close.right.rail {\n  padding: 0em 0em 0em @splitCloseDistance;\n  margin: 0em 0em 0em @splitCloseDistance;\n}\n\n.ui.very.close.rail {\n  width: @veryCloseWidth;\n}\n.ui.very.close.left.rail {\n  padding: 0em @splitVeryCloseDistance 0em 0em;\n  margin: 0em @splitVeryCloseDistance 0em 0em;\n}\n.ui.very.close.right.rail {\n  padding: 0em 0em 0em @splitVeryCloseDistance;\n  margin: 0em 0em 0em @splitVeryCloseDistance;\n}\n\n/*--------------\n    Attached\n---------------*/\n\n.ui.attached.left.rail,\n.ui.attached.right.rail {\n  padding: 0em;\n  margin: 0em;\n}\n\n/*--------------\n     Sizing\n---------------*/\n\n.ui.mini.rail {\n  font-size: @mini;\n}\n.ui.tiny.rail {\n  font-size: @tiny;\n}\n.ui.small.rail {\n  font-size: @small;\n}\n.ui.rail {\n  font-size: @medium;\n}\n.ui.large.rail {\n  font-size: @large;\n}\n.ui.big.rail {\n  font-size: @big;\n}\n.ui.huge.rail {\n  font-size: @huge;\n}\n.ui.massive.rail {\n  font-size: @massive;\n}\n\n\n.loadUIOverrides();\n"
  },
  {
    "path": "semantic/src/definitions/elements/reveal.less",
    "content": "/*!\n * # Semantic UI - Reveal\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n/*******************************\n            Theme\n*******************************/\n\n@type    : 'element';\n@element : 'reveal';\n\n@import (multiple) '../../theme.config';\n\n/*******************************\n            Reveal\n*******************************/\n\n.ui.reveal  {\n  display: inherit;\n  position: relative !important;\n  font-size: 0em !important;\n}\n\n.ui.reveal > .visible.content {\n  position: absolute !important;\n  top: 0em !important;\n  left: 0em !important;\n  z-index: @topZIndex !important;\n  transition: @transition;\n}\n.ui.reveal > .hidden.content {\n  position: relative !important;\n  z-index: @bottomZIndex !important;\n}\n\n/* Make sure hovered element is on top of other reveal */\n.ui.active.reveal .visible.content,\n.ui.reveal:hover .visible.content {\n  z-index: @activeZIndex !important;\n}\n\n\n/*******************************\n              Types\n*******************************/\n\n\n/*--------------\n      Slide\n---------------*/\n\n.ui.slide.reveal {\n  position: relative !important;\n  overflow: hidden !important;\n  white-space: nowrap;\n}\n\n.ui.slide.reveal > .content {\n  display: block;\n  width: 100%;\n  white-space: normal;\n  float: left;\n\n  margin: 0em;\n  transition: @slideTransition;\n}\n\n.ui.slide.reveal > .visible.content {\n  position: relative !important;\n}\n.ui.slide.reveal > .hidden.content {\n  position: absolute !important;\n  left: 0% !important;\n  width: 100% !important;\n  transform: translateX(100%) !important;\n}\n.ui.slide.active.reveal > .visible.content,\n.ui.slide.reveal:hover > .visible.content {\n  transform: translateX(-100%) !important;\n}\n.ui.slide.active.reveal > .hidden.content,\n.ui.slide.reveal:hover > .hidden.content {\n  transform: translateX(0%) !important;\n}\n\n.ui.slide.right.reveal > .visible.content {\n  transform: translateX(0%) !important;\n}\n.ui.slide.right.reveal > .hidden.content {\n  transform: translateX(-100%) !important;\n}\n.ui.slide.right.active.reveal > .visible.content,\n.ui.slide.right.reveal:hover > .visible.content {\n  transform: translateX(100%) !important;\n}\n.ui.slide.right.active.reveal > .hidden.content,\n.ui.slide.right.reveal:hover > .hidden.content {\n  transform: translateX(0%) !important;\n}\n\n.ui.slide.up.reveal > .hidden.content {\n  transform: translateY(100%) !important;\n}\n.ui.slide.up.active.reveal > .visible.content,\n.ui.slide.up.reveal:hover > .visible.content {\n  transform: translateY(-100%) !important;\n}\n.ui.slide.up.active.reveal > .hidden.content,\n.ui.slide.up.reveal:hover > .hidden.content {\n  transform: translateY(0%) !important;\n}\n\n.ui.slide.down.reveal > .hidden.content {\n  transform: translateY(-100%) !important;\n}\n.ui.slide.down.active.reveal > .visible.content,\n.ui.slide.down.reveal:hover > .visible.content {\n  transform: translateY(100%) !important;\n}\n.ui.slide.down.active.reveal > .hidden.content,\n.ui.slide.down.reveal:hover > .hidden.content {\n  transform: translateY(0%) !important;\n}\n\n\n/*--------------\n      Fade\n---------------*/\n\n.ui.fade.reveal > .visible.content {\n  opacity: 1;\n}\n.ui.fade.active.reveal > .visible.content,\n.ui.fade.reveal:hover > .visible.content {\n  opacity: 0;\n}\n\n\n/*--------------\n      Move\n---------------*/\n\n.ui.move.reveal {\n  position: relative !important;\n  overflow: hidden !important;\n  white-space: nowrap;\n}\n\n.ui.move.reveal > .content {\n  display: block;\n  float: left;\n  white-space: normal;\n\n  margin: 0em;\n  transition: @moveTransition;\n}\n\n.ui.move.reveal > .visible.content {\n  position: relative !important;\n}\n.ui.move.reveal > .hidden.content {\n  position: absolute !important;\n  left: 0% !important;\n  width: 100% !important;\n}\n.ui.move.active.reveal > .visible.content,\n.ui.move.reveal:hover > .visible.content {\n  transform: translateX(-100%) !important;\n}\n.ui.move.right.active.reveal > .visible.content,\n.ui.move.right.reveal:hover > .visible.content {\n  transform: translateX(100%) !important;\n}\n.ui.move.up.active.reveal > .visible.content,\n.ui.move.up.reveal:hover > .visible.content {\n  transform: translateY(-100%) !important;\n}\n.ui.move.down.active.reveal > .visible.content,\n.ui.move.down.reveal:hover > .visible.content {\n  transform: translateY(100%) !important;\n}\n\n\n\n/*--------------\n     Rotate\n---------------*/\n\n.ui.rotate.reveal > .visible.content {\n  transition-duration: @transitionDuration;\n  transform: rotate(0deg);\n}\n\n.ui.rotate.reveal > .visible.content,\n.ui.rotate.right.reveal > .visible.content {\n  transform-origin: bottom right;\n}\n.ui.rotate.active.reveal > .visible.content,\n.ui.rotate.reveal:hover > .visible.content,\n.ui.rotate.right.active.reveal > .visible.content,\n.ui.rotate.right.reveal:hover > .visible.content {\n  transform: rotate(@rotateDegrees);\n}\n\n.ui.rotate.left.reveal > .visible.content {\n  transform-origin: bottom left;\n}\n.ui.rotate.left.active.reveal > .visible.content,\n.ui.rotate.left.reveal:hover > .visible.content {\n  transform: rotate(-@rotateDegrees);\n}\n\n/*******************************\n              States\n*******************************/\n\n.ui.disabled.reveal:hover > .visible.visible.content {\n  position: static !important;\n  display: block !important;\n  opacity: 1 !important;\n  top: 0 !important;\n  left: 0 !important;\n  right: auto !important;\n  bottom: auto !important;\n  transform: none !important;\n}\n.ui.disabled.reveal:hover > .hidden.hidden.content {\n  display: none !important;\n}\n\n\n/*******************************\n           Coupling\n*******************************/\n\n.ui.reveal > .ui.ribbon.label {\n  z-index: @overlayZIndex;\n}\n\n/*******************************\n           Variations\n*******************************/\n\n/*--------------\n     Visible\n---------------*/\n\n.ui.visible.reveal {\n  overflow: visible;\n}\n\n/*--------------\n     Instant\n---------------*/\n\n.ui.instant.reveal > .content {\n  transition-delay: 0s !important;\n}\n\n\n/*--------------\n     Sizing\n---------------*/\n\n.ui.reveal > .content {\n  font-size: @medium !important;\n}\n\n.loadUIOverrides();\n"
  },
  {
    "path": "semantic/src/definitions/elements/segment.less",
    "content": "/*!\n * # Semantic UI - Segment\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n/*******************************\n            Theme\n*******************************/\n\n@type    : 'element';\n@element : 'segment';\n\n@import (multiple) '../../theme.config';\n\n/*******************************\n            Segment\n*******************************/\n\n.ui.segment {\n  position: relative;\n  background: @background;\n  box-shadow: @boxShadow;\n  margin: @margin;\n  padding: @padding;\n  border-radius: @borderRadius;\n  border: @border;\n}\n\n.ui.segment:first-child {\n  margin-top: 0em;\n}\n.ui.segment:last-child {\n  margin-bottom: 0em;\n}\n\n\n/* Vertical */\n.ui.vertical.segment {\n  margin: 0em;\n  padding-left: 0em;\n  padding-right: 0em;\n\n  background: none transparent;\n  border-radius: 0px;\n  box-shadow: none;\n  border: none;\n  border-bottom: @borderWidth solid @borderColor;\n}\n.ui.vertical.segment:last-child {\n  border-bottom: none;\n}\n\n\n/*-------------------\n    Loose Coupling\n--------------------*/\n\n/* Header */\n.ui.inverted.segment > .ui.header {\n  color: @white;\n}\n\n/* Label */\n.ui[class*=\"bottom attached\"].segment > [class*=\"top attached\"].label {\n  border-top-left-radius: 0em;\n  border-top-right-radius: 0em;\n}\n.ui[class*=\"top attached\"].segment > [class*=\"bottom attached\"].label {\n  border-bottom-left-radius: 0em;\n  border-bottom-right-radius: 0em;\n}\n.ui.attached.segment:not(.top):not(.bottom) > [class*=\"top attached\"].label {\n  border-top-left-radius: 0em;\n  border-top-right-radius: 0em;\n}\n.ui.attached.segment:not(.top):not(.bottom) > [class*=\"bottom attached\"].label {\n  border-bottom-left-radius: 0em;\n  border-bottom-right-radius: 0em;\n}\n\n/* Grid */\n.ui.page.grid.segment,\n.ui.grid > .row > .ui.segment.column,\n.ui.grid > .ui.segment.column {\n  padding-top: @pageGridMargin;\n  padding-bottom: @pageGridMargin;\n}\n.ui.grid.segment {\n  margin: @margin;\n  border-radius: @borderRadius;\n}\n\n/* Table */\n.ui.basic.table.segment {\n  background: @background;\n  border: @border;\n  box-shadow: @boxShadow;\n}\n.ui[class*=\"very basic\"].table.segment {\n  padding: @padding;\n}\n\n\n/*******************************\n             Types\n*******************************/\n\n/*-------------------\n        Piled\n--------------------*/\n\n.ui.piled.segments,\n.ui.piled.segment {\n  margin: @piledMargin 0em;\n  box-shadow: @piledBoxShadow;\n  z-index: @piledZIndex;\n}\n.ui.piled.segment:first-child {\n  margin-top: 0em;\n}\n.ui.piled.segment:last-child {\n  margin-bottom: 0em;\n}\n.ui.piled.segments:after,\n.ui.piled.segments:before,\n.ui.piled.segment:after,\n.ui.piled.segment:before {\n  background-color: @white;\n  visibility: visible;\n  content: '';\n  display: block;\n  height: 100%;\n  left: 0px;\n  position: absolute;\n  width: 100%;\n  border: @piledBorder;\n  box-shadow: @piledBoxShadow;\n}\n.ui.piled.segments:before,\n.ui.piled.segment:before {\n  transform: rotate(-@piledDegrees);\n  top: 0;\n  z-index: -2;\n}\n.ui.piled.segments:after,\n.ui.piled.segment:after {\n  transform: rotate(@piledDegrees);\n  top: 0;\n  z-index: -1;\n}\n\n/* Piled Attached */\n.ui[class*=\"top attached\"].piled.segment {\n  margin-top: @piledMargin;\n  margin-bottom: 0em;\n}\n.ui.piled.segment[class*=\"top attached\"]:first-child {\n  margin-top: 0em;\n}\n.ui.piled.segment[class*=\"bottom attached\"] {\n  margin-top: 0em;\n  margin-bottom: @piledMargin;\n}\n.ui.piled.segment[class*=\"bottom attached\"]:last-child {\n  margin-bottom: 0em;\n}\n\n/*-------------------\n       Stacked\n--------------------*/\n\n.ui.stacked.segment {\n  padding-bottom: @stackedPadding;\n}\n.ui.stacked.segments:before,\n.ui.stacked.segments:after,\n.ui.stacked.segment:before,\n.ui.stacked.segment:after {\n  content: '';\n  position: absolute;\n  bottom: -(@stackedHeight / 2);\n  left: 0%;\n\n  border-top: 1px solid @borderColor;\n  background: @stackedPageBackground;\n\n  width: 100%;\n  height: @stackedHeight;\n  visibility: visible;\n}\n.ui.stacked.segments:before,\n.ui.stacked.segment:before {\n  display: none;\n}\n\n/* Add additional page */\n.ui.tall.stacked.segments:before,\n.ui.tall.stacked.segment:before {\n  display: block;\n  bottom: 0px;\n}\n\n/* Inverted */\n.ui.stacked.inverted.segments:before,\n.ui.stacked.inverted.segments:after,\n.ui.stacked.inverted.segment:before,\n.ui.stacked.inverted.segment:after {\n  background-color: @subtleTransparentBlack;\n  border-top: 1px solid @selectedBorderColor;\n}\n\n/*-------------------\n       Padded\n--------------------*/\n\n.ui.padded.segment {\n  padding: @paddedSegmentPadding;\n}\n\n.ui[class*=\"very padded\"].segment {\n  padding: @veryPaddedSegmentPadding;\n}\n\n/* Padded vertical */\n.ui.padded.segment.vertical.segment,\n.ui[class*=\"very padded\"].vertical.segment {\n  padding-left: 0px;\n  padding-right: 0px;\n}\n\n/*-------------------\n       Compact\n--------------------*/\n\n.ui.compact.segment {\n  display: table;\n}\n\n/* Compact Group */\n.ui.compact.segments {\n  display: inline-flex;\n}\n.ui.compact.segments .segment,\n.ui.segments .compact.segment {\n  display: block;\n  flex: 0 1 auto;\n}\n\n/*-------------------\n       Circular\n--------------------*/\n\n.ui.circular.segment {\n  display: table-cell;\n  padding: @circularPadding;\n  text-align: center;\n  vertical-align: middle;\n  border-radius: 500em;\n}\n\n/*-------------------\n       Raised\n--------------------*/\n\n.ui.raised.segments,\n.ui.raised.segment {\n  box-shadow: @raisedBoxShadow;\n}\n\n\n/*******************************\n            Groups\n*******************************/\n\n/* Group */\n.ui.segments {\n  flex-direction: column;\n  position: relative;\n  margin: @groupedMargin;\n  border: @groupedBorder;\n  box-shadow: @groupedBoxShadow;\n  border-radius: @groupedBorderRadius;\n}\n.ui.segments:first-child {\n  margin-top: 0em;\n}\n.ui.segments:last-child {\n  margin-bottom: 0em;\n}\n\n\n/* Nested Segment */\n.ui.segments > .segment {\n  top: 0px;\n  bottom: 0px;\n  border-radius: 0px;\n  margin: @groupedSegmentMargin;\n  width: @groupedSegmentWidth;\n  box-shadow: @groupedSegmentBoxShadow;\n  border: @groupedSegmentBorder;\n  border-top: @groupedSegmentDivider;\n}\n\n.ui.segments:not(.horizontal) > .segment:first-child {\n  top: @attachedTopOffset;\n  bottom: 0px;\n  border-top: none;\n  margin-top: 0em;\n  bottom: 0px;\n  margin-bottom: 0em;\n  top: @attachedTopOffset;\n  border-radius: @borderRadius @borderRadius 0em 0em;\n}\n\n/* Bottom */\n.ui.segments:not(.horizontal) > .segment:last-child {\n  top: @attachedBottomOffset;\n  bottom: 0px;\n  margin-top: 0em;\n  margin-bottom: 0em;\n  box-shadow: @attachedBottomBoxShadow;\n  border-radius: 0em 0em @borderRadius @borderRadius;\n}\n\n/* Only */\n.ui.segments:not(.horizontal) > .segment:only-child {\n  border-radius: @borderRadius;\n}\n\n\n/* Nested Group */\n.ui.segments > .ui.segments {\n  border-top: @groupedSegmentDivider;\n  margin: @nestedGroupMargin;\n}\n.ui.segments > .segments:first-child {\n  border-top: none;\n}\n.ui.segments > .segment + .segments:not(.horizontal) {\n  margin-top: 0em;\n}\n\n/* Horizontal Group */\n.ui.horizontal.segments {\n  display: flex;\n  flex-direction: row;\n  background-color: transparent;\n  border-radius: 0px;\n  padding: 0em;\n  background-color: @background;\n  box-shadow: @boxShadow;\n  margin: @margin;\n  border-radius: @borderRadius;\n  border: @border;\n}\n\n/* Nested Horizontal Group */\n.ui.segments > .horizontal.segments {\n  margin: 0em;\n  background-color: transparent;\n  border-radius: 0px;\n  border: none;\n  box-shadow: none;\n  border-top: @groupedSegmentDivider;\n}\n\n/* Horizontal Segment */\n.ui.horizontal.segments > .segment {\n  flex: 1 1 auto;\n  -ms-flex: 1 1 0px; /* Solves #2550 MS Flex */\n  margin: 0em;\n  min-width: 0px;\n  background-color: transparent;\n  border-radius: 0px;\n  border: none;\n  box-shadow: none;\n  border-left: @borderWidth solid @borderColor;\n}\n\n/* Border Fixes */\n.ui.segments > .horizontal.segments:first-child {\n  border-top: none;\n}\n.ui.horizontal.segments > .segment:first-child {\n  border-left: none;\n}\n\n\n/*******************************\n            States\n*******************************/\n\n/*--------------\n    Disabled\n---------------*/\n\n.ui.disabled.segment {\n  opacity: @disabledOpacity;\n  color: @disabledTextColor;\n}\n\n/*--------------\n    Loading\n---------------*/\n\n.ui.loading.segment {\n  position: relative;\n  cursor: default;\n  pointer-events: none;\n  text-shadow: none !important;\n  color: transparent !important;\n  transition: all 0s linear;\n}\n.ui.loading.segment:before {\n  position: absolute;\n  content: '';\n  top: 0%;\n  left: 0%;\n  background: @loaderDimmerColor;\n  width: 100%;\n  height: 100%;\n  border-radius: @borderRadius;\n  z-index: @loaderDimmerZIndex;\n}\n.ui.loading.segment:after {\n  position: absolute;\n  content: '';\n  top: 50%;\n  left: 50%;\n\n  margin: @loaderMargin;\n  width: @loaderSize;\n  height: @loaderSize;\n\n  animation: segment-spin @loaderSpeed linear;\n  animation-iteration-count: infinite;\n\n  border-radius: @circularRadius;\n\n  border-color: @loaderLineColor @loaderFillColor @loaderFillColor @loaderFillColor;\n  border-style: solid;\n  border-width: @loaderLineWidth;\n\n  box-shadow: 0px 0px 0px 1px transparent;\n  visibility: visible;\n  z-index: @loaderLineZIndex;\n}\n\n@keyframes segment-spin {\n  from {\n    transform: rotate(0deg);\n  }\n  to {\n    transform: rotate(360deg);\n  }\n}\n\n\n/*******************************\n           Variations\n*******************************/\n\n\n/*-------------------\n       Basic\n--------------------*/\n\n.ui.basic.segment {\n  background: @basicBackground;\n  box-shadow: @basicBoxShadow;\n  border: @basicBorder;\n  border-radius: @basicBorderRadius;\n}\n\n/*-------------------\n       Clearing\n--------------------*/\n\n.ui.clearing.segment:after {\n  content: \".\";\n  display: block;\n  height: 0;\n  clear: both;\n  visibility: hidden;\n}\n\n/*-------------------\n       Colors\n--------------------*/\n\n/* Red */\n.ui.red.segment:not(.inverted) {\n  border-top: @coloredBorderSize solid @red !important;\n}\n.ui.inverted.red.segment {\n  background-color: @red !important;\n  color: @white !important;\n}\n\n/* Orange */\n.ui.orange.segment:not(.inverted) {\n  border-top: @coloredBorderSize solid @orange !important;\n}\n.ui.inverted.orange.segment {\n  background-color: @orange !important;\n  color: @white !important;\n}\n\n/* Yellow */\n.ui.yellow.segment:not(.inverted) {\n  border-top: @coloredBorderSize solid @yellow !important;\n}\n.ui.inverted.yellow.segment {\n  background-color: @yellow !important;\n  color: @white !important;\n}\n\n/* Olive */\n.ui.olive.segment:not(.inverted) {\n  border-top: @coloredBorderSize solid @olive !important;\n}\n.ui.inverted.olive.segment {\n  background-color: @olive !important;\n  color: @white !important;\n}\n\n/* Green */\n.ui.green.segment:not(.inverted) {\n  border-top: @coloredBorderSize solid @green !important;\n}\n.ui.inverted.green.segment {\n  background-color: @green !important;\n  color: @white !important;\n}\n\n/* Teal */\n.ui.teal.segment:not(.inverted) {\n  border-top: @coloredBorderSize solid @teal !important;\n}\n.ui.inverted.teal.segment {\n  background-color: @teal !important;\n  color: @white !important;\n}\n\n/* Blue */\n.ui.blue.segment:not(.inverted) {\n  border-top: @coloredBorderSize solid @blue !important;\n}\n.ui.inverted.blue.segment {\n  background-color: @blue !important;\n  color: @white !important;\n}\n\n/* Violet */\n.ui.violet.segment:not(.inverted) {\n  border-top: @coloredBorderSize solid @violet !important;\n}\n.ui.inverted.violet.segment {\n  background-color: @violet !important;\n  color: @white !important;\n}\n\n/* Purple */\n.ui.purple.segment:not(.inverted) {\n  border-top: @coloredBorderSize solid @purple !important;\n}\n.ui.inverted.purple.segment {\n  background-color: @purple !important;\n  color: @white !important;\n}\n\n/* Pink */\n.ui.pink.segment:not(.inverted) {\n  border-top: @coloredBorderSize solid @pink !important;\n}\n.ui.inverted.pink.segment {\n  background-color: @pink !important;\n  color: @white !important;\n}\n\n/* Brown */\n.ui.brown.segment:not(.inverted) {\n  border-top: @coloredBorderSize solid @brown !important;\n}\n.ui.inverted.brown.segment {\n  background-color: @brown !important;\n  color: @white !important;\n}\n\n/* Grey */\n.ui.grey.segment:not(.inverted) {\n  border-top: @coloredBorderSize solid @grey !important;\n}\n.ui.inverted.grey.segment {\n  background-color: @grey !important;\n  color: @white !important;\n}\n\n/* Black */\n.ui.black.segment:not(.inverted) {\n  border-top: @coloredBorderSize solid @black !important;\n}\n.ui.inverted.black.segment {\n  background-color: @black !important;\n  color: @white !important;\n}\n\n/*-------------------\n       Aligned\n--------------------*/\n\n.ui[class*=\"left aligned\"].segment {\n  text-align: left;\n}\n.ui[class*=\"right aligned\"].segment {\n  text-align: right;\n}\n.ui[class*=\"center aligned\"].segment {\n  text-align: center;\n}\n\n/*-------------------\n       Floated\n--------------------*/\n\n.ui.floated.segment,\n.ui[class*=\"left floated\"].segment {\n  float: left;\n  margin-right: @floatedDistance;\n}\n.ui[class*=\"right floated\"].segment {\n  float: right;\n  margin-left: @floatedDistance;\n}\n\n\n/*-------------------\n      Inverted\n--------------------*/\n\n.ui.inverted.segment {\n  border: none;\n  box-shadow: none;\n}\n.ui.inverted.segment,\n.ui.primary.inverted.segment {\n  background: @invertedBackground;\n  color: @invertedTextColor;\n}\n\n/* Nested */\n.ui.inverted.segment .segment {\n  color: @textColor;\n}\n.ui.inverted.segment .inverted.segment {\n  color: @invertedTextColor;\n}\n\n/* Attached */\n.ui.inverted.attached.segment {\n  border-color: @solidWhiteBorderColor;\n}\n\n/*-------------------\n     Emphasis\n--------------------*/\n\n/* Secondary */\n.ui.secondary.segment {\n  background: @secondaryBackground;\n  color: @secondaryColor;\n}\n.ui.secondary.inverted.segment {\n  background: @secondaryInvertedBackground;\n  color: @secondaryInvertedColor;\n}\n\n/* Tertiary */\n.ui.tertiary.segment {\n  background: @tertiaryBackground;\n  color: @tertiaryColor;\n}\n.ui.tertiary.inverted.segment {\n  background: @tertiaryInvertedBackground;\n  color: @tertiaryInvertedColor;\n}\n\n\n/*-------------------\n      Attached\n--------------------*/\n\n/* Middle */\n.ui.attached.segment {\n  top: 0px;\n  bottom: 0px;\n  border-radius: 0px;\n  margin: 0em @attachedHorizontalOffset;\n  width: @attachedWidth;\n  max-width: @attachedWidth;\n  box-shadow: @attachedBoxShadow;\n  border: @attachedBorder;\n}\n.ui.attached:not(.message) + .ui.attached.segment:not(.top) {\n  border-top: none;\n}\n\n/* Top */\n.ui[class*=\"top attached\"].segment {\n  bottom: 0px;\n  margin-bottom: 0em;\n  top: @attachedTopOffset;\n  margin-top: @verticalMargin;\n  border-radius: @borderRadius @borderRadius 0em 0em;\n}\n.ui.segment[class*=\"top attached\"]:first-child {\n  margin-top: 0em;\n}\n\n/* Bottom */\n.ui.segment[class*=\"bottom attached\"] {\n  bottom: 0px;\n  margin-top: 0em;\n  top: @attachedBottomOffset;\n  margin-bottom: @verticalMargin;\n  box-shadow: @attachedBottomBoxShadow;\n  border-radius: 0em 0em @borderRadius @borderRadius;\n}\n.ui.segment[class*=\"bottom attached\"]:last-child {\n  margin-bottom: 0em;\n}\n\n/*-------------------\n        Size\n--------------------*/\n\n.ui.mini.segments .segment,\n.ui.mini.segment {\n  font-size: @mini;\n}\n.ui.tiny.segments .segment,\n.ui.tiny.segment {\n  font-size: @tiny;\n}\n.ui.small.segments .segment,\n.ui.small.segment {\n  font-size: @small;\n}\n.ui.segments .segment,\n.ui.segment {\n  font-size: @medium;\n}\n.ui.large.segments .segment,\n.ui.large.segment {\n  font-size: @large;\n}\n.ui.big.segments .segment,\n.ui.big.segment {\n  font-size: @big;\n}\n.ui.huge.segments .segment,\n.ui.huge.segment {\n  font-size: @huge;\n}\n.ui.massive.segments .segment,\n.ui.massive.segment {\n  font-size: @massive;\n}\n\n.loadUIOverrides();\n"
  },
  {
    "path": "semantic/src/definitions/elements/step.less",
    "content": "/*!\n * # Semantic UI - Step\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n             Step\n*******************************/\n\n/*--------------\n   Load Theme\n---------------*/\n\n@type    : 'element';\n@element : 'step';\n\n@import (multiple) '../../theme.config';\n\n/*******************************\n            Plural\n*******************************/\n\n.ui.steps {\n  display: inline-flex;\n  flex-direction: row;\n  align-items: stretch;\n  margin: @stepMargin;\n  background: @stepsBackground;\n  box-shadow: @stepsBoxShadow;\n  line-height: @lineHeight;\n  border-radius: @stepsBorderRadius;\n  border: @stepsBorder;\n}\n\n/* First Steps */\n.ui.steps:first-child {\n  margin-top: 0em;\n}\n\n/* Last Steps */\n.ui.steps:last-child {\n  margin-bottom: 0em;\n}\n\n\n/*******************************\n           Singular\n*******************************/\n\n.ui.steps .step {\n  position: relative;\n  display: flex;\n  flex: 1 0 auto;\n  flex-wrap: wrap;\n  flex-direction: row;\n  vertical-align: middle;\n  align-items: center;\n  justify-content: @justifyContent;\n\n  margin: @verticalMargin @horizontalMargin;\n  padding: @verticalPadding @horizontalPadding;\n  background: @background;\n  color: @textColor;\n  box-shadow: @boxShadow;\n  border-radius: @borderRadius;\n  border: @border;\n  border-right: @divider;\n  transition: @transition;\n}\n\n/* Arrow */\n.ui.steps .step:after {\n  display: none;\n  position: absolute;\n  z-index: 2;\n  content: '';\n  top: @arrowTopOffset;\n  right: @arrowRightOffset;\n  border: medium none;\n  background-color: @arrowBackgroundColor;\n  width: @arrowSize;\n  height: @arrowSize;\n\n  border-style: solid;\n  border-color: @borderColor;\n  border-width: @arrowBorderWidth;\n\n  transition: @transition;\n  transform: translateY(-50%) translateX(50%) rotate(-45deg);\n}\n\n/* First Step */\n.ui.steps .step:first-child {\n  padding-left: @horizontalPadding;\n  border-radius: @stepsBorderRadius 0em 0em @stepsBorderRadius;\n}\n\n/* Last Step */\n.ui.steps .step:last-child {\n  border-radius: 0em @stepsBorderRadius @stepsBorderRadius 0em;\n}\n.ui.steps .step:last-child {\n  border-right: none;\n  margin-right: 0em;\n}\n\n/* Only Step */\n.ui.steps .step:only-child {\n  border-radius: @stepsBorderRadius;\n}\n\n\n/*******************************\n            Content\n*******************************/\n\n/* Title */\n.ui.steps .step .title {\n  font-family: @titleFontFamily;\n  font-size: @titleFontSize;\n  font-weight: @titleFontWeight;\n}\n.ui.steps .step > .title {\n  width: 100%;\n}\n\n/* Description */\n.ui.steps .step .description {\n  font-weight: @descriptionFontWeight;\n  font-size: @descriptionFontSize;\n  color: @descriptionColor;\n}\n.ui.steps .step > .description {\n  width: 100%;\n}\n.ui.steps .step .title ~ .description {\n  margin-top: @descriptionDistance;\n}\n\n/* Icon */\n.ui.steps .step > .icon {\n  line-height: 1;\n  font-size: @iconSize;\n  margin: 0em @iconDistance 0em 0em;\n}\n.ui.steps .step > .icon,\n.ui.steps .step > .icon ~ .content {\n  display: block;\n  flex: 0 1 auto;\n  align-self: @iconAlign;\n}\n.ui.steps .step > .icon ~ .content {\n  flex-grow: 1 0 auto;\n}\n\n/* Horizontal Icon */\n.ui.steps:not(.vertical) .step > .icon {\n  width: auto;\n}\n\n/* Link */\n.ui.steps .link.step,\n.ui.steps a.step {\n  cursor: pointer;\n}\n\n/*******************************\n            Types\n*******************************/\n\n/*--------------\n     Ordered\n---------------*/\n\n.ui.ordered.steps {\n  counter-reset: ordered;\n}\n.ui.ordered.steps .step:before {\n  display: block;\n  position: static;\n  text-align: center;\n  content: counters(ordered, \".\");\n  align-self: @iconAlign;\n  margin-right: @iconDistance;\n  font-size: @iconSize;\n  counter-increment: ordered;\n  font-family: @orderedFontFamily;\n  font-weight: @orderedFontWeight;\n}\n\n.ui.ordered.steps .step > * {\n  display: block;\n  align-self: @iconAlign;\n}\n\n\n/*--------------\n    Vertical\n---------------*/\n\n.ui.vertical.steps {\n  display: inline-flex;\n  flex-direction: column;\n  overflow: visible;\n}\n.ui.vertical.steps .step {\n  justify-content: flex-start;\n  border-radius: @borderRadius;\n  padding: @verticalPadding @horizontalPadding;\n  border-right: none;\n  border-bottom: @verticalDivider;\n}\n.ui.vertical.steps .step:first-child {\n  padding: @verticalPadding @horizontalPadding;\n  border-radius: @stepsBorderRadius @stepsBorderRadius 0em 0em;\n}\n.ui.vertical.steps .step:last-child {\n  border-bottom: none;\n  border-radius: 0em 0em @stepsBorderRadius @stepsBorderRadius;\n}\n.ui.vertical.steps .step:only-child {\n  border-radius: @stepsBorderRadius;\n}\n\n\n/* Arrow */\n.ui.vertical.steps .step:after {\n  display: none;\n}\n.ui.vertical.steps .step:after {\n  top: @verticalArrowTopOffset;\n  right: @verticalArrowRightOffset;\n  border-width: @verticalArrowBorderWidth;\n}\n\n.ui.vertical.steps .step:after {\n  display: @verticalArrowDisplay;\n}\n.ui.vertical.steps .active.step:after {\n  display: @verticalActiveArrowDisplay;\n}\n.ui.vertical.steps .step:last-child:after {\n  display: @verticalLastArrowDisplay;\n}\n.ui.vertical.steps .active.step:last-child:after {\n  display: @verticalActiveLastArrowDisplay;\n}\n\n\n/*---------------\n    Responsive\n----------------*/\n\n/* Mobile (Default) */\n@media only screen and (max-width: (@largestMobileScreen)) {\n\n  .ui.steps:not(.unstackable) {\n    display: inline-flex;\n    overflow: visible;\n    flex-direction: column;\n  }\n  .ui.steps:not(.unstackable) .step {\n    width: 100% !important;\n    flex-direction: column;\n    border-radius: @borderRadius;\n    padding: @verticalPadding @horizontalPadding;\n  }\n  .ui.steps:not(.unstackable) .step:first-child {\n    padding: @verticalPadding @horizontalPadding;\n    border-radius: @stepsBorderRadius @stepsBorderRadius 0em 0em;\n  }\n  .ui.steps:not(.unstackable) .step:last-child {\n    border-radius: 0em 0em @stepsBorderRadius @stepsBorderRadius;\n  }\n\n  /* Arrow */\n  .ui.steps:not(.unstackable) .step:after {\n    display: none !important;\n  }\n\n  /* Content */\n  .ui.steps:not(.unstackable) .step .content {\n    text-align: center;\n  }\n\n  /* Icon */\n  .ui.steps:not(.unstackable) .step > .icon,\n  .ui.ordered.steps:not(.unstackable) .step:before {\n    margin: 0em 0em @mobileIconDistance 0em;\n  }\n\n}\n\n/*******************************\n             States\n*******************************/\n\n/* Link Hover */\n.ui.steps .link.step:hover::after,\n.ui.steps .link.step:hover,\n.ui.steps a.step:hover::after,\n.ui.steps a.step:hover {\n  background: @hoverBackground;\n  color: @hoverColor;\n}\n\n/* Link Down */\n.ui.steps .link.step:active::after,\n.ui.steps .link.step:active,\n.ui.steps a.step:active::after,\n.ui.steps a.step:active {\n  background: @downBackground;\n  color: @downColor;\n}\n\n/* Active */\n.ui.steps .step.active {\n  cursor: auto;\n  background: @activeBackground;\n}\n.ui.steps .step.active:after {\n  background: @activeBackground;\n}\n.ui.steps .step.active .title {\n  color: @activeColor;\n}\n.ui.ordered.steps .step.active:before,\n.ui.steps .active.step .icon {\n  color: @activeIconColor;\n}\n\n/* Active Arrow */\n.ui.steps .step:after {\n  display: @arrowDisplay;\n}\n.ui.steps .active.step:after {\n  display: @activeArrowDisplay;\n}\n.ui.steps .step:last-child:after {\n  display: @lastArrowDisplay;\n}\n.ui.steps .active.step:last-child:after {\n  display: @activeLastArrowDisplay;\n}\n\n/* Active Hover */\n.ui.steps .link.active.step:hover::after,\n.ui.steps .link.active.step:hover,\n.ui.steps a.active.step:hover::after,\n.ui.steps a.active.step:hover {\n  cursor: pointer;\n  background: @activeHoverBackground;\n  color: @activeHoverColor;\n}\n\n/* Completed */\n.ui.steps .step.completed > .icon:before,\n.ui.ordered.steps .step.completed:before {\n  color: @completedColor;\n}\n\n/* Disabled */\n.ui.steps .disabled.step {\n  cursor: auto;\n  background: @disabledBackground;\n  pointer-events: none;\n}\n.ui.steps .disabled.step,\n.ui.steps .disabled.step .title,\n.ui.steps .disabled.step .description {\n  color: @disabledColor;\n}\n.ui.steps .disabled.step:after {\n  background: @disabledBackground;\n}\n\n\n/*******************************\n           Variations\n*******************************/\n\n\n/*--------------\n   Stackable\n---------------*/\n\n/* Tablet Or Below */\n@media only screen and (max-width: @largestTabletScreen) {\n\n.ui[class*=\"tablet stackable\"].steps {\n  display: inline-flex;\n  overflow: visible;\n  flex-direction: column;\n}\n\n/* Steps */\n.ui[class*=\"tablet stackable\"].steps .step {\n  flex-direction: column;\n  border-radius: @borderRadius;\n  padding: @verticalPadding @horizontalPadding;\n}\n.ui[class*=\"tablet stackable\"].steps .step:first-child {\n  padding: @verticalPadding @horizontalPadding;\n  border-radius: @stepsBorderRadius @stepsBorderRadius 0em 0em;\n}\n.ui[class*=\"tablet stackable\"].steps .step:last-child {\n  border-radius: 0em 0em @stepsBorderRadius @stepsBorderRadius;\n}\n\n/* Arrow */\n.ui[class*=\"tablet stackable\"].steps .step:after {\n  display: none !important;\n}\n\n/* Content */\n.ui[class*=\"tablet stackable\"].steps .step .content {\n  text-align: center;\n}\n\n/* Icon */\n.ui[class*=\"tablet stackable\"].steps .step > .icon,\n.ui[class*=\"tablet stackable\"].ordered.steps .step:before {\n  margin: 0em 0em @mobileIconDistance 0em;\n}\n\n}\n\n/*--------------\n      Fluid\n---------------*/\n\n/* Fluid */\n.ui.fluid.steps {\n  display: flex;\n  width: 100%;\n}\n\n/*--------------\n    Attached\n---------------*/\n\n/* Top */\n.ui.attached.steps {\n  width: @attachedWidth !important;\n  margin: 0em @attachedHorizontalOffset @attachedVerticalOffset;\n  max-width: @attachedWidth;\n  border-radius: @stepsBorderRadius @stepsBorderRadius 0em 0em;\n}\n.ui.attached.steps .step:first-child {\n  border-radius: @stepsBorderRadius 0em 0em 0em;\n}\n.ui.attached.steps .step:last-child {\n  border-radius: 0em @stepsBorderRadius 0em 0em;\n}\n\n/* Bottom */\n.ui.bottom.attached.steps {\n  margin: @attachedVerticalOffset @attachedHorizontalOffset 0em;\n  border-radius: 0em 0em @stepsBorderRadius @stepsBorderRadius;\n}\n.ui.bottom.attached.steps .step:first-child {\n  border-radius: 0em 0em 0em @stepsBorderRadius;\n}\n.ui.bottom.attached.steps .step:last-child {\n  border-radius: 0em 0em @stepsBorderRadius 0em;\n}\n\n/*-------------------\n    Evenly Divided\n--------------------*/\n\n.ui.one.steps,\n.ui.two.steps,\n.ui.three.steps,\n.ui.four.steps,\n.ui.five.steps,\n.ui.six.steps,\n.ui.seven.steps,\n.ui.eight.steps {\n  width: 100%;\n}\n.ui.one.steps > .step,\n.ui.two.steps > .step,\n.ui.three.steps > .step,\n.ui.four.steps > .step,\n.ui.five.steps > .step,\n.ui.six.steps > .step,\n.ui.seven.steps > .step,\n.ui.eight.steps > .step {\n  flex-wrap: nowrap;\n}\n.ui.one.steps > .step {\n  width: 100%;\n}\n.ui.two.steps > .step {\n  width: 50%;\n}\n.ui.three.steps > .step {\n  width: 33.333%;\n}\n.ui.four.steps > .step {\n  width: 25%;\n}\n.ui.five.steps > .step {\n  width: 20%;\n}\n.ui.six.steps > .step {\n  width: 16.666%;\n}\n.ui.seven.steps > .step {\n  width: 14.285%;\n}\n.ui.eight.steps > .step {\n  width: 12.500%;\n}\n\n/*-------------------\n       Sizes\n--------------------*/\n\n\n.ui.mini.steps .step,\n.ui.mini.step {\n  font-size: @mini;\n}\n.ui.tiny.steps .step,\n.ui.tiny.step {\n  font-size: @tiny;\n}\n.ui.small.steps .step,\n.ui.small.step {\n  font-size: @small;\n}\n.ui.steps .step,\n.ui.step {\n  font-size: @medium;\n}\n.ui.large.steps .step,\n.ui.large.step {\n  font-size: @large;\n}\n.ui.big.steps .step,\n.ui.big.step {\n  font-size: @big;\n}\n.ui.huge.steps .step,\n.ui.huge.step {\n  font-size: @huge;\n}\n.ui.massive.steps .step,\n.ui.massive.step {\n  font-size: @massive;\n}\n\n\n.loadUIOverrides();\n"
  },
  {
    "path": "semantic/src/definitions/globals/reset.less",
    "content": "/*!\n * # Semantic UI - Reset\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n/*******************************\n            Theme\n*******************************/\n\n@type    : 'global';\n@element : 'reset';\n\n@import (multiple) '../../theme.config';\n\n/*******************************\n             Reset\n*******************************/\n\n/* Border-Box */\n*,\n*:before,\n*:after {\n  box-sizing: inherit;\n}\nhtml {\n  box-sizing: border-box;\n}\n\n/* iPad Input Shadows */\ninput[type=\"text\"], input[type=\"email\"], input[type=\"search\"], input[type=\"password\"] {\n  -webkit-appearance: none;\n  -moz-appearance: none; /* mobile firefox too! */\n}\n\n.loadUIOverrides();\n"
  },
  {
    "path": "semantic/src/definitions/globals/site.js",
    "content": "/*!\n * # Semantic UI - Site\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n;(function ($, window, document, undefined) {\n\n$.site = $.fn.site = function(parameters) {\n  var\n    time           = new Date().getTime(),\n    performance    = [],\n\n    query          = arguments[0],\n    methodInvoked  = (typeof query == 'string'),\n    queryArguments = [].slice.call(arguments, 1),\n\n    settings        = ( $.isPlainObject(parameters) )\n      ? $.extend(true, {}, $.site.settings, parameters)\n      : $.extend({}, $.site.settings),\n\n    namespace       = settings.namespace,\n    error           = settings.error,\n\n    eventNamespace  = '.' + namespace,\n    moduleNamespace = 'module-' + namespace,\n\n    $document       = $(document),\n    $module         = $document,\n    element         = this,\n    instance        = $module.data(moduleNamespace),\n\n    module,\n    returnedValue\n  ;\n  module = {\n\n    initialize: function() {\n      module.instantiate();\n    },\n\n    instantiate: function() {\n      module.verbose('Storing instance of site', module);\n      instance = module;\n      $module\n        .data(moduleNamespace, module)\n      ;\n    },\n\n    normalize: function() {\n      module.fix.console();\n      module.fix.requestAnimationFrame();\n    },\n\n    fix: {\n      console: function() {\n        module.debug('Normalizing window.console');\n        if (console === undefined || console.log === undefined) {\n          module.verbose('Console not available, normalizing events');\n          module.disable.console();\n        }\n        if (typeof console.group == 'undefined' || typeof console.groupEnd == 'undefined' || typeof console.groupCollapsed == 'undefined') {\n          module.verbose('Console group not available, normalizing events');\n          window.console.group = function() {};\n          window.console.groupEnd = function() {};\n          window.console.groupCollapsed = function() {};\n        }\n        if (typeof console.markTimeline == 'undefined') {\n          module.verbose('Mark timeline not available, normalizing events');\n          window.console.markTimeline = function() {};\n        }\n      },\n      consoleClear: function() {\n        module.debug('Disabling programmatic console clearing');\n        window.console.clear = function() {};\n      },\n      requestAnimationFrame: function() {\n        module.debug('Normalizing requestAnimationFrame');\n        if(window.requestAnimationFrame === undefined) {\n          module.debug('RequestAnimationFrame not available, normalizing event');\n          window.requestAnimationFrame = window.requestAnimationFrame\n            || window.mozRequestAnimationFrame\n            || window.webkitRequestAnimationFrame\n            || window.msRequestAnimationFrame\n            || function(callback) { setTimeout(callback, 0); }\n          ;\n        }\n      }\n    },\n\n    moduleExists: function(name) {\n      return ($.fn[name] !== undefined && $.fn[name].settings !== undefined);\n    },\n\n    enabled: {\n      modules: function(modules) {\n        var\n          enabledModules = []\n        ;\n        modules = modules || settings.modules;\n        $.each(modules, function(index, name) {\n          if(module.moduleExists(name)) {\n            enabledModules.push(name);\n          }\n        });\n        return enabledModules;\n      }\n    },\n\n    disabled: {\n      modules: function(modules) {\n        var\n          disabledModules = []\n        ;\n        modules = modules || settings.modules;\n        $.each(modules, function(index, name) {\n          if(!module.moduleExists(name)) {\n            disabledModules.push(name);\n          }\n        });\n        return disabledModules;\n      }\n    },\n\n    change: {\n      setting: function(setting, value, modules, modifyExisting) {\n        modules = (typeof modules === 'string')\n          ? (modules === 'all')\n            ? settings.modules\n            : [modules]\n          : modules || settings.modules\n        ;\n        modifyExisting = (modifyExisting !== undefined)\n          ? modifyExisting\n          : true\n        ;\n        $.each(modules, function(index, name) {\n          var\n            namespace = (module.moduleExists(name))\n              ? $.fn[name].settings.namespace || false\n              : true,\n            $existingModules\n          ;\n          if(module.moduleExists(name)) {\n            module.verbose('Changing default setting', setting, value, name);\n            $.fn[name].settings[setting] = value;\n            if(modifyExisting && namespace) {\n              $existingModules = $(':data(module-' + namespace + ')');\n              if($existingModules.length > 0) {\n                module.verbose('Modifying existing settings', $existingModules);\n                $existingModules[name]('setting', setting, value);\n              }\n            }\n          }\n        });\n      },\n      settings: function(newSettings, modules, modifyExisting) {\n        modules = (typeof modules === 'string')\n          ? [modules]\n          : modules || settings.modules\n        ;\n        modifyExisting = (modifyExisting !== undefined)\n          ? modifyExisting\n          : true\n        ;\n        $.each(modules, function(index, name) {\n          var\n            $existingModules\n          ;\n          if(module.moduleExists(name)) {\n            module.verbose('Changing default setting', newSettings, name);\n            $.extend(true, $.fn[name].settings, newSettings);\n            if(modifyExisting && namespace) {\n              $existingModules = $(':data(module-' + namespace + ')');\n              if($existingModules.length > 0) {\n                module.verbose('Modifying existing settings', $existingModules);\n                $existingModules[name]('setting', newSettings);\n              }\n            }\n          }\n        });\n      }\n    },\n\n    enable: {\n      console: function() {\n        module.console(true);\n      },\n      debug: function(modules, modifyExisting) {\n        modules = modules || settings.modules;\n        module.debug('Enabling debug for modules', modules);\n        module.change.setting('debug', true, modules, modifyExisting);\n      },\n      verbose: function(modules, modifyExisting) {\n        modules = modules || settings.modules;\n        module.debug('Enabling verbose debug for modules', modules);\n        module.change.setting('verbose', true, modules, modifyExisting);\n      }\n    },\n    disable: {\n      console: function() {\n        module.console(false);\n      },\n      debug: function(modules, modifyExisting) {\n        modules = modules || settings.modules;\n        module.debug('Disabling debug for modules', modules);\n        module.change.setting('debug', false, modules, modifyExisting);\n      },\n      verbose: function(modules, modifyExisting) {\n        modules = modules || settings.modules;\n        module.debug('Disabling verbose debug for modules', modules);\n        module.change.setting('verbose', false, modules, modifyExisting);\n      }\n    },\n\n    console: function(enable) {\n      if(enable) {\n        if(instance.cache.console === undefined) {\n          module.error(error.console);\n          return;\n        }\n        module.debug('Restoring console function');\n        window.console = instance.cache.console;\n      }\n      else {\n        module.debug('Disabling console function');\n        instance.cache.console = window.console;\n        window.console = {\n          clear          : function(){},\n          error          : function(){},\n          group          : function(){},\n          groupCollapsed : function(){},\n          groupEnd       : function(){},\n          info           : function(){},\n          log            : function(){},\n          markTimeline   : function(){},\n          warn           : function(){}\n        };\n      }\n    },\n\n    destroy: function() {\n      module.verbose('Destroying previous site for', $module);\n      $module\n        .removeData(moduleNamespace)\n      ;\n    },\n\n    cache: {},\n\n    setting: function(name, value) {\n      if( $.isPlainObject(name) ) {\n        $.extend(true, settings, name);\n      }\n      else if(value !== undefined) {\n        settings[name] = value;\n      }\n      else {\n        return settings[name];\n      }\n    },\n    internal: function(name, value) {\n      if( $.isPlainObject(name) ) {\n        $.extend(true, module, name);\n      }\n      else if(value !== undefined) {\n        module[name] = value;\n      }\n      else {\n        return module[name];\n      }\n    },\n    debug: function() {\n      if(settings.debug) {\n        if(settings.performance) {\n          module.performance.log(arguments);\n        }\n        else {\n          module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');\n          module.debug.apply(console, arguments);\n        }\n      }\n    },\n    verbose: function() {\n      if(settings.verbose && settings.debug) {\n        if(settings.performance) {\n          module.performance.log(arguments);\n        }\n        else {\n          module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');\n          module.verbose.apply(console, arguments);\n        }\n      }\n    },\n    error: function() {\n      module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');\n      module.error.apply(console, arguments);\n    },\n    performance: {\n      log: function(message) {\n        var\n          currentTime,\n          executionTime,\n          previousTime\n        ;\n        if(settings.performance) {\n          currentTime   = new Date().getTime();\n          previousTime  = time || currentTime;\n          executionTime = currentTime - previousTime;\n          time          = currentTime;\n          performance.push({\n            'Element'        : element,\n            'Name'           : message[0],\n            'Arguments'      : [].slice.call(message, 1) || '',\n            'Execution Time' : executionTime\n          });\n        }\n        clearTimeout(module.performance.timer);\n        module.performance.timer = setTimeout(module.performance.display, 500);\n      },\n      display: function() {\n        var\n          title = settings.name + ':',\n          totalTime = 0\n        ;\n        time = false;\n        clearTimeout(module.performance.timer);\n        $.each(performance, function(index, data) {\n          totalTime += data['Execution Time'];\n        });\n        title += ' ' + totalTime + 'ms';\n        if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {\n          console.groupCollapsed(title);\n          if(console.table) {\n            console.table(performance);\n          }\n          else {\n            $.each(performance, function(index, data) {\n              console.log(data['Name'] + ': ' + data['Execution Time']+'ms');\n            });\n          }\n          console.groupEnd();\n        }\n        performance = [];\n      }\n    },\n    invoke: function(query, passedArguments, context) {\n      var\n        object = instance,\n        maxDepth,\n        found,\n        response\n      ;\n      passedArguments = passedArguments || queryArguments;\n      context         = element         || context;\n      if(typeof query == 'string' && object !== undefined) {\n        query    = query.split(/[\\. ]/);\n        maxDepth = query.length - 1;\n        $.each(query, function(depth, value) {\n          var camelCaseValue = (depth != maxDepth)\n            ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)\n            : query\n          ;\n          if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {\n            object = object[camelCaseValue];\n          }\n          else if( object[camelCaseValue] !== undefined ) {\n            found = object[camelCaseValue];\n            return false;\n          }\n          else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {\n            object = object[value];\n          }\n          else if( object[value] !== undefined ) {\n            found = object[value];\n            return false;\n          }\n          else {\n            module.error(error.method, query);\n            return false;\n          }\n        });\n      }\n      if ( $.isFunction( found ) ) {\n        response = found.apply(context, passedArguments);\n      }\n      else if(found !== undefined) {\n        response = found;\n      }\n      if($.isArray(returnedValue)) {\n        returnedValue.push(response);\n      }\n      else if(returnedValue !== undefined) {\n        returnedValue = [returnedValue, response];\n      }\n      else if(response !== undefined) {\n        returnedValue = response;\n      }\n      return found;\n    }\n  };\n\n  if(methodInvoked) {\n    if(instance === undefined) {\n      module.initialize();\n    }\n    module.invoke(query);\n  }\n  else {\n    if(instance !== undefined) {\n      module.destroy();\n    }\n    module.initialize();\n  }\n  return (returnedValue !== undefined)\n    ? returnedValue\n    : this\n  ;\n};\n\n$.site.settings = {\n\n  name        : 'Site',\n  namespace   : 'site',\n\n  error : {\n    console : 'Console cannot be restored, most likely it was overwritten outside of module',\n    method : 'The method you called is not defined.'\n  },\n\n  debug       : false,\n  verbose     : false,\n  performance : true,\n\n  modules: [\n    'accordion',\n    'api',\n    'checkbox',\n    'dimmer',\n    'dropdown',\n    'embed',\n    'form',\n    'modal',\n    'nag',\n    'popup',\n    'rating',\n    'shape',\n    'sidebar',\n    'state',\n    'sticky',\n    'tab',\n    'transition',\n    'visit',\n    'visibility'\n  ],\n\n  siteNamespace   : 'site',\n  namespaceStub   : {\n    cache     : {},\n    config    : {},\n    sections  : {},\n    section   : {},\n    utilities : {}\n  }\n\n};\n\n// allows for selection of elements with data attributes\n$.extend($.expr[ \":\" ], {\n  data: ($.expr.createPseudo)\n    ? $.expr.createPseudo(function(dataName) {\n        return function(elem) {\n          return !!$.data(elem, dataName);\n        };\n      })\n    : function(elem, i, match) {\n      // support: jQuery < 1.8\n      return !!$.data(elem, match[ 3 ]);\n    }\n});\n\n\n})( jQuery, window, document );\n"
  },
  {
    "path": "semantic/src/definitions/globals/site.less",
    "content": "/*!\n * # Semantic UI - Site\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n            Theme\n*******************************/\n\n@type    : 'global';\n@element : 'site';\n\n@import (multiple) '../../theme.config';\n\n/*******************************\n             Page\n*******************************/\n\n.loadFonts();\n\nhtml,\nbody {\n  height: 100%;\n}\n\nhtml {\n  font-size: @emSize;\n}\n\nbody {\n  margin: 0px;\n  padding: 0px;\n  overflow-x: @pageOverflowX;\n  min-width: @pageMinWidth;\n  background: @pageBackground;\n  font-family: @pageFont;\n  font-size: @fontSize;\n  line-height: @lineHeight;\n  color: @textColor;\n  font-smoothing: @fontSmoothing;\n}\n\n/*******************************\n             Headers\n*******************************/\n\nh1,\nh2,\nh3,\nh4,\nh5 {\n  font-family: @headerFont;\n  line-height: @headerLineHeight;\n  margin: @headerMargin;\n  font-weight: @headerFontWeight;\n  padding: 0em;\n}\n\nh1 {\n  min-height: 1rem;\n  font-size: @h1;\n}\nh2 {\n  font-size: @h2;\n}\nh3 {\n  font-size: @h3;\n}\nh4 {\n  font-size: @h4;\n}\nh5 {\n  font-size: @h5;\n}\n\nh1:first-child,\nh2:first-child,\nh3:first-child,\nh4:first-child,\nh5:first-child {\n  margin-top: 0em;\n}\n\nh1:last-child,\nh2:last-child,\nh3:last-child,\nh4:last-child,\nh5:last-child {\n  margin-bottom: 0em;\n}\n\n\n/*******************************\n             Text\n*******************************/\n\np {\n  margin: @paragraphMargin;\n  line-height: @paragraphLineHeight;\n}\np:first-child {\n  margin-top: 0em;\n}\np:last-child {\n  margin-bottom: 0em;\n}\n\n/*-------------------\n        Links\n--------------------*/\n\na {\n  color: @linkColor;\n  text-decoration: @linkUnderline;\n}\na:hover {\n  color: @linkHoverColor;\n  text-decoration: @linkHoverUnderline;\n}\n\n\n/*******************************\n         Scrollbars\n*******************************/\n\n.addScrollbars() when (@useCustomScrollbars) {\n\n  /* Force Simple Scrollbars */\n  body ::-webkit-scrollbar {\n    -webkit-appearance: none;\n    width: @customScrollbarWidth;\n    height: @customScrollbarHeight;\n  }\n  body ::-webkit-scrollbar-track {\n    background: @trackBackground;\n    border-radius: @trackBorderRadius;\n  }\n  body ::-webkit-scrollbar-thumb {\n    cursor: pointer;\n    border-radius: @thumbBorderRadius;\n    background: @thumbBackground;\n    transition: @thumbTransition;\n  }\n  body ::-webkit-scrollbar-thumb:window-inactive {\n    background: @thumbInactiveBackground;\n  }\n  body ::-webkit-scrollbar-thumb:hover {\n    background: @thumbHoverBackground;\n  }\n\n  /* Inverted UI */\n  body .ui.inverted::-webkit-scrollbar-track {\n    background: @trackInvertedBackground;\n  }\n  body .ui.inverted::-webkit-scrollbar-thumb {\n    background: @thumbInvertedBackground;\n  }\n  body .ui.inverted::-webkit-scrollbar-thumb:window-inactive {\n    background: @thumbInvertedInactiveBackground;\n  }\n  body .ui.inverted::-webkit-scrollbar-thumb:hover {\n    background: @thumbInvertedHoverBackground;\n  }\n}\n\n/*******************************\n          Highlighting\n*******************************/\n\n/* Site */\n::-webkit-selection {\n  background-color: @highlightBackground;\n  color: @highlightColor;\n}\n::-moz-selection {\n  background-color: @highlightBackground;\n  color: @highlightColor;\n}\n::selection {\n  background-color: @highlightBackground;\n  color: @highlightColor;\n}\n\n/* Form */\ntextarea::-webkit-selection,\ninput::-webkit-selection {\n  background-color: @inputHighlightBackground;\n  color: @inputHighlightColor;\n}\ntextarea::-moz-selection,\ninput::-moz-selection {\n  background-color: @inputHighlightBackground;\n  color: @inputHighlightColor;\n}\ntextarea::selection,\ninput::selection {\n  background-color: @inputHighlightBackground;\n  color: @inputHighlightColor;\n}\n\n.addScrollbars();\n.loadUIOverrides();\n"
  },
  {
    "path": "semantic/src/definitions/modules/accordion.js",
    "content": "/*!\n * # Semantic UI - Accordion\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n;(function ($, window, document, undefined) {\n\n'use strict';\n\nwindow = (typeof window != 'undefined' && window.Math == Math)\n  ? window\n  : (typeof self != 'undefined' && self.Math == Math)\n    ? self\n    : Function('return this')()\n;\n\n$.fn.accordion = function(parameters) {\n  var\n    $allModules     = $(this),\n\n    time            = new Date().getTime(),\n    performance     = [],\n\n    query           = arguments[0],\n    methodInvoked   = (typeof query == 'string'),\n    queryArguments  = [].slice.call(arguments, 1),\n\n    requestAnimationFrame = window.requestAnimationFrame\n      || window.mozRequestAnimationFrame\n      || window.webkitRequestAnimationFrame\n      || window.msRequestAnimationFrame\n      || function(callback) { setTimeout(callback, 0); },\n\n    returnedValue\n  ;\n  $allModules\n    .each(function() {\n      var\n        settings        = ( $.isPlainObject(parameters) )\n          ? $.extend(true, {}, $.fn.accordion.settings, parameters)\n          : $.extend({}, $.fn.accordion.settings),\n\n        className       = settings.className,\n        namespace       = settings.namespace,\n        selector        = settings.selector,\n        error           = settings.error,\n\n        eventNamespace  = '.' + namespace,\n        moduleNamespace = 'module-' + namespace,\n        moduleSelector  = $allModules.selector || '',\n\n        $module  = $(this),\n        $title   = $module.find(selector.title),\n        $content = $module.find(selector.content),\n\n        element  = this,\n        instance = $module.data(moduleNamespace),\n        observer,\n        module\n      ;\n\n      module = {\n\n        initialize: function() {\n          module.debug('Initializing', $module);\n          module.bind.events();\n          if(settings.observeChanges) {\n            module.observeChanges();\n          }\n          module.instantiate();\n        },\n\n        instantiate: function() {\n          instance = module;\n          $module\n            .data(moduleNamespace, module)\n          ;\n        },\n\n        destroy: function() {\n          module.debug('Destroying previous instance', $module);\n          $module\n            .off(eventNamespace)\n            .removeData(moduleNamespace)\n          ;\n        },\n\n        refresh: function() {\n          $title   = $module.find(selector.title);\n          $content = $module.find(selector.content);\n        },\n\n        observeChanges: function() {\n          if('MutationObserver' in window) {\n            observer = new MutationObserver(function(mutations) {\n              module.debug('DOM tree modified, updating selector cache');\n              module.refresh();\n            });\n            observer.observe(element, {\n              childList : true,\n              subtree   : true\n            });\n            module.debug('Setting up mutation observer', observer);\n          }\n        },\n\n        bind: {\n          events: function() {\n            module.debug('Binding delegated events');\n            $module\n              .on(settings.on + eventNamespace, selector.trigger, module.event.click)\n            ;\n          }\n        },\n\n        event: {\n          click: function() {\n            module.toggle.call(this);\n          }\n        },\n\n        toggle: function(query) {\n          var\n            $activeTitle = (query !== undefined)\n              ? (typeof query === 'number')\n                ? $title.eq(query)\n                : $(query).closest(selector.title)\n              : $(this).closest(selector.title),\n            $activeContent = $activeTitle.next($content),\n            isAnimating = $activeContent.hasClass(className.animating),\n            isActive    = $activeContent.hasClass(className.active),\n            isOpen      = (isActive && !isAnimating),\n            isOpening   = (!isActive && isAnimating)\n          ;\n          module.debug('Toggling visibility of content', $activeTitle);\n          if(isOpen || isOpening) {\n            if(settings.collapsible) {\n              module.close.call($activeTitle);\n            }\n            else {\n              module.debug('Cannot close accordion content collapsing is disabled');\n            }\n          }\n          else {\n            module.open.call($activeTitle);\n          }\n        },\n\n        open: function(query) {\n          var\n            $activeTitle = (query !== undefined)\n              ? (typeof query === 'number')\n                ? $title.eq(query)\n                : $(query).closest(selector.title)\n              : $(this).closest(selector.title),\n            $activeContent = $activeTitle.next($content),\n            isAnimating = $activeContent.hasClass(className.animating),\n            isActive    = $activeContent.hasClass(className.active),\n            isOpen      = (isActive || isAnimating)\n          ;\n          if(isOpen) {\n            module.debug('Accordion already open, skipping', $activeContent);\n            return;\n          }\n          module.debug('Opening accordion content', $activeTitle);\n          settings.onOpening.call($activeContent);\n          settings.onChanging.call($activeContent);\n          if(settings.exclusive) {\n            module.closeOthers.call($activeTitle);\n          }\n          $activeTitle\n            .addClass(className.active)\n          ;\n          $activeContent\n            .stop(true, true)\n            .addClass(className.animating)\n          ;\n          if(settings.animateChildren) {\n            if($.fn.transition !== undefined && $module.transition('is supported')) {\n              $activeContent\n                .children()\n                  .transition({\n                    animation   : 'fade in',\n                    queue       : false,\n                    useFailSafe : true,\n                    debug       : settings.debug,\n                    verbose     : settings.verbose,\n                    duration    : settings.duration\n                  })\n              ;\n            }\n            else {\n              $activeContent\n                .children()\n                  .stop(true, true)\n                  .animate({\n                    opacity: 1\n                  }, settings.duration, module.resetOpacity)\n              ;\n            }\n          }\n          $activeContent\n            .slideDown(settings.duration, settings.easing, function() {\n              $activeContent\n                .removeClass(className.animating)\n                .addClass(className.active)\n              ;\n              module.reset.display.call(this);\n              settings.onOpen.call(this);\n              settings.onChange.call(this);\n            })\n          ;\n        },\n\n        close: function(query) {\n          var\n            $activeTitle = (query !== undefined)\n              ? (typeof query === 'number')\n                ? $title.eq(query)\n                : $(query).closest(selector.title)\n              : $(this).closest(selector.title),\n            $activeContent = $activeTitle.next($content),\n            isAnimating    = $activeContent.hasClass(className.animating),\n            isActive       = $activeContent.hasClass(className.active),\n            isOpening      = (!isActive && isAnimating),\n            isClosing      = (isActive && isAnimating)\n          ;\n          if((isActive || isOpening) && !isClosing) {\n            module.debug('Closing accordion content', $activeContent);\n            settings.onClosing.call($activeContent);\n            settings.onChanging.call($activeContent);\n            $activeTitle\n              .removeClass(className.active)\n            ;\n            $activeContent\n              .stop(true, true)\n              .addClass(className.animating)\n            ;\n            if(settings.animateChildren) {\n              if($.fn.transition !== undefined && $module.transition('is supported')) {\n                $activeContent\n                  .children()\n                    .transition({\n                      animation   : 'fade out',\n                      queue       : false,\n                      useFailSafe : true,\n                      debug       : settings.debug,\n                      verbose     : settings.verbose,\n                      duration    : settings.duration\n                    })\n                ;\n              }\n              else {\n                $activeContent\n                  .children()\n                    .stop(true, true)\n                    .animate({\n                      opacity: 0\n                    }, settings.duration, module.resetOpacity)\n                ;\n              }\n            }\n            $activeContent\n              .slideUp(settings.duration, settings.easing, function() {\n                $activeContent\n                  .removeClass(className.animating)\n                  .removeClass(className.active)\n                ;\n                module.reset.display.call(this);\n                settings.onClose.call(this);\n                settings.onChange.call(this);\n              })\n            ;\n          }\n        },\n\n        closeOthers: function(index) {\n          var\n            $activeTitle = (index !== undefined)\n              ? $title.eq(index)\n              : $(this).closest(selector.title),\n            $parentTitles    = $activeTitle.parents(selector.content).prev(selector.title),\n            $activeAccordion = $activeTitle.closest(selector.accordion),\n            activeSelector   = selector.title + '.' + className.active + ':visible',\n            activeContent    = selector.content + '.' + className.active + ':visible',\n            $openTitles,\n            $nestedTitles,\n            $openContents\n          ;\n          if(settings.closeNested) {\n            $openTitles   = $activeAccordion.find(activeSelector).not($parentTitles);\n            $openContents = $openTitles.next($content);\n          }\n          else {\n            $openTitles   = $activeAccordion.find(activeSelector).not($parentTitles);\n            $nestedTitles = $activeAccordion.find(activeContent).find(activeSelector).not($parentTitles);\n            $openTitles   = $openTitles.not($nestedTitles);\n            $openContents = $openTitles.next($content);\n          }\n          if( ($openTitles.length > 0) ) {\n            module.debug('Exclusive enabled, closing other content', $openTitles);\n            $openTitles\n              .removeClass(className.active)\n            ;\n            $openContents\n              .removeClass(className.animating)\n              .stop(true, true)\n            ;\n            if(settings.animateChildren) {\n              if($.fn.transition !== undefined && $module.transition('is supported')) {\n                $openContents\n                  .children()\n                    .transition({\n                      animation   : 'fade out',\n                      useFailSafe : true,\n                      debug       : settings.debug,\n                      verbose     : settings.verbose,\n                      duration    : settings.duration\n                    })\n                ;\n              }\n              else {\n                $openContents\n                  .children()\n                    .stop(true, true)\n                    .animate({\n                      opacity: 0\n                    }, settings.duration, module.resetOpacity)\n                ;\n              }\n            }\n            $openContents\n              .slideUp(settings.duration , settings.easing, function() {\n                $(this).removeClass(className.active);\n                module.reset.display.call(this);\n              })\n            ;\n          }\n        },\n\n        reset: {\n\n          display: function() {\n            module.verbose('Removing inline display from element', this);\n            $(this).css('display', '');\n            if( $(this).attr('style') === '') {\n              $(this)\n                .attr('style', '')\n                .removeAttr('style')\n              ;\n            }\n          },\n\n          opacity: function() {\n            module.verbose('Removing inline opacity from element', this);\n            $(this).css('opacity', '');\n            if( $(this).attr('style') === '') {\n              $(this)\n                .attr('style', '')\n                .removeAttr('style')\n              ;\n            }\n          },\n\n        },\n\n        setting: function(name, value) {\n          module.debug('Changing setting', name, value);\n          if( $.isPlainObject(name) ) {\n            $.extend(true, settings, name);\n          }\n          else if(value !== undefined) {\n            if($.isPlainObject(settings[name])) {\n              $.extend(true, settings[name], value);\n            }\n            else {\n              settings[name] = value;\n            }\n          }\n          else {\n            return settings[name];\n          }\n        },\n        internal: function(name, value) {\n          module.debug('Changing internal', name, value);\n          if(value !== undefined) {\n            if( $.isPlainObject(name) ) {\n              $.extend(true, module, name);\n            }\n            else {\n              module[name] = value;\n            }\n          }\n          else {\n            return module[name];\n          }\n        },\n        debug: function() {\n          if(!settings.silent && settings.debug) {\n            if(settings.performance) {\n              module.performance.log(arguments);\n            }\n            else {\n              module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');\n              module.debug.apply(console, arguments);\n            }\n          }\n        },\n        verbose: function() {\n          if(!settings.silent && settings.verbose && settings.debug) {\n            if(settings.performance) {\n              module.performance.log(arguments);\n            }\n            else {\n              module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');\n              module.verbose.apply(console, arguments);\n            }\n          }\n        },\n        error: function() {\n          if(!settings.silent) {\n            module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');\n            module.error.apply(console, arguments);\n          }\n        },\n        performance: {\n          log: function(message) {\n            var\n              currentTime,\n              executionTime,\n              previousTime\n            ;\n            if(settings.performance) {\n              currentTime   = new Date().getTime();\n              previousTime  = time || currentTime;\n              executionTime = currentTime - previousTime;\n              time          = currentTime;\n              performance.push({\n                'Name'           : message[0],\n                'Arguments'      : [].slice.call(message, 1) || '',\n                'Element'        : element,\n                'Execution Time' : executionTime\n              });\n            }\n            clearTimeout(module.performance.timer);\n            module.performance.timer = setTimeout(module.performance.display, 500);\n          },\n          display: function() {\n            var\n              title = settings.name + ':',\n              totalTime = 0\n            ;\n            time = false;\n            clearTimeout(module.performance.timer);\n            $.each(performance, function(index, data) {\n              totalTime += data['Execution Time'];\n            });\n            title += ' ' + totalTime + 'ms';\n            if(moduleSelector) {\n              title += ' \\'' + moduleSelector + '\\'';\n            }\n            if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {\n              console.groupCollapsed(title);\n              if(console.table) {\n                console.table(performance);\n              }\n              else {\n                $.each(performance, function(index, data) {\n                  console.log(data['Name'] + ': ' + data['Execution Time']+'ms');\n                });\n              }\n              console.groupEnd();\n            }\n            performance = [];\n          }\n        },\n        invoke: function(query, passedArguments, context) {\n          var\n            object = instance,\n            maxDepth,\n            found,\n            response\n          ;\n          passedArguments = passedArguments || queryArguments;\n          context         = element         || context;\n          if(typeof query == 'string' && object !== undefined) {\n            query    = query.split(/[\\. ]/);\n            maxDepth = query.length - 1;\n            $.each(query, function(depth, value) {\n              var camelCaseValue = (depth != maxDepth)\n                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)\n                : query\n              ;\n              if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {\n                object = object[camelCaseValue];\n              }\n              else if( object[camelCaseValue] !== undefined ) {\n                found = object[camelCaseValue];\n                return false;\n              }\n              else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {\n                object = object[value];\n              }\n              else if( object[value] !== undefined ) {\n                found = object[value];\n                return false;\n              }\n              else {\n                module.error(error.method, query);\n                return false;\n              }\n            });\n          }\n          if ( $.isFunction( found ) ) {\n            response = found.apply(context, passedArguments);\n          }\n          else if(found !== undefined) {\n            response = found;\n          }\n          if($.isArray(returnedValue)) {\n            returnedValue.push(response);\n          }\n          else if(returnedValue !== undefined) {\n            returnedValue = [returnedValue, response];\n          }\n          else if(response !== undefined) {\n            returnedValue = response;\n          }\n          return found;\n        }\n      };\n      if(methodInvoked) {\n        if(instance === undefined) {\n          module.initialize();\n        }\n        module.invoke(query);\n      }\n      else {\n        if(instance !== undefined) {\n          instance.invoke('destroy');\n        }\n        module.initialize();\n      }\n    })\n  ;\n  return (returnedValue !== undefined)\n    ? returnedValue\n    : this\n  ;\n};\n\n$.fn.accordion.settings = {\n\n  name            : 'Accordion',\n  namespace       : 'accordion',\n\n  silent          : false,\n  debug           : false,\n  verbose         : false,\n  performance     : true,\n\n  on              : 'click', // event on title that opens accordion\n\n  observeChanges  : true,  // whether accordion should automatically refresh on DOM insertion\n\n  exclusive       : true,  // whether a single accordion content panel should be open at once\n  collapsible     : true,  // whether accordion content can be closed\n  closeNested     : false, // whether nested content should be closed when a panel is closed\n  animateChildren : true,  // whether children opacity should be animated\n\n  duration        : 350, // duration of animation\n  easing          : 'easeOutQuad', // easing equation for animation\n\n  onOpening       : function(){}, // callback before open animation\n  onClosing       : function(){}, // callback before closing animation\n  onChanging      : function(){}, // callback before closing or opening animation\n\n  onOpen          : function(){}, // callback after open animation\n  onClose         : function(){}, // callback after closing animation\n  onChange        : function(){}, // callback after closing or opening animation\n\n  error: {\n    method : 'The method you called is not defined'\n  },\n\n  className   : {\n    active    : 'active',\n    animating : 'animating'\n  },\n\n  selector    : {\n    accordion : '.accordion',\n    title     : '.title',\n    trigger   : '.title',\n    content   : '.content'\n  }\n\n};\n\n// Adds easing\n$.extend( $.easing, {\n  easeOutQuad: function (x, t, b, c, d) {\n    return -c *(t/=d)*(t-2) + b;\n  }\n});\n\n})( jQuery, window, document );\n\n"
  },
  {
    "path": "semantic/src/definitions/modules/accordion.less",
    "content": "/*!\r\n * # Semantic UI - Accordion\r\n * http://github.com/semantic-org/semantic-ui/\r\n *\r\n *\r\n * Released under the MIT license\r\n * http://opensource.org/licenses/MIT\r\n *\r\n */\r\n\r\n/*******************************\r\n            Theme\r\n*******************************/\r\n\r\n@type    : 'module';\r\n@element : 'accordion';\r\n\r\n@import (multiple) '../../theme.config';\r\n\r\n/*******************************\r\n            Accordion\r\n*******************************/\r\n\r\n.ui.accordion,\r\n.ui.accordion .accordion {\r\n  max-width: 100%;\r\n}\r\n.ui.accordion .accordion {\r\n  margin: @childAccordionMargin;\r\n  padding: @childAccordionPadding;\r\n}\r\n\r\n/* Title */\r\n.ui.accordion .title,\r\n.ui.accordion .accordion .title {\r\n  cursor: pointer;\r\n}\r\n\r\n/* Default Styling */\r\n.ui.accordion .title:not(.ui) {\r\n  padding: @titlePadding;\r\n  font-family: @titleFont;\r\n  font-size: @titleFontSize;\r\n  color: @titleColor;\r\n}\r\n\r\n/* Content */\r\n.ui.accordion .title ~ .content,\r\n.ui.accordion .accordion .title ~ .content {\r\n  display: none;\r\n}\r\n\r\n/* Default Styling */\r\n.ui.accordion:not(.styled) .title ~ .content:not(.ui),\r\n.ui.accordion:not(.styled) .accordion .title ~ .content:not(.ui) {\r\n  margin: @contentMargin;\r\n  padding: @contentPadding;\r\n}\r\n.ui.accordion:not(.styled) .title ~ .content:not(.ui):last-child {\r\n  padding-bottom: 0em;\r\n}\r\n\r\n/* Arrow */\r\n.ui.accordion .title .dropdown.icon,\r\n.ui.accordion .accordion .title .dropdown.icon {\r\n  display: @iconDisplay;\r\n  float: @iconFloat;\r\n  opacity: @iconOpacity;\r\n  width: @iconWidth;\r\n  height: @iconHeight;\r\n  margin: @iconMargin;\r\n  padding: @iconPadding;\r\n  font-size: @iconFontSize;\r\n  transition: @iconTransition;\r\n  vertical-align: @iconVerticalAlign;\r\n  transform: @iconTransform;\r\n}\r\n\r\n/*--------------\r\n    Coupling\r\n---------------*/\r\n\r\n/* Menu */\r\n.ui.accordion.menu .item .title {\r\n  display: block;\r\n  padding: @menuTitlePadding;\r\n}\r\n.ui.accordion.menu .item .title > .dropdown.icon {\r\n  float: @menuIconFloat;\r\n  margin: @menuIconMargin;\r\n  transform: @menuIconTransform;\r\n}\r\n\r\n/* Header */\r\n.ui.accordion .ui.header .dropdown.icon {\r\n  font-size: @iconFontSize;\r\n  margin: @iconMargin;\r\n}\r\n\r\n/*******************************\r\n            States\r\n*******************************/\r\n\r\n.ui.accordion .active.title .dropdown.icon,\r\n.ui.accordion .accordion .active.title .dropdown.icon {\r\n  transform: @activeIconTransform;\r\n}\r\n\r\n.ui.accordion.menu .item .active.title > .dropdown.icon {\r\n  transform: @activeIconTransform;\r\n}\r\n\r\n/*******************************\r\n            Types\r\n*******************************/\r\n\r\n/*--------------\r\n     Styled\r\n---------------*/\r\n\r\n.ui.styled.accordion {\r\n  width: @styledWidth;\r\n}\r\n\r\n.ui.styled.accordion,\r\n.ui.styled.accordion .accordion {\r\n  border-radius: @styledBorderRadius;\r\n  background: @styledBackground;\r\n  box-shadow: @styledBoxShadow;\r\n}\r\n.ui.styled.accordion .title,\r\n.ui.styled.accordion .accordion .title {\r\n  margin: @styledTitleMargin;\r\n  padding: @styledTitlePadding;\r\n  color: @styledTitleColor;\r\n  font-weight: @styledTitleFontWeight;\r\n  border-top: @styledTitleBorder;\r\n  transition: @styledTitleTransition;\r\n}\r\n.ui.styled.accordion > .title:first-child,\r\n.ui.styled.accordion .accordion .title:first-child {\r\n  border-top: none;\r\n}\r\n\r\n\r\n/* Content */\r\n.ui.styled.accordion .content,\r\n.ui.styled.accordion .accordion .content {\r\n  margin: @styledContentMargin;\r\n  padding: @styledContentPadding;\r\n}\r\n.ui.styled.accordion .accordion .content {\r\n  padding: @styledChildContentMargin;\r\n  padding: @styledChildContentPadding;\r\n}\r\n\r\n\r\n/* Hover */\r\n.ui.styled.accordion .title:hover,\r\n.ui.styled.accordion .active.title,\r\n.ui.styled.accordion .accordion .title:hover,\r\n.ui.styled.accordion .accordion .active.title {\r\n  background: @styledTitleHoverBackground;\r\n  color: @styledTitleHoverColor;\r\n}\r\n.ui.styled.accordion .accordion .title:hover,\r\n.ui.styled.accordion .accordion .active.title {\r\n  background: @styledHoverChildTitleBackground;\r\n  color: @styledHoverChildTitleColor;\r\n}\r\n\r\n\r\n/* Active */\r\n.ui.styled.accordion .active.title {\r\n  background: @styledActiveTitleBackground;\r\n  color: @styledActiveTitleColor;\r\n}\r\n.ui.styled.accordion .accordion .active.title {\r\n  background: @styledActiveChildTitleBackground;\r\n  color: @styledActiveChildTitleColor;\r\n}\r\n\r\n\r\n/*******************************\r\n            States\r\n*******************************/\r\n\r\n/*--------------\r\n     Active\r\n---------------*/\r\n\r\n.ui.accordion .active.content,\r\n.ui.accordion .accordion .active.content {\r\n  display: block;\r\n}\r\n\r\n/*******************************\r\n           Variations\r\n*******************************/\r\n\r\n/*--------------\r\n     Fluid\r\n---------------*/\r\n\r\n.ui.fluid.accordion,\r\n.ui.fluid.accordion .accordion {\r\n  width: 100%;\r\n}\r\n\r\n/*--------------\r\n     Inverted\r\n---------------*/\r\n\r\n.ui.inverted.accordion .title:not(.ui) {\r\n  color: @invertedTitleColor;\r\n}\r\n\r\n.loadUIOverrides();\r\n\r\n"
  },
  {
    "path": "semantic/src/definitions/modules/checkbox.js",
    "content": "/*!\n * # Semantic UI - Checkbox\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n;(function ($, window, document, undefined) {\n\n'use strict';\n\nwindow = (typeof window != 'undefined' && window.Math == Math)\n  ? window\n  : (typeof self != 'undefined' && self.Math == Math)\n    ? self\n    : Function('return this')()\n;\n\n$.fn.checkbox = function(parameters) {\n  var\n    $allModules    = $(this),\n    moduleSelector = $allModules.selector || '',\n\n    time           = new Date().getTime(),\n    performance    = [],\n\n    query          = arguments[0],\n    methodInvoked  = (typeof query == 'string'),\n    queryArguments = [].slice.call(arguments, 1),\n    returnedValue\n  ;\n\n  $allModules\n    .each(function() {\n      var\n        settings        = $.extend(true, {}, $.fn.checkbox.settings, parameters),\n\n        className       = settings.className,\n        namespace       = settings.namespace,\n        selector        = settings.selector,\n        error           = settings.error,\n\n        eventNamespace  = '.' + namespace,\n        moduleNamespace = 'module-' + namespace,\n\n        $module         = $(this),\n        $label          = $(this).children(selector.label),\n        $input          = $(this).children(selector.input),\n        input           = $input[0],\n\n        initialLoad     = false,\n        shortcutPressed = false,\n        instance        = $module.data(moduleNamespace),\n\n        observer,\n        element         = this,\n        module\n      ;\n\n      module      = {\n\n        initialize: function() {\n          module.verbose('Initializing checkbox', settings);\n\n          module.create.label();\n          module.bind.events();\n\n          module.set.tabbable();\n          module.hide.input();\n\n          module.observeChanges();\n          module.instantiate();\n          module.setup();\n        },\n\n        instantiate: function() {\n          module.verbose('Storing instance of module', module);\n          instance = module;\n          $module\n            .data(moduleNamespace, module)\n          ;\n        },\n\n        destroy: function() {\n          module.verbose('Destroying module');\n          module.unbind.events();\n          module.show.input();\n          $module.removeData(moduleNamespace);\n        },\n\n        fix: {\n          reference: function() {\n            if( $module.is(selector.input) ) {\n              module.debug('Behavior called on <input> adjusting invoked element');\n              $module = $module.closest(selector.checkbox);\n              module.refresh();\n            }\n          }\n        },\n\n        setup: function() {\n          module.set.initialLoad();\n          if( module.is.indeterminate() ) {\n            module.debug('Initial value is indeterminate');\n            module.indeterminate();\n          }\n          else if( module.is.checked() ) {\n            module.debug('Initial value is checked');\n            module.check();\n          }\n          else {\n            module.debug('Initial value is unchecked');\n            module.uncheck();\n          }\n          module.remove.initialLoad();\n        },\n\n        refresh: function() {\n          $label = $module.children(selector.label);\n          $input = $module.children(selector.input);\n          input  = $input[0];\n        },\n\n        hide: {\n          input: function() {\n            module.verbose('Modifying <input> z-index to be unselectable');\n            $input.addClass(className.hidden);\n          }\n        },\n        show: {\n          input: function() {\n            module.verbose('Modifying <input> z-index to be selectable');\n            $input.removeClass(className.hidden);\n          }\n        },\n\n        observeChanges: function() {\n          if('MutationObserver' in window) {\n            observer = new MutationObserver(function(mutations) {\n              module.debug('DOM tree modified, updating selector cache');\n              module.refresh();\n            });\n            observer.observe(element, {\n              childList : true,\n              subtree   : true\n            });\n            module.debug('Setting up mutation observer', observer);\n          }\n        },\n\n        attachEvents: function(selector, event) {\n          var\n            $element = $(selector)\n          ;\n          event = $.isFunction(module[event])\n            ? module[event]\n            : module.toggle\n          ;\n          if($element.length > 0) {\n            module.debug('Attaching checkbox events to element', selector, event);\n            $element\n              .on('click' + eventNamespace, event)\n            ;\n          }\n          else {\n            module.error(error.notFound);\n          }\n        },\n\n        event: {\n          click: function(event) {\n            var\n              $target = $(event.target)\n            ;\n            if( $target.is(selector.input) ) {\n              module.verbose('Using default check action on initialized checkbox');\n              return;\n            }\n            if( $target.is(selector.link) ) {\n              module.debug('Clicking link inside checkbox, skipping toggle');\n              return;\n            }\n            module.toggle();\n            $input.focus();\n            event.preventDefault();\n          },\n          keydown: function(event) {\n            var\n              key     = event.which,\n              keyCode = {\n                enter  : 13,\n                space  : 32,\n                escape : 27\n              }\n            ;\n            if(key == keyCode.escape) {\n              module.verbose('Escape key pressed blurring field');\n              $input.blur();\n              shortcutPressed = true;\n            }\n            else if(!event.ctrlKey && ( key == keyCode.space || key == keyCode.enter) ) {\n              module.verbose('Enter/space key pressed, toggling checkbox');\n              module.toggle();\n              shortcutPressed = true;\n            }\n            else {\n              shortcutPressed = false;\n            }\n          },\n          keyup: function(event) {\n            if(shortcutPressed) {\n              event.preventDefault();\n            }\n          }\n        },\n\n        check: function() {\n          if( !module.should.allowCheck() ) {\n            return;\n          }\n          module.debug('Checking checkbox', $input);\n          module.set.checked();\n          if( !module.should.ignoreCallbacks() ) {\n            settings.onChecked.call(input);\n            settings.onChange.call(input);\n          }\n        },\n\n        uncheck: function() {\n          if( !module.should.allowUncheck() ) {\n            return;\n          }\n          module.debug('Unchecking checkbox');\n          module.set.unchecked();\n          if( !module.should.ignoreCallbacks() ) {\n            settings.onUnchecked.call(input);\n            settings.onChange.call(input);\n          }\n        },\n\n        indeterminate: function() {\n          if( module.should.allowIndeterminate() ) {\n            module.debug('Checkbox is already indeterminate');\n            return;\n          }\n          module.debug('Making checkbox indeterminate');\n          module.set.indeterminate();\n          if( !module.should.ignoreCallbacks() ) {\n            settings.onIndeterminate.call(input);\n            settings.onChange.call(input);\n          }\n        },\n\n        determinate: function() {\n          if( module.should.allowDeterminate() ) {\n            module.debug('Checkbox is already determinate');\n            return;\n          }\n          module.debug('Making checkbox determinate');\n          module.set.determinate();\n          if( !module.should.ignoreCallbacks() ) {\n            settings.onDeterminate.call(input);\n            settings.onChange.call(input);\n          }\n        },\n\n        enable: function() {\n          if( module.is.enabled() ) {\n            module.debug('Checkbox is already enabled');\n            return;\n          }\n          module.debug('Enabling checkbox');\n          module.set.enabled();\n          settings.onEnable.call(input);\n          // preserve legacy callbacks\n          settings.onEnabled.call(input);\n        },\n\n        disable: function() {\n          if( module.is.disabled() ) {\n            module.debug('Checkbox is already disabled');\n            return;\n          }\n          module.debug('Disabling checkbox');\n          module.set.disabled();\n          settings.onDisable.call(input);\n          // preserve legacy callbacks\n          settings.onDisabled.call(input);\n        },\n\n        get: {\n          radios: function() {\n            var\n              name = module.get.name()\n            ;\n            return $('input[name=\"' + name + '\"]').closest(selector.checkbox);\n          },\n          otherRadios: function() {\n            return module.get.radios().not($module);\n          },\n          name: function() {\n            return $input.attr('name');\n          }\n        },\n\n        is: {\n          initialLoad: function() {\n            return initialLoad;\n          },\n          radio: function() {\n            return ($input.hasClass(className.radio) || $input.attr('type') == 'radio');\n          },\n          indeterminate: function() {\n            return $input.prop('indeterminate') !== undefined && $input.prop('indeterminate');\n          },\n          checked: function() {\n            return $input.prop('checked') !== undefined && $input.prop('checked');\n          },\n          disabled: function() {\n            return $input.prop('disabled') !== undefined && $input.prop('disabled');\n          },\n          enabled: function() {\n            return !module.is.disabled();\n          },\n          determinate: function() {\n            return !module.is.indeterminate();\n          },\n          unchecked: function() {\n            return !module.is.checked();\n          }\n        },\n\n        should: {\n          allowCheck: function() {\n            if(module.is.determinate() && module.is.checked() && !module.should.forceCallbacks() ) {\n              module.debug('Should not allow check, checkbox is already checked');\n              return false;\n            }\n            if(settings.beforeChecked.apply(input) === false) {\n              module.debug('Should not allow check, beforeChecked cancelled');\n              return false;\n            }\n            return true;\n          },\n          allowUncheck: function() {\n            if(module.is.determinate() && module.is.unchecked() && !module.should.forceCallbacks() ) {\n              module.debug('Should not allow uncheck, checkbox is already unchecked');\n              return false;\n            }\n            if(settings.beforeUnchecked.apply(input) === false) {\n              module.debug('Should not allow uncheck, beforeUnchecked cancelled');\n              return false;\n            }\n            return true;\n          },\n          allowIndeterminate: function() {\n            if(module.is.indeterminate() && !module.should.forceCallbacks() ) {\n              module.debug('Should not allow indeterminate, checkbox is already indeterminate');\n              return false;\n            }\n            if(settings.beforeIndeterminate.apply(input) === false) {\n              module.debug('Should not allow indeterminate, beforeIndeterminate cancelled');\n              return false;\n            }\n            return true;\n          },\n          allowDeterminate: function() {\n            if(module.is.determinate() && !module.should.forceCallbacks() ) {\n              module.debug('Should not allow determinate, checkbox is already determinate');\n              return false;\n            }\n            if(settings.beforeDeterminate.apply(input) === false) {\n              module.debug('Should not allow determinate, beforeDeterminate cancelled');\n              return false;\n            }\n            return true;\n          },\n          forceCallbacks: function() {\n            return (module.is.initialLoad() && settings.fireOnInit);\n          },\n          ignoreCallbacks: function() {\n            return (initialLoad && !settings.fireOnInit);\n          }\n        },\n\n        can: {\n          change: function() {\n            return !( $module.hasClass(className.disabled) || $module.hasClass(className.readOnly) || $input.prop('disabled') || $input.prop('readonly') );\n          },\n          uncheck: function() {\n            return (typeof settings.uncheckable === 'boolean')\n              ? settings.uncheckable\n              : !module.is.radio()\n            ;\n          }\n        },\n\n        set: {\n          initialLoad: function() {\n            initialLoad = true;\n          },\n          checked: function() {\n            module.verbose('Setting class to checked');\n            $module\n              .removeClass(className.indeterminate)\n              .addClass(className.checked)\n            ;\n            if( module.is.radio() ) {\n              module.uncheckOthers();\n            }\n            if(!module.is.indeterminate() && module.is.checked()) {\n              module.debug('Input is already checked, skipping input property change');\n              return;\n            }\n            module.verbose('Setting state to checked', input);\n            $input\n              .prop('indeterminate', false)\n              .prop('checked', true)\n            ;\n            module.trigger.change();\n          },\n          unchecked: function() {\n            module.verbose('Removing checked class');\n            $module\n              .removeClass(className.indeterminate)\n              .removeClass(className.checked)\n            ;\n            if(!module.is.indeterminate() &&  module.is.unchecked() ) {\n              module.debug('Input is already unchecked');\n              return;\n            }\n            module.debug('Setting state to unchecked');\n            $input\n              .prop('indeterminate', false)\n              .prop('checked', false)\n            ;\n            module.trigger.change();\n          },\n          indeterminate: function() {\n            module.verbose('Setting class to indeterminate');\n            $module\n              .addClass(className.indeterminate)\n            ;\n            if( module.is.indeterminate() ) {\n              module.debug('Input is already indeterminate, skipping input property change');\n              return;\n            }\n            module.debug('Setting state to indeterminate');\n            $input\n              .prop('indeterminate', true)\n            ;\n            module.trigger.change();\n          },\n          determinate: function() {\n            module.verbose('Removing indeterminate class');\n            $module\n              .removeClass(className.indeterminate)\n            ;\n            if( module.is.determinate() ) {\n              module.debug('Input is already determinate, skipping input property change');\n              return;\n            }\n            module.debug('Setting state to determinate');\n            $input\n              .prop('indeterminate', false)\n            ;\n          },\n          disabled: function() {\n            module.verbose('Setting class to disabled');\n            $module\n              .addClass(className.disabled)\n            ;\n            if( module.is.disabled() ) {\n              module.debug('Input is already disabled, skipping input property change');\n              return;\n            }\n            module.debug('Setting state to disabled');\n            $input\n              .prop('disabled', 'disabled')\n            ;\n            module.trigger.change();\n          },\n          enabled: function() {\n            module.verbose('Removing disabled class');\n            $module.removeClass(className.disabled);\n            if( module.is.enabled() ) {\n              module.debug('Input is already enabled, skipping input property change');\n              return;\n            }\n            module.debug('Setting state to enabled');\n            $input\n              .prop('disabled', false)\n            ;\n            module.trigger.change();\n          },\n          tabbable: function() {\n            module.verbose('Adding tabindex to checkbox');\n            if( $input.attr('tabindex') === undefined) {\n              $input.attr('tabindex', 0);\n            }\n          }\n        },\n\n        remove: {\n          initialLoad: function() {\n            initialLoad = false;\n          }\n        },\n\n        trigger: {\n          change: function() {\n            var\n              events       = document.createEvent('HTMLEvents'),\n              inputElement = $input[0]\n            ;\n            if(inputElement) {\n              module.verbose('Triggering native change event');\n              events.initEvent('change', true, false);\n              inputElement.dispatchEvent(events);\n            }\n          }\n        },\n\n\n        create: {\n          label: function() {\n            if($input.prevAll(selector.label).length > 0) {\n              $input.prev(selector.label).detach().insertAfter($input);\n              module.debug('Moving existing label', $label);\n            }\n            else if( !module.has.label() ) {\n              $label = $('<label>').insertAfter($input);\n              module.debug('Creating label', $label);\n            }\n          }\n        },\n\n        has: {\n          label: function() {\n            return ($label.length > 0);\n          }\n        },\n\n        bind: {\n          events: function() {\n            module.verbose('Attaching checkbox events');\n            $module\n              .on('click'   + eventNamespace, module.event.click)\n              .on('keydown' + eventNamespace, selector.input, module.event.keydown)\n              .on('keyup'   + eventNamespace, selector.input, module.event.keyup)\n            ;\n          }\n        },\n\n        unbind: {\n          events: function() {\n            module.debug('Removing events');\n            $module\n              .off(eventNamespace)\n            ;\n          }\n        },\n\n        uncheckOthers: function() {\n          var\n            $radios = module.get.otherRadios()\n          ;\n          module.debug('Unchecking other radios', $radios);\n          $radios.removeClass(className.checked);\n        },\n\n        toggle: function() {\n          if( !module.can.change() ) {\n            if(!module.is.radio()) {\n              module.debug('Checkbox is read-only or disabled, ignoring toggle');\n            }\n            return;\n          }\n          if( module.is.indeterminate() || module.is.unchecked() ) {\n            module.debug('Currently unchecked');\n            module.check();\n          }\n          else if( module.is.checked() && module.can.uncheck() ) {\n            module.debug('Currently checked');\n            module.uncheck();\n          }\n        },\n        setting: function(name, value) {\n          module.debug('Changing setting', name, value);\n          if( $.isPlainObject(name) ) {\n            $.extend(true, settings, name);\n          }\n          else if(value !== undefined) {\n            if($.isPlainObject(settings[name])) {\n              $.extend(true, settings[name], value);\n            }\n            else {\n              settings[name] = value;\n            }\n          }\n          else {\n            return settings[name];\n          }\n        },\n        internal: function(name, value) {\n          if( $.isPlainObject(name) ) {\n            $.extend(true, module, name);\n          }\n          else if(value !== undefined) {\n            module[name] = value;\n          }\n          else {\n            return module[name];\n          }\n        },\n        debug: function() {\n          if(!settings.silent && settings.debug) {\n            if(settings.performance) {\n              module.performance.log(arguments);\n            }\n            else {\n              module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');\n              module.debug.apply(console, arguments);\n            }\n          }\n        },\n        verbose: function() {\n          if(!settings.silent && settings.verbose && settings.debug) {\n            if(settings.performance) {\n              module.performance.log(arguments);\n            }\n            else {\n              module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');\n              module.verbose.apply(console, arguments);\n            }\n          }\n        },\n        error: function() {\n          if(!settings.silent) {\n            module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');\n            module.error.apply(console, arguments);\n          }\n        },\n        performance: {\n          log: function(message) {\n            var\n              currentTime,\n              executionTime,\n              previousTime\n            ;\n            if(settings.performance) {\n              currentTime   = new Date().getTime();\n              previousTime  = time || currentTime;\n              executionTime = currentTime - previousTime;\n              time          = currentTime;\n              performance.push({\n                'Name'           : message[0],\n                'Arguments'      : [].slice.call(message, 1) || '',\n                'Element'        : element,\n                'Execution Time' : executionTime\n              });\n            }\n            clearTimeout(module.performance.timer);\n            module.performance.timer = setTimeout(module.performance.display, 500);\n          },\n          display: function() {\n            var\n              title = settings.name + ':',\n              totalTime = 0\n            ;\n            time = false;\n            clearTimeout(module.performance.timer);\n            $.each(performance, function(index, data) {\n              totalTime += data['Execution Time'];\n            });\n            title += ' ' + totalTime + 'ms';\n            if(moduleSelector) {\n              title += ' \\'' + moduleSelector + '\\'';\n            }\n            if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {\n              console.groupCollapsed(title);\n              if(console.table) {\n                console.table(performance);\n              }\n              else {\n                $.each(performance, function(index, data) {\n                  console.log(data['Name'] + ': ' + data['Execution Time']+'ms');\n                });\n              }\n              console.groupEnd();\n            }\n            performance = [];\n          }\n        },\n        invoke: function(query, passedArguments, context) {\n          var\n            object = instance,\n            maxDepth,\n            found,\n            response\n          ;\n          passedArguments = passedArguments || queryArguments;\n          context         = element         || context;\n          if(typeof query == 'string' && object !== undefined) {\n            query    = query.split(/[\\. ]/);\n            maxDepth = query.length - 1;\n            $.each(query, function(depth, value) {\n              var camelCaseValue = (depth != maxDepth)\n                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)\n                : query\n              ;\n              if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {\n                object = object[camelCaseValue];\n              }\n              else if( object[camelCaseValue] !== undefined ) {\n                found = object[camelCaseValue];\n                return false;\n              }\n              else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {\n                object = object[value];\n              }\n              else if( object[value] !== undefined ) {\n                found = object[value];\n                return false;\n              }\n              else {\n                module.error(error.method, query);\n                return false;\n              }\n            });\n          }\n          if ( $.isFunction( found ) ) {\n            response = found.apply(context, passedArguments);\n          }\n          else if(found !== undefined) {\n            response = found;\n          }\n          if($.isArray(returnedValue)) {\n            returnedValue.push(response);\n          }\n          else if(returnedValue !== undefined) {\n            returnedValue = [returnedValue, response];\n          }\n          else if(response !== undefined) {\n            returnedValue = response;\n          }\n          return found;\n        }\n      };\n\n      if(methodInvoked) {\n        if(instance === undefined) {\n          module.initialize();\n        }\n        module.invoke(query);\n      }\n      else {\n        if(instance !== undefined) {\n          instance.invoke('destroy');\n        }\n        module.initialize();\n      }\n    })\n  ;\n\n  return (returnedValue !== undefined)\n    ? returnedValue\n    : this\n  ;\n};\n\n$.fn.checkbox.settings = {\n\n  name                : 'Checkbox',\n  namespace           : 'checkbox',\n\n  silent              : false,\n  debug               : false,\n  verbose             : true,\n  performance         : true,\n\n  // delegated event context\n  uncheckable         : 'auto',\n  fireOnInit          : false,\n\n  onChange            : function(){},\n\n  beforeChecked       : function(){},\n  beforeUnchecked     : function(){},\n  beforeDeterminate   : function(){},\n  beforeIndeterminate : function(){},\n\n  onChecked           : function(){},\n  onUnchecked         : function(){},\n\n  onDeterminate       : function() {},\n  onIndeterminate     : function() {},\n\n  onEnable            : function(){},\n  onDisable           : function(){},\n\n  // preserve misspelled callbacks (will be removed in 3.0)\n  onEnabled           : function(){},\n  onDisabled          : function(){},\n\n  className       : {\n    checked       : 'checked',\n    indeterminate : 'indeterminate',\n    disabled      : 'disabled',\n    hidden        : 'hidden',\n    radio         : 'radio',\n    readOnly      : 'read-only'\n  },\n\n  error     : {\n    method       : 'The method you called is not defined'\n  },\n\n  selector : {\n    checkbox : '.ui.checkbox',\n    label    : 'label, .box',\n    input    : 'input[type=\"checkbox\"], input[type=\"radio\"]',\n    link     : 'a[href]'\n  }\n\n};\n\n})( jQuery, window, document );\n"
  },
  {
    "path": "semantic/src/definitions/modules/checkbox.less",
    "content": "/*!\n * # Semantic UI - Checkbox\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n/*******************************\n            Theme\n*******************************/\n\n@type    : 'module';\n@element : 'checkbox';\n\n@import (multiple) '../../theme.config';\n\n/*******************************\n           Checkbox\n*******************************/\n\n\n/*--------------\n    Content\n---------------*/\n\n.ui.checkbox {\n  position: relative;\n  display: inline-block;\n  backface-visibility: hidden;\n  outline: none;\n  vertical-align: baseline;\n  font-style: normal;\n\n  min-height: @checkboxSize;\n  font-size: @medium;\n  line-height: @checkboxLineHeight;\n  min-width: @checkboxSize;\n}\n\n/* HTML Checkbox */\n.ui.checkbox input[type=\"checkbox\"],\n.ui.checkbox input[type=\"radio\"] {\n  cursor: pointer;\n  position: absolute;\n  top: 0px;\n  left: 0px;\n  opacity: 0 !important;\n  outline: none;\n  z-index: 3;\n  width: @checkboxSize;\n  height: @checkboxSize;\n}\n\n\n/*--------------\n      Box\n---------------*/\n\n\n.ui.checkbox .box,\n.ui.checkbox label {\n  cursor: auto;\n  position: relative;\n  display: block;\n  padding-left: @labelDistance;\n  outline: none;\n  font-size: @labelFontSize;\n}\n\n.ui.checkbox .box:before,\n.ui.checkbox label:before {\n  position: absolute;\n  top: 0px;\n  left: 0px;\n\n  width: @checkboxSize;\n  height: @checkboxSize;\n  content: '';\n\n  background: @checkboxBackground;\n  border-radius: @checkboxBorderRadius;\n\n  transition: @checkboxTransition;\n  border: @checkboxBorder;\n}\n\n/*--------------\n    Checkmark\n---------------*/\n\n.ui.checkbox .box:after,\n.ui.checkbox label:after {\n  position: absolute;\n  font-size: @checkboxCheckFontSize;\n  top: @checkboxCheckTop;\n  left: @checkboxCheckLeft;\n  width: @checkboxCheckSize;\n  height: @checkboxCheckSize;\n  text-align: center;\n\n  opacity: 0;\n  color: @checkboxColor;\n  transition: @checkboxTransition;\n}\n\n/*--------------\n      Label\n---------------*/\n\n/* Inside */\n.ui.checkbox label,\n.ui.checkbox + label {\n  color: @labelColor;\n  transition: @labelTransition;\n}\n\n/* Outside */\n.ui.checkbox + label {\n  vertical-align: middle;\n}\n\n\n/*******************************\n           States\n*******************************/\n\n\n/*--------------\n      Hover\n---------------*/\n\n.ui.checkbox .box:hover::before,\n.ui.checkbox label:hover::before {\n  background: @checkboxHoverBackground;\n  border-color: @checkboxHoverBorderColor;\n}\n.ui.checkbox label:hover,\n.ui.checkbox + label:hover {\n  color: @labelHoverColor;\n}\n\n/*--------------\n      Down\n---------------*/\n\n.ui.checkbox .box:active::before,\n.ui.checkbox label:active::before {\n  background: @checkboxPressedBackground;\n  border-color: @checkboxPressedBorderColor;\n}\n.ui.checkbox .box:active::after,\n.ui.checkbox label:active::after {\n  color: @checkboxPressedColor;\n}\n.ui.checkbox input:active ~ label {\n  color: @labelPressedColor;\n}\n\n/*--------------\n     Focus\n---------------*/\n\n.ui.checkbox input:focus ~ .box:before,\n.ui.checkbox input:focus ~ label:before {\n  background: @checkboxFocusBackground;\n  border-color: @checkboxFocusBorderColor;\n}\n.ui.checkbox input:focus ~ .box:after,\n.ui.checkbox input:focus ~ label:after {\n  color: @checkboxFocusCheckColor;\n}\n.ui.checkbox input:focus ~ label {\n  color: @labelFocusColor;\n}\n\n/*--------------\n     Active\n---------------*/\n\n.ui.checkbox input:checked ~ .box:before,\n.ui.checkbox input:checked ~ label:before {\n  background: @checkboxActiveBackground;\n  border-color: @checkboxActiveBorderColor;\n}\n.ui.checkbox input:checked ~ .box:after,\n.ui.checkbox input:checked ~ label:after {\n  opacity: @checkboxActiveCheckOpacity;\n  color: @checkboxActiveCheckColor;\n}\n\n/*--------------\n  Indeterminate\n---------------*/\n\n.ui.checkbox input:not([type=radio]):indeterminate ~ .box:before,\n.ui.checkbox input:not([type=radio]):indeterminate ~ label:before {\n  background: @checkboxIndeterminateBackground;\n  border-color: @checkboxIndeterminateBorderColor;\n}\n.ui.checkbox input:not([type=radio]):indeterminate ~ .box:after,\n.ui.checkbox input:not([type=radio]):indeterminate ~ label:after {\n  opacity: @checkboxIndeterminateCheckOpacity;\n  color: @checkboxIndeterminateCheckColor;\n}\n\n/*--------------\n  Active Focus\n---------------*/\n\n.ui.checkbox input:not([type=radio]):indeterminate:focus ~ .box:before,\n.ui.checkbox input:not([type=radio]):indeterminate:focus ~ label:before,\n.ui.checkbox input:checked:focus ~ .box:before,\n.ui.checkbox input:checked:focus ~ label:before  {\n  background: @checkboxActiveFocusBackground;\n  border-color: @checkboxActiveFocusBorderColor;\n}\n.ui.checkbox input:not([type=radio]):indeterminate:focus ~ .box:after,\n.ui.checkbox input:not([type=radio]):indeterminate:focus ~ label:after,\n.ui.checkbox input:checked:focus ~ .box:after,\n.ui.checkbox input:checked:focus ~ label:after {\n  color: @checkboxActiveFocusCheckColor;\n}\n\n\n/*--------------\n    Read-Only\n---------------*/\n\n.ui.read-only.checkbox,\n.ui.read-only.checkbox label {\n  cursor: default;\n}\n\n\n/*--------------\n     Disabled\n---------------*/\n\n.ui.disabled.checkbox .box:after,\n.ui.disabled.checkbox label,\n.ui.checkbox input[disabled] ~ .box:after,\n.ui.checkbox input[disabled] ~ label {\n  cursor: default !important;\n  opacity: @disabledCheckboxOpacity;\n  color: @disabledCheckboxLabelColor;\n}\n\n/*--------------\n     Hidden\n---------------*/\n\n/* Initialized checkbox moves input below element\n to prevent manually triggering */\n.ui.checkbox input.hidden {\n  z-index: -1;\n}\n\n/* Selectable Label */\n.ui.checkbox input.hidden + label {\n  cursor: pointer;\n  user-select: none;\n}\n\n\n/*******************************\n             Types\n*******************************/\n\n\n/*--------------\n     Radio\n---------------*/\n\n.ui.radio.checkbox {\n  min-height: @radioSize;\n}\n\n.ui.radio.checkbox .box,\n.ui.radio.checkbox label {\n  padding-left: @radioLabelDistance;\n}\n\n/* Box */\n.ui.radio.checkbox .box:before,\n.ui.radio.checkbox label:before {\n  content: '';\n  transform: none;\n\n  width: @radioSize;\n  height: @radioSize;\n  border-radius: @circularRadius;\n  top: @radioTop;\n  left: @radioLeft;\n}\n\n/* Bullet */\n.ui.radio.checkbox .box:after,\n.ui.radio.checkbox label:after {\n  border: none;\n  content: '' !important;\n  width: @radioSize;\n  height: @radioSize;\n  line-height: @radioSize;\n}\n\n/* Radio Checkbox */\n.ui.radio.checkbox .box:after,\n.ui.radio.checkbox label:after {\n  top: @bulletTop;\n  left: @bulletLeft;\n  width: @radioSize;\n  height: @radioSize;\n  border-radius: @bulletRadius;\n  transform: scale(@bulletScale);\n  background-color: @bulletColor;\n}\n\n/* Focus */\n.ui.radio.checkbox input:focus ~ .box:before,\n.ui.radio.checkbox input:focus ~ label:before {\n  background-color: @radioFocusBackground;\n}\n.ui.radio.checkbox input:focus ~ .box:after,\n.ui.radio.checkbox input:focus ~ label:after {\n  background-color: @radioFocusBulletColor;\n}\n\n/* Indeterminate */\n.ui.radio.checkbox input:indeterminate ~ .box:after,\n.ui.radio.checkbox input:indeterminate ~ label:after {\n  opacity: 0;\n}\n\n/* Active */\n.ui.radio.checkbox input:checked ~ .box:before,\n.ui.radio.checkbox input:checked ~ label:before {\n  background-color: @radioActiveBackground;\n}\n.ui.radio.checkbox input:checked ~ .box:after,\n.ui.radio.checkbox input:checked ~ label:after {\n  background-color: @radioActiveBulletColor;\n}\n\n/* Active Focus */\n.ui.radio.checkbox input:focus:checked ~ .box:before,\n.ui.radio.checkbox input:focus:checked ~ label:before {\n  background-color: @radioActiveFocusBackground;\n}\n.ui.radio.checkbox input:focus:checked ~ .box:after,\n.ui.radio.checkbox input:focus:checked ~ label:after {\n  background-color: @radioActiveFocusBulletColor;\n}\n\n/*--------------\n     Slider\n---------------*/\n\n.ui.slider.checkbox {\n  min-height: @sliderHeight;\n}\n\n/* Input */\n.ui.slider.checkbox input {\n  width: @sliderWidth;\n  height: @sliderHeight;\n}\n\n/* Label */\n.ui.slider.checkbox .box,\n.ui.slider.checkbox label {\n  padding-left: @sliderLabelDistance;\n  line-height: @sliderLabelLineHeight;\n  color: @sliderOffLabelColor;\n}\n\n/* Line */\n.ui.slider.checkbox .box:before,\n.ui.slider.checkbox label:before {\n  display: block;\n  position: absolute;\n  content: '';\n  transform: none;\n  border: none !important;\n  left: 0em;\n  z-index: 1;\n\n  top: @sliderLineVerticalOffset;\n\n  background-color: @sliderLineColor;\n  width: @sliderLineWidth;\n  height: @sliderLineHeight;\n\n  transform: none;\n  border-radius: @sliderLineRadius;\n  transition: @sliderLineTransition;\n\n}\n\n/* Handle */\n.ui.slider.checkbox .box:after,\n.ui.slider.checkbox label:after {\n  background: @handleBackground;\n  position: absolute;\n  content: '' !important;\n  opacity: 1;\n  z-index: 2;\n\n  border: none;\n  box-shadow: @handleBoxShadow;\n  width: @sliderHandleSize;\n  height: @sliderHandleSize;\n  top: @sliderHandleOffset;\n  left: 0em;\n  transform: none;\n\n  border-radius: @circularRadius;\n  transition: @sliderHandleTransition;\n}\n\n/* Focus */\n.ui.slider.checkbox input:focus ~ .box:before,\n.ui.slider.checkbox input:focus ~ label:before {\n  background-color: @toggleFocusColor;\n  border: none;\n}\n\n/* Hover */\n.ui.slider.checkbox .box:hover,\n.ui.slider.checkbox label:hover {\n  color: @sliderHoverLabelColor;\n}\n.ui.slider.checkbox .box:hover::before,\n.ui.slider.checkbox label:hover::before {\n  background: @sliderHoverLaneBackground;\n}\n\n/* Active */\n.ui.slider.checkbox input:checked ~ .box,\n.ui.slider.checkbox input:checked ~ label {\n  color: @sliderOnLabelColor !important;\n}\n.ui.slider.checkbox input:checked ~ .box:before,\n.ui.slider.checkbox input:checked ~ label:before {\n  background-color: @sliderOnLineColor !important;\n}\n.ui.slider.checkbox input:checked ~ .box:after,\n.ui.slider.checkbox input:checked ~ label:after {\n  left: @sliderTravelDistance;\n}\n\n/* Active Focus */\n.ui.slider.checkbox input:focus:checked ~ .box,\n.ui.slider.checkbox input:focus:checked ~ label {\n  color: @sliderOnFocusLabelColor !important;\n}\n.ui.slider.checkbox input:focus:checked ~ .box:before,\n.ui.slider.checkbox input:focus:checked ~ label:before {\n  background-color: @sliderOnFocusLineColor !important;\n}\n\n\n/*--------------\n     Toggle\n---------------*/\n\n.ui.toggle.checkbox {\n  min-height: @toggleHeight;\n}\n\n/* Input */\n.ui.toggle.checkbox input {\n  width: @toggleWidth;\n  height: @toggleHeight;\n}\n\n/* Label */\n.ui.toggle.checkbox .box,\n.ui.toggle.checkbox label {\n  min-height: @toggleHandleSize;\n  padding-left: @toggleLabelDistance;\n  color: @toggleOffLabelColor;\n}\n.ui.toggle.checkbox label {\n  padding-top: @toggleLabelOffset;\n}\n\n/* Switch */\n.ui.toggle.checkbox .box:before,\n.ui.toggle.checkbox label:before {\n  display: block;\n  position: absolute;\n  content: '';\n  z-index: 1;\n  transform: none;\n  border: none;\n\n  top: @toggleLaneVerticalOffset;\n\n  background: @toggleLaneBackground;\n  box-shadow: @toggleLaneBoxShadow;\n  width: @toggleLaneWidth;\n  height: @toggleLaneHeight;\n  border-radius: @toggleHandleRadius;\n}\n\n/* Handle */\n.ui.toggle.checkbox .box:after,\n.ui.toggle.checkbox label:after {\n  background: @handleBackground;\n  position: absolute;\n  content: '' !important;\n  opacity: 1;\n  z-index: 2;\n\n  border: none;\n  box-shadow: @handleBoxShadow;\n  width: @toggleHandleSize;\n  height: @toggleHandleSize;\n  top: @toggleHandleOffset;\n  left: 0em;\n\n  border-radius: @circularRadius;\n  transition: @toggleHandleTransition;\n}\n\n.ui.toggle.checkbox input ~ .box:after,\n.ui.toggle.checkbox input ~ label:after {\n  left: @toggleOffOffset;\n  box-shadow: @toggleOffHandleBoxShadow;\n}\n\n/* Focus */\n.ui.toggle.checkbox input:focus ~ .box:before,\n.ui.toggle.checkbox input:focus ~ label:before {\n  background-color: @toggleFocusColor;\n  border: none;\n}\n\n/* Hover */\n.ui.toggle.checkbox .box:hover::before,\n.ui.toggle.checkbox label:hover::before {\n  background-color: @toggleHoverColor;\n  border: none;\n}\n\n/* Active */\n.ui.toggle.checkbox input:checked ~ .box,\n.ui.toggle.checkbox input:checked ~ label {\n  color: @toggleOnLabelColor !important;\n}\n.ui.toggle.checkbox input:checked ~ .box:before,\n.ui.toggle.checkbox input:checked ~ label:before {\n  background-color: @toggleOnLaneColor !important;\n}\n.ui.toggle.checkbox input:checked ~ .box:after,\n.ui.toggle.checkbox input:checked ~ label:after {\n  left: @toggleOnOffset;\n  box-shadow: @toggleOnHandleBoxShadow;\n}\n\n\n/* Active Focus */\n.ui.toggle.checkbox input:focus:checked ~ .box,\n.ui.toggle.checkbox input:focus:checked ~ label {\n  color: @toggleOnFocusLabelColor !important;\n}\n.ui.toggle.checkbox input:focus:checked ~ .box:before,\n.ui.toggle.checkbox input:focus:checked ~ label:before {\n  background-color: @toggleOnFocusLaneColor !important;\n}\n\n/*******************************\n            Variations\n*******************************/\n\n/*--------------\n     Fitted\n---------------*/\n\n.ui.fitted.checkbox .box,\n.ui.fitted.checkbox label {\n  padding-left: 0em !important;\n}\n\n.ui.fitted.toggle.checkbox,\n.ui.fitted.toggle.checkbox {\n  width: @toggleWidth;\n}\n\n.ui.fitted.slider.checkbox,\n.ui.fitted.slider.checkbox {\n  width: @sliderWidth;\n}\n\n.loadUIOverrides();\n"
  },
  {
    "path": "semantic/src/definitions/modules/dimmer.js",
    "content": "/*!\n * # Semantic UI - Dimmer\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n;(function ($, window, document, undefined) {\n\n'use strict';\n\nwindow = (typeof window != 'undefined' && window.Math == Math)\n  ? window\n  : (typeof self != 'undefined' && self.Math == Math)\n    ? self\n    : Function('return this')()\n;\n\n$.fn.dimmer = function(parameters) {\n  var\n    $allModules     = $(this),\n\n    time            = new Date().getTime(),\n    performance     = [],\n\n    query           = arguments[0],\n    methodInvoked   = (typeof query == 'string'),\n    queryArguments  = [].slice.call(arguments, 1),\n\n    returnedValue\n  ;\n\n  $allModules\n    .each(function() {\n      var\n        settings        = ( $.isPlainObject(parameters) )\n          ? $.extend(true, {}, $.fn.dimmer.settings, parameters)\n          : $.extend({}, $.fn.dimmer.settings),\n\n        selector        = settings.selector,\n        namespace       = settings.namespace,\n        className       = settings.className,\n        error           = settings.error,\n\n        eventNamespace  = '.' + namespace,\n        moduleNamespace = 'module-' + namespace,\n        moduleSelector  = $allModules.selector || '',\n\n        clickEvent      = ('ontouchstart' in document.documentElement)\n          ? 'touchstart'\n          : 'click',\n\n        $module = $(this),\n        $dimmer,\n        $dimmable,\n\n        element   = this,\n        instance  = $module.data(moduleNamespace),\n        module\n      ;\n\n      module = {\n\n        preinitialize: function() {\n          if( module.is.dimmer() ) {\n\n            $dimmable = $module.parent();\n            $dimmer   = $module;\n          }\n          else {\n            $dimmable = $module;\n            if( module.has.dimmer() ) {\n              if(settings.dimmerName) {\n                $dimmer = $dimmable.find(selector.dimmer).filter('.' + settings.dimmerName);\n              }\n              else {\n                $dimmer = $dimmable.find(selector.dimmer);\n              }\n            }\n            else {\n              $dimmer = module.create();\n            }\n            module.set.variation();\n          }\n        },\n\n        initialize: function() {\n          module.debug('Initializing dimmer', settings);\n\n          module.bind.events();\n          module.set.dimmable();\n          module.instantiate();\n        },\n\n        instantiate: function() {\n          module.verbose('Storing instance of module', module);\n          instance = module;\n          $module\n            .data(moduleNamespace, instance)\n          ;\n        },\n\n        destroy: function() {\n          module.verbose('Destroying previous module', $dimmer);\n          module.unbind.events();\n          module.remove.variation();\n          $dimmable\n            .off(eventNamespace)\n          ;\n        },\n\n        bind: {\n          events: function() {\n            if(settings.on == 'hover') {\n              $dimmable\n                .on('mouseenter' + eventNamespace, module.show)\n                .on('mouseleave' + eventNamespace, module.hide)\n              ;\n            }\n            else if(settings.on == 'click') {\n              $dimmable\n                .on(clickEvent + eventNamespace, module.toggle)\n              ;\n            }\n            if( module.is.page() ) {\n              module.debug('Setting as a page dimmer', $dimmable);\n              module.set.pageDimmer();\n            }\n\n            if( module.is.closable() ) {\n              module.verbose('Adding dimmer close event', $dimmer);\n              $dimmable\n                .on(clickEvent + eventNamespace, selector.dimmer, module.event.click)\n              ;\n            }\n          }\n        },\n\n        unbind: {\n          events: function() {\n            $module\n              .removeData(moduleNamespace)\n            ;\n            $dimmable\n              .off(eventNamespace)\n            ;\n          }\n        },\n\n        event: {\n          click: function(event) {\n            module.verbose('Determining if event occured on dimmer', event);\n            if( $dimmer.find(event.target).length === 0 || $(event.target).is(selector.content) ) {\n              module.hide();\n              event.stopImmediatePropagation();\n            }\n          }\n        },\n\n        addContent: function(element) {\n          var\n            $content = $(element)\n          ;\n          module.debug('Add content to dimmer', $content);\n          if($content.parent()[0] !== $dimmer[0]) {\n            $content.detach().appendTo($dimmer);\n          }\n        },\n\n        create: function() {\n          var\n            $element = $( settings.template.dimmer() )\n          ;\n          if(settings.dimmerName) {\n            module.debug('Creating named dimmer', settings.dimmerName);\n            $element.addClass(settings.dimmerName);\n          }\n          $element\n            .appendTo($dimmable)\n          ;\n          return $element;\n        },\n\n        show: function(callback) {\n          callback = $.isFunction(callback)\n            ? callback\n            : function(){}\n          ;\n          module.debug('Showing dimmer', $dimmer, settings);\n          if( (!module.is.dimmed() || module.is.animating()) && module.is.enabled() ) {\n            module.animate.show(callback);\n            settings.onShow.call(element);\n            settings.onChange.call(element);\n          }\n          else {\n            module.debug('Dimmer is already shown or disabled');\n          }\n        },\n\n        hide: function(callback) {\n          callback = $.isFunction(callback)\n            ? callback\n            : function(){}\n          ;\n          if( module.is.dimmed() || module.is.animating() ) {\n            module.debug('Hiding dimmer', $dimmer);\n            module.animate.hide(callback);\n            settings.onHide.call(element);\n            settings.onChange.call(element);\n          }\n          else {\n            module.debug('Dimmer is not visible');\n          }\n        },\n\n        toggle: function() {\n          module.verbose('Toggling dimmer visibility', $dimmer);\n          if( !module.is.dimmed() ) {\n            module.show();\n          }\n          else {\n            module.hide();\n          }\n        },\n\n        animate: {\n          show: function(callback) {\n            callback = $.isFunction(callback)\n              ? callback\n              : function(){}\n            ;\n            if(settings.useCSS && $.fn.transition !== undefined && $dimmer.transition('is supported')) {\n              if(settings.opacity !== 'auto') {\n                module.set.opacity();\n              }\n              $dimmer\n                .transition({\n                  displayType : 'flex',\n                  animation   : settings.transition + ' in',\n                  queue       : false,\n                  duration    : module.get.duration(),\n                  useFailSafe : true,\n                  onStart     : function() {\n                    module.set.dimmed();\n                  },\n                  onComplete  : function() {\n                    module.set.active();\n                    callback();\n                  }\n                })\n              ;\n            }\n            else {\n              module.verbose('Showing dimmer animation with javascript');\n              module.set.dimmed();\n              if(settings.opacity == 'auto') {\n                settings.opacity = 0.8;\n              }\n              $dimmer\n                .stop()\n                .css({\n                  opacity : 0,\n                  width   : '100%',\n                  height  : '100%'\n                })\n                .fadeTo(module.get.duration(), settings.opacity, function() {\n                  $dimmer.removeAttr('style');\n                  module.set.active();\n                  callback();\n                })\n              ;\n            }\n          },\n          hide: function(callback) {\n            callback = $.isFunction(callback)\n              ? callback\n              : function(){}\n            ;\n            if(settings.useCSS && $.fn.transition !== undefined && $dimmer.transition('is supported')) {\n              module.verbose('Hiding dimmer with css');\n              $dimmer\n                .transition({\n                  displayType : 'flex',\n                  animation   : settings.transition + ' out',\n                  queue       : false,\n                  duration    : module.get.duration(),\n                  useFailSafe : true,\n                  onStart     : function() {\n                    module.remove.dimmed();\n                  },\n                  onComplete  : function() {\n                    module.remove.active();\n                    callback();\n                  }\n                })\n              ;\n            }\n            else {\n              module.verbose('Hiding dimmer with javascript');\n              module.remove.dimmed();\n              $dimmer\n                .stop()\n                .fadeOut(module.get.duration(), function() {\n                  module.remove.active();\n                  $dimmer.removeAttr('style');\n                  callback();\n                })\n              ;\n            }\n          }\n        },\n\n        get: {\n          dimmer: function() {\n            return $dimmer;\n          },\n          duration: function() {\n            if(typeof settings.duration == 'object') {\n              if( module.is.active() ) {\n                return settings.duration.hide;\n              }\n              else {\n                return settings.duration.show;\n              }\n            }\n            return settings.duration;\n          }\n        },\n\n        has: {\n          dimmer: function() {\n            if(settings.dimmerName) {\n              return ($module.find(selector.dimmer).filter('.' + settings.dimmerName).length > 0);\n            }\n            else {\n              return ( $module.find(selector.dimmer).length > 0 );\n            }\n          }\n        },\n\n        is: {\n          active: function() {\n            return $dimmer.hasClass(className.active);\n          },\n          animating: function() {\n            return ( $dimmer.is(':animated') || $dimmer.hasClass(className.animating) );\n          },\n          closable: function() {\n            if(settings.closable == 'auto') {\n              if(settings.on == 'hover') {\n                return false;\n              }\n              return true;\n            }\n            return settings.closable;\n          },\n          dimmer: function() {\n            return $module.hasClass(className.dimmer);\n          },\n          dimmable: function() {\n            return $module.hasClass(className.dimmable);\n          },\n          dimmed: function() {\n            return $dimmable.hasClass(className.dimmed);\n          },\n          disabled: function() {\n            return $dimmable.hasClass(className.disabled);\n          },\n          enabled: function() {\n            return !module.is.disabled();\n          },\n          page: function () {\n            return $dimmable.is('body');\n          },\n          pageDimmer: function() {\n            return $dimmer.hasClass(className.pageDimmer);\n          }\n        },\n\n        can: {\n          show: function() {\n            return !$dimmer.hasClass(className.disabled);\n          }\n        },\n\n        set: {\n          opacity: function(opacity) {\n            var\n              color      = $dimmer.css('background-color'),\n              colorArray = color.split(','),\n              isRGB      = (colorArray && colorArray.length == 3),\n              isRGBA     = (colorArray && colorArray.length == 4)\n            ;\n            opacity    = settings.opacity === 0 ? 0 : settings.opacity || opacity;\n            if(isRGB || isRGBA) {\n              colorArray[3] = opacity + ')';\n              color         = colorArray.join(',');\n            }\n            else {\n              color = 'rgba(0, 0, 0, ' + opacity + ')';\n            }\n            module.debug('Setting opacity to', opacity);\n            $dimmer.css('background-color', color);\n          },\n          active: function() {\n            $dimmer.addClass(className.active);\n          },\n          dimmable: function() {\n            $dimmable.addClass(className.dimmable);\n          },\n          dimmed: function() {\n            $dimmable.addClass(className.dimmed);\n          },\n          pageDimmer: function() {\n            $dimmer.addClass(className.pageDimmer);\n          },\n          disabled: function() {\n            $dimmer.addClass(className.disabled);\n          },\n          variation: function(variation) {\n            variation = variation || settings.variation;\n            if(variation) {\n              $dimmer.addClass(variation);\n            }\n          }\n        },\n\n        remove: {\n          active: function() {\n            $dimmer\n              .removeClass(className.active)\n            ;\n          },\n          dimmed: function() {\n            $dimmable.removeClass(className.dimmed);\n          },\n          disabled: function() {\n            $dimmer.removeClass(className.disabled);\n          },\n          variation: function(variation) {\n            variation = variation || settings.variation;\n            if(variation) {\n              $dimmer.removeClass(variation);\n            }\n          }\n        },\n\n        setting: function(name, value) {\n          module.debug('Changing setting', name, value);\n          if( $.isPlainObject(name) ) {\n            $.extend(true, settings, name);\n          }\n          else if(value !== undefined) {\n            if($.isPlainObject(settings[name])) {\n              $.extend(true, settings[name], value);\n            }\n            else {\n              settings[name] = value;\n            }\n          }\n          else {\n            return settings[name];\n          }\n        },\n        internal: function(name, value) {\n          if( $.isPlainObject(name) ) {\n            $.extend(true, module, name);\n          }\n          else if(value !== undefined) {\n            module[name] = value;\n          }\n          else {\n            return module[name];\n          }\n        },\n        debug: function() {\n          if(!settings.silent && settings.debug) {\n            if(settings.performance) {\n              module.performance.log(arguments);\n            }\n            else {\n              module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');\n              module.debug.apply(console, arguments);\n            }\n          }\n        },\n        verbose: function() {\n          if(!settings.silent && settings.verbose && settings.debug) {\n            if(settings.performance) {\n              module.performance.log(arguments);\n            }\n            else {\n              module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');\n              module.verbose.apply(console, arguments);\n            }\n          }\n        },\n        error: function() {\n          if(!settings.silent) {\n            module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');\n            module.error.apply(console, arguments);\n          }\n        },\n        performance: {\n          log: function(message) {\n            var\n              currentTime,\n              executionTime,\n              previousTime\n            ;\n            if(settings.performance) {\n              currentTime   = new Date().getTime();\n              previousTime  = time || currentTime;\n              executionTime = currentTime - previousTime;\n              time          = currentTime;\n              performance.push({\n                'Name'           : message[0],\n                'Arguments'      : [].slice.call(message, 1) || '',\n                'Element'        : element,\n                'Execution Time' : executionTime\n              });\n            }\n            clearTimeout(module.performance.timer);\n            module.performance.timer = setTimeout(module.performance.display, 500);\n          },\n          display: function() {\n            var\n              title = settings.name + ':',\n              totalTime = 0\n            ;\n            time = false;\n            clearTimeout(module.performance.timer);\n            $.each(performance, function(index, data) {\n              totalTime += data['Execution Time'];\n            });\n            title += ' ' + totalTime + 'ms';\n            if(moduleSelector) {\n              title += ' \\'' + moduleSelector + '\\'';\n            }\n            if($allModules.length > 1) {\n              title += ' ' + '(' + $allModules.length + ')';\n            }\n            if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {\n              console.groupCollapsed(title);\n              if(console.table) {\n                console.table(performance);\n              }\n              else {\n                $.each(performance, function(index, data) {\n                  console.log(data['Name'] + ': ' + data['Execution Time']+'ms');\n                });\n              }\n              console.groupEnd();\n            }\n            performance = [];\n          }\n        },\n        invoke: function(query, passedArguments, context) {\n          var\n            object = instance,\n            maxDepth,\n            found,\n            response\n          ;\n          passedArguments = passedArguments || queryArguments;\n          context         = element         || context;\n          if(typeof query == 'string' && object !== undefined) {\n            query    = query.split(/[\\. ]/);\n            maxDepth = query.length - 1;\n            $.each(query, function(depth, value) {\n              var camelCaseValue = (depth != maxDepth)\n                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)\n                : query\n              ;\n              if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {\n                object = object[camelCaseValue];\n              }\n              else if( object[camelCaseValue] !== undefined ) {\n                found = object[camelCaseValue];\n                return false;\n              }\n              else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {\n                object = object[value];\n              }\n              else if( object[value] !== undefined ) {\n                found = object[value];\n                return false;\n              }\n              else {\n                module.error(error.method, query);\n                return false;\n              }\n            });\n          }\n          if ( $.isFunction( found ) ) {\n            response = found.apply(context, passedArguments);\n          }\n          else if(found !== undefined) {\n            response = found;\n          }\n          if($.isArray(returnedValue)) {\n            returnedValue.push(response);\n          }\n          else if(returnedValue !== undefined) {\n            returnedValue = [returnedValue, response];\n          }\n          else if(response !== undefined) {\n            returnedValue = response;\n          }\n          return found;\n        }\n      };\n\n      module.preinitialize();\n\n      if(methodInvoked) {\n        if(instance === undefined) {\n          module.initialize();\n        }\n        module.invoke(query);\n      }\n      else {\n        if(instance !== undefined) {\n          instance.invoke('destroy');\n        }\n        module.initialize();\n      }\n    })\n  ;\n\n  return (returnedValue !== undefined)\n    ? returnedValue\n    : this\n  ;\n};\n\n$.fn.dimmer.settings = {\n\n  name        : 'Dimmer',\n  namespace   : 'dimmer',\n\n  silent      : false,\n  debug       : false,\n  verbose     : false,\n  performance : true,\n\n  // name to distinguish between multiple dimmers in context\n  dimmerName  : false,\n\n  // whether to add a variation type\n  variation   : false,\n\n  // whether to bind close events\n  closable    : 'auto',\n\n  // whether to use css animations\n  useCSS      : true,\n\n  // css animation to use\n  transition  : 'fade',\n\n  // event to bind to\n  on          : false,\n\n  // overriding opacity value\n  opacity     : 'auto',\n\n  // transition durations\n  duration    : {\n    show : 500,\n    hide : 500\n  },\n\n  onChange    : function(){},\n  onShow      : function(){},\n  onHide      : function(){},\n\n  error   : {\n    method   : 'The method you called is not defined.'\n  },\n\n  className : {\n    active     : 'active',\n    animating  : 'animating',\n    dimmable   : 'dimmable',\n    dimmed     : 'dimmed',\n    dimmer     : 'dimmer',\n    disabled   : 'disabled',\n    hide       : 'hide',\n    pageDimmer : 'page',\n    show       : 'show'\n  },\n\n  selector: {\n    dimmer   : '> .ui.dimmer',\n    content  : '.ui.dimmer > .content, .ui.dimmer > .content > .center'\n  },\n\n  template: {\n    dimmer: function() {\n     return $('<div />').attr('class', 'ui dimmer');\n    }\n  }\n\n};\n\n})( jQuery, window, document );\n"
  },
  {
    "path": "semantic/src/definitions/modules/dimmer.less",
    "content": "/*!\n * # Semantic UI - Dimmer\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n/*******************************\n            Theme\n*******************************/\n\n@type    : 'module';\n@element : 'dimmer';\n\n@import (multiple) '../../theme.config';\n\n/*******************************\n            Dimmer\n*******************************/\n\n.dimmable:not(body) {\n  position: @dimmablePosition;\n}\n\n.ui.dimmer {\n  display: none;\n  position: @dimmerPosition;\n  top: 0em !important;\n  left: 0em !important;\n\n  width: 100%;\n  height: 100%;\n\n  text-align: @textAlign;\n  vertical-align: @verticalAlign;\n  padding: @padding;\n\n  background-color: @backgroundColor;\n  opacity: @hiddenOpacity;\n  line-height: @lineHeight;\n\n  animation-fill-mode: both;\n  animation-duration: @duration;\n  transition: @transition;\n\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n\n  user-select: none;\n  will-change: opacity;\n  z-index: @zIndex;\n}\n\n/* Dimmer Content */\n.ui.dimmer > .content {\n  user-select: text;\n  color: @textColor;\n}\n\n\n/* Loose Coupling */\n.ui.segment > .ui.dimmer {\n  border-radius: inherit !important;\n}\n\n/* Scrollbars */\n.addScrollbars() when (@useCustomScrollbars) {\n  .ui.dimmer:not(.inverted)::-webkit-scrollbar-track {\n    background: @trackInvertedBackground;\n  }\n  .ui.dimmer:not(.inverted)::-webkit-scrollbar-thumb {\n    background: @thumbInvertedBackground;\n  }\n  .ui.dimmer:not(.inverted)::-webkit-scrollbar-thumb:window-inactive {\n    background: @thumbInvertedInactiveBackground;\n  }\n  .ui.dimmer:not(.inverted)::-webkit-scrollbar-thumb:hover {\n    background: @thumbInvertedHoverBackground;\n  }\n}\n.addScrollbars();\n\n/*******************************\n            States\n*******************************/\n\n/* Animating */\n.animating.dimmable:not(body),\n.dimmed.dimmable:not(body) {\n  overflow: @overflow;\n}\n\n/* Animating / Active / Visible */\n.dimmed.dimmable > .ui.animating.dimmer,\n.dimmed.dimmable > .ui.visible.dimmer,\n.ui.active.dimmer {\n  display: flex;\n  opacity: @visibleOpacity;\n}\n\n/* Disabled */\n.ui.disabled.dimmer {\n  width: 0 !important;\n  height: 0 !important;\n}\n\n\n/*******************************\n           Variations\n*******************************/\n\n/*--------------\n    Alignment\n---------------*/\n\n.ui[class*=\"top aligned\"].dimmer {\n  justify-content: flex-start;\n}\n.ui[class*=\"bottom aligned\"].dimmer {\n  justify-content: flex-end;\n}\n\n/*--------------\n      Page\n---------------*/\n\n.ui.page.dimmer {\n  position: @pageDimmerPosition;\n  transform-style: @transformStyle;\n  perspective: @perspective;\n  transform-origin: center center;\n}\n\nbody.animating.in.dimmable,\nbody.dimmed.dimmable {\n  overflow: hidden;\n}\n\nbody.dimmable > .dimmer {\n  position: fixed;\n}\n\n/*--------------\n    Blurring\n---------------*/\n\n.blurring.dimmable > :not(.dimmer) {\n  filter: @blurredStartFilter;\n  transition: @blurredTransition;\n}\n.blurring.dimmed.dimmable > :not(.dimmer) {\n  filter: @blurredEndFilter;\n}\n\n/* Dimmer Color */\n.blurring.dimmable > .dimmer {\n  background-color: @blurredBackgroundColor;\n}\n.blurring.dimmable > .inverted.dimmer {\n  background-color: @blurredInvertedBackgroundColor;\n}\n\n/*--------------\n    Aligned\n---------------*/\n\n.ui.dimmer > .top.aligned.content > * {\n  vertical-align: top;\n}\n.ui.dimmer > .bottom.aligned.content > * {\n  vertical-align: bottom;\n}\n\n/*--------------\n    Inverted\n---------------*/\n\n.ui.inverted.dimmer {\n  background-color: @invertedBackgroundColor;\n}\n.ui.inverted.dimmer > .content > * {\n  color: @invertedTextColor;\n}\n\n/*--------------\n     Simple\n---------------*/\n\n/* Displays without javascript */\n.ui.simple.dimmer {\n  display: block;\n  overflow: hidden;\n  opacity: 1;\n  width: 0%;\n  height: 0%;\n  z-index: -100;\n  background-color: @simpleStartBackgroundColor;\n}\n.dimmed.dimmable > .ui.simple.dimmer {\n  overflow: visible;\n  opacity: 1;\n  width: 100%;\n  height: 100%;\n  background-color: @simpleEndBackgroundColor;\n  z-index: @simpleZIndex;\n}\n\n.ui.simple.inverted.dimmer {\n  background-color: @simpleInvertedStartBackgroundColor;\n}\n.dimmed.dimmable > .ui.simple.inverted.dimmer {\n  background-color: @simpleInvertedEndBackgroundColor;\n}\n\n.loadUIOverrides();\n"
  },
  {
    "path": "semantic/src/definitions/modules/dropdown.js",
    "content": "/*!\n * # Semantic UI - Dropdown\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n;(function ($, window, document, undefined) {\n\n'use strict';\n\nwindow = (typeof window != 'undefined' && window.Math == Math)\n  ? window\n  : (typeof self != 'undefined' && self.Math == Math)\n    ? self\n    : Function('return this')()\n;\n\n$.fn.dropdown = function(parameters) {\n  var\n    $allModules    = $(this),\n    $document      = $(document),\n\n    moduleSelector = $allModules.selector || '',\n\n    hasTouch       = ('ontouchstart' in document.documentElement),\n    time           = new Date().getTime(),\n    performance    = [],\n\n    query          = arguments[0],\n    methodInvoked  = (typeof query == 'string'),\n    queryArguments = [].slice.call(arguments, 1),\n    returnedValue\n  ;\n\n  $allModules\n    .each(function(elementIndex) {\n      var\n        settings          = ( $.isPlainObject(parameters) )\n          ? $.extend(true, {}, $.fn.dropdown.settings, parameters)\n          : $.extend({}, $.fn.dropdown.settings),\n\n        className       = settings.className,\n        message         = settings.message,\n        fields          = settings.fields,\n        keys            = settings.keys,\n        metadata        = settings.metadata,\n        namespace       = settings.namespace,\n        regExp          = settings.regExp,\n        selector        = settings.selector,\n        error           = settings.error,\n        templates       = settings.templates,\n\n        eventNamespace  = '.' + namespace,\n        moduleNamespace = 'module-' + namespace,\n\n        $module         = $(this),\n        $context        = $(settings.context),\n        $text           = $module.find(selector.text),\n        $search         = $module.find(selector.search),\n        $sizer          = $module.find(selector.sizer),\n        $input          = $module.find(selector.input),\n        $icon           = $module.find(selector.icon),\n\n        $combo = ($module.prev().find(selector.text).length > 0)\n          ? $module.prev().find(selector.text)\n          : $module.prev(),\n\n        $menu           = $module.children(selector.menu),\n        $item           = $menu.find(selector.item),\n\n        activated       = false,\n        itemActivated   = false,\n        internalChange  = false,\n        element         = this,\n        instance        = $module.data(moduleNamespace),\n\n        initialLoad,\n        pageLostFocus,\n        willRefocus,\n        elementNamespace,\n        id,\n        selectObserver,\n        menuObserver,\n        module\n      ;\n\n      module = {\n\n        initialize: function() {\n          module.debug('Initializing dropdown', settings);\n\n          if( module.is.alreadySetup() ) {\n            module.setup.reference();\n          }\n          else {\n\n            module.setup.layout();\n\n            if(settings.values) {\n              module.change.values(settings.values);\n            }\n\n            module.refreshData();\n\n            module.save.defaults();\n            module.restore.selected();\n\n            module.create.id();\n            module.bind.events();\n\n            module.observeChanges();\n            module.instantiate();\n          }\n\n        },\n\n        instantiate: function() {\n          module.verbose('Storing instance of dropdown', module);\n          instance = module;\n          $module\n            .data(moduleNamespace, module)\n          ;\n        },\n\n        destroy: function() {\n          module.verbose('Destroying previous dropdown', $module);\n          module.remove.tabbable();\n          $module\n            .off(eventNamespace)\n            .removeData(moduleNamespace)\n          ;\n          $menu\n            .off(eventNamespace)\n          ;\n          $document\n            .off(elementNamespace)\n          ;\n          module.disconnect.menuObserver();\n          module.disconnect.selectObserver();\n        },\n\n        observeChanges: function() {\n          if('MutationObserver' in window) {\n            selectObserver = new MutationObserver(module.event.select.mutation);\n            menuObserver   = new MutationObserver(module.event.menu.mutation);\n            module.debug('Setting up mutation observer', selectObserver, menuObserver);\n            module.observe.select();\n            module.observe.menu();\n          }\n        },\n\n        disconnect: {\n          menuObserver: function() {\n            if(menuObserver) {\n              menuObserver.disconnect();\n            }\n          },\n          selectObserver: function() {\n            if(selectObserver) {\n              selectObserver.disconnect();\n            }\n          }\n        },\n        observe: {\n          select: function() {\n            if(module.has.input()) {\n              selectObserver.observe($module[0], {\n                childList : true,\n                subtree   : true\n              });\n            }\n          },\n          menu: function() {\n            if(module.has.menu()) {\n              menuObserver.observe($menu[0], {\n                childList : true,\n                subtree   : true\n              });\n            }\n          }\n        },\n\n        create: {\n          id: function() {\n            id = (Math.random().toString(16) + '000000000').substr(2, 8);\n            elementNamespace = '.' + id;\n            module.verbose('Creating unique id for element', id);\n          },\n          userChoice: function(values) {\n            var\n              $userChoices,\n              $userChoice,\n              isUserValue,\n              html\n            ;\n            values = values || module.get.userValues();\n            if(!values) {\n              return false;\n            }\n            values = $.isArray(values)\n              ? values\n              : [values]\n            ;\n            $.each(values, function(index, value) {\n              if(module.get.item(value) === false) {\n                html         = settings.templates.addition( module.add.variables(message.addResult, value) );\n                $userChoice  = $('<div />')\n                  .html(html)\n                  .attr('data-' + metadata.value, value)\n                  .attr('data-' + metadata.text, value)\n                  .addClass(className.addition)\n                  .addClass(className.item)\n                ;\n                if(settings.hideAdditions) {\n                  $userChoice.addClass(className.hidden);\n                }\n                $userChoices = ($userChoices === undefined)\n                  ? $userChoice\n                  : $userChoices.add($userChoice)\n                ;\n                module.verbose('Creating user choices for value', value, $userChoice);\n              }\n            });\n            return $userChoices;\n          },\n          userLabels: function(value) {\n            var\n              userValues = module.get.userValues()\n            ;\n            if(userValues) {\n              module.debug('Adding user labels', userValues);\n              $.each(userValues, function(index, value) {\n                module.verbose('Adding custom user value');\n                module.add.label(value, value);\n              });\n            }\n          },\n          menu: function() {\n            $menu = $('<div />')\n              .addClass(className.menu)\n              .appendTo($module)\n            ;\n          },\n          sizer: function() {\n            $sizer = $('<span />')\n              .addClass(className.sizer)\n              .insertAfter($search)\n            ;\n          }\n        },\n\n        search: function(query) {\n          query = (query !== undefined)\n            ? query\n            : module.get.query()\n          ;\n          module.verbose('Searching for query', query);\n          if(module.has.minCharacters(query)) {\n            module.filter(query);\n          }\n          else {\n            module.hide();\n          }\n        },\n\n        select: {\n          firstUnfiltered: function() {\n            module.verbose('Selecting first non-filtered element');\n            module.remove.selectedItem();\n            $item\n              .not(selector.unselectable)\n              .not(selector.addition + selector.hidden)\n                .eq(0)\n                .addClass(className.selected)\n            ;\n          },\n          nextAvailable: function($selected) {\n            $selected = $selected.eq(0);\n            var\n              $nextAvailable = $selected.nextAll(selector.item).not(selector.unselectable).eq(0),\n              $prevAvailable = $selected.prevAll(selector.item).not(selector.unselectable).eq(0),\n              hasNext        = ($nextAvailable.length > 0)\n            ;\n            if(hasNext) {\n              module.verbose('Moving selection to', $nextAvailable);\n              $nextAvailable.addClass(className.selected);\n            }\n            else {\n              module.verbose('Moving selection to', $prevAvailable);\n              $prevAvailable.addClass(className.selected);\n            }\n          }\n        },\n\n        setup: {\n          api: function() {\n            var\n              apiSettings = {\n                debug   : settings.debug,\n                urlData : {\n                  value : module.get.value(),\n                  query : module.get.query()\n                },\n                on    : false\n              }\n            ;\n            module.verbose('First request, initializing API');\n            $module\n              .api(apiSettings)\n            ;\n          },\n          layout: function() {\n            if( $module.is('select') ) {\n              module.setup.select();\n              module.setup.returnedObject();\n            }\n            if( !module.has.menu() ) {\n              module.create.menu();\n            }\n            if( module.is.search() && !module.has.search() ) {\n              module.verbose('Adding search input');\n              $search = $('<input />')\n                .addClass(className.search)\n                .prop('autocomplete', 'off')\n                .insertBefore($text)\n              ;\n            }\n            if( module.is.multiple() && module.is.searchSelection() && !module.has.sizer()) {\n              module.create.sizer();\n            }\n            if(settings.allowTab) {\n              module.set.tabbable();\n            }\n          },\n          select: function() {\n            var\n              selectValues  = module.get.selectValues()\n            ;\n            module.debug('Dropdown initialized on a select', selectValues);\n            if( $module.is('select') ) {\n              $input = $module;\n            }\n            // see if select is placed correctly already\n            if($input.parent(selector.dropdown).length > 0) {\n              module.debug('UI dropdown already exists. Creating dropdown menu only');\n              $module = $input.closest(selector.dropdown);\n              if( !module.has.menu() ) {\n                module.create.menu();\n              }\n              $menu = $module.children(selector.menu);\n              module.setup.menu(selectValues);\n            }\n            else {\n              module.debug('Creating entire dropdown from select');\n              $module = $('<div />')\n                .attr('class', $input.attr('class') )\n                .addClass(className.selection)\n                .addClass(className.dropdown)\n                .html( templates.dropdown(selectValues) )\n                .insertBefore($input)\n              ;\n              if($input.hasClass(className.multiple) && $input.prop('multiple') === false) {\n                module.error(error.missingMultiple);\n                $input.prop('multiple', true);\n              }\n              if($input.is('[multiple]')) {\n                module.set.multiple();\n              }\n              if ($input.prop('disabled')) {\n                module.debug('Disabling dropdown');\n                $module.addClass(className.disabled);\n              }\n              $input\n                .removeAttr('class')\n                .detach()\n                .prependTo($module)\n              ;\n            }\n            module.refresh();\n          },\n          menu: function(values) {\n            $menu.html( templates.menu(values, fields));\n            $item = $menu.find(selector.item);\n          },\n          reference: function() {\n            module.debug('Dropdown behavior was called on select, replacing with closest dropdown');\n            // replace module reference\n            $module  = $module.parent(selector.dropdown);\n            instance = $module.data(moduleNamespace);\n            element  = $module.get(0);\n            module.refresh();\n            module.setup.returnedObject();\n          },\n          returnedObject: function() {\n            var\n              $firstModules = $allModules.slice(0, elementIndex),\n              $lastModules  = $allModules.slice(elementIndex + 1)\n            ;\n            // adjust all modules to use correct reference\n            $allModules = $firstModules.add($module).add($lastModules);\n          }\n        },\n\n        refresh: function() {\n          module.refreshSelectors();\n          module.refreshData();\n        },\n\n        refreshItems: function() {\n          $item = $menu.find(selector.item);\n        },\n\n        refreshSelectors: function() {\n          module.verbose('Refreshing selector cache');\n          $text   = $module.find(selector.text);\n          $search = $module.find(selector.search);\n          $input  = $module.find(selector.input);\n          $icon   = $module.find(selector.icon);\n          $combo  = ($module.prev().find(selector.text).length > 0)\n            ? $module.prev().find(selector.text)\n            : $module.prev()\n          ;\n          $menu    = $module.children(selector.menu);\n          $item    = $menu.find(selector.item);\n        },\n\n        refreshData: function() {\n          module.verbose('Refreshing cached metadata');\n          $item\n            .removeData(metadata.text)\n            .removeData(metadata.value)\n          ;\n        },\n\n        clearData: function() {\n          module.verbose('Clearing metadata');\n          $item\n            .removeData(metadata.text)\n            .removeData(metadata.value)\n          ;\n          $module\n            .removeData(metadata.defaultText)\n            .removeData(metadata.defaultValue)\n            .removeData(metadata.placeholderText)\n          ;\n        },\n\n        toggle: function() {\n          module.verbose('Toggling menu visibility');\n          if( !module.is.active() ) {\n            module.show();\n          }\n          else {\n            module.hide();\n          }\n        },\n\n        show: function(callback) {\n          callback = $.isFunction(callback)\n            ? callback\n            : function(){}\n          ;\n          if(!module.can.show() && module.is.remote()) {\n            module.debug('No API results retrieved, searching before show');\n            module.queryRemote(module.get.query(), module.show);\n          }\n          if( module.can.show() && !module.is.active() ) {\n            module.debug('Showing dropdown');\n            if(module.has.message() && !(module.has.maxSelections() || module.has.allResultsFiltered()) ) {\n              module.remove.message();\n            }\n            if(module.is.allFiltered()) {\n              return true;\n            }\n            if(settings.onShow.call(element) !== false) {\n              module.animate.show(function() {\n                if( module.can.click() ) {\n                  module.bind.intent();\n                }\n                if(module.has.menuSearch()) {\n                  module.focusSearch();\n                }\n                module.set.visible();\n                callback.call(element);\n              });\n            }\n          }\n        },\n\n        hide: function(callback) {\n          callback = $.isFunction(callback)\n            ? callback\n            : function(){}\n          ;\n          if( module.is.active() && !module.is.animatingOutward() ) {\n            module.debug('Hiding dropdown');\n            if(settings.onHide.call(element) !== false) {\n              module.animate.hide(function() {\n                module.remove.visible();\n                callback.call(element);\n              });\n            }\n          }\n        },\n\n        hideOthers: function() {\n          module.verbose('Finding other dropdowns to hide');\n          $allModules\n            .not($module)\n              .has(selector.menu + '.' + className.visible)\n                .dropdown('hide')\n          ;\n        },\n\n        hideMenu: function() {\n          module.verbose('Hiding menu  instantaneously');\n          module.remove.active();\n          module.remove.visible();\n          $menu.transition('hide');\n        },\n\n        hideSubMenus: function() {\n          var\n            $subMenus = $menu.children(selector.item).find(selector.menu)\n          ;\n          module.verbose('Hiding sub menus', $subMenus);\n          $subMenus.transition('hide');\n        },\n\n        bind: {\n          events: function() {\n            if(hasTouch) {\n              module.bind.touchEvents();\n            }\n            module.bind.keyboardEvents();\n            module.bind.inputEvents();\n            module.bind.mouseEvents();\n          },\n          touchEvents: function() {\n            module.debug('Touch device detected binding additional touch events');\n            if( module.is.searchSelection() ) {\n              // do nothing special yet\n            }\n            else if( module.is.single() ) {\n              $module\n                .on('touchstart' + eventNamespace, module.event.test.toggle)\n              ;\n            }\n            $menu\n              .on('touchstart' + eventNamespace, selector.item, module.event.item.mouseenter)\n            ;\n          },\n          keyboardEvents: function() {\n            module.verbose('Binding keyboard events');\n            $module\n              .on('keydown' + eventNamespace, module.event.keydown)\n            ;\n            if( module.has.search() ) {\n              $module\n                .on(module.get.inputEvent() + eventNamespace, selector.search, module.event.input)\n              ;\n            }\n            if( module.is.multiple() ) {\n              $document\n                .on('keydown' + elementNamespace, module.event.document.keydown)\n              ;\n            }\n          },\n          inputEvents: function() {\n            module.verbose('Binding input change events');\n            $module\n              .on('change' + eventNamespace, selector.input, module.event.change)\n            ;\n          },\n          mouseEvents: function() {\n            module.verbose('Binding mouse events');\n            if(module.is.multiple()) {\n              $module\n                .on('click'   + eventNamespace, selector.label,  module.event.label.click)\n                .on('click'   + eventNamespace, selector.remove, module.event.remove.click)\n              ;\n            }\n            if( module.is.searchSelection() ) {\n              $module\n                .on('mousedown' + eventNamespace, module.event.mousedown)\n                .on('mouseup'   + eventNamespace, module.event.mouseup)\n                .on('mousedown' + eventNamespace, selector.menu,   module.event.menu.mousedown)\n                .on('mouseup'   + eventNamespace, selector.menu,   module.event.menu.mouseup)\n                .on('click'     + eventNamespace, selector.icon,   module.event.icon.click)\n                .on('focus'     + eventNamespace, selector.search, module.event.search.focus)\n                .on('click'     + eventNamespace, selector.search, module.event.search.focus)\n                .on('blur'      + eventNamespace, selector.search, module.event.search.blur)\n                .on('click'     + eventNamespace, selector.text,   module.event.text.focus)\n              ;\n              if(module.is.multiple()) {\n                $module\n                  .on('click' + eventNamespace, module.event.click)\n                ;\n              }\n            }\n            else {\n              if(settings.on == 'click') {\n                $module\n                  .on('click' + eventNamespace, selector.icon, module.event.icon.click)\n                  .on('click' + eventNamespace, module.event.test.toggle)\n                ;\n              }\n              else if(settings.on == 'hover') {\n                $module\n                  .on('mouseenter' + eventNamespace, module.delay.show)\n                  .on('mouseleave' + eventNamespace, module.delay.hide)\n                ;\n              }\n              else {\n                $module\n                  .on(settings.on + eventNamespace, module.toggle)\n                ;\n              }\n              $module\n                .on('mousedown' + eventNamespace, module.event.mousedown)\n                .on('mouseup'   + eventNamespace, module.event.mouseup)\n                .on('focus'     + eventNamespace, module.event.focus)\n              ;\n              if(module.has.menuSearch() ) {\n                $module\n                  .on('blur' + eventNamespace, selector.search, module.event.search.blur)\n                ;\n              }\n              else {\n                $module\n                  .on('blur' + eventNamespace, module.event.blur)\n                ;\n              }\n            }\n            $menu\n              .on('mouseenter' + eventNamespace, selector.item, module.event.item.mouseenter)\n              .on('mouseleave' + eventNamespace, selector.item, module.event.item.mouseleave)\n              .on('click'      + eventNamespace, selector.item, module.event.item.click)\n            ;\n          },\n          intent: function() {\n            module.verbose('Binding hide intent event to document');\n            if(hasTouch) {\n              $document\n                .on('touchstart' + elementNamespace, module.event.test.touch)\n                .on('touchmove'  + elementNamespace, module.event.test.touch)\n              ;\n            }\n            $document\n              .on('click' + elementNamespace, module.event.test.hide)\n            ;\n          }\n        },\n\n        unbind: {\n          intent: function() {\n            module.verbose('Removing hide intent event from document');\n            if(hasTouch) {\n              $document\n                .off('touchstart' + elementNamespace)\n                .off('touchmove' + elementNamespace)\n              ;\n            }\n            $document\n              .off('click' + elementNamespace)\n            ;\n          }\n        },\n\n        filter: function(query) {\n          var\n            searchTerm = (query !== undefined)\n              ? query\n              : module.get.query(),\n            afterFiltered = function() {\n              if(module.is.multiple()) {\n                module.filterActive();\n              }\n              if(query || (!query && module.get.activeItem().length == 0)) {\n                module.select.firstUnfiltered();\n              }\n              if( module.has.allResultsFiltered() ) {\n                if( settings.onNoResults.call(element, searchTerm) ) {\n                  if(settings.allowAdditions) {\n                    if(settings.hideAdditions) {\n                      module.verbose('User addition with no menu, setting empty style');\n                      module.set.empty();\n                      module.hideMenu();\n                    }\n                  }\n                  else {\n                    module.verbose('All items filtered, showing message', searchTerm);\n                    module.add.message(message.noResults);\n                  }\n                }\n                else {\n                  module.verbose('All items filtered, hiding dropdown', searchTerm);\n                  module.hideMenu();\n                }\n              }\n              else {\n                module.remove.empty();\n                module.remove.message();\n              }\n              if(settings.allowAdditions) {\n                module.add.userSuggestion(query);\n              }\n              if(module.is.searchSelection() && module.can.show() && module.is.focusedOnSearch() ) {\n                module.show();\n              }\n            }\n          ;\n          if(settings.useLabels && module.has.maxSelections()) {\n            return;\n          }\n          if(settings.apiSettings) {\n            if( module.can.useAPI() ) {\n              module.queryRemote(searchTerm, function() {\n                if(settings.filterRemoteData) {\n                  module.filterItems(searchTerm);\n                }\n                afterFiltered();\n              });\n            }\n            else {\n              module.error(error.noAPI);\n            }\n          }\n          else {\n            module.filterItems(searchTerm);\n            afterFiltered();\n          }\n        },\n\n        queryRemote: function(query, callback) {\n          var\n            apiSettings = {\n              errorDuration : false,\n              cache         : 'local',\n              throttle      : settings.throttle,\n              urlData       : {\n                query: query\n              },\n              onError: function() {\n                module.add.message(message.serverError);\n                callback();\n              },\n              onFailure: function() {\n                module.add.message(message.serverError);\n                callback();\n              },\n              onSuccess : function(response) {\n                module.remove.message();\n                module.setup.menu({\n                  values: response[fields.remoteValues]\n                });\n                callback();\n              }\n            }\n          ;\n          if( !$module.api('get request') ) {\n            module.setup.api();\n          }\n          apiSettings = $.extend(true, {}, apiSettings, settings.apiSettings);\n          $module\n            .api('setting', apiSettings)\n            .api('query')\n          ;\n        },\n\n        filterItems: function(query) {\n          var\n            searchTerm = (query !== undefined)\n              ? query\n              : module.get.query(),\n            results          =  null,\n            escapedTerm      = module.escape.string(searchTerm),\n            beginsWithRegExp = new RegExp('^' + escapedTerm, 'igm')\n          ;\n          // avoid loop if we're matching nothing\n          if( module.has.query() ) {\n            results = [];\n\n            module.verbose('Searching for matching values', searchTerm);\n            $item\n              .each(function(){\n                var\n                  $choice = $(this),\n                  text,\n                  value\n                ;\n                if(settings.match == 'both' || settings.match == 'text') {\n                  text = String(module.get.choiceText($choice, false));\n                  if(text.search(beginsWithRegExp) !== -1) {\n                    results.push(this);\n                    return true;\n                  }\n                  else if (settings.fullTextSearch === 'exact' && module.exactSearch(searchTerm, text)) {\n                    results.push(this);\n                    return true;\n                  }\n                  else if (settings.fullTextSearch === true && module.fuzzySearch(searchTerm, text)) {\n                    results.push(this);\n                    return true;\n                  }\n                }\n                if(settings.match == 'both' || settings.match == 'value') {\n                  value = String(module.get.choiceValue($choice, text));\n                  if(value.search(beginsWithRegExp) !== -1) {\n                    results.push(this);\n                    return true;\n                  }\n                  else if (settings.fullTextSearch === 'exact' && module.exactSearch(searchTerm, value)) {\n                    results.push(this);\n                    return true;\n                  }\n                  else if (settings.fullTextSearch === true && module.fuzzySearch(searchTerm, value)) {\n                    results.push(this);\n                    return true;\n                  }\n                }\n              })\n            ;\n          }\n          module.debug('Showing only matched items', searchTerm);\n          module.remove.filteredItem();\n          if(results) {\n            $item\n              .not(results)\n              .addClass(className.filtered)\n            ;\n          }\n        },\n\n        fuzzySearch: function(query, term) {\n          var\n            termLength  = term.length,\n            queryLength = query.length\n          ;\n          query = query.toLowerCase();\n          term  = term.toLowerCase();\n          if(queryLength > termLength) {\n            return false;\n          }\n          if(queryLength === termLength) {\n            return (query === term);\n          }\n          search: for (var characterIndex = 0, nextCharacterIndex = 0; characterIndex < queryLength; characterIndex++) {\n            var\n              queryCharacter = query.charCodeAt(characterIndex)\n            ;\n            while(nextCharacterIndex < termLength) {\n              if(term.charCodeAt(nextCharacterIndex++) === queryCharacter) {\n                continue search;\n              }\n            }\n            return false;\n          }\n          return true;\n        },\n        exactSearch: function (query, term) {\n          query = query.toLowerCase();\n          term  = term.toLowerCase();\n          if(term.indexOf(query) > -1) {\n             return true;\n          }\n          return false;\n        },\n        filterActive: function() {\n          if(settings.useLabels) {\n            $item.filter('.' + className.active)\n              .addClass(className.filtered)\n            ;\n          }\n        },\n\n        focusSearch: function(skipHandler) {\n          if( module.has.search() && !module.is.focusedOnSearch() ) {\n            if(skipHandler) {\n              $module.off('focus' + eventNamespace, selector.search);\n              $search.focus();\n              $module.on('focus'  + eventNamespace, selector.search, module.event.search.focus);\n            }\n            else {\n              $search.focus();\n            }\n          }\n        },\n\n        forceSelection: function() {\n          var\n            $currentlySelected = $item.not(className.filtered).filter('.' + className.selected).eq(0),\n            $activeItem        = $item.not(className.filtered).filter('.' + className.active).eq(0),\n            $selectedItem      = ($currentlySelected.length > 0)\n              ? $currentlySelected\n              : $activeItem,\n            hasSelected = ($selectedItem.length > 0)\n          ;\n          if(hasSelected && !module.is.multiple()) {\n            module.debug('Forcing partial selection to selected item', $selectedItem);\n            module.event.item.click.call($selectedItem, {}, true);\n            return;\n          }\n          else {\n            if(settings.allowAdditions) {\n              module.set.selected(module.get.query());\n              module.remove.searchTerm();\n            }\n            else {\n              module.remove.searchTerm();\n            }\n          }\n        },\n\n        change: {\n          values: function(values) {\n            if(!settings.allowAdditions) {\n              module.clear();\n            }\n            module.debug('Creating dropdown with specified values', values);\n            module.setup.menu({values: values});\n            $.each(values, function(index, item) {\n              if(item.selected == true) {\n                module.debug('Setting initial selection to', item.value);\n                module.set.selected(item.value);\n                return true;\n              }\n            });\n          }\n        },\n\n        event: {\n          change: function() {\n            if(!internalChange) {\n              module.debug('Input changed, updating selection');\n              module.set.selected();\n            }\n          },\n          focus: function() {\n            if(settings.showOnFocus && !activated && module.is.hidden() && !pageLostFocus) {\n              module.show();\n            }\n          },\n          blur: function(event) {\n            pageLostFocus = (document.activeElement === this);\n            if(!activated && !pageLostFocus) {\n              module.remove.activeLabel();\n              module.hide();\n            }\n          },\n          mousedown: function() {\n            if(module.is.searchSelection()) {\n              // prevent menu hiding on immediate re-focus\n              willRefocus = true;\n            }\n            else {\n              // prevents focus callback from occurring on mousedown\n              activated = true;\n            }\n          },\n          mouseup: function() {\n            if(module.is.searchSelection()) {\n              // prevent menu hiding on immediate re-focus\n              willRefocus = false;\n            }\n            else {\n              activated = false;\n            }\n          },\n          click: function(event) {\n            var\n              $target = $(event.target)\n            ;\n            // focus search\n            if($target.is($module)) {\n              if(!module.is.focusedOnSearch()) {\n                module.focusSearch();\n              }\n              else {\n                module.show();\n              }\n            }\n          },\n          search: {\n            focus: function() {\n              activated = true;\n              if(module.is.multiple()) {\n                module.remove.activeLabel();\n              }\n              if(settings.showOnFocus) {\n                module.search();\n              }\n            },\n            blur: function(event) {\n              pageLostFocus = (document.activeElement === this);\n              if(module.is.searchSelection() && !willRefocus) {\n                if(!itemActivated && !pageLostFocus) {\n                  if(settings.forceSelection) {\n                    module.forceSelection();\n                  }\n                  module.hide();\n                }\n              }\n              willRefocus = false;\n            }\n          },\n          icon: {\n            click: function(event) {\n              module.toggle();\n            }\n          },\n          text: {\n            focus: function(event) {\n              activated = true;\n              module.focusSearch();\n            }\n          },\n          input: function(event) {\n            if(module.is.multiple() || module.is.searchSelection()) {\n              module.set.filtered();\n            }\n            clearTimeout(module.timer);\n            module.timer = setTimeout(module.search, settings.delay.search);\n          },\n          label: {\n            click: function(event) {\n              var\n                $label        = $(this),\n                $labels       = $module.find(selector.label),\n                $activeLabels = $labels.filter('.' + className.active),\n                $nextActive   = $label.nextAll('.' + className.active),\n                $prevActive   = $label.prevAll('.' + className.active),\n                $range = ($nextActive.length > 0)\n                  ? $label.nextUntil($nextActive).add($activeLabels).add($label)\n                  : $label.prevUntil($prevActive).add($activeLabels).add($label)\n              ;\n              if(event.shiftKey) {\n                $activeLabels.removeClass(className.active);\n                $range.addClass(className.active);\n              }\n              else if(event.ctrlKey) {\n                $label.toggleClass(className.active);\n              }\n              else {\n                $activeLabels.removeClass(className.active);\n                $label.addClass(className.active);\n              }\n              settings.onLabelSelect.apply(this, $labels.filter('.' + className.active));\n            }\n          },\n          remove: {\n            click: function() {\n              var\n                $label = $(this).parent()\n              ;\n              if( $label.hasClass(className.active) ) {\n                // remove all selected labels\n                module.remove.activeLabels();\n              }\n              else {\n                // remove this label only\n                module.remove.activeLabels( $label );\n              }\n            }\n          },\n          test: {\n            toggle: function(event) {\n              var\n                toggleBehavior = (module.is.multiple())\n                  ? module.show\n                  : module.toggle\n              ;\n              if(module.is.bubbledLabelClick(event) || module.is.bubbledIconClick(event)) {\n                return;\n              }\n              if( module.determine.eventOnElement(event, toggleBehavior) ) {\n                event.preventDefault();\n              }\n            },\n            touch: function(event) {\n              module.determine.eventOnElement(event, function() {\n                if(event.type == 'touchstart') {\n                  module.timer = setTimeout(function() {\n                    module.hide();\n                  }, settings.delay.touch);\n                }\n                else if(event.type == 'touchmove') {\n                  clearTimeout(module.timer);\n                }\n              });\n              event.stopPropagation();\n            },\n            hide: function(event) {\n              module.determine.eventInModule(event, module.hide);\n            }\n          },\n          select: {\n            mutation: function(mutations) {\n              module.debug('<select> modified, recreating menu');\n              var\n                isSelectMutation = false\n              ;\n              $.each(mutations, function(index, mutation) {\n                if($(mutation.target).is('select') || $(mutation.addedNodes).is('select')) {\n                  isSelectMutation = true;\n                  return true;\n                }\n              });\n              if(isSelectMutation) {\n                module.disconnect.selectObserver();\n                module.refresh();\n                module.setup.select();\n                module.set.selected();\n                module.observe.select();\n              }\n            }\n          },\n          menu: {\n            mutation: function(mutations) {\n              var\n                mutation   = mutations[0],\n                $addedNode = mutation.addedNodes\n                  ? $(mutation.addedNodes[0])\n                  : $(false),\n                $removedNode = mutation.removedNodes\n                  ? $(mutation.removedNodes[0])\n                  : $(false),\n                $changedNodes  = $addedNode.add($removedNode),\n                isUserAddition = $changedNodes.is(selector.addition) || $changedNodes.closest(selector.addition).length > 0,\n                isMessage      = $changedNodes.is(selector.message)  || $changedNodes.closest(selector.message).length > 0\n              ;\n              if(isUserAddition || isMessage) {\n                module.debug('Updating item selector cache');\n                module.refreshItems();\n              }\n              else {\n                module.debug('Menu modified, updating selector cache');\n                module.refresh();\n              }\n            },\n            mousedown: function() {\n              itemActivated = true;\n            },\n            mouseup: function() {\n              itemActivated = false;\n            }\n          },\n          item: {\n            mouseenter: function(event) {\n              var\n                $target        = $(event.target),\n                $item          = $(this),\n                $subMenu       = $item.children(selector.menu),\n                $otherMenus    = $item.siblings(selector.item).children(selector.menu),\n                hasSubMenu     = ($subMenu.length > 0),\n                isBubbledEvent = ($subMenu.find($target).length > 0)\n              ;\n              if( !isBubbledEvent && hasSubMenu ) {\n                clearTimeout(module.itemTimer);\n                module.itemTimer = setTimeout(function() {\n                  module.verbose('Showing sub-menu', $subMenu);\n                  $.each($otherMenus, function() {\n                    module.animate.hide(false, $(this));\n                  });\n                  module.animate.show(false, $subMenu);\n                }, settings.delay.show);\n                event.preventDefault();\n              }\n            },\n            mouseleave: function(event) {\n              var\n                $subMenu = $(this).children(selector.menu)\n              ;\n              if($subMenu.length > 0) {\n                clearTimeout(module.itemTimer);\n                module.itemTimer = setTimeout(function() {\n                  module.verbose('Hiding sub-menu', $subMenu);\n                  module.animate.hide(false, $subMenu);\n                }, settings.delay.hide);\n              }\n            },\n            click: function (event, skipRefocus) {\n              var\n                $choice        = $(this),\n                $target        = (event)\n                  ? $(event.target)\n                  : $(''),\n                $subMenu       = $choice.find(selector.menu),\n                text           = module.get.choiceText($choice),\n                value          = module.get.choiceValue($choice, text),\n                hasSubMenu     = ($subMenu.length > 0),\n                isBubbledEvent = ($subMenu.find($target).length > 0)\n              ;\n              // prevents IE11 bug where menu receives focus even though `tabindex=-1`\n              if(module.has.menuSearch()) {\n                $(document.activeElement).blur();\n              }\n              if(!isBubbledEvent && (!hasSubMenu || settings.allowCategorySelection)) {\n                if(module.is.searchSelection()) {\n                  if(settings.allowAdditions) {\n                    module.remove.userAddition();\n                  }\n                  module.remove.searchTerm();\n                  if(!module.is.focusedOnSearch() && !(skipRefocus == true)) {\n                    module.focusSearch(true);\n                  }\n                }\n                if(!settings.useLabels) {\n                  module.remove.filteredItem();\n                  module.set.scrollPosition($choice);\n                }\n                module.determine.selectAction.call(this, text, value);\n              }\n            }\n          },\n\n          document: {\n            // label selection should occur even when element has no focus\n            keydown: function(event) {\n              var\n                pressedKey    = event.which,\n                isShortcutKey = module.is.inObject(pressedKey, keys)\n              ;\n              if(isShortcutKey) {\n                var\n                  $label            = $module.find(selector.label),\n                  $activeLabel      = $label.filter('.' + className.active),\n                  activeValue       = $activeLabel.data(metadata.value),\n                  labelIndex        = $label.index($activeLabel),\n                  labelCount        = $label.length,\n                  hasActiveLabel    = ($activeLabel.length > 0),\n                  hasMultipleActive = ($activeLabel.length > 1),\n                  isFirstLabel      = (labelIndex === 0),\n                  isLastLabel       = (labelIndex + 1 == labelCount),\n                  isSearch          = module.is.searchSelection(),\n                  isFocusedOnSearch = module.is.focusedOnSearch(),\n                  isFocused         = module.is.focused(),\n                  caretAtStart      = (isFocusedOnSearch && module.get.caretPosition() === 0),\n                  $nextLabel\n                ;\n                if(isSearch && !hasActiveLabel && !isFocusedOnSearch) {\n                  return;\n                }\n\n                if(pressedKey == keys.leftArrow) {\n                  // activate previous label\n                  if((isFocused || caretAtStart) && !hasActiveLabel) {\n                    module.verbose('Selecting previous label');\n                    $label.last().addClass(className.active);\n                  }\n                  else if(hasActiveLabel) {\n                    if(!event.shiftKey) {\n                      module.verbose('Selecting previous label');\n                      $label.removeClass(className.active);\n                    }\n                    else {\n                      module.verbose('Adding previous label to selection');\n                    }\n                    if(isFirstLabel && !hasMultipleActive) {\n                      $activeLabel.addClass(className.active);\n                    }\n                    else {\n                      $activeLabel.prev(selector.siblingLabel)\n                        .addClass(className.active)\n                        .end()\n                      ;\n                    }\n                    event.preventDefault();\n                  }\n                }\n                else if(pressedKey == keys.rightArrow) {\n                  // activate first label\n                  if(isFocused && !hasActiveLabel) {\n                    $label.first().addClass(className.active);\n                  }\n                  // activate next label\n                  if(hasActiveLabel) {\n                    if(!event.shiftKey) {\n                      module.verbose('Selecting next label');\n                      $label.removeClass(className.active);\n                    }\n                    else {\n                      module.verbose('Adding next label to selection');\n                    }\n                    if(isLastLabel) {\n                      if(isSearch) {\n                        if(!isFocusedOnSearch) {\n                          module.focusSearch();\n                        }\n                        else {\n                          $label.removeClass(className.active);\n                        }\n                      }\n                      else if(hasMultipleActive) {\n                        $activeLabel.next(selector.siblingLabel).addClass(className.active);\n                      }\n                      else {\n                        $activeLabel.addClass(className.active);\n                      }\n                    }\n                    else {\n                      $activeLabel.next(selector.siblingLabel).addClass(className.active);\n                    }\n                    event.preventDefault();\n                  }\n                }\n                else if(pressedKey == keys.deleteKey || pressedKey == keys.backspace) {\n                  if(hasActiveLabel) {\n                    module.verbose('Removing active labels');\n                    if(isLastLabel) {\n                      if(isSearch && !isFocusedOnSearch) {\n                        module.focusSearch();\n                      }\n                    }\n                    $activeLabel.last().next(selector.siblingLabel).addClass(className.active);\n                    module.remove.activeLabels($activeLabel);\n                    event.preventDefault();\n                  }\n                  else if(caretAtStart && !hasActiveLabel && pressedKey == keys.backspace) {\n                    module.verbose('Removing last label on input backspace');\n                    $activeLabel = $label.last().addClass(className.active);\n                    module.remove.activeLabels($activeLabel);\n                  }\n                }\n                else {\n                  $activeLabel.removeClass(className.active);\n                }\n              }\n            }\n          },\n\n          keydown: function(event) {\n            var\n              pressedKey    = event.which,\n              isShortcutKey = module.is.inObject(pressedKey, keys)\n            ;\n            if(isShortcutKey) {\n              var\n                $currentlySelected = $item.not(selector.unselectable).filter('.' + className.selected).eq(0),\n                $activeItem        = $menu.children('.' + className.active).eq(0),\n                $selectedItem      = ($currentlySelected.length > 0)\n                  ? $currentlySelected\n                  : $activeItem,\n                $visibleItems = ($selectedItem.length > 0)\n                  ? $selectedItem.siblings(':not(.' + className.filtered +')').addBack()\n                  : $menu.children(':not(.' + className.filtered +')'),\n                $subMenu              = $selectedItem.children(selector.menu),\n                $parentMenu           = $selectedItem.closest(selector.menu),\n                inVisibleMenu         = ($parentMenu.hasClass(className.visible) || $parentMenu.hasClass(className.animating) || $parentMenu.parent(selector.menu).length > 0),\n                hasSubMenu            = ($subMenu.length> 0),\n                hasSelectedItem       = ($selectedItem.length > 0),\n                selectedIsSelectable  = ($selectedItem.not(selector.unselectable).length > 0),\n                delimiterPressed      = (pressedKey == keys.delimiter && settings.allowAdditions && module.is.multiple()),\n                isAdditionWithoutMenu = (settings.allowAdditions && settings.hideAdditions && (pressedKey == keys.enter || delimiterPressed) && selectedIsSelectable),\n                $nextItem,\n                isSubMenuItem,\n                newIndex\n              ;\n              // allow selection with menu closed\n              if(isAdditionWithoutMenu) {\n                module.verbose('Selecting item from keyboard shortcut', $selectedItem);\n                module.event.item.click.call($selectedItem, event);\n                if(module.is.searchSelection()) {\n                  module.remove.searchTerm();\n                }\n              }\n\n              // visible menu keyboard shortcuts\n              if( module.is.visible() ) {\n\n                // enter (select or open sub-menu)\n                if(pressedKey == keys.enter || delimiterPressed) {\n                  if(pressedKey == keys.enter && hasSelectedItem && hasSubMenu && !settings.allowCategorySelection) {\n                    module.verbose('Pressed enter on unselectable category, opening sub menu');\n                    pressedKey = keys.rightArrow;\n                  }\n                  else if(selectedIsSelectable) {\n                    module.verbose('Selecting item from keyboard shortcut', $selectedItem);\n                    module.event.item.click.call($selectedItem, event);\n                    if(module.is.searchSelection()) {\n                      module.remove.searchTerm();\n                    }\n                  }\n                  event.preventDefault();\n                }\n\n                // sub-menu actions\n                if(hasSelectedItem) {\n\n                  if(pressedKey == keys.leftArrow) {\n\n                    isSubMenuItem = ($parentMenu[0] !== $menu[0]);\n\n                    if(isSubMenuItem) {\n                      module.verbose('Left key pressed, closing sub-menu');\n                      module.animate.hide(false, $parentMenu);\n                      $selectedItem\n                        .removeClass(className.selected)\n                      ;\n                      $parentMenu\n                        .closest(selector.item)\n                          .addClass(className.selected)\n                      ;\n                      event.preventDefault();\n                    }\n                  }\n\n                  // right arrow (show sub-menu)\n                  if(pressedKey == keys.rightArrow) {\n                    if(hasSubMenu) {\n                      module.verbose('Right key pressed, opening sub-menu');\n                      module.animate.show(false, $subMenu);\n                      $selectedItem\n                        .removeClass(className.selected)\n                      ;\n                      $subMenu\n                        .find(selector.item).eq(0)\n                          .addClass(className.selected)\n                      ;\n                      event.preventDefault();\n                    }\n                  }\n                }\n\n                // up arrow (traverse menu up)\n                if(pressedKey == keys.upArrow) {\n                  $nextItem = (hasSelectedItem && inVisibleMenu)\n                    ? $selectedItem.prevAll(selector.item + ':not(' + selector.unselectable + ')').eq(0)\n                    : $item.eq(0)\n                  ;\n                  if($visibleItems.index( $nextItem ) < 0) {\n                    module.verbose('Up key pressed but reached top of current menu');\n                    event.preventDefault();\n                    return;\n                  }\n                  else {\n                    module.verbose('Up key pressed, changing active item');\n                    $selectedItem\n                      .removeClass(className.selected)\n                    ;\n                    $nextItem\n                      .addClass(className.selected)\n                    ;\n                    module.set.scrollPosition($nextItem);\n                    if(settings.selectOnKeydown && module.is.single()) {\n                      module.set.selectedItem($nextItem);\n                    }\n                  }\n                  event.preventDefault();\n                }\n\n                // down arrow (traverse menu down)\n                if(pressedKey == keys.downArrow) {\n                  $nextItem = (hasSelectedItem && inVisibleMenu)\n                    ? $nextItem = $selectedItem.nextAll(selector.item + ':not(' + selector.unselectable + ')').eq(0)\n                    : $item.eq(0)\n                  ;\n                  if($nextItem.length === 0) {\n                    module.verbose('Down key pressed but reached bottom of current menu');\n                    event.preventDefault();\n                    return;\n                  }\n                  else {\n                    module.verbose('Down key pressed, changing active item');\n                    $item\n                      .removeClass(className.selected)\n                    ;\n                    $nextItem\n                      .addClass(className.selected)\n                    ;\n                    module.set.scrollPosition($nextItem);\n                    if(settings.selectOnKeydown && module.is.single()) {\n                      module.set.selectedItem($nextItem);\n                    }\n                  }\n                  event.preventDefault();\n                }\n\n                // page down (show next page)\n                if(pressedKey == keys.pageUp) {\n                  module.scrollPage('up');\n                  event.preventDefault();\n                }\n                if(pressedKey == keys.pageDown) {\n                  module.scrollPage('down');\n                  event.preventDefault();\n                }\n\n                // escape (close menu)\n                if(pressedKey == keys.escape) {\n                  module.verbose('Escape key pressed, closing dropdown');\n                  module.hide();\n                }\n\n              }\n              else {\n                // delimiter key\n                if(delimiterPressed) {\n                  event.preventDefault();\n                }\n                // down arrow (open menu)\n                if(pressedKey == keys.downArrow && !module.is.visible()) {\n                  module.verbose('Down key pressed, showing dropdown');\n                  module.show();\n                  event.preventDefault();\n                }\n              }\n            }\n            else {\n              if( !module.has.search() ) {\n                module.set.selectedLetter( String.fromCharCode(pressedKey) );\n              }\n            }\n          }\n        },\n\n        trigger: {\n          change: function() {\n            var\n              events       = document.createEvent('HTMLEvents'),\n              inputElement = $input[0]\n            ;\n            if(inputElement) {\n              module.verbose('Triggering native change event');\n              events.initEvent('change', true, false);\n              inputElement.dispatchEvent(events);\n            }\n          }\n        },\n\n        determine: {\n          selectAction: function(text, value) {\n            module.verbose('Determining action', settings.action);\n            if( $.isFunction( module.action[settings.action] ) ) {\n              module.verbose('Triggering preset action', settings.action, text, value);\n              module.action[ settings.action ].call(element, text, value, this);\n            }\n            else if( $.isFunction(settings.action) ) {\n              module.verbose('Triggering user action', settings.action, text, value);\n              settings.action.call(element, text, value, this);\n            }\n            else {\n              module.error(error.action, settings.action);\n            }\n          },\n          eventInModule: function(event, callback) {\n            var\n              $target    = $(event.target),\n              inDocument = ($target.closest(document.documentElement).length > 0),\n              inModule   = ($target.closest($module).length > 0)\n            ;\n            callback = $.isFunction(callback)\n              ? callback\n              : function(){}\n            ;\n            if(inDocument && !inModule) {\n              module.verbose('Triggering event', callback);\n              callback();\n              return true;\n            }\n            else {\n              module.verbose('Event occurred in dropdown, canceling callback');\n              return false;\n            }\n          },\n          eventOnElement: function(event, callback) {\n            var\n              $target      = $(event.target),\n              $label       = $target.closest(selector.siblingLabel),\n              inVisibleDOM = document.body.contains(event.target),\n              notOnLabel   = ($module.find($label).length === 0),\n              notInMenu    = ($target.closest($menu).length === 0)\n            ;\n            callback = $.isFunction(callback)\n              ? callback\n              : function(){}\n            ;\n            if(inVisibleDOM && notOnLabel && notInMenu) {\n              module.verbose('Triggering event', callback);\n              callback();\n              return true;\n            }\n            else {\n              module.verbose('Event occurred in dropdown menu, canceling callback');\n              return false;\n            }\n          }\n        },\n\n        action: {\n\n          nothing: function() {},\n\n          activate: function(text, value, element) {\n            value = (value !== undefined)\n              ? value\n              : text\n            ;\n            if( module.can.activate( $(element) ) ) {\n              module.set.selected(value, $(element));\n              if(module.is.multiple() && !module.is.allFiltered()) {\n                return;\n              }\n              else {\n                module.hideAndClear();\n              }\n            }\n          },\n\n          select: function(text, value, element) {\n            value = (value !== undefined)\n              ? value\n              : text\n            ;\n            if( module.can.activate( $(element) ) ) {\n              module.set.value(value, text, $(element));\n              if(module.is.multiple() && !module.is.allFiltered()) {\n                return;\n              }\n              else {\n                module.hideAndClear();\n              }\n            }\n          },\n\n          combo: function(text, value, element) {\n            value = (value !== undefined)\n              ? value\n              : text\n            ;\n            module.set.selected(value, $(element));\n            module.hideAndClear();\n          },\n\n          hide: function(text, value, element) {\n            module.set.value(value, text);\n            module.hideAndClear();\n          }\n\n        },\n\n        get: {\n          id: function() {\n            return id;\n          },\n          defaultText: function() {\n            return $module.data(metadata.defaultText);\n          },\n          defaultValue: function() {\n            return $module.data(metadata.defaultValue);\n          },\n          placeholderText: function() {\n            if(settings.placeholder != 'auto' && typeof settings.placeholder == 'string') {\n              return settings.placeholder;\n            }\n            return $module.data(metadata.placeholderText) || '';\n          },\n          text: function() {\n            return $text.text();\n          },\n          query: function() {\n            return $.trim($search.val());\n          },\n          searchWidth: function(value) {\n            value = (value !== undefined)\n              ? value\n              : $search.val()\n            ;\n            $sizer.text(value);\n            // prevent rounding issues\n            return Math.ceil( $sizer.width() + 1);\n          },\n          selectionCount: function() {\n            var\n              values = module.get.values(),\n              count\n            ;\n            count = ( module.is.multiple() )\n              ? $.isArray(values)\n                ? values.length\n                : 0\n              : (module.get.value() !== '')\n                ? 1\n                : 0\n            ;\n            return count;\n          },\n          transition: function($subMenu) {\n            return (settings.transition == 'auto')\n              ? module.is.upward($subMenu)\n                ? 'slide up'\n                : 'slide down'\n              : settings.transition\n            ;\n          },\n          userValues: function() {\n            var\n              values = module.get.values()\n            ;\n            if(!values) {\n              return false;\n            }\n            values = $.isArray(values)\n              ? values\n              : [values]\n            ;\n            return $.grep(values, function(value) {\n              return (module.get.item(value) === false);\n            });\n          },\n          uniqueArray: function(array) {\n            return $.grep(array, function (value, index) {\n                return $.inArray(value, array) === index;\n            });\n          },\n          caretPosition: function() {\n            var\n              input = $search.get(0),\n              range,\n              rangeLength\n            ;\n            if('selectionStart' in input) {\n              return input.selectionStart;\n            }\n            else if (document.selection) {\n              input.focus();\n              range       = document.selection.createRange();\n              rangeLength = range.text.length;\n              range.moveStart('character', -input.value.length);\n              return range.text.length - rangeLength;\n            }\n          },\n          value: function() {\n            var\n              value = ($input.length > 0)\n                ? $input.val()\n                : $module.data(metadata.value),\n              isEmptyMultiselect = ($.isArray(value) && value.length === 1 && value[0] === '')\n            ;\n            // prevents placeholder element from being selected when multiple\n            return (value === undefined || isEmptyMultiselect)\n              ? ''\n              : value\n            ;\n          },\n          values: function() {\n            var\n              value = module.get.value()\n            ;\n            if(value === '') {\n              return '';\n            }\n            return ( !module.has.selectInput() && module.is.multiple() )\n              ? (typeof value == 'string') // delimited string\n                ? value.split(settings.delimiter)\n                : ''\n              : value\n            ;\n          },\n          remoteValues: function() {\n            var\n              values = module.get.values(),\n              remoteValues = false\n            ;\n            if(values) {\n              if(typeof values == 'string') {\n                values = [values];\n              }\n              $.each(values, function(index, value) {\n                var\n                  name = module.read.remoteData(value)\n                ;\n                module.verbose('Restoring value from session data', name, value);\n                if(name) {\n                  if(!remoteValues) {\n                    remoteValues = {};\n                  }\n                  remoteValues[value] = name;\n                }\n              });\n            }\n            return remoteValues;\n          },\n          choiceText: function($choice, preserveHTML) {\n            preserveHTML = (preserveHTML !== undefined)\n              ? preserveHTML\n              : settings.preserveHTML\n            ;\n            if($choice) {\n              if($choice.find(selector.menu).length > 0) {\n                module.verbose('Retrieving text of element with sub-menu');\n                $choice = $choice.clone();\n                $choice.find(selector.menu).remove();\n                $choice.find(selector.menuIcon).remove();\n              }\n              return ($choice.data(metadata.text) !== undefined)\n                ? $choice.data(metadata.text)\n                : (preserveHTML)\n                  ? $.trim($choice.html())\n                  : $.trim($choice.text())\n              ;\n            }\n          },\n          choiceValue: function($choice, choiceText) {\n            choiceText = choiceText || module.get.choiceText($choice);\n            if(!$choice) {\n              return false;\n            }\n            return ($choice.data(metadata.value) !== undefined)\n              ? String( $choice.data(metadata.value) )\n              : (typeof choiceText === 'string')\n                ? $.trim(choiceText.toLowerCase())\n                : String(choiceText)\n            ;\n          },\n          inputEvent: function() {\n            var\n              input = $search[0]\n            ;\n            if(input) {\n              return (input.oninput !== undefined)\n                ? 'input'\n                : (input.onpropertychange !== undefined)\n                  ? 'propertychange'\n                  : 'keyup'\n              ;\n            }\n            return false;\n          },\n          selectValues: function() {\n            var\n              select = {}\n            ;\n            select.values = [];\n            $module\n              .find('option')\n                .each(function() {\n                  var\n                    $option  = $(this),\n                    name     = $option.html(),\n                    disabled = $option.attr('disabled'),\n                    value    = ( $option.attr('value') !== undefined )\n                      ? $option.attr('value')\n                      : name\n                  ;\n                  if(settings.placeholder === 'auto' && value === '') {\n                    select.placeholder = name;\n                  }\n                  else {\n                    select.values.push({\n                      name     : name,\n                      value    : value,\n                      disabled : disabled\n                    });\n                  }\n                })\n            ;\n            if(settings.placeholder && settings.placeholder !== 'auto') {\n              module.debug('Setting placeholder value to', settings.placeholder);\n              select.placeholder = settings.placeholder;\n            }\n            if(settings.sortSelect) {\n              select.values.sort(function(a, b) {\n                return (a.name > b.name)\n                  ? 1\n                  : -1\n                ;\n              });\n              module.debug('Retrieved and sorted values from select', select);\n            }\n            else {\n              module.debug('Retrieved values from select', select);\n            }\n            return select;\n          },\n          activeItem: function() {\n            return $item.filter('.'  + className.active);\n          },\n          selectedItem: function() {\n            var\n              $selectedItem = $item.not(selector.unselectable).filter('.'  + className.selected)\n            ;\n            return ($selectedItem.length > 0)\n              ? $selectedItem\n              : $item.eq(0)\n            ;\n          },\n          itemWithAdditions: function(value) {\n            var\n              $items       = module.get.item(value),\n              $userItems   = module.create.userChoice(value),\n              hasUserItems = ($userItems && $userItems.length > 0)\n            ;\n            if(hasUserItems) {\n              $items = ($items.length > 0)\n                ? $items.add($userItems)\n                : $userItems\n              ;\n            }\n            return $items;\n          },\n          item: function(value, strict) {\n            var\n              $selectedItem = false,\n              shouldSearch,\n              isMultiple\n            ;\n            value = (value !== undefined)\n              ? value\n              : ( module.get.values() !== undefined)\n                ? module.get.values()\n                : module.get.text()\n            ;\n            shouldSearch = (isMultiple)\n              ? (value.length > 0)\n              : (value !== undefined && value !== null)\n            ;\n            isMultiple = (module.is.multiple() && $.isArray(value));\n            strict     = (value === '' || value === 0)\n              ? true\n              : strict || false\n            ;\n            if(shouldSearch) {\n              $item\n                .each(function() {\n                  var\n                    $choice       = $(this),\n                    optionText    = module.get.choiceText($choice),\n                    optionValue   = module.get.choiceValue($choice, optionText)\n                  ;\n                  // safe early exit\n                  if(optionValue === null || optionValue === undefined) {\n                    return;\n                  }\n                  if(isMultiple) {\n                    if($.inArray( String(optionValue), value) !== -1 || $.inArray(optionText, value) !== -1) {\n                      $selectedItem = ($selectedItem)\n                        ? $selectedItem.add($choice)\n                        : $choice\n                      ;\n                    }\n                  }\n                  else if(strict) {\n                    module.verbose('Ambiguous dropdown value using strict type check', $choice, value);\n                    if( optionValue === value || optionText === value) {\n                      $selectedItem = $choice;\n                      return true;\n                    }\n                  }\n                  else {\n                    if( String(optionValue) == String(value) || optionText == value) {\n                      module.verbose('Found select item by value', optionValue, value);\n                      $selectedItem = $choice;\n                      return true;\n                    }\n                  }\n                })\n              ;\n            }\n            return $selectedItem;\n          }\n        },\n\n        check: {\n          maxSelections: function(selectionCount) {\n            if(settings.maxSelections) {\n              selectionCount = (selectionCount !== undefined)\n                ? selectionCount\n                : module.get.selectionCount()\n              ;\n              if(selectionCount >= settings.maxSelections) {\n                module.debug('Maximum selection count reached');\n                if(settings.useLabels) {\n                  $item.addClass(className.filtered);\n                  module.add.message(message.maxSelections);\n                }\n                return true;\n              }\n              else {\n                module.verbose('No longer at maximum selection count');\n                module.remove.message();\n                module.remove.filteredItem();\n                if(module.is.searchSelection()) {\n                  module.filterItems();\n                }\n                return false;\n              }\n            }\n            return true;\n          }\n        },\n\n        restore: {\n          defaults: function() {\n            module.clear();\n            module.restore.defaultText();\n            module.restore.defaultValue();\n          },\n          defaultText: function() {\n            var\n              defaultText     = module.get.defaultText(),\n              placeholderText = module.get.placeholderText\n            ;\n            if(defaultText === placeholderText) {\n              module.debug('Restoring default placeholder text', defaultText);\n              module.set.placeholderText(defaultText);\n            }\n            else {\n              module.debug('Restoring default text', defaultText);\n              module.set.text(defaultText);\n            }\n          },\n          placeholderText: function() {\n            module.set.placeholderText();\n          },\n          defaultValue: function() {\n            var\n              defaultValue = module.get.defaultValue()\n            ;\n            if(defaultValue !== undefined) {\n              module.debug('Restoring default value', defaultValue);\n              if(defaultValue !== '') {\n                module.set.value(defaultValue);\n                module.set.selected();\n              }\n              else {\n                module.remove.activeItem();\n                module.remove.selectedItem();\n              }\n            }\n          },\n          labels: function() {\n            if(settings.allowAdditions) {\n              if(!settings.useLabels) {\n                module.error(error.labels);\n                settings.useLabels = true;\n              }\n              module.debug('Restoring selected values');\n              module.create.userLabels();\n            }\n            module.check.maxSelections();\n          },\n          selected: function() {\n            module.restore.values();\n            if(module.is.multiple()) {\n              module.debug('Restoring previously selected values and labels');\n              module.restore.labels();\n            }\n            else {\n              module.debug('Restoring previously selected values');\n            }\n          },\n          values: function() {\n            // prevents callbacks from occurring on initial load\n            module.set.initialLoad();\n            if(settings.apiSettings && settings.saveRemoteData && module.get.remoteValues()) {\n              module.restore.remoteValues();\n            }\n            else {\n              module.set.selected();\n            }\n            module.remove.initialLoad();\n          },\n          remoteValues: function() {\n            var\n              values = module.get.remoteValues()\n            ;\n            module.debug('Recreating selected from session data', values);\n            if(values) {\n              if( module.is.single() ) {\n                $.each(values, function(value, name) {\n                  module.set.text(name);\n                });\n              }\n              else {\n                $.each(values, function(value, name) {\n                  module.add.label(value, name);\n                });\n              }\n            }\n          }\n        },\n\n        read: {\n          remoteData: function(value) {\n            var\n              name\n            ;\n            if(window.Storage === undefined) {\n              module.error(error.noStorage);\n              return;\n            }\n            name = sessionStorage.getItem(value);\n            return (name !== undefined)\n              ? name\n              : false\n            ;\n          }\n        },\n\n        save: {\n          defaults: function() {\n            module.save.defaultText();\n            module.save.placeholderText();\n            module.save.defaultValue();\n          },\n          defaultValue: function() {\n            var\n              value = module.get.value()\n            ;\n            module.verbose('Saving default value as', value);\n            $module.data(metadata.defaultValue, value);\n          },\n          defaultText: function() {\n            var\n              text = module.get.text()\n            ;\n            module.verbose('Saving default text as', text);\n            $module.data(metadata.defaultText, text);\n          },\n          placeholderText: function() {\n            var\n              text\n            ;\n            if(settings.placeholder !== false && $text.hasClass(className.placeholder)) {\n              text = module.get.text();\n              module.verbose('Saving placeholder text as', text);\n              $module.data(metadata.placeholderText, text);\n            }\n          },\n          remoteData: function(name, value) {\n            if(window.Storage === undefined) {\n              module.error(error.noStorage);\n              return;\n            }\n            module.verbose('Saving remote data to session storage', value, name);\n            sessionStorage.setItem(value, name);\n          }\n        },\n\n        clear: function() {\n          if(module.is.multiple() && settings.useLabels) {\n            module.remove.labels();\n          }\n          else {\n            module.remove.activeItem();\n            module.remove.selectedItem();\n          }\n          module.set.placeholderText();\n          module.clearValue();\n        },\n\n        clearValue: function() {\n          module.set.value('');\n        },\n\n        scrollPage: function(direction, $selectedItem) {\n          var\n            $currentItem  = $selectedItem || module.get.selectedItem(),\n            $menu         = $currentItem.closest(selector.menu),\n            menuHeight    = $menu.outerHeight(),\n            currentScroll = $menu.scrollTop(),\n            itemHeight    = $item.eq(0).outerHeight(),\n            itemsPerPage  = Math.floor(menuHeight / itemHeight),\n            maxScroll     = $menu.prop('scrollHeight'),\n            newScroll     = (direction == 'up')\n              ? currentScroll - (itemHeight * itemsPerPage)\n              : currentScroll + (itemHeight * itemsPerPage),\n            $selectableItem = $item.not(selector.unselectable),\n            isWithinRange,\n            $nextSelectedItem,\n            elementIndex\n          ;\n          elementIndex      = (direction == 'up')\n            ? $selectableItem.index($currentItem) - itemsPerPage\n            : $selectableItem.index($currentItem) + itemsPerPage\n          ;\n          isWithinRange = (direction == 'up')\n            ? (elementIndex >= 0)\n            : (elementIndex < $selectableItem.length)\n          ;\n          $nextSelectedItem = (isWithinRange)\n            ? $selectableItem.eq(elementIndex)\n            : (direction == 'up')\n              ? $selectableItem.first()\n              : $selectableItem.last()\n          ;\n          if($nextSelectedItem.length > 0) {\n            module.debug('Scrolling page', direction, $nextSelectedItem);\n            $currentItem\n              .removeClass(className.selected)\n            ;\n            $nextSelectedItem\n              .addClass(className.selected)\n            ;\n            if(settings.selectOnKeydown && module.is.single()) {\n              module.set.selectedItem($nextSelectedItem);\n            }\n            $menu\n              .scrollTop(newScroll)\n            ;\n          }\n        },\n\n        set: {\n          filtered: function() {\n            var\n              isMultiple       = module.is.multiple(),\n              isSearch         = module.is.searchSelection(),\n              isSearchMultiple = (isMultiple && isSearch),\n              searchValue      = (isSearch)\n                ? module.get.query()\n                : '',\n              hasSearchValue   = (typeof searchValue === 'string' && searchValue.length > 0),\n              searchWidth      = module.get.searchWidth(),\n              valueIsSet       = searchValue !== ''\n            ;\n            if(isMultiple && hasSearchValue) {\n              module.verbose('Adjusting input width', searchWidth, settings.glyphWidth);\n              $search.css('width', searchWidth);\n            }\n            if(hasSearchValue || (isSearchMultiple && valueIsSet)) {\n              module.verbose('Hiding placeholder text');\n              $text.addClass(className.filtered);\n            }\n            else if(!isMultiple || (isSearchMultiple && !valueIsSet)) {\n              module.verbose('Showing placeholder text');\n              $text.removeClass(className.filtered);\n            }\n          },\n          empty: function() {\n            $module.addClass(className.empty);\n          },\n          loading: function() {\n            $module.addClass(className.loading);\n          },\n          placeholderText: function(text) {\n            text = text || module.get.placeholderText();\n            module.debug('Setting placeholder text', text);\n            module.set.text(text);\n            $text.addClass(className.placeholder);\n          },\n          tabbable: function() {\n            if( module.is.searchSelection() ) {\n              module.debug('Added tabindex to searchable dropdown');\n              $search\n                .val('')\n                .attr('tabindex', 0)\n              ;\n              $menu\n                .attr('tabindex', -1)\n              ;\n            }\n            else {\n              module.debug('Added tabindex to dropdown');\n              if( $module.attr('tabindex') === undefined) {\n                $module\n                  .attr('tabindex', 0)\n                ;\n                $menu\n                  .attr('tabindex', -1)\n                ;\n              }\n            }\n          },\n          initialLoad: function() {\n            module.verbose('Setting initial load');\n            initialLoad = true;\n          },\n          activeItem: function($item) {\n            if( settings.allowAdditions && $item.filter(selector.addition).length > 0 ) {\n              $item.addClass(className.filtered);\n            }\n            else {\n              $item.addClass(className.active);\n            }\n          },\n          partialSearch: function(text) {\n            var\n              length = module.get.query().length\n            ;\n            $search.val( text.substr(0, length));\n          },\n          scrollPosition: function($item, forceScroll) {\n            var\n              edgeTolerance = 5,\n              $menu,\n              hasActive,\n              offset,\n              itemHeight,\n              itemOffset,\n              menuOffset,\n              menuScroll,\n              menuHeight,\n              abovePage,\n              belowPage\n            ;\n\n            $item       = $item || module.get.selectedItem();\n            $menu       = $item.closest(selector.menu);\n            hasActive   = ($item && $item.length > 0);\n            forceScroll = (forceScroll !== undefined)\n              ? forceScroll\n              : false\n            ;\n            if($item && $menu.length > 0 && hasActive) {\n              itemOffset = $item.position().top;\n\n              $menu.addClass(className.loading);\n              menuScroll = $menu.scrollTop();\n              menuOffset = $menu.offset().top;\n              itemOffset = $item.offset().top;\n              offset     = menuScroll - menuOffset + itemOffset;\n              if(!forceScroll) {\n                menuHeight = $menu.height();\n                belowPage  = menuScroll + menuHeight < (offset + edgeTolerance);\n                abovePage  = ((offset - edgeTolerance) < menuScroll);\n              }\n              module.debug('Scrolling to active item', offset);\n              if(forceScroll || abovePage || belowPage) {\n                $menu.scrollTop(offset);\n              }\n              $menu.removeClass(className.loading);\n            }\n          },\n          text: function(text) {\n            if(settings.action !== 'select') {\n              if(settings.action == 'combo') {\n                module.debug('Changing combo button text', text, $combo);\n                if(settings.preserveHTML) {\n                  $combo.html(text);\n                }\n                else {\n                  $combo.text(text);\n                }\n              }\n              else {\n                if(text !== module.get.placeholderText()) {\n                  $text.removeClass(className.placeholder);\n                }\n                module.debug('Changing text', text, $text);\n                $text\n                  .removeClass(className.filtered)\n                ;\n                if(settings.preserveHTML) {\n                  $text.html(text);\n                }\n                else {\n                  $text.text(text);\n                }\n              }\n            }\n          },\n          selectedItem: function($item) {\n            var\n              value      = module.get.choiceValue($item),\n              searchText = module.get.choiceText($item, false),\n              text       = module.get.choiceText($item, true)\n            ;\n            module.debug('Setting user selection to item', $item);\n            module.remove.activeItem();\n            module.set.partialSearch(searchText);\n            module.set.activeItem($item);\n            module.set.selected(value, $item);\n            module.set.text(text);\n          },\n          selectedLetter: function(letter) {\n            var\n              $selectedItem         = $item.filter('.' + className.selected),\n              alreadySelectedLetter = $selectedItem.length > 0 && module.has.firstLetter($selectedItem, letter),\n              $nextValue            = false,\n              $nextItem\n            ;\n            // check next of same letter\n            if(alreadySelectedLetter) {\n              $nextItem = $selectedItem.nextAll($item).eq(0);\n              if( module.has.firstLetter($nextItem, letter) ) {\n                $nextValue  = $nextItem;\n              }\n            }\n            // check all values\n            if(!$nextValue) {\n              $item\n                .each(function(){\n                  if(module.has.firstLetter($(this), letter)) {\n                    $nextValue = $(this);\n                    return false;\n                  }\n                })\n              ;\n            }\n            // set next value\n            if($nextValue) {\n              module.verbose('Scrolling to next value with letter', letter);\n              module.set.scrollPosition($nextValue);\n              $selectedItem.removeClass(className.selected);\n              $nextValue.addClass(className.selected);\n              if(settings.selectOnKeydown && module.is.single()) {\n                module.set.selectedItem($nextValue);\n              }\n            }\n          },\n          direction: function($menu) {\n            if(settings.direction == 'auto') {\n              // reset position\n              module.remove.upward();\n\n              if(module.can.openDownward($menu)) {\n                module.remove.upward($menu);\n              }\n              else {\n                module.set.upward($menu);\n              }\n              if(!module.is.leftward($menu) && !module.can.openRightward($menu)) {\n                module.set.leftward($menu);\n              }\n            }\n            else if(settings.direction == 'upward') {\n              module.set.upward($menu);\n            }\n          },\n          upward: function($currentMenu) {\n            var $element = $currentMenu || $module;\n            $element.addClass(className.upward);\n          },\n          leftward: function($currentMenu) {\n            var $element = $currentMenu || $menu;\n            $element.addClass(className.leftward);\n          },\n          value: function(value, text, $selected) {\n            var\n              escapedValue = module.escape.value(value),\n              hasInput     = ($input.length > 0),\n              currentValue = module.get.values(),\n              stringValue  = (value !== undefined)\n                ? String(value)\n                : value,\n              newValue\n            ;\n            if(hasInput) {\n              if(!settings.allowReselection && stringValue == currentValue) {\n                module.verbose('Skipping value update already same value', value, currentValue);\n                if(!module.is.initialLoad()) {\n                  return;\n                }\n              }\n\n              if( module.is.single() && module.has.selectInput() && module.can.extendSelect() ) {\n                module.debug('Adding user option', value);\n                module.add.optionValue(value);\n              }\n              module.debug('Updating input value', escapedValue, currentValue);\n              internalChange = true;\n              $input\n                .val(escapedValue)\n              ;\n              if(settings.fireOnInit === false && module.is.initialLoad()) {\n                module.debug('Input native change event ignored on initial load');\n              }\n              else {\n                module.trigger.change();\n              }\n              internalChange = false;\n            }\n            else {\n              module.verbose('Storing value in metadata', escapedValue, $input);\n              if(escapedValue !== currentValue) {\n                $module.data(metadata.value, stringValue);\n              }\n            }\n            if(settings.fireOnInit === false && module.is.initialLoad()) {\n              module.verbose('No callback on initial load', settings.onChange);\n            }\n            else {\n              settings.onChange.call(element, value, text, $selected);\n            }\n          },\n          active: function() {\n            $module\n              .addClass(className.active)\n            ;\n          },\n          multiple: function() {\n            $module.addClass(className.multiple);\n          },\n          visible: function() {\n            $module.addClass(className.visible);\n          },\n          exactly: function(value, $selectedItem) {\n            module.debug('Setting selected to exact values');\n            module.clear();\n            module.set.selected(value, $selectedItem);\n          },\n          selected: function(value, $selectedItem) {\n            var\n              isMultiple = module.is.multiple(),\n              $userSelectedItem\n            ;\n            $selectedItem = (settings.allowAdditions)\n              ? $selectedItem || module.get.itemWithAdditions(value)\n              : $selectedItem || module.get.item(value)\n            ;\n            if(!$selectedItem) {\n              return;\n            }\n            module.debug('Setting selected menu item to', $selectedItem);\n            if(module.is.multiple()) {\n              module.remove.searchWidth();\n            }\n            if(module.is.single()) {\n              module.remove.activeItem();\n              module.remove.selectedItem();\n            }\n            else if(settings.useLabels) {\n              module.remove.selectedItem();\n            }\n            // select each item\n            $selectedItem\n              .each(function() {\n                var\n                  $selected      = $(this),\n                  selectedText   = module.get.choiceText($selected),\n                  selectedValue  = module.get.choiceValue($selected, selectedText),\n\n                  isFiltered     = $selected.hasClass(className.filtered),\n                  isActive       = $selected.hasClass(className.active),\n                  isUserValue    = $selected.hasClass(className.addition),\n                  shouldAnimate  = (isMultiple && $selectedItem.length == 1)\n                ;\n                if(isMultiple) {\n                  if(!isActive || isUserValue) {\n                    if(settings.apiSettings && settings.saveRemoteData) {\n                      module.save.remoteData(selectedText, selectedValue);\n                    }\n                    if(settings.useLabels) {\n                      module.add.label(selectedValue, selectedText, shouldAnimate);\n                      module.add.value(selectedValue, selectedText, $selected);\n                      module.set.activeItem($selected);\n                      module.filterActive();\n                      module.select.nextAvailable($selectedItem);\n                    }\n                    else {\n                      module.add.value(selectedValue, selectedText, $selected);\n                      module.set.text(module.add.variables(message.count));\n                      module.set.activeItem($selected);\n                    }\n                  }\n                  else if(!isFiltered) {\n                    module.debug('Selected active value, removing label');\n                    module.remove.selected(selectedValue);\n                  }\n                }\n                else {\n                  if(settings.apiSettings && settings.saveRemoteData) {\n                    module.save.remoteData(selectedText, selectedValue);\n                  }\n                  module.set.text(selectedText);\n                  module.set.value(selectedValue, selectedText, $selected);\n                  $selected\n                    .addClass(className.active)\n                    .addClass(className.selected)\n                  ;\n                }\n              })\n            ;\n          }\n        },\n\n        add: {\n          label: function(value, text, shouldAnimate) {\n            var\n              $next  = module.is.searchSelection()\n                ? $search\n                : $text,\n              escapedValue = module.escape.value(value),\n              $label\n            ;\n            if(settings.ignoreCase) {\n              escapedValue = escapedValue.toLowerCase();\n            }\n            $label =  $('<a />')\n              .addClass(className.label)\n              .attr('data-' + metadata.value, escapedValue)\n              .html(templates.label(escapedValue, text))\n            ;\n            $label = settings.onLabelCreate.call($label, escapedValue, text);\n\n            if(module.has.label(value)) {\n              module.debug('User selection already exists, skipping', escapedValue);\n              return;\n            }\n            if(settings.label.variation) {\n              $label.addClass(settings.label.variation);\n            }\n            if(shouldAnimate === true) {\n              module.debug('Animating in label', $label);\n              $label\n                .addClass(className.hidden)\n                .insertBefore($next)\n                .transition(settings.label.transition, settings.label.duration)\n              ;\n            }\n            else {\n              module.debug('Adding selection label', $label);\n              $label\n                .insertBefore($next)\n              ;\n            }\n          },\n          message: function(message) {\n            var\n              $message = $menu.children(selector.message),\n              html     = settings.templates.message(module.add.variables(message))\n            ;\n            if($message.length > 0) {\n              $message\n                .html(html)\n              ;\n            }\n            else {\n              $message = $('<div/>')\n                .html(html)\n                .addClass(className.message)\n                .appendTo($menu)\n              ;\n            }\n          },\n          optionValue: function(value) {\n            var\n              escapedValue = module.escape.value(value),\n              $option      = $input.find('option[value=\"' + module.escape.string(escapedValue) + '\"]'),\n              hasOption    = ($option.length > 0)\n            ;\n            if(hasOption) {\n              return;\n            }\n            // temporarily disconnect observer\n            module.disconnect.selectObserver();\n            if( module.is.single() ) {\n              module.verbose('Removing previous user addition');\n              $input.find('option.' + className.addition).remove();\n            }\n            $('<option/>')\n              .prop('value', escapedValue)\n              .addClass(className.addition)\n              .html(value)\n              .appendTo($input)\n            ;\n            module.verbose('Adding user addition as an <option>', value);\n            module.observe.select();\n          },\n          userSuggestion: function(value) {\n            var\n              $addition         = $menu.children(selector.addition),\n              $existingItem     = module.get.item(value),\n              alreadyHasValue   = $existingItem && $existingItem.not(selector.addition).length,\n              hasUserSuggestion = $addition.length > 0,\n              html\n            ;\n            if(settings.useLabels && module.has.maxSelections()) {\n              return;\n            }\n            if(value === '' || alreadyHasValue) {\n              $addition.remove();\n              return;\n            }\n            if(hasUserSuggestion) {\n              $addition\n                .data(metadata.value, value)\n                .data(metadata.text, value)\n                .attr('data-' + metadata.value, value)\n                .attr('data-' + metadata.text, value)\n                .removeClass(className.filtered)\n              ;\n              if(!settings.hideAdditions) {\n                html = settings.templates.addition( module.add.variables(message.addResult, value) );\n                $addition\n                  .html(html)\n                ;\n              }\n              module.verbose('Replacing user suggestion with new value', $addition);\n            }\n            else {\n              $addition = module.create.userChoice(value);\n              $addition\n                .prependTo($menu)\n              ;\n              module.verbose('Adding item choice to menu corresponding with user choice addition', $addition);\n            }\n            if(!settings.hideAdditions || module.is.allFiltered()) {\n              $addition\n                .addClass(className.selected)\n                .siblings()\n                .removeClass(className.selected)\n              ;\n            }\n            module.refreshItems();\n          },\n          variables: function(message, term) {\n            var\n              hasCount    = (message.search('{count}') !== -1),\n              hasMaxCount = (message.search('{maxCount}') !== -1),\n              hasTerm     = (message.search('{term}') !== -1),\n              values,\n              count,\n              query\n            ;\n            module.verbose('Adding templated variables to message', message);\n            if(hasCount) {\n              count  = module.get.selectionCount();\n              message = message.replace('{count}', count);\n            }\n            if(hasMaxCount) {\n              count  = module.get.selectionCount();\n              message = message.replace('{maxCount}', settings.maxSelections);\n            }\n            if(hasTerm) {\n              query   = term || module.get.query();\n              message = message.replace('{term}', query);\n            }\n            return message;\n          },\n          value: function(addedValue, addedText, $selectedItem) {\n            var\n              currentValue = module.get.values(),\n              newValue\n            ;\n            if(module.has.value(addedValue)) {\n              module.debug('Value already selected');\n              return;\n            }\n            if(addedValue === '') {\n              module.debug('Cannot select blank values from multiselect');\n              return;\n            }\n            // extend current array\n            if($.isArray(currentValue)) {\n              newValue = currentValue.concat([addedValue]);\n              newValue = module.get.uniqueArray(newValue);\n            }\n            else {\n              newValue = [addedValue];\n            }\n            // add values\n            if( module.has.selectInput() ) {\n              if(module.can.extendSelect()) {\n                module.debug('Adding value to select', addedValue, newValue, $input);\n                module.add.optionValue(addedValue);\n              }\n            }\n            else {\n              newValue = newValue.join(settings.delimiter);\n              module.debug('Setting hidden input to delimited value', newValue, $input);\n            }\n\n            if(settings.fireOnInit === false && module.is.initialLoad()) {\n              module.verbose('Skipping onadd callback on initial load', settings.onAdd);\n            }\n            else {\n              settings.onAdd.call(element, addedValue, addedText, $selectedItem);\n            }\n            module.set.value(newValue, addedValue, addedText, $selectedItem);\n            module.check.maxSelections();\n          }\n        },\n\n        remove: {\n          active: function() {\n            $module.removeClass(className.active);\n          },\n          activeLabel: function() {\n            $module.find(selector.label).removeClass(className.active);\n          },\n          empty: function() {\n            $module.removeClass(className.empty);\n          },\n          loading: function() {\n            $module.removeClass(className.loading);\n          },\n          initialLoad: function() {\n            initialLoad = false;\n          },\n          upward: function($currentMenu) {\n            var $element = $currentMenu || $module;\n            $element.removeClass(className.upward);\n          },\n          leftward: function($currentMenu) {\n            var $element = $currentMenu || $menu;\n            $element.removeClass(className.leftward);\n          },\n          visible: function() {\n            $module.removeClass(className.visible);\n          },\n          activeItem: function() {\n            $item.removeClass(className.active);\n          },\n          filteredItem: function() {\n            if(settings.useLabels && module.has.maxSelections() ) {\n              return;\n            }\n            if(settings.useLabels && module.is.multiple()) {\n              $item.not('.' + className.active).removeClass(className.filtered);\n            }\n            else {\n              $item.removeClass(className.filtered);\n            }\n            module.remove.empty();\n          },\n          optionValue: function(value) {\n            var\n              escapedValue = module.escape.value(value),\n              $option      = $input.find('option[value=\"' + module.escape.string(escapedValue) + '\"]'),\n              hasOption    = ($option.length > 0)\n            ;\n            if(!hasOption || !$option.hasClass(className.addition)) {\n              return;\n            }\n            // temporarily disconnect observer\n            if(selectObserver) {\n              selectObserver.disconnect();\n              module.verbose('Temporarily disconnecting mutation observer');\n            }\n            $option.remove();\n            module.verbose('Removing user addition as an <option>', escapedValue);\n            if(selectObserver) {\n              selectObserver.observe($input[0], {\n                childList : true,\n                subtree   : true\n              });\n            }\n          },\n          message: function() {\n            $menu.children(selector.message).remove();\n          },\n          searchWidth: function() {\n            $search.css('width', '');\n          },\n          searchTerm: function() {\n            module.verbose('Cleared search term');\n            $search.val('');\n            module.set.filtered();\n          },\n          userAddition: function() {\n            $item.filter(selector.addition).remove();\n          },\n          selected: function(value, $selectedItem) {\n            $selectedItem = (settings.allowAdditions)\n              ? $selectedItem || module.get.itemWithAdditions(value)\n              : $selectedItem || module.get.item(value)\n            ;\n\n            if(!$selectedItem) {\n              return false;\n            }\n\n            $selectedItem\n              .each(function() {\n                var\n                  $selected     = $(this),\n                  selectedText  = module.get.choiceText($selected),\n                  selectedValue = module.get.choiceValue($selected, selectedText)\n                ;\n                if(module.is.multiple()) {\n                  if(settings.useLabels) {\n                    module.remove.value(selectedValue, selectedText, $selected);\n                    module.remove.label(selectedValue);\n                  }\n                  else {\n                    module.remove.value(selectedValue, selectedText, $selected);\n                    if(module.get.selectionCount() === 0) {\n                      module.set.placeholderText();\n                    }\n                    else {\n                      module.set.text(module.add.variables(message.count));\n                    }\n                  }\n                }\n                else {\n                  module.remove.value(selectedValue, selectedText, $selected);\n                }\n                $selected\n                  .removeClass(className.filtered)\n                  .removeClass(className.active)\n                ;\n                if(settings.useLabels) {\n                  $selected.removeClass(className.selected);\n                }\n              })\n            ;\n          },\n          selectedItem: function() {\n            $item.removeClass(className.selected);\n          },\n          value: function(removedValue, removedText, $removedItem) {\n            var\n              values = module.get.values(),\n              newValue\n            ;\n            if( module.has.selectInput() ) {\n              module.verbose('Input is <select> removing selected option', removedValue);\n              newValue = module.remove.arrayValue(removedValue, values);\n              module.remove.optionValue(removedValue);\n            }\n            else {\n              module.verbose('Removing from delimited values', removedValue);\n              newValue = module.remove.arrayValue(removedValue, values);\n              newValue = newValue.join(settings.delimiter);\n            }\n            if(settings.fireOnInit === false && module.is.initialLoad()) {\n              module.verbose('No callback on initial load', settings.onRemove);\n            }\n            else {\n              settings.onRemove.call(element, removedValue, removedText, $removedItem);\n            }\n            module.set.value(newValue, removedText, $removedItem);\n            module.check.maxSelections();\n          },\n          arrayValue: function(removedValue, values) {\n            if( !$.isArray(values) ) {\n              values = [values];\n            }\n            values = $.grep(values, function(value){\n              return (removedValue != value);\n            });\n            module.verbose('Removed value from delimited string', removedValue, values);\n            return values;\n          },\n          label: function(value, shouldAnimate) {\n            var\n              $labels       = $module.find(selector.label),\n              $removedLabel = $labels.filter('[data-' + metadata.value + '=\"' + module.escape.string(value) +'\"]')\n            ;\n            module.verbose('Removing label', $removedLabel);\n            $removedLabel.remove();\n          },\n          activeLabels: function($activeLabels) {\n            $activeLabels = $activeLabels || $module.find(selector.label).filter('.' + className.active);\n            module.verbose('Removing active label selections', $activeLabels);\n            module.remove.labels($activeLabels);\n          },\n          labels: function($labels) {\n            $labels = $labels || $module.find(selector.label);\n            module.verbose('Removing labels', $labels);\n            $labels\n              .each(function(){\n                var\n                  $label      = $(this),\n                  value       = $label.data(metadata.value),\n                  stringValue = (value !== undefined)\n                    ? String(value)\n                    : value,\n                  isUserValue = module.is.userValue(stringValue)\n                ;\n                if(settings.onLabelRemove.call($label, value) === false) {\n                  module.debug('Label remove callback cancelled removal');\n                  return;\n                }\n                module.remove.message();\n                if(isUserValue) {\n                  module.remove.value(stringValue);\n                  module.remove.label(stringValue);\n                }\n                else {\n                  // selected will also remove label\n                  module.remove.selected(stringValue);\n                }\n              })\n            ;\n          },\n          tabbable: function() {\n            if( module.is.searchSelection() ) {\n              module.debug('Searchable dropdown initialized');\n              $search\n                .removeAttr('tabindex')\n              ;\n              $menu\n                .removeAttr('tabindex')\n              ;\n            }\n            else {\n              module.debug('Simple selection dropdown initialized');\n              $module\n                .removeAttr('tabindex')\n              ;\n              $menu\n                .removeAttr('tabindex')\n              ;\n            }\n          }\n        },\n\n        has: {\n          menuSearch: function() {\n            return (module.has.search() && $search.closest($menu).length > 0);\n          },\n          search: function() {\n            return ($search.length > 0);\n          },\n          sizer: function() {\n            return ($sizer.length > 0);\n          },\n          selectInput: function() {\n            return ( $input.is('select') );\n          },\n          minCharacters: function(searchTerm) {\n            if(settings.minCharacters) {\n              searchTerm = (searchTerm !== undefined)\n                ? String(searchTerm)\n                : String(module.get.query())\n              ;\n              return (searchTerm.length >= settings.minCharacters);\n            }\n            return true;\n          },\n          firstLetter: function($item, letter) {\n            var\n              text,\n              firstLetter\n            ;\n            if(!$item || $item.length === 0 || typeof letter !== 'string') {\n              return false;\n            }\n            text        = module.get.choiceText($item, false);\n            letter      = letter.toLowerCase();\n            firstLetter = String(text).charAt(0).toLowerCase();\n            return (letter == firstLetter);\n          },\n          input: function() {\n            return ($input.length > 0);\n          },\n          items: function() {\n            return ($item.length > 0);\n          },\n          menu: function() {\n            return ($menu.length > 0);\n          },\n          message: function() {\n            return ($menu.children(selector.message).length !== 0);\n          },\n          label: function(value) {\n            var\n              escapedValue = module.escape.value(value),\n              $labels      = $module.find(selector.label)\n            ;\n            if(settings.ignoreCase) {\n              escapedValue = escapedValue.toLowerCase();\n            }\n            return ($labels.filter('[data-' + metadata.value + '=\"' + module.escape.string(escapedValue) +'\"]').length > 0);\n          },\n          maxSelections: function() {\n            return (settings.maxSelections && module.get.selectionCount() >= settings.maxSelections);\n          },\n          allResultsFiltered: function() {\n            var\n              $normalResults = $item.not(selector.addition)\n            ;\n            return ($normalResults.filter(selector.unselectable).length === $normalResults.length);\n          },\n          userSuggestion: function() {\n            return ($menu.children(selector.addition).length > 0);\n          },\n          query: function() {\n            return (module.get.query() !== '');\n          },\n          value: function(value) {\n            return (settings.ignoreCase)\n              ? module.has.valueIgnoringCase(value)\n              : module.has.valueMatchingCase(value)\n            ;\n          },\n          valueMatchingCase: function(value) {\n            var\n              values   = module.get.values(),\n              hasValue = $.isArray(values)\n               ? values && ($.inArray(value, values) !== -1)\n               : (values == value)\n            ;\n            return (hasValue)\n              ? true\n              : false\n            ;\n          },\n          valueIgnoringCase: function(value) {\n            var\n              values   = module.get.values(),\n              hasValue = false\n            ;\n            if(!$.isArray(values)) {\n              values = [values];\n            }\n            $.each(values, function(index, existingValue) {\n              if(String(value).toLowerCase() == String(existingValue).toLowerCase()) {\n                hasValue = true;\n                return false;\n              }\n            });\n            return hasValue;\n          }\n        },\n\n        is: {\n          active: function() {\n            return $module.hasClass(className.active);\n          },\n          animatingInward: function() {\n            return $menu.transition('is inward');\n          },\n          animatingOutward: function() {\n            return $menu.transition('is outward');\n          },\n          bubbledLabelClick: function(event) {\n            return $(event.target).is('select, input') && $module.closest('label').length > 0;\n          },\n          bubbledIconClick: function(event) {\n            return $(event.target).closest($icon).length > 0;\n          },\n          alreadySetup: function() {\n            return ($module.is('select') && $module.parent(selector.dropdown).data(moduleNamespace) !== undefined && $module.prev().length === 0);\n          },\n          animating: function($subMenu) {\n            return ($subMenu)\n              ? $subMenu.transition && $subMenu.transition('is animating')\n              : $menu.transition    && $menu.transition('is animating')\n            ;\n          },\n          leftward: function($subMenu) {\n            var $selectedMenu = $subMenu || $menu;\n            return $selectedMenu.hasClass(className.leftward);\n          },\n          disabled: function() {\n            return $module.hasClass(className.disabled);\n          },\n          focused: function() {\n            return (document.activeElement === $module[0]);\n          },\n          focusedOnSearch: function() {\n            return (document.activeElement === $search[0]);\n          },\n          allFiltered: function() {\n            return( (module.is.multiple() || module.has.search()) && !(settings.hideAdditions == false && module.has.userSuggestion()) && !module.has.message() && module.has.allResultsFiltered() );\n          },\n          hidden: function($subMenu) {\n            return !module.is.visible($subMenu);\n          },\n          initialLoad: function() {\n            return initialLoad;\n          },\n          inObject: function(needle, object) {\n            var\n              found = false\n            ;\n            $.each(object, function(index, property) {\n              if(property == needle) {\n                found = true;\n                return true;\n              }\n            });\n            return found;\n          },\n          multiple: function() {\n            return $module.hasClass(className.multiple);\n          },\n          remote: function() {\n            return settings.apiSettings && module.can.useAPI();\n          },\n          single: function() {\n            return !module.is.multiple();\n          },\n          selectMutation: function(mutations) {\n            var\n              selectChanged = false\n            ;\n            $.each(mutations, function(index, mutation) {\n              if(mutation.target && $(mutation.target).is('select')) {\n                selectChanged = true;\n                return true;\n              }\n            });\n            return selectChanged;\n          },\n          search: function() {\n            return $module.hasClass(className.search);\n          },\n          searchSelection: function() {\n            return ( module.has.search() && $search.parent(selector.dropdown).length === 1 );\n          },\n          selection: function() {\n            return $module.hasClass(className.selection);\n          },\n          userValue: function(value) {\n            return ($.inArray(value, module.get.userValues()) !== -1);\n          },\n          upward: function($menu) {\n            var $element = $menu || $module;\n            return $element.hasClass(className.upward);\n          },\n          visible: function($subMenu) {\n            return ($subMenu)\n              ? $subMenu.hasClass(className.visible)\n              : $menu.hasClass(className.visible)\n            ;\n          },\n          verticallyScrollableContext: function() {\n            var\n              overflowY = ($context.get(0) !== window)\n                ? $context.css('overflow-y')\n                : false\n            ;\n            return (overflowY == 'auto' || overflowY == 'scroll');\n          },\n          horizontallyScrollableContext: function() {\n            var\n              overflowX = ($context.get(0) !== window)\n                ? $context.css('overflow-X')\n                : false\n            ;\n            return (overflowX == 'auto' || overflowX == 'scroll');\n          }\n        },\n\n        can: {\n          activate: function($item) {\n            if(settings.useLabels) {\n              return true;\n            }\n            if(!module.has.maxSelections()) {\n              return true;\n            }\n            if(module.has.maxSelections() && $item.hasClass(className.active)) {\n              return true;\n            }\n            return false;\n          },\n          openDownward: function($subMenu) {\n            var\n              $currentMenu    = $subMenu || $menu,\n              canOpenDownward = true,\n              onScreen        = {},\n              calculations\n            ;\n            $currentMenu\n              .addClass(className.loading)\n            ;\n            calculations = {\n              context: {\n                offset    : ($context.get(0) === window)\n                  ? { top: 0, left: 0}\n                  : $context.offset(),\n                scrollTop : $context.scrollTop(),\n                height    : $context.outerHeight()\n              },\n              menu : {\n                offset: $currentMenu.offset(),\n                height: $currentMenu.outerHeight()\n              }\n            };\n            if(module.is.verticallyScrollableContext()) {\n              calculations.menu.offset.top += calculations.context.scrollTop;\n            }\n            onScreen = {\n              above : (calculations.context.scrollTop) <= calculations.menu.offset.top - calculations.context.offset.top - calculations.menu.height,\n              below : (calculations.context.scrollTop + calculations.context.height) >= calculations.menu.offset.top - calculations.context.offset.top + calculations.menu.height\n            };\n            if(onScreen.below) {\n              module.verbose('Dropdown can fit in context downward', onScreen);\n              canOpenDownward = true;\n            }\n            else if(!onScreen.below && !onScreen.above) {\n              module.verbose('Dropdown cannot fit in either direction, favoring downward', onScreen);\n              canOpenDownward = true;\n            }\n            else {\n              module.verbose('Dropdown cannot fit below, opening upward', onScreen);\n              canOpenDownward = false;\n            }\n            $currentMenu.removeClass(className.loading);\n            return canOpenDownward;\n          },\n          openRightward: function($subMenu) {\n            var\n              $currentMenu     = $subMenu || $menu,\n              canOpenRightward = true,\n              isOffscreenRight = false,\n              calculations\n            ;\n            $currentMenu\n              .addClass(className.loading)\n            ;\n            calculations = {\n              context: {\n                offset     : ($context.get(0) === window)\n                  ? { top: 0, left: 0}\n                  : $context.offset(),\n                scrollLeft : $context.scrollLeft(),\n                width      : $context.outerWidth()\n              },\n              menu: {\n                offset : $currentMenu.offset(),\n                width  : $currentMenu.outerWidth()\n              }\n            };\n            if(module.is.horizontallyScrollableContext()) {\n              calculations.menu.offset.left += calculations.context.scrollLeft;\n            }\n            isOffscreenRight = (calculations.menu.offset.left - calculations.context.offset.left + calculations.menu.width >= calculations.context.scrollLeft + calculations.context.width);\n            if(isOffscreenRight) {\n              module.verbose('Dropdown cannot fit in context rightward', isOffscreenRight);\n              canOpenRightward = false;\n            }\n            $currentMenu.removeClass(className.loading);\n            return canOpenRightward;\n          },\n          click: function() {\n            return (hasTouch || settings.on == 'click');\n          },\n          extendSelect: function() {\n            return settings.allowAdditions || settings.apiSettings;\n          },\n          show: function() {\n            return !module.is.disabled() && (module.has.items() || module.has.message());\n          },\n          useAPI: function() {\n            return $.fn.api !== undefined;\n          }\n        },\n\n        animate: {\n          show: function(callback, $subMenu) {\n            var\n              $currentMenu = $subMenu || $menu,\n              start = ($subMenu)\n                ? function() {}\n                : function() {\n                  module.hideSubMenus();\n                  module.hideOthers();\n                  module.set.active();\n                },\n              transition\n            ;\n            callback = $.isFunction(callback)\n              ? callback\n              : function(){}\n            ;\n            module.verbose('Doing menu show animation', $currentMenu);\n            module.set.direction($subMenu);\n            transition = module.get.transition($subMenu);\n            if( module.is.selection() ) {\n              module.set.scrollPosition(module.get.selectedItem(), true);\n            }\n            if( module.is.hidden($currentMenu) || module.is.animating($currentMenu) ) {\n              if(transition == 'none') {\n                start();\n                $currentMenu.transition('show');\n                callback.call(element);\n              }\n              else if($.fn.transition !== undefined && $module.transition('is supported')) {\n                $currentMenu\n                  .transition({\n                    animation  : transition + ' in',\n                    debug      : settings.debug,\n                    verbose    : settings.verbose,\n                    duration   : settings.duration,\n                    queue      : true,\n                    onStart    : start,\n                    onComplete : function() {\n                      callback.call(element);\n                    }\n                  })\n                ;\n              }\n              else {\n                module.error(error.noTransition, transition);\n              }\n            }\n          },\n          hide: function(callback, $subMenu) {\n            var\n              $currentMenu = $subMenu || $menu,\n              duration = ($subMenu)\n                ? (settings.duration * 0.9)\n                : settings.duration,\n              start = ($subMenu)\n                ? function() {}\n                : function() {\n                  if( module.can.click() ) {\n                    module.unbind.intent();\n                  }\n                  module.remove.active();\n                },\n              transition = module.get.transition($subMenu)\n            ;\n            callback = $.isFunction(callback)\n              ? callback\n              : function(){}\n            ;\n            if( module.is.visible($currentMenu) || module.is.animating($currentMenu) ) {\n              module.verbose('Doing menu hide animation', $currentMenu);\n\n              if(transition == 'none') {\n                start();\n                $currentMenu.transition('hide');\n                callback.call(element);\n              }\n              else if($.fn.transition !== undefined && $module.transition('is supported')) {\n                $currentMenu\n                  .transition({\n                    animation  : transition + ' out',\n                    duration   : settings.duration,\n                    debug      : settings.debug,\n                    verbose    : settings.verbose,\n                    queue      : false,\n                    onStart    : start,\n                    onComplete : function() {\n                      callback.call(element);\n                    }\n                  })\n                ;\n              }\n              else {\n                module.error(error.transition);\n              }\n            }\n          }\n        },\n\n        hideAndClear: function() {\n          module.remove.searchTerm();\n          if( module.has.maxSelections() ) {\n            return;\n          }\n          if(module.has.search()) {\n            module.hide(function() {\n              module.remove.filteredItem();\n            });\n          }\n          else {\n            module.hide();\n          }\n        },\n\n        delay: {\n          show: function() {\n            module.verbose('Delaying show event to ensure user intent');\n            clearTimeout(module.timer);\n            module.timer = setTimeout(module.show, settings.delay.show);\n          },\n          hide: function() {\n            module.verbose('Delaying hide event to ensure user intent');\n            clearTimeout(module.timer);\n            module.timer = setTimeout(module.hide, settings.delay.hide);\n          }\n        },\n\n        escape: {\n          value: function(value) {\n            var\n              multipleValues = $.isArray(value),\n              stringValue    = (typeof value === 'string'),\n              isUnparsable   = (!stringValue && !multipleValues),\n              hasQuotes      = (stringValue && value.search(regExp.quote) !== -1),\n              values         = []\n            ;\n            if(isUnparsable || !hasQuotes) {\n              return value;\n            }\n            module.debug('Encoding quote values for use in select', value);\n            if(multipleValues) {\n              $.each(value, function(index, value){\n                values.push(value.replace(regExp.quote, '&quot;'));\n              });\n              return values;\n            }\n            return value.replace(regExp.quote, '&quot;');\n          },\n          string: function(text) {\n            text =  String(text);\n            return text.replace(regExp.escape, '\\\\$&');\n          }\n        },\n\n        setting: function(name, value) {\n          module.debug('Changing setting', name, value);\n          if( $.isPlainObject(name) ) {\n            $.extend(true, settings, name);\n          }\n          else if(value !== undefined) {\n            if($.isPlainObject(settings[name])) {\n              $.extend(true, settings[name], value);\n            }\n            else {\n              settings[name] = value;\n            }\n          }\n          else {\n            return settings[name];\n          }\n        },\n        internal: function(name, value) {\n          if( $.isPlainObject(name) ) {\n            $.extend(true, module, name);\n          }\n          else if(value !== undefined) {\n            module[name] = value;\n          }\n          else {\n            return module[name];\n          }\n        },\n        debug: function() {\n          if(!settings.silent && settings.debug) {\n            if(settings.performance) {\n              module.performance.log(arguments);\n            }\n            else {\n              module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');\n              module.debug.apply(console, arguments);\n            }\n          }\n        },\n        verbose: function() {\n          if(!settings.silent && settings.verbose && settings.debug) {\n            if(settings.performance) {\n              module.performance.log(arguments);\n            }\n            else {\n              module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');\n              module.verbose.apply(console, arguments);\n            }\n          }\n        },\n        error: function() {\n          if(!settings.silent) {\n            module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');\n            module.error.apply(console, arguments);\n          }\n        },\n        performance: {\n          log: function(message) {\n            var\n              currentTime,\n              executionTime,\n              previousTime\n            ;\n            if(settings.performance) {\n              currentTime   = new Date().getTime();\n              previousTime  = time || currentTime;\n              executionTime = currentTime - previousTime;\n              time          = currentTime;\n              performance.push({\n                'Name'           : message[0],\n                'Arguments'      : [].slice.call(message, 1) || '',\n                'Element'        : element,\n                'Execution Time' : executionTime\n              });\n            }\n            clearTimeout(module.performance.timer);\n            module.performance.timer = setTimeout(module.performance.display, 500);\n          },\n          display: function() {\n            var\n              title = settings.name + ':',\n              totalTime = 0\n            ;\n            time = false;\n            clearTimeout(module.performance.timer);\n            $.each(performance, function(index, data) {\n              totalTime += data['Execution Time'];\n            });\n            title += ' ' + totalTime + 'ms';\n            if(moduleSelector) {\n              title += ' \\'' + moduleSelector + '\\'';\n            }\n            if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {\n              console.groupCollapsed(title);\n              if(console.table) {\n                console.table(performance);\n              }\n              else {\n                $.each(performance, function(index, data) {\n                  console.log(data['Name'] + ': ' + data['Execution Time']+'ms');\n                });\n              }\n              console.groupEnd();\n            }\n            performance = [];\n          }\n        },\n        invoke: function(query, passedArguments, context) {\n          var\n            object = instance,\n            maxDepth,\n            found,\n            response\n          ;\n          passedArguments = passedArguments || queryArguments;\n          context         = element         || context;\n          if(typeof query == 'string' && object !== undefined) {\n            query    = query.split(/[\\. ]/);\n            maxDepth = query.length - 1;\n            $.each(query, function(depth, value) {\n              var camelCaseValue = (depth != maxDepth)\n                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)\n                : query\n              ;\n              if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {\n                object = object[camelCaseValue];\n              }\n              else if( object[camelCaseValue] !== undefined ) {\n                found = object[camelCaseValue];\n                return false;\n              }\n              else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {\n                object = object[value];\n              }\n              else if( object[value] !== undefined ) {\n                found = object[value];\n                return false;\n              }\n              else {\n                module.error(error.method, query);\n                return false;\n              }\n            });\n          }\n          if ( $.isFunction( found ) ) {\n            response = found.apply(context, passedArguments);\n          }\n          else if(found !== undefined) {\n            response = found;\n          }\n          if($.isArray(returnedValue)) {\n            returnedValue.push(response);\n          }\n          else if(returnedValue !== undefined) {\n            returnedValue = [returnedValue, response];\n          }\n          else if(response !== undefined) {\n            returnedValue = response;\n          }\n          return found;\n        }\n      };\n\n      if(methodInvoked) {\n        if(instance === undefined) {\n          module.initialize();\n        }\n        module.invoke(query);\n      }\n      else {\n        if(instance !== undefined) {\n          instance.invoke('destroy');\n        }\n        module.initialize();\n      }\n    })\n  ;\n  return (returnedValue !== undefined)\n    ? returnedValue\n    : $allModules\n  ;\n};\n\n$.fn.dropdown.settings = {\n\n  silent                 : false,\n  debug                  : false,\n  verbose                : false,\n  performance            : true,\n\n  on                     : 'click',    // what event should show menu action on item selection\n  action                 : 'activate', // action on item selection (nothing, activate, select, combo, hide, function(){})\n\n  values                 : false,      // specify values to use for dropdown\n\n  apiSettings            : false,\n  selectOnKeydown        : true,       // Whether selection should occur automatically when keyboard shortcuts used\n  minCharacters          : 0,          // Minimum characters required to trigger API call\n\n  filterRemoteData       : false,      // Whether API results should be filtered after being returned for query term\n  saveRemoteData         : true,       // Whether remote name/value pairs should be stored in sessionStorage to allow remote data to be restored on page refresh\n\n  throttle               : 200,        // How long to wait after last user input to search remotely\n\n  context                : window,     // Context to use when determining if on screen\n  direction              : 'auto',     // Whether dropdown should always open in one direction\n  keepOnScreen           : true,       // Whether dropdown should check whether it is on screen before showing\n\n  match                  : 'both',     // what to match against with search selection (both, text, or label)\n  fullTextSearch         : false,      // search anywhere in value (set to 'exact' to require exact matches)\n\n  placeholder            : 'auto',     // whether to convert blank <select> values to placeholder text\n  preserveHTML           : true,       // preserve html when selecting value\n  sortSelect             : false,      // sort selection on init\n\n  forceSelection         : true,       // force a choice on blur with search selection\n\n  allowAdditions         : false,      // whether multiple select should allow user added values\n  ignoreCase             : false,       // whether to consider values not matching in case to be the same\n  hideAdditions          : true,       // whether or not to hide special message prompting a user they can enter a value\n\n  maxSelections          : false,      // When set to a number limits the number of selections to this count\n  useLabels              : true,       // whether multiple select should filter currently active selections from choices\n  delimiter              : ',',        // when multiselect uses normal <input> the values will be delimited with this character\n\n  showOnFocus            : true,       // show menu on focus\n  allowReselection       : false,      // whether current value should trigger callbacks when reselected\n  allowTab               : true,       // add tabindex to element\n  allowCategorySelection : false,      // allow elements with sub-menus to be selected\n\n  fireOnInit             : false,      // Whether callbacks should fire when initializing dropdown values\n\n  transition             : 'auto',     // auto transition will slide down or up based on direction\n  duration               : 200,        // duration of transition\n\n  glyphWidth             : 1.037,      // widest glyph width in em (W is 1.037 em) used to calculate multiselect input width\n\n  // label settings on multi-select\n  label: {\n    transition : 'scale',\n    duration   : 200,\n    variation  : false\n  },\n\n  // delay before event\n  delay : {\n    hide   : 300,\n    show   : 200,\n    search : 20,\n    touch  : 50\n  },\n\n  /* Callbacks */\n  onChange      : function(value, text, $selected){},\n  onAdd         : function(value, text, $selected){},\n  onRemove      : function(value, text, $selected){},\n\n  onLabelSelect : function($selectedLabels){},\n  onLabelCreate : function(value, text) { return $(this); },\n  onLabelRemove : function(value) { return true; },\n  onNoResults   : function(searchTerm) { return true; },\n  onShow        : function(){},\n  onHide        : function(){},\n\n  /* Component */\n  name           : 'Dropdown',\n  namespace      : 'dropdown',\n\n  message: {\n    addResult     : 'Add <b>{term}</b>',\n    count         : '{count} selected',\n    maxSelections : 'Max {maxCount} selections',\n    noResults     : 'No results found.',\n    serverError   : 'There was an error contacting the server'\n  },\n\n  error : {\n    action          : 'You called a dropdown action that was not defined',\n    alreadySetup    : 'Once a select has been initialized behaviors must be called on the created ui dropdown',\n    labels          : 'Allowing user additions currently requires the use of labels.',\n    missingMultiple : '<select> requires multiple property to be set to correctly preserve multiple values',\n    method          : 'The method you called is not defined.',\n    noAPI           : 'The API module is required to load resources remotely',\n    noStorage       : 'Saving remote data requires session storage',\n    noTransition    : 'This module requires ui transitions <https://github.com/Semantic-Org/UI-Transition>'\n  },\n\n  regExp : {\n    escape   : /[-[\\]{}()*+?.,\\\\^$|#\\s]/g,\n    quote    : /\"/g\n  },\n\n  metadata : {\n    defaultText     : 'defaultText',\n    defaultValue    : 'defaultValue',\n    placeholderText : 'placeholder',\n    text            : 'text',\n    value           : 'value'\n  },\n\n  // property names for remote query\n  fields: {\n    remoteValues : 'results',  // grouping for api results\n    values       : 'values',   // grouping for all dropdown values\n    disabled     : 'disabled', // whether value should be disabled\n    name         : 'name',     // displayed dropdown text\n    value        : 'value',    // actual dropdown value\n    text         : 'text'      // displayed text when selected\n  },\n\n  keys : {\n    backspace  : 8,\n    delimiter  : 188, // comma\n    deleteKey  : 46,\n    enter      : 13,\n    escape     : 27,\n    pageUp     : 33,\n    pageDown   : 34,\n    leftArrow  : 37,\n    upArrow    : 38,\n    rightArrow : 39,\n    downArrow  : 40\n  },\n\n  selector : {\n    addition     : '.addition',\n    dropdown     : '.ui.dropdown',\n    hidden       : '.hidden',\n    icon         : '> .dropdown.icon',\n    input        : '> input[type=\"hidden\"], > select',\n    item         : '.item',\n    label        : '> .label',\n    remove       : '> .label > .delete.icon',\n    siblingLabel : '.label',\n    menu         : '.menu',\n    message      : '.message',\n    menuIcon     : '.dropdown.icon',\n    search       : 'input.search, .menu > .search > input, .menu input.search',\n    sizer        : '> input.sizer',\n    text         : '> .text:not(.icon)',\n    unselectable : '.disabled, .filtered'\n  },\n\n  className : {\n    active      : 'active',\n    addition    : 'addition',\n    animating   : 'animating',\n    disabled    : 'disabled',\n    empty       : 'empty',\n    dropdown    : 'ui dropdown',\n    filtered    : 'filtered',\n    hidden      : 'hidden transition',\n    item        : 'item',\n    label       : 'ui label',\n    loading     : 'loading',\n    menu        : 'menu',\n    message     : 'message',\n    multiple    : 'multiple',\n    placeholder : 'default',\n    sizer       : 'sizer',\n    search      : 'search',\n    selected    : 'selected',\n    selection   : 'selection',\n    upward      : 'upward',\n    leftward    : 'left',\n    visible     : 'visible'\n  }\n\n};\n\n/* Templates */\n$.fn.dropdown.settings.templates = {\n\n  // generates dropdown from select values\n  dropdown: function(select) {\n    var\n      placeholder = select.placeholder || false,\n      values      = select.values || {},\n      html        = ''\n    ;\n    html +=  '<i class=\"dropdown icon\"></i>';\n    if(select.placeholder) {\n      html += '<div class=\"default text\">' + placeholder + '</div>';\n    }\n    else {\n      html += '<div class=\"text\"></div>';\n    }\n    html += '<div class=\"menu\">';\n    $.each(select.values, function(index, option) {\n      html += (option.disabled)\n        ? '<div class=\"disabled item\" data-value=\"' + option.value + '\">' + option.name + '</div>'\n        : '<div class=\"item\" data-value=\"' + option.value + '\">' + option.name + '</div>'\n      ;\n    });\n    html += '</div>';\n    return html;\n  },\n\n  // generates just menu from select\n  menu: function(response, fields) {\n    var\n      values = response[fields.values] || {},\n      html   = ''\n    ;\n    $.each(values, function(index, option) {\n      var\n        maybeText = (option[fields.text])\n          ? 'data-text=\"' + option[fields.text] + '\"'\n          : '',\n        maybeDisabled = (option[fields.disabled])\n          ? 'disabled '\n          : ''\n      ;\n      html += '<div class=\"'+ maybeDisabled +'item\" data-value=\"' + option[fields.value] + '\"' + maybeText + '>';\n      html +=   option[fields.name];\n      html += '</div>';\n    });\n    return html;\n  },\n\n  // generates label for multiselect\n  label: function(value, text) {\n    return text + '<i class=\"delete icon\"></i>';\n  },\n\n\n  // generates messages like \"No results\"\n  message: function(message) {\n    return message;\n  },\n\n  // generates user addition to selection menu\n  addition: function(choice) {\n    return choice;\n  }\n\n};\n\n})( jQuery, window, document );\n"
  },
  {
    "path": "semantic/src/definitions/modules/dropdown.less",
    "content": "/*!\n * # Semantic UI - Dropdown\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n            Theme\n*******************************/\n\n@type    : 'module';\n@element : 'dropdown';\n\n@import (multiple) '../../theme.config';\n\n/*******************************\n            Dropdown\n*******************************/\n\n.ui.dropdown {\n  cursor: pointer;\n  position: relative;\n  display: inline-block;\n  outline: none;\n  text-align: left;\n  transition: @transition;\n\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\n/*******************************\n            Content\n*******************************/\n\n/*--------------\n      Menu\n---------------*/\n\n.ui.dropdown .menu {\n  cursor: auto;\n  position: absolute;\n  display: none;\n  outline: none;\n  top: 100%;\n  min-width: max-content;\n  transition: @menuTransition;\n\n  margin: @menuMargin;\n  padding: @menuPadding;\n  background: @menuBackground;\n\n  font-size: @relativeMedium;\n  text-shadow: none;\n  text-align: @menuTextAlign;\n\n  box-shadow: @menuBoxShadow;\n  border: @menuBorder;\n  border-radius: @menuBorderRadius;\n  transition: @menuTransition;\n  z-index: @menuZIndex;\n  will-change: transform, opacity;\n}\n\n.ui.dropdown .menu > * {\n  white-space: nowrap;\n}\n\n\n/*--------------\n  Hidden Input\n---------------*/\n\n.ui.dropdown > input:not(.search):first-child,\n.ui.dropdown > select {\n  display: none !important;\n}\n\n/*--------------\n Dropdown Icon\n---------------*/\n\n.ui.dropdown > .dropdown.icon {\n  position: relative;\n  width: auto;\n  font-size: @dropdownIconSize;\n  margin: @dropdownIconMargin;\n}\n.ui.dropdown .menu > .item .dropdown.icon {\n  width: auto;\n  float: @itemDropdownIconFloat;\n  margin: @itemDropdownIconMargin;\n}\n.ui.dropdown .menu > .item .dropdown.icon + .text {\n  margin-right: @itemDropdownIconDistance;\n}\n\n\n/*--------------\n      Text\n---------------*/\n\n.ui.dropdown > .text {\n  display: inline-block;\n  transition: @textTransition;\n}\n\n/*--------------\n    Menu Item\n---------------*/\n\n.ui.dropdown .menu > .item {\n  position: relative;\n  cursor: pointer;\n  display: block;\n  border: @itemBorder;\n  height: @itemHeight;\n  text-align: @itemTextAlign;\n\n  border-top: @itemDivider;\n  line-height: @itemLineHeight;\n  font-size: @itemFontSize;\n  color: @itemColor;\n\n  padding: @itemPadding !important;\n  font-size: @itemFontSize;\n  text-transform: @itemTextTransform;\n  font-weight: @itemFontWeight;\n  box-shadow: @itemBoxShadow;\n  -webkit-touch-callout: none;\n}\n.ui.dropdown .menu > .item:first-child {\n  border-top-width: 0px;\n}\n\n/*--------------\n  Floated Content\n---------------*/\n\n.ui.dropdown > .text > [class*=\"right floated\"],\n.ui.dropdown .menu .item > [class*=\"right floated\"] {\n  float: right !important;\n  margin-right: 0em !important;\n  margin-left: @floatedDistance !important;\n}\n.ui.dropdown > .text > [class*=\"left floated\"],\n.ui.dropdown .menu .item > [class*=\"left floated\"] {\n  float: left !important;\n  margin-left: 0em !important;\n  margin-right: @floatedDistance !important;\n}\n\n.ui.dropdown .menu .item > .icon.floated,\n.ui.dropdown .menu .item > .flag.floated,\n.ui.dropdown .menu .item > .image.floated,\n.ui.dropdown .menu .item > img.floated {\n  margin-top: @itemLineHeightOffset;\n}\n\n\n/*--------------\n  Menu Divider\n---------------*/\n\n.ui.dropdown .menu > .header {\n  margin: @menuHeaderMargin;\n  padding: @menuHeaderPadding;\n  color: @menuHeaderColor;\n  font-size: @menuHeaderFontSize;\n  font-weight: @menuHeaderFontWeight;\n  text-transform: @menuHeaderTextTransform;\n}\n\n.ui.dropdown .menu > .divider {\n  border-top: @menuDividerBorder;\n  height: 0em;\n  margin: @menuDividerMargin;\n}\n\n.ui.dropdown.dropdown .menu > .input {\n  width: auto;\n  display: flex;\n  margin: @menuInputMargin;\n  min-width: @menuInputMinWidth;\n}\n.ui.dropdown .menu > .header + .input {\n  margin-top: 0em;\n}\n.ui.dropdown .menu > .input:not(.transparent) input {\n  padding: @menuInputPadding;\n}\n.ui.dropdown .menu > .input:not(.transparent) .button,\n.ui.dropdown .menu > .input:not(.transparent) .icon,\n.ui.dropdown .menu > .input:not(.transparent) .label {\n  padding-top: @menuInputVerticalPadding;\n  padding-bottom: @menuInputVerticalPadding;\n}\n\n/*-----------------\n  Item Description\n-------------------*/\n\n.ui.dropdown > .text > .description,\n.ui.dropdown .menu > .item > .description {\n  float: @itemDescriptionFloat;\n  margin: @itemDescriptionMargin;\n  color: @itemDescriptionColor;\n}\n\n/*-----------------\n       Message\n-------------------*/\n\n.ui.dropdown .menu > .message {\n  padding: @messagePadding;\n  font-weight: @messageFontWeight;\n}\n.ui.dropdown .menu > .message:not(.ui) {\n  color: @messageColor;\n}\n\n/*--------------\n    Sub Menu\n---------------*/\n\n.ui.dropdown .menu .menu {\n  top: @subMenuTop !important;\n  left: @subMenuLeft;\n  right: @subMenuRight;\n  margin: @subMenuMargin !important;\n  border-radius: @subMenuBorderRadius !important;\n  z-index: @subMenuZIndex !important;\n}\n\n/* Hide Arrow */\n.ui.dropdown .menu .menu:after {\n  display: none;\n}\n\n/*--------------\n   Sub Elements\n---------------*/\n\n/* Icons / Flags / Labels / Image */\n.ui.dropdown > .text > .icon,\n.ui.dropdown > .text > .label,\n.ui.dropdown > .text > .flag,\n.ui.dropdown > .text > img,\n.ui.dropdown > .text > .image {\n  margin-top: @textLineHeightOffset;\n}\n.ui.dropdown .menu > .item > .icon,\n.ui.dropdown .menu > .item > .label,\n.ui.dropdown .menu > .item > .flag,\n.ui.dropdown .menu > .item > .image,\n.ui.dropdown .menu > .item > img  {\n  margin-top: @itemLineHeightOffset;\n}\n\n.ui.dropdown > .text > .icon,\n.ui.dropdown > .text > .label,\n.ui.dropdown > .text > .flag,\n.ui.dropdown > .text > img,\n.ui.dropdown > .text > .image,\n.ui.dropdown .menu > .item > .icon,\n.ui.dropdown .menu > .item > .label,\n.ui.dropdown .menu > .item > .flag,\n.ui.dropdown .menu > .item > .image,\n.ui.dropdown .menu > .item > img  {\n  margin-left: 0em;\n  float: @itemElementFloat;\n  margin-right: @itemElementDistance;\n}\n\n/*--------------\n     Image\n---------------*/\n\n.ui.dropdown > .text > img,\n.ui.dropdown > .text > .image,\n.ui.dropdown .menu > .item > .image,\n.ui.dropdown .menu > .item > img {\n  display: inline-block;\n  vertical-align: top;\n  width: auto;\n  margin-top: @menuImageVerticalMargin;\n  margin-bottom: @menuImageVerticalMargin;\n  max-height: @menuImageMaxHeight;\n}\n\n\n/*******************************\n            Coupling\n*******************************/\n\n\n/*--------------\n      Menu\n---------------*/\n\n/* Remove Menu Item Divider */\n.ui.dropdown .ui.menu > .item:before,\n.ui.menu .ui.dropdown .menu > .item:before {\n  display: none;\n}\n\n/* Prevent Menu Item Border */\n.ui.menu .ui.dropdown .menu .active.item {\n  border-left: none;\n}\n\n/* Automatically float dropdown menu right on last menu item */\n.ui.menu .right.menu .dropdown:last-child .menu,\n.ui.menu .right.dropdown.item .menu,\n.ui.buttons > .ui.dropdown:last-child .menu {\n  left: auto;\n  right: 0em;\n}\n\n/*--------------\n      Label\n---------------*/\n\n/* Dropdown Menu */\n.ui.label.dropdown .menu {\n  min-width: 100%;\n}\n\n/*--------------\n     Button\n---------------*/\n\n/* No Margin On Icon Button */\n.ui.dropdown.icon.button > .dropdown.icon {\n  margin: 0em;\n}\n.ui.button.dropdown .menu {\n  min-width: 100%;\n}\n\n\n\n/*******************************\n              Types\n*******************************/\n\n/*--------------\n    Selection\n---------------*/\n\n/* Displays like a select box */\n.ui.selection.dropdown {\n  cursor: pointer;\n  word-wrap: break-word;\n  line-height: 1em;\n  white-space: normal;\n  outline: 0;\n  transform: rotateZ(0deg);\n\n  min-width: @selectionMinWidth;\n  min-height: @selectionMinHeight;\n\n  background: @selectionBackground;\n  display: @selectionDisplay;\n  padding: @selectionPadding;\n  color: @selectionTextColor;\n  box-shadow: @selectionBoxShadow;\n  border: @selectionBorder;\n  border-radius: @selectionBorderRadius;\n  transition: @selectionTransition;\n}\n.ui.selection.dropdown.visible,\n.ui.selection.dropdown.active {\n  z-index: @selectionZIndex;\n}\n\nselect.ui.dropdown {\n  height: @selectHeight;\n  padding: @selectPadding;\n  border: @selectBorder;\n  visibility: @selectVisibility;\n}\n.ui.selection.dropdown > .search.icon,\n.ui.selection.dropdown > .delete.icon,\n.ui.selection.dropdown > .dropdown.icon {\n  cursor: pointer;\n  position: absolute;\n  width: auto;\n  height: auto;\n  line-height: @searchSelectionLineHeight;\n  top: @selectionVerticalPadding;\n  right: @selectionHorizontalPadding;\n  z-index: @selectionIconZIndex;\n  margin: @selectionIconMargin;\n  padding: @selectionIconPadding;\n  opacity: @selectionIconOpacity;\n  transition: @selectionIconTransition;\n}\n\n/* Compact */\n.ui.compact.selection.dropdown {\n  min-width:  0px;\n}\n\n/*  Selection Menu */\n.ui.selection.dropdown .menu {\n  overflow-x: hidden;\n  overflow-y: auto;\n  backface-visibility: hidden;\n  -webkit-overflow-scrolling: touch;\n  border-top-width: 0px !important;\n  width: auto;\n  outline: none;\n  margin: 0px -@menuBorderWidth;\n  min-width: @menuMinWidth;\n  width: @menuMinWidth;\n\n  border-radius: @selectionMenuBorderRadius;\n  box-shadow: @selectionMenuBoxShadow;\n  transition: @selectionMenuTransition;\n}\n.ui.selection.dropdown .menu:after,\n.ui.selection.dropdown .menu:before {\n  display: none;\n}\n\n/*--------------\n    Message\n---------------*/\n\n.ui.selection.dropdown .menu > .message {\n  padding: @selectionMessagePadding;\n}\n\n@media only screen and (max-width : @largestMobileScreen) {\n  .ui.selection.dropdown .menu {\n    max-height: @selectionMobileMaxMenuHeight;\n  }\n}\n@media only screen and (min-width: @tabletBreakpoint) {\n  .ui.selection.dropdown .menu {\n    max-height: @selectionTabletMaxMenuHeight;\n  }\n}\n@media only screen and (min-width: @computerBreakpoint) {\n  .ui.selection.dropdown .menu {\n    max-height: @selectionComputerMaxMenuHeight;\n  }\n}\n@media only screen and (min-width: @widescreenMonitorBreakpoint) {\n  .ui.selection.dropdown .menu {\n    max-height: @selectionWidescreenMaxMenuHeight;\n  }\n}\n\n/* Menu Item */\n.ui.selection.dropdown .menu > .item {\n  border-top: @selectionItemDivider;\n  padding: @selectionItemPadding !important;\n  white-space: normal;\n  word-wrap: normal;\n}\n\n/* User Item */\n.ui.selection.dropdown .menu > .hidden.addition.item {\n  display: none;\n}\n\n/* Hover */\n.ui.selection.dropdown:hover {\n  border-color: @selectionHoverBorderColor;\n  box-shadow: @selectionHoverBoxShadow;\n}\n\n/* Active */\n.ui.selection.active.dropdown {\n  border-color: @selectionVisibleBorderColor;\n  box-shadow: @selectionVisibleBoxShadow;\n}\n.ui.selection.active.dropdown .menu {\n  border-color: @selectionVisibleBorderColor;\n  box-shadow: @selectionVisibleMenuBoxShadow;\n}\n\n/* Focus */\n.ui.selection.dropdown:focus {\n  border-color: @selectionFocusBorderColor;\n  box-shadow: @selectionFocusBoxShadow;\n}\n.ui.selection.dropdown:focus .menu {\n  border-color: @selectionFocusBorderColor;\n  box-shadow: @selectionFocusMenuBoxShadow;\n}\n\n/* Visible */\n.ui.selection.visible.dropdown > .text:not(.default) {\n  font-weight: @selectionVisibleTextFontWeight;\n  color: @selectionVisibleTextColor;\n}\n\n/* Visible Hover */\n.ui.selection.active.dropdown:hover {\n  border-color: @selectionActiveHoverBorderColor;\n  box-shadow: @selectionActiveHoverBoxShadow;\n}\n.ui.selection.active.dropdown:hover .menu {\n  border-color: @selectionActiveHoverBorderColor;\n  box-shadow: @selectionActiveHoverMenuBoxShadow;\n}\n\n/* Dropdown Icon */\n.ui.active.selection.dropdown > .dropdown.icon,\n.ui.visible.selection.dropdown > .dropdown.icon {\n  opacity: @selectionVisibleIconOpacity;\n  z-index: 3;\n}\n\n/* Connecting Border */\n.ui.active.selection.dropdown {\n  border-bottom-left-radius: @selectionVisibleConnectingBorder !important;\n  border-bottom-right-radius: @selectionVisibleConnectingBorder !important;\n}\n\n/* Empty Connecting Border */\n.ui.active.empty.selection.dropdown {\n  border-radius: @selectionBorderRadius !important;\n  box-shadow: @selectionBoxShadow !important;\n}\n.ui.active.empty.selection.dropdown .menu {\n  border: none !important;\n  box-shadow: none !important;\n}\n\n/*--------------\n   Searchable\n---------------*/\n\n/* Search Selection */\n.ui.search.dropdown {\n  min-width: @searchMinWidth;\n}\n\n/* Search Dropdown */\n.ui.search.dropdown > input.search {\n  background: none transparent !important;\n  border: none !important;\n  box-shadow: none !important;\n  cursor: text;\n  top: 0em;\n  left: @textCursorSpacing;\n  width: 100%;\n  outline: none;\n  -webkit-tap-highlight-color: rgba(255, 255, 255, 0);\n  padding: inherit;\n}\n\n/* Text Layering */\n.ui.search.dropdown > input.search {\n  position: absolute;\n  z-index: 2;\n}\n.ui.search.dropdown > .text {\n  cursor: text;\n  position: relative;\n  left: @textCursorSpacing;\n  z-index: 3;\n}\n\n/* Search Selection */\n.ui.search.selection.dropdown > input.search {\n  line-height: @searchSelectionLineHeight;\n  padding: @searchSelectionInputPadding;\n}\n\n/* Used to size multi select input to character width */\n.ui.search.selection.dropdown > span.sizer {\n  line-height: @searchSelectionLineHeight;\n  padding: @searchSelectionInputPadding;\n  display: none;\n  white-space: pre;\n}\n\n/* Active/Visible Search */\n.ui.search.dropdown.active > input.search,\n.ui.search.dropdown.visible > input.search {\n  cursor: auto;\n}\n.ui.search.dropdown.active > .text,\n.ui.search.dropdown.visible > .text {\n  pointer-events: none;\n}\n\n/* Filtered Text */\n.ui.active.search.dropdown input.search:focus + .text .icon,\n.ui.active.search.dropdown input.search:focus + .text .flag {\n  opacity: @selectionTextUnderlayIconOpacity;\n}\n.ui.active.search.dropdown input.search:focus + .text {\n  color: @selectionTextUnderlayColor !important;\n}\n\n/* Search Menu */\n.ui.search.dropdown .menu {\n  overflow-x: hidden;\n  overflow-y: auto;\n  backface-visibility: hidden;\n  -webkit-overflow-scrolling: touch;\n}\n@media only screen and (max-width : @largestMobileScreen) {\n  .ui.search.dropdown .menu {\n    max-height: @searchMobileMaxMenuHeight;\n  }\n}\n@media only screen and (min-width: @tabletBreakpoint) {\n  .ui.search.dropdown .menu {\n    max-height: @searchTabletMaxMenuHeight;\n  }\n}\n@media only screen and (min-width: @computerBreakpoint) {\n  .ui.search.dropdown .menu {\n    max-height: @searchComputerMaxMenuHeight;\n  }\n}\n@media only screen and (min-width: @widescreenMonitorBreakpoint) {\n  .ui.search.dropdown .menu {\n    max-height: @searchWidescreenMaxMenuHeight;\n  }\n}\n\n/*--------------\n    Multiple\n---------------*/\n\n/* Multiple Selection */\n.ui.multiple.dropdown {\n  padding: @multipleSelectionPadding;\n}\n.ui.multiple.dropdown .menu {\n  cursor: auto;\n}\n\n/* Multiple Search Selection */\n.ui.multiple.search.dropdown,\n.ui.multiple.search.dropdown > input.search {\n  cursor: text;\n}\n\n/* Selection Label */\n.ui.multiple.dropdown > .label {\n  user-select: none;\n  display: inline-block;\n  vertical-align: top;\n  white-space: normal;\n  font-size: @labelSize;\n  padding: @labelPadding;\n  margin: @labelMargin;\n  box-shadow: @labelBoxShadow;\n}\n\n/* Dropdown Icon */\n.ui.multiple.dropdown .dropdown.icon {\n  margin: @multipleSelectionDropdownIconMargin;\n  padding: @multipleSelectionDropdownIconPadding;\n}\n\n/* Text */\n.ui.multiple.dropdown > .text {\n  position: static;\n  padding: 0;\n  max-width: 100%;\n  margin: @multipleSelectionChildMargin;\n  line-height: @multipleSelectionChildLineHeight;\n}\n.ui.multiple.dropdown > .label ~ input.search {\n  margin-left: @multipleSelectionSearchAfterLabelDistance !important;\n}\n.ui.multiple.dropdown > .label ~ .text {\n  display: none;\n}\n\n/*-----------------\n  Multiple Search\n-----------------*/\n\n/* Prompt Text */\n.ui.multiple.search.dropdown > .text {\n  display: inline-block;\n  position: absolute;\n  top: 0;\n  left: 0;\n  padding: inherit;\n  margin: @multipleSelectionChildMargin;\n  line-height: @multipleSelectionChildLineHeight;\n}\n\n.ui.multiple.search.dropdown > .label ~ .text {\n  display: none;\n}\n\n/* Search */\n.ui.multiple.search.dropdown > input.search {\n  position: static;\n  padding: 0;\n  max-width: 100%;\n  margin: @multipleSelectionChildMargin;\n  width: @multipleSelectionSearchStartWidth;\n  line-height: @multipleSelectionChildLineHeight;\n}\n\n\n/*--------------\n     Inline\n---------------*/\n\n.ui.inline.dropdown {\n  cursor: pointer;\n  display: inline-block;\n  color: @inlineTextColor;\n}\n.ui.inline.dropdown .dropdown.icon {\n  margin: @inlineIconMargin;\n  vertical-align: baseline;\n}\n.ui.inline.dropdown > .text {\n  font-weight: @inlineTextFontWeight;\n}\n.ui.inline.dropdown .menu {\n  cursor: auto;\n  margin-top: @inlineMenuDistance;\n  border-radius: @inlineMenuBorderRadius;\n}\n\n\n/*******************************\n            States\n*******************************/\n\n\n/*--------------------\n        Active\n----------------------*/\n\n/* Menu Item Active */\n.ui.dropdown .menu .active.item {\n  background: @activeItemBackground;\n  font-weight: @activeItemFontWeight;\n  color: @activeItemColor;\n  box-shadow: @activeItemBoxShadow;\n  z-index: @activeItemZIndex;\n}\n\n\n/*--------------------\n        Hover\n----------------------*/\n\n/* Menu Item Hover */\n.ui.dropdown .menu > .item:hover {\n  background: @hoveredItemBackground;\n  color: @hoveredItemColor;\n  z-index: @hoveredZIndex;\n}\n\n/*--------------------\n       Loading\n---------------------*/\n\n.ui.loading.dropdown > i.icon {\n  height: @relative14px !important;\n}\n.ui.loading.selection.dropdown > i.icon {\n  padding: @relative21px @relative18px !important;\n}\n.ui.loading.dropdown > i.icon:before {\n  position: absolute;\n  content: '';\n  top: 50%;\n  left: 50%;\n\n  margin: @loaderMargin;\n  width: @loaderSize;\n  height: @loaderSize;\n\n  border-radius: @circularRadius;\n  border: @loaderLineWidth solid @loaderFillColor;\n}\n.ui.loading.dropdown > i.icon:after {\n  position: absolute;\n  content: '';\n  top: 50%;\n  left: 50%;\n  box-shadow: 0px 0px 0px 1px transparent;\n\n  margin: @loaderMargin;\n  width: @loaderSize;\n  height: @loaderSize;\n\n  animation: dropdown-spin @loaderSpeed linear;\n  animation-iteration-count: infinite;\n\n  border-radius: @circularRadius;\n\n  border-color: @loaderLineColor transparent transparent;\n  border-style: solid;\n  border-width: @loaderLineWidth;\n}\n\n/* Coupling */\n.ui.loading.dropdown.button > i.icon:before,\n.ui.loading.dropdown.button > i.icon:after {\n  display: none;\n}\n\n@keyframes dropdown-spin {\n  from {\n    transform: rotate(0deg);\n  }\n  to {\n    transform: rotate(360deg);\n  }\n}\n\n\n/*--------------------\n     Default Text\n----------------------*/\n\n.ui.dropdown:not(.button) > .default.text,\n.ui.default.dropdown:not(.button) > .text {\n  color: @defaultTextColor;\n}\n.ui.dropdown:not(.button) > input:focus ~ .default.text,\n.ui.default.dropdown:not(.button) > input:focus ~ .text {\n  color: @defaultTextFocusColor;\n}\n/*--------------------\n        Loading\n----------------------*/\n\n.ui.loading.dropdown > .text {\n  transition: none;\n}\n\n/* Used To Check Position */\n.ui.dropdown .loading.menu {\n  display: block;\n  visibility: hidden;\n  z-index: @loadingZIndex;\n}\n.ui.dropdown > .loading.menu {\n  left: 0px !important;\n  right: auto !important;\n}\n.ui.dropdown > .menu .loading.menu {\n  left: 100% !important;\n  right: auto !important;\n}\n\n/*--------------------\n    Keyboard Select\n----------------------*/\n\n/* Selected Item */\n.ui.dropdown.selected,\n.ui.dropdown .menu .selected.item {\n  background: @selectedBackground;\n  color: @selectedColor;\n}\n\n\n/*--------------------\n    Search Filtered\n----------------------*/\n\n/* Filtered Item */\n.ui.dropdown > .filtered.text {\n  visibility: hidden;\n}\n.ui.dropdown .filtered.item {\n  display: none !important;\n}\n\n\n/*--------------------\n        Error\n----------------------*/\n\n.ui.dropdown.error,\n.ui.dropdown.error > .text,\n.ui.dropdown.error > .default.text {\n  color: @errorTextColor;\n}\n\n.ui.selection.dropdown.error {\n  background: @errorBackgroundColor;\n  border-color: @errorBorderColor;\n}\n.ui.selection.dropdown.error:hover {\n  border-color: @errorBorderColor;\n}\n\n.ui.dropdown.error > .menu,\n.ui.dropdown.error > .menu .menu {\n  border-color: @errorBorderColor;\n}\n.ui.dropdown.error > .menu > .item {\n  color: @errorItemTextColor;\n}\n.ui.multiple.selection.error.dropdown > .label {\n  border-color: @errorBorderColor;\n}\n\n/* Item Hover */\n.ui.dropdown.error > .menu > .item:hover {\n  background-color: @errorItemHoverBackground;\n}\n\n/* Item Active */\n.ui.dropdown.error > .menu .active.item {\n  background-color: @errorItemActiveBackground;\n}\n\n\n\n/*--------------------\n        Disabled\n----------------------*/\n\n/* Disabled */\n.ui.disabled.dropdown,\n.ui.dropdown .menu > .disabled.item {\n  cursor: default;\n  pointer-events: none;\n  opacity: @disabledOpacity;\n}\n\n\n/*******************************\n           Variations\n*******************************/\n\n/*--------------\n    Direction\n---------------*/\n\n/* Flyout Direction */\n.ui.dropdown .menu {\n  left: 0px;\n}\n\n\n/* Default Side (Right) */\n.ui.dropdown .right.menu > .menu,\n.ui.dropdown .menu .right.menu {\n  left: 100% !important;\n  right: auto !important;\n  border-radius: @subMenuBorderRadius !important;\n}\n\n/* Leftward Opening Menu */\n.ui.dropdown > .left.menu {\n  left: auto !important;\n  right: 0px !important;\n}\n\n.ui.dropdown > .left.menu .menu,\n.ui.dropdown .menu .left.menu {\n  left: auto;\n  right: 100%;\n  margin: @leftSubMenuMargin !important;\n  border-radius: @leftSubMenuBorderRadius !important;\n}\n\n.ui.dropdown .item .left.dropdown.icon,\n.ui.dropdown .left.menu .item .dropdown.icon {\n  width: auto;\n  float: @leftMenuDropdownIconFloat;\n  margin: @leftMenuDropdownIconMargin;\n}\n.ui.dropdown .item .left.dropdown.icon,\n.ui.dropdown .left.menu .item .dropdown.icon {\n  width: auto;\n  float: @leftMenuDropdownIconFloat;\n  margin: @leftMenuDropdownIconMargin;\n}\n.ui.dropdown .item .left.dropdown.icon + .text,\n.ui.dropdown .left.menu .item .dropdown.icon + .text {\n  margin-left: @itemDropdownIconDistance;\n  margin-right: 0em;\n}\n\n\n/*--------------\n     Upward\n---------------*/\n\n/* Upward Main Menu */\n.ui.upward.dropdown > .menu {\n  top: auto;\n  bottom: 100%;\n  box-shadow: @upwardMenuBoxShadow;\n  border-radius: @upwardMenuBorderRadius;\n}\n\n/* Upward Sub Menu */\n.ui.dropdown .upward.menu {\n  top: auto !important;\n  bottom: 0 !important;\n}\n\n/* Active Upward */\n.ui.simple.upward.active.dropdown,\n.ui.simple.upward.dropdown:hover {\n  border-radius: @borderRadius @borderRadius 0em 0em !important;\n}\n.ui.upward.dropdown.button:not(.pointing):not(.floating).active {\n  border-radius: @borderRadius @borderRadius 0em 0em;\n}\n\n/* Selection */\n.ui.upward.selection.dropdown .menu {\n  border-top-width: @menuBorderWidth !important;\n  border-bottom-width: 0px !important;\n  box-shadow: @upwardSelectionMenuBoxShadow;\n}\n.ui.upward.selection.dropdown:hover {\n  box-shadow: @upwardSelectionHoverBoxShadow;\n}\n\n/* Active Upward */\n.ui.active.upward.selection.dropdown {\n  border-radius: @upwardSelectionVisibleBorderRadius !important;\n}\n\n/* Visible Upward */\n.ui.upward.selection.dropdown.visible {\n  box-shadow: @upwardSelectionVisibleBoxShadow;\n  border-radius: @upwardSelectionVisibleBorderRadius !important;\n}\n\n/* Visible Hover Upward */\n.ui.upward.active.selection.dropdown:hover {\n  box-shadow: @upwardSelectionActiveHoverBoxShadow;\n}\n.ui.upward.active.selection.dropdown:hover .menu {\n  box-shadow: @upwardSelectionActiveHoverMenuBoxShadow;\n}\n\n/*--------------\n     Simple\n---------------*/\n\n/*  Selection Menu */\n.ui.scrolling.dropdown .menu,\n.ui.dropdown .scrolling.menu {\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n\n.ui.scrolling.dropdown .menu {\n  overflow-x: hidden;\n  overflow-y: auto;\n  backface-visibility: hidden;\n  -webkit-overflow-scrolling: touch;\n  min-width: 100% !important;\n  width: auto !important;\n}\n\n.ui.dropdown .scrolling.menu {\n  position: static;\n  overflow-y: auto;\n  border: none;\n  box-shadow: none !important;\n  border-radius: 0 !important;\n  margin: 0 !important;\n  min-width: 100% !important;\n  width: auto !important;\n  border-top: @menuBorder;\n}\n.ui.scrolling.dropdown .menu .item.item.item,\n.ui.dropdown .scrolling.menu > .item.item.item {\n  border-top: @scrollingMenuItemBorder;\n}\n.ui.scrolling.dropdown .menu .item:first-child,\n.ui.dropdown .scrolling.menu .item:first-child {\n  border-top: none;\n}\n.ui.dropdown > .animating.menu .scrolling.menu,\n.ui.dropdown > .visible.menu .scrolling.menu {\n  display: block;\n}\n\n/* Scrollbar in IE */\n@media all and (-ms-high-contrast:none) {\n  .ui.scrolling.dropdown .menu,\n  .ui.dropdown .scrolling.menu {\n    min-width: ~\"calc(100% - \"@scrollbarWidth~\")\";\n  }\n}\n@media only screen and (max-width : @largestMobileScreen) {\n  .ui.scrolling.dropdown .menu,\n  .ui.dropdown .scrolling.menu {\n    max-height: @scrollingMobileMaxMenuHeight;\n  }\n}\n@media only screen and (min-width: @tabletBreakpoint) {\n  .ui.scrolling.dropdown .menu,\n  .ui.dropdown .scrolling.menu {\n    max-height: @scrollingTabletMaxMenuHeight;\n  }\n}\n@media only screen and (min-width: @computerBreakpoint) {\n  .ui.scrolling.dropdown .menu,\n  .ui.dropdown .scrolling.menu {\n    max-height: @scrollingComputerMaxMenuHeight;\n  }\n}\n@media only screen and (min-width: @widescreenMonitorBreakpoint) {\n  .ui.scrolling.dropdown .menu,\n  .ui.dropdown .scrolling.menu {\n    max-height: @scrollingWidescreenMaxMenuHeight;\n  }\n}\n\n/*--------------\n     Simple\n---------------*/\n\n/* Displays without javascript */\n\n.ui.simple.dropdown .menu:before,\n.ui.simple.dropdown .menu:after {\n  display: none;\n}\n.ui.simple.dropdown .menu {\n  position: absolute;\n  display: block;\n  overflow: hidden;\n  top: -9999px !important;\n  opacity: 0;\n  width: 0;\n  height: 0;\n  transition: @simpleTransition;\n}\n\n.ui.simple.active.dropdown,\n.ui.simple.dropdown:hover {\n  border-bottom-left-radius: 0em !important;\n  border-bottom-right-radius: 0em !important;\n}\n\n.ui.simple.active.dropdown > .menu,\n.ui.simple.dropdown:hover > .menu {\n  overflow: visible;\n  width: auto;\n  height: auto;\n  top: 100% !important;\n  opacity: 1;\n}\n.ui.simple.dropdown > .menu > .item:active > .menu,\n.ui.simple.dropdown:hover > .menu > .item:hover > .menu {\n  overflow: visible;\n  width: auto;\n  height: auto;\n  top: 0% !important;\n  left: 100% !important;\n  opacity: 1;\n}\n.ui.simple.disabled.dropdown:hover .menu {\n  display: none;\n  height: 0px;\n  width: 0px;\n  overflow: hidden;\n}\n\n/* Visible */\n.ui.simple.visible.dropdown > .menu {\n  display: block;\n}\n\n/*--------------\n      Fluid\n---------------*/\n\n.ui.fluid.dropdown {\n  display: block;\n  width: 100%;\n  min-width: 0em;\n}\n.ui.fluid.dropdown > .dropdown.icon {\n  float: right;\n}\n\n\n/*--------------\n    Floating\n---------------*/\n\n.ui.floating.dropdown .menu {\n  left: 0;\n  right: auto;\n  box-shadow: @floatingMenuBoxShadow !important;\n  border-radius: @floatingMenuBorderRadius !important;\n}\n.ui.floating.dropdown > .menu {\n  margin-top: @floatingMenuDistance !important;\n  border-radius: @floatingMenuBorderRadius !important;\n}\n\n/*--------------\n     Pointing\n---------------*/\n\n.ui.pointing.dropdown > .menu {\n  top: 100%;\n  margin-top: @pointingMenuDistance;\n  border-radius: @pointingMenuBorderRadius;\n}\n\n.ui.pointing.dropdown > .menu:after {\n  display: block;\n  position: absolute;\n  pointer-events: none;\n  content: '';\n  visibility: visible;\n  transform: rotate(45deg);\n\n  width: @pointingArrowSize;\n  height: @pointingArrowSize;\n  box-shadow: @pointingArrowBoxShadow;\n  background: @pointingArrowBackground;\n  z-index: @pointingArrowZIndex;\n}\n\n.ui.pointing.dropdown > .menu:after {\n  top: @pointingArrowOffset;\n  left: 50%;\n  margin: 0em 0em 0em @pointingArrowOffset;\n}\n\n/* Top Left Pointing */\n.ui.top.left.pointing.dropdown > .menu {\n  top: 100%;\n  bottom: auto;\n  left: 0%;\n  right: auto;\n  margin: @pointingArrowDistanceFromEdge 0em 0em;\n}\n.ui.top.left.pointing.dropdown > .menu {\n  top: 100%;\n  bottom: auto;\n  left: 0%;\n  right: auto;\n  margin: @pointingArrowDistanceFromEdge 0em 0em;\n}\n.ui.top.left.pointing.dropdown > .menu:after {\n  top: @pointingArrowOffset;\n  left: @pointingArrowDistanceFromEdge;\n  right: auto;\n  margin: 0em;\n  transform: rotate(45deg);\n}\n/* Top Right Pointing */\n.ui.top.right.pointing.dropdown > .menu {\n  top: 100%;\n  bottom: auto;\n  right: 0%;\n  left: auto;\n  margin: @pointingArrowDistanceFromEdge 0em 0em;\n}\n.ui.top.pointing.dropdown > .left.menu:after,\n.ui.top.right.pointing.dropdown > .menu:after {\n  top: @pointingArrowOffset;\n  left: auto !important;\n  right: @pointingArrowDistanceFromEdge !important;\n  margin: 0em;\n  transform: rotate(45deg);\n}\n\n/* Left Pointing */\n.ui.left.pointing.dropdown > .menu {\n  top: 0%;\n  left: 100%;\n  right: auto;\n  margin: 0em 0em 0em @pointingArrowDistanceFromEdge;\n}\n.ui.left.pointing.dropdown > .menu:after {\n  top: 1em;\n  left: @pointingArrowOffset;\n  margin: 0em 0em 0em 0em;\n  transform: rotate(-45deg);\n}\n.ui.left:not(.top):not(.bottom).pointing.dropdown > .left.menu {\n  left: auto !important;\n  right: 100% !important;\n  margin: 0em @pointingArrowDistanceFromEdge 0em 0em;\n}\n.ui.left:not(.top):not(.bottom).pointing.dropdown > .left.menu:after {\n  top: 1em;\n  left: auto;\n  right: @pointingArrowOffset;\n  margin: 0em 0em 0em 0em;\n  transform: rotate(135deg);\n}\n\n\n/* Right Pointing */\n.ui.right.pointing.dropdown > .menu {\n  top: 0%;\n  left: auto;\n  right: 100%;\n  margin: 0em @pointingArrowDistanceFromEdge 0em 0em;\n}\n.ui.right.pointing.dropdown > .menu:after {\n  top: 1em;\n  left: auto;\n  right: @pointingArrowOffset;\n  margin: 0em 0em 0em 0em;\n  transform: rotate(135deg);\n}\n\n/* Bottom Pointing */\n.ui.bottom.pointing.dropdown > .menu {\n  top: auto;\n  bottom: 100%;\n  left: 0%;\n  right: auto;\n  margin: 0em 0em @pointingArrowDistanceFromEdge ;\n}\n.ui.bottom.pointing.dropdown > .menu:after {\n  top: auto;\n  bottom: @pointingArrowOffset;\n  right: auto;\n  margin: 0em;\n  transform: rotate(-135deg);\n}\n/* Reverse Sub-Menu Direction */\n.ui.bottom.pointing.dropdown > .menu .menu {\n  top: auto !important;\n  bottom: 0px !important;\n}\n\n/* Bottom Left */\n.ui.bottom.left.pointing.dropdown > .menu {\n  left: 0%;\n  right: auto;\n}\n.ui.bottom.left.pointing.dropdown > .menu:after {\n  left: @pointingArrowDistanceFromEdge;\n  right: auto;\n}\n\n/* Bottom Right */\n.ui.bottom.right.pointing.dropdown > .menu {\n  right: 0%;\n  left: auto;\n}\n.ui.bottom.right.pointing.dropdown > .menu:after {\n  left: auto;\n  right: @pointingArrowDistanceFromEdge;\n}\n\n/* Upward pointing */\n.ui.pointing.upward.dropdown .menu,\n.ui.top.pointing.upward.dropdown .menu {\n  top: auto !important;\n  bottom: 100% !important;\n  margin: 0em 0em @pointingMenuDistance;\n  border-radius: @pointingUpwardMenuBorderRadius;\n}\n.ui.pointing.upward.dropdown .menu:after,\n.ui.top.pointing.upward.dropdown .menu:after {\n  top: 100% !important;\n  bottom: auto !important;\n  box-shadow: @pointingUpwardArrowBoxShadow;\n  margin: @pointingArrowOffset 0em 0em;\n}\n\n/* Right Pointing Upward */\n.ui.right.pointing.upward.dropdown:not(.top):not(.bottom) .menu {\n  top: auto !important;\n  bottom: 0 !important;\n  margin: 0em @pointingArrowDistanceFromEdge 0em 0em;\n}\n.ui.right.pointing.upward.dropdown:not(.top):not(.bottom) .menu:after {\n  top: auto !important;\n  bottom: 0 !important;\n  margin: 0em 0em @pointingArrowDistanceFromEdge 0em;\n  box-shadow: @pointingArrowBoxShadow;\n}\n\n\n/* Left Pointing Upward */\n.ui.left.pointing.upward.dropdown:not(.top):not(.bottom) .menu {\n  top: auto !important;\n  bottom: 0 !important;\n  margin: 0em 0em 0em @pointingArrowDistanceFromEdge;\n}\n.ui.left.pointing.upward.dropdown:not(.top):not(.bottom) .menu:after {\n  top: auto !important;\n  bottom: 0 !important;\n  margin: 0em 0em @pointingArrowDistanceFromEdge 0em;\n  box-shadow: @pointingArrowBoxShadow;\n}\n\n.loadUIOverrides();\n"
  },
  {
    "path": "semantic/src/definitions/modules/embed.js",
    "content": "/*!\n * # Semantic UI - Embed\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n;(function ($, window, document, undefined) {\n\n'use strict';\n\nwindow = (typeof window != 'undefined' && window.Math == Math)\n  ? window\n  : (typeof self != 'undefined' && self.Math == Math)\n    ? self\n    : Function('return this')()\n;\n\n$.fn.embed = function(parameters) {\n\n  var\n    $allModules     = $(this),\n\n    moduleSelector  = $allModules.selector || '',\n\n    time            = new Date().getTime(),\n    performance     = [],\n\n    query           = arguments[0],\n    methodInvoked   = (typeof query == 'string'),\n    queryArguments  = [].slice.call(arguments, 1),\n\n    returnedValue\n  ;\n\n  $allModules\n    .each(function() {\n      var\n        settings        = ( $.isPlainObject(parameters) )\n          ? $.extend(true, {}, $.fn.embed.settings, parameters)\n          : $.extend({}, $.fn.embed.settings),\n\n        selector        = settings.selector,\n        className       = settings.className,\n        sources         = settings.sources,\n        error           = settings.error,\n        metadata        = settings.metadata,\n        namespace       = settings.namespace,\n        templates       = settings.templates,\n\n        eventNamespace  = '.' + namespace,\n        moduleNamespace = 'module-' + namespace,\n\n        $window         = $(window),\n        $module         = $(this),\n        $placeholder    = $module.find(selector.placeholder),\n        $icon           = $module.find(selector.icon),\n        $embed          = $module.find(selector.embed),\n\n        element         = this,\n        instance        = $module.data(moduleNamespace),\n        module\n      ;\n\n      module = {\n\n        initialize: function() {\n          module.debug('Initializing embed');\n          module.determine.autoplay();\n          module.create();\n          module.bind.events();\n          module.instantiate();\n        },\n\n        instantiate: function() {\n          module.verbose('Storing instance of module', module);\n          instance = module;\n          $module\n            .data(moduleNamespace, module)\n          ;\n        },\n\n        destroy: function() {\n          module.verbose('Destroying previous instance of embed');\n          module.reset();\n          $module\n            .removeData(moduleNamespace)\n            .off(eventNamespace)\n          ;\n        },\n\n        refresh: function() {\n          module.verbose('Refreshing selector cache');\n          $placeholder = $module.find(selector.placeholder);\n          $icon        = $module.find(selector.icon);\n          $embed       = $module.find(selector.embed);\n        },\n\n        bind: {\n          events: function() {\n            if( module.has.placeholder() ) {\n              module.debug('Adding placeholder events');\n              $module\n                .on('click' + eventNamespace, selector.placeholder, module.createAndShow)\n                .on('click' + eventNamespace, selector.icon, module.createAndShow)\n              ;\n            }\n          }\n        },\n\n        create: function() {\n          var\n            placeholder = module.get.placeholder()\n          ;\n          if(placeholder) {\n            module.createPlaceholder();\n          }\n          else {\n            module.createAndShow();\n          }\n        },\n\n        createPlaceholder: function(placeholder) {\n          var\n            icon  = module.get.icon(),\n            url   = module.get.url(),\n            embed = module.generate.embed(url)\n          ;\n          placeholder = placeholder || module.get.placeholder();\n          $module.html( templates.placeholder(placeholder, icon) );\n          module.debug('Creating placeholder for embed', placeholder, icon);\n        },\n\n        createEmbed: function(url) {\n          module.refresh();\n          url = url || module.get.url();\n          $embed = $('<div/>')\n            .addClass(className.embed)\n            .html( module.generate.embed(url) )\n            .appendTo($module)\n          ;\n          settings.onCreate.call(element, url);\n          module.debug('Creating embed object', $embed);\n        },\n\n        changeEmbed: function(url) {\n          $embed\n            .html( module.generate.embed(url) )\n          ;\n        },\n\n        createAndShow: function() {\n          module.createEmbed();\n          module.show();\n        },\n\n        // sets new embed\n        change: function(source, id, url) {\n          module.debug('Changing video to ', source, id, url);\n          $module\n            .data(metadata.source, source)\n            .data(metadata.id, id)\n          ;\n          if(url) {\n            $module.data(metadata.url, url);\n          }\n          else {\n            $module.removeData(metadata.url);\n          }\n          if(module.has.embed()) {\n            module.changeEmbed();\n          }\n          else {\n            module.create();\n          }\n        },\n\n        // clears embed\n        reset: function() {\n          module.debug('Clearing embed and showing placeholder');\n          module.remove.active();\n          module.remove.embed();\n          module.showPlaceholder();\n          settings.onReset.call(element);\n        },\n\n        // shows current embed\n        show: function() {\n          module.debug('Showing embed');\n          module.set.active();\n          settings.onDisplay.call(element);\n        },\n\n        hide: function() {\n          module.debug('Hiding embed');\n          module.showPlaceholder();\n        },\n\n        showPlaceholder: function() {\n          module.debug('Showing placeholder image');\n          module.remove.active();\n          settings.onPlaceholderDisplay.call(element);\n        },\n\n        get: {\n          id: function() {\n            return settings.id || $module.data(metadata.id);\n          },\n          placeholder: function() {\n            return settings.placeholder || $module.data(metadata.placeholder);\n          },\n          icon: function() {\n            return (settings.icon)\n              ? settings.icon\n              : ($module.data(metadata.icon) !== undefined)\n                ? $module.data(metadata.icon)\n                : module.determine.icon()\n            ;\n          },\n          source: function(url) {\n            return (settings.source)\n              ? settings.source\n              : ($module.data(metadata.source) !== undefined)\n                ? $module.data(metadata.source)\n                : module.determine.source()\n            ;\n          },\n          type: function() {\n            var source = module.get.source();\n            return (sources[source] !== undefined)\n              ? sources[source].type\n              : false\n            ;\n          },\n          url: function() {\n            return (settings.url)\n              ? settings.url\n              : ($module.data(metadata.url) !== undefined)\n                ? $module.data(metadata.url)\n                : module.determine.url()\n            ;\n          }\n        },\n\n        determine: {\n          autoplay: function() {\n            if(module.should.autoplay()) {\n              settings.autoplay = true;\n            }\n          },\n          source: function(url) {\n            var\n              matchedSource = false\n            ;\n            url = url || module.get.url();\n            if(url) {\n              $.each(sources, function(name, source) {\n                if(url.search(source.domain) !== -1) {\n                  matchedSource = name;\n                  return false;\n                }\n              });\n            }\n            return matchedSource;\n          },\n          icon: function() {\n            var\n              source = module.get.source()\n            ;\n            return (sources[source] !== undefined)\n              ? sources[source].icon\n              : false\n            ;\n          },\n          url: function() {\n            var\n              id     = settings.id     || $module.data(metadata.id),\n              source = settings.source || $module.data(metadata.source),\n              url\n            ;\n            url = (sources[source] !== undefined)\n              ? sources[source].url.replace('{id}', id)\n              : false\n            ;\n            if(url) {\n              $module.data(metadata.url, url);\n            }\n            return url;\n          }\n        },\n\n\n        set: {\n          active: function() {\n            $module.addClass(className.active);\n          }\n        },\n\n        remove: {\n          active: function() {\n            $module.removeClass(className.active);\n          },\n          embed: function() {\n            $embed.empty();\n          }\n        },\n\n        encode: {\n          parameters: function(parameters) {\n            var\n              urlString = [],\n              index\n            ;\n            for (index in parameters) {\n              urlString.push( encodeURIComponent(index) + '=' + encodeURIComponent( parameters[index] ) );\n            }\n            return urlString.join('&amp;');\n          }\n        },\n\n        generate: {\n          embed: function(url) {\n            module.debug('Generating embed html');\n            var\n              source = module.get.source(),\n              html,\n              parameters\n            ;\n            url = module.get.url(url);\n            if(url) {\n              parameters = module.generate.parameters(source);\n              html       = templates.iframe(url, parameters);\n            }\n            else {\n              module.error(error.noURL, $module);\n            }\n            return html;\n          },\n          parameters: function(source, extraParameters) {\n            var\n              parameters = (sources[source] && sources[source].parameters !== undefined)\n                ? sources[source].parameters(settings)\n                : {}\n            ;\n            extraParameters = extraParameters || settings.parameters;\n            if(extraParameters) {\n              parameters = $.extend({}, parameters, extraParameters);\n            }\n            parameters = settings.onEmbed(parameters);\n            return module.encode.parameters(parameters);\n          }\n        },\n\n        has: {\n          embed: function() {\n            return ($embed.length > 0);\n          },\n          placeholder: function() {\n            return settings.placeholder || $module.data(metadata.placeholder);\n          }\n        },\n\n        should: {\n          autoplay: function() {\n            return (settings.autoplay === 'auto')\n              ? (settings.placeholder || $module.data(metadata.placeholder) !== undefined)\n              : settings.autoplay\n            ;\n          }\n        },\n\n        is: {\n          video: function() {\n            return module.get.type() == 'video';\n          }\n        },\n\n        setting: function(name, value) {\n          module.debug('Changing setting', name, value);\n          if( $.isPlainObject(name) ) {\n            $.extend(true, settings, name);\n          }\n          else if(value !== undefined) {\n            if($.isPlainObject(settings[name])) {\n              $.extend(true, settings[name], value);\n            }\n            else {\n              settings[name] = value;\n            }\n          }\n          else {\n            return settings[name];\n          }\n        },\n        internal: function(name, value) {\n          if( $.isPlainObject(name) ) {\n            $.extend(true, module, name);\n          }\n          else if(value !== undefined) {\n            module[name] = value;\n          }\n          else {\n            return module[name];\n          }\n        },\n        debug: function() {\n          if(!settings.silent && settings.debug) {\n            if(settings.performance) {\n              module.performance.log(arguments);\n            }\n            else {\n              module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');\n              module.debug.apply(console, arguments);\n            }\n          }\n        },\n        verbose: function() {\n          if(!settings.silent && settings.verbose && settings.debug) {\n            if(settings.performance) {\n              module.performance.log(arguments);\n            }\n            else {\n              module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');\n              module.verbose.apply(console, arguments);\n            }\n          }\n        },\n        error: function() {\n          if(!settings.silent) {\n            module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');\n            module.error.apply(console, arguments);\n          }\n        },\n        performance: {\n          log: function(message) {\n            var\n              currentTime,\n              executionTime,\n              previousTime\n            ;\n            if(settings.performance) {\n              currentTime   = new Date().getTime();\n              previousTime  = time || currentTime;\n              executionTime = currentTime - previousTime;\n              time          = currentTime;\n              performance.push({\n                'Name'           : message[0],\n                'Arguments'      : [].slice.call(message, 1) || '',\n                'Element'        : element,\n                'Execution Time' : executionTime\n              });\n            }\n            clearTimeout(module.performance.timer);\n            module.performance.timer = setTimeout(module.performance.display, 500);\n          },\n          display: function() {\n            var\n              title = settings.name + ':',\n              totalTime = 0\n            ;\n            time = false;\n            clearTimeout(module.performance.timer);\n            $.each(performance, function(index, data) {\n              totalTime += data['Execution Time'];\n            });\n            title += ' ' + totalTime + 'ms';\n            if(moduleSelector) {\n              title += ' \\'' + moduleSelector + '\\'';\n            }\n            if($allModules.length > 1) {\n              title += ' ' + '(' + $allModules.length + ')';\n            }\n            if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {\n              console.groupCollapsed(title);\n              if(console.table) {\n                console.table(performance);\n              }\n              else {\n                $.each(performance, function(index, data) {\n                  console.log(data['Name'] + ': ' + data['Execution Time']+'ms');\n                });\n              }\n              console.groupEnd();\n            }\n            performance = [];\n          }\n        },\n        invoke: function(query, passedArguments, context) {\n          var\n            object = instance,\n            maxDepth,\n            found,\n            response\n          ;\n          passedArguments = passedArguments || queryArguments;\n          context         = element         || context;\n          if(typeof query == 'string' && object !== undefined) {\n            query    = query.split(/[\\. ]/);\n            maxDepth = query.length - 1;\n            $.each(query, function(depth, value) {\n              var camelCaseValue = (depth != maxDepth)\n                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)\n                : query\n              ;\n              if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {\n                object = object[camelCaseValue];\n              }\n              else if( object[camelCaseValue] !== undefined ) {\n                found = object[camelCaseValue];\n                return false;\n              }\n              else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {\n                object = object[value];\n              }\n              else if( object[value] !== undefined ) {\n                found = object[value];\n                return false;\n              }\n              else {\n                module.error(error.method, query);\n                return false;\n              }\n            });\n          }\n          if ( $.isFunction( found ) ) {\n            response = found.apply(context, passedArguments);\n          }\n          else if(found !== undefined) {\n            response = found;\n          }\n          if($.isArray(returnedValue)) {\n            returnedValue.push(response);\n          }\n          else if(returnedValue !== undefined) {\n            returnedValue = [returnedValue, response];\n          }\n          else if(response !== undefined) {\n            returnedValue = response;\n          }\n          return found;\n        }\n      };\n\n      if(methodInvoked) {\n        if(instance === undefined) {\n          module.initialize();\n        }\n        module.invoke(query);\n      }\n      else {\n        if(instance !== undefined) {\n          instance.invoke('destroy');\n        }\n        module.initialize();\n      }\n    })\n  ;\n  return (returnedValue !== undefined)\n    ? returnedValue\n    : this\n  ;\n};\n\n$.fn.embed.settings = {\n\n  name        : 'Embed',\n  namespace   : 'embed',\n\n  silent      : false,\n  debug       : false,\n  verbose     : false,\n  performance : true,\n\n  icon     : false,\n  source   : false,\n  url      : false,\n  id       : false,\n\n  // standard video settings\n  autoplay  : 'auto',\n  color     : '#444444',\n  hd        : true,\n  brandedUI : false,\n\n  // additional parameters to include with the embed\n  parameters: false,\n\n  onDisplay            : function() {},\n  onPlaceholderDisplay : function() {},\n  onReset              : function() {},\n  onCreate             : function(url) {},\n  onEmbed              : function(parameters) {\n    return parameters;\n  },\n\n  metadata    : {\n    id          : 'id',\n    icon        : 'icon',\n    placeholder : 'placeholder',\n    source      : 'source',\n    url         : 'url'\n  },\n\n  error : {\n    noURL  : 'No URL specified',\n    method : 'The method you called is not defined'\n  },\n\n  className : {\n    active : 'active',\n    embed  : 'embed'\n  },\n\n  selector : {\n    embed       : '.embed',\n    placeholder : '.placeholder',\n    icon        : '.icon'\n  },\n\n  sources: {\n    youtube: {\n      name   : 'youtube',\n      type   : 'video',\n      icon   : 'video play',\n      domain : 'youtube.com',\n      url    : '//www.youtube.com/embed/{id}',\n      parameters: function(settings) {\n        return {\n          autohide       : !settings.brandedUI,\n          autoplay       : settings.autoplay,\n          color          : settings.color || undefined,\n          hq             : settings.hd,\n          jsapi          : settings.api,\n          modestbranding : !settings.brandedUI\n        };\n      }\n    },\n    vimeo: {\n      name   : 'vimeo',\n      type   : 'video',\n      icon   : 'video play',\n      domain : 'vimeo.com',\n      url    : '//player.vimeo.com/video/{id}',\n      parameters: function(settings) {\n        return {\n          api      : settings.api,\n          autoplay : settings.autoplay,\n          byline   : settings.brandedUI,\n          color    : settings.color || undefined,\n          portrait : settings.brandedUI,\n          title    : settings.brandedUI\n        };\n      }\n    }\n  },\n\n  templates: {\n    iframe : function(url, parameters) {\n      var src = url;\n      if (parameters) {\n          src += '?' + parameters;\n      }\n      return ''\n        + '<iframe src=\"' + src + '\"'\n        + ' width=\"100%\" height=\"100%\"'\n        + ' frameborder=\"0\" scrolling=\"no\" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>'\n      ;\n    },\n    placeholder : function(image, icon) {\n      var\n        html = ''\n      ;\n      if(icon) {\n        html += '<i class=\"' + icon + ' icon\"></i>';\n      }\n      if(image) {\n        html += '<img class=\"placeholder\" src=\"' + image + '\">';\n      }\n      return html;\n    }\n  },\n\n  // NOT YET IMPLEMENTED\n  api     : false,\n  onPause : function() {},\n  onPlay  : function() {},\n  onStop  : function() {}\n\n};\n\n\n\n})( jQuery, window, document );\n"
  },
  {
    "path": "semantic/src/definitions/modules/embed.less",
    "content": "/*!\n * # Semantic UI - Video\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n            Theme\n*******************************/\n\n@type    : 'module';\n@element : 'embed';\n\n@import (multiple) '../../theme.config';\n\n/*******************************\n            Types\n*******************************/\n\n.ui.embed {\n  position: relative;\n  position: relative;\n  max-width: 100%;\n  height: 0px;\n  overflow: hidden;\n  background: @background;\n  padding-bottom: @widescreenRatio;\n}\n\n/*-----------------\n  Embedded Content\n------------------*/\n\n.ui.embed iframe,\n.ui.embed embed,\n.ui.embed object {\n  position: absolute;\n  border: none;\n  width: 100%;\n  height: 100%;\n  top: 0px;\n  left: 0px;\n  margin: 0em;\n  padding: 0em;\n}\n\n/*-----------------\n      Embed\n------------------*/\n\n.ui.embed > .embed {\n  display: none;\n}\n\n/*--------------\n   Placeholder\n---------------*/\n\n.ui.embed > .placeholder {\n  position: absolute;\n  cursor: pointer;\n  top: 0px;\n  left: 0px;\n  display: block;\n  width: 100%;\n  height: 100%;\n  background-color: @placeholderBackground;\n}\n\n/*--------------\n      Icon\n---------------*/\n\n.ui.embed > .icon {\n  cursor: pointer;\n  position: absolute;\n  top: 0px;\n  left: 0px;\n  width: 100%;\n  height: 100%;\n  z-index: 2;\n}\n.ui.embed > .icon:after {\n  position: absolute;\n  top: 0%;\n  left: 0%;\n  width: 100%;\n  height: 100%;\n  z-index: 3;\n  content: '';\n  background: @placeholderBackground;\n  opacity: @placeholderBackgroundOpacity;\n  transition: @placeholderBackgroundTransition;\n}\n.ui.embed > .icon:before {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  z-index: 4;\n  transform: translateX(-50%) translateY(-50%);\n\n  color: @iconColor;\n  font-size: @iconSize;\n  text-shadow: @iconShadow;\n  transition: @iconTransition;\n  z-index: @iconZIndex;\n}\n\n/*******************************\n            States\n*******************************/\n\n/*--------------\n     Hover\n---------------*/\n\n.ui.embed .icon:hover:after {\n  background: @hoverPlaceholderBackground;\n  opacity: @hoverPlaceholderBackgroundOpacity;\n}\n.ui.embed .icon:hover:before {\n  color: @hoverIconColor;\n}\n\n/*--------------\n     Active\n---------------*/\n\n.ui.active.embed > .icon,\n.ui.active.embed > .placeholder {\n  display: none;\n}\n.ui.active.embed > .embed {\n  display: block;\n}\n\n.loadUIOverrides();\n\n\n/*******************************\n          Variations\n*******************************/\n\n.ui.square.embed {\n  padding-bottom: @squareRatio;\n}\n.ui[class*=\"4:3\"].embed {\n  padding-bottom: @standardRatio;\n}\n.ui[class*=\"16:9\"].embed {\n  padding-bottom: @widescreenRatio;\n}\n.ui[class*=\"21:9\"].embed {\n  padding-bottom: @ultraWidescreenRatio;\n}\n\n\n\n"
  },
  {
    "path": "semantic/src/definitions/modules/modal.js",
    "content": "/*!\n * # Semantic UI - Modal\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n;(function ($, window, document, undefined) {\n\n'use strict';\n\nwindow = (typeof window != 'undefined' && window.Math == Math)\n  ? window\n  : (typeof self != 'undefined' && self.Math == Math)\n    ? self\n    : Function('return this')()\n;\n\n$.fn.modal = function(parameters) {\n  var\n    $allModules    = $(this),\n    $window        = $(window),\n    $document      = $(document),\n    $body          = $('body'),\n\n    moduleSelector = $allModules.selector || '',\n\n    time           = new Date().getTime(),\n    performance    = [],\n\n    query          = arguments[0],\n    methodInvoked  = (typeof query == 'string'),\n    queryArguments = [].slice.call(arguments, 1),\n\n    requestAnimationFrame = window.requestAnimationFrame\n      || window.mozRequestAnimationFrame\n      || window.webkitRequestAnimationFrame\n      || window.msRequestAnimationFrame\n      || function(callback) { setTimeout(callback, 0); },\n\n    returnedValue\n  ;\n\n  $allModules\n    .each(function() {\n      var\n        settings    = ( $.isPlainObject(parameters) )\n          ? $.extend(true, {}, $.fn.modal.settings, parameters)\n          : $.extend({}, $.fn.modal.settings),\n\n        selector        = settings.selector,\n        className       = settings.className,\n        namespace       = settings.namespace,\n        error           = settings.error,\n\n        eventNamespace  = '.' + namespace,\n        moduleNamespace = 'module-' + namespace,\n\n        $module         = $(this),\n        $context        = $(settings.context),\n        $close          = $module.find(selector.close),\n\n        $allModals,\n        $otherModals,\n        $focusedElement,\n        $dimmable,\n        $dimmer,\n\n        element         = this,\n        instance        = $module.data(moduleNamespace),\n\n        ignoreRepeatedEvents = false,\n\n        elementEventNamespace,\n        id,\n        observer,\n        module\n      ;\n      module  = {\n\n        initialize: function() {\n          module.verbose('Initializing dimmer', $context);\n\n          module.create.id();\n          module.create.dimmer();\n          module.refreshModals();\n\n          module.bind.events();\n          if(settings.observeChanges) {\n            module.observeChanges();\n          }\n          module.instantiate();\n        },\n\n        instantiate: function() {\n          module.verbose('Storing instance of modal');\n          instance = module;\n          $module\n            .data(moduleNamespace, instance)\n          ;\n        },\n\n        create: {\n          dimmer: function() {\n            var\n              defaultSettings = {\n                debug      : settings.debug,\n                variation  : settings.centered\n                  ? false\n                  : 'top aligned'\n                ,\n                dimmerName : 'modals'\n              },\n              dimmerSettings = $.extend(true, defaultSettings, settings.dimmerSettings)\n            ;\n            if($.fn.dimmer === undefined) {\n              module.error(error.dimmer);\n              return;\n            }\n            module.debug('Creating dimmer');\n            $dimmable = $context.dimmer(dimmerSettings);\n            if(settings.detachable) {\n              module.verbose('Modal is detachable, moving content into dimmer');\n              $dimmable.dimmer('add content', $module);\n            }\n            else {\n              module.set.undetached();\n            }\n            $dimmer = $dimmable.dimmer('get dimmer');\n          },\n          id: function() {\n            id = (Math.random().toString(16) + '000000000').substr(2,8);\n            elementEventNamespace = '.' + id;\n            module.verbose('Creating unique id for element', id);\n          }\n        },\n\n        destroy: function() {\n          module.verbose('Destroying previous modal');\n          $module\n            .removeData(moduleNamespace)\n            .off(eventNamespace)\n          ;\n          $window.off(elementEventNamespace);\n          $dimmer.off(elementEventNamespace);\n          $close.off(eventNamespace);\n          $context.dimmer('destroy');\n        },\n\n        observeChanges: function() {\n          if('MutationObserver' in window) {\n            observer = new MutationObserver(function(mutations) {\n              module.debug('DOM tree modified, refreshing');\n              module.refresh();\n            });\n            observer.observe(element, {\n              childList : true,\n              subtree   : true\n            });\n            module.debug('Setting up mutation observer', observer);\n          }\n        },\n\n        refresh: function() {\n          module.remove.scrolling();\n          module.cacheSizes();\n          module.set.screenHeight();\n          module.set.type();\n        },\n\n        refreshModals: function() {\n          $otherModals = $module.siblings(selector.modal);\n          $allModals   = $otherModals.add($module);\n        },\n\n        attachEvents: function(selector, event) {\n          var\n            $toggle = $(selector)\n          ;\n          event = $.isFunction(module[event])\n            ? module[event]\n            : module.toggle\n          ;\n          if($toggle.length > 0) {\n            module.debug('Attaching modal events to element', selector, event);\n            $toggle\n              .off(eventNamespace)\n              .on('click' + eventNamespace, event)\n            ;\n          }\n          else {\n            module.error(error.notFound, selector);\n          }\n        },\n\n        bind: {\n          events: function() {\n            module.verbose('Attaching events');\n            $module\n              .on('click' + eventNamespace, selector.close, module.event.close)\n              .on('click' + eventNamespace, selector.approve, module.event.approve)\n              .on('click' + eventNamespace, selector.deny, module.event.deny)\n            ;\n            $window\n              .on('resize' + elementEventNamespace, module.event.resize)\n            ;\n          }\n        },\n\n        get: {\n          id: function() {\n            return (Math.random().toString(16) + '000000000').substr(2,8);\n          }\n        },\n\n        event: {\n          approve: function() {\n            if(ignoreRepeatedEvents || settings.onApprove.call(element, $(this)) === false) {\n              module.verbose('Approve callback returned false cancelling hide');\n              return;\n            }\n            ignoreRepeatedEvents = true;\n            module.hide(function() {\n              ignoreRepeatedEvents = false;\n            });\n          },\n          deny: function() {\n            if(ignoreRepeatedEvents || settings.onDeny.call(element, $(this)) === false) {\n              module.verbose('Deny callback returned false cancelling hide');\n              return;\n            }\n            ignoreRepeatedEvents = true;\n            module.hide(function() {\n              ignoreRepeatedEvents = false;\n            });\n          },\n          close: function() {\n            module.hide();\n          },\n          click: function(event) {\n            if(!settings.closable) {\n              module.verbose('Dimmer clicked but closable setting is disabled');\n              return;\n            }\n            var\n              $target   = $(event.target),\n              isInModal = ($target.closest(selector.modal).length > 0),\n              isInDOM   = $.contains(document.documentElement, event.target)\n            ;\n            if(!isInModal && isInDOM && module.is.active()) {\n              module.debug('Dimmer clicked, hiding all modals');\n              module.remove.clickaway();\n              if(settings.allowMultiple) {\n                module.hide();\n              }\n              else {\n                module.hideAll();\n              }\n            }\n          },\n          debounce: function(method, delay) {\n            clearTimeout(module.timer);\n            module.timer = setTimeout(method, delay);\n          },\n          keyboard: function(event) {\n            var\n              keyCode   = event.which,\n              escapeKey = 27\n            ;\n            if(keyCode == escapeKey) {\n              if(settings.closable) {\n                module.debug('Escape key pressed hiding modal');\n                module.hide();\n              }\n              else {\n                module.debug('Escape key pressed, but closable is set to false');\n              }\n              event.preventDefault();\n            }\n          },\n          resize: function() {\n            if( $dimmable.dimmer('is active') && ( module.is.animating() || module.is.active() ) ) {\n              requestAnimationFrame(module.refresh);\n            }\n          }\n        },\n\n        toggle: function() {\n          if( module.is.active() || module.is.animating() ) {\n            module.hide();\n          }\n          else {\n            module.show();\n          }\n        },\n\n        show: function(callback) {\n          callback = $.isFunction(callback)\n            ? callback\n            : function(){}\n          ;\n          module.refreshModals();\n          module.set.dimmerSettings();\n          module.showModal(callback);\n        },\n\n        hide: function(callback) {\n          callback = $.isFunction(callback)\n            ? callback\n            : function(){}\n          ;\n          module.refreshModals();\n          module.hideModal(callback);\n        },\n\n        showModal: function(callback) {\n          callback = $.isFunction(callback)\n            ? callback\n            : function(){}\n          ;\n          if( module.is.animating() || !module.is.active() ) {\n\n            module.showDimmer();\n            module.cacheSizes();\n            module.set.screenHeight();\n            module.set.type();\n            module.set.clickaway();\n\n            if( !settings.allowMultiple && module.others.active() ) {\n              module.hideOthers(module.showModal);\n            }\n            else {\n              if(settings.allowMultiple && settings.detachable) {\n                $module.detach().appendTo($dimmer);\n              }\n              settings.onShow.call(element);\n              if(settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) {\n                module.debug('Showing modal with css animations');\n                $module\n                  .transition({\n                    debug       : settings.debug,\n                    animation   : settings.transition + ' in',\n                    queue       : settings.queue,\n                    duration    : settings.duration,\n                    useFailSafe : true,\n                    onComplete : function() {\n                      settings.onVisible.apply(element);\n                      if(settings.keyboardShortcuts) {\n                        module.add.keyboardShortcuts();\n                      }\n                      module.save.focus();\n                      module.set.active();\n                      if(settings.autofocus) {\n                        module.set.autofocus();\n                      }\n                      callback();\n                    }\n                  })\n                ;\n              }\n              else {\n                module.error(error.noTransition);\n              }\n            }\n          }\n          else {\n            module.debug('Modal is already visible');\n          }\n        },\n\n        hideModal: function(callback, keepDimmed) {\n          callback = $.isFunction(callback)\n            ? callback\n            : function(){}\n          ;\n          module.debug('Hiding modal');\n          if(settings.onHide.call(element, $(this)) === false) {\n            module.verbose('Hide callback returned false cancelling hide');\n            return;\n          }\n\n          if( module.is.animating() || module.is.active() ) {\n            if(settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) {\n              module.remove.active();\n              $module\n                .transition({\n                  debug       : settings.debug,\n                  animation   : settings.transition + ' out',\n                  queue       : settings.queue,\n                  duration    : settings.duration,\n                  useFailSafe : true,\n                  onStart     : function() {\n                    if(!module.others.active() && !keepDimmed) {\n                      module.hideDimmer();\n                    }\n                    if(settings.keyboardShortcuts) {\n                      module.remove.keyboardShortcuts();\n                    }\n                  },\n                  onComplete : function() {\n                    settings.onHidden.call(element);\n                    module.restore.focus();\n                    callback();\n                  }\n                })\n              ;\n            }\n            else {\n              module.error(error.noTransition);\n            }\n          }\n        },\n\n        showDimmer: function() {\n          if($dimmable.dimmer('is animating') || !$dimmable.dimmer('is active') ) {\n            module.debug('Showing dimmer');\n            $dimmable.dimmer('show');\n          }\n          else {\n            module.debug('Dimmer already visible');\n          }\n        },\n\n        hideDimmer: function() {\n          if( $dimmable.dimmer('is animating') || ($dimmable.dimmer('is active')) ) {\n            $dimmable.dimmer('hide', function() {\n              module.remove.clickaway();\n              module.remove.screenHeight();\n            });\n          }\n          else {\n            module.debug('Dimmer is not visible cannot hide');\n            return;\n          }\n        },\n\n        hideAll: function(callback) {\n          var\n            $visibleModals = $allModals.filter('.' + className.active + ', .' + className.animating)\n          ;\n          callback = $.isFunction(callback)\n            ? callback\n            : function(){}\n          ;\n          if( $visibleModals.length > 0 ) {\n            module.debug('Hiding all visible modals');\n            module.hideDimmer();\n            $visibleModals\n              .modal('hide modal', callback)\n            ;\n          }\n        },\n\n        hideOthers: function(callback) {\n          var\n            $visibleModals = $otherModals.filter('.' + className.active + ', .' + className.animating)\n          ;\n          callback = $.isFunction(callback)\n            ? callback\n            : function(){}\n          ;\n          if( $visibleModals.length > 0 ) {\n            module.debug('Hiding other modals', $otherModals);\n            $visibleModals\n              .modal('hide modal', callback, true)\n            ;\n          }\n        },\n\n        others: {\n          active: function() {\n            return ($otherModals.filter('.' + className.active).length > 0);\n          },\n          animating: function() {\n            return ($otherModals.filter('.' + className.animating).length > 0);\n          }\n        },\n\n\n        add: {\n          keyboardShortcuts: function() {\n            module.verbose('Adding keyboard shortcuts');\n            $document\n              .on('keyup' + eventNamespace, module.event.keyboard)\n            ;\n          }\n        },\n\n        save: {\n          focus: function() {\n            var\n              $activeElement = $(document.activeElement),\n              inCurrentModal = $activeElement.closest($module).length > 0\n            ;\n            if(!inCurrentModal) {\n              $focusedElement = $(document.activeElement).blur();\n            }\n          }\n        },\n\n        restore: {\n          focus: function() {\n            if($focusedElement && $focusedElement.length > 0) {\n              $focusedElement.focus();\n            }\n          }\n        },\n\n        remove: {\n          active: function() {\n            $module.removeClass(className.active);\n          },\n          clickaway: function() {\n            $dimmer\n              .off('click' + elementEventNamespace)\n            ;\n          },\n          bodyStyle: function() {\n            if($body.attr('style') === '') {\n              module.verbose('Removing style attribute');\n              $body.removeAttr('style');\n            }\n          },\n          screenHeight: function() {\n            module.debug('Removing page height');\n            $body\n              .css('height', '')\n            ;\n          },\n          keyboardShortcuts: function() {\n            module.verbose('Removing keyboard shortcuts');\n            $document\n              .off('keyup' + eventNamespace)\n            ;\n          },\n          scrolling: function() {\n            $dimmable.removeClass(className.scrolling);\n            $module.removeClass(className.scrolling);\n          }\n        },\n\n        cacheSizes: function() {\n          $module.addClass(className.loading);\n          var\n            scrollHeight = $module.prop('scrollHeight'),\n            modalHeight  = $module.outerHeight()\n          ;\n          if(module.cache === undefined || modalHeight !== 0) {\n            module.cache = {\n              pageHeight    : $(document).outerHeight(),\n              height        : modalHeight + settings.offset,\n              scrollHeight  : scrollHeight + settings.offset,\n              contextHeight : (settings.context == 'body')\n                ? $(window).height()\n                : $dimmable.height(),\n            };\n            module.cache.topOffset = -(module.cache.height / 2);\n          }\n          $module.removeClass(className.loading);\n          module.debug('Caching modal and container sizes', module.cache);\n        },\n\n        can: {\n          fit: function() {\n            var\n              contextHeight  = module.cache.contextHeight,\n              verticalCenter = module.cache.contextHeight / 2,\n              topOffset      = module.cache.topOffset,\n              scrollHeight   = module.cache.scrollHeight,\n              height         = module.cache.height,\n              paddingHeight  = settings.padding,\n              startPosition  = (verticalCenter + topOffset)\n            ;\n            return (scrollHeight > height)\n              ? (startPosition + scrollHeight + paddingHeight < contextHeight)\n              : (height + (paddingHeight * 2) < contextHeight)\n            ;\n          }\n        },\n\n        is: {\n          active: function() {\n            return $module.hasClass(className.active);\n          },\n          animating: function() {\n            return $module.transition('is supported')\n              ? $module.transition('is animating')\n              : $module.is(':visible')\n            ;\n          },\n          scrolling: function() {\n            return $dimmable.hasClass(className.scrolling);\n          },\n          modernBrowser: function() {\n            // appName for IE11 reports 'Netscape' can no longer use\n            return !(window.ActiveXObject || \"ActiveXObject\" in window);\n          }\n        },\n\n        set: {\n          autofocus: function() {\n            var\n              $inputs    = $module.find('[tabindex], :input').filter(':visible'),\n              $autofocus = $inputs.filter('[autofocus]'),\n              $input     = ($autofocus.length > 0)\n                ? $autofocus.first()\n                : $inputs.first()\n            ;\n            if($input.length > 0) {\n              $input.focus();\n            }\n          },\n          clickaway: function() {\n            $dimmer\n              .on('click' + elementEventNamespace, module.event.click)\n            ;\n          },\n          dimmerSettings: function() {\n            if($.fn.dimmer === undefined) {\n              module.error(error.dimmer);\n              return;\n            }\n            var\n              defaultSettings = {\n                debug      : settings.debug,\n                dimmerName : 'modals',\n                closable   : 'auto',\n                variation  : settings.centered\n                  ? false\n                  : 'top aligned'\n                ,\n                duration   : {\n                  show     : settings.duration,\n                  hide     : settings.duration\n                }\n              },\n              dimmerSettings = $.extend(true, defaultSettings, settings.dimmerSettings)\n            ;\n            if(settings.inverted) {\n              dimmerSettings.variation = (dimmerSettings.variation !== undefined)\n                ? dimmerSettings.variation + ' inverted'\n                : 'inverted'\n              ;\n              $dimmer.addClass(className.inverted);\n            }\n            else {\n              $dimmer.removeClass(className.inverted);\n            }\n            if(settings.blurring) {\n              $dimmable.addClass(className.blurring);\n            }\n            else {\n              $dimmable.removeClass(className.blurring);\n            }\n            $context.dimmer('setting', dimmerSettings);\n          },\n          screenHeight: function() {\n            if( module.can.fit() ) {\n              $body.css('height', '');\n            }\n            else {\n              module.debug('Modal is taller than page content, resizing page height');\n              $body\n                .css('height', module.cache.height + (settings.padding * 2) )\n              ;\n            }\n          },\n          active: function() {\n            $module.addClass(className.active);\n          },\n          scrolling: function() {\n            $dimmable.addClass(className.scrolling);\n            $module.addClass(className.scrolling);\n          },\n          type: function() {\n            if(module.can.fit()) {\n              module.verbose('Modal fits on screen');\n              if(!module.others.active() && !module.others.animating()) {\n                module.remove.scrolling();\n              }\n            }\n            else {\n              module.verbose('Modal cannot fit on screen setting to scrolling');\n              module.set.scrolling();\n            }\n          },\n          undetached: function() {\n            $dimmable.addClass(className.undetached);\n          }\n        },\n\n        setting: function(name, value) {\n          module.debug('Changing setting', name, value);\n          if( $.isPlainObject(name) ) {\n            $.extend(true, settings, name);\n          }\n          else if(value !== undefined) {\n            if($.isPlainObject(settings[name])) {\n              $.extend(true, settings[name], value);\n            }\n            else {\n              settings[name] = value;\n            }\n          }\n          else {\n            return settings[name];\n          }\n        },\n        internal: function(name, value) {\n          if( $.isPlainObject(name) ) {\n            $.extend(true, module, name);\n          }\n          else if(value !== undefined) {\n            module[name] = value;\n          }\n          else {\n            return module[name];\n          }\n        },\n        debug: function() {\n          if(!settings.silent && settings.debug) {\n            if(settings.performance) {\n              module.performance.log(arguments);\n            }\n            else {\n              module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');\n              module.debug.apply(console, arguments);\n            }\n          }\n        },\n        verbose: function() {\n          if(!settings.silent && settings.verbose && settings.debug) {\n            if(settings.performance) {\n              module.performance.log(arguments);\n            }\n            else {\n              module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');\n              module.verbose.apply(console, arguments);\n            }\n          }\n        },\n        error: function() {\n          if(!settings.silent) {\n            module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');\n            module.error.apply(console, arguments);\n          }\n        },\n        performance: {\n          log: function(message) {\n            var\n              currentTime,\n              executionTime,\n              previousTime\n            ;\n            if(settings.performance) {\n              currentTime   = new Date().getTime();\n              previousTime  = time || currentTime;\n              executionTime = currentTime - previousTime;\n              time          = currentTime;\n              performance.push({\n                'Name'           : message[0],\n                'Arguments'      : [].slice.call(message, 1) || '',\n                'Element'        : element,\n                'Execution Time' : executionTime\n              });\n            }\n            clearTimeout(module.performance.timer);\n            module.performance.timer = setTimeout(module.performance.display, 500);\n          },\n          display: function() {\n            var\n              title = settings.name + ':',\n              totalTime = 0\n            ;\n            time = false;\n            clearTimeout(module.performance.timer);\n            $.each(performance, function(index, data) {\n              totalTime += data['Execution Time'];\n            });\n            title += ' ' + totalTime + 'ms';\n            if(moduleSelector) {\n              title += ' \\'' + moduleSelector + '\\'';\n            }\n            if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {\n              console.groupCollapsed(title);\n              if(console.table) {\n                console.table(performance);\n              }\n              else {\n                $.each(performance, function(index, data) {\n                  console.log(data['Name'] + ': ' + data['Execution Time']+'ms');\n                });\n              }\n              console.groupEnd();\n            }\n            performance = [];\n          }\n        },\n        invoke: function(query, passedArguments, context) {\n          var\n            object = instance,\n            maxDepth,\n            found,\n            response\n          ;\n          passedArguments = passedArguments || queryArguments;\n          context         = element         || context;\n          if(typeof query == 'string' && object !== undefined) {\n            query    = query.split(/[\\. ]/);\n            maxDepth = query.length - 1;\n            $.each(query, function(depth, value) {\n              var camelCaseValue = (depth != maxDepth)\n                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)\n                : query\n              ;\n              if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {\n                object = object[camelCaseValue];\n              }\n              else if( object[camelCaseValue] !== undefined ) {\n                found = object[camelCaseValue];\n                return false;\n              }\n              else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {\n                object = object[value];\n              }\n              else if( object[value] !== undefined ) {\n                found = object[value];\n                return false;\n              }\n              else {\n                return false;\n              }\n            });\n          }\n          if ( $.isFunction( found ) ) {\n            response = found.apply(context, passedArguments);\n          }\n          else if(found !== undefined) {\n            response = found;\n          }\n          if($.isArray(returnedValue)) {\n            returnedValue.push(response);\n          }\n          else if(returnedValue !== undefined) {\n            returnedValue = [returnedValue, response];\n          }\n          else if(response !== undefined) {\n            returnedValue = response;\n          }\n          return found;\n        }\n      };\n\n      if(methodInvoked) {\n        if(instance === undefined) {\n          module.initialize();\n        }\n        module.invoke(query);\n      }\n      else {\n        if(instance !== undefined) {\n          instance.invoke('destroy');\n        }\n        module.initialize();\n      }\n    })\n  ;\n\n  return (returnedValue !== undefined)\n    ? returnedValue\n    : this\n  ;\n};\n\n$.fn.modal.settings = {\n\n  name           : 'Modal',\n  namespace      : 'modal',\n\n  silent         : false,\n  debug          : false,\n  verbose        : false,\n  performance    : true,\n\n  observeChanges : false,\n\n  allowMultiple  : false,\n  detachable     : true,\n  closable       : true,\n  autofocus      : true,\n\n  inverted       : false,\n  blurring       : false,\n\n  centered       : true,\n\n  dimmerSettings : {\n    closable : false,\n    useCSS   : true\n  },\n\n  // whether to use keyboard shortcuts\n  keyboardShortcuts: true,\n\n  context    : 'body',\n\n  queue      : false,\n  duration   : 500,\n  offset     : 0,\n  transition : 'scale',\n\n  // padding with edge of page\n  padding    : 50,\n\n  // called before show animation\n  onShow     : function(){},\n\n  // called after show animation\n  onVisible  : function(){},\n\n  // called before hide animation\n  onHide     : function(){ return true; },\n\n  // called after hide animation\n  onHidden   : function(){},\n\n  // called after approve selector match\n  onApprove  : function(){ return true; },\n\n  // called after deny selector match\n  onDeny     : function(){ return true; },\n\n  selector    : {\n    close    : '> .close',\n    approve  : '.actions .positive, .actions .approve, .actions .ok',\n    deny     : '.actions .negative, .actions .deny, .actions .cancel',\n    modal    : '.ui.modal'\n  },\n  error : {\n    dimmer    : 'UI Dimmer, a required component is not included in this page',\n    method    : 'The method you called is not defined.',\n    notFound  : 'The element you specified could not be found'\n  },\n  className : {\n    active     : 'active',\n    animating  : 'animating',\n    blurring   : 'blurring',\n    inverted   : 'inverted',\n    loading    : 'loading',\n    scrolling  : 'scrolling',\n    undetached : 'undetached'\n  }\n};\n\n\n})( jQuery, window, document );\n"
  },
  {
    "path": "semantic/src/definitions/modules/modal.less",
    "content": "/*!\n * # Semantic UI - Modal\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n            Theme\n*******************************/\n\n@type    : 'module';\n@element : 'modal';\n\n@import (multiple) '../../theme.config';\n\n/*******************************\n             Modal\n*******************************/\n\n.ui.modal {\n  display: none;\n  z-index: @zIndex;\n  text-align: left;\n\n  background: @background;\n  border: @border;\n  box-shadow: @boxShadow;\n  transform-origin: @transformOrigin;\n\n  flex: 0 0 auto;\n\n  border-radius: @borderRadius;\n  user-select: text;\n  will-change: top, left, margin, transform, opacity;\n}\n\n.ui.modal > :first-child:not(.icon),\n.ui.modal > .icon:first-child + * {\n  border-top-left-radius: @borderRadius;\n  border-top-right-radius: @borderRadius;\n}\n\n.ui.modal > :last-child {\n  border-bottom-left-radius: @borderRadius;\n  border-bottom-right-radius: @borderRadius;\n}\n\n/*******************************\n            Content\n*******************************/\n\n/*--------------\n     Close\n---------------*/\n\n.ui.modal > .close {\n  cursor: pointer;\n  position: absolute;\n  top: @closeTop;\n  right: @closeRight;\n  z-index: 1;\n\n  opacity: @closeOpacity;\n  font-size: @closeSize;\n  color: @closeColor;\n\n  width: @closeHitbox;\n  height: @closeHitbox;\n  padding: @closePadding;\n}\n.ui.modal > .close:hover {\n  opacity: 1;\n}\n\n/*--------------\n     Header\n---------------*/\n\n.ui.modal > .header {\n  display: block;\n  font-family: @headerFontFamily;\n  background: @headerBackground;\n  margin: @headerMargin;\n  padding: @headerPadding;\n  box-shadow: @headerBoxShadow;\n\n  color: @headerColor;\n  border-bottom: @headerBorder;\n}\n.ui.modal > .header:not(.ui) {\n  font-size: @headerFontSize;\n  line-height: @headerLineHeight;\n  font-weight: @headerFontWeight;\n}\n\n/*--------------\n     Content\n---------------*/\n\n.ui.modal > .content {\n  display: block;\n  width: 100%;\n  font-size: @contentFontSize;\n  line-height: @contentLineHeight;\n  padding: @contentPadding;\n  background: @contentBackground;\n}\n.ui.modal > .image.content {\n  display: flex;\n  flex-direction: row;\n}\n\n/* Image */\n.ui.modal > .content > .image {\n  display: block;\n  flex: 0 1 auto;\n  width: @imageWidth;\n  align-self: @imageVerticalAlign;\n}\n.ui.modal > [class*=\"top aligned\"] {\n  align-self: top;\n}\n.ui.modal > [class*=\"middle aligned\"] {\n  align-self: middle;\n}\n.ui.modal > [class*=\"stretched\"] {\n  align-self: stretch;\n}\n\n/* Description */\n.ui.modal > .content > .description {\n  display: block;\n  flex: 1 0 auto;\n  min-width: 0px;\n  align-self: @descriptionVerticalAlign;\n}\n\n.ui.modal > .content > .icon + .description,\n.ui.modal > .content > .image + .description {\n  flex: 0 1 auto;\n  min-width: @descriptionMinWidth;\n  width: @descriptionWidth;\n  padding-left: @descriptionDistance;\n}\n\n/*rtl:ignore*/\n.ui.modal > .content > .image > i.icon {\n  margin: 0em;\n  opacity: 1;\n  width: auto;\n  line-height: 1;\n  font-size: @imageIconSize;\n}\n\n/*--------------\n     Actions\n---------------*/\n\n.ui.modal > .actions {\n  background: @actionBackground;\n  padding: @actionPadding;\n  border-top: @actionBorder;\n  text-align: @actionAlign;\n}\n.ui.modal .actions > .button {\n  margin-left: @buttonDistance;\n}\n\n/*-------------------\n       Responsive\n--------------------*/\n\n/* Modal Width */\n@media only screen and (max-width : @largestMobileScreen) {\n  .ui.modal {\n    width: @mobileWidth;\n    margin: @mobileMargin;\n  }\n}\n@media only screen and (min-width : @tabletBreakpoint) {\n  .ui.modal {\n    width: @tabletWidth;\n    margin: @tabletMargin;\n  }\n}\n@media only screen and (min-width : @computerBreakpoint) {\n  .ui.modal {\n    width: @computerWidth;\n    margin: @computerMargin;\n  }\n}\n@media only screen and (min-width : @largeMonitorBreakpoint) {\n  .ui.modal {\n    width: @largeMonitorWidth;\n    margin: @largeMonitorMargin;\n  }\n}\n@media only screen and (min-width : @widescreenMonitorBreakpoint) {\n  .ui.modal {\n    width: @widescreenMonitorWidth;\n    margin: @widescreenMonitorMargin;\n  }\n}\n\n/* Tablet and Mobile */\n@media only screen and (max-width : @largestTabletScreen) {\n  .ui.modal > .header {\n    padding-right: @closeHitbox;\n  }\n  .ui.modal > .close {\n    top: @innerCloseTop;\n    right: @innerCloseRight;\n    color: @innerCloseColor;\n  }\n}\n\n/* Mobile */\n@media only screen and (max-width : @largestMobileScreen) {\n\n  .ui.modal > .header {\n    padding: @mobileHeaderPadding !important;\n    padding-right: @closeHitbox !important;\n  }\n  .ui.modal > .content {\n    display: block;\n    padding: @mobileContentPadding !important;\n  }\n  .ui.modal > .close {\n    top: @mobileCloseTop !important;\n    right: @mobileCloseRight !important;\n  }\n\n  /*rtl:ignore*/\n  .ui.modal .image.content {\n    flex-direction: column;\n  }\n  .ui.modal .content > .image {\n    display: block;\n    max-width: 100%;\n    margin: 0em auto !important;\n    text-align: center;\n    padding: @mobileImagePadding !important;\n  }\n  .ui.modal > .content > .image > i.icon {\n    font-size: @mobileImageIconSize;\n    text-align: center;\n  }\n\n  /*rtl:ignore*/\n  .ui.modal .content > .description {\n    display: block;\n    width: 100% !important;\n    margin: 0em !important;\n    padding: @mobileDescriptionPadding !important;\n    box-shadow: none;\n  }\n\n  /* Let Buttons Stack */\n  .ui.modal > .actions {\n    padding: @mobileActionPadding !important;\n  }\n  .ui.modal .actions > .buttons,\n  .ui.modal .actions > .button {\n    margin-bottom: @mobileButtonDistance;\n  }\n}\n\n/*--------------\n    Coupling\n---------------*/\n\n.ui.inverted.dimmer > .ui.modal {\n  box-shadow: @invertedBoxShadow;\n}\n\n/*******************************\n             Types\n*******************************/\n\n.ui.basic.modal {\n  background-color: transparent;\n  border: none;\n  border-radius: 0em;\n  box-shadow: none !important;\n  color: @basicModalColor;\n}\n.ui.basic.modal > .header,\n.ui.basic.modal > .content,\n.ui.basic.modal > .actions {\n  background-color: transparent;\n}\n.ui.basic.modal > .header {\n  color: @basicModalHeaderColor;\n}\n.ui.basic.modal > .close {\n  top: @basicModalCloseTop;\n  right: @basicModalCloseRight;\n}\n\n.ui.inverted.dimmer > .basic.modal {\n  color: @basicInvertedModalColor;\n}\n.ui.inverted.dimmer > .ui.basic.modal > .header {\n  color: @basicInvertedModalHeaderColor;\n}\n\n/* Tablet and Mobile */\n@media only screen and (max-width : @largestTabletScreen) {\n  .ui.basic.modal > .close {\n    color: @basicInnerCloseColor;\n  }\n}\n\n\n/*******************************\n             States\n*******************************/\n\n.ui.loading.modal {\n  display: block;\n  visibility: hidden;\n  z-index: @loadingZIndex;\n}\n\n.ui.active.modal {\n  display: block;\n}\n\n/*******************************\n           Variations\n*******************************/\n\n/*--------------\n   Top Aligned\n---------------*/\n\n/* Top Aligned Modal */\n.modals.dimmer[class*=\"top aligned\"] .modal {\n  margin: @topAlignedMargin auto;\n}\n\n/*--------------\n    Scrolling\n---------------*/\n\n/* Scrolling Dimmer */\n.scrolling.dimmable.dimmed {\n  overflow: hidden;\n}\n.scrolling.dimmable > .dimmer {\n  justify-content: flex-start;\n}\n.scrolling.dimmable.dimmed > .dimmer {\n  overflow: auto;\n  -webkit-overflow-scrolling: touch;\n}\n.scrolling.dimmable > .dimmer {\n  position: fixed;\n}\n.modals.dimmer .ui.scrolling.modal {\n  margin: @scrollingMargin auto !important;\n}\n\n/* Undetached Scrolling */\n.scrolling.undetached.dimmable.dimmed {\n  overflow: auto;\n  -webkit-overflow-scrolling: touch;\n}\n.scrolling.undetached.dimmable.dimmed > .dimmer {\n  overflow: hidden;\n}\n.scrolling.undetached.dimmable .ui.scrolling.modal {\n  position: absolute;\n  left: 50%;\n  margin-top: @scrollingMargin !important;\n}\n\n/* Scrolling Content */\n.ui.modal .scrolling.content {\n  max-height: @scrollingContentMaxHeight;\n  overflow: auto;\n}\n\n/*--------------\n   Full Screen\n---------------*/\n\n.ui.fullscreen.modal {\n  width: @fullScreenWidth !important;\n  left: @fullScreenOffset !important;\n  margin: @fullScreenMargin;\n}\n.ui.fullscreen.scrolling.modal {\n  left: 0em !important;\n}\n.ui.fullscreen.modal > .header {\n  padding-right: @closeHitbox;\n}\n.ui.fullscreen.modal > .close {\n  top: @innerCloseTop;\n  right: @innerCloseRight;\n  color: @innerCloseColor;\n}\n\n\n/*--------------\n      Size\n---------------*/\n\n.ui.modal {\n  font-size: @medium;\n}\n\n/* Mini */\n.ui.mini.modal > .header:not(.ui) {\n  font-size: @miniHeaderSize;\n}\n\n/* Mini Modal Width */\n@media only screen and (max-width : @largestMobileScreen) {\n  .ui.mini.modal {\n    width: @miniMobileWidth;\n    margin: @miniMobileMargin;\n  }\n}\n@media only screen and (min-width : @tabletBreakpoint) {\n  .ui.mini.modal {\n    width: @miniTabletWidth;\n    margin: @miniTabletMargin;\n  }\n}\n@media only screen and (min-width : @computerBreakpoint) {\n  .ui.mini.modal {\n    width: @miniComputerWidth;\n    margin: @miniComputerMargin;\n  }\n}\n@media only screen and (min-width : @largeMonitorBreakpoint) {\n  .ui.mini.modal {\n    width: @miniLargeMonitorWidth;\n    margin: @miniLargeMonitorMargin;\n  }\n}\n@media only screen and (min-width : @widescreenMonitorBreakpoint) {\n  .ui.mini.modal {\n    width: @miniWidescreenMonitorWidth;\n    margin: @miniWidescreenMonitorMargin;\n  }\n}\n\n/* mini */\n.ui.small.modal > .header:not(.ui) {\n  font-size: @miniHeaderSize;\n}\n\n/* Tiny Modal Width */\n@media only screen and (max-width : @largestMobileScreen) {\n  .ui.tiny.modal {\n    width: @tinyMobileWidth;\n    margin: @tinyMobileMargin;\n  }\n}\n@media only screen and (min-width : @tabletBreakpoint) {\n  .ui.tiny.modal {\n    width: @tinyTabletWidth;\n    margin: @tinyTabletMargin;\n  }\n}\n@media only screen and (min-width : @computerBreakpoint) {\n  .ui.tiny.modal {\n    width: @tinyComputerWidth;\n    margin: @tinyComputerMargin;\n  }\n}\n@media only screen and (min-width : @largeMonitorBreakpoint) {\n  .ui.tiny.modal {\n    width: @tinyLargeMonitorWidth;\n    margin: @tinyLargeMonitorMargin;\n  }\n}\n@media only screen and (min-width : @widescreenMonitorBreakpoint) {\n  .ui.tiny.modal {\n    width: @tinyWidescreenMonitorWidth;\n    margin: @tinyWidescreenMonitorMargin;\n  }\n}\n\n/* Small */\n.ui.small.modal > .header:not(.ui) {\n  font-size: @smallHeaderSize;\n}\n\n/* Small Modal Width */\n@media only screen and (max-width : @largestMobileScreen) {\n  .ui.small.modal {\n    width: @smallMobileWidth;\n    margin: @smallMobileMargin;\n  }\n}\n@media only screen and (min-width : @tabletBreakpoint) {\n  .ui.small.modal {\n    width: @smallTabletWidth;\n    margin: @smallTabletMargin;\n  }\n}\n@media only screen and (min-width : @computerBreakpoint) {\n  .ui.small.modal {\n    width: @smallComputerWidth;\n    margin: @smallComputerMargin;\n  }\n}\n@media only screen and (min-width : @largeMonitorBreakpoint) {\n  .ui.small.modal {\n    width: @smallLargeMonitorWidth;\n    margin: @smallLargeMonitorMargin;\n  }\n}\n@media only screen and (min-width : @widescreenMonitorBreakpoint) {\n  .ui.small.modal {\n    width: @smallWidescreenMonitorWidth;\n    margin: @smallWidescreenMonitorMargin;\n  }\n}\n\n/* Large Modal Width */\n.ui.large.modal > .header {\n  font-size: @largeHeaderSize;\n}\n@media only screen and (max-width : @largestMobileScreen) {\n  .ui.large.modal {\n    width: @largeMobileWidth;\n    margin: @largeMobileMargin;\n  }\n}\n@media only screen and (min-width : @tabletBreakpoint) {\n  .ui.large.modal {\n    width: @largeTabletWidth;\n    margin: @largeTabletMargin;\n  }\n}\n@media only screen and (min-width : @computerBreakpoint) {\n  .ui.large.modal {\n    width: @largeComputerWidth;\n    margin: @largeComputerMargin;\n  }\n}\n@media only screen and (min-width : @largeMonitorBreakpoint) {\n  .ui.large.modal {\n    width: @largeLargeMonitorWidth;\n    margin: @largeLargeMonitorMargin;\n  }\n}\n@media only screen and (min-width : @widescreenMonitorBreakpoint) {\n  .ui.large.modal {\n    width: @largeWidescreenMonitorWidth;\n    margin: @largeWidescreenMonitorMargin;\n  }\n}\n\n\n.loadUIOverrides();\n"
  },
  {
    "path": "semantic/src/definitions/modules/nag.js",
    "content": "/*!\n * # Semantic UI - Nag\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n;(function ($, window, document, undefined) {\n\n'use strict';\n\nwindow = (typeof window != 'undefined' && window.Math == Math)\n  ? window\n  : (typeof self != 'undefined' && self.Math == Math)\n    ? self\n    : Function('return this')()\n;\n\n$.fn.nag = function(parameters) {\n  var\n    $allModules    = $(this),\n    moduleSelector = $allModules.selector || '',\n\n    time           = new Date().getTime(),\n    performance    = [],\n\n    query          = arguments[0],\n    methodInvoked  = (typeof query == 'string'),\n    queryArguments = [].slice.call(arguments, 1),\n    returnedValue\n  ;\n  $allModules\n    .each(function() {\n      var\n        settings          = ( $.isPlainObject(parameters) )\n          ? $.extend(true, {}, $.fn.nag.settings, parameters)\n          : $.extend({}, $.fn.nag.settings),\n\n        className       = settings.className,\n        selector        = settings.selector,\n        error           = settings.error,\n        namespace       = settings.namespace,\n\n        eventNamespace  = '.' + namespace,\n        moduleNamespace = namespace + '-module',\n\n        $module         = $(this),\n\n        $close          = $module.find(selector.close),\n        $context        = (settings.context)\n          ? $(settings.context)\n          : $('body'),\n\n        element         = this,\n        instance        = $module.data(moduleNamespace),\n\n        moduleOffset,\n        moduleHeight,\n\n        contextWidth,\n        contextHeight,\n        contextOffset,\n\n        yOffset,\n        yPosition,\n\n        timer,\n        module,\n\n        requestAnimationFrame = window.requestAnimationFrame\n          || window.mozRequestAnimationFrame\n          || window.webkitRequestAnimationFrame\n          || window.msRequestAnimationFrame\n          || function(callback) { setTimeout(callback, 0); }\n      ;\n      module = {\n\n        initialize: function() {\n          module.verbose('Initializing element');\n\n          $module\n            .on('click' + eventNamespace, selector.close, module.dismiss)\n            .data(moduleNamespace, module)\n          ;\n\n          if(settings.detachable && $module.parent()[0] !== $context[0]) {\n            $module\n              .detach()\n              .prependTo($context)\n            ;\n          }\n\n          if(settings.displayTime > 0) {\n            setTimeout(module.hide, settings.displayTime);\n          }\n          module.show();\n        },\n\n        destroy: function() {\n          module.verbose('Destroying instance');\n          $module\n            .removeData(moduleNamespace)\n            .off(eventNamespace)\n          ;\n        },\n\n        show: function() {\n          if( module.should.show() && !$module.is(':visible') ) {\n            module.debug('Showing nag', settings.animation.show);\n            if(settings.animation.show == 'fade') {\n              $module\n                .fadeIn(settings.duration, settings.easing)\n              ;\n            }\n            else {\n              $module\n                .slideDown(settings.duration, settings.easing)\n              ;\n            }\n          }\n        },\n\n        hide: function() {\n          module.debug('Showing nag', settings.animation.hide);\n          if(settings.animation.show == 'fade') {\n            $module\n              .fadeIn(settings.duration, settings.easing)\n            ;\n          }\n          else {\n            $module\n              .slideUp(settings.duration, settings.easing)\n            ;\n          }\n        },\n\n        onHide: function() {\n          module.debug('Removing nag', settings.animation.hide);\n          $module.remove();\n          if (settings.onHide) {\n            settings.onHide();\n          }\n        },\n\n        dismiss: function(event) {\n          if(settings.storageMethod) {\n            module.storage.set(settings.key, settings.value);\n          }\n          module.hide();\n          event.stopImmediatePropagation();\n          event.preventDefault();\n        },\n\n        should: {\n          show: function() {\n            if(settings.persist) {\n              module.debug('Persistent nag is set, can show nag');\n              return true;\n            }\n            if( module.storage.get(settings.key) != settings.value.toString() ) {\n              module.debug('Stored value is not set, can show nag', module.storage.get(settings.key));\n              return true;\n            }\n            module.debug('Stored value is set, cannot show nag', module.storage.get(settings.key));\n            return false;\n          }\n        },\n\n        get: {\n          storageOptions: function() {\n            var\n              options = {}\n            ;\n            if(settings.expires) {\n              options.expires = settings.expires;\n            }\n            if(settings.domain) {\n              options.domain = settings.domain;\n            }\n            if(settings.path) {\n              options.path = settings.path;\n            }\n            return options;\n          }\n        },\n\n        clear: function() {\n          module.storage.remove(settings.key);\n        },\n\n        storage: {\n          set: function(key, value) {\n            var\n              options = module.get.storageOptions()\n            ;\n            if(settings.storageMethod == 'localstorage' && window.localStorage !== undefined) {\n              window.localStorage.setItem(key, value);\n              module.debug('Value stored using local storage', key, value);\n            }\n            else if(settings.storageMethod == 'sessionstorage' && window.sessionStorage !== undefined) {\n              window.sessionStorage.setItem(key, value);\n              module.debug('Value stored using session storage', key, value);\n            }\n            else if($.cookie !== undefined) {\n              $.cookie(key, value, options);\n              module.debug('Value stored using cookie', key, value, options);\n            }\n            else {\n              module.error(error.noCookieStorage);\n              return;\n            }\n          },\n          get: function(key, value) {\n            var\n              storedValue\n            ;\n            if(settings.storageMethod == 'localstorage' && window.localStorage !== undefined) {\n              storedValue = window.localStorage.getItem(key);\n            }\n            else if(settings.storageMethod == 'sessionstorage' && window.sessionStorage !== undefined) {\n              storedValue = window.sessionStorage.getItem(key);\n            }\n            // get by cookie\n            else if($.cookie !== undefined) {\n              storedValue = $.cookie(key);\n            }\n            else {\n              module.error(error.noCookieStorage);\n            }\n            if(storedValue == 'undefined' || storedValue == 'null' || storedValue === undefined || storedValue === null) {\n              storedValue = undefined;\n            }\n            return storedValue;\n          },\n          remove: function(key) {\n            var\n              options = module.get.storageOptions()\n            ;\n            if(settings.storageMethod == 'localstorage' && window.localStorage !== undefined) {\n              window.localStorage.removeItem(key);\n            }\n            else if(settings.storageMethod == 'sessionstorage' && window.sessionStorage !== undefined) {\n              window.sessionStorage.removeItem(key);\n            }\n            // store by cookie\n            else if($.cookie !== undefined) {\n              $.removeCookie(key, options);\n            }\n            else {\n              module.error(error.noStorage);\n            }\n          }\n        },\n\n        setting: function(name, value) {\n          module.debug('Changing setting', name, value);\n          if( $.isPlainObject(name) ) {\n            $.extend(true, settings, name);\n          }\n          else if(value !== undefined) {\n            if($.isPlainObject(settings[name])) {\n              $.extend(true, settings[name], value);\n            }\n            else {\n              settings[name] = value;\n            }\n          }\n          else {\n            return settings[name];\n          }\n        },\n        internal: function(name, value) {\n          if( $.isPlainObject(name) ) {\n            $.extend(true, module, name);\n          }\n          else if(value !== undefined) {\n            module[name] = value;\n          }\n          else {\n            return module[name];\n          }\n        },\n        debug: function() {\n          if(!settings.silent && settings.debug) {\n            if(settings.performance) {\n              module.performance.log(arguments);\n            }\n            else {\n              module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');\n              module.debug.apply(console, arguments);\n            }\n          }\n        },\n        verbose: function() {\n          if(!settings.silent && settings.verbose && settings.debug) {\n            if(settings.performance) {\n              module.performance.log(arguments);\n            }\n            else {\n              module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');\n              module.verbose.apply(console, arguments);\n            }\n          }\n        },\n        error: function() {\n          if(!settings.silent) {\n            module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');\n            module.error.apply(console, arguments);\n          }\n        },\n        performance: {\n          log: function(message) {\n            var\n              currentTime,\n              executionTime,\n              previousTime\n            ;\n            if(settings.performance) {\n              currentTime   = new Date().getTime();\n              previousTime  = time || currentTime;\n              executionTime = currentTime - previousTime;\n              time          = currentTime;\n              performance.push({\n                'Name'           : message[0],\n                'Arguments'      : [].slice.call(message, 1) || '',\n                'Element'        : element,\n                'Execution Time' : executionTime\n              });\n            }\n            clearTimeout(module.performance.timer);\n            module.performance.timer = setTimeout(module.performance.display, 500);\n          },\n          display: function() {\n            var\n              title = settings.name + ':',\n              totalTime = 0\n            ;\n            time = false;\n            clearTimeout(module.performance.timer);\n            $.each(performance, function(index, data) {\n              totalTime += data['Execution Time'];\n            });\n            title += ' ' + totalTime + 'ms';\n            if(moduleSelector) {\n              title += ' \\'' + moduleSelector + '\\'';\n            }\n            if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {\n              console.groupCollapsed(title);\n              if(console.table) {\n                console.table(performance);\n              }\n              else {\n                $.each(performance, function(index, data) {\n                  console.log(data['Name'] + ': ' + data['Execution Time']+'ms');\n                });\n              }\n              console.groupEnd();\n            }\n            performance = [];\n          }\n        },\n        invoke: function(query, passedArguments, context) {\n          var\n            object = instance,\n            maxDepth,\n            found,\n            response\n          ;\n          passedArguments = passedArguments || queryArguments;\n          context         = element         || context;\n          if(typeof query == 'string' && object !== undefined) {\n            query    = query.split(/[\\. ]/);\n            maxDepth = query.length - 1;\n            $.each(query, function(depth, value) {\n              var camelCaseValue = (depth != maxDepth)\n                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)\n                : query\n              ;\n              if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {\n                object = object[camelCaseValue];\n              }\n              else if( object[camelCaseValue] !== undefined ) {\n                found = object[camelCaseValue];\n                return false;\n              }\n              else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {\n                object = object[value];\n              }\n              else if( object[value] !== undefined ) {\n                found = object[value];\n                return false;\n              }\n              else {\n                module.error(error.method, query);\n                return false;\n              }\n            });\n          }\n          if ( $.isFunction( found ) ) {\n            response = found.apply(context, passedArguments);\n          }\n          else if(found !== undefined) {\n            response = found;\n          }\n          if($.isArray(returnedValue)) {\n            returnedValue.push(response);\n          }\n          else if(returnedValue !== undefined) {\n            returnedValue = [returnedValue, response];\n          }\n          else if(response !== undefined) {\n            returnedValue = response;\n          }\n          return found;\n        }\n      };\n\n      if(methodInvoked) {\n        if(instance === undefined) {\n          module.initialize();\n        }\n        module.invoke(query);\n      }\n      else {\n        if(instance !== undefined) {\n          instance.invoke('destroy');\n        }\n        module.initialize();\n      }\n    })\n  ;\n\n  return (returnedValue !== undefined)\n    ? returnedValue\n    : this\n  ;\n};\n\n$.fn.nag.settings = {\n\n  name        : 'Nag',\n\n  silent      : false,\n  debug       : false,\n  verbose     : false,\n  performance : true,\n\n  namespace   : 'Nag',\n\n  // allows cookie to be overridden\n  persist     : false,\n\n  // set to zero to require manually dismissal, otherwise hides on its own\n  displayTime : 0,\n\n  animation   : {\n    show : 'slide',\n    hide : 'slide'\n  },\n\n  context       : false,\n  detachable    : false,\n\n  expires       : 30,\n  domain        : false,\n  path          : '/',\n\n  // type of storage to use\n  storageMethod : 'cookie',\n\n  // value to store in dismissed localstorage/cookie\n  key           : 'nag',\n  value         : 'dismiss',\n\n  error: {\n    noCookieStorage : '$.cookie is not included. A storage solution is required.',\n    noStorage       : 'Neither $.cookie or store is defined. A storage solution is required for storing state',\n    method          : 'The method you called is not defined.'\n  },\n\n  className     : {\n    bottom : 'bottom',\n    fixed  : 'fixed'\n  },\n\n  selector      : {\n    close : '.close.icon'\n  },\n\n  speed         : 500,\n  easing        : 'easeOutQuad',\n\n  onHide: function() {}\n\n};\n\n// Adds easing\n$.extend( $.easing, {\n  easeOutQuad: function (x, t, b, c, d) {\n    return -c *(t/=d)*(t-2) + b;\n  }\n});\n\n})( jQuery, window, document );\n"
  },
  {
    "path": "semantic/src/definitions/modules/nag.less",
    "content": "/*!\n * # Semantic UI - Nag\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n            Theme\n*******************************/\n\n@type    : 'module';\n@element : 'nag';\n\n@import (multiple) '../../theme.config';\n\n/*******************************\n             Nag\n*******************************/\n\n.ui.nag {\n  display: none;\n  opacity: @opacity;\n  position: @position;\n\n  top: @top;\n  left: 0px;\n  z-index: @zIndex;\n\n  min-height: @minHeight;\n  width: @width;\n\n  margin: @margin;\n  padding: @padding;\n\n  background: @background;\n  box-shadow: @boxShadow;\n\n  font-size: @fontSize;\n  text-align: @textAlign;\n  color: @color;\n\n  border-radius: @topBorderRadius;\n  transition: @transition;\n}\n\na.ui.nag {\n  cursor: pointer;\n}\n\n.ui.nag > .title {\n  display: inline-block;\n  margin: @titleMargin;\n  color: @titleColor;\n}\n\n\n.ui.nag > .close.icon {\n  cursor: pointer;\n  opacity: @closeOpacity;\n\n  position: absolute;\n  top: @closeTop;\n  right: @closeRight;\n\n  font-size: @closeSize;\n\n  margin: @closeMargin;\n  color: @closeColor;\n  transition: @closeTransition;\n}\n\n\n\n/*******************************\n             States\n*******************************/\n\n/* Hover */\n.ui.nag:hover {\n  background: @nagHoverBackground;\n  opacity: @nagHoverOpacity;\n}\n\n.ui.nag .close:hover {\n  opacity: @closeHoverOpacity;\n}\n\n\n/*******************************\n           Variations\n*******************************/\n\n\n/*--------------\n     Static\n---------------*/\n\n.ui.overlay.nag {\n  position: absolute;\n  display: block;\n}\n\n/*--------------\n     Fixed\n---------------*/\n\n.ui.fixed.nag {\n  position: fixed;\n}\n\n/*--------------\n     Bottom\n---------------*/\n\n.ui.bottom.nags,\n.ui.bottom.nag {\n  border-radius: @bottomBorderRadius;\n  top: auto;\n  bottom: @bottom;\n}\n\n/*--------------\n     White\n---------------*/\n\n.ui.inverted.nags .nag,\n.ui.inverted.nag {\n  background-color: @invertedBackground;\n  color: @darkTextColor;\n}\n.ui.inverted.nags .nag .close,\n.ui.inverted.nags .nag .title,\n.ui.inverted.nag .close,\n.ui.inverted.nag .title {\n  color: @lightTextColor;\n}\n\n\n/*******************************\n           Groups\n*******************************/\n\n.ui.nags .nag {\n  border-radius: @groupedBorderRadius !important;\n}\n.ui.nags .nag:last-child {\n  border-radius: @topBorderRadius;\n}\n.ui.bottom.nags .nag:last-child {\n  border-radius: @bottomBorderRadius;\n}\n\n.loadUIOverrides();\n"
  },
  {
    "path": "semantic/src/definitions/modules/popup.js",
    "content": "/*!\n * # Semantic UI - Popup\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n;(function ($, window, document, undefined) {\n\n'use strict';\n\nwindow = (typeof window != 'undefined' && window.Math == Math)\n  ? window\n  : (typeof self != 'undefined' && self.Math == Math)\n    ? self\n    : Function('return this')()\n;\n\n$.fn.popup = function(parameters) {\n  var\n    $allModules    = $(this),\n    $document      = $(document),\n    $window        = $(window),\n    $body          = $('body'),\n\n    moduleSelector = $allModules.selector || '',\n\n    hasTouch       = (true),\n    time           = new Date().getTime(),\n    performance    = [],\n\n    query          = arguments[0],\n    methodInvoked  = (typeof query == 'string'),\n    queryArguments = [].slice.call(arguments, 1),\n\n    returnedValue\n  ;\n  $allModules\n    .each(function() {\n      var\n        settings        = ( $.isPlainObject(parameters) )\n          ? $.extend(true, {}, $.fn.popup.settings, parameters)\n          : $.extend({}, $.fn.popup.settings),\n\n        selector           = settings.selector,\n        className          = settings.className,\n        error              = settings.error,\n        metadata           = settings.metadata,\n        namespace          = settings.namespace,\n\n        eventNamespace     = '.' + settings.namespace,\n        moduleNamespace    = 'module-' + namespace,\n\n        $module            = $(this),\n        $context           = $(settings.context),\n        $scrollContext     = $(settings.scrollContext),\n        $boundary          = $(settings.boundary),\n        $target            = (settings.target)\n          ? $(settings.target)\n          : $module,\n\n        $popup,\n        $offsetParent,\n\n        searchDepth        = 0,\n        triedPositions     = false,\n        openedWithTouch    = false,\n\n        element            = this,\n        instance           = $module.data(moduleNamespace),\n\n        documentObserver,\n        elementNamespace,\n        id,\n        module\n      ;\n\n      module = {\n\n        // binds events\n        initialize: function() {\n          module.debug('Initializing', $module);\n          module.createID();\n          module.bind.events();\n          if(!module.exists() && settings.preserve) {\n            module.create();\n          }\n          if(settings.observeChanges) {\n            module.observeChanges();\n          }\n          module.instantiate();\n        },\n\n        instantiate: function() {\n          module.verbose('Storing instance', module);\n          instance = module;\n          $module\n            .data(moduleNamespace, instance)\n          ;\n        },\n\n        observeChanges: function() {\n          if('MutationObserver' in window) {\n            documentObserver = new MutationObserver(module.event.documentChanged);\n            documentObserver.observe(document, {\n              childList : true,\n              subtree   : true\n            });\n            module.debug('Setting up mutation observer', documentObserver);\n          }\n        },\n\n        refresh: function() {\n          if(settings.popup) {\n            $popup = $(settings.popup).eq(0);\n          }\n          else {\n            if(settings.inline) {\n              $popup = $target.nextAll(selector.popup).eq(0);\n              settings.popup = $popup;\n            }\n          }\n          if(settings.popup) {\n            $popup.addClass(className.loading);\n            $offsetParent = module.get.offsetParent();\n            $popup.removeClass(className.loading);\n            if(settings.movePopup && module.has.popup() && module.get.offsetParent($popup)[0] !== $offsetParent[0]) {\n              module.debug('Moving popup to the same offset parent as target');\n              $popup\n                .detach()\n                .appendTo($offsetParent)\n              ;\n            }\n          }\n          else {\n            $offsetParent = (settings.inline)\n              ? module.get.offsetParent($target)\n              : module.has.popup()\n                ? module.get.offsetParent($popup)\n                : $body\n            ;\n          }\n          if( $offsetParent.is('html') && $offsetParent[0] !== $body[0] ) {\n            module.debug('Setting page as offset parent');\n            $offsetParent = $body;\n          }\n          if( module.get.variation() ) {\n            module.set.variation();\n          }\n        },\n\n        reposition: function() {\n          module.refresh();\n          module.set.position();\n        },\n\n        destroy: function() {\n          module.debug('Destroying previous module');\n          if(documentObserver) {\n            documentObserver.disconnect();\n          }\n          // remove element only if was created dynamically\n          if($popup && !settings.preserve) {\n            module.removePopup();\n          }\n          // clear all timeouts\n          clearTimeout(module.hideTimer);\n          clearTimeout(module.showTimer);\n          // remove events\n          module.unbind.close();\n          module.unbind.events();\n          $module\n            .removeData(moduleNamespace)\n          ;\n        },\n\n        event: {\n          start:  function(event) {\n            var\n              delay = ($.isPlainObject(settings.delay))\n                ? settings.delay.show\n                : settings.delay\n            ;\n            clearTimeout(module.hideTimer);\n            if(!openedWithTouch) {\n              module.showTimer = setTimeout(module.show, delay);\n            }\n          },\n          end:  function() {\n            var\n              delay = ($.isPlainObject(settings.delay))\n                ? settings.delay.hide\n                : settings.delay\n            ;\n            clearTimeout(module.showTimer);\n            module.hideTimer = setTimeout(module.hide, delay);\n          },\n          touchstart: function(event) {\n            openedWithTouch = true;\n            module.show();\n          },\n          resize: function() {\n            if( module.is.visible() ) {\n              module.set.position();\n            }\n          },\n          documentChanged: function(mutations) {\n            [].forEach.call(mutations, function(mutation) {\n              if(mutation.removedNodes) {\n                [].forEach.call(mutation.removedNodes, function(node) {\n                  if(node == element || $(node).find(element).length > 0) {\n                    module.debug('Element removed from DOM, tearing down events');\n                    module.destroy();\n                  }\n                });\n              }\n            });\n          },\n          hideGracefully: function(event) {\n            var\n              $target = $(event.target),\n              isInDOM = $.contains(document.documentElement, event.target),\n              inPopup = ($target.closest(selector.popup).length > 0)\n            ;\n            // don't close on clicks inside popup\n            if(event && !inPopup && isInDOM) {\n              module.debug('Click occurred outside popup hiding popup');\n              module.hide();\n            }\n            else {\n              module.debug('Click was inside popup, keeping popup open');\n            }\n          }\n        },\n\n        // generates popup html from metadata\n        create: function() {\n          var\n            html      = module.get.html(),\n            title     = module.get.title(),\n            content   = module.get.content()\n          ;\n\n          if(html || content || title) {\n            module.debug('Creating pop-up html');\n            if(!html) {\n              html = settings.templates.popup({\n                title   : title,\n                content : content\n              });\n            }\n            $popup = $('<div/>')\n              .addClass(className.popup)\n              .data(metadata.activator, $module)\n              .html(html)\n            ;\n            if(settings.inline) {\n              module.verbose('Inserting popup element inline', $popup);\n              $popup\n                .insertAfter($module)\n              ;\n            }\n            else {\n              module.verbose('Appending popup element to body', $popup);\n              $popup\n                .appendTo( $context )\n              ;\n            }\n            module.refresh();\n            module.set.variation();\n\n            if(settings.hoverable) {\n              module.bind.popup();\n            }\n            settings.onCreate.call($popup, element);\n          }\n          else if($target.next(selector.popup).length !== 0) {\n            module.verbose('Pre-existing popup found');\n            settings.inline = true;\n            settings.popup  = $target.next(selector.popup).data(metadata.activator, $module);\n            module.refresh();\n            if(settings.hoverable) {\n              module.bind.popup();\n            }\n          }\n          else if(settings.popup) {\n            $(settings.popup).data(metadata.activator, $module);\n            module.verbose('Used popup specified in settings');\n            module.refresh();\n            if(settings.hoverable) {\n              module.bind.popup();\n            }\n          }\n          else {\n            module.debug('No content specified skipping display', element);\n          }\n        },\n\n        createID: function() {\n          id = (Math.random().toString(16) + '000000000').substr(2, 8);\n          elementNamespace = '.' + id;\n          module.verbose('Creating unique id for element', id);\n        },\n\n        // determines popup state\n        toggle: function() {\n          module.debug('Toggling pop-up');\n          if( module.is.hidden() ) {\n            module.debug('Popup is hidden, showing pop-up');\n            module.unbind.close();\n            module.show();\n          }\n          else {\n            module.debug('Popup is visible, hiding pop-up');\n            module.hide();\n          }\n        },\n\n        show: function(callback) {\n          callback = callback || function(){};\n          module.debug('Showing pop-up', settings.transition);\n          if(module.is.hidden() && !( module.is.active() && module.is.dropdown()) ) {\n            if( !module.exists() ) {\n              module.create();\n            }\n            if(settings.onShow.call($popup, element) === false) {\n              module.debug('onShow callback returned false, cancelling popup animation');\n              return;\n            }\n            else if(!settings.preserve && !settings.popup) {\n              module.refresh();\n            }\n            if( $popup && module.set.position() ) {\n              module.save.conditions();\n              if(settings.exclusive) {\n                module.hideAll();\n              }\n              module.animate.show(callback);\n            }\n          }\n        },\n\n\n        hide: function(callback) {\n          callback = callback || function(){};\n          if( module.is.visible() || module.is.animating() ) {\n            if(settings.onHide.call($popup, element) === false) {\n              module.debug('onHide callback returned false, cancelling popup animation');\n              return;\n            }\n            module.remove.visible();\n            module.unbind.close();\n            module.restore.conditions();\n            module.animate.hide(callback);\n          }\n        },\n\n        hideAll: function() {\n          $(selector.popup)\n            .filter('.' + className.popupVisible)\n            .each(function() {\n              $(this)\n                .data(metadata.activator)\n                  .popup('hide')\n              ;\n            })\n          ;\n        },\n        exists: function() {\n          if(!$popup) {\n            return false;\n          }\n          if(settings.inline || settings.popup) {\n            return ( module.has.popup() );\n          }\n          else {\n            return ( $popup.closest($context).length >= 1 )\n              ? true\n              : false\n            ;\n          }\n        },\n\n        removePopup: function() {\n          if( module.has.popup() && !settings.popup) {\n            module.debug('Removing popup', $popup);\n            $popup.remove();\n            $popup = undefined;\n            settings.onRemove.call($popup, element);\n          }\n        },\n\n        save: {\n          conditions: function() {\n            module.cache = {\n              title: $module.attr('title')\n            };\n            if (module.cache.title) {\n              $module.removeAttr('title');\n            }\n            module.verbose('Saving original attributes', module.cache.title);\n          }\n        },\n        restore: {\n          conditions: function() {\n            if(module.cache && module.cache.title) {\n              $module.attr('title', module.cache.title);\n              module.verbose('Restoring original attributes', module.cache.title);\n            }\n            return true;\n          }\n        },\n        supports: {\n          svg: function() {\n            return (typeof SVGGraphicsElement === 'undefined');\n          }\n        },\n        animate: {\n          show: function(callback) {\n            callback = $.isFunction(callback) ? callback : function(){};\n            if(settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) {\n              module.set.visible();\n              $popup\n                .transition({\n                  animation  : settings.transition + ' in',\n                  queue      : false,\n                  debug      : settings.debug,\n                  verbose    : settings.verbose,\n                  duration   : settings.duration,\n                  onComplete : function() {\n                    module.bind.close();\n                    callback.call($popup, element);\n                    settings.onVisible.call($popup, element);\n                  }\n                })\n              ;\n            }\n            else {\n              module.error(error.noTransition);\n            }\n          },\n          hide: function(callback) {\n            callback = $.isFunction(callback) ? callback : function(){};\n            module.debug('Hiding pop-up');\n            if(settings.onHide.call($popup, element) === false) {\n              module.debug('onHide callback returned false, cancelling popup animation');\n              return;\n            }\n            if(settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) {\n              $popup\n                .transition({\n                  animation  : settings.transition + ' out',\n                  queue      : false,\n                  duration   : settings.duration,\n                  debug      : settings.debug,\n                  verbose    : settings.verbose,\n                  onComplete : function() {\n                    module.reset();\n                    callback.call($popup, element);\n                    settings.onHidden.call($popup, element);\n                  }\n                })\n              ;\n            }\n            else {\n              module.error(error.noTransition);\n            }\n          }\n        },\n\n        change: {\n          content: function(html) {\n            $popup.html(html);\n          }\n        },\n\n        get: {\n          html: function() {\n            $module.removeData(metadata.html);\n            return $module.data(metadata.html) || settings.html;\n          },\n          title: function() {\n            $module.removeData(metadata.title);\n            return $module.data(metadata.title) || settings.title;\n          },\n          content: function() {\n            $module.removeData(metadata.content);\n            return $module.data(metadata.content) || settings.content || $module.attr('title');\n          },\n          variation: function() {\n            $module.removeData(metadata.variation);\n            return $module.data(metadata.variation) || settings.variation;\n          },\n          popup: function() {\n            return $popup;\n          },\n          popupOffset: function() {\n            return $popup.offset();\n          },\n          calculations: function() {\n            var\n              $popupOffsetParent = module.get.offsetParent($popup),\n              targetElement      = $target[0],\n              isWindow           = ($boundary[0] == window),\n              targetPosition     = (settings.inline || (settings.popup && settings.movePopup))\n                ? $target.position()\n                : $target.offset(),\n              screenPosition = (isWindow)\n                ? { top: 0, left: 0 }\n                : $boundary.offset(),\n              calculations   = {},\n              scroll = (isWindow)\n                ? { top: $window.scrollTop(), left: $window.scrollLeft() }\n                : { top: 0, left: 0},\n              screen\n            ;\n            calculations = {\n              // element which is launching popup\n              target : {\n                element : $target[0],\n                width   : $target.outerWidth(),\n                height  : $target.outerHeight(),\n                top     : targetPosition.top,\n                left    : targetPosition.left,\n                margin  : {}\n              },\n              // popup itself\n              popup : {\n                width  : $popup.outerWidth(),\n                height : $popup.outerHeight()\n              },\n              // offset container (or 3d context)\n              parent : {\n                width  : $offsetParent.outerWidth(),\n                height : $offsetParent.outerHeight()\n              },\n              // screen boundaries\n              screen : {\n                top  : screenPosition.top,\n                left : screenPosition.left,\n                scroll: {\n                  top  : scroll.top,\n                  left : scroll.left\n                },\n                width  : $boundary.width(),\n                height : $boundary.height()\n              }\n            };\n\n            // if popup offset context is not same as target, then adjust calculations\n            if($popupOffsetParent.get(0) !== $offsetParent.get(0)) {\n              var\n                popupOffset        = $popupOffsetParent.offset()\n              ;\n              calculations.target.top -= popupOffset.top;\n              calculations.target.left -= popupOffset.left;\n              calculations.parent.width = $popupOffsetParent.outerWidth();\n              calculations.parent.height = $popupOffsetParent.outerHeight();\n            }\n\n            // add in container calcs if fluid\n            if( settings.setFluidWidth && module.is.fluid() ) {\n              calculations.container = {\n                width: $popup.parent().outerWidth()\n              };\n              calculations.popup.width = calculations.container.width;\n            }\n\n            // add in margins if inline\n            calculations.target.margin.top = (settings.inline)\n              ? parseInt( window.getComputedStyle(targetElement).getPropertyValue('margin-top'), 10)\n              : 0\n            ;\n            calculations.target.margin.left = (settings.inline)\n              ? module.is.rtl()\n                ? parseInt( window.getComputedStyle(targetElement).getPropertyValue('margin-right'), 10)\n                : parseInt( window.getComputedStyle(targetElement).getPropertyValue('margin-left'), 10)\n              : 0\n            ;\n            // calculate screen boundaries\n            screen = calculations.screen;\n            calculations.boundary = {\n              top    : screen.top + screen.scroll.top,\n              bottom : screen.top + screen.scroll.top + screen.height,\n              left   : screen.left + screen.scroll.left,\n              right  : screen.left + screen.scroll.left + screen.width\n            };\n            return calculations;\n          },\n          id: function() {\n            return id;\n          },\n          startEvent: function() {\n            if(settings.on == 'hover') {\n              return 'mouseenter';\n            }\n            else if(settings.on == 'focus') {\n              return 'focus';\n            }\n            return false;\n          },\n          scrollEvent: function() {\n            return 'scroll';\n          },\n          endEvent: function() {\n            if(settings.on == 'hover') {\n              return 'mouseleave';\n            }\n            else if(settings.on == 'focus') {\n              return 'blur';\n            }\n            return false;\n          },\n          distanceFromBoundary: function(offset, calculations) {\n            var\n              distanceFromBoundary = {},\n              popup,\n              boundary\n            ;\n            calculations = calculations || module.get.calculations();\n\n            // shorthand\n            popup        = calculations.popup;\n            boundary     = calculations.boundary;\n\n            if(offset) {\n              distanceFromBoundary = {\n                top    : (offset.top - boundary.top),\n                left   : (offset.left - boundary.left),\n                right  : (boundary.right - (offset.left + popup.width) ),\n                bottom : (boundary.bottom - (offset.top + popup.height) )\n              };\n              module.verbose('Distance from boundaries determined', offset, distanceFromBoundary);\n            }\n            return distanceFromBoundary;\n          },\n          offsetParent: function($element) {\n            var\n              element = ($element !== undefined)\n                ? $element[0]\n                : $target[0],\n              parentNode = element.parentNode,\n              $node    = $(parentNode)\n            ;\n            if(parentNode) {\n              var\n                is2D     = ($node.css('transform') === 'none'),\n                isStatic = ($node.css('position') === 'static'),\n                isBody   = $node.is('body')\n              ;\n              while(parentNode && !isBody && isStatic && is2D) {\n                parentNode = parentNode.parentNode;\n                $node    = $(parentNode);\n                is2D     = ($node.css('transform') === 'none');\n                isStatic = ($node.css('position') === 'static');\n                isBody   = $node.is('body');\n              }\n            }\n            return ($node && $node.length > 0)\n              ? $node\n              : $()\n            ;\n          },\n          positions: function() {\n            return {\n              'top left'      : false,\n              'top center'    : false,\n              'top right'     : false,\n              'bottom left'   : false,\n              'bottom center' : false,\n              'bottom right'  : false,\n              'left center'   : false,\n              'right center'  : false\n            };\n          },\n          nextPosition: function(position) {\n            var\n              positions          = position.split(' '),\n              verticalPosition   = positions[0],\n              horizontalPosition = positions[1],\n              opposite = {\n                top    : 'bottom',\n                bottom : 'top',\n                left   : 'right',\n                right  : 'left'\n              },\n              adjacent = {\n                left   : 'center',\n                center : 'right',\n                right  : 'left'\n              },\n              backup = {\n                'top left'      : 'top center',\n                'top center'    : 'top right',\n                'top right'     : 'right center',\n                'right center'  : 'bottom right',\n                'bottom right'  : 'bottom center',\n                'bottom center' : 'bottom left',\n                'bottom left'   : 'left center',\n                'left center'   : 'top left'\n              },\n              adjacentsAvailable = (verticalPosition == 'top' || verticalPosition == 'bottom'),\n              oppositeTried = false,\n              adjacentTried = false,\n              nextPosition  = false\n            ;\n            if(!triedPositions) {\n              module.verbose('All available positions available');\n              triedPositions = module.get.positions();\n            }\n\n            module.debug('Recording last position tried', position);\n            triedPositions[position] = true;\n\n            if(settings.prefer === 'opposite') {\n              nextPosition  = [opposite[verticalPosition], horizontalPosition];\n              nextPosition  = nextPosition.join(' ');\n              oppositeTried = (triedPositions[nextPosition] === true);\n              module.debug('Trying opposite strategy', nextPosition);\n            }\n            if((settings.prefer === 'adjacent') && adjacentsAvailable ) {\n              nextPosition  = [verticalPosition, adjacent[horizontalPosition]];\n              nextPosition  = nextPosition.join(' ');\n              adjacentTried = (triedPositions[nextPosition] === true);\n              module.debug('Trying adjacent strategy', nextPosition);\n            }\n            if(adjacentTried || oppositeTried) {\n              module.debug('Using backup position', nextPosition);\n              nextPosition = backup[position];\n            }\n            return nextPosition;\n          }\n        },\n\n        set: {\n          position: function(position, calculations) {\n\n            // exit conditions\n            if($target.length === 0 || $popup.length === 0) {\n              module.error(error.notFound);\n              return;\n            }\n            var\n              offset,\n              distanceAway,\n              target,\n              popup,\n              parent,\n              positioning,\n              popupOffset,\n              distanceFromBoundary\n            ;\n\n            calculations = calculations || module.get.calculations();\n            position     = position     || $module.data(metadata.position) || settings.position;\n\n            offset       = $module.data(metadata.offset) || settings.offset;\n            distanceAway = settings.distanceAway;\n\n            // shorthand\n            target = calculations.target;\n            popup  = calculations.popup;\n            parent = calculations.parent;\n\n            if(module.should.centerArrow(calculations)) {\n              module.verbose('Adjusting offset to center arrow on small target element');\n              if(position == 'top left' || position == 'bottom left') {\n                offset += (target.width / 2)\n                offset -= settings.arrowPixelsFromEdge;\n              }\n              if(position == 'top right' || position == 'bottom right') {\n                offset -= (target.width / 2)\n                offset += settings.arrowPixelsFromEdge;\n              }\n            }\n\n            if(target.width === 0 && target.height === 0 && !module.is.svg(target.element)) {\n              module.debug('Popup target is hidden, no action taken');\n              return false;\n            }\n\n            if(settings.inline) {\n              module.debug('Adding margin to calculation', target.margin);\n              if(position == 'left center' || position == 'right center') {\n                offset       +=  target.margin.top;\n                distanceAway += -target.margin.left;\n              }\n              else if (position == 'top left' || position == 'top center' || position == 'top right') {\n                offset       += target.margin.left;\n                distanceAway -= target.margin.top;\n              }\n              else {\n                offset       += target.margin.left;\n                distanceAway += target.margin.top;\n              }\n            }\n\n            module.debug('Determining popup position from calculations', position, calculations);\n\n            if (module.is.rtl()) {\n              position = position.replace(/left|right/g, function (match) {\n                return (match == 'left')\n                  ? 'right'\n                  : 'left'\n                ;\n              });\n              module.debug('RTL: Popup position updated', position);\n            }\n\n            // if last attempt use specified last resort position\n            if(searchDepth == settings.maxSearchDepth && typeof settings.lastResort === 'string') {\n              position = settings.lastResort;\n            }\n\n            switch (position) {\n              case 'top left':\n                positioning = {\n                  top    : 'auto',\n                  bottom : parent.height - target.top + distanceAway,\n                  left   : target.left + offset,\n                  right  : 'auto'\n                };\n              break;\n              case 'top center':\n                positioning = {\n                  bottom : parent.height - target.top + distanceAway,\n                  left   : target.left + (target.width / 2) - (popup.width / 2) + offset,\n                  top    : 'auto',\n                  right  : 'auto'\n                };\n              break;\n              case 'top right':\n                positioning = {\n                  bottom :  parent.height - target.top + distanceAway,\n                  right  :  parent.width - target.left - target.width - offset,\n                  top    : 'auto',\n                  left   : 'auto'\n                };\n              break;\n              case 'left center':\n                positioning = {\n                  top    : target.top + (target.height / 2) - (popup.height / 2) + offset,\n                  right  : parent.width - target.left + distanceAway,\n                  left   : 'auto',\n                  bottom : 'auto'\n                };\n              break;\n              case 'right center':\n                positioning = {\n                  top    : target.top + (target.height / 2) - (popup.height / 2) + offset,\n                  left   : target.left + target.width + distanceAway,\n                  bottom : 'auto',\n                  right  : 'auto'\n                };\n              break;\n              case 'bottom left':\n                positioning = {\n                  top    : target.top + target.height + distanceAway,\n                  left   : target.left + offset,\n                  bottom : 'auto',\n                  right  : 'auto'\n                };\n              break;\n              case 'bottom center':\n                positioning = {\n                  top    : target.top + target.height + distanceAway,\n                  left   : target.left + (target.width / 2) - (popup.width / 2) + offset,\n                  bottom : 'auto',\n                  right  : 'auto'\n                };\n              break;\n              case 'bottom right':\n                positioning = {\n                  top    : target.top + target.height + distanceAway,\n                  right  : parent.width - target.left  - target.width - offset,\n                  left   : 'auto',\n                  bottom : 'auto'\n                };\n              break;\n            }\n            if(positioning === undefined) {\n              module.error(error.invalidPosition, position);\n            }\n\n            module.debug('Calculated popup positioning values', positioning);\n\n            // tentatively place on stage\n            $popup\n              .css(positioning)\n              .removeClass(className.position)\n              .addClass(position)\n              .addClass(className.loading)\n            ;\n\n            popupOffset = module.get.popupOffset();\n\n            // see if any boundaries are surpassed with this tentative position\n            distanceFromBoundary = module.get.distanceFromBoundary(popupOffset, calculations);\n\n            if( module.is.offstage(distanceFromBoundary, position) ) {\n              module.debug('Position is outside viewport', position);\n              if(searchDepth < settings.maxSearchDepth) {\n                searchDepth++;\n                position = module.get.nextPosition(position);\n                module.debug('Trying new position', position);\n                return ($popup)\n                  ? module.set.position(position, calculations)\n                  : false\n                ;\n              }\n              else {\n                if(settings.lastResort) {\n                  module.debug('No position found, showing with last position');\n                }\n                else {\n                  module.debug('Popup could not find a position to display', $popup);\n                  module.error(error.cannotPlace, element);\n                  module.remove.attempts();\n                  module.remove.loading();\n                  module.reset();\n                  settings.onUnplaceable.call($popup, element);\n                  return false;\n                }\n              }\n            }\n            module.debug('Position is on stage', position);\n            module.remove.attempts();\n            module.remove.loading();\n            if( settings.setFluidWidth && module.is.fluid() ) {\n              module.set.fluidWidth(calculations);\n            }\n            return true;\n          },\n\n          fluidWidth: function(calculations) {\n            calculations = calculations || module.get.calculations();\n            module.debug('Automatically setting element width to parent width', calculations.parent.width);\n            $popup.css('width', calculations.container.width);\n          },\n\n          variation: function(variation) {\n            variation = variation || module.get.variation();\n            if(variation && module.has.popup() ) {\n              module.verbose('Adding variation to popup', variation);\n              $popup.addClass(variation);\n            }\n          },\n\n          visible: function() {\n            $module.addClass(className.visible);\n          }\n        },\n\n        remove: {\n          loading: function() {\n            $popup.removeClass(className.loading);\n          },\n          variation: function(variation) {\n            variation = variation || module.get.variation();\n            if(variation) {\n              module.verbose('Removing variation', variation);\n              $popup.removeClass(variation);\n            }\n          },\n          visible: function() {\n            $module.removeClass(className.visible);\n          },\n          attempts: function() {\n            module.verbose('Resetting all searched positions');\n            searchDepth    = 0;\n            triedPositions = false;\n          }\n        },\n\n        bind: {\n          events: function() {\n            module.debug('Binding popup events to module');\n            if(settings.on == 'click') {\n              $module\n                .on('click' + eventNamespace, module.toggle)\n              ;\n            }\n            if(settings.on == 'hover' && hasTouch) {\n              $module\n                .on('touchstart' + eventNamespace, module.event.touchstart)\n              ;\n            }\n            if( module.get.startEvent() ) {\n              $module\n                .on(module.get.startEvent() + eventNamespace, module.event.start)\n                .on(module.get.endEvent() + eventNamespace, module.event.end)\n              ;\n            }\n            if(settings.target) {\n              module.debug('Target set to element', $target);\n            }\n            $window.on('resize' + elementNamespace, module.event.resize);\n          },\n          popup: function() {\n            module.verbose('Allowing hover events on popup to prevent closing');\n            if( $popup && module.has.popup() ) {\n              $popup\n                .on('mouseenter' + eventNamespace, module.event.start)\n                .on('mouseleave' + eventNamespace, module.event.end)\n              ;\n            }\n          },\n          close: function() {\n            if(settings.hideOnScroll === true || (settings.hideOnScroll == 'auto' && settings.on != 'click')) {\n              module.bind.closeOnScroll();\n            }\n            if(settings.on == 'hover' && openedWithTouch) {\n              module.bind.touchClose();\n            }\n            if(settings.on == 'click' && settings.closable) {\n              module.bind.clickaway();\n            }\n          },\n          closeOnScroll: function() {\n            module.verbose('Binding scroll close event to document');\n            $scrollContext\n              .one(module.get.scrollEvent() + elementNamespace, module.event.hideGracefully)\n            ;\n          },\n          touchClose: function() {\n            module.verbose('Binding popup touchclose event to document');\n            $document\n              .on('touchstart' + elementNamespace, function(event) {\n                module.verbose('Touched away from popup');\n                module.event.hideGracefully.call(element, event);\n              })\n            ;\n          },\n          clickaway: function() {\n            module.verbose('Binding popup close event to document');\n            $document\n              .on('click' + elementNamespace, function(event) {\n                module.verbose('Clicked away from popup');\n                module.event.hideGracefully.call(element, event);\n              })\n            ;\n          }\n        },\n\n        unbind: {\n          events: function() {\n            $window\n              .off(elementNamespace)\n            ;\n            $module\n              .off(eventNamespace)\n            ;\n          },\n          close: function() {\n            $document\n              .off(elementNamespace)\n            ;\n            $scrollContext\n              .off(elementNamespace)\n            ;\n          },\n        },\n\n        has: {\n          popup: function() {\n            return ($popup && $popup.length > 0);\n          }\n        },\n\n        should: {\n          centerArrow: function(calculations) {\n            return !module.is.basic() && calculations.target.width <= (settings.arrowPixelsFromEdge * 2);\n          }\n        },\n\n        is: {\n          offstage: function(distanceFromBoundary, position) {\n            var\n              offstage = []\n            ;\n            // return boundaries that have been surpassed\n            $.each(distanceFromBoundary, function(direction, distance) {\n              if(distance < -settings.jitter) {\n                module.debug('Position exceeds allowable distance from edge', direction, distance, position);\n                offstage.push(direction);\n              }\n            });\n            if(offstage.length > 0) {\n              return true;\n            }\n            else {\n              return false;\n            }\n          },\n          svg: function(element) {\n            return module.supports.svg() && (element instanceof SVGGraphicsElement);\n          },\n          basic: function() {\n            return $module.hasClass(className.basic);\n          },\n          active: function() {\n            return $module.hasClass(className.active);\n          },\n          animating: function() {\n            return ($popup !== undefined && $popup.hasClass(className.animating) );\n          },\n          fluid: function() {\n            return ($popup !== undefined && $popup.hasClass(className.fluid));\n          },\n          visible: function() {\n            return ($popup !== undefined && $popup.hasClass(className.popupVisible));\n          },\n          dropdown: function() {\n            return $module.hasClass(className.dropdown);\n          },\n          hidden: function() {\n            return !module.is.visible();\n          },\n          rtl: function () {\n            return $module.css('direction') == 'rtl';\n          }\n        },\n\n        reset: function() {\n          module.remove.visible();\n          if(settings.preserve) {\n            if($.fn.transition !== undefined) {\n              $popup\n                .transition('remove transition')\n              ;\n            }\n          }\n          else {\n            module.removePopup();\n          }\n        },\n\n        setting: function(name, value) {\n          if( $.isPlainObject(name) ) {\n            $.extend(true, settings, name);\n          }\n          else if(value !== undefined) {\n            settings[name] = value;\n          }\n          else {\n            return settings[name];\n          }\n        },\n        internal: function(name, value) {\n          if( $.isPlainObject(name) ) {\n            $.extend(true, module, name);\n          }\n          else if(value !== undefined) {\n            module[name] = value;\n          }\n          else {\n            return module[name];\n          }\n        },\n        debug: function() {\n          if(!settings.silent && settings.debug) {\n            if(settings.performance) {\n              module.performance.log(arguments);\n            }\n            else {\n              module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');\n              module.debug.apply(console, arguments);\n            }\n          }\n        },\n        verbose: function() {\n          if(!settings.silent && settings.verbose && settings.debug) {\n            if(settings.performance) {\n              module.performance.log(arguments);\n            }\n            else {\n              module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');\n              module.verbose.apply(console, arguments);\n            }\n          }\n        },\n        error: function() {\n          if(!settings.silent) {\n            module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');\n            module.error.apply(console, arguments);\n          }\n        },\n        performance: {\n          log: function(message) {\n            var\n              currentTime,\n              executionTime,\n              previousTime\n            ;\n            if(settings.performance) {\n              currentTime   = new Date().getTime();\n              previousTime  = time || currentTime;\n              executionTime = currentTime - previousTime;\n              time          = currentTime;\n              performance.push({\n                'Name'           : message[0],\n                'Arguments'      : [].slice.call(message, 1) || '',\n                'Element'        : element,\n                'Execution Time' : executionTime\n              });\n            }\n            clearTimeout(module.performance.timer);\n            module.performance.timer = setTimeout(module.performance.display, 500);\n          },\n          display: function() {\n            var\n              title = settings.name + ':',\n              totalTime = 0\n            ;\n            time = false;\n            clearTimeout(module.performance.timer);\n            $.each(performance, function(index, data) {\n              totalTime += data['Execution Time'];\n            });\n            title += ' ' + totalTime + 'ms';\n            if(moduleSelector) {\n              title += ' \\'' + moduleSelector + '\\'';\n            }\n            if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {\n              console.groupCollapsed(title);\n              if(console.table) {\n                console.table(performance);\n              }\n              else {\n                $.each(performance, function(index, data) {\n                  console.log(data['Name'] + ': ' + data['Execution Time']+'ms');\n                });\n              }\n              console.groupEnd();\n            }\n            performance = [];\n          }\n        },\n        invoke: function(query, passedArguments, context) {\n          var\n            object = instance,\n            maxDepth,\n            found,\n            response\n          ;\n          passedArguments = passedArguments || queryArguments;\n          context         = element         || context;\n          if(typeof query == 'string' && object !== undefined) {\n            query    = query.split(/[\\. ]/);\n            maxDepth = query.length - 1;\n            $.each(query, function(depth, value) {\n              var camelCaseValue = (depth != maxDepth)\n                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)\n                : query\n              ;\n              if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {\n                object = object[camelCaseValue];\n              }\n              else if( object[camelCaseValue] !== undefined ) {\n                found = object[camelCaseValue];\n                return false;\n              }\n              else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {\n                object = object[value];\n              }\n              else if( object[value] !== undefined ) {\n                found = object[value];\n                return false;\n              }\n              else {\n                return false;\n              }\n            });\n          }\n          if ( $.isFunction( found ) ) {\n            response = found.apply(context, passedArguments);\n          }\n          else if(found !== undefined) {\n            response = found;\n          }\n          if($.isArray(returnedValue)) {\n            returnedValue.push(response);\n          }\n          else if(returnedValue !== undefined) {\n            returnedValue = [returnedValue, response];\n          }\n          else if(response !== undefined) {\n            returnedValue = response;\n          }\n          return found;\n        }\n      };\n\n      if(methodInvoked) {\n        if(instance === undefined) {\n          module.initialize();\n        }\n        module.invoke(query);\n      }\n      else {\n        if(instance !== undefined) {\n          instance.invoke('destroy');\n        }\n        module.initialize();\n      }\n    })\n  ;\n\n  return (returnedValue !== undefined)\n    ? returnedValue\n    : this\n  ;\n};\n\n$.fn.popup.settings = {\n\n  name           : 'Popup',\n\n  // module settings\n  silent         : false,\n  debug          : false,\n  verbose        : false,\n  performance    : true,\n  namespace      : 'popup',\n\n  // whether it should use dom mutation observers\n  observeChanges : true,\n\n  // callback only when element added to dom\n  onCreate       : function(){},\n\n  // callback before element removed from dom\n  onRemove       : function(){},\n\n  // callback before show animation\n  onShow         : function(){},\n\n  // callback after show animation\n  onVisible      : function(){},\n\n  // callback before hide animation\n  onHide         : function(){},\n\n  // callback when popup cannot be positioned in visible screen\n  onUnplaceable  : function(){},\n\n  // callback after hide animation\n  onHidden       : function(){},\n\n  // when to show popup\n  on             : 'hover',\n\n  // element to use to determine if popup is out of boundary\n  boundary       : window,\n\n  // whether to add touchstart events when using hover\n  addTouchEvents : true,\n\n  // default position relative to element\n  position       : 'top left',\n\n  // name of variation to use\n  variation      : '',\n\n  // whether popup should be moved to context\n  movePopup      : true,\n\n  // element which popup should be relative to\n  target         : false,\n\n  // jq selector or element that should be used as popup\n  popup          : false,\n\n  // popup should remain inline next to activator\n  inline         : false,\n\n  // popup should be removed from page on hide\n  preserve       : false,\n\n  // popup should not close when being hovered on\n  hoverable      : false,\n\n  // explicitly set content\n  content        : false,\n\n  // explicitly set html\n  html           : false,\n\n  // explicitly set title\n  title          : false,\n\n  // whether automatically close on clickaway when on click\n  closable       : true,\n\n  // automatically hide on scroll\n  hideOnScroll   : 'auto',\n\n  // hide other popups on show\n  exclusive      : false,\n\n  // context to attach popups\n  context        : 'body',\n\n  // context for binding scroll events\n  scrollContext  : window,\n\n  // position to prefer when calculating new position\n  prefer         : 'opposite',\n\n  // specify position to appear even if it doesn't fit\n  lastResort     : false,\n\n  // number of pixels from edge of popup to pointing arrow center (used from centering)\n  arrowPixelsFromEdge: 20,\n\n  // delay used to prevent accidental refiring of animations due to user error\n  delay : {\n    show : 50,\n    hide : 70\n  },\n\n  // whether fluid variation should assign width explicitly\n  setFluidWidth  : true,\n\n  // transition settings\n  duration       : 200,\n  transition     : 'scale',\n\n  // distance away from activating element in px\n  distanceAway   : 0,\n\n  // number of pixels an element is allowed to be \"offstage\" for a position to be chosen (allows for rounding)\n  jitter         : 2,\n\n  // offset on aligning axis from calculated position\n  offset         : 0,\n\n  // maximum times to look for a position before failing (9 positions total)\n  maxSearchDepth : 15,\n\n  error: {\n    invalidPosition : 'The position you specified is not a valid position',\n    cannotPlace     : 'Popup does not fit within the boundaries of the viewport',\n    method          : 'The method you called is not defined.',\n    noTransition    : 'This module requires ui transitions <https://github.com/Semantic-Org/UI-Transition>',\n    notFound        : 'The target or popup you specified does not exist on the page'\n  },\n\n  metadata: {\n    activator : 'activator',\n    content   : 'content',\n    html      : 'html',\n    offset    : 'offset',\n    position  : 'position',\n    title     : 'title',\n    variation : 'variation'\n  },\n\n  className   : {\n    active       : 'active',\n    basic        : 'basic',\n    animating    : 'animating',\n    dropdown     : 'dropdown',\n    fluid        : 'fluid',\n    loading      : 'loading',\n    popup        : 'ui popup',\n    position     : 'top left center bottom right',\n    visible      : 'visible',\n    popupVisible : 'visible'\n  },\n\n  selector    : {\n    popup    : '.ui.popup'\n  },\n\n  templates: {\n    escape: function(string) {\n      var\n        badChars     = /[&<>\"'`]/g,\n        shouldEscape = /[&<>\"'`]/,\n        escape       = {\n          \"&\": \"&amp;\",\n          \"<\": \"&lt;\",\n          \">\": \"&gt;\",\n          '\"': \"&quot;\",\n          \"'\": \"&#x27;\",\n          \"`\": \"&#x60;\"\n        },\n        escapedChar  = function(chr) {\n          return escape[chr];\n        }\n      ;\n      if(shouldEscape.test(string)) {\n        return string.replace(badChars, escapedChar);\n      }\n      return string;\n    },\n    popup: function(text) {\n      var\n        html   = '',\n        escape = $.fn.popup.settings.templates.escape\n      ;\n      if(typeof text !== undefined) {\n        if(typeof text.title !== undefined && text.title) {\n          text.title = escape(text.title);\n          html += '<div class=\"header\">' + text.title + '</div>';\n        }\n        if(typeof text.content !== undefined && text.content) {\n          text.content = escape(text.content);\n          html += '<div class=\"content\">' + text.content + '</div>';\n        }\n      }\n      return html;\n    }\n  }\n\n};\n\n\n})( jQuery, window, document );\n"
  },
  {
    "path": "semantic/src/definitions/modules/popup.less",
    "content": "/*!\n * # Semantic UI - Popup\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n            Theme\n*******************************/\n\n@type    : 'module';\n@element : 'popup';\n\n@import (multiple) '../../theme.config';\n\n\n/*******************************\n            Popup\n*******************************/\n\n.ui.popup {\n  display: none;\n  position: absolute;\n  top: 0px;\n  right: 0px;\n\n  /* Fixes content being squished when inline (moz only) */\n  min-width: min-content;\n  z-index: @zIndex;\n\n  border: @border;\n  line-height: @lineHeight;\n  max-width: @maxWidth;\n  background: @background;\n\n  padding: @verticalPadding @horizontalPadding;\n  font-weight: @fontWeight;\n  font-style: @fontStyle;\n  color: @color;\n\n  border-radius: @borderRadius;\n  box-shadow: @boxShadow;\n}\n.ui.popup > .header {\n  padding: 0em;\n\n  font-family: @headerFont;\n  font-size: @headerFontSize;\n  line-height: @headerLineHeight;\n  font-weight: @headerFontWeight;\n}\n.ui.popup > .header + .content {\n  padding-top: @headerDistance;\n}\n\n.ui.popup:before {\n  position: absolute;\n  content: '';\n  width: @arrowSize;\n  height: @arrowSize;\n\n  background: @arrowBackground;\n  transform: rotate(45deg);\n\n  z-index: @arrowZIndex;\n  box-shadow: @arrowBoxShadow;\n}\n\n/*******************************\n            Types\n*******************************/\n\n/*--------------\n    Tooltip\n---------------*/\n\n/* Content */\n[data-tooltip] {\n  position: relative;\n}\n\n/* Arrow */\n[data-tooltip]:before {\n  pointer-events: none;\n  position: absolute;\n  content: '';\n  font-size: @medium;\n  width: @arrowSize;\n  height: @arrowSize;\n\n  background: @tooltipArrowBackground;\n  transform: rotate(45deg);\n\n  z-index: @arrowZIndex;\n  box-shadow: @tooltipArrowBoxShadow;\n}\n\n/* Popup */\n[data-tooltip]:after {\n  pointer-events: none;\n  content: attr(data-tooltip);\n  position: absolute;\n  text-transform: none;\n  text-align: left;\n  white-space: nowrap;\n\n  font-size: @tooltipFontSize;\n\n  border: @tooltipBorder;\n  line-height: @tooltipLineHeight;\n  max-width: @tooltipMaxWidth;\n  background: @tooltipBackground;\n\n  padding: @tooltipPadding;\n  font-weight: @tooltipFontWeight;\n  font-style: @tooltipFontStyle;\n  color: @tooltipColor;\n\n  border-radius: @tooltipBorderRadius;\n  box-shadow: @tooltipBoxShadow;\n  z-index: @tooltipZIndex;\n}\n\n/* Default Position (Top Center) */\n[data-tooltip]:not([data-position]):before {\n  top: auto;\n  right: auto;\n  bottom: 100%;\n  left: 50%;\n  background: @tooltipArrowBottomBackground;\n  margin-left: @tooltipArrowHorizontalOffset;\n  margin-bottom: -@tooltipArrowVerticalOffset;\n}\n[data-tooltip]:not([data-position]):after {\n  left: 50%;\n  transform: translateX(-50%);\n  bottom: 100%;\n  margin-bottom: @tooltipDistanceAway;\n}\n\n/* Animation */\n[data-tooltip]:before,\n[data-tooltip]:after {\n  pointer-events: none;\n  visibility: hidden;\n}\n[data-tooltip]:before {\n  opacity: 0;\n  transform: rotate(45deg) scale(0) !important;\n  transform-origin: center top;\n  transition:\n    all @tooltipDuration @tooltipEasing\n  ;\n}\n[data-tooltip]:after {\n  opacity: 1;\n  transform-origin: center bottom;\n  transition:\n    all @tooltipDuration @tooltipEasing\n  ;\n}\n[data-tooltip]:hover:before,\n[data-tooltip]:hover:after {\n  visibility: visible;\n  pointer-events: auto;\n}\n[data-tooltip]:hover:before {\n  transform: rotate(45deg) scale(1) !important;\n  opacity: 1;\n}\n\n/* Animation Position */\n[data-tooltip]:after,\n[data-tooltip][data-position=\"top center\"]:after,\n[data-tooltip][data-position=\"bottom center\"]:after {\n  transform: translateX(-50%) scale(0) !important;\n}\n[data-tooltip]:hover:after,\n[data-tooltip][data-position=\"bottom center\"]:hover:after {\n  transform: translateX(-50%) scale(1) !important;\n}\n[data-tooltip][data-position=\"left center\"]:after,\n[data-tooltip][data-position=\"right center\"]:after {\n  transform: translateY(-50%) scale(0) !important;\n}\n[data-tooltip][data-position=\"left center\"]:hover:after,\n[data-tooltip][data-position=\"right center\"]:hover:after {\n  transform: translateY(-50%) scale(1) !important;\n}\n[data-tooltip][data-position=\"top left\"]:after,\n[data-tooltip][data-position=\"top right\"]:after,\n[data-tooltip][data-position=\"bottom left\"]:after,\n[data-tooltip][data-position=\"bottom right\"]:after {\n  transform: scale(0) !important;\n}\n[data-tooltip][data-position=\"top left\"]:hover:after,\n[data-tooltip][data-position=\"top right\"]:hover:after,\n[data-tooltip][data-position=\"bottom left\"]:hover:after,\n[data-tooltip][data-position=\"bottom right\"]:hover:after {\n  transform: scale(1) !important;\n}\n\n\n/*--------------\n    Inverted\n---------------*/\n\n/* Arrow */\n[data-tooltip][data-inverted]:before {\n  box-shadow: none !important;\n}\n\n/* Arrow Position */\n[data-tooltip][data-inverted]:before {\n  background: @invertedArrowBottomBackground;\n}\n\n/* Popup  */\n[data-tooltip][data-inverted]:after {\n  background: @tooltipInvertedBackground;\n  color: @tooltipInvertedColor;\n  border: @tooltipInvertedBorder;\n  box-shadow: @tooltipInvertedBoxShadow;\n}\n[data-tooltip][data-inverted]:after .header {\n  background-color: @tooltipInvertedHeaderBackground;\n  color: @tooltipInvertedHeaderColor;\n}\n\n/*--------------\n    Position\n---------------*/\n\n/* Top Center */\n[data-position=\"top center\"][data-tooltip]:after {\n  top: auto;\n  right: auto;\n  left: 50%;\n  bottom: 100%;\n  transform: translateX(-50%);\n  margin-bottom: @tooltipDistanceAway;\n}\n[data-position=\"top center\"][data-tooltip]:before {\n  top: auto;\n  right: auto;\n  bottom: 100%;\n  left: 50%;\n  background: @tooltipArrowTopBackground;\n  margin-left: @tooltipArrowHorizontalOffset;\n  margin-bottom: -@tooltipArrowVerticalOffset;\n}\n\n/* Top Left */\n[data-position=\"top left\"][data-tooltip]:after {\n  top: auto;\n  right: auto;\n  left: 0;\n  bottom: 100%;\n  margin-bottom: @tooltipDistanceAway;\n}\n[data-position=\"top left\"][data-tooltip]:before {\n  top: auto;\n  right: auto;\n  bottom: 100%;\n  left: @arrowDistanceFromEdge;\n  margin-left: @tooltipArrowHorizontalOffset;\n  margin-bottom: -@tooltipArrowVerticalOffset;\n}\n\n/* Top Right */\n[data-position=\"top right\"][data-tooltip]:after {\n  top: auto;\n  left: auto;\n  right: 0;\n  bottom: 100%;\n  margin-bottom: @tooltipDistanceAway;\n}\n[data-position=\"top right\"][data-tooltip]:before {\n  top: auto;\n  left: auto;\n  bottom: 100%;\n  right: @arrowDistanceFromEdge;\n  margin-left: @tooltipArrowHorizontalOffset;\n  margin-bottom: -@tooltipArrowVerticalOffset;\n}\n\n\n/* Bottom Center */\n[data-position=\"bottom center\"][data-tooltip]:after {\n  bottom: auto;\n  right: auto;\n  left: 50%;\n  top: 100%;\n  transform: translateX(-50%);\n  margin-top: @tooltipDistanceAway;\n}\n[data-position=\"bottom center\"][data-tooltip]:before {\n  bottom: auto;\n  right: auto;\n  top: 100%;\n  left: 50%;\n  margin-left: @tooltipArrowHorizontalOffset;\n  margin-top: -@tooltipArrowVerticalOffset;\n}\n\n/* Bottom Left */\n[data-position=\"bottom left\"][data-tooltip]:after {\n  left: 0;\n  top: 100%;\n  margin-top: @tooltipDistanceAway;\n}\n[data-position=\"bottom left\"][data-tooltip]:before {\n  bottom: auto;\n  right: auto;\n  top: 100%;\n  left: @arrowDistanceFromEdge;\n  margin-left: @tooltipArrowHorizontalOffset;\n  margin-top: -@tooltipArrowVerticalOffset;\n}\n\n/* Bottom Right */\n[data-position=\"bottom right\"][data-tooltip]:after {\n  right: 0;\n  top: 100%;\n  margin-top: @tooltipDistanceAway;\n}\n[data-position=\"bottom right\"][data-tooltip]:before {\n  bottom: auto;\n  left: auto;\n  top: 100%;\n  right: @arrowDistanceFromEdge;\n  margin-left: @tooltipArrowVerticalOffset;\n  margin-top: -@tooltipArrowHorizontalOffset;\n}\n\n/* Left Center */\n[data-position=\"left center\"][data-tooltip]:after {\n  right: 100%;\n  top: 50%;\n  margin-right: @tooltipDistanceAway;\n  transform: translateY(-50%);\n}\n[data-position=\"left center\"][data-tooltip]:before {\n  right: 100%;\n  top: 50%;\n  margin-top: @tooltipArrowVerticalOffset;\n  margin-right: @tooltipArrowHorizontalOffset;\n}\n\n/* Right Center */\n[data-position=\"right center\"][data-tooltip]:after {\n  left: 100%;\n  top: 50%;\n  margin-left: @tooltipDistanceAway;\n  transform: translateY(-50%);\n}\n[data-position=\"right center\"][data-tooltip]:before {\n  left: 100%;\n  top: 50%;\n  margin-top: @tooltipArrowHorizontalOffset;\n  margin-left: -@tooltipArrowVerticalOffset;\n}\n\n/* Arrow */\n[data-position~=\"bottom\"][data-tooltip]:before {\n  background: @arrowTopBackground;\n  box-shadow: @bottomArrowBoxShadow;\n}\n[data-position=\"left center\"][data-tooltip]:before {\n  background: @arrowCenterBackground;\n  box-shadow: @leftArrowBoxShadow;\n}\n[data-position=\"right center\"][data-tooltip]:before {\n  background: @arrowCenterBackground;\n  box-shadow: @rightArrowBoxShadow;\n}\n[data-position~=\"top\"][data-tooltip]:before {\n  background: @arrowBottomBackground;\n}\n\n/* Inverted Arrow Color */\n[data-inverted][data-position~=\"bottom\"][data-tooltip]:before {\n  background: @invertedArrowTopBackground;\n  box-shadow: @bottomArrowBoxShadow;\n}\n[data-inverted][data-position=\"left center\"][data-tooltip]:before {\n  background: @invertedArrowCenterBackground;\n  box-shadow: @leftArrowBoxShadow;\n}\n[data-inverted][data-position=\"right center\"][data-tooltip]:before {\n  background: @invertedArrowCenterBackground;\n  box-shadow: @rightArrowBoxShadow;\n}\n[data-inverted][data-position~=\"top\"][data-tooltip]:before {\n  background: @invertedArrowBottomBackground;\n}\n\n[data-position~=\"bottom\"][data-tooltip]:before {\n  transform-origin: center bottom;\n}\n[data-position~=\"bottom\"][data-tooltip]:after {\n  transform-origin: center top;\n}\n[data-position=\"left center\"][data-tooltip]:before {\n  transform-origin: top center;\n}\n[data-position=\"left center\"][data-tooltip]:after {\n  transform-origin: right center;\n}\n[data-position=\"right center\"][data-tooltip]:before {\n  transform-origin: right center;\n}\n[data-position=\"right center\"][data-tooltip]:after {\n  transform-origin: left center;\n}\n\n/*--------------\n     Spacing\n---------------*/\n\n.ui.popup {\n  margin: 0em;\n}\n\n/* Extending from Top */\n.ui.top.popup {\n  margin: 0em 0em @popupDistanceAway;\n}\n.ui.top.left.popup {\n  transform-origin: left bottom;\n}\n.ui.top.center.popup {\n  transform-origin: center bottom;\n}\n.ui.top.right.popup {\n  transform-origin: right bottom;\n}\n\n/* Extending from Vertical Center */\n.ui.left.center.popup {\n  margin: 0em @popupDistanceAway 0em 0em;\n  transform-origin: right 50%;\n}\n.ui.right.center.popup {\n  margin: 0em 0em 0em @popupDistanceAway;\n  transform-origin: left 50%;\n}\n\n/* Extending from Bottom */\n.ui.bottom.popup {\n  margin: @popupDistanceAway 0em 0em;\n}\n.ui.bottom.left.popup {\n  transform-origin: left top;\n}\n.ui.bottom.center.popup {\n  transform-origin: center top;\n}\n.ui.bottom.right.popup {\n  transform-origin: right top;\n}\n\n/*--------------\n     Pointer\n---------------*/\n\n/*--- Below ---*/\n.ui.bottom.center.popup:before {\n  margin-left: @arrowOffset;\n  top: @arrowOffset;\n  left: 50%;\n  right: auto;\n  bottom: auto;\n  box-shadow: @bottomArrowBoxShadow;\n}\n\n.ui.bottom.left.popup {\n  margin-left: @boxArrowOffset;\n}\n/*rtl:rename*/\n.ui.bottom.left.popup:before {\n  top: @arrowOffset;\n  left: @arrowDistanceFromEdge;\n  right: auto;\n  bottom: auto;\n  margin-left: 0em;\n  box-shadow: @bottomArrowBoxShadow;\n}\n\n.ui.bottom.right.popup {\n  margin-right: @boxArrowOffset;\n}\n/*rtl:rename*/\n.ui.bottom.right.popup:before {\n  top: @arrowOffset;\n  right: @arrowDistanceFromEdge;\n  bottom: auto;\n  left: auto;\n  margin-left: 0em;\n  box-shadow: @bottomArrowBoxShadow;\n}\n\n/*--- Above ---*/\n.ui.top.center.popup:before {\n  top: auto;\n  right: auto;\n  bottom: @arrowOffset;\n  left: 50%;\n  margin-left: @arrowOffset;\n}\n.ui.top.left.popup {\n  margin-left: @boxArrowOffset;\n}\n/*rtl:rename*/\n.ui.top.left.popup:before {\n  bottom: @arrowOffset;\n  left: @arrowDistanceFromEdge;\n  top: auto;\n  right: auto;\n  margin-left: 0em;\n}\n.ui.top.right.popup {\n  margin-right: @boxArrowOffset;\n}\n/*rtl:rename*/\n.ui.top.right.popup:before {\n  bottom: @arrowOffset;\n  right: @arrowDistanceFromEdge;\n  top: auto;\n  left: auto;\n  margin-left: 0em;\n}\n\n/*--- Left Center ---*/\n/*rtl:rename*/\n.ui.left.center.popup:before {\n  top: 50%;\n  right: @arrowOffset;\n  bottom: auto;\n  left: auto;\n  margin-top: @arrowOffset;\n  box-shadow: @leftArrowBoxShadow;\n}\n\n/*--- Right Center  ---*/\n/*rtl:rename*/\n.ui.right.center.popup:before {\n  top: 50%;\n  left: @arrowOffset;\n  bottom: auto;\n  right: auto;\n  margin-top: @arrowOffset;\n  box-shadow: @rightArrowBoxShadow;\n}\n\n/* Arrow Color By Location */\n.ui.bottom.popup:before {\n  background: @arrowTopBackground;\n}\n.ui.right.center.popup:before,\n.ui.left.center.popup:before {\n  background: @arrowCenterBackground;\n}\n.ui.top.popup:before {\n  background: @arrowBottomBackground;\n}\n\n/* Inverted Arrow Color */\n.ui.inverted.bottom.popup:before {\n  background: @invertedArrowTopBackground;\n}\n.ui.inverted.right.center.popup:before,\n.ui.inverted.left.center.popup:before {\n  background: @invertedArrowCenterBackground;\n}\n.ui.inverted.top.popup:before {\n  background: @invertedArrowBottomBackground;\n}\n\n\n/*******************************\n            Coupling\n*******************************/\n\n/* Immediate Nested Grid */\n.ui.popup > .ui.grid:not(.padded) {\n  width: @nestedGridWidth;\n  margin: @nestedGridMargin;\n}\n\n/*******************************\n            States\n*******************************/\n\n.ui.loading.popup {\n  display: block;\n  visibility: hidden;\n  z-index: @loadingZIndex;\n}\n\n.ui.animating.popup,\n.ui.visible.popup {\n  display: block;\n}\n\n.ui.visible.popup {\n  transform: translateZ(0px);\n  backface-visibility: hidden;\n}\n\n\n/*******************************\n            Variations\n*******************************/\n\n/*--------------\n     Basic\n---------------*/\n\n.ui.basic.popup:before {\n  display: none;\n}\n\n\n/*--------------\n     Wide\n---------------*/\n\n.ui.wide.popup {\n  max-width: @wideWidth;\n}\n.ui[class*=\"very wide\"].popup {\n  max-width: @veryWideWidth;\n}\n\n@media only screen and (max-width: @largestMobileScreen) {\n  .ui.wide.popup,\n  .ui[class*=\"very wide\"].popup {\n    max-width: @maxWidth;\n  }\n}\n\n\n/*--------------\n     Fluid\n---------------*/\n\n.ui.fluid.popup {\n  width: 100%;\n  max-width: none;\n}\n\n\n/*--------------\n     Colors\n---------------*/\n\n/* Inverted colors  */\n.ui.inverted.popup {\n  background: @invertedBackground;\n  color: @invertedColor;\n  border: @invertedBorder;\n  box-shadow: @invertedBoxShadow;\n}\n.ui.inverted.popup .header {\n  background-color: @invertedHeaderBackground;\n  color: @invertedHeaderColor;\n}\n.ui.inverted.popup:before {\n  background-color: @invertedArrowColor;\n  box-shadow: none !important;\n}\n\n/*--------------\n     Flowing\n---------------*/\n\n.ui.flowing.popup {\n  max-width: none;\n}\n\n\n/*--------------\n     Sizes\n---------------*/\n\n.ui.mini.popup {\n  font-size: @mini;\n}\n.ui.tiny.popup {\n  font-size: @tiny;\n}\n.ui.small.popup {\n  font-size: @small;\n}\n.ui.popup {\n  font-size: @medium;\n}\n.ui.large.popup {\n  font-size: @large;\n}\n.ui.huge.popup {\n  font-size: @huge;\n}\n\n\n.loadUIOverrides();\n"
  },
  {
    "path": "semantic/src/definitions/modules/progress.js",
    "content": "/*!\n * # Semantic UI - Progress\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n;(function ($, window, document, undefined) {\n\n'use strict';\n\nwindow = (typeof window != 'undefined' && window.Math == Math)\n  ? window\n  : (typeof self != 'undefined' && self.Math == Math)\n    ? self\n    : Function('return this')()\n;\n\nvar\n  global = (typeof window != 'undefined' && window.Math == Math)\n    ? window\n    : (typeof self != 'undefined' && self.Math == Math)\n      ? self\n      : Function('return this')()\n;\n\n$.fn.progress = function(parameters) {\n  var\n    $allModules    = $(this),\n\n    moduleSelector = $allModules.selector || '',\n\n    time           = new Date().getTime(),\n    performance    = [],\n\n    query          = arguments[0],\n    methodInvoked  = (typeof query == 'string'),\n    queryArguments = [].slice.call(arguments, 1),\n\n    returnedValue\n  ;\n\n  $allModules\n    .each(function() {\n      var\n        settings          = ( $.isPlainObject(parameters) )\n          ? $.extend(true, {}, $.fn.progress.settings, parameters)\n          : $.extend({}, $.fn.progress.settings),\n\n        className       = settings.className,\n        metadata        = settings.metadata,\n        namespace       = settings.namespace,\n        selector        = settings.selector,\n        error           = settings.error,\n\n        eventNamespace  = '.' + namespace,\n        moduleNamespace = 'module-' + namespace,\n\n        $module         = $(this),\n        $bar            = $(this).find(selector.bar),\n        $progress       = $(this).find(selector.progress),\n        $label          = $(this).find(selector.label),\n\n        element         = this,\n        instance        = $module.data(moduleNamespace),\n\n        animating = false,\n        transitionEnd,\n        module\n      ;\n\n      module = {\n\n        initialize: function() {\n          module.debug('Initializing progress bar', settings);\n\n          module.set.duration();\n          module.set.transitionEvent();\n\n          module.read.metadata();\n          module.read.settings();\n\n          module.instantiate();\n        },\n\n        instantiate: function() {\n          module.verbose('Storing instance of progress', module);\n          instance = module;\n          $module\n            .data(moduleNamespace, module)\n          ;\n        },\n        destroy: function() {\n          module.verbose('Destroying previous progress for', $module);\n          clearInterval(instance.interval);\n          module.remove.state();\n          $module.removeData(moduleNamespace);\n          instance = undefined;\n        },\n\n        reset: function() {\n          module.remove.nextValue();\n          module.update.progress(0);\n        },\n\n        complete: function() {\n          if(module.percent === undefined || module.percent < 100) {\n            module.remove.progressPoll();\n            module.set.percent(100);\n          }\n        },\n\n        read: {\n          metadata: function() {\n            var\n              data = {\n                percent : $module.data(metadata.percent),\n                total   : $module.data(metadata.total),\n                value   : $module.data(metadata.value)\n              }\n            ;\n            if(data.percent) {\n              module.debug('Current percent value set from metadata', data.percent);\n              module.set.percent(data.percent);\n            }\n            if(data.total) {\n              module.debug('Total value set from metadata', data.total);\n              module.set.total(data.total);\n            }\n            if(data.value) {\n              module.debug('Current value set from metadata', data.value);\n              module.set.value(data.value);\n              module.set.progress(data.value);\n            }\n          },\n          settings: function() {\n            if(settings.total !== false) {\n              module.debug('Current total set in settings', settings.total);\n              module.set.total(settings.total);\n            }\n            if(settings.value !== false) {\n              module.debug('Current value set in settings', settings.value);\n              module.set.value(settings.value);\n              module.set.progress(module.value);\n            }\n            if(settings.percent !== false) {\n              module.debug('Current percent set in settings', settings.percent);\n              module.set.percent(settings.percent);\n            }\n          }\n        },\n\n        bind: {\n          transitionEnd: function(callback) {\n            var\n              transitionEnd = module.get.transitionEnd()\n            ;\n            $bar\n              .one(transitionEnd + eventNamespace, function(event) {\n                clearTimeout(module.failSafeTimer);\n                callback.call(this, event);\n              })\n            ;\n            module.failSafeTimer = setTimeout(function() {\n              $bar.triggerHandler(transitionEnd);\n            }, settings.duration + settings.failSafeDelay);\n            module.verbose('Adding fail safe timer', module.timer);\n          }\n        },\n\n        increment: function(incrementValue) {\n          var\n            maxValue,\n            startValue,\n            newValue\n          ;\n          if( module.has.total() ) {\n            startValue     = module.get.value();\n            incrementValue = incrementValue || 1;\n            newValue       = startValue + incrementValue;\n          }\n          else {\n            startValue     = module.get.percent();\n            incrementValue = incrementValue || module.get.randomValue();\n\n            newValue       = startValue + incrementValue;\n            maxValue       = 100;\n            module.debug('Incrementing percentage by', startValue, newValue);\n          }\n          newValue = module.get.normalizedValue(newValue);\n          module.set.progress(newValue);\n        },\n        decrement: function(decrementValue) {\n          var\n            total     = module.get.total(),\n            startValue,\n            newValue\n          ;\n          if(total) {\n            startValue     =  module.get.value();\n            decrementValue =  decrementValue || 1;\n            newValue       =  startValue - decrementValue;\n            module.debug('Decrementing value by', decrementValue, startValue);\n          }\n          else {\n            startValue     =  module.get.percent();\n            decrementValue =  decrementValue || module.get.randomValue();\n            newValue       =  startValue - decrementValue;\n            module.debug('Decrementing percentage by', decrementValue, startValue);\n          }\n          newValue = module.get.normalizedValue(newValue);\n          module.set.progress(newValue);\n        },\n\n        has: {\n          progressPoll: function() {\n            return module.progressPoll;\n          },\n          total: function() {\n            return (module.get.total() !== false);\n          }\n        },\n\n        get: {\n          text: function(templateText) {\n            var\n              value   = module.value                || 0,\n              total   = module.total                || 0,\n              percent = (animating)\n                ? module.get.displayPercent()\n                : module.percent || 0,\n              left = (module.total > 0)\n                ? (total - value)\n                : (100 - percent)\n            ;\n            templateText = templateText || '';\n            templateText = templateText\n              .replace('{value}', value)\n              .replace('{total}', total)\n              .replace('{left}', left)\n              .replace('{percent}', percent)\n            ;\n            module.verbose('Adding variables to progress bar text', templateText);\n            return templateText;\n          },\n\n          normalizedValue: function(value) {\n            if(value < 0) {\n              module.debug('Value cannot decrement below 0');\n              return 0;\n            }\n            if(module.has.total()) {\n              if(value > module.total) {\n                module.debug('Value cannot increment above total', module.total);\n                return module.total;\n              }\n            }\n            else if(value > 100 ) {\n              module.debug('Value cannot increment above 100 percent');\n              return 100;\n            }\n            return value;\n          },\n\n          updateInterval: function() {\n            if(settings.updateInterval == 'auto') {\n              return settings.duration;\n            }\n            return settings.updateInterval;\n          },\n\n          randomValue: function() {\n            module.debug('Generating random increment percentage');\n            return Math.floor((Math.random() * settings.random.max) + settings.random.min);\n          },\n\n          numericValue: function(value) {\n            return (typeof value === 'string')\n              ? (value.replace(/[^\\d.]/g, '') !== '')\n                ? +(value.replace(/[^\\d.]/g, ''))\n                : false\n              : value\n            ;\n          },\n\n          transitionEnd: function() {\n            var\n              element     = document.createElement('element'),\n              transitions = {\n                'transition'       :'transitionend',\n                'OTransition'      :'oTransitionEnd',\n                'MozTransition'    :'transitionend',\n                'WebkitTransition' :'webkitTransitionEnd'\n              },\n              transition\n            ;\n            for(transition in transitions){\n              if( element.style[transition] !== undefined ){\n                return transitions[transition];\n              }\n            }\n          },\n\n          // gets current displayed percentage (if animating values this is the intermediary value)\n          displayPercent: function() {\n            var\n              barWidth       = $bar.width(),\n              totalWidth     = $module.width(),\n              minDisplay     = parseInt($bar.css('min-width'), 10),\n              displayPercent = (barWidth > minDisplay)\n                ? (barWidth / totalWidth * 100)\n                : module.percent\n            ;\n            return (settings.precision > 0)\n              ? Math.round(displayPercent * (10 * settings.precision)) / (10 * settings.precision)\n              : Math.round(displayPercent)\n            ;\n          },\n\n          percent: function() {\n            return module.percent || 0;\n          },\n          value: function() {\n            return module.nextValue || module.value || 0;\n          },\n          total: function() {\n            return module.total || false;\n          }\n        },\n\n        create: {\n          progressPoll: function() {\n            module.progressPoll = setTimeout(function() {\n              module.update.toNextValue();\n              module.remove.progressPoll();\n            }, module.get.updateInterval());\n          },\n        },\n\n        is: {\n          complete: function() {\n            return module.is.success() || module.is.warning() || module.is.error();\n          },\n          success: function() {\n            return $module.hasClass(className.success);\n          },\n          warning: function() {\n            return $module.hasClass(className.warning);\n          },\n          error: function() {\n            return $module.hasClass(className.error);\n          },\n          active: function() {\n            return $module.hasClass(className.active);\n          },\n          visible: function() {\n            return $module.is(':visible');\n          }\n        },\n\n        remove: {\n          progressPoll: function() {\n            module.verbose('Removing progress poll timer');\n            if(module.progressPoll) {\n              clearTimeout(module.progressPoll);\n              delete module.progressPoll;\n            }\n          },\n          nextValue: function() {\n            module.verbose('Removing progress value stored for next update');\n            delete module.nextValue;\n          },\n          state: function() {\n            module.verbose('Removing stored state');\n            delete module.total;\n            delete module.percent;\n            delete module.value;\n          },\n          active: function() {\n            module.verbose('Removing active state');\n            $module.removeClass(className.active);\n          },\n          success: function() {\n            module.verbose('Removing success state');\n            $module.removeClass(className.success);\n          },\n          warning: function() {\n            module.verbose('Removing warning state');\n            $module.removeClass(className.warning);\n          },\n          error: function() {\n            module.verbose('Removing error state');\n            $module.removeClass(className.error);\n          }\n        },\n\n        set: {\n          barWidth: function(value) {\n            if(value > 100) {\n              module.error(error.tooHigh, value);\n            }\n            else if (value < 0) {\n              module.error(error.tooLow, value);\n            }\n            else {\n              $bar\n                .css('width', value + '%')\n              ;\n              $module\n                .attr('data-percent', parseInt(value, 10))\n              ;\n            }\n          },\n          duration: function(duration) {\n            duration = duration || settings.duration;\n            duration = (typeof duration == 'number')\n              ? duration + 'ms'\n              : duration\n            ;\n            module.verbose('Setting progress bar transition duration', duration);\n            $bar\n              .css({\n                'transition-duration':  duration\n              })\n            ;\n          },\n          percent: function(percent) {\n            percent = (typeof percent == 'string')\n              ? +(percent.replace('%', ''))\n              : percent\n            ;\n            // round display percentage\n            percent = (settings.precision > 0)\n              ? Math.round(percent * (10 * settings.precision)) / (10 * settings.precision)\n              : Math.round(percent)\n            ;\n            module.percent = percent;\n            if( !module.has.total() ) {\n              module.value = (settings.precision > 0)\n                ? Math.round( (percent / 100) * module.total * (10 * settings.precision)) / (10 * settings.precision)\n                : Math.round( (percent / 100) * module.total * 10) / 10\n              ;\n              if(settings.limitValues) {\n                module.value = (module.value > 100)\n                  ? 100\n                  : (module.value < 0)\n                    ? 0\n                    : module.value\n                ;\n              }\n            }\n            module.set.barWidth(percent);\n            module.set.labelInterval();\n            module.set.labels();\n            settings.onChange.call(element, percent, module.value, module.total);\n          },\n          labelInterval: function() {\n            var\n              animationCallback = function() {\n                module.verbose('Bar finished animating, removing continuous label updates');\n                clearInterval(module.interval);\n                animating = false;\n                module.set.labels();\n              }\n            ;\n            clearInterval(module.interval);\n            module.bind.transitionEnd(animationCallback);\n            animating = true;\n            module.interval = setInterval(function() {\n              var\n                isInDOM = $.contains(document.documentElement, element)\n              ;\n              if(!isInDOM) {\n                clearInterval(module.interval);\n                animating = false;\n              }\n              module.set.labels();\n            }, settings.framerate);\n          },\n          labels: function() {\n            module.verbose('Setting both bar progress and outer label text');\n            module.set.barLabel();\n            module.set.state();\n          },\n          label: function(text) {\n            text = text || '';\n            if(text) {\n              text = module.get.text(text);\n              module.verbose('Setting label to text', text);\n              $label.text(text);\n            }\n          },\n          state: function(percent) {\n            percent = (percent !== undefined)\n              ? percent\n              : module.percent\n            ;\n            if(percent === 100) {\n              if(settings.autoSuccess && !(module.is.warning() || module.is.error() || module.is.success())) {\n                module.set.success();\n                module.debug('Automatically triggering success at 100%');\n              }\n              else {\n                module.verbose('Reached 100% removing active state');\n                module.remove.active();\n                module.remove.progressPoll();\n              }\n            }\n            else if(percent > 0) {\n              module.verbose('Adjusting active progress bar label', percent);\n              module.set.active();\n            }\n            else {\n              module.remove.active();\n              module.set.label(settings.text.active);\n            }\n          },\n          barLabel: function(text) {\n            if(text !== undefined) {\n              $progress.text( module.get.text(text) );\n            }\n            else if(settings.label == 'ratio' && module.total) {\n              module.verbose('Adding ratio to bar label');\n              $progress.text( module.get.text(settings.text.ratio) );\n            }\n            else if(settings.label == 'percent') {\n              module.verbose('Adding percentage to bar label');\n              $progress.text( module.get.text(settings.text.percent) );\n            }\n          },\n          active: function(text) {\n            text = text || settings.text.active;\n            module.debug('Setting active state');\n            if(settings.showActivity && !module.is.active() ) {\n              $module.addClass(className.active);\n            }\n            module.remove.warning();\n            module.remove.error();\n            module.remove.success();\n            text = settings.onLabelUpdate('active', text, module.value, module.total);\n            if(text) {\n              module.set.label(text);\n            }\n            module.bind.transitionEnd(function() {\n              settings.onActive.call(element, module.value, module.total);\n            });\n          },\n          success : function(text) {\n            text = text || settings.text.success || settings.text.active;\n            module.debug('Setting success state');\n            $module.addClass(className.success);\n            module.remove.active();\n            module.remove.warning();\n            module.remove.error();\n            module.complete();\n            if(settings.text.success) {\n              text = settings.onLabelUpdate('success', text, module.value, module.total);\n              module.set.label(text);\n            }\n            else {\n              text = settings.onLabelUpdate('active', text, module.value, module.total);\n              module.set.label(text);\n            }\n            module.bind.transitionEnd(function() {\n              settings.onSuccess.call(element, module.total);\n            });\n          },\n          warning : function(text) {\n            text = text || settings.text.warning;\n            module.debug('Setting warning state');\n            $module.addClass(className.warning);\n            module.remove.active();\n            module.remove.success();\n            module.remove.error();\n            module.complete();\n            text = settings.onLabelUpdate('warning', text, module.value, module.total);\n            if(text) {\n              module.set.label(text);\n            }\n            module.bind.transitionEnd(function() {\n              settings.onWarning.call(element, module.value, module.total);\n            });\n          },\n          error : function(text) {\n            text = text || settings.text.error;\n            module.debug('Setting error state');\n            $module.addClass(className.error);\n            module.remove.active();\n            module.remove.success();\n            module.remove.warning();\n            module.complete();\n            text = settings.onLabelUpdate('error', text, module.value, module.total);\n            if(text) {\n              module.set.label(text);\n            }\n            module.bind.transitionEnd(function() {\n              settings.onError.call(element, module.value, module.total);\n            });\n          },\n          transitionEvent: function() {\n            transitionEnd = module.get.transitionEnd();\n          },\n          total: function(totalValue) {\n            module.total = totalValue;\n          },\n          value: function(value) {\n            module.value = value;\n          },\n          progress: function(value) {\n            if(!module.has.progressPoll()) {\n              module.debug('First update in progress update interval, immediately updating', value);\n              module.update.progress(value);\n              module.create.progressPoll();\n            }\n            else {\n              module.debug('Updated within interval, setting next update to use new value', value);\n              module.set.nextValue(value);\n            }\n          },\n          nextValue: function(value) {\n            module.nextValue = value;\n          }\n        },\n\n        update: {\n          toNextValue: function() {\n            var\n              nextValue = module.nextValue\n            ;\n            if(nextValue) {\n              module.debug('Update interval complete using last updated value', nextValue);\n              module.update.progress(nextValue);\n              module.remove.nextValue();\n            }\n          },\n          progress: function(value) {\n            var\n              percentComplete\n            ;\n            value = module.get.numericValue(value);\n            if(value === false) {\n              module.error(error.nonNumeric, value);\n            }\n            value = module.get.normalizedValue(value);\n            if( module.has.total() ) {\n              module.set.value(value);\n              percentComplete = (value / module.total) * 100;\n              module.debug('Calculating percent complete from total', percentComplete);\n              module.set.percent( percentComplete );\n            }\n            else {\n              percentComplete = value;\n              module.debug('Setting value to exact percentage value', percentComplete);\n              module.set.percent( percentComplete );\n            }\n          }\n        },\n\n        setting: function(name, value) {\n          module.debug('Changing setting', name, value);\n          if( $.isPlainObject(name) ) {\n            $.extend(true, settings, name);\n          }\n          else if(value !== undefined) {\n            if($.isPlainObject(settings[name])) {\n              $.extend(true, settings[name], value);\n            }\n            else {\n              settings[name] = value;\n            }\n          }\n          else {\n            return settings[name];\n          }\n        },\n        internal: function(name, value) {\n          if( $.isPlainObject(name) ) {\n            $.extend(true, module, name);\n          }\n          else if(value !== undefined) {\n            module[name] = value;\n          }\n          else {\n            return module[name];\n          }\n        },\n        debug: function() {\n          if(!settings.silent && settings.debug) {\n            if(settings.performance) {\n              module.performance.log(arguments);\n            }\n            else {\n              module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');\n              module.debug.apply(console, arguments);\n            }\n          }\n        },\n        verbose: function() {\n          if(!settings.silent && settings.verbose && settings.debug) {\n            if(settings.performance) {\n              module.performance.log(arguments);\n            }\n            else {\n              module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');\n              module.verbose.apply(console, arguments);\n            }\n          }\n        },\n        error: function() {\n          if(!settings.silent) {\n            module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');\n            module.error.apply(console, arguments);\n          }\n        },\n        performance: {\n          log: function(message) {\n            var\n              currentTime,\n              executionTime,\n              previousTime\n            ;\n            if(settings.performance) {\n              currentTime   = new Date().getTime();\n              previousTime  = time || currentTime;\n              executionTime = currentTime - previousTime;\n              time          = currentTime;\n              performance.push({\n                'Name'           : message[0],\n                'Arguments'      : [].slice.call(message, 1) || '',\n                'Element'        : element,\n                'Execution Time' : executionTime\n              });\n            }\n            clearTimeout(module.performance.timer);\n            module.performance.timer = setTimeout(module.performance.display, 500);\n          },\n          display: function() {\n            var\n              title = settings.name + ':',\n              totalTime = 0\n            ;\n            time = false;\n            clearTimeout(module.performance.timer);\n            $.each(performance, function(index, data) {\n              totalTime += data['Execution Time'];\n            });\n            title += ' ' + totalTime + 'ms';\n            if(moduleSelector) {\n              title += ' \\'' + moduleSelector + '\\'';\n            }\n            if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {\n              console.groupCollapsed(title);\n              if(console.table) {\n                console.table(performance);\n              }\n              else {\n                $.each(performance, function(index, data) {\n                  console.log(data['Name'] + ': ' + data['Execution Time']+'ms');\n                });\n              }\n              console.groupEnd();\n            }\n            performance = [];\n          }\n        },\n        invoke: function(query, passedArguments, context) {\n          var\n            object = instance,\n            maxDepth,\n            found,\n            response\n          ;\n          passedArguments = passedArguments || queryArguments;\n          context         = element         || context;\n          if(typeof query == 'string' && object !== undefined) {\n            query    = query.split(/[\\. ]/);\n            maxDepth = query.length - 1;\n            $.each(query, function(depth, value) {\n              var camelCaseValue = (depth != maxDepth)\n                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)\n                : query\n              ;\n              if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {\n                object = object[camelCaseValue];\n              }\n              else if( object[camelCaseValue] !== undefined ) {\n                found = object[camelCaseValue];\n                return false;\n              }\n              else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {\n                object = object[value];\n              }\n              else if( object[value] !== undefined ) {\n                found = object[value];\n                return false;\n              }\n              else {\n                module.error(error.method, query);\n                return false;\n              }\n            });\n          }\n          if ( $.isFunction( found ) ) {\n            response = found.apply(context, passedArguments);\n          }\n          else if(found !== undefined) {\n            response = found;\n          }\n          if($.isArray(returnedValue)) {\n            returnedValue.push(response);\n          }\n          else if(returnedValue !== undefined) {\n            returnedValue = [returnedValue, response];\n          }\n          else if(response !== undefined) {\n            returnedValue = response;\n          }\n          return found;\n        }\n      };\n\n      if(methodInvoked) {\n        if(instance === undefined) {\n          module.initialize();\n        }\n        module.invoke(query);\n      }\n      else {\n        if(instance !== undefined) {\n          instance.invoke('destroy');\n        }\n        module.initialize();\n      }\n    })\n  ;\n\n  return (returnedValue !== undefined)\n    ? returnedValue\n    : this\n  ;\n};\n\n$.fn.progress.settings = {\n\n  name         : 'Progress',\n  namespace    : 'progress',\n\n  silent       : false,\n  debug        : false,\n  verbose      : false,\n  performance  : true,\n\n  random       : {\n    min : 2,\n    max : 5\n  },\n\n  duration       : 300,\n\n  updateInterval : 'auto',\n\n  autoSuccess    : true,\n  showActivity   : true,\n  limitValues    : true,\n\n  label          : 'percent',\n  precision      : 0,\n  framerate      : (1000 / 30), /// 30 fps\n\n  percent        : false,\n  total          : false,\n  value          : false,\n\n  // delay in ms for fail safe animation callback\n  failSafeDelay : 100,\n\n  onLabelUpdate : function(state, text, value, total){\n    return text;\n  },\n  onChange      : function(percent, value, total){},\n  onSuccess     : function(total){},\n  onActive      : function(value, total){},\n  onError       : function(value, total){},\n  onWarning     : function(value, total){},\n\n  error    : {\n    method     : 'The method you called is not defined.',\n    nonNumeric : 'Progress value is non numeric',\n    tooHigh    : 'Value specified is above 100%',\n    tooLow     : 'Value specified is below 0%'\n  },\n\n  regExp: {\n    variable: /\\{\\$*[A-z0-9]+\\}/g\n  },\n\n  metadata: {\n    percent : 'percent',\n    total   : 'total',\n    value   : 'value'\n  },\n\n  selector : {\n    bar      : '> .bar',\n    label    : '> .label',\n    progress : '.bar > .progress'\n  },\n\n  text : {\n    active  : false,\n    error   : false,\n    success : false,\n    warning : false,\n    percent : '{percent}%',\n    ratio   : '{value} of {total}'\n  },\n\n  className : {\n    active  : 'active',\n    error   : 'error',\n    success : 'success',\n    warning : 'warning'\n  }\n\n};\n\n\n})( jQuery, window, document );\n"
  },
  {
    "path": "semantic/src/definitions/modules/progress.less",
    "content": "/*!\n * # Semantic UI - Progress Bar\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n            Theme\n*******************************/\n\n@type    : 'module';\n@element : 'progress';\n\n@import (multiple) '../../theme.config';\n\n/*******************************\n            Progress\n*******************************/\n\n.ui.progress {\n  position: relative;\n  display: block;\n  max-width: 100%;\n  border: @border;\n  margin: @margin;\n  box-shadow: @boxShadow;\n  background: @background;\n  padding: @padding;\n  border-radius: @borderRadius;\n}\n\n.ui.progress:first-child {\n  margin: @firstMargin;\n}\n.ui.progress:last-child {\n  margin: @lastMargin;\n}\n\n/*******************************\n            Content\n*******************************/\n\n/* Activity Bar */\n.ui.progress .bar {\n  display: block;\n  line-height: 1;\n  position: @barPosition;\n  width: @barInitialWidth;\n  min-width: @barMinWidth;\n  background: @barBackground;\n  border-radius: @barBorderRadius;\n  transition: @barTransition;\n}\n\n/* Percent Complete */\n.ui.progress .bar > .progress {\n  white-space: nowrap;\n  position: @progressPosition;\n  width: @progressWidth;\n  font-size: @progressSize;\n  top: @progressTop;\n  right: @progressRight;\n  left: @progressLeft;\n  bottom: @progressBottom;\n  color: @progressColor;\n  text-shadow: @progressTextShadow;\n  margin-top: @progressOffset;\n  font-weight: @progressFontWeight;\n  text-align: @progressTextAlign;\n}\n\n/* Label */\n.ui.progress > .label {\n  position: absolute;\n  width: @labelWidth;\n  font-size: @labelSize;\n  top: @labelTop;\n  right: @labelRight;\n  left: @labelLeft;\n  bottom: @labelBottom;\n  color: @labelColor;\n  font-weight: @labelFontWeight;\n  text-shadow: @labelTextShadow;\n  margin-top: @labelOffset;\n  text-align: @labelTextAlign;\n  transition: @labelTransition;\n}\n\n\n/*******************************\n            Types\n*******************************/\n\n\n/* Indicating */\n.ui.indicating.progress[data-percent^=\"1\"] .bar,\n.ui.indicating.progress[data-percent^=\"2\"] .bar {\n  background-color: @indicatingFirstColor;\n}\n.ui.indicating.progress[data-percent^=\"3\"] .bar {\n  background-color: @indicatingSecondColor;\n}\n.ui.indicating.progress[data-percent^=\"4\"] .bar,\n.ui.indicating.progress[data-percent^=\"5\"] .bar {\n  background-color: @indicatingThirdColor;\n}\n.ui.indicating.progress[data-percent^=\"6\"] .bar {\n  background-color: @indicatingFourthColor;\n}\n.ui.indicating.progress[data-percent^=\"7\"] .bar,\n.ui.indicating.progress[data-percent^=\"8\"] .bar {\n  background-color: @indicatingFifthColor;\n}\n.ui.indicating.progress[data-percent^=\"9\"] .bar,\n.ui.indicating.progress[data-percent^=\"100\"] .bar {\n  background-color: @indicatingSixthColor;\n}\n\n/* Indicating Label */\n.ui.indicating.progress[data-percent^=\"1\"] .label,\n.ui.indicating.progress[data-percent^=\"2\"] .label {\n  color: @indicatingFirstLabelColor;\n}\n.ui.indicating.progress[data-percent^=\"3\"] .label {\n  color: @indicatingSecondLabelColor;\n}\n.ui.indicating.progress[data-percent^=\"4\"] .label,\n.ui.indicating.progress[data-percent^=\"5\"] .label {\n  color: @indicatingThirdLabelColor;\n}\n.ui.indicating.progress[data-percent^=\"6\"] .label {\n  color: @indicatingFourthLabelColor;\n}\n.ui.indicating.progress[data-percent^=\"7\"] .label,\n.ui.indicating.progress[data-percent^=\"8\"] .label {\n  color: @indicatingFifthLabelColor;\n}\n.ui.indicating.progress[data-percent^=\"9\"] .label,\n.ui.indicating.progress[data-percent^=\"100\"] .label {\n  color: @indicatingSixthLabelColor;\n}\n\n/* Single Digits */\n.ui.indicating.progress[data-percent=\"1\"] .bar,\n.ui.indicating.progress[data-percent=\"2\"] .bar,\n.ui.indicating.progress[data-percent=\"3\"] .bar,\n.ui.indicating.progress[data-percent=\"4\"] .bar,\n.ui.indicating.progress[data-percent=\"5\"] .bar,\n.ui.indicating.progress[data-percent=\"6\"] .bar,\n.ui.indicating.progress[data-percent=\"7\"] .bar,\n.ui.indicating.progress[data-percent=\"8\"] .bar,\n.ui.indicating.progress[data-percent=\"9\"] .bar {\n  background-color: @indicatingFirstColor;\n}\n.ui.indicating.progress[data-percent=\"1\"] .label,\n.ui.indicating.progress[data-percent=\"2\"] .label,\n.ui.indicating.progress[data-percent=\"3\"] .label,\n.ui.indicating.progress[data-percent=\"4\"] .label,\n.ui.indicating.progress[data-percent=\"5\"] .label,\n.ui.indicating.progress[data-percent=\"6\"] .label,\n.ui.indicating.progress[data-percent=\"7\"] .label,\n.ui.indicating.progress[data-percent=\"8\"] .label,\n.ui.indicating.progress[data-percent=\"9\"] .label {\n  color: @indicatingFirstLabelColor;\n}\n\n/* Indicating Success */\n.ui.indicating.progress.success .label {\n  color: @successHeaderColor;\n}\n\n/*******************************\n             States\n*******************************/\n\n\n/*--------------\n     Success\n---------------*/\n\n.ui.progress.success .bar {\n  background-color: @successColor !important;\n}\n.ui.progress.success .bar,\n.ui.progress.success .bar::after {\n  animation: none !important;\n}\n.ui.progress.success > .label {\n  color: @successHeaderColor;\n}\n\n/*--------------\n     Warning\n---------------*/\n\n.ui.progress.warning .bar {\n  background-color: @warningColor !important;\n}\n.ui.progress.warning .bar,\n.ui.progress.warning .bar::after {\n  animation: none !important;\n}\n.ui.progress.warning > .label {\n  color: @warningHeaderColor;\n}\n\n/*--------------\n     Error\n---------------*/\n\n.ui.progress.error .bar {\n  background-color: @errorColor !important;\n}\n.ui.progress.error .bar,\n.ui.progress.error .bar::after {\n  animation: none !important;\n}\n.ui.progress.error > .label {\n  color: @errorHeaderColor;\n}\n\n/*--------------\n     Active\n---------------*/\n\n.ui.active.progress .bar {\n  position: relative;\n  min-width: @activeMinWidth;\n}\n.ui.active.progress .bar::after {\n  content: '';\n  opacity: 0;\n\n  position: absolute;\n  top: 0px;\n  left: 0px;\n  right: 0px;\n  bottom: 0px;\n  background: @activePulseColor;\n\n  border-radius: @barBorderRadius;\n\n  animation: progress-active @activePulseDuration @defaultEasing infinite;\n}\n@keyframes progress-active {\n  0% {\n    opacity: @activePulseMaxOpacity;\n    width: 0;\n  }\n  90% {\n  }\n  100% {\n    opacity: 0;\n    width: 100%;\n  }\n}\n\n/*--------------\n    Disabled\n---------------*/\n\n.ui.disabled.progress {\n  opacity: 0.35;\n}\n.ui.disabled.progress .bar,\n.ui.disabled.progress .bar::after {\n  animation: none !important;\n}\n\n\n/*******************************\n           Variations\n*******************************/\n\n\n/*--------------\n    Inverted\n---------------*/\n\n.ui.inverted.progress {\n  background: @invertedBackground;\n  border: @invertedBorder;\n}\n.ui.inverted.progress .bar {\n  background: @invertedBarBackground;\n}\n.ui.inverted.progress .bar > .progress {\n  color: @invertedProgressColor;\n}\n.ui.inverted.progress > .label {\n  color: @invertedLabelColor;\n}\n.ui.inverted.progress.success > .label {\n  color: @successColor;\n}\n.ui.inverted.progress.warning > .label {\n  color: @warningColor;\n}\n.ui.inverted.progress.error > .label {\n  color: @errorColor;\n}\n\n/*--------------\n    Attached\n---------------*/\n\n/* bottom attached */\n.ui.progress.attached {\n  background: @attachedBackground;\n  position: relative;\n  border: none;\n  margin: 0em;\n}\n.ui.progress.attached,\n.ui.progress.attached .bar {\n  display: block;\n  height: @attachedHeight;\n  padding: 0px;\n  overflow: hidden;\n  border-radius: 0em 0em @attachedBorderRadius @attachedBorderRadius;\n}\n.ui.progress.attached .bar {\n  border-radius: 0em;\n}\n\n/* top attached */\n.ui.progress.top.attached,\n.ui.progress.top.attached .bar {\n  top: 0px;\n  border-radius: @attachedBorderRadius @attachedBorderRadius 0em 0em;\n}\n.ui.progress.top.attached .bar {\n  border-radius: 0em;\n}\n\n/* Coupling */\n.ui.segment > .ui.attached.progress,\n.ui.card > .ui.attached.progress {\n  position: absolute;\n  top: auto;\n  left: 0;\n  bottom: 100%;\n  width: 100%;\n}\n.ui.segment > .ui.bottom.attached.progress,\n.ui.card > .ui.bottom.attached.progress {\n  top: 100%;\n  bottom: auto;\n}\n\n/*--------------\n     Colors\n---------------*/\n\n/* Red */\n.ui.red.progress .bar {\n  background-color: @red;\n}\n.ui.red.inverted.progress .bar {\n  background-color: @lightRed;\n}\n\n/* Orange */\n.ui.orange.progress .bar {\n  background-color: @orange;\n}\n.ui.orange.inverted.progress .bar {\n  background-color: @lightOrange;\n}\n\n/* Yellow */\n.ui.yellow.progress .bar {\n  background-color: @yellow;\n}\n.ui.yellow.inverted.progress .bar {\n  background-color: @lightYellow;\n}\n\n/* Olive */\n.ui.olive.progress .bar {\n  background-color: @olive;\n}\n.ui.olive.inverted.progress .bar {\n  background-color: @lightOlive;\n}\n\n/* Green */\n.ui.green.progress .bar {\n  background-color: @green;\n}\n.ui.green.inverted.progress .bar {\n  background-color: @lightGreen;\n}\n\n/* Teal */\n.ui.teal.progress .bar {\n  background-color: @teal;\n}\n.ui.teal.inverted.progress .bar {\n  background-color: @lightTeal;\n}\n\n/* Blue */\n.ui.blue.progress .bar {\n  background-color: @blue;\n}\n.ui.blue.inverted.progress .bar {\n  background-color: @lightBlue;\n}\n\n/* Violet */\n.ui.violet.progress .bar {\n  background-color: @violet;\n}\n.ui.violet.inverted.progress .bar {\n  background-color: @lightViolet;\n}\n\n/* Purple */\n.ui.purple.progress .bar {\n  background-color: @purple;\n}\n.ui.purple.inverted.progress .bar {\n  background-color: @lightPurple;\n}\n\n/* Pink */\n.ui.pink.progress .bar {\n  background-color: @pink;\n}\n.ui.pink.inverted.progress .bar {\n  background-color: @lightPink;\n}\n\n/* Brown */\n.ui.brown.progress .bar {\n  background-color: @brown;\n}\n.ui.brown.inverted.progress .bar {\n  background-color: @lightBrown;\n}\n\n/* Grey */\n.ui.grey.progress .bar {\n  background-color: @grey;\n}\n.ui.grey.inverted.progress .bar {\n  background-color: @lightGrey;\n}\n\n/* Black */\n.ui.black.progress .bar {\n  background-color: @black;\n}\n.ui.black.inverted.progress .bar {\n  background-color: @lightBlack;\n}\n\n/*--------------\n     Sizes\n---------------*/\n\n.ui.tiny.progress {\n  font-size: @tiny;\n}\n.ui.tiny.progress .bar {\n  height: @tinyBarHeight;\n}\n\n.ui.small.progress {\n  font-size: @small;\n}\n.ui.small.progress .bar {\n  height: @smallBarHeight;\n}\n\n.ui.progress {\n  font-size: @medium;\n}\n.ui.progress .bar {\n  height: @barHeight;\n}\n\n.ui.large.progress {\n  font-size: @large;\n}\n.ui.large.progress .bar {\n  height: @largeBarHeight;\n}\n\n.ui.big.progress {\n  font-size: @big;\n}\n.ui.big.progress .bar {\n  height: @bigBarHeight;\n}\n\n.loadUIOverrides();\n"
  },
  {
    "path": "semantic/src/definitions/modules/rating.js",
    "content": "/*!\n * # Semantic UI - Rating\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n;(function ($, window, document, undefined) {\n\n'use strict';\n\nwindow = (typeof window != 'undefined' && window.Math == Math)\n  ? window\n  : (typeof self != 'undefined' && self.Math == Math)\n    ? self\n    : Function('return this')()\n;\n\n$.fn.rating = function(parameters) {\n  var\n    $allModules     = $(this),\n    moduleSelector  = $allModules.selector || '',\n\n    time            = new Date().getTime(),\n    performance     = [],\n\n    query           = arguments[0],\n    methodInvoked   = (typeof query == 'string'),\n    queryArguments  = [].slice.call(arguments, 1),\n    returnedValue\n  ;\n  $allModules\n    .each(function() {\n      var\n        settings        = ( $.isPlainObject(parameters) )\n          ? $.extend(true, {}, $.fn.rating.settings, parameters)\n          : $.extend({}, $.fn.rating.settings),\n\n        namespace       = settings.namespace,\n        className       = settings.className,\n        metadata        = settings.metadata,\n        selector        = settings.selector,\n        error           = settings.error,\n\n        eventNamespace  = '.' + namespace,\n        moduleNamespace = 'module-' + namespace,\n\n        element         = this,\n        instance        = $(this).data(moduleNamespace),\n\n        $module         = $(this),\n        $icon           = $module.find(selector.icon),\n\n        initialLoad,\n        module\n      ;\n\n      module = {\n\n        initialize: function() {\n          module.verbose('Initializing rating module', settings);\n\n          if($icon.length === 0) {\n            module.setup.layout();\n          }\n\n          if(settings.interactive) {\n            module.enable();\n          }\n          else {\n            module.disable();\n          }\n          module.set.initialLoad();\n          module.set.rating( module.get.initialRating() );\n          module.remove.initialLoad();\n          module.instantiate();\n        },\n\n        instantiate: function() {\n          module.verbose('Instantiating module', settings);\n          instance = module;\n          $module\n            .data(moduleNamespace, module)\n          ;\n        },\n\n        destroy: function() {\n          module.verbose('Destroying previous instance', instance);\n          module.remove.events();\n          $module\n            .removeData(moduleNamespace)\n          ;\n        },\n\n        refresh: function() {\n          $icon   = $module.find(selector.icon);\n        },\n\n        setup: {\n          layout: function() {\n            var\n              maxRating = module.get.maxRating(),\n              html      = $.fn.rating.settings.templates.icon(maxRating)\n            ;\n            module.debug('Generating icon html dynamically');\n            $module\n              .html(html)\n            ;\n            module.refresh();\n          }\n        },\n\n        event: {\n          mouseenter: function() {\n            var\n              $activeIcon = $(this)\n            ;\n            $activeIcon\n              .nextAll()\n                .removeClass(className.selected)\n            ;\n            $module\n              .addClass(className.selected)\n            ;\n            $activeIcon\n              .addClass(className.selected)\n                .prevAll()\n                .addClass(className.selected)\n            ;\n          },\n          mouseleave: function() {\n            $module\n              .removeClass(className.selected)\n            ;\n            $icon\n              .removeClass(className.selected)\n            ;\n          },\n          click: function() {\n            var\n              $activeIcon   = $(this),\n              currentRating = module.get.rating(),\n              rating        = $icon.index($activeIcon) + 1,\n              canClear      = (settings.clearable == 'auto')\n               ? ($icon.length === 1)\n               : settings.clearable\n            ;\n            if(canClear && currentRating == rating) {\n              module.clearRating();\n            }\n            else {\n              module.set.rating( rating );\n            }\n          }\n        },\n\n        clearRating: function() {\n          module.debug('Clearing current rating');\n          module.set.rating(0);\n        },\n\n        bind: {\n          events: function() {\n            module.verbose('Binding events');\n            $module\n              .on('mouseenter' + eventNamespace, selector.icon, module.event.mouseenter)\n              .on('mouseleave' + eventNamespace, selector.icon, module.event.mouseleave)\n              .on('click'      + eventNamespace, selector.icon, module.event.click)\n            ;\n          }\n        },\n\n        remove: {\n          events: function() {\n            module.verbose('Removing events');\n            $module\n              .off(eventNamespace)\n            ;\n          },\n          initialLoad: function() {\n            initialLoad = false;\n          }\n        },\n\n        enable: function() {\n          module.debug('Setting rating to interactive mode');\n          module.bind.events();\n          $module\n            .removeClass(className.disabled)\n          ;\n        },\n\n        disable: function() {\n          module.debug('Setting rating to read-only mode');\n          module.remove.events();\n          $module\n            .addClass(className.disabled)\n          ;\n        },\n\n        is: {\n          initialLoad: function() {\n            return initialLoad;\n          }\n        },\n\n        get: {\n          initialRating: function() {\n            if($module.data(metadata.rating) !== undefined) {\n              $module.removeData(metadata.rating);\n              return $module.data(metadata.rating);\n            }\n            return settings.initialRating;\n          },\n          maxRating: function() {\n            if($module.data(metadata.maxRating) !== undefined) {\n              $module.removeData(metadata.maxRating);\n              return $module.data(metadata.maxRating);\n            }\n            return settings.maxRating;\n          },\n          rating: function() {\n            var\n              currentRating = $icon.filter('.' + className.active).length\n            ;\n            module.verbose('Current rating retrieved', currentRating);\n            return currentRating;\n          }\n        },\n\n        set: {\n          rating: function(rating) {\n            var\n              ratingIndex = (rating - 1 >= 0)\n                ? (rating - 1)\n                : 0,\n              $activeIcon = $icon.eq(ratingIndex)\n            ;\n            $module\n              .removeClass(className.selected)\n            ;\n            $icon\n              .removeClass(className.selected)\n              .removeClass(className.active)\n            ;\n            if(rating > 0) {\n              module.verbose('Setting current rating to', rating);\n              $activeIcon\n                .prevAll()\n                .addBack()\n                  .addClass(className.active)\n              ;\n            }\n            if(!module.is.initialLoad()) {\n              settings.onRate.call(element, rating);\n            }\n          },\n          initialLoad: function() {\n            initialLoad = true;\n          }\n        },\n\n        setting: function(name, value) {\n          module.debug('Changing setting', name, value);\n          if( $.isPlainObject(name) ) {\n            $.extend(true, settings, name);\n          }\n          else if(value !== undefined) {\n            if($.isPlainObject(settings[name])) {\n              $.extend(true, settings[name], value);\n            }\n            else {\n              settings[name] = value;\n            }\n          }\n          else {\n            return settings[name];\n          }\n        },\n        internal: function(name, value) {\n          if( $.isPlainObject(name) ) {\n            $.extend(true, module, name);\n          }\n          else if(value !== undefined) {\n            module[name] = value;\n          }\n          else {\n            return module[name];\n          }\n        },\n        debug: function() {\n          if(!settings.silent && settings.debug) {\n            if(settings.performance) {\n              module.performance.log(arguments);\n            }\n            else {\n              module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');\n              module.debug.apply(console, arguments);\n            }\n          }\n        },\n        verbose: function() {\n          if(!settings.silent && settings.verbose && settings.debug) {\n            if(settings.performance) {\n              module.performance.log(arguments);\n            }\n            else {\n              module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');\n              module.verbose.apply(console, arguments);\n            }\n          }\n        },\n        error: function() {\n          if(!settings.silent) {\n            module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');\n            module.error.apply(console, arguments);\n          }\n        },\n        performance: {\n          log: function(message) {\n            var\n              currentTime,\n              executionTime,\n              previousTime\n            ;\n            if(settings.performance) {\n              currentTime   = new Date().getTime();\n              previousTime  = time || currentTime;\n              executionTime = currentTime - previousTime;\n              time          = currentTime;\n              performance.push({\n                'Name'           : message[0],\n                'Arguments'      : [].slice.call(message, 1) || '',\n                'Element'        : element,\n                'Execution Time' : executionTime\n              });\n            }\n            clearTimeout(module.performance.timer);\n            module.performance.timer = setTimeout(module.performance.display, 500);\n          },\n          display: function() {\n            var\n              title = settings.name + ':',\n              totalTime = 0\n            ;\n            time = false;\n            clearTimeout(module.performance.timer);\n            $.each(performance, function(index, data) {\n              totalTime += data['Execution Time'];\n            });\n            title += ' ' + totalTime + 'ms';\n            if(moduleSelector) {\n              title += ' \\'' + moduleSelector + '\\'';\n            }\n            if($allModules.length > 1) {\n              title += ' ' + '(' + $allModules.length + ')';\n            }\n            if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {\n              console.groupCollapsed(title);\n              if(console.table) {\n                console.table(performance);\n              }\n              else {\n                $.each(performance, function(index, data) {\n                  console.log(data['Name'] + ': ' + data['Execution Time']+'ms');\n                });\n              }\n              console.groupEnd();\n            }\n            performance = [];\n          }\n        },\n        invoke: function(query, passedArguments, context) {\n          var\n            object = instance,\n            maxDepth,\n            found,\n            response\n          ;\n          passedArguments = passedArguments || queryArguments;\n          context         = element         || context;\n          if(typeof query == 'string' && object !== undefined) {\n            query    = query.split(/[\\. ]/);\n            maxDepth = query.length - 1;\n            $.each(query, function(depth, value) {\n              var camelCaseValue = (depth != maxDepth)\n                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)\n                : query\n              ;\n              if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {\n                object = object[camelCaseValue];\n              }\n              else if( object[camelCaseValue] !== undefined ) {\n                found = object[camelCaseValue];\n                return false;\n              }\n              else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {\n                object = object[value];\n              }\n              else if( object[value] !== undefined ) {\n                found = object[value];\n                return false;\n              }\n              else {\n                return false;\n              }\n            });\n          }\n          if ( $.isFunction( found ) ) {\n            response = found.apply(context, passedArguments);\n          }\n          else if(found !== undefined) {\n            response = found;\n          }\n          if($.isArray(returnedValue)) {\n            returnedValue.push(response);\n          }\n          else if(returnedValue !== undefined) {\n            returnedValue = [returnedValue, response];\n          }\n          else if(response !== undefined) {\n            returnedValue = response;\n          }\n          return found;\n        }\n      };\n      if(methodInvoked) {\n        if(instance === undefined) {\n          module.initialize();\n        }\n        module.invoke(query);\n      }\n      else {\n        if(instance !== undefined) {\n          instance.invoke('destroy');\n        }\n        module.initialize();\n      }\n    })\n  ;\n\n  return (returnedValue !== undefined)\n    ? returnedValue\n    : this\n  ;\n};\n\n$.fn.rating.settings = {\n\n  name          : 'Rating',\n  namespace     : 'rating',\n\n  slent         : false,\n  debug         : false,\n  verbose       : false,\n  performance   : true,\n\n  initialRating : 0,\n  interactive   : true,\n  maxRating     : 4,\n  clearable     : 'auto',\n\n  fireOnInit    : false,\n\n  onRate        : function(rating){},\n\n  error         : {\n    method    : 'The method you called is not defined',\n    noMaximum : 'No maximum rating specified. Cannot generate HTML automatically'\n  },\n\n\n  metadata: {\n    rating    : 'rating',\n    maxRating : 'maxRating'\n  },\n\n  className : {\n    active   : 'active',\n    disabled : 'disabled',\n    selected : 'selected',\n    loading  : 'loading'\n  },\n\n  selector  : {\n    icon : '.icon'\n  },\n\n  templates: {\n    icon: function(maxRating) {\n      var\n        icon = 1,\n        html = ''\n      ;\n      while(icon <= maxRating) {\n        html += '<i class=\"icon\"></i>';\n        icon++;\n      }\n      return html;\n    }\n  }\n\n};\n\n})( jQuery, window, document );\n"
  },
  {
    "path": "semantic/src/definitions/modules/rating.less",
    "content": "/*!\n * # Semantic UI - Rating\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n            Theme\n*******************************/\n\n@type    : 'module';\n@element : 'rating';\n\n@import (multiple) '../../theme.config';\n\n/*******************************\n           Rating\n*******************************/\n\n.ui.rating {\n  display: inline-flex;\n  white-space: @whiteSpace;\n  vertical-align: @verticalAlign;\n}\n.ui.rating:last-child {\n  margin-right: 0em;\n}\n\n/* Icon */\n.ui.rating .icon {\n  padding: 0em;\n  margin: 0em;\n  text-align: center;\n  font-weight: @normal;\n  font-style: normal;\n  flex: 1 0 auto;\n  cursor: @iconCursor;\n  width: @iconWidth;\n  height: @iconHeight;\n  transition: @iconTransition;\n}\n\n\n/*******************************\n             Types\n*******************************/\n\n\n/*-------------------\n      Standard\n--------------------*/\n\n/* Inactive Icon */\n.ui.rating .icon {\n  background: @inactiveBackground;\n  color: @inactiveColor;\n}\n\n/* Active Icon */\n.ui.rating .active.icon {\n  background: @activeBackground;\n  color: @activeColor;\n}\n\n/* Selected Icon */\n.ui.rating .icon.selected,\n.ui.rating .icon.selected.active {\n  background: @selectedBackground;\n  color: @selectedColor;\n}\n\n\n/*-------------------\n        Star\n--------------------*/\n\n/* Inactive */\n.ui.star.rating .icon {\n  width: @starIconWidth;\n  height: @starIconHeight;\n  background: @starInactiveBackground;\n  color: @starInactiveColor;\n  text-shadow: @starInactiveTextShadow;\n}\n\n/* Active Star */\n.ui.star.rating .active.icon {\n  background: @starActiveBackground !important;\n  color: @starActiveColor !important;\n  text-shadow: @starActiveTextShadow !important;\n}\n\n/* Selected Star */\n.ui.star.rating .icon.selected,\n.ui.star.rating .icon.selected.active {\n  background: @starSelectedBackground !important;\n  color: @starSelectedColor !important;\n  text-shadow: @starSelectedTextShadow !important;\n}\n\n\n/*-------------------\n        Heart\n--------------------*/\n\n.ui.heart.rating .icon {\n  width: @heartIconWidth;\n  height: @heartIconHeight;\n  background: @heartInactiveBackground;\n  color: @heartInactiveColor;\n  text-shadow: @heartInactiveTextShadow !important;\n}\n\n/* Active Heart */\n.ui.heart.rating .active.icon {\n  background: @heartActiveBackground !important;\n  color: @heartActiveColor !important;\n  text-shadow: @heartActiveTextShadow !important;\n}\n\n/* Selected Heart */\n.ui.heart.rating .icon.selected,\n.ui.heart.rating .icon.selected.active {\n  background: @heartSelectedBackground !important;\n  color: @heartSelectedColor !important;\n  text-shadow: @heartSelectedTextShadow !important;\n}\n\n\n/*******************************\n             States\n*******************************/\n\n/*-------------------\n       Disabled\n--------------------*/\n\n/* disabled rating */\n.ui.disabled.rating .icon {\n  cursor: default;\n}\n\n\n/*-------------------\n   User Interactive\n--------------------*/\n\n/* Selected Rating */\n.ui.rating.selected .active.icon {\n  opacity: @interactiveActiveIconOpacity;\n}\n.ui.rating.selected .icon.selected,\n.ui.rating .icon.selected {\n  opacity: @interactiveSelectedIconOpacity;\n}\n\n\n\n/*******************************\n          Variations\n*******************************/\n\n.ui.mini.rating {\n  font-size: @mini;\n}\n.ui.tiny.rating {\n  font-size: @tiny;\n}\n.ui.small.rating {\n  font-size: @small;\n}\n.ui.rating {\n  font-size: @medium;\n}\n.ui.large.rating {\n  font-size: @large;\n}\n.ui.huge.rating {\n  font-size: @huge;\n}\n.ui.massive.rating {\n  font-size: @massive;\n}\n\n\n.loadUIOverrides();\n"
  },
  {
    "path": "semantic/src/definitions/modules/search.js",
    "content": "/*!\n * # Semantic UI - Search\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n;(function ($, window, document, undefined) {\n\n'use strict';\n\nwindow = (typeof window != 'undefined' && window.Math == Math)\n  ? window\n  : (typeof self != 'undefined' && self.Math == Math)\n    ? self\n    : Function('return this')()\n;\n\n$.fn.search = function(parameters) {\n  var\n    $allModules     = $(this),\n    moduleSelector  = $allModules.selector || '',\n\n    time            = new Date().getTime(),\n    performance     = [],\n\n    query           = arguments[0],\n    methodInvoked   = (typeof query == 'string'),\n    queryArguments  = [].slice.call(arguments, 1),\n    returnedValue\n  ;\n  $(this)\n    .each(function() {\n      var\n        settings          = ( $.isPlainObject(parameters) )\n          ? $.extend(true, {}, $.fn.search.settings, parameters)\n          : $.extend({}, $.fn.search.settings),\n\n        className        = settings.className,\n        metadata         = settings.metadata,\n        regExp           = settings.regExp,\n        fields           = settings.fields,\n        selector         = settings.selector,\n        error            = settings.error,\n        namespace        = settings.namespace,\n\n        eventNamespace   = '.' + namespace,\n        moduleNamespace  = namespace + '-module',\n\n        $module          = $(this),\n        $prompt          = $module.find(selector.prompt),\n        $searchButton    = $module.find(selector.searchButton),\n        $results         = $module.find(selector.results),\n        $result          = $module.find(selector.result),\n        $category        = $module.find(selector.category),\n\n        element          = this,\n        instance         = $module.data(moduleNamespace),\n\n        disabledBubbled  = false,\n        resultsDismissed = false,\n\n        module\n      ;\n\n      module = {\n\n        initialize: function() {\n          module.verbose('Initializing module');\n          module.get.settings();\n          module.determine.searchFields();\n          module.bind.events();\n          module.set.type();\n          module.create.results();\n          module.instantiate();\n        },\n        instantiate: function() {\n          module.verbose('Storing instance of module', module);\n          instance = module;\n          $module\n            .data(moduleNamespace, module)\n          ;\n        },\n        destroy: function() {\n          module.verbose('Destroying instance');\n          $module\n            .off(eventNamespace)\n            .removeData(moduleNamespace)\n          ;\n        },\n\n        refresh: function() {\n          module.debug('Refreshing selector cache');\n          $prompt         = $module.find(selector.prompt);\n          $searchButton   = $module.find(selector.searchButton);\n          $category       = $module.find(selector.category);\n          $results        = $module.find(selector.results);\n          $result         = $module.find(selector.result);\n        },\n\n        refreshResults: function() {\n          $results = $module.find(selector.results);\n          $result  = $module.find(selector.result);\n        },\n\n        bind: {\n          events: function() {\n            module.verbose('Binding events to search');\n            if(settings.automatic) {\n              $module\n                .on(module.get.inputEvent() + eventNamespace, selector.prompt, module.event.input)\n              ;\n              $prompt\n                .attr('autocomplete', 'off')\n              ;\n            }\n            $module\n              // prompt\n              .on('focus'     + eventNamespace, selector.prompt, module.event.focus)\n              .on('blur'      + eventNamespace, selector.prompt, module.event.blur)\n              .on('keydown'   + eventNamespace, selector.prompt, module.handleKeyboard)\n              // search button\n              .on('click'     + eventNamespace, selector.searchButton, module.query)\n              // results\n              .on('mousedown' + eventNamespace, selector.results, module.event.result.mousedown)\n              .on('mouseup'   + eventNamespace, selector.results, module.event.result.mouseup)\n              .on('click'     + eventNamespace, selector.result,  module.event.result.click)\n            ;\n          }\n        },\n\n        determine: {\n          searchFields: function() {\n            // this makes sure $.extend does not add specified search fields to default fields\n            // this is the only setting which should not extend defaults\n            if(parameters && parameters.searchFields !== undefined) {\n              settings.searchFields = parameters.searchFields;\n            }\n          }\n        },\n\n        event: {\n          input: function() {\n            if(settings.searchDelay) {\n              clearTimeout(module.timer);\n              module.timer = setTimeout(function() {\n                if(module.is.focused()) {\n                  module.query();\n                }\n              }, settings.searchDelay);\n            }\n            else {\n              module.query();\n            }\n          },\n          focus: function() {\n            module.set.focus();\n            if(settings.searchOnFocus && module.has.minimumCharacters() ) {\n              module.query(function() {\n                if(module.can.show() ) {\n                  module.showResults();\n                }\n              });\n            }\n          },\n          blur: function(event) {\n            var\n              pageLostFocus = (document.activeElement === this),\n              callback      = function() {\n                module.cancel.query();\n                module.remove.focus();\n                module.timer = setTimeout(module.hideResults, settings.hideDelay);\n              }\n            ;\n            if(pageLostFocus) {\n              return;\n            }\n            resultsDismissed = false;\n            if(module.resultsClicked) {\n              module.debug('Determining if user action caused search to close');\n              $module\n                .one('click.close' + eventNamespace, selector.results, function(event) {\n                  if(module.is.inMessage(event) || disabledBubbled) {\n                    $prompt.focus();\n                    return;\n                  }\n                  disabledBubbled = false;\n                  if( !module.is.animating() && !module.is.hidden()) {\n                    callback();\n                  }\n                })\n              ;\n            }\n            else {\n              module.debug('Input blurred without user action, closing results');\n              callback();\n            }\n          },\n          result: {\n            mousedown: function() {\n              module.resultsClicked = true;\n            },\n            mouseup: function() {\n              module.resultsClicked = false;\n            },\n            click: function(event) {\n              module.debug('Search result selected');\n              var\n                $result = $(this),\n                $title  = $result.find(selector.title).eq(0),\n                $link   = $result.is('a[href]')\n                  ? $result\n                  : $result.find('a[href]').eq(0),\n                href    = $link.attr('href')   || false,\n                target  = $link.attr('target') || false,\n                title   = $title.html(),\n                // title is used for result lookup\n                value   = ($title.length > 0)\n                  ? $title.text()\n                  : false,\n                results = module.get.results(),\n                result  = $result.data(metadata.result) || module.get.result(value, results),\n                returnedValue\n              ;\n              if( $.isFunction(settings.onSelect) ) {\n                if(settings.onSelect.call(element, result, results) === false) {\n                  module.debug('Custom onSelect callback cancelled default select action');\n                  disabledBubbled = true;\n                  return;\n                }\n              }\n              module.hideResults();\n              if(value) {\n                module.set.value(value);\n              }\n              if(href) {\n                module.verbose('Opening search link found in result', $link);\n                if(target == '_blank' || event.ctrlKey) {\n                  window.open(href);\n                }\n                else {\n                  window.location.href = (href);\n                }\n              }\n            }\n          }\n        },\n        handleKeyboard: function(event) {\n          var\n            // force selector refresh\n            $result         = $module.find(selector.result),\n            $category       = $module.find(selector.category),\n            $activeResult   = $result.filter('.' + className.active),\n            currentIndex    = $result.index( $activeResult ),\n            resultSize      = $result.length,\n            hasActiveResult = $activeResult.length > 0,\n\n            keyCode         = event.which,\n            keys            = {\n              backspace : 8,\n              enter     : 13,\n              escape    : 27,\n              upArrow   : 38,\n              downArrow : 40\n            },\n            newIndex\n          ;\n          // search shortcuts\n          if(keyCode == keys.escape) {\n            module.verbose('Escape key pressed, blurring search field');\n            module.hideResults();\n            resultsDismissed = true;\n          }\n          if( module.is.visible() ) {\n            if(keyCode == keys.enter) {\n              module.verbose('Enter key pressed, selecting active result');\n              if( $result.filter('.' + className.active).length > 0 ) {\n                module.event.result.click.call($result.filter('.' + className.active), event);\n                event.preventDefault();\n                return false;\n              }\n            }\n            else if(keyCode == keys.upArrow && hasActiveResult) {\n              module.verbose('Up key pressed, changing active result');\n              newIndex = (currentIndex - 1 < 0)\n                ? currentIndex\n                : currentIndex - 1\n              ;\n              $category\n                .removeClass(className.active)\n              ;\n              $result\n                .removeClass(className.active)\n                .eq(newIndex)\n                  .addClass(className.active)\n                  .closest($category)\n                    .addClass(className.active)\n              ;\n              event.preventDefault();\n            }\n            else if(keyCode == keys.downArrow) {\n              module.verbose('Down key pressed, changing active result');\n              newIndex = (currentIndex + 1 >= resultSize)\n                ? currentIndex\n                : currentIndex + 1\n              ;\n              $category\n                .removeClass(className.active)\n              ;\n              $result\n                .removeClass(className.active)\n                .eq(newIndex)\n                  .addClass(className.active)\n                  .closest($category)\n                    .addClass(className.active)\n              ;\n              event.preventDefault();\n            }\n          }\n          else {\n            // query shortcuts\n            if(keyCode == keys.enter) {\n              module.verbose('Enter key pressed, executing query');\n              module.query();\n              module.set.buttonPressed();\n              $prompt.one('keyup', module.remove.buttonFocus);\n            }\n          }\n        },\n\n        setup: {\n          api: function(searchTerm, callback) {\n            var\n              apiSettings = {\n                debug             : settings.debug,\n                on                : false,\n                cache             : true,\n                action            : 'search',\n                urlData           : {\n                  query : searchTerm\n                },\n                onSuccess         : function(response) {\n                  module.parse.response.call(element, response, searchTerm);\n                  callback();\n                },\n                onFailure         : function() {\n                  module.displayMessage(error.serverError);\n                  callback();\n                },\n                onAbort : function(response) {\n                },\n                onError           : module.error\n              },\n              searchHTML\n            ;\n            $.extend(true, apiSettings, settings.apiSettings);\n            module.verbose('Setting up API request', apiSettings);\n            $module.api(apiSettings);\n          }\n        },\n\n        can: {\n          useAPI: function() {\n            return $.fn.api !== undefined;\n          },\n          show: function() {\n            return module.is.focused() && !module.is.visible() && !module.is.empty();\n          },\n          transition: function() {\n            return settings.transition && $.fn.transition !== undefined && $module.transition('is supported');\n          }\n        },\n\n        is: {\n          animating: function() {\n            return $results.hasClass(className.animating);\n          },\n          hidden: function() {\n            return $results.hasClass(className.hidden);\n          },\n          inMessage: function(event) {\n            if(!event.target) {\n              return;\n            }\n            var\n              $target = $(event.target),\n              isInDOM = $.contains(document.documentElement, event.target)\n            ;\n            return (isInDOM && $target.closest(selector.message).length > 0);\n          },\n          empty: function() {\n            return ($results.html() === '');\n          },\n          visible: function() {\n            return ($results.filter(':visible').length > 0);\n          },\n          focused: function() {\n            return ($prompt.filter(':focus').length > 0);\n          }\n        },\n\n        get: {\n          settings: function() {\n            if($.isPlainObject(parameters) && parameters.searchFullText) {\n              settings.fullTextSearch = parameters.searchFullText;\n              module.error(settings.error.oldSearchSyntax, element);\n            }\n          },\n          inputEvent: function() {\n            var\n              prompt = $prompt[0],\n              inputEvent   = (prompt !== undefined && prompt.oninput !== undefined)\n                ? 'input'\n                : (prompt !== undefined && prompt.onpropertychange !== undefined)\n                  ? 'propertychange'\n                  : 'keyup'\n            ;\n            return inputEvent;\n          },\n          value: function() {\n            return $prompt.val();\n          },\n          results: function() {\n            var\n              results = $module.data(metadata.results)\n            ;\n            return results;\n          },\n          result: function(value, results) {\n            var\n              lookupFields = ['title', 'id'],\n              result       = false\n            ;\n            value = (value !== undefined)\n              ? value\n              : module.get.value()\n            ;\n            results = (results !== undefined)\n              ? results\n              : module.get.results()\n            ;\n            if(settings.type === 'category') {\n              module.debug('Finding result that matches', value);\n              $.each(results, function(index, category) {\n                if($.isArray(category.results)) {\n                  result = module.search.object(value, category.results, lookupFields)[0];\n                  // don't continue searching if a result is found\n                  if(result) {\n                    return false;\n                  }\n                }\n              });\n            }\n            else {\n              module.debug('Finding result in results object', value);\n              result = module.search.object(value, results, lookupFields)[0];\n            }\n            return result || false;\n          },\n        },\n\n        select: {\n          firstResult: function() {\n            module.verbose('Selecting first result');\n            $result.first().addClass(className.active);\n          }\n        },\n\n        set: {\n          focus: function() {\n            $module.addClass(className.focus);\n          },\n          loading: function() {\n            $module.addClass(className.loading);\n          },\n          value: function(value) {\n            module.verbose('Setting search input value', value);\n            $prompt\n              .val(value)\n            ;\n          },\n          type: function(type) {\n            type = type || settings.type;\n            if(settings.type == 'category') {\n              $module.addClass(settings.type);\n            }\n          },\n          buttonPressed: function() {\n            $searchButton.addClass(className.pressed);\n          }\n        },\n\n        remove: {\n          loading: function() {\n            $module.removeClass(className.loading);\n          },\n          focus: function() {\n            $module.removeClass(className.focus);\n          },\n          buttonPressed: function() {\n            $searchButton.removeClass(className.pressed);\n          }\n        },\n\n        query: function(callback) {\n          callback = $.isFunction(callback)\n            ? callback\n            : function(){}\n          ;\n          var\n            searchTerm = module.get.value(),\n            cache = module.read.cache(searchTerm)\n          ;\n          callback = callback || function() {};\n          if( module.has.minimumCharacters() )  {\n            if(cache) {\n              module.debug('Reading result from cache', searchTerm);\n              module.save.results(cache.results);\n              module.addResults(cache.html);\n              module.inject.id(cache.results);\n              callback();\n            }\n            else {\n              module.debug('Querying for', searchTerm);\n              if($.isPlainObject(settings.source) || $.isArray(settings.source)) {\n                module.search.local(searchTerm);\n                callback();\n              }\n              else if( module.can.useAPI() ) {\n                module.search.remote(searchTerm, callback);\n              }\n              else {\n                module.error(error.source);\n                callback();\n              }\n            }\n            settings.onSearchQuery.call(element, searchTerm);\n          }\n          else {\n            module.hideResults();\n          }\n        },\n\n        search: {\n          local: function(searchTerm) {\n            var\n              results = module.search.object(searchTerm, settings.content),\n              searchHTML\n            ;\n            module.set.loading();\n            module.save.results(results);\n            module.debug('Returned full local search results', results);\n            if(settings.maxResults > 0) {\n              module.debug('Using specified max results', results);\n              results = results.slice(0, settings.maxResults);\n            }\n            if(settings.type == 'category') {\n              results = module.create.categoryResults(results);\n            }\n            searchHTML = module.generateResults({\n              results: results\n            });\n            module.remove.loading();\n            module.addResults(searchHTML);\n            module.inject.id(results);\n            module.write.cache(searchTerm, {\n              html    : searchHTML,\n              results : results\n            });\n          },\n          remote: function(searchTerm, callback) {\n            callback = $.isFunction(callback)\n              ? callback\n              : function(){}\n            ;\n            if($module.api('is loading')) {\n              $module.api('abort');\n            }\n            module.setup.api(searchTerm, callback);\n            $module\n              .api('query')\n            ;\n          },\n          object: function(searchTerm, source, searchFields) {\n            var\n              results      = [],\n              exactResults = [],\n              fuzzyResults = [],\n              searchExp    = searchTerm.toString().replace(regExp.escape, '\\\\$&'),\n              matchRegExp  = new RegExp(regExp.beginsWith + searchExp, 'i'),\n\n              // avoid duplicates when pushing results\n              addResult = function(array, result) {\n                var\n                  notResult      = ($.inArray(result, results) == -1),\n                  notFuzzyResult = ($.inArray(result, fuzzyResults) == -1),\n                  notExactResults = ($.inArray(result, exactResults) == -1)\n                ;\n                if(notResult && notFuzzyResult && notExactResults) {\n                  array.push(result);\n                }\n              }\n            ;\n            source = source || settings.source;\n            searchFields = (searchFields !== undefined)\n              ? searchFields\n              : settings.searchFields\n            ;\n\n            // search fields should be array to loop correctly\n            if(!$.isArray(searchFields)) {\n              searchFields = [searchFields];\n            }\n\n            // exit conditions if no source\n            if(source === undefined || source === false) {\n              module.error(error.source);\n              return [];\n            }\n            // iterate through search fields looking for matches\n            $.each(searchFields, function(index, field) {\n              $.each(source, function(label, content) {\n                var\n                  fieldExists = (typeof content[field] == 'string')\n                ;\n                if(fieldExists) {\n                  if( content[field].search(matchRegExp) !== -1) {\n                    // content starts with value (first in results)\n                    addResult(results, content);\n                  }\n                  else if(settings.fullTextSearch === 'exact' && module.exactSearch(searchTerm, content[field]) ) {\n                    // content fuzzy matches (last in results)\n                    addResult(exactResults, content);\n                  }\n                  else if(settings.fullTextSearch == true && module.fuzzySearch(searchTerm, content[field]) ) {\n                    // content fuzzy matches (last in results)\n                    addResult(fuzzyResults, content);\n                  }\n                }\n              });\n            });\n            $.merge(exactResults, fuzzyResults)\n            $.merge(results, exactResults);\n            return results;\n          }\n        },\n        exactSearch: function (query, term) {\n          query = query.toLowerCase();\n          term  = term.toLowerCase();\n          if(term.indexOf(query) > -1) {\n             return true;\n          }\n          return false;\n        },\n        fuzzySearch: function(query, term) {\n          var\n            termLength  = term.length,\n            queryLength = query.length\n          ;\n          if(typeof query !== 'string') {\n            return false;\n          }\n          query = query.toLowerCase();\n          term  = term.toLowerCase();\n          if(queryLength > termLength) {\n            return false;\n          }\n          if(queryLength === termLength) {\n            return (query === term);\n          }\n          search: for (var characterIndex = 0, nextCharacterIndex = 0; characterIndex < queryLength; characterIndex++) {\n            var\n              queryCharacter = query.charCodeAt(characterIndex)\n            ;\n            while(nextCharacterIndex < termLength) {\n              if(term.charCodeAt(nextCharacterIndex++) === queryCharacter) {\n                continue search;\n              }\n            }\n            return false;\n          }\n          return true;\n        },\n\n        parse: {\n          response: function(response, searchTerm) {\n            var\n              searchHTML = module.generateResults(response)\n            ;\n            module.verbose('Parsing server response', response);\n            if(response !== undefined) {\n              if(searchTerm !== undefined && response[fields.results] !== undefined) {\n                module.addResults(searchHTML);\n                module.inject.id(response[fields.results]);\n                module.write.cache(searchTerm, {\n                  html    : searchHTML,\n                  results : response[fields.results]\n                });\n                module.save.results(response[fields.results]);\n              }\n            }\n          }\n        },\n\n        cancel: {\n          query: function() {\n            if( module.can.useAPI() ) {\n              $module.api('abort');\n            }\n          }\n        },\n\n        has: {\n          minimumCharacters: function() {\n            var\n              searchTerm    = module.get.value(),\n              numCharacters = searchTerm.length\n            ;\n            return (numCharacters >= settings.minCharacters);\n          },\n          results: function() {\n            if($results.length === 0) {\n              return false;\n            }\n            var\n              html = $results.html()\n            ;\n            return html != '';\n          }\n        },\n\n        clear: {\n          cache: function(value) {\n            var\n              cache = $module.data(metadata.cache)\n            ;\n            if(!value) {\n              module.debug('Clearing cache', value);\n              $module.removeData(metadata.cache);\n            }\n            else if(value && cache && cache[value]) {\n              module.debug('Removing value from cache', value);\n              delete cache[value];\n              $module.data(metadata.cache, cache);\n            }\n          }\n        },\n\n        read: {\n          cache: function(name) {\n            var\n              cache = $module.data(metadata.cache)\n            ;\n            if(settings.cache) {\n              module.verbose('Checking cache for generated html for query', name);\n              return (typeof cache == 'object') && (cache[name] !== undefined)\n                ? cache[name]\n                : false\n              ;\n            }\n            return false;\n          }\n        },\n\n        create: {\n          categoryResults: function(results) {\n            var\n              categoryResults = {}\n            ;\n            $.each(results, function(index, result) {\n              if(!result.category) {\n                return;\n              }\n              if(categoryResults[result.category] === undefined) {\n                module.verbose('Creating new category of results', result.category);\n                categoryResults[result.category] = {\n                  name    : result.category,\n                  results : [result]\n                }\n              }\n              else {\n                categoryResults[result.category].results.push(result);\n              }\n            });\n            return categoryResults;\n          },\n          id: function(resultIndex, categoryIndex) {\n            var\n              resultID      = (resultIndex + 1), // not zero indexed\n              categoryID    = (categoryIndex + 1),\n              firstCharCode,\n              letterID,\n              id\n            ;\n            if(categoryIndex !== undefined) {\n              // start char code for \"A\"\n              letterID = String.fromCharCode(97 + categoryIndex);\n              id          = letterID + resultID;\n              module.verbose('Creating category result id', id);\n            }\n            else {\n              id = resultID;\n              module.verbose('Creating result id', id);\n            }\n            return id;\n          },\n          results: function() {\n            if($results.length === 0) {\n              $results = $('<div />')\n                .addClass(className.results)\n                .appendTo($module)\n              ;\n            }\n          }\n        },\n\n        inject: {\n          result: function(result, resultIndex, categoryIndex) {\n            module.verbose('Injecting result into results');\n            var\n              $selectedResult = (categoryIndex !== undefined)\n                ? $results\n                    .children().eq(categoryIndex)\n                      .children(selector.results)\n                        .first()\n                        .children(selector.result)\n                          .eq(resultIndex)\n                : $results\n                    .children(selector.result).eq(resultIndex)\n            ;\n            module.verbose('Injecting results metadata', $selectedResult);\n            $selectedResult\n              .data(metadata.result, result)\n            ;\n          },\n          id: function(results) {\n            module.debug('Injecting unique ids into results');\n            var\n              // since results may be object, we must use counters\n              categoryIndex = 0,\n              resultIndex   = 0\n            ;\n            if(settings.type === 'category') {\n              // iterate through each category result\n              $.each(results, function(index, category) {\n                resultIndex = 0;\n                $.each(category.results, function(index, value) {\n                  var\n                    result = category.results[index]\n                  ;\n                  if(result.id === undefined) {\n                    result.id = module.create.id(resultIndex, categoryIndex);\n                  }\n                  module.inject.result(result, resultIndex, categoryIndex);\n                  resultIndex++;\n                });\n                categoryIndex++;\n              });\n            }\n            else {\n              // top level\n              $.each(results, function(index, value) {\n                var\n                  result = results[index]\n                ;\n                if(result.id === undefined) {\n                  result.id = module.create.id(resultIndex);\n                }\n                module.inject.result(result, resultIndex);\n                resultIndex++;\n              });\n            }\n            return results;\n          }\n        },\n\n        save: {\n          results: function(results) {\n            module.verbose('Saving current search results to metadata', results);\n            $module.data(metadata.results, results);\n          }\n        },\n\n        write: {\n          cache: function(name, value) {\n            var\n              cache = ($module.data(metadata.cache) !== undefined)\n                ? $module.data(metadata.cache)\n                : {}\n            ;\n            if(settings.cache) {\n              module.verbose('Writing generated html to cache', name, value);\n              cache[name] = value;\n              $module\n                .data(metadata.cache, cache)\n              ;\n            }\n          }\n        },\n\n        addResults: function(html) {\n          if( $.isFunction(settings.onResultsAdd) ) {\n            if( settings.onResultsAdd.call($results, html) === false ) {\n              module.debug('onResultsAdd callback cancelled default action');\n              return false;\n            }\n          }\n          if(html) {\n            $results\n              .html(html)\n            ;\n            module.refreshResults();\n            if(settings.selectFirstResult) {\n              module.select.firstResult();\n            }\n            module.showResults();\n          }\n          else {\n            module.hideResults(function() {\n              $results.empty();\n            });\n          }\n        },\n\n        showResults: function(callback) {\n          callback = $.isFunction(callback)\n            ? callback\n            : function(){}\n          ;\n          if(resultsDismissed) {\n            return;\n          }\n          if(!module.is.visible() && module.has.results()) {\n            if( module.can.transition() ) {\n              module.debug('Showing results with css animations');\n              $results\n                .transition({\n                  animation  : settings.transition + ' in',\n                  debug      : settings.debug,\n                  verbose    : settings.verbose,\n                  duration   : settings.duration,\n                  onComplete : function() {\n                    callback();\n                  },\n                  queue      : true\n                })\n              ;\n            }\n            else {\n              module.debug('Showing results with javascript');\n              $results\n                .stop()\n                .fadeIn(settings.duration, settings.easing)\n              ;\n            }\n            settings.onResultsOpen.call($results);\n          }\n        },\n        hideResults: function(callback) {\n          callback = $.isFunction(callback)\n            ? callback\n            : function(){}\n          ;\n          if( module.is.visible() ) {\n            if( module.can.transition() ) {\n              module.debug('Hiding results with css animations');\n              $results\n                .transition({\n                  animation  : settings.transition + ' out',\n                  debug      : settings.debug,\n                  verbose    : settings.verbose,\n                  duration   : settings.duration,\n                  onComplete : function() {\n                    callback();\n                  },\n                  queue      : true\n                })\n              ;\n            }\n            else {\n              module.debug('Hiding results with javascript');\n              $results\n                .stop()\n                .fadeOut(settings.duration, settings.easing)\n              ;\n            }\n            settings.onResultsClose.call($results);\n          }\n        },\n\n        generateResults: function(response) {\n          module.debug('Generating html from response', response);\n          var\n            template       = settings.templates[settings.type],\n            isProperObject = ($.isPlainObject(response[fields.results]) && !$.isEmptyObject(response[fields.results])),\n            isProperArray  = ($.isArray(response[fields.results]) && response[fields.results].length > 0),\n            html           = ''\n          ;\n          if(isProperObject || isProperArray ) {\n            if(settings.maxResults > 0) {\n              if(isProperObject) {\n                if(settings.type == 'standard') {\n                  module.error(error.maxResults);\n                }\n              }\n              else {\n                response[fields.results] = response[fields.results].slice(0, settings.maxResults);\n              }\n            }\n            if($.isFunction(template)) {\n              html = template(response, fields);\n            }\n            else {\n              module.error(error.noTemplate, false);\n            }\n          }\n          else if(settings.showNoResults) {\n            html = module.displayMessage(error.noResults, 'empty');\n          }\n          settings.onResults.call(element, response);\n          return html;\n        },\n\n        displayMessage: function(text, type) {\n          type = type || 'standard';\n          module.debug('Displaying message', text, type);\n          module.addResults( settings.templates.message(text, type) );\n          return settings.templates.message(text, type);\n        },\n\n        setting: function(name, value) {\n          if( $.isPlainObject(name) ) {\n            $.extend(true, settings, name);\n          }\n          else if(value !== undefined) {\n            settings[name] = value;\n          }\n          else {\n            return settings[name];\n          }\n        },\n        internal: function(name, value) {\n          if( $.isPlainObject(name) ) {\n            $.extend(true, module, name);\n          }\n          else if(value !== undefined) {\n            module[name] = value;\n          }\n          else {\n            return module[name];\n          }\n        },\n        debug: function() {\n          if(!settings.silent && settings.debug) {\n            if(settings.performance) {\n              module.performance.log(arguments);\n            }\n            else {\n              module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');\n              module.debug.apply(console, arguments);\n            }\n          }\n        },\n        verbose: function() {\n          if(!settings.silent && settings.verbose && settings.debug) {\n            if(settings.performance) {\n              module.performance.log(arguments);\n            }\n            else {\n              module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');\n              module.verbose.apply(console, arguments);\n            }\n          }\n        },\n        error: function() {\n          if(!settings.silent) {\n            module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');\n            module.error.apply(console, arguments);\n          }\n        },\n        performance: {\n          log: function(message) {\n            var\n              currentTime,\n              executionTime,\n              previousTime\n            ;\n            if(settings.performance) {\n              currentTime   = new Date().getTime();\n              previousTime  = time || currentTime;\n              executionTime = currentTime - previousTime;\n              time          = currentTime;\n              performance.push({\n                'Name'           : message[0],\n                'Arguments'      : [].slice.call(message, 1) || '',\n                'Element'        : element,\n                'Execution Time' : executionTime\n              });\n            }\n            clearTimeout(module.performance.timer);\n            module.performance.timer = setTimeout(module.performance.display, 500);\n          },\n          display: function() {\n            var\n              title = settings.name + ':',\n              totalTime = 0\n            ;\n            time = false;\n            clearTimeout(module.performance.timer);\n            $.each(performance, function(index, data) {\n              totalTime += data['Execution Time'];\n            });\n            title += ' ' + totalTime + 'ms';\n            if(moduleSelector) {\n              title += ' \\'' + moduleSelector + '\\'';\n            }\n            if($allModules.length > 1) {\n              title += ' ' + '(' + $allModules.length + ')';\n            }\n            if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {\n              console.groupCollapsed(title);\n              if(console.table) {\n                console.table(performance);\n              }\n              else {\n                $.each(performance, function(index, data) {\n                  console.log(data['Name'] + ': ' + data['Execution Time']+'ms');\n                });\n              }\n              console.groupEnd();\n            }\n            performance = [];\n          }\n        },\n        invoke: function(query, passedArguments, context) {\n          var\n            object = instance,\n            maxDepth,\n            found,\n            response\n          ;\n          passedArguments = passedArguments || queryArguments;\n          context         = element         || context;\n          if(typeof query == 'string' && object !== undefined) {\n            query    = query.split(/[\\. ]/);\n            maxDepth = query.length - 1;\n            $.each(query, function(depth, value) {\n              var camelCaseValue = (depth != maxDepth)\n                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)\n                : query\n              ;\n              if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {\n                object = object[camelCaseValue];\n              }\n              else if( object[camelCaseValue] !== undefined ) {\n                found = object[camelCaseValue];\n                return false;\n              }\n              else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {\n                object = object[value];\n              }\n              else if( object[value] !== undefined ) {\n                found = object[value];\n                return false;\n              }\n              else {\n                return false;\n              }\n            });\n          }\n          if( $.isFunction( found ) ) {\n            response = found.apply(context, passedArguments);\n          }\n          else if(found !== undefined) {\n            response = found;\n          }\n          if($.isArray(returnedValue)) {\n            returnedValue.push(response);\n          }\n          else if(returnedValue !== undefined) {\n            returnedValue = [returnedValue, response];\n          }\n          else if(response !== undefined) {\n            returnedValue = response;\n          }\n          return found;\n        }\n      };\n      if(methodInvoked) {\n        if(instance === undefined) {\n          module.initialize();\n        }\n        module.invoke(query);\n      }\n      else {\n        if(instance !== undefined) {\n          instance.invoke('destroy');\n        }\n        module.initialize();\n      }\n\n    })\n  ;\n\n  return (returnedValue !== undefined)\n    ? returnedValue\n    : this\n  ;\n};\n\n$.fn.search.settings = {\n\n  name              : 'Search',\n  namespace         : 'search',\n\n  silent            : false,\n  debug             : false,\n  verbose           : false,\n  performance       : true,\n\n  // template to use (specified in settings.templates)\n  type              : 'standard',\n\n  // minimum characters required to search\n  minCharacters     : 1,\n\n  // whether to select first result after searching automatically\n  selectFirstResult : false,\n\n  // API config\n  apiSettings       : false,\n\n  // object to search\n  source            : false,\n\n  // Whether search should query current term on focus\n  searchOnFocus     : true,\n\n  // fields to search\n  searchFields   : [\n    'title',\n    'description'\n  ],\n\n  // field to display in standard results template\n  displayField   : '',\n\n  // search anywhere in value (set to 'exact' to require exact matches\n  fullTextSearch : 'exact',\n\n  // whether to add events to prompt automatically\n  automatic      : true,\n\n  // delay before hiding menu after blur\n  hideDelay      : 0,\n\n  // delay before searching\n  searchDelay    : 200,\n\n  // maximum results returned from search\n  maxResults     : 7,\n\n  // whether to store lookups in local cache\n  cache          : true,\n\n  // whether no results errors should be shown\n  showNoResults  : true,\n\n  // transition settings\n  transition     : 'scale',\n  duration       : 200,\n  easing         : 'easeOutExpo',\n\n  // callbacks\n  onSelect       : false,\n  onResultsAdd   : false,\n\n  onSearchQuery  : function(query){},\n  onResults      : function(response){},\n\n  onResultsOpen  : function(){},\n  onResultsClose : function(){},\n\n  className: {\n    animating : 'animating',\n    active    : 'active',\n    empty     : 'empty',\n    focus     : 'focus',\n    hidden    : 'hidden',\n    loading   : 'loading',\n    results   : 'results',\n    pressed   : 'down'\n  },\n\n  error : {\n    source          : 'Cannot search. No source used, and Semantic API module was not included',\n    noResults       : 'Your search returned no results',\n    logging         : 'Error in debug logging, exiting.',\n    noEndpoint      : 'No search endpoint was specified',\n    noTemplate      : 'A valid template name was not specified.',\n    oldSearchSyntax : 'searchFullText setting has been renamed fullTextSearch for consistency, please adjust your settings.',\n    serverError     : 'There was an issue querying the server.',\n    maxResults      : 'Results must be an array to use maxResults setting',\n    method          : 'The method you called is not defined.'\n  },\n\n  metadata: {\n    cache   : 'cache',\n    results : 'results',\n    result  : 'result'\n  },\n\n  regExp: {\n    escape     : /[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g,\n    beginsWith : '(?:\\s|^)'\n  },\n\n  // maps api response attributes to internal representation\n  fields: {\n    categories      : 'results',     // array of categories (category view)\n    categoryName    : 'name',        // name of category (category view)\n    categoryResults : 'results',     // array of results (category view)\n    description     : 'description', // result description\n    image           : 'image',       // result image\n    price           : 'price',       // result price\n    results         : 'results',     // array of results (standard)\n    title           : 'title',       // result title\n    url             : 'url',         // result url\n    action          : 'action',      // \"view more\" object name\n    actionText      : 'text',        // \"view more\" text\n    actionURL       : 'url'          // \"view more\" url\n  },\n\n  selector : {\n    prompt       : '.prompt',\n    searchButton : '.search.button',\n    results      : '.results',\n    message      : '.results > .message',\n    category     : '.category',\n    result       : '.result',\n    title        : '.title, .name'\n  },\n\n  templates: {\n    escape: function(string) {\n      var\n        badChars     = /[&<>\"'`]/g,\n        shouldEscape = /[&<>\"'`]/,\n        escape       = {\n          \"&\": \"&amp;\",\n          \"<\": \"&lt;\",\n          \">\": \"&gt;\",\n          '\"': \"&quot;\",\n          \"'\": \"&#x27;\",\n          \"`\": \"&#x60;\"\n        },\n        escapedChar  = function(chr) {\n          return escape[chr];\n        }\n      ;\n      if(shouldEscape.test(string)) {\n        return string.replace(badChars, escapedChar);\n      }\n      return string;\n    },\n    message: function(message, type) {\n      var\n        html = ''\n      ;\n      if(message !== undefined && type !== undefined) {\n        html +=  ''\n          + '<div class=\"message ' + type + '\">'\n        ;\n        // message type\n        if(type == 'empty') {\n          html += ''\n            + '<div class=\"header\">No Results</div class=\"header\">'\n            + '<div class=\"description\">' + message + '</div class=\"description\">'\n          ;\n        }\n        else {\n          html += ' <div class=\"description\">' + message + '</div>';\n        }\n        html += '</div>';\n      }\n      return html;\n    },\n    category: function(response, fields) {\n      var\n        html = '',\n        escape = $.fn.search.settings.templates.escape\n      ;\n      if(response[fields.categoryResults] !== undefined) {\n\n        // each category\n        $.each(response[fields.categoryResults], function(index, category) {\n          if(category[fields.results] !== undefined && category.results.length > 0) {\n\n            html  += '<div class=\"category\">';\n\n            if(category[fields.categoryName] !== undefined) {\n              html += '<div class=\"name\">' + category[fields.categoryName] + '</div>';\n            }\n\n            // each item inside category\n            html += '<div class=\"results\">';\n            $.each(category.results, function(index, result) {\n              if(result[fields.url]) {\n                html  += '<a class=\"result\" href=\"' + result[fields.url] + '\">';\n              }\n              else {\n                html  += '<a class=\"result\">';\n              }\n              if(result[fields.image] !== undefined) {\n                html += ''\n                  + '<div class=\"image\">'\n                  + ' <img src=\"' + result[fields.image] + '\">'\n                  + '</div>'\n                ;\n              }\n              html += '<div class=\"content\">';\n              if(result[fields.price] !== undefined) {\n                html += '<div class=\"price\">' + result[fields.price] + '</div>';\n              }\n              if(result[fields.title] !== undefined) {\n                html += '<div class=\"title\">' + result[fields.title] + '</div>';\n              }\n              if(result[fields.description] !== undefined) {\n                html += '<div class=\"description\">' + result[fields.description] + '</div>';\n              }\n              html  += ''\n                + '</div>'\n              ;\n              html += '</a>';\n            });\n            html += '</div>';\n            html  += ''\n              + '</div>'\n            ;\n          }\n        });\n        if(response[fields.action]) {\n          html += ''\n          + '<a href=\"' + response[fields.action][fields.actionURL] + '\" class=\"action\">'\n          +   response[fields.action][fields.actionText]\n          + '</a>';\n        }\n        return html;\n      }\n      return false;\n    },\n    standard: function(response, fields) {\n      var\n        html = ''\n      ;\n      if(response[fields.results] !== undefined) {\n\n        // each result\n        $.each(response[fields.results], function(index, result) {\n          if(result[fields.url]) {\n            html  += '<a class=\"result\" href=\"' + result[fields.url] + '\">';\n          }\n          else {\n            html  += '<a class=\"result\">';\n          }\n          if(result[fields.image] !== undefined) {\n            html += ''\n              + '<div class=\"image\">'\n              + ' <img src=\"' + result[fields.image] + '\">'\n              + '</div>'\n            ;\n          }\n          html += '<div class=\"content\">';\n          if(result[fields.price] !== undefined) {\n            html += '<div class=\"price\">' + result[fields.price] + '</div>';\n          }\n          if(result[fields.title] !== undefined) {\n            html += '<div class=\"title\">' + result[fields.title] + '</div>';\n          }\n          if(result[fields.description] !== undefined) {\n            html += '<div class=\"description\">' + result[fields.description] + '</div>';\n          }\n          html  += ''\n            + '</div>'\n          ;\n          html += '</a>';\n        });\n\n        if(response[fields.action]) {\n          html += ''\n          + '<a href=\"' + response[fields.action][fields.actionURL] + '\" class=\"action\">'\n          +   response[fields.action][fields.actionText]\n          + '</a>';\n        }\n        return html;\n      }\n      return false;\n    }\n  }\n};\n\n})( jQuery, window, document );\n"
  },
  {
    "path": "semantic/src/definitions/modules/search.less",
    "content": "/*!\n * # Semantic UI - Search\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n            Theme\n*******************************/\n\n@type    : 'module';\n@element : 'search';\n\n@import (multiple) '../../theme.config';\n\n/*******************************\n             Search\n*******************************/\n\n.ui.search {\n  position: relative;\n}\n\n.ui.search > .prompt {\n  margin: 0em;\n  outline: none;\n  -webkit-appearance: none;\n  -webkit-tap-highlight-color:  rgba(255, 255, 255, 0);\n\n  text-shadow: none;\n  font-style: normal;\n  font-weight: @normal;\n\n  line-height: @promptLineHeight;\n  padding: @promptPadding;\n  font-size: @promptFontSize;\n\n  background: @promptBackground;\n  border: @promptBorder;\n  color: @promptColor;\n  box-shadow: @promptBoxShadow;\n  transition: @promptTransition;\n}\n\n.ui.search .prompt {\n  border-radius: @promptBorderRadius;\n}\n\n\n/*--------------\n     Icon\n---------------*/\n\n.ui.search .prompt ~ .search.icon {\n  cursor: pointer;\n}\n\n/*--------------\n    Results\n---------------*/\n\n.ui.search > .results {\n  display: none;\n\n  position: absolute;\n  top: 100%;\n  left: 0%;\n  transform-origin: center top;\n  white-space: normal;\n\n  background: @resultsBackground;\n\n  margin-top: @resultsDistance;\n  width: @resultsWidth;\n\n  border-radius: @resultsBorderRadius;\n  box-shadow: @resultsBoxShadow;\n  border: @resultsBorder;\n  z-index: @resultsZIndex;\n}\n.ui.search > .results > :first-child {\n  border-radius: @resultsBorderRadius @resultsBorderRadius 0em 0em;\n}\n.ui.search > .results > :last-child {\n  border-radius: 0em 0em @resultsBorderRadius @resultsBorderRadius;\n}\n\n/*--------------\n    Result\n---------------*/\n\n.ui.search > .results .result {\n  cursor: pointer;\n  display: block;\n  overflow: hidden;\n  font-size: @resultFontSize;\n  padding: @resultPadding;\n  color: @resultTextColor;\n  line-height: @resultLineHeight;\n  border-bottom: @resultDivider;\n}\n.ui.search > .results .result:last-child {\n  border-bottom: @resultLastDivider !important;\n}\n\n/* Image */\n.ui.search > .results .result .image {\n  float: @resultImageFloat;\n  overflow: hidden;\n  background: @resultImageBackground;\n  width: @resultImageWidth;\n  height: @resultImageHeight;\n  border-radius: @resultImageBorderRadius;\n}\n.ui.search > .results .result .image img {\n  display: block;\n  width: auto;\n  height: 100%;\n}\n\n/*--------------\n      Info\n---------------*/\n\n.ui.search > .results .result .image + .content {\n  margin: @resultImageMargin;\n}\n\n.ui.search > .results .result .title {\n  margin: @resultTitleMargin;\n  font-family: @resultTitleFont;\n  font-weight: @resultTitleFontWeight;\n  font-size: @resultTitleFontSize;\n  color: @resultTitleColor;\n}\n.ui.search > .results .result .description {\n  margin-top: @resultDescriptionDistance;\n  font-size: @resultDescriptionFontSize;\n  color: @resultDescriptionColor;\n}\n.ui.search > .results .result .price {\n  float: @resultPriceFloat;\n  color: @resultPriceColor;\n}\n\n/*--------------\n    Message\n---------------*/\n\n.ui.search > .results > .message {\n  padding: @messageVerticalPadding @messageHorizontalPadding;\n}\n.ui.search > .results > .message .header {\n  font-family: @headerFont;\n  font-size: @messageHeaderFontSize;\n  font-weight: @messageHeaderFontWeight;\n  color: @messageHeaderColor;\n}\n.ui.search > .results > .message .description {\n  margin-top: @messageDescriptionDistance;\n  font-size: @messageDescriptionFontSize;\n  color: @messageDescriptionColor;\n}\n\n/* View All Results */\n.ui.search > .results > .action {\n  display: block;\n  border-top: @actionBorder;\n  background: @actionBackground;\n  padding: @actionPadding;\n  color: @actionColor;\n  font-weight: @actionFontWeight;\n  text-align: @actionAlign;\n}\n\n\n/*******************************\n            States\n*******************************/\n\n/*--------------------\n       Focus\n---------------------*/\n\n.ui.search > .prompt:focus {\n  border-color: @promptFocusBorderColor;\n  background: @promptFocusBackground;\n  color: @promptFocusColor;\n}\n\n/*--------------------\n       Loading\n---------------------*/\n\n.ui.loading.search .input > i.icon:before {\n  position: absolute;\n  content: '';\n  top: 50%;\n  left: 50%;\n\n  margin: @loaderMargin;\n  width: @loaderSize;\n  height: @loaderSize;\n\n  border-radius: @circularRadius;\n  border: @loaderLineWidth solid @loaderFillColor;\n}\n.ui.loading.search .input > i.icon:after {\n  position: absolute;\n  content: '';\n  top: 50%;\n  left: 50%;\n\n  margin: @loaderMargin;\n  width: @loaderSize;\n  height: @loaderSize;\n\n  animation: button-spin @loaderSpeed linear;\n  animation-iteration-count: infinite;\n\n  border-radius: @circularRadius;\n\n  border-color: @loaderLineColor transparent transparent;\n  border-style: solid;\n  border-width: @loaderLineWidth;\n\n  box-shadow: 0px 0px 0px 1px transparent;\n}\n\n\n/*--------------\n      Hover\n---------------*/\n\n.ui.search > .results .result:hover,\n.ui.category.search > .results .category .result:hover {\n  background: @resultHoverBackground;\n}\n.ui.search .action:hover {\n  background: @actionHoverBackground;\n}\n\n/*--------------\n      Active\n---------------*/\n\n.ui.category.search > .results .category.active {\n  background: @categoryActiveBackground;\n}\n.ui.category.search > .results .category.active > .name {\n  color: @categoryNameActiveColor;\n}\n\n.ui.search > .results .result.active,\n.ui.category.search > .results .category .result.active {\n  position: relative;\n  border-left-color: @resultActiveBorderLeft;\n  background: @resultActiveBackground;\n  box-shadow: @resultActiveBoxShadow;\n}\n.ui.search > .results .result.active .title {\n  color: @resultActiveTitleColor;\n}\n.ui.search > .results .result.active .description {\n  color: @resultActiveDescriptionColor;\n}\n\n/*--------------------\n        Disabled\n----------------------*/\n\n/* Disabled */\n.ui.disabled.search {\n  cursor: default;\n  pointer-events: none;\n  opacity: @disabledOpacity;\n}\n\n\n/*******************************\n           Types\n*******************************/\n\n/*--------------\n    Selection\n---------------*/\n\n.ui.search.selection .prompt {\n  border-radius: @selectionPromptBorderRadius;\n}\n\n/* Remove input */\n.ui.search.selection > .icon.input > .remove.icon {\n  pointer-events: none;\n  position: absolute;\n  left: auto;\n  opacity: 0;\n  color: @selectionCloseIconColor;\n  top: @selectionCloseTop;\n  right: @selectionCloseRight;\n  transition: @selectionCloseTransition;\n}\n.ui.search.selection > .icon.input > .active.remove.icon {\n  cursor: pointer;\n  opacity: @selectionCloseIconOpacity;\n  pointer-events: auto;\n}\n.ui.search.selection > .icon.input:not([class*=\"left icon\"]) > .icon ~ .remove.icon {\n  right: @selectionCloseIconInputRight;\n}\n.ui.search.selection > .icon.input > .remove.icon:hover {\n  opacity: @selectionCloseIconHoverOpacity;\n  color: @selectionCloseIconHoverColor;\n}\n\n\n/*--------------\n    Category\n---------------*/\n\n.ui.category.search .results {\n  width: @categoryResultsWidth;\n}\n\n.ui.category.search .results.animating,\n.ui.category.search .results.visible {\n  display: table;\n}\n\n/* Category */\n.ui.category.search > .results .category {\n  display: table-row;\n  background: @categoryBackground;\n  box-shadow: @categoryBoxShadow;\n  transition: @categoryTransition;\n}\n\n/* Last Category */\n.ui.category.search > .results .category:last-child {\n  border-bottom: none;\n}\n\n/* First / Last */\n.ui.category.search > .results .category:first-child .name + .result {\n  border-radius: 0em @resultsBorderRadius 0em 0em;\n}\n.ui.category.search > .results .category:last-child .result:last-child {\n  border-radius: 0em 0em @resultsBorderRadius 0em;\n}\n\n/* Category Result Name */\n.ui.category.search > .results .category > .name {\n  display: table-cell;\n  text-overflow: ellipsis;\n  width: @categoryNameWidth;\n  white-space: @categoryNameWhitespace;\n  background: @categoryNameBackground;\n  font-family: @categoryNameFont;\n  font-size: @categoryNameFontSize;\n  padding: @categoryNamePadding;\n  font-weight: @categoryNameFontWeight;\n  color: @categoryNameColor;\n  border-bottom: @categoryDivider;\n}\n\n/* Category Result */\n.ui.category.search > .results .category .results {\n  display: table-cell;\n  background: @categoryResultBackground;\n  border-left: @categoryResultLeftBorder;\n  border-bottom: @categoryDivider;\n}\n.ui.category.search > .results .category .result {\n  border-bottom: @categoryResultDivider;\n  transition: @categoryResultTransition;\n  padding: @categoryResultPadding;\n}\n\n/*******************************\n           Variations\n*******************************/\n\n/*-------------------\n     Left / Right\n--------------------*/\n\n.ui[class*=\"left aligned\"].search > .results {\n  right: auto;\n  left: 0%;\n}\n.ui[class*=\"right aligned\"].search > .results {\n  right: 0%;\n  left: auto;\n}\n\n/*--------------\n    Fluid\n---------------*/\n\n.ui.fluid.search .results {\n  width: 100%;\n}\n\n\n/*--------------\n      Sizes\n---------------*/\n\n.ui.mini.search {\n  font-size: @relativeMini;\n}\n.ui.small.search {\n  font-size: @relativeSmall;\n}\n.ui.search {\n  font-size: @relativeMedium;\n}\n.ui.large.search {\n  font-size: @relativeLarge;\n}\n.ui.big.search {\n  font-size: @relativeBig;\n}\n.ui.huge.search {\n  font-size: @relativeHuge;\n}\n.ui.massive.search {\n  font-size: @relativeMassive;\n}\n\n/*--------------\n      Mobile\n---------------*/\n\n@media only screen and (max-width: @largestMobileScreen) {\n  .ui.search .results {\n    max-width: @mobileMaxWidth;\n  }\n}\n\n.loadUIOverrides();\n"
  },
  {
    "path": "semantic/src/definitions/modules/shape.js",
    "content": "/*!\n * # Semantic UI - Shape\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n;(function ($, window, document, undefined) {\n\n'use strict';\n\nwindow = (typeof window != 'undefined' && window.Math == Math)\n  ? window\n  : (typeof self != 'undefined' && self.Math == Math)\n    ? self\n    : Function('return this')()\n;\n\n$.fn.shape = function(parameters) {\n  var\n    $allModules     = $(this),\n    $body           = $('body'),\n\n    time            = new Date().getTime(),\n    performance     = [],\n\n    query           = arguments[0],\n    methodInvoked   = (typeof query == 'string'),\n    queryArguments  = [].slice.call(arguments, 1),\n\n    requestAnimationFrame = window.requestAnimationFrame\n      || window.mozRequestAnimationFrame\n      || window.webkitRequestAnimationFrame\n      || window.msRequestAnimationFrame\n      || function(callback) { setTimeout(callback, 0); },\n\n    returnedValue\n  ;\n\n  $allModules\n    .each(function() {\n      var\n        moduleSelector = $allModules.selector || '',\n        settings       = ( $.isPlainObject(parameters) )\n          ? $.extend(true, {}, $.fn.shape.settings, parameters)\n          : $.extend({}, $.fn.shape.settings),\n\n        // internal aliases\n        namespace     = settings.namespace,\n        selector      = settings.selector,\n        error         = settings.error,\n        className     = settings.className,\n\n        // define namespaces for modules\n        eventNamespace  = '.' + namespace,\n        moduleNamespace = 'module-' + namespace,\n\n        // selector cache\n        $module       = $(this),\n        $sides        = $module.find(selector.sides),\n        $side         = $module.find(selector.side),\n\n        // private variables\n        nextIndex = false,\n        $activeSide,\n        $nextSide,\n\n        // standard module\n        element       = this,\n        instance      = $module.data(moduleNamespace),\n        module\n      ;\n\n      module = {\n\n        initialize: function() {\n          module.verbose('Initializing module for', element);\n          module.set.defaultSide();\n          module.instantiate();\n        },\n\n        instantiate: function() {\n          module.verbose('Storing instance of module', module);\n          instance = module;\n          $module\n            .data(moduleNamespace, instance)\n          ;\n        },\n\n        destroy: function() {\n          module.verbose('Destroying previous module for', element);\n          $module\n            .removeData(moduleNamespace)\n            .off(eventNamespace)\n          ;\n        },\n\n        refresh: function() {\n          module.verbose('Refreshing selector cache for', element);\n          $module = $(element);\n          $sides  = $(this).find(selector.shape);\n          $side   = $(this).find(selector.side);\n        },\n\n        repaint: function() {\n          module.verbose('Forcing repaint event');\n          var\n            shape          = $sides[0] || document.createElement('div'),\n            fakeAssignment = shape.offsetWidth\n          ;\n        },\n\n        animate: function(propertyObject, callback) {\n          module.verbose('Animating box with properties', propertyObject);\n          callback = callback || function(event) {\n            module.verbose('Executing animation callback');\n            if(event !== undefined) {\n              event.stopPropagation();\n            }\n            module.reset();\n            module.set.active();\n          };\n          settings.beforeChange.call($nextSide[0]);\n          if(module.get.transitionEvent()) {\n            module.verbose('Starting CSS animation');\n            $module\n              .addClass(className.animating)\n            ;\n            $sides\n              .css(propertyObject)\n              .one(module.get.transitionEvent(), callback)\n            ;\n            module.set.duration(settings.duration);\n            requestAnimationFrame(function() {\n              $module\n                .addClass(className.animating)\n              ;\n              $activeSide\n                .addClass(className.hidden)\n              ;\n            });\n          }\n          else {\n            callback();\n          }\n        },\n\n        queue: function(method) {\n          module.debug('Queueing animation of', method);\n          $sides\n            .one(module.get.transitionEvent(), function() {\n              module.debug('Executing queued animation');\n              setTimeout(function(){\n                $module.shape(method);\n              }, 0);\n            })\n          ;\n        },\n\n        reset: function() {\n          module.verbose('Animating states reset');\n          $module\n            .removeClass(className.animating)\n            .attr('style', '')\n            .removeAttr('style')\n          ;\n          // removeAttr style does not consistently work in safari\n          $sides\n            .attr('style', '')\n            .removeAttr('style')\n          ;\n          $side\n            .attr('style', '')\n            .removeAttr('style')\n            .removeClass(className.hidden)\n          ;\n          $nextSide\n            .removeClass(className.animating)\n            .attr('style', '')\n            .removeAttr('style')\n          ;\n        },\n\n        is: {\n          complete: function() {\n            return ($side.filter('.' + className.active)[0] == $nextSide[0]);\n          },\n          animating: function() {\n            return $module.hasClass(className.animating);\n          }\n        },\n\n        set: {\n\n          defaultSide: function() {\n            $activeSide = $module.find('.' + settings.className.active);\n            $nextSide   = ( $activeSide.next(selector.side).length > 0 )\n              ? $activeSide.next(selector.side)\n              : $module.find(selector.side).first()\n            ;\n            nextIndex = false;\n            module.verbose('Active side set to', $activeSide);\n            module.verbose('Next side set to', $nextSide);\n          },\n\n          duration: function(duration) {\n            duration = duration || settings.duration;\n            duration = (typeof duration == 'number')\n              ? duration + 'ms'\n              : duration\n            ;\n            module.verbose('Setting animation duration', duration);\n            if(settings.duration || settings.duration === 0) {\n              $sides.add($side)\n                .css({\n                  '-webkit-transition-duration': duration,\n                  '-moz-transition-duration': duration,\n                  '-ms-transition-duration': duration,\n                  '-o-transition-duration': duration,\n                  'transition-duration': duration\n                })\n              ;\n            }\n          },\n\n          currentStageSize: function() {\n            var\n              $activeSide = $module.find('.' + settings.className.active),\n              width       = $activeSide.outerWidth(true),\n              height      = $activeSide.outerHeight(true)\n            ;\n            $module\n              .css({\n                width: width,\n                height: height\n              })\n            ;\n          },\n\n          stageSize: function() {\n            var\n              $clone      = $module.clone().addClass(className.loading),\n              $activeSide = $clone.find('.' + settings.className.active),\n              $nextSide   = (nextIndex)\n                ? $clone.find(selector.side).eq(nextIndex)\n                : ( $activeSide.next(selector.side).length > 0 )\n                  ? $activeSide.next(selector.side)\n                  : $clone.find(selector.side).first(),\n              newWidth    = (settings.width == 'next')\n                ? $nextSide.outerWidth(true)\n                : (settings.width == 'initial')\n                  ? $module.width()\n                  : settings.width,\n              newHeight    = (settings.height == 'next')\n                ? $nextSide.outerHeight(true)\n                : (settings.height == 'initial')\n                  ? $module.height()\n                  : settings.height\n            ;\n            $activeSide.removeClass(className.active);\n            $nextSide.addClass(className.active);\n            $clone.insertAfter($module);\n            $clone.remove();\n            if(settings.width != 'auto') {\n              $module.css('width', newWidth + settings.jitter);\n              module.verbose('Specifying width during animation', newWidth);\n            }\n            if(settings.height != 'auto') {\n              $module.css('height', newHeight + settings.jitter);\n              module.verbose('Specifying height during animation', newHeight);\n            }\n          },\n\n          nextSide: function(selector) {\n            nextIndex = selector;\n            $nextSide = $side.filter(selector);\n            nextIndex = $side.index($nextSide);\n            if($nextSide.length === 0) {\n              module.set.defaultSide();\n              module.error(error.side);\n            }\n            module.verbose('Next side manually set to', $nextSide);\n          },\n\n          active: function() {\n            module.verbose('Setting new side to active', $nextSide);\n            $side\n              .removeClass(className.active)\n            ;\n            $nextSide\n              .addClass(className.active)\n            ;\n            settings.onChange.call($nextSide[0]);\n            module.set.defaultSide();\n          }\n        },\n\n        flip: {\n\n          up: function() {\n            if(module.is.complete() && !module.is.animating() && !settings.allowRepeats) {\n              module.debug('Side already visible', $nextSide);\n              return;\n            }\n            if( !module.is.animating()) {\n              module.debug('Flipping up', $nextSide);\n              var\n                transform = module.get.transform.up()\n              ;\n              module.set.stageSize();\n              module.stage.above();\n              module.animate(transform);\n            }\n            else {\n              module.queue('flip up');\n            }\n          },\n\n          down: function() {\n            if(module.is.complete() && !module.is.animating() && !settings.allowRepeats) {\n              module.debug('Side already visible', $nextSide);\n              return;\n            }\n            if( !module.is.animating()) {\n              module.debug('Flipping down', $nextSide);\n              var\n                transform = module.get.transform.down()\n              ;\n              module.set.stageSize();\n              module.stage.below();\n              module.animate(transform);\n            }\n            else {\n              module.queue('flip down');\n            }\n          },\n\n          left: function() {\n            if(module.is.complete() && !module.is.animating() && !settings.allowRepeats) {\n              module.debug('Side already visible', $nextSide);\n              return;\n            }\n            if( !module.is.animating()) {\n              module.debug('Flipping left', $nextSide);\n              var\n                transform = module.get.transform.left()\n              ;\n              module.set.stageSize();\n              module.stage.left();\n              module.animate(transform);\n            }\n            else {\n              module.queue('flip left');\n            }\n          },\n\n          right: function() {\n            if(module.is.complete() && !module.is.animating() && !settings.allowRepeats) {\n              module.debug('Side already visible', $nextSide);\n              return;\n            }\n            if( !module.is.animating()) {\n              module.debug('Flipping right', $nextSide);\n              var\n                transform = module.get.transform.right()\n              ;\n              module.set.stageSize();\n              module.stage.right();\n              module.animate(transform);\n            }\n            else {\n              module.queue('flip right');\n            }\n          },\n\n          over: function() {\n            if(module.is.complete() && !module.is.animating() && !settings.allowRepeats) {\n              module.debug('Side already visible', $nextSide);\n              return;\n            }\n            if( !module.is.animating()) {\n              module.debug('Flipping over', $nextSide);\n              module.set.stageSize();\n              module.stage.behind();\n              module.animate(module.get.transform.over() );\n            }\n            else {\n              module.queue('flip over');\n            }\n          },\n\n          back: function() {\n            if(module.is.complete() && !module.is.animating() && !settings.allowRepeats) {\n              module.debug('Side already visible', $nextSide);\n              return;\n            }\n            if( !module.is.animating()) {\n              module.debug('Flipping back', $nextSide);\n              module.set.stageSize();\n              module.stage.behind();\n              module.animate(module.get.transform.back() );\n            }\n            else {\n              module.queue('flip back');\n            }\n          }\n\n        },\n\n        get: {\n\n          transform: {\n            up: function() {\n              var\n                translate = {\n                  y: -(($activeSide.outerHeight(true) - $nextSide.outerHeight(true)) / 2),\n                  z: -($activeSide.outerHeight(true) / 2)\n                }\n              ;\n              return {\n                transform: 'translateY(' + translate.y + 'px) translateZ('+ translate.z + 'px) rotateX(-90deg)'\n              };\n            },\n\n            down: function() {\n              var\n                translate = {\n                  y: -(($activeSide.outerHeight(true) - $nextSide.outerHeight(true)) / 2),\n                  z: -($activeSide.outerHeight(true) / 2)\n                }\n              ;\n              return {\n                transform: 'translateY(' + translate.y + 'px) translateZ('+ translate.z + 'px) rotateX(90deg)'\n              };\n            },\n\n            left: function() {\n              var\n                translate = {\n                  x : -(($activeSide.outerWidth(true) - $nextSide.outerWidth(true)) / 2),\n                  z : -($activeSide.outerWidth(true) / 2)\n                }\n              ;\n              return {\n                transform: 'translateX(' + translate.x + 'px) translateZ(' + translate.z + 'px) rotateY(90deg)'\n              };\n            },\n\n            right: function() {\n              var\n                translate = {\n                  x : -(($activeSide.outerWidth(true) - $nextSide.outerWidth(true)) / 2),\n                  z : -($activeSide.outerWidth(true) / 2)\n                }\n              ;\n              return {\n                transform: 'translateX(' + translate.x + 'px) translateZ(' + translate.z + 'px) rotateY(-90deg)'\n              };\n            },\n\n            over: function() {\n              var\n                translate = {\n                  x : -(($activeSide.outerWidth(true) - $nextSide.outerWidth(true)) / 2)\n                }\n              ;\n              return {\n                transform: 'translateX(' + translate.x + 'px) rotateY(180deg)'\n              };\n            },\n\n            back: function() {\n              var\n                translate = {\n                  x : -(($activeSide.outerWidth(true) - $nextSide.outerWidth(true)) / 2)\n                }\n              ;\n              return {\n                transform: 'translateX(' + translate.x + 'px) rotateY(-180deg)'\n              };\n            }\n          },\n\n          transitionEvent: function() {\n            var\n              element     = document.createElement('element'),\n              transitions = {\n                'transition'       :'transitionend',\n                'OTransition'      :'oTransitionEnd',\n                'MozTransition'    :'transitionend',\n                'WebkitTransition' :'webkitTransitionEnd'\n              },\n              transition\n            ;\n            for(transition in transitions){\n              if( element.style[transition] !== undefined ){\n                return transitions[transition];\n              }\n            }\n          },\n\n          nextSide: function() {\n            return ( $activeSide.next(selector.side).length > 0 )\n              ? $activeSide.next(selector.side)\n              : $module.find(selector.side).first()\n            ;\n          }\n\n        },\n\n        stage: {\n\n          above: function() {\n            var\n              box = {\n                origin : (($activeSide.outerHeight(true) - $nextSide.outerHeight(true)) / 2),\n                depth  : {\n                  active : ($nextSide.outerHeight(true) / 2),\n                  next   : ($activeSide.outerHeight(true) / 2)\n                }\n              }\n            ;\n            module.verbose('Setting the initial animation position as above', $nextSide, box);\n            $sides\n              .css({\n                'transform' : 'translateZ(-' + box.depth.active + 'px)'\n              })\n            ;\n            $activeSide\n              .css({\n                'transform' : 'rotateY(0deg) translateZ(' + box.depth.active + 'px)'\n              })\n            ;\n            $nextSide\n              .addClass(className.animating)\n              .css({\n                'top'       : box.origin + 'px',\n                'transform' : 'rotateX(90deg) translateZ(' + box.depth.next + 'px)'\n              })\n            ;\n          },\n\n          below: function() {\n            var\n              box = {\n                origin : (($activeSide.outerHeight(true) - $nextSide.outerHeight(true)) / 2),\n                depth  : {\n                  active : ($nextSide.outerHeight(true) / 2),\n                  next   : ($activeSide.outerHeight(true) / 2)\n                }\n              }\n            ;\n            module.verbose('Setting the initial animation position as below', $nextSide, box);\n            $sides\n              .css({\n                'transform' : 'translateZ(-' + box.depth.active + 'px)'\n              })\n            ;\n            $activeSide\n              .css({\n                'transform' : 'rotateY(0deg) translateZ(' + box.depth.active + 'px)'\n              })\n            ;\n            $nextSide\n              .addClass(className.animating)\n              .css({\n                'top'       : box.origin + 'px',\n                'transform' : 'rotateX(-90deg) translateZ(' + box.depth.next + 'px)'\n              })\n            ;\n          },\n\n          left: function() {\n            var\n              height = {\n                active : $activeSide.outerWidth(true),\n                next   : $nextSide.outerWidth(true)\n              },\n              box = {\n                origin : ( ( height.active - height.next ) / 2),\n                depth  : {\n                  active : (height.next / 2),\n                  next   : (height.active / 2)\n                }\n              }\n            ;\n            module.verbose('Setting the initial animation position as left', $nextSide, box);\n            $sides\n              .css({\n                'transform' : 'translateZ(-' + box.depth.active + 'px)'\n              })\n            ;\n            $activeSide\n              .css({\n                'transform' : 'rotateY(0deg) translateZ(' + box.depth.active + 'px)'\n              })\n            ;\n            $nextSide\n              .addClass(className.animating)\n              .css({\n                'left'      : box.origin + 'px',\n                'transform' : 'rotateY(-90deg) translateZ(' + box.depth.next + 'px)'\n              })\n            ;\n          },\n\n          right: function() {\n            var\n              height = {\n                active : $activeSide.outerWidth(true),\n                next   : $nextSide.outerWidth(true)\n              },\n              box = {\n                origin : ( ( height.active - height.next ) / 2),\n                depth  : {\n                  active : (height.next / 2),\n                  next   : (height.active / 2)\n                }\n              }\n            ;\n            module.verbose('Setting the initial animation position as left', $nextSide, box);\n            $sides\n              .css({\n                'transform' : 'translateZ(-' + box.depth.active + 'px)'\n              })\n            ;\n            $activeSide\n              .css({\n                'transform' : 'rotateY(0deg) translateZ(' + box.depth.active + 'px)'\n              })\n            ;\n            $nextSide\n              .addClass(className.animating)\n              .css({\n                'left'      : box.origin + 'px',\n                'transform' : 'rotateY(90deg) translateZ(' + box.depth.next + 'px)'\n              })\n            ;\n          },\n\n          behind: function() {\n            var\n              height = {\n                active : $activeSide.outerWidth(true),\n                next   : $nextSide.outerWidth(true)\n              },\n              box = {\n                origin : ( ( height.active - height.next ) / 2),\n                depth  : {\n                  active : (height.next / 2),\n                  next   : (height.active / 2)\n                }\n              }\n            ;\n            module.verbose('Setting the initial animation position as behind', $nextSide, box);\n            $activeSide\n              .css({\n                'transform' : 'rotateY(0deg)'\n              })\n            ;\n            $nextSide\n              .addClass(className.animating)\n              .css({\n                'left'      : box.origin + 'px',\n                'transform' : 'rotateY(-180deg)'\n              })\n            ;\n          }\n        },\n        setting: function(name, value) {\n          module.debug('Changing setting', name, value);\n          if( $.isPlainObject(name) ) {\n            $.extend(true, settings, name);\n          }\n          else if(value !== undefined) {\n            if($.isPlainObject(settings[name])) {\n              $.extend(true, settings[name], value);\n            }\n            else {\n              settings[name] = value;\n            }\n          }\n          else {\n            return settings[name];\n          }\n        },\n        internal: function(name, value) {\n          if( $.isPlainObject(name) ) {\n            $.extend(true, module, name);\n          }\n          else if(value !== undefined) {\n            module[name] = value;\n          }\n          else {\n            return module[name];\n          }\n        },\n        debug: function() {\n          if(!settings.silent && settings.debug) {\n            if(settings.performance) {\n              module.performance.log(arguments);\n            }\n            else {\n              module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');\n              module.debug.apply(console, arguments);\n            }\n          }\n        },\n        verbose: function() {\n          if(!settings.silent && settings.verbose && settings.debug) {\n            if(settings.performance) {\n              module.performance.log(arguments);\n            }\n            else {\n              module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');\n              module.verbose.apply(console, arguments);\n            }\n          }\n        },\n        error: function() {\n          if(!settings.silent) {\n            module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');\n            module.error.apply(console, arguments);\n          }\n        },\n        performance: {\n          log: function(message) {\n            var\n              currentTime,\n              executionTime,\n              previousTime\n            ;\n            if(settings.performance) {\n              currentTime   = new Date().getTime();\n              previousTime  = time || currentTime;\n              executionTime = currentTime - previousTime;\n              time          = currentTime;\n              performance.push({\n                'Name'           : message[0],\n                'Arguments'      : [].slice.call(message, 1) || '',\n                'Element'        : element,\n                'Execution Time' : executionTime\n              });\n            }\n            clearTimeout(module.performance.timer);\n            module.performance.timer = setTimeout(module.performance.display, 500);\n          },\n          display: function() {\n            var\n              title = settings.name + ':',\n              totalTime = 0\n            ;\n            time = false;\n            clearTimeout(module.performance.timer);\n            $.each(performance, function(index, data) {\n              totalTime += data['Execution Time'];\n            });\n            title += ' ' + totalTime + 'ms';\n            if(moduleSelector) {\n              title += ' \\'' + moduleSelector + '\\'';\n            }\n            if($allModules.length > 1) {\n              title += ' ' + '(' + $allModules.length + ')';\n            }\n            if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {\n              console.groupCollapsed(title);\n              if(console.table) {\n                console.table(performance);\n              }\n              else {\n                $.each(performance, function(index, data) {\n                  console.log(data['Name'] + ': ' + data['Execution Time']+'ms');\n                });\n              }\n              console.groupEnd();\n            }\n            performance = [];\n          }\n        },\n        invoke: function(query, passedArguments, context) {\n          var\n            object = instance,\n            maxDepth,\n            found,\n            response\n          ;\n          passedArguments = passedArguments || queryArguments;\n          context         = element         || context;\n          if(typeof query == 'string' && object !== undefined) {\n            query    = query.split(/[\\. ]/);\n            maxDepth = query.length - 1;\n            $.each(query, function(depth, value) {\n              var camelCaseValue = (depth != maxDepth)\n                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)\n                : query\n              ;\n              if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {\n                object = object[camelCaseValue];\n              }\n              else if( object[camelCaseValue] !== undefined ) {\n                found = object[camelCaseValue];\n                return false;\n              }\n              else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {\n                object = object[value];\n              }\n              else if( object[value] !== undefined ) {\n                found = object[value];\n                return false;\n              }\n              else {\n                return false;\n              }\n            });\n          }\n          if ( $.isFunction( found ) ) {\n            response = found.apply(context, passedArguments);\n          }\n          else if(found !== undefined) {\n            response = found;\n          }\n          if($.isArray(returnedValue)) {\n            returnedValue.push(response);\n          }\n          else if(returnedValue !== undefined) {\n            returnedValue = [returnedValue, response];\n          }\n          else if(response !== undefined) {\n            returnedValue = response;\n          }\n          return found;\n        }\n      };\n\n      if(methodInvoked) {\n        if(instance === undefined) {\n          module.initialize();\n        }\n        module.invoke(query);\n      }\n      else {\n        if(instance !== undefined) {\n          instance.invoke('destroy');\n        }\n        module.initialize();\n      }\n    })\n  ;\n\n  return (returnedValue !== undefined)\n    ? returnedValue\n    : this\n  ;\n};\n\n$.fn.shape.settings = {\n\n  // module info\n  name : 'Shape',\n\n  // hide all debug content\n  silent     : false,\n\n  // debug content outputted to console\n  debug      : false,\n\n  // verbose debug output\n  verbose    : false,\n\n  // fudge factor in pixels when swapping from 2d to 3d (can be useful to correct rounding errors)\n  jitter     : 0,\n\n  // performance data output\n  performance: true,\n\n  // event namespace\n  namespace  : 'shape',\n\n  // width during animation, can be set to 'auto', initial', 'next' or pixel amount\n  width: 'initial',\n\n  // height during animation, can be set to 'auto', 'initial', 'next' or pixel amount\n  height: 'initial',\n\n  // callback occurs on side change\n  beforeChange : function() {},\n  onChange     : function() {},\n\n  // allow animation to same side\n  allowRepeats: false,\n\n  // animation duration\n  duration   : false,\n\n  // possible errors\n  error: {\n    side   : 'You tried to switch to a side that does not exist.',\n    method : 'The method you called is not defined'\n  },\n\n  // classnames used\n  className   : {\n    animating : 'animating',\n    hidden    : 'hidden',\n    loading   : 'loading',\n    active    : 'active'\n  },\n\n  // selectors used\n  selector    : {\n    sides : '.sides',\n    side  : '.side'\n  }\n\n};\n\n\n})( jQuery, window, document );\n"
  },
  {
    "path": "semantic/src/definitions/modules/shape.less",
    "content": "/*!\n * # Semantic UI - Shape\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n\n\n/*******************************\n            Theme\n*******************************/\n\n@type    : 'module';\n@element : 'shape';\n\n@import (multiple) '../../theme.config';\n\n/*******************************\n              Shape\n*******************************/\n\n.ui.shape {\n  position: relative;\n  vertical-align: top;\n  display: @display;\n  perspective: @perspective;\n  transition: @transition;\n}\n\n.ui.shape .sides {\n  transform-style: preserve-3d;\n}\n\n.ui.shape .side {\n  opacity: 1;\n  width: 100%;\n\n  margin: @sideMargin !important;\n  backface-visibility: @backfaceVisibility;\n}\n\n.ui.shape .side {\n  display: none;\n}\n\n.ui.shape .side * {\n  backface-visibility: visible !important;\n}\n\n/*******************************\n             Types\n*******************************/\n\n.ui.cube.shape .side {\n  min-width: @cubeSize;\n  height: @cubeSize;\n\n  padding: @cubePadding;\n\n  background-color: @cubeBackground;\n  color: @cubeTextColor;\n  box-shadow: @cubeBoxShadow;\n}\n.ui.cube.shape .side > .content {\n  width: 100%;\n  height: 100%;\n  display: table;\n\n  text-align: @cubeTextAlign;\n  user-select: text;\n}\n.ui.cube.shape .side > .content > div {\n  display: table-cell;\n  vertical-align: middle;\n  font-size: @cubeFontSize;\n}\n\n/*******************************\n          Variations\n*******************************/\n\n.ui.text.shape.animating .sides {\n  position: static;\n}\n.ui.text.shape .side {\n  white-space: nowrap;\n}\n.ui.text.shape .side > * {\n  white-space: normal;\n}\n\n\n/*******************************\n             States\n*******************************/\n\n/*--------------\n    Loading\n---------------*/\n\n.ui.loading.shape {\n  position: absolute;\n  top: -9999px;\n  left: -9999px;\n}\n\n\n/*--------------\n    Animating\n---------------*/\n\n.ui.shape .animating.side {\n  position: absolute;\n  top: 0px;\n  left: 0px;\n  display: block;\n  z-index: @animatingZIndex;\n}\n.ui.shape .hidden.side {\n  opacity: @hiddenSideOpacity;\n}\n\n\n/*--------------\n      CSS\n---------------*/\n\n.ui.shape.animating .sides {\n  position: absolute;\n}\n.ui.shape.animating .sides {\n  transition: @transition;\n}\n.ui.shape.animating .side {\n  transition: @sideTransition;\n}\n\n/*--------------\n     Active\n---------------*/\n\n.ui.shape .active.side {\n  display: block;\n}\n\n.loadUIOverrides();\n"
  },
  {
    "path": "semantic/src/definitions/modules/sidebar.js",
    "content": "/*!\n * # Semantic UI - Sidebar\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n;(function ($, window, document, undefined) {\n\n'use strict';\n\nwindow = (typeof window != 'undefined' && window.Math == Math)\n  ? window\n  : (typeof self != 'undefined' && self.Math == Math)\n    ? self\n    : Function('return this')()\n;\n\n$.fn.sidebar = function(parameters) {\n  var\n    $allModules     = $(this),\n    $window         = $(window),\n    $document       = $(document),\n    $html           = $('html'),\n    $head           = $('head'),\n\n    moduleSelector  = $allModules.selector || '',\n\n    time            = new Date().getTime(),\n    performance     = [],\n\n    query           = arguments[0],\n    methodInvoked   = (typeof query == 'string'),\n    queryArguments  = [].slice.call(arguments, 1),\n\n    requestAnimationFrame = window.requestAnimationFrame\n      || window.mozRequestAnimationFrame\n      || window.webkitRequestAnimationFrame\n      || window.msRequestAnimationFrame\n      || function(callback) { setTimeout(callback, 0); },\n\n    returnedValue\n  ;\n\n  $allModules\n    .each(function() {\n      var\n        settings        = ( $.isPlainObject(parameters) )\n          ? $.extend(true, {}, $.fn.sidebar.settings, parameters)\n          : $.extend({}, $.fn.sidebar.settings),\n\n        selector        = settings.selector,\n        className       = settings.className,\n        namespace       = settings.namespace,\n        regExp          = settings.regExp,\n        error           = settings.error,\n\n        eventNamespace  = '.' + namespace,\n        moduleNamespace = 'module-' + namespace,\n\n        $module         = $(this),\n        $context        = $(settings.context),\n\n        $sidebars       = $module.children(selector.sidebar),\n        $fixed          = $context.children(selector.fixed),\n        $pusher         = $context.children(selector.pusher),\n        $style,\n\n        element         = this,\n        instance        = $module.data(moduleNamespace),\n\n        elementNamespace,\n        id,\n        currentScroll,\n        transitionEvent,\n\n        module\n      ;\n\n      module      = {\n\n        initialize: function() {\n          module.debug('Initializing sidebar', parameters);\n\n          module.create.id();\n\n          transitionEvent = module.get.transitionEvent();\n\n          // avoids locking rendering if initialized in onReady\n          if(settings.delaySetup) {\n            requestAnimationFrame(module.setup.layout);\n          }\n          else {\n            module.setup.layout();\n          }\n\n          requestAnimationFrame(function() {\n            module.setup.cache();\n          });\n\n          module.instantiate();\n        },\n\n        instantiate: function() {\n          module.verbose('Storing instance of module', module);\n          instance = module;\n          $module\n            .data(moduleNamespace, module)\n          ;\n        },\n\n        create: {\n          id: function() {\n            id = (Math.random().toString(16) + '000000000').substr(2,8);\n            elementNamespace = '.' + id;\n            module.verbose('Creating unique id for element', id);\n          }\n        },\n\n        destroy: function() {\n          module.verbose('Destroying previous module for', $module);\n          $module\n            .off(eventNamespace)\n            .removeData(moduleNamespace)\n          ;\n          if(module.is.ios()) {\n            module.remove.ios();\n          }\n          // bound by uuid\n          $context.off(elementNamespace);\n          $window.off(elementNamespace);\n          $document.off(elementNamespace);\n        },\n\n        event: {\n          clickaway: function(event) {\n            var\n              clickedInPusher = ($pusher.find(event.target).length > 0 || $pusher.is(event.target)),\n              clickedContext  = ($context.is(event.target))\n            ;\n            if(clickedInPusher) {\n              module.verbose('User clicked on dimmed page');\n              module.hide();\n            }\n            if(clickedContext) {\n              module.verbose('User clicked on dimmable context (scaled out page)');\n              module.hide();\n            }\n          },\n          touch: function(event) {\n            //event.stopPropagation();\n          },\n          containScroll: function(event) {\n            if(element.scrollTop <= 0)  {\n              element.scrollTop = 1;\n            }\n            if((element.scrollTop + element.offsetHeight) >= element.scrollHeight) {\n              element.scrollTop = element.scrollHeight - element.offsetHeight - 1;\n            }\n          },\n          scroll: function(event) {\n            if( $(event.target).closest(selector.sidebar).length === 0 ) {\n              event.preventDefault();\n            }\n          }\n        },\n\n        bind: {\n          clickaway: function() {\n            module.verbose('Adding clickaway events to context', $context);\n            if(settings.closable) {\n              $context\n                .on('click'    + elementNamespace, module.event.clickaway)\n                .on('touchend' + elementNamespace, module.event.clickaway)\n              ;\n            }\n          },\n          scrollLock: function() {\n            if(settings.scrollLock) {\n              module.debug('Disabling page scroll');\n              $window\n                .on('DOMMouseScroll' + elementNamespace, module.event.scroll)\n              ;\n            }\n            module.verbose('Adding events to contain sidebar scroll');\n            $document\n              .on('touchmove' + elementNamespace, module.event.touch)\n            ;\n            $module\n              .on('scroll' + eventNamespace, module.event.containScroll)\n            ;\n          }\n        },\n        unbind: {\n          clickaway: function() {\n            module.verbose('Removing clickaway events from context', $context);\n            $context.off(elementNamespace);\n          },\n          scrollLock: function() {\n            module.verbose('Removing scroll lock from page');\n            $document.off(elementNamespace);\n            $window.off(elementNamespace);\n            $module.off('scroll' + eventNamespace);\n          }\n        },\n\n        add: {\n          inlineCSS: function() {\n            var\n              width     = module.cache.width  || $module.outerWidth(),\n              height    = module.cache.height || $module.outerHeight(),\n              isRTL     = module.is.rtl(),\n              direction = module.get.direction(),\n              distance  = {\n                left   : width,\n                right  : -width,\n                top    : height,\n                bottom : -height\n              },\n              style\n            ;\n\n            if(isRTL){\n              module.verbose('RTL detected, flipping widths');\n              distance.left = -width;\n              distance.right = width;\n            }\n\n            style  = '<style>';\n\n            if(direction === 'left' || direction === 'right') {\n              module.debug('Adding CSS rules for animation distance', width);\n              style  += ''\n                + ' .ui.visible.' + direction + '.sidebar ~ .fixed,'\n                + ' .ui.visible.' + direction + '.sidebar ~ .pusher {'\n                + '   -webkit-transform: translate3d('+ distance[direction] + 'px, 0, 0);'\n                + '           transform: translate3d('+ distance[direction] + 'px, 0, 0);'\n                + ' }'\n              ;\n            }\n            else if(direction === 'top' || direction == 'bottom') {\n              style  += ''\n                + ' .ui.visible.' + direction + '.sidebar ~ .fixed,'\n                + ' .ui.visible.' + direction + '.sidebar ~ .pusher {'\n                + '   -webkit-transform: translate3d(0, ' + distance[direction] + 'px, 0);'\n                + '           transform: translate3d(0, ' + distance[direction] + 'px, 0);'\n                + ' }'\n              ;\n            }\n\n            /* IE is only browser not to create context with transforms */\n            /* https://www.w3.org/Bugs/Public/show_bug.cgi?id=16328 */\n            if( module.is.ie() ) {\n              if(direction === 'left' || direction === 'right') {\n                module.debug('Adding CSS rules for animation distance', width);\n                style  += ''\n                  + ' body.pushable > .ui.visible.' + direction + '.sidebar ~ .pusher:after {'\n                  + '   -webkit-transform: translate3d('+ distance[direction] + 'px, 0, 0);'\n                  + '           transform: translate3d('+ distance[direction] + 'px, 0, 0);'\n                  + ' }'\n                ;\n              }\n              else if(direction === 'top' || direction == 'bottom') {\n                style  += ''\n                  + ' body.pushable > .ui.visible.' + direction + '.sidebar ~ .pusher:after {'\n                  + '   -webkit-transform: translate3d(0, ' + distance[direction] + 'px, 0);'\n                  + '           transform: translate3d(0, ' + distance[direction] + 'px, 0);'\n                  + ' }'\n                ;\n              }\n              /* opposite sides visible forces content overlay */\n              style += ''\n                + ' body.pushable > .ui.visible.left.sidebar ~ .ui.visible.right.sidebar ~ .pusher:after,'\n                + ' body.pushable > .ui.visible.right.sidebar ~ .ui.visible.left.sidebar ~ .pusher:after {'\n                + '   -webkit-transform: translate3d(0px, 0, 0);'\n                + '           transform: translate3d(0px, 0, 0);'\n                + ' }'\n              ;\n            }\n            style += '</style>';\n            $style = $(style)\n              .appendTo($head)\n            ;\n            module.debug('Adding sizing css to head', $style);\n          }\n        },\n\n        refresh: function() {\n          module.verbose('Refreshing selector cache');\n          $context  = $(settings.context);\n          $sidebars = $context.children(selector.sidebar);\n          $pusher   = $context.children(selector.pusher);\n          $fixed    = $context.children(selector.fixed);\n          module.clear.cache();\n        },\n\n        refreshSidebars: function() {\n          module.verbose('Refreshing other sidebars');\n          $sidebars = $context.children(selector.sidebar);\n        },\n\n        repaint: function() {\n          module.verbose('Forcing repaint event');\n          element.style.display = 'none';\n          var ignored = element.offsetHeight;\n          element.scrollTop = element.scrollTop;\n          element.style.display = '';\n        },\n\n        setup: {\n          cache: function() {\n            module.cache = {\n              width  : $module.outerWidth(),\n              height : $module.outerHeight(),\n              rtl    : ($module.css('direction') == 'rtl')\n            };\n          },\n          layout: function() {\n            if( $context.children(selector.pusher).length === 0 ) {\n              module.debug('Adding wrapper element for sidebar');\n              module.error(error.pusher);\n              $pusher = $('<div class=\"pusher\" />');\n              $context\n                .children()\n                  .not(selector.omitted)\n                  .not($sidebars)\n                  .wrapAll($pusher)\n              ;\n              module.refresh();\n            }\n            if($module.nextAll(selector.pusher).length === 0 || $module.nextAll(selector.pusher)[0] !== $pusher[0]) {\n              module.debug('Moved sidebar to correct parent element');\n              module.error(error.movedSidebar, element);\n              $module.detach().prependTo($context);\n              module.refresh();\n            }\n            module.clear.cache();\n            module.set.pushable();\n            module.set.direction();\n          }\n        },\n\n        attachEvents: function(selector, event) {\n          var\n            $toggle = $(selector)\n          ;\n          event = $.isFunction(module[event])\n            ? module[event]\n            : module.toggle\n          ;\n          if($toggle.length > 0) {\n            module.debug('Attaching sidebar events to element', selector, event);\n            $toggle\n              .on('click' + eventNamespace, event)\n            ;\n          }\n          else {\n            module.error(error.notFound, selector);\n          }\n        },\n\n        show: function(callback) {\n          callback = $.isFunction(callback)\n            ? callback\n            : function(){}\n          ;\n          if(module.is.hidden()) {\n            module.refreshSidebars();\n            if(settings.overlay)  {\n              module.error(error.overlay);\n              settings.transition = 'overlay';\n            }\n            module.refresh();\n            if(module.othersActive()) {\n              module.debug('Other sidebars currently visible');\n              if(settings.exclusive) {\n                // if not overlay queue animation after hide\n                if(settings.transition != 'overlay') {\n                  module.hideOthers(module.show);\n                  return;\n                }\n                else {\n                  module.hideOthers();\n                }\n              }\n              else {\n                settings.transition = 'overlay';\n              }\n            }\n            module.pushPage(function() {\n              callback.call(element);\n              settings.onShow.call(element);\n            });\n            settings.onChange.call(element);\n            settings.onVisible.call(element);\n          }\n          else {\n            module.debug('Sidebar is already visible');\n          }\n        },\n\n        hide: function(callback) {\n          callback = $.isFunction(callback)\n            ? callback\n            : function(){}\n          ;\n          if(module.is.visible() || module.is.animating()) {\n            module.debug('Hiding sidebar', callback);\n            module.refreshSidebars();\n            module.pullPage(function() {\n              callback.call(element);\n              settings.onHidden.call(element);\n            });\n            settings.onChange.call(element);\n            settings.onHide.call(element);\n          }\n        },\n\n        othersAnimating: function() {\n          return ($sidebars.not($module).filter('.' + className.animating).length > 0);\n        },\n        othersVisible: function() {\n          return ($sidebars.not($module).filter('.' + className.visible).length > 0);\n        },\n        othersActive: function() {\n          return(module.othersVisible() || module.othersAnimating());\n        },\n\n        hideOthers: function(callback) {\n          var\n            $otherSidebars = $sidebars.not($module).filter('.' + className.visible),\n            sidebarCount   = $otherSidebars.length,\n            callbackCount  = 0\n          ;\n          callback = callback || function(){};\n          $otherSidebars\n            .sidebar('hide', function() {\n              callbackCount++;\n              if(callbackCount == sidebarCount) {\n                callback();\n              }\n            })\n          ;\n        },\n\n        toggle: function() {\n          module.verbose('Determining toggled direction');\n          if(module.is.hidden()) {\n            module.show();\n          }\n          else {\n            module.hide();\n          }\n        },\n\n        pushPage: function(callback) {\n          var\n            transition = module.get.transition(),\n            $transition = (transition === 'overlay' || module.othersActive())\n              ? $module\n              : $pusher,\n            animate,\n            dim,\n            transitionEnd\n          ;\n          callback = $.isFunction(callback)\n            ? callback\n            : function(){}\n          ;\n          if(settings.transition == 'scale down') {\n            module.scrollToTop();\n          }\n          module.set.transition(transition);\n          module.repaint();\n          animate = function() {\n            module.bind.clickaway();\n            module.add.inlineCSS();\n            module.set.animating();\n            module.set.visible();\n          };\n          dim = function() {\n            module.set.dimmed();\n          };\n          transitionEnd = function(event) {\n            if( event.target == $transition[0] ) {\n              $transition.off(transitionEvent + elementNamespace, transitionEnd);\n              module.remove.animating();\n              module.bind.scrollLock();\n              callback.call(element);\n            }\n          };\n          $transition.off(transitionEvent + elementNamespace);\n          $transition.on(transitionEvent + elementNamespace, transitionEnd);\n          requestAnimationFrame(animate);\n          if(settings.dimPage && !module.othersVisible()) {\n            requestAnimationFrame(dim);\n          }\n        },\n\n        pullPage: function(callback) {\n          var\n            transition = module.get.transition(),\n            $transition = (transition == 'overlay' || module.othersActive())\n              ? $module\n              : $pusher,\n            animate,\n            transitionEnd\n          ;\n          callback = $.isFunction(callback)\n            ? callback\n            : function(){}\n          ;\n          module.verbose('Removing context push state', module.get.direction());\n\n          module.unbind.clickaway();\n          module.unbind.scrollLock();\n\n          animate = function() {\n            module.set.transition(transition);\n            module.set.animating();\n            module.remove.visible();\n            if(settings.dimPage && !module.othersVisible()) {\n              $pusher.removeClass(className.dimmed);\n            }\n          };\n          transitionEnd = function(event) {\n            if( event.target == $transition[0] ) {\n              $transition.off(transitionEvent + elementNamespace, transitionEnd);\n              module.remove.animating();\n              module.remove.transition();\n              module.remove.inlineCSS();\n              if(transition == 'scale down' || (settings.returnScroll && module.is.mobile()) ) {\n                module.scrollBack();\n              }\n              callback.call(element);\n            }\n          };\n          $transition.off(transitionEvent + elementNamespace);\n          $transition.on(transitionEvent + elementNamespace, transitionEnd);\n          requestAnimationFrame(animate);\n        },\n\n        scrollToTop: function() {\n          module.verbose('Scrolling to top of page to avoid animation issues');\n          currentScroll = $(window).scrollTop();\n          $module.scrollTop(0);\n          window.scrollTo(0, 0);\n        },\n\n        scrollBack: function() {\n          module.verbose('Scrolling back to original page position');\n          window.scrollTo(0, currentScroll);\n        },\n\n        clear: {\n          cache: function() {\n            module.verbose('Clearing cached dimensions');\n            module.cache = {};\n          }\n        },\n\n        set: {\n\n          // ios only (scroll on html not document). This prevent auto-resize canvas/scroll in ios\n          // (This is no longer necessary in latest iOS)\n          ios: function() {\n            $html.addClass(className.ios);\n          },\n\n          // container\n          pushed: function() {\n            $context.addClass(className.pushed);\n          },\n          pushable: function() {\n            $context.addClass(className.pushable);\n          },\n\n          // pusher\n          dimmed: function() {\n            $pusher.addClass(className.dimmed);\n          },\n\n          // sidebar\n          active: function() {\n            $module.addClass(className.active);\n          },\n          animating: function() {\n            $module.addClass(className.animating);\n          },\n          transition: function(transition) {\n            transition = transition || module.get.transition();\n            $module.addClass(transition);\n          },\n          direction: function(direction) {\n            direction = direction || module.get.direction();\n            $module.addClass(className[direction]);\n          },\n          visible: function() {\n            $module.addClass(className.visible);\n          },\n          overlay: function() {\n            $module.addClass(className.overlay);\n          }\n        },\n        remove: {\n\n          inlineCSS: function() {\n            module.debug('Removing inline css styles', $style);\n            if($style && $style.length > 0) {\n              $style.remove();\n            }\n          },\n\n          // ios scroll on html not document\n          ios: function() {\n            $html.removeClass(className.ios);\n          },\n\n          // context\n          pushed: function() {\n            $context.removeClass(className.pushed);\n          },\n          pushable: function() {\n            $context.removeClass(className.pushable);\n          },\n\n          // sidebar\n          active: function() {\n            $module.removeClass(className.active);\n          },\n          animating: function() {\n            $module.removeClass(className.animating);\n          },\n          transition: function(transition) {\n            transition = transition || module.get.transition();\n            $module.removeClass(transition);\n          },\n          direction: function(direction) {\n            direction = direction || module.get.direction();\n            $module.removeClass(className[direction]);\n          },\n          visible: function() {\n            $module.removeClass(className.visible);\n          },\n          overlay: function() {\n            $module.removeClass(className.overlay);\n          }\n        },\n\n        get: {\n          direction: function() {\n            if($module.hasClass(className.top)) {\n              return className.top;\n            }\n            else if($module.hasClass(className.right)) {\n              return className.right;\n            }\n            else if($module.hasClass(className.bottom)) {\n              return className.bottom;\n            }\n            return className.left;\n          },\n          transition: function() {\n            var\n              direction = module.get.direction(),\n              transition\n            ;\n            transition = ( module.is.mobile() )\n              ? (settings.mobileTransition == 'auto')\n                ? settings.defaultTransition.mobile[direction]\n                : settings.mobileTransition\n              : (settings.transition == 'auto')\n                ? settings.defaultTransition.computer[direction]\n                : settings.transition\n            ;\n            module.verbose('Determined transition', transition);\n            return transition;\n          },\n          transitionEvent: function() {\n            var\n              element     = document.createElement('element'),\n              transitions = {\n                'transition'       :'transitionend',\n                'OTransition'      :'oTransitionEnd',\n                'MozTransition'    :'transitionend',\n                'WebkitTransition' :'webkitTransitionEnd'\n              },\n              transition\n            ;\n            for(transition in transitions){\n              if( element.style[transition] !== undefined ){\n                return transitions[transition];\n              }\n            }\n          }\n        },\n\n        is: {\n\n          ie: function() {\n            var\n              isIE11 = (!(window.ActiveXObject) && 'ActiveXObject' in window),\n              isIE   = ('ActiveXObject' in window)\n            ;\n            return (isIE11 || isIE);\n          },\n\n          ios: function() {\n            var\n              userAgent      = navigator.userAgent,\n              isIOS          = userAgent.match(regExp.ios),\n              isMobileChrome = userAgent.match(regExp.mobileChrome)\n            ;\n            if(isIOS && !isMobileChrome) {\n              module.verbose('Browser was found to be iOS', userAgent);\n              return true;\n            }\n            else {\n              return false;\n            }\n          },\n          mobile: function() {\n            var\n              userAgent    = navigator.userAgent,\n              isMobile     = userAgent.match(regExp.mobile)\n            ;\n            if(isMobile) {\n              module.verbose('Browser was found to be mobile', userAgent);\n              return true;\n            }\n            else {\n              module.verbose('Browser is not mobile, using regular transition', userAgent);\n              return false;\n            }\n          },\n          hidden: function() {\n            return !module.is.visible();\n          },\n          visible: function() {\n            return $module.hasClass(className.visible);\n          },\n          // alias\n          open: function() {\n            return module.is.visible();\n          },\n          closed: function() {\n            return module.is.hidden();\n          },\n          vertical: function() {\n            return $module.hasClass(className.top);\n          },\n          animating: function() {\n            return $context.hasClass(className.animating);\n          },\n          rtl: function () {\n            if(module.cache.rtl === undefined) {\n              module.cache.rtl = ($module.css('direction') == 'rtl');\n            }\n            return module.cache.rtl;\n          }\n        },\n\n        setting: function(name, value) {\n          module.debug('Changing setting', name, value);\n          if( $.isPlainObject(name) ) {\n            $.extend(true, settings, name);\n          }\n          else if(value !== undefined) {\n            if($.isPlainObject(settings[name])) {\n              $.extend(true, settings[name], value);\n            }\n            else {\n              settings[name] = value;\n            }\n          }\n          else {\n            return settings[name];\n          }\n        },\n        internal: function(name, value) {\n          if( $.isPlainObject(name) ) {\n            $.extend(true, module, name);\n          }\n          else if(value !== undefined) {\n            module[name] = value;\n          }\n          else {\n            return module[name];\n          }\n        },\n        debug: function() {\n          if(!settings.silent && settings.debug) {\n            if(settings.performance) {\n              module.performance.log(arguments);\n            }\n            else {\n              module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');\n              module.debug.apply(console, arguments);\n            }\n          }\n        },\n        verbose: function() {\n          if(!settings.silent && settings.verbose && settings.debug) {\n            if(settings.performance) {\n              module.performance.log(arguments);\n            }\n            else {\n              module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');\n              module.verbose.apply(console, arguments);\n            }\n          }\n        },\n        error: function() {\n          if(!settings.silent) {\n            module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');\n            module.error.apply(console, arguments);\n          }\n        },\n        performance: {\n          log: function(message) {\n            var\n              currentTime,\n              executionTime,\n              previousTime\n            ;\n            if(settings.performance) {\n              currentTime   = new Date().getTime();\n              previousTime  = time || currentTime;\n              executionTime = currentTime - previousTime;\n              time          = currentTime;\n              performance.push({\n                'Name'           : message[0],\n                'Arguments'      : [].slice.call(message, 1) || '',\n                'Element'        : element,\n                'Execution Time' : executionTime\n              });\n            }\n            clearTimeout(module.performance.timer);\n            module.performance.timer = setTimeout(module.performance.display, 500);\n          },\n          display: function() {\n            var\n              title = settings.name + ':',\n              totalTime = 0\n            ;\n            time = false;\n            clearTimeout(module.performance.timer);\n            $.each(performance, function(index, data) {\n              totalTime += data['Execution Time'];\n            });\n            title += ' ' + totalTime + 'ms';\n            if(moduleSelector) {\n              title += ' \\'' + moduleSelector + '\\'';\n            }\n            if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {\n              console.groupCollapsed(title);\n              if(console.table) {\n                console.table(performance);\n              }\n              else {\n                $.each(performance, function(index, data) {\n                  console.log(data['Name'] + ': ' + data['Execution Time']+'ms');\n                });\n              }\n              console.groupEnd();\n            }\n            performance = [];\n          }\n        },\n        invoke: function(query, passedArguments, context) {\n          var\n            object = instance,\n            maxDepth,\n            found,\n            response\n          ;\n          passedArguments = passedArguments || queryArguments;\n          context         = element         || context;\n          if(typeof query == 'string' && object !== undefined) {\n            query    = query.split(/[\\. ]/);\n            maxDepth = query.length - 1;\n            $.each(query, function(depth, value) {\n              var camelCaseValue = (depth != maxDepth)\n                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)\n                : query\n              ;\n              if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {\n                object = object[camelCaseValue];\n              }\n              else if( object[camelCaseValue] !== undefined ) {\n                found = object[camelCaseValue];\n                return false;\n              }\n              else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {\n                object = object[value];\n              }\n              else if( object[value] !== undefined ) {\n                found = object[value];\n                return false;\n              }\n              else {\n                module.error(error.method, query);\n                return false;\n              }\n            });\n          }\n          if ( $.isFunction( found ) ) {\n            response = found.apply(context, passedArguments);\n          }\n          else if(found !== undefined) {\n            response = found;\n          }\n          if($.isArray(returnedValue)) {\n            returnedValue.push(response);\n          }\n          else if(returnedValue !== undefined) {\n            returnedValue = [returnedValue, response];\n          }\n          else if(response !== undefined) {\n            returnedValue = response;\n          }\n          return found;\n        }\n      }\n    ;\n\n    if(methodInvoked) {\n      if(instance === undefined) {\n        module.initialize();\n      }\n      module.invoke(query);\n    }\n    else {\n      if(instance !== undefined) {\n        module.invoke('destroy');\n      }\n      module.initialize();\n    }\n  });\n\n  return (returnedValue !== undefined)\n    ? returnedValue\n    : this\n  ;\n};\n\n$.fn.sidebar.settings = {\n\n  name              : 'Sidebar',\n  namespace         : 'sidebar',\n\n  silent            : false,\n  debug             : false,\n  verbose           : false,\n  performance       : true,\n\n  transition        : 'auto',\n  mobileTransition  : 'auto',\n\n  defaultTransition : {\n    computer: {\n      left   : 'uncover',\n      right  : 'uncover',\n      top    : 'overlay',\n      bottom : 'overlay'\n    },\n    mobile: {\n      left   : 'uncover',\n      right  : 'uncover',\n      top    : 'overlay',\n      bottom : 'overlay'\n    }\n  },\n\n  context           : 'body',\n  exclusive         : false,\n  closable          : true,\n  dimPage           : true,\n  scrollLock        : false,\n  returnScroll      : false,\n  delaySetup        : false,\n\n  duration          : 500,\n\n  onChange          : function(){},\n  onShow            : function(){},\n  onHide            : function(){},\n\n  onHidden          : function(){},\n  onVisible         : function(){},\n\n  className         : {\n    active    : 'active',\n    animating : 'animating',\n    dimmed    : 'dimmed',\n    ios       : 'ios',\n    pushable  : 'pushable',\n    pushed    : 'pushed',\n    right     : 'right',\n    top       : 'top',\n    left      : 'left',\n    bottom    : 'bottom',\n    visible   : 'visible'\n  },\n\n  selector: {\n    fixed   : '.fixed',\n    omitted : 'script, link, style, .ui.modal, .ui.dimmer, .ui.nag, .ui.fixed',\n    pusher  : '.pusher',\n    sidebar : '.ui.sidebar'\n  },\n\n  regExp: {\n    ios          : /(iPad|iPhone|iPod)/g,\n    mobileChrome : /(CriOS)/g,\n    mobile       : /Mobile|iP(hone|od|ad)|Android|BlackBerry|IEMobile|Kindle|NetFront|Silk-Accelerated|(hpw|web)OS|Fennec|Minimo|Opera M(obi|ini)|Blazer|Dolfin|Dolphin|Skyfire|Zune/g\n  },\n\n  error   : {\n    method       : 'The method you called is not defined.',\n    pusher       : 'Had to add pusher element. For optimal performance make sure body content is inside a pusher element',\n    movedSidebar : 'Had to move sidebar. For optimal performance make sure sidebar and pusher are direct children of your body tag',\n    overlay      : 'The overlay setting is no longer supported, use animation: overlay',\n    notFound     : 'There were no elements that matched the specified selector'\n  }\n\n};\n\n\n})( jQuery, window, document );\n"
  },
  {
    "path": "semantic/src/definitions/modules/sidebar.less",
    "content": "/*!\n * # Semantic UI - Sidebar\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n\n\n/*******************************\n            Theme\n*******************************/\n\n@type    : 'module';\n@element : 'sidebar';\n\n@import (multiple) '../../theme.config';\n\n/*******************************\n            Sidebar\n*******************************/\n\n/* Sidebar Menu */\n.ui.sidebar {\n  position: fixed;\n  top: 0;\n  left: 0;\n\n  backface-visibility: hidden;\n  transition: none;\n  will-change: transform;\n  transform: translate3d(0, 0, 0);\n  visibility: hidden;\n  -webkit-overflow-scrolling: touch;\n\n  height: 100% !important;\n  max-height: 100%;\n  border-radius: 0em !important;\n  margin: 0em !important;\n  overflow-y: auto !important;\n  z-index: @topLayer;\n}\n\n/* GPU Layers for Child Elements */\n.ui.sidebar > * {\n  backface-visibility: hidden;\n}\n\n\n/*--------------\n   Direction\n---------------*/\n\n.ui.left.sidebar {\n  right: auto;\n  left: 0px;\n  transform: translate3d(-100%, 0, 0);\n}\n.ui.right.sidebar {\n  right: 0px !important;\n  left: auto !important;\n  transform: translate3d(100%, 0%, 0);\n}\n\n.ui.top.sidebar,\n.ui.bottom.sidebar {\n  width: 100% !important;\n  height: auto !important;\n}\n.ui.top.sidebar {\n  top: 0px !important;\n  bottom: auto !important;\n  transform: translate3d(0, -100%, 0);\n}\n.ui.bottom.sidebar {\n  top: auto !important;\n  bottom: 0px !important;\n  transform: translate3d(0, 100%, 0);\n}\n\n\n/*--------------\n     Pushable\n---------------*/\n\n.pushable {\n  height: 100%;\n  overflow-x: hidden;\n  padding: 0em !important;\n}\n\n/* Whole Page */\nbody.pushable {\n  background: @canvasBackground !important;\n}\n\n/* Page Context */\n.pushable:not(body) {\n  transform: translate3d(0, 0, 0);\n}\n.pushable:not(body) > .ui.sidebar,\n.pushable:not(body) > .fixed,\n.pushable:not(body) > .pusher:after {\n  position: absolute;\n}\n\n\n/*--------------\n     Fixed\n---------------*/\n\n.pushable > .fixed {\n  position: fixed;\n  backface-visibility: hidden;\n\n  transition: transform @duration @easing;\n  will-change: transform;\n  z-index: @fixedLayer;\n}\n\n/*--------------\n     Page\n---------------*/\n\n.pushable > .pusher {\n  position: relative;\n  backface-visibility: hidden;\n  overflow: hidden;\n  min-height: 100%;\n  transition: transform @duration @easing;\n  z-index: @middleLayer;\n}\n\nbody.pushable > .pusher {\n  background: @pageBackground;\n}\n\n/* Pusher should inherit background from context */\n.pushable > .pusher {\n  background: inherit;\n}\n\n/*--------------\n     Dimmer\n---------------*/\n\n.pushable > .pusher:after {\n  position: fixed;\n  top: 0px;\n  right: 0px;\n  content: '';\n  background-color: @dimmerColor;\n  overflow: hidden;\n  opacity: 0;\n  transition: @dimmerTransition;\n  will-change: opacity;\n  z-index: @dimmerLayer;\n}\n\n/*--------------\n    Coupling\n---------------*/\n\n.ui.sidebar.menu .item {\n  border-radius: 0em !important;\n}\n\n/*******************************\n            States\n*******************************/\n\n/*--------------\n     Dimmed\n---------------*/\n\n.pushable > .pusher.dimmed:after {\n  width: 100% !important;\n  height: 100% !important;\n  opacity: 1 !important;\n}\n\n/*--------------\n    Animating\n---------------*/\n\n.ui.animating.sidebar {\n  visibility: visible;\n}\n\n/*--------------\n     Visible\n---------------*/\n\n.ui.visible.sidebar {\n  visibility: visible;\n  transform: translate3d(0, 0, 0);\n}\n\n/* Shadow Direction */\n.ui.left.visible.sidebar,\n.ui.right.visible.sidebar {\n  box-shadow: @horizontalBoxShadow;\n}\n.ui.top.visible.sidebar,\n.ui.bottom.visible.sidebar {\n  box-shadow: @verticalBoxShadow;\n}\n\n/* Visible On Load */\n.ui.visible.left.sidebar ~ .fixed,\n.ui.visible.left.sidebar ~ .pusher {\n  transform: translate3d(@width, 0, 0);\n}\n.ui.visible.right.sidebar ~ .fixed,\n.ui.visible.right.sidebar ~ .pusher {\n  transform: translate3d(-@width, 0, 0);\n}\n.ui.visible.top.sidebar ~ .fixed,\n.ui.visible.top.sidebar ~ .pusher {\n  transform: translate3d(0, @height, 0);\n}\n.ui.visible.bottom.sidebar ~ .fixed,\n.ui.visible.bottom.sidebar ~ .pusher {\n  transform: translate3d(0, -@height, 0);\n}\n\n/* opposite sides visible forces content overlay */\n.ui.visible.left.sidebar ~ .ui.visible.right.sidebar ~ .fixed,\n.ui.visible.left.sidebar ~ .ui.visible.right.sidebar ~ .pusher,\n.ui.visible.right.sidebar ~ .ui.visible.left.sidebar ~ .fixed,\n.ui.visible.right.sidebar ~ .ui.visible.left.sidebar ~ .pusher {\n  transform: translate3d(0, 0, 0);\n}\n\n/*--------------\n       iOS\n---------------*/\n\n\n/*******************************\n          Variations\n*******************************/\n\n/*--------------\n     Width\n---------------*/\n\n/* Left / Right */\n.ui.thin.left.sidebar,\n.ui.thin.right.sidebar {\n  width: @thinWidth;\n}\n.ui[class*=\"very thin\"].left.sidebar,\n.ui[class*=\"very thin\"].right.sidebar {\n  width: @veryThinWidth;\n}\n.ui.left.sidebar,\n.ui.right.sidebar {\n  width: @width;\n}\n.ui.wide.left.sidebar,\n.ui.wide.right.sidebar {\n  width: @wideWidth;\n}\n.ui[class*=\"very wide\"].left.sidebar,\n.ui[class*=\"very wide\"].right.sidebar {\n  width: @veryWideWidth;\n}\n\n/* Left Visible */\n.ui.visible.thin.left.sidebar ~ .fixed,\n.ui.visible.thin.left.sidebar ~ .pusher {\n  transform: translate3d(@thinWidth, 0, 0);\n}\n.ui.visible[class*=\"very thin\"].left.sidebar ~ .fixed,\n.ui.visible[class*=\"very thin\"].left.sidebar ~ .pusher {\n  transform: translate3d(@veryThinWidth, 0, 0);\n}\n.ui.visible.wide.left.sidebar ~ .fixed,\n.ui.visible.wide.left.sidebar ~ .pusher {\n  transform: translate3d(@wideWidth, 0, 0);\n}\n.ui.visible[class*=\"very wide\"].left.sidebar ~ .fixed,\n.ui.visible[class*=\"very wide\"].left.sidebar ~ .pusher {\n  transform: translate3d(@veryWideWidth, 0, 0);\n}\n\n/* Right Visible */\n.ui.visible.thin.right.sidebar ~ .fixed,\n.ui.visible.thin.right.sidebar ~ .pusher {\n  transform: translate3d(-@thinWidth, 0, 0);\n}\n.ui.visible[class*=\"very thin\"].right.sidebar ~ .fixed,\n.ui.visible[class*=\"very thin\"].right.sidebar ~ .pusher {\n  transform: translate3d(-@veryThinWidth, 0, 0);\n}\n.ui.visible.wide.right.sidebar ~ .fixed,\n.ui.visible.wide.right.sidebar ~ .pusher {\n  transform: translate3d(-@wideWidth, 0, 0);\n}\n.ui.visible[class*=\"very wide\"].right.sidebar ~ .fixed,\n.ui.visible[class*=\"very wide\"].right.sidebar ~ .pusher {\n  transform: translate3d(-@veryWideWidth, 0, 0);\n}\n\n\n\n/*******************************\n          Animations\n*******************************/\n\n/*--------------\n    Overlay\n---------------*/\n\n/* Set-up */\n.ui.overlay.sidebar {\n  z-index: @topLayer;\n}\n\n/* Initial */\n.ui.left.overlay.sidebar {\n  transform: translate3d(-100%, 0%, 0);\n}\n.ui.right.overlay.sidebar {\n  transform: translate3d(100%, 0%, 0);\n}\n.ui.top.overlay.sidebar {\n  transform: translate3d(0%, -100%, 0);\n}\n.ui.bottom.overlay.sidebar {\n  transform: translate3d(0%, 100%, 0);\n}\n\n/* Animation */\n.animating.ui.overlay.sidebar,\n.ui.visible.overlay.sidebar {\n  transition: transform @duration @easing;\n}\n\n/* End - Sidebar */\n.ui.visible.left.overlay.sidebar {\n  transform: translate3d(0%, 0%, 0);\n}\n.ui.visible.right.overlay.sidebar {\n  transform: translate3d(0%, 0%, 0);\n}\n.ui.visible.top.overlay.sidebar {\n  transform: translate3d(0%, 0%, 0);\n}\n.ui.visible.bottom.overlay.sidebar {\n  transform: translate3d(0%, 0%, 0);\n}\n\n/* End - Pusher */\n.ui.visible.overlay.sidebar ~ .fixed,\n.ui.visible.overlay.sidebar ~ .pusher {\n  transform: none !important;\n}\n\n\n\n/*--------------\n      Push\n---------------*/\n\n/* Initial */\n.ui.push.sidebar {\n  transition: transform @duration @easing;\n  z-index: @topLayer;\n}\n\n/* Sidebar - Initial */\n.ui.left.push.sidebar {\n  transform: translate3d(-100%, 0, 0);\n}\n.ui.right.push.sidebar {\n  transform: translate3d(100%, 0, 0);\n}\n.ui.top.push.sidebar {\n  transform: translate3d(0%, -100%, 0);\n}\n.ui.bottom.push.sidebar {\n  transform: translate3d(0%, 100%, 0);\n}\n\n/* End */\n.ui.visible.push.sidebar {\n  transform: translate3d(0%, 0, 0);\n}\n\n\n/*--------------\n    Uncover\n---------------*/\n\n/* Initial */\n.ui.uncover.sidebar {\n  transform: translate3d(0, 0, 0);\n  z-index: @bottomLayer;\n}\n\n/* End */\n.ui.visible.uncover.sidebar {\n  transform: translate3d(0, 0, 0);\n  transition: transform @duration @easing;\n}\n\n\n/*--------------\n   Slide Along\n---------------*/\n\n/* Initial */\n.ui.slide.along.sidebar {\n  z-index: @bottomLayer;\n}\n\n/* Sidebar - Initial */\n.ui.left.slide.along.sidebar {\n  transform: translate3d(-50%, 0, 0);\n}\n.ui.right.slide.along.sidebar {\n  transform: translate3d(50%, 0, 0);\n}\n.ui.top.slide.along.sidebar {\n  transform: translate3d(0, -50%, 0);\n}\n.ui.bottom.slide.along.sidebar {\n  transform: translate3d(0%, 50%, 0);\n}\n\n/* Animation */\n.ui.animating.slide.along.sidebar {\n  transition: transform @duration @easing;\n}\n\n/* End */\n.ui.visible.slide.along.sidebar {\n  transform: translate3d(0%, 0, 0);\n}\n\n\n/*--------------\n   Slide Out\n---------------*/\n\n/* Initial */\n.ui.slide.out.sidebar {\n  z-index: @bottomLayer;\n}\n\n/* Sidebar - Initial */\n.ui.left.slide.out.sidebar {\n  transform: translate3d(50%, 0, 0);\n}\n.ui.right.slide.out.sidebar {\n  transform: translate3d(-50%, 0, 0);\n}\n.ui.top.slide.out.sidebar {\n  transform: translate3d(0%, 50%, 0);\n}\n.ui.bottom.slide.out.sidebar {\n  transform: translate3d(0%, -50%, 0);\n}\n\n/* Animation */\n.ui.animating.slide.out.sidebar {\n  transition: transform @duration @easing;\n}\n\n/* End */\n.ui.visible.slide.out.sidebar {\n  transform: translate3d(0%, 0, 0);\n}\n\n/*--------------\n   Scale Down\n---------------*/\n\n/* Initial */\n.ui.scale.down.sidebar {\n  transition: transform @duration @easing;\n  z-index: @topLayer;\n}\n\n/* Sidebar - Initial  */\n.ui.left.scale.down.sidebar {\n  transform: translate3d(-100%, 0, 0);\n}\n.ui.right.scale.down.sidebar {\n  transform: translate3d(100%, 0, 0);\n}\n.ui.top.scale.down.sidebar {\n  transform: translate3d(0%, -100%, 0);\n}\n.ui.bottom.scale.down.sidebar {\n  transform: translate3d(0%, 100%, 0);\n}\n\n/* Pusher - Initial */\n.ui.scale.down.left.sidebar ~ .pusher {\n  transform-origin: 75% 50%;\n}\n.ui.scale.down.right.sidebar ~ .pusher {\n  transform-origin: 25% 50%;\n}\n.ui.scale.down.top.sidebar ~ .pusher {\n  transform-origin: 50% 75%;\n}\n.ui.scale.down.bottom.sidebar ~ .pusher {\n  transform-origin: 50% 25%;\n}\n\n/* Animation */\n.ui.animating.scale.down > .visible.ui.sidebar {\n  transition: transform @duration @easing;\n}\n.ui.visible.scale.down.sidebar ~ .pusher,\n.ui.animating.scale.down.sidebar ~ .pusher {\n  display: block !important;\n  width: 100%;\n  height: 100%;\n  overflow: hidden !important;\n}\n\n/* End */\n.ui.visible.scale.down.sidebar {\n  transform: translate3d(0, 0, 0);\n}\n.ui.visible.scale.down.sidebar ~ .pusher {\n  transform: scale(0.75);\n}\n\n.loadUIOverrides();\n"
  },
  {
    "path": "semantic/src/definitions/modules/sticky.js",
    "content": "/*!\n * # Semantic UI - Sticky\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n;(function ($, window, document, undefined) {\n\n'use strict';\n\nwindow = (typeof window != 'undefined' && window.Math == Math)\n  ? window\n  : (typeof self != 'undefined' && self.Math == Math)\n    ? self\n    : Function('return this')()\n;\n\n$.fn.sticky = function(parameters) {\n  var\n    $allModules    = $(this),\n    moduleSelector = $allModules.selector || '',\n\n    time           = new Date().getTime(),\n    performance    = [],\n\n    query          = arguments[0],\n    methodInvoked  = (typeof query == 'string'),\n    queryArguments = [].slice.call(arguments, 1),\n    returnedValue\n  ;\n\n  $allModules\n    .each(function() {\n      var\n        settings              = ( $.isPlainObject(parameters) )\n          ? $.extend(true, {}, $.fn.sticky.settings, parameters)\n          : $.extend({}, $.fn.sticky.settings),\n\n        className             = settings.className,\n        namespace             = settings.namespace,\n        error                 = settings.error,\n\n        eventNamespace        = '.' + namespace,\n        moduleNamespace       = 'module-' + namespace,\n\n        $module               = $(this),\n        $window               = $(window),\n        $scroll               = $(settings.scrollContext),\n        $container,\n        $context,\n\n        selector              = $module.selector || '',\n        instance              = $module.data(moduleNamespace),\n\n        requestAnimationFrame = window.requestAnimationFrame\n          || window.mozRequestAnimationFrame\n          || window.webkitRequestAnimationFrame\n          || window.msRequestAnimationFrame\n          || function(callback) { setTimeout(callback, 0); },\n\n        element         = this,\n\n        documentObserver,\n        observer,\n        module\n      ;\n\n      module      = {\n\n        initialize: function() {\n\n          module.determineContainer();\n          module.determineContext();\n          module.verbose('Initializing sticky', settings, $container);\n\n          module.save.positions();\n          module.checkErrors();\n          module.bind.events();\n\n          if(settings.observeChanges) {\n            module.observeChanges();\n          }\n          module.instantiate();\n        },\n\n        instantiate: function() {\n          module.verbose('Storing instance of module', module);\n          instance = module;\n          $module\n            .data(moduleNamespace, module)\n          ;\n        },\n\n        destroy: function() {\n          module.verbose('Destroying previous instance');\n          module.reset();\n          if(documentObserver) {\n            documentObserver.disconnect();\n          }\n          if(observer) {\n            observer.disconnect();\n          }\n          $window\n            .off('load' + eventNamespace, module.event.load)\n            .off('resize' + eventNamespace, module.event.resize)\n          ;\n          $scroll\n            .off('scrollchange' + eventNamespace, module.event.scrollchange)\n          ;\n          $module.removeData(moduleNamespace);\n        },\n\n        observeChanges: function() {\n          if('MutationObserver' in window) {\n            documentObserver = new MutationObserver(module.event.documentChanged);\n            observer         = new MutationObserver(module.event.changed);\n            documentObserver.observe(document, {\n              childList : true,\n              subtree   : true\n            });\n            observer.observe(element, {\n              childList : true,\n              subtree   : true\n            });\n            observer.observe($context[0], {\n              childList : true,\n              subtree   : true\n            });\n            module.debug('Setting up mutation observer', observer);\n          }\n        },\n\n        determineContainer: function() {\n          if(settings.container) {\n            $container = $(settings.container);\n          }\n          else {\n            $container = $module.offsetParent();\n          }\n        },\n\n        determineContext: function() {\n          if(settings.context) {\n            $context = $(settings.context);\n          }\n          else {\n            $context = $container;\n          }\n          if($context.length === 0) {\n            module.error(error.invalidContext, settings.context, $module);\n            return;\n          }\n        },\n\n        checkErrors: function() {\n          if( module.is.hidden() ) {\n            module.error(error.visible, $module);\n          }\n          if(module.cache.element.height > module.cache.context.height) {\n            module.reset();\n            module.error(error.elementSize, $module);\n            return;\n          }\n        },\n\n        bind: {\n          events: function() {\n            $window\n              .on('load' + eventNamespace, module.event.load)\n              .on('resize' + eventNamespace, module.event.resize)\n            ;\n            // pub/sub pattern\n            $scroll\n              .off('scroll' + eventNamespace)\n              .on('scroll' + eventNamespace, module.event.scroll)\n              .on('scrollchange' + eventNamespace, module.event.scrollchange)\n            ;\n          }\n        },\n\n        event: {\n          changed: function(mutations) {\n            clearTimeout(module.timer);\n            module.timer = setTimeout(function() {\n              module.verbose('DOM tree modified, updating sticky menu', mutations);\n              module.refresh();\n            }, 100);\n          },\n          documentChanged: function(mutations) {\n            [].forEach.call(mutations, function(mutation) {\n              if(mutation.removedNodes) {\n                [].forEach.call(mutation.removedNodes, function(node) {\n                  if(node == element || $(node).find(element).length > 0) {\n                    module.debug('Element removed from DOM, tearing down events');\n                    module.destroy();\n                  }\n                });\n              }\n            });\n          },\n          load: function() {\n            module.verbose('Page contents finished loading');\n            requestAnimationFrame(module.refresh);\n          },\n          resize: function() {\n            module.verbose('Window resized');\n            requestAnimationFrame(module.refresh);\n          },\n          scroll: function() {\n            requestAnimationFrame(function() {\n              $scroll.triggerHandler('scrollchange' + eventNamespace, $scroll.scrollTop() );\n            });\n          },\n          scrollchange: function(event, scrollPosition) {\n            module.stick(scrollPosition);\n            settings.onScroll.call(element);\n          }\n        },\n\n        refresh: function(hardRefresh) {\n          module.reset();\n          if(!settings.context) {\n            module.determineContext();\n          }\n          if(hardRefresh) {\n            module.determineContainer();\n          }\n          module.save.positions();\n          module.stick();\n          settings.onReposition.call(element);\n        },\n\n        supports: {\n          sticky: function() {\n            var\n              $element = $('<div/>'),\n              element = $element[0]\n            ;\n            $element.addClass(className.supported);\n            return($element.css('position').match('sticky'));\n          }\n        },\n\n        save: {\n          lastScroll: function(scroll) {\n            module.lastScroll = scroll;\n          },\n          elementScroll: function(scroll) {\n            module.elementScroll = scroll;\n          },\n          positions: function() {\n            var\n              scrollContext = {\n                height : $scroll.height()\n              },\n              element = {\n                margin: {\n                  top    : parseInt($module.css('margin-top'), 10),\n                  bottom : parseInt($module.css('margin-bottom'), 10),\n                },\n                offset : $module.offset(),\n                width  : $module.outerWidth(),\n                height : $module.outerHeight()\n              },\n              context = {\n                offset : $context.offset(),\n                height : $context.outerHeight()\n              },\n              container = {\n                height: $container.outerHeight()\n              }\n            ;\n            if( !module.is.standardScroll() ) {\n              module.debug('Non-standard scroll. Removing scroll offset from element offset');\n\n              scrollContext.top  = $scroll.scrollTop();\n              scrollContext.left = $scroll.scrollLeft();\n\n              element.offset.top  += scrollContext.top;\n              context.offset.top  += scrollContext.top;\n              element.offset.left += scrollContext.left;\n              context.offset.left += scrollContext.left;\n            }\n            module.cache = {\n              fits          : ( (element.height + settings.offset) <= scrollContext.height),\n              sameHeight    : (element.height == context.height),\n              scrollContext : {\n                height : scrollContext.height\n              },\n              element: {\n                margin : element.margin,\n                top    : element.offset.top - element.margin.top,\n                left   : element.offset.left,\n                width  : element.width,\n                height : element.height,\n                bottom : element.offset.top + element.height\n              },\n              context: {\n                top           : context.offset.top,\n                height        : context.height,\n                bottom        : context.offset.top + context.height\n              }\n            };\n            module.set.containerSize();\n\n            module.stick();\n            module.debug('Caching element positions', module.cache);\n          }\n        },\n\n        get: {\n          direction: function(scroll) {\n            var\n              direction = 'down'\n            ;\n            scroll = scroll || $scroll.scrollTop();\n            if(module.lastScroll !== undefined) {\n              if(module.lastScroll < scroll) {\n                direction = 'down';\n              }\n              else if(module.lastScroll > scroll) {\n                direction = 'up';\n              }\n            }\n            return direction;\n          },\n          scrollChange: function(scroll) {\n            scroll = scroll || $scroll.scrollTop();\n            return (module.lastScroll)\n              ? (scroll - module.lastScroll)\n              : 0\n            ;\n          },\n          currentElementScroll: function() {\n            if(module.elementScroll) {\n              return module.elementScroll;\n            }\n            return ( module.is.top() )\n              ? Math.abs(parseInt($module.css('top'), 10))    || 0\n              : Math.abs(parseInt($module.css('bottom'), 10)) || 0\n            ;\n          },\n\n          elementScroll: function(scroll) {\n            scroll = scroll || $scroll.scrollTop();\n            var\n              element        = module.cache.element,\n              scrollContext  = module.cache.scrollContext,\n              delta          = module.get.scrollChange(scroll),\n              maxScroll      = (element.height - scrollContext.height + settings.offset),\n              elementScroll  = module.get.currentElementScroll(),\n              possibleScroll = (elementScroll + delta)\n            ;\n            if(module.cache.fits || possibleScroll < 0) {\n              elementScroll = 0;\n            }\n            else if(possibleScroll > maxScroll ) {\n              elementScroll = maxScroll;\n            }\n            else {\n              elementScroll = possibleScroll;\n            }\n            return elementScroll;\n          }\n        },\n\n        remove: {\n          lastScroll: function() {\n            delete module.lastScroll;\n          },\n          elementScroll: function(scroll) {\n            delete module.elementScroll;\n          },\n          minimumSize: function() {\n            $container\n              .css('min-height', '')\n            ;\n          },\n          offset: function() {\n            $module.css('margin-top', '');\n          }\n        },\n\n        set: {\n          offset: function() {\n            module.verbose('Setting offset on element', settings.offset);\n            $module\n              .css('margin-top', settings.offset)\n            ;\n          },\n          containerSize: function() {\n            var\n              tagName = $container.get(0).tagName\n            ;\n            if(tagName === 'HTML' || tagName == 'body') {\n              // this can trigger for too many reasons\n              //module.error(error.container, tagName, $module);\n              module.determineContainer();\n            }\n            else {\n              if( Math.abs($container.outerHeight() - module.cache.context.height) > settings.jitter) {\n                module.debug('Context has padding, specifying exact height for container', module.cache.context.height);\n                $container.css({\n                  height: module.cache.context.height\n                });\n              }\n            }\n          },\n          minimumSize: function() {\n            var\n              element   = module.cache.element\n            ;\n            $container\n              .css('min-height', element.height)\n            ;\n          },\n          scroll: function(scroll) {\n            module.debug('Setting scroll on element', scroll);\n            if(module.elementScroll == scroll) {\n              return;\n            }\n            if( module.is.top() ) {\n              $module\n                .css('bottom', '')\n                .css('top', -scroll)\n              ;\n            }\n            if( module.is.bottom() ) {\n              $module\n                .css('top', '')\n                .css('bottom', scroll)\n              ;\n            }\n          },\n          size: function() {\n            if(module.cache.element.height !== 0 && module.cache.element.width !== 0) {\n              element.style.setProperty('width',  module.cache.element.width  + 'px', 'important');\n              element.style.setProperty('height', module.cache.element.height + 'px', 'important');\n            }\n          }\n        },\n\n        is: {\n          standardScroll: function() {\n            return ($scroll[0] == window);\n          },\n          top: function() {\n            return $module.hasClass(className.top);\n          },\n          bottom: function() {\n            return $module.hasClass(className.bottom);\n          },\n          initialPosition: function() {\n            return (!module.is.fixed() && !module.is.bound());\n          },\n          hidden: function() {\n            return (!$module.is(':visible'));\n          },\n          bound: function() {\n            return $module.hasClass(className.bound);\n          },\n          fixed: function() {\n            return $module.hasClass(className.fixed);\n          }\n        },\n\n        stick: function(scroll) {\n          var\n            cachedPosition = scroll || $scroll.scrollTop(),\n            cache          = module.cache,\n            fits           = cache.fits,\n            sameHeight     = cache.sameHeight,\n            element        = cache.element,\n            scrollContext  = cache.scrollContext,\n            context        = cache.context,\n            offset         = (module.is.bottom() && settings.pushing)\n              ? settings.bottomOffset\n              : settings.offset,\n            scroll         = {\n              top    : cachedPosition + offset,\n              bottom : cachedPosition + offset + scrollContext.height\n            },\n            direction      = module.get.direction(scroll.top),\n            elementScroll  = (fits)\n              ? 0\n              : module.get.elementScroll(scroll.top),\n\n            // shorthand\n            doesntFit      = !fits,\n            elementVisible = (element.height !== 0)\n          ;\n          if(elementVisible && !sameHeight) {\n\n            if( module.is.initialPosition() ) {\n              if(scroll.top >= context.bottom) {\n                module.debug('Initial element position is bottom of container');\n                module.bindBottom();\n              }\n              else if(scroll.top > element.top) {\n                if( (element.height + scroll.top - elementScroll) >= context.bottom ) {\n                  module.debug('Initial element position is bottom of container');\n                  module.bindBottom();\n                }\n                else {\n                  module.debug('Initial element position is fixed');\n                  module.fixTop();\n                }\n              }\n\n            }\n            else if( module.is.fixed() ) {\n\n              // currently fixed top\n              if( module.is.top() ) {\n                if( scroll.top <= element.top ) {\n                  module.debug('Fixed element reached top of container');\n                  module.setInitialPosition();\n                }\n                else if( (element.height + scroll.top - elementScroll) >= context.bottom ) {\n                  module.debug('Fixed element reached bottom of container');\n                  module.bindBottom();\n                }\n                // scroll element if larger than screen\n                else if(doesntFit) {\n                  module.set.scroll(elementScroll);\n                  module.save.lastScroll(scroll.top);\n                  module.save.elementScroll(elementScroll);\n                }\n              }\n\n              // currently fixed bottom\n              else if(module.is.bottom() ) {\n\n                // top edge\n                if( (scroll.bottom - element.height) <= element.top) {\n                  module.debug('Bottom fixed rail has reached top of container');\n                  module.setInitialPosition();\n                }\n                // bottom edge\n                else if(scroll.bottom >= context.bottom) {\n                  module.debug('Bottom fixed rail has reached bottom of container');\n                  module.bindBottom();\n                }\n                // scroll element if larger than screen\n                else if(doesntFit) {\n                  module.set.scroll(elementScroll);\n                  module.save.lastScroll(scroll.top);\n                  module.save.elementScroll(elementScroll);\n                }\n\n              }\n            }\n            else if( module.is.bottom() ) {\n              if( scroll.top <= element.top ) {\n                module.debug('Jumped from bottom fixed to top fixed, most likely used home/end button');\n                module.setInitialPosition();\n              }\n              else {\n                if(settings.pushing) {\n                  if(module.is.bound() && scroll.bottom <= context.bottom ) {\n                    module.debug('Fixing bottom attached element to bottom of browser.');\n                    module.fixBottom();\n                  }\n                }\n                else {\n                  if(module.is.bound() && (scroll.top <= context.bottom - element.height) ) {\n                    module.debug('Fixing bottom attached element to top of browser.');\n                    module.fixTop();\n                  }\n                }\n              }\n            }\n          }\n        },\n\n        bindTop: function() {\n          module.debug('Binding element to top of parent container');\n          module.remove.offset();\n          $module\n            .css({\n              left         : '',\n              top          : '',\n              marginBottom : ''\n            })\n            .removeClass(className.fixed)\n            .removeClass(className.bottom)\n            .addClass(className.bound)\n            .addClass(className.top)\n          ;\n          settings.onTop.call(element);\n          settings.onUnstick.call(element);\n        },\n        bindBottom: function() {\n          module.debug('Binding element to bottom of parent container');\n          module.remove.offset();\n          $module\n            .css({\n              left         : '',\n              top          : ''\n            })\n            .removeClass(className.fixed)\n            .removeClass(className.top)\n            .addClass(className.bound)\n            .addClass(className.bottom)\n          ;\n          settings.onBottom.call(element);\n          settings.onUnstick.call(element);\n        },\n\n        setInitialPosition: function() {\n          module.debug('Returning to initial position');\n          module.unfix();\n          module.unbind();\n        },\n\n\n        fixTop: function() {\n          module.debug('Fixing element to top of page');\n          if(settings.setSize) {\n            module.set.size();\n          }\n          module.set.minimumSize();\n          module.set.offset();\n          $module\n            .css({\n              left         : module.cache.element.left,\n              bottom       : '',\n              marginBottom : ''\n            })\n            .removeClass(className.bound)\n            .removeClass(className.bottom)\n            .addClass(className.fixed)\n            .addClass(className.top)\n          ;\n          settings.onStick.call(element);\n        },\n\n        fixBottom: function() {\n          module.debug('Sticking element to bottom of page');\n          if(settings.setSize) {\n            module.set.size();\n          }\n          module.set.minimumSize();\n          module.set.offset();\n          $module\n            .css({\n              left         : module.cache.element.left,\n              bottom       : '',\n              marginBottom : ''\n            })\n            .removeClass(className.bound)\n            .removeClass(className.top)\n            .addClass(className.fixed)\n            .addClass(className.bottom)\n          ;\n          settings.onStick.call(element);\n        },\n\n        unbind: function() {\n          if( module.is.bound() ) {\n            module.debug('Removing container bound position on element');\n            module.remove.offset();\n            $module\n              .removeClass(className.bound)\n              .removeClass(className.top)\n              .removeClass(className.bottom)\n            ;\n          }\n        },\n\n        unfix: function() {\n          if( module.is.fixed() ) {\n            module.debug('Removing fixed position on element');\n            module.remove.minimumSize();\n            module.remove.offset();\n            $module\n              .removeClass(className.fixed)\n              .removeClass(className.top)\n              .removeClass(className.bottom)\n            ;\n            settings.onUnstick.call(element);\n          }\n        },\n\n        reset: function() {\n          module.debug('Resetting elements position');\n          module.unbind();\n          module.unfix();\n          module.resetCSS();\n          module.remove.offset();\n          module.remove.lastScroll();\n        },\n\n        resetCSS: function() {\n          $module\n            .css({\n              width  : '',\n              height : ''\n            })\n          ;\n          $container\n            .css({\n              height: ''\n            })\n          ;\n        },\n\n        setting: function(name, value) {\n          if( $.isPlainObject(name) ) {\n            $.extend(true, settings, name);\n          }\n          else if(value !== undefined) {\n            settings[name] = value;\n          }\n          else {\n            return settings[name];\n          }\n        },\n        internal: function(name, value) {\n          if( $.isPlainObject(name) ) {\n            $.extend(true, module, name);\n          }\n          else if(value !== undefined) {\n            module[name] = value;\n          }\n          else {\n            return module[name];\n          }\n        },\n        debug: function() {\n          if(!settings.silent && settings.debug) {\n            if(settings.performance) {\n              module.performance.log(arguments);\n            }\n            else {\n              module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');\n              module.debug.apply(console, arguments);\n            }\n          }\n        },\n        verbose: function() {\n          if(!settings.silent && settings.verbose && settings.debug) {\n            if(settings.performance) {\n              module.performance.log(arguments);\n            }\n            else {\n              module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');\n              module.verbose.apply(console, arguments);\n            }\n          }\n        },\n        error: function() {\n          if(!settings.silent) {\n            module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');\n            module.error.apply(console, arguments);\n          }\n        },\n        performance: {\n          log: function(message) {\n            var\n              currentTime,\n              executionTime,\n              previousTime\n            ;\n            if(settings.performance) {\n              currentTime   = new Date().getTime();\n              previousTime  = time || currentTime;\n              executionTime = currentTime - previousTime;\n              time          = currentTime;\n              performance.push({\n                'Name'           : message[0],\n                'Arguments'      : [].slice.call(message, 1) || '',\n                'Element'        : element,\n                'Execution Time' : executionTime\n              });\n            }\n            clearTimeout(module.performance.timer);\n            module.performance.timer = setTimeout(module.performance.display, 0);\n          },\n          display: function() {\n            var\n              title = settings.name + ':',\n              totalTime = 0\n            ;\n            time = false;\n            clearTimeout(module.performance.timer);\n            $.each(performance, function(index, data) {\n              totalTime += data['Execution Time'];\n            });\n            title += ' ' + totalTime + 'ms';\n            if(moduleSelector) {\n              title += ' \\'' + moduleSelector + '\\'';\n            }\n            if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {\n              console.groupCollapsed(title);\n              if(console.table) {\n                console.table(performance);\n              }\n              else {\n                $.each(performance, function(index, data) {\n                  console.log(data['Name'] + ': ' + data['Execution Time']+'ms');\n                });\n              }\n              console.groupEnd();\n            }\n            performance = [];\n          }\n        },\n        invoke: function(query, passedArguments, context) {\n          var\n            object = instance,\n            maxDepth,\n            found,\n            response\n          ;\n          passedArguments = passedArguments || queryArguments;\n          context         = element         || context;\n          if(typeof query == 'string' && object !== undefined) {\n            query    = query.split(/[\\. ]/);\n            maxDepth = query.length - 1;\n            $.each(query, function(depth, value) {\n              var camelCaseValue = (depth != maxDepth)\n                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)\n                : query\n              ;\n              if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {\n                object = object[camelCaseValue];\n              }\n              else if( object[camelCaseValue] !== undefined ) {\n                found = object[camelCaseValue];\n                return false;\n              }\n              else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {\n                object = object[value];\n              }\n              else if( object[value] !== undefined ) {\n                found = object[value];\n                return false;\n              }\n              else {\n                return false;\n              }\n            });\n          }\n          if ( $.isFunction( found ) ) {\n            response = found.apply(context, passedArguments);\n          }\n          else if(found !== undefined) {\n            response = found;\n          }\n          if($.isArray(returnedValue)) {\n            returnedValue.push(response);\n          }\n          else if(returnedValue !== undefined) {\n            returnedValue = [returnedValue, response];\n          }\n          else if(response !== undefined) {\n            returnedValue = response;\n          }\n          return found;\n        }\n      };\n\n      if(methodInvoked) {\n        if(instance === undefined) {\n          module.initialize();\n        }\n        module.invoke(query);\n      }\n      else {\n        if(instance !== undefined) {\n          instance.invoke('destroy');\n        }\n        module.initialize();\n      }\n    })\n  ;\n\n  return (returnedValue !== undefined)\n    ? returnedValue\n    : this\n  ;\n};\n\n$.fn.sticky.settings = {\n\n  name           : 'Sticky',\n  namespace      : 'sticky',\n\n  silent         : false,\n  debug          : false,\n  verbose        : true,\n  performance    : true,\n\n  // whether to stick in the opposite direction on scroll up\n  pushing        : false,\n\n  context        : false,\n  container      : false,\n\n  // Context to watch scroll events\n  scrollContext  : window,\n\n  // Offset to adjust scroll\n  offset         : 0,\n\n  // Offset to adjust scroll when attached to bottom of screen\n  bottomOffset   : 0,\n\n  // will only set container height if difference between context and container is larger than this number\n  jitter         : 5,\n\n  // set width of sticky element when it is fixed to page (used to make sure 100% width is maintained if no fixed size set)\n  setSize        : true,\n\n  // Whether to automatically observe changes with Mutation Observers\n  observeChanges : false,\n\n  // Called when position is recalculated\n  onReposition   : function(){},\n\n  // Called on each scroll\n  onScroll       : function(){},\n\n  // Called when element is stuck to viewport\n  onStick        : function(){},\n\n  // Called when element is unstuck from viewport\n  onUnstick      : function(){},\n\n  // Called when element reaches top of context\n  onTop          : function(){},\n\n  // Called when element reaches bottom of context\n  onBottom       : function(){},\n\n  error         : {\n    container      : 'Sticky element must be inside a relative container',\n    visible        : 'Element is hidden, you must call refresh after element becomes visible. Use silent setting to surpress this warning in production.',\n    method         : 'The method you called is not defined.',\n    invalidContext : 'Context specified does not exist',\n    elementSize    : 'Sticky element is larger than its container, cannot create sticky.'\n  },\n\n  className : {\n    bound     : 'bound',\n    fixed     : 'fixed',\n    supported : 'native',\n    top       : 'top',\n    bottom    : 'bottom'\n  }\n\n};\n\n})( jQuery, window, document );\n"
  },
  {
    "path": "semantic/src/definitions/modules/sticky.less",
    "content": "/*!\n * # Semantic UI - Sticky\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n            Theme\n*******************************/\n\n@type    : 'module';\n@element : 'sticky';\n\n@import (multiple) '../../theme.config';\n\n/*******************************\n            Sticky\n*******************************/\n\n.ui.sticky {\n  position: static;\n  transition: @transition;\n  z-index: @zIndex;\n}\n\n/*******************************\n            States\n*******************************/\n\n/* Bound */\n.ui.sticky.bound {\n  position: absolute;\n  left: auto;\n  right: auto;\n}\n\n/* Fixed */\n.ui.sticky.fixed {\n  position: fixed;\n  left: auto;\n  right: auto;\n}\n\n/* Bound/Fixed Position */\n.ui.sticky.bound.top,\n.ui.sticky.fixed.top {\n  top: 0px;\n  bottom: auto;\n}\n.ui.sticky.bound.bottom,\n.ui.sticky.fixed.bottom {\n  top: auto;\n  bottom: 0px;\n}\n\n\n/*******************************\n            Types\n*******************************/\n\n.ui.native.sticky {\n  position: -webkit-sticky;\n  position: -moz-sticky;\n  position: -ms-sticky;\n  position: -o-sticky;\n  position: sticky;\n}\n\n.loadUIOverrides();\n"
  },
  {
    "path": "semantic/src/definitions/modules/tab.js",
    "content": "/*!\n * # Semantic UI - Tab\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n;(function ($, window, document, undefined) {\n\n'use strict';\n\nwindow = (typeof window != 'undefined' && window.Math == Math)\n  ? window\n  : (typeof self != 'undefined' && self.Math == Math)\n    ? self\n    : Function('return this')()\n;\n\n$.fn.tab = function(parameters) {\n\n  var\n    // use window context if none specified\n    $allModules     = $.isFunction(this)\n        ? $(window)\n        : $(this),\n\n    moduleSelector  = $allModules.selector || '',\n    time            = new Date().getTime(),\n    performance     = [],\n\n    query           = arguments[0],\n    methodInvoked   = (typeof query == 'string'),\n    queryArguments  = [].slice.call(arguments, 1),\n\n    initializedHistory = false,\n    returnedValue\n  ;\n\n  $allModules\n    .each(function() {\n      var\n\n        settings        = ( $.isPlainObject(parameters) )\n          ? $.extend(true, {}, $.fn.tab.settings, parameters)\n          : $.extend({}, $.fn.tab.settings),\n\n        className       = settings.className,\n        metadata        = settings.metadata,\n        selector        = settings.selector,\n        error           = settings.error,\n\n        eventNamespace  = '.' + settings.namespace,\n        moduleNamespace = 'module-' + settings.namespace,\n\n        $module         = $(this),\n        $context,\n        $tabs,\n\n        cache           = {},\n        firstLoad       = true,\n        recursionDepth  = 0,\n        element         = this,\n        instance        = $module.data(moduleNamespace),\n\n        activeTabPath,\n        parameterArray,\n        module,\n\n        historyEvent\n\n      ;\n\n      module = {\n\n        initialize: function() {\n          module.debug('Initializing tab menu item', $module);\n          module.fix.callbacks();\n          module.determineTabs();\n\n          module.debug('Determining tabs', settings.context, $tabs);\n          // set up automatic routing\n          if(settings.auto) {\n            module.set.auto();\n          }\n          module.bind.events();\n\n          if(settings.history && !initializedHistory) {\n            module.initializeHistory();\n            initializedHistory = true;\n          }\n\n          module.instantiate();\n        },\n\n        instantiate: function () {\n          module.verbose('Storing instance of module', module);\n          instance = module;\n          $module\n            .data(moduleNamespace, module)\n          ;\n        },\n\n        destroy: function() {\n          module.debug('Destroying tabs', $module);\n          $module\n            .removeData(moduleNamespace)\n            .off(eventNamespace)\n          ;\n        },\n\n        bind: {\n          events: function() {\n            // if using $.tab don't add events\n            if( !$.isWindow( element ) ) {\n              module.debug('Attaching tab activation events to element', $module);\n              $module\n                .on('click' + eventNamespace, module.event.click)\n              ;\n            }\n          }\n        },\n\n        determineTabs: function() {\n          var\n            $reference\n          ;\n\n          // determine tab context\n          if(settings.context === 'parent') {\n            if($module.closest(selector.ui).length > 0) {\n              $reference = $module.closest(selector.ui);\n              module.verbose('Using closest UI element as parent', $reference);\n            }\n            else {\n              $reference = $module;\n            }\n            $context = $reference.parent();\n            module.verbose('Determined parent element for creating context', $context);\n          }\n          else if(settings.context) {\n            $context = $(settings.context);\n            module.verbose('Using selector for tab context', settings.context, $context);\n          }\n          else {\n            $context = $('body');\n          }\n          // find tabs\n          if(settings.childrenOnly) {\n            $tabs = $context.children(selector.tabs);\n            module.debug('Searching tab context children for tabs', $context, $tabs);\n          }\n          else {\n            $tabs = $context.find(selector.tabs);\n            module.debug('Searching tab context for tabs', $context, $tabs);\n          }\n        },\n\n        fix: {\n          callbacks: function() {\n            if( $.isPlainObject(parameters) && (parameters.onTabLoad || parameters.onTabInit) ) {\n              if(parameters.onTabLoad) {\n                parameters.onLoad = parameters.onTabLoad;\n                delete parameters.onTabLoad;\n                module.error(error.legacyLoad, parameters.onLoad);\n              }\n              if(parameters.onTabInit) {\n                parameters.onFirstLoad = parameters.onTabInit;\n                delete parameters.onTabInit;\n                module.error(error.legacyInit, parameters.onFirstLoad);\n              }\n              settings = $.extend(true, {}, $.fn.tab.settings, parameters);\n            }\n          }\n        },\n\n        initializeHistory: function() {\n          module.debug('Initializing page state');\n          if( $.address === undefined ) {\n            module.error(error.state);\n            return false;\n          }\n          else {\n            if(settings.historyType == 'state') {\n              module.debug('Using HTML5 to manage state');\n              if(settings.path !== false) {\n                $.address\n                  .history(true)\n                  .state(settings.path)\n                ;\n              }\n              else {\n                module.error(error.path);\n                return false;\n              }\n            }\n            $.address\n              .bind('change', module.event.history.change)\n            ;\n          }\n        },\n\n        event: {\n          click: function(event) {\n            var\n              tabPath = $(this).data(metadata.tab)\n            ;\n            if(tabPath !== undefined) {\n              if(settings.history) {\n                module.verbose('Updating page state', event);\n                $.address.value(tabPath);\n              }\n              else {\n                module.verbose('Changing tab', event);\n                module.changeTab(tabPath);\n              }\n              event.preventDefault();\n            }\n            else {\n              module.debug('No tab specified');\n            }\n          },\n          history: {\n            change: function(event) {\n              var\n                tabPath   = event.pathNames.join('/') || module.get.initialPath(),\n                pageTitle = settings.templates.determineTitle(tabPath) || false\n              ;\n              module.performance.display();\n              module.debug('History change event', tabPath, event);\n              historyEvent = event;\n              if(tabPath !== undefined) {\n                module.changeTab(tabPath);\n              }\n              if(pageTitle) {\n                $.address.title(pageTitle);\n              }\n            }\n          }\n        },\n\n        refresh: function() {\n          if(activeTabPath) {\n            module.debug('Refreshing tab', activeTabPath);\n            module.changeTab(activeTabPath);\n          }\n        },\n\n        cache: {\n\n          read: function(cacheKey) {\n            return (cacheKey !== undefined)\n              ? cache[cacheKey]\n              : false\n            ;\n          },\n          add: function(cacheKey, content) {\n            cacheKey = cacheKey || activeTabPath;\n            module.debug('Adding cached content for', cacheKey);\n            cache[cacheKey] = content;\n          },\n          remove: function(cacheKey) {\n            cacheKey = cacheKey || activeTabPath;\n            module.debug('Removing cached content for', cacheKey);\n            delete cache[cacheKey];\n          }\n        },\n\n        set: {\n          auto: function() {\n            var\n              url = (typeof settings.path == 'string')\n                ? settings.path.replace(/\\/$/, '') + '/{$tab}'\n                : '/{$tab}'\n            ;\n            module.verbose('Setting up automatic tab retrieval from server', url);\n            if($.isPlainObject(settings.apiSettings)) {\n              settings.apiSettings.url = url;\n            }\n            else {\n              settings.apiSettings = {\n                url: url\n              };\n            }\n          },\n          loading: function(tabPath) {\n            var\n              $tab      = module.get.tabElement(tabPath),\n              isLoading = $tab.hasClass(className.loading)\n            ;\n            if(!isLoading) {\n              module.verbose('Setting loading state for', $tab);\n              $tab\n                .addClass(className.loading)\n                .siblings($tabs)\n                  .removeClass(className.active + ' ' + className.loading)\n              ;\n              if($tab.length > 0) {\n                settings.onRequest.call($tab[0], tabPath);\n              }\n            }\n          },\n          state: function(state) {\n            $.address.value(state);\n          }\n        },\n\n        changeTab: function(tabPath) {\n          var\n            pushStateAvailable = (window.history && window.history.pushState),\n            shouldIgnoreLoad   = (pushStateAvailable && settings.ignoreFirstLoad && firstLoad),\n            remoteContent      = (settings.auto || $.isPlainObject(settings.apiSettings) ),\n            // only add default path if not remote content\n            pathArray = (remoteContent && !shouldIgnoreLoad)\n              ? module.utilities.pathToArray(tabPath)\n              : module.get.defaultPathArray(tabPath)\n          ;\n          tabPath = module.utilities.arrayToPath(pathArray);\n          $.each(pathArray, function(index, tab) {\n            var\n              currentPathArray   = pathArray.slice(0, index + 1),\n              currentPath        = module.utilities.arrayToPath(currentPathArray),\n\n              isTab              = module.is.tab(currentPath),\n              isLastIndex        = (index + 1 == pathArray.length),\n\n              $tab               = module.get.tabElement(currentPath),\n              $anchor,\n              nextPathArray,\n              nextPath,\n              isLastTab\n            ;\n            module.verbose('Looking for tab', tab);\n            if(isTab) {\n              module.verbose('Tab was found', tab);\n              // scope up\n              activeTabPath  = currentPath;\n              parameterArray = module.utilities.filterArray(pathArray, currentPathArray);\n\n              if(isLastIndex) {\n                isLastTab = true;\n              }\n              else {\n                nextPathArray = pathArray.slice(0, index + 2);\n                nextPath      = module.utilities.arrayToPath(nextPathArray);\n                isLastTab     = ( !module.is.tab(nextPath) );\n                if(isLastTab) {\n                  module.verbose('Tab parameters found', nextPathArray);\n                }\n              }\n              if(isLastTab && remoteContent) {\n                if(!shouldIgnoreLoad) {\n                  module.activate.navigation(currentPath);\n                  module.fetch.content(currentPath, tabPath);\n                }\n                else {\n                  module.debug('Ignoring remote content on first tab load', currentPath);\n                  firstLoad = false;\n                  module.cache.add(tabPath, $tab.html());\n                  module.activate.all(currentPath);\n                  settings.onFirstLoad.call($tab[0], currentPath, parameterArray, historyEvent);\n                  settings.onLoad.call($tab[0], currentPath, parameterArray, historyEvent);\n                }\n                return false;\n              }\n              else {\n                module.debug('Opened local tab', currentPath);\n                module.activate.all(currentPath);\n                if( !module.cache.read(currentPath) ) {\n                  module.cache.add(currentPath, true);\n                  module.debug('First time tab loaded calling tab init');\n                  settings.onFirstLoad.call($tab[0], currentPath, parameterArray, historyEvent);\n                }\n                settings.onLoad.call($tab[0], currentPath, parameterArray, historyEvent);\n              }\n\n            }\n            else if(tabPath.search('/') == -1 && tabPath !== '') {\n              // look for in page anchor\n              $anchor     = $('#' + tabPath + ', a[name=\"' + tabPath + '\"]');\n              currentPath = $anchor.closest('[data-tab]').data(metadata.tab);\n              $tab        = module.get.tabElement(currentPath);\n              // if anchor exists use parent tab\n              if($anchor && $anchor.length > 0 && currentPath) {\n                module.debug('Anchor link used, opening parent tab', $tab, $anchor);\n                if( !$tab.hasClass(className.active) ) {\n                  setTimeout(function() {\n                    module.scrollTo($anchor);\n                  }, 0);\n                }\n                module.activate.all(currentPath);\n                if( !module.cache.read(currentPath) ) {\n                  module.cache.add(currentPath, true);\n                  module.debug('First time tab loaded calling tab init');\n                  settings.onFirstLoad.call($tab[0], currentPath, parameterArray, historyEvent);\n                }\n                settings.onLoad.call($tab[0], currentPath, parameterArray, historyEvent);\n                return false;\n              }\n            }\n            else {\n              module.error(error.missingTab, $module, $context, currentPath);\n              return false;\n            }\n          });\n        },\n\n        scrollTo: function($element) {\n          var\n            scrollOffset = ($element && $element.length > 0)\n              ? $element.offset().top\n              : false\n          ;\n          if(scrollOffset !== false) {\n            module.debug('Forcing scroll to an in-page link in a hidden tab', scrollOffset, $element);\n            $(document).scrollTop(scrollOffset);\n          }\n        },\n\n        update: {\n          content: function(tabPath, html, evaluateScripts) {\n            var\n              $tab = module.get.tabElement(tabPath),\n              tab  = $tab[0]\n            ;\n            evaluateScripts = (evaluateScripts !== undefined)\n              ? evaluateScripts\n              : settings.evaluateScripts\n            ;\n            if(typeof settings.cacheType == 'string' && settings.cacheType.toLowerCase() == 'dom' && typeof html !== 'string') {\n              $tab\n                .empty()\n                .append($(html).clone(true))\n              ;\n            }\n            else {\n              if(evaluateScripts) {\n                module.debug('Updating HTML and evaluating inline scripts', tabPath, html);\n                $tab.html(html);\n              }\n              else {\n                module.debug('Updating HTML', tabPath, html);\n                tab.innerHTML = html;\n              }\n            }\n          }\n        },\n\n        fetch: {\n\n          content: function(tabPath, fullTabPath) {\n            var\n              $tab        = module.get.tabElement(tabPath),\n              apiSettings = {\n                dataType         : 'html',\n                encodeParameters : false,\n                on               : 'now',\n                cache            : settings.alwaysRefresh,\n                headers          : {\n                  'X-Remote': true\n                },\n                onSuccess : function(response) {\n                  if(settings.cacheType == 'response') {\n                    module.cache.add(fullTabPath, response);\n                  }\n                  module.update.content(tabPath, response);\n                  if(tabPath == activeTabPath) {\n                    module.debug('Content loaded', tabPath);\n                    module.activate.tab(tabPath);\n                  }\n                  else {\n                    module.debug('Content loaded in background', tabPath);\n                  }\n                  settings.onFirstLoad.call($tab[0], tabPath, parameterArray, historyEvent);\n                  settings.onLoad.call($tab[0], tabPath, parameterArray, historyEvent);\n\n                  if(settings.loadOnce) {\n                    module.cache.add(fullTabPath, true);\n                  }\n                  else if(typeof settings.cacheType == 'string' && settings.cacheType.toLowerCase() == 'dom' && $tab.children().length > 0) {\n                    setTimeout(function() {\n                      var\n                        $clone = $tab.children().clone(true)\n                      ;\n                      $clone = $clone.not('script');\n                      module.cache.add(fullTabPath, $clone);\n                    }, 0);\n                  }\n                  else {\n                    module.cache.add(fullTabPath, $tab.html());\n                  }\n                },\n                urlData: {\n                  tab: fullTabPath\n                }\n              },\n              request         = $tab.api('get request') || false,\n              existingRequest = ( request && request.state() === 'pending' ),\n              requestSettings,\n              cachedContent\n            ;\n\n            fullTabPath   = fullTabPath || tabPath;\n            cachedContent = module.cache.read(fullTabPath);\n\n\n            if(settings.cache && cachedContent) {\n              module.activate.tab(tabPath);\n              module.debug('Adding cached content', fullTabPath);\n              if(!settings.loadOnce) {\n                if(settings.evaluateScripts == 'once') {\n                  module.update.content(tabPath, cachedContent, false);\n                }\n                else {\n                  module.update.content(tabPath, cachedContent);\n                }\n              }\n              settings.onLoad.call($tab[0], tabPath, parameterArray, historyEvent);\n            }\n            else if(existingRequest) {\n              module.set.loading(tabPath);\n              module.debug('Content is already loading', fullTabPath);\n            }\n            else if($.api !== undefined) {\n              requestSettings = $.extend(true, {}, settings.apiSettings, apiSettings);\n              module.debug('Retrieving remote content', fullTabPath, requestSettings);\n              module.set.loading(tabPath);\n              $tab.api(requestSettings);\n            }\n            else {\n              module.error(error.api);\n            }\n          }\n        },\n\n        activate: {\n          all: function(tabPath) {\n            module.activate.tab(tabPath);\n            module.activate.navigation(tabPath);\n          },\n          tab: function(tabPath) {\n            var\n              $tab          = module.get.tabElement(tabPath),\n              $deactiveTabs = (settings.deactivate == 'siblings')\n                ? $tab.siblings($tabs)\n                : $tabs.not($tab),\n              isActive      = $tab.hasClass(className.active)\n            ;\n            module.verbose('Showing tab content for', $tab);\n            if(!isActive) {\n              $tab\n                .addClass(className.active)\n              ;\n              $deactiveTabs\n                .removeClass(className.active + ' ' + className.loading)\n              ;\n              if($tab.length > 0) {\n                settings.onVisible.call($tab[0], tabPath);\n              }\n            }\n          },\n          navigation: function(tabPath) {\n            var\n              $navigation         = module.get.navElement(tabPath),\n              $deactiveNavigation = (settings.deactivate == 'siblings')\n                ? $navigation.siblings($allModules)\n                : $allModules.not($navigation),\n              isActive    = $navigation.hasClass(className.active)\n            ;\n            module.verbose('Activating tab navigation for', $navigation, tabPath);\n            if(!isActive) {\n              $navigation\n                .addClass(className.active)\n              ;\n              $deactiveNavigation\n                .removeClass(className.active + ' ' + className.loading)\n              ;\n            }\n          }\n        },\n\n        deactivate: {\n          all: function() {\n            module.deactivate.navigation();\n            module.deactivate.tabs();\n          },\n          navigation: function() {\n            $allModules\n              .removeClass(className.active)\n            ;\n          },\n          tabs: function() {\n            $tabs\n              .removeClass(className.active + ' ' + className.loading)\n            ;\n          }\n        },\n\n        is: {\n          tab: function(tabName) {\n            return (tabName !== undefined)\n              ? ( module.get.tabElement(tabName).length > 0 )\n              : false\n            ;\n          }\n        },\n\n        get: {\n          initialPath: function() {\n            return $allModules.eq(0).data(metadata.tab) || $tabs.eq(0).data(metadata.tab);\n          },\n          path: function() {\n            return $.address.value();\n          },\n          // adds default tabs to tab path\n          defaultPathArray: function(tabPath) {\n            return module.utilities.pathToArray( module.get.defaultPath(tabPath) );\n          },\n          defaultPath: function(tabPath) {\n            var\n              $defaultNav = $allModules.filter('[data-' + metadata.tab + '^=\"' + tabPath + '/\"]').eq(0),\n              defaultTab  = $defaultNav.data(metadata.tab) || false\n            ;\n            if( defaultTab ) {\n              module.debug('Found default tab', defaultTab);\n              if(recursionDepth < settings.maxDepth) {\n                recursionDepth++;\n                return module.get.defaultPath(defaultTab);\n              }\n              module.error(error.recursion);\n            }\n            else {\n              module.debug('No default tabs found for', tabPath, $tabs);\n            }\n            recursionDepth = 0;\n            return tabPath;\n          },\n          navElement: function(tabPath) {\n            tabPath = tabPath || activeTabPath;\n            return $allModules.filter('[data-' + metadata.tab + '=\"' + tabPath + '\"]');\n          },\n          tabElement: function(tabPath) {\n            var\n              $fullPathTab,\n              $simplePathTab,\n              tabPathArray,\n              lastTab\n            ;\n            tabPath        = tabPath || activeTabPath;\n            tabPathArray   = module.utilities.pathToArray(tabPath);\n            lastTab        = module.utilities.last(tabPathArray);\n            $fullPathTab   = $tabs.filter('[data-' + metadata.tab + '=\"' + tabPath + '\"]');\n            $simplePathTab = $tabs.filter('[data-' + metadata.tab + '=\"' + lastTab + '\"]');\n            return ($fullPathTab.length > 0)\n              ? $fullPathTab\n              : $simplePathTab\n            ;\n          },\n          tab: function() {\n            return activeTabPath;\n          }\n        },\n\n        utilities: {\n          filterArray: function(keepArray, removeArray) {\n            return $.grep(keepArray, function(keepValue) {\n              return ( $.inArray(keepValue, removeArray) == -1);\n            });\n          },\n          last: function(array) {\n            return $.isArray(array)\n              ? array[ array.length - 1]\n              : false\n            ;\n          },\n          pathToArray: function(pathName) {\n            if(pathName === undefined) {\n              pathName = activeTabPath;\n            }\n            return typeof pathName == 'string'\n              ? pathName.split('/')\n              : [pathName]\n            ;\n          },\n          arrayToPath: function(pathArray) {\n            return $.isArray(pathArray)\n              ? pathArray.join('/')\n              : false\n            ;\n          }\n        },\n\n        setting: function(name, value) {\n          module.debug('Changing setting', name, value);\n          if( $.isPlainObject(name) ) {\n            $.extend(true, settings, name);\n          }\n          else if(value !== undefined) {\n            if($.isPlainObject(settings[name])) {\n              $.extend(true, settings[name], value);\n            }\n            else {\n              settings[name] = value;\n            }\n          }\n          else {\n            return settings[name];\n          }\n        },\n        internal: function(name, value) {\n          if( $.isPlainObject(name) ) {\n            $.extend(true, module, name);\n          }\n          else if(value !== undefined) {\n            module[name] = value;\n          }\n          else {\n            return module[name];\n          }\n        },\n        debug: function() {\n          if(!settings.silent && settings.debug) {\n            if(settings.performance) {\n              module.performance.log(arguments);\n            }\n            else {\n              module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');\n              module.debug.apply(console, arguments);\n            }\n          }\n        },\n        verbose: function() {\n          if(!settings.silent && settings.verbose && settings.debug) {\n            if(settings.performance) {\n              module.performance.log(arguments);\n            }\n            else {\n              module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');\n              module.verbose.apply(console, arguments);\n            }\n          }\n        },\n        error: function() {\n          if(!settings.silent) {\n            module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');\n            module.error.apply(console, arguments);\n          }\n        },\n        performance: {\n          log: function(message) {\n            var\n              currentTime,\n              executionTime,\n              previousTime\n            ;\n            if(settings.performance) {\n              currentTime   = new Date().getTime();\n              previousTime  = time || currentTime;\n              executionTime = currentTime - previousTime;\n              time          = currentTime;\n              performance.push({\n                'Name'           : message[0],\n                'Arguments'      : [].slice.call(message, 1) || '',\n                'Element'        : element,\n                'Execution Time' : executionTime\n              });\n            }\n            clearTimeout(module.performance.timer);\n            module.performance.timer = setTimeout(module.performance.display, 500);\n          },\n          display: function() {\n            var\n              title = settings.name + ':',\n              totalTime = 0\n            ;\n            time = false;\n            clearTimeout(module.performance.timer);\n            $.each(performance, function(index, data) {\n              totalTime += data['Execution Time'];\n            });\n            title += ' ' + totalTime + 'ms';\n            if(moduleSelector) {\n              title += ' \\'' + moduleSelector + '\\'';\n            }\n            if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {\n              console.groupCollapsed(title);\n              if(console.table) {\n                console.table(performance);\n              }\n              else {\n                $.each(performance, function(index, data) {\n                  console.log(data['Name'] + ': ' + data['Execution Time']+'ms');\n                });\n              }\n              console.groupEnd();\n            }\n            performance = [];\n          }\n        },\n        invoke: function(query, passedArguments, context) {\n          var\n            object = instance,\n            maxDepth,\n            found,\n            response\n          ;\n          passedArguments = passedArguments || queryArguments;\n          context         = element         || context;\n          if(typeof query == 'string' && object !== undefined) {\n            query    = query.split(/[\\. ]/);\n            maxDepth = query.length - 1;\n            $.each(query, function(depth, value) {\n              var camelCaseValue = (depth != maxDepth)\n                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)\n                : query\n              ;\n              if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {\n                object = object[camelCaseValue];\n              }\n              else if( object[camelCaseValue] !== undefined ) {\n                found = object[camelCaseValue];\n                return false;\n              }\n              else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {\n                object = object[value];\n              }\n              else if( object[value] !== undefined ) {\n                found = object[value];\n                return false;\n              }\n              else {\n                module.error(error.method, query);\n                return false;\n              }\n            });\n          }\n          if ( $.isFunction( found ) ) {\n            response = found.apply(context, passedArguments);\n          }\n          else if(found !== undefined) {\n            response = found;\n          }\n          if($.isArray(returnedValue)) {\n            returnedValue.push(response);\n          }\n          else if(returnedValue !== undefined) {\n            returnedValue = [returnedValue, response];\n          }\n          else if(response !== undefined) {\n            returnedValue = response;\n          }\n          return found;\n        }\n      };\n      if(methodInvoked) {\n        if(instance === undefined) {\n          module.initialize();\n        }\n        module.invoke(query);\n      }\n      else {\n        if(instance !== undefined) {\n          instance.invoke('destroy');\n        }\n        module.initialize();\n      }\n    })\n  ;\n  return (returnedValue !== undefined)\n    ? returnedValue\n    : this\n  ;\n\n};\n\n// shortcut for tabbed content with no defined navigation\n$.tab = function() {\n  $(window).tab.apply(this, arguments);\n};\n\n$.fn.tab.settings = {\n\n  name            : 'Tab',\n  namespace       : 'tab',\n\n  silent          : false,\n  debug           : false,\n  verbose         : false,\n  performance     : true,\n\n  auto            : false,      // uses pjax style endpoints fetching content from same url with remote-content headers\n  history         : false,      // use browser history\n  historyType     : 'hash',     // #/ or html5 state\n  path            : false,      // base path of url\n\n  context         : false,      // specify a context that tabs must appear inside\n  childrenOnly    : false,      // use only tabs that are children of context\n  maxDepth        : 25,         // max depth a tab can be nested\n\n  deactivate      : 'siblings', // whether tabs should deactivate sibling menu elements or all elements initialized together\n\n  alwaysRefresh   : false,      // load tab content new every tab click\n  cache           : true,       // cache the content requests to pull locally\n  loadOnce        : false,      // Whether tab data should only be loaded once when using remote content\n  cacheType       : 'response', // Whether to cache exact response, or to html cache contents after scripts execute\n  ignoreFirstLoad : false,      // don't load remote content on first load\n\n  apiSettings     : false,      // settings for api call\n  evaluateScripts : 'once',     // whether inline scripts should be parsed (true/false/once). Once will not re-evaluate on cached content\n\n  onFirstLoad : function(tabPath, parameterArray, historyEvent) {}, // called first time loaded\n  onLoad      : function(tabPath, parameterArray, historyEvent) {}, // called on every load\n  onVisible   : function(tabPath, parameterArray, historyEvent) {}, // called every time tab visible\n  onRequest   : function(tabPath, parameterArray, historyEvent) {}, // called ever time a tab beings loading remote content\n\n  templates : {\n    determineTitle: function(tabArray) {} // returns page title for path\n  },\n\n  error: {\n    api        : 'You attempted to load content without API module',\n    method     : 'The method you called is not defined',\n    missingTab : 'Activated tab cannot be found. Tabs are case-sensitive.',\n    noContent  : 'The tab you specified is missing a content url.',\n    path       : 'History enabled, but no path was specified',\n    recursion  : 'Max recursive depth reached',\n    legacyInit : 'onTabInit has been renamed to onFirstLoad in 2.0, please adjust your code.',\n    legacyLoad : 'onTabLoad has been renamed to onLoad in 2.0. Please adjust your code',\n    state      : 'History requires Asual\\'s Address library <https://github.com/asual/jquery-address>'\n  },\n\n  metadata : {\n    tab    : 'tab',\n    loaded : 'loaded',\n    promise: 'promise'\n  },\n\n  className   : {\n    loading : 'loading',\n    active  : 'active'\n  },\n\n  selector    : {\n    tabs : '.ui.tab',\n    ui   : '.ui'\n  }\n\n};\n\n})( jQuery, window, document );\n"
  },
  {
    "path": "semantic/src/definitions/modules/tab.less",
    "content": "/*!\n * # Semantic UI - Tab\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n            Theme\n*******************************/\n\n@type    : 'module';\n@element : 'tab';\n\n@import (multiple) '../../theme.config';\n\n/*******************************\n           UI Tabs\n*******************************/\n\n.ui.tab {\n  display: none;\n}\n\n/*******************************\n             States\n*******************************/\n\n/*--------------------\n       Active\n---------------------*/\n\n.ui.tab.active,\n.ui.tab.open {\n  display: block;\n}\n\n/*--------------------\n       Loading\n---------------------*/\n\n.ui.tab.loading {\n  position: relative;\n  overflow: hidden;\n  display: block;\n  min-height: @loadingMinHeight;\n}\n.ui.tab.loading * {\n  position: @loadingContentPosition !important;\n  left: @loadingContentOffset !important;\n}\n\n.ui.tab.loading:before,\n.ui.tab.loading.segment:before {\n  position: absolute;\n  content: '';\n  top: @loaderDistanceFromTop;\n  left: 50%;\n\n  margin: @loaderMargin;\n  width: @loaderSize;\n  height: @loaderSize;\n\n  border-radius: @circularRadius;\n  border: @loaderLineWidth solid @loaderFillColor;\n}\n.ui.tab.loading:after,\n.ui.tab.loading.segment:after {\n  position: absolute;\n  content: '';\n  top: @loaderDistanceFromTop;\n  left: 50%;\n\n  margin: @loaderMargin;\n  width: @loaderSize;\n  height: @loaderSize;\n\n  animation: button-spin @loaderSpeed linear;\n  animation-iteration-count: infinite;\n\n  border-radius: @circularRadius;\n\n  border-color: @loaderLineColor transparent transparent;\n  border-style: solid;\n  border-width: @loaderLineWidth;\n\n  box-shadow: 0px 0px 0px 1px transparent;\n}\n\n.loadUIOverrides();\n"
  },
  {
    "path": "semantic/src/definitions/modules/transition.js",
    "content": "/*!\n * # Semantic UI - Transition\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n;(function ($, window, document, undefined) {\n\n'use strict';\n\nwindow = (typeof window != 'undefined' && window.Math == Math)\n  ? window\n  : (typeof self != 'undefined' && self.Math == Math)\n    ? self\n    : Function('return this')()\n;\n\n$.fn.transition = function() {\n  var\n    $allModules     = $(this),\n    moduleSelector  = $allModules.selector || '',\n\n    time            = new Date().getTime(),\n    performance     = [],\n\n    moduleArguments = arguments,\n    query           = moduleArguments[0],\n    queryArguments  = [].slice.call(arguments, 1),\n    methodInvoked   = (typeof query === 'string'),\n\n    requestAnimationFrame = window.requestAnimationFrame\n      || window.mozRequestAnimationFrame\n      || window.webkitRequestAnimationFrame\n      || window.msRequestAnimationFrame\n      || function(callback) { setTimeout(callback, 0); },\n\n    returnedValue\n  ;\n  $allModules\n    .each(function(index) {\n      var\n        $module  = $(this),\n        element  = this,\n\n        // set at run time\n        settings,\n        instance,\n\n        error,\n        className,\n        metadata,\n        animationEnd,\n        animationName,\n\n        namespace,\n        moduleNamespace,\n        eventNamespace,\n        module\n      ;\n\n      module = {\n\n        initialize: function() {\n\n          // get full settings\n          settings        = module.get.settings.apply(element, moduleArguments);\n\n          // shorthand\n          className       = settings.className;\n          error           = settings.error;\n          metadata        = settings.metadata;\n\n          // define namespace\n          eventNamespace  = '.' + settings.namespace;\n          moduleNamespace = 'module-' + settings.namespace;\n          instance        = $module.data(moduleNamespace) || module;\n\n          // get vendor specific events\n          animationEnd    = module.get.animationEndEvent();\n\n          if(methodInvoked) {\n            methodInvoked = module.invoke(query);\n          }\n\n          // method not invoked, lets run an animation\n          if(methodInvoked === false) {\n            module.verbose('Converted arguments into settings object', settings);\n            if(settings.interval) {\n              module.delay(settings.animate);\n            }\n            else  {\n              module.animate();\n            }\n            module.instantiate();\n          }\n        },\n\n        instantiate: function() {\n          module.verbose('Storing instance of module', module);\n          instance = module;\n          $module\n            .data(moduleNamespace, instance)\n          ;\n        },\n\n        destroy: function() {\n          module.verbose('Destroying previous module for', element);\n          $module\n            .removeData(moduleNamespace)\n          ;\n        },\n\n        refresh: function() {\n          module.verbose('Refreshing display type on next animation');\n          delete module.displayType;\n        },\n\n        forceRepaint: function() {\n          module.verbose('Forcing element repaint');\n          var\n            $parentElement = $module.parent(),\n            $nextElement = $module.next()\n          ;\n          if($nextElement.length === 0) {\n            $module.detach().appendTo($parentElement);\n          }\n          else {\n            $module.detach().insertBefore($nextElement);\n          }\n        },\n\n        repaint: function() {\n          module.verbose('Repainting element');\n          var\n            fakeAssignment = element.offsetWidth\n          ;\n        },\n\n        delay: function(interval) {\n          var\n            direction = module.get.animationDirection(),\n            shouldReverse,\n            delay\n          ;\n          if(!direction) {\n            direction = module.can.transition()\n              ? module.get.direction()\n              : 'static'\n            ;\n          }\n          interval = (interval !== undefined)\n            ? interval\n            : settings.interval\n          ;\n          shouldReverse = (settings.reverse == 'auto' && direction == className.outward);\n          delay = (shouldReverse || settings.reverse == true)\n            ? ($allModules.length - index) * settings.interval\n            : index * settings.interval\n          ;\n          module.debug('Delaying animation by', delay);\n          setTimeout(module.animate, delay);\n        },\n\n        animate: function(overrideSettings) {\n          settings = overrideSettings || settings;\n          if(!module.is.supported()) {\n            module.error(error.support);\n            return false;\n          }\n          module.debug('Preparing animation', settings.animation);\n          if(module.is.animating()) {\n            if(settings.queue) {\n              if(!settings.allowRepeats && module.has.direction() && module.is.occurring() && module.queuing !== true) {\n                module.debug('Animation is currently occurring, preventing queueing same animation', settings.animation);\n              }\n              else {\n                module.queue(settings.animation);\n              }\n              return false;\n            }\n            else if(!settings.allowRepeats && module.is.occurring()) {\n              module.debug('Animation is already occurring, will not execute repeated animation', settings.animation);\n              return false;\n            }\n            else {\n              module.debug('New animation started, completing previous early', settings.animation);\n              instance.complete();\n            }\n          }\n          if( module.can.animate() ) {\n            module.set.animating(settings.animation);\n          }\n          else {\n            module.error(error.noAnimation, settings.animation, element);\n          }\n        },\n\n        reset: function() {\n          module.debug('Resetting animation to beginning conditions');\n          module.remove.animationCallbacks();\n          module.restore.conditions();\n          module.remove.animating();\n        },\n\n        queue: function(animation) {\n          module.debug('Queueing animation of', animation);\n          module.queuing = true;\n          $module\n            .one(animationEnd + '.queue' + eventNamespace, function() {\n              module.queuing = false;\n              module.repaint();\n              module.animate.apply(this, settings);\n            })\n          ;\n        },\n\n        complete: function (event) {\n          module.debug('Animation complete', settings.animation);\n          module.remove.completeCallback();\n          module.remove.failSafe();\n          if(!module.is.looping()) {\n            if( module.is.outward() ) {\n              module.verbose('Animation is outward, hiding element');\n              module.restore.conditions();\n              module.hide();\n            }\n            else if( module.is.inward() ) {\n              module.verbose('Animation is outward, showing element');\n              module.restore.conditions();\n              module.show();\n            }\n            else {\n              module.verbose('Static animation completed');\n              module.restore.conditions();\n              settings.onComplete.call(element);\n            }\n          }\n        },\n\n        force: {\n          visible: function() {\n            var\n              style          = $module.attr('style'),\n              userStyle      = module.get.userStyle(),\n              displayType    = module.get.displayType(),\n              overrideStyle  = userStyle + 'display: ' + displayType + ' !important;',\n              currentDisplay = $module.css('display'),\n              emptyStyle     = (style === undefined || style === '')\n            ;\n            if(currentDisplay !== displayType) {\n              module.verbose('Overriding default display to show element', displayType);\n              $module\n                .attr('style', overrideStyle)\n              ;\n            }\n            else if(emptyStyle) {\n              $module.removeAttr('style');\n            }\n          },\n          hidden: function() {\n            var\n              style          = $module.attr('style'),\n              currentDisplay = $module.css('display'),\n              emptyStyle     = (style === undefined || style === '')\n            ;\n            if(currentDisplay !== 'none' && !module.is.hidden()) {\n              module.verbose('Overriding default display to hide element');\n              $module\n                .css('display', 'none')\n              ;\n            }\n            else if(emptyStyle) {\n              $module\n                .removeAttr('style')\n              ;\n            }\n          }\n        },\n\n        has: {\n          direction: function(animation) {\n            var\n              hasDirection = false\n            ;\n            animation = animation || settings.animation;\n            if(typeof animation === 'string') {\n              animation = animation.split(' ');\n              $.each(animation, function(index, word){\n                if(word === className.inward || word === className.outward) {\n                  hasDirection = true;\n                }\n              });\n            }\n            return hasDirection;\n          },\n          inlineDisplay: function() {\n            var\n              style = $module.attr('style') || ''\n            ;\n            return $.isArray(style.match(/display.*?;/, ''));\n          }\n        },\n\n        set: {\n          animating: function(animation) {\n            var\n              animationClass,\n              direction\n            ;\n            // remove previous callbacks\n            module.remove.completeCallback();\n\n            // determine exact animation\n            animation      = animation || settings.animation;\n            animationClass = module.get.animationClass(animation);\n\n            // save animation class in cache to restore class names\n            module.save.animation(animationClass);\n\n            // override display if necessary so animation appears visibly\n            module.force.visible();\n\n            module.remove.hidden();\n            module.remove.direction();\n\n            module.start.animation(animationClass);\n\n          },\n          duration: function(animationName, duration) {\n            duration = duration || settings.duration;\n            duration = (typeof duration == 'number')\n              ? duration + 'ms'\n              : duration\n            ;\n            if(duration || duration === 0) {\n              module.verbose('Setting animation duration', duration);\n              $module\n                .css({\n                  'animation-duration':  duration\n                })\n              ;\n            }\n          },\n          direction: function(direction) {\n            direction = direction || module.get.direction();\n            if(direction == className.inward) {\n              module.set.inward();\n            }\n            else {\n              module.set.outward();\n            }\n          },\n          looping: function() {\n            module.debug('Transition set to loop');\n            $module\n              .addClass(className.looping)\n            ;\n          },\n          hidden: function() {\n            $module\n              .addClass(className.transition)\n              .addClass(className.hidden)\n            ;\n          },\n          inward: function() {\n            module.debug('Setting direction to inward');\n            $module\n              .removeClass(className.outward)\n              .addClass(className.inward)\n            ;\n          },\n          outward: function() {\n            module.debug('Setting direction to outward');\n            $module\n              .removeClass(className.inward)\n              .addClass(className.outward)\n            ;\n          },\n          visible: function() {\n            $module\n              .addClass(className.transition)\n              .addClass(className.visible)\n            ;\n          }\n        },\n\n        start: {\n          animation: function(animationClass) {\n            animationClass = animationClass || module.get.animationClass();\n            module.debug('Starting tween', animationClass);\n            $module\n              .addClass(animationClass)\n              .one(animationEnd + '.complete' + eventNamespace, module.complete)\n            ;\n            if(settings.useFailSafe) {\n              module.add.failSafe();\n            }\n            module.set.duration(settings.duration);\n            settings.onStart.call(element);\n          }\n        },\n\n        save: {\n          animation: function(animation) {\n            if(!module.cache) {\n              module.cache = {};\n            }\n            module.cache.animation = animation;\n          },\n          displayType: function(displayType) {\n            if(displayType !== 'none') {\n              $module.data(metadata.displayType, displayType);\n            }\n          },\n          transitionExists: function(animation, exists) {\n            $.fn.transition.exists[animation] = exists;\n            module.verbose('Saving existence of transition', animation, exists);\n          }\n        },\n\n        restore: {\n          conditions: function() {\n            var\n              animation = module.get.currentAnimation()\n            ;\n            if(animation) {\n              $module\n                .removeClass(animation)\n              ;\n              module.verbose('Removing animation class', module.cache);\n            }\n            module.remove.duration();\n          }\n        },\n\n        add: {\n          failSafe: function() {\n            var\n              duration = module.get.duration()\n            ;\n            module.timer = setTimeout(function() {\n              $module.triggerHandler(animationEnd);\n            }, duration + settings.failSafeDelay);\n            module.verbose('Adding fail safe timer', module.timer);\n          }\n        },\n\n        remove: {\n          animating: function() {\n            $module.removeClass(className.animating);\n          },\n          animationCallbacks: function() {\n            module.remove.queueCallback();\n            module.remove.completeCallback();\n          },\n          queueCallback: function() {\n            $module.off('.queue' + eventNamespace);\n          },\n          completeCallback: function() {\n            $module.off('.complete' + eventNamespace);\n          },\n          display: function() {\n            $module.css('display', '');\n          },\n          direction: function() {\n            $module\n              .removeClass(className.inward)\n              .removeClass(className.outward)\n            ;\n          },\n          duration: function() {\n            $module\n              .css('animation-duration', '')\n            ;\n          },\n          failSafe: function() {\n            module.verbose('Removing fail safe timer', module.timer);\n            if(module.timer) {\n              clearTimeout(module.timer);\n            }\n          },\n          hidden: function() {\n            $module.removeClass(className.hidden);\n          },\n          visible: function() {\n            $module.removeClass(className.visible);\n          },\n          looping: function() {\n            module.debug('Transitions are no longer looping');\n            if( module.is.looping() ) {\n              module.reset();\n              $module\n                .removeClass(className.looping)\n              ;\n            }\n          },\n          transition: function() {\n            $module\n              .removeClass(className.visible)\n              .removeClass(className.hidden)\n            ;\n          }\n        },\n        get: {\n          settings: function(animation, duration, onComplete) {\n            // single settings object\n            if(typeof animation == 'object') {\n              return $.extend(true, {}, $.fn.transition.settings, animation);\n            }\n            // all arguments provided\n            else if(typeof onComplete == 'function') {\n              return $.extend({}, $.fn.transition.settings, {\n                animation  : animation,\n                onComplete : onComplete,\n                duration   : duration\n              });\n            }\n            // only duration provided\n            else if(typeof duration == 'string' || typeof duration == 'number') {\n              return $.extend({}, $.fn.transition.settings, {\n                animation : animation,\n                duration  : duration\n              });\n            }\n            // duration is actually settings object\n            else if(typeof duration == 'object') {\n              return $.extend({}, $.fn.transition.settings, duration, {\n                animation : animation\n              });\n            }\n            // duration is actually callback\n            else if(typeof duration == 'function') {\n              return $.extend({}, $.fn.transition.settings, {\n                animation  : animation,\n                onComplete : duration\n              });\n            }\n            // only animation provided\n            else {\n              return $.extend({}, $.fn.transition.settings, {\n                animation : animation\n              });\n            }\n          },\n          animationClass: function(animation) {\n            var\n              animationClass = animation || settings.animation,\n              directionClass = (module.can.transition() && !module.has.direction())\n                ? module.get.direction() + ' '\n                : ''\n            ;\n            return className.animating + ' '\n              + className.transition + ' '\n              + directionClass\n              + animationClass\n            ;\n          },\n          currentAnimation: function() {\n            return (module.cache && module.cache.animation !== undefined)\n              ? module.cache.animation\n              : false\n            ;\n          },\n          currentDirection: function() {\n            return module.is.inward()\n              ? className.inward\n              : className.outward\n            ;\n          },\n          direction: function() {\n            return module.is.hidden() || !module.is.visible()\n              ? className.inward\n              : className.outward\n            ;\n          },\n          animationDirection: function(animation) {\n            var\n              direction\n            ;\n            animation = animation || settings.animation;\n            if(typeof animation === 'string') {\n              animation = animation.split(' ');\n              // search animation name for out/in class\n              $.each(animation, function(index, word){\n                if(word === className.inward) {\n                  direction = className.inward;\n                }\n                else if(word === className.outward) {\n                  direction = className.outward;\n                }\n              });\n            }\n            // return found direction\n            if(direction) {\n              return direction;\n            }\n            return false;\n          },\n          duration: function(duration) {\n            duration = duration || settings.duration;\n            if(duration === false) {\n              duration = $module.css('animation-duration') || 0;\n            }\n            return (typeof duration === 'string')\n              ? (duration.indexOf('ms') > -1)\n                ? parseFloat(duration)\n                : parseFloat(duration) * 1000\n              : duration\n            ;\n          },\n          displayType: function(shouldDetermine) {\n            shouldDetermine = (shouldDetermine !== undefined)\n              ? shouldDetermine\n              : true\n            ;\n            if(settings.displayType) {\n              return settings.displayType;\n            }\n            if(shouldDetermine && $module.data(metadata.displayType) === undefined) {\n              // create fake element to determine display state\n              module.can.transition(true);\n            }\n            return $module.data(metadata.displayType);\n          },\n          userStyle: function(style) {\n            style = style || $module.attr('style') || '';\n            return style.replace(/display.*?;/, '');\n          },\n          transitionExists: function(animation) {\n            return $.fn.transition.exists[animation];\n          },\n          animationStartEvent: function() {\n            var\n              element     = document.createElement('div'),\n              animations  = {\n                'animation'       :'animationstart',\n                'OAnimation'      :'oAnimationStart',\n                'MozAnimation'    :'mozAnimationStart',\n                'WebkitAnimation' :'webkitAnimationStart'\n              },\n              animation\n            ;\n            for(animation in animations){\n              if( element.style[animation] !== undefined ){\n                return animations[animation];\n              }\n            }\n            return false;\n          },\n          animationEndEvent: function() {\n            var\n              element     = document.createElement('div'),\n              animations  = {\n                'animation'       :'animationend',\n                'OAnimation'      :'oAnimationEnd',\n                'MozAnimation'    :'mozAnimationEnd',\n                'WebkitAnimation' :'webkitAnimationEnd'\n              },\n              animation\n            ;\n            for(animation in animations){\n              if( element.style[animation] !== undefined ){\n                return animations[animation];\n              }\n            }\n            return false;\n          }\n\n        },\n\n        can: {\n          transition: function(forced) {\n            var\n              animation         = settings.animation,\n              transitionExists  = module.get.transitionExists(animation),\n              displayType       = module.get.displayType(false),\n              elementClass,\n              tagName,\n              $clone,\n              currentAnimation,\n              inAnimation,\n              directionExists\n            ;\n            if( transitionExists === undefined || forced) {\n              module.verbose('Determining whether animation exists');\n              elementClass = $module.attr('class');\n              tagName      = $module.prop('tagName');\n\n              $clone = $('<' + tagName + ' />').addClass( elementClass ).insertAfter($module);\n              currentAnimation = $clone\n                .addClass(animation)\n                .removeClass(className.inward)\n                .removeClass(className.outward)\n                .addClass(className.animating)\n                .addClass(className.transition)\n                .css('animationName')\n              ;\n              inAnimation = $clone\n                .addClass(className.inward)\n                .css('animationName')\n              ;\n              if(!displayType) {\n                displayType = $clone\n                  .attr('class', elementClass)\n                  .removeAttr('style')\n                  .removeClass(className.hidden)\n                  .removeClass(className.visible)\n                  .show()\n                  .css('display')\n                ;\n                module.verbose('Determining final display state', displayType);\n                module.save.displayType(displayType);\n              }\n\n              $clone.remove();\n              if(currentAnimation != inAnimation) {\n                module.debug('Direction exists for animation', animation);\n                directionExists = true;\n              }\n              else if(currentAnimation == 'none' || !currentAnimation) {\n                module.debug('No animation defined in css', animation);\n                return;\n              }\n              else {\n                module.debug('Static animation found', animation, displayType);\n                directionExists = false;\n              }\n              module.save.transitionExists(animation, directionExists);\n            }\n            return (transitionExists !== undefined)\n              ? transitionExists\n              : directionExists\n            ;\n          },\n          animate: function() {\n            // can transition does not return a value if animation does not exist\n            return (module.can.transition() !== undefined);\n          }\n        },\n\n        is: {\n          animating: function() {\n            return $module.hasClass(className.animating);\n          },\n          inward: function() {\n            return $module.hasClass(className.inward);\n          },\n          outward: function() {\n            return $module.hasClass(className.outward);\n          },\n          looping: function() {\n            return $module.hasClass(className.looping);\n          },\n          occurring: function(animation) {\n            animation = animation || settings.animation;\n            animation = '.' + animation.replace(' ', '.');\n            return ( $module.filter(animation).length > 0 );\n          },\n          visible: function() {\n            return $module.is(':visible');\n          },\n          hidden: function() {\n            return $module.css('visibility') === 'hidden';\n          },\n          supported: function() {\n            return(animationEnd !== false);\n          }\n        },\n\n        hide: function() {\n          module.verbose('Hiding element');\n          if( module.is.animating() ) {\n            module.reset();\n          }\n          element.blur(); // IE will trigger focus change if element is not blurred before hiding\n          module.remove.display();\n          module.remove.visible();\n          module.set.hidden();\n          module.force.hidden();\n          settings.onHide.call(element);\n          settings.onComplete.call(element);\n          // module.repaint();\n        },\n\n        show: function(display) {\n          module.verbose('Showing element', display);\n          module.remove.hidden();\n          module.set.visible();\n          module.force.visible();\n          settings.onShow.call(element);\n          settings.onComplete.call(element);\n          // module.repaint();\n        },\n\n        toggle: function() {\n          if( module.is.visible() ) {\n            module.hide();\n          }\n          else {\n            module.show();\n          }\n        },\n\n        stop: function() {\n          module.debug('Stopping current animation');\n          $module.triggerHandler(animationEnd);\n        },\n\n        stopAll: function() {\n          module.debug('Stopping all animation');\n          module.remove.queueCallback();\n          $module.triggerHandler(animationEnd);\n        },\n\n        clear: {\n          queue: function() {\n            module.debug('Clearing animation queue');\n            module.remove.queueCallback();\n          }\n        },\n\n        enable: function() {\n          module.verbose('Starting animation');\n          $module.removeClass(className.disabled);\n        },\n\n        disable: function() {\n          module.debug('Stopping animation');\n          $module.addClass(className.disabled);\n        },\n\n        setting: function(name, value) {\n          module.debug('Changing setting', name, value);\n          if( $.isPlainObject(name) ) {\n            $.extend(true, settings, name);\n          }\n          else if(value !== undefined) {\n            if($.isPlainObject(settings[name])) {\n              $.extend(true, settings[name], value);\n            }\n            else {\n              settings[name] = value;\n            }\n          }\n          else {\n            return settings[name];\n          }\n        },\n        internal: function(name, value) {\n          if( $.isPlainObject(name) ) {\n            $.extend(true, module, name);\n          }\n          else if(value !== undefined) {\n            module[name] = value;\n          }\n          else {\n            return module[name];\n          }\n        },\n        debug: function() {\n          if(!settings.silent && settings.debug) {\n            if(settings.performance) {\n              module.performance.log(arguments);\n            }\n            else {\n              module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');\n              module.debug.apply(console, arguments);\n            }\n          }\n        },\n        verbose: function() {\n          if(!settings.silent && settings.verbose && settings.debug) {\n            if(settings.performance) {\n              module.performance.log(arguments);\n            }\n            else {\n              module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');\n              module.verbose.apply(console, arguments);\n            }\n          }\n        },\n        error: function() {\n          if(!settings.silent) {\n            module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');\n            module.error.apply(console, arguments);\n          }\n        },\n        performance: {\n          log: function(message) {\n            var\n              currentTime,\n              executionTime,\n              previousTime\n            ;\n            if(settings.performance) {\n              currentTime   = new Date().getTime();\n              previousTime  = time || currentTime;\n              executionTime = currentTime - previousTime;\n              time          = currentTime;\n              performance.push({\n                'Name'           : message[0],\n                'Arguments'      : [].slice.call(message, 1) || '',\n                'Element'        : element,\n                'Execution Time' : executionTime\n              });\n            }\n            clearTimeout(module.performance.timer);\n            module.performance.timer = setTimeout(module.performance.display, 500);\n          },\n          display: function() {\n            var\n              title = settings.name + ':',\n              totalTime = 0\n            ;\n            time = false;\n            clearTimeout(module.performance.timer);\n            $.each(performance, function(index, data) {\n              totalTime += data['Execution Time'];\n            });\n            title += ' ' + totalTime + 'ms';\n            if(moduleSelector) {\n              title += ' \\'' + moduleSelector + '\\'';\n            }\n            if($allModules.length > 1) {\n              title += ' ' + '(' + $allModules.length + ')';\n            }\n            if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {\n              console.groupCollapsed(title);\n              if(console.table) {\n                console.table(performance);\n              }\n              else {\n                $.each(performance, function(index, data) {\n                  console.log(data['Name'] + ': ' + data['Execution Time']+'ms');\n                });\n              }\n              console.groupEnd();\n            }\n            performance = [];\n          }\n        },\n        // modified for transition to return invoke success\n        invoke: function(query, passedArguments, context) {\n          var\n            object = instance,\n            maxDepth,\n            found,\n            response\n          ;\n          passedArguments = passedArguments || queryArguments;\n          context         = element         || context;\n          if(typeof query == 'string' && object !== undefined) {\n            query    = query.split(/[\\. ]/);\n            maxDepth = query.length - 1;\n            $.each(query, function(depth, value) {\n              var camelCaseValue = (depth != maxDepth)\n                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)\n                : query\n              ;\n              if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {\n                object = object[camelCaseValue];\n              }\n              else if( object[camelCaseValue] !== undefined ) {\n                found = object[camelCaseValue];\n                return false;\n              }\n              else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {\n                object = object[value];\n              }\n              else if( object[value] !== undefined ) {\n                found = object[value];\n                return false;\n              }\n              else {\n                return false;\n              }\n            });\n          }\n          if ( $.isFunction( found ) ) {\n            response = found.apply(context, passedArguments);\n          }\n          else if(found !== undefined) {\n            response = found;\n          }\n\n          if($.isArray(returnedValue)) {\n            returnedValue.push(response);\n          }\n          else if(returnedValue !== undefined) {\n            returnedValue = [returnedValue, response];\n          }\n          else if(response !== undefined) {\n            returnedValue = response;\n          }\n          return (found !== undefined)\n            ? found\n            : false\n          ;\n        }\n      };\n      module.initialize();\n    })\n  ;\n  return (returnedValue !== undefined)\n    ? returnedValue\n    : this\n  ;\n};\n\n// Records if CSS transition is available\n$.fn.transition.exists = {};\n\n$.fn.transition.settings = {\n\n  // module info\n  name          : 'Transition',\n\n  // hide all output from this component regardless of other settings\n  silent        : false,\n\n  // debug content outputted to console\n  debug         : false,\n\n  // verbose debug output\n  verbose       : false,\n\n  // performance data output\n  performance   : true,\n\n  // event namespace\n  namespace     : 'transition',\n\n  // delay between animations in group\n  interval      : 0,\n\n  // whether group animations should be reversed\n  reverse       : 'auto',\n\n  // animation callback event\n  onStart       : function() {},\n  onComplete    : function() {},\n  onShow        : function() {},\n  onHide        : function() {},\n\n  // whether timeout should be used to ensure callback fires in cases animationend does not\n  useFailSafe   : true,\n\n  // delay in ms for fail safe\n  failSafeDelay : 100,\n\n  // whether EXACT animation can occur twice in a row\n  allowRepeats  : false,\n\n  // Override final display type on visible\n  displayType   : false,\n\n  // animation duration\n  animation     : 'fade',\n  duration      : false,\n\n  // new animations will occur after previous ones\n  queue         : true,\n\n  metadata : {\n    displayType: 'display'\n  },\n\n  className   : {\n    animating  : 'animating',\n    disabled   : 'disabled',\n    hidden     : 'hidden',\n    inward     : 'in',\n    loading    : 'loading',\n    looping    : 'looping',\n    outward    : 'out',\n    transition : 'transition',\n    visible    : 'visible'\n  },\n\n  // possible errors\n  error: {\n    noAnimation : 'Element is no longer attached to DOM. Unable to animate.  Use silent setting to surpress this warning in production.',\n    repeated    : 'That animation is already occurring, cancelling repeated animation',\n    method      : 'The method you called is not defined',\n    support     : 'This browser does not support CSS animations'\n  }\n\n};\n\n\n})( jQuery, window, document );\n"
  },
  {
    "path": "semantic/src/definitions/modules/transition.less",
    "content": "/*!\n * # Semantic UI - Transition\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n            Theme\n*******************************/\n\n@type    : 'module';\n@element : 'transition';\n\n@import (multiple) '../../theme.config';\n\n/*******************************\n          Transitions\n*******************************/\n\n.transition {\n  animation-iteration-count: 1;\n  animation-duration: @transitionDefaultDuration;\n  animation-timing-function: @transitionDefaultEasing;\n  animation-fill-mode: @transitionDefaultFill;\n}\n\n/*******************************\n            States\n*******************************/\n\n\n/* Animating */\n.animating.transition {\n  backface-visibility: @backfaceVisibility;\n  visibility: visible !important;\n}\n\n/* Loading */\n.loading.transition {\n  position: absolute;\n  top: -99999px;\n  left: -99999px;\n}\n\n/* Hidden */\n.hidden.transition {\n  display: none;\n  visibility: hidden;\n}\n\n/* Visible */\n.visible.transition {\n  display: block !important;\n  visibility: visible !important;\n/*  backface-visibility: @backfaceVisibility;\n  transform: @use3DAcceleration;*/\n}\n\n/* Disabled */\n.disabled.transition {\n  animation-play-state: paused;\n}\n\n/*******************************\n          Variations\n*******************************/\n\n.looping.transition {\n  animation-iteration-count: infinite;\n}\n\n\n.loadUIOverrides();\n"
  },
  {
    "path": "semantic/src/definitions/views/ad.less",
    "content": "/*!\n * # Semantic UI - Ad\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Copyright 2013 Contributors\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n/*******************************\n            Theme\n*******************************/\n\n@type    : 'view';\n@element : 'ad';\n\n@import (multiple) '../../theme.config';\n\n/*******************************\n         Advertisement\n*******************************/\n\n.ui.ad {\n  display: block;\n  overflow: @overflow;\n  margin: @margin;\n}\n\n.ui.ad:first-child {\n  margin: 0em;\n}\n\n.ui.ad:last-child {\n  margin: 0em;\n}\n\n.ui.ad iframe {\n  margin: 0em;\n  padding: 0em;\n  border: none;\n  overflow: hidden;\n}\n\n/*--------------\n     Common\n---------------*/\n\n/* Leaderboard */\n.ui.leaderboard.ad {\n  width: 728px;\n  height: 90px;\n}\n\n/* Medium Rectangle */\n.ui[class*=\"medium rectangle\"].ad {\n  width: 300px;\n  height: 250px;\n}\n\n/* Large Rectangle */\n.ui[class*=\"large rectangle\"].ad {\n  width: 336px;\n  height: 280px;\n}\n/* Half Page */\n.ui[class*=\"half page\"].ad {\n  width: 300px;\n  height: 600px;\n}\n\n/*--------------\n     Square\n---------------*/\n\n/* Square */\n.ui.square.ad {\n  width: 250px;\n  height: 250px;\n}\n\n/* Small Square */\n.ui[class*=\"small square\"].ad {\n  width: 200px;\n  height: 200px;\n}\n\n/*--------------\n    Rectangle\n---------------*/\n\n/* Small Rectangle */\n.ui[class*=\"small rectangle\"].ad {\n  width: 180px;\n  height: 150px;\n}\n\n/* Vertical Rectangle */\n.ui[class*=\"vertical rectangle\"].ad {\n  width: 240px;\n  height: 400px;\n}\n\n/*--------------\n     Button\n---------------*/\n\n.ui.button.ad {\n  width: 120px;\n  height: 90px;\n}\n.ui[class*=\"square button\"].ad {\n  width: 125px;\n  height: 125px;\n}\n.ui[class*=\"small button\"].ad {\n  width: 120px;\n  height: 60px;\n}\n\n/*--------------\n   Skyscrapers\n---------------*/\n\n/* Skyscraper */\n.ui.skyscraper.ad {\n  width: 120px;\n  height: 600px;\n}\n\n/* Wide Skyscraper */\n.ui[class*=\"wide skyscraper\"].ad {\n  width: 160px;\n}\n\n/*--------------\n     Banners\n---------------*/\n\n/* Banner */\n.ui.banner.ad {\n  width: 468px;\n  height: 60px;\n}\n\n/* Vertical Banner */\n.ui[class*=\"vertical banner\"].ad {\n  width: 120px;\n  height: 240px;\n}\n\n/* Top Banner */\n.ui[class*=\"top banner\"].ad {\n  width: 930px;\n  height: 180px;\n}\n\n/* Half Banner */\n.ui[class*=\"half banner\"].ad {\n  width: 234px;\n  height: 60px;\n}\n\n/*--------------\n    Boards\n---------------*/\n\n/* Leaderboard */\n.ui[class*=\"large leaderboard\"].ad {\n  width: 970px;\n  height: 90px;\n}\n\n/* Billboard */\n.ui.billboard.ad {\n  width: 970px;\n  height: 250px;\n}\n\n/*--------------\n    Panorama\n---------------*/\n\n/* Panorama */\n.ui.panorama.ad {\n  width: 980px;\n  height: 120px;\n}\n\n/*--------------\n     Netboard\n---------------*/\n\n/* Netboard */\n.ui.netboard.ad {\n  width: 580px;\n  height: 400px;\n}\n\n\n\n/*--------------\n     Mobile\n---------------*/\n\n/* Large Mobile Banner */\n.ui[class*=\"large mobile banner\"].ad {\n  width: 320px;\n  height: 100px;\n}\n\n/* Mobile Leaderboard */\n.ui[class*=\"mobile leaderboard\"].ad {\n  width: 320px;\n  height: 50px;\n}\n\n/*******************************\n             Types\n*******************************/\n\n/* Mobile Sizes */\n.ui.mobile.ad {\n  display: none;\n}\n\n@media only screen and (max-width : @largestMobileScreen) {\n  .ui.mobile.ad {\n    display: block;\n  }\n}\n\n\n/*******************************\n           Variations\n*******************************/\n\n.ui.centered.ad {\n  margin-left: auto;\n  margin-right: auto;\n}\n\n.ui.test.ad {\n  position: relative;\n  background: @testBackground;\n}\n.ui.test.ad:after {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  width: 100%;\n  text-align: center;\n  transform: translateX(-50%) translateY(-50%);\n\n  content: @testText;\n  color: @testColor;\n  font-size: @testFontSize;\n  font-weight: @testFontWeight;\n}\n.ui.mobile.test.ad:after {\n  font-size: @testMobileFontSize;\n}\n.ui.test.ad[data-text]:after {\n  content: attr(data-text);\n}\n\n.loadUIOverrides();"
  },
  {
    "path": "semantic/src/definitions/views/card.less",
    "content": "/*!\n * # Semantic UI - Item\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n/*******************************\n            Theme\n*******************************/\n\n@type    : 'view';\n@element : 'card';\n\n@import (multiple) '../../theme.config';\n\n/*******************************\n            Standard\n*******************************/\n\n/*--------------\n      Card\n---------------*/\n\n.ui.cards > .card,\n.ui.card {\n  max-width: 100%;\n  position: relative;\n  display: @display;\n  flex-direction: column;\n\n  width: @width;\n  min-height: @minHeight;\n  background: @background;\n  padding: @padding;\n\n  border: @border;\n  border-radius: @borderRadius;\n  box-shadow: @boxShadow;\n  transition: @transition;\n  z-index: @zIndex;\n}\n.ui.card {\n  margin: @margin;\n}\n\n.ui.cards > .card a,\n.ui.card a {\n  cursor: pointer;\n}\n\n.ui.card:first-child {\n  margin-top: 0em;\n}\n.ui.card:last-child {\n  margin-bottom: 0em;\n}\n\n/*--------------\n      Cards\n---------------*/\n\n.ui.cards {\n  display: @groupDisplay;\n  margin: @groupMargin;\n  flex-wrap: wrap;\n}\n\n.ui.cards > .card {\n  display: @groupCardDisplay;\n  margin: @groupCardMargin;\n  float: @groupCardFloat;\n}\n\n/* Clearing */\n.ui.cards:after,\n.ui.card:after {\n  display: block;\n  content: ' ';\n  height: 0px;\n  clear: both;\n  overflow: hidden;\n  visibility: hidden;\n}\n\n\n/* Consecutive Card Groups Preserve Row Spacing */\n.ui.cards ~ .ui.cards {\n  margin-top: @consecutiveGroupDistance;\n}\n\n\n/*--------------\n  Rounded Edges\n---------------*/\n\n.ui.cards > .card > :first-child,\n.ui.card > :first-child {\n  border-radius: @borderRadius @borderRadius 0em 0em !important;\n  border-top: none !important;\n}\n\n.ui.cards > .card > :last-child,\n.ui.card > :last-child {\n  border-radius: 0em 0em @borderRadius @borderRadius !important;\n}\n\n.ui.cards > .card > :only-child,\n.ui.card > :only-child {\n  border-radius: @borderRadius !important;\n}\n\n/*--------------\n     Images\n---------------*/\n\n.ui.cards > .card > .image,\n.ui.card > .image {\n  position: relative;\n  display: block;\n  flex: 0 0 auto;\n  padding: @imagePadding;\n  background: @imageBackground;\n}\n.ui.cards > .card > .image > img,\n.ui.card > .image > img {\n  display: block;\n  width: 100%;\n  height: auto;\n  border-radius: inherit;\n}\n.ui.cards > .card > .image:not(.ui) > img,\n.ui.card > .image:not(.ui) > img {\n  border: @imageBorder;\n}\n\n/*--------------\n     Content\n---------------*/\n\n.ui.cards > .card > .content,\n.ui.card > .content {\n  flex-grow: 1;\n  border: @contentBorder;\n  border-top: @contentDivider;\n  background: @contentBackground;\n  margin: @contentMargin;\n  padding: @contentPadding;\n  box-shadow: @contentBoxShadow;\n  font-size: @contentFontSize;\n  border-radius: @contentBorderRadius;\n}\n\n.ui.cards > .card > .content:after,\n.ui.card > .content:after {\n  display: block;\n  content: ' ';\n  height: 0px;\n  clear: both;\n  overflow: hidden;\n  visibility: hidden;\n}\n\n.ui.cards > .card > .content > .header,\n.ui.card > .content > .header {\n  display: block;\n  margin: @headerMargin;\n  font-family: @headerFont;\n  color: @headerColor;\n}\n\n/* Default Header Size */\n.ui.cards > .card > .content > .header:not(.ui),\n.ui.card > .content > .header:not(.ui) {\n  font-weight: @headerFontWeight;\n  font-size: @headerFontSize;\n  margin-top: @headerLineHeightOffset;\n  line-height: @headerLineHeight;\n}\n\n.ui.cards > .card > .content > .meta + .description,\n.ui.cards > .card > .content > .header + .description,\n.ui.card > .content > .meta + .description,\n.ui.card > .content > .header + .description  {\n  margin-top: @descriptionDistance;\n}\n\n/*----------------\n Floated Content\n-----------------*/\n\n.ui.cards > .card  [class*=\"left floated\"],\n.ui.card [class*=\"left floated\"] {\n  float: left;\n}\n.ui.cards > .card [class*=\"right floated\"],\n.ui.card [class*=\"right floated\"] {\n  float: right;\n}\n\n/*--------------\n     Aligned\n---------------*/\n\n.ui.cards > .card  [class*=\"left aligned\"],\n.ui.card [class*=\"left aligned\"] {\n  text-align: left;\n}\n.ui.cards > .card [class*=\"center aligned\"],\n.ui.card [class*=\"center aligned\"] {\n  text-align: center;\n}\n.ui.cards > .card [class*=\"right aligned\"],\n.ui.card [class*=\"right aligned\"] {\n  text-align: right;\n}\n\n\n/*--------------\n  Content Image\n---------------*/\n\n.ui.cards > .card .content img,\n.ui.card .content img {\n  display: inline-block;\n  vertical-align: @contentImageVerticalAlign;\n  width: @contentImageWidth;\n}\n.ui.cards > .card img.avatar,\n.ui.cards > .card .avatar img,\n.ui.card img.avatar,\n.ui.card .avatar img {\n  width: @avatarSize;\n  height: @avatarSize;\n  border-radius: @avatarBorderRadius;\n}\n\n\n/*--------------\n   Description\n---------------*/\n\n.ui.cards > .card > .content > .description,\n.ui.card > .content > .description {\n  clear: both;\n  color: @descriptionColor;\n}\n\n/*--------------\n    Paragraph\n---------------*/\n\n.ui.cards > .card > .content p,\n.ui.card > .content p {\n  margin: 0em 0em @paragraphDistance;\n}\n.ui.cards > .card > .content p:last-child,\n.ui.card > .content p:last-child {\n  margin-bottom: 0em;\n}\n\n/*--------------\n      Meta\n---------------*/\n\n.ui.cards > .card .meta,\n.ui.card .meta {\n  font-size: @metaFontSize;\n  color: @metaColor;\n}\n.ui.cards > .card .meta *,\n.ui.card .meta * {\n  margin-right: @metaSpacing;\n}\n.ui.cards > .card .meta :last-child,\n.ui.card .meta :last-child {\n  margin-right: 0em;\n}\n\n.ui.cards > .card .meta [class*=\"right floated\"],\n.ui.card .meta [class*=\"right floated\"] {\n  margin-right: 0em;\n  margin-left: @metaSpacing;\n}\n\n/*--------------\n      Links\n---------------*/\n\n/* Generic */\n.ui.cards > .card > .content a:not(.ui),\n.ui.card > .content a:not(.ui) {\n  color: @contentLinkColor;\n  transition: @contentLinkTransition;\n}\n.ui.cards > .card > .content a:not(.ui):hover,\n.ui.card > .content a:not(.ui):hover {\n  color: @contentLinkHoverColor;\n}\n\n/* Header */\n.ui.cards > .card > .content > a.header,\n.ui.card > .content > a.header {\n  color: @headerLinkColor;\n}\n.ui.cards > .card > .content > a.header:hover,\n.ui.card > .content > a.header:hover {\n  color: @headerLinkHoverColor;\n}\n\n/* Meta */\n.ui.cards > .card .meta > a:not(.ui),\n.ui.card .meta > a:not(.ui) {\n  color: @metaLinkColor;\n}\n.ui.cards > .card .meta > a:not(.ui):hover,\n.ui.card .meta > a:not(.ui):hover {\n  color: @metaLinkHoverColor;\n}\n\n/*--------------\n     Buttons\n---------------*/\n\n.ui.cards > .card > .buttons,\n.ui.card > .buttons,\n.ui.cards > .card > .button,\n.ui.card > .button {\n  margin: @buttonMargin;\n  width: @buttonWidth;\n}\n\n/*--------------\n      Dimmer\n---------------*/\n\n.ui.cards > .card .dimmer,\n.ui.card .dimmer {\n  background-color: @dimmerColor;\n  z-index: @dimmerZIndex;\n}\n\n/*--------------\n     Labels\n---------------*/\n\n/*-----Star----- */\n\n/* Icon */\n.ui.cards > .card > .content .star.icon,\n.ui.card > .content .star.icon {\n  cursor: pointer;\n  opacity: @actionOpacity;\n  transition: @actionTransition;\n}\n.ui.cards > .card > .content .star.icon:hover,\n.ui.card > .content .star.icon:hover {\n  opacity: @actionHoverOpacity;\n  color: @starColor;\n}\n.ui.cards > .card > .content .active.star.icon,\n.ui.card > .content .active.star.icon {\n  color: @starActiveColor;\n}\n\n/*-----Like----- */\n\n/* Icon */\n.ui.cards > .card > .content .like.icon,\n.ui.card > .content .like.icon {\n  cursor: pointer;\n  opacity: @actionOpacity;\n  transition: @actionTransition;\n}\n.ui.cards > .card > .content .like.icon:hover,\n.ui.card > .content .like.icon:hover {\n  opacity: @actionHoverOpacity;\n  color: @likeColor;\n}\n.ui.cards > .card > .content .active.like.icon,\n.ui.card > .content .active.like.icon {\n  color: @likeActiveColor;\n}\n\n/*----------------\n  Extra Content\n-----------------*/\n\n.ui.cards > .card > .extra,\n.ui.card > .extra {\n  max-width: 100%;\n  min-height: 0em !important;\n  flex-grow: 0;\n  border-top: @extraDivider !important;\n  position: @extraPosition;\n  background: @extraBackground;\n  width: @extraWidth;\n  margin: @extraMargin;\n  padding: @extraPadding;\n  top: @extraTop;\n  left: @extraLeft;\n  color: @extraColor;\n  box-shadow: @extraBoxShadow;\n  transition: @extraTransition;\n}\n.ui.cards > .card > .extra a:not(.ui),\n.ui.card > .extra a:not(.ui) {\n  color: @extraLinkColor;\n}\n.ui.cards > .card > .extra a:not(.ui):hover,\n.ui.card > .extra a:not(.ui):hover {\n  color: @extraLinkHoverColor;\n}\n\n\n/*******************************\n           Variations\n*******************************/\n\n/*-------------------\n       Raised\n--------------------*/\n\n.ui.raised.cards > .card,\n.ui.raised.card {\n  box-shadow: @raisedShadow;\n}\n.ui.raised.cards a.card:hover,\n.ui.link.cards .raised.card:hover,\na.ui.raised.card:hover,\n.ui.link.raised.card:hover {\n  box-shadow: @raisedShadowHover;\n}\n\n.ui.raised.cards > .card,\n.ui.raised.card {\n  box-shadow: @raisedShadow;\n}\n/*-------------------\n       Centered\n--------------------*/\n\n.ui.centered.cards {\n  justify-content: center;\n}\n.ui.centered.card {\n  margin-left: auto;\n  margin-right: auto;\n}\n\n/*-------------------\n        Fluid\n--------------------*/\n\n.ui.fluid.card {\n  width: 100%;\n  max-width: 9999px;\n}\n\n/*-------------------\n        Link\n--------------------*/\n\n.ui.cards a.card,\n.ui.link.cards .card,\na.ui.card,\n.ui.link.card {\n  transform: none;\n}\n\n\n.ui.cards a.card:hover,\n.ui.link.cards .card:hover,\na.ui.card:hover,\n.ui.link.card:hover {\n  cursor: pointer;\n  z-index: @linkHoverZIndex;\n  background: @linkHoverBackground;\n  border: @linkHoverBorder;\n  box-shadow: @linkHoverBoxShadow;\n  transform: @linkHoverTransform;\n}\n\n/*-------------------\n       Colors\n--------------------*/\n\n/* Red */\n.ui.red.cards > .card,\n.ui.cards > .red.card,\n.ui.red.card {\n  box-shadow:\n    @borderShadow,\n    0px @coloredShadowDistance 0px 0px @red,\n    @shadowBoxShadow\n  ;\n}\n.ui.red.cards > .card:hover,\n.ui.cards > .red.card:hover,\n.ui.red.card:hover {\n  box-shadow:\n    @borderShadow,\n    0px @coloredShadowDistance 0px 0px @redHover,\n    @shadowHoverBoxShadow\n  ;\n}\n\n/* Orange */\n.ui.orange.cards > .card,\n.ui.cards > .orange.card,\n.ui.orange.card {\n  box-shadow:\n    @borderShadow,\n    0px @coloredShadowDistance 0px 0px @orange,\n    @shadowBoxShadow\n  ;\n}\n.ui.orange.cards > .card:hover,\n.ui.cards > .orange.card:hover,\n.ui.orange.card:hover {\n  box-shadow:\n    @borderShadow,\n    0px @coloredShadowDistance 0px 0px @orangeHover,\n    @shadowHoverBoxShadow\n  ;\n}\n\n/* Yellow */\n.ui.yellow.cards > .card,\n.ui.cards > .yellow.card,\n.ui.yellow.card {\n  box-shadow:\n    @borderShadow,\n    0px @coloredShadowDistance 0px 0px @yellow,\n    @shadowBoxShadow\n  ;\n}\n.ui.yellow.cards > .card:hover,\n.ui.cards > .yellow.card:hover,\n.ui.yellow.card:hover {\n  box-shadow:\n    @borderShadow,\n    0px @coloredShadowDistance 0px 0px @yellowHover,\n    @shadowHoverBoxShadow\n  ;\n}\n\n/* Olive */\n.ui.olive.cards > .card,\n.ui.cards > .olive.card,\n.ui.olive.card {\n  box-shadow:\n    @borderShadow,\n    0px @coloredShadowDistance 0px 0px @olive,\n    @shadowBoxShadow\n  ;\n}\n.ui.olive.cards > .card:hover,\n.ui.cards > .olive.card:hover,\n.ui.olive.card:hover {\n  box-shadow:\n    @borderShadow,\n    0px @coloredShadowDistance 0px 0px @oliveHover,\n    @shadowHoverBoxShadow\n  ;\n}\n\n/* Green */\n.ui.green.cards > .card,\n.ui.cards > .green.card,\n.ui.green.card {\n  box-shadow:\n    @borderShadow,\n    0px @coloredShadowDistance 0px 0px @green,\n    @shadowBoxShadow\n  ;\n}\n.ui.green.cards > .card:hover,\n.ui.cards > .green.card:hover,\n.ui.green.card:hover {\n  box-shadow:\n    @borderShadow,\n    0px @coloredShadowDistance 0px 0px @greenHover,\n    @shadowHoverBoxShadow\n  ;\n}\n\n/* Teal */\n.ui.teal.cards > .card,\n.ui.cards > .teal.card,\n.ui.teal.card {\n  box-shadow:\n    @borderShadow,\n    0px @coloredShadowDistance 0px 0px @teal,\n    @shadowBoxShadow\n  ;\n}\n.ui.teal.cards > .card:hover,\n.ui.cards > .teal.card:hover,\n.ui.teal.card:hover {\n  box-shadow:\n    @borderShadow,\n    0px @coloredShadowDistance 0px 0px @tealHover,\n    @shadowHoverBoxShadow\n  ;\n}\n\n/* Blue */\n.ui.blue.cards > .card,\n.ui.cards > .blue.card,\n.ui.blue.card {\n  box-shadow:\n    @borderShadow,\n    0px @coloredShadowDistance 0px 0px @blue,\n    @shadowBoxShadow\n  ;\n}\n.ui.blue.cards > .card:hover,\n.ui.cards > .blue.card:hover,\n.ui.blue.card:hover {\n  box-shadow:\n    @borderShadow,\n    0px @coloredShadowDistance 0px 0px @blueHover,\n    @shadowHoverBoxShadow\n  ;\n}\n\n/* Violet */\n.ui.violet.cards > .card,\n.ui.cards > .violet.card,\n.ui.violet.card {\n  box-shadow:\n    @borderShadow,\n    0px @coloredShadowDistance 0px 0px @violet,\n    @shadowBoxShadow\n  ;\n}\n.ui.violet.cards > .card:hover,\n.ui.cards > .violet.card:hover,\n.ui.violet.card:hover {\n  box-shadow:\n    @borderShadow,\n    0px @coloredShadowDistance 0px 0px @violetHover,\n    @shadowHoverBoxShadow\n  ;\n}\n\n/* Purple */\n.ui.purple.cards > .card,\n.ui.cards > .purple.card,\n.ui.purple.card {\n  box-shadow:\n    @borderShadow,\n    0px @coloredShadowDistance 0px 0px @purple,\n    @shadowBoxShadow\n  ;\n}\n.ui.purple.cards > .card:hover,\n.ui.cards > .purple.card:hover,\n.ui.purple.card:hover {\n  box-shadow:\n    @borderShadow,\n    0px @coloredShadowDistance 0px 0px @purpleHover,\n    @shadowHoverBoxShadow\n  ;\n}\n\n/* Pink */\n.ui.pink.cards > .card,\n.ui.cards > .pink.card,\n.ui.pink.card {\n  box-shadow:\n    @borderShadow,\n    0px @coloredShadowDistance 0px 0px @pink,\n    @shadowBoxShadow\n  ;\n}\n.ui.pink.cards > .card:hover,\n.ui.cards > .pink.card:hover,\n.ui.pink.card:hover {\n  box-shadow:\n    @borderShadow,\n    0px @coloredShadowDistance 0px 0px @pinkHover,\n    @shadowHoverBoxShadow\n  ;\n}\n\n/* Brown */\n.ui.brown.cards > .card,\n.ui.cards > .brown.card,\n.ui.brown.card {\n  box-shadow:\n    @borderShadow,\n    0px @coloredShadowDistance 0px 0px @brown,\n    @shadowBoxShadow\n  ;\n}\n.ui.brown.cards > .card:hover,\n.ui.cards > .brown.card:hover,\n.ui.brown.card:hover {\n  box-shadow:\n    @borderShadow,\n    0px @coloredShadowDistance 0px 0px @brownHover,\n    @shadowHoverBoxShadow\n  ;\n}\n\n/* Grey */\n.ui.grey.cards > .card,\n.ui.cards > .grey.card,\n.ui.grey.card {\n  box-shadow:\n    @borderShadow,\n    0px @coloredShadowDistance 0px 0px @grey,\n    @shadowBoxShadow\n  ;\n}\n.ui.grey.cards > .card:hover,\n.ui.cards > .grey.card:hover,\n.ui.grey.card:hover {\n  box-shadow:\n    @borderShadow,\n    0px @coloredShadowDistance 0px 0px @greyHover,\n    @shadowHoverBoxShadow\n  ;\n}\n\n/* Black */\n.ui.black.cards > .card,\n.ui.cards > .black.card,\n.ui.black.card {\n  box-shadow:\n    @borderShadow,\n    0px @coloredShadowDistance 0px 0px @black,\n    @shadowBoxShadow\n  ;\n}\n.ui.black.cards > .card:hover,\n.ui.cards > .black.card:hover,\n.ui.black.card:hover {\n  box-shadow:\n    @borderShadow,\n    0px @coloredShadowDistance 0px 0px @blackHover,\n    @shadowHoverBoxShadow\n  ;\n}\n\n/*--------------\n   Card Count\n---------------*/\n\n.ui.one.cards {\n  margin-left: @oneCardOffset;\n  margin-right: @oneCardOffset;\n}\n.ui.one.cards > .card {\n  width: @oneCard;\n}\n\n.ui.two.cards {\n  margin-left: @twoCardOffset;\n  margin-right: @twoCardOffset;\n}\n.ui.two.cards > .card {\n  width: @twoCard;\n  margin-left: @twoCardSpacing;\n  margin-right: @twoCardSpacing;\n}\n\n.ui.three.cards {\n  margin-left: @threeCardOffset;\n  margin-right: @threeCardOffset;\n}\n.ui.three.cards > .card {\n  width: @threeCard;\n  margin-left: @threeCardSpacing;\n  margin-right: @threeCardSpacing;\n}\n\n.ui.four.cards {\n  margin-left: @fourCardOffset;\n  margin-right: @fourCardOffset;\n}\n.ui.four.cards > .card {\n  width: @fourCard;\n  margin-left: @fourCardSpacing;\n  margin-right: @fourCardSpacing;\n}\n\n.ui.five.cards {\n  margin-left: @fiveCardOffset;\n  margin-right: @fiveCardOffset;\n}\n.ui.five.cards > .card {\n  width: @fiveCard;\n  margin-left: @fiveCardSpacing;\n  margin-right: @fiveCardSpacing;\n}\n\n.ui.six.cards {\n  margin-left: @sixCardOffset;\n  margin-right: @sixCardOffset;\n}\n.ui.six.cards > .card {\n  width: @sixCard;\n  margin-left: @sixCardSpacing;\n  margin-right: @sixCardSpacing;\n}\n\n.ui.seven.cards {\n  margin-left: @sevenCardOffset;\n  margin-right: @sevenCardOffset;\n}\n.ui.seven.cards > .card {\n  width: @sevenCard;\n  margin-left: @sevenCardSpacing;\n  margin-right: @sevenCardSpacing;\n}\n\n.ui.eight.cards {\n  margin-left: @eightCardOffset;\n  margin-right: @eightCardOffset;\n}\n.ui.eight.cards > .card {\n  width: @eightCard;\n  margin-left: @eightCardSpacing;\n  margin-right: @eightCardSpacing;\n  font-size: 11px;\n}\n\n.ui.nine.cards {\n  margin-left: @nineCardOffset;\n  margin-right: @nineCardOffset;\n}\n.ui.nine.cards > .card {\n  width: @nineCard;\n  margin-left: @nineCardSpacing;\n  margin-right: @nineCardSpacing;\n  font-size: 10px;\n}\n\n.ui.ten.cards {\n  margin-left: @tenCardOffset;\n  margin-right: @tenCardOffset;\n}\n.ui.ten.cards > .card {\n  width: @tenCard;\n  margin-left: @tenCardSpacing;\n  margin-right: @tenCardSpacing;\n}\n\n\n/*-------------------\n      Doubling\n--------------------*/\n\n/* Mobile Only */\n@media only screen and (max-width : @largestMobileScreen) {\n  .ui.two.doubling.cards {\n    margin-left: @oneCardOffset;\n    margin-right: @oneCardOffset;\n  }\n  .ui.two.doubling.cards > .card {\n    width: @oneCard;\n    margin-left: @oneCardSpacing;\n    margin-right: @oneCardSpacing;\n  }\n  .ui.three.doubling.cards {\n    margin-left: @twoCardOffset;\n    margin-right: @twoCardOffset;\n  }\n  .ui.three.doubling.cards > .card {\n    width: @twoCard;\n    margin-left: @twoCardSpacing;\n    margin-right: @twoCardSpacing;\n  }\n  .ui.four.doubling.cards {\n    margin-left: @twoCardOffset;\n    margin-right: @twoCardOffset;\n  }\n  .ui.four.doubling.cards > .card {\n    width: @twoCard;\n    margin-left: @twoCardSpacing;\n    margin-right: @twoCardSpacing;\n  }\n  .ui.five.doubling.cards {\n    margin-left: @twoCardOffset;\n    margin-right: @twoCardOffset;\n  }\n  .ui.five.doubling.cards > .card {\n    width: @twoCard;\n    margin-left: @twoCardSpacing;\n    margin-right: @twoCardSpacing;\n  }\n  .ui.six.doubling.cards {\n    margin-left: @twoCardOffset;\n    margin-right: @twoCardOffset;\n  }\n  .ui.six.doubling.cards > .card {\n    width: @twoCard;\n    margin-left: @twoCardSpacing;\n    margin-right: @twoCardSpacing;\n  }\n  .ui.seven.doubling.cards {\n    margin-left: @threeCardOffset;\n    margin-right: @threeCardOffset;\n  }\n  .ui.seven.doubling.cards > .card {\n    width: @threeCard;\n    margin-left: @threeCardSpacing;\n    margin-right: @threeCardSpacing;\n  }\n  .ui.eight.doubling.cards {\n    margin-left: @threeCardOffset;\n    margin-right: @threeCardOffset;\n  }\n  .ui.eight.doubling.cards > .card {\n    width: @threeCard;\n    margin-left: @threeCardSpacing;\n    margin-right: @threeCardSpacing;\n  }\n  .ui.nine.doubling.cards {\n    margin-left: @threeCardOffset;\n    margin-right: @threeCardOffset;\n  }\n  .ui.nine.doubling.cards > .card {\n    width: @threeCard;\n    margin-left: @threeCardSpacing;\n    margin-right: @threeCardSpacing;\n  }\n  .ui.ten.doubling.cards {\n    margin-left: @threeCardOffset;\n    margin-right: @threeCardOffset;\n  }\n  .ui.ten.doubling.cards > .card {\n    width: @threeCard;\n    margin-left: @threeCardSpacing;\n    margin-right: @threeCardSpacing;\n  }\n}\n\n/* Tablet Only */\n@media only screen and (min-width : @tabletBreakpoint) and (max-width : @largestTabletScreen) {\n  .ui.two.doubling.cards {\n    margin-left: @oneCardOffset;\n    margin-right: @oneCardOffset;\n  }\n  .ui.two.doubling.cards > .card {\n    width: @oneCard;\n    margin-left: @oneCardSpacing;\n    margin-right: @oneCardSpacing;\n  }\n  .ui.three.doubling.cards {\n    margin-left: @twoCardOffset;\n    margin-right: @twoCardOffset;\n  }\n  .ui.three.doubling.cards > .card {\n    width: @twoCard;\n    margin-left: @twoCardSpacing;\n    margin-right: @twoCardSpacing;\n  }\n  .ui.four.doubling.cards {\n    margin-left: @twoCardOffset;\n    margin-right: @twoCardOffset;\n  }\n  .ui.four.doubling.cards > .card {\n    width: @twoCard;\n    margin-left: @twoCardSpacing;\n    margin-right: @twoCardSpacing;\n  }\n  .ui.five.doubling.cards {\n    margin-left: @threeCardOffset;\n    margin-right: @threeCardOffset;\n  }\n  .ui.five.doubling.cards > .card {\n    width: @threeCard;\n    margin-left: @threeCardSpacing;\n    margin-right: @threeCardSpacing;\n  }\n  .ui.six.doubling.cards {\n    margin-left: @threeCardOffset;\n    margin-right: @threeCardOffset;\n  }\n  .ui.six.doubling.cards > .card {\n    width: @threeCard;\n    margin-left: @threeCardSpacing;\n    margin-right: @threeCardSpacing;\n  }\n  .ui.eight.doubling.cards {\n    margin-left: @threeCardOffset;\n    margin-right: @threeCardOffset;\n  }\n  .ui.eight.doubling.cards > .card {\n    width: @threeCard;\n    margin-left: @threeCardSpacing;\n    margin-right: @threeCardSpacing;\n  }\n  .ui.eight.doubling.cards {\n    margin-left: @fourCardOffset;\n    margin-right: @fourCardOffset;\n  }\n  .ui.eight.doubling.cards > .card {\n    width: @fourCard;\n    margin-left: @fourCardSpacing;\n    margin-right: @fourCardSpacing;\n  }\n  .ui.nine.doubling.cards {\n    margin-left: @fourCardOffset;\n    margin-right: @fourCardOffset;\n  }\n  .ui.nine.doubling.cards > .card {\n    width: @fourCard;\n    margin-left: @fourCardSpacing;\n    margin-right: @fourCardSpacing;\n  }\n  .ui.ten.doubling.cards {\n    margin-left: @fiveCardOffset;\n    margin-right: @fiveCardOffset;\n  }\n  .ui.ten.doubling.cards > .card {\n    width: @fiveCard;\n    margin-left: @fiveCardSpacing;\n    margin-right: @fiveCardSpacing;\n  }\n}\n\n/*-------------------\n      Stackable\n--------------------*/\n\n@media only screen and (max-width : @largestMobileScreen) {\n  .ui.stackable.cards {\n    display: block !important;\n  }\n  .ui.stackable.cards .card:first-child {\n    margin-top: 0em !important;\n  }\n  .ui.stackable.cards > .card {\n    display: block !important;\n    height: auto !important;\n    margin: @stackableRowSpacing @stackableCardSpacing;\n    padding: 0 !important;\n    width: @stackableMargin !important;\n  }\n}\n\n\n/*--------------\n      Size\n---------------*/\n\n.ui.cards > .card {\n  font-size: @medium;\n}\n\n.loadUIOverrides();\n"
  },
  {
    "path": "semantic/src/definitions/views/comment.less",
    "content": "/*!\n * # Semantic UI - Comment\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n\n/*******************************\n            Theme\n*******************************/\n\n@type    : 'view';\n@element : 'comment';\n\n@import (multiple) '../../theme.config';\n\n/*******************************\n            Standard\n*******************************/\n\n\n/*--------------\n    Comments\n---------------*/\n\n.ui.comments {\n  margin: @margin;\n  max-width: @maxWidth;\n}\n\n.ui.comments:first-child {\n  margin-top: 0em;\n}\n.ui.comments:last-child {\n  margin-bottom: 0em;\n}\n\n/*--------------\n     Comment\n---------------*/\n\n.ui.comments .comment {\n  position: relative;\n  background: @commentBackground;\n  margin: @commentMargin;\n  padding: @commentPadding;\n  border: @commentBorder;\n  border-top: @commentDivider;\n  line-height: @commentLineHeight;\n}\n.ui.comments .comment:first-child {\n  margin-top: @firstCommentMargin;\n  padding-top: @firstCommentPadding;\n}\n\n\n/*--------------------\n    Nested Comments\n---------------------*/\n\n.ui.comments .comment .comments {\n  margin: @nestedCommentsMargin;\n  padding: @nestedCommentsPadding;\n}\n.ui.comments .comment .comments:before{\n  position: absolute;\n  top: 0px;\n  left: 0px;\n}\n.ui.comments .comment .comments .comment {\n  border: @nestedCommentBorder;\n  border-top: @nestedCommentDivider;\n  background: @nestedCommentBackground;\n}\n\n/*--------------\n     Avatar\n---------------*/\n\n.ui.comments .comment .avatar {\n  display: @avatarDisplay;\n  width: @avatarWidth;\n  height: @avatarHeight;\n  float: @avatarFloat;\n  margin: @avatarMargin;\n}\n.ui.comments .comment img.avatar,\n.ui.comments .comment .avatar img {\n  display: block;\n  margin: 0em auto;\n  width: 100%;\n  height: 100%;\n  border-radius: @avatarBorderRadius;\n}\n\n/*--------------\n     Content\n---------------*/\n\n.ui.comments .comment > .content {\n  display: block;\n}\n/* If there is an avatar move content over */\n.ui.comments .comment > .avatar ~ .content {\n  margin-left: @contentMargin;\n}\n\n/*--------------\n     Author\n---------------*/\n\n.ui.comments .comment .author {\n  font-size: @authorFontSize;\n  color: @authorColor;\n  font-weight: @authorFontWeight;\n}\n.ui.comments .comment a.author {\n  cursor: pointer;\n}\n.ui.comments .comment a.author:hover {\n  color: @authorHoverColor;\n}\n\n/*--------------\n     Metadata\n---------------*/\n\n.ui.comments .comment .metadata {\n  display: @metadataDisplay;\n  margin-left: @metadataSpacing;\n  color: @metadataColor;\n  font-size: @metadataFontSize;\n}\n.ui.comments .comment .metadata > * {\n  display: inline-block;\n  margin: 0em @metadataContentSpacing 0em 0em;\n}\n.ui.comments .comment .metadata > :last-child {\n  margin-right: 0em;\n}\n\n/*--------------------\n     Comment Text\n---------------------*/\n\n.ui.comments .comment .text {\n  margin: @textMargin;\n  font-size: @textFontSize;\n  word-wrap: @textWordWrap;\n  color: @textColor;\n  line-height: @textLineHeight;\n}\n\n\n/*--------------------\n     User Actions\n---------------------*/\n\n.ui.comments .comment .actions {\n  font-size: @actionFontSize;\n}\n.ui.comments .comment .actions a {\n  cursor: pointer;\n  display: inline-block;\n  margin: 0em @actionContentDistance 0em 0em;\n  color: @actionLinkColor;\n}\n.ui.comments .comment .actions a:last-child {\n  margin-right: 0em;\n}\n.ui.comments .comment .actions a.active,\n.ui.comments .comment .actions a:hover {\n  color: @actionLinkHoverColor;\n}\n\n/*--------------------\n      Reply Form\n---------------------*/\n\n.ui.comments > .reply.form {\n  margin-top: @replyDistance;\n}\n.ui.comments .comment .reply.form {\n  width: 100%;\n  margin-top: @commentReplyDistance;\n}\n.ui.comments .reply.form textarea {\n  font-size: @replyFontSize;\n  height: @replyHeight;\n}\n\n/*******************************\n            State\n*******************************/\n\n.ui.collapsed.comments,\n.ui.comments .collapsed.comments,\n.ui.comments .collapsed.comment {\n  display: none;\n}\n\n\n/*******************************\n           Variations\n*******************************/\n\n/*--------------------\n        Threaded\n---------------------*/\n\n.ui.threaded.comments .comment .comments {\n  margin: @threadedCommentMargin;\n  padding: @threadedCommentPadding;\n  box-shadow: @threadedCommentBoxShadow;\n}\n\n/*--------------------\n        Minimal\n---------------------*/\n\n.ui.minimal.comments .comment .actions {\n  opacity: 0;\n  position: @minimalActionPosition;\n  top: @minimalActionTop;\n  right: @minimalActionRight;\n  left: @minimalActionLeft;\n  transition: @minimalTransition;\n  transition-delay: @minimalTransitionDelay;\n}\n.ui.minimal.comments .comment > .content:hover > .actions {\n  opacity: 1;\n}\n\n\n/*-------------------\n        Sizes\n--------------------*/\n\n.ui.mini.comments {\n  font-size: @mini;\n}\n.ui.tiny.comments {\n  font-size: @tiny;\n}\n.ui.small.comments {\n  font-size: @small;\n}\n.ui.comments {\n  font-size: @medium;\n}\n.ui.large.comments {\n  font-size: @large;\n}\n.ui.big.comments {\n  font-size: @big;\n}\n.ui.huge.comments {\n  font-size: @huge;\n}\n.ui.massive.comments {\n  font-size: @massive;\n}\n\n\n.loadUIOverrides();\n"
  },
  {
    "path": "semantic/src/definitions/views/feed.less",
    "content": "/*!\n * # Semantic UI - Feed\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n/*******************************\n            Theme\n*******************************/\n\n@type    : 'view';\n@element : 'feed';\n\n@import (multiple) '../../theme.config';\n\n/*******************************\n         Activity Feed\n*******************************/\n\n.ui.feed {\n  margin: @margin;\n}\n.ui.feed:first-child {\n  margin-top: 0em;\n}\n.ui.feed:last-child {\n  margin-bottom: 0em;\n}\n\n\n/*******************************\n            Content\n*******************************/\n\n/* Event */\n.ui.feed > .event {\n  display: flex;\n  flex-direction: row;\n  width: @eventWidth;\n  padding: @eventPadding;\n  margin: @eventMargin;\n  background: @eventBackground;\n  border-top: @eventDivider;\n}\n.ui.feed > .event:first-child {\n  border-top: 0px;\n  padding-top: 0em;\n}\n.ui.feed > .event:last-child {\n  padding-bottom: 0em;\n}\n\n/* Event Label */\n.ui.feed > .event > .label {\n  display: block;\n  flex: 0 0 auto;\n  width: @labelWidth;\n  height: @labelHeight;\n  align-self: @labelAlignSelf;\n  text-align: @labelTextAlign;\n}\n.ui.feed > .event > .label .icon {\n  opacity: @iconLabelOpacity;\n  font-size: @iconLabelSize;\n  width: @iconLabelWidth;\n  padding: @iconLabelPadding;\n  background: @iconLabelBackground;\n  border: @iconLabelBorder;\n  border-radius: @iconLabelBorderRadius;\n  color: @iconLabelColor;\n}\n.ui.feed > .event > .label img {\n  width: @imageLabelWidth;\n  height: @imageLabelHeight;\n  border-radius: @imageLabelBorderRadius;\n}\n.ui.feed > .event > .label + .content {\n  margin: @labeledContentMargin;\n}\n\n/*--------------\n     Content\n---------------*/\n\n/* Content */\n.ui.feed > .event > .content {\n  display: block;\n  flex: 1 1 auto;\n  align-self: @contentAlignSelf;\n  text-align: @contentTextAlign;\n  word-wrap: @contentWordWrap;\n}\n.ui.feed > .event:last-child > .content {\n  padding-bottom: @lastLabeledContentPadding;\n}\n\n/* Link */\n.ui.feed > .event > .content a {\n  cursor: pointer;\n}\n\n/*--------------\n      Date\n---------------*/\n\n.ui.feed > .event > .content .date {\n  margin: @dateMargin;\n  padding: @datePadding;\n  color: @dateColor;\n  font-weight: @dateFontWeight;\n  font-size: @dateFontSize;\n  font-style: @dateFontStyle;\n  color: @dateColor;\n}\n\n/*--------------\n     Summary\n---------------*/\n\n.ui.feed > .event > .content .summary {\n  margin: @summaryMargin;\n  font-size: @summaryFontSize;\n  font-weight: @summaryFontWeight;\n  color: @summaryColor;\n}\n\n/* Summary Image */\n.ui.feed > .event > .content .summary img {\n  display: inline-block;\n  width: @summaryImageWidth;\n  height: @summaryImageHeight;\n  margin: @summaryImageMargin;\n  border-radius: @summaryImageBorderRadius;\n  vertical-align: @summaryImageVerticalAlign;\n}\n/*--------------\n      User\n---------------*/\n\n.ui.feed > .event > .content .user {\n  display: inline-block;\n  font-weight: @userFontWeight;\n  margin-right: @userDistance;\n  vertical-align: baseline;\n}\n.ui.feed > .event > .content .user img {\n  margin: @userImageMargin;\n  width: @userImageWidth;\n  height: @userImageHeight;\n  vertical-align: @userImageVerticalAlign;\n}\n/*--------------\n   Inline Date\n---------------*/\n\n/* Date inside Summary */\n.ui.feed > .event > .content .summary > .date {\n  display: @summaryDateDisplay;\n  float: @summaryDateFloat;\n  font-weight: @summaryDateFontWeight;\n  font-size: @summaryDateFontSize;\n  font-style: @summaryDateFontStyle;\n  margin: @summaryDateMargin;\n  padding: @summaryDatePadding;\n  color: @summaryDateColor;\n}\n\n/*--------------\n  Extra Summary\n---------------*/\n\n.ui.feed > .event > .content .extra {\n  margin: @extraMargin;\n  background: @extraBackground;\n  padding: @extraPadding;\n  color: @extraColor;\n}\n\n/* Images */\n.ui.feed > .event > .content .extra.images img {\n  display: inline-block;\n  margin: @extraImageMargin;\n  width: @extraImageWidth;\n}\n\n/* Text */\n.ui.feed > .event > .content .extra.text {\n  padding: @extraTextPadding;\n  border-left: @extraTextPointer;\n  font-size: @extraTextFontSize;\n  max-width: @extraTextMaxWidth;\n  line-height: @extraTextLineHeight;\n}\n\n/*--------------\n      Meta\n---------------*/\n\n.ui.feed > .event > .content .meta {\n  display: @metadataDisplay;\n  font-size: @metadataFontSize;\n  margin: @metadataMargin;\n  background: @metadataBackground;\n  border: @metadataBorder;\n  border-radius: @metadataBorderRadius;\n  box-shadow: @metadataBoxShadow;\n  padding: @metadataPadding;\n  color: @metadataColor;\n}\n\n.ui.feed > .event > .content .meta > * {\n  position: relative;\n  margin-left: @metadataElementSpacing;\n}\n.ui.feed > .event > .content .meta > *:after {\n  content: @metadataDivider;\n  color: @metadataDividerColor;\n  top: 0em;\n  left: @metadataDividerOffset;\n  opacity: 1;\n  position: absolute;\n  vertical-align: top;\n}\n\n.ui.feed > .event > .content .meta .like {\n  color: @likeColor;\n  transition: @likeTransition;\n}\n.ui.feed > .event > .content .meta .like:hover .icon {\n  color: @likeHoverColor;\n}\n.ui.feed > .event > .content .meta .active.like .icon {\n  color: @likeActiveColor;\n}\n\n/* First element */\n.ui.feed > .event > .content .meta > :first-child {\n  margin-left: 0em;\n}\n.ui.feed > .event > .content .meta > :first-child::after {\n  display: none;\n}\n\n/* Action */\n.ui.feed > .event > .content .meta a,\n.ui.feed > .event > .content .meta > .icon {\n  cursor: @metadataActionCursor;\n  opacity: @metadataActionOpacity;\n  color: @metadataActionColor;\n  transition: @metadataActionTransition;\n}\n.ui.feed > .event > .content .meta a:hover,\n.ui.feed > .event > .content .meta a:hover .icon,\n.ui.feed > .event > .content .meta > .icon:hover {\n  color: @metadataActionHoverColor;\n}\n\n\n\n/*******************************\n            Variations\n*******************************/\n\n.ui.small.feed {\n  font-size: @small;\n}\n.ui.feed {\n  font-size: @medium;\n}\n.ui.large.feed {\n  font-size: @large;\n}\n\n.loadUIOverrides();\n"
  },
  {
    "path": "semantic/src/definitions/views/item.less",
    "content": "/*!\n * # Semantic UI - Item\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n/*******************************\n            Theme\n*******************************/\n\n@type    : 'view';\n@element : 'item';\n\n@import (multiple) '../../theme.config';\n\n/*******************************\n            Standard\n*******************************/\n\n/*--------------\n      Item\n---------------*/\n\n.ui.items > .item {\n  display: @display;\n  margin: @itemSpacing 0em;\n  width: @width;\n  min-height: @minHeight;\n  background: @background;\n  padding: @padding;\n\n  border: @border;\n  border-radius: @borderRadius;\n  box-shadow: @boxShadow;\n  transition: @transition;\n  z-index: @zIndex;\n}\n.ui.items > .item a {\n  cursor: pointer;\n}\n\n/*--------------\n      Items\n---------------*/\n\n.ui.items {\n  margin: @groupMargin;\n}\n\n.ui.items:first-child {\n  margin-top: 0em !important;\n}\n.ui.items:last-child {\n  margin-bottom: 0em !important;\n}\n\n/*--------------\n      Item\n---------------*/\n\n.ui.items > .item:after {\n  display: block;\n  content: ' ';\n  height: 0px;\n  clear: both;\n  overflow: hidden;\n  visibility: hidden;\n}\n.ui.items > .item:first-child {\n  margin-top: 0em;\n}\n.ui.items > .item:last-child {\n  margin-bottom: 0em;\n}\n\n\n\n/*--------------\n     Images\n---------------*/\n\n.ui.items > .item > .image {\n  position: relative;\n  flex: 0 0 auto;\n  display: @imageDisplay;\n  float: @imageFloat;\n  margin: @imageMargin;\n  padding: @imagePadding;\n  max-height: @imageMaxHeight;\n  align-self: @imageVerticalAlign;\n}\n.ui.items > .item > .image > img {\n  display: block;\n  width: 100%;\n  height: auto;\n  border-radius: @imageBorderRadius;\n  border: @imageBorder;\n}\n\n.ui.items > .item > .image:only-child > img {\n  border-radius: @borderRadius;\n}\n\n\n/*--------------\n     Content\n---------------*/\n\n.ui.items > .item > .content {\n  display: block;\n  flex: 1 1 auto;\n  background: @contentBackground;\n  margin: @contentMargin;\n  padding: @contentPadding;\n  box-shadow: @contentBoxShadow;\n  font-size: @contentFontSize;\n  border: @contentBorder;\n  border-radius: @contentBorderRadius;\n}\n.ui.items > .item > .content:after {\n  display: block;\n  content: ' ';\n  height: 0px;\n  clear: both;\n  overflow: hidden;\n  visibility: hidden;\n}\n\n.ui.items > .item > .image + .content {\n  min-width: 0;\n  width: @contentWidth;\n  display: @contentDisplay;\n  margin-left: @contentOffset;\n  align-self: @contentVerticalAlign;\n  padding-left: @contentImageDistance;\n}\n\n.ui.items > .item > .content > .header {\n  display: inline-block;\n  margin: @headerMargin;\n  font-family: @headerFont;\n  font-weight: @headerFontWeight;\n  color: @headerColor;\n}\n/* Default Header Size */\n.ui.items > .item > .content > .header:not(.ui) {\n  font-size: @headerFontSize;\n}\n\n/*--------------\n     Floated\n---------------*/\n\n.ui.items > .item [class*=\"left floated\"] {\n  float: left;\n}\n.ui.items > .item [class*=\"right floated\"] {\n  float: right;\n}\n\n\n/*--------------\n  Content Image\n---------------*/\n\n.ui.items > .item .content img {\n  align-self: @contentImageVerticalAlign;\n  width: @contentImageWidth;\n}\n.ui.items > .item img.avatar,\n.ui.items > .item .avatar img {\n  width: @avatarSize;\n  height: @avatarSize;\n  border-radius: @avatarBorderRadius;\n}\n\n\n/*--------------\n   Description\n---------------*/\n\n.ui.items > .item > .content > .description {\n  margin-top: @descriptionDistance;\n  max-width: @descriptionMaxWidth;\n  font-size: @descriptionFontSize;\n  line-height: @descriptionLineHeight;\n  color: @descriptionColor;\n}\n\n/*--------------\n    Paragraph\n---------------*/\n\n.ui.items > .item > .content p {\n  margin: 0em 0em @paragraphDistance;\n}\n.ui.items > .item > .content p:last-child {\n  margin-bottom: 0em;\n}\n\n/*--------------\n      Meta\n---------------*/\n\n.ui.items > .item .meta {\n  margin: @metaMargin;\n  font-size: @metaFontSize;\n  line-height: @metaLineHeight;\n  color: @metaColor;\n}\n.ui.items > .item .meta * {\n  margin-right: @metaSpacing;\n}\n.ui.items > .item .meta :last-child {\n  margin-right: 0em;\n}\n\n.ui.items > .item .meta [class*=\"right floated\"] {\n  margin-right: 0em;\n  margin-left: @metaSpacing;\n}\n\n/*--------------\n      Links\n---------------*/\n\n/* Generic */\n.ui.items > .item > .content a:not(.ui) {\n  color: @contentLinkColor;\n  transition: @contentLinkTransition;\n}\n.ui.items > .item > .content a:not(.ui):hover {\n  color: @contentLinkHoverColor;\n}\n\n/* Header */\n.ui.items > .item > .content > a.header {\n  color: @headerLinkColor;\n}\n.ui.items > .item > .content > a.header:hover {\n  color: @headerLinkHoverColor;\n}\n\n/* Meta */\n.ui.items > .item .meta > a:not(.ui) {\n  color: @metaLinkColor;\n}\n.ui.items > .item .meta > a:not(.ui):hover {\n  color: @metaLinkHoverColor;\n}\n\n\n\n/*--------------\n     Labels\n---------------*/\n\n/*-----Star----- */\n\n/* Icon */\n.ui.items > .item > .content .favorite.icon {\n  cursor: pointer;\n  opacity: @actionOpacity;\n  transition: @actionTransition;\n}\n.ui.items > .item > .content .favorite.icon:hover {\n  opacity: @actionHoverOpacity;\n  color: @favoriteColor;\n}\n.ui.items > .item > .content .active.favorite.icon {\n  color: @favoriteActiveColor;\n}\n\n/*-----Like----- */\n\n/* Icon */\n.ui.items > .item > .content .like.icon {\n  cursor: pointer;\n  opacity: @actionOpacity;\n  transition: @actionTransition;\n}\n.ui.items > .item > .content .like.icon:hover {\n  opacity: @actionHoverOpacity;\n  color: @likeColor;\n}\n.ui.items > .item > .content .active.like.icon {\n  color: @likeActiveColor;\n}\n\n/*----------------\n  Extra Content\n-----------------*/\n\n.ui.items > .item .extra {\n  display: @extraDisplay;\n  position: @extraPosition;\n  background: @extraBackground;\n  margin: @extraMargin;\n  width: @extraWidth;\n  padding: @extraPadding;\n  top: @extraTop;\n  left: @extraLeft;\n  color: @extraColor;\n  box-shadow: @extraBoxShadow;\n  transition: @extraTransition;\n  border-top: @extraDivider;\n}\n.ui.items > .item .extra > * {\n  margin: (@extraRowSpacing / 2) @extraHorizontalSpacing (@extraRowSpacing / 2) 0em;\n}\n.ui.items > .item .extra > [class*=\"right floated\"] {\n  margin: (@extraRowSpacing / 2) 0em (@extraRowSpacing / 2) @extraHorizontalSpacing;\n}\n\n.ui.items > .item .extra:after {\n  display: block;\n  content: ' ';\n  height: 0px;\n  clear: both;\n  overflow: hidden;\n  visibility: hidden;\n}\n\n\n/*******************************\n          Responsive\n*******************************/\n\n/* Default Image Width */\n.ui.items > .item > .image:not(.ui) {\n  width: @imageWidth;\n}\n\n\n/* Tablet Only */\n@media only screen and (min-width: @tabletBreakpoint) and (max-width: @largestTabletScreen) {\n  .ui.items > .item {\n    margin: @tabletItemSpacing 0em;\n  }\n  .ui.items > .item > .image:not(.ui) {\n    width: @tabletImageWidth;\n  }\n  .ui.items > .item > .image + .content {\n    display: block;\n    padding: 0em 0em 0em @tabletContentImageDistance;\n  }\n\n}\n\n/* Mobile Only */\n@media only screen and (max-width: @largestMobileScreen) {\n  .ui.items:not(.unstackable) > .item {\n    flex-direction: column;\n    margin: @mobileItemSpacing 0em;\n  }\n  .ui.items:not(.unstackable) > .item > .image {\n    display: block;\n    margin-left: auto;\n    margin-right: auto;\n  }\n  .ui.items:not(.unstackable) > .item > .image,\n  .ui.items:not(.unstackable) > .item > .image > img {\n    max-width: 100% !important;\n    width: @mobileImageWidth !important;\n    max-height: @mobileImageMaxHeight !important;\n  }\n  .ui.items:not(.unstackable) > .item > .image + .content {\n    display: block;\n    padding: @mobileContentImageDistance 0em 0em;\n  }\n}\n\n\n/*******************************\n           Variations\n*******************************/\n\n\n/*-------------------\n       Aligned\n--------------------*/\n\n.ui.items > .item > .image + [class*=\"top aligned\"].content {\n  align-self: flex-start;\n}\n.ui.items > .item > .image + [class*=\"middle aligned\"].content {\n  align-self: center;\n}\n.ui.items > .item > .image + [class*=\"bottom aligned\"].content {\n  align-self: flex-end;\n}\n\n\n/*--------------\n     Relaxed\n---------------*/\n\n.ui.relaxed.items > .item {\n  margin: @relaxedItemSpacing 0em;\n}\n.ui[class*=\"very relaxed\"].items > .item {\n  margin: @veryRelaxedItemSpacing 0em;\n}\n\n\n/*-------------------\n      Divided\n--------------------*/\n\n.ui.divided.items > .item {\n  border-top: @dividedBorder;\n  margin: @dividedMargin;\n  padding: @dividedPadding;\n}\n.ui.divided.items > .item:first-child {\n  border-top: none;\n  margin-top: @dividedFirstLastMargin !important;\n  padding-top: @dividedFirstLastPadding !important;\n}\n.ui.divided.items > .item:last-child {\n  margin-bottom: @dividedFirstLastMargin !important;\n  padding-bottom: @dividedFirstLastPadding !important;\n}\n\n/* Relaxed Divided */\n.ui.relaxed.divided.items > .item {\n  margin: 0em;\n  padding: @relaxedItemSpacing 0em;\n}\n.ui[class*=\"very relaxed\"].divided.items > .item {\n  margin: 0em;\n  padding: @veryRelaxedItemSpacing 0em;\n}\n\n\n/*-------------------\n        Link\n--------------------*/\n\n.ui.items a.item:hover,\n.ui.link.items > .item:hover {\n  cursor: pointer;\n}\n\n.ui.items a.item:hover .content .header,\n.ui.link.items > .item:hover .content .header {\n  color: @headerLinkHoverColor;\n}\n\n\n/*--------------\n      Size\n---------------*/\n\n.ui.items > .item {\n  font-size: @relativeMedium;\n}\n\n/*---------------\n   Unstackable\n----------------*/\n\n@media only screen and (max-width: @largestMobileScreen) {\n  .ui.unstackable.items > .item > .image,\n  .ui.unstackable.items > .item > .image > img {\n    width: @unstackableMobileImageWidth !important;\n  }\n}\n\n.loadUIOverrides();\n"
  },
  {
    "path": "semantic/src/definitions/views/statistic.less",
    "content": "/*!\n * # Semantic UI - Statistic\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n/*******************************\n            Theme\n*******************************/\n\n@type    : 'view';\n@element : 'statistic';\n\n@import (multiple) '../../theme.config';\n\n/*******************************\n           Statistic\n*******************************/\n\n/* Standalone */\n.ui.statistic {\n  display: inline-flex;\n  flex-direction: column;\n  margin: @margin;\n  max-width: @maxWidth;\n}\n\n.ui.statistic + .ui.statistic {\n  margin: 0em 0em 0em @horizontalSpacing;\n}\n\n.ui.statistic:first-child {\n  margin-top: 0em;\n}\n.ui.statistic:last-child {\n  margin-bottom: 0em;\n}\n\n\n\n/*******************************\n            Group\n*******************************/\n\n/* Grouped */\n.ui.statistics {\n  display: flex;\n  align-items: flex-start;\n  flex-wrap: wrap;\n}\n.ui.statistics > .statistic {\n  display: inline-flex;\n  flex: 0 1 auto;\n  flex-direction: column;\n  margin: @elementMargin;\n  max-width: @elementMaxWidth;\n}\n.ui.statistics {\n  display: flex;\n  margin: @groupMargin;\n}\n\n/* Clearing */\n.ui.statistics:after {\n  display: block;\n  content: ' ';\n  height: 0px;\n  clear: both;\n  overflow: hidden;\n  visibility: hidden;\n}\n\n.ui.statistics:first-child {\n  margin-top: 0em;\n}\n.ui.statistics:last-child {\n  margin-bottom: 0em;\n}\n\n\n/*******************************\n            Content\n*******************************/\n\n\n/*--------------\n      Value\n---------------*/\n\n.ui.statistics .statistic > .value,\n.ui.statistic > .value {\n  font-family: @valueFont;\n  font-size: @valueSize;\n  font-weight: @valueFontWeight;\n  line-height: @valueLineHeight;\n  color: @valueColor;\n  text-transform: @valueTextTransform;\n  text-align: @textAlign;\n}\n\n/*--------------\n     Label\n---------------*/\n\n.ui.statistics .statistic > .label,\n.ui.statistic > .label {\n  font-family: @labelFont;\n  font-size: @labelSize;\n  font-weight: @labelFontWeight;\n  color: @labelColor;\n  text-transform: @labelTextTransform;\n  text-align: @textAlign;\n}\n\n/* Top Label */\n.ui.statistics .statistic > .label ~ .value,\n.ui.statistic > .label ~ .value {\n  margin-top: @topLabelDistance;\n}\n\n/* Bottom Label */\n.ui.statistics .statistic > .value ~ .label,\n.ui.statistic > .value ~ .label {\n  margin-top: @bottomLabelDistance;\n}\n\n\n\n/*******************************\n             Types\n*******************************/\n\n/*--------------\n   Icon Value\n---------------*/\n\n.ui.statistics .statistic > .value .icon,\n.ui.statistic > .value .icon {\n  opacity: 1;\n  width: auto;\n  margin: 0em;\n}\n\n/*--------------\n   Text Value\n---------------*/\n\n.ui.statistics .statistic > .text.value,\n.ui.statistic > .text.value {\n  line-height: @textValueLineHeight;\n  min-height: @textValueMinHeight;\n  font-weight: @textValueFontWeight;\n  text-align: center;\n}\n.ui.statistics .statistic > .text.value + .label,\n.ui.statistic > .text.value + .label {\n  text-align: center;\n}\n\n/*--------------\n   Image Value\n---------------*/\n\n.ui.statistics .statistic > .value img,\n.ui.statistic > .value img {\n  max-height: @imageHeight;\n  vertical-align: @imageVerticalAlign;\n}\n\n\n\n/*******************************\n            Variations\n*******************************/\n\n\n/*--------------\n      Count\n---------------*/\n\n\n.ui.ten.statistics {\n  margin: @itemGroupMargin;\n}\n.ui.ten.statistics .statistic {\n  min-width: @tenColumn;\n  margin: @itemMargin;\n}\n\n.ui.nine.statistics {\n  margin: @itemGroupMargin;\n}\n.ui.nine.statistics .statistic {\n  min-width: @nineColumn;\n  margin: @itemMargin;\n}\n\n.ui.eight.statistics {\n  margin: @itemGroupMargin;\n}\n.ui.eight.statistics .statistic {\n  min-width: @eightColumn;\n  margin: @itemMargin;\n}\n\n.ui.seven.statistics {\n  margin: @itemGroupMargin;\n}\n.ui.seven.statistics .statistic {\n  min-width: @sevenColumn;\n  margin: @itemMargin;\n}\n\n.ui.six.statistics {\n  margin: @itemGroupMargin;\n}\n.ui.six.statistics .statistic {\n  min-width: @sixColumn;\n  margin: @itemMargin;\n}\n\n.ui.five.statistics {\n  margin: @itemGroupMargin;\n}\n.ui.five.statistics .statistic {\n  min-width: @fiveColumn;\n  margin: @itemMargin;\n}\n\n.ui.four.statistics {\n  margin: @itemGroupMargin;\n}\n.ui.four.statistics .statistic {\n  min-width: @fourColumn;\n  margin: @itemMargin;\n}\n\n.ui.three.statistics {\n  margin: @itemGroupMargin;\n}\n.ui.three.statistics .statistic {\n  min-width: @threeColumn;\n  margin: @itemMargin;\n}\n\n.ui.two.statistics {\n  margin: @itemGroupMargin;\n}\n.ui.two.statistics .statistic {\n  min-width: @twoColumn;\n  margin: @itemMargin;\n}\n\n.ui.one.statistics {\n  margin: @itemGroupMargin;\n}\n.ui.one.statistics .statistic {\n  min-width: @oneColumn;\n  margin: @itemMargin;\n}\n\n\n\n\n/*--------------\n   Horizontal\n---------------*/\n\n.ui.horizontal.statistic {\n  flex-direction: row;\n  align-items: center;\n}\n.ui.horizontal.statistics {\n  flex-direction: column;\n  margin: 0em;\n  max-width: none;\n}\n.ui.horizontal.statistics .statistic {\n  flex-direction: row;\n  align-items: center;\n  max-width: none;\n  margin: @horizontalGroupElementMargin;\n}\n\n.ui.horizontal.statistic > .text.value,\n.ui.horizontal.statistics > .statistic > .text.value {\n  min-height: 0em !important;\n}\n.ui.horizontal.statistics .statistic > .value .icon,\n.ui.horizontal.statistic > .value .icon {\n  width: @iconWidth;\n}\n\n.ui.horizontal.statistics .statistic > .value,\n.ui.horizontal.statistic > .value {\n  display: inline-block;\n  vertical-align: middle;\n}\n.ui.horizontal.statistics .statistic > .label,\n.ui.horizontal.statistic > .label {\n  display: inline-block;\n  vertical-align: middle;\n  margin: 0em 0em 0em @horizontalLabelDistance;\n}\n\n/*--------------\n     Colors\n---------------*/\n\n.ui.red.statistics .statistic > .value,\n.ui.statistics .red.statistic > .value,\n.ui.red.statistic > .value {\n  color: @red;\n}\n.ui.orange.statistics .statistic > .value,\n.ui.statistics .orange.statistic > .value,\n.ui.orange.statistic > .value {\n  color: @orange;\n}\n.ui.yellow.statistics .statistic > .value,\n.ui.statistics .yellow.statistic > .value,\n.ui.yellow.statistic > .value {\n  color: @yellow;\n}\n.ui.olive.statistics .statistic > .value,\n.ui.statistics .olive.statistic > .value,\n.ui.olive.statistic > .value {\n  color: @olive;\n}\n.ui.green.statistics .statistic > .value,\n.ui.statistics .green.statistic > .value,\n.ui.green.statistic > .value {\n  color: @green;\n}\n.ui.teal.statistics .statistic > .value,\n.ui.statistics .teal.statistic > .value,\n.ui.teal.statistic > .value {\n  color: @teal;\n}\n.ui.blue.statistics .statistic > .value,\n.ui.statistics .blue.statistic > .value,\n.ui.blue.statistic > .value {\n  color: @blue;\n}\n.ui.violet.statistics .statistic > .value,\n.ui.statistics .violet.statistic > .value,\n.ui.violet.statistic > .value {\n  color: @violet;\n}\n.ui.purple.statistics .statistic > .value,\n.ui.statistics .purple.statistic > .value,\n.ui.purple.statistic > .value {\n  color: @purple;\n}\n.ui.pink.statistics .statistic > .value,\n.ui.statistics .pink.statistic > .value,\n.ui.pink.statistic > .value {\n  color: @pink;\n}\n.ui.brown.statistics .statistic > .value,\n.ui.statistics .brown.statistic > .value,\n.ui.brown.statistic > .value {\n  color: @brown;\n}\n.ui.grey.statistics .statistic > .value,\n.ui.statistics .grey.statistic > .value,\n.ui.grey.statistic > .value {\n  color: @grey;\n}\n\n/*--------------\n    Inverted\n---------------*/\n\n.ui.inverted.statistics .statistic > .value,\n.ui.inverted.statistic .value {\n  color: @invertedValueColor;\n}\n.ui.inverted.statistics .statistic > .label,\n.ui.inverted.statistic .label {\n  color: @invertedLabelColor;\n}\n\n.ui.inverted.red.statistics .statistic > .value,\n.ui.statistics .inverted.red.statistic > .value,\n.ui.inverted.red.statistic > .value {\n  color: @lightRed;\n}\n.ui.inverted.orange.statistics .statistic > .value,\n.ui.statistics .inverted.orange.statistic > .value,\n.ui.inverted.orange.statistic > .value {\n  color: @lightOrange;\n}\n.ui.inverted.yellow.statistics .statistic > .value,\n.ui.statistics .inverted.yellow.statistic > .value,\n.ui.inverted.yellow.statistic > .value {\n  color: @lightYellow;\n}\n.ui.inverted.olive.statistics .statistic > .value,\n.ui.statistics .inverted.olive.statistic > .value,\n.ui.inverted.olive.statistic > .value {\n  color: @lightOlive;\n}\n.ui.inverted.green.statistics .statistic > .value,\n.ui.statistics .inverted.green.statistic > .value,\n.ui.inverted.green.statistic > .value {\n  color: @lightGreen;\n}\n.ui.inverted.teal.statistics .statistic > .value,\n.ui.statistics .inverted.teal.statistic > .value,\n.ui.inverted.teal.statistic > .value {\n  color: @lightTeal;\n}\n.ui.inverted.blue.statistics .statistic > .value,\n.ui.statistics .inverted.blue.statistic > .value,\n.ui.inverted.blue.statistic > .value {\n  color: @lightBlue;\n}\n.ui.inverted.violet.statistics .statistic > .value,\n.ui.statistics .inverted.violet.statistic > .value,\n.ui.inverted.violet.statistic > .value {\n  color: @lightViolet;\n}\n.ui.inverted.purple.statistics .statistic > .value,\n.ui.statistics .inverted.purple.statistic > .value,\n.ui.inverted.purple.statistic > .value {\n  color: @lightPurple;\n}\n.ui.inverted.pink.statistics .statistic > .value,\n.ui.statistics .inverted.pink.statistic > .value,\n.ui.inverted.pink.statistic > .value {\n  color: @lightPink;\n}\n.ui.inverted.brown.statistics .statistic > .value,\n.ui.statistics .inverted.brown.statistic > .value,\n.ui.inverted.brown.statistic > .value {\n  color: @lightBrown;\n}\n.ui.inverted.grey.statistics .statistic > .value,\n.ui.statistics .inverted.grey.statistic > .value,\n.ui.inverted.grey.statistic > .value {\n  color: @lightGrey;\n}\n\n/*--------------\n    Floated\n---------------*/\n\n.ui[class*=\"left floated\"].statistic {\n  float: left;\n  margin: @leftFloatedMargin;\n}\n.ui[class*=\"right floated\"].statistic {\n  float: right;\n  margin: @rightFloatedMargin;\n}\n.ui.floated.statistic:last-child {\n  margin-bottom: 0em;\n}\n\n\n/*--------------\n     Sizes\n---------------*/\n\n\n/* Mini */\n.ui.mini.statistics .statistic > .value,\n.ui.mini.statistic > .value {\n  font-size: @miniValueSize !important;\n}\n.ui.mini.horizontal.statistics .statistic > .value,\n.ui.mini.horizontal.statistic > .value {\n  font-size: @miniHorizontalValueSize !important;\n}\n.ui.mini.statistics .statistic > .text.value,\n.ui.mini.statistic > .text.value {\n  font-size: @miniTextValueSize !important;\n}\n\n\n/* Tiny */\n.ui.tiny.statistics .statistic > .value,\n.ui.tiny.statistic > .value {\n  font-size: @tinyValueSize !important;\n}\n.ui.tiny.horizontal.statistics .statistic > .value,\n.ui.tiny.horizontal.statistic > .value {\n  font-size: @tinyHorizontalValueSize !important;\n}\n.ui.tiny.statistics .statistic > .text.value,\n.ui.tiny.statistic > .text.value {\n  font-size: @tinyTextValueSize !important;\n}\n\n/* Small */\n.ui.small.statistics .statistic > .value,\n.ui.small.statistic > .value {\n  font-size: @smallValueSize !important;\n}\n.ui.small.horizontal.statistics .statistic > .value,\n.ui.small.horizontal.statistic > .value {\n  font-size: @smallHorizontalValueSize !important;\n}\n.ui.small.statistics .statistic > .text.value,\n.ui.small.statistic > .text.value {\n  font-size: @smallTextValueSize !important;\n}\n\n/* Medium */\n.ui.statistics .statistic > .value,\n.ui.statistic > .value {\n  font-size: @valueSize !important;\n}\n.ui.horizontal.statistics .statistic > .value,\n.ui.horizontal.statistic > .value {\n  font-size: @horizontalValueSize !important;\n}\n.ui.statistics .statistic > .text.value,\n.ui.statistic > .text.value {\n  font-size: @textValueSize !important;\n}\n\n/* Large */\n.ui.large.statistics .statistic > .value,\n.ui.large.statistic > .value {\n  font-size: @largeValueSize !important;\n}\n.ui.large.horizontal.statistics .statistic > .value,\n.ui.large.horizontal.statistic > .value {\n  font-size: @largeHorizontalValueSize !important;\n}\n.ui.large.statistics .statistic > .text.value,\n.ui.large.statistic > .text.value {\n  font-size: @largeTextValueSize !important;\n}\n\n/* Huge */\n.ui.huge.statistics .statistic > .value,\n.ui.huge.statistic > .value {\n  font-size: @hugeValueSize !important;\n}\n.ui.huge.horizontal.statistics .statistic > .value,\n.ui.huge.horizontal.statistic > .value {\n  font-size: @hugeHorizontalValueSize !important;\n}\n.ui.huge.statistics .statistic > .text.value,\n.ui.huge.statistic > .text.value {\n  font-size: @hugeTextValueSize !important;\n}\n\n\n.loadUIOverrides();\n"
  },
  {
    "path": "semantic/src/semantic.less",
    "content": "/*\n\n███████╗███████╗███╗   ███╗ █████╗ ███╗   ██╗████████╗██╗ ██████╗    ██╗   ██╗██╗\n██╔════╝██╔════╝████╗ ████║██╔══██╗████╗  ██║╚══██╔══╝██║██╔════╝    ██║   ██║██║\n███████╗█████╗  ██╔████╔██║███████║██╔██╗ ██║   ██║   ██║██║         ██║   ██║██║\n╚════██║██╔══╝  ██║╚██╔╝██║██╔══██║██║╚██╗██║   ██║   ██║██║         ██║   ██║██║\n███████║███████╗██║ ╚═╝ ██║██║  ██║██║ ╚████║   ██║   ██║╚██████╗    ╚██████╔╝██║\n╚══════╝╚══════╝╚═╝     ╚═╝╚═╝  ╚═╝╚═╝  ╚═══╝   ╚═╝   ╚═╝ ╚═════╝     ╚═════╝ ╚═╝\n\n  Import this file into your LESS project to use Semantic UI without build tools\n*/\n\n/* Global */\n& { @import \"definitions/globals/reset\"; }\n& { @import \"definitions/globals/site\"; }\n\n/* Elements */\n& { @import \"definitions/elements/button\"; }\n& { @import \"definitions/elements/container\"; }\n& { @import \"definitions/elements/divider\"; }\n& { @import \"definitions/elements/flag\"; }\n& { @import \"definitions/elements/header\"; }\n& { @import \"definitions/elements/icon\"; }\n& { @import \"definitions/elements/image\"; }\n& { @import \"definitions/elements/input\"; }\n& { @import \"definitions/elements/label\"; }\n& { @import \"definitions/elements/list\"; }\n& { @import \"definitions/elements/loader\"; }\n& { @import \"definitions/elements/rail\"; }\n& { @import \"definitions/elements/reveal\"; }\n& { @import \"definitions/elements/segment\"; }\n& { @import \"definitions/elements/step\"; }\n\n/* Collections */\n& { @import \"definitions/collections/breadcrumb\"; }\n& { @import \"definitions/collections/form\"; }\n& { @import \"definitions/collections/grid\"; }\n& { @import \"definitions/collections/menu\"; }\n& { @import \"definitions/collections/message\"; }\n& { @import \"definitions/collections/table\"; }\n\n/* Views */\n& { @import \"definitions/views/ad\"; }\n& { @import \"definitions/views/card\"; }\n& { @import \"definitions/views/comment\"; }\n& { @import \"definitions/views/feed\"; }\n& { @import \"definitions/views/item\"; }\n& { @import \"definitions/views/statistic\"; }\n\n/* Modules */\n& { @import \"definitions/modules/accordion\"; }\n& { @import \"definitions/modules/checkbox\"; }\n& { @import \"definitions/modules/dimmer\"; }\n& { @import \"definitions/modules/dropdown\"; }\n& { @import \"definitions/modules/embed\"; }\n& { @import \"definitions/modules/modal\"; }\n& { @import \"definitions/modules/nag\"; }\n& { @import \"definitions/modules/popup\"; }\n& { @import \"definitions/modules/progress\"; }\n& { @import \"definitions/modules/rating\"; }\n& { @import \"definitions/modules/search\"; }\n& { @import \"definitions/modules/shape\"; }\n& { @import \"definitions/modules/sidebar\"; }\n& { @import \"definitions/modules/sticky\"; }\n& { @import \"definitions/modules/tab\"; }\n& { @import \"definitions/modules/transition\"; }\n"
  },
  {
    "path": "semantic/src/site/collections/breadcrumb.overrides",
    "content": "/*******************************\n         Site Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/collections/breadcrumb.variables",
    "content": "/*******************************\n         Site Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/collections/form.overrides",
    "content": "/*******************************\n         Site Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/collections/form.variables",
    "content": "/*******************************\n    User Variable Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/collections/grid.overrides",
    "content": "/*******************************\n         Site Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/collections/grid.variables",
    "content": "/*******************************\n    User Variable Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/collections/menu.overrides",
    "content": "/*******************************\n         Site Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/collections/menu.variables",
    "content": "/*******************************\n    User Variable Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/collections/message.overrides",
    "content": "/*******************************\n        Site Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/collections/message.variables",
    "content": "/*******************************\n    User Variable Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/collections/table.overrides",
    "content": "/*******************************\n         Site Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/collections/table.variables",
    "content": "/*******************************\n    User Variable Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/elements/button.overrides",
    "content": "/*******************************\n         Site Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/elements/button.variables",
    "content": "/*******************************\n    User Variable Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/elements/container.overrides",
    "content": "/*******************************\n         Site Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/elements/container.variables",
    "content": "/*******************************\n    User Variable Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/elements/divider.overrides",
    "content": "/*******************************\n         Site Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/elements/divider.variables",
    "content": "/*******************************\n    User Variable Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/elements/flag.overrides",
    "content": "/*******************************\n         Site Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/elements/flag.variables",
    "content": "/*-------------------\n   Flag Variables\n--------------------*/\n"
  },
  {
    "path": "semantic/src/site/elements/header.overrides",
    "content": "/*******************************\n         Site Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/elements/header.variables",
    "content": "/*******************************\n    User Variable Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/elements/icon.overrides",
    "content": "/*******************************\n         Site Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/elements/icon.variables",
    "content": "/*******************************\n    User Variable Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/elements/image.overrides",
    "content": "/*******************************\n         Site Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/elements/image.variables",
    "content": "/*******************************\n    User Variable Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/elements/input.overrides",
    "content": "/*******************************\n         Site Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/elements/input.variables",
    "content": "/*******************************\n    User Variable Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/elements/label.overrides",
    "content": "/*******************************\n         Site Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/elements/label.variables",
    "content": "/*******************************\n    User Variable Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/elements/list.overrides",
    "content": "/*******************************\n    User Variable Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/elements/list.variables",
    "content": "/*******************************\n    User Variable Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/elements/loader.overrides",
    "content": "/*******************************\n         Site Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/elements/loader.variables",
    "content": "/*******************************\n    User Variable Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/elements/rail.overrides",
    "content": "/*******************************\n         Site Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/elements/rail.variables",
    "content": "/*******************************\n    User Variable Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/elements/reveal.overrides",
    "content": "/*******************************\n         Site Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/elements/reveal.variables",
    "content": "/*******************************\n    User Variable Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/elements/segment.overrides",
    "content": "/*******************************\n         Site Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/elements/segment.variables",
    "content": "/*******************************\n    User Variable Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/elements/step.overrides",
    "content": "/*******************************\n         Site Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/elements/step.variables",
    "content": "/*******************************\n    User Variable Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/globals/reset.overrides",
    "content": "/*******************************\n         Site Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/globals/reset.variables",
    "content": "/*******************************\n     User Global Variables\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/globals/site.overrides",
    "content": "/*******************************\n         Site Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/globals/site.variables",
    "content": "/*******************************\n     User Global Variables\n*******************************/"
  },
  {
    "path": "semantic/src/site/modules/accordion.overrides",
    "content": "/*******************************\n        User Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/modules/accordion.variables",
    "content": "/*******************************\n    User Variable Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/modules/chatroom.overrides",
    "content": "/*******************************\n        User Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/modules/chatroom.variables",
    "content": "/*******************************\n    User Variable Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/modules/checkbox.overrides",
    "content": "/*******************************\n         Site Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/modules/checkbox.variables",
    "content": "/*******************************\n    User Variable Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/modules/dimmer.overrides",
    "content": "/*******************************\n        User Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/modules/dimmer.variables",
    "content": "/*******************************\n    User Variable Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/modules/dropdown.overrides",
    "content": "/*******************************\n        User Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/modules/dropdown.variables",
    "content": "/*******************************\n    User Variable Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/modules/embed.overrides",
    "content": "/*******************************\n         Site Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/modules/embed.variables",
    "content": ""
  },
  {
    "path": "semantic/src/site/modules/modal.overrides",
    "content": "/*******************************\n         Site Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/modules/modal.variables",
    "content": "/*******************************\n         Site Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/modules/nag.overrides",
    "content": "/*******************************\n        User Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/modules/nag.variables",
    "content": "/*******************************\n    User Variable Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/modules/popup.overrides",
    "content": "/*******************************\n        User Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/modules/popup.variables",
    "content": "/*******************************\n    User Variable Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/modules/progress.overrides",
    "content": "/*******************************\n         Site Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/modules/progress.variables",
    "content": "/*******************************\n    User Variable Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/modules/rating.overrides",
    "content": "/*******************************\n         Site Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/modules/rating.variables",
    "content": "/*******************************\n         Site Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/modules/search.overrides",
    "content": "/*******************************\n         Site Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/modules/search.variables",
    "content": "/*******************************\n         Site Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/modules/shape.overrides",
    "content": "/*******************************\n        User Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/modules/shape.variables",
    "content": "/*******************************\n    User Variable Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/modules/sidebar.overrides",
    "content": "/*******************************\n         Site Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/modules/sidebar.variables",
    "content": "/*******************************\n         Site Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/modules/sticky.overrides",
    "content": "/*******************************\n         Site Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/modules/sticky.variables",
    "content": "/*******************************\n         Site Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/modules/tab.overrides",
    "content": "/*******************************\n        User Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/modules/tab.variables",
    "content": "/*******************************\n    User Variable Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/modules/transition.overrides",
    "content": "/*******************************\n         Site Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/modules/transition.variables",
    "content": "/*******************************\n    User Variable Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/views/ad.overrides",
    "content": "/*******************************\n    User Variable Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/views/ad.variables",
    "content": "/*******************************\n    User Variable Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/views/card.overrides",
    "content": "/*******************************\n    User Variable Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/views/card.variables",
    "content": "/*******************************\n    User Variable Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/views/comment.overrides",
    "content": "/*******************************\n    User Variable Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/views/comment.variables",
    "content": "/*******************************\n    User Variable Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/views/feed.overrides",
    "content": "/*******************************\n    User Variable Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/views/feed.variables",
    "content": "/*******************************\n    User Variable Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/views/item.overrides",
    "content": "/*******************************\n    User Variable Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/views/item.variables",
    "content": "/*******************************\n    User Variable Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/views/statistic.overrides",
    "content": "/*******************************\n    User Variable Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/site/views/statistic.variables",
    "content": "/*******************************\n    User Variable Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/theme.config",
    "content": "/*\n\n████████╗██╗  ██╗███████╗███╗   ███╗███████╗███████╗\n╚══██╔══╝██║  ██║██╔════╝████╗ ████║██╔════╝██╔════╝\n   ██║   ███████║█████╗  ██╔████╔██║█████╗  ███████╗\n   ██║   ██╔══██║██╔══╝  ██║╚██╔╝██║██╔══╝  ╚════██║\n   ██║   ██║  ██║███████╗██║ ╚═╝ ██║███████╗███████║\n   ╚═╝   ╚═╝  ╚═╝╚══════╝╚═╝     ╚═╝╚══════╝╚══════╝\n\n*/\n\n/*******************************\n        Theme Selection\n*******************************/\n\n/* To override a theme for an individual element\n   specify theme name below\n*/\n\n/* Global */\n@site       : 'default';\n@reset      : 'default';\n\n/* Elements */\n@button     : 'default';\n@container  : 'default';\n@divider    : 'default';\n@flag       : 'default';\n@header     : 'default';\n@icon       : 'default';\n@image      : 'default';\n@input      : 'default';\n@label      : 'default';\n@list       : 'default';\n@loader     : 'default';\n@rail       : 'default';\n@reveal     : 'default';\n@segment    : 'default';\n@step       : 'default';\n\n/* Collections */\n@breadcrumb : 'default';\n@form       : 'default';\n@grid       : 'default';\n@menu       : 'default';\n@message    : 'default';\n@table      : 'default';\n\n/* Modules */\n@accordion  : 'default';\n@checkbox   : 'default';\n@dimmer     : 'default';\n@dropdown   : 'default';\n@embed      : 'default';\n@modal      : 'default';\n@nag        : 'default';\n@popup      : 'default';\n@progress   : 'default';\n@rating     : 'default';\n@search     : 'default';\n@shape      : 'default';\n@sidebar    : 'default';\n@sticky     : 'default';\n@tab        : 'default';\n@transition : 'default';\n\n/* Views */\n@ad         : 'default';\n@card       : 'default';\n@comment    : 'default';\n@feed       : 'default';\n@item       : 'default';\n@statistic  : 'default';\n\n/*******************************\n            Folders\n*******************************/\n\n/* Path to theme packages */\n@themesFolder : 'themes';\n\n/* Path to site override folder */\n@siteFolder   : 'site/';\n\n\n/*******************************\n         Import Theme\n*******************************/\n\n@import \"theme.less\";\n\n/* End Config */"
  },
  {
    "path": "semantic/src/theme.less",
    "content": "/*******************************\n        Import Directives\n*******************************/\n\n/*------------------\n       Theme\n-------------------*/\n\n@theme: @@element;\n\n/*--------------------\n   Site Variables\n---------------------*/\n\n/* Default site.variables */\n@import \"@{themesFolder}/default/globals/site.variables\";\n\n/* Packaged site.variables */\n@import \"@{themesFolder}/@{site}/globals/site.variables\";\n\n/* Component's site.variables */\n@import (optional) \"@{themesFolder}/@{theme}/globals/site.variables\";\n\n/* Site theme site.variables */\n@import (optional) \"@{siteFolder}/globals/site.variables\";\n\n\n/*-------------------\n Component Variables\n---------------------*/\n\n/* Default */\n@import \"@{themesFolder}/default/@{type}s/@{element}.variables\";\n\n/* Packaged Theme */\n@import (optional) \"@{themesFolder}/@{theme}/@{type}s/@{element}.variables\";\n\n/* Site Theme */\n@import (optional) \"@{siteFolder}/@{type}s/@{element}.variables\";\n\n\n/*******************************\n             Mix-ins\n*******************************/\n\n/*------------------\n       Fonts\n-------------------*/\n\n.loadFonts() when (@importGoogleFonts) {\n  @import url('@{googleProtocol}fonts.googleapis.com/css?family=@{googleFontRequest}');\n}\n\n/*------------------\n     Overrides\n-------------------*/\n\n.loadUIOverrides() {\n  @import (optional) \"@{themesFolder}/@{theme}/@{type}s/@{element}.overrides\";\n  @import (optional) \"@{siteFolder}/@{type}s/@{element}.overrides\";\n}\n"
  },
  {
    "path": "semantic/src/themes/amazon/elements/button.overrides",
    "content": ".ui.button {\n  background-image: linear-gradient(center top , #F7F8FA, #E7E9EC) repeat scroll 0 0 rgba(0, 0, 0, 0);\n}\n\n.ui.primary.button {\n  color: #111111;\n  border: 1px solid;\n  border-color: #C59F43 #AA8326 #957321;\n}\n.ui.primary.button:hover {\n  border-color: #C59F43 #AA8326 #957321;\n  color: #111111;\n}\n\n.ui.secondary.button {\n  border: 1px solid;\n  border-color: #3D444C #2F353B #2C3137;\n}\n.ui.secondary.button:hover {\n  border-color: #32373E #24282D #212429;\n}\n\n\n.ui.labeled.icon.buttons .button > .icon,\n.ui.labeled.icon.button > .icon {\n  padding-bottom: 0.48em;\n  padding-top: 0.48em;\n  position: absolute;\n  text-align: center;\n  width: 2em;\n  height: 2em;\n  top: 0.35em;\n  left: 0.4em;\n  border-radius: 3px;\n}\n.ui.right.labeled.icon.buttons .button > .icon,\n.ui.right.labeled.icon.button > .icon {\n  left: auto;\n  right: 0.4em;\n  border-radius: 3px;\n}\n\n.ui.basic.labeled.icon.buttons .button > .icon,\n.ui.basic.labeled.icon.button > .icon {\n  padding-top: 0.4em !important;\n}"
  },
  {
    "path": "semantic/src/themes/amazon/elements/button.variables",
    "content": "/*-------------------\n   Button Variables\n--------------------*/\n\n/* Button Variables */\n@pageFont: Helvetica Neue, Helvetica, Arial, sans-serif;\n@textTransform: none;\n@textColor: #111111;\n@fontWeight: normal;\n@transition:\n  opacity @defaultDuration @defaultEasing,\n  background-color @defaultDuration @defaultEasing,\n  color @defaultDuration @defaultEasing,\n  background @defaultDuration @defaultEasing\n;\n\n@hoverBackgroundColor: #E0E0E0;\n\n@borderRadius: 3px;\n@verticalPadding: 0.8em;\n@horizontalPadding: 1.75em;\n\n@backgroundColor: #F7F8FA;\n@backgroundImage: linear-gradient(rgba(255, 255, 255, 0), rgba(0, 0, 0, 0.1));\n@boxShadow:\n  0 1px 0 1px rgba(255, 255, 255, 0.3) inset,\n  0 0 0 1px #ADB2BB inset\n;\n\n@coloredBackgroundImage: linear-gradient(rgba(255, 255, 255, 0.2), rgba(0, 0, 0, 0.2));\n@coloredBoxShadow:\n  0px 1px 0px 0px rgba(255, 255, 255, 0.2) inset\n;\n\n@downBoxShadow:\n  0 0 0 1px #ADB2BB inset,\n  0 1px 3px rgba(0, 0, 0, 0.2) inset\n;\n\n@labeledIconBackgroundColor: #313A43;\n@labeledIconColor: #FFFFFF;\n@labeledIconBorder: transparent;\n\n@black: #444C55;\n@orange: #F4CC67;\n\n@coloredBackgroundImage: linear-gradient(rgba(255, 255, 255, 0.15), rgba(0, 0, 0, 0.1));\n@primaryColor: @orange;\n@secondaryColor: @black;\n\n@mini: 10px;\n@tiny: 11px;\n@small: 12px;\n@medium: 13px;\n@large: 14px;\n@big: 16px;\n@huge: 18px;\n@massive: 22px;\n"
  },
  {
    "path": "semantic/src/themes/amazon/globals/site.variables",
    "content": "/*******************************\n     User Global Variables\n*******************************/\n\n@pageMinWidth  : 1049px;\n@pageOverflowX : visible;\n\n@emSize: 13px;\n@fontSize : 13px;\n@fontName : 'Arial';\n@importGoogleFonts : false;\n\n@h1: 2.25em;\n\n@defaultBorderRadius: 0.30769em; /* 4px @ 13em */\n\n@disabledOpacity: 0.3;\n\n@black: #444C55;\n@orange: #FDE07B;\n\n@linkColor: #0066C0;\n@linkHoverColor: #C45500;\n@linkHoverUnderline: underline;\n\n@borderColor: rgba(0, 0, 0, 0.13);\n@solidBorderColor: #DDDDDD;\n@internalBorderColor: rgba(0, 0, 0, 0.06);\n@selectedBorderColor: #51A7E8;\n\n/* Breakpoints */\n@largeMonitorBreakpoint: 1049px;\n@computerBreakpoint: @largeMonitorBreakpoint;\n@tabletBreakpoint: @largeMonitorBreakpoint;\n\n/* Colors */\n@blue: #80A6CD;\n@green: #60B044;\n@orange: #D26911;\n\n\n@infoBackgroundColor: #E6F1F6;\n@infoTextColor: #4E575B;"
  },
  {
    "path": "semantic/src/themes/basic/collections/table.overrides",
    "content": "/*******************************\n           Overrides\n*******************************/\n\n"
  },
  {
    "path": "semantic/src/themes/basic/collections/table.variables",
    "content": "/*-------------------\n   Table Variables\n--------------------*/\n\n@headerBackground: @white;\n@footerBackground: @white;\n\n@cellVerticalPadding: 1em;\n@cellHorizontalPadding: 1em;\n\n@stateMarkerWidth: 1px;"
  },
  {
    "path": "semantic/src/themes/basic/elements/button.overrides",
    "content": "/*******************************\n           Overrides\n*******************************/\n\n"
  },
  {
    "path": "semantic/src/themes/basic/elements/button.variables",
    "content": "/*-------------------\n   Button Variables\n--------------------*/\n\n/* Button Variables */\n@textTransform: none;\n@fontWeight: normal;\n@textColor: #333333;\n\n@primaryColor: #333333;\n\n@borderRadius: 0.25em;\n\n@backgroundColor: #EEEEEE;\n@backgroundImage: none;\n@boxShadow: none;\n\n@hoverBackgroundColor: #DDDDDD;\n@hoverBackgroundImage: none;\n@hoverBoxShadow: none;\n\n@downBackgroundColor: #D0D0D0;\n@downBackgroundImage: none;\n@downBoxShadow: none;\n\n@activeBackgroundColor: #CCCCCC;\n@activeBackgroundImage: none;\n@activeBoxShadow: none;\n\n@verticalBoxShadow: none;\n\n@loadingBackgroundColor: #F0F0F0;\n\n@labeledIconLeftShadow: none;\n@labeledIconRightShadow: none;\n\n@mini: 0.6rem;\n@tiny: 0.7rem;\n@small: 0.85rem;\n@medium: 0.92rem;\n@large: 1rem;\n@big: 1.125rem;\n@huge: 1.25rem;\n@massive: 1.3rem;\n"
  },
  {
    "path": "semantic/src/themes/basic/elements/icon.overrides",
    "content": "/* basic.icons available */\ni.icon.circle.attention:before { content: '\\2757'; } /* '❗' */\ni.icon.circle.help:before { content: '\\e704'; } /* '' */\ni.icon.circle.info:before { content: '\\e705'; } /* '' */\ni.icon.add:before { content: '\\2795'; } /* '➕' */\n\ni.icon.chart:before { content: '📈'; } /* '\\1f4c8' */\ni.icon.chart.bar:before { content: '📊'; } /* '\\1f4ca' */\ni.icon.chart.pie:before { content: '\\e7a2'; } /* '' */\n\ni.icon.resize.full:before { content: '\\e744'; } /* '' */\ni.icon.resize.horizontal:before { content: '\\2b0d'; } /* '⬍' */\ni.icon.resize.small:before { content: '\\e746'; } /* '' */\ni.icon.resize.vertical:before { content: '\\2b0c'; } /* '⬌' */\n\ni.icon.down:before { content: '\\2193'; } /* '↓' */\ni.icon.down.triangle:before { content: '\\25be'; } /* '▾' */\ni.icon.down.arrow:before { content: '\\e75c'; } /* '' */\n\ni.icon.left:before { content: '\\2190'; } /* '←' */\ni.icon.left.triangle:before { content: '\\25c2'; } /* '◂' */\ni.icon.left.arrow:before { content: '\\e75d'; } /* '' */\n\ni.icon.right:before { content: '\\2192'; } /* '→' */\ni.icon.right.triangle:before { content: '\\25b8'; } /* '▸' */\ni.icon.right.arrow:before { content: '\\e75e'; } /* '' */\n\ni.icon.up:before { content: '\\2191'; } /* '↑' */\ni.icon.up.triangle:before { content: '\\25b4'; } /* '▴' */\ni.icon.up.arrow:before { content: '\\e75f'; } /* '' */\n\ni.icon.folder:before { content: '\\e810'; } /* '' */\ni.icon.open.folder:before { content: '📂'; } /* '\\1f4c2' */\n\ni.icon.globe:before { content: '𝌍'; } /* '\\1d30d' */\ni.icon.desk.globe:before { content: '🌐'; } /* '\\1f310' */\n\ni.icon.star:before { content: '\\e801'; } /* '' */\ni.icon.star.empty:before { content: '\\e800'; } /* '' */\ni.icon.star.half:before { content: '\\e701'; } /* '' */\n\ni.icon.lock:before { content: '🔒'; } /* '\\1f512' */\ni.icon.unlock:before { content: '🔓'; } /* '\\1f513' */\n\ni.icon.layout.grid:before { content: '\\e80c'; } /* '' */\ni.icon.layout.block:before { content: '\\e708'; } /* '' */\ni.icon.layout.list:before { content: '\\e80b'; } /* '' */\n\ni.icon.heart.empty:before { content: '\\2661'; } /* '♡' */\ni.icon.heart:before { content: '\\2665'; } /* '♥' */\n\n\ni.icon.asterisk:before { content: '\\2731'; } /* '✱' */\ni.icon.attachment:before { content: '📎'; } /* '\\1f4ce' */\ni.icon.attention:before { content: '\\26a0'; } /* '⚠' */\ni.icon.trophy:before { content: '🏉'; } /* '\\1f3c9' */\ni.icon.barcode:before { content: '\\e792'; } /* '' */\ni.icon.cart:before { content: '\\e813'; } /* '' */\ni.icon.block:before { content: '🚫'; } /* '\\1f6ab' */\ni.icon.book:before { content: '📖'; }\ni.icon.bookmark:before { content: '🔖'; } /* '\\1f516' */\ni.icon.calendar:before { content: '📅'; } /* '\\1f4c5' */\ni.icon.cancel:before { content: '\\2716'; } /* '✖' */\ni.icon.close:before { content: '\\e80d'; } /* '' */\ni.icon.color:before { content: '\\e794'; } /* '' */\ni.icon.chat:before { content: '\\e720'; } /* '' */\ni.icon.check:before { content: '\\2611'; } /* '☑' */\ni.icon.time:before { content: '🕔'; } /* '\\1f554' */\ni.icon.cloud:before { content: '\\2601'; } /* '☁' */\ni.icon.code:before { content: '\\e714'; } /* '' */\ni.icon.email:before { content: '\\40'; } /* '@' */\ni.icon.settings:before { content: '\\26ef'; } /* '⛯' */\ni.icon.setting:before { content: '\\2699'; } /* '⚙' */\ni.icon.comment:before { content: '\\e802'; } /* '' */\ni.icon.clockwise.counter:before { content: '\\27f2'; } /* '⟲' */\ni.icon.clockwise:before { content: '\\27f3'; } /* '⟳' */\ni.icon.cube:before { content: '\\e807'; } /* '' */\ni.icon.direction:before { content: '\\27a2'; } /* '➢' */\ni.icon.doc:before { content: '📄'; } /* '\\1f4c4' */\ni.icon.docs:before { content: '\\e736'; } /* '' */\ni.icon.dollar:before { content: '💵'; } /* '\\1f4b5' */\ni.icon.paint:before { content: '\\e7b5'; } /* '' */\ni.icon.edit:before { content: '\\270d'; } /* '✍' */\ni.icon.eject:before { content: '\\2ecf'; } /* '⻏' */\ni.icon.export:before { content: '\\e715'; } /* '' */\ni.icon.hide:before  { content: '\\e70b'; } /* '' */\ni.icon.unhide:before { content: '\\e80f'; } /* '' */\ni.icon.facebook:before { content: '\\f301'; } /* '' */\ni.icon.fast-forward:before { content: '\\e804'; } /* '' */\ni.icon.fire:before { content: '🔥'; } /* '\\1f525' */\ni.icon.flag:before { content: '\\2691'; } /* '⚑' */\ni.icon.lightning:before { content: '\\26a1'; } /* '⚡' */\ni.icon.lab:before { content: '\\68'; } /* 'h' */\ni.icon.flight:before { content: '\\2708'; } /* '✈' */\ni.icon.forward:before { content: '\\27a6'; } /* '➦' */\ni.icon.gift:before { content: '🎁'; } /* '\\1f381' */\ni.icon.github:before { content: '\\f308'; } /* '' */\ni.icon.globe:before { content: '\\e817'; } /* '' */\ni.icon.headphones:before { content: '🎧'; } /* '\\1f3a7' */\ni.icon.question:before { content: '\\2753'; } /* '❓' */\ni.icon.home:before { content: '\\2302'; } /* '⌂' */\ni.icon.i:before { content: '\\2139'; } /* 'ℹ' */\ni.icon.idea:before { content: '💡'; } /* '\\1f4a1' */\ni.icon.open:before { content: '🔗'; } /* '\\1f517' */\ni.icon.content:before { content: '\\e782'; } /* '' */\ni.icon.location:before { content: '\\e724'; } /* '' */\ni.icon.mail:before { content: '\\2709'; } /* '✉' */\ni.icon.mic:before { content: '🎤'; } /* '\\1f3a4' */\ni.icon.minus:before { content: '\\2d'; } /* '-' */\ni.icon.money:before { content: '💰'; } /* '\\1f4b0' */\ni.icon.off:before { content: '\\e78e'; } /* '' */\ni.icon.pause:before { content: '\\e808'; } /* '' */\ni.icon.photos:before { content: '\\e812'; } /* '' */\ni.icon.photo:before { content: '🌄'; } /* '\\1f304' */\ni.icon.pin:before { content: '📌'; } /* '\\1f4cc' */\ni.icon.play:before { content: '\\e809'; } /* '' */\ni.icon.plus:before { content: '\\2b'; } /* '+' */\ni.icon.print:before { content: '\\e716'; } /* '' */\ni.icon.rss:before { content: '\\e73a'; } /* '' */\ni.icon.search:before { content: '🔍'; } /* '\\1f50d' */\ni.icon.shuffle:before { content: '\\e803'; } /* '' */\ni.icon.tag:before { content: '\\e80a'; } /* '' */\ni.icon.tags:before { content: '\\e70d'; } /* '' */\ni.icon.terminal:before { content: '\\e7ac'; } /* '' */\ni.icon.thumbs.down:before { content: '👎'; } /* '\\1f44e' */\ni.icon.thumbs.up:before { content: '👍'; } /* '\\1f44d' */\ni.icon.to-end:before { content: '\\e806'; } /* '' */\ni.icon.to-start:before { content: '\\e805'; } /* '' */\ni.icon.top.list:before { content: '🏆'; } /* '\\1f3c6' */\ni.icon.trash:before { content: '\\e729'; } /* '' */\ni.icon.twitter:before { content: '\\f303'; } /* '' */\ni.icon.upload:before { content: '\\e711'; } /* '' */\ni.icon.user.add:before { content: '\\e700'; } /* '' */\ni.icon.user:before { content: '👤'; } /* '\\1f464' */\ni.icon.community:before { content: '\\e814'; } /* '' */\ni.icon.users:before { content: '👥'; } /* '\\1f465' */\ni.icon.id:before { content: '\\e722'; } /* '' */\ni.icon.url:before { content: '🔗'; } /* '\\1f517' */\ni.icon.zoom.in:before { content: '\\e750'; } /* '' */\ni.icon.zoom.out:before { content: '\\e751'; } /* '' */\n\n/*--------------\n   Spacing Fix\n---------------*/\n\n/* dropdown arrows are to the right */\ni.dropdown.icon {\n  margin: 0em 0em 0em 0.5em;\n}\n\n/* stars are usually consecutive */\ni.icon.star {\n  width: auto;\n  margin: 0em;\n}\n\n/* left side basic.icons */\ni.icon.left {\n  width: auto;\n  margin: 0em 0.5em 0em 0em;\n}\n\n/* right side basic.icons */\ni.icon.search,\ni.icon.up,\ni.icon.down,\ni.icon.right {\n  width: auto;\n  margin: 0em 0em 0em 0.5em;\n}\n\n/*--------------\n     Aliases\n---------------*/\n\n/* aliases for convenience */\ni.icon.delete:before { content: '\\e80d'; } /* '' */\ni.icon.dropdown:before { content: '\\25be'; } /* '▾' */\n\ni.icon.help:before { content: '\\e704'; } /* '' */\ni.icon.info:before { content: '\\e705'; } /* '' */\ni.icon.error:before { content: '\\e80d'; } /* '' */\n\ni.icon.dislike:before { content: '\\2661'; } /* '♡' */\ni.icon.like:before { content: '\\2665'; } /* '♥' */\n\ni.icon.eye:before { content: '\\e80f'; } /* '' */\ni.icon.eye.hidden:before { content: '\\e70b'; } /* '' */\ni.icon.date:before { content: '📅'; } /* '\\1f4c5' */\n"
  },
  {
    "path": "semantic/src/themes/basic/elements/icon.variables",
    "content": "/*-------------------\n   Icon Variables\n--------------------*/\n\n@fontPath  : \"../../themes/basic/assets/fonts\";\n\n@src:\n  url(\"@{fontPath}/@{fontName}.eot?#iefix\") format('embedded-opentype'),\n  url(\"@{fontPath}/@{fontName}.woff\") format('woff'),\n  url(\"@{fontPath}/@{fontName}.ttf\") format('truetype'),\n  url(\"@{fontPath}/@{fontName}.svg#icons\") format('svg')\n;"
  },
  {
    "path": "semantic/src/themes/basic/elements/step.overrides",
    "content": "/*******************************\n           Overrides\n*******************************/\n\n.ui.steps .step:after {\n  display: none !important;\n}\n.ui.steps .step {\n  border-radius: 500px !important;\n}"
  },
  {
    "path": "semantic/src/themes/basic/elements/step.variables",
    "content": "/*-------------------\n   Step Variables\n--------------------*/\n\n/* Stepss */\n@stepsBorder: none;\n@stepsBorderRadius: @circularRadius;\n\n/* Step */\n@border: none;\n@divider: none;\n@background: transparent;\n@borderRadius: @circularRadius;\n@iconDistance: 0.8em;\n@arrowDisplay: none;\n\n@activeBackground: @midWhite;\n@activeArrowDisplay: none;\n"
  },
  {
    "path": "semantic/src/themes/basic/globals/reset.overrides",
    "content": "/*******************************\n           Overrides\n*******************************/\n\n/* No Additional Resets */"
  },
  {
    "path": "semantic/src/themes/basic/globals/reset.variables",
    "content": "/*******************************\n             Reset\n*******************************/"
  },
  {
    "path": "semantic/src/themes/basic/modules/progress.overrides",
    "content": "/*******************************\n            Progress\n*******************************/\n"
  },
  {
    "path": "semantic/src/themes/basic/modules/progress.variables",
    "content": "/*******************************\n            Progress\n*******************************/\n\n@background: transparent;\n@border: none;\n@padding: 0em;\n\n@progressLeft: 0em;\n@progressWidth: 100%;\n@progressTextAlign: center;\n\n@labelFontWeight: normal;\n@labelTextAlign: left;\n@labelHeight: 1.5em;"
  },
  {
    "path": "semantic/src/themes/basic/views/card.overrides",
    "content": "/*******************************\n           Overrides\n*******************************/\n\n"
  },
  {
    "path": "semantic/src/themes/basic/views/card.variables",
    "content": "/*******************************\n             Card\n*******************************/\n\n/*-------------------\n         View\n--------------------*/\n\n@width: 250px;\n@background: transparent;\n@border: none;\n@boxShadow: none;\n\n@contentPadding: 1em 0em;\n\n@rowSpacing: 1.5em;\n@groupCardMargin: 0em @horizontalSpacing @rowSpacing;\n\n@extraBackground: transparent;\n@extraDivider: none;\n@extraBoxShadow: none;\n@extraPadding: 0.5em 0em;\n\n@extraLinkColor: @textColor;\n@extraLinkHoverColor: @linkHoverColor;\n\n@headerFontSize: @relativeLarge;\n@headerLinkColor: @textColor;\n@headerLinkHoverColor: @linkHoverColor;\n\n@imageBorderRadius: @borderRadius;\n@imageBorder: 1px solid @borderColor;\n\n@linkHoverBackground: transparent;\n@linkHoverBoxShadow: none;"
  },
  {
    "path": "semantic/src/themes/bookish/elements/header.overrides",
    "content": "/*******************************\n           Overrides\n*******************************/\n\n@import url(http://fonts.googleapis.com/css?family=Karma);\n\nh1.ui.header,\n.ui.huge.header {\n  font-weight: bold;\n}\n\nh2.ui.header,\n.ui.large.header {\n  font-weight: bold;\n}"
  },
  {
    "path": "semantic/src/themes/bookish/elements/header.variables",
    "content": "/*-------------------\n       Header\n--------------------*/\n\n@headerFont : 'Karma', 'Times New Roman', serif;\n@fontWeight: normal;\n\n@iconSize: 1.5em;\n@iconOffset: 0.2em;\n@iconAlignment: top;\n\n@subHeaderFontSize: 0.85rem;\n\n@dividedBorder: 1px dotted rgba(0, 0, 0, 0.2);\n\n/* Block Header */\n@blockVerticalPadding: 1.3em;\n@blockHorizontalPadding: 1em;\n\n/* Attached  */\n@attachedBackground: linear-gradient(rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.03)) repeat scroll 0 0 #F8F8F8;\n@attachedVerticalPadding: 1.3;\n@attachedHorizontalPadding: 1em;\n\n/* HTML Headings */\n@h1: 1.75rem;\n@h2: 1.33rem;\n@h3: 1.33rem;\n@h4: 1rem;\n@h5: 0.9rem;\n\n/* Sizing */\n@hugeFontSize: 1.75em;\n@largeFontSize: 1.33em;\n@mediumFontSize: 1.33em;\n@smallFontSize: 1em;\n@tinyFontSize: 0.9em;"
  },
  {
    "path": "semantic/src/themes/bootstrap3/elements/button.overrides",
    "content": ""
  },
  {
    "path": "semantic/src/themes/bootstrap3/elements/button.variables",
    "content": "/*-------------------\n   Button Variables\n--------------------*/\n\n/* Button Variables */\n@pageFont: Helvetica Neue, Helvetica, Arial, sans-serif;\n@textTransform: none;\n@fontWeight: normal;\n@textColor: rgba(51, 51, 51, 1);\n\n@borderRadius: @4px;\n\n@lineHeight: 1.42857;\n@verticalPadding: 0.8571em;\n@horizontalPadding: 0.8571em;\n\n@backgroundColor: @white;\n@backgroundImage: none;\n\n\n@borderBoxShadowColor: rgba(0, 0, 0, 0.14);\n\n@green: #5CB85C;\n@red: #D9534F;\n@blue: #337AB7;\n@green: #60B044;\n@orange: #F0AD4E;\n\n@primaryColor: @blue;\n@secondaryColor: @green;\n\n@labeledIconBackgroundColor: transparent;\n\n@basicBorderSize: 0px;\n@basicColoredBorderSize: 0px;\n@invertedBorderSize: 0px;\n\n@basicActiveBackground: transparent;\n@basicHoverBackground: transparent;\n@basicDownBoxShadow:\n  0px 0px 0px 1px #ADADAD inset,\n  0 3px 5px rgba(0, 0, 0, 0.125) inset\n;\n\n@groupButtonOffset: 0px 0px 0px -1px;\n@verticalGroupOffset: 0px 0px -1px 0px;\n\n/* States */\n\n@hoverBackgroundColor: #E6E6E6;\n@hoverBoxShadow:\n  0px 0px 0px 1px #ADADAD inset\n;\n\n@downBackgroundColor: #E6E6E6;\n@downBoxShadow:\n  0px 0px 0px 1px #ADADAD inset,\n  0 3px 5px rgba(0, 0, 0, 0.125) inset\n;\n\n@activeBackgroundColor: #E6E6E6;\n\n@disabledOpacity: 0.65;"
  },
  {
    "path": "semantic/src/themes/chubby/collections/form.overrides",
    "content": "/*-------------------\n   Form Variables\n--------------------*/\n\n.ui.form .selection.dropdown {\n  padding: 1.1em 1.2em;\n  border-width: 2px;\n}\n.ui.form .selection.dropdown .menu {\n  min-width: calc(100% + 4px);\n  margin: 0 -2px;\n  border-width: 2px;\n}\n.ui.form .selection.dropdown input {\n  padding: inherit;\n}"
  },
  {
    "path": "semantic/src/themes/chubby/collections/form.variables",
    "content": "/*-------------------\n   Form Variables\n--------------------*/\n\n@labelTextTransform: uppercase;\n@labelFontSize: 0.8em;\n\n@inputPadding: 1em 1.2em;\n@inputBorder: 2px solid @borderColor;"
  },
  {
    "path": "semantic/src/themes/chubby/collections/menu.overrides",
    "content": ""
  },
  {
    "path": "semantic/src/themes/chubby/collections/menu.variables",
    "content": "/*******************************\n             Menu\n*******************************/\n\n@background: @darkWhite;\n@boxShadow: none;\n@dividerSize: 0px;\n\n@verticalBoxShadow: 0px 0px 0px 2px @borderColor inset;\n@verticalActiveBoxShadow: none;\n\n@itemVerticalPadding: 1.25em;\n@itemHorizontalPadding: 2em;\n@itemFontWeight: bold;\n\n@activeItemBackground: @primaryColor;\n@activeItemTextColor: @white;\n@activeHoverItemBackground: @primaryColorHover;\n@activeHoverItemColor: @white;\n\n@secondaryItemPadding: @relativeSmall @relativeMedium;\n\n@secondaryActiveItemBackground: @primaryColor;\n@secondaryActiveItemColor: @white;\n@secondaryActiveHoverItemBackground: @primaryColorHover;\n@secondaryActiveHoverItemColor: @white;\n\n@secondaryPointingBorderWidth: 4px;\n@secondaryPointingActiveBorderColor: @primaryColor;\n@secondaryPointingActiveTextColor: @primaryColor;\n\n@arrowSize: 1em;\n@arrowActiveColor: @primaryColor;\n@arrowActiveHoverColor: @primaryColorHover;\n@arrowBorder: transparent;\n\n@paginationActiveBackground: @lightGrey;\n\n@borderColor: @darkWhite;\n@tabularBorderWidth: 2px;"
  },
  {
    "path": "semantic/src/themes/chubby/elements/button.overrides",
    "content": "/*******************************\n           Overrides\n*******************************/\n\n@import url(http://fonts.googleapis.com/css?family=Source+Sans+Pro);\n\n.ui.labeled.icon.buttons > .button > .icon,\n.ui.labeled.icon.button > .icon {\n  box-shadow:\n    -1px 0px 0px 0px rgba(255, 255, 255, 0.2) inset,\n    -1px 0px 0px 0px rgba(0, 0, 0, 0.05) inset\n  ;\n}\n\n.ui.right.labeled.icon.buttons .button .icon,\n.ui.right.labeled.icon.button .icon {\n  box-shadow:\n    1px 0px 0px 0px rgba(255, 255, 255, 0.2) inset,\n    1px 0px 0px 0px rgba(0, 0, 0, 0.05) inset\n  ;\n}"
  },
  {
    "path": "semantic/src/themes/chubby/elements/button.variables",
    "content": "/*-------------------\n   Button Variables\n--------------------*/\n\n/* Button Variables */\n@pageFont: 'Source Sans Pro', Arial, sans-serif;\n\n@textTransform: none;\n@fontWeight: normal;\n@textColor: #333333;\n\n@verticalPadding: 1.1em;\n@horizontalPadding: 2.5em;\n@invertedBorderSize: 3px;\n\n@basicBorderRadius: 0.4em;\n@basicFontWeight: bold;\n@basicTextTransform: uppercase;\n\n@blue: #4A88CB;\n@primaryColor: @blue;\n\n@borderRadius: 0.25em;\n\n@backgroundColor: #E6EAED;\n@backgroundImage: none;\n@boxShadow: none;\n\n@hoverBackgroundColor: #DDDDDD;\n@hoverBackgroundImage: none;\n@hoverBoxShadow: none;\n\n@downBackgroundColor: #D0D0D0;\n@downBackgroundImage: none;\n@downBoxShadow: none;\n\n@activeBackgroundColor: #CCCCCC;\n@activeBackgroundImage: none;\n@activeBoxShadow: none;\n\n@verticalBoxShadow: none;\n\n@loadingBackgroundColor: #F0F0F0;\n\n@compactVerticalPadding: (@verticalPadding * 0.5);\n@compactHorizontalPadding: (@horizontalPadding * 0.5);\n\n@labeledIconBackgroundColor: transparent;\n\n@mini: 0.7rem;\n@tiny: 0.75rem;\n@small: 0.8rem;\n@medium: 0.92rem;\n@large: 1rem;\n@big: 1.125rem;\n@huge: 1.2rem;\n@massive: 1.3rem;\n"
  },
  {
    "path": "semantic/src/themes/chubby/elements/header.overrides",
    "content": "/*******************************\n           Overrides\n*******************************/\n\n@import url(http://fonts.googleapis.com/css?family=Source+Sans+Pro);\n"
  },
  {
    "path": "semantic/src/themes/chubby/elements/header.variables",
    "content": "/*-------------------\n       Header\n--------------------*/\n\n@headerFont : 'Source Sans Pro', Helvetica Neue, Helvetica, Arial, sans-serif;\n@fontWeight: bold;\n@textTransform: none;\n\n/* HTML Headings */\n@h1: 1.33rem;\n@h2: 1.2rem;\n@h3: 1rem;\n@h4: 0.9rem;\n@h5: 0.8rem;\n\n/* Sizing */\n@hugeFontSize: 1.33em;\n@largeFontSize: 1.2em;\n@mediumFontSize: 1em;\n@smallFontSize: 0.9em;\n@tinyFontSize: 0.8em;"
  },
  {
    "path": "semantic/src/themes/chubby/modules/accordion.overrides",
    "content": "/*******************************\n           Overrides\n*******************************/\n\n.ui.styled.accordion .accordion .active.title {\n  border-bottom: 1px solid rgba(0, 0, 0, 0.1);\n}"
  },
  {
    "path": "semantic/src/themes/chubby/modules/accordion.variables",
    "content": "/*-------------------\n   Accordion Variables\n--------------------*/\n\n@iconMargin: 0em 0.5em 0em 0em;\n\n@styledActiveTitleBackground: @subtleGradient;\n@styledActiveTitleColor: @primaryColor;\n\n@styledActiveChildTitleBackground: transparent;\n\n@styledTitlePadding: 1.25em;\n@styledTitleFontWeight: bold;\n@styledContentPadding: 1.5em 3.25em;\n@styledChildContentPadding: @styledContentPadding;"
  },
  {
    "path": "semantic/src/themes/chubby/views/comment.overrides",
    "content": "/*******************************\n           Overrides\n*******************************/\n\n.ui.comments .comment {\n  border-radius: 0.5em;\n  box-shadow: 0px 1px 1px 1px rgba(0, 0, 0, 0.1);\n}\n.ui.comments .comment .comments .comment {\n  border: 1px solid rgba(0, 0, 0, 0.1);\n  box-shadow: none;\n}"
  },
  {
    "path": "semantic/src/themes/chubby/views/comment.variables",
    "content": "/*******************************\n            Comments\n*******************************/\n\n/*-------------------\n      Elements\n--------------------*/\n\n/* Comment */\n@commentBackground: #FFFFFF;\n@commentMargin: 1em 0em 0em;\n@commentPadding: 1em 1.5em;\n@commentBorder: 1px solid rgba(0, 0, 0, 0.1);\n@commentDivider: 1px solid rgba(0, 0, 0, 0.1);\n@firstCommentMargin: 1em;\n@firstCommentPadding: 1em;\n\n/* Nested Comment */\n@nestedCommentsMargin: 0em 0em 0.5em 0.5em;\n@nestedCommentsPadding: 1em 0em 0em 1em;\n@nestedCommentBackground: #F0F0F0;\n\n/* Avatar */\n@avatarWidth: 3.5em;\n@avatarSpacing: 1.5em;\n@avatarBorderRadius: @circularRadius;\n\n/* Content */\n@contentMargin: @avatarWidth + @avatarSpacing;\n\n/* Author */\n@authorFontSize: 1em;\n@authorColor: @primaryColor;\n@authorHoverColor: @primaryColorHover;\n@authorFontWeight: bold;\n\n@metadataDisplay: block;\n@metadataSpacing: 0em;\n@metadataColor: @textColor;\n\n/*-------------------\n      Variations\n--------------------*/\n\n/* Threaded */\n@threadedCommentMargin: -1.5em 0 -1em  (@avatarWidth / 2);\n"
  },
  {
    "path": "semantic/src/themes/classic/collections/table.overrides",
    "content": "/*******************************\n           Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/themes/classic/collections/table.variables",
    "content": "/*******************************\n            Table\n*******************************/\n\n/*-------------------\n       Element\n--------------------*/\n\n@boxShadow: @subtleGradient;\n\n@headerBackground: @subtleGradient;\n@headerBoxShadow: @subtleShadow;\n@footerBoxShadow: 0px -1px 1px 0px rgba(0, 0, 0, 0.05);\n@footerBackground: rgba(0, 0, 0, 0.05);\n"
  },
  {
    "path": "semantic/src/themes/classic/elements/button.overrides",
    "content": "/*******************************\n           Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/themes/classic/elements/button.variables",
    "content": "/*******************************\n            Button\n*******************************/\n\n/*-------------------\n       Element\n--------------------*/\n\n/* Shadow */\n@shadowDistance: 0em;\n@shadowOffset: (@shadowDistance / 2);\n@shadowBoxShadow: 0px -@shadowDistance 0px 0px @borderColor inset;\n@backgroundColor: #FAFAFA;\n@backgroundImage: linear-gradient(rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.09));\n@boxShadow:\n  0px 0px 0px 1px @borderColor inset,\n  @shadowBoxShadow\n;\n\n/* Padding */\n@verticalPadding: 0.8em;\n@horizontalPadding: 1.5em;\n\n\n/*-------------------\n        Group\n--------------------*/\n\n@groupBoxShadow: none;\n@groupButtonBoxShadow:\n  0px 0px 0px 1px @borderColor inset,\n  @shadowBoxShadow\n;\n@verticalBoxShadow: 0px 0px 0px 1px @borderColor inset;\n@groupButtonOffset: 0px 0px 0px -1px;\n@verticalGroupOffset: 0px 0px -1px 0px;\n\n/*-------------------\n        States\n--------------------*/\n\n/* Hovered */\n@hoverBackgroundColor: '';\n@hoverBackgroundImage: linear-gradient(rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.13));\n@hoverBoxShadow: '';\n@hoverColor: @hoveredTextColor;\n@iconHoverOpacity: 0.85;\n\n/* Focused */\n@focusBackgroundColor: '';\n@focusBackgroundImage: '';\n@focusBoxShadow:\n  0px 0px 1px rgba(81, 167, 232, 0.8) inset,\n  0px 0px 3px 2px rgba(81, 167, 232, 0.8)\n;\n@focusColor: @hoveredTextColor;\n@iconFocusOpacity: 0.85;\n\n/* Pressed Down */\n@downBackgroundColor: #F1F1F1;\n@downBackgroundImage: '';\n@downBoxShadow:\n  0px 0px 0px 1px rgba(0, 0, 0, 0.1) inset,\n  0px 1px 4px 0px rgba(0, 0, 0, 0.1) inset !important\n;\n@downColor: @pressedTextColor;\n\n/* Active */\n@activeBackgroundColor: #DADADA;\n@activeBackgroundImage: none;\n@activeColor: @selectedTextColor;\n@activeBoxShadow:\n  0px 0px 0px 1px rgba(0, 0, 0, 0.1) inset,\n  0px 1px 4px 0px rgba(0, 0, 0, 0.1) inset !important\n;\n\n/* Active + Hovered */\n@activeHoverBackgroundColor: #DADADA;\n@activeHoverBackgroundImage: none;\n@activeHoverBoxShadow:\n  0px 0px 0px 1px rgba(0, 0, 0, 0.1) inset,\n  0px 1px 4px 0px rgba(0, 0, 0, 0.1) inset !important\n;\n@activeHoverColor: @selectedTextColor;\n\n/* Loading */\n@loadingBackgroundColor: #FFFFFF;\n\n/*-------------------\n        Types\n--------------------*/\n\n/* Labeled Icon */\n@labeledIconBackgroundColor: rgba(0, 0, 0, 0.05);\n@labeledIconLeftShadow: -1px 0px 0px 0px @labeledIconBorder inset;\n@labeledIconRightShadow: 1px 0px 0px 0px @labeledIconBorder inset;\n"
  },
  {
    "path": "semantic/src/themes/classic/elements/header.overrides",
    "content": "/*******************************\n           Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/themes/classic/elements/header.variables",
    "content": "/*******************************\n            Button\n*******************************/\n\n/*-------------------\n       Element\n--------------------*/\n\n@headerFont: 'Open Sans', Arial, sans-serif;\n\n@blockBackground: @offWhite @subtleGradient;\n@blockBoxShadow: @subtleShadow;"
  },
  {
    "path": "semantic/src/themes/classic/modules/progress.overrides",
    "content": "/*******************************\n            Progress\n*******************************/\n"
  },
  {
    "path": "semantic/src/themes/classic/modules/progress.variables",
    "content": "/*******************************\n            Progress\n*******************************/\n\n@background: rgba(0, 0, 0, 0.05);\n@boxShadow: 0px 0px 4px rgba(0, 0, 0, 0.1) inset;\n@barBackground: @subtleGradient #888888;\n@border: 1px solid @borderColor;\n@padding: @relative3px;"
  },
  {
    "path": "semantic/src/themes/classic/views/card.overrides",
    "content": "/*******************************\n             Item\n*******************************/\n/*-------------------\n         View\n--------------------*/\n\n/* Item */\n@background: #FFFFFF;\n@borderRadius: 0.325rem;\n@display: block;\n@float: left;\n@margin: 0em @horizontalSpacing @rowSpacing;\n@minHeight: 0px;\n@padding: 0em;\n@width: 300px;\n@boxShadow:\n  0px 0px 0px 1px @borderColor,\n  0px 3px 0px 0px @borderColor\n;\n@border: none;\n@zIndex: '';\n\n/* Item Group */\n@horizontalSpacing: 0.5em;\n@rowSpacing: 2.5em;\n@groupMargin: 1em -@horizontalSpacing;\n\n/*-------------------\n       Content\n--------------------*/\n\n/* Image */\n@imageBackground: @transparentBlack;\n@imagePadding: 0em;\n@imageBorderRadius: @borderRadius @borderRadius 0em 0em;\n@imageBoxShadow: none;\n@imageBorder: none;\n\n/* Content */\n@contentMargin: 0em;\n@contentPadding: 0.75em 1em;\n@contentFontSize: 1em;\n@contentBorder: none;\n@contentBorderRadius: 0em;\n@contentBoxShadow: none;\n\n/* Title */\n@titleMargin: 0em;\n@titleFont: @headerFont;\n@titleFontWeight: bold;\n@titleFontSize: 1.25em;\n@titleColor: @darkTextColor;\n\n/* Metadata */\n@metaColor: @lightTextColor;\n\n/* Description */\n@descriptionDistance: 0.75em;\n@descriptionColor: @lightTextColor;\n\n/* Image */\n@imageSpacing: 0.25em;\n@contentImageWidth: 2em;\n@contentImageVerticalAlign: middle;\n\n/* Paragraph */\n@paragraphDistance: 0.1em;\n\n/* Additional Content */\n@extraDisplay: absolute;\n@extraTop: 100%;\n@extraLeft: 0em;\n@extraWidth: 100%;\n\n@extraPadding: 0.5em 0.75em;\n@extraColor: @lightTextColor;\n@extraTransition: color @defaultDuration @defaultEasing;\n\n/*-------------------\n       States\n--------------------*/\n\n@hoverCursor: pointer;\n@hoverZIndex: 5;\n@hoverBorder: none;\n@hoverBoxShadow:\n  0px 0px 0px 1px @selectedBorderColor,\n  0px 3px 0px 0px @selectedBorderColor\n;\n\n\n/*-------------------\n      Variations\n--------------------*/\n\n/* Sizes */\n@medium: 1em;"
  },
  {
    "path": "semantic/src/themes/classic/views/card.variables",
    "content": "/*******************************\n             Card\n*******************************/\n\n/*-------------------\n         View\n--------------------*/\n\n/* Shadow */\n@shadowDistance: 0em;\n@padding: 0em;\n\n/*-------------------\n       Content\n--------------------*/\n\n/* Additional Content */\n@extraDivider: 1px solid rgba(0, 0, 0, 0.05);\n@extraBackground: #FAFAFA @subtleGradient;\n@extraPadding: 0.75em 1em;\n@extraBoxShadow: 0 1px 1px rgba(0, 0, 0, 0.15);\n@extraColor: @lightTextColor;\n"
  },
  {
    "path": "semantic/src/themes/colored/modules/checkbox.overrides",
    "content": ""
  },
  {
    "path": "semantic/src/themes/colored/modules/checkbox.variables",
    "content": "/* Checkbox */\n@checkboxActiveBackground: @primaryColor;\n@checkboxActiveBorderColor: @primaryColor;\n@checkboxActiveCheckColor: @white;\n\n@checkboxActiveFocusBackground: @primaryColorFocus;\n@checkboxActiveFocusBorderColor: @primaryColorFocus;\n@checkboxActiveFocusCheckColor: @white;\n\n@checkboxTransition: none;\n\n/* Radio */\n@radioActiveBackground: @white;\n@radioActiveBorderColor: @primaryColor;\n@radioActiveBulletColor: @primaryColor;\n\n@radioActiveFocusBackground: @white;\n@radioActiveFocusBorderColor: @primaryColorFocus;\n@radioActiveFocusBulletColor: @primaryColorFocus;\n\n/* Slider */\n@sliderOnLineColor: @primaryColor;\n@sliderOnFocusLineColor: @primaryColorFocus;\n\n/* Handle */\n@handleBackground: @white @subtleGradient;\n@handleBoxShadow:\n  0px 0px 0px 1px @selectedBorderColor inset\n;\n"
  },
  {
    "path": "semantic/src/themes/default/collections/breadcrumb.overrides",
    "content": "/*******************************\n         Theme Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/themes/default/collections/breadcrumb.variables",
    "content": "/*******************************\n          Breadcrumb\n*******************************/\n\n/*-------------------\n     Breadcrumb\n--------------------*/\n\n@verticalMargin: 0em;\n@display: inline-block;\n@verticalAlign: middle;\n\n@dividerSpacing: @3px;\n@dividerOpacity: 0.7;\n@dividerColor: @lightTextColor;\n\n@dividerSize: @relativeSmall;\n@dividerVerticalAlign: baseline;\n\n@iconDividerSize: @relativeTiny;\n@iconDividerVerticalAlign: baseline;\n\n@sectionMargin: 0em;\n@sectionPadding: 0em;\n\n/* Coupling */\n@segmentPadding: @relativeMini @relativeMedium;\n\n/*-------------------\n       States\n--------------------*/\n\n@activeFontWeight: @bold;\n"
  },
  {
    "path": "semantic/src/themes/default/collections/form.overrides",
    "content": "/*******************************\n         Theme Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/themes/default/collections/form.variables",
    "content": "/*******************************\n             Form\n*******************************/\n\n/*-------------------\n       Elements\n--------------------*/\n\n/* Form */\n@gutterWidth: 1em;\n@rowDistance: 1em;\n\n/* Text */\n@paragraphMargin: @rowDistance 0em;\n\n/* Field */\n@fieldMargin: 0em 0em @rowDistance;\n\n/* Fields */\n@fieldsMargin: 0em -(@gutterWidth / 2) @rowDistance;\n\n/* Form Label */\n@labelDistance: @4px;\n@labelMargin: 0em 0em @labelDistance 0em;\n@labelFontSize: @relativeSmall;\n@labelFontWeight: @bold;\n@labelTextTransform: none;\n@labelColor: @textColor;\n\n/* Input */\n@inputFont: @pageFont;\n@inputWidth: 100%;\n@inputFontSize: 1em;\n@inputPadding: (@inputVerticalPadding + ((1em - @inputLineHeight) / 2)) @inputHorizontalPadding;\n@inputBorder: 1px solid @borderColor;\n@inputBorderRadius: @absoluteBorderRadius;\n@inputColor: @textColor;\n@inputTransition:\n  color @defaultDuration @defaultEasing,\n  border-color @defaultDuration @defaultEasing\n;\n@inputBoxShadow: 0em 0em 0em 0em transparent inset;\n\n/* Select */\n@selectBackground: @white;\n@selectBorderRadius: @inputBorderRadius;\n@selectBorder: @inputBorder;\n@selectPadding: 0.62em @inputHorizontalPadding;\n@selectBoxShadow: @inputBoxShadow;\n@selectTransition: @inputTransition;\n@selectColor: @inputColor;\n\n/* Text Area */\n@textAreaPadding: @inputVerticalPadding @inputHorizontalPadding;\n@textAreaHeight: 12em;\n@textAreaResize: vertical;\n@textAreaLineHeight: 1.2857;\n@textAreaMinHeight: 8em;\n@textAreaMaxHeight: 24em;\n@textAreaBackground: @inputBackground;\n@textAreaBorder: @inputBorder;\n@textAreaFontSize: @inputFontSize;\n@textAreaTransition: @inputTransition;\n\n/* Checkbox */\n@checkboxVerticalAlign: top;\n@checkboxLabelFontSize: 1em;\n@checkboxLabelTextTransform: @labelTextTransform;\n\n/* Inline Validation Prompt */\n@promptBackground: @white;\n@promptBorderColor: @formErrorBorder;\n@promptBorder: 1px solid @promptBorderColor;\n@promptTextColor: @formErrorColor;\n@inlinePromptMargin: -0.25em 0em -0.5em 0.5em;\n@inlinePromptBorderWidth: 1px;\n\n/*-------------------\n        States\n--------------------*/\n\n/* Focus */\n@inputFocusPointerSize: 0px;\n\n/* Input Focus */\n@inputFocusBackground: @inputBackground;\n@inputFocusBorderColor: @focusedFormBorderColor;\n@inputFocusColor: @selectedTextColor;\n@inputFocusBoxShadow: @inputFocusPointerSize 0em 0em 0em @selectedBorderColor inset;\n@inputFocusBorderRadius: @inputBorderRadius;\n\n/* Text Area Focus */\n@textAreaFocusBackground: @inputFocusBackground;\n@textAreaFocusBorderColor: @inputFocusBorderColor;\n@textAreaFocusColor: @inputFocusColor;\n@textAreaFocusBoxShadow: @inputFocusBoxShadow;\n@textAreaFocusBorderRadius: @inputFocusBorderRadius;\n\n/* Disabled */\n@disabledLabelOpacity: @disabledOpacity;\n\n/* Errored Input */\n@formErrorColor: @negativeTextColor;\n@formErrorBorder: @negativeBorderColor;\n@formErrorBackground: @negativeBackgroundColor;\n\n/* AutoFill */\n@inputAutoFillBackground: #FFFFF0;\n@inputAutoFillBorder: #E5DFA1;\n@inputAutoFillFocusBackground: @inputAutoFillBackground;\n@inputAutoFillFocusBorder: #D5C315;\n@inputAutoFillErrorBackground: #FFFAF0;\n@inputAutoFillErrorBorder: #E0B4B4;\n\n\n/* Input Error */\n@inputErrorBorderRadius: '';\n@inputErrorBoxShadow: none;\n\n/* Dropdown Error */\n@dropdownErrorHoverBackground: #FBE7E7;\n@dropdownErrorSelectedBackground: @dropdownErrorHoverBackground;\n@dropdownErrorActiveBackground: #FDCFCF;\n@dropdownErrorLabelBackground: #EACBCB;\n@dropdownErrorLabelColor: @errorTextColor;\n\n/* Focused Error */\n@inputErrorFocusBackground: @negativeBackgroundColor;\n@inputErrorFocusColor: @negativeTextColor;\n@inputErrorFocusBorder: @negativeBorderColor;\n@inputErrorFocusBoxShadow: none;\n\n/* Placeholder Error */\n@inputErrorPlaceholderColor: lighten(@formErrorColor, 40);\n@inputErrorPlaceholderFocusColor: lighten(@formErrorColor, 30);\n\n/* Loading Dimmer */\n@loaderDimmerColor: rgba(255, 255, 255, 0.8);\n@loaderDimmerZIndex: 100;\n\n/* Loading Spinner */\n@loaderSize: 3em;\n@loaderLineZIndex: 101;\n\n/*-------------------\n        Types\n--------------------*/\n\n/* Required */\n@requiredContent: '*';\n@requiredColor: @negativeColor;\n@requiredVerticalOffset: -0.2em;\n@requiredDistance: 0.2em;\n@requiredMargin: @requiredVerticalOffset 0em 0em @requiredDistance;\n\n/* Inverted */\n@invertedInputBackground: @inputBackground;\n@invertedInputBorderColor: @whiteBorderColor;\n@invertedInputBoxShadow: @inputBoxShadow;\n@invertedInputColor: @inputColor;\n@invertedLabelColor: @invertedTextColor;\n@invertedInputBoxShadow: none;\n\n/*-------------------\n      Variations\n--------------------*/\n\n/* Grouped Fields */\n@groupedMargin: @fieldMargin;\n@groupedFieldMargin: 0.5em 0em;\n\n@groupedLabelDistance: @labelDistance;\n@groupedLabelColor: @labelColor;\n@groupedLabelMargin: @labelMargin;\n@groupedLabelFontSize: @labelFontSize;\n@groupedLabelFontWeight: @labelFontWeight;\n@groupedLabelTextTransform: @labelTextTransform;\n\n\n/* Inline */\n@inlineInputSize: @relativeMedium;\n\n@inlineLabelDistance: @relativeTiny;\n@inlineLabelColor: @labelColor;\n@inlineLabelFontSize: @labelFontSize;\n@inlineLabelFontWeight: @labelFontWeight;\n@inlineLabelTextTransform: @labelTextTransform;\n\n@groupedInlineLabelMargin: 0.035714em 1em 0em 0em;\n\n/*-------------------\n       Groups\n--------------------*/\n\n@inlineFieldsMargin: 0em 1em 0em 0em;\n"
  },
  {
    "path": "semantic/src/themes/default/collections/grid.overrides",
    "content": "/*******************************\n         Theme Overrides\n*******************************/\n\n"
  },
  {
    "path": "semantic/src/themes/default/collections/grid.variables",
    "content": "/*******************************\n             Grid\n*******************************/\n\n/* Inherited From Site */\n\n// @mobileBreakpoint\n// @tabletBreakpoint\n// @computerBreakpoint\n// @largeMonitorBreakpoint\n// @widescreenMonitorBreakpoint\n\n/*******************************\n            Grid\n*******************************/\n\n@minWidth: 320px;\n\n@gutterWidth: 2rem;\n@rowSpacing: 2rem;\n\n@tableWidth: ~\"calc(100% + \"@gutterWidth~\")\";\n@columnMaxImageWidth: 100%;\n\n@consecutiveGridDistance: (@rowSpacing / 2);\n\n/*******************************\n           Variations\n*******************************/\n\n/*--------------\n     Relaxed\n---------------*/\n\n@relaxedGutterWidth: 3rem;\n@veryRelaxedGutterWidth: 5rem;\n\n/*--------------\n     Divided\n---------------*/\n\n@dividedBorder: -1px 0px 0px 0px @borderColor;\n@verticallyDividedBorder: 0px -1px 0px 0px @borderColor;\n\n@dividedInvertedBorder: -1px 0px 0px 0px @whiteBorderColor;\n@verticallyDividedInvertedBorder: 0px -1px 0px 0px @whiteBorderColor;\n\n/*--------------\n    Celled\n---------------*/\n\n@celledMargin: 1em 0em;\n@celledWidth: 1px;\n@celledBorderColor: @solidBorderColor;\n\n@celledPadding: 1em;\n@celledRelaxedPadding: 1.5em;\n@celledVeryRelaxedPadding: 2em;\n\n@celledGridDivider: 0px 0px 0px @celledWidth @celledBorderColor;\n@celledRowDivider: 0px (-@celledWidth) 0px 0px @celledBorderColor;\n@celledColumnDivider: (-@celledWidth) 0px 0px 0px @celledBorderColor;\n\n\n/*--------------\n    Stackable\n---------------*/\n\n@stackableRowSpacing: @rowSpacing;\n@stackableGutter: @gutterWidth;\n@stackableMobileBorder: 1px solid @borderColor;\n@stackableInvertedMobileBorder: 1px solid @whiteBorderColor;\n\n\n/*******************************\n             Legacy\n*******************************/\n\n/*--------------\n     Page\n---------------*/\n\n/* Legacy (DO NOT USE)\n */\n@mobileWidth: auto;\n@mobileMargin: 0em;\n@mobileGutter: 0em;\n\n@tabletWidth: auto;\n@tabletMargin: 0em;\n@tabletGutter: 2em;\n\n@computerWidth: auto;\n@computerMargin: 0em;\n@computerGutter: 3%;\n\n@largeMonitorWidth: auto;\n@largeMonitorMargin: 0em;\n@largeMonitorGutter: 15%;\n\n@widescreenMonitorWidth: auto;\n@widescreenMargin: 0em;\n@widescreenMonitorGutter: 23%;"
  },
  {
    "path": "semantic/src/themes/default/collections/menu.overrides",
    "content": "/*******************************\n         Theme Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/themes/default/collections/menu.variables",
    "content": "/*******************************\n             Menu\n*******************************/\n\n/*-------------------\n      Collection\n--------------------*/\n\n/* Menu */\n@verticalMargin: @medium;\n@horizontalMargin: 0em;\n@margin: @verticalMargin @horizontalMargin;\n@background: #FFFFFF;\n@fontFamily: @pageFont;\n@itemBackground: none;\n@fontWeight: @normal;\n@borderWidth: 1px;\n@border: @borderWidth solid @borderColor;\n@boxShadow: @subtleShadow;\n@borderRadius: @defaultBorderRadius;\n@minHeight: (@itemVerticalPadding * 2) + 1em;\n\n/* Menu Item */\n@itemVerticalPadding: @relativeSmall;\n@itemHorizontalPadding: @relativeLarge;\n@itemTextTransform: none;\n@itemTransition:\n  background @defaultDuration @defaultEasing,\n  box-shadow @defaultDuration @defaultEasing,\n  color @defaultDuration @defaultEasing\n;\n@itemFontWeight: @normal;\n@itemTextColor: @textColor;\n\n/* Divider */\n@dividerSize: 1px;\n@dividerBackground: @internalBorderColor;\n\n/* Sub Menu */\n@subMenuDistance: 0.5em;\n@subMenuMargin: @subMenuDistance -@itemHorizontalPadding 0em;\n@subMenuFontSize: @relativeTiny;\n@subMenuTextColor: rgba(0, 0, 0, 0.5);\n\n@subMenuIndent: 0em;\n@subMenuHorizontalPadding: (@itemHorizontalPadding / @tinySize) + @subMenuIndent;\n@subMenuVerticalPadding: 0.5em;\n\n/* Text Item */\n@textLineHeight: 1.3;\n\n/*--------------\n    Elements\n---------------*/\n\n/* Icon */\n@iconFloat: none;\n@iconMargin: 0em @relative5px 0em 0em;\n@iconOpacity: 0.9;\n\n/* Dropdown Icon */\n@dropdownIconFloat: right;\n@dropdownIconDistance: 1em;\n\n/* Header */\n@headerBackground: '';\n@headerWeight: @bold;\n@headerTextTransform: @normal;\n\n/* Vertical Icon */\n@verticalIconFloat: right;\n@verticalIconMargin: 0em 0em 0em 0.5em;\n\n/* Vertical Header */\n@verticalHeaderMargin: 0em 0em 0.5em;\n@verticalHeaderFontSize: @relativeMedium;\n@verticalHeaderFontWeight: @bold;\n\n/* Pointing Arrow */\n@arrowSize: @relative8px;\n@arrowBorderWidth: 1px;\n@arrowBorder: @arrowBorderWidth solid @solidBorderColor;\n@arrowTransition: background @defaultDuration @defaultEasing;\n@arrowZIndex: 2;\n\n@arrowHoverColor: #F2F2F2;\n@arrowActiveColor: @arrowHoverColor;\n@arrowActiveHoverColor: @arrowActiveColor;\n\n@arrowVerticalHoverColor: @arrowHoverColor;\n@arrowVerticalActiveColor: @arrowActiveColor;\n@arrowVerticalSubMenuColor: @white;\n\n/*--------------\n    Couplings\n---------------*/\n\n/* Button */\n@buttonSize: @relativeMedium;\n@buttonOffset: 0em;\n@buttonMargin: -0.5em 0em;\n@buttonVerticalPadding: @relativeMini;\n\n/* Input */\n@inputSize: @relativeMedium;\n@inputVerticalMargin: -0.5em;\n@inputOffset: 0em;\n@inputVerticalPadding: @relative8px;\n\n/* Image */\n@imageMargin: -0.3em 0em;\n@imageWidth: 2.5em;\n@verticalImageWidth: auto;\n\n/* Label */\n@labelOffset: -0.15em;\n@labelBackground: #999999;\n@labelTextColor: @white;\n\n@labelTextMargin: 1em;\n@labelVerticalPadding: 0.3em;\n@labelHorizontalPadding: @relativeMini;\n\n@labelAndIconFloat: none;\n@labelAndIconMargin: 0em 0.5em 0em 0em;\n\n/* Dropdown in Menu */\n@dropdownMenuBoxShadow: 0px 1px 3px 0px rgba(0, 0, 0, 0.08);\n\n@dropdownBackground: #FFFFFF;\n@dropdownMenuDistance: 0em;\n@dropdownMenuBorderRadius: @borderRadius;\n\n@dropdownItemFontSize: @relativeMedium;\n@dropdownItemPadding: @relativeMini @relativeLarge;\n@dropdownItemBackground: transparent;\n@dropdownItemColor: @textColor;\n@dropdownItemTextTransform: none;\n@dropdownItemFontWeight: @normal;\n@dropdownItemBoxShadow: none;\n@dropdownItemTransition: none;\n\n@dropdownItemIconFloat: none;\n@dropdownItemIconFontSize: @relativeMedium;\n@dropdownItemIconMargin: 0em 0.75em 0em 0em;\n\n@dropdownHoveredItemBackground: @transparentBlack;\n@dropdownHoveredItemColor: @selectedTextColor;\n\n/* Dropdown Variations */\n@dropdownVerticalMenuBoxShadow: 0 1px 3px 0px rgba(0, 0, 0, 0.08);\n@secondaryDropdownMenuDistance: @relative5px;\n@pointingDropdownMenuDistance: 0.75em;\n@invertedSelectionDropdownColor: @invertedTextColor;\n\n/*--------------\n     States\n---------------*/\n\n/* Hovered Item */\n@hoverItemBackground: @subtleTransparentBlack;\n@hoverItemTextColor: @selectedTextColor;\n\n/* Pressed Item */\n@pressedItemBackground: @subtleTransparentBlack;\n@pressedItemTextColor: @hoverItemTextColor;\n\n\n/* Active Item */\n@activeItemBackground: @transparentBlack;\n@activeItemTextColor: @selectedTextColor;\n@activeItemFontWeight: @normal;\n@activeIconOpacity: 1;\n@activeItemBoxShadow: none;\n\n/* Active Hovered Item */\n@activeHoverItemBackground: @transparentBlack;\n@activeHoverItemColor: @selectedTextColor;\n\n/* Selected Dropdown */\n@dropdownSelectedItemBackground: @transparentBlack;\n@dropdownSelectedItemColor: @selectedTextColor;\n\n/* Active Dropdown */\n@dropdownActiveItemBackground: @subtleTransparentBlack;\n@dropdownActiveItemColor: @selectedTextColor;\n@dropdownActiveItemFontWeight: @bold;\n\n/* Active Sub Menu */\n@subMenuActiveBackground: transparent;\n@subMenuActiveTextColor: @activeItemTextColor;\n@subMenuActiveFontWeight: @bold;\n\n\n/*--------------\n     Types\n---------------*/\n\n/* Vertical */\n@verticalBoxShadow: @boxShadow;\n@verticalPointerWidth: 2px;\n@verticalBackground: #FFFFFF;\n@verticalItemBackground: none;\n@verticalDividerBackground: @dividerBackground;\n\n@verticalActiveBoxShadow: none;\n\n\n/* Secondary */\n@secondaryBackground: none;\n@secondaryMargin: 0em -@secondaryItemSpacing;\n@secondaryItemBackground: none;\n@secondaryItemSpacing: @relative5px;\n@secondaryItemMargin: 0em @secondaryItemSpacing;\n@secondaryItemVerticalPadding: @relativeMini;\n@secondaryItemHorizontalPadding: @relativeSmall;\n@secondaryItemPadding: @relativeMini @relativeSmall;\n@secondaryItemBorderRadius: @defaultBorderRadius;\n@secondaryItemTransition: color @defaultDuration @defaultEasing;\n@secondaryItemColor: @unselectedTextColor;\n\n@secondaryHoverItemBackground: @transparentBlack;\n@secondaryHoverItemColor: @selectedTextColor;\n\n@secondaryActiveItemBackground: @transparentBlack;\n@secondaryActiveItemColor: @selectedTextColor;\n@secondaryActiveHoverItemBackground: @transparentBlack;\n@secondaryActiveHoverItemColor: @selectedTextColor;\n\n@secondaryActiveHoveredItemBackground: @transparentBlack;\n@secondaryActiveHoveredItemColor: @selectedTextColor;\n\n@secondaryHeaderBackground: none transparent;\n@secondaryHeaderBorder: none;\n\n@secondaryItemVerticalSpacing: @secondaryItemSpacing;\n@secondaryVerticalItemMargin: 0em 0em @secondaryItemVerticalSpacing;\n@secondaryVerticalItemBorderRadius: @defaultBorderRadius;\n\n@secondaryMenuSubMenuMargin: 0em -@secondaryItemHorizontalPadding;\n@secondaryMenuSubMenuItemMargin: 0em;\n@secondarySubMenuHorizontalPadding: (@itemHorizontalPadding / @tinySize) + @subMenuIndent;\n@secondaryMenuSubMenuItemPadding: @relative7px @secondarySubMenuHorizontalPadding;\n\n/* Pointing */\n@secondaryPointingBorderWidth: 2px;\n@secondaryPointingBorderColor: @borderColor;\n@secondaryPointingItemVerticalPadding: @relativeTiny;\n@secondaryPointingItemHorizontalPadding: @relativeLarge;\n\n@secondaryPointingHoverTextColor: @textColor;\n\n@secondaryPointingActiveBorderColor: @black;\n@secondaryPointingActiveTextColor: @selectedTextColor;\n@secondaryPointingActiveFontWeight: @bold;\n\n@secondaryPointingActiveDropdownBorderColor: transparent;\n\n@secondaryPointingActiveHoverBorderColor: @secondaryPointingActiveBorderColor;\n@secondaryPointingActiveHoverTextColor: @secondaryPointingActiveTextColor;\n\n@secondaryPointingHeaderColor: @darkTextColor;\n@secondaryVerticalPointingItemMargin: 0em -@secondaryPointingBorderWidth 0em 0em;\n\n\n/* Inverted Secondary */\n@secondaryInvertedColor: @invertedLightTextColor;\n\n@secondaryInvertedHoverBackground: @transparentWhite;\n@secondaryInvertedHoverColor: @invertedSelectedTextColor;\n\n@secondaryInvertedActiveBackground: @strongTransparentWhite;\n@secondaryInvertedActiveColor: @invertedSelectedTextColor;\n\n/* Inverted Pointing */\n@secondaryPointingInvertedBorderColor: @whiteBorderColor;\n@secondaryPointingInvertedItemTextColor: @invertedTextColor;\n@secondaryPointingInvertedItemHeaderColor: @white;\n@secondaryPointingInvertedItemHoverTextColor: @selectedTextColor;\n@secondaryPointingInvertedActiveBorderColor: @white;\n@secondaryPointingInvertedActiveColor: @invertedSelectedTextColor;\n\n\n/* Tiered */\n@tieredActiveItemBackground: #FCFCFC;\n@tieredActiveMenuBackground: #FCFCFC;\n\n@tieredSubMenuTextTransform: @normal;\n@tieredSubMenuFontWeight: @normal;\n\n@tieredSubMenuColor: @lightTextColor;\n\n@tieredSubMenuHoverBackground: none transparent;\n@tieredSubMenuHoverColor: @hoveredTextColor;\n\n@tieredSubMenuActiveBackground: none transparent;\n@tieredSubMenuActiveColor: @selectedTextColor;\n\n@tieredInvertedSubMenuBackground: rgba(0, 0, 0, 0.2);\n\n\n/* Icon */\n@iconMenuTextAlign: center;\n@iconMenuItemColor: @black;\n@iconMenuInvertedItemColor: @white;\n\n\n/* Tabular */\n@tabularBorderColor: @solidBorderColor;\n@tabularBackgroundColor: transparent;\n@tabularBackground: none @tabularBackgroundColor;\n@tabularBorderWidth: 1px;\n@tabularOppositeBorderWidth: @tabularBorderWidth + 1px;\n@tabularVerticalPadding: @itemVerticalPadding;\n@tabularHorizontalPadding: @relativeHuge;\n@tabularBorderRadius: @defaultBorderRadius;\n@tabularTextColor: @itemTextColor;\n\n@tabularHoveredTextColor: @hoveredTextColor;\n\n@tabularVerticalBackground: none @tabularBackgroundColor;\n\n@tabularFluidOffset: 1px;\n@tabularFluidWidth: ~\"calc(100% + \"(@tabularFluidOffset * 2)~\")\";\n\n@tabularActiveBackground: none @white;\n@tabularActiveColor: @selectedTextColor;\n@tabularActiveBoxShadow: none;\n@tabularActiveWeight: @bold;\n\n\n\n/* Pagination */\n@paginationMinWidth: 3em;\n@paginationActiveBackground: @transparentBlack;\n@paginationActiveTextColor: @selectedTextColor;\n\n/* Labeled Icon */\n@labeledIconItemHorizontalPadding: @relativeMassive;\n@labeledIconSize: @relativeMassive;\n@labeledIconMinWidth: 6em;\n@labeledIconTextMargin: 0.5rem;\n\n\n/* Text */\n@textMenuItemSpacing: @relative7px;\n@textMenuMargin: @relativeMedium -(@textMenuItemSpacing);\n@textMenuItemColor: @mutedTextColor;\n@textMenuItemFontWeight: @normal;\n@textMenuItemMargin: 0em 0em;\n@textMenuItemPadding: @relative5px @textMenuItemSpacing;\n@textMenuItemTransition: opacity @defaultDuration @defaultEasing;\n\n@textMenuSubMenuMargin: 0em;\n@textMenuSubMenuItemMargin: 0em;\n@textMenuSubMenuItemPadding: @relative7px 0em;\n\n@textMenuActiveItemFontWeight: @normal;\n@textMenuActiveItemColor: @selectedTextColor;\n\n@textMenuHeaderSize: @relativeSmall;\n@textMenuHeaderColor: @darkTextColor;\n@textMenuHeaderFontWeight: @bold;\n@textMenuHeaderTextTransform: uppercase;\n\n@textVerticalMenuMargin: @relativeMedium 0em;\n@textVerticalMenuHeaderMargin: @relative8px 0em @relative10px;\n@textVerticalMenuItemMargin: @relative8px 0em;\n\n@textVerticalMenuIconFloat: none;\n@textVerticalMenuIconMargin: @iconMargin;\n\n\n/*--------------\n   Variations\n---------------*/\n\n/* Inverted */\n@invertedBackground: @black;\n@invertedBoxShadow: none;\n@invertedBorder: 0px solid transparent;\n@invertedHeaderBackground: transparent;\n\n@invertedItemBackground: transparent;\n@invertedItemTextColor: @invertedTextColor;\n\n/* Inverted Sub Menu */\n@invertedSubMenuBackground: transparent;\n@invertedSubMenuColor: @invertedUnselectedTextColor;\n\n/* Inverted Hover */\n@invertedHoverBackground: @transparentWhite;\n@invertedHoverColor: @invertedSelectedTextColor;\n\n@invertedSubMenuHoverBackground: transparent;\n@invertedSubMenuHoverColor: @invertedSelectedTextColor;\n\n/* Pressed */\n@invertedMenuPressedBackground: @transparentWhite;\n@invertedMenuPressedColor: @invertedSelectedTextColor;\n\n/* Inverted Active */\n@invertedActiveBackground: @strongTransparentWhite;\n@invertedActiveColor: @invertedSelectedTextColor;\n@invertedArrowActiveColor: #3D3E3F;\n\n/* Inverted Active Hover  */\n@invertedActiveHoverBackground: @invertedActiveBackground;\n@invertedActiveHoverColor: @white;\n@invertedArrowActiveHoverColor: @invertedArrowActiveColor;\n\n@invertedSubMenuActiveBackground: transparent;\n@invertedSubMenuActiveColor: @white;\n\n/* Inverted Menu Divider */\n@invertedDividerBackground: rgba(255, 255, 255, 0.08);\n@invertedVerticalDividerBackground: @invertedDividerBackground;\n\n/* Inverted Colored */\n@invertedColoredDividerBackground: @dividerBackground;\n@invertedColoredActiveBackground: @strongTransparentBlack;\n\n/* Fixed */\n@fixedPrecedingGridMargin: 2.75rem;\n\n/* Floated */\n@floatedDistance: 0.5rem;\n\n/* Attached */\n@attachedTopOffset: 0px;\n@attachedBottomOffset: 0px;\n@attachedHorizontalOffset: -@borderWidth;\n@attachedWidth: ~\"calc(100% + \"-@attachedHorizontalOffset * 2~\")\";\n@attachedBoxShadow: none;\n@attachedBorder: @borderWidth solid @solidBorderColor;\n@attachedBottomBoxShadow:\n  @boxShadow,\n  @attachedBoxShadow\n;\n\n/* Resize large sizes */\n@mini: @11px;\n@tiny: @12px;\n@small: @13px;\n@large: @15px;\n@big: @16px;\n@huge: @17px;\n@massive: @18px;\n\n/* Sizes */\n@miniWidth: 9rem;\n@tinyWidth: 11rem;\n@smallWidth: 13rem;\n@mediumWidth: 15rem;\n@largeWidth: 18rem;\n@bigWidth: 20rem;\n@hugeWidth: 22rem;\n@massiveWidth: 25rem;\n"
  },
  {
    "path": "semantic/src/themes/default/collections/message.overrides",
    "content": "/*******************************\n         Theme Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/themes/default/collections/message.variables",
    "content": "/*******************************\n            Message\n*******************************/\n\n// @textColor\n\n/*-------------------\n       Elements\n--------------------*/\n\n@verticalMargin: 1em;\n@verticalPadding: 1em;\n@horizontalPadding: 1.5em;\n@padding: @verticalPadding @horizontalPadding;\n@background: #F8F8F9;\n@lineHeightOffset: ((@lineHeight - 1em) / 2);\n\n@borderRadius: @defaultBorderRadius;\n@borderWidth: 1px;\n@borderShadow: 0px 0px 0px @borderWidth @strongBorderColor inset;\n@shadowShadow: 0px 0px 0px 0px rgba(0, 0, 0, 0);\n@boxShadow:\n  @borderShadow,\n  @shadowShadow\n;\n\n@transition:\n  opacity @defaultDuration @defaultEasing,\n  color @defaultDuration @defaultEasing,\n  background @defaultDuration @defaultEasing,\n  box-shadow @defaultDuration @defaultEasing\n;\n\n/* Header */\n@headerFontSize: @relativeLarge;\n@headerFontWeight: @bold;\n@headerDisplay: block;\n@headerDistance: 0rem;\n@headerMargin: -@headerLineHeightOffset 0em @headerDistance 0em;\n@headerParagraphDistance: 0.25em;\n\n/* Paragraph */\n@messageTextOpacity: 0.85;\n@messageParagraphMargin: 0.75em;\n\n/* List */\n@listOpacity: 0.85;\n@listStylePosition: inside;\n@listMargin: 0.5em;\n@listItemIndent: 1em;\n@listItemMargin: 0.3em;\n\n/* Icon */\n@iconDistance: 0.6em;\n\n/* Close Icon */\n@closeTopDistance: @verticalPadding - @lineHeightOffset;\n@closeRightDistance: 0.5em;\n@closeOpacity: 0.7;\n@closeTransition: opacity @defaultDuration @defaultEasing;\n\n\n/*-------------------\n        Types\n--------------------*/\n\n/* Icon Message */\n@iconSize: 3em;\n@iconOpacity: 0.8;\n@iconContentDistance: 0rem;\n@iconVerticalAlign: middle;\n\n/* Attached */\n@attachedXOffset: -1px;\n@attachedYOffset: -1px;\n@attachedBoxShadow: 0em 0em 0em @borderWidth @borderColor inset;\n@attachedBottomBoxShadow:\n  @attachedBoxShadow,\n  @subtleShadow\n;\n\n/* Floating */\n@floatingBoxShadow:\n  @borderShadow,\n  @floatingShadow\n;\n\n/* Colors */\n@redBoxShadow:\n  0px 0px 0px @borderWidth @redBorderColor inset,\n  @shadowShadow\n;\n@orangeBoxShadow:\n  0px 0px 0px @borderWidth @orangeBorderColor inset,\n  @shadowShadow\n;\n@yellowBoxShadow:\n  0px 0px 0px @borderWidth @yellowBorderColor inset,\n  @shadowShadow\n;\n@oliveBoxShadow:\n  0px 0px 0px @borderWidth @oliveBorderColor inset,\n  @shadowShadow\n;\n@greenBoxShadow:\n  0px 0px 0px @borderWidth @greenBorderColor inset,\n  @shadowShadow\n;\n@tealBoxShadow:\n  0px 0px 0px @borderWidth @tealBorderColor inset,\n  @shadowShadow\n;\n@blueBoxShadow:\n  0px 0px 0px @borderWidth @blueBorderColor inset,\n  @shadowShadow\n;\n@violetBoxShadow:\n  0px 0px 0px @borderWidth @violetBorderColor inset,\n  @shadowShadow\n;\n@purpleBoxShadow:\n  0px 0px 0px @borderWidth @purpleBorderColor inset,\n  @shadowShadow\n;\n@pinkBoxShadow:\n  0px 0px 0px @borderWidth @pinkBorderColor inset,\n  @shadowShadow\n;\n@brownBoxShadow:\n  0px 0px 0px @borderWidth @brownBorderColor inset,\n  @shadowShadow\n;\n\n/* Warning / Positive / Negative / Info */\n@positiveBoxShadow:\n  0px 0px 0px @borderWidth @positiveBorderColor inset,\n  @shadowShadow\n;\n@negativeBoxShadow:\n  0px 0px 0px @borderWidth @negativeBorderColor inset,\n  @shadowShadow\n;\n@infoBoxShadow:\n  0px 0px 0px @borderWidth @infoBorderColor inset,\n  @shadowShadow\n;\n@warningBoxShadow:\n  0px 0px 0px @borderWidth @warningBorderColor inset,\n  @shadowShadow\n;\n@errorBoxShadow:\n  0px 0px 0px @borderWidth @errorBorderColor inset,\n  @shadowShadow\n;\n@successBoxShadow:\n  0px 0px 0px @borderWidth @successBorderColor inset,\n  @shadowShadow\n;\n"
  },
  {
    "path": "semantic/src/themes/default/collections/table.overrides",
    "content": ""
  },
  {
    "path": "semantic/src/themes/default/collections/table.variables",
    "content": "/*******************************\n             Table\n*******************************/\n\n/*-------------------\n       Element\n--------------------*/\n\n@verticalMargin: 1em;\n@horizontalMargin: 0em;\n@margin: @verticalMargin @horizontalMargin;\n@borderCollapse: separate;\n@borderSpacing: 0px;\n@borderRadius: @defaultBorderRadius;\n@transition:\n  background @defaultDuration @defaultEasing,\n  color @defaultDuration @defaultEasing\n;\n@background: @white;\n@color: @textColor;\n@borderWidth: 1px;\n@border: @borderWidth solid @borderColor;\n@boxShadow: none;\n@textAlign: left;\n\n/*--------------\n     Parts\n---------------*/\n\n/* Table Row */\n@rowBorder: 1px solid @internalBorderColor;\n\n/* Table Cell */\n@cellVerticalPadding: @relativeMini;\n@cellHorizontalPadding: @relativeMini;\n@cellVerticalAlign: inherit;\n@cellTextAlign: inherit;\n@cellBorder: 1px solid @internalBorderColor;\n\n/* Table Header */\n@headerBorder: 1px solid @internalBorderColor;\n@headerDivider: none;\n@headerBackground: @offWhite;\n@headerAlign: inherit;\n@headerVerticalAlign: inherit;\n@headerColor: @textColor;\n@headerVerticalPadding: @relativeSmall;\n@headerHorizontalPadding: @cellHorizontalPadding;\n@headerFontStyle: none;\n@headerFontWeight: @bold;\n@headerTextTransform: none;\n@headerBoxShadow: none;\n\n/* Table Footer */\n@footerBoxShadow: none;\n@footerBorder: 1px solid @borderColor;\n@footerDivider: none;\n@footerBackground: @offWhite;\n@footerAlign: inherit;\n@footerVerticalAlign: middle;\n@footerColor: @textColor;\n@footerVerticalPadding: @cellVerticalPadding;\n@footerHorizontalPadding: @cellHorizontalPadding;\n@footerFontStyle: @normal;\n@footerFontWeight: @normal;\n@footerTextTransform: none;\n\n/* Responsive Size */\n@responsiveHeaderDisplay: block;\n@responsiveFooterDisplay: block;\n@responsiveRowVerticalPadding: 1em;\n@responsiveRowBoxShadow: 0px -1px 0px 0px rgba(0, 0, 0, 0.1) inset !important;\n@responsiveCellVerticalPadding: 0.25em;\n@responsiveCellHorizontalPadding: 0.75em;\n@responsiveCellBoxShadow: none !important;\n@responsiveCellHeaderFontWeight: @bold;\n\n/*-------------------\n       Types\n--------------------*/\n\n/* Definition */\n@definitionPageBackground: @white;\n\n@definitionHeaderBackground: transparent;\n@definitionHeaderColor: @unselectedTextColor;\n@definitionHeaderFontWeight: @normal;\n\n@definitionFooterBackground: @definitionHeaderBackground;\n@definitionFooterColor: @definitionHeaderColor;\n@definitionFooterFontWeight: @definitionHeaderFontWeight;\n\n@definitionColumnBackground: @subtleTransparentBlack;\n@definitionColumnFontWeight: @bold;\n@definitionColumnColor: @selectedTextColor;\n@definitionColumnFontSize: @relativeMedium;\n@definitionColumnTextTransform: '';\n@definitionColumnBoxShadow: '';\n@definitionColumnTextAlign: '';\n@definitionColumnHorizontalPadding: '';\n\n\n/*--------------\n    Couplings\n---------------*/\n\n@iconVerticalAlign: baseline;\n\n/*--------------\n     States\n---------------*/\n\n@stateMarkerWidth: 0px;\n\n/* Positive */\n@positiveColor: @positiveTextColor;\n@positiveBoxShadow: @stateMarkerWidth 0px 0px @positiveBorderColor inset;\n@positiveBackgroundHover: darken(@positiveBackgroundColor, 3);\n@positiveColorHover: darken(@positiveColor, 3);\n\n/* Negative */\n@negativeColor: @negativeTextColor;\n@negativeBoxShadow: @stateMarkerWidth 0px 0px @negativeBorderColor inset;\n@negativeBackgroundHover: darken(@negativeBackgroundColor, 3);\n@negativeColorHover: darken(@negativeColor, 3);\n\n/* Error */\n@errorColor: @errorTextColor;\n@errorBoxShadow: @stateMarkerWidth 0px 0px @errorBorderColor inset;\n@errorBackgroundHover: darken(@errorBackgroundColor, 3);\n@errorColorHover: darken(@errorColor, 3);\n\n/* Warning */\n@warningColor: @warningTextColor;\n@warningBoxShadow: @stateMarkerWidth 0px 0px @warningBorderColor inset;\n@warningBackgroundHover: darken(@warningBackgroundColor, 3);\n@warningColorHover: darken(@warningColor, 3);\n\n/* Active */\n@activeColor: @textColor;\n@activeBackgroundColor: #E0E0E0;\n@activeBoxShadow: @stateMarkerWidth 0px 0px @activeColor inset;\n\n@activeBackgroundHover: #EFEFEF;\n@activeColorHover: @selectedTextColor;\n\n/*--------------\n     Types\n---------------*/\n\n/* Attached */\n@attachedTopOffset: 0px;\n@attachedBottomOffset: 0px;\n@attachedHorizontalOffset: -@borderWidth;\n@attachedWidth: ~\"calc(100% + \"-@attachedHorizontalOffset * 2~\")\";\n@attachedBoxShadow: none;\n@attachedBorder: @borderWidth solid @solidBorderColor;\n@attachedBottomBoxShadow:\n  @boxShadow,\n  @attachedBoxShadow\n;\n\n/* Striped */\n@stripedBackground: rgba(0, 0, 50, 0.02);\n@invertedStripedBackground: rgba(255, 255, 255, 0.05);\n\n/* Selectable */\n@selectableBackground: @transparentBlack;\n@selectableTextColor: @selectedTextColor;\n@selectableInvertedBackground: @transparentWhite;\n@selectableInvertedTextColor: @invertedSelectedTextColor;\n\n/* Sortable */\n@sortableBackground: '';\n@sortableColor: @textColor;\n\n@sortableBorder: 1px solid @borderColor;\n@sortableIconWidth: auto;\n@sortableIconDistance: 0.5em;\n@sortableIconOpacity: 0.8;\n@sortableIconFont: 'Icons';\n@sortableIconAscending: '\\f0d8';\n@sortableIconDescending: '\\f0d7';\n@sortableDisabledColor: @disabledTextColor;\n\n@sortableHoverBackground: @transparentBlack;\n@sortableHoverColor: @hoveredTextColor;\n\n@sortableActiveBackground: @transparentBlack;\n@sortableActiveColor: @selectedTextColor;\n\n@sortableActiveHoverBackground: @transparentBlack;\n@sortableActiveHoverColor: @selectedTextColor;\n\n@sortableInvertedBorderColor: transparent;\n@sortableInvertedHoverBackground: @transparentWhite @subtleGradient;\n@sortableInvertedHoverColor: @invertedHoveredTextColor;\n@sortableInvertedActiveBackground: @strongTransparentWhite @subtleGradient;\n@sortableInvertedActiveColor: @invertedSelectedTextColor;\n\n/* Colors */\n@coloredBorderSize: 0.2em;\n@coloredBorderRadius: 0em 0em @borderRadius @borderRadius;\n\n/* Inverted */\n@invertedBackground: #333333;\n@invertedBorder: none;\n@invertedCellBorderColor: @whiteBorderColor;\n@invertedCellColor: @invertedTextColor;\n\n@invertedHeaderBackground: @veryStrongTransparentBlack;\n@invertedHeaderColor: @invertedTextColor;\n@invertedHeaderBorderColor: @invertedCellBorderColor;\n\n@invertedDefinitionColumnBackground: @subtleTransparentWhite;\n@invertedDefinitionColumnColor: @invertedSelectedTextColor;\n@invertedDefinitionColumnFontWeight: @bold;\n\n/* Basic */\n@basicTableBackground: transparent;\n@basicTableBorder: @borderWidth solid @borderColor;\n@basicBoxShadow: none;\n\n@basicTableHeaderBackground: transparent;\n@basicTableCellBackground: transparent;\n@basicTableHeaderDivider: none;\n@basicTableCellBorder: 1px solid rgba(0, 0, 0, 0.1);\n@basicTableCellPadding: '';\n@basicTableStripedBackground: @transparentBlack;\n\n/* Padded */\n@paddedVerticalPadding: 1em;\n@paddedHorizontalPadding: 1em;\n@veryPaddedVerticalPadding: 1.5em;\n@veryPaddedHorizontalPadding: 1.5em;\n\n/* Compact */\n@compactVerticalPadding: 0.5em;\n@compactHorizontalPadding: 0.7em;\n@veryCompactVerticalPadding: 0.4em;\n@veryCompactHorizontalPadding: 0.6em;\n\n\n/* Sizes */\n@small: 0.9em;\n@medium: 1em;\n@large: 1.1em;\n"
  },
  {
    "path": "semantic/src/themes/default/elements/button.overrides",
    "content": "/*******************************\n         Theme Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/themes/default/elements/button.variables",
    "content": "/*******************************\n            Button\n*******************************/\n\n/*-------------------\n       Element\n--------------------*/\n\n/* Button */\n@verticalMargin: 0em;\n@horizontalMargin: 0.25em;\n@backgroundColor: #E0E1E2;\n@backgroundImage: none;\n@background: @backgroundColor @backgroundImage;\n@lineHeight: 1em;\n\n/* Button defaults to using same height as input globally */\n@verticalPadding: @inputVerticalPadding;\n@horizontalPadding: 1.5em;\n\n/* Text */\n@textTransform: none;\n@tapColor: transparent;\n@fontFamily: @pageFont;\n@fontWeight: @bold;\n@textColor: rgba(0, 0, 0, 0.6);\n@textShadow: none;\n@invertedTextShadow: @textShadow;\n@borderRadius: @defaultBorderRadius;\n@verticalAlign: baseline;\n\n/* Internal Shadow */\n@shadowDistance: 0em;\n@shadowOffset: (@shadowDistance / 2);\n@shadowBoxShadow: 0px -@shadowDistance 0px 0px @borderColor inset;\n\n/* Box Shadow */\n@borderBoxShadowColor: transparent;\n@borderBoxShadowWidth: 1px;\n@borderBoxShadow: 0px 0px 0px @borderBoxShadowWidth @borderBoxShadowColor inset;\n@boxShadow:\n  @borderBoxShadow,\n  @shadowBoxShadow\n;\n\n/* Icon */\n@iconHeight: @relativeTiny;\n@iconOpacity: 0.8;\n@iconDistance: @relative6px;\n@iconColor: '';\n@iconTransition: opacity @defaultDuration @defaultEasing;\n@iconVerticalAlign: '';\n\n@iconMargin: 0em @iconDistance 0em -(@iconDistance / 2);\n@rightIconMargin: 0em -(@iconDistance / 2) 0em @iconDistance;\n\n/* Loader */\n@invertedLoaderFillColor: rgba(0, 0, 0, 0.15);\n\n@transition:\n  opacity @defaultDuration @defaultEasing,\n  background-color @defaultDuration @defaultEasing,\n  color @defaultDuration @defaultEasing,\n  box-shadow @defaultDuration @defaultEasing,\n  background @defaultDuration @defaultEasing\n;\n/*\n@willChange: box-shadow, transform, opacity, color, background;\n*/\n@willChange: '';\n\n/*-------------------\n        Group\n--------------------*/\n\n@groupBoxShadow: none;\n@groupButtonBoxShadow: @boxShadow;\n@verticalBoxShadow: none;\n@groupButtonOffset: 0px 0px 0px 0px;\n@verticalGroupOffset: 0px 0px 0px 0px;\n\n/*-------------------\n        States\n--------------------*/\n\n/* Hovered */\n@hoverBackgroundColor: #CACBCD;\n@hoverBackgroundImage: @backgroundImage;\n@hoverBoxShadow: @boxShadow;\n@hoverColor: @hoveredTextColor;\n@iconHoverOpacity: 0.85;\n\n/* Focused */\n@focusBackgroundColor: @hoverBackgroundColor;\n@focusBackgroundImage: '';\n@focusBoxShadow: '';\n@focusColor: @hoveredTextColor;\n@iconFocusOpacity: 0.85;\n\n/* Disabled */\n@disabledBackgroundImage: none;\n@disabledBoxShadow: none;\n\n/* Pressed Down */\n@downBackgroundColor: #BABBBC;\n@downBackgroundImage: '';\n@downPressedShadow: none;\n@downBoxShadow:\n  @borderBoxShadow,\n  @downPressedShadow\n;\n@downColor: @pressedTextColor;\n\n/* Active */\n@activeBackgroundColor: #C0C1C2;\n@activeBackgroundImage: none;\n@activeColor: @selectedTextColor;\n@activeBoxShadow: @borderBoxShadow;\n\n/* Active + Hovered */\n@activeHoverBackgroundColor: @activeBackgroundColor;\n@activeHoverBackgroundImage: none;\n@activeHoverColor: @activeColor;\n@activeHoverBoxShadow: @activeBoxShadow;\n\n/* Loading */\n@loadingOpacity: 1;\n@loadingPointerEvents: auto;\n@loadingTransition:\n  all 0s linear,\n  opacity @defaultDuration @defaultEasing\n;\n\n/*-------------------\n        Types\n--------------------*/\n\n/* Or */\n@orText: 'or';\n\n@orGap: 0.3em;\n@orHeight: (@verticalPadding * 2) + 1em;\n@orZIndex: 3;\n\n@orCircleDistanceToEdge: (@verticalPadding);\n@orCircleSize: @orHeight - @orCircleDistanceToEdge;\n@orLineHeight: (@orCircleSize);\n@orBoxShadow: @borderBoxShadow;\n\n@orVerticalOffset: -(@orCircleSize / 2);\n@orHorizontalOffset: -(@orCircleSize / 2);\n\n@orBackgroundColor: @white;\n@orTextShadow: @invertedTextShadow;\n@orTextStyle: @normal;\n@orTextWeight: @bold;\n@orTextColor: @lightTextColor;\n\n\n@orSpacerHeight: @verticalPadding;\n@orSpacerColor: transparent;\n\n/* Icon */\n@iconButtonOpacity: 0.9;\n\n/* Labeled */\n@labeledLabelFontSize: @medium;\n@labeledLabelAlign: center;\n@labeledLabelPadding: '';\n@labeledLabelFontSize: @relativeMedium;\n@labeledLabelBorderColor: @borderColor;\n@labeledLabelBorderOffset: -@borderBoxShadowWidth;\n@labeledTagLabelSize: 1.85em; /* hypotenuse of triangle */\n@labeledIconMargin: 0em;\n\n/* Labeled Icon */\n@labeledIconWidth: 1em + (@verticalPadding * 2);\n@labeledIconBackgroundColor: rgba(0, 0, 0, 0.05);\n@labeledIconPadding: (@horizontalPadding + @labeledIconWidth);\n@labeledIconBorder: transparent;\n@labeledIconColor: '';\n\n@labeledIconLeftShadow: -1px 0px 0px 0px @labeledIconBorder inset;\n@labeledIconRightShadow: 1px 0px 0px 0px @labeledIconBorder inset;\n\n\n/* Inverted */\n@invertedBorderSize: 2px;\n@invertedTextColor: @white;\n@invertedTextHoverColor: @hoverColor;\n@invertedGroupButtonOffset: 0px 0px 0px -(@invertedBorderSize);\n@invertedVerticalGroupButtonOffset: 0px 0px -(@invertedBorderSize) 0px;\n\n/* Basic */\n@basicBorderRadius: @borderRadius;\n@basicBorderSize: 1px;\n@basicTextColor: @textColor;\n@basicColoredBorderSize: 1px;\n\n@basicBackground: transparent none;\n@basicFontWeight: @normal;\n@basicBorder: 1px solid @borderColor;\n@basicBoxShadow: 0px 0px 0px @basicBorderSize @borderColor inset;\n@basicLoadingColor: @offWhite;\n@basicTextTransform: none;\n\n/* Basic Hover */\n@basicHoverBackground: #FFFFFF;\n@basicHoverTextColor: @hoveredTextColor;\n@basicHoverBoxShadow:\n  0px 0px 0px @basicBorderSize @selectedBorderColor inset,\n  0px 0px 0px 0px @borderColor inset\n;\n/* Basic Focus */\n@basicFocusBackground: @basicHoverBackground;\n@basicFocusTextColor: @basicHoverTextColor;\n@basicFocusBoxShadow: @basicHoverBoxShadow;\n\n/* Basic Down */\n@basicDownBackground: #F8F8F8;\n@basicDownTextColor: @pressedTextColor;\n@basicDownBoxShadow:\n  0px 0px 0px @basicBorderSize rgba(0, 0, 0, 0.15) inset,\n  0px 1px 4px 0px @borderColor inset\n;\n/* Basic Active */\n@basicActiveBackground: @transparentBlack;\n@basicActiveBoxShadow: '';\n@basicActiveTextColor: @selectedTextColor;\n\n/* Basic Inverted */\n@basicInvertedBackground: transparent;\n@basicInvertedFocusBackground: transparent;\n@basicInvertedDownBackground: @transparentWhite;\n@basicInvertedActiveBackground: @transparentWhite;\n\n@basicInvertedBoxShadow: 0px 0px 0px @invertedBorderSize rgba(255, 255, 255, 0.5) inset;\n@basicInvertedHoverBoxShadow: 0px 0px 0px @invertedBorderSize rgba(255, 255, 255, 1) inset;\n@basicInvertedFocusBoxShadow: 0px 0px 0px @invertedBorderSize rgba(255, 255, 255, 1) inset;\n@basicInvertedDownBoxShadow: 0px 0px 0px @invertedBorderSize rgba(255, 255, 255, 0.9) inset;\n@basicInvertedActiveBoxShadow: 0px 0px 0px @invertedBorderSize rgba(255, 255, 255, 0.7) inset;\n\n@basicInvertedColor: @darkWhite;\n@basicInvertedHoverColor: @darkWhiteHover;\n@basicInvertedDownColor: @darkWhiteActive;\n@basicInvertedActiveColor: @invertedTextColor;\n\n\n/* Basic Group */\n@basicGroupBorder: @basicBorderSize solid @borderColor;\n@basicGroupBoxShadow: none;\n\n/*-------------------\n      Variations\n--------------------*/\n\n/* Colors */\n@coloredBackgroundImage: none;\n@coloredBoxShadow: @shadowBoxShadow;\n\n/* Colored */\n@brownTextColor: @invertedTextColor;\n@brownTextShadow: @invertedTextShadow;\n@redTextColor: @invertedTextColor;\n@redTextShadow: @invertedTextShadow;\n@orangeTextColor: @invertedTextColor;\n@orangeTextShadow: @invertedTextShadow;\n@greenTextColor: @invertedTextColor;\n@greenTextShadow: @invertedTextShadow;\n@blueTextColor: @invertedTextColor;\n@blueTextShadow: @invertedTextShadow;\n@violetTextColor: @invertedTextColor;\n@violetTextShadow: @invertedTextShadow;\n@purpleTextColor: @invertedTextColor;\n@purpleTextShadow: @invertedTextShadow;\n@pinkTextColor: @invertedTextColor;\n@pinkTextShadow: @invertedTextShadow;\n@blackTextColor: @invertedTextColor;\n@blackTextShadow: @invertedTextShadow;\n@oliveTextColor: @invertedTextColor;\n@oliveTextShadow: @invertedTextShadow;\n@yellowTextColor: @invertedTextColor;\n@yellowTextShadow: @invertedTextShadow;\n@tealTextColor: @invertedTextColor;\n@tealTextShadow: @invertedTextShadow;\n@greyTextColor: @invertedTextColor;\n@greyTextShadow: @invertedTextShadow;\n\n/* Inverted */\n@lightBrownTextColor: @invertedTextColor;\n@lightBrownTextShadow: @invertedTextShadow;\n@lightRedTextColor: @invertedTextColor;\n@lightRedTextShadow: @invertedTextShadow;\n@lightOrangeTextColor: @invertedTextColor;\n@lightOrangeTextShadow: @invertedTextShadow;\n@lightGreenTextColor: @invertedTextColor;\n@lightGreenTextShadow: @invertedTextShadow;\n@lightBlueTextColor: @invertedTextColor;\n@lightBlueTextShadow: @invertedTextShadow;\n@lightVioletTextColor: @invertedTextColor;\n@lightVioletTextShadow: @invertedTextShadow;\n@lightPurpleTextColor: @invertedTextColor;\n@lightPurpleTextShadow: @invertedTextShadow;\n@lightPinkTextColor: @invertedTextColor;\n@lightPinkTextShadow: @invertedTextShadow;\n@lightBlackTextColor: @invertedTextColor;\n@lightBlackTextShadow: @invertedTextShadow;\n@lightOliveTextColor: @textColor;\n@lightOliveTextShadow: @textShadow;\n@lightYellowTextColor: @textColor;\n@lightYellowTextShadow: @textShadow;\n@lightTealTextColor: @textColor;\n@lightTealTextShadow: @textShadow;\n@lightGreyTextColor: @textColor;\n@lightGreyTextShadow: @textShadow;\n\n\n/* Ordinality */\n@primaryBackgroundImage: @coloredBackgroundImage;\n@primaryTextColor: @invertedTextColor;\n@primaryTextShadow: @invertedTextShadow;\n@primaryBoxShadow: @coloredBoxShadow;\n\n@secondaryBackgroundImage: @coloredBackgroundImage;\n@secondaryTextColor: @invertedTextColor;\n@secondaryTextShadow: @invertedTextShadow;\n@secondaryBoxShadow: @coloredBoxShadow;\n\n@positiveBackgroundImage: @coloredBackgroundImage;\n@positiveTextColor: @invertedTextColor;\n@positiveTextShadow: @invertedTextShadow;\n@positiveBoxShadow: @coloredBoxShadow;\n\n@negativeBackgroundImage: @coloredBackgroundImage;\n@negativeTextColor: @invertedTextColor;\n@negativeTextShadow: @invertedTextShadow;\n@negativeBoxShadow: @coloredBoxShadow;\n\n/* Compact */\n@compactVerticalPadding: (@verticalPadding * 0.75);\n@compactHorizontalPadding: (@horizontalPadding * 0.75);\n\n/* Attached */\n@attachedOffset: -1px;\n@attachedBoxShadow: 0px 0px 0px 1px @borderColor;\n@attachedHorizontalPadding: 0.75em;\n@attachedZIndex: 2;\n\n/* Floated */\n@floatedMargin: 0.25em;\n\n/* Animated */\n@animatedVerticalAlign: middle;\n@animatedZIndex: 1;\n@animationDuration: 0.3s;\n@animationEasing: ease;\n@fadeScaleHigh: 1.5;\n@fadeScaleLow: 0.75;\n"
  },
  {
    "path": "semantic/src/themes/default/elements/container.overrides",
    "content": "/*******************************\n         Theme Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/themes/default/elements/container.variables",
    "content": "/*******************************\n            Container\n*******************************/\n\n/*-------------------\n       Element\n--------------------*/\n\n/* Minimum Gutter is used to determine  the maximum container width for a given device */\n\n@maxWidth: 100%;\n\n/* Devices */\n@mobileMinimumGutter: 0em;\n@mobileWidth: auto;\n@mobileGutter: 1em;\n\n@tabletMinimumGutter: (@emSize  * 1);\n@tabletWidth: @tabletBreakpoint - (@tabletMinimumGutter * 2) - @scrollbarWidth;\n@tabletGutter: auto;\n\n@computerMinimumGutter: (@emSize  * 1.5);\n@computerWidth: @computerBreakpoint - (@computerMinimumGutter * 2) - @scrollbarWidth;\n@computerGutter: auto;\n\n@largeMonitorMinimumGutter: (@emSize  * 2);\n@largeMonitorWidth: @largeMonitorBreakpoint - (@largeMonitorMinimumGutter * 2) - @scrollbarWidth;\n@largeMonitorGutter: auto;\n\n/* Coupling (Add Negative Margin to container size) */\n@gridGutterWidth: 2rem;\n@relaxedGridGutterWidth: 3rem;\n@veryRelaxedGridGutterWidth: 5rem;\n\n@mobileGridWidth: @mobileWidth;\n@tabletGridWidth: ~\"calc(\"@tabletWidth~\" + \"@gridGutterWidth~\")\";\n@computerGridWidth: ~\"calc(\"@computerWidth~\" + \"@gridGutterWidth~\")\";\n@largeMonitorGridWidth: ~\"calc(\"@largeMonitorWidth~\" + \"@gridGutterWidth~\")\";\n\n@mobileRelaxedGridWidth: @mobileWidth;\n@tabletRelaxedGridWidth: ~\"calc(\"@tabletWidth~\" + \"@relaxedGridGutterWidth~\")\";\n@computerRelaxedGridWidth: ~\"calc(\"@computerWidth~\" + \"@relaxedGridGutterWidth~\")\";\n@largeMonitorRelaxedGridWidth: ~\"calc(\"@largeMonitorWidth~\" + \"@relaxedGridGutterWidth~\")\";\n\n@mobileVeryRelaxedGridWidth: @mobileWidth;\n@tabletVeryRelaxedGridWidth: ~\"calc(\"@tabletWidth~\" + \"@veryRelaxedGridGutterWidth~\")\";\n@computerVeryRelaxedGridWidth: ~\"calc(\"@computerWidth~\" + \"@veryRelaxedGridGutterWidth~\")\";\n@largeMonitorVeryRelaxedGridWidth: ~\"calc(\"@largeMonitorWidth~\" + \"@veryRelaxedGridGutterWidth~\")\";\n\n/*-------------------\n       Types\n--------------------*/\n\n/* Text */\n@textWidth: 700px;\n@textFontFamily: @pageFont;\n@textLineHeight: 1.5;\n@textSize: @large;"
  },
  {
    "path": "semantic/src/themes/default/elements/divider.overrides",
    "content": "/*******************************\n         Theme Overrides\n*******************************/\n\n\n.ui.horizontal.divider:before,\n.ui.horizontal.divider:after {\n  background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABaAAAAACCAYAAACuTHuKAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1OThBRDY4OUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1OThBRDY4QUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjU5OEFENjg3Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5OEFENjg4Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+VU513gAAADVJREFUeNrs0DENACAQBDBIWLGBJQby/mUcJn5sJXQmOQMAAAAAAJqt+2prAAAAAACg2xdgANk6BEVuJgyMAAAAAElFTkSuQmCC');\n}\n\n@media only screen and (max-width : (@tabletBreakpoint - 1px)) {\n  .ui.stackable.grid .ui.vertical.divider:before,\n  .ui.grid .stackable.row .ui.vertical.divider:before,\n  .ui.stackable.grid .ui.vertical.divider:after,\n  .ui.grid .stackable.row .ui.vertical.divider:after {\n    background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABaAAAAACCAYAAACuTHuKAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1OThBRDY4OUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1OThBRDY4QUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjU5OEFENjg3Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5OEFENjg4Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+VU513gAAADVJREFUeNrs0DENACAQBDBIWLGBJQby/mUcJn5sJXQmOQMAAAAAAJqt+2prAAAAAACg2xdgANk6BEVuJgyMAAAAAElFTkSuQmCC');\n  }\n}"
  },
  {
    "path": "semantic/src/themes/default/elements/divider.variables",
    "content": "/*******************************\n            Divider\n*******************************/\n\n/*-------------------\n       Element\n--------------------*/\n\n@margin: 1rem 0rem;\n\n@highlightWidth: 1px;\n@highlightColor: @whiteBorderColor;\n\n@shadowWidth: 1px;\n@shadowColor: @borderColor;\n\n/* Text */\n@letterSpacing: 0.05em;\n@fontWeight: @bold;\n@color: @darkTextColor;\n@textTransform: uppercase;\n\n/*-------------------\n       Coupling\n--------------------*/\n\n/* Icon */\n@dividerIconSize: 1rem;\n@dividerIconMargin: 0rem;\n\n\n/*******************************\n         Variations\n*******************************/\n\n/* Horizontal / Vertical */\n@horizontalMargin: '';\n@horizontalDividerMargin: 1em;\n@horizontalRulerOffset: ~\"calc(-50% - \"(@horizontalDividerMargin)~\")\";\n\n@verticalDividerMargin: 1rem;\n@verticalDividerHeight: ~\"calc(100% - \"(@verticalDividerMargin)~\")\";\n\n/* Inverted */\n@invertedTextColor: @white;\n@invertedHighlightColor: rgba(255, 255, 255, 0.15);\n@invertedShadowColor: @borderColor;\n\n/* Section */\n@sectionMargin: 2rem;\n\n/* Sizes */\n@medium: 1rem;\n"
  },
  {
    "path": "semantic/src/themes/default/elements/flag.overrides",
    "content": "/* Flag Sprite Based On http://www.famfamfam.com/lab/icons/flags/ */\n\n/*******************************\n         Theme Overrides\n*******************************/\n\ni.flag.ad:before,\ni.flag.andorra:before {\n  background-position: 0px 0px;\n}\ni.flag.ae:before,\ni.flag.united.arab.emirates:before,\ni.flag.uae:before {\n  background-position: 0px -26px;\n}\ni.flag.af:before,\ni.flag.afghanistan:before {\n  background-position: 0px -52px;\n}\ni.flag.ag:before,\ni.flag.antigua:before {\n  background-position: 0px -78px;\n}\ni.flag.ai:before,\ni.flag.anguilla:before {\n  background-position: 0px -104px;\n}\ni.flag.al:before,\ni.flag.albania:before {\n  background-position: 0px -130px;\n}\ni.flag.am:before,\ni.flag.armenia:before {\n  background-position: 0px -156px;\n}\ni.flag.an:before,\ni.flag.netherlands.antilles:before {\n  background-position: 0px -182px;\n}\ni.flag.ao:before,\ni.flag.angola:before {\n  background-position: 0px -208px;\n}\ni.flag.ar:before,\ni.flag.argentina:before {\n  background-position: 0px -234px;\n}\ni.flag.as:before,\ni.flag.american.samoa:before {\n  background-position: 0px -260px;\n}\ni.flag.at:before,\ni.flag.austria:before {\n  background-position: 0px -286px;\n}\ni.flag.au:before,\ni.flag.australia:before {\n  background-position: 0px -312px;\n}\ni.flag.aw:before,\ni.flag.aruba:before {\n  background-position: 0px -338px;\n}\ni.flag.ax:before,\ni.flag.aland.islands:before {\n  background-position: 0px -364px;\n}\ni.flag.az:before,\ni.flag.azerbaijan:before {\n  background-position: 0px -390px;\n}\ni.flag.ba:before,\ni.flag.bosnia:before {\n  background-position: 0px -416px;\n}\ni.flag.bb:before,\ni.flag.barbados:before {\n  background-position: 0px -442px;\n}\ni.flag.bd:before,\ni.flag.bangladesh:before {\n  background-position: 0px -468px;\n}\ni.flag.be:before,\ni.flag.belgium:before {\n  background-position: 0px -494px;\n}\ni.flag.bf:before,\ni.flag.burkina.faso:before {\n  background-position: 0px -520px;\n}\ni.flag.bg:before,\ni.flag.bulgaria:before {\n  background-position: 0px -546px;\n}\ni.flag.bh:before,\ni.flag.bahrain:before {\n  background-position: 0px -572px;\n}\ni.flag.bi:before,\ni.flag.burundi:before {\n  background-position: 0px -598px;\n}\ni.flag.bj:before,\ni.flag.benin:before {\n  background-position: 0px -624px;\n}\ni.flag.bm:before,\ni.flag.bermuda:before {\n  background-position: 0px -650px;\n}\ni.flag.bn:before,\ni.flag.brunei:before {\n  background-position: 0px -676px;\n}\ni.flag.bo:before,\ni.flag.bolivia:before {\n  background-position: 0px -702px;\n}\ni.flag.br:before,\ni.flag.brazil:before {\n  background-position: 0px -728px;\n}\ni.flag.bs:before,\ni.flag.bahamas:before {\n  background-position: 0px -754px;\n}\ni.flag.bt:before,\ni.flag.bhutan:before {\n  background-position: 0px -780px;\n}\ni.flag.bv:before,\ni.flag.bouvet.island:before {\n  background-position: 0px -806px;\n}\ni.flag.bw:before,\ni.flag.botswana:before {\n  background-position: 0px -832px;\n}\ni.flag.by:before,\ni.flag.belarus:before {\n  background-position: 0px -858px;\n}\ni.flag.bz:before,\ni.flag.belize:before {\n  background-position: 0px -884px;\n}\ni.flag.ca:before,\ni.flag.canada:before {\n  background-position: 0px -910px;\n}\ni.flag.cc:before,\ni.flag.cocos.islands:before {\n  background-position: 0px -962px;\n}\ni.flag.cd:before,\ni.flag.congo:before {\n  background-position: 0px -988px;\n}\ni.flag.cf:before,\ni.flag.central.african.republic:before {\n  background-position: 0px -1014px;\n}\ni.flag.cg:before,\ni.flag.congo.brazzaville:before {\n  background-position: 0px -1040px;\n}\ni.flag.ch:before,\ni.flag.switzerland:before {\n  background-position: 0px -1066px;\n}\ni.flag.ci:before,\ni.flag.cote.divoire:before {\n  background-position: 0px -1092px;\n}\ni.flag.ck:before,\ni.flag.cook.islands:before {\n  background-position: 0px -1118px;\n}\ni.flag.cl:before,\ni.flag.chile:before {\n  background-position: 0px -1144px;\n}\ni.flag.cm:before,\ni.flag.cameroon:before {\n  background-position: 0px -1170px;\n}\ni.flag.cn:before,\ni.flag.china:before {\n  background-position: 0px -1196px;\n}\ni.flag.co:before,\ni.flag.colombia:before {\n  background-position: 0px -1222px;\n}\ni.flag.cr:before,\ni.flag.costa.rica:before {\n  background-position: 0px -1248px;\n}\ni.flag.cs:before,\ni.flag.serbia:before {\n  background-position: 0px -1274px;\n}\ni.flag.cu:before,\ni.flag.cuba:before {\n  background-position: 0px -1300px;\n}\ni.flag.cv:before,\ni.flag.cape.verde:before {\n  background-position: 0px -1326px;\n}\ni.flag.cx:before,\ni.flag.christmas.island:before {\n  background-position: 0px -1352px;\n}\ni.flag.cy:before,\ni.flag.cyprus:before {\n  background-position: 0px -1378px;\n}\ni.flag.cz:before,\ni.flag.czech.republic:before {\n  background-position: 0px -1404px;\n}\ni.flag.de:before,\ni.flag.germany:before {\n  background-position: 0px -1430px;\n}\ni.flag.dj:before,\ni.flag.djibouti:before {\n  background-position: 0px -1456px;\n}\ni.flag.dk:before,\ni.flag.denmark:before {\n  background-position: 0px -1482px;\n}\ni.flag.dm:before,\ni.flag.dominica:before {\n  background-position: 0px -1508px;\n}\ni.flag.do:before,\ni.flag.dominican.republic:before {\n  background-position: 0px -1534px;\n}\ni.flag.dz:before,\ni.flag.algeria:before {\n  background-position: 0px -1560px;\n}\ni.flag.ec:before,\ni.flag.ecuador:before {\n  background-position: 0px -1586px;\n}\ni.flag.ee:before,\ni.flag.estonia:before {\n  background-position: 0px -1612px;\n}\ni.flag.eg:before,\ni.flag.egypt:before {\n  background-position: 0px -1638px;\n}\ni.flag.eh:before,\ni.flag.western.sahara:before {\n  background-position: 0px -1664px;\n}\ni.flag.gb.eng:before,\ni.flag.england:before {\n  background-position: 0px -1690px;\n}\ni.flag.er:before,\ni.flag.eritrea:before {\n  background-position: 0px -1716px;\n}\ni.flag.es:before,\ni.flag.spain:before {\n  background-position: 0px -1742px;\n}\ni.flag.et:before,\ni.flag.ethiopia:before {\n  background-position: 0px -1768px;\n}\ni.flag.eu:before,\ni.flag.european.union:before {\n  background-position: 0px -1794px;\n}\ni.flag.fi:before,\ni.flag.finland:before {\n  background-position: 0px -1846px;\n}\ni.flag.fj:before,\ni.flag.fiji:before {\n  background-position: 0px -1872px;\n}\ni.flag.fk:before,\ni.flag.falkland.islands:before {\n  background-position: 0px -1898px;\n}\ni.flag.fm:before,\ni.flag.micronesia:before {\n  background-position: 0px -1924px;\n}\ni.flag.fo:before,\ni.flag.faroe.islands:before {\n  background-position: 0px -1950px;\n}\ni.flag.fr:before,\ni.flag.france:before {\n  background-position: 0px -1976px;\n}\ni.flag.ga:before,\ni.flag.gabon:before {\n  background-position: -36px 0px;\n}\ni.flag.gb:before,\ni.flag.united.kingdom:before {\n  background-position: -36px -26px;\n}\ni.flag.gd:before,\ni.flag.grenada:before {\n  background-position: -36px -52px;\n}\ni.flag.ge:before,\ni.flag.georgia:before {\n  background-position: -36px -78px;\n}\ni.flag.gf:before,\ni.flag.french.guiana:before {\n  background-position: -36px -104px;\n}\ni.flag.gh:before,\ni.flag.ghana:before {\n  background-position: -36px -130px;\n}\ni.flag.gi:before,\ni.flag.gibraltar:before {\n  background-position: -36px -156px;\n}\ni.flag.gl:before,\ni.flag.greenland:before {\n  background-position: -36px -182px;\n}\ni.flag.gm:before,\ni.flag.gambia:before {\n  background-position: -36px -208px;\n}\ni.flag.gn:before,\ni.flag.guinea:before {\n  background-position: -36px -234px;\n}\ni.flag.gp:before,\ni.flag.guadeloupe:before {\n  background-position: -36px -260px;\n}\ni.flag.gq:before,\ni.flag.equatorial.guinea:before {\n  background-position: -36px -286px;\n}\ni.flag.gr:before,\ni.flag.greece:before {\n  background-position: -36px -312px;\n}\ni.flag.gs:before,\ni.flag.sandwich.islands:before {\n  background-position: -36px -338px;\n}\ni.flag.gt:before,\ni.flag.guatemala:before {\n  background-position: -36px -364px;\n}\ni.flag.gu:before,\ni.flag.guam:before {\n  background-position: -36px -390px;\n}\ni.flag.gw:before,\ni.flag.guinea-bissau:before {\n  background-position: -36px -416px;\n}\ni.flag.gy:before,\ni.flag.guyana:before {\n  background-position: -36px -442px;\n}\ni.flag.hk:before,\ni.flag.hong.kong:before {\n  background-position: -36px -468px;\n}\ni.flag.hm:before,\ni.flag.heard.island:before {\n  background-position: -36px -494px;\n}\ni.flag.hn:before,\ni.flag.honduras:before {\n  background-position: -36px -520px;\n}\ni.flag.hr:before,\ni.flag.croatia:before {\n  background-position: -36px -546px;\n}\ni.flag.ht:before,\ni.flag.haiti:before {\n  background-position: -36px -572px;\n}\ni.flag.hu:before,\ni.flag.hungary:before {\n  background-position: -36px -598px;\n}\ni.flag.id:before,\ni.flag.indonesia:before {\n  background-position: -36px -624px;\n}\ni.flag.ie:before,\ni.flag.ireland:before {\n  background-position: -36px -650px;\n}\ni.flag.il:before,\ni.flag.israel:before {\n  background-position: -36px -676px;\n}\ni.flag.in:before,\ni.flag.india:before {\n  background-position: -36px -702px;\n}\ni.flag.io:before,\ni.flag.indian.ocean.territory:before {\n  background-position: -36px -728px;\n}\ni.flag.iq:before,\ni.flag.iraq:before {\n  background-position: -36px -754px;\n}\ni.flag.ir:before,\ni.flag.iran:before {\n  background-position: -36px -780px;\n}\ni.flag.is:before,\ni.flag.iceland:before {\n  background-position: -36px -806px;\n}\ni.flag.it:before,\ni.flag.italy:before {\n  background-position: -36px -832px;\n}\ni.flag.jm:before,\ni.flag.jamaica:before {\n  background-position: -36px -858px;\n}\ni.flag.jo:before,\ni.flag.jordan:before {\n  background-position: -36px -884px;\n}\ni.flag.jp:before,\ni.flag.japan:before {\n  background-position: -36px -910px;\n}\ni.flag.ke:before,\ni.flag.kenya:before {\n  background-position: -36px -936px;\n}\ni.flag.kg:before,\ni.flag.kyrgyzstan:before {\n  background-position: -36px -962px;\n}\ni.flag.kh:before,\ni.flag.cambodia:before {\n  background-position: -36px -988px;\n}\ni.flag.ki:before,\ni.flag.kiribati:before {\n  background-position: -36px -1014px;\n}\ni.flag.km:before,\ni.flag.comoros:before {\n  background-position: -36px -1040px;\n}\ni.flag.kn:before,\ni.flag.saint.kitts.and.nevis:before {\n  background-position: -36px -1066px;\n}\ni.flag.kp:before,\ni.flag.north.korea:before {\n  background-position: -36px -1092px;\n}\ni.flag.kr:before,\ni.flag.south.korea:before {\n  background-position: -36px -1118px;\n}\ni.flag.kw:before,\ni.flag.kuwait:before {\n  background-position: -36px -1144px;\n}\ni.flag.ky:before,\ni.flag.cayman.islands:before {\n  background-position: -36px -1170px;\n}\ni.flag.kz:before,\ni.flag.kazakhstan:before {\n  background-position: -36px -1196px;\n}\ni.flag.la:before,\ni.flag.laos:before {\n  background-position: -36px -1222px;\n}\ni.flag.lb:before,\ni.flag.lebanon:before {\n  background-position: -36px -1248px;\n}\ni.flag.lc:before,\ni.flag.saint.lucia:before {\n  background-position: -36px -1274px;\n}\ni.flag.li:before,\ni.flag.liechtenstein:before {\n  background-position: -36px -1300px;\n}\ni.flag.lk:before,\ni.flag.sri.lanka:before {\n  background-position: -36px -1326px;\n}\ni.flag.lr:before,\ni.flag.liberia:before {\n  background-position: -36px -1352px;\n}\ni.flag.ls:before,\ni.flag.lesotho:before {\n  background-position: -36px -1378px;\n}\ni.flag.lt:before,\ni.flag.lithuania:before {\n  background-position: -36px -1404px;\n}\ni.flag.lu:before,\ni.flag.luxembourg:before {\n  background-position: -36px -1430px;\n}\ni.flag.lv:before,\ni.flag.latvia:before {\n  background-position: -36px -1456px;\n}\ni.flag.ly:before,\ni.flag.libya:before {\n  background-position: -36px -1482px;\n}\ni.flag.ma:before,\ni.flag.morocco:before {\n  background-position: -36px -1508px;\n}\ni.flag.mc:before,\ni.flag.monaco:before {\n  background-position: -36px -1534px;\n}\ni.flag.md:before,\ni.flag.moldova:before {\n  background-position: -36px -1560px;\n}\ni.flag.me:before,\ni.flag.montenegro:before {\n  background-position: -36px -1586px;\n}\ni.flag.mg:before,\ni.flag.madagascar:before {\n  background-position: -36px -1613px;\n}\ni.flag.mh:before,\ni.flag.marshall.islands:before {\n  background-position: -36px -1639px;\n}\ni.flag.mk:before,\ni.flag.macedonia:before {\n  background-position: -36px -1665px;\n}\ni.flag.ml:before,\ni.flag.mali:before {\n  background-position: -36px -1691px;\n}\ni.flag.mm:before,\ni.flag.myanmar:before,\ni.flag.burma:before {\n  background-position: -73px -1821px;\n}\ni.flag.mn:before,\ni.flag.mongolia:before {\n  background-position: -36px -1743px;\n}\ni.flag.mo:before,\ni.flag.macau:before {\n  background-position: -36px -1769px;\n}\ni.flag.mp:before,\ni.flag.northern.mariana.islands:before {\n  background-position: -36px -1795px;\n}\ni.flag.mq:before,\ni.flag.martinique:before {\n  background-position: -36px -1821px;\n}\ni.flag.mr:before,\ni.flag.mauritania:before {\n  background-position: -36px -1847px;\n}\ni.flag.ms:before,\ni.flag.montserrat:before {\n  background-position: -36px -1873px;\n}\ni.flag.mt:before,\ni.flag.malta:before {\n  background-position: -36px -1899px;\n}\ni.flag.mu:before,\ni.flag.mauritius:before {\n  background-position: -36px -1925px;\n}\ni.flag.mv:before,\ni.flag.maldives:before {\n  background-position: -36px -1951px;\n}\ni.flag.mw:before,\ni.flag.malawi:before {\n  background-position: -36px -1977px;\n}\ni.flag.mx:before,\ni.flag.mexico:before {\n  background-position: -72px 0px;\n}\ni.flag.my:before,\ni.flag.malaysia:before {\n  background-position: -72px -26px;\n}\ni.flag.mz:before,\ni.flag.mozambique:before {\n  background-position: -72px -52px;\n}\ni.flag.na:before,\ni.flag.namibia:before {\n  background-position: -72px -78px;\n}\ni.flag.nc:before,\ni.flag.new.caledonia:before {\n  background-position: -72px -104px;\n}\ni.flag.ne:before,\ni.flag.niger:before {\n  background-position: -72px -130px;\n}\ni.flag.nf:before,\ni.flag.norfolk.island:before {\n  background-position: -72px -156px;\n}\ni.flag.ng:before,\ni.flag.nigeria:before {\n  background-position: -72px -182px;\n}\ni.flag.ni:before,\ni.flag.nicaragua:before {\n  background-position: -72px -208px;\n}\ni.flag.nl:before,\ni.flag.netherlands:before {\n  background-position: -72px -234px;\n}\ni.flag.no:before,\ni.flag.norway:before {\n  background-position: -72px -260px;\n}\ni.flag.np:before,\ni.flag.nepal:before {\n  background-position: -72px -286px;\n}\ni.flag.nr:before,\ni.flag.nauru:before {\n  background-position: -72px -312px;\n}\ni.flag.nu:before,\ni.flag.niue:before {\n  background-position: -72px -338px;\n}\ni.flag.nz:before,\ni.flag.new.zealand:before {\n  background-position: -72px -364px;\n}\ni.flag.om:before,\ni.flag.oman:before {\n  background-position: -72px -390px;\n}\ni.flag.pa:before,\ni.flag.panama:before {\n  background-position: -72px -416px;\n}\ni.flag.pe:before,\ni.flag.peru:before {\n  background-position: -72px -442px;\n}\ni.flag.pf:before,\ni.flag.french.polynesia:before {\n  background-position: -72px -468px;\n}\ni.flag.pg:before,\ni.flag.new.guinea:before {\n  background-position: -72px -494px;\n}\ni.flag.ph:before,\ni.flag.philippines:before {\n  background-position: -72px -520px;\n}\ni.flag.pk:before,\ni.flag.pakistan:before {\n  background-position: -72px -546px;\n}\ni.flag.pl:before,\ni.flag.poland:before {\n  background-position: -72px -572px;\n}\ni.flag.pm:before,\ni.flag.saint.pierre:before {\n  background-position: -72px -598px;\n}\ni.flag.pn:before,\ni.flag.pitcairn.islands:before {\n  background-position: -72px -624px;\n}\ni.flag.pr:before,\ni.flag.puerto.rico:before {\n  background-position: -72px -650px;\n}\ni.flag.ps:before,\ni.flag.palestine:before {\n  background-position: -72px -676px;\n}\ni.flag.pt:before,\ni.flag.portugal:before {\n  background-position: -72px -702px;\n}\ni.flag.pw:before,\ni.flag.palau:before {\n  background-position: -72px -728px;\n}\ni.flag.py:before,\ni.flag.paraguay:before {\n  background-position: -72px -754px;\n}\ni.flag.qa:before,\ni.flag.qatar:before {\n  background-position: -72px -780px;\n}\ni.flag.re:before,\ni.flag.reunion:before {\n  background-position: -72px -806px;\n}\ni.flag.ro:before,\ni.flag.romania:before {\n  background-position: -72px -832px;\n}\ni.flag.rs:before,\ni.flag.serbia:before {\n  background-position: -72px -858px;\n}\ni.flag.ru:before,\ni.flag.russia:before {\n  background-position: -72px -884px;\n}\ni.flag.rw:before,\ni.flag.rwanda:before {\n  background-position: -72px -910px;\n}\ni.flag.sa:before,\ni.flag.saudi.arabia:before {\n  background-position: -72px -936px;\n}\ni.flag.sb:before,\ni.flag.solomon.islands:before {\n  background-position: -72px -962px;\n}\ni.flag.sc:before,\ni.flag.seychelles:before {\n  background-position: -72px -988px;\n}\ni.flag.gb.sct:before,\ni.flag.scotland:before {\n  background-position: -72px -1014px;\n}\ni.flag.sd:before,\ni.flag.sudan:before {\n  background-position: -72px -1040px;\n}\ni.flag.se:before,\ni.flag.sweden:before {\n  background-position: -72px -1066px;\n}\ni.flag.sg:before,\ni.flag.singapore:before {\n  background-position: -72px -1092px;\n}\ni.flag.sh:before,\ni.flag.saint.helena:before {\n  background-position: -72px -1118px;\n}\ni.flag.si:before,\ni.flag.slovenia:before {\n  background-position: -72px -1144px;\n}\ni.flag.sj:before,\ni.flag.svalbard:before,\ni.flag.jan.mayen:before {\n  background-position: -72px -1170px;\n}\ni.flag.sk:before,\ni.flag.slovakia:before {\n  background-position: -72px -1196px;\n}\ni.flag.sl:before,\ni.flag.sierra.leone:before {\n  background-position: -72px -1222px;\n}\ni.flag.sm:before,\ni.flag.san.marino:before {\n  background-position: -72px -1248px;\n}\ni.flag.sn:before,\ni.flag.senegal:before {\n  background-position: -72px -1274px;\n}\ni.flag.so:before,\ni.flag.somalia:before {\n  background-position: -72px -1300px;\n}\ni.flag.sr:before,\ni.flag.suriname:before {\n  background-position: -72px -1326px;\n}\ni.flag.st:before,\ni.flag.sao.tome:before {\n  background-position: -72px -1352px;\n}\ni.flag.sv:before,\ni.flag.el.salvador:before {\n  background-position: -72px -1378px;\n}\ni.flag.sy:before,\ni.flag.syria:before {\n  background-position: -72px -1404px;\n}\ni.flag.sz:before,\ni.flag.swaziland:before {\n  background-position: -72px -1430px;\n}\ni.flag.tc:before,\ni.flag.caicos.islands:before {\n  background-position: -72px -1456px;\n}\ni.flag.td:before,\ni.flag.chad:before {\n  background-position: -72px -1482px;\n}\ni.flag.tf:before,\ni.flag.french.territories:before {\n  background-position: -72px -1508px;\n}\ni.flag.tg:before,\ni.flag.togo:before {\n  background-position: -72px -1534px;\n}\ni.flag.th:before,\ni.flag.thailand:before {\n  background-position: -72px -1560px;\n}\ni.flag.tj:before,\ni.flag.tajikistan:before {\n  background-position: -72px -1586px;\n}\ni.flag.tk:before,\ni.flag.tokelau:before {\n  background-position: -72px -1612px;\n}\ni.flag.tl:before,\ni.flag.timorleste:before {\n  background-position: -72px -1638px;\n}\ni.flag.tm:before,\ni.flag.turkmenistan:before {\n  background-position: -72px -1664px;\n}\ni.flag.tn:before,\ni.flag.tunisia:before {\n  background-position: -72px -1690px;\n}\ni.flag.to:before,\ni.flag.tonga:before {\n  background-position: -72px -1716px;\n}\ni.flag.tr:before,\ni.flag.turkey:before {\n  background-position: -72px -1742px;\n}\ni.flag.tt:before,\ni.flag.trinidad:before {\n  background-position: -72px -1768px;\n}\ni.flag.tv:before,\ni.flag.tuvalu:before {\n  background-position: -72px -1794px;\n}\ni.flag.tw:before,\ni.flag.taiwan:before {\n  background-position: -72px -1820px;\n}\ni.flag.tz:before,\ni.flag.tanzania:before {\n  background-position: -72px -1846px;\n}\ni.flag.ua:before,\ni.flag.ukraine:before {\n  background-position: -72px -1872px;\n}\ni.flag.ug:before,\ni.flag.uganda:before {\n  background-position: -72px -1898px;\n}\ni.flag.um:before,\ni.flag.us.minor.islands:before {\n  background-position: -72px -1924px;\n}\ni.flag.us:before,\ni.flag.america:before,\ni.flag.united.states:before {\n  background-position: -72px -1950px;\n}\ni.flag.uy:before,\ni.flag.uruguay:before {\n  background-position: -72px -1976px;\n}\ni.flag.uz:before,\ni.flag.uzbekistan:before {\n  background-position: -108px 0px;\n}\ni.flag.va:before,\ni.flag.vatican.city:before {\n  background-position: -108px -26px;\n}\ni.flag.vc:before,\ni.flag.saint.vincent:before {\n  background-position: -108px -52px;\n}\ni.flag.ve:before,\ni.flag.venezuela:before {\n  background-position: -108px -78px;\n}\ni.flag.vg:before,\ni.flag.british.virgin.islands:before {\n  background-position: -108px -104px;\n}\ni.flag.vi:before,\ni.flag.us.virgin.islands:before {\n  background-position: -108px -130px;\n}\ni.flag.vn:before,\ni.flag.vietnam:before {\n  background-position: -108px -156px;\n}\ni.flag.vu:before,\ni.flag.vanuatu:before {\n  background-position: -108px -182px;\n}\ni.flag.gb.wls:before,\ni.flag.wales:before {\n  background-position: -108px -208px;\n}\ni.flag.wf:before,\ni.flag.wallis.and.futuna:before {\n  background-position: -108px -234px;\n}\ni.flag.ws:before,\ni.flag.samoa:before {\n  background-position: -108px -260px;\n}\ni.flag.ye:before,\ni.flag.yemen:before {\n  background-position: -108px -286px;\n}\ni.flag.yt:before,\ni.flag.mayotte:before {\n  background-position: -108px -312px;\n}\ni.flag.za:before,\ni.flag.south.africa:before {\n  background-position: -108px -338px;\n}\ni.flag.zm:before,\ni.flag.zambia:before {\n  background-position: -108px -364px;\n}\ni.flag.zw:before,\ni.flag.zimbabwe:before {\n  background-position: -108px -390px;\n}\n"
  },
  {
    "path": "semantic/src/themes/default/elements/flag.variables",
    "content": "/*******************************\n            Flag\n*******************************/\n\n/*-------------------\n       Element\n--------------------*/\n\n@spritePath: \"@{imagePath}/flags.png\";\n@width: 16px;\n@height: 11px;\n@verticalAlign: baseline;\n@margin: 0.5em;"
  },
  {
    "path": "semantic/src/themes/default/elements/header.overrides",
    "content": "/*******************************\n         Theme Overrides\n*******************************/\n\n"
  },
  {
    "path": "semantic/src/themes/default/elements/header.variables",
    "content": "/*******************************\n            Header\n*******************************/\n\n/*-------------------\n       Element\n--------------------*/\n\n@textTransform: none;\n@fontFamily: @headerFont;\n@fontWeight: @headerFontWeight;\n@lineHeight: @headerLineHeight;\n@lineHeightOffset: @headerLineHeightOffset;\n\n@topMargin: @headerTopMargin;\n@bottomMargin: @headerBottomMargin;\n@margin: @topMargin 0em @bottomMargin;\n\n@firstMargin: -@lineHeightOffset;\n@lastMargin: 0em;\n@horizontalPadding: 0em;\n@verticalPadding: 0em;\n\n/* Sub Heading */\n@subHeadingDistance: @2px;\n@subHeadingFontSize: @relativeTiny;\n@subHeadingFontWeight: @bold;\n@subHeadingTextTransform: uppercase;\n@subHeadingColor: '';\n\n@smallSubHeadingSize: @relativeMini;\n@largeSubHeadingSize: @relativeSmall;\n@hugeSubHeadingSize: @relativeMedium;\n\n/* Sub Header */\n@subHeaderMargin: 0em;\n@subHeaderLineHeight: 1.2em;\n@subHeaderColor: @mutedTextColor;\n\n/* Icon */\n@iconOpacity: 1;\n@iconSize: 1.5em;\n@iconOffset: 0em;\n@iconMargin: 0.75rem;\n@iconAlignment: middle;\n\n/* Image */\n@imageWidth: 2.5em;\n@imageHeight: auto;\n@imageOffset: @lineHeightOffset;\n@imageMargin: @iconMargin;\n@imageAlignment: middle;\n\n/* Label */\n@labelSize: '';\n@labelDistance: 0.5rem;\n@labelVerticalAlign: middle;\n\n/* Content */\n@contentAlignment: top;\n@contentIconAlignment: middle;\n@contentImageAlignment: middle;\n\n/* Paragraph after Header */\n@nextParagraphDistance: 0em;\n\n/*-------------------\n      Variations\n--------------------*/\n\n/* Sizing */\n@hugeFontSize   : unit(@h1, em);\n@largeFontSize  : unit(@h2, em);\n@mediumFontSize : unit(@h3, em);\n@smallFontSize  : unit(@h4, em);\n@tinyFontSize   : unit(@h5, em);\n\n/* Sub Header */\n@h1SubHeaderFontSize: @large;\n@h2SubHeaderFontSize: @large;\n@h3SubHeaderFontSize: @medium;\n@h4SubHeaderFontSize: @medium;\n@h5SubHeaderFontSize: @small;\n\n@hugeSubHeaderFontSize  : @h1SubHeaderFontSize;\n@largeSubHeaderFontSize : @h2SubHeaderFontSize;\n@subHeaderFontSize      : @h3SubHeaderFontSize;\n@smallSubHeaderFontSize : @h4SubHeaderFontSize;\n@tinySubHeaderFontSize  : @h5SubHeaderFontSize;\n\n/* Icon Header */\n@iconHeaderSize: 3em;\n@iconHeaderOpacity: 1;\n@iconHeaderMargin: 0.5rem;\n@circularHeaderIconSize: 2em;\n@squareHeaderIconSize: 2em;\n\n/* No Line Height Offset */\n@iconHeaderTopMargin: 2rem;\n@iconHeaderBottomMargin: @bottomMargin;\n@iconHeaderFirstMargin: 0em;\n\n/* Divided */\n@dividedBorderWidth: 1px;\n@dividedBorder: @dividedBorderWidth solid @borderColor;\n@dividedColoredBorderWidth: 2px;\n\n@dividedBorderPadding: @3px;\n@dividedSubHeaderPadding: @3px;\n@dividedIconPadding: 0em;\n\n/* Block */\n@blockBackground: @darkWhite;\n@blockBoxShadow: none;\n@blockBorderWidth: 1px;\n@blockBorder: @blockBorderWidth solid @solidBorderColor;\n@blockHorizontalPadding: @medium;\n@blockVerticalPadding: @mini;\n@blockBorderRadius: @defaultBorderRadius;\n\n@tinyBlock: @tiny;\n@smallBlock: @small;\n@mediumBlock: @medium;\n@largeBlock: @large;\n@hugeBlock: @huge;\n\n/* Attached */\n@attachedOffset: -1px;\n@attachedBoxShadow: none;\n@attachedBorder: 1px solid @solidBorderColor;\n@attachedVerticalPadding: @blockVerticalPadding;\n@attachedHorizontalPadding: @blockHorizontalPadding;\n@attachedBackground: @white;\n@attachedBorderRadius: @blockBorderRadius;\n\n@tinyAttachedSize: @relativeTiny;\n@smallAttachedSize: @relativeSmall;\n@mediumAttachedSize: @relativeMedium;\n@largeAttachedSize: @relativeLarge;\n@bigAttachedSize: @relativeBig;\n@hugeAttachedSize: @relativeHuge;\n\n/* Inverted */\n@invertedColor: @white;\n@invertedSubHeaderColor: @invertedMutedTextColor;\n@invertedDividedBorderColor: @whiteBorderColor;\n@invertedBlockBackground: @lightBlack @subtleGradient;\n@invertedAttachedBackground: @invertedBlockBackground;\n\n/* Floated */\n@floatedMargin: 0.5em;\n"
  },
  {
    "path": "semantic/src/themes/default/elements/icon.overrides",
    "content": "/*\n * Font Awesome 5.0.8 by @fontawesome - http://fontawesome.io - @fontawesome\n * License - https://fontawesome.com/license (Icons: CC BY 4.0 License, Fonts: SIL OFL 1.1 License, CSS: MIT License)\n */\n\n/*******************************\n\nSemantic-UI integration of font-awesome :\n\n///class names are separated\ni.icon.circle => i.icon.circle\ni.icon.circle-o => i.icon.circle.outline\n\n//abbreviation are replaced by full letters:\ni.icon.ellipsis-h => i.icon.ellipsis.horizontal\ni.icon.ellipsis-v => i.icon.ellipsis.vertical\n.alpha => .i.icon.alphabet\n.asc => .i.icon.ascending\n.desc => .i.icon.descending\n.alt =>.alternate\n\nASCII order is conserved for easier maintenance.\n\nIcons that only have one style 'outline', 'square' etc do not require this class\nfor instance `lemon icon` not `lemon outline icon` since there is only one lemon\n\n*******************************/\n\n\n/*******************************\n            Icons\n*******************************/\n\n/* Icons */\ni.icon.\\35 00px:before { content: \"\\f26e\"; }\ni.icon.accessible.icon:before { content: \"\\f368\"; }\ni.icon.accusoft:before { content: \"\\f369\"; }\ni.icon.address.book:before { content: \"\\f2b9\"; }\ni.icon.address.card:before { content: \"\\f2bb\"; }\ni.icon.adjust:before { content: \"\\f042\"; }\ni.icon.adn:before { content: \"\\f170\"; }\ni.icon.adversal:before { content: \"\\f36a\"; }\ni.icon.affiliatetheme:before { content: \"\\f36b\"; }\ni.icon.algolia:before { content: \"\\f36c\"; }\ni.icon.align.center:before { content: \"\\f037\"; }\ni.icon.align.justify:before { content: \"\\f039\"; }\ni.icon.align.left:before { content: \"\\f036\"; }\ni.icon.align.right:before { content: \"\\f038\"; }\ni.icon.amazon:before { content: \"\\f270\"; }\ni.icon.amazon.pay:before { content: \"\\f42c\"; }\ni.icon.ambulance:before { content: \"\\f0f9\"; }\ni.icon.american.sign.language.interpreting:before { content: \"\\f2a3\"; }\ni.icon.amilia:before { content: \"\\f36d\"; }\ni.icon.anchor:before { content: \"\\f13d\"; }\ni.icon.android:before { content: \"\\f17b\"; }\ni.icon.angellist:before { content: \"\\f209\"; }\ni.icon.angle.double.down:before { content: \"\\f103\"; }\ni.icon.angle.double.left:before { content: \"\\f100\"; }\ni.icon.angle.double.right:before { content: \"\\f101\"; }\ni.icon.angle.double.up:before { content: \"\\f102\"; }\ni.icon.angle.down:before { content: \"\\f107\"; }\ni.icon.angle.left:before { content: \"\\f104\"; }\ni.icon.angle.right:before { content: \"\\f105\"; }\ni.icon.angle.up:before { content: \"\\f106\"; }\ni.icon.angrycreative:before { content: \"\\f36e\"; }\ni.icon.angular:before { content: \"\\f420\"; }\ni.icon.app.store:before { content: \"\\f36f\"; }\ni.icon.app.store.ios:before { content: \"\\f370\"; }\ni.icon.apper:before { content: \"\\f371\"; }\ni.icon.apple:before { content: \"\\f179\"; }\ni.icon.apple.pay:before { content: \"\\f415\"; }\ni.icon.archive:before { content: \"\\f187\"; }\ni.icon.arrow.alternate.circle.down:before { content: \"\\f358\"; }\ni.icon.arrow.alternate.circle.left:before { content: \"\\f359\"; }\ni.icon.arrow.alternate.circle.right:before { content: \"\\f35a\"; }\ni.icon.arrow.alternate.circle.up:before { content: \"\\f35b\"; }\ni.icon.arrow.circle.down:before { content: \"\\f0ab\"; }\ni.icon.arrow.circle.left:before { content: \"\\f0a8\"; }\ni.icon.arrow.circle.right:before { content: \"\\f0a9\"; }\ni.icon.arrow.circle.up:before { content: \"\\f0aa\"; }\ni.icon.arrow.down:before { content: \"\\f063\"; }\ni.icon.arrow.left:before { content: \"\\f060\"; }\ni.icon.arrow.right:before { content: \"\\f061\"; }\ni.icon.arrow.up:before { content: \"\\f062\"; }\ni.icon.arrows.alternate:before { content: \"\\f0b2\"; }\ni.icon.arrows.alternate.horizontal:before { content: \"\\f337\"; }\ni.icon.arrows.alternate.vertical:before { content: \"\\f338\"; }\ni.icon.assistive.listening.systems:before { content: \"\\f2a2\"; }\ni.icon.asterisk:before { content: \"\\f069\"; }\ni.icon.asymmetrik:before { content: \"\\f372\"; }\ni.icon.at:before { content: \"\\f1fa\"; }\ni.icon.audible:before { content: \"\\f373\"; }\ni.icon.audio.description:before { content: \"\\f29e\"; }\ni.icon.autoprefixer:before { content: \"\\f41c\"; }\ni.icon.avianex:before { content: \"\\f374\"; }\ni.icon.aviato:before { content: \"\\f421\"; }\ni.icon.aws:before { content: \"\\f375\"; }\ni.icon.backward:before { content: \"\\f04a\"; }\ni.icon.balance.scale:before { content: \"\\f24e\"; }\ni.icon.ban:before { content: \"\\f05e\"; }\ni.icon.band.aid:before { content: \"\\f462\"; }\ni.icon.bandcamp:before { content: \"\\f2d5\"; }\ni.icon.barcode:before { content: \"\\f02a\"; }\ni.icon.bars:before { content: \"\\f0c9\"; }\ni.icon.baseball.ball:before { content: \"\\f433\"; }\ni.icon.basketball.ball:before { content: \"\\f434\"; }\ni.icon.bath:before { content: \"\\f2cd\"; }\ni.icon.battery.empty:before { content: \"\\f244\"; }\ni.icon.battery.full:before { content: \"\\f240\"; }\ni.icon.battery.half:before { content: \"\\f242\"; }\ni.icon.battery.quarter:before { content: \"\\f243\"; }\ni.icon.battery.three.quarters:before { content: \"\\f241\"; }\ni.icon.bed:before { content: \"\\f236\"; }\ni.icon.beer:before { content: \"\\f0fc\"; }\ni.icon.behance:before { content: \"\\f1b4\"; }\ni.icon.behance.square:before { content: \"\\f1b5\"; }\ni.icon.bell:before { content: \"\\f0f3\"; }\ni.icon.bell.slash:before { content: \"\\f1f6\"; }\ni.icon.bicycle:before { content: \"\\f206\"; }\ni.icon.bimobject:before { content: \"\\f378\"; }\ni.icon.binoculars:before { content: \"\\f1e5\"; }\ni.icon.birthday.cake:before { content: \"\\f1fd\"; }\ni.icon.bitbucket:before { content: \"\\f171\"; }\ni.icon.bitcoin:before { content: \"\\f379\"; }\ni.icon.bity:before { content: \"\\f37a\"; }\ni.icon.black.tie:before { content: \"\\f27e\"; }\ni.icon.blackberry:before { content: \"\\f37b\"; }\ni.icon.blind:before { content: \"\\f29d\"; }\ni.icon.blogger:before { content: \"\\f37c\"; }\ni.icon.blogger.b:before { content: \"\\f37d\"; }\ni.icon.bluetooth:before { content: \"\\f293\"; }\ni.icon.bluetooth.b:before { content: \"\\f294\"; }\ni.icon.bold:before { content: \"\\f032\"; }\ni.icon.bolt:before { content: \"\\f0e7\"; }\ni.icon.bomb:before { content: \"\\f1e2\"; }\ni.icon.book:before { content: \"\\f02d\"; }\ni.icon.bookmark:before { content: \"\\f02e\"; }\ni.icon.bowling.ball:before { content: \"\\f436\"; }\ni.icon.box:before { content: \"\\f466\"; }\ni.icon.boxes:before { content: \"\\f468\"; }\ni.icon.braille:before { content: \"\\f2a1\"; }\ni.icon.briefcase:before { content: \"\\f0b1\"; }\ni.icon.btc:before { content: \"\\f15a\"; }\ni.icon.bug:before { content: \"\\f188\"; }\ni.icon.building:before { content: \"\\f1ad\"; }\ni.icon.bullhorn:before { content: \"\\f0a1\"; }\ni.icon.bullseye:before { content: \"\\f140\"; }\ni.icon.buromobelexperte:before { content: \"\\f37f\"; }\ni.icon.bus:before { content: \"\\f207\"; }\ni.icon.buysellads:before { content: \"\\f20d\"; }\ni.icon.calculator:before { content: \"\\f1ec\"; }\ni.icon.calendar:before { content: \"\\f133\"; }\ni.icon.calendar.alternate:before { content: \"\\f073\"; }\ni.icon.calendar.check:before { content: \"\\f274\"; }\ni.icon.calendar.minus:before { content: \"\\f272\"; }\ni.icon.calendar.plus:before { content: \"\\f271\"; }\ni.icon.calendar.times:before { content: \"\\f273\"; }\ni.icon.camera:before { content: \"\\f030\"; }\ni.icon.camera.retro:before { content: \"\\f083\"; }\ni.icon.car:before { content: \"\\f1b9\"; }\ni.icon.caret.down:before { content: \"\\f0d7\"; }\ni.icon.caret.left:before { content: \"\\f0d9\"; }\ni.icon.caret.right:before { content: \"\\f0da\"; }\ni.icon.caret.square.down:before { content: \"\\f150\"; }\ni.icon.caret.square.left:before { content: \"\\f191\"; }\ni.icon.caret.square.right:before { content: \"\\f152\"; }\ni.icon.caret.square.up:before { content: \"\\f151\"; }\ni.icon.caret.up:before { content: \"\\f0d8\"; }\ni.icon.cart.arrow.down:before { content: \"\\f218\"; }\ni.icon.cart.plus:before { content: \"\\f217\"; }\ni.icon.cc.amazon.pay:before { content: \"\\f42d\"; }\ni.icon.cc.amex:before { content: \"\\f1f3\"; }\ni.icon.cc.apple.pay:before { content: \"\\f416\"; }\ni.icon.cc.diners.club:before { content: \"\\f24c\"; }\ni.icon.cc.discover:before { content: \"\\f1f2\"; }\ni.icon.cc.jcb:before { content: \"\\f24b\"; }\ni.icon.cc.mastercard:before { content: \"\\f1f1\"; }\ni.icon.cc.paypal:before { content: \"\\f1f4\"; }\ni.icon.cc.stripe:before { content: \"\\f1f5\"; }\ni.icon.cc.visa:before { content: \"\\f1f0\"; }\ni.icon.centercode:before { content: \"\\f380\"; }\ni.icon.certificate:before { content: \"\\f0a3\"; }\ni.icon.chart.area:before { content: \"\\f1fe\"; }\ni.icon.chart.bar:before { content: \"\\f080\"; }\ni.icon.chart.line:before { content: \"\\f201\"; }\ni.icon.chart.pie:before { content: \"\\f200\"; }\ni.icon.check:before { content: \"\\f00c\"; }\ni.icon.check.circle:before { content: \"\\f058\"; }\ni.icon.check.square:before { content: \"\\f14a\"; }\ni.icon.chess:before { content: \"\\f439\"; }\ni.icon.chess.bishop:before { content: \"\\f43a\"; }\ni.icon.chess.board:before { content: \"\\f43c\"; }\ni.icon.chess.king:before { content: \"\\f43f\"; }\ni.icon.chess.knight:before { content: \"\\f441\"; }\ni.icon.chess.pawn:before { content: \"\\f443\"; }\ni.icon.chess.queen:before { content: \"\\f445\"; }\ni.icon.chess.rook:before { content: \"\\f447\"; }\ni.icon.chevron.circle.down:before { content: \"\\f13a\"; }\ni.icon.chevron.circle.left:before { content: \"\\f137\"; }\ni.icon.chevron.circle.right:before { content: \"\\f138\"; }\ni.icon.chevron.circle.up:before { content: \"\\f139\"; }\ni.icon.chevron.down:before { content: \"\\f078\"; }\ni.icon.chevron.left:before { content: \"\\f053\"; }\ni.icon.chevron.right:before { content: \"\\f054\"; }\ni.icon.chevron.up:before { content: \"\\f077\"; }\ni.icon.child:before { content: \"\\f1ae\"; }\ni.icon.chrome:before { content: \"\\f268\"; }\ni.icon.circle:before { content: \"\\f111\"; }\ni.icon.circle.notch:before { content: \"\\f1ce\"; }\ni.icon.clipboard:before { content: \"\\f328\"; }\ni.icon.clipboard.check:before { content: \"\\f46c\"; }\ni.icon.clipboard.list:before { content: \"\\f46d\"; }\ni.icon.clock:before { content: \"\\f017\"; }\ni.icon.clone:before { content: \"\\f24d\"; }\ni.icon.closed.captioning:before { content: \"\\f20a\"; }\ni.icon.cloud:before { content: \"\\f0c2\"; }\ni.icon.cloudscale:before { content: \"\\f383\"; }\ni.icon.cloudsmith:before { content: \"\\f384\"; }\ni.icon.cloudversify:before { content: \"\\f385\"; }\ni.icon.code:before { content: \"\\f121\"; }\ni.icon.code.branch:before { content: \"\\f126\"; }\ni.icon.codepen:before { content: \"\\f1cb\"; }\ni.icon.codiepie:before { content: \"\\f284\"; }\ni.icon.coffee:before { content: \"\\f0f4\"; }\ni.icon.cog:before { content: \"\\f013\"; }\ni.icon.cogs:before { content: \"\\f085\"; }\ni.icon.columns:before { content: \"\\f0db\"; }\ni.icon.comment:before { content: \"\\f075\"; }\ni.icon.comment.alternate:before { content: \"\\f27a\"; }\ni.icon.comments:before { content: \"\\f086\"; }\ni.icon.compass:before { content: \"\\f14e\"; }\ni.icon.compress:before { content: \"\\f066\"; }\ni.icon.connectdevelop:before { content: \"\\f20e\"; }\ni.icon.contao:before { content: \"\\f26d\"; }\ni.icon.copy:before { content: \"\\f0c5\"; }\ni.icon.copyright:before { content: \"\\f1f9\"; }\ni.icon.cpanel:before { content: \"\\f388\"; }\ni.icon.creative.commons:before { content: \"\\f25e\"; }\ni.icon.credit.card:before { content: \"\\f09d\"; }\ni.icon.crop:before { content: \"\\f125\"; }\ni.icon.crosshairs:before { content: \"\\f05b\"; }\ni.icon.css3:before { content: \"\\f13c\"; }\ni.icon.css3.alternate:before { content: \"\\f38b\"; }\ni.icon.cube:before { content: \"\\f1b2\"; }\ni.icon.cubes:before { content: \"\\f1b3\"; }\ni.icon.cut:before { content: \"\\f0c4\"; }\ni.icon.cuttlefish:before { content: \"\\f38c\"; }\ni.icon.d.and.d:before { content: \"\\f38d\"; }\ni.icon.dashcube:before { content: \"\\f210\"; }\ni.icon.database:before { content: \"\\f1c0\"; }\ni.icon.deaf:before { content: \"\\f2a4\"; }\ni.icon.delicious:before { content: \"\\f1a5\"; }\ni.icon.deploydog:before { content: \"\\f38e\"; }\ni.icon.deskpro:before { content: \"\\f38f\"; }\ni.icon.desktop:before { content: \"\\f108\"; }\ni.icon.deviantart:before { content: \"\\f1bd\"; }\ni.icon.digg:before { content: \"\\f1a6\"; }\ni.icon.digital.ocean:before { content: \"\\f391\"; }\ni.icon.discord:before { content: \"\\f392\"; }\ni.icon.discourse:before { content: \"\\f393\"; }\ni.icon.dna:before { content: \"\\f471\"; }\ni.icon.dochub:before { content: \"\\f394\"; }\ni.icon.docker:before { content: \"\\f395\"; }\ni.icon.dollar.sign:before { content: \"\\f155\"; }\ni.icon.dolly:before { content: \"\\f472\"; }\ni.icon.dolly.flatbed:before { content: \"\\f474\"; }\ni.icon.dot.circle:before { content: \"\\f192\"; }\ni.icon.download:before { content: \"\\f019\"; }\ni.icon.draft2digital:before { content: \"\\f396\"; }\ni.icon.dribbble:before { content: \"\\f17d\"; }\ni.icon.dribbble.square:before { content: \"\\f397\"; }\ni.icon.dropbox:before { content: \"\\f16b\"; }\ni.icon.drupal:before { content: \"\\f1a9\"; }\ni.icon.dyalog:before { content: \"\\f399\"; }\ni.icon.earlybirds:before { content: \"\\f39a\"; }\ni.icon.edge:before { content: \"\\f282\"; }\ni.icon.edit:before { content: \"\\f044\"; }\ni.icon.eject:before { content: \"\\f052\"; }\ni.icon.elementor:before { content: \"\\f430\"; }\ni.icon.ellipsis.horizontal:before { content: \"\\f141\"; }\ni.icon.ellipsis.vertical:before { content: \"\\f142\"; }\ni.icon.ember:before { content: \"\\f423\"; }\ni.icon.empire:before { content: \"\\f1d1\"; }\ni.icon.envelope:before { content: \"\\f0e0\"; }\ni.icon.envelope.open:before { content: \"\\f2b6\"; }\ni.icon.envelope.square:before { content: \"\\f199\"; }\ni.icon.envira:before { content: \"\\f299\"; }\ni.icon.eraser:before { content: \"\\f12d\"; }\ni.icon.erlang:before { content: \"\\f39d\"; }\ni.icon.ethereum:before { content: \"\\f42e\"; }\ni.icon.etsy:before { content: \"\\f2d7\"; }\ni.icon.euro.sign:before { content: \"\\f153\"; }\ni.icon.exchange.alternate:before { content: \"\\f362\"; }\ni.icon.exclamation:before { content: \"\\f12a\"; }\ni.icon.exclamation.circle:before { content: \"\\f06a\"; }\ni.icon.exclamation.triangle:before { content: \"\\f071\"; }\ni.icon.expand:before { content: \"\\f065\"; }\ni.icon.expand.arrows.alternate:before { content: \"\\f31e\"; }\ni.icon.expeditedssl:before { content: \"\\f23e\"; }\ni.icon.external.alternate:before { content: \"\\f35d\"; }\ni.icon.external.square.alternate:before { content: \"\\f360\"; }\ni.icon.eye:before { content: \"\\f06e\"; }\ni.icon.eye.dropper:before { content: \"\\f1fb\"; }\ni.icon.eye.slash:before { content: \"\\f070\"; }\ni.icon.facebook:before { content: \"\\f09a\"; }\ni.icon.facebook.f:before { content: \"\\f39e\"; }\ni.icon.facebook.messenger:before { content: \"\\f39f\"; }\ni.icon.facebook.square:before { content: \"\\f082\"; }\ni.icon.fast.backward:before { content: \"\\f049\"; }\ni.icon.fast.forward:before { content: \"\\f050\"; }\ni.icon.fax:before { content: \"\\f1ac\"; }\ni.icon.female:before { content: \"\\f182\"; }\ni.icon.fighter.jet:before { content: \"\\f0fb\"; }\ni.icon.file:before { content: \"\\f15b\"; }\ni.icon.file.alternate:before { content: \"\\f15c\"; }\ni.icon.file.archive:before { content: \"\\f1c6\"; }\ni.icon.file.audio:before { content: \"\\f1c7\"; }\ni.icon.file.code:before { content: \"\\f1c9\"; }\ni.icon.file.excel:before { content: \"\\f1c3\"; }\ni.icon.file.image:before { content: \"\\f1c5\"; }\ni.icon.file.pdf:before { content: \"\\f1c1\"; }\ni.icon.file.powerpoint:before { content: \"\\f1c4\"; }\ni.icon.file.video:before { content: \"\\f1c8\"; }\ni.icon.file.word:before { content: \"\\f1c2\"; }\ni.icon.film:before { content: \"\\f008\"; }\ni.icon.filter:before { content: \"\\f0b0\"; }\ni.icon.fire:before { content: \"\\f06d\"; }\ni.icon.fire.extinguisher:before { content: \"\\f134\"; }\ni.icon.firefox:before { content: \"\\f269\"; }\ni.icon.first.aid:before { content: \"\\f479\"; }\ni.icon.first.order:before { content: \"\\f2b0\"; }\ni.icon.firstdraft:before { content: \"\\f3a1\"; }\ni.icon.flag:before { content: \"\\f024\"; }\ni.icon.flag.checkered:before { content: \"\\f11e\"; }\ni.icon.flask:before { content: \"\\f0c3\"; }\ni.icon.flickr:before { content: \"\\f16e\"; }\ni.icon.flipboard:before { content: \"\\f44d\"; }\ni.icon.fly:before { content: \"\\f417\"; }\ni.icon.folder:before { content: \"\\f07b\"; }\ni.icon.folder.open:before { content: \"\\f07c\"; }\ni.icon.font:before { content: \"\\f031\"; }\ni.icon.font.awesome:before { content: \"\\f2b4\"; }\ni.icon.font.awesome.alternate:before { content: \"\\f35c\"; }\ni.icon.font.awesome.flag:before { content: \"\\f425\"; }\ni.icon.fonticons:before { content: \"\\f280\"; }\ni.icon.fonticons.fi:before { content: \"\\f3a2\"; }\ni.icon.football.ball:before { content: \"\\f44e\"; }\ni.icon.fort.awesome:before { content: \"\\f286\"; }\ni.icon.fort.awesome.alternate:before { content: \"\\f3a3\"; }\ni.icon.forumbee:before { content: \"\\f211\"; }\ni.icon.forward:before { content: \"\\f04e\"; }\ni.icon.foursquare:before { content: \"\\f180\"; }\ni.icon.free.code.camp:before { content: \"\\f2c5\"; }\ni.icon.freebsd:before { content: \"\\f3a4\"; }\ni.icon.frown:before { content: \"\\f119\"; }\ni.icon.futbol:before { content: \"\\f1e3\"; }\ni.icon.gamepad:before { content: \"\\f11b\"; }\ni.icon.gavel:before { content: \"\\f0e3\"; }\ni.icon.gem:before { content: \"\\f3a5\"; }\ni.icon.genderless:before { content: \"\\f22d\"; }\ni.icon.get.pocket:before { content: \"\\f265\"; }\ni.icon.gg:before { content: \"\\f260\"; }\ni.icon.gg.circle:before { content: \"\\f261\"; }\ni.icon.gift:before { content: \"\\f06b\"; }\ni.icon.git:before { content: \"\\f1d3\"; }\ni.icon.git.square:before { content: \"\\f1d2\"; }\ni.icon.github:before { content: \"\\f09b\"; }\ni.icon.github.alternate:before { content: \"\\f113\"; }\ni.icon.github.square:before { content: \"\\f092\"; }\ni.icon.gitkraken:before { content: \"\\f3a6\"; }\ni.icon.gitlab:before { content: \"\\f296\"; }\ni.icon.gitter:before { content: \"\\f426\"; }\ni.icon.glass.martini:before { content: \"\\f000\"; }\ni.icon.glide:before { content: \"\\f2a5\"; }\ni.icon.glide.g:before { content: \"\\f2a6\"; }\ni.icon.globe:before { content: \"\\f0ac\"; }\ni.icon.gofore:before { content: \"\\f3a7\"; }\ni.icon.golf.ball:before { content: \"\\f450\"; }\ni.icon.goodreads:before { content: \"\\f3a8\"; }\ni.icon.goodreads.g:before { content: \"\\f3a9\"; }\ni.icon.google:before { content: \"\\f1a0\"; }\ni.icon.google.drive:before { content: \"\\f3aa\"; }\ni.icon.google.play:before { content: \"\\f3ab\"; }\ni.icon.google.plus:before { content: \"\\f2b3\"; }\ni.icon.google.plus.g:before { content: \"\\f0d5\"; }\ni.icon.google.plus.square:before { content: \"\\f0d4\"; }\ni.icon.google.wallet:before { content: \"\\f1ee\"; }\ni.icon.graduation.cap:before { content: \"\\f19d\"; }\ni.icon.gratipay:before { content: \"\\f184\"; }\ni.icon.grav:before { content: \"\\f2d6\"; }\ni.icon.gripfire:before { content: \"\\f3ac\"; }\ni.icon.grunt:before { content: \"\\f3ad\"; }\ni.icon.gulp:before { content: \"\\f3ae\"; }\ni.icon.h.square:before { content: \"\\f0fd\"; }\ni.icon.hacker.news:before { content: \"\\f1d4\"; }\ni.icon.hacker.news.square:before { content: \"\\f3af\"; }\ni.icon.hand.lizard:before { content: \"\\f258\"; }\ni.icon.hand.paper:before { content: \"\\f256\"; }\ni.icon.hand.peace:before { content: \"\\f25b\"; }\ni.icon.hand.point.down:before { content: \"\\f0a7\"; }\ni.icon.hand.point.left:before { content: \"\\f0a5\"; }\ni.icon.hand.point.right:before { content: \"\\f0a4\"; }\ni.icon.hand.point.up:before { content: \"\\f0a6\"; }\ni.icon.hand.pointer:before { content: \"\\f25a\"; }\ni.icon.hand.rock:before { content: \"\\f255\"; }\ni.icon.hand.scissors:before { content: \"\\f257\"; }\ni.icon.hand.spock:before { content: \"\\f259\"; }\ni.icon.handshake:before { content: \"\\f2b5\"; }\ni.icon.hashtag:before { content: \"\\f292\"; }\ni.icon.hdd:before { content: \"\\f0a0\"; }\ni.icon.heading:before { content: \"\\f1dc\"; }\ni.icon.headphones:before { content: \"\\f025\"; }\ni.icon.heart:before { content: \"\\f004\"; }\ni.icon.heartbeat:before { content: \"\\f21e\"; }\ni.icon.hips:before { content: \"\\f452\"; }\ni.icon.hire.a.helper:before { content: \"\\f3b0\"; }\ni.icon.history:before { content: \"\\f1da\"; }\ni.icon.hockey.puck:before { content: \"\\f453\"; }\ni.icon.home:before { content: \"\\f015\"; }\ni.icon.hooli:before { content: \"\\f427\"; }\ni.icon.hospital:before { content: \"\\f0f8\"; }\ni.icon.hospital.symbol:before { content: \"\\f47e\"; }\ni.icon.hotjar:before { content: \"\\f3b1\"; }\ni.icon.hourglass:before { content: \"\\f254\"; }\ni.icon.hourglass.end:before { content: \"\\f253\"; }\ni.icon.hourglass.half:before { content: \"\\f252\"; }\ni.icon.hourglass.start:before { content: \"\\f251\"; }\ni.icon.houzz:before { content: \"\\f27c\"; }\ni.icon.html5:before { content: \"\\f13b\"; }\ni.icon.hubspot:before { content: \"\\f3b2\"; }\ni.icon.i.cursor:before { content: \"\\f246\"; }\ni.icon.id.badge:before { content: \"\\f2c1\"; }\ni.icon.id.card:before { content: \"\\f2c2\"; }\ni.icon.image:before { content: \"\\f03e\"; }\ni.icon.images:before { content: \"\\f302\"; }\ni.icon.imdb:before { content: \"\\f2d8\"; }\ni.icon.inbox:before { content: \"\\f01c\"; }\ni.icon.indent:before { content: \"\\f03c\"; }\ni.icon.industry:before { content: \"\\f275\"; }\ni.icon.info:before { content: \"\\f129\"; }\ni.icon.info.circle:before { content: \"\\f05a\"; }\ni.icon.instagram:before { content: \"\\f16d\"; }\ni.icon.internet.explorer:before { content: \"\\f26b\"; }\ni.icon.ioxhost:before { content: \"\\f208\"; }\ni.icon.italic:before { content: \"\\f033\"; }\ni.icon.itunes:before { content: \"\\f3b4\"; }\ni.icon.itunes.note:before { content: \"\\f3b5\"; }\ni.icon.jenkins:before { content: \"\\f3b6\"; }\ni.icon.joget:before { content: \"\\f3b7\"; }\ni.icon.joomla:before { content: \"\\f1aa\"; }\ni.icon.js:before { content: \"\\f3b8\"; }\ni.icon.js.square:before { content: \"\\f3b9\"; }\ni.icon.jsfiddle:before { content: \"\\f1cc\"; }\ni.icon.key:before { content: \"\\f084\"; }\ni.icon.keyboard:before { content: \"\\f11c\"; }\ni.icon.keycdn:before { content: \"\\f3ba\"; }\ni.icon.kickstarter:before { content: \"\\f3bb\"; }\ni.icon.kickstarter.k:before { content: \"\\f3bc\"; }\ni.icon.korvue:before { content: \"\\f42f\"; }\ni.icon.language:before { content: \"\\f1ab\"; }\ni.icon.laptop:before { content: \"\\f109\"; }\ni.icon.laravel:before { content: \"\\f3bd\"; }\ni.icon.lastfm:before { content: \"\\f202\"; }\ni.icon.lastfm.square:before { content: \"\\f203\"; }\ni.icon.leaf:before { content: \"\\f06c\"; }\ni.icon.leanpub:before { content: \"\\f212\"; }\ni.icon.lemon:before { content: \"\\f094\"; }\ni.icon.less:before { content: \"\\f41d\"; }\ni.icon.level.down.alternate:before { content: \"\\f3be\"; }\ni.icon.level.up.alternate:before { content: \"\\f3bf\"; }\ni.icon.life.ring:before { content: \"\\f1cd\"; }\ni.icon.lightbulb:before { content: \"\\f0eb\"; }\ni.icon.linechat:before { content: \"\\f3c0\"; }\ni.icon.linkify:before { content: \"\\f0c1\"; }\ni.icon.linkedin:before { content: \"\\f08c\"; }\ni.icon.linkedin.in:before { content: \"\\f0e1\"; }\ni.icon.linode:before { content: \"\\f2b8\"; }\ni.icon.linux:before { content: \"\\f17c\"; }\ni.icon.lira.sign:before { content: \"\\f195\"; }\ni.icon.list:before { content: \"\\f03a\"; }\ni.icon.list.alternate:before { content: \"\\f022\"; }\ni.icon.list.ol:before { content: \"\\f0cb\"; }\ni.icon.list.ul:before { content: \"\\f0ca\"; }\ni.icon.location.arrow:before { content: \"\\f124\"; }\ni.icon.lock:before { content: \"\\f023\"; }\ni.icon.lock.open:before { content: \"\\f3c1\"; }\ni.icon.long.arrow.alternate.down:before { content: \"\\f309\"; }\ni.icon.long.arrow.alternate.left:before { content: \"\\f30a\"; }\ni.icon.long.arrow.alternate.right:before { content: \"\\f30b\"; }\ni.icon.long.arrow.alternate.up:before { content: \"\\f30c\"; }\ni.icon.low.vision:before { content: \"\\f2a8\"; }\ni.icon.lyft:before { content: \"\\f3c3\"; }\ni.icon.magento:before { content: \"\\f3c4\"; }\ni.icon.magic:before { content: \"\\f0d0\"; }\ni.icon.magnet:before { content: \"\\f076\"; }\ni.icon.male:before { content: \"\\f183\"; }\ni.icon.map:before { content: \"\\f279\"; }\ni.icon.map.marker:before { content: \"\\f041\"; }\ni.icon.map.marker.alternate:before { content: \"\\f3c5\"; }\ni.icon.map.pin:before { content: \"\\f276\"; }\ni.icon.map.signs:before { content: \"\\f277\"; }\ni.icon.mars:before { content: \"\\f222\"; }\ni.icon.mars.double:before { content: \"\\f227\"; }\ni.icon.mars.stroke:before { content: \"\\f229\"; }\ni.icon.mars.stroke.horizontal:before { content: \"\\f22b\"; }\ni.icon.mars.stroke.vertical:before { content: \"\\f22a\"; }\ni.icon.maxcdn:before { content: \"\\f136\"; }\ni.icon.medapps:before { content: \"\\f3c6\"; }\ni.icon.medium:before { content: \"\\f23a\"; }\ni.icon.medium.m:before { content: \"\\f3c7\"; }\ni.icon.medkit:before { content: \"\\f0fa\"; }\ni.icon.medrt:before { content: \"\\f3c8\"; }\ni.icon.meetup:before { content: \"\\f2e0\"; }\ni.icon.meh:before { content: \"\\f11a\"; }\ni.icon.mercury:before { content: \"\\f223\"; }\ni.icon.microchip:before { content: \"\\f2db\"; }\ni.icon.microphone:before { content: \"\\f130\"; }\ni.icon.microphone.slash:before { content: \"\\f131\"; }\ni.icon.microsoft:before { content: \"\\f3ca\"; }\ni.icon.minus:before { content: \"\\f068\"; }\ni.icon.minus.circle:before { content: \"\\f056\"; }\ni.icon.minus.square:before { content: \"\\f146\"; }\ni.icon.mix:before { content: \"\\f3cb\"; }\ni.icon.mixcloud:before { content: \"\\f289\"; }\ni.icon.mizuni:before { content: \"\\f3cc\"; }\ni.icon.mobile:before { content: \"\\f10b\"; }\ni.icon.mobile.alternate:before { content: \"\\f3cd\"; }\ni.icon.modx:before { content: \"\\f285\"; }\ni.icon.monero:before { content: \"\\f3d0\"; }\ni.icon.money.bill.alternate:before { content: \"\\f3d1\"; }\ni.icon.moon:before { content: \"\\f186\"; }\ni.icon.motorcycle:before { content: \"\\f21c\"; }\ni.icon.mouse.pointer:before { content: \"\\f245\"; }\ni.icon.music:before { content: \"\\f001\"; }\ni.icon.napster:before { content: \"\\f3d2\"; }\ni.icon.neuter:before { content: \"\\f22c\"; }\ni.icon.newspaper:before { content: \"\\f1ea\"; }\ni.icon.nintendo.switch:before { content: \"\\f418\"; }\ni.icon.node:before { content: \"\\f419\"; }\ni.icon.node.js:before { content: \"\\f3d3\"; }\ni.icon.npm:before { content: \"\\f3d4\"; }\ni.icon.ns8:before { content: \"\\f3d5\"; }\ni.icon.nutritionix:before { content: \"\\f3d6\"; }\ni.icon.object.group:before { content: \"\\f247\"; }\ni.icon.object.ungroup:before { content: \"\\f248\"; }\ni.icon.odnoklassniki:before { content: \"\\f263\"; }\ni.icon.odnoklassniki.square:before { content: \"\\f264\"; }\ni.icon.opencart:before { content: \"\\f23d\"; }\ni.icon.openid:before { content: \"\\f19b\"; }\ni.icon.opera:before { content: \"\\f26a\"; }\ni.icon.optin.monster:before { content: \"\\f23c\"; }\ni.icon.osi:before { content: \"\\f41a\"; }\ni.icon.outdent:before { content: \"\\f03b\"; }\ni.icon.page4:before { content: \"\\f3d7\"; }\ni.icon.pagelines:before { content: \"\\f18c\"; }\ni.icon.paint.brush:before { content: \"\\f1fc\"; }\ni.icon.palfed:before { content: \"\\f3d8\"; }\ni.icon.pallet:before { content: \"\\f482\"; }\ni.icon.paper.plane:before { content: \"\\f1d8\"; }\ni.icon.paperclip:before { content: \"\\f0c6\"; }\ni.icon.paragraph:before { content: \"\\f1dd\"; }\ni.icon.paste:before { content: \"\\f0ea\"; }\ni.icon.patreon:before { content: \"\\f3d9\"; }\ni.icon.pause:before { content: \"\\f04c\"; }\ni.icon.pause.circle:before { content: \"\\f28b\"; }\ni.icon.paw:before { content: \"\\f1b0\"; }\ni.icon.paypal:before { content: \"\\f1ed\"; }\ni.icon.pen.square:before { content: \"\\f14b\"; }\ni.icon.pencil.alternate:before { content: \"\\f303\"; }\ni.icon.percent:before { content: \"\\f295\"; }\ni.icon.periscope:before { content: \"\\f3da\"; }\ni.icon.phabricator:before { content: \"\\f3db\"; }\ni.icon.phoenix.framework:before { content: \"\\f3dc\"; }\ni.icon.phone:before { content: \"\\f095\"; }\ni.icon.phone.square:before { content: \"\\f098\"; }\ni.icon.phone.volume:before { content: \"\\f2a0\"; }\ni.icon.php:before { content: \"\\f457\"; }\ni.icon.pied.piper:before { content: \"\\f2ae\"; }\ni.icon.pied.piper.alternate:before { content: \"\\f1a8\"; }\ni.icon.pied.piper.pp:before { content: \"\\f1a7\"; }\ni.icon.pills:before { content: \"\\f484\"; }\ni.icon.pinterest:before { content: \"\\f0d2\"; }\ni.icon.pinterest.p:before { content: \"\\f231\"; }\ni.icon.pinterest.square:before { content: \"\\f0d3\"; }\ni.icon.plane:before { content: \"\\f072\"; }\ni.icon.play:before { content: \"\\f04b\"; }\ni.icon.play.circle:before { content: \"\\f144\"; }\ni.icon.playstation:before { content: \"\\f3df\"; }\ni.icon.plug:before { content: \"\\f1e6\"; }\ni.icon.plus:before { content: \"\\f067\"; }\ni.icon.plus.circle:before { content: \"\\f055\"; }\ni.icon.plus.square:before { content: \"\\f0fe\"; }\ni.icon.podcast:before { content: \"\\f2ce\"; }\ni.icon.pound.sign:before { content: \"\\f154\"; }\ni.icon.power.off:before { content: \"\\f011\"; }\ni.icon.print:before { content: \"\\f02f\"; }\ni.icon.product.hunt:before { content: \"\\f288\"; }\ni.icon.pushed:before { content: \"\\f3e1\"; }\ni.icon.puzzle.piece:before { content: \"\\f12e\"; }\ni.icon.python:before { content: \"\\f3e2\"; }\ni.icon.qq:before { content: \"\\f1d6\"; }\ni.icon.qrcode:before { content: \"\\f029\"; }\ni.icon.question:before { content: \"\\f128\"; }\ni.icon.question.circle:before { content: \"\\f059\"; }\ni.icon.quidditch:before { content: \"\\f458\"; }\ni.icon.quinscape:before { content: \"\\f459\"; }\ni.icon.quora:before { content: \"\\f2c4\"; }\ni.icon.quote.left:before { content: \"\\f10d\"; }\ni.icon.quote.right:before { content: \"\\f10e\"; }\ni.icon.random:before { content: \"\\f074\"; }\ni.icon.ravelry:before { content: \"\\f2d9\"; }\ni.icon.react:before { content: \"\\f41b\"; }\ni.icon.rebel:before { content: \"\\f1d0\"; }\ni.icon.recycle:before { content: \"\\f1b8\"; }\ni.icon.redriver:before { content: \"\\f3e3\"; }\ni.icon.reddit:before { content: \"\\f1a1\"; }\ni.icon.reddit.alien:before { content: \"\\f281\"; }\ni.icon.reddit.square:before { content: \"\\f1a2\"; }\ni.icon.redo:before { content: \"\\f01e\"; }\ni.icon.redo.alternate:before { content: \"\\f2f9\"; }\ni.icon.registered:before { content: \"\\f25d\"; }\ni.icon.rendact:before { content: \"\\f3e4\"; }\ni.icon.renren:before { content: \"\\f18b\"; }\ni.icon.reply:before { content: \"\\f3e5\"; }\ni.icon.reply.all:before { content: \"\\f122\"; }\ni.icon.replyd:before { content: \"\\f3e6\"; }\ni.icon.resolving:before { content: \"\\f3e7\"; }\ni.icon.retweet:before { content: \"\\f079\"; }\ni.icon.road:before { content: \"\\f018\"; }\ni.icon.rocket:before { content: \"\\f135\"; }\ni.icon.rocketchat:before { content: \"\\f3e8\"; }\ni.icon.rockrms:before { content: \"\\f3e9\"; }\ni.icon.rss:before { content: \"\\f09e\"; }\ni.icon.rss.square:before { content: \"\\f143\"; }\ni.icon.ruble.sign:before { content: \"\\f158\"; }\ni.icon.rupee.sign:before { content: \"\\f156\"; }\ni.icon.safari:before { content: \"\\f267\"; }\ni.icon.sass:before { content: \"\\f41e\"; }\ni.icon.save:before { content: \"\\f0c7\"; }\ni.icon.schlix:before { content: \"\\f3ea\"; }\ni.icon.scribd:before { content: \"\\f28a\"; }\ni.icon.search:before { content: \"\\f002\"; }\ni.icon.search.minus:before { content: \"\\f010\"; }\ni.icon.search.plus:before { content: \"\\f00e\"; }\ni.icon.searchengin:before { content: \"\\f3eb\"; }\ni.icon.sellcast:before { content: \"\\f2da\"; }\ni.icon.sellsy:before { content: \"\\f213\"; }\ni.icon.server:before { content: \"\\f233\"; }\ni.icon.servicestack:before { content: \"\\f3ec\"; }\ni.icon.share:before { content: \"\\f064\"; }\ni.icon.share.alternate:before { content: \"\\f1e0\"; }\ni.icon.share.alternate.square:before { content: \"\\f1e1\"; }\ni.icon.share.square:before { content: \"\\f14d\"; }\ni.icon.shekel.sign:before { content: \"\\f20b\"; }\ni.icon.shield.alternate:before { content: \"\\f3ed\"; }\ni.icon.ship:before { content: \"\\f21a\"; }\ni.icon.shipping.fast:before { content: \"\\f48b\"; }\ni.icon.shirtsinbulk:before { content: \"\\f214\"; }\ni.icon.shopping.bag:before { content: \"\\f290\"; }\ni.icon.shopping.basket:before { content: \"\\f291\"; }\ni.icon.shopping.cart:before { content: \"\\f07a\"; }\ni.icon.shower:before { content: \"\\f2cc\"; }\ni.icon.sign.in.alternate:before { content: \"\\f2f6\"; }\ni.icon.sign.language:before { content: \"\\f2a7\"; }\ni.icon.sign.out.alternate:before { content: \"\\f2f5\"; }\ni.icon.signal:before { content: \"\\f012\"; }\ni.icon.simplybuilt:before { content: \"\\f215\"; }\ni.icon.sistrix:before { content: \"\\f3ee\"; }\ni.icon.sitemap:before { content: \"\\f0e8\"; }\ni.icon.skyatlas:before { content: \"\\f216\"; }\ni.icon.skype:before { content: \"\\f17e\"; }\ni.icon.slack:before { content: \"\\f198\"; }\ni.icon.slack.hash:before { content: \"\\f3ef\"; }\ni.icon.sliders.horizontal:before { content: \"\\f1de\"; }\ni.icon.slideshare:before { content: \"\\f1e7\"; }\ni.icon.smile:before { content: \"\\f118\"; }\ni.icon.snapchat:before { content: \"\\f2ab\"; }\ni.icon.snapchat.ghost:before { content: \"\\f2ac\"; }\ni.icon.snapchat.square:before { content: \"\\f2ad\"; }\ni.icon.snowflake:before { content: \"\\f2dc\"; }\ni.icon.sort:before { content: \"\\f0dc\"; }\ni.icon.sort.alphabet.down:before { content: \"\\f15d\"; }\ni.icon.sort.alphabet.up:before { content: \"\\f15e\"; }\ni.icon.sort.amount.down:before { content: \"\\f160\"; }\ni.icon.sort.amount.up:before { content: \"\\f161\"; }\ni.icon.sort.down:before { content: \"\\f0dd\"; }\ni.icon.sort.numeric.down:before { content: \"\\f162\"; }\ni.icon.sort.numeric.up:before { content: \"\\f163\"; }\ni.icon.sort.up:before { content: \"\\f0de\"; }\ni.icon.soundcloud:before { content: \"\\f1be\"; }\ni.icon.space.shuttle:before { content: \"\\f197\"; }\ni.icon.speakap:before { content: \"\\f3f3\"; }\ni.icon.spinner:before { content: \"\\f110\"; }\ni.icon.spotify:before { content: \"\\f1bc\"; }\ni.icon.square:before { content: \"\\f0c8\"; }\ni.icon.square.full:before { content: \"\\f45c\"; }\ni.icon.stack.exchange:before { content: \"\\f18d\"; }\ni.icon.stack.overflow:before { content: \"\\f16c\"; }\ni.icon.star:before { content: \"\\f005\"; }\ni.icon.star.half:before { content: \"\\f089\"; }\ni.icon.staylinked:before { content: \"\\f3f5\"; }\ni.icon.steam:before { content: \"\\f1b6\"; }\ni.icon.steam.square:before { content: \"\\f1b7\"; }\ni.icon.steam.symbol:before { content: \"\\f3f6\"; }\ni.icon.step.backward:before { content: \"\\f048\"; }\ni.icon.step.forward:before { content: \"\\f051\"; }\ni.icon.stethoscope:before { content: \"\\f0f1\"; }\ni.icon.sticker.mule:before { content: \"\\f3f7\"; }\ni.icon.sticky.note:before { content: \"\\f249\"; }\ni.icon.stop:before { content: \"\\f04d\"; }\ni.icon.stop.circle:before { content: \"\\f28d\"; }\ni.icon.stopwatch:before { content: \"\\f2f2\"; }\ni.icon.strava:before { content: \"\\f428\"; }\ni.icon.street.view:before { content: \"\\f21d\"; }\ni.icon.strikethrough:before { content: \"\\f0cc\"; }\ni.icon.stripe:before { content: \"\\f429\"; }\ni.icon.stripe.s:before { content: \"\\f42a\"; }\ni.icon.studiovinari:before { content: \"\\f3f8\"; }\ni.icon.stumbleupon:before { content: \"\\f1a4\"; }\ni.icon.stumbleupon.circle:before { content: \"\\f1a3\"; }\ni.icon.subscript:before { content: \"\\f12c\"; }\ni.icon.subway:before { content: \"\\f239\"; }\ni.icon.suitcase:before { content: \"\\f0f2\"; }\ni.icon.sun:before { content: \"\\f185\"; }\ni.icon.superpowers:before { content: \"\\f2dd\"; }\ni.icon.superscript:before { content: \"\\f12b\"; }\ni.icon.supple:before { content: \"\\f3f9\"; }\ni.icon.sync:before { content: \"\\f021\"; }\ni.icon.sync.alternate:before { content: \"\\f2f1\"; }\ni.icon.syringe:before { content: \"\\f48e\"; }\ni.icon.table:before { content: \"\\f0ce\"; }\ni.icon.table.tennis:before { content: \"\\f45d\"; }\ni.icon.tablet:before { content: \"\\f10a\"; }\ni.icon.tablet.alternate:before { content: \"\\f3fa\"; }\ni.icon.tachometer.alternate:before { content: \"\\f3fd\"; }\ni.icon.tag:before { content: \"\\f02b\"; }\ni.icon.tags:before { content: \"\\f02c\"; }\ni.icon.tasks:before { content: \"\\f0ae\"; }\ni.icon.taxi:before { content: \"\\f1ba\"; }\ni.icon.telegram:before { content: \"\\f2c6\"; }\ni.icon.telegram.plane:before { content: \"\\f3fe\"; }\ni.icon.tencent.weibo:before { content: \"\\f1d5\"; }\ni.icon.terminal:before { content: \"\\f120\"; }\ni.icon.text.height:before { content: \"\\f034\"; }\ni.icon.text.width:before { content: \"\\f035\"; }\ni.icon.th:before { content: \"\\f00a\"; }\ni.icon.th.large:before { content: \"\\f009\"; }\ni.icon.th.list:before { content: \"\\f00b\"; }\ni.icon.themeisle:before { content: \"\\f2b2\"; }\ni.icon.thermometer:before { content: \"\\f491\"; }\ni.icon.thermometer.empty:before { content: \"\\f2cb\"; }\ni.icon.thermometer.full:before { content: \"\\f2c7\"; }\ni.icon.thermometer.half:before { content: \"\\f2c9\"; }\ni.icon.thermometer.quarter:before { content: \"\\f2ca\"; }\ni.icon.thermometer.three.quarters:before { content: \"\\f2c8\"; }\ni.icon.thumbs.down:before { content: \"\\f165\"; }\ni.icon.thumbs.up:before { content: \"\\f164\"; }\ni.icon.thumbtack:before { content: \"\\f08d\"; }\ni.icon.ticket.alternate:before { content: \"\\f3ff\"; }\ni.icon.times:before { content: \"\\f00d\"; }\ni.icon.times.circle:before { content: \"\\f057\"; }\ni.icon.tint:before { content: \"\\f043\"; }\ni.icon.toggle.off:before { content: \"\\f204\"; }\ni.icon.toggle.on:before { content: \"\\f205\"; }\ni.icon.trademark:before { content: \"\\f25c\"; }\ni.icon.train:before { content: \"\\f238\"; }\ni.icon.transgender:before { content: \"\\f224\"; }\ni.icon.transgender.alternate:before { content: \"\\f225\"; }\ni.icon.trash:before { content: \"\\f1f8\"; }\ni.icon.trash.alternate:before { content: \"\\f2ed\"; }\ni.icon.tree:before { content: \"\\f1bb\"; }\ni.icon.trello:before { content: \"\\f181\"; }\ni.icon.tripadvisor:before { content: \"\\f262\"; }\ni.icon.trophy:before { content: \"\\f091\"; }\ni.icon.truck:before { content: \"\\f0d1\"; }\ni.icon.tty:before { content: \"\\f1e4\"; }\ni.icon.tumblr:before { content: \"\\f173\"; }\ni.icon.tumblr.square:before { content: \"\\f174\"; }\ni.icon.tv:before { content: \"\\f26c\"; }\ni.icon.twitch:before { content: \"\\f1e8\"; }\ni.icon.twitter:before { content: \"\\f099\"; }\ni.icon.twitter.square:before { content: \"\\f081\"; }\ni.icon.typo3:before { content: \"\\f42b\"; }\ni.icon.uber:before { content: \"\\f402\"; }\ni.icon.uikit:before { content: \"\\f403\"; }\ni.icon.umbrella:before { content: \"\\f0e9\"; }\ni.icon.underline:before { content: \"\\f0cd\"; }\ni.icon.undo:before { content: \"\\f0e2\"; }\ni.icon.undo.alternate:before { content: \"\\f2ea\"; }\ni.icon.uniregistry:before { content: \"\\f404\"; }\ni.icon.universal.access:before { content: \"\\f29a\"; }\ni.icon.university:before { content: \"\\f19c\"; }\ni.icon.unlink:before { content: \"\\f127\"; }\ni.icon.unlock:before { content: \"\\f09c\"; }\ni.icon.unlock.alternate:before { content: \"\\f13e\"; }\ni.icon.untappd:before { content: \"\\f405\"; }\ni.icon.upload:before { content: \"\\f093\"; }\ni.icon.usb:before { content: \"\\f287\"; }\ni.icon.user:before { content: \"\\f007\"; }\ni.icon.user.circle:before { content: \"\\f2bd\"; }\ni.icon.user.md:before { content: \"\\f0f0\"; }\ni.icon.user.plus:before { content: \"\\f234\"; }\ni.icon.user.secret:before { content: \"\\f21b\"; }\ni.icon.user.times:before { content: \"\\f235\"; }\ni.icon.users:before { content: \"\\f0c0\"; }\ni.icon.ussunnah:before { content: \"\\f407\"; }\ni.icon.utensil.spoon:before { content: \"\\f2e5\"; }\ni.icon.utensils:before { content: \"\\f2e7\"; }\ni.icon.vaadin:before { content: \"\\f408\"; }\ni.icon.venus:before { content: \"\\f221\"; }\ni.icon.venus.double:before { content: \"\\f226\"; }\ni.icon.venus.mars:before { content: \"\\f228\"; }\ni.icon.viacoin:before { content: \"\\f237\"; }\ni.icon.viadeo:before { content: \"\\f2a9\"; }\ni.icon.viadeo.square:before { content: \"\\f2aa\"; }\ni.icon.viber:before { content: \"\\f409\"; }\ni.icon.video:before { content: \"\\f03d\"; }\ni.icon.vimeo:before { content: \"\\f40a\"; }\ni.icon.vimeo.square:before { content: \"\\f194\"; }\ni.icon.vimeo.v:before { content: \"\\f27d\"; }\ni.icon.vine:before { content: \"\\f1ca\"; }\ni.icon.vk:before { content: \"\\f189\"; }\ni.icon.vnv:before { content: \"\\f40b\"; }\ni.icon.volleyball.ball:before { content: \"\\f45f\"; }\ni.icon.volume.down:before { content: \"\\f027\"; }\ni.icon.volume.off:before { content: \"\\f026\"; }\ni.icon.volume.up:before { content: \"\\f028\"; }\ni.icon.vuejs:before { content: \"\\f41f\"; }\ni.icon.warehouse:before { content: \"\\f494\"; }\ni.icon.weibo:before { content: \"\\f18a\"; }\ni.icon.weight:before { content: \"\\f496\"; }\ni.icon.weixin:before { content: \"\\f1d7\"; }\ni.icon.whatsapp:before { content: \"\\f232\"; }\ni.icon.whatsapp.square:before { content: \"\\f40c\"; }\ni.icon.wheelchair:before { content: \"\\f193\"; }\ni.icon.whmcs:before { content: \"\\f40d\"; }\ni.icon.wifi:before { content: \"\\f1eb\"; }\ni.icon.wikipedia.w:before { content: \"\\f266\"; }\ni.icon.window.close:before { content: \"\\f410\"; }\ni.icon.window.maximize:before { content: \"\\f2d0\"; }\ni.icon.window.minimize:before { content: \"\\f2d1\"; }\ni.icon.window.restore:before { content: \"\\f2d2\"; }\ni.icon.windows:before { content: \"\\f17a\"; }\ni.icon.won.sign:before { content: \"\\f159\"; }\ni.icon.wordpress:before { content: \"\\f19a\"; }\ni.icon.wordpress.simple:before { content: \"\\f411\"; }\ni.icon.wpbeginner:before { content: \"\\f297\"; }\ni.icon.wpexplorer:before { content: \"\\f2de\"; }\ni.icon.wpforms:before { content: \"\\f298\"; }\ni.icon.wrench:before { content: \"\\f0ad\"; }\ni.icon.xbox:before { content: \"\\f412\"; }\ni.icon.xing:before { content: \"\\f168\"; }\ni.icon.xing.square:before { content: \"\\f169\"; }\ni.icon.y.combinator:before { content: \"\\f23b\"; }\ni.icon.yahoo:before { content: \"\\f19e\"; }\ni.icon.yandex:before { content: \"\\f413\"; }\ni.icon.yandex.international:before { content: \"\\f414\"; }\ni.icon.yelp:before { content: \"\\f1e9\"; }\ni.icon.yen.sign:before { content: \"\\f157\"; }\ni.icon.yoast:before { content: \"\\f2b1\"; }\ni.icon.youtube:before { content: \"\\f167\"; }\ni.icon.youtube.square:before { content: \"\\f431\"; }\n\n\n/* Aliases */\ni.icon.chess.rock:before { content: \"\\f447\"; }\ni.icon.ordered.list:before { content: \"\\f0cb\"; }\ni.icon.unordered.list:before { content: \"\\f0ca\"; }\ni.icon.user.doctor:before { content: \"\\f0f0\"; }\ni.icon.shield:before { content: \"\\f3ed\"; }\ni.icon.puzzle:before { content: \"\\f12e\"; }\ni.icon.credit.card.amazon.pay:before { content: \"\\f42d\"; }\ni.icon.credit.card.american.express:before { content: \"\\f1f3\"; }\ni.icon.credit.card.diners.club:before { content: \"\\f24c\"; }\ni.icon.credit.card.discover:before { content: \"\\f1f2\"; }\ni.icon.credit.card.jcb:before { content: \"\\f24b\"; }\ni.icon.credit.card.mastercard:before { content: \"\\f1f1\"; }\ni.icon.credit.card.paypal:before { content: \"\\f1f4\"; }\ni.icon.credit.card.stripe:before { content: \"\\f1f5\"; }\ni.icon.credit.card.visa:before { content: \"\\f1f0\"; }\ni.icon.add.circle:before { content: \"\\f055\"; }\ni.icon.add.square:before { content: \"\\f0fe\"; }\ni.icon.add.to.calendar:before { content: \"\\f271\"; }\ni.icon.add.to.cart:before { content: \"\\f217\"; }\ni.icon.add.user:before { content: \"\\f234\"; }\ni.icon.add:before { content: \"\\f067\"; }\ni.icon.alarm.mute:before { content: \"\\f1f6\"; }\ni.icon.alarm:before { content: \"\\f0f3\"; }\ni.icon.ald:before { content: \"\\f2a2\"; }\ni.icon.als:before { content: \"\\f2a2\"; }\ni.icon.american.express.card:before { content: \"\\f1f3\"; }\ni.icon.american.express:before { content: \"\\f1f3\"; }\ni.icon.amex:before { content: \"\\f1f3\"; }\ni.icon.announcement:before { content: \"\\f0a1\"; }\ni.icon.area.chart:before { content: \"\\f1fe\"; }\ni.icon.area.graph:before { content: \"\\f1fe\"; }\ni.icon.arrow.down.cart:before { content: \"\\f218\"; }\ni.icon.asexual:before { content: \"\\f22d\"; }\ni.icon.asl.interpreting:before { content: \"\\f2a3\"; }\ni.icon.asl:before { content: \"\\f2a3\"; }\ni.icon.assistive.listening.devices:before { content: \"\\f2a2\"; }\ni.icon.attach:before { content: \"\\f0c6\"; }\ni.icon.attention:before { content: \"\\f06a\"; }\ni.icon.balance:before { content: \"\\f24e\"; }\ni.icon.bar:before { content: \"\\f0fc\"; }\ni.icon.bathtub:before { content: \"\\f2cd\"; }\ni.icon.battery.four:before { content: \"\\f240\"; }\ni.icon.battery.high:before { content: \"\\f241\"; }\ni.icon.battery.low:before { content: \"\\f243\"; }\ni.icon.battery.medium:before { content: \"\\f242\"; }\ni.icon.battery.one:before { content: \"\\f243\"; }\ni.icon.battery.three:before { content: \"\\f241\"; }\ni.icon.battery.two:before { content: \"\\f242\"; }\ni.icon.battery.zero:before { content: \"\\f244\"; }\ni.icon.birthday:before { content: \"\\f1fd\"; }\ni.icon.block.layout:before { content: \"\\f009\"; }\ni.icon.bluetooth.alternative:before { content: \"\\f294\"; }\ni.icon.broken.chain:before { content: \"\\f127\"; }\ni.icon.browser:before { content: \"\\f022\"; }\ni.icon.call.square:before { content: \"\\f098\"; }\ni.icon.call:before { content: \"\\f095\"; }\ni.icon.cancel:before { content: \"\\f00d\"; }\ni.icon.cart:before { content: \"\\f07a\"; }\ni.icon.cc:before { content: \"\\f20a\"; }\ni.icon.chain:before { content: \"\\f0c1\"; }\ni.icon.chat:before { content: \"\\f075\"; }\ni.icon.checked.calendar:before { content: \"\\f274\"; }\ni.icon.checkmark:before { content: \"\\f00c\"; }\ni.icon.circle.notched:before { content: \"\\f1ce\"; }\ni.icon.close:before { content: \"\\f00d\"; }\ni.icon.cny:before { content: \"\\f157\"; }\ni.icon.cocktail:before { content: \"\\f000\"; }\ni.icon.commenting:before { content: \"\\f27a\"; }\ni.icon.computer:before { content: \"\\f108\"; }\ni.icon.configure:before { content: \"\\f0ad\"; }\ni.icon.content:before { content: \"\\f0c9\"; }\ni.icon.deafness:before { content: \"\\f2a4\"; }\ni.icon.delete.calendar:before { content: \"\\f273\"; }\ni.icon.delete:before { content: \"\\f00d\"; }\ni.icon.detective:before { content: \"\\f21b\"; }\ni.icon.diners.club.card:before { content: \"\\f24c\"; }\ni.icon.diners.club:before { content: \"\\f24c\"; }\ni.icon.discover.card:before { content: \"\\f1f2\"; }\ni.icon.discover:before { content: \"\\f1f2\"; }\ni.icon.discussions:before { content: \"\\f086\"; }\ni.icon.doctor:before { content: \"\\f0f0\"; }\ni.icon.dollar:before { content: \"\\f155\"; }\ni.icon.dont:before { content: \"\\f05e\"; }\ni.icon.dribble:before { content: \"\\f17d\"; }\ni.icon.drivers.license:before { content: \"\\f2c2\"; }\ni.icon.dropdown:before { content: \"\\f0d7\"; }\ni.icon.eercast:before { content: \"\\f2da\"; }\ni.icon.emergency:before { content: \"\\f0f9\"; }\ni.icon.envira.gallery:before { content: \"\\f299\"; }\ni.icon.erase:before { content: \"\\f12d\"; }\ni.icon.eur:before { content: \"\\f153\"; }\ni.icon.euro:before { content: \"\\f153\"; }\ni.icon.eyedropper:before { content: \"\\f1fb\"; }\ni.icon.fa:before { content: \"\\f2b4\"; }\ni.icon.factory:before { content: \"\\f275\"; }\ni.icon.favorite:before { content: \"\\f005\"; }\ni.icon.feed:before { content: \"\\f09e\"; }\ni.icon.female.homosexual:before { content: \"\\f226\"; }\ni.icon.file.text:before { content: \"\\f15c\"; }\ni.icon.find:before { content: \"\\f1e5\"; }\ni.icon.first.aid:before { content: \"\\f0fa\"; }\ni.icon.five.hundred.pixels:before { content: \"\\f26e\"; }\ni.icon.fork:before { content: \"\\f126\"; }\ni.icon.game:before { content: \"\\f11b\"; }\ni.icon.gay:before { content: \"\\f227\"; }\ni.icon.gbp:before { content: \"\\f154\"; }\ni.icon.gittip:before { content: \"\\f184\"; }\ni.icon.google.plus.circle:before { content: \"\\f2b3\"; }\ni.icon.google.plus.official:before { content: \"\\f2b3\"; }\ni.icon.grab:before { content: \"\\f255\"; }\ni.icon.graduation:before { content: \"\\f19d\"; }\ni.icon.grid.layout:before { content: \"\\f00a\"; }\ni.icon.group:before { content: \"\\f0c0\"; }\ni.icon.h:before { content: \"\\f0fd\"; }\ni.icon.hand.victory:before { content: \"\\f25b\"; }\ni.icon.handicap:before { content: \"\\f193\"; }\ni.icon.hard.of.hearing:before { content: \"\\f2a4\"; }\ni.icon.header:before { content: \"\\f1dc\"; }\ni.icon.help.circle:before { content: \"\\f059\"; }\ni.icon.help:before { content: \"\\f128\"; }\ni.icon.heterosexual:before { content: \"\\f228\"; }\ni.icon.hide:before { content: \"\\f070\"; }\ni.icon.hotel:before { content: \"\\f236\"; }\ni.icon.hourglass.four:before { content: \"\\f254\"; }\ni.icon.hourglass.full:before { content: \"\\f254\"; }\ni.icon.hourglass.one:before { content: \"\\f251\"; }\ni.icon.hourglass.three:before { content: \"\\f253\"; }\ni.icon.hourglass.two:before { content: \"\\f252\"; }\ni.icon.idea:before { content: \"\\f0eb\"; }\ni.icon.ils:before { content: \"\\f20b\"; }\ni.icon.in.cart:before { content: \"\\f218\"; }\ni.icon.inr:before { content: \"\\f156\"; }\ni.icon.intergender:before { content: \"\\f224\"; }\ni.icon.intersex:before { content: \"\\f224\"; }\ni.icon.japan.credit.bureau.card:before { content: \"\\f24b\"; }\ni.icon.japan.credit.bureau:before { content: \"\\f24b\"; }\ni.icon.jcb:before { content: \"\\f24b\"; }\ni.icon.jpy:before { content: \"\\f157\"; }\ni.icon.krw:before { content: \"\\f159\"; }\ni.icon.lab:before { content: \"\\f0c3\"; }\ni.icon.law:before { content: \"\\f24e\"; }\ni.icon.legal:before { content: \"\\f0e3\"; }\ni.icon.lesbian:before { content: \"\\f226\"; }\ni.icon.lightning:before { content: \"\\f0e7\"; }\ni.icon.like:before { content: \"\\f004\"; }\ni.icon.line.graph:before { content: \"\\f201\"; }\ni.icon.linkedin.square:before { content: \"\\f08c\"; }\ni.icon.linkify:before { content: \"\\f0c1\"; }\ni.icon.lira:before { content: \"\\f195\"; }\ni.icon.list.layout:before { content: \"\\f00b\"; }\ni.icon.magnify:before { content: \"\\f00e\"; }\ni.icon.mail.forward:before { content: \"\\f064\"; }\ni.icon.mail.square:before { content: \"\\f199\"; }\ni.icon.mail:before { content: \"\\f0e0\"; }\ni.icon.male.homosexual:before { content: \"\\f227\"; }\ni.icon.man:before { content: \"\\f222\"; }\ni.icon.marker:before { content: \"\\f041\"; }\ni.icon.mars.alternate:before { content: \"\\f229\"; }\ni.icon.mars.horizontal:before { content: \"\\f22b\"; }\ni.icon.mars.vertical:before { content: \"\\f22a\"; }\ni.icon.mastercard.card:before { content: \"\\f1f1\"; }\ni.icon.mastercard:before { content: \"\\f1f1\"; }\ni.icon.microsoft.edge:before { content: \"\\f282\"; }\ni.icon.military:before { content: \"\\f0fb\"; }\ni.icon.ms.edge:before { content: \"\\f282\"; }\ni.icon.mute:before { content: \"\\f131\"; }\ni.icon.new.pied.piper:before { content: \"\\f2ae\"; }\ni.icon.non.binary.transgender:before { content: \"\\f223\"; }\ni.icon.numbered.list:before { content: \"\\f0cb\"; }\ni.icon.optinmonster:before { content: \"\\f23c\"; }\ni.icon.options:before { content: \"\\f1de\"; }\ni.icon.other.gender.horizontal:before { content: \"\\f22b\"; }\ni.icon.other.gender.vertical:before { content: \"\\f22a\"; }\ni.icon.other.gender:before { content: \"\\f229\"; }\ni.icon.payment:before { content: \"\\f09d\"; }\ni.icon.paypal.card:before { content: \"\\f1f4\"; }\ni.icon.pencil.square:before { content: \"\\f14b\"; }\ni.icon.photo:before { content: \"\\f030\"; }\ni.icon.picture:before { content: \"\\f03e\"; }\ni.icon.pie.chart:before { content: \"\\f200\"; }\ni.icon.pie.graph:before { content: \"\\f200\"; }\ni.icon.pied.piper.hat:before { content: \"\\f2ae\"; }\ni.icon.pin:before { content: \"\\f08d\"; }\ni.icon.plus.cart:before { content: \"\\f217\"; }\ni.icon.pocket:before { content: \"\\f265\"; }\ni.icon.point:before { content: \"\\f041\"; }\ni.icon.pointing.down:before { content: \"\\f0a7\"; }\ni.icon.pointing.left:before { content: \"\\f0a5\"; }\ni.icon.pointing.right:before { content: \"\\f0a4\"; }\ni.icon.pointing.up:before { content: \"\\f0a6\"; }\ni.icon.pound:before { content: \"\\f154\"; }\ni.icon.power.cord:before { content: \"\\f1e6\"; }\ni.icon.power:before { content: \"\\f011\"; }\ni.icon.privacy:before { content: \"\\f084\"; }\ni.icon.r.circle:before { content: \"\\f25d\"; }\ni.icon.rain:before { content: \"\\f0e9\"; }\ni.icon.record:before { content: \"\\f03d\"; }\ni.icon.refresh:before { content: \"\\f021\"; }\ni.icon.remove.circle:before { content: \"\\f057\"; }\ni.icon.remove.from.calendar:before { content: \"\\f272\"; }\ni.icon.remove.user:before { content: \"\\f235\"; }\ni.icon.remove:before { content: \"\\f00d\"; }\ni.icon.repeat:before { content: \"\\f01e\"; }\ni.icon.rmb:before { content: \"\\f157\"; }\ni.icon.rouble:before { content: \"\\f158\"; }\ni.icon.rub:before { content: \"\\f158\"; }\ni.icon.ruble:before { content: \"\\f158\"; }\ni.icon.rupee:before { content: \"\\f156\"; }\ni.icon.s15:before { content: \"\\f2cd\"; }\ni.icon.selected.radio:before { content: \"\\f192\"; }\ni.icon.send:before { content: \"\\f1d8\"; }\ni.icon.setting:before { content: \"\\f013\"; }\ni.icon.settings:before { content: \"\\f085\"; }\ni.icon.shekel:before { content: \"\\f20b\"; }\ni.icon.sheqel:before { content: \"\\f20b\"; }\ni.icon.shipping:before { content: \"\\f0d1\"; }\ni.icon.shop:before { content: \"\\f07a\"; }\ni.icon.shuffle:before { content: \"\\f074\"; }\ni.icon.shutdown:before { content: \"\\f011\"; }\ni.icon.sidebar:before { content: \"\\f0c9\"; }\ni.icon.signing:before { content: \"\\f2a7\"; }\ni.icon.signup:before { content: \"\\f044\"; }\ni.icon.sliders:before { content: \"\\f1de\"; }\ni.icon.soccer:before { content: \"\\f1e3\"; }\ni.icon.sort.alphabet.ascending:before { content: \"\\f15d\"; }\ni.icon.sort.alphabet.descending:before { content: \"\\f15e\"; }\ni.icon.sort.ascending:before { content: \"\\f0de\"; }\ni.icon.sort.content.ascending:before { content: \"\\f160\"; }\ni.icon.sort.content.descending:before { content: \"\\f161\"; }\ni.icon.sort.descending:before { content: \"\\f0dd\"; }\ni.icon.sort.numeric.ascending:before { content: \"\\f162\"; }\ni.icon.sort.numeric.descending:before { content: \"\\f163\"; }\ni.icon.sound:before { content: \"\\f025\"; }\ni.icon.spy:before { content: \"\\f21b\"; }\ni.icon.stripe.card:before { content: \"\\f1f5\"; }\ni.icon.student:before { content: \"\\f19d\"; }\ni.icon.talk:before { content: \"\\f27a\"; }\ni.icon.target:before { content: \"\\f140\"; }\ni.icon.teletype:before { content: \"\\f1e4\"; }\ni.icon.television:before { content: \"\\f26c\"; }\ni.icon.text.cursor:before { content: \"\\f246\"; }\ni.icon.text.telephone:before { content: \"\\f1e4\"; }\ni.icon.theme.isle:before { content: \"\\f2b2\"; }\ni.icon.theme:before { content: \"\\f043\"; }\ni.icon.thermometer:before { content: \"\\f2c7\"; }\ni.icon.thumb.tack:before { content: \"\\f08d\"; }\ni.icon.time:before { content: \"\\f017\"; }\ni.icon.tm:before { content: \"\\f25c\"; }\ni.icon.toggle.down:before { content: \"\\f150\"; }\ni.icon.toggle.left:before { content: \"\\f191\"; }\ni.icon.toggle.right:before { content: \"\\f152\"; }\ni.icon.toggle.up:before { content: \"\\f151\"; }\ni.icon.translate:before { content: \"\\f1ab\"; }\ni.icon.travel:before { content: \"\\f0b1\"; }\ni.icon.treatment:before { content: \"\\f0f1\"; }\ni.icon.triangle.down:before { content: \"\\f0d7\"; }\ni.icon.triangle.left:before { content: \"\\f0d9\"; }\ni.icon.triangle.right:before { content: \"\\f0da\"; }\ni.icon.triangle.up:before { content: \"\\f0d8\"; }\ni.icon.try:before { content: \"\\f195\"; }\ni.icon.unhide:before { content: \"\\f06e\"; }\ni.icon.unlinkify:before { content: \"\\f127\"; }\ni.icon.unmute:before { content: \"\\f130\"; }\ni.icon.usd:before { content: \"\\f155\"; }\ni.icon.user.cancel:before { content: \"\\f235\"; }\ni.icon.user.close:before { content: \"\\f235\"; }\ni.icon.user.delete:before { content: \"\\f235\"; }\ni.icon.user.x:before { content: \"\\f235\"; }\ni.icon.vcard:before { content: \"\\f2bb\"; }\ni.icon.video.camera:before { content: \"\\f03d\"; }\ni.icon.video.play:before { content: \"\\f144\"; }\ni.icon.visa.card:before { content: \"\\f1f0\"; }\ni.icon.visa:before { content: \"\\f1f0\"; }\ni.icon.volume.control.phone:before { content: \"\\f2a0\"; }\ni.icon.wait:before { content: \"\\f017\"; }\ni.icon.warning.circle:before { content: \"\\f06a\"; }\ni.icon.warning.sign:before { content: \"\\f071\"; }\ni.icon.warning:before { content: \"\\f12a\"; }\ni.icon.wechat:before { content: \"\\f1d7\"; }\ni.icon.wi-fi:before { content: \"\\f1eb\"; }\ni.icon.wikipedia:before { content: \"\\f266\"; }\ni.icon.winner:before { content: \"\\f091\"; }\ni.icon.wizard:before { content: \"\\f0d0\"; }\ni.icon.woman:before { content: \"\\f221\"; }\ni.icon.won:before { content: \"\\f159\"; }\ni.icon.wordpress.beginner:before { content: \"\\f297\"; }\ni.icon.wordpress.forms:before { content: \"\\f298\"; }\ni.icon.world:before { content: \"\\f0ac\"; }\ni.icon.write.square:before { content: \"\\f14b\"; }\ni.icon.x:before { content: \"\\f00d\"; }\ni.icon.yc:before { content: \"\\f23b\"; }\ni.icon.ycombinator:before { content: \"\\f23b\"; }\ni.icon.yen:before { content: \"\\f157\"; }\ni.icon.zip:before { content: \"\\f187\"; }\ni.icon.zoom.in:before { content: \"\\f00e\"; }\ni.icon.zoom.out:before { content: \"\\f010\"; }\ni.icon.zoom:before { content: \"\\f00e\"; }\ni.icon.bitbucket.square:before { content: \"\\f171\"; }\ni.icon.checkmark.box:before { content: \"\\f14a\"; }\ni.icon.circle.thin:before { content: \"\\f111\"; }\ni.icon.cloud.download:before { content: \"\\f381\"; }\ni.icon.cloud.upload:before { content: \"\\f382\"; }\ni.icon.compose:before { content: \"\\f303\"; }\ni.icon.conversation:before { content: \"\\f086\"; }\ni.icon.credit.card.alternative:before { content: \"\\f09d\"; }\ni.icon.currency:before { content: \"\\f3d1\"; }\ni.icon.dashboard:before { content: \"\\f3fd\"; }\ni.icon.diamond:before { content: \"\\f3a5\"; }\ni.icon.disk:before { content: \"\\f0a0\"; }\ni.icon.exchange:before { content: \"\\f362\"; }\ni.icon.external.share:before { content: \"\\f14d\"; }\ni.icon.external.square:before { content: \"\\f360\"; }\ni.icon.external:before { content: \"\\f35d\"; }\ni.icon.facebook.official:before { content: \"\\f082\"; }\ni.icon.food:before { content: \"\\f2e7\"; }\ni.icon.hourglass.zero:before { content: \"\\f253\"; }\ni.icon.level.down:before { content: \"\\f3be\"; }\ni.icon.level.up:before { content: \"\\f3bf\"; }\ni.icon.log.out:before { content: \"\\f2f5\"; }\ni.icon.meanpath:before { content: \"\\f0c8\"; }\ni.icon.money:before { content: \"\\f3d1\"; }\ni.icon.move:before { content: \"\\f0b2\"; }\ni.icon.pencil:before { content: \"\\f303\"; }\ni.icon.protect:before { content: \"\\f023\"; }\ni.icon.radio:before { content: \"\\f192\"; }\ni.icon.remove.bookmark:before { content: \"\\f02e\"; }\ni.icon.resize.horizontal:before { content: \"\\f337\"; }\ni.icon.resize.vertical:before { content: \"\\f338\"; }\ni.icon.sign.in:before { content: \"\\f2f6\"; }\ni.icon.sign.out:before { content: \"\\f2f5\"; }\ni.icon.spoon:before { content: \"\\f2e5\"; }\ni.icon.star.half.empty:before { content: \"\\f089\"; }\ni.icon.star.half.full:before { content: \"\\f089\"; }\ni.icon.ticket:before { content: \"\\f3ff\"; }\ni.icon.times.rectangle:before { content: \"\\f410\"; }\ni.icon.write:before { content: \"\\f303\"; }\ni.icon.youtube.play:before { content: \"\\f167\"; }\n\n\n\n/*******************************\n        Outline Icons\n*******************************/\n\n/* Outline Icon */\n.loadOutlineIcons() when (@importOutlineIcons) {\n  /* Load & Define Icon Font */\n  @font-face {\n    font-family: @outlineFontName;\n    src: @outlineFallbackSRC;\n    src: @outlineSrc;\n    font-style: normal;\n    font-weight: @normal;\n    font-variant: normal;\n    text-decoration: inherit;\n    text-transform: none;\n  }\n  i.icon.outline {\n    font-family: @outlineFontName;\n  }\n  /* Icon Definitions */\n  i.icon.address.book.outline:before { content: \"\\f2b9\"; }\n  i.icon.address.card.outline:before { content: \"\\f2bb\"; }\n  i.icon.arrow.alternate.circle.down.outline:before { content: \"\\f358\"; }\n  i.icon.arrow.alternate.circle.left.outline:before { content: \"\\f359\"; }\n  i.icon.arrow.alternate.circle.right.outline:before { content: \"\\f35a\"; }\n  i.icon.arrow.alternate.circle.up.outline:before { content: \"\\f35b\"; }\n  i.icon.bell.outline:before { content: \"\\f0f3\"; }\n  i.icon.bell.slash.outline:before { content: \"\\f1f6\"; }\n  i.icon.bookmark.outline:before { content: \"\\f02e\"; }\n  i.icon.building.outline:before { content: \"\\f1ad\"; }\n  i.icon.calendar.outline:before { content: \"\\f133\"; }\n  i.icon.calendar.alternate.outline:before { content: \"\\f073\"; }\n  i.icon.calendar.check.outline:before { content: \"\\f274\"; }\n  i.icon.calendar.minus.outline:before { content: \"\\f272\"; }\n  i.icon.calendar.plus.outline:before { content: \"\\f271\"; }\n  i.icon.calendar.times.outline:before { content: \"\\f273\"; }\n  i.icon.caret.square.down.outline:before { content: \"\\f150\"; }\n  i.icon.caret.square.left.outline:before { content: \"\\f191\"; }\n  i.icon.caret.square.right.outline:before { content: \"\\f152\"; }\n  i.icon.caret.square.up.outline:before { content: \"\\f151\"; }\n  i.icon.chart.bar.outline:before { content: \"\\f080\"; }\n  i.icon.check.circle.outline:before { content: \"\\f058\"; }\n  i.icon.check.square.outline:before { content: \"\\f14a\"; }\n  i.icon.circle.outline:before { content: \"\\f111\"; }\n  i.icon.clipboard.outline:before { content: \"\\f328\"; }\n  i.icon.clock.outline:before { content: \"\\f017\"; }\n  i.icon.clone.outline:before { content: \"\\f24d\"; }\n  i.icon.closed.captioning.outline:before { content: \"\\f20a\"; }\n  i.icon.comment.outline:before { content: \"\\f075\"; }\n  i.icon.comment.alternate.outline:before { content: \"\\f27a\"; }\n  i.icon.comments.outline:before { content: \"\\f086\"; }\n  i.icon.compass.outline:before { content: \"\\f14e\"; }\n  i.icon.copy.outline:before { content: \"\\f0c5\"; }\n  i.icon.copyright.outline:before { content: \"\\f1f9\"; }\n  i.icon.credit.card.outline:before { content: \"\\f09d\"; }\n  i.icon.dot.circle.outline:before { content: \"\\f192\"; }\n  i.icon.edit.outline:before { content: \"\\f044\"; }\n  i.icon.envelope.outline:before { content: \"\\f0e0\"; }\n  i.icon.envelope.open.outline:before { content: \"\\f2b6\"; }\n  i.icon.eye.slash.outline:before { content: \"\\f070\"; }\n  i.icon.file.outline:before { content: \"\\f15b\"; }\n  i.icon.file.alternate.outline:before { content: \"\\f15c\"; }\n  i.icon.file.archive.outline:before { content: \"\\f1c6\"; }\n  i.icon.file.audio.outline:before { content: \"\\f1c7\"; }\n  i.icon.file.code.outline:before { content: \"\\f1c9\"; }\n  i.icon.file.excel.outline:before { content: \"\\f1c3\"; }\n  i.icon.file.image.outline:before { content: \"\\f1c5\"; }\n  i.icon.file.pdf.outline:before { content: \"\\f1c1\"; }\n  i.icon.file.powerpoint.outline:before { content: \"\\f1c4\"; }\n  i.icon.file.video.outline:before { content: \"\\f1c8\"; }\n  i.icon.file.word.outline:before { content: \"\\f1c2\"; }\n  i.icon.flag.outline:before { content: \"\\f024\"; }\n  i.icon.folder.outline:before { content: \"\\f07b\"; }\n  i.icon.folder.open.outline:before { content: \"\\f07c\"; }\n  i.icon.frown.outline:before { content: \"\\f119\"; }\n  i.icon.futbol.outline:before { content: \"\\f1e3\"; }\n  i.icon.gem.outline:before { content: \"\\f3a5\"; }\n  i.icon.hand.lizard.outline:before { content: \"\\f258\"; }\n  i.icon.hand.paper.outline:before { content: \"\\f256\"; }\n  i.icon.hand.peace.outline:before { content: \"\\f25b\"; }\n  i.icon.hand.point.down.outline:before { content: \"\\f0a7\"; }\n  i.icon.hand.point.left.outline:before { content: \"\\f0a5\"; }\n  i.icon.hand.point.right.outline:before { content: \"\\f0a4\"; }\n  i.icon.hand.point.up.outline:before { content: \"\\f0a6\"; }\n  i.icon.hand.pointer.outline:before { content: \"\\f25a\"; }\n  i.icon.hand.rock.outline:before { content: \"\\f255\"; }\n  i.icon.hand.scissors.outline:before { content: \"\\f257\"; }\n  i.icon.hand.spock.outline:before { content: \"\\f259\"; }\n  i.icon.handshake.outline:before { content: \"\\f2b5\"; }\n  i.icon.hdd.outline:before { content: \"\\f0a0\"; }\n  i.icon.heart.outline:before { content: \"\\f004\"; }\n  i.icon.hospital.outline:before { content: \"\\f0f8\"; }\n  i.icon.hourglass.outline:before { content: \"\\f254\"; }\n  i.icon.id.badge.outline:before { content: \"\\f2c1\"; }\n  i.icon.id.card.outline:before { content: \"\\f2c2\"; }\n  i.icon.image.outline:before { content: \"\\f03e\"; }\n  i.icon.images.outline:before { content: \"\\f302\"; }\n  i.icon.keyboard.outline:before { content: \"\\f11c\"; }\n  i.icon.lemon.outline:before { content: \"\\f094\"; }\n  i.icon.life.ring.outline:before { content: \"\\f1cd\"; }\n  i.icon.lightbulb.outline:before { content: \"\\f0eb\"; }\n  i.icon.list.alternate.outline:before { content: \"\\f022\"; }\n  i.icon.map.outline:before { content: \"\\f279\"; }\n  i.icon.meh.outline:before { content: \"\\f11a\"; }\n  i.icon.minus.square.outline:before { content: \"\\f146\"; }\n  i.icon.money.bill.alternate.outline:before { content: \"\\f3d1\"; }\n  i.icon.moon.outline:before { content: \"\\f186\"; }\n  i.icon.newspaper.outline:before { content: \"\\f1ea\"; }\n  i.icon.object.group.outline:before { content: \"\\f247\"; }\n  i.icon.object.ungroup.outline:before { content: \"\\f248\"; }\n  i.icon.paper.plane.outline:before { content: \"\\f1d8\"; }\n  i.icon.pause.circle.outline:before { content: \"\\f28b\"; }\n  i.icon.play.circle.outline:before { content: \"\\f144\"; }\n  i.icon.plus.square.outline:before { content: \"\\f0fe\"; }\n  i.icon.question.circle.outline:before { content: \"\\f059\"; }\n  i.icon.registered.outline:before { content: \"\\f25d\"; }\n  i.icon.save.outline:before { content: \"\\f0c7\"; }\n  i.icon.share.square.outline:before { content: \"\\f14d\"; }\n  i.icon.smile.outline:before { content: \"\\f118\"; }\n  i.icon.snowflake.outline:before { content: \"\\f2dc\"; }\n  i.icon.square.outline:before { content: \"\\f0c8\"; }\n  i.icon.star.outline:before { content: \"\\f005\"; }\n  i.icon.star.half.outline:before { content: \"\\f089\"; }\n  i.icon.sticky.note.outline:before { content: \"\\f249\"; }\n  i.icon.stop.circle.outline:before { content: \"\\f28d\"; }\n  i.icon.sun.outline:before { content: \"\\f185\"; }\n  i.icon.thumbs.down.outline:before { content: \"\\f165\"; }\n  i.icon.thumbs.up.outline:before { content: \"\\f164\"; }\n  i.icon.times.circle.outline:before { content: \"\\f057\"; }\n  i.icon.trash.alternate.outline:before { content: \"\\f2ed\"; }\n  i.icon.user.outline:before { content: \"\\f007\"; }\n  i.icon.user.circle.outline:before { content: \"\\f2bd\"; }\n  i.icon.window.close.outline:before { content: \"\\f410\"; }\n  i.icon.window.maximize.outline:before { content: \"\\f2d0\"; }\n  i.icon.window.minimize.outline:before { content: \"\\f2d1\"; }\n  i.icon.window.restore.outline:before { content: \"\\f2d2\"; }\n  i.icon.disk.outline:before { content: \"\\f369\"; }\n\n  /* Outline Aliases */\n  i.icon.heart.empty,\n  i.icon.star.empty {\n    font-family: @outlineFontName;\n  }\n  i.icon.heart.empty:before { content: \"\\f004\"; }\n  i.icon.star.empty:before { content: \"\\f089\"; }\n\n}\n.loadOutlineIcons();\n\n/*******************************\n           Brand Icons\n*******************************/\n\n.loadBrandIcons() when (@importBrandIcons) {\n  /* Load & Define Brand Font */\n  @font-face {\n    font-family: @brandFontName;\n    src: @brandFallbackSRC;\n    src: @brandSrc;\n    font-style: normal;\n    font-weight: @normal;\n    font-variant: normal;\n    text-decoration: inherit;\n    text-transform: none;\n  }\n  /* Brand Icon Font Family */\n  i.icon.\\35 00px,\n  i.icon.accessible.icon,\n  i.icon.accusoft,\n  i.icon.adn,\n  i.icon.adversal,\n  i.icon.affiliatetheme,\n  i.icon.algolia,\n  i.icon.amazon,\n  i.icon.amazon.pay,\n  i.icon.amilia,\n  i.icon.android,\n  i.icon.angellist,\n  i.icon.angrycreative,\n  i.icon.angular,\n  i.icon.app.store,\n  i.icon.app.store.ios,\n  i.icon.apper,\n  i.icon.apple,\n  i.icon.apple.pay,\n  i.icon.asymmetrik,\n  i.icon.audible,\n  i.icon.autoprefixer,\n  i.icon.avianex,\n  i.icon.aviato,\n  i.icon.aws,\n  i.icon.bandcamp,\n  i.icon.behance,\n  i.icon.behance.square,\n  i.icon.bimobject,\n  i.icon.bitbucket,\n  i.icon.bitcoin,\n  i.icon.bity,\n  i.icon.black.tie,\n  i.icon.blackberry,\n  i.icon.blogger,\n  i.icon.blogger.b,\n  i.icon.bluetooth,\n  i.icon.bluetooth.b,\n  i.icon.btc,\n  i.icon.buromobelexperte,\n  i.icon.buysellads,\n  i.icon.cc.amazon.pay,\n  i.icon.cc.amex,\n  i.icon.cc.apple.pay,\n  i.icon.cc.diners.club,\n  i.icon.cc.discover,\n  i.icon.cc.jcb,\n  i.icon.cc.mastercard,\n  i.icon.cc.paypal,\n  i.icon.cc.stripe,\n  i.icon.cc.visa,\n  i.icon.centercode,\n  i.icon.chrome,\n  i.icon.cloudscale,\n  i.icon.cloudsmith,\n  i.icon.cloudversify,\n  i.icon.codepen,\n  i.icon.codiepie,\n  i.icon.connectdevelop,\n  i.icon.contao,\n  i.icon.cpanel,\n  i.icon.creative.commons,\n  i.icon.css3,\n  i.icon.css3.alternate,\n  i.icon.cuttlefish,\n  i.icon.d.and.d,\n  i.icon.dashcube,\n  i.icon.delicious,\n  i.icon.deploydog,\n  i.icon.deskpro,\n  i.icon.deviantart,\n  i.icon.digg,\n  i.icon.digital.ocean,\n  i.icon.discord,\n  i.icon.discourse,\n  i.icon.dochub,\n  i.icon.docker,\n  i.icon.draft2digital,\n  i.icon.dribbble,\n  i.icon.dribbble.square,\n  i.icon.dropbox,\n  i.icon.drupal,\n  i.icon.dyalog,\n  i.icon.earlybirds,\n  i.icon.edge,\n  i.icon.elementor,\n  i.icon.ember,\n  i.icon.empire,\n  i.icon.envira,\n  i.icon.erlang,\n  i.icon.ethereum,\n  i.icon.etsy,\n  i.icon.expeditedssl,\n  i.icon.facebook,\n  i.icon.facebook.f,\n  i.icon.facebook.messenger,\n  i.icon.facebook.square,\n  i.icon.firefox,\n  i.icon.first.order,\n  i.icon.firstdraft,\n  i.icon.flickr,\n  i.icon.flipboard,\n  i.icon.fly,\n  i.icon.font.awesome,\n  i.icon.font.awesome.alternate,\n  i.icon.font.awesome.flag,\n  i.icon.fonticons,\n  i.icon.fonticons.fi,\n  i.icon.fort.awesome,\n  i.icon.fort.awesome.alternate,\n  i.icon.forumbee,\n  i.icon.foursquare,\n  i.icon.free.code.camp,\n  i.icon.freebsd,\n  i.icon.get.pocket,\n  i.icon.gg,\n  i.icon.gg.circle,\n  i.icon.git,\n  i.icon.git.square,\n  i.icon.github,\n  i.icon.github.alternate,\n  i.icon.github.square,\n  i.icon.gitkraken,\n  i.icon.gitlab,\n  i.icon.gitter,\n  i.icon.glide,\n  i.icon.glide.g,\n  i.icon.gofore,\n  i.icon.goodreads,\n  i.icon.goodreads.g,\n  i.icon.google,\n  i.icon.google.drive,\n  i.icon.google.play,\n  i.icon.google.plus,\n  i.icon.google.plus.g,\n  i.icon.google.plus.square,\n  i.icon.google.wallet,\n  i.icon.gratipay,\n  i.icon.grav,\n  i.icon.gripfire,\n  i.icon.grunt,\n  i.icon.gulp,\n  i.icon.hacker.news,\n  i.icon.hacker.news.square,\n  i.icon.hips,\n  i.icon.hire.a.helper,\n  i.icon.hooli,\n  i.icon.hotjar,\n  i.icon.houzz,\n  i.icon.html5,\n  i.icon.hubspot,\n  i.icon.imdb,\n  i.icon.instagram,\n  i.icon.internet.explorer,\n  i.icon.ioxhost,\n  i.icon.itunes,\n  i.icon.itunes.note,\n  i.icon.jenkins,\n  i.icon.joget,\n  i.icon.joomla,\n  i.icon.js,\n  i.icon.js.square,\n  i.icon.jsfiddle,\n  i.icon.keycdn,\n  i.icon.kickstarter,\n  i.icon.kickstarter.k,\n  i.icon.korvue,\n  i.icon.laravel,\n  i.icon.lastfm,\n  i.icon.lastfm.square,\n  i.icon.leanpub,\n  i.icon.less,\n  i.icon.linechat,\n  i.icon.linkedin,\n  i.icon.linkedin.in,\n  i.icon.linode,\n  i.icon.linux,\n  i.icon.lyft,\n  i.icon.magento,\n  i.icon.maxcdn,\n  i.icon.medapps,\n  i.icon.medium,\n  i.icon.medium.m,\n  i.icon.medrt,\n  i.icon.meetup,\n  i.icon.microsoft,\n  i.icon.mix,\n  i.icon.mixcloud,\n  i.icon.mizuni,\n  i.icon.modx,\n  i.icon.monero,\n  i.icon.napster,\n  i.icon.nintendo.switch,\n  i.icon.node,\n  i.icon.node.js,\n  i.icon.npm,\n  i.icon.ns8,\n  i.icon.nutritionix,\n  i.icon.odnoklassniki,\n  i.icon.odnoklassniki.square,\n  i.icon.opencart,\n  i.icon.openid,\n  i.icon.opera,\n  i.icon.optin.monster,\n  i.icon.osi,\n  i.icon.page4,\n  i.icon.pagelines,\n  i.icon.palfed,\n  i.icon.patreon,\n  i.icon.paypal,\n  i.icon.periscope,\n  i.icon.phabricator,\n  i.icon.phoenix.framework,\n  i.icon.php,\n  i.icon.pied.piper,\n  i.icon.pied.piper.alternate,\n  i.icon.pied.piper.pp,\n  i.icon.pinterest,\n  i.icon.pinterest.p,\n  i.icon.pinterest.square,\n  i.icon.playstation,\n  i.icon.product.hunt,\n  i.icon.pushed,\n  i.icon.python,\n  i.icon.qq,\n  i.icon.quinscape,\n  i.icon.quora,\n  i.icon.ravelry,\n  i.icon.react,\n  i.icon.rebel,\n  i.icon.redriver,\n  i.icon.reddit,\n  i.icon.reddit.alien,\n  i.icon.reddit.square,\n  i.icon.rendact,\n  i.icon.renren,\n  i.icon.replyd,\n  i.icon.resolving,\n  i.icon.rocketchat,\n  i.icon.rockrms,\n  i.icon.safari,\n  i.icon.sass,\n  i.icon.schlix,\n  i.icon.scribd,\n  i.icon.searchengin,\n  i.icon.sellcast,\n  i.icon.sellsy,\n  i.icon.servicestack,\n  i.icon.shirtsinbulk,\n  i.icon.simplybuilt,\n  i.icon.sistrix,\n  i.icon.skyatlas,\n  i.icon.skype,\n  i.icon.slack,\n  i.icon.slack.hash,\n  i.icon.slideshare,\n  i.icon.snapchat,\n  i.icon.snapchat.ghost,\n  i.icon.snapchat.square,\n  i.icon.soundcloud,\n  i.icon.speakap,\n  i.icon.spotify,\n  i.icon.stack.exchange,\n  i.icon.stack.overflow,\n  i.icon.staylinked,\n  i.icon.steam,\n  i.icon.steam.square,\n  i.icon.steam.symbol,\n  i.icon.sticker.mule,\n  i.icon.strava,\n  i.icon.stripe,\n  i.icon.stripe.s,\n  i.icon.studiovinari,\n  i.icon.stumbleupon,\n  i.icon.stumbleupon.circle,\n  i.icon.superpowers,\n  i.icon.supple,\n  i.icon.telegram,\n  i.icon.telegram.plane,\n  i.icon.tencent.weibo,\n  i.icon.themeisle,\n  i.icon.trello,\n  i.icon.tripadvisor,\n  i.icon.tumblr,\n  i.icon.tumblr.square,\n  i.icon.twitch,\n  i.icon.twitter,\n  i.icon.twitter.square,\n  i.icon.typo3,\n  i.icon.uber,\n  i.icon.uikit,\n  i.icon.uniregistry,\n  i.icon.untappd,\n  i.icon.usb,\n  i.icon.ussunnah,\n  i.icon.vaadin,\n  i.icon.viacoin,\n  i.icon.viadeo,\n  i.icon.viadeo.square,\n  i.icon.viber,\n  i.icon.vimeo,\n  i.icon.vimeo.square,\n  i.icon.vimeo.v,\n  i.icon.vine,\n  i.icon.vk,\n  i.icon.vnv,\n  i.icon.vuejs,\n  i.icon.weibo,\n  i.icon.weixin,\n  i.icon.whatsapp,\n  i.icon.whatsapp.square,\n  i.icon.whmcs,\n  i.icon.wikipedia.w,\n  i.icon.windows,\n  i.icon.wordpress,\n  i.icon.wordpress.simple,\n  i.icon.wpbeginner,\n  i.icon.wpexplorer,\n  i.icon.wpforms,\n  i.icon.xbox,\n  i.icon.xing,\n  i.icon.xing.square,\n  i.icon.y.combinator,\n  i.icon.yahoo,\n  i.icon.yandex,\n  i.icon.yandex.international,\n  i.icon.yelp,\n  i.icon.yoast,\n  i.icon.youtube,\n  i.icon.youtube.square {\n    font-family: 'brand-icons';\n  }\n  /* Brand Icons Ideally Would Be Defined Here */\n\n}\n.loadBrandIcons();\n"
  },
  {
    "path": "semantic/src/themes/default/elements/icon.variables",
    "content": "/*******************************\n             Icon\n*******************************/\n\n/*--------------\n   Font Files\n---------------*/\n\n@fontName: 'icons';\n@src:\n  url(\"@{fontPath}/@{fontName}.eot?#iefix\") format('embedded-opentype'),\n  url(\"@{fontPath}/@{fontName}.woff2\") format('woff2'),\n  url(\"@{fontPath}/@{fontName}.woff\") format('woff'),\n  url(\"@{fontPath}/@{fontName}.ttf\") format('truetype'),\n  url(\"@{fontPath}/@{fontName}.svg#icons\") format('svg')\n;\n@fallbackSRC: url(\"@{fontPath}/@{fontName}.eot\");\n\n/*--------------\n Optional Files\n---------------*/\n\n/* Outline Icons */\n@importOutlineIcons: true;\n@outlineFontName: 'outline-icons';\n@outlineSrc:\n  url(\"@{fontPath}/@{outlineFontName}.eot?#iefix\") format('embedded-opentype'),\n  url(\"@{fontPath}/@{outlineFontName}.woff2\") format('woff2'),\n  url(\"@{fontPath}/@{outlineFontName}.woff\") format('woff'),\n  url(\"@{fontPath}/@{outlineFontName}.ttf\") format('truetype'),\n  url(\"@{fontPath}/@{outlineFontName}.svg#icons\") format('svg')\n;\n@outlineFallbackSRC: url(\"@{fontPath}/@{outlineFontName}.eot\");\n\n/* Brand Icons */\n@importBrandIcons: true;\n@brandFontName: 'brand-icons';\n@brandSrc:\n  url(\"@{fontPath}/@{brandFontName}.eot?#iefix\") format('embedded-opentype'),\n  url(\"@{fontPath}/@{brandFontName}.woff2\") format('woff2'),\n  url(\"@{fontPath}/@{brandFontName}.woff\") format('woff'),\n  url(\"@{fontPath}/@{brandFontName}.ttf\") format('truetype'),\n  url(\"@{fontPath}/@{brandFontName}.svg#icons\") format('svg')\n;\n@brandFallbackSRC: url(\"@{fontPath}/@{brandFontName}.eot\");\n\n/*--------------\n   Definition\n---------------*/\n\n/* Icon Variables */\n@opacity: 1;\n@width: @iconWidth;\n@height: 1em;\n@distanceFromText: 0.25rem;\n\n\n/* Variations */\n@linkOpacity: 0.8;\n@linkDuration: 0.3s;\n@loadingDuration: 2s;\n\n@circularSize: 2em;\n@circularPadding: 0.5em 0em;\n@circularShadow: 0em 0em 0em 0.1em rgba(0, 0, 0, 0.1) inset;\n\n@borderedSize: 2em;\n@borderedVerticalPadding: ((@borderedSize - @height) / 2);\n@borderedHorizontalPadding: 0em;\n@borderedShadow: 0em 0em 0em 0.1em rgba(0, 0, 0, 0.1) inset;\n\n@cornerIconSize: 0.45em;\n@cornerIconStroke: 1px;\n@cornerIconShadow:\n  -@cornerIconStroke -@cornerIconStroke 0 @white,\n   @cornerIconStroke -@cornerIconStroke 0 @white,\n  -@cornerIconStroke  @cornerIconStroke 0 @white,\n   @cornerIconStroke  @cornerIconStroke 0 @white\n;\n@cornerIconInvertedShadow:\n  -@cornerIconStroke -@cornerIconStroke 0 @black,\n   @cornerIconStroke -@cornerIconStroke 0 @black,\n  -@cornerIconStroke  @cornerIconStroke 0 @black,\n   @cornerIconStroke  @cornerIconStroke 0 @black\n;\n\n@mini: 0.4em;\n@tiny: 0.5em;\n@small: 0.75em;\n@medium: 1em;\n@large: 1.5em;\n@big: 2em;\n@huge: 4em;\n@massive: 8em;\n"
  },
  {
    "path": "semantic/src/themes/default/elements/image.overrides",
    "content": "/*******************************\n         Theme Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/themes/default/elements/image.variables",
    "content": "/*******************************\n            Image\n*******************************/\n\n/*-------------------\n       Element\n--------------------*/\n\n@placeholderColor: transparent;\n@roundedBorderRadius: 0.3125em;\n\n@imageHorizontalMargin: 0.25rem;\n@imageVerticalMargin: 0.5rem;\n@imageBorder: 1px solid rgba(0, 0, 0, 0.1);\n\n/*-------------------\n       Types\n--------------------*/\n\n/* Avatar */\n@avatarSize: 2em;\n@avatarMargin: 0.25em;\n\n\n/*-------------------\n       Variations\n--------------------*/\n\n/* Spaced */\n@spacedDistance: 0.5em;\n\n/* Floated */\n@floatedHorizontalMargin: 1em;\n@floatedVerticalMargin: 1em;\n\n/* Size */\n@miniWidth: 35px;\n@tinyWidth: 80px;\n@smallWidth: 150px;\n@mediumWidth: 300px;\n@largeWidth: 450px;\n@bigWidth: 600px;\n@hugeWidth: 800px;\n@massiveWidth: 960px;\n"
  },
  {
    "path": "semantic/src/themes/default/elements/input.overrides",
    "content": "/*******************************\n         Theme Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/themes/default/elements/input.variables",
    "content": "/*******************************\n            Input\n*******************************/\n\n/*-------------------\n      Element\n--------------------*/\n\n@inputFont: @pageFont;\n@verticalPadding: @inputVerticalPadding;\n@horizontalPadding: @inputHorizontalPadding;\n\n@lineHeight: @inputLineHeight;\n@lineHeightOffset: ((@lineHeight - 1em) / 2);\n\n@padding: (@verticalPadding - @lineHeightOffset) @horizontalPadding;\n\n@textAlign: left;\n@background: @inputBackground;\n@borderWidth: 1px;\n@border: @borderWidth solid @borderColor;\n@boxShadow: none;\n\n@borderRadius: @defaultBorderRadius;\n@transition:\n  box-shadow @defaultDuration @defaultEasing,\n  border-color @defaultDuration @defaultEasing\n;\n\n/*-------------------\n        Types\n--------------------*/\n\n/* Icon Input */\n@iconWidth: (@verticalPadding * 2) + @glyphWidth;\n@iconOpacity: 0.5;\n@iconFocusOpacity: 1;\n@iconOffset: -0.5em;\n\n@iconDistance: 0em;\n@iconMargin: @iconWidth + @iconDistance;\n@iconTransition: opacity 0.3s @defaultEasing;\n\n@transparentIconWidth: @glyphWidth;\n@transparentIconMargin: 2em;\n\n/* Circular Icon Input */\n@circularIconVerticalOffset: 0.35em;\n@circularIconHorizontalOffset: 0.5em;\n\n/* Labeled Input */\n@labelCornerTop: @borderWidth;\n@labelCornerRight: @borderWidth;\n@labelCornerSize: @relative9px;\n@labelSize: 1em;\n@labelVerticalPadding: (@verticalPadding - @lineHeightOffset);\n\n@labeledMargin: 2.5em;\n@labeledIconInputMargin: 3.25em;\n@labeledIconMargin: 1.25em;\n\n/*-------------------\n        States\n--------------------*/\n\n/* Placeholder */\n@placeholderColor: @inputPlaceholderColor;\n@placeholderFocusColor: @inputPlaceholderFocusColor;\n\n/* Down */\n@downBorderColor: rgba(0, 0, 0, 0.3);\n@downBackground: #FAFAFA;\n@downColor: @textColor;\n@downBoxShadow: none;\n\n/* Focus */\n@focusBorderColor: @focusedFormBorderColor;\n@focusBackground: @background;\n@focusColor: @hoveredTextColor;\n@focusBoxShadow: none;\n\n/* Error */\n@errorBackground: @negativeBackgroundColor;\n@errorColor: @negativeTextColor;\n@errorBorder: @negativeBorderColor;\n@errorBoxShadow: none;\n\n@placeholderErrorColor: lighten(@errorColor, 40);\n@placeholderErrorFocusColor: lighten(@errorColor, 30);\n\n/* Loader */\n@invertedLoaderFillColor: rgba(0, 0, 0, 0.15);\n\n/*-------------------\n      Variations\n--------------------*/\n\n/* Inverted */\n@transparentInvertedPlaceholderColor: @invertedUnselectedTextColor;\n@transparentInvertedColor: @white;\n\n"
  },
  {
    "path": "semantic/src/themes/default/elements/label.overrides",
    "content": "/*******************************\n         Theme Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/themes/default/elements/label.variables",
    "content": "/*******************************\n             Label\n*******************************/\n\n/*-------------------\n       Element\n--------------------*/\n\n@verticalAlign: baseline;\n@verticalMargin: 0em;\n@horizontalMargin: @relative2px;\n@backgroundColor: #E8E8E8;\n@color: @mutedTextColor;\n@backgroundImage: none;\n@verticalPadding: 0.5833em; /* medium is not @emSize custom value required */\n@horizontalPadding: 0.833em;\n@borderRadius: @absoluteBorderRadius;\n@textTransform: none;\n@fontWeight: @bold;\n@borderWidth: 1px;\n@border: 0px solid transparent;\n\n@lineHeightOffset: -(@verticalPadding / 2);\n\n@labelTransitionDuration: @defaultDuration;\n@labelTransitionEasing: @defaultEasing;\n@transition: background @labelTransitionDuration @labelTransitionEasing;\n\n/* Group */\n@groupVerticalMargin: 0.5em;\n@groupHorizontalMargin: 0.5em;\n\n/*-------------------\n        Parts\n--------------------*/\n\n/* Link */\n@linkOpacity: 0.5;\n@linkTransition: @labelTransitionDuration opacity @labelTransitionEasing;\n\n/* Icon */\n@iconDistance: 0.75em;\n\n/* Image */\n@imageHeight: (1em + @verticalPadding * 2);\n\n/* Detail */\n@detailFontWeight: @bold;\n@detailOpacity: 0.8;\n@detailIconDistance: 0.25em;\n@detailMargin: 1em;\n\n/* Delete */\n@deleteOpacity: @linkOpacity;\n@deleteSize: @relativeSmall;\n@deleteMargin: 0.5em;\n@deleteTransition: background @labelTransitionDuration @labelTransitionEasing;\n\n/*-------------------\n        Types\n--------------------*/\n\n/* Image Label */\n@imageLabelBackground: @backgroundColor;\n@imageLabelVerticalPadding: @verticalPadding;\n@imageLabelHorizontalPadding: @horizontalPadding;\n@imageLabelTextDistance: 0.5em;\n@imageLabelDetailDistance: @imageLabelTextDistance;\n@imageLabelBorderRadius: @borderRadius;\n@imageLabelBoxShadow: none;\n@imageLabelPadding: @imageLabelVerticalPadding @imageLabelHorizontalPadding @imageLabelVerticalPadding @imageLabelTextDistance;\n\n@imageLabelImageMargin: -@verticalPadding @imageLabelTextDistance -@verticalPadding -@imageLabelTextDistance;\n@imageLabelImageBorderRadius: @imageLabelBorderRadius 0em 0em @imageLabelBorderRadius;\n@imageLabelImageHeight: @imageHeight;\n\n@imageLabelDetailBackground: @strongTransparentBlack;\n@imageLabelDetailPadding: @imageLabelVerticalPadding @imageLabelHorizontalPadding;\n@imageLabelDetailMargin: -@imageLabelVerticalPadding -@imageLabelHorizontalPadding -@imageLabelVerticalPadding @imageLabelDetailDistance;\n\n/*-------------------\n        States\n--------------------*/\n\n/* Hover */\n@labelHoverBackgroundColor: #E0E0E0;\n@labelHoverBackgroundImage: none;\n@labelHoverTextColor: @hoveredTextColor;\n\n/* Active */\n@labelActiveBackgroundColor: #D0D0D0;\n@labelActiveBackgroundImage: none;\n@labelActiveTextColor: @selectedTextColor;\n\n/* Active Hover */\n@labelActiveHoverBackgroundColor: #C8C8C8;\n@labelActiveHoverBackgroundImage: none;\n@labelActiveHoverTextColor: @selectedTextColor;\n\n\n/*-------------------\n      Variations\n--------------------*/\n\n/* Basic */\n@basicBackground: none @white;\n@basicBorderWidth: 1px;\n@basicBorder: @basicBorderWidth solid @borderColor;\n@basicColor: @textColor;\n@basicBoxShadow: none;\n\n@basicHoverBackground: @basicBackground;\n@basicHoverColor: @linkHoverColor;\n@basicHoverBorder: @basicBorder;\n@basicHoverBoxShadow: @basicBoxShadow;\n\n/* Tag */\n@tagCircleColor: @white;\n@tagCircleSize: 0.5em;\n@tagHorizontalPadding: 1.5em;\n@tagCircleBoxShadow: 0 -1px 1px 0 rgba(0, 0, 0, 0.3);\n@tagTriangleRightOffset: 100%;\n@tagTriangleTopOffset: 50%;\n@tagTriangleSize: 1.56em;\n@tagTriangleBackgroundImage: none;\n@tagTransition: none; /* Avoids error with background: inherit; on animation */\n\n/* Ribbon */\n@ribbonTriangleSize: 1.2em;\n@ribbonShadowColor: rgba(0, 0, 0, 0.15);\n\n@ribbonMargin: 1rem;\n@ribbonOffset: ~\"calc(\"-@ribbonMargin~\" - \"@ribbonTriangleSize~\")\";\n@ribbonDistance: ~\"calc(\"@ribbonMargin~\" + \"@ribbonTriangleSize~\")\";\n@rightRibbonOffset:  ~\"calc(100% + \"@ribbonMargin~\" + \"@ribbonTriangleSize~\")\";\n\n@ribbonImageTopDistance: 1rem;\n@ribbonImageMargin: -0.05rem; /* Rounding Offset on Triangle */\n@ribbonImageOffset: ~\"calc(\"-@ribbonImageMargin~\" - \"@ribbonTriangleSize~\")\";\n@rightRibbonImageOffset:  ~\"calc(100% + \"@ribbonImageMargin~\" + \"@ribbonTriangleSize~\")\";\n\n@ribbonTableMargin: @relativeMini; /* Rounding Offset on Triangle */\n@ribbonTableOffset: ~\"calc(\"-@ribbonTableMargin~\" - \"@ribbonTriangleSize~\")\";\n@rightRibbonTableOffset:  ~\"calc(100% + \"@ribbonTableMargin~\" + \"@ribbonTriangleSize~\")\";\n\n\n/* Colors */\n@redTextColor: @white;\n@orangeTextColor: @white;\n@yellowTextColor: @white;\n@oliveTextColor: @white;\n@greenTextColor: @white;\n@tealTextColor: @white;\n@blueTextColor: @white;\n@violetTextColor: @white;\n@purpleTextColor: @white;\n@pinkTextColor: @white;\n@brownTextColor: @white;\n@greyTextColor: @white;\n@blackTextColor: @white;\n\n@redHoverTextColor: @white;\n@orangeHoverTextColor: @white;\n@yellowHoverTextColor: @white;\n@oliveHoverTextColor: @white;\n@greenHoverTextColor: @white;\n@tealHoverTextColor: @white;\n@blueHoverTextColor: @white;\n@violetHoverTextColor: @white;\n@purpleHoverTextColor: @white;\n@pinkHoverTextColor: @white;\n@brownHoverTextColor: @white;\n@greyHoverTextColor: @white;\n@blackHoverTextColor: @white;\n\n@redRibbonShadow: darken(@red, 10);\n@orangeRibbonShadow: darken(@orange, 10);\n@yellowRibbonShadow: darken(@yellow, 10);\n@oliveRibbonShadow: darken(@olive, 10);\n@greenRibbonShadow: darken(@green, 10);\n@tealRibbonShadow: darken(@teal, 10);\n@blueRibbonShadow: darken(@blue, 10);\n@violetRibbonShadow: darken(@violet, 10);\n@purpleRibbonShadow: darken(@purple, 10);\n@pinkRibbonShadow: darken(@pink, 10);\n@brownRibbonShadow: darken(@brown, 10);\n@greyRibbonShadow: darken(@grey, 10);\n@blackRibbonShadow: darken(@black, 10);\n\n/* Attached */\n@attachedSegmentPadding: 2rem;\n@attachedVerticalPadding: 0.75em;\n@attachedHorizontalPadding: 1em;\n\n@attachedCornerBorderRadius: @3px;\n@attachedBorderRadius: @borderRadius;\n\n/* Corner */\n@cornerSizeRatio: 1;\n@cornerTransition: color @labelTransitionDuration @labelTransitionEasing;\n@cornerTriangleSize: 4em;\n@cornerTriangleTransition: border-color @labelTransitionDuration @labelTransitionEasing;\n@cornerTriangleZIndex: 1;\n\n@cornerIconSize: @relativeLarge;\n@cornerIconTopOffset: @relative9px;\n@cornerIconLeftOffset: @relative11px;\n\n/* Corner Text */\n@cornerTextWidth: 3em;\n@cornerTextWeight: @bold;\n@cornerTextSize: 1em;\n\n/* Horizontal */\n@horizontalLabelMinWidth: 3em;\n@horizontalLabelMargin: 0.5em;\n@horizontalLabelVerticalPadding: 0.4em;\n\n/* Circular Padding */\n@circularPadding: 0.5em;\n@circularMinSize: 2em;\n@emptyCircleSize: 0.5em;\n\n/* Pointing */\n@pointingBorderColor: inherit;\n@pointingBorderWidth: @borderWidth;\n@pointingVerticalDistance: 1em;\n@pointingTriangleSize: 0.6666em;\n@pointingHorizontalDistance: @pointingTriangleSize;\n\n@pointingTriangleTransition: background @labelTransitionDuration @labelTransitionEasing;\n@pointingTriangleZIndex: 2;\n\n/* Basic Pointing */\n@basicPointingTriangleOffset: -@pointingBorderWidth;\n\n/* Floating */\n@floatingTopOffset: -1em;\n@floatingLeftOffset: -1.5em;\n@floatingZIndex: 100;\n\n/*-------------------\n        Group\n--------------------*/\n\n/* Sizing */\n@mini    : @9px;\n@tiny    : @10px;\n@small   : @11px;\n@medium  : @12px;\n@large   : @absoluteMedium;\n@big     : @absoluteBig;\n@huge    : @absoluteHuge;\n@massive : @absoluteMassive;\n"
  },
  {
    "path": "semantic/src/themes/default/elements/list.overrides",
    "content": "/*******************************\n         Theme Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/themes/default/elements/list.variables",
    "content": "/*******************************\n             List\n*******************************/\n\n/*-------------------\n         View\n--------------------*/\n\n/* List */\n@listStyleType: none;\n@listStylePosition: outside;\n@margin: 1em 0em;\n@verticalPadding: 0em;\n@horizontalPadding: 0em;\n\n/* List Item */\n@itemVerticalPadding: @relative3px;\n@itemHorizontalPadding: 0em;\n@itemPadding: @itemVerticalPadding @itemHorizontalPadding;\n@itemLineHeight: @relativeLarge;\n\n/* Sub List */\n@childListPadding: 0.75em 0em 0.25em 0.5em;\n@childListIndent: 1em;\n\n/* Sub List Item */\n@childItemVerticalPadding: @relative2px;\n@childItemHorizontalPadding: 0em;\n@childItemPadding: @childItemVerticalPadding @childItemHorizontalPadding;\n@childItemLineHeight: inherit;\n\n/*-------------------\n      Elements\n--------------------*/\n\n/* Icon */\n@iconDistance: @relative4px;\n@iconOffset: 0em;\n@iconTransition: color @defaultDuration @defaultEasing;\n@iconVerticalAlign: top;\n@iconContentVerticalAlign: top;\n\n/* Image */\n@imageDistance: 0.5em;\n@imageAlign: top;\n\n/* Content */\n@contentDistance: 0.5em;\n@contentLineHeight: @itemLineHeight;\n@contentLineHeightOffset: (@contentLineHeight - 1em) / 2;\n@contentVerticalAlign: top;\n\n/* Header */\n@itemHeaderFontFamily: @headerFont;\n@itemHeaderFontWeight: @bold;\n@itemHeaderColor: @textColor;\n\n/* Description */\n@itemDescriptionColor: rgba(0, 0, 0, 0.7);\n\n/* Link */\n@itemLinkColor: @linkColor;\n@itemLinkHoverColor: @linkHoverColor;\n\n/* Header Link */\n@itemHeaderLinkColor: @itemLinkColor;\n@itemHeaderLinkHoverColor: @itemLinkHoverColor;\n\n/* Linked Icon */\n@itemLinkIconColor: @lightTextColor;\n@itemLinkIconHoverColor: @textColor;\n@invertedIconLinkColor: @invertedLightTextColor;\n\n/*-------------------\n        States\n--------------------*/\n\n@disabledColor: @disabledTextColor;\n@invertedDisabledColor: @invertedDisabledTextColor;\n\n/*-------------------\n      Variations\n--------------------*/\n\n/* Float */\n@floatDistance: 1em;\n@leftFloatMargin: 0em @floatDistance 0em 0em;\n@rightFloatMargin: 0em 0em 0em @floatDistance;\n\n/* Horizontal */\n@horizontalSpacing: 1em;\n@horizontalIconDistance: 0.25em;\n@horizontalVerticalAlign: middle;\n\n/* Inverted */\n@invertedListIconColor: @invertedLightTextColor;\n@invertedHeaderColor: @invertedTextColor;\n@invertedDescriptionColor: @invertedLightTextColor;\n@invertedItemLinkColor: @invertedTextColor;\n@invertedItemLinkHoverColor: @linkHoverColor;\n\n/* Link List */\n@linkListItemColor: @unselectedTextColor;\n@linkListItemHoverColor: @hoveredTextColor;\n@linkListItemDownColor: @pressedTextColor;\n@linkListItemActiveColor: @selectedTextColor;\n@linkListTransition:\n  @defaultDuration color @defaultEasing\n;\n\n/* Inverted Link List */\n@invertedLinkListItemColor: @invertedUnselectedTextColor;\n@invertedLinkListItemHoverColor: @invertedHoveredTextColor;\n@invertedLinkListItemDownColor: @invertedPressedTextColor;\n@invertedLinkListItemActiveColor: @invertedSelectedTextColor;\n\n/* Selection List */\n@selectionListItemMargin: 0em;\n@selectionListItemBorderRadius: 0.5em;\n@selectionListItemVerticalPadding: 0.5em;\n@selectionListItemHorizontalPadding: 0.5em;\n@selectionListTransition:\n  @defaultDuration color @defaultEasing,\n  @defaultDuration padding-left @defaultEasing,\n  @defaultDuration background-color @defaultEasing\n;\n\n/* Selection List States */\n@selectionListBackground: transparent;\n@selectionListColor: @unselectedTextColor;\n@selectionListHoverBackground: @subtleTransparentBlack;\n@selectionListHoverColor: @hoveredTextColor;\n@selectionListDownBackground: @transparentBlack;\n@selectionListDownColor: @pressedTextColor;\n@selectionListActiveBackground: @transparentBlack;\n@selectionListActiveColor: @selectedTextColor;\n\n/* Inverted Selection List */\n@invertedSelectionListBackground: transparent;\n@invertedSelectionListColor: @invertedUnselectedTextColor;\n@invertedSelectionListHoverBackground: @subtleTransparentWhite;\n@invertedSelectionListHoverColor: @invertedHoveredTextColor;\n@invertedSelectionListDownBackground: @transparentWhite;\n@invertedSelectionListDownColor: @invertedPressedTextColor;\n@invertedSelectionListActiveBackground: @transparentWhite;\n@invertedSelectionListActiveColor: @invertedSelectedTextColor;\n\n/* Animated List */\n@animatedDuration: 0.25s;\n@animatedDelay: 0.1s;\n@animatedListTransition:\n  @animatedDuration color @defaultEasing @animatedDelay,\n  @animatedDuration padding-left @defaultEasing @animatedDelay,\n  @animatedDuration background-color @defaultEasing @animatedDelay\n;\n@animatedListIndent: 1em;\n\n/* Bulleted */\n@bulletDistance: 1.25rem;\n@bulletOffset: -@bulletDistance;\n\n@bulletOpacity: 1;\n@bulletCharacter: '•';\n@bulletColor: inherit;\n@bulletLinkColor: @textColor;\n@bulletVerticalAlign: top;\n@bulletChildDistance: @bulletDistance;\n\n/* Horizontal Bullets */\n@horizontalBulletColor: @textColor;\n@horizontalBulletSpacing: @bulletDistance + 0.5em;\n\n/* Ordered List */\n@orderedCountName: ordered;\n@orderedCountContent: counters(ordered, \".\") \" \";\n@orderedCountColor: @textColor;\n@orderedCountDistance: 1.25rem;\n@orderedCountOpacity: 0.8;\n@orderedCountTextAlign: right;\n@orderedCountVerticalAlign: middle;\n\n@orderedChildCountDistance: 1em;\n@orderedChildCountOffset: -2em;\n\n@orderedInvertedCountColor: @invertedLightTextColor;\n\n/* Horizontal Ordered */\n@horizontalOrderedCountDistance: 0.5em;\n\n/* Divided */\n@dividedBorderWidth: 1px;\n@dividedBorder: @dividedBorderWidth solid @borderColor;\n@dividedInvertedBorderColor: @whiteBorderColor;\n@dividedChildListBorder: none;\n@dividedChildItemBorder: none;\n\n/* Divided Horizontal */\n@horizontalDividedSpacing: (@horizontalSpacing / 2);\n@horizontalDividedLineHeight: 0.6;\n\n/* Divided */\n@celledBorderWidth: 1px;\n@celledBorder: @celledBorderWidth solid @borderColor;\n@celledInvertedBorder: @dividedBorderWidth solid @whiteBorderColor;\n@celledHorizontalPadding: 0.5em;\n@celledChildListBorder: none;\n@celledChildItemBorder: none;\n\n/* Divided Horizontal */\n@horizontalCelledSpacing: (@horizontalSpacing / 2);\n@horizontalCelledLineHeight: 0.6;\n\n/* Relaxed */\n@relaxedItemVerticalPadding: @relative6px;\n@relaxedChildItemVerticalPadding: @relative3px;\n@relaxedHeaderMargin: 0.25rem;\n@relaxedHorizontalPadding: 1rem;\n\n/* Very Relaxed */\n@veryRelaxedItemVerticalPadding: @relative12px;\n@veryRelaxedChildItemVerticalPadding: @relative4px;\n@veryRelaxedHeaderMargin: 0.5rem;\n@veryRelaxedHorizontalPadding: 1.5rem;\n\n"
  },
  {
    "path": "semantic/src/themes/default/elements/loader.overrides",
    "content": "/*******************************\n         Theme Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/themes/default/elements/loader.variables",
    "content": "/*******************************\n             Loader\n*******************************/\n\n/* Some global loader styles defined in site.variables */\n// @loaderSpeed\n// @loaderLineWidth\n// @loaderFillColor\n// @loaderLineColor\n// @invertedLoaderFillColor\n// @invertedLoaderLineColor\n\n/*-------------------\n      Standard\n--------------------*/\n\n@loaderTopOffset: 50%;\n@loaderLeftOffset: 50%;\n\n@shapeBorderColor: @loaderLineColor transparent transparent;\n@invertedShapeBorderColor: @invertedLoaderLineColor transparent transparent;\n\n/*-------------------\n        Types\n--------------------*/\n\n/* Text */\n@textDistance: @relativeMini;\n@loaderTextColor: @textColor;\n@invertedLoaderTextColor: @invertedTextColor;\n\n/*-------------------\n        States\n--------------------*/\n\n@indeterminateDirection: reverse;\n@indeterminateSpeed: (2 * @loaderSpeed);\n\n/*-------------------\n      Variations\n--------------------*/\n\n@inlineVerticalAlign: middle;\n@inlineMargin: 0em;\n\n/* Exact Sizes (Avoids Rounding Errors) */\n@mini    : @14px;\n@tiny    : @16px;\n@small   : @24px;\n@medium  : @32px;\n@large   : @48px;\n@big     : @52px;\n@huge    : @58px;\n@massive : @64px;\n\n@miniOffset: 0em 0em 0em -(@mini / 2);\n@tinyOffset: 0em 0em 0em -(@tiny / 2);\n@smallOffset: 0em 0em 0em -(@small / 2);\n@mediumOffset: 0em 0em 0em -(@medium / 2);\n@largeOffset: 0em 0em 0em -(@large / 2);\n@bigOffset: 0em 0em 0em -(@big / 2);\n@hugeOffset: 0em 0em 0em -(@huge / 2);\n@massiveOffset: 0em 0em 0em -(@massive / 2);\n\n@tinyFontSize: @relativeTiny;\n@miniFontSize: @relativeMini;\n@smallFontSize: @relativeSmall;\n@mediumFontSize: @relativeMedium;\n@largeFontSize: @relativeLarge;\n@bigFontSize: @relativeBig;\n@hugeFontSize: @relativeHuge;\n@massiveFontSize: @relativeMassive;\n"
  },
  {
    "path": "semantic/src/themes/default/elements/rail.overrides",
    "content": "/*******************************\n         Theme Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/themes/default/elements/rail.variables",
    "content": "/*******************************\n            Rail\n*******************************/\n\n/*-------------------\n       Element\n--------------------*/\n\n@width: 300px;\n@height: 100%;\n\n@distance: 4rem;\n@splitDistance: (@distance / 2);\n\n/*-------------------\n      Variations\n--------------------*/\n\n/* Close */\n@closeDistance: 2em;\n@veryCloseDistance: 1em;\n\n@splitCloseDistance: (@closeDistance / 2);\n@splitVeryCloseDistance: (@veryCloseDistance / 2);\n\n@closeWidth: ~\"calc(\"@width~\" + \"@splitCloseDistance~\")\";\n@veryCloseWidth: ~\"calc(\"@width~\" + \"@splitVeryCloseDistance~\")\";\n\n/* Dividing */\n@dividingBorder: 1px solid @borderColor;\n@dividingDistance: 5rem;\n@splitDividingDistance: (@dividingDistance / 2);\n@dividingWidth: @width + @splitDividingDistance;\n\n"
  },
  {
    "path": "semantic/src/themes/default/elements/reveal.overrides",
    "content": "/*******************************\n         Theme Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/themes/default/elements/reveal.variables",
    "content": "/*******************************\n            Reveal\n*******************************/\n\n@transitionDelay: 0.1s;\n@transitionDuration: 0.5s;\n@transitionEasing: cubic-bezier(0.175, 0.885, 0.320, 1);\n@transition: all @transitionDuration @defaultEasing @transitionDelay;\n\n@bottomZIndex: 2;\n@topZIndex: 3;\n@activeZIndex: 4;\n@overlayZIndex: 5;\n\n/* Types */\n@rotateDegrees: 110deg;\n@moveTransition: transform @transitionDuration @transitionEasing @transitionDelay;\n@slideTransition: transform @transitionDuration @defaultEasing @transitionDelay;\n"
  },
  {
    "path": "semantic/src/themes/default/elements/segment.overrides",
    "content": "/*******************************\n         Theme Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/themes/default/elements/segment.variables",
    "content": "/*******************************\n            Segment\n*******************************/\n\n/*-------------------\n       Element\n--------------------*/\n\n@background: @white;\n@borderWidth: 1px;\n@border: @borderWidth solid @borderColor;\n\n@boxShadow: @subtleShadow;\n@verticalPadding: 1em;\n@horizontalPadding: 1em;\n@padding: @verticalPadding @horizontalPadding;\n\n@verticalMargin: 1rem;\n@horizontalMargin: 0em;\n@margin: @verticalMargin @horizontalMargin;\n@borderRadius: @defaultBorderRadius;\n\n/*-------------------\n       Group\n--------------------*/\n\n@groupedMargin: @margin;\n@groupedBorder: @border;\n@groupedBoxShadow: @boxShadow;\n@groupedBorderRadius: @borderRadius;\n\n@nestedGroupMargin: @verticalMargin @verticalMargin;\n\n@groupedSegmentBorder: none;\n@groupedSegmentDivider: @border;\n@groupedSegmentMargin: 0em;\n@groupedSegmentWidth: auto;\n@groupedSegmentBoxShadow: none;\n\n/*-------------------\n       Coupling\n--------------------*/\n\n/* Page Grid Segment */\n@pageGridMargin: (2 * @verticalPadding);\n\n/*******************************\n            States\n*******************************/\n\n/* Loading Dimmer */\n@loaderDimmerColor: rgba(255, 255, 255, 0.8);\n@loaderDimmerZIndex: 100;\n\n/* Loading Spinner */\n@loaderSize: 3em;\n@loaderLineZIndex: 101;\n\n\n/*******************************\n            Variations\n*******************************/\n\n/* Piled */\n@piledZIndex: auto;\n@piledMargin: 3em;\n@piledBoxShadow: '';\n@piledDegrees: 1.2deg;\n@piledBorder: @border;\n\n/* Circular */\n@circularPadding: 2em;\n\n/* Stacked */\n@stackedHeight: 6px;\n@stackedPageBackground: @subtleTransparentBlack;\n@stackedPadding: @verticalPadding + (0.4em);\n@tallStackedPadding: @verticalPadding + (0.8em);\n\n/* Raised */\n@raisedBoxShadow: @floatingShadow;\n\n/* Padded */\n@paddedSegmentPadding: 1.5em;\n@veryPaddedSegmentPadding: 3em;\n\n/* Attached */\n@attachedTopOffset: 0px;\n@attachedBottomOffset: 0px;\n@attachedHorizontalOffset: -@borderWidth;\n@attachedWidth: ~\"calc(100% + \"-@attachedHorizontalOffset * 2~\")\";\n@attachedBoxShadow: none;\n@attachedBorder: @borderWidth solid @solidBorderColor;\n@attachedBottomBoxShadow:\n  @boxShadow,\n  @attachedBoxShadow\n;\n\n/* Inverted */\n@invertedBackground: @black;\n\n/* Floated */\n@floatedDistance: 1em;\n\n/* Basic */\n@basicBackground: none transparent;\n@basicBorder: none;\n@basicBoxShadow: none;\n@basicBorderRadius: 0px;\n\n/* Colors */\n@coloredBorderSize: 2px;\n\n/* Ordinality */\n@secondaryBackground: @darkWhite;\n@secondaryColor: @mutedTextColor;\n\n@tertiaryBackground:  @midWhite;\n@tertiaryColor: @mutedTextColor;\n\n@secondaryInvertedLightness: 0.2;\n@secondaryInvertedBackground:\n  lighten(@black, (@secondaryInvertedLightness * 100))\n  linear-gradient(\n    rgba(255, 255, 255, @secondaryInvertedLightness) 0%,\n    rgba(255, 255, 255, @secondaryInvertedLightness) 100%\n  )\n;\n@secondaryInvertedColor: @invertedMutedTextColor;\n\n@tertiaryInvertedLightness: 0.35;\n@tertiaryInvertedBackground:\n  lighten(@black, (@tertiaryInvertedLightness * 100))\n  linear-gradient(\n    rgba(255, 255, 255, @tertiaryInvertedLightness) 0%,\n    rgba(255, 255, 255, @tertiaryInvertedLightness) 100%\n  )\n;\n@tertiaryInvertedColor: @invertedMutedTextColor;\n"
  },
  {
    "path": "semantic/src/themes/default/elements/step.overrides",
    "content": "/*******************************\n         Theme Overrides\n*******************************/\n\n@font-face {\n  font-family: 'Step';\n  src:\n    url(data:application/x-font-ttf;charset=utf-8;;base64,AAEAAAAOAIAAAwBgT1MvMj3hSQEAAADsAAAAVmNtYXDQEhm3AAABRAAAAUpjdnQgBkn/lAAABuwAAAAcZnBnbYoKeDsAAAcIAAAJkWdhc3AAAAAQAAAG5AAAAAhnbHlm32cEdgAAApAAAAC2aGVhZAErPHsAAANIAAAANmhoZWEHUwNNAAADgAAAACRobXR4CykAAAAAA6QAAAAMbG9jYQA4AFsAAAOwAAAACG1heHAApgm8AAADuAAAACBuYW1lzJ0aHAAAA9gAAALNcG9zdK69QJgAAAaoAAAAO3ByZXCSoZr/AAAQnAAAAFYAAQO4AZAABQAIAnoCvAAAAIwCegK8AAAB4AAxAQIAAAIABQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUGZFZABA6ADoAQNS/2oAWgMLAE8AAAABAAAAAAAAAAAAAwAAAAMAAAAcAAEAAAAAAEQAAwABAAAAHAAEACgAAAAGAAQAAQACAADoAf//AAAAAOgA//8AABgBAAEAAAAAAAAAAAEGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAADpAKYABUAHEAZDwEAAQFCAAIBAmoAAQABagAAAGEUFxQDEisBFAcBBiInASY0PwE2Mh8BATYyHwEWA6QP/iAQLBD+6g8PTBAsEKQBbhAsEEwPAhYWEP4gDw8BFhAsEEwQEKUBbxAQTBAAAAH//f+xA18DCwAMABJADwABAQpDAAAACwBEFRMCESsBFA4BIi4CPgEyHgEDWXLG6MhuBnq89Lp+AV51xHR0xOrEdHTEAAAAAAEAAAABAADDeRpdXw889QALA+gAAAAAzzWYjQAAAADPNWBN//3/sQOkAwsAAAAIAAIAAAAAAAAAAQAAA1L/agBaA+gAAP/3A6QAAQAAAAAAAAAAAAAAAAAAAAMD6AAAA+gAAANZAAAAAAAAADgAWwABAAAAAwAWAAEAAAAAAAIABgATAG4AAAAtCZEAAAAAAAAAEgDeAAEAAAAAAAAANQAAAAEAAAAAAAEACAA1AAEAAAAAAAIABwA9AAEAAAAAAAMACABEAAEAAAAAAAQACABMAAEAAAAAAAUACwBUAAEAAAAAAAYACABfAAEAAAAAAAoAKwBnAAEAAAAAAAsAEwCSAAMAAQQJAAAAagClAAMAAQQJAAEAEAEPAAMAAQQJAAIADgEfAAMAAQQJAAMAEAEtAAMAAQQJAAQAEAE9AAMAAQQJAAUAFgFNAAMAAQQJAAYAEAFjAAMAAQQJAAoAVgFzAAMAAQQJAAsAJgHJQ29weXJpZ2h0IChDKSAyMDE0IGJ5IG9yaWdpbmFsIGF1dGhvcnMgQCBmb250ZWxsby5jb21mb250ZWxsb1JlZ3VsYXJmb250ZWxsb2ZvbnRlbGxvVmVyc2lvbiAxLjBmb250ZWxsb0dlbmVyYXRlZCBieSBzdmcydHRmIGZyb20gRm9udGVsbG8gcHJvamVjdC5odHRwOi8vZm9udGVsbG8uY29tAEMAbwBwAHkAcgBpAGcAaAB0ACAAKABDACkAIAAyADAAMQA0ACAAYgB5ACAAbwByAGkAZwBpAG4AYQBsACAAYQB1AHQAaABvAHIAcwAgAEAAIABmAG8AbgB0AGUAbABsAG8ALgBjAG8AbQBmAG8AbgB0AGUAbABsAG8AUgBlAGcAdQBsAGEAcgBmAG8AbgB0AGUAbABsAG8AZgBvAG4AdABlAGwAbABvAFYAZQByAHMAaQBvAG4AIAAxAC4AMABmAG8AbgB0AGUAbABsAG8ARwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABzAHYAZwAyAHQAdABmACAAZgByAG8AbQAgAEYAbwBuAHQAZQBsAGwAbwAgAHAAcgBvAGoAZQBjAHQALgBoAHQAdABwADoALwAvAGYAbwBuAHQAZQBsAGwAbwAuAGMAbwBtAAAAAAIAAAAAAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAQIBAwljaGVja21hcmsGY2lyY2xlAAAAAAEAAf//AA8AAAAAAAAAAAAAAAAAAAAAADIAMgML/7EDC/+xsAAssCBgZi2wASwgZCCwwFCwBCZasARFW1ghIyEbilggsFBQWCGwQFkbILA4UFghsDhZWSCwCkVhZLAoUFghsApFILAwUFghsDBZGyCwwFBYIGYgiophILAKUFhgGyCwIFBYIbAKYBsgsDZQWCGwNmAbYFlZWRuwACtZWSOwAFBYZVlZLbACLCBFILAEJWFkILAFQ1BYsAUjQrAGI0IbISFZsAFgLbADLCMhIyEgZLEFYkIgsAYjQrIKAAIqISCwBkMgiiCKsAArsTAFJYpRWGBQG2FSWVgjWSEgsEBTWLAAKxshsEBZI7AAUFhlWS2wBCywB0MrsgACAENgQi2wBSywByNCIyCwACNCYbCAYrABYLAEKi2wBiwgIEUgsAJFY7ABRWJgRLABYC2wBywgIEUgsAArI7ECBCVgIEWKI2EgZCCwIFBYIbAAG7AwUFiwIBuwQFlZI7AAUFhlWbADJSNhRESwAWAtsAgssQUFRbABYUQtsAkssAFgICCwCUNKsABQWCCwCSNCWbAKQ0qwAFJYILAKI0JZLbAKLCC4BABiILgEAGOKI2GwC0NgIIpgILALI0IjLbALLEtUWLEHAURZJLANZSN4LbAMLEtRWEtTWLEHAURZGyFZJLATZSN4LbANLLEADENVWLEMDEOwAWFCsAorWbAAQ7ACJUKxCQIlQrEKAiVCsAEWIyCwAyVQWLEBAENgsAQlQoqKIIojYbAJKiEjsAFhIIojYbAJKiEbsQEAQ2CwAiVCsAIlYbAJKiFZsAlDR7AKQ0dgsIBiILACRWOwAUViYLEAABMjRLABQ7AAPrIBAQFDYEItsA4ssQAFRVRYALAMI0IgYLABYbUNDQEACwBCQopgsQ0FK7BtKxsiWS2wDyyxAA4rLbAQLLEBDistsBEssQIOKy2wEiyxAw4rLbATLLEEDistsBQssQUOKy2wFSyxBg4rLbAWLLEHDistsBcssQgOKy2wGCyxCQ4rLbAZLLAIK7EABUVUWACwDCNCIGCwAWG1DQ0BAAsAQkKKYLENBSuwbSsbIlktsBossQAZKy2wGyyxARkrLbAcLLECGSstsB0ssQMZKy2wHiyxBBkrLbAfLLEFGSstsCAssQYZKy2wISyxBxkrLbAiLLEIGSstsCMssQkZKy2wJCwgPLABYC2wJSwgYLANYCBDI7ABYEOwAiVhsAFgsCQqIS2wJiywJSuwJSotsCcsICBHICCwAkVjsAFFYmAjYTgjIIpVWCBHICCwAkVjsAFFYmAjYTgbIVktsCgssQAFRVRYALABFrAnKrABFTAbIlktsCkssAgrsQAFRVRYALABFrAnKrABFTAbIlktsCosIDWwAWAtsCssALADRWOwAUVisAArsAJFY7ABRWKwACuwABa0AAAAAABEPiM4sSoBFSotsCwsIDwgRyCwAkVjsAFFYmCwAENhOC2wLSwuFzwtsC4sIDwgRyCwAkVjsAFFYmCwAENhsAFDYzgtsC8ssQIAFiUgLiBHsAAjQrACJUmKikcjRyNhIFhiGyFZsAEjQrIuAQEVFCotsDAssAAWsAQlsAQlRyNHI2GwBkUrZYouIyAgPIo4LbAxLLAAFrAEJbAEJSAuRyNHI2EgsAQjQrAGRSsgsGBQWCCwQFFYswIgAyAbswImAxpZQkIjILAIQyCKI0cjRyNhI0ZgsARDsIBiYCCwACsgiophILACQ2BkI7ADQ2FkUFiwAkNhG7ADQ2BZsAMlsIBiYSMgILAEJiNGYTgbI7AIQ0awAiWwCENHI0cjYWAgsARDsIBiYCMgsAArI7AEQ2CwACuwBSVhsAUlsIBisAQmYSCwBCVgZCOwAyVgZFBYIRsjIVkjICCwBCYjRmE4WS2wMiywABYgICCwBSYgLkcjRyNhIzw4LbAzLLAAFiCwCCNCICAgRiNHsAArI2E4LbA0LLAAFrADJbACJUcjRyNhsABUWC4gPCMhG7ACJbACJUcjRyNhILAFJbAEJUcjRyNhsAYlsAUlSbACJWGwAUVjIyBYYhshWWOwAUViYCMuIyAgPIo4IyFZLbA1LLAAFiCwCEMgLkcjRyNhIGCwIGBmsIBiIyAgPIo4LbA2LCMgLkawAiVGUlggPFkusSYBFCstsDcsIyAuRrACJUZQWCA8WS6xJgEUKy2wOCwjIC5GsAIlRlJYIDxZIyAuRrACJUZQWCA8WS6xJgEUKy2wOSywMCsjIC5GsAIlRlJYIDxZLrEmARQrLbA6LLAxK4ogIDywBCNCijgjIC5GsAIlRlJYIDxZLrEmARQrsARDLrAmKy2wOyywABawBCWwBCYgLkcjRyNhsAZFKyMgPCAuIzixJgEUKy2wPCyxCAQlQrAAFrAEJbAEJSAuRyNHI2EgsAQjQrAGRSsgsGBQWCCwQFFYswIgAyAbswImAxpZQkIjIEewBEOwgGJgILAAKyCKimEgsAJDYGQjsANDYWRQWLACQ2EbsANDYFmwAyWwgGJhsAIlRmE4IyA8IzgbISAgRiNHsAArI2E4IVmxJgEUKy2wPSywMCsusSYBFCstsD4ssDErISMgIDywBCNCIzixJgEUK7AEQy6wJistsD8ssAAVIEewACNCsgABARUUEy6wLCotsEAssAAVIEewACNCsgABARUUEy6wLCotsEEssQABFBOwLSotsEIssC8qLbBDLLAAFkUjIC4gRoojYTixJgEUKy2wRCywCCNCsEMrLbBFLLIAADwrLbBGLLIAATwrLbBHLLIBADwrLbBILLIBATwrLbBJLLIAAD0rLbBKLLIAAT0rLbBLLLIBAD0rLbBMLLIBAT0rLbBNLLIAADkrLbBOLLIAATkrLbBPLLIBADkrLbBQLLIBATkrLbBRLLIAADsrLbBSLLIAATsrLbBTLLIBADsrLbBULLIBATsrLbBVLLIAAD4rLbBWLLIAAT4rLbBXLLIBAD4rLbBYLLIBAT4rLbBZLLIAADorLbBaLLIAATorLbBbLLIBADorLbBcLLIBATorLbBdLLAyKy6xJgEUKy2wXiywMiuwNistsF8ssDIrsDcrLbBgLLAAFrAyK7A4Ky2wYSywMysusSYBFCstsGIssDMrsDYrLbBjLLAzK7A3Ky2wZCywMyuwOCstsGUssDQrLrEmARQrLbBmLLA0K7A2Ky2wZyywNCuwNystsGgssDQrsDgrLbBpLLA1Ky6xJgEUKy2waiywNSuwNistsGsssDUrsDcrLbBsLLA1K7A4Ky2wbSwrsAhlsAMkUHiwARUwLQAAAEu4AMhSWLEBAY5ZuQgACABjILABI0SwAyNwsgQoCUVSRLIKAgcqsQYBRLEkAYhRWLBAiFixBgNEsSYBiFFYuAQAiFixBgFEWVlZWbgB/4WwBI2xBQBEAAA=) format('truetype'),\n    url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAAoUAA4AAAAAEPQAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAABRAAAAEQAAABWPeFJAWNtYXAAAAGIAAAAOgAAAUrQEhm3Y3Z0IAAAAcQAAAAUAAAAHAZJ/5RmcGdtAAAB2AAABPkAAAmRigp4O2dhc3AAAAbUAAAACAAAAAgAAAAQZ2x5ZgAABtwAAACuAAAAtt9nBHZoZWFkAAAHjAAAADUAAAA2ASs8e2hoZWEAAAfEAAAAIAAAACQHUwNNaG10eAAAB+QAAAAMAAAADAspAABsb2NhAAAH8AAAAAgAAAAIADgAW21heHAAAAf4AAAAIAAAACAApgm8bmFtZQAACBgAAAF3AAACzcydGhxwb3N0AAAJkAAAACoAAAA7rr1AmHByZXAAAAm8AAAAVgAAAFaSoZr/eJxjYGTewTiBgZWBg6mKaQ8DA0MPhGZ8wGDIyMTAwMTAysyAFQSkuaYwOLxgeMHIHPQ/iyGKmZvBHyjMCJIDAPe9C2B4nGNgYGBmgGAZBkYGEHAB8hjBfBYGDSDNBqQZGZgYGF4w/v8PUvCCAURLMELVAwEjG8OIBwBk5AavAAB4nGNgQANGDEbM3P83gjAAELQD4XicnVXZdtNWFJU8ZHASOmSgoA7X3DhQ68qEKRgwaSrFdiEdHAitBB2kDHTkncc+62uOQrtWH/m07n09JLR0rbYsls++R1tn2DrnRhwjKn0aiGvUoZKXA6msPZZK90lc13Uvj5UMBnFdthJPSZuonSRKat3sUC7xWOsqWSdYJ+PlIFZPVZ5noAziFB5lSUQbRBuplyZJ4onjJ4kWZxAfJUkgJaMQp9LIUEI1GsRS1aFM6dCr1xNx00DKRqMedVhU90PFJ8c1p9SsA0YqVznCFevVRr4bpwMve5DEOsGzrYcxHnisfpQqkIqR6cg/dkpOlIaBVHHUoVbi6DCTX/eRTCrNQKaMYkWl7oG43f102xYxPXQ6vi5KlUaqurnOKJrt0fGogygP2cbppNzQ2fbw5RlTVKtdcbPtQGYNXErJbHSfRAAdJlLj6QFONZwCqRn1R8XZ588BEslclKo8VTKHegOZMzt7cTHtbiersnCknwcyb3Z2452HQ6dXh3/R+hdM4cxHj+Jifj5C+lBqfiJOJKVGWMzyp4YfcVcgQrkxiAsXyuBThDl0RdrZZl3jtTH2hs/5SqlhPQna6KP4fgr9TiQrHGdRo/VInM1j13Wt3GdQS7W7Fzsyr0OVIu7vCwuuM+eEYZ4WC1VfnvneBTT/Bohn/EDeNIVL+5YpSrRvm6JMu2iKCu0SVKVdNsUU7YoppmnPmmKG9h1TzNKeMzLj/8vc55H7HN7xkJv2XeSmfQ+5ad9HbtoPkJtWITdtHblpLyA3rUZu2lWjOnYEGgZpF1IVQdA0svph3Fab9UDWjDR8aWDyLmLI+upER521tcofxX914gsHcmmip7siF5viLq/bFj483e6rj5pG3bDV+MaR8jAeRnocmtBZ+c3hv+1N3S6a7jKqMugBFUwKwABl7UAC0zrbCaT1mqf48gdgXIZ4zkpDtVSfO4am7+V5X/exOfG+x+3GLrdcd3kJWdYNcmP28N9SZKrrH+UtrVQnR6wrJ49VaxhDKrwour6SlHu0tRu/KKmy8l6U1srnk5CbPYMbQlu27mGwI0xpyiUeXlOlKD3UUo6yQyxvKco84JSLC1qGxLgOdQ9qa8TpoXoYGwshhqG0vRBwSCldFd+0ynfxHqtr2Oj4xRXh6XpyEhGf4ir7UfBU10b96A7avGbdMoMpVaqn+4xPsa/b9lFZaaSOsxe3VAfXNOsaORXTT+Rr4HRvOGjdAz1UfDRBI1U1x+jGKGM0ljXl3wR0MVZ+w2jVYvs93E+dpFWsuUuY7JsT9+C0u/0q+7WcW0bW/dcGvW3kip8jMb8tCvw7B2K3ZA3UO5OBGAvIWdAYxhYmdxiug23EbfY/Jqf/34aFRXJXOxq7eerD1ZNRJXfZ8rjLTXZZ16M2R9VOGvsIjS0PN+bY4XIstsRgQbb+wf8x7gF3aVEC4NDIZZiI2nShnurh6h6rsW04VxIBds2x43QAegAuQd8cu9bzCYD13CPnLsB9cgh2yCH4lByCz8i5BfA5OQRfkEMwIIdgl5w7AA/IIXhIDsEeOQSPyNkE+JIcgq/IIYjJIUjIuQ3wmByCJ+QQfE0OwTdGrk5k/pYH2QD6zqKbQKmdGhzaOGRGrk3Y+zxY9oFFZB9aROqRkesT6lMeLPV7i0j9wSJSfzRyY0L9iQdL/dkiUn+xiNRnxpeZIymvDp7zjg7+BJfqrV4AAAAAAQAB//8AD3icY2BkAALmJUwzGEQZZBwk+RkZGBmdGJgYmbIYgMwsoGSiiLgIs5A2owg7I5uSOqOaiT2jmZE8I5gQY17C/09BQEfg3yt+fh8gvYQxD0j68DOJiQn8U+DnZxQDcQUEljLmCwBpBgbG/3//b2SOZ+Zm4GEQcuAH2sblDLSEm8FFVJhJEGgLH6OSHpMdo5EcI3Nk0bEXJ/LYqvZ82VXHGFd6pKTkyCsQwQAAq+QkqAAAeJxjYGRgYADiw5VSsfH8Nl8ZuJlfAEUYzpvO6IXQCb7///7fyLyEmRvI5WBgAokCAFb/DJAAAAB4nGNgZGBgDvqfxRDF/IKB4f935iUMQBEUwAwAi5YFpgPoAAAD6AAAA1kAAAAAAAAAOABbAAEAAAADABYAAQAAAAAAAgAGABMAbgAAAC0JkQAAAAB4nHWQy2rCQBSG//HSi0JbWui2sypKabxgN4IgWHTTbqS4LTHGJBIzMhkFX6Pv0IfpS/RZ+puMpShNmMx3vjlz5mQAXOMbAvnzxJGzwBmjnAs4Rc9ykf7Zcon8YrmMKt4sn9C/W67gAYHlKm7wwQqidM5ogU/LAlfi0nIBF+LOcpH+0XKJ3LNcxq14tXxC71muYCJSy1Xci6+BWm11FIRG1gZ12W62OnK6lYoqStxYumsTKp3KvpyrxPhxrBxPLfc89oN17Op9uJ8nvk4jlciW09yrkZ/42jX+bFc93QRtY+ZyrtVSDm2GXGm18D3jhMasuo3G3/MwgMIKW2hEvKoQBhI12jrnNppooUOaMkMyM8+KkMBFTONizR1htpIy7nPMGSW0PjNisgOP3+WRH5MC7o9ZRR+tHsYT0u6MKPOSfTns7jBrREqyTDezs9/eU2x4WpvWcNeuS511JTE8qCF5H7u1BY1H72S3Ymi7aPD95/9+AN1fhEsAeJxjYGKAAC4G7ICZgYGRiZGZMzkjNTk7N7Eomy05syg5J5WBAQBE1QZBAABLuADIUlixAQGOWbkIAAgAYyCwASNEsAMjcLIEKAlFUkSyCgIHKrEGAUSxJAGIUViwQIhYsQYDRLEmAYhRWLgEAIhYsQYBRFlZWVm4Af+FsASNsQUARAAA) format('woff')\n  ;\n}\n.ui.steps .step.completed > .icon:before,\n.ui.ordered.steps .step.completed:before {\n  font-family: 'Step';\n  content: '\\e800'; /* '' */\n}"
  },
  {
    "path": "semantic/src/themes/default/elements/step.variables",
    "content": "/*******************************\n             Step\n*******************************/\n\n/*-------------------\n       Group\n--------------------*/\n\n@stepMargin: 1em 0em;\n@stepsBorderRadius: @defaultBorderRadius;\n@stepsBackground: '';\n@stepsBoxShadow: none;\n@stepsBorder: 1px solid @borderColor;\n\n/*-------------------\n      Element\n--------------------*/\n\n@verticalMargin: 0em;\n@horizontalMargin: 0em;\n\n@arrowSize: @relativeLarge;\n@verticalPadding: @relativeLarge;\n@horizontalPadding: 2em;\n\n@transition:\n  background-color @defaultDuration @defaultEasing,\n  opacity @defaultDuration @defaultEasing,\n  color @defaultDuration @defaultEasing,\n  box-shadow @defaultDuration @defaultEasing\n;\n@lineHeight: @relativeLarge;\n@alignItems: center;\n@justifyContent: center;\n@backgroundColor: @white;\n@background: @backgroundColor;\n@borderRadius: 0em;\n@borderWidth: 1px;\n@boxShadow: none;\n@border: none;\n@divider: @borderWidth solid @borderColor;\n\n/* Icon */\n@iconDistance: 1rem;\n@iconSize: 2.5em;\n@iconAlign: middle;\n\n/* Title */\n@titleFontFamily: @headerFont;\n@titleFontWeight: @bold;\n@titleFontSize: @relativeLarge;\n@titleColor: @darkTextColor;\n\n/* Description */\n@descriptionDistance: 0.25em;\n@descriptionFontSize: @relativeSmall;\n@descriptionFontWeight: @normal;\n@descriptionColor: @textColor;\n\n\n/* Arrow */\n@arrowBackgroundColor: @backgroundColor;\n@arrowTopOffset: 50%;\n@arrowRightOffset: 0%;\n@arrowBorderWidth: 0px @borderWidth @borderWidth 0px;\n\n@arrowDisplay: block;\n@lastArrowDisplay: none;\n\n@activeArrowDisplay: block;\n@activeLastArrowDisplay: none;\n\n/* Mobile */\n@mobileIconDistance: @iconDistance;\n\n/*-------------------\n       Types\n--------------------*/\n\n/* Vertical */\n@verticalDivider: @divider;\n@verticalArrowTopOffset: 50%;\n@verticalArrowRightOffset: 0%;\n@verticalArrowBorderWidth: 0px @borderWidth @borderWidth 0px;\n\n@verticalArrowDisplay: none;\n@verticalLastArrowDisplay: @verticalArrowDisplay;\n\n@verticalActiveArrowDisplay: block;\n@verticalActiveLastArrowDisplay: block;\n\n/*-------------------\n      Variations\n--------------------*/\n\n@attachedHorizontalOffset: -@borderWidth;\n@attachedVerticalOffset: 0;\n@attachedWidth: ~\"calc(100% + \"-@attachedHorizontalOffset * 2~\")\";\n\n@orderedFontFamily: inherit;\n@orderedFontWeight: @bold;\n\n/*-------------------\n       States\n--------------------*/\n\n/* Completed */\n@completedColor: @positiveColor;\n\n/* Hover */\n@hoverBackground: @offWhite;\n@hoverColor: @hoveredTextColor;\n\n/* Down */\n@downBackground: @darkWhite;\n@downColor: @pressedTextColor;\n\n/* Active */\n@activeBackground: @darkWhite;\n@activeColor: @linkColor;\n@activeIconColor: @darkTextColor;\n\n/* Active + Hover */\n@activeHoverBackground: @lightGrey;\n@activeHoverColor: @textColor;\n\n\n/* Disabled */\n@disabledBackground: @background;\n@disabledColor: @disabledTextColor;\n"
  },
  {
    "path": "semantic/src/themes/default/globals/reset.overrides",
    "content": "/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n   ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in\n *    IE on Windows Phone and in iOS.\n */\n\nhtml {\n  line-height: 1.15; /* 1 */\n  -ms-text-size-adjust: 100%; /* 2 */\n  -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/* Sections\n   ========================================================================== */\n\n/**\n * Remove the margin in all browsers (opinionated).\n */\n\nbody {\n  margin: 0;\n}\n\n/**\n * Add the correct display in IE 9-.\n */\n\narticle,\naside,\nfooter,\nheader,\nnav,\nsection {\n  display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n  font-size: 2em;\n  margin: 0.67em 0;\n}\n\n/* Grouping content\n   ========================================================================== */\n\n/**\n * Add the correct display in IE 9-.\n * 1. Add the correct display in IE.\n */\n\nfigcaption,\nfigure,\nmain { /* 1 */\n  display: block;\n}\n\n/**\n * Add the correct margin in IE 8.\n */\n\nfigure {\n  margin: 1em 40px;\n}\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n  box-sizing: content-box; /* 1 */\n  height: 0; /* 1 */\n  overflow: visible; /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n  font-family: monospace, monospace; /* 1 */\n  font-size: 1em; /* 2 */\n}\n\n/* Text-level semantics\n   ========================================================================== */\n\n/**\n * 1. Remove the gray background on active links in IE 10.\n * 2. Remove gaps in links underline in iOS 8+ and Safari 8+.\n */\n\na {\n  background-color: transparent; /* 1 */\n  -webkit-text-decoration-skip: objects; /* 2 */\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57- and Firefox 39-.\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n  border-bottom: none; /* 1 */\n  text-decoration: underline; /* 2 */\n  text-decoration: underline dotted; /* 2 */\n}\n\n/**\n * Prevent the duplicate application of `bolder` by the next rule in Safari 6.\n */\n\nb,\nstrong {\n  font-weight: inherit;\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n  font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\nsamp {\n  font-family: monospace, monospace; /* 1 */\n  font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct font style in Android 4.3-.\n */\n\ndfn {\n  font-style: italic;\n}\n\n/**\n * Add the correct background and color in IE 9-.\n */\n\nmark {\n  background-color: #ff0;\n  color: #000;\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n  font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub,\nsup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\nsup {\n  top: -0.5em;\n}\n\n/* Embedded content\n   ========================================================================== */\n\n/**\n * Add the correct display in IE 9-.\n */\n\naudio,\nvideo {\n  display: inline-block;\n}\n\n/**\n * Add the correct display in iOS 4-7.\n */\n\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n\n/**\n * Remove the border on images inside links in IE 10-.\n */\n\nimg {\n  border-style: none;\n}\n\n/**\n * Hide the overflow in IE.\n */\n\nsvg:not(:root) {\n  overflow: hidden;\n}\n\n/* Forms\n   ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers (opinionated).\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  font-family: sans-serif; /* 1 */\n  font-size: 100%; /* 1 */\n  line-height: 1.15; /* 1 */\n  margin: 0; /* 2 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput { /* 1 */\n  overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect { /* 1 */\n  text-transform: none;\n}\n\n/**\n * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\n *    controls in Android 4.\n * 2. Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton,\nhtml [type=\"button\"], /* 1 */\n[type=\"reset\"],\n[type=\"submit\"] {\n  -webkit-appearance: button; /* 2 */\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n  border-style: none;\n  padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n  outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\nfieldset {\n  padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n *    `fieldset` elements in all browsers.\n */\n\nlegend {\n  box-sizing: border-box; /* 1 */\n  color: inherit; /* 2 */\n  display: table; /* 1 */\n  max-width: 100%; /* 1 */\n  padding: 0; /* 3 */\n  white-space: normal; /* 1 */\n}\n\n/**\n * 1. Add the correct display in IE 9-.\n * 2. Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n  display: inline-block; /* 1 */\n  vertical-align: baseline; /* 2 */\n}\n\n/**\n * Remove the default vertical scrollbar in IE.\n */\n\ntextarea {\n  overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10-.\n * 2. Remove the padding in IE 10-.\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n  box-sizing: border-box; /* 1 */\n  padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type=\"search\"] {\n  -webkit-appearance: textfield; /* 1 */\n  outline-offset: -2px; /* 2 */\n}\n\n/**\n * Remove the inner padding and cancel buttons in Chrome and Safari on macOS.\n */\n\n[type=\"search\"]::-webkit-search-cancel-button,\n[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n  -webkit-appearance: button; /* 1 */\n  font: inherit; /* 2 */\n}\n\n/* Interactive\n   ========================================================================== */\n\n/*\n * Add the correct display in IE 9-.\n * 1. Add the correct display in Edge, IE, and Firefox.\n */\n\ndetails, /* 1 */\nmenu {\n  display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\n\nsummary {\n  display: list-item;\n}\n\n/* Scripting\n   ========================================================================== */\n\n/**\n * Add the correct display in IE 9-.\n */\n\ncanvas {\n  display: inline-block;\n}\n\n/**\n * Add the correct display in IE.\n */\n\ntemplate {\n  display: none;\n}\n\n/* Hidden\n   ========================================================================== */\n\n/**\n * Add the correct display in IE 10-.\n */\n\n[hidden] {\n  display: none;\n}\n"
  },
  {
    "path": "semantic/src/themes/default/globals/reset.variables",
    "content": "/*******************************\n             Reset\n*******************************/"
  },
  {
    "path": "semantic/src/themes/default/globals/site.overrides",
    "content": "/*******************************\n        Global Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/themes/default/globals/site.variables",
    "content": "/*******************************\n         Site Settings\n*******************************/\n\n/*-------------------\n       Fonts\n--------------------*/\n\n@fontName          : 'Lato';\n@fontSmoothing     : antialiased;\n\n@headerFont        : @fontName, 'Helvetica Neue', Arial, Helvetica, sans-serif;\n@pageFont          : @fontName, 'Helvetica Neue', Arial, Helvetica, sans-serif;\n\n@googleFontName    : @fontName;\n@importGoogleFonts : true;\n@googleFontSizes   : '400,700,400italic,700italic';\n@googleSubset      : 'latin';\n\n@googleProtocol    : 'https://';\n@googleFontRequest : '@{googleFontName}:@{googleFontSizes}&subset=@{googleSubset}';\n\n\n@bold              : bold;\n@normal            : normal;\n\n/*-------------------\n      Base Sizes\n--------------------*/\n\n/* This is the single variable that controls them all */\n@emSize   : 14px;\n\n/* The size of page text  */\n@fontSize : 14px;\n\n\n/*-------------------\n    Border Radius\n--------------------*/\n\n/* See Power-user section below\n   for explanation of @px variables\n*/\n@relativeBorderRadius: @relative4px;\n@absoluteBorderRadius: @4px;\n\n@defaultBorderRadius: @absoluteBorderRadius;\n\n/*-------------------\n    Brand Colors\n--------------------*/\n\n@primaryColor        : @blue;\n@secondaryColor      : @black;\n\n@lightPrimaryColor   : @lightBlue;\n@lightSecondaryColor : @lightBlack;\n\n/*--------------\n  Page Heading\n---------------*/\n\n@headerFontWeight : @bold;\n@headerLineHeight : unit((18 / 14), em);\n\n@h1 : unit((28 / 14), rem);\n@h2 : unit((24 / 14), rem);\n@h3 : unit((18 / 14), rem);\n@h4 : unit((15 / 14), rem);\n@h5 : unit((14 / 14), rem);\n\n/*--------------\n   Form Input\n---------------*/\n\n/* This adjusts the default form input across all elements */\n@inputBackground        : @white;\n@inputVerticalPadding   : @relative11px;\n@inputHorizontalPadding : @relative14px;\n@inputPadding           : @inputVerticalPadding @inputHorizontalPadding;\n\n/* Input Text Color */\n@inputColor: @textColor;\n@inputPlaceholderColor: lighten(@inputColor, 75);\n@inputPlaceholderFocusColor: lighten(@inputColor, 45);\n\n/* Line Height Default For Inputs in Browser (Descendors are 17px at 14px base em) */\n@inputLineHeight: unit((17 / 14), em);\n\n/*-------------------\n    Focused Input\n--------------------*/\n\n/* Used on inputs, textarea etc */\n@focusedFormBorderColor: #85B7D9;\n\n/* Used on dropdowns, other larger blocks */\n@focusedFormMutedBorderColor: #96C8DA;\n\n/*-------------------\n        Sizes\n--------------------*/\n\n/*\n  Sizes are all expressed in terms of 14px/em (default em)\n  This ensures these \"ratios\" remain constant despite changes in EM\n*/\n\n@miniSize        : (11 / 14);\n@tinySize        : (12 / 14);\n@smallSize       : (13 / 14);\n@mediumSize      : (14 / 14);\n@largeSize       : (16 / 14);\n@bigSize         : (18 / 14);\n@hugeSize        : (20 / 14);\n@massiveSize     : (24 / 14);\n\n\n/*-------------------\n        Page\n--------------------*/\n\n@pageBackground      : #FFFFFF;\n@pageOverflowX       : hidden;\n\n@lineHeight          : 1.4285em;\n@textColor           : rgba(0, 0, 0, 0.87);\n\n/*-------------------\n      Paragraph\n--------------------*/\n\n@paragraphMargin     : 0em 0em 1em;\n@paragraphLineHeight : @lineHeight;\n\n/*-------------------\n       Links\n--------------------*/\n\n@linkColor           : #4183C4;\n@linkUnderline       : none;\n@linkHoverColor      : darken(saturate(@linkColor, 20), 15, relative);\n@linkHoverUnderline  : @linkUnderline;\n\n/*-------------------\n    Scroll Bars\n--------------------*/\n\n@useCustomScrollbars: true;\n\n@customScrollbarWidth: 10px;\n@customScrollbarHeight: 10px;\n\n@trackBackground: rgba(0, 0, 0, 0.1);\n@trackBorderRadius: 0px;\n\n@thumbBorderRadius: 5px;\n@thumbBackground: rgba(0, 0, 0, 0.25);\n@thumbTransition: color 0.2s ease;\n\n@thumbInactiveBackground: rgba(0, 0, 0, 0.15);\n@thumbHoverBackground: rgba(128, 135, 139, 0.8);\n\n/* Inverted */\n@trackInvertedBackground: rgba(255, 255, 255, 0.1);\n@thumbInvertedBackground: rgba(255, 255, 255, 0.25);\n@thumbInvertedInactiveBackground: rgba(255, 255, 255, 0.15);\n@thumbInvertedHoverBackground: rgba(255, 255, 255, 0.35);\n\n/*-------------------\n  Highlighted Text\n--------------------*/\n\n@highlightBackground      : #CCE2FF;\n@highlightColor           : @textColor;\n\n@inputHighlightBackground : rgba(100, 100, 100, 0.4);\n@inputHighlightColor      : @textColor;\n\n\n/*-------------------\n       Loader\n--------------------*/\n\n@loaderSize              : @relativeBig;\n@loaderSpeed             : 0.6s;\n@loaderLineWidth         : 0.2em;\n@loaderFillColor         : rgba(0, 0, 0, 0.1);\n@loaderLineColor         : @grey;\n\n@invertedLoaderFillColor : rgba(255, 255, 255, 0.15);\n@invertedLoaderLineColor : @white;\n\n/*-------------------\n        Grid\n--------------------*/\n\n@columnCount: 16;\n\n/*-------------------\n     Transitions\n--------------------*/\n\n@defaultDuration : 0.1s;\n@defaultEasing   : ease;\n\n/*-------------------\n     Breakpoints\n--------------------*/\n\n@mobileBreakpoint            : 320px;\n@tabletBreakpoint            : 768px;\n@computerBreakpoint          : 992px;\n@largeMonitorBreakpoint      : 1200px;\n@widescreenMonitorBreakpoint : 1920px;\n\n/*-------------------\n      Site Colors\n--------------------*/\n\n/*---  Colors  ---*/\n@red              : #DB2828;\n@orange           : #F2711C;\n@yellow           : #FBBD08;\n@olive            : #B5CC18;\n@green            : #21BA45;\n@teal             : #00B5AD;\n@blue             : #2185D0;\n@violet           : #6435C9;\n@purple           : #A333C8;\n@pink             : #E03997;\n@brown            : #A5673F;\n@grey             : #767676;\n@black            : #1B1C1D;\n\n/*---  Light Colors  ---*/\n@lightRed         : #FF695E;\n@lightOrange      : #FF851B;\n@lightYellow      : #FFE21F;\n@lightOlive       : #D9E778;\n@lightGreen       : #2ECC40;\n@lightTeal        : #6DFFFF;\n@lightBlue        : #54C8FF;\n@lightViolet      : #A291FB;\n@lightPurple      : #DC73FF;\n@lightPink        : #FF8EDF;\n@lightBrown       : #D67C1C;\n@lightGrey        : #DCDDDE;\n@lightBlack       : #545454;\n\n/*---   Neutrals  ---*/\n@fullBlack        : #000000;\n@offWhite         : #F9FAFB;\n@darkWhite        : #F3F4F5;\n@midWhite         : #DCDDDE;\n@white            : #FFFFFF;\n\n/*--- Colored Backgrounds ---*/\n@redBackground    : #FFE8E6;\n@orangeBackground : #FFEDDE;\n@yellowBackground : #FFF8DB;\n@oliveBackground  : #FBFDEF;\n@greenBackground  : #E5F9E7;\n@tealBackground   : #E1F7F7;\n@blueBackground   : #DFF0FF;\n@violetBackground : #EAE7FF;\n@purpleBackground : #F6E7FF;\n@pinkBackground   : #FFE3FB;\n@brownBackground  : #F1E2D3;\n\n/*--- Colored Headers ---*/\n@redHeaderColor    : darken(@redTextColor, 5);\n@oliveHeaderColor  : darken(@oliveTextColor, 5);\n@greenHeaderColor  : darken(@greenTextColor, 5);\n@yellowHeaderColor : darken(@yellowTextColor, 5);\n@blueHeaderColor   : darken(@blueTextColor, 5);\n@tealHeaderColor   : darken(@tealTextColor, 5);\n@pinkHeaderColor   : darken(@pinkTextColor, 5);\n@violetHeaderColor : darken(@violetTextColor, 5);\n@purpleHeaderColor : darken(@purpleTextColor, 5);\n@orangeHeaderColor : darken(@orangeTextColor, 5);\n@brownHeaderColor  : darken(@brownTextColor, 5);\n\n/*--- Colored Text ---*/\n@redTextColor    : @red;\n@orangeTextColor : @orange;\n@yellowTextColor : #B58105; // Yellow text is difficult to read\n@oliveTextColor  : #8ABC1E; // Olive is difficult to read\n@greenTextColor  : #1EBC30; // Green is difficult to read\n@tealTextColor   : #10A3A3; // Teal text is difficult to read\n@blueTextColor   : @blue;\n@violetTextColor : @violet;\n@purpleTextColor : @purple;\n@pinkTextColor   : @pink;\n@brownTextColor  : @brown;\n\n/*--- Colored Border ---*/\n@redBorderColor    : @redTextColor;\n@orangeBorderColor : @orangeTextColor;\n@yellowBorderColor : @yellowTextColor;\n@oliveBorderColor  : @oliveTextColor;\n@greenBorderColor  : @greenTextColor;\n@tealBorderColor   : @tealTextColor;\n@blueBorderColor   : @blueTextColor;\n@violetBorderColor : @violetTextColor;\n@purpleBorderColor : @purpleTextColor;\n@pinkBorderColor   : @pinkTextColor;\n@brownBorderColor  : @brownTextColor;\n\n/*-------------------\n     Alpha Colors\n--------------------*/\n\n@subtleTransparentBlack     : rgba(0, 0, 0, 0.03);\n@transparentBlack           : rgba(0, 0, 0, 0.05);\n@strongTransparentBlack     : rgba(0, 0, 0, 0.10);\n@veryStrongTransparentBlack : rgba(0, 0, 0, 0.15);\n\n@subtleTransparentWhite     : rgba(255, 255, 255, 0.02);\n@transparentWhite           : rgba(255, 255, 255, 0.08);\n@strongTransparentWhite     : rgba(255, 255, 255, 0.15);\n\n/*-------------------\n       Accents\n--------------------*/\n\n/* Differentiating Neutrals */\n@subtleGradient: linear-gradient(transparent, @transparentBlack);\n\n/* Differentiating Layers */\n@subtleShadow:\n  0px 1px 2px 0 @borderColor\n;\n@floatingShadow:\n  0px 2px 4px 0px rgba(34, 36, 38, 0.12),\n  0px 2px 10px 0px rgba(34, 36, 38, 0.15)\n;\n\n/*******************************\n           Power-User\n*******************************/\n\n\n/*-------------------\n    Emotive Colors\n--------------------*/\n\n/* Positive */\n@positiveColor           : @green;\n@positiveBackgroundColor : #FCFFF5;\n@positiveBorderColor     : #A3C293;\n@positiveHeaderColor     : #1A531B;\n@positiveTextColor       : #2C662D;\n\n/* Negative */\n@negativeColor           : @red;\n@negativeBackgroundColor : #FFF6F6;\n@negativeBorderColor     : #E0B4B4;\n@negativeHeaderColor     : #912D2B;\n@negativeTextColor       : #9F3A38;\n\n/* Info */\n@infoColor              : #31CCEC;\n@infoBackgroundColor    : #F8FFFF;\n@infoBorderColor        : #A9D5DE;\n@infoHeaderColor        : #0E566C;\n@infoTextColor          : #276F86;\n\n/* Warning */\n@warningColor           : #F2C037;\n@warningBorderColor     : #C9BA9B;\n@warningBackgroundColor : #FFFAF3;\n@warningHeaderColor     : #794B02;\n@warningTextColor       : #573A08;\n\n/*-------------------\n        Paths\n--------------------*/\n\n/* For source only. Modified in gulp for dist */\n@imagePath : '../../themes/default/assets/images';\n@fontPath  : '../../themes/default/assets/fonts';\n\n/*-------------------\n       Em Sizes\n--------------------*/\n\n/*\n  This rounds @size values to the closest pixel then expresses that value in (r)em.\n  This ensures all size values round to exact pixels\n*/\n@mini            : unit( round(@miniSize * @emSize) / @emSize, rem);\n@tiny            : unit( round(@tinySize * @emSize) / @emSize, rem);\n@small           : unit( round(@smallSize * @emSize) / @emSize, rem);\n@medium          : unit( round(@mediumSize * @emSize) / @emSize, rem);\n@large           : unit( round(@largeSize * @emSize) / @emSize, rem);\n@big             : unit( round(@bigSize * @emSize) / @emSize, rem);\n@huge            : unit( round(@hugeSize * @emSize) / @emSize, rem);\n@massive         : unit( round(@massiveSize * @emSize) / @emSize, rem);\n\n/* em */\n@relativeMini    : unit( round(@miniSize * @emSize) / @emSize, em);\n@relativeTiny    : unit( round(@tinySize * @emSize) / @emSize, em);\n@relativeSmall   : unit( round(@smallSize * @emSize) / @emSize, em);\n@relativeMedium  : unit( round(@mediumSize * @emSize) / @emSize, em);\n@relativeLarge   : unit( round(@largeSize * @emSize) / @emSize, em);\n@relativeBig     : unit( round(@bigSize * @emSize) / @emSize, em);\n@relativeHuge    : unit( round(@hugeSize * @emSize) / @emSize, em);\n@relativeMassive : unit( round(@massiveSize * @emSize) / @emSize, em);\n\n/* rem */\n@absoluteMini    : unit( round(@miniSize * @emSize) / @emSize, rem);\n@absoluteTiny    : unit( round(@tinySize * @emSize) / @emSize, rem);\n@absoluteSmall   : unit( round(@smallSize * @emSize) / @emSize, rem);\n@absoluteMedium  : unit( round(@mediumSize * @emSize) / @emSize, rem);\n@absoluteLarge   : unit( round(@largeSize * @emSize) / @emSize, rem);\n@absoluteBig     : unit( round(@bigSize * @emSize) / @emSize, rem);\n@absoluteHuge    : unit( round(@hugeSize * @emSize) / @emSize, rem);\n@absoluteMassive : unit( round(@massiveSize * @emSize) / @emSize, rem);\n\n/*-------------------\n       Icons\n--------------------*/\n\n/* Maximum Glyph Width of Icon */\n@iconWidth : 1.18em;\n\n/*-------------------\n     Neutral Text\n--------------------*/\n\n@darkTextColor               : rgba(0, 0, 0, 0.85);\n@mutedTextColor              : rgba(0, 0, 0, 0.6);\n@lightTextColor              : rgba(0, 0, 0, 0.4);\n\n@unselectedTextColor         : rgba(0, 0, 0, 0.4);\n@hoveredTextColor            : rgba(0, 0, 0, 0.8);\n@pressedTextColor            : rgba(0, 0, 0, 0.9);\n@selectedTextColor           : rgba(0, 0, 0, 0.95);\n@disabledTextColor           : rgba(0, 0, 0, 0.2);\n\n@invertedTextColor           : rgba(255, 255, 255, 0.9);\n@invertedMutedTextColor      : rgba(255, 255, 255, 0.8);\n@invertedLightTextColor      : rgba(255, 255, 255, 0.7);\n@invertedUnselectedTextColor : rgba(255, 255, 255, 0.5);\n@invertedHoveredTextColor    : rgba(255, 255, 255, 1);\n@invertedPressedTextColor    : rgba(255, 255, 255, 1);\n@invertedSelectedTextColor   : rgba(255, 255, 255, 1);\n@invertedDisabledTextColor   : rgba(255, 255, 255, 0.2);\n\n/*-------------------\n     Brand Colors\n--------------------*/\n\n@facebookColor   : #3B5998;\n@twitterColor    : #55ACEE;\n@googlePlusColor : #DD4B39;\n@linkedInColor   : #1F88BE;\n@youtubeColor    : #FF0000;\n@pinterestColor  : #BD081C;\n@vkColor         : #4D7198;\n@instagramColor  : #49769C;\n\n/*-------------------\n      Borders\n--------------------*/\n\n@circularRadius                : 500rem;\n\n@borderColor               : rgba(34, 36, 38, 0.15);\n@strongBorderColor         : rgba(34, 36, 38, 0.22);\n@internalBorderColor       : rgba(34, 36, 38, 0.1);\n@selectedBorderColor       : rgba(34, 36, 38, 0.35);\n@strongSelectedBorderColor : rgba(34, 36, 38, 0.5);\n@disabledBorderColor       : rgba(34, 36, 38, 0.5);\n\n@solidInternalBorderColor  : #FAFAFA;\n@solidBorderColor          : #D4D4D5;\n@solidSelectedBorderColor  : #BCBDBD;\n\n@whiteBorderColor              : rgba(255, 255, 255, 0.1);\n@selectedWhiteBorderColor      : rgba(255, 255, 255, 0.8);\n\n@solidWhiteBorderColor         : #555555;\n@selectedSolidWhiteBorderColor : #999999;\n\n\n/*-------------------\n    Derived Values\n--------------------*/\n\n/* Loaders Position Offset */\n@loaderOffset : -(@loaderSize / 2);\n@loaderMargin : @loaderOffset 0em 0em @loaderOffset;\n\n/* Rendered Scrollbar Width */\n@scrollbarWidth: 17px;\n\n/* Maximum Single Character Glyph Width, aka Capital \"W\" */\n@glyphWidth: 1.1em;\n\n/* Used to match floats with text */\n@lineHeightOffset       : ((@lineHeight - 1em) / 2);\n@headerLineHeightOffset : (@headerLineHeight - 1em) / 2;\n\n/* Header Spacing */\n@headerTopMargin    : ~\"calc(2rem - \"@headerLineHeightOffset~\")\";\n@headerBottomMargin : 1rem;\n@headerMargin       : @headerTopMargin 0em @headerBottomMargin;\n\n/* Minimum Mobile Width */\n@pageMinWidth       : 320px;\n\n/* Positive / Negative Dupes */\n@successBackgroundColor : @positiveBackgroundColor;\n@successColor           : @positiveColor;\n@successBorderColor     : @positiveBorderColor;\n@successHeaderColor     : @positiveHeaderColor;\n@successTextColor       : @positiveTextColor;\n\n@errorBackgroundColor   : @negativeBackgroundColor;\n@errorColor             : @negativeColor;\n@errorBorderColor       : @negativeBorderColor;\n@errorHeaderColor       : @negativeHeaderColor;\n@errorTextColor         : @negativeTextColor;\n\n\n/* Responsive */\n@largestMobileScreen : (@tabletBreakpoint - 1px);\n@largestTabletScreen : (@computerBreakpoint - 1px);\n@largestSmallMonitor : (@largeMonitorBreakpoint - 1px);\n@largestLargeMonitor : (@widescreenMonitorBreakpoint - 1px);\n\n\n/*-------------------\n  Exact Pixel Values\n--------------------*/\n/*\n  These are used to specify exact pixel values in em\n  for things like borders that remain constantly\n  sized as emSize adjusts\n\n  Since there are many more sizes than names for sizes,\n  these are named by their original pixel values.\n\n*/\n\n@1px  : unit( (1 / @emSize), rem);\n@2px  : unit( (2 / @emSize), rem);\n@3px  : unit( (3 / @emSize), rem);\n@4px  : unit( (4 / @emSize), rem);\n@5px  : unit( (5 / @emSize), rem);\n@6px  : unit( (6 / @emSize), rem);\n@7px  : unit( (7 / @emSize), rem);\n@8px  : unit( (8 / @emSize), rem);\n@9px  : unit( (9 / @emSize), rem);\n@10px : unit( (10 / @emSize), rem);\n@11px : unit( (11 / @emSize), rem);\n@12px : unit( (12 / @emSize), rem);\n@13px : unit( (13 / @emSize), rem);\n@14px : unit( (14 / @emSize), rem);\n@15px : unit( (15 / @emSize), rem);\n@16px : unit( (16 / @emSize), rem);\n@17px : unit( (17 / @emSize), rem);\n@18px : unit( (18 / @emSize), rem);\n@19px : unit( (19 / @emSize), rem);\n@20px : unit( (20 / @emSize), rem);\n@21px : unit( (21 / @emSize), rem);\n@22px : unit( (22 / @emSize), rem);\n@23px : unit( (23 / @emSize), rem);\n@24px : unit( (24 / @emSize), rem);\n@25px : unit( (25 / @emSize), rem);\n@26px : unit( (26 / @emSize), rem);\n@27px : unit( (27 / @emSize), rem);\n@28px : unit( (28 / @emSize), rem);\n@29px : unit( (29 / @emSize), rem);\n@30px : unit( (30 / @emSize), rem);\n@31px : unit( (31 / @emSize), rem);\n@32px : unit( (32 / @emSize), rem);\n@33px : unit( (33 / @emSize), rem);\n@34px : unit( (34 / @emSize), rem);\n@35px : unit( (35 / @emSize), rem);\n@36px : unit( (36 / @emSize), rem);\n@37px : unit( (37 / @emSize), rem);\n@38px : unit( (38 / @emSize), rem);\n@39px : unit( (39 / @emSize), rem);\n@40px : unit( (40 / @emSize), rem);\n@41px : unit( (41 / @emSize), rem);\n@42px : unit( (42 / @emSize), rem);\n@43px : unit( (43 / @emSize), rem);\n@44px : unit( (44 / @emSize), rem);\n@45px : unit( (45 / @emSize), rem);\n@46px : unit( (46 / @emSize), rem);\n@47px : unit( (47 / @emSize), rem);\n@48px : unit( (48 / @emSize), rem);\n@49px : unit( (49 / @emSize), rem);\n@50px : unit( (50 / @emSize), rem);\n@51px : unit( (51 / @emSize), rem);\n@52px : unit( (52 / @emSize), rem);\n@53px : unit( (53 / @emSize), rem);\n@54px : unit( (54 / @emSize), rem);\n@55px : unit( (55 / @emSize), rem);\n@56px : unit( (56 / @emSize), rem);\n@57px : unit( (57 / @emSize), rem);\n@58px : unit( (58 / @emSize), rem);\n@59px : unit( (59 / @emSize), rem);\n@60px : unit( (60 / @emSize), rem);\n@61px : unit( (61 / @emSize), rem);\n@62px : unit( (62 / @emSize), rem);\n@63px : unit( (63 / @emSize), rem);\n@64px : unit( (64 / @emSize), rem);\n\n@relative1px  : unit( (1 / @emSize), em);\n@relative2px  : unit( (2 / @emSize), em);\n@relative3px  : unit( (3 / @emSize), em);\n@relative4px  : unit( (4 / @emSize), em);\n@relative5px  : unit( (5 / @emSize), em);\n@relative6px  : unit( (6 / @emSize), em);\n@relative7px  : unit( (7 / @emSize), em);\n@relative8px  : unit( (8 / @emSize), em);\n@relative9px  : unit( (9 / @emSize), em);\n@relative10px : unit( (10 / @emSize), em);\n@relative11px : unit( (11 / @emSize), em);\n@relative12px : unit( (12 / @emSize), em);\n@relative13px : unit( (13 / @emSize), em);\n@relative14px : unit( (14 / @emSize), em);\n@relative15px : unit( (15 / @emSize), em);\n@relative16px : unit( (16 / @emSize), em);\n@relative17px : unit( (17 / @emSize), em);\n@relative18px : unit( (18 / @emSize), em);\n@relative19px : unit( (19 / @emSize), em);\n@relative20px : unit( (20 / @emSize), em);\n@relative21px : unit( (21 / @emSize), em);\n@relative22px : unit( (22 / @emSize), em);\n@relative23px : unit( (23 / @emSize), em);\n@relative24px : unit( (24 / @emSize), em);\n@relative25px : unit( (25 / @emSize), em);\n@relative26px : unit( (26 / @emSize), em);\n@relative27px : unit( (27 / @emSize), em);\n@relative28px : unit( (28 / @emSize), em);\n@relative29px : unit( (29 / @emSize), em);\n@relative30px : unit( (30 / @emSize), em);\n@relative31px : unit( (31 / @emSize), em);\n@relative32px : unit( (32 / @emSize), em);\n@relative33px : unit( (33 / @emSize), em);\n@relative34px : unit( (34 / @emSize), em);\n@relative35px : unit( (35 / @emSize), em);\n@relative36px : unit( (36 / @emSize), em);\n@relative37px : unit( (37 / @emSize), em);\n@relative38px : unit( (38 / @emSize), em);\n@relative39px : unit( (39 / @emSize), em);\n@relative40px : unit( (40 / @emSize), em);\n@relative41px : unit( (41 / @emSize), em);\n@relative42px : unit( (42 / @emSize), em);\n@relative43px : unit( (43 / @emSize), em);\n@relative44px : unit( (44 / @emSize), em);\n@relative45px : unit( (45 / @emSize), em);\n@relative46px : unit( (46 / @emSize), em);\n@relative47px : unit( (47 / @emSize), em);\n@relative48px : unit( (48 / @emSize), em);\n@relative49px : unit( (49 / @emSize), em);\n@relative50px : unit( (50 / @emSize), em);\n@relative51px : unit( (51 / @emSize), em);\n@relative52px : unit( (52 / @emSize), em);\n@relative53px : unit( (53 / @emSize), em);\n@relative54px : unit( (54 / @emSize), em);\n@relative55px : unit( (55 / @emSize), em);\n@relative56px : unit( (56 / @emSize), em);\n@relative57px : unit( (57 / @emSize), em);\n@relative58px : unit( (58 / @emSize), em);\n@relative59px : unit( (59 / @emSize), em);\n@relative60px : unit( (60 / @emSize), em);\n@relative61px : unit( (61 / @emSize), em);\n@relative62px : unit( (62 / @emSize), em);\n@relative63px : unit( (63 / @emSize), em);\n@relative64px : unit( (64 / @emSize), em);\n\n/* Columns */\n@oneWide        : (1 / @columnCount * 100%);\n@twoWide        : (2 / @columnCount * 100%);\n@threeWide      : (3 / @columnCount * 100%);\n@fourWide       : (4 / @columnCount * 100%);\n@fiveWide       : (5 / @columnCount * 100%);\n@sixWide        : (6 / @columnCount * 100%);\n@sevenWide      : (7 / @columnCount * 100%);\n@eightWide      : (8 / @columnCount * 100%);\n@nineWide       : (9 / @columnCount * 100%);\n@tenWide        : (10 / @columnCount * 100%);\n@elevenWide     : (11 / @columnCount * 100%);\n@twelveWide     : (12 / @columnCount * 100%);\n@thirteenWide   : (13 / @columnCount * 100%);\n@fourteenWide   : (14 / @columnCount * 100%);\n@fifteenWide    : (15 / @columnCount * 100%);\n@sixteenWide    : (16 / @columnCount * 100%);\n\n@oneColumn      : (1 / 1 * 100%);\n@twoColumn      : (1 / 2 * 100%);\n@threeColumn    : (1 / 3 * 100%);\n@fourColumn     : (1 / 4 * 100%);\n@fiveColumn     : (1 / 5 * 100%);\n@sixColumn      : (1 / 6 * 100%);\n@sevenColumn    : (1 / 7 * 100%);\n@eightColumn    : (1 / 8 * 100%);\n@nineColumn     : (1 / 9 * 100%);\n@tenColumn      : (1 / 10 * 100%);\n@elevenColumn   : (1 / 11 * 100%);\n@twelveColumn   : (1 / 12 * 100%);\n@thirteenColumn : (1 / 13 * 100%);\n@fourteenColumn : (1 / 14 * 100%);\n@fifteenColumn  : (1 / 15 * 100%);\n@sixteenColumn  : (1 / 16 * 100%);\n\n\n/*******************************\n             States\n*******************************/\n\n/*-------------------\n      Disabled\n--------------------*/\n\n@disabledOpacity: 0.45;\n@disabledTextColor: rgba(40, 40, 40, 0.3);\n@invertedDisabledTextColor: rgba(225, 225, 225, 0.3);\n\n/*-------------------\n        Hover\n--------------------*/\n\n/*---  Shadows  ---*/\n@floatingShadowHover:\n  0px 2px 4px 0px rgba(34, 36, 38, 0.15),\n  0px 2px 10px 0px rgba(34, 36, 38, 0.25)\n;\n\n/*---  Colors  ---*/\n@primaryColorHover    : saturate(darken(@primaryColor, 5), 10, relative);\n@secondaryColorHover  : saturate(lighten(@secondaryColor, 5), 10, relative);\n\n@redHover             : saturate(darken(@red, 5), 10, relative);\n@orangeHover          : saturate(darken(@orange, 5), 10, relative);\n@yellowHover          : saturate(darken(@yellow, 5), 10, relative);\n@oliveHover           : saturate(darken(@olive, 5), 10, relative);\n@greenHover           : saturate(darken(@green, 5), 10, relative);\n@tealHover            : saturate(darken(@teal, 5), 10, relative);\n@blueHover            : saturate(darken(@blue, 5), 10, relative);\n@violetHover          : saturate(darken(@violet, 5), 10, relative);\n@purpleHover          : saturate(darken(@purple, 5), 10, relative);\n@pinkHover            : saturate(darken(@pink, 5), 10, relative);\n@brownHover           : saturate(darken(@brown, 5), 10, relative);\n\n@lightRedHover        : saturate(darken(@lightRed, 5), 10, relative);\n@lightOrangeHover     : saturate(darken(@lightOrange, 5), 10, relative);\n@lightYellowHover     : saturate(darken(@lightYellow, 5), 10, relative);\n@lightOliveHover      : saturate(darken(@lightOlive, 5), 10, relative);\n@lightGreenHover      : saturate(darken(@lightGreen, 5), 10, relative);\n@lightTealHover       : saturate(darken(@lightTeal, 5), 10, relative);\n@lightBlueHover       : saturate(darken(@lightBlue, 5), 10, relative);\n@lightVioletHover     : saturate(darken(@lightViolet, 5), 10, relative);\n@lightPurpleHover     : saturate(darken(@lightPurple, 5), 10, relative);\n@lightPinkHover       : saturate(darken(@lightPink, 5), 10, relative);\n@lightBrownHover      : saturate(darken(@lightBrown, 5), 10, relative);\n@lightGreyHover       : saturate(darken(@lightGrey, 5), 10, relative);\n@lightBlackHover      : saturate(darken(@fullBlack, 5), 10, relative);\n\n/*---  Emotive  ---*/\n@positiveColorHover   : saturate(darken(@positiveColor, 5), 10, relative);\n@negativeColorHover   : saturate(darken(@negativeColor, 5), 10, relative);\n\n/*---  Brand   ---*/\n@facebookHoverColor   : saturate(darken(@facebookColor, 5), 10, relative);\n@twitterHoverColor    : saturate(darken(@twitterColor, 5), 10, relative);\n@googlePlusHoverColor : saturate(darken(@googlePlusColor, 5), 10, relative);\n@linkedInHoverColor   : saturate(darken(@linkedInColor, 5), 10, relative);\n@youtubeHoverColor    : saturate(darken(@youtubeColor, 5), 10, relative);\n@instagramHoverColor  : saturate(darken(@instagramColor, 5), 10, relative);\n@pinterestHoverColor  : saturate(darken(@pinterestColor, 5), 10, relative);\n@vkHoverColor         : saturate(darken(@vkColor, 5), 10, relative);\n\n/*---  Dark Tones  ---*/\n@fullBlackHover       : lighten(@fullBlack, 5);\n@blackHover           : lighten(@black, 5);\n@greyHover            : lighten(@grey, 5);\n\n/*---  Light Tones  ---*/\n@whiteHover           : darken(@white, 5);\n@offWhiteHover        : darken(@offWhite, 5);\n@darkWhiteHover       : darken(@darkWhite, 5);\n\n/*-------------------\n        Focus\n--------------------*/\n\n/*---  Colors  ---*/\n@primaryColorFocus    : saturate(darken(@primaryColor, 8), 20, relative);\n@secondaryColorFocus  : saturate(lighten(@secondaryColor, 8), 20, relative);\n\n@redFocus             : saturate(darken(@red, 8), 20, relative);\n@orangeFocus          : saturate(darken(@orange, 8), 20, relative);\n@yellowFocus          : saturate(darken(@yellow, 8), 20, relative);\n@oliveFocus           : saturate(darken(@olive, 8), 20, relative);\n@greenFocus           : saturate(darken(@green, 8), 20, relative);\n@tealFocus            : saturate(darken(@teal, 8), 20, relative);\n@blueFocus            : saturate(darken(@blue, 8), 20, relative);\n@violetFocus          : saturate(darken(@violet, 8), 20, relative);\n@purpleFocus          : saturate(darken(@purple, 8), 20, relative);\n@pinkFocus            : saturate(darken(@pink, 8), 20, relative);\n@brownFocus           : saturate(darken(@brown, 8), 20, relative);\n\n@lightRedFocus        : saturate(darken(@lightRed, 8), 20, relative);\n@lightOrangeFocus     : saturate(darken(@lightOrange, 8), 20, relative);\n@lightYellowFocus     : saturate(darken(@lightYellow, 8), 20, relative);\n@lightOliveFocus      : saturate(darken(@lightOlive, 8), 20, relative);\n@lightGreenFocus      : saturate(darken(@lightGreen, 8), 20, relative);\n@lightTealFocus       : saturate(darken(@lightTeal, 8), 20, relative);\n@lightBlueFocus       : saturate(darken(@lightBlue, 8), 20, relative);\n@lightVioletFocus     : saturate(darken(@lightViolet, 8), 20, relative);\n@lightPurpleFocus     : saturate(darken(@lightPurple, 8), 20, relative);\n@lightPinkFocus       : saturate(darken(@lightPink, 8), 20, relative);\n@lightBrownFocus      : saturate(darken(@lightBrown, 8), 20, relative);\n@lightGreyFocus       : saturate(darken(@lightGrey, 8), 20, relative);\n@lightBlackFocus      : saturate(darken(@fullBlack, 8), 20, relative);\n\n/*---  Emotive  ---*/\n@positiveColorFocus   : saturate(darken(@positiveColor, 8), 20, relative);\n@negativeColorFocus   : saturate(darken(@negativeColor, 8), 20, relative);\n\n/*---  Brand   ---*/\n@facebookFocusColor   : saturate(darken(@facebookColor, 8), 20, relative);\n@twitterFocusColor    : saturate(darken(@twitterColor, 8), 20, relative);\n@googlePlusFocusColor : saturate(darken(@googlePlusColor, 8), 20, relative);\n@linkedInFocusColor   : saturate(darken(@linkedInColor, 8), 20, relative);\n@youtubeFocusColor    : saturate(darken(@youtubeColor, 8), 20, relative);\n@instagramFocusColor  : saturate(darken(@instagramColor, 8), 20, relative);\n@pinterestFocusColor  : saturate(darken(@pinterestColor, 8), 20, relative);\n@vkFocusColor         : saturate(darken(@vkColor, 8), 20, relative);\n\n/*---  Dark Tones  ---*/\n@fullBlackFocus       : lighten(@fullBlack, 8);\n@blackFocus           : lighten(@black, 8);\n@greyFocus            : lighten(@grey, 8);\n\n/*---  Light Tones  ---*/\n@whiteFocus           : darken(@white, 8);\n@offWhiteFocus        : darken(@offWhite, 8);\n@darkWhiteFocus       : darken(@darkWhite, 8);\n\n\n/*-------------------\n    Down (:active)\n--------------------*/\n\n/*---  Colors  ---*/\n@primaryColorDown    : darken(@primaryColor, 10);\n@secondaryColorDown  : lighten(@secondaryColor, 10);\n\n@redDown             : darken(@red, 10);\n@orangeDown          : darken(@orange, 10);\n@yellowDown          : darken(@yellow, 10);\n@oliveDown           : darken(@olive, 10);\n@greenDown           : darken(@green, 10);\n@tealDown            : darken(@teal, 10);\n@blueDown            : darken(@blue, 10);\n@violetDown          : darken(@violet, 10);\n@purpleDown          : darken(@purple, 10);\n@pinkDown            : darken(@pink, 10);\n@brownDown           : darken(@brown, 10);\n\n@lightRedDown        : darken(@lightRed, 10);\n@lightOrangeDown     : darken(@lightOrange, 10);\n@lightYellowDown     : darken(@lightYellow, 10);\n@lightOliveDown      : darken(@lightOlive, 10);\n@lightGreenDown      : darken(@lightGreen, 10);\n@lightTealDown       : darken(@lightTeal, 10);\n@lightBlueDown       : darken(@lightBlue, 10);\n@lightVioletDown     : darken(@lightViolet, 10);\n@lightPurpleDown     : darken(@lightPurple, 10);\n@lightPinkDown       : darken(@lightPink, 10);\n@lightBrownDown      : darken(@lightBrown, 10);\n@lightGreyDown       : darken(@lightGrey, 10);\n@lightBlackDown      : darken(@fullBlack, 10);\n\n/*---  Emotive  ---*/\n@positiveColorDown   : darken(@positiveColor, 10);\n@negativeColorDown   : darken(@negativeColor, 10);\n\n/*---  Brand   ---*/\n@facebookDownColor   : darken(@facebookColor, 10);\n@twitterDownColor    : darken(@twitterColor, 10);\n@googlePlusDownColor : darken(@googlePlusColor, 10);\n@linkedInDownColor   : darken(@linkedInColor, 10);\n@youtubeDownColor    : darken(@youtubeColor, 10);\n@instagramDownColor  : darken(@instagramColor, 10);\n@pinterestDownColor  : darken(@pinterestColor, 10);\n@vkDownColor         : darken(@vkColor, 10);\n\n/*---  Dark Tones  ---*/\n@fullBlackDown       : lighten(@fullBlack, 10);\n@blackDown           : lighten(@black, 10);\n@greyDown            : lighten(@grey, 10);\n\n/*---  Light Tones  ---*/\n@whiteDown           : darken(@white, 10);\n@offWhiteDown        : darken(@offWhite, 10);\n@darkWhiteDown       : darken(@darkWhite, 10);\n\n\n/*-------------------\n        Active\n--------------------*/\n\n/*---  Colors  ---*/\n@primaryColorActive    : saturate(darken(@primaryColor, 5), 15, relative);\n@secondaryColorActive  : saturate(lighten(@secondaryColor, 5), 15, relative);\n\n@redActive             : saturate(darken(@red, 5), 15, relative);\n@orangeActive          : saturate(darken(@orange, 5), 15, relative);\n@yellowActive          : saturate(darken(@yellow, 5), 15, relative);\n@oliveActive           : saturate(darken(@olive, 5), 15, relative);\n@greenActive           : saturate(darken(@green, 5), 15, relative);\n@tealActive            : saturate(darken(@teal, 5), 15, relative);\n@blueActive            : saturate(darken(@blue, 5), 15, relative);\n@violetActive          : saturate(darken(@violet, 5), 15, relative);\n@purpleActive          : saturate(darken(@purple, 5), 15, relative);\n@pinkActive            : saturate(darken(@pink, 5), 15, relative);\n@brownActive           : saturate(darken(@brown, 5), 15, relative);\n\n@lightRedActive        : saturate(darken(@lightRed, 5), 15, relative);\n@lightOrangeActive     : saturate(darken(@lightOrange, 5), 15, relative);\n@lightYellowActive     : saturate(darken(@lightYellow, 5), 15, relative);\n@lightOliveActive      : saturate(darken(@lightOlive, 5), 15, relative);\n@lightGreenActive      : saturate(darken(@lightGreen, 5), 15, relative);\n@lightTealActive       : saturate(darken(@lightTeal, 5), 15, relative);\n@lightBlueActive       : saturate(darken(@lightBlue, 5), 15, relative);\n@lightVioletActive     : saturate(darken(@lightViolet, 5), 15, relative);\n@lightPurpleActive     : saturate(darken(@lightPurple, 5), 15, relative);\n@lightPinkActive       : saturate(darken(@lightPink, 5), 15, relative);\n@lightBrownActive      : saturate(darken(@lightBrown, 5), 15, relative);\n@lightGreyActive       : saturate(darken(@lightGrey, 5), 15, relative);\n@lightBlackActive      : saturate(darken(@fullBlack, 5), 15, relative);\n\n/*---  Emotive  ---*/\n@positiveColorActive   : saturate(darken(@positiveColor, 5), 15, relative);\n@negativeColorActive   : saturate(darken(@negativeColor, 5), 15, relative);\n\n/*---  Brand   ---*/\n@facebookActiveColor   : saturate(darken(@facebookColor, 5), 15, relative);\n@twitterActiveColor    : saturate(darken(@twitterColor, 5), 15, relative);\n@googlePlusActiveColor : saturate(darken(@googlePlusColor, 5), 15, relative);\n@linkedInActiveColor   : saturate(darken(@linkedInColor, 5), 15, relative);\n@youtubeActiveColor    : saturate(darken(@youtubeColor, 5), 15, relative);\n@instagramActiveColor  : saturate(darken(@instagramColor, 5), 15, relative);\n@pinterestActiveColor  : saturate(darken(@pinterestColor, 5), 15, relative);\n@vkActiveColor         : saturate(darken(@vkColor, 5), 15, relative);\n\n/*---  Dark Tones  ---*/\n@fullBlackActive       : darken(@fullBlack, 5);\n@blackActive           : darken(@black, 5);\n@greyActive            : darken(@grey, 5);\n\n/*---  Light Tones  ---*/\n@whiteActive           : darken(@white, 5);\n@offWhiteActive        : darken(@offWhite, 5);\n@darkWhiteActive       : darken(@darkWhite, 5);\n"
  },
  {
    "path": "semantic/src/themes/default/modules/accordion.overrides",
    "content": "/*******************************\n         Theme Overrides\n*******************************/\n@font-face {\n  font-family: 'Accordion';\n  src:\n    url(data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMggjB5AAAAC8AAAAYGNtYXAPfOIKAAABHAAAAExnYXNwAAAAEAAAAWgAAAAIZ2x5Zryj6HgAAAFwAAAAyGhlYWT/0IhHAAACOAAAADZoaGVhApkB5wAAAnAAAAAkaG10eAJuABIAAAKUAAAAGGxvY2EAjABWAAACrAAAAA5tYXhwAAgAFgAAArwAAAAgbmFtZfC1n04AAALcAAABPHBvc3QAAwAAAAAEGAAAACAAAwIAAZAABQAAAUwBZgAAAEcBTAFmAAAA9QAZAIQAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADw2gHg/+D/4AHgACAAAAABAAAAAAAAAAAAAAAgAAAAAAACAAAAAwAAABQAAwABAAAAFAAEADgAAAAKAAgAAgACAAEAIPDa//3//wAAAAAAIPDZ//3//wAB/+MPKwADAAEAAAAAAAAAAAAAAAEAAf//AA8AAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQASAEkAtwFuABMAADc0PwE2FzYXFh0BFAcGJwYvASY1EgaABQgHBQYGBQcIBYAG2wcGfwcBAQcECf8IBAcBAQd/BgYAAAAAAQAAAEkApQFuABMAADcRNDc2MzIfARYVFA8BBiMiJyY1AAUGBwgFgAYGgAUIBwYFWwEACAUGBoAFCAcFgAYGBQcAAAABAAAAAQAAqWYls18PPPUACwIAAAAAAM/9o+4AAAAAz/2j7gAAAAAAtwFuAAAACAACAAAAAAAAAAEAAAHg/+AAAAIAAAAAAAC3AAEAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAQAAAAC3ABIAtwAAAAAAAAAKABQAHgBCAGQAAAABAAAABgAUAAEAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAADgCuAAEAAAAAAAEADAAAAAEAAAAAAAIADgBAAAEAAAAAAAMADAAiAAEAAAAAAAQADABOAAEAAAAAAAUAFgAMAAEAAAAAAAYABgAuAAEAAAAAAAoANABaAAMAAQQJAAEADAAAAAMAAQQJAAIADgBAAAMAAQQJAAMADAAiAAMAAQQJAAQADABOAAMAAQQJAAUAFgAMAAMAAQQJAAYADAA0AAMAAQQJAAoANABaAHIAYQB0AGkAbgBnAFYAZQByAHMAaQBvAG4AIAAxAC4AMAByAGEAdABpAG4AZ3JhdGluZwByAGEAdABpAG4AZwBSAGUAZwB1AGwAYQByAHIAYQB0AGkAbgBnAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA) format('truetype'),\n    url(data:application/font-woff;charset=utf-8;base64,d09GRk9UVE8AAASwAAoAAAAABGgAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABDRkYgAAAA9AAAAS0AAAEtFpovuE9TLzIAAAIkAAAAYAAAAGAIIweQY21hcAAAAoQAAABMAAAATA984gpnYXNwAAAC0AAAAAgAAAAIAAAAEGhlYWQAAALYAAAANgAAADb/0IhHaGhlYQAAAxAAAAAkAAAAJAKZAedobXR4AAADNAAAABgAAAAYAm4AEm1heHAAAANMAAAABgAAAAYABlAAbmFtZQAAA1QAAAE8AAABPPC1n05wb3N0AAAEkAAAACAAAAAgAAMAAAEABAQAAQEBB3JhdGluZwABAgABADr4HAL4GwP4GAQeCgAZU/+Lix4KABlT/4uLDAeLa/iU+HQFHQAAAHkPHQAAAH4RHQAAAAkdAAABJBIABwEBBw0PERQZHnJhdGluZ3JhdGluZ3UwdTF1MjB1RjBEOXVGMERBAAACAYkABAAGAQEEBwoNVp38lA78lA78lA77lA773Z33bxWLkI2Qj44I9xT3FAWOj5CNkIuQi4+JjoePiI2Gi4YIi/uUBYuGiYeHiIiHh4mGi4aLho2Ijwj7FPcUBYeOiY+LkAgO+92L5hWL95QFi5CNkI6Oj4+PjZCLkIuQiY6HCPcU+xQFj4iNhouGi4aJh4eICPsU+xQFiIeGiYaLhouHjYePiI6Jj4uQCA74lBT4lBWLDAoAAAAAAwIAAZAABQAAAUwBZgAAAEcBTAFmAAAA9QAZAIQAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADw2gHg/+D/4AHgACAAAAABAAAAAAAAAAAAAAAgAAAAAAACAAAAAwAAABQAAwABAAAAFAAEADgAAAAKAAgAAgACAAEAIPDa//3//wAAAAAAIPDZ//3//wAB/+MPKwADAAEAAAAAAAAAAAAAAAEAAf//AA8AAQAAAAEAADfYOJZfDzz1AAsCAAAAAADP/aPuAAAAAM/9o+4AAAAAALcBbgAAAAgAAgAAAAAAAAABAAAB4P/gAAACAAAAAAAAtwABAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAEAAAAAtwASALcAAAAAUAAABgAAAAAADgCuAAEAAAAAAAEADAAAAAEAAAAAAAIADgBAAAEAAAAAAAMADAAiAAEAAAAAAAQADABOAAEAAAAAAAUAFgAMAAEAAAAAAAYABgAuAAEAAAAAAAoANABaAAMAAQQJAAEADAAAAAMAAQQJAAIADgBAAAMAAQQJAAMADAAiAAMAAQQJAAQADABOAAMAAQQJAAUAFgAMAAMAAQQJAAYADAA0AAMAAQQJAAoANABaAHIAYQB0AGkAbgBnAFYAZQByAHMAaQBvAG4AIAAxAC4AMAByAGEAdABpAG4AZ3JhdGluZwByAGEAdABpAG4AZwBSAGUAZwB1AGwAYQByAHIAYQB0AGkAbgBnAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA) format('woff')\n  ;\n  font-weight: normal;\n  font-style: normal;\n}\n\n/* Dropdown Icon */\n.ui.accordion .title .dropdown.icon,\n.ui.accordion .accordion .title .dropdown.icon {\n  font-family: Accordion;\n  line-height: 1;\n  backface-visibility: hidden;\n  font-weight: normal;\n  font-style: normal;\n  text-align: center;\n}\n\n.ui.accordion .title .dropdown.icon:before,\n.ui.accordion .accordion .title .dropdown.icon:before {\n  content: '\\f0da'/*rtl:'\\f0d9'*/;\n}\n"
  },
  {
    "path": "semantic/src/themes/default/modules/accordion.variables",
    "content": "/*******************************\n           Accordion\n*******************************/\n\n@boxShadow: none;\n\n/* Title */\n@titleFont: @headerFont;\n@titlePadding: 0.5em 0em;\n@titleFontSize: 1em;\n@titleColor: @textColor;\n\n/* Icon */\n@iconOpacity: 1;\n@iconFontSize: 1em;\n@iconFloat: none;\n@iconWidth: 1.25em;\n@iconHeight: 1em;\n@iconDisplay: inline-block;\n@iconMargin: 0em 0.25rem 0em 0rem;\n@iconPadding: 0em;\n@iconTransition:\n  transform @defaultDuration @defaultEasing,\n  opacity @defaultDuration @defaultEasing\n;\n@iconVerticalAlign: baseline;\n@iconTransform: none;\n\n/* Child Accordion */\n@childAccordionMargin: 1em 0em 0em;\n@childAccordionPadding: 0em;\n\n/* Content */\n@contentMargin: '';\n@contentPadding: 0.5em 0em 1em;\n\n/*-------------------\n       Coupling\n--------------------*/\n\n@menuTitlePadding: 0em;\n@menuIconFloat: right;\n@menuIconMargin: @lineHeightOffset 0em 0em 1em;\n@menuIconTransform: rotate(180deg);\n\n\n/*-------------------\n       States\n--------------------*/\n\n@activeIconTransform: rotate(90deg);\n\n/*-------------------\n      Variations\n--------------------*/\n\n/* Styled */\n@styledWidth: 600px;\n@styledBackground: @white;\n@styledBorderRadius: @defaultBorderRadius;\n@styledBoxShadow:\n  @subtleShadow,\n  0px 0px 0px 1px @borderColor\n;\n\n/* Content */\n@styledContentMargin: 0em;\n@styledContentPadding: 0.5em 1em 1.5em;\n\n/* Child Content */\n@styledChildContentMargin: 0em;\n@styledChildContentPadding: @styledContentPadding;\n\n/* Styled Title */\n@styledTitleMargin: 0em;\n@styledTitlePadding: 0.75em 1em;\n@styledTitleFontWeight: @bold;\n@styledTitleColor: @unselectedTextColor;\n@styledTitleTransition: background-color @defaultDuration @defaultEasing;\n@styledTitleBorder: 1px solid @borderColor;\n@styledTitleTransition:\n  background @defaultDuration @defaultEasing,\n  color @defaultDuration @defaultEasing\n;\n\n/* Styled Title States */\n@styledTitleHoverBackground: transparent;\n@styledTitleHoverColor: @textColor;\n@styledActiveTitleBackground: transparent;\n@styledActiveTitleColor: @selectedTextColor;\n\n/* Styled Child Title States */\n@styledHoverChildTitleBackground: @styledTitleHoverBackground;\n@styledHoverChildTitleColor: @styledTitleHoverColor;\n@styledActiveChildTitleBackground: @styledActiveTitleBackground;\n@styledActiveChildTitleColor: @styledActiveTitleColor;\n\n/* Inverted */\n@invertedTitleColor: @invertedTextColor;\n\n"
  },
  {
    "path": "semantic/src/themes/default/modules/chatroom.overrides",
    "content": "/*******************************\n         Theme Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/themes/default/modules/chatroom.variables",
    "content": "/*******************************\n            Chatroom\n*******************************/"
  },
  {
    "path": "semantic/src/themes/default/modules/checkbox.overrides",
    "content": "/*******************************\n         Theme Overrides\n*******************************/\n\n@font-face {\n  font-family: 'Checkbox';\n  src:\n    url(data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBD8AAAC8AAAAYGNtYXAYVtCJAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5Zn4huwUAAAF4AAABYGhlYWQGPe1ZAAAC2AAAADZoaGVhB30DyAAAAxAAAAAkaG10eBBKAEUAAAM0AAAAHGxvY2EAmgESAAADUAAAABBtYXhwAAkALwAAA2AAAAAgbmFtZSC8IugAAAOAAAABknBvc3QAAwAAAAAFFAAAACAAAwMTAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADoAgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6AL//f//AAAAAAAg6AD//f//AAH/4xgEAAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAEUAUQO7AvgAGgAAARQHAQYjIicBJjU0PwE2MzIfAQE2MzIfARYVA7sQ/hQQFhcQ/uMQEE4QFxcQqAF2EBcXEE4QAnMWEP4UEBABHRAXFhBOEBCoAXcQEE4QFwAAAAABAAABbgMlAkkAFAAAARUUBwYjISInJj0BNDc2MyEyFxYVAyUQEBf9SRcQEBAQFwK3FxAQAhJtFxAQEBAXbRcQEBAQFwAAAAABAAAASQMlA24ALAAAARUUBwYrARUUBwYrASInJj0BIyInJj0BNDc2OwE1NDc2OwEyFxYdATMyFxYVAyUQEBfuEBAXbhYQEO4XEBAQEBfuEBAWbhcQEO4XEBACEm0XEBDuFxAQEBAX7hAQF20XEBDuFxAQEBAX7hAQFwAAAQAAAAIAAHRSzT9fDzz1AAsEAAAAAADRsdR3AAAAANGx1HcAAAAAA7sDbgAAAAgAAgAAAAAAAAABAAADwP/AAAAEAAAAAAADuwABAAAAAAAAAAAAAAAAAAAABwQAAAAAAAAAAAAAAAIAAAAEAABFAyUAAAMlAAAAAAAAAAoAFAAeAE4AcgCwAAEAAAAHAC0AAQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAOAK4AAQAAAAAAAQAIAAAAAQAAAAAAAgAHAGkAAQAAAAAAAwAIADkAAQAAAAAABAAIAH4AAQAAAAAABQALABgAAQAAAAAABgAIAFEAAQAAAAAACgAaAJYAAwABBAkAAQAQAAgAAwABBAkAAgAOAHAAAwABBAkAAwAQAEEAAwABBAkABAAQAIYAAwABBAkABQAWACMAAwABBAkABgAQAFkAAwABBAkACgA0ALBDaGVja2JveABDAGgAZQBjAGsAYgBvAHhWZXJzaW9uIDIuMABWAGUAcgBzAGkAbwBuACAAMgAuADBDaGVja2JveABDAGgAZQBjAGsAYgBvAHhDaGVja2JveABDAGgAZQBjAGsAYgBvAHhSZWd1bGFyAFIAZQBnAHUAbABhAHJDaGVja2JveABDAGgAZQBjAGsAYgBvAHhGb250IGdlbmVyYXRlZCBieSBJY29Nb29uLgBGAG8AbgB0ACAAZwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABJAGMAbwBNAG8AbwBuAC4AAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA) format('truetype')\n  ;\n}\n\n/* Checkmark */\n.ui.checkbox label:after,\n.ui.checkbox .box:after {\n  font-family: 'Checkbox';\n}\n\n/* Checked */\n.ui.checkbox input:checked ~ .box:after,\n.ui.checkbox input:checked ~ label:after {\n  content: '\\e800';\n}\n\n/* Indeterminate */\n.ui.checkbox input:indeterminate ~ .box:after,\n.ui.checkbox input:indeterminate ~ label:after {\n  font-size: 12px;\n  content: '\\e801';\n}\n\n\n/*  UTF Reference\n.check:before { content: '\\e800'; }\n.dash:before  { content: '\\e801'; }\n.plus:before { content: '\\e802'; }\n*/\n"
  },
  {
    "path": "semantic/src/themes/default/modules/checkbox.variables",
    "content": "/*******************************\n            Checkbox\n*******************************/\n\n@checkboxSize: 17px;\n@checkboxColor: @textColor;\n@checkboxLineHeight: @checkboxSize;\n\n\n/* Label */\n@labelDistance: 1.85714em; /* 26px @ 14/em */\n\n/* Checkbox */\n@checkboxBackground: @white;\n@checkboxBorder: 1px solid @solidBorderColor;\n@checkboxBorderRadius: @3px;\n@checkboxTransition:\n  border @defaultDuration @defaultEasing,\n  opacity @defaultDuration @defaultEasing,\n  transform @defaultDuration @defaultEasing,\n  box-shadow @defaultDuration @defaultEasing\n;\n\n/* Checkmark */\n@checkboxCheckFontSize: 14px;\n@checkboxCheckTop: 0px;\n@checkboxCheckLeft: 0px;\n@checkboxCheckSize: @checkboxSize;\n\n/* Label */\n@labelFontSize: @relativeMedium;\n@labelColor: @textColor;\n@labelTransition: color @defaultDuration @defaultEasing;\n\n/*-------------------\n        States\n--------------------*/\n\n/* Hover */\n@checkboxHoverBackground: @checkboxBackground;\n@checkboxHoverBorderColor: @selectedBorderColor;\n@labelHoverColor: @hoveredTextColor;\n\n/* Pressed */\n@checkboxPressedBackground: @offWhite;\n@checkboxPressedBorderColor: @selectedBorderColor;\n@checkboxPressedColor: @selectedTextColor;\n@labelPressedColor: @selectedTextColor;\n\n/* Focus */\n@checkboxFocusBackground: @white;\n@checkboxFocusBorderColor: @focusedFormMutedBorderColor;\n@checkboxFocusCheckColor: @selectedTextColor;\n@labelFocusColor: @selectedTextColor;\n\n/* Active */\n@labelActiveColor: @selectedTextColor;\n@checkboxActiveBackground: @white;\n@checkboxActiveBorderColor: @selectedBorderColor;\n@checkboxActiveCheckColor: @selectedTextColor;\n@checkboxActiveCheckOpacity: 1;\n\n/* Active Focus */\n@checkboxActiveFocusBackground: @white;\n@checkboxActiveFocusBorderColor: @checkboxFocusBorderColor;\n@checkboxActiveFocusCheckColor: @selectedTextColor;\n\n/* Indeterminate */\n@checkboxIndeterminateBackground: @checkboxActiveBackground;\n@checkboxIndeterminateBorderColor: @checkboxActiveBorderColor;\n@checkboxIndeterminateCheckOpacity: 1;\n@checkboxIndeterminateCheckColor: @checkboxActiveCheckColor;\n\n/* Disabled */\n@disabledCheckboxOpacity: 0.5;\n@disabledCheckboxLabelColor: rgba(0, 0, 0, 1);\n\n/*-------------------\n        Types\n--------------------*/\n\n/* Radio */\n/* Uses px to avoid rounding issues with circles */\n\n@radioSize: 15px;\n@radioTop: 1px;\n@radioLeft: 0px;\n@radioLabelDistance: @labelDistance;\n\n@bulletTop: 1px;\n@bulletLeft: 0px;\n@bulletScale: (7 / 15); /* 7px as unitless value from radio size */\n@bulletColor: @textColor;\n@bulletRadius: @circularRadius;\n\n@radioFocusBackground: @checkboxFocusBackground;\n@radioFocusBulletColor: @checkboxFocusCheckColor;\n\n@radioActiveBackground: @checkboxActiveBackground;\n@radioActiveBulletColor: @checkboxActiveCheckColor;\n\n@radioActiveFocusBackground: @checkboxActiveFocusBackground;\n@radioActiveFocusBulletColor: @checkboxActiveFocusCheckColor;\n\n/* Slider & Toggle Handle */\n@handleBackground: @white @subtleGradient;\n@handleBoxShadow:\n  @subtleShadow,\n  0px 0px 0px 1px @borderColor inset\n;\n\n/* Slider */\n@sliderHandleSize: 1.5rem;\n@sliderLineWidth: 3.5rem;\n@sliderTransitionDuration: 0.3s;\n\n@sliderHandleOffset: (1rem - @sliderHandleSize) / 2;\n@sliderHandleTransition: left @sliderTransitionDuration @defaultEasing;\n\n@sliderWidth: @sliderLineWidth;\n@sliderHeight: (@sliderHandleSize + @sliderHandleOffset);\n\n@sliderLineHeight: @3px;\n@sliderLineVerticalOffset: 0.4rem;\n@sliderLineColor: @transparentBlack;\n@sliderLineRadius: @circularRadius;\n@sliderLineTransition: background @sliderTransitionDuration @defaultEasing;\n\n@sliderTravelDistance: @sliderLineWidth - @sliderHandleSize;\n\n@sliderLabelDistance: @sliderLineWidth + 1rem;\n@sliderOffLabelColor: @unselectedTextColor;\n\n@sliderLabelLineHeight: 1rem;\n\n/* Slider States */\n@sliderHoverLaneBackground: @veryStrongTransparentBlack;\n@sliderHoverLabelColor: @hoveredTextColor;\n\n@sliderOnLineColor: @lightBlack;\n@sliderOnLabelColor: @selectedTextColor;\n\n@sliderOnFocusLineColor: @lightBlackFocus;\n@sliderOnFocusLabelColor: @sliderOnLabelColor;\n\n\n\n/* Toggle */\n@toggleLaneWidth: 3.5rem;\n@toggleHandleSize: 1.5rem;\n@toggleTransitionDuration: 0.2s;\n\n@toggleWidth: @toggleLaneWidth;\n@toggleHeight: @toggleHandleSize;\n\n@toggleHandleRadius: @circularRadius;\n@toggleHandleOffset: 0rem;\n@toggleHandleTransition:\n  background @sliderTransitionDuration @defaultEasing,\n  left @sliderTransitionDuration @defaultEasing\n;\n\n@toggleLaneBackground: @transparentBlack;\n@toggleLaneHeight: @toggleHandleSize;\n@toggleLaneBoxShadow: none;\n@toggleLaneVerticalOffset: 0rem;\n@toggleOffOffset: -0.05rem;\n@toggleOnOffset: (@toggleLaneWidth - @toggleHandleSize) + 0.15rem;\n\n@toggleLabelDistance: @toggleLaneWidth + 1rem;\n@toggleLabelLineHeight: 1.5rem;\n@toggleLabelOffset: 0.15em;\n\n\n@toggleFocusColor: @veryStrongTransparentBlack;\n@toggleHoverColor: @toggleFocusColor;\n\n@toggleOffLabelColor: @checkboxColor;\n@toggleOffHandleBoxShadow: @handleBoxShadow;\n\n@toggleOnLabelColor: @selectedTextColor;\n@toggleOnLaneColor: @primaryColor;\n\n@toggleOnHandleBoxShadow: @handleBoxShadow;\n\n@toggleOnFocusLaneColor: @primaryColorFocus;\n@toggleOnFocusLabelColor: @toggleOnLabelColor;\n\n\n\n/*-------------------\n      Variations\n--------------------*/\n"
  },
  {
    "path": "semantic/src/themes/default/modules/dimmer.overrides",
    "content": "/*******************************\n         Theme Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/themes/default/modules/dimmer.variables",
    "content": "/*******************************\n            Dimmer\n*******************************/\n\n@dimmablePosition: relative;\n@dimmerPosition: absolute;\n\n@backgroundColor: rgba(0, 0, 0 , 0.85);\n@lineHeight: 1;\n@perspective: 2000px;\n@padding: 1em;\n\n@duration: 0.5s;\n@transition:\n  background-color @duration linear\n;\n@zIndex: 1000;\n@textAlign: center;\n@verticalAlign: middle;\n@textColor: @white;\n@overflow: hidden;\n\n@blurredStartFilter: ~\"blur(0px) grayscale(0)\";\n@blurredEndFilter: ~\"blur(5px) grayscale(0.7)\";\n@blurredTransition: 800ms filter @defaultEasing;\n\n@blurredBackgroundColor: rgba(0, 0, 0, 0.6);\n@blurredInvertedBackgroundColor: rgba(255, 255, 255, 0.6);\n\n/* Hidden (Default) */\n@hiddenOpacity: 0;\n\n/* Visible */\n@visibleOpacity: 1;\n\n/*-------------------\n        Types\n--------------------*/\n\n/* Page Dimmer*/\n@transformStyle: '';\n@pageDimmerPosition: fixed;\n\n\n/*-------------------\n      Variations\n--------------------*/\n\n/* Inverted */\n@invertedBackgroundColor: rgba(255, 255, 255, 0.85);\n@invertedTextColor: @textColor;\n\n/* Simple */\n@simpleZIndex: 1;\n@simpleStartBackgroundColor: rgba(0, 0, 0, 0);\n@simpleEndBackgroundColor: @backgroundColor;\n@simpleInvertedStartBackgroundColor: rgba(255, 255, 255, 0);\n@simpleInvertedEndBackgroundColor: @invertedBackgroundColor;\n"
  },
  {
    "path": "semantic/src/themes/default/modules/dropdown.overrides",
    "content": "/*******************************\n         Theme Overrides\n*******************************/\n\n/* Dropdown Carets */\n@font-face {\n  font-family: 'Dropdown';\n  src:\n    url(data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMggjB5AAAAC8AAAAYGNtYXAPfuIIAAABHAAAAExnYXNwAAAAEAAAAWgAAAAIZ2x5Zjo82LgAAAFwAAABVGhlYWQAQ88bAAACxAAAADZoaGVhAwcB6QAAAvwAAAAkaG10eAS4ABIAAAMgAAAAIGxvY2EBNgDeAAADQAAAABJtYXhwAAoAFgAAA1QAAAAgbmFtZVcZpu4AAAN0AAABRXBvc3QAAwAAAAAEvAAAACAAAwIAAZAABQAAAUwBZgAAAEcBTAFmAAAA9QAZAIQAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADw2gHg/+D/4AHgACAAAAABAAAAAAAAAAAAAAAgAAAAAAACAAAAAwAAABQAAwABAAAAFAAEADgAAAAKAAgAAgACAAEAIPDa//3//wAAAAAAIPDX//3//wAB/+MPLQADAAEAAAAAAAAAAAAAAAEAAf//AA8AAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAIABJQElABMAABM0NzY3BTYXFhUUDwEGJwYvASY1AAUGBwEACAUGBoAFCAcGgAUBEgcGBQEBAQcECQYHfwYBAQZ/BwYAAQAAAG4BJQESABMAADc0PwE2MzIfARYVFAcGIyEiJyY1AAWABgcIBYAGBgUI/wAHBgWABwaABQWABgcHBgUFBgcAAAABABIASQC3AW4AEwAANzQ/ATYXNhcWHQEUBwYnBi8BJjUSBoAFCAcFBgYFBwgFgAbbBwZ/BwEBBwQJ/wgEBwEBB38GBgAAAAABAAAASQClAW4AEwAANxE0NzYzMh8BFhUUDwEGIyInJjUABQYHCAWABgaABQgHBgVbAQAIBQYGgAUIBwWABgYFBwAAAAEAAAABAADZuaKOXw889QALAgAAAAAA0ABHWAAAAADQAEdYAAAAAAElAW4AAAAIAAIAAAAAAAAAAQAAAeD/4AAAAgAAAAAAASUAAQAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAABAAAAASUAAAElAAAAtwASALcAAAAAAAAACgAUAB4AQgBkAIgAqgAAAAEAAAAIABQAAQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAOAK4AAQAAAAAAAQAOAAAAAQAAAAAAAgAOAEcAAQAAAAAAAwAOACQAAQAAAAAABAAOAFUAAQAAAAAABQAWAA4AAQAAAAAABgAHADIAAQAAAAAACgA0AGMAAwABBAkAAQAOAAAAAwABBAkAAgAOAEcAAwABBAkAAwAOACQAAwABBAkABAAOAFUAAwABBAkABQAWAA4AAwABBAkABgAOADkAAwABBAkACgA0AGMAaQBjAG8AbQBvAG8AbgBWAGUAcgBzAGkAbwBuACAAMQAuADAAaQBjAG8AbQBvAG8Abmljb21vb24AaQBjAG8AbQBvAG8AbgBSAGUAZwB1AGwAYQByAGkAYwBvAG0AbwBvAG4ARgBvAG4AdAAgAGcAZQBuAGUAcgBhAHQAZQBkACAAYgB5ACAASQBjAG8ATQBvAG8AbgAuAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=) format('truetype'),\n    url(data:application/font-woff;charset=utf-8;base64,d09GRk9UVE8AAAVwAAoAAAAABSgAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABDRkYgAAAA9AAAAdkAAAHZLDXE/09TLzIAAALQAAAAYAAAAGAIIweQY21hcAAAAzAAAABMAAAATA9+4ghnYXNwAAADfAAAAAgAAAAIAAAAEGhlYWQAAAOEAAAANgAAADYAQ88baGhlYQAAA7wAAAAkAAAAJAMHAelobXR4AAAD4AAAACAAAAAgBLgAEm1heHAAAAQAAAAABgAAAAYACFAAbmFtZQAABAgAAAFFAAABRVcZpu5wb3N0AAAFUAAAACAAAAAgAAMAAAEABAQAAQEBCGljb21vb24AAQIAAQA6+BwC+BsD+BgEHgoAGVP/i4seCgAZU/+LiwwHi2v4lPh0BR0AAACIDx0AAACNER0AAAAJHQAAAdASAAkBAQgPERMWGyAlKmljb21vb25pY29tb29udTB1MXUyMHVGMEQ3dUYwRDh1RjBEOXVGMERBAAACAYkABgAIAgABAAQABwAKAA0AVgCfAOgBL/yUDvyUDvyUDvuUDvtvi/emFYuQjZCOjo+Pj42Qiwj3lIsFkIuQiY6Hj4iNhouGi4aJh4eHCPsU+xQFiIiGiYaLhouHjYeOCPsU9xQFiI+Jj4uQCA77b4v3FBWLkI2Pjo8I9xT3FAWPjo+NkIuQi5CJjogI9xT7FAWPh42Hi4aLhomHh4eIiIaJhosI+5SLBYaLh42HjoiPiY+LkAgO+92d928Vi5CNkI+OCPcU9xQFjo+QjZCLkIuPiY6Hj4iNhouGCIv7lAWLhomHh4iIh4eJhouGi4aNiI8I+xT3FAWHjomPi5AIDvvdi+YVi/eUBYuQjZCOjo+Pj42Qi5CLkImOhwj3FPsUBY+IjYaLhouGiYeHiAj7FPsUBYiHhomGi4aLh42Hj4iOiY+LkAgO+JQU+JQViwwKAAAAAAMCAAGQAAUAAAFMAWYAAABHAUwBZgAAAPUAGQCEAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAA8NoB4P/g/+AB4AAgAAAAAQAAAAAAAAAAAAAAIAAAAAAAAgAAAAMAAAAUAAMAAQAAABQABAA4AAAACgAIAAIAAgABACDw2v/9//8AAAAAACDw1//9//8AAf/jDy0AAwABAAAAAAAAAAAAAAABAAH//wAPAAEAAAABAAA5emozXw889QALAgAAAAAA0ABHWAAAAADQAEdYAAAAAAElAW4AAAAIAAIAAAAAAAAAAQAAAeD/4AAAAgAAAAAAASUAAQAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAABAAAAASUAAAElAAAAtwASALcAAAAAUAAACAAAAAAADgCuAAEAAAAAAAEADgAAAAEAAAAAAAIADgBHAAEAAAAAAAMADgAkAAEAAAAAAAQADgBVAAEAAAAAAAUAFgAOAAEAAAAAAAYABwAyAAEAAAAAAAoANABjAAMAAQQJAAEADgAAAAMAAQQJAAIADgBHAAMAAQQJAAMADgAkAAMAAQQJAAQADgBVAAMAAQQJAAUAFgAOAAMAAQQJAAYADgA5AAMAAQQJAAoANABjAGkAYwBvAG0AbwBvAG4AVgBlAHIAcwBpAG8AbgAgADEALgAwAGkAYwBvAG0AbwBvAG5pY29tb29uAGkAYwBvAG0AbwBvAG4AUgBlAGcAdQBsAGEAcgBpAGMAbwBtAG8AbwBuAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA) format('woff')\n  ;\n  font-weight: normal;\n  font-style: normal;\n}\n\n.ui.dropdown > .dropdown.icon {\n  font-family: 'Dropdown';\n  line-height: 1;\n  height: 1em;\n  width: 1.23em;\n  backface-visibility: hidden;\n  font-weight: normal;\n  font-style: normal;\n  text-align: center;\n}\n\n.ui.dropdown > .dropdown.icon {\n  width: auto;\n}\n.ui.dropdown > .dropdown.icon:before {\n  content: '\\f0d7';\n}\n\n/* Sub Menu */\n.ui.dropdown .menu .item .dropdown.icon:before {\n  content: '\\f0da'/*rtl:'\\f0d9'*/;\n}\n\n.ui.dropdown .item .left.dropdown.icon:before,\n.ui.dropdown .left.menu .item .dropdown.icon:before {\n  content: \"\\f0d9\"/*rtl:\"\\f0da\"*/;\n}\n\n/* Vertical Menu Dropdown */\n.ui.vertical.menu .dropdown.item > .dropdown.icon:before {\n  content: \"\\f0da\"/*rtl:\"\\f0d9\"*/;\n}\n\n/* Icons for Reference\n.dropdown.down.icon {\n  content: \"\\f0d7\";\n}\n.dropdown.up.icon {\n  content: \"\\f0d8\";\n}\n.dropdown.left.icon {\n  content: \"\\f0d9\";\n}\n.dropdown.icon.icon {\n  content: \"\\f0da\";\n}\n*/\n"
  },
  {
    "path": "semantic/src/themes/default/modules/dropdown.variables",
    "content": "/*******************************\n            Dropdown\n*******************************/\n\n/*-------------------\n       Element\n--------------------*/\n\n@transition:\n  box-shadow @defaultDuration @defaultEasing,\n  width @defaultDuration @defaultEasing\n;\n@borderRadius: @defaultBorderRadius;\n\n@raisedShadow: 0px 2px 3px 0px @borderColor;\n\n/*-------------------\n       Content\n--------------------*/\n\n/* Icon */\n@dropdownIconSize: @relative12px;\n@dropdownIconMargin: 0em 0em 0em 1em;\n\n/* Current Text */\n@textTransition: none;\n\n/* Menu */\n@menuBackground: #FFFFFF;\n@menuMargin: 0em;\n@menuPadding: 0em 0em;\n@menuTop: 100%;\n@menuTextAlign: left;\n\n@menuBorderWidth: 1px;\n@menuBorderColor: @borderColor;\n@menuBorder: @menuBorderWidth solid @menuBorderColor;\n@menuBoxShadow: @raisedShadow;\n@menuBorderRadius: @borderRadius;\n@menuTransition: opacity @defaultDuration @defaultEasing;\n@menuMinWidth: ~\"calc(100% + \"(@menuBorderWidth * 2)~\")\";\n@menuZIndex: 11;\n\n/* Text */\n@textLineHeight: 1em;\n@textLineHeightOffset: (@textLineHeight - 1em);\n@textCursorSpacing: 1px;\n\n/* Menu Item */\n@itemFontSize: @medium;\n@itemTextAlign: left;\n@itemBorder: none;\n@itemHeight: auto;\n@itemDivider: none;\n@itemColor: @textColor;\n@itemVerticalPadding: @mini;\n@itemHorizontalPadding: @large;\n@itemPadding: @itemVerticalPadding @itemHorizontalPadding;\n@itemFontWeight: @normal;\n@itemLineHeight: 1em;\n@itemLineHeightOffset: (@itemLineHeight - 1em);\n@itemTextTransform: none;\n@itemBoxShadow: none;\n\n/* Sub Menu */\n@subMenuTop: 0%;\n@subMenuLeft: 100%;\n@subMenuRight: auto;\n@subMenuDistanceAway: -0.5em;\n@subMenuMargin: 0em 0em 0em @subMenuDistanceAway;\n@subMenuBorderRadius: @borderRadius;\n@subMenuZIndex: 21;\n\n/* Menu Header */\n@menuHeaderColor: @darkTextColor;\n@menuHeaderFontSize: @relative11px;\n@menuHeaderFontWeight: @bold;\n@menuHeaderTextTransform: uppercase;\n@menuHeaderMargin: 1rem 0rem 0.75rem;\n@menuHeaderPadding: 0em @itemHorizontalPadding;\n\n/* Menu Divider */\n@menuDividerMargin: 0.5em 0em;\n@menuDividerColor: @internalBorderColor;\n@menuDividerSize: 1px;\n@menuDividerBorder: @menuDividerSize solid @menuDividerColor;\n\n/* Menu Input */\n@menuInputMargin: @large @mini;\n@menuInputMinWidth: 10rem;\n@menuInputVerticalPadding: 0.5em;\n@menuInputHorizontalPadding: @inputHorizontalPadding;\n@menuInputPadding: @menuInputVerticalPadding @menuInputHorizontalPadding;\n\n/* Menu Image */\n@menuImageMaxHeight: 2em;\n@menuImageVerticalMargin: -(@menuImageMaxHeight - 1em) / 2;\n\n/* Item Sub-Element */\n@itemElementFloat: none;\n@itemElementDistance: @mini;\n\n/* Sub-Menu Dropdown Icon */\n@itemDropdownIconDistance: 1em;\n@itemDropdownIconFloat: right;\n@itemDropdownIconMargin: @itemLineHeightOffset 0em 0em @itemDropdownIconDistance;\n\n/* Description */\n@itemDescriptionFloat: right;\n@itemDescriptionMargin: 0em 0em 0em 1em;\n@itemDescriptionColor: @lightTextColor;\n\n/* Message */\n@messagePadding: @selectionItemPadding;\n@messageFontWeight: @normal;\n@messageColor: @unselectedTextColor;\n\n/* Floated Content */\n@floatedDistance: 1em;\n\n/*-------------------\n        Types\n--------------------*/\n\n/*------------\n   Selection\n--------------*/\n\n@selectionMinWidth: 14em;\n@selectionVerticalPadding: @inputVerticalPadding;\n@selectionHorizontalPadding: @inputHorizontalPadding;\n@selectionBorderEmWidth:  @relative1px;\n@selectionMinHeight: @inputLineHeight + (@selectionVerticalPadding * 2) - @selectionBorderEmWidth;\n@selectionBackground: @inputBackground;\n@selectionDisplay: inline-block;\n@selectionIconDistance: @inputHorizontalPadding + @glyphWidth;\n@selectionPadding: @selectionVerticalPadding @selectionIconDistance @selectionVerticalPadding @selectionHorizontalPadding;\n@selectionZIndex: 10;\n\n@selectionItemDivider: 1px solid @solidInternalBorderColor;\n@selectionMessagePadding: @selectionItemPadding;\n\n/* <select> */\n@selectBorder: 1px solid @borderColor;\n@selectPadding: 0.5em;\n@selectVisibility: visible;\n@selectHeight: 38px;\n\n@selectionTextColor: @textColor;\n\n@selectionTextUnderlayIconOpacity: @disabledOpacity;\n@selectionTextUnderlayColor: @inputPlaceholderFocusColor;\n\n@selectionBoxShadow: none;\n@selectionBorderColor: @borderColor;\n@selectionBorder: 1px solid @selectionBorderColor;\n@selectionBorderRadius: @borderRadius;\n\n@selectionIconOpacity: 0.8;\n@selectionIconZIndex: 3;\n@selectionIconHitbox: @selectionVerticalPadding;\n@selectionIconMargin: -@selectionIconHitbox;\n@selectionIconPadding: @selectionIconHitbox / @dropdownIconSize;\n@selectionIconTransition: opacity @defaultDuration @defaultEasing;\n\n@selectionMenuBorderRadius: 0em 0em @borderRadius @borderRadius;\n@selectionMenuBoxShadow: @raisedShadow;\n@selectionMenuItemBoxShadow: none;\n\n@selectionItemHorizontalPadding: @itemHorizontalPadding;\n@selectionItemVerticalPadding: @itemVerticalPadding;\n@selectionItemPadding: @selectionItemVerticalPadding @selectionItemHorizontalPadding;\n\n@selectionTransition: @transition;\n@selectionMenuTransition: @menuTransition;\n\n/* Responsive */\n@selectionMobileMaxItems: 3;\n@selectionTabletMaxItems: 4;\n@selectionComputerMaxItems: 6;\n@selectionWidescreenMaxItems: 8;\n\n/* Derived */\n@selectedBorderEMWidth: 0.1em; /* 1px / em size */\n@selectionItemHeight: (@selectionItemVerticalPadding * 2) + @itemLineHeight + @selectedBorderEMWidth;\n@selectionMobileMaxMenuHeight: (@selectionItemHeight * @selectionMobileMaxItems);\n@selectionTabletMaxMenuHeight: (@selectionItemHeight * @selectionTabletMaxItems);\n@selectionComputerMaxMenuHeight: (@selectionItemHeight * @selectionComputerMaxItems);\n@selectionWidescreenMaxMenuHeight: (@selectionItemHeight * @selectionWidescreenMaxItems);\n\n/* Hover */\n@selectionHoverBorderColor: @selectedBorderColor;\n@selectionHoverBoxShadow: none;\n\n/* Focus */\n@selectionFocusBorderColor: @focusedFormMutedBorderColor;\n@selectionFocusBoxShadow: none;\n@selectionFocusMenuBoxShadow: @raisedShadow;\n\n/* Visible */\n@selectionVisibleTextFontWeight: @normal;\n@selectionVisibleTextColor: @hoveredTextColor;\n\n@selectionVisibleBorderColor: @focusedFormMutedBorderColor;\n@selectionVisibleBoxShadow: @raisedShadow;\n@selectionVisibleMenuBoxShadow: @raisedShadow;\n\n/* Visible Hover */\n@selectionActiveHoverBorderColor: @focusedFormMutedBorderColor;\n@selectionActiveHoverBoxShadow: @selectionVisibleBoxShadow;\n@selectionActiveHoverMenuBoxShadow: @selectionVisibleMenuBoxShadow;\n\n@selectionVisibleConnectingBorder: 0em;\n@selectionVisibleIconOpacity: 1;\n\n/*--------------\n     Search\n--------------*/\n\n@searchMinWidth: '';\n\n/* Search Selection */\n@searchSelectionLineHeight: @inputLineHeight;\n@searchSelectionLineHeightOffset: ((@searchSelectionLineHeight - 1em) / 2);\n@searchSelectionVerticalPadding: (@selectionVerticalPadding - @searchSelectionLineHeightOffset);\n@searchSelectionHorizontalPadding: @selectionHorizontalPadding;\n@searchSelectionInputPadding: @searchSelectionVerticalPadding @selectionIconDistance @searchSelectionVerticalPadding @searchSelectionHorizontalPadding;\n\n@searchMobileMaxMenuHeight: @selectionMobileMaxMenuHeight;\n@searchTabletMaxMenuHeight: @selectionTabletMaxMenuHeight;\n@searchComputerMaxMenuHeight: @selectionComputerMaxMenuHeight;\n@searchWidescreenMaxMenuHeight: @selectionWidescreenMaxMenuHeight;\n\n/* Inline */\n@inlineIconMargin: 0em @relative7px 0em @relative3px;\n@inlineTextColor: inherit;\n@inlineTextFontWeight: @bold;\n@inlineMenuDistance: @relative3px;\n@inlineMenuBorderRadius: @borderRadius;\n\n\n/*--------------\n    Multiple\n--------------*/\n\n/* Split Actual Padding Between Child and Parent (allows for label spacing) */\n@multipleSelectionVerticalPadding: (@searchSelectionVerticalPadding * (1/3));\n@multipleSelectionLeftPadding: @relative5px;\n@multipleSelectionRightPadding: @selectionIconDistance;\n@multipleSelectionPadding: @multipleSelectionVerticalPadding @multipleSelectionRightPadding @multipleSelectionVerticalPadding @multipleSelectionLeftPadding;\n\n/* Child Elements */\n@multipleSelectionChildVerticalMargin: (@searchSelectionVerticalPadding * (2/3));\n@multipleSelectionChildLeftMargin: (@inputHorizontalPadding - @multipleSelectionLeftPadding);\n@multipleSelectionChildMargin: @multipleSelectionChildVerticalMargin 0em @multipleSelectionChildVerticalMargin @multipleSelectionChildLeftMargin;\n@multipleSelectionChildLineHeight: @relative17px;\n@multipleSelectionSearchStartWidth: (@glyphWidth * 2);\n\n/* Dropdown Icon */\n@multipleSelectionDropdownIconMargin: '';\n@multipleSelectionDropdownIconPadding: '';\n\n@multipleSelectionSearchAfterLabelDistance: @relative2px;\n\n/* Selection Label */\n@labelSize: @relativeMedium;\n@labelHorizontalMargin: @4px;\n@labelVerticalMargin: @2px;\n@labelMargin: @labelVerticalMargin @labelHorizontalMargin @labelVerticalMargin 0em;\n@labelBorderWidth: 1px;\n@labelBoxShadow: 0px 0px 0px @labelBorderWidth @borderColor inset;\n\n@labelVerticalPadding: @relative5px;\n@labelHorizontalPadding: @relativeMini;\n@labelPadding: @labelVerticalPadding @labelHorizontalPadding;\n\n/*-------------------\n       States\n--------------------*/\n\n/* Hovered */\n@hoveredItemBackground: @transparentBlack;\n@hoveredItemColor: @selectedTextColor;\n@hoveredZIndex: @menuZIndex + 2;\n\n/* Default Text */\n@defaultTextColor: @inputPlaceholderColor;\n@defaultTextFocusColor: @inputPlaceholderFocusColor;\n\n/* Loading */\n@loadingZIndex: -1;\n\n/* Active Menu Item */\n@activeItemZIndex: @menuZIndex + 1;\n@activeItemBackground: transparent;\n@activeItemBoxShadow: none;\n@activeItemFontWeight: @bold;\n@activeItemColor: @selectedTextColor;\n\n/* Selected */\n@selectedBackground: @subtleTransparentBlack;\n@selectedColor: @selectedTextColor;\n\n/* Error */\n@errorLabelBackground: #EACBCB;\n@errorLabelColor: @errorTextColor;\n\n@errorItemTextColor: @errorTextColor;\n@errorItemHoverBackground: #FFF2F2;\n@errorItemActiveBackground: #FDCFCF;\n\n/*-------------------\n      Variations\n--------------------*/\n\n/* Scrolling */\n@scrollingMenuWidth: 100%;\n@scrollingMenuItemBorder: none;\n@scrollingMenuRightItemPadding: ~\"calc(\"(@itemHorizontalPadding)~\" + \"(@scrollbarWidth)~\")\";\n\n@scrollingMobileMaxItems: 4;\n@scrollingTabletMaxItems: 6;\n@scrollingComputerMaxItems: 8;\n@scrollingWidescreenMaxItems: 12;\n\n@scrollingBorderEMWidth: 0em; /* 0px / em size */\n@scrollingItemHeight: (@itemVerticalPadding * 2) + @itemLineHeight + @scrollingBorderEMWidth;\n@scrollingMobileMaxMenuHeight: (@scrollingItemHeight * @scrollingMobileMaxItems);\n@scrollingTabletMaxMenuHeight: (@scrollingItemHeight * @scrollingTabletMaxItems);\n@scrollingComputerMaxMenuHeight: (@scrollingItemHeight * @scrollingComputerMaxItems);\n@scrollingWidescreenMaxMenuHeight: (@scrollingItemHeight * @selectionWidescreenMaxItems);\n\n/* Upward */\n@upwardSelectionVisibleBorderRadius: @selectionVisibleConnectingBorder @selectionVisibleConnectingBorder @borderRadius @borderRadius;\n@upwardMenuBoxShadow: 0px 0px 3px 0px rgba(0, 0, 0, 0.08);\n@upwardSelectionMenuBoxShadow: 0px -2px 3px 0px rgba(0, 0, 0, 0.08);\n@upwardMenuBorderRadius: @borderRadius @borderRadius 0em 0em;\n@upwardSelectionHoverBoxShadow: 0px 0px 2px 0px rgba(0, 0, 0, 0.05);\n@upwardSelectionVisibleBoxShadow: 0px 0px 3px 0px rgba(0, 0, 0, 0.08);\n@upwardSelectionActiveHoverBoxShadow: 0px 0px 3px 0px rgba(0, 0, 0, 0.05);\n@upwardSelectionActiveHoverMenuBoxShadow: 0px -2px 3px 0px rgba(0, 0, 0, 0.08);\n\n/* Flyout Direction */\n@leftMenuDropdownIconFloat: left;\n@leftMenuDropdownIconMargin: @itemLineHeightOffset 0em 0em 0em;\n\n/* Left */\n@leftSubMenuBorderRadius: @borderRadius;\n@leftSubMenuMargin: 0em @subMenuDistanceAway 0em 0em;\n\n/* Simple */\n@simpleTransitionDuration: @defaultDuration;\n@simpleTransition: opacity @simpleTransitionDuration @defaultEasing;\n\n/* Floating */\n@floatingMenuDistance: 0.5em;\n@floatingMenuBoxShadow: @floatingShadow;\n@floatingMenuBorderRadius: @borderRadius;\n\n/* Pointing */\n@pointingArrowOffset: -(@pointingArrowSize / 2);\n@pointingArrowDistanceFromEdge: 1em;\n\n@pointingArrowBackground: @white;\n@pointingArrowZIndex: 2;\n@pointingArrowBoxShadow: -@menuBorderWidth -@menuBorderWidth 0px 0px @menuBorderColor;\n@pointingArrowSize: @relative7px;\n\n@pointingMenuDistance: @mini;\n@pointingMenuBorderRadius: @borderRadius;\n@pointingArrowBoxShadow: -@menuBorderWidth -@menuBorderWidth 0px 0px @menuBorderColor;\n\n/* Pointing Upward */\n@pointingUpwardMenuBorderRadius: @borderRadius;\n@pointingUpwardArrowBoxShadow: @menuBorderWidth @menuBorderWidth 0px 0px @menuBorderColor;\n"
  },
  {
    "path": "semantic/src/themes/default/modules/embed.overrides",
    "content": "/*******************************\n        Video Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/themes/default/modules/embed.variables",
    "content": "/*******************************\n             Video\n*******************************/\n\n/*-------------------\n       Element\n--------------------*/\n\n/* Simple */\n@background: @lightGrey;\n@transitionDuration: 0.5s;\n@transitionEasing: @defaultEasing;\n\n/* Placeholder */\n@placeholderUnderlay: @background;\n\n/* Placeholder Overlayed Background */\n@placeholderBackground: radial-gradient(transparent 45%, rgba(0, 0, 0, 0.3));\n@placeholderBackgroundOpacity: 0.5;\n@placeholderBackgroundTransition: opacity @transitionDuration @transitionEasing;\n\n/* Icon */\n@iconBackground: @veryStrongTransparentBlack;\n@iconSize: 6rem;\n@iconTransition:\n  opacity @transitionDuration @transitionEasing,\n  color @transitionDuration @transitionEasing\n;\n@iconColor: @white;\n@iconShadow:\n  0px 2px 10px rgba(34, 36, 38, 0.2)\n;\n@iconZIndex: 10;\n\n/*-------------------\n       States\n--------------------*/\n\n/* Hover */\n@hoverPlaceholderBackground: @placeholderBackground;\n@hoverPlaceholderBackgroundOpacity: 1;\n@hoverIconColor: @white;\n\n\n/*-------------------\n      Variations\n--------------------*/\n\n/* Aspect Ratios */\n@squareRatio: (1/1) * 100%;\n@widescreenRatio: (9/16) * 100%;\n@ultraWidescreenRatio: (9/21) * 100%;\n@standardRatio: (3/4) * 100%;"
  },
  {
    "path": "semantic/src/themes/default/modules/modal.overrides",
    "content": "/*******************************\n         Theme Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/themes/default/modules/modal.variables",
    "content": "/*******************************\n             Modal\n*******************************/\n\n@background: @white;\n@border: none;\n@zIndex: 1001;\n@borderRadius: @defaultBorderRadius;\n@transformOrigin: 50% 25%;\n@boxShadow:\n  1px 3px 3px 0px rgba(0, 0, 0, 0.2),\n  1px 3px 15px 2px rgba(0, 0, 0, 0.2)\n;\n\n/* Close Icon */\n@closeOpacity: 0.8;\n@closeSize: 1.25em;\n@closeColor: @white;\n\n@closeHitbox: 2.25rem;\n@closeDistance: 0.25rem;\n@closeHitBoxOffset: (@closeHitbox - 1rem) / 2;\n@closePadding: @closeHitBoxOffset 0rem 0rem 0rem;\n@closeTop: -(@closeDistance + @closeHitbox);\n@closeRight: -(@closeDistance + @closeHitbox);\n\n/* Header */\n@headerMargin: 0em;\n@headerVerticalPadding: 1.25rem;\n@headerHorizontalPadding: 1.5rem;\n@headerPadding: @headerVerticalPadding @headerHorizontalPadding;\n@headerBackground: @white;\n@headerColor: @darkTextColor;\n@headerFontSize: @huge;\n@headerBoxShadow: none;\n@headerFontWeight: @bold;\n@headerFontFamily: @headerFont;\n@headerBorder: 1px solid @borderColor;\n\n/* Content */\n@contentFontSize: 1em;\n@contentPadding: 1.5rem;\n@contentLineHeight: 1.4;\n@contentBackground: #FFFFFF;\n\n/* Image / Description */\n@imageWidth: '';\n@imageIconSize: 8rem;\n@imageVerticalAlign: top;\n\n@descriptionDistance: 2em;\n@descriptionMinWidth: '';\n@descriptionWidth: auto;\n@descriptionVerticalAlign: top;\n\n/* Modal Actions */\n@actionBorder: 1px solid @borderColor;\n@actionBackground: @offWhite;\n@actionPadding: 1rem 1rem;\n@actionAlign: right;\n\n@buttonDistance: 0.75em;\n\n/* Inner Close Position (Tablet/Mobile) */\n@innerCloseTop: (@headerVerticalPadding - @closeHitBoxOffset + (@lineHeight - 1em));\n@innerCloseRight: 1rem;\n@innerCloseColor: @textColor;\n\n/* Mobile Positions */\n@mobileHeaderPadding: 0.75rem 1rem;\n@mobileContentPadding: 1rem;\n@mobileImagePadding: 0rem 0rem 1rem;\n@mobileDescriptionPadding: 1rem 0rem ;\n@mobileButtonDistance: 1rem;\n@mobileActionPadding: 1rem 1rem (1rem - @mobileButtonDistance);\n@mobileImageIconSize: 5rem;\n@mobileCloseTop: 0.5rem;\n@mobileCloseRight: 0.5rem;\n\n/* Responsive Widths */\n@mobileWidth: 95%;\n@tabletWidth: 88%;\n@computerWidth: 850px;\n@largeMonitorWidth: 900px;\n@widescreenMonitorWidth: 950px;\n\n@mobileMargin: 0em 0em 0em 0em;\n@tabletMargin: 0em 0em 0em 0em;\n@computerMargin: 0em 0em 0em 0em;\n@largeMonitorMargin: 0em 0em 0em 0em;\n@widescreenMonitorMargin: 0em 0em 0em 0em;\n\n@fullScreenWidth: 95%;\n@fullScreenOffset: 0em;\n@fullScreenMargin: 1em auto;\n\n/* Coupling */\n@invertedBoxShadow: 1px 3px 10px 2px rgba(0, 0, 0, 0.2);\n\n/*-------------------\n       States\n--------------------*/\n\n@loadingZIndex: -1;\n\n/*-------------------\n        Types\n--------------------*/\n\n/* Basic */\n@basicModalHeaderColor: @white;\n@basicModalColor: @white;\n@basicModalCloseTop: 1rem;\n@basicModalCloseRight: 1.5rem;\n@basicInnerCloseColor: @white;\n\n@basicInvertedModalColor: @textColor;\n@basicInvertedModalHeaderColor: @darkTextColor;\n\n/* Top Aligned */\n@topAlignedMargin: 5vh;\n@mobileTopAlignedMargin: 1rem;\n\n/* Scrolling Margin */\n@scrollingMargin: 1rem;\n@mobileScrollingMargin: @mobileTopAlignedMargin;\n\n/* Scrolling Content */\n@scrollingContentMaxHeight: calc(80vh - 10em);\n\n/*-------------------\n      Variations\n--------------------*/\n\n/* Size Widths */\n@miniRatio: 0.4;\n@tinyRatio: 0.6;\n@smallRatio: 0.8;\n@largeRatio: 1.2;\n\n/* Derived Responsive Sizes */\n@miniHeaderSize: 1.3em;\n@miniMobileWidth: @mobileWidth;\n@miniTabletWidth: (@tabletWidth * @miniRatio);\n@miniComputerWidth: (@computerWidth * @miniRatio);\n@miniLargeMonitorWidth: (@largeMonitorWidth * @miniRatio);\n@miniWidescreenMonitorWidth: (@widescreenMonitorWidth * @miniRatio);\n\n@miniMobileMargin: 0em 0em 0em 0em;\n@miniTabletMargin: 0em 0em 0em 0em;\n@miniComputerMargin: 0em 0em 0em 0em;\n@miniLargeMonitorMargin: 0em 0em 0em 0em;\n@miniWidescreenMonitorMargin: 0em 0em 0em 0em;\n\n@tinyHeaderSize: 1.3em;\n@tinyMobileWidth: @mobileWidth;\n@tinyTabletWidth: (@tabletWidth * @tinyRatio);\n@tinyComputerWidth: (@computerWidth * @tinyRatio);\n@tinyLargeMonitorWidth: (@largeMonitorWidth * @tinyRatio);\n@tinyWidescreenMonitorWidth: (@widescreenMonitorWidth * @tinyRatio);\n\n@tinyMobileMargin: 0em 0em 0em 0em;\n@tinyTabletMargin: 0em 0em 0em 0em;\n@tinyComputerMargin: 0em 0em 0em 0em;\n@tinyLargeMonitorMargin: 0em 0em 0em 0em;\n@tinyWidescreenMonitorMargin: 0em 0em 0em 0em;\n\n@smallHeaderSize: 1.3em;\n@smallMobileWidth: @mobileWidth;\n@smallTabletWidth: (@tabletWidth * @smallRatio);\n@smallComputerWidth: (@computerWidth * @smallRatio);\n@smallLargeMonitorWidth: (@largeMonitorWidth * @smallRatio);\n@smallWidescreenMonitorWidth: (@widescreenMonitorWidth * @smallRatio);\n\n@smallMobileMargin: 0em 0em 0em 0em;\n@smallTabletMargin: 0em 0em 0em 0em;\n@smallComputerMargin: 0em 0em 0em 0em;\n@smallLargeMonitorMargin: 0em 0em 0em 0em;\n@smallWidescreenMonitorMargin: 0em 0em 0em 0em;\n\n@largeHeaderSize: 1.6em;\n@largeMobileWidth: @mobileWidth;\n@largeTabletWidth: @tabletWidth;\n@largeComputerWidth: (@computerWidth * @largeRatio);\n@largeLargeMonitorWidth: (@largeMonitorWidth * @largeRatio);\n@largeWidescreenMonitorWidth: (@widescreenMonitorWidth * @largeRatio);\n\n@largeMobileMargin: 0em 0em 0em 0em;\n@largeTabletMargin: 0em 0em 0em 0em;\n@largeComputerMargin: 0em 0em 0em 0em;\n@largeLargeMonitorMargin: 0em 0em 0em 0em;\n@largeWidescreenMonitorMargin: 0em 0em 0em 0em;\n"
  },
  {
    "path": "semantic/src/themes/default/modules/nag.overrides",
    "content": "/*******************************\n         Theme Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/themes/default/modules/nag.variables",
    "content": "/*******************************\n             Nag\n*******************************/\n\n/*--------------\n   Collection\n---------------*/\n\n@position: relative;\n@width: 100%;\n@zIndex: 999;\n@margin: 0em;\n\n@background: #555555;\n@opacity: 0.95;\n@minHeight: 0em;\n@padding: 0.75em 1em;\n@lineHeight: 1em;\n@boxShadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.2);\n\n@fontSize: 1rem;\n@textAlign: center;\n@color: @textColor;\n\n@transition: 0.2s background ease;\n\n\n/*--------------\n    Elements\n---------------*/\n\n/* Title */\n@titleColor: @white;\n@titleMargin: 0em 0.5em;\n\n@closeSize: 1em;\n@closeMargin: (-@closeSize / 2) 0em 0em;\n@closeTop: 50%;\n@closeRight: 1em;\n@closeColor: @white;\n@closeTransition: opacity 0.2s ease;\n@closeOpacity: 0.4;\n\n\n/*--------------\n      States\n---------------*/\n\n/* Hover */\n@nagHoverBackground: @background;\n@nagHoverOpacity: 1;\n\n@closeHoverOpacity: 1;\n\n/*--------------\n   Variations\n---------------*/\n\n/* Top / Bottom */\n@top: 0em;\n@bottom: 0em;\n@borderRadius: @defaultBorderRadius;\n@topBorderRadius: 0em 0em @borderRadius @borderRadius;\n@bottomBorderRadius: @borderRadius @borderRadius 0em 0em;\n\n/* Inverted */\n@invertedBackground: @darkWhite;\n\n/*--------------\n      Plural\n---------------*/\n\n@groupedBorderRadius: 0em;\n\n"
  },
  {
    "path": "semantic/src/themes/default/modules/popup.overrides",
    "content": "/*******************************\n         Theme Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/themes/default/modules/popup.variables",
    "content": "/*******************************\n             Popup\n*******************************/\n\n/*-------------------\n       Element\n--------------------*/\n\n@zIndex: 1900;\n@background: @white;\n\n@maxWidth: 250px;\n@borderColor: @solidBorderColor;\n@borderWidth: 1px;\n@boxShadow: @floatingShadow;\n@color: @textColor;\n\n@verticalPadding: 0.833em;\n@horizontalPadding: 1em;\n@fontWeight: @normal;\n@fontStyle: @normal;\n@borderRadius: @defaultBorderRadius;\n\n/*-------------------\n       Parts\n--------------------*/\n\n/* Placement */\n@arrowSize: @relative10px;\n@arrowWidth: 1em;\n@arrowDistanceFromEdge: 1em;\n@boxArrowOffset: 0em;\n@popupDistanceAway: @arrowSize;\n\n\n/* Header */\n@headerFontFamily: @headerFont;\n@headerFontWeight: @bold;\n@headerFontSize: @relativeLarge;\n@headerDistance: @relative7px;\n@headerLineHeight: 1.2;\n\n/* Content Border */\n@border: @borderWidth solid @borderColor;\n\n/* Arrow */\n@arrowBackground: @background;\n@arrowZIndex: 2;\n@arrowJitter: 0.05em;\n@arrowOffset: -(@arrowSize / 2) + @arrowJitter;\n\n@arrowStroke: @borderWidth;\n@arrowColor: darken(@borderColor, 10);\n\n/* Arrow color by position */\n@arrowTopBackground: @arrowBackground;\n@arrowCenterBackground: @arrowBackground;\n@arrowBottomBackground: @arrowBackground;\n\n@arrowBoxShadow: @arrowStroke @arrowStroke 0px 0px @arrowColor;\n@leftArrowBoxShadow: @arrowStroke -@arrowStroke 0px 0px @arrowColor;\n@rightArrowBoxShadow: -@arrowStroke @arrowStroke 0px 0px @arrowColor;\n@bottomArrowBoxShadow: -@arrowStroke -@arrowStroke 0px 0px @arrowColor;\n\n/*-------------------\n       Types\n--------------------*/\n\n/* Tooltip */\n@tooltipBackground: @background;\n@tooltipBorderRadius: @borderRadius;\n@tooltipPadding: @verticalPadding @horizontalPadding;\n@tooltipFontWeight: @fontWeight;\n@tooltipFontStyle: @fontStyle;\n@tooltipColor: @color;\n@tooltipBorder: @border;\n@tooltipBoxShadow: @boxShadow;\n@tooltipMaxWidth: none;\n@tooltipFontSize: @medium;\n@tooltipLineHeight: @lineHeight;\n@tooltipDistanceAway: @relative7px;\n@tooltipZIndex: 1;\n@tooltipDuration: @defaultDuration;\n@tooltipEasing: @defaultEasing;\n\n/* Inverted */\n@tooltipInvertedBackground: @invertedBackground;\n@tooltipInvertedColor: @invertedColor;\n@tooltipInvertedBorder: @invertedBorder;\n@tooltipInvertedBoxShadow: @invertedBoxShadow;\n@tooltipInvertedHeaderBackground: @invertedHeaderBackground;\n@tooltipInvertedHeaderColor: @invertedHeaderColor;\n\n/* Arrow */\n@tooltipArrowVerticalOffset: -@2px;\n@tooltipArrowHorizontalOffset: -@1px;\n@tooltipArrowBoxShadow: @arrowBoxShadow;\n@tooltipArrowBackground: @arrowBackground;\n@tooltipArrowTopBackground: @arrowTopBackground;\n@tooltipArrowCenterBackground: @arrowCenterBackground;\n@tooltipArrowBottomBackground: @arrowBottomBackground;\n\n/*-------------------\n       Coupling\n--------------------*/\n\n/* Grid Inside Popup */\n@nestedGridMargin: -0.7rem -0.875rem; /* (padding * @medium) */\n@nestedGridWidth: ~\"calc(100% + 1.75rem)\";\n\n/*-------------------\n       States\n--------------------*/\n\n@loadingZIndex: -1;\n\n/*-------------------\n       Variations\n--------------------*/\n\n/* Wide */\n@wideWidth: 350px;\n@veryWideWidth: 550px;\n\n/* Inverted */\n@invertedBackground: @black;\n@invertedColor: @white;\n@invertedBorder: none;\n@invertedBoxShadow: none;\n\n@invertedHeaderBackground: none;\n@invertedHeaderColor: @white;\n@invertedArrowColor: @invertedBackground;\n\n/* Arrow color by position */\n@invertedArrowTopBackground: @invertedBackground;\n@invertedArrowCenterBackground: @invertedBackground;\n@invertedArrowBottomBackground: @invertedBackground;\n"
  },
  {
    "path": "semantic/src/themes/default/modules/progress.overrides",
    "content": "/*******************************\n            Progress\n*******************************/\n"
  },
  {
    "path": "semantic/src/themes/default/modules/progress.variables",
    "content": "/*******************************\n            Progress\n*******************************/\n\n/*-------------------\n       Element\n--------------------*/\n\n@verticalSpacing: 1em;\n@margin: @verticalSpacing 0em (@labelHeight + @verticalSpacing);\n@firstMargin: 0em 0em (@labelHeight + @verticalSpacing);\n@lastMargin: 0em 0em (@labelHeight);\n\n@background: @strongTransparentBlack;\n@border: none;\n@boxShadow: none;\n@padding: 0em;\n@borderRadius: @defaultBorderRadius;\n\n/* Bar */\n@barPosition: relative;\n@barHeight: 1.75em;\n@barBackground: #888888;\n@barBorderRadius: @borderRadius;\n@barTransitionEasing: @defaultEasing;\n@barTransitionDuration: @defaultDuration;\n@barTransition:\n  width @barTransitionDuration @barTransitionEasing,\n  background-color @barTransitionDuration @barTransitionEasing\n;\n@barInitialWidth: 0%;\n@barMinWidth: 2em;\n\n/* Progress Bar Label */\n@progressWidth: auto;\n@progressSize: @relativeSmall;\n@progressPosition: absolute;\n@progressTop: 50%;\n@progressRight: 0.5em;\n@progressLeft: auto;\n@progressBottom: auto;\n@progressOffset: -0.5em;\n@progressColor: @invertedLightTextColor;\n@progressTextShadow: none;\n@progressFontWeight: @bold;\n@progressTextAlign: left;\n\n/* Label */\n@labelWidth: 100%;\n@labelHeight: 1.5em;\n@labelSize: 1em;\n@labelPosition: absolute;\n@labelTop: 100%;\n@labelLeft: 0%;\n@labelRight: auto;\n@labelBottom: auto;\n@labelOffset: (@labelHeight - 1.3em);\n@labelColor: @textColor;\n@labelTextShadow: none;\n@labelFontWeight: @bold;\n@labelTextAlign: center;\n@labelTransition: color 0.4s @defaultEasing;\n\n/*-------------------\n        Types\n--------------------*/\n\n@indicatingFirstColor: #D95C5C;\n@indicatingSecondColor: #EFBC72;\n@indicatingThirdColor: #E6BB48;\n@indicatingFourthColor: #DDC928;\n@indicatingFifthColor: #B4D95C;\n@indicatingSixthColor: #66DA81;\n\n@indicatingFirstLabelColor: @textColor;\n@indicatingSecondLabelColor: @textColor;\n@indicatingThirdLabelColor: @textColor;\n@indicatingFourthLabelColor: @textColor;\n@indicatingFifthLabelColor: @textColor;\n@indicatingSixthLabelColor: @textColor;\n\n/*-------------------\n        States\n--------------------*/\n\n/* Active */\n@activePulseColor: @white;\n@activePulseMaxOpacity: 0.3;\n@activePulseDuration: 2s;\n@activeMinWidth: @barMinWidth;\n\n\n/*-------------------\n      Variations\n--------------------*/\n\n/* Attached */\n@attachedBackground: transparent;\n@attachedHeight: 0.2rem;\n@attachedBorderRadius: @borderRadius;\n\n/* Inverted */\n@invertedBackground: @transparentWhite;\n@invertedBorder: none;\n@invertedBarBackground: @barBackground;\n@invertedProgressColor: @offWhite;\n@invertedLabelColor: @white;\n\n/* Sizing */\n@tinyBarHeight: 0.5em;\n@smallBarHeight: 1em;\n@largeBarHeight: 2.5em;\n@bigBarHeight: 3.5em;\n"
  },
  {
    "path": "semantic/src/themes/default/modules/rating.overrides",
    "content": "/*******************************\n         Theme Overrides\n*******************************/\n\n@font-face {\n  font-family: 'Rating';\n  src:\n    url(data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMggjCBsAAAC8AAAAYGNtYXCj2pm8AAABHAAAAKRnYXNwAAAAEAAAAcAAAAAIZ2x5ZlJbXMYAAAHIAAARnGhlYWQBGAe5AAATZAAAADZoaGVhA+IB/QAAE5wAAAAkaG10eCzgAEMAABPAAAAAcGxvY2EwXCxOAAAUMAAAADptYXhwACIAnAAAFGwAAAAgbmFtZfC1n04AABSMAAABPHBvc3QAAwAAAAAVyAAAACAAAwIAAZAABQAAAUwBZgAAAEcBTAFmAAAA9QAZAIQAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADxZQHg/+D/4AHgACAAAAABAAAAAAAAAAAAAAAgAAAAAAACAAAAAwAAABQAAwABAAAAFAAEAJAAAAAgACAABAAAAAEAIOYF8AbwDfAj8C7wbvBw8Irwl/Cc8SPxZf/9//8AAAAAACDmAPAE8AzwI/Au8G7wcPCH8JfwnPEj8WT//f//AAH/4xoEEAYQAQ/sD+IPow+iD4wPgA98DvYOtgADAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAH//wAPAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAAIAAP/tAgAB0wAKABUAAAEvAQ8BFwc3Fyc3BQc3Jz8BHwEHFycCALFPT7GAHp6eHoD/AHAWW304OH1bFnABGRqgoBp8sFNTsHyyOnxYEnFxElh8OgAAAAACAAD/7QIAAdMACgASAAABLwEPARcHNxcnNwUxER8BBxcnAgCxT0+xgB6enh6A/wA4fVsWcAEZGqCgGnywU1OwfLIBHXESWHw6AAAAAQAA/+0CAAHTAAoAAAEvAQ8BFwc3Fyc3AgCxT0+xgB6enh6AARkaoKAafLBTU7B8AAAAAAEAAAAAAgABwAArAAABFA4CBzEHDgMjIi4CLwEuAzU0PgIzMh4CFz4DMzIeAhUCAAcMEgugBgwMDAYGDAwMBqALEgwHFyg2HhAfGxkKChkbHxAeNigXAS0QHxsZCqAGCwkGBQkLBqAKGRsfEB42KBcHDBILCxIMBxcoNh4AAAAAAgAAAAACAAHAACsAWAAAATQuAiMiDgIHLgMjIg4CFRQeAhcxFx4DMzI+Aj8BPgM1DwEiFCIGMTAmIjQjJy4DNTQ+AjMyHgIfATc+AzMyHgIVFA4CBwIAFyg2HhAfGxkKChkbHxAeNigXBwwSC6AGDAwMBgYMDAwGoAsSDAdbogEBAQEBAaIGCgcEDRceEQkREA4GLy8GDhARCREeFw0EBwoGAS0eNigXBwwSCwsSDAcXKDYeEB8bGQqgBgsJBgUJCwagChkbHxA+ogEBAQGiBg4QEQkRHhcNBAcKBjQ0BgoHBA0XHhEJERAOBgABAAAAAAIAAcAAMQAAARQOAgcxBw4DIyIuAi8BLgM1ND4CMzIeAhcHFwc3Jzc+AzMyHgIVAgAHDBILoAYMDAwGBgwMDAagCxIMBxcoNh4KFRMSCC9wQLBwJwUJCgkFHjYoFwEtEB8bGQqgBgsJBgUJCwagChkbHxAeNigXAwUIBUtAoMBAOwECAQEXKDYeAAABAAAAAAIAAbcAKgAAEzQ3NjMyFxYXFhcWFzY3Njc2NzYzMhcWFRQPAQYjIi8BJicmJyYnJicmNQAkJUARExIQEAsMCgoMCxAQEhMRQCUkQbIGBwcGsgMFBQsKCQkGBwExPyMkBgYLCgkKCgoKCQoLBgYkIz8/QawFBawCBgUNDg4OFRQTAAAAAQAAAA0B2wHSACYAABM0PwI2FzYfAhYVFA8BFxQVFAcGByYvAQcGByYnJjU0PwEnJjUAEI9BBQkIBkCPEAdoGQMDBgUGgIEGBQYDAwEYaAcBIwsCFoEMAQEMgRYCCwYIZJABBQUFAwEBAkVFAgEBAwUFAwOQZAkFAAAAAAIAAAANAdsB0gAkAC4AABM0PwI2FzYfAhYVFA8BFxQVFAcmLwEHBgcmJyY1ND8BJyY1HwEHNxcnNy8BBwAQj0EFCQgGQI8QB2gZDAUGgIEGBQYDAwEYaAc/WBVsaxRXeDY2ASMLAhaBDAEBDIEWAgsGCGSQAQUNAQECRUUCAQEDBQUDA5BkCQURVXg4OHhVEW5uAAABACMAKQHdAXwAGgAANzQ/ATYXNh8BNzYXNh8BFhUUDwEGByYvASY1IwgmCAwLCFS8CAsMCCYICPUIDAsIjgjSCwkmCQEBCVS7CQEBCSYJCg0H9gcBAQePBwwAAAEAHwAfAXMBcwAsAAA3ND8BJyY1ND8BNjMyHwE3NjMyHwEWFRQPARcWFRQPAQYjIi8BBwYjIi8BJjUfCFRUCAgnCAwLCFRUCAwLCCcICFRUCAgnCAsMCFRUCAsMCCcIYgsIVFQIDAsIJwgIVFQICCcICwwIVFQICwwIJwgIVFQICCcIDAAAAAACAAAAJQFJAbcAHwArAAA3NTQ3NjsBNTQ3NjMyFxYdATMyFxYdARQHBiMhIicmNTczNTQnJiMiBwYdAQAICAsKJSY1NCYmCQsICAgIC/7tCwgIW5MWFR4fFRZApQsICDc0JiYmJjQ3CAgLpQsICAgIC8A3HhYVFRYeNwAAAQAAAAcBbgG3ACEAADcRNDc2NzYzITIXFhcWFREUBwYHBiMiLwEHBiMiJyYnJjUABgUKBgYBLAYGCgUGBgUKBQcOCn5+Cg4GBgoFBicBcAoICAMDAwMICAr+kAoICAQCCXl5CQIECAgKAAAAAwAAACUCAAFuABgAMQBKAAA3NDc2NzYzMhcWFxYVFAcGBwYjIicmJyY1MxYXFjMyNzY3JicWFRQHBiMiJyY1NDcGBzcUFxYzMjc2NTQ3NjMyNzY1NCcmIyIHBhUABihDREtLREMoBgYoQ0RLS0RDKAYlJjk5Q0M5OSYrQREmJTU1JSYRQSuEBAQGBgQEEREZBgQEBAQGJBkayQoKQSgoKChBCgoKCkEoJycoQQoKOiMjIyM6RCEeIjUmJSUmNSIeIUQlBgQEBAQGGBIRBAQGBgQEGhojAAAABQAAAAkCAAGJACwAOABRAGgAcAAANzQ3Njc2MzIXNzYzMhcWFxYXFhcWFxYVFDEGBwYPAQYjIicmNTQ3JicmJyY1MxYXNyYnJjU0NwYHNxQXFjMyNzY1NDc2MzI3NjU0JyYjIgcGFRc3Njc2NyYnNxYXFhcWFRQHBgcGBwYjPwEWFRQHBgcABitBQU0ZGhADBQEEBAUFBAUEBQEEHjw8Hg4DBQQiBQ0pIyIZBiUvSxYZDg4RQSuEBAQGBgQEEREZBgQEBAQGJBkaVxU9MzQiIDASGxkZEAYGCxQrODk/LlACFxYlyQsJQycnBRwEAgEDAwIDAwIBAwUCNmxsNhkFFAMFBBUTHh8nCQtKISgSHBsfIh4hRCUGBAQEBAYYEhEEBAYGBAQaGiPJJQUiIjYzISASGhkbCgoKChIXMRsbUZANCyghIA8AAAMAAAAAAbcB2wA5AEoAlAAANzU0NzY7ATY3Njc2NzY3Njc2MzIXFhcWFRQHMzIXFhUUBxYVFAcUFRQHFgcGKwEiJyYnJisBIicmNTcUFxYzMjc2NTQnJiMiBwYVFzMyFxYXFhcWFxYXFhcWOwEyNTQnNjc2NTQnNjU0JyYnNjc2NTQnJisBNDc2NTQnJiMGBwYHBgcGBwYHBgcGBwYHBgcGBwYrARUACwoQTgodEQ4GBAMFBgwLDxgTEwoKDjMdFhYOAgoRARkZKCUbGxsjIQZSEAoLJQUFCAcGBQUGBwgFBUkJBAUFBAQHBwMDBwcCPCUjNwIJBQUFDwMDBAkGBgsLDmUODgoJGwgDAwYFDAYQAQUGAwQGBgYFBgUGBgQJSbcPCwsGJhUPCBERExMMCgkJFBQhGxwWFR4ZFQoKFhMGBh0WKBcXBgcMDAoLDxIHBQYGBQcIBQYGBQgSAQEBAQICAQEDAgEULwgIBQoLCgsJDhQHCQkEAQ0NCg8LCxAdHREcDQ4IEBETEw0GFAEHBwUECAgFBQUFAgO3AAADAAD/2wG3AbcAPABNAJkAADc1NDc2OwEyNzY3NjsBMhcWBxUWFRQVFhUUBxYVFAcGKwEWFRQHBgcGIyInJicmJyYnJicmJyYnIyInJjU3FBcWMzI3NjU0JyYjIgcGFRczMhcWFxYXFhcWFxYXFhcWFxYXFhcWFzI3NjU0JyY1MzI3NjU0JyYjNjc2NTQnNjU0JyYnNjU0JyYrASIHIgcGBwYHBgcGIwYrARUACwoQUgYhJRsbHiAoGRkBEQoCDhYWHTMOCgoTExgPCwoFBgIBBAMFDhEdCk4QCgslBQUIBwYFBQYHCAUFSQkEBgYFBgUGBgYEAwYFARAGDAUGAwMIGwkKDg5lDgsLBgYJBAMDDwUFBQkCDg4ZJSU8AgcHAwMHBwQEBQUECbe3DwsKDAwHBhcWJwIWHQYGExYKChUZHhYVHRoiExQJCgsJDg4MDAwNBg4WJQcLCw+kBwUGBgUHCAUGBgUIpAMCBQYFBQcIBAUHBwITBwwTExERBw0OHBEdHRALCw8KDQ0FCQkHFA4JCwoLCgUICBgMCxUDAgEBAgMBAQG3AAAAAQAAAA0A7gHSABQAABM0PwI2FxEHBgcmJyY1ND8BJyY1ABCPQQUJgQYFBgMDARhoBwEjCwIWgQwB/oNFAgEBAwUFAwOQZAkFAAAAAAIAAAAAAgABtwAqAFkAABM0NzYzMhcWFxYXFhc2NzY3Njc2MzIXFhUUDwEGIyIvASYnJicmJyYnJjUzFB8BNzY1NCcmJyYnJicmIyIHBgcGBwYHBiMiJyYnJicmJyYjIgcGBwYHBgcGFQAkJUARExIQEAsMCgoMCxAQEhMRQCUkQbIGBwcGsgMFBQsKCQkGByU1pqY1BgYJCg4NDg0PDhIRDg8KCgcFCQkFBwoKDw4REg4PDQ4NDgoJBgYBMT8jJAYGCwoJCgoKCgkKCwYGJCM/P0GsBQWsAgYFDQ4ODhUUEzA1oJ82MBcSEgoLBgcCAgcHCwsKCQgHBwgJCgsLBwcCAgcGCwoSEhcAAAACAAAABwFuAbcAIQAoAAA3ETQ3Njc2MyEyFxYXFhURFAcGBwYjIi8BBwYjIicmJyY1PwEfAREhEQAGBQoGBgEsBgYKBQYGBQoFBw4Kfn4KDgYGCgUGJZIZef7cJwFwCggIAwMDAwgICv6QCggIBAIJeXkJAgQICAoIjRl0AWP+nQAAAAABAAAAJQHbAbcAMgAANzU0NzY7ATU0NzYzMhcWHQEUBwYrASInJj0BNCcmIyIHBh0BMzIXFh0BFAcGIyEiJyY1AAgIC8AmJjQ1JiUFBQgSCAUFFhUfHhUWHAsICAgIC/7tCwgIQKULCAg3NSUmJiU1SQgFBgYFCEkeFhUVFh43CAgLpQsICAgICwAAAAIAAQANAdsB0gAiAC0AABM2PwI2MzIfAhYXFg8BFxYHBiMiLwEHBiMiJyY/AScmNx8CLwE/AS8CEwEDDJBABggJBUGODgIDCmcYAgQCCAMIf4IFBgYEAgEZaQgC7hBbEgINSnkILgEBJggCFYILC4IVAggICWWPCgUFA0REAwUFCo9lCQipCTBmEw1HEhFc/u0AAAADAAAAAAHJAbcAFAAlAHkAADc1NDc2OwEyFxYdARQHBisBIicmNTcUFxYzMjc2NTQnJiMiBwYVFzU0NzYzNjc2NzY3Njc2NzY3Njc2NzY3NjMyFxYXFhcWFxYXFhUUFRQHBgcGBxQHBgcGBzMyFxYVFAcWFRYHFgcGBxYHBgcjIicmJyYnJiciJyY1AAUGB1MHBQYGBQdTBwYFJQUFCAcGBQUGBwgFBWQFBQgGDw8OFAkFBAQBAQMCAQIEBAYFBw4KCgcHBQQCAwEBAgMDAgYCAgIBAU8XEBAQBQEOBQUECwMREiYlExYXDAwWJAoHBQY3twcGBQUGB7cIBQUFBQgkBwYFBQYHCAUGBgUIJLcHBQYBEBATGQkFCQgGBQwLBgcICQUGAwMFBAcHBgYICQQEBwsLCwYGCgIDBAMCBBEQFhkSDAoVEhAREAsgFBUBBAUEBAcMAQUFCAAAAAADAAD/2wHJAZIAFAAlAHkAADcUFxYXNxY3Nj0BNCcmBycGBwYdATc0NzY3FhcWFRQHBicGJyY1FzU0NzY3Fjc2NzY3NjcXNhcWBxYXFgcWBxQHFhUUBwYHJxYXFhcWFRYXFhcWFRQVFAcGBwYHBgcGBwYnBicmJyYnJicmJyYnJicmJyYnJiciJyY1AAUGB1MHBQYGBQdTBwYFJQUFCAcGBQUGBwgFBWQGBQcKJBYMDBcWEyUmEhEDCwQFBQ4BBRAQEBdPAQECAgIGAgMDAgEBAwIEBQcHCgoOBwUGBAQCAQIDAQEEBAUJFA4PDwYIBQWlBwYFAQEBBwQJtQkEBwEBAQUGB7eTBwYEAQEEBgcJBAYBAQYECZS4BwYEAgENBwUCBgMBAQEXEyEJEhAREBcIDhAaFhEPAQEFAgQCBQELBQcKDAkIBAUHCgUGBwgDBgIEAQEHBQkIBwUMCwcECgcGCRoREQ8CBgQIAAAAAQAAAAEAAJth57dfDzz1AAsCAAAAAADP/GODAAAAAM/8Y4MAAP/bAgAB2wAAAAgAAgAAAAAAAAABAAAB4P/gAAACAAAAAAACAAABAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAEAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAdwAAAHcAAACAAAjAZMAHwFJAAABbgAAAgAAAAIAAAACAAAAAgAAAAEAAAACAAAAAW4AAAHcAAAB3AABAdwAAAHcAAAAAAAAAAoAFAAeAEoAcACKAMoBQAGIAcwCCgJUAoICxgMEAzoDpgRKBRgF7AYSBpgG2gcgB2oIGAjOAAAAAQAAABwAmgAFAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABAAwAAAABAAAAAAACAA4AQAABAAAAAAADAAwAIgABAAAAAAAEAAwATgABAAAAAAAFABYADAABAAAAAAAGAAYALgABAAAAAAAKADQAWgADAAEECQABAAwAAAADAAEECQACAA4AQAADAAEECQADAAwAIgADAAEECQAEAAwATgADAAEECQAFABYADAADAAEECQAGAAwANAADAAEECQAKADQAWgByAGEAdABpAG4AZwBWAGUAcgBzAGkAbwBuACAAMQAuADAAcgBhAHQAaQBuAGdyYXRpbmcAcgBhAHQAaQBuAGcAUgBlAGcAdQBsAGEAcgByAGEAdABpAG4AZwBGAG8AbgB0ACAAZwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABJAGMAbwBNAG8AbwBuAC4AAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==) format('truetype'),\n    url(data:application/font-woff;charset=utf-8;base64,d09GRk9UVE8AABcUAAoAAAAAFswAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABDRkYgAAAA9AAAEuEAABLho6TvIE9TLzIAABPYAAAAYAAAAGAIIwgbY21hcAAAFDgAAACkAAAApKPambxnYXNwAAAU3AAAAAgAAAAIAAAAEGhlYWQAABTkAAAANgAAADYBGAe5aGhlYQAAFRwAAAAkAAAAJAPiAf1obXR4AAAVQAAAAHAAAABwLOAAQ21heHAAABWwAAAABgAAAAYAHFAAbmFtZQAAFbgAAAE8AAABPPC1n05wb3N0AAAW9AAAACAAAAAgAAMAAAEABAQAAQEBB3JhdGluZwABAgABADr4HAL4GwP4GAQeCgAZU/+Lix4KABlT/4uLDAeLZviU+HQFHQAAAP0PHQAAAQIRHQAAAAkdAAAS2BIAHQEBBw0PERQZHiMoLTI3PEFGS1BVWl9kaW5zeH2Ch4xyYXRpbmdyYXRpbmd1MHUxdTIwdUU2MDB1RTYwMXVFNjAydUU2MDN1RTYwNHVFNjA1dUYwMDR1RjAwNXVGMDA2dUYwMEN1RjAwRHVGMDIzdUYwMkV1RjA2RXVGMDcwdUYwODd1RjA4OHVGMDg5dUYwOEF1RjA5N3VGMDlDdUYxMjN1RjE2NHVGMTY1AAACAYkAGgAcAgABAAQABwAKAA0AVgCWAL0BAgGMAeQCbwLwA4cD5QR0BQMFdgZgB8MJkQtxC7oM2Q1jDggOmRAYEZr8lA78lA78lA77lA74lPetFftFpTz3NDz7NPtFcfcU+xBt+0T3Mt73Mjht90T3FPcQBfuU+0YV+wRRofcQMOP3EZ3D9wXD+wX3EXkwM6H7EPsExQUO+JT3rRX7RaU89zQ8+zT7RXH3FPsQbftE9zLe9zI4bfdE9xT3EAX7lPtGFYuLi/exw/sF9xF5MDOh+xD7BMUFDviU960V+0WlPPc0PPs0+0Vx9xT7EG37RPcy3vcyOG33RPcU9xAFDviU98EVi2B4ZG5wCIuL+zT7NAV7e3t7e4t7i3ube5sI+zT3NAVupniyi7aL3M3N3Iu2i7J4pm6mqLKetovci81JizoIDviU98EVi9xJzTqLYItkeHBucKhknmCLOotJSYs6i2CeZKhwCIuL9zT7NAWbe5t7m4ubi5ubm5sI9zT3NAWopp6yi7YIME0V+zb7NgWKioqKiouKi4qMiowI+zb3NgV6m4Ghi6OLubCwuYuji6GBm3oIule6vwWbnKGVo4u5i7Bmi12Lc4F1ensIDviU98EVi2B4ZG5wCIuL+zT7NAV7e3t7e4t7i3ube5sI+zT3NAVupniyi7aL3M3N3Iuni6WDoX4IXED3BEtL+zT3RPdU+wTLssYFl46YjZiL3IvNSYs6CA6L98UVi7WXrKOio6Otl7aLlouXiZiHl4eWhZaEloSUhZKFk4SShZKEkpKSkZOSkpGUkZaSCJaSlpGXj5iPl42Wi7aLrX+jc6N0l2qLYYthdWBgYAj7RvtABYeIh4mGi4aLh42Hjgj7RvdABYmNiY2Hj4iOhpGDlISUhZWFlIWVhpaHmYaYiZiLmAgOZ4v3txWLkpCPlo0I9yOgzPcWBY6SkI+Ri5CLkIePhAjL+xb3I3YFlomQh4uEi4aJh4aGCCMmpPsjBYuKi4mLiIuHioiJiImIiIqHi4iLh4yHjQj7FM/7FUcFh4mHioiLh4uIjImOiY6KjouPi4yLjYyOCKP3IyPwBYaQiZCLjwgOZ4v3txWLkpCPlo0I9yOgzPcWBY6SkI+Ri5CLkIePhAjL+xb3I3YFlomQh4uEi4aJh4aGCCMmpPsjBYuKi4mLiIuCh4aDi4iLh4yHjQj7FM/7FUcFh4mHioiLh4uIjImOiY6KjouPi4yLjYyOCKP3IyPwBYaQiZCLjwjKeRXjN3b7DfcAxPZSd/cN4t/7DJ1V9wFV+wEFDq73ZhWLk42RkZEIsbIFkZCRjpOLkouSiJCGCN8291D3UAWQkJKOkouTi5GIkYYIsWQFkYaNhIuEi4OJhYWFCPuJ+4kFhYWFiYOLhIuEjYaRCPsi9yIFhZCJkouSCA77AartFYuSjpKQkAjf3zffBYaQiJKLk4uSjpKQkAiysgWRkJGOk4uSi5KIkIYI3zff3wWQkJKOk4uSi5KIkIYIsmQFkIaOhIuEi4OIhIaGCDc33zcFkIaOhIuEi4OIhYaFCGRkBYaGhIiEi4OLhI6GkAg33zc3BYaGhIiEi4OLhY6FkAhksgWGkYiRi5MIDvtLi8sVi/c5BYuSjpKQkJCQko6SiwiVi4vCBYuul6mkpKSkqpiui66LqX6kcqRymG2LaAiLVJSLBZKLkoiQhpCGjoSLhAiL+zkFi4OIhYaGhoWEiYSLCPuniwWEi4SNhpGGkIiRi5MI5vdUFfcni4vCBYufhJx8mn2ZepJ3i3aLeoR9fX18g3qLdwiLVAUO+yaLshWL+AQFi5GNkY+RjpCQj5KNj42PjI+LCPfAiwWPi4+Kj4mRiZCHj4aPhY2Fi4UIi/wEBYuEiYWHhoeGhoeFiIiKhoqHi4GLhI6EkQj7EvcN+xL7DQWEhYOIgouHi4eLh42EjoaPiJCHkImRi5IIDov3XRWLko2Rj5Kltq+vuKW4pbuZvYu9i7t9uHG4ca9npWCPhI2Fi4SLhYmEh4RxYGdoXnAIXnFbflmLWYtbmF6lXqZnrnG2h5KJkouRCLCLFaRkq2yxdLF0tH+4i7iLtJexorGiq6qksm64Z61goZZ3kXaLdItnfm1ycnJybX9oiwhoi22XcqRypH6pi6+LopGglp9gdWdpbl4I9xiwFYuHjIiOiI6IjoqPi4+LjoyOjo2OjY6Lj4ubkJmXl5eWmZGbi4+LjoyOjo2OjY6LjwiLj4mOiY6IjYiNh4tzi3eCenp6eoJ3i3MIDov3XRWLko2Sj5GouK+utqW3pbqYvouci5yJnIgIm6cFjY6NjI+LjIuNi42JjYqOio+JjomOiY6KjomOiY6JjoqNioyKjomMiYuHi4qLiouLCHdnbVVjQ2NDbVV3Zwh9cgWJiIiJiIuJi36SdJiIjYmOi46LjY+UlJlvl3KcdJ90oHeie6WHkYmSi5IIsIsVqlq0Z711CKGzBXqXfpqCnoKdhp6LoIuikaCWn2B1Z2luXgj3GLAVi4eMiI6IjoiOio+Lj4uOjI6OjY6NjouPi5uQmZeXl5aZkZuLj4uOjI6OjY6NjouPCIuPiY6JjoiNiI2Hi3OLd4J6enp6gneLcwji+10VoLAFtI+wmK2hrqKnqKKvdq1wp2uhCJ2rBZ1/nHycepx6mHqWeY+EjYWLhIuEiYWHhIR/gH1+fG9qaXJmeWV5Y4Jhiwi53BXb9yQFjIKMg4uEi3CDc3x1fHV3fHOBCA6L1BWL90sFi5WPlJKSkpKTj5aLCNmLBZKPmJqepJaZlZeVlY+Qj5ONl42WjpeOmI+YkZWTk5OSk46Vi5uLmYiYhZiFlIGSfgiSfo55i3WLeYd5gXgIvosFn4uchJl8mn2Seot3i3qGfIJ9jYSLhYuEi3yIfoR+i4eLh4uHi3eGen99i3CDdnt8CHt8dYNwiwhmiwV5i3mNeY95kHeRc5N1k36Ph4sIOYsFgIuDjoSShJKHlIuVCLCdFYuGjIePiI+Hj4mQi5CLj42Pj46OjY+LkIuQiZCIjoePh42Gi4aLh4mHh4eIioaLhgjUeRWUiwWNi46Lj4qOi4+KjYqOi4+Kj4mQio6KjYqNio+Kj4mQio6KjIqzfquEpIsIrosFr4uemouri5CKkYqQkY6QkI6SjpKNkouSi5KJkoiRlZWQlouYi5CKkImRiZGJj4iOCJGMkI+PlI+UjZKLkouViJODk4SSgo+CiwgmiwWLlpCalJ6UnpCbi5aLnoiYhJSFlH+QeYuGhoeDiYCJf4h/h3+IfoWBg4KHh4SCgH4Ii4qIiYiGh4aIh4mIiIiIh4eGh4aHh4eHiIiHiIeHiIiHiIeKh4mIioiLCIKLi/tLBQ6L90sVi/dLBYuVj5OSk5KSk46WiwjdiwWPi5iPoZOkk6CRnZCdj56Nn4sIq4sFpougg5x8m3yTd4txCIuJBZd8kHuLd4uHi4eLh5J+jn6LfIuEi4SJhZR9kHyLeot3hHp8fH19eoR3iwhYiwWVeI95i3mLdIh6hH6EfoKBfoV+hX2He4uBi4OPg5KFkYaTh5SHlYiTipOKk4qTiJMIiZSIkYiPgZSBl4CaeKR+moSPCD2LBYCLg4+EkoSSh5SLlQiw9zgVi4aMh4+Ij4ePiZCLkIuPjY+Pjo6Nj4uQi5CJkIiOh4+HjYaLhouHiYeHh4iKhouGCNT7OBWUiwWOi46Kj4mPio+IjoiPh4+IjoePiI+Hj4aPho6HjoiNiI6Hj4aOho6Ii4qWfpKDj4YIk4ORgY5+j36OgI1/jYCPg5CGnYuXj5GUkpSOmYuei5aGmoKfgp6GmouWCPCLBZSLlI+SkpOTjpOLlYuSiZKHlIeUho+Fi46PjY+NkY2RjJCLkIuYhpaBlY6RjZKLkgiLkomSiJKIkoaQhY6MkIyRi5CLm4aXgpOBkn6Pe4sIZosFcotrhGN9iouIioaJh4qHiomKiYqIioaKh4mHioiKiYuHioiLh4qIi4mLCIKLi/tLBQ77lIv3txWLkpCPlo0I9yOgzPcWBY6SkI+RiwiL/BL7FUcFh4mHioiLh4uIjImOiY6KjouPi4yLjYyOCKP3IyPwBYaQiZCLjwgOi/fFFYu1l6yjoqOjrZe2i5aLl4mYh5eHloWWhJaElIWShZOEkoWShJKSkpGTkpKRlJGWkgiWkpaRl4+Yj5eNlou2i61/o3OjdJdqi2GLYXVgYGAI+0b7QAWHiIeJhouGi4eNh44I+0b3QAWJjYmNh4+IjoaRg5SElIWVhZSFlYaWh5mGmImYi5gIsIsVi2ucaa9oCPc6+zT3OvczBa+vnK2Lq4ubiZiHl4eXhpSFkoSSg5GCj4KQgo2CjYONgYuBi4KLgIl/hoCGgIWChAiBg4OFhISEhYaFhoaIhoaJhYuFi4aNiJCGkIaRhJGEkoORgZOCkoCRgJB/kICNgosIgYuBi4OJgomCiYKGgoeDhYSEhYSGgod/h3+Jfot7CA77JouyFYv4BAWLkY2Rj5GOkJCPko2PjY+Mj4sI98CLBY+Lj4qPiZGJkIePho+FjYWLhQiL/AQFi4SJhYeGh4aGh4WIiIqGioeLgYuEjoSRCPsS9w37EvsNBYSFg4iCi4eLh4uHjYSOho+IkIeQiZGLkgiwkxX3JvchpHL3DfsIi/f3+7iLi/v3BQ5ni8sVi/c5BYuSjpKQkJCQko6Siwj3VIuLwgWLrpippKSkpKmYrouvi6l+pHKkcpdti2gIi0IFi4aKhoeIh4eHiYaLCHmLBYaLh42Hj4eOipCLkAiL1AWLn4OcfZp9mXqSdot3i3qEfX18fIR6i3cIi1SniwWSi5KIkIaQho6Ei4QIi/s5BYuDiIWGhoaFhImEiwj7p4sFhIuEjYaRhpCIkYuTCA5njPe6FYyQkI6UjQj3I6DM9xYFj5KPj5GLkIuQh4+ECMv7FvcjdgWUiZCIjYaNhoiFhYUIIyak+yMFjIWKhomHiYiIiYaLiIuHjIeNCPsUz/sVRwWHiYeKiIuHi4eNiY6Jj4uQjJEIo/cjI/AFhZGJkY2QCPeB+z0VnILlW3rxiJ6ZmNTS+wydgpxe54v7pwUOZ4vCFYv3SwWLkI2Pjo+Pjo+NkIsI3osFkIuPiY6Ij4eNh4uGCIv7SwWLhomHh4eIh4eKhosIOIsFhouHjIePiI+Jj4uQCLCvFYuGjIePh46IkImQi5CLj42Pjo6PjY+LkIuQiZCIjoePh42Gi4aLhomIh4eIioaLhgjvZxWL90sFi5CNj46Oj4+PjZCLj4ySkJWWlZaVl5SXmJuVl5GRjo6OkI6RjZCNkIyPjI6MkY2TCIySjJGMj4yPjZCOkY6RjpCPjo6Pj42Qi5SLk4qSiZKJkYiPiJCIjoiPho6GjYeMhwiNh4yGjIaMhYuHi4iLiIuHi4eLg4uEiYSJhImFiYeJh4mFh4WLioqJiomJiIqJiokIi4qKiIqJCNqLBZqLmIWWgJaAkH+LfIt6hn2Af46DjYSLhIt9h36Cf4+Bi3+HgImAhYKEhI12hnmAfgh/fXiDcosIZosFfot+jHyOfI5/joOOg41/j32Qc5N8j4SMhouHjYiOh4+Jj4uQCA5ni/c5FYuGjYaOiI+Hj4mQiwjeiwWQi4+Njo+Pjo2Qi5AIi/dKBYuQiZCHjoiPh42Giwg4iwWGi4eJh4eIiImGi4YIi/tKBbD3JhWLkIyPj4+OjpCNkIuQi4+Jj4iOh42Hi4aLhomHiIeHh4eKhouGi4aMiI+Hj4qPi5AI7/snFYv3SwWLkI2Qj46Oj4+NkIuSi5qPo5OZkJePk46TjZeOmo6ajpiMmIsIsIsFpIueg5d9ln6Qeol1koSRgo2Aj4CLgIeAlH+Pfot9i4WJhIiCloCQfIt7i3yFfoGACICAfoZ8iwg8iwWMiIyJi4mMiYyJjYmMiIyKi4mPhI2GjYeNh42GjYOMhIyEi4SLhouHi4iLiYuGioYIioWKhomHioeJh4iGh4eIh4aIh4iFiISJhImDioKLhouHjYiPh4+Ij4iRiJGJkIqPCIqPipGKkomTipGKj4qOiZCJkYiQiJCIjoWSgZZ+nIKXgZaBloGWhJGHi4aLh42HjwiIjomQi48IDviUFPiUFYsMCgAAAAADAgABkAAFAAABTAFmAAAARwFMAWYAAAD1ABkAhAAAAAAAAAAAAAAAAAAAAAEQAAAAAAAAAAAAAAAAAAAAAEAAAPFlAeD/4P/gAeAAIAAAAAEAAAAAAAAAAAAAACAAAAAAAAIAAAADAAAAFAADAAEAAAAUAAQAkAAAACAAIAAEAAAAAQAg5gXwBvAN8CPwLvBu8HDwivCX8JzxI/Fl//3//wAAAAAAIOYA8ATwDPAj8C7wbvBw8Ifwl/Cc8SPxZP/9//8AAf/jGgQQBhABD+wP4g+jD6IPjA+AD3wO9g62AAMAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAf//AA8AAQAAAAEAAJrVlLJfDzz1AAsCAAAAAADP/GODAAAAAM/8Y4MAAP/bAgAB2wAAAAgAAgAAAAAAAAABAAAB4P/gAAACAAAAAAACAAABAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAEAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAdwAAAHcAAACAAAjAZMAHwFJAAABbgAAAgAAAAIAAAACAAAAAgAAAAEAAAACAAAAAW4AAAHcAAAB3AABAdwAAAHcAAAAAFAAABwAAAAAAA4ArgABAAAAAAABAAwAAAABAAAAAAACAA4AQAABAAAAAAADAAwAIgABAAAAAAAEAAwATgABAAAAAAAFABYADAABAAAAAAAGAAYALgABAAAAAAAKADQAWgADAAEECQABAAwAAAADAAEECQACAA4AQAADAAEECQADAAwAIgADAAEECQAEAAwATgADAAEECQAFABYADAADAAEECQAGAAwANAADAAEECQAKADQAWgByAGEAdABpAG4AZwBWAGUAcgBzAGkAbwBuACAAMQAuADAAcgBhAHQAaQBuAGdyYXRpbmcAcgBhAHQAaQBuAGcAUgBlAGcAdQBsAGEAcgByAGEAdABpAG4AZwBGAG8AbgB0ACAAZwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABJAGMAbwBNAG8AbwBuAC4AAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==) format('woff')\n  ;\n  font-weight: normal;\n  font-style: normal;\n}\n.ui.rating .icon {\n  font-family: 'Rating';\n  line-height: 1;\n  backface-visibility: hidden;\n  font-weight: normal;\n  font-style: normal;\n  text-align: center;\n}\n\n/* Empty Star */\n.ui.rating .icon:before {\n  content: '\\f005';\n}\n/* Active Star */\n.ui.rating .active.icon:before {\n  content: '\\f005';\n}\n\n/*-------------------\n        Star\n--------------------*/\n\n/* Unfilled Star */\n.ui.star.rating .icon:before {\n  content: '\\f005';\n}\n/* Active Star */\n.ui.star.rating .active.icon:before {\n  content: '\\f005';\n}\n\n/* Partial */\n.ui.star.rating .partial.icon:before {\n  content: '\\f006';\n}\n.ui.star.rating .partial.icon {\n  content: '\\f005';\n}\n\n/*-------------------\n        Heart\n--------------------*/\n\n/* Empty Heart\n.ui.heart.rating .icon:before {\n  content: '\\f08a';\n}\n*/\n.ui.heart.rating .icon:before {\n  content: '\\f004';\n}\n/* Active */\n.ui.heart.rating .active.icon:before {\n  content: '\\f004';\n}\n"
  },
  {
    "path": "semantic/src/themes/default/modules/rating.variables",
    "content": "/*******************************\n             Rating\n*******************************/\n\n@margin: 0em @relativeMini;\n@whiteSpace: nowrap;\n@verticalAlign: baseline;\n\n@iconCursor: pointer;\n@iconWidth: 1.25em;\n@iconHeight: auto;\n@iconTransition:\n  opacity @defaultDuration @defaultEasing,\n  background @defaultDuration @defaultEasing,\n  text-shadow @defaultDuration @defaultEasing,\n  color @defaultDuration @defaultEasing\n;\n\n\n/*-------------------\n        Types\n--------------------*/\n\n/* Standard */\n@inactiveBackground: transparent;\n@inactiveColor: rgba(0, 0, 0, 0.15);\n\n@selectedBackground: @inactiveBackground;\n@selectedColor: @textColor;\n\n@activeBackground: @inactiveBackground;\n@activeColor: @darkTextColor;\n\n/* Star */\n@starIconWidth: @iconWidth;\n@starIconHeight: @iconHeight;\n@starShadowWidth: 1px;\n\n@starInactiveBackground: @inactiveBackground;\n@starInactiveColor: @inactiveColor;\n@starInactiveTextShadow: none;\n\n@starActiveBackground: @activeBackground;\n@starActiveColor: #FFE623;\n@starActiveShadowColor: #DDC507;\n@starActiveTextShadow:\n  0px -@starShadowWidth 0px @starActiveShadowColor,\n  -@starShadowWidth 0px 0px @starActiveShadowColor,\n  0px @starShadowWidth 0px @starActiveShadowColor,\n  @starShadowWidth 0px 0px @starActiveShadowColor\n;\n\n@starSelectedBackground: @selectedBackground;\n@starSelectedColor: #FFCC00;\n@starSelectedShadowColor: #E6A200;\n@starSelectedTextShadow:\n  0px -@starShadowWidth 0px @starSelectedShadowColor,\n  -@starShadowWidth 0px 0px @starSelectedShadowColor,\n  0px @starShadowWidth 0px @starSelectedShadowColor,\n  @starShadowWidth 0px 0px @starSelectedShadowColor\n;\n\n/* Heart */\n@heartIconWidth: 1.4em;\n@heartIconHeight: @iconHeight;\n@heartShadowWidth: 1px;\n\n@heartInactiveBackground: @inactiveBackground;\n@heartInactiveColor: @inactiveColor;\n@heartInactiveTextShadow: none;\n\n@heartActiveBackground: @activeBackground;\n@heartActiveColor: #FF6D75;\n@heartActiveShadowColor: #CD0707;\n@heartActiveTextShadow:\n  0px -@heartShadowWidth 0px @heartActiveShadowColor,\n  -@heartShadowWidth 0px 0px @heartActiveShadowColor,\n  0px @heartShadowWidth 0px @heartActiveShadowColor,\n  @heartShadowWidth 0px 0px @heartActiveShadowColor\n;\n\n@heartSelectedBackground: @selectedBackground;\n@heartSelectedColor: #FF3000;\n@heartSelectedShadowColor: #AA0101;\n@heartSelectedTextShadow:\n  0px -@heartShadowWidth 0px @heartSelectedShadowColor,\n  -@heartShadowWidth 0px 0px @heartSelectedShadowColor,\n  0px @heartShadowWidth 0px @heartSelectedShadowColor,\n  @heartShadowWidth 0px 0px @heartSelectedShadowColor\n;\n\n/*-------------------\n        States\n--------------------*/\n\n@interactiveActiveIconOpacity: 1;\n@interactiveSelectedIconOpacity: 1;\n\n/*-------------------\n      Variations\n--------------------*/\n\n@massive: 2rem;"
  },
  {
    "path": "semantic/src/themes/default/modules/search.overrides",
    "content": "/*******************************\n         Theme Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/themes/default/modules/search.variables",
    "content": "/*******************************\n            Search\n*******************************/\n\n/* Search Prompt */\n@promptBackground: @inputBackground;\n@promptVerticalPadding: @inputVerticalPadding;\n@promptHorizontalPadding: @inputHorizontalPadding;\n@promptLineHeight: @inputLineHeight;\n@promptFontSize: @relativeMedium;\n@promptPadding: (@promptVerticalPadding + ((1em - @promptLineHeight) / 2)) @promptHorizontalPadding;\n@promptBorder: 1px solid @borderColor;\n@promptBorderRadius: @circularRadius;\n@promptColor: @textColor;\n@promptTransition:\n  background-color @defaultDuration @defaultEasing,\n  color @defaultDuration @defaultEasing,\n  box-shadow @defaultDuration @defaultEasing,\n  border-color @defaultDuration @defaultEasing\n;\n@promptBoxShadow: 0em 0em 0em 0em transparent inset;\n\n/* Mobile */\n@mobileMaxWidth: ~\"calc(100vw - 2rem)\";\n\n/* Result Box */\n@resultsWidth: 18em;\n@resultsBackground: #FFFFFF;\n@resultsDistance: 0.5em;\n@resultsBorderRadius: @defaultBorderRadius;\n@resultsBorder: 1px solid @solidBorderColor;\n@resultsBoxShadow: @floatingShadow;\n\n/* Result */\n@resultFontSize: 1em;\n@resultVerticalPadding: @relativeTiny;\n@resultHorizontalPadding: @relativeLarge;\n@resultPadding: @resultVerticalPadding @resultHorizontalPadding;\n@resultTextColor: @textColor;\n@resultLineHeight: 1.33;\n@resultDivider: 1px solid @internalBorderColor;\n@resultLastDivider: none;\n\n/* Result Image */\n@resultImageFloat: right;\n@resultImageBackground: none;\n@resultImageWidth: 5em;\n@resultImageHeight: 3em;\n@resultImageBorderRadius: 0.25em;\n@resultImageMargin: 0em 6em 0em 0em;\n\n/* Result Content */\n@resultTitleFont: @headerFont;\n@resultTitleMargin: -@headerLineHeightOffset 0em 0em;\n@resultTitleFontWeight: @bold;\n@resultTitleFontSize: @relativeMedium;\n@resultTitleColor: @darkTextColor;\n\n/* Description */\n@resultDescriptionFontSize: @relativeSmall;\n@resultDescriptionDistance: 0;\n@resultDescriptionColor: @lightTextColor;\n\n/* Price */\n@resultPriceFloat: right;\n@resultPriceColor: @green;\n\n/* Special Message */\n@messageVerticalPadding: 1em;\n@messageHorizontalPadding: 1em;\n@messageHeaderFontSize: @medium;\n@messageHeaderFontWeight: @bold;\n@messageHeaderColor: @textColor;\n@messageDescriptionDistance: 0.25rem;\n@messageDescriptionFontSize: 1em;\n@messageDescriptionColor: @textColor;\n\n/* All Results Link */\n@actionBorder: none;\n@actionBackground: @darkWhite;\n@actionPadding: @relativeSmall @relativeMedium;\n@actionColor: @textColor;\n@actionFontWeight: @bold;\n@actionAlign: center;\n\n\n/*******************************\n            States\n*******************************/\n\n/* Focus */\n@promptFocusBackground: @promptBackground;\n@promptFocusBorderColor: @selectedBorderColor;\n@promptFocusColor: @selectedTextColor;\n\n/* Hover */\n@resultHoverBackground: @offWhite;\n@actionHoverBackground: #E0E0E0;\n\n/* Loading */\n@invertedLoaderFillColor: rgba(0, 0, 0, 0.15);\n\n/* Active Category */\n@categoryActiveBackground: @darkWhite;\n@categoryNameActiveColor: @textColor;\n\n/* Active Result */\n@resultActiveBorderLeft: @internalBorderColor;\n@resultActiveBackground: @darkWhite;\n@resultActiveBoxShadow: none;\n@resultActiveTitleColor: @darkTextColor;\n@resultActiveDescriptionColor: @darkTextColor;\n@resultsZIndex: 998;\n\n\n/*******************************\n            Types\n*******************************/\n\n/* Selection */\n@selectionPromptBorderRadius: @defaultBorderRadius;\n\n@selectionCloseTop: 0em;\n@selectionCloseTransition:\n  color @defaultDuration @defaultEasing,\n  opacity @defaultDuration @defaultEasing\n;\n@selectionCloseRight: 0em;\n@selectionCloseIconOpacity: 0.8;\n@selectionCloseIconColor: '';\n@selectionCloseIconHoverOpacity: 1;\n@selectionCloseIconHoverColor: @red;\n\n@selectionCloseIconInputRight: 1.85714em;\n\n/* Category */\n@categoryBackground: @darkWhite;\n@categoryBoxShadow: none;\n@categoryDivider: 1px solid @internalBorderColor;\n@categoryTransition:\n  background @defaultDuration @defaultEasing,\n  border-color @defaultDuration @defaultEasing\n;\n\n@categoryResultsWidth: 28em;\n\n@categoryResultBackground: @white;\n@categoryResultLeftBorder: 1px solid @borderColor;\n@categoryResultDivider: @resultDivider;\n@categoryResultLastDivider: none;\n@categoryResultPadding: @resultPadding;\n@categoryResultTransition: @categoryTransition;\n\n@categoryNameWidth: 100px;\n@categoryNameBackground: transparent;\n@categoryNameFont: @pageFont;\n@categoryNameFontSize: 1em;\n@categoryNameWhitespace: nowrap;\n@categoryNamePadding: 0.4em 1em;\n@categoryNameFontWeight: @bold;\n@categoryNameColor: @lightTextColor;\n"
  },
  {
    "path": "semantic/src/themes/default/modules/shape.overrides",
    "content": "/*******************************\n         Theme Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/themes/default/modules/shape.variables",
    "content": "/*******************************\n             Shape\n*******************************/\n\n@display: inline-block;\n\n/* Animating */\n@perspective: 2000px;\n\n@duration: 0.6s;\n@easing: ease-in-out;\n\n@hiddenSideOpacity: 0.6;\n@animatingZIndex: 100;\n\n@transition:\n  transform @duration @easing,\n  left @duration @easing,\n  width @duration @easing,\n  height @duration @easing\n;\n@sideTransition: opacity @duration @easing;\n@backfaceVisibility: hidden;\n\n/* Side */\n@sideMargin: 0em;\n\n/*--------------\n      Types\n---------------*/\n\n/* Cube */\n@cubeSize: 15em;\n@cubeBackground: #E6E6E6;\n@cubePadding: 2em;\n@cubeTextColor: @textColor;\n@cubeBoxShadow: 0px 0px 2px rgba(0, 0, 0, 0.3);\n\n@cubeTextAlign: center;\n@cubeFontSize: 2em;\n"
  },
  {
    "path": "semantic/src/themes/default/modules/sidebar.overrides",
    "content": "/*******************************\n         Theme Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/themes/default/modules/sidebar.variables",
    "content": "/*******************************\n             Sidebar\n*******************************/\n\n/*-------------------\n       Content\n--------------------*/\n\n/* Animation */\n@perspective: 1500px;\n@duration: 500ms;\n@easing: @defaultEasing;\n\n/* Dimmer */\n@dimmerColor: rgba(0, 0, 0, 0.4);\n@dimmerTransition: opacity @duration;\n\n/* Color below page */\n@canvasBackground: @lightBlack;\n\n/* Shadow */\n@boxShadow: 0px 0px 20px @borderColor;\n@horizontalBoxShadow: @boxShadow;\n@verticalBoxShadow: @boxShadow;\n\n/* Layering */\n@bottomLayer: 1;\n@middleLayer: 2;\n@fixedLayer: 101;\n@topLayer: 102;\n@dimmerLayer: 1000;\n\n/*-------------------\n      Variations\n--------------------*/\n\n/* Width */\n@veryThinWidth: 60px;\n@thinWidth: 150px;\n@width: 260px;\n@wideWidth: 350px;\n@veryWideWidth: 475px;\n\n/* Height */\n@height: 36px;\n"
  },
  {
    "path": "semantic/src/themes/default/modules/sticky.overrides",
    "content": "/*******************************\n         Theme Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/themes/default/modules/sticky.variables",
    "content": "/*******************************\n            Sticky\n*******************************/\n\n@transitionDuration: @defaultDuration;\n@transition: none;\n@zIndex: 800;"
  },
  {
    "path": "semantic/src/themes/default/modules/tab.overrides",
    "content": "/*******************************\n         Tab Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/themes/default/modules/tab.variables",
    "content": "/*******************************\n              Tab\n*******************************/\n\n/* Loading */\n@loadingMinHeight: 250px;\n@loadingContentPosition: relative;\n@loadingContentOffset: -10000px;\n\n@loaderDistanceFromTop: 100px;\n@loaderSize: 2.5em;"
  },
  {
    "path": "semantic/src/themes/default/modules/transition.overrides",
    "content": "/*******************************\n          Transitions\n*******************************/\n\n/*\n  Some transitions adapted from Animate CSS\n  https://github.com/daneden/animate.css\n\n  Additional transitions adapted from Glide\n  by Nick Pettit - https://github.com/nickpettit/glide\n*/\n\n/*--------------\n     Browse\n---------------*/\n\n.transition.browse {\n  animation-duration: 500ms;\n}\n.transition.browse.in {\n  animation-name: browseIn;\n}\n.transition.browse.out,\n.transition.browse.left.out {\n  animation-name: browseOutLeft;\n}\n.transition.browse.right.out {\n  animation-name: browseOutRight;\n}\n\n/* In */\n@keyframes browseIn {\n  0% {\n    transform: scale(0.8) translateZ(0px);\n    z-index: -1;\n  }\n  10% {\n    transform: scale(0.8) translateZ(0px);\n    z-index: -1;\n    opacity: 0.7;\n  }\n  80% {\n    transform: scale(1.05) translateZ(0px);\n    opacity: 1;\n    z-index: 999;\n  }\n  100% {\n    transform: scale(1) translateZ(0px);\n    z-index: 999;\n  }\n}\n\n/* Out */\n@keyframes browseOutLeft {\n  0% {\n    z-index: 999;\n    transform: translateX(0%) rotateY(0deg) rotateX(0deg);\n  }\n  50% {\n    z-index: -1;\n    transform: translateX(-105%) rotateY(35deg) rotateX(10deg) translateZ(-10px);\n  }\n  80% {\n    opacity: 1;\n  }\n  100% {\n    z-index: -1;\n    transform: translateX(0%) rotateY(0deg) rotateX(0deg) translateZ(-10px);\n    opacity: 0;\n  }\n}\n@keyframes browseOutRight {\n  0% {\n    z-index: 999;\n    transform: translateX(0%) rotateY(0deg) rotateX(0deg);\n  }\n  50% {\n    z-index: 1;\n    transform: translateX(105%) rotateY(35deg) rotateX(10deg) translateZ(-10px);\n  }\n  80% {\n    opacity: 1;\n  }\n  100% {\n    z-index: 1;\n    transform: translateX(0%) rotateY(0deg) rotateX(0deg) translateZ(-10px);\n    opacity: 0;\n  }\n}\n\n\n/*--------------\n     Drop\n---------------*/\n\n.drop.transition {\n  transform-origin: top center;\n  animation-duration: 400ms;\n  animation-timing-function: cubic-bezier(0.34, 1.61, 0.7, 1);\n}\n.drop.transition.in {\n  animation-name: dropIn;\n}\n.drop.transition.out {\n  animation-name: dropOut;\n}\n\n/* Drop */\n@keyframes dropIn {\n  0% {\n    opacity: 0;\n    transform: scale(0);\n  }\n  100% {\n    opacity: 1;\n    transform: scale(1);\n  }\n}\n@keyframes dropOut {\n  0% {\n    opacity: 1;\n    transform: scale(1);\n  }\n  100% {\n    opacity: 0;\n    transform: scale(0);\n  }\n}\n\n/*--------------\n      Fade\n---------------*/\n\n.transition.fade.in {\n  animation-name: fadeIn;\n}\n.transition[class*=\"fade up\"].in {\n  animation-name: fadeInUp;\n}\n.transition[class*=\"fade down\"].in {\n  animation-name: fadeInDown;\n}\n.transition[class*=\"fade left\"].in {\n  animation-name: fadeInLeft;\n}\n.transition[class*=\"fade right\"].in {\n  animation-name: fadeInRight;\n}\n\n.transition.fade.out {\n  animation-name: fadeOut;\n}\n.transition[class*=\"fade up\"].out {\n  animation-name: fadeOutUp;\n}\n.transition[class*=\"fade down\"].out {\n  animation-name: fadeOutDown;\n}\n.transition[class*=\"fade left\"].out {\n  animation-name: fadeOutLeft;\n}\n.transition[class*=\"fade right\"].out {\n  animation-name: fadeOutRight;\n}\n\n/* In */\n@keyframes fadeIn {\n  0% {\n    opacity: 0;\n  }\n  100% {\n    opacity: 1;\n  }\n}\n@keyframes fadeInUp {\n  0% {\n    opacity: 0;\n    transform: translateY(10%);\n  }\n  100% {\n    opacity: 1;\n    transform: translateY(0%);\n  }\n}\n@keyframes fadeInDown {\n  0% {\n    opacity: 0;\n    transform: translateY(-10%);\n  }\n  100% {\n    opacity: 1;\n    transform: translateY(0%);\n  }\n}\n@keyframes fadeInLeft {\n  0% {\n    opacity: 0;\n    transform: translateX(10%);\n  }\n  100% {\n    opacity: 1;\n    transform: translateX(0%);\n  }\n}\n@keyframes fadeInRight {\n  0% {\n    opacity: 0;\n    transform: translateX(-10%);\n  }\n  100% {\n    opacity: 1;\n    transform: translateX(0%);\n  }\n}\n\n/* Out */\n@keyframes fadeOut {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n  }\n}\n@keyframes fadeOutUp {\n  0% {\n    opacity: 1;\n    transform: translateY(0%);\n  }\n  100% {\n    opacity: 0;\n    transform: translateY(5%);\n  }\n}\n@keyframes fadeOutDown {\n  0% {\n    opacity: 1;\n    transform: translateY(0%);\n  }\n  100% {\n    opacity: 0;\n    transform: translateY(-5%);\n  }\n}\n@keyframes fadeOutLeft {\n  0% {\n    opacity: 1;\n    transform: translateX(0%);\n  }\n  100% {\n    opacity: 0;\n    transform: translateX(5%);\n  }\n}\n@keyframes fadeOutRight {\n  0% {\n    opacity: 1;\n    transform: translateX(0%);\n  }\n  100% {\n    opacity: 0;\n    transform: translateX(-5%);\n  }\n}\n\n/*--------------\n     Flips\n---------------*/\n\n.flip.transition.in,\n.flip.transition.out {\n  animation-duration: 600ms;\n}\n.horizontal.flip.transition.in {\n  animation-name: horizontalFlipIn;\n}\n.horizontal.flip.transition.out {\n  animation-name: horizontalFlipOut;\n}\n.vertical.flip.transition.in {\n  animation-name: verticalFlipIn;\n}\n.vertical.flip.transition.out {\n  animation-name: verticalFlipOut;\n}\n\n/* In */\n@keyframes horizontalFlipIn {\n  0% {\n    transform: perspective(2000px) rotateY(-90deg);\n    opacity: 0;\n  }\n  100% {\n    transform: perspective(2000px) rotateY(0deg);\n    opacity: 1;\n  }\n}\n@keyframes verticalFlipIn {\n  0% {\n    transform: perspective(2000px) rotateX(-90deg);\n    opacity: 0;\n  }\n  100% {\n    transform: perspective(2000px) rotateX(0deg);\n    opacity: 1;\n  }\n}\n\n/* Out */\n@keyframes horizontalFlipOut {\n  0% {\n    transform: perspective(2000px) rotateY(0deg);\n    opacity: 1;\n  }\n  100% {\n    transform: perspective(2000px) rotateY(90deg);\n    opacity: 0;\n  }\n}\n@keyframes verticalFlipOut {\n  0% {\n    transform: perspective(2000px) rotateX(0deg);\n    opacity: 1;\n  }\n  100% {\n    transform: perspective(2000px) rotateX(-90deg);\n    opacity: 0;\n  }\n}\n\n/*--------------\n      Scale\n---------------*/\n\n.scale.transition.in {\n  animation-name: scaleIn;\n}\n.scale.transition.out {\n  animation-name: scaleOut;\n}\n\n@keyframes scaleIn {\n  0% {\n    opacity: 0;\n    transform: scale(0.8);\n  }\n  100% {\n    opacity: 1;\n    transform: scale(1);\n  }\n}\n\n/* Out */\n@keyframes scaleOut {\n  0% {\n    opacity: 1;\n    transform: scale(1);\n  }\n  100% {\n    opacity: 0;\n    transform: scale(0.9);\n  }\n}\n\n\n/*--------------\n      Fly\n---------------*/\n\n/* Inward */\n.transition.fly {\n  animation-duration: 0.6s;\n  transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n}\n.transition.fly.in {\n  animation-name: flyIn;\n}\n.transition[class*=\"fly up\"].in {\n  animation-name: flyInUp;\n}\n.transition[class*=\"fly down\"].in {\n  animation-name: flyInDown;\n}\n.transition[class*=\"fly left\"].in {\n  animation-name: flyInLeft;\n}\n.transition[class*=\"fly right\"].in {\n  animation-name: flyInRight;\n}\n\n/* Outward */\n.transition.fly.out {\n  animation-name: flyOut;\n}\n.transition[class*=\"fly up\"].out {\n  animation-name: flyOutUp;\n}\n.transition[class*=\"fly down\"].out {\n  animation-name: flyOutDown;\n}\n.transition[class*=\"fly left\"].out {\n  animation-name: flyOutLeft;\n}\n.transition[class*=\"fly right\"].out {\n  animation-name: flyOutRight;\n}\n\n/* In */\n@keyframes flyIn {\n  0% {\n    opacity: 0;\n    transform: scale3d(.3, .3, .3);\n  }\n  20% {\n    transform: scale3d(1.1, 1.1, 1.1);\n  }\n  40% {\n    transform: scale3d(.9, .9, .9);\n  }\n  60% {\n    opacity: 1;\n    transform: scale3d(1.03, 1.03, 1.03);\n  }\n  80% {\n    transform: scale3d(.97, .97, .97);\n  }\n  100% {\n    opacity: 1;\n    transform: scale3d(1, 1, 1);\n  }\n}\n@keyframes flyInUp {\n  0% {\n    opacity: 0;\n    transform: translate3d(0, 1500px, 0);\n  }\n  60% {\n    opacity: 1;\n    transform: translate3d(0, -20px, 0);\n  }\n  75% {\n    transform: translate3d(0, 10px, 0);\n  }\n  90% {\n    transform: translate3d(0, -5px, 0);\n  }\n  100% {\n    transform: translate3d(0, 0, 0);\n  }\n}\n@keyframes flyInDown {\n  0% {\n    opacity: 0;\n    transform: translate3d(0, -1500px, 0);\n  }\n  60% {\n    opacity: 1;\n    transform: translate3d(0, 25px, 0);\n  }\n  75% {\n    transform: translate3d(0, -10px, 0);\n  }\n  90% {\n    transform: translate3d(0, 5px, 0);\n  }\n  100% {\n    transform: none;\n  }\n}\n@keyframes flyInLeft {\n  0% {\n    opacity: 0;\n    transform: translate3d(1500px, 0, 0);\n  }\n  60% {\n    opacity: 1;\n    transform: translate3d(-25px, 0, 0);\n  }\n  75% {\n    transform: translate3d(10px, 0, 0);\n  }\n  90% {\n    transform: translate3d(-5px, 0, 0);\n  }\n  100% {\n    transform: none;\n  }\n}\n@keyframes flyInRight {\n  0% {\n    opacity: 0;\n    transform: translate3d(-1500px, 0, 0);\n  }\n  60% {\n    opacity: 1;\n    transform: translate3d(25px, 0, 0);\n  }\n  75% {\n    transform: translate3d(-10px, 0, 0);\n  }\n  90% {\n    transform: translate3d(5px, 0, 0);\n  }\n  100% {\n    transform: none;\n  }\n}\n\n/* Out */\n@keyframes flyOut {\n  20% {\n    transform: scale3d(.9, .9, .9);\n  }\n  50%, 55% {\n    opacity: 1;\n    transform: scale3d(1.1, 1.1, 1.1);\n  }\n  100% {\n    opacity: 0;\n    transform: scale3d(.3, .3, .3);\n  }\n}\n@keyframes flyOutUp {\n  20% {\n    transform: translate3d(0, 10px, 0);\n  }\n  40%, 45% {\n    opacity: 1;\n    transform: translate3d(0, -20px, 0);\n  }\n  100% {\n    opacity: 0;\n    transform: translate3d(0, 2000px, 0);\n  }\n}\n@keyframes flyOutDown {\n  20% {\n    transform: translate3d(0, -10px, 0);\n  }\n  40%, 45% {\n    opacity: 1;\n    transform: translate3d(0, 20px, 0);\n  }\n  100% {\n    opacity: 0;\n    transform: translate3d(0, -2000px, 0);\n  }\n}\n@keyframes flyOutRight {\n  20% {\n    opacity: 1;\n    transform: translate3d(20px, 0, 0);\n  }\n  100% {\n    opacity: 0;\n    transform: translate3d(-2000px, 0, 0);\n  }\n}\n@keyframes flyOutLeft {\n  20% {\n    opacity: 1;\n    transform: translate3d(-20px, 0, 0);\n  }\n  100% {\n    opacity: 0;\n    transform: translate3d(2000px, 0, 0);\n  }\n}\n\n/*--------------\n     Slide\n---------------*/\n\n.transition.slide.in,\n.transition[class*=\"slide down\"].in {\n  animation-name: slideInY;\n  transform-origin: top center;\n}\n.transition[class*=\"slide up\"].in {\n  animation-name: slideInY;\n  transform-origin: bottom center;\n}\n.transition[class*=\"slide left\"].in {\n  animation-name: slideInX;\n  transform-origin: center right;\n}\n.transition[class*=\"slide right\"].in {\n  animation-name: slideInX;\n  transform-origin: center left;\n}\n\n.transition.slide.out,\n.transition[class*=\"slide down\"].out {\n  animation-name: slideOutY;\n  transform-origin: top center;\n}\n.transition[class*=\"slide up\"].out {\n  animation-name: slideOutY;\n  transform-origin: bottom center;\n}\n.transition[class*=\"slide left\"].out {\n  animation-name: slideOutX;\n  transform-origin: center right;\n}\n.transition[class*=\"slide right\"].out {\n  animation-name: slideOutX;\n  transform-origin: center left;\n}\n\n/* In */\n@keyframes slideInY {\n  0% {\n    opacity: 0;\n    transform: scaleY(0);\n  }\n  100% {\n    opacity: 1;\n    transform: scaleY(1);\n  }\n}\n@keyframes slideInX {\n  0% {\n    opacity: 0;\n    transform: scaleX(0);\n  }\n  100% {\n    opacity: 1;\n    transform: scaleX(1);\n  }\n}\n\n/* Out */\n@keyframes slideOutY {\n  0% {\n    opacity: 1;\n    transform: scaleY(1);\n  }\n  100% {\n    opacity: 0;\n    transform: scaleY(0);\n  }\n}\n@keyframes slideOutX {\n  0% {\n    opacity: 1;\n    transform: scaleX(1);\n  }\n  100% {\n    opacity: 0;\n    transform: scaleX(0);\n  }\n}\n\n\n/*--------------\n     Swing\n---------------*/\n\n.transition.swing {\n  animation-duration: 800ms;\n}\n\n.transition[class*=\"swing down\"].in {\n  animation-name: swingInX;\n  transform-origin: top center;\n}\n.transition[class*=\"swing up\"].in {\n  animation-name: swingInX;\n  transform-origin: bottom center;\n}\n.transition[class*=\"swing left\"].in {\n  animation-name: swingInY;\n  transform-origin: center right;\n}\n.transition[class*=\"swing right\"].in {\n  animation-name: swingInY;\n  transform-origin: center left;\n}\n\n.transition.swing.out,\n.transition[class*=\"swing down\"].out {\n  animation-name: swingOutX;\n  transform-origin: top center;\n}\n.transition[class*=\"swing up\"].out {\n  animation-name: swingOutX;\n  transform-origin: bottom center;\n}\n.transition[class*=\"swing left\"].out {\n  animation-name: swingOutY;\n  transform-origin: center right;\n}\n.transition[class*=\"swing right\"].out {\n  animation-name: swingOutY;\n  transform-origin: center left;\n}\n\n/* In */\n@keyframes swingInX {\n  0% {\n    transform: perspective(1000px) rotateX(90deg);\n    opacity: 0;\n  }\n  40% {\n    transform: perspective(1000px) rotateX(-30deg);\n    opacity: 1;\n  }\n  60% {\n    transform: perspective(1000px) rotateX(15deg);\n  }\n  80% {\n    transform: perspective(1000px) rotateX(-7.5deg);\n  }\n  100% {\n    transform: perspective(1000px) rotateX(0deg);\n  }\n}\n@keyframes swingInY {\n  0% {\n    transform: perspective(1000px) rotateY(-90deg);\n    opacity: 0;\n  }\n  40% {\n    transform: perspective(1000px) rotateY(30deg);\n    opacity: 1;\n  }\n  60% {\n    transform: perspective(1000px) rotateY(-17.5deg);\n  }\n  80% {\n    transform: perspective(1000px) rotateY(7.5deg);\n  }\n  100% {\n    transform: perspective(1000px) rotateY(0deg);\n  }\n}\n\n/* Out */\n@keyframes swingOutX {\n  0% {\n    transform: perspective(1000px) rotateX(0deg);\n  }\n  40% {\n    transform: perspective(1000px) rotateX(-7.5deg);\n  }\n  60% {\n    transform: perspective(1000px) rotateX(17.5deg);\n  }\n  80% {\n    transform: perspective(1000px) rotateX(-30deg);\n    opacity: 1;\n  }\n  100% {\n    transform: perspective(1000px) rotateX(90deg);\n    opacity: 0;\n  }\n}\n@keyframes swingOutY {\n  0% {\n    transform: perspective(1000px) rotateY(0deg);\n  }\n  40% {\n    transform: perspective(1000px) rotateY(7.5deg);\n  }\n  60% {\n    transform: perspective(1000px) rotateY(-10deg);\n  }\n  80% {\n    transform: perspective(1000px) rotateY(30deg);\n    opacity: 1;\n  }\n  100% {\n    transform: perspective(1000px) rotateY(-90deg);\n    opacity: 0;\n  }\n}\n\n\n/*--------------\n      Zoom\n---------------*/\n\n.transition.zoom.in {\n  animation-name: zoomIn;\n}\n.transition.zoom.out {\n  animation-name: zoomOut;\n}\n@keyframes zoomIn {\n  0% {\n    opacity: 1;\n    transform: scale(0);\n  }\n  100% {\n    opacity: 1;\n    transform: scale(1);\n  }\n}\n@keyframes zoomOut {\n  0% {\n    opacity: 1;\n    transform: scale(1);\n  }\n  100% {\n    opacity: 1;\n    transform: scale(0);\n  }\n}\n\n\n/*******************************\n       Static Animations\n*******************************/\n\n/*--------------\n    Emphasis\n---------------*/\n\n\n.flash.transition {\n  animation-duration: 750ms;\n  animation-name: flash;\n}\n.shake.transition {\n  animation-duration: 750ms;\n  animation-name: shake;\n}\n.bounce.transition {\n  animation-duration: 750ms;\n  animation-name: bounce;\n}\n.tada.transition {\n  animation-duration: 750ms;\n  animation-name: tada;\n}\n.pulse.transition {\n  animation-duration: 500ms;\n  animation-name: pulse;\n}\n.jiggle.transition {\n  animation-duration: 750ms;\n  animation-name: jiggle;\n}\n.transition.glow {\n  animation-duration: 2000ms;\n  animation-timing-function: cubic-bezier(0.190, 1.000, 0.220, 1.000);\n}\n.transition.glow {\n  animation-name: glow;\n}\n\n\n/* Flash */\n@keyframes flash {\n  0%, 50%, 100% {\n    opacity: 1;\n  }\n  25%, 75% {\n    opacity: 0;\n  }\n}\n\n/* Shake */\n@keyframes shake {\n  0%, 100% {\n    transform: translateX(0);\n  }\n  10%, 30%, 50%, 70%, 90% {\n    transform: translateX(-10px);\n  }\n  20%, 40%, 60%, 80% {\n    transform: translateX(10px);\n  }\n}\n\n/* Bounce */\n@keyframes bounce {\n  0%, 20%, 50%, 80%, 100% {\n    transform: translateY(0);\n  }\n  40% {\n    transform: translateY(-30px);\n  }\n  60% {\n    transform: translateY(-15px);\n  }\n}\n\n/* Tada */\n@keyframes tada {\n  0% {\n    transform: scale(1);\n  }\n  10%, 20% {\n    transform: scale(0.9) rotate(-3deg);\n  }\n  30%, 50%, 70%, 90% {\n    transform: scale(1.1) rotate(3deg);\n  }\n  40%, 60%, 80% {\n    transform: scale(1.1) rotate(-3deg);\n  }\n  100% {\n    transform: scale(1) rotate(0);\n  }\n}\n\n/* Pulse */\n@keyframes pulse {\n  0% {\n    transform: scale(1);\n    opacity: 1;\n  }\n  50% {\n    transform: scale(0.9);\n    opacity: 0.7;\n  }\n  100% {\n    transform: scale(1);\n    opacity: 1;\n  }\n\n}\n\n/* Jiggle */\n@keyframes jiggle {\n  0% {\n    transform: scale3d(1, 1, 1);\n  }\n  30% {\n    transform: scale3d(1.25, 0.75, 1);\n  }\n  40% {\n    transform: scale3d(0.75, 1.25, 1);\n  }\n  50% {\n    transform: scale3d(1.15, 0.85, 1);\n  }\n  65% {\n    transform: scale3d(.95, 1.05, 1);\n  }\n  75% {\n    transform: scale3d(1.05, .95, 1);\n  }\n  100% {\n    transform: scale3d(1, 1, 1);\n  }\n}\n\n/* Glow */\n@keyframes glow {\n  0% {\n    background-color: #FCFCFD;\n  }\n  30% {\n    background-color: #FFF6CD;\n  }\n  100% {\n    background-color: #FCFCFD;\n  }\n}\n\n"
  },
  {
    "path": "semantic/src/themes/default/modules/transition.variables",
    "content": "/*******************************\n          Transition\n*******************************/\n\n@transitionDefaultEasing: @defaultEasing;\n@transitionDefaultFill: both;\n@transitionDefaultDuration: 300ms;\n\n@use3DAcceleration: translateZ(0);\n@backfaceVisibility: hidden;"
  },
  {
    "path": "semantic/src/themes/default/views/ad.overrides",
    "content": "/*******************************\n         Theme Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/themes/default/views/ad.variables",
    "content": "/*******************************\n          Advertisement\n*******************************/\n\n@margin: 1em 0em;\n@overflow: hidden;\n\n@testBackground: @lightBlack;\n@testColor: @white;\n@testFontWeight: @bold;\n@testText: 'Ad';\n@testFontSize: @relativeMedium;\n@testMobileFontSize: @relativeTiny;\n"
  },
  {
    "path": "semantic/src/themes/default/views/card.overrides",
    "content": "/*******************************\n         Theme Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/themes/default/views/card.variables",
    "content": "/*******************************\n             Card\n*******************************/\n\n/*-------------------\n         View\n--------------------*/\n\n/* Shadow */\n@shadowDistance: 1px;\n@shadowBoxShadow: 0px @shadowDistance 3px 0px @solidBorderColor;\n\n/* Card */\n@fontFamily: @pageFont;\n@display: flex;\n@background: @white;\n@borderRadius: @defaultBorderRadius;\n@margin: 1em 0em;\n@minHeight: 0px;\n@padding: 0em;\n@width: 290px;\n@borderWidth: 1px;\n@borderShadow: 0px 0px 0px @borderWidth @solidBorderColor;\n@boxShadow:\n  @shadowBoxShadow,\n  @borderShadow\n;\n@border: none;\n@zIndex: '';\n@transition:\n  box-shadow @defaultDuration @defaultEasing,\n  transform @defaultDuration @defaultEasing\n;\n\n/* Card Group */\n@horizontalSpacing: 1em;\n@rowSpacing: 1.75em;\n\n@groupMargin: -(@rowSpacing / 2) -(@horizontalSpacing / 2);\n@groupDisplay: flex;\n\n@groupCardFloat: none;\n@groupCardDisplay: flex;\n@groupCardMargin: (@rowSpacing / 2) (@horizontalSpacing / 2);\n\n/* Consecutive Cards */\n@consecutiveGroupDistance: (@rowSpacing / 2);\n\n/*-------------------\n       Content\n--------------------*/\n\n\n/* Image */\n@imageBackground: @transparentBlack;\n@imagePadding: 0em;\n@imageBorder: none;\n@imageBoxShadow: none;\n@imageBorder: none;\n\n/* Content */\n@contentDivider: @borderWidth solid @internalBorderColor;\n@contentMargin: 0em;\n@contentBackground: none;\n@contentPadding: 1em 1em;\n@contentFontSize: 1em;\n@contentBorderRadius: 0em;\n@contentBoxShadow: none;\n@contentBorder: none;\n\n\n/* Header */\n@headerMargin: '';\n@headerFontWeight: @bold;\n@headerFontSize: @relativeBig;\n@headerLineHeightOffset: -(@lineHeight - 1em) / 2;\n@headerColor: @darkTextColor;\n\n/* Metadata */\n@metaFontSize: @relativeMedium;\n@metaSpacing: 0.3em;\n@metaColor: @lightTextColor;\n\n/* Icons */\n@actionOpacity: 0.75;\n@actionHoverOpacity: 1;\n@actionTransition: color @defaultDuration @defaultEasing;\n\n@starColor: #FFB70A;\n@starActiveColor: #FFE623;\n\n@likeColor: #FF2733;\n@likeActiveColor: #FF2733;\n\n/* Links */\n@contentLinkColor: '';\n@contentLinkHoverColor: '';\n@contentLinkTransition: color @defaultDuration @defaultEasing;\n\n@headerLinkColor: @headerColor;\n@headerLinkHoverColor: @linkHoverColor;\n\n@metaLinkColor: @lightTextColor;\n@metaLinkHoverColor: @textColor;\n\n/* Description */\n@descriptionDistance: 0.5em;\n@descriptionColor: rgba(0, 0, 0, 0.68);\n\n/* Content Image */\n@contentImageWidth: '';\n@contentImageVerticalAlign: middle;\n\n/* Avatar Image */\n@avatarSize: 2em;\n@avatarBorderRadius: @circularRadius;\n\n/* Paragraph */\n@paragraphDistance: 0.5em;\n\n/* Dimmer */\n@dimmerZIndex: 10;\n@dimmerColor: '';\n\n/* Additional Content */\n@extraDivider: 1px solid rgba(0, 0, 0, 0.05);\n@extraBackground: none;\n@extraPosition: static;\n@extraWidth: auto;\n@extraTop: 0em;\n@extraLeft: 0em;\n@extraMargin: 0em 0em;\n@extraPadding: 0.75em 1em;\n@extraBoxShadow: none;\n@extraColor: @lightTextColor;\n@extraTransition: color @defaultDuration @defaultEasing;\n\n/* Extra Links */\n@extraLinkColor: @unselectedTextColor;\n@extraLinkHoverColor: @linkHoverColor;\n\n/* Buttons */\n@buttonMargin: 0px -@borderWidth;\n@buttonWidth: ~\"calc(100% + \"(@borderWidth * 2)~\")\";\n\n/*-------------------\n      Variations\n--------------------*/\n\n/* Link */\n@linkHoverBackground: @white;\n@linkHoverBorder: @border;\n@linkHoverZIndex: 5;\n@linkHoverRaiseDistance: 3px;\n@linkHoverTransform: translateY(-@linkHoverRaiseDistance);\n\n@shadowHoverBoxShadow: 0px @shadowDistance @linkHoverRaiseDistance 0px @solidSelectedBorderColor;\n@linkHoverBoxShadow:\n  @shadowHoverBoxShadow,\n  @borderShadow\n;\n\n\n/* Raised */\n@raisedShadow:\n  @borderShadow,\n  @floatingShadow\n;\n@raisedShadowHover:\n  @borderShadow,\n  @floatingShadowHover\n;\n\n/* Card Count */\n@wideCardSpacing: 1em;\n@cardSpacing: 0.75em;\n@smallCardSpacing: 0.5em;\n\n@oneCardSpacing: 0em;\n@twoCardSpacing: @wideCardSpacing;\n@threeCardSpacing: @wideCardSpacing;\n@fourCardSpacing: @cardSpacing;\n@fiveCardSpacing: @cardSpacing;\n@sixCardSpacing: @cardSpacing;\n@sevenCardSpacing: @smallCardSpacing;\n@eightCardSpacing: @smallCardSpacing;\n@nineCardSpacing: @smallCardSpacing;\n@tenCardSpacing: @smallCardSpacing;\n\n@oneCard: @oneColumn;\n@oneCardOffset: 0em;\n@twoCard: ~\"calc(\"@twoColumn~\" - \"(@twoCardSpacing * 2)~\")\";\n@twoCardOffset: -@twoCardSpacing;\n@threeCard: ~\"calc(\"@threeColumn~\" - \"(@threeCardSpacing * 2)~\")\";\n@threeCardOffset: -@threeCardSpacing;\n@fourCard: ~\"calc(\"@fourColumn~\" - \"(@fourCardSpacing * 2)~\")\";\n@fourCardOffset: -@fourCardSpacing;\n@fiveCard: ~\"calc(\"@fiveColumn~\" - \"(@fiveCardSpacing * 2)~\")\";\n@fiveCardOffset: -@fiveCardSpacing;\n@sixCard: ~\"calc(\"@sixColumn~\" - \"(@sixCardSpacing * 2)~\")\";\n@sixCardOffset: -@sixCardSpacing;\n@sevenCard: ~\"calc(\"@sevenColumn~\" - \"(@sevenCardSpacing * 2)~\")\";\n@sevenCardOffset: -@sevenCardSpacing;\n@eightCard: ~\"calc(\"@eightColumn~\" - \"(@sevenCardSpacing * 2)~\")\";\n@eightCardOffset: -@sevenCardSpacing;\n@nineCard: ~\"calc(\"@nineColumn~\" - \"(@nineCardSpacing * 2)~\")\";\n@nineCardOffset: -@nineCardSpacing;\n@tenCard: ~\"calc(\"@tenColumn~\" - \"(@tenCardSpacing * 2)~\")\";\n@tenCardOffset: -@tenCardSpacing;\n\n/* Stackable */\n@stackableRowSpacing: 1em;\n@stackableCardSpacing: 1em;\n@stackableMargin: ~\"calc(\"@oneColumn~\" - \"(@stackableCardSpacing * 2)~\")\";\n\n/* Sizes */\n@medium: 1em;\n\n/* Colored */\n@coloredShadowDistance: 2px;\n"
  },
  {
    "path": "semantic/src/themes/default/views/comment.overrides",
    "content": "/*******************************\n         Theme Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/themes/default/views/comment.variables",
    "content": "/*******************************\n            Comments\n*******************************/\n\n\n/*-------------------\n       View\n--------------------*/\n\n@maxWidth: 650px;\n@margin: 1.5em 0em;\n\n/*-------------------\n      Elements\n--------------------*/\n\n/* Comment */\n@commentBackground: none;\n@commentMargin: 0.5em 0em 0em;\n@commentPadding: 0.5em 0em 0em;\n@commentDivider: none;\n@commentBorder: none;\n@commentLineHeight: 1.2;\n@firstCommentMargin: 0em;\n@firstCommentPadding: 0em;\n\n/* Nested Comment */\n@nestedCommentsMargin: 0em 0em 0.5em 0.5em;\n@nestedCommentsPadding: 1em 0em 1em 1em;\n\n@nestedCommentDivider: none;\n@nestedCommentBorder: none;\n@nestedCommentBackground: none;\n\n/* Avatar */\n@avatarDisplay: block;\n@avatarFloat: left;\n@avatarWidth: 2.5em;\n@avatarHeight: auto;\n@avatarSpacing: 1em;\n@avatarMargin: (@commentLineHeight - 1em) 0em 0em;\n@avatarBorderRadius: 0.25rem;\n\n/* Content */\n@contentMargin: @avatarWidth + @avatarSpacing;\n\n/* Author */\n@authorFontSize: 1em;\n@authorColor: @textColor;\n@authorHoverColor: @linkHoverColor;\n@authorFontWeight: @bold;\n\n/* Metadata */\n@metadataDisplay: inline-block;\n@metadataFontSize: 0.875em;\n@metadataSpacing: 0.5em;\n@metadataContentSpacing: 0.5em;\n@metadataColor: @lightTextColor;\n\n/* Text */\n@textFontSize: 1em;\n@textMargin: 0.25em 0em 0.5em;\n@textWordWrap: break-word;\n@textLineHeight: 1.3;\n\n/* Actions */\n@actionFontSize: 0.875em;\n@actionContentDistance: 0.75em;\n@actionLinkColor: @unselectedTextColor;\n@actionLinkHoverColor: @hoveredTextColor;\n\n/* Reply */\n@replyDistance: 1em;\n@replyHeight: 12em;\n@replyFontSize: 1em;\n\n@commentReplyDistance: @replyDistance;\n\n/*-------------------\n      Variations\n--------------------*/\n\n/* Threaded */\n@threadedCommentMargin: -1.5em 0 -1em  (@avatarWidth / 2);\n@threadedCommentPadding: 3em 0em 2em 2.25em;\n@threadedCommentBoxShadow: -1px 0px 0px @borderColor;\n\n\n/* Minimal */\n@minimalActionPosition: absolute;\n@minimalActionTop: 0px;\n@minimalActionRight: 0px;\n@minimalActionLeft: auto;\n\n@minimalTransitionDelay: 0.1s;\n@minimalEasing: @defaultEasing;\n@minimalDuration: 0.2s;\n@minimalTransition: opacity @minimalDuration @minimalEasing;\n"
  },
  {
    "path": "semantic/src/themes/default/views/feed.overrides",
    "content": "/*******************************\n         Theme Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/themes/default/views/feed.variables",
    "content": "/*******************************\n             Feed\n*******************************/\n\n/*-------------------\n        Feed\n--------------------*/\n\n@margin: 1em 0em;\n\n/*-------------------\n      Elements\n--------------------*/\n\n/* Event */\n@eventWidth: 100%;\n@eventPadding: @3px 0em;\n@eventMargin: 0em;\n@eventBackground: none;\n@eventDivider: none;\n\n/* Event Label */\n@labelWidth: 2.5em;\n@labelHeight: auto;\n@labelAlignSelf: stretch;\n@labelTextAlign: left;\n\n/* Icon Label */\n@iconLabelOpacity: 1;\n@iconLabelWidth: 100%;\n@iconLabelSize: 1.5em;\n@iconLabelPadding: 0.25em;\n@iconLabelBackground: none;\n@iconLabelBorderRadius: none;\n@iconLabelBorder: none;\n@iconLabelColor: rgba(0, 0, 0, 0.6);\n\n/* Image Label */\n@imageLabelWidth: 100%;\n@imageLabelHeight: auto;\n@imageLabelBorderRadius: @circularRadius;\n\n/* Content w/ Label */\n@labeledContentMargin: 0.5em 0em @relative5px @relativeLarge;\n@lastLabeledContentPadding: 0em;\n\n/* Content */\n@contentAlignSelf: stretch;\n@contentTextAlign: left;\n@contentWordWrap: break-word;\n\n/* Date */\n@dateMargin: -0.5rem 0em 0em;\n@datePadding: 0em;\n@dateColor: @lightTextColor;\n@dateFontSize: @relativeMedium;\n@dateFontWeight: @normal;\n@dateFontStyle: @normal;\n\n/* Summary */\n@summaryMargin: 0em;\n@summaryFontSize: @relativeMedium;\n@summaryFontWeight: @bold;\n@summaryColor: @textColor;\n\n/* Summary Image */\n@summaryImageWidth: auto;\n@summaryImageHeight: 10em;\n@summaryImageMargin: -0.25em 0.25em 0em 0em;\n@summaryImageVerticalAlign: middle;\n@summaryImageBorderRadius: 0.25em;\n\n/* Summary Date */\n@summaryDateDisplay: inline-block;\n@summaryDateFloat: none;\n@summaryDateMargin: 0em 0em 0em 0.5em;\n@summaryDatePadding: 0em;\n@summaryDateFontSize: @relativeTiny;\n@summaryDateFontWeight: @dateFontWeight;\n@summaryDateFontStyle: @dateFontStyle;\n@summaryDateColor: @dateColor;\n\n/* User */\n@userFontWeight: @bold;\n@userDistance: 0em;\n@userImageWidth: @summaryImageWidth;\n@userImageHeight: @summaryImageHeight;\n@userImageMargin: @summaryImageMargin;\n@userImageVerticalAlign: @summaryImageVerticalAlign;\n\n/* Extra Summary Data */\n@extraMargin: 0.5em 0em 0em;\n@extraBackground: none;\n@extraPadding: 0em;\n@extraColor: @textColor;\n\n/* Extra Images */\n@extraImageMargin: 0em 0.25em 0em 0em;\n@extraImageWidth: 6em;\n\n/* Extra Text */\n@extraTextPadding: 0em;\n@extraTextPointer: none;\n@extraTextFontSize: @relativeMedium;\n@extraTextLineHeight: @lineHeight;\n@extraTextMaxWidth: 500px;\n\n/* Metadata Group */\n@metadataDisplay: inline-block;\n@metadataFontSize: @relativeTiny;\n@metadataMargin: 0.5em 0em 0em;\n@metadataBackground: none;\n@metadataBorder: none;\n@metadataBorderRadius: 0;\n@metadataBoxShadow: none;\n@metadataPadding: 0em;\n@metadataColor: rgba(0, 0, 0, 0.6);\n\n@metadataElementSpacing: 0.75em;\n\n/* Like */\n@likeColor: '';\n@likeHoverColor: #FF2733;\n@likeActiveColor: #EF404A;\n@likeTransition: 0.2s color ease;\n\n/* Metadata Divider */\n@metadataDivider: '';\n@metadataDividerColor: rgba(0, 0, 0, 0.2);\n@metadataDividerOffset: -1em;\n\n@metadataActionCursor: pointer;\n@metadataActionOpacity: 1;\n@metadataActionColor: rgba(0, 0, 0, 0.5);\n@metadataActionTransition: color @defaultDuration @defaultEasing;\n\n@metadataActionHoverColor: @selectedTextColor;\n\n/*-------------------\n      Variations\n--------------------*/\n"
  },
  {
    "path": "semantic/src/themes/default/views/item.overrides",
    "content": "/*******************************\n         Theme Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/themes/default/views/item.variables",
    "content": "/*******************************\n             Item\n*******************************/\n\n/*-------------------\n         View\n--------------------*/\n\n/* Group */\n@groupMargin: 1.5em 0em;\n\n/* Item */\n@display: flex;\n@background: transparent;\n@borderRadius: 0rem;\n@minHeight: 0px;\n@padding: 0em;\n@width: 100%;\n@boxShadow: none;\n@border: none;\n@zIndex: '';\n@transition: box-shadow @defaultDuration @defaultEasing;\n\n/* Responsive */\n@itemSpacing: 1em;\n@imageWidth: 175px;\n@contentImageDistance: 1.5em;\n\n@tabletItemSpacing: 1em;\n@tabletImageWidth: 150px;\n@tabletContentImageDistance: 1em;\n\n@mobileItemSpacing: 2em;\n@mobileImageWidth: auto;\n@mobileImageMaxHeight: 250px;\n@mobileContentImageDistance: 1.5em;\n\n\n/*-------------------\n       Content\n--------------------*/\n\n/* Image */\n@imageDisplay: block;\n@imageFloat: none;\n@imageMaxHeight: '';\n@imageVerticalAlign: top;\n@imageMargin: 0em;\n@imagePadding: 0em;\n@imageBorder: none;\n@imageBorderRadius: 0.125rem;\n@imageBoxShadow: none;\n@imageBorder: none;\n\n/* Content */\n@contentDisplay: block;\n@contentVerticalAlign: top;\n\n@contentWidth: auto;\n@contentOffset: 0em;\n@contentBackground: none;\n@contentMargin: 0em;\n@contentPadding: 0em;\n@contentFontSize: 1em;\n@contentBorder: none;\n@contentBorderRadius: 0em;\n@contentBoxShadow: none;\n\n/* Header */\n@headerMargin: -@lineHeightOffset 0em 0em;\n@headerFontWeight: @bold;\n@headerFontSize: @relativeBig;\n@headerColor: @darkTextColor;\n\n/* Metadata */\n@metaMargin: 0.5em 0em 0.5em;\n@metaFontSize: 1em;\n@metaLineHeight: 1em;\n@metaSpacing: 0.3em;\n@metaColor: rgba(0, 0, 0, 0.6);\n\n/* Icons */\n@actionOpacity: 0.75;\n@actionHoverOpacity: 1;\n@actionTransition: color @defaultDuration @defaultEasing;\n\n/* Actions */\n@favoriteColor: #FFB70A;\n@favoriteActiveColor: #FFE623;\n@likeColor: #FF2733;\n@likeActiveColor: #FF2733;\n\n/* Links */\n@headerLinkColor: @headerColor;\n@headerLinkHoverColor: @linkHoverColor;\n@metaLinkColor: @lightTextColor;\n@metaLinkHoverColor: @textColor;\n@contentLinkColor: '';\n@contentLinkHoverColor: '';\n@contentLinkTransition: color @defaultDuration @defaultEasing;\n\n\n/* Description */\n@descriptionDistance: 0.6em;\n@descriptionMaxWidth: auto;\n@descriptionFontSize: 1em;\n@descriptionLineHeight: @lineHeight;\n@descriptionColor: @textColor;\n\n/* Content Image */\n@contentImageWidth: '';\n@contentImageVerticalAlign: middle;\n\n/* Avatar Image */\n@avatarSize: @contentImageWidth;\n@avatarBorderRadius: @circularRadius;\n\n/* Paragraph */\n@paragraphDistance: 0.5em;\n\n/* Additional Content */\n@extraDivider: none;\n@extraHorizontalSpacing: 0.5rem;\n@extraRowSpacing: 0.5rem;\n\n@extraBackground: none;\n@extraDisplay: block;\n@extraPosition: relative;\n@extraMargin: (1rem - @extraRowSpacing) 0em 0em;\n@extraTop: 0em;\n@extraLeft: 0em;\n@extraWidth: 100%;\n@extraPadding: 0em 0em 0em;\n@extraBoxShadow: none;\n@extraColor: @lightTextColor;\n@extraTransition: color @defaultDuration @defaultEasing;\n\n/*-------------------\n      Variations\n--------------------*/\n\n/* Relaxed */\n@relaxedItemSpacing: 1.5em;\n@veryRelaxedItemSpacing: 2em;\n\n/* Divided */\n@dividedBorder: 1px solid @borderColor;\n@dividedMargin: 0em;\n@dividedPadding: 1em 0em;\n\n@dividedFirstLastMargin: 0em;\n@dividedFirstLastPadding: 0em;\n\n\n/* Unstackable */\n@unstackableMobileImageWidth: 125px;\n\n"
  },
  {
    "path": "semantic/src/themes/default/views/statistic.overrides",
    "content": "/*******************************\n         Theme Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/themes/default/views/statistic.variables",
    "content": "/*******************************\n           Statistic\n*******************************/\n\n/*-------------------\n         View\n--------------------*/\n\n@margin: 1em 0em;\n@textAlign: center;\n@maxWidth: auto;\n\n/* Group */\n@horizontalSpacing: 1.5em;\n@rowSpacing: 2em;\n@groupMargin: 1em -@horizontalSpacing -@rowSpacing;\n\n/* Group Element */\n@elementMargin: 0em @horizontalSpacing @rowSpacing;\n@elementMaxWidth: @maxWidth;\n\n/*-------------------\n       Content\n--------------------*/\n\n/* Value */\n@valueFont: @pageFont;\n@valueFontWeight: @normal;\n@valueLineHeight: 1em;\n@valueColor: @black;\n@valueTextTransform: uppercase;\n\n/* Label */\n@labelSize: @relativeMedium;\n@topLabelDistance: 0rem;\n@bottomLabelDistance: 0rem;\n@labelFont: @headerFont;\n@labelFontWeight: @bold;\n@labelColor: @textColor;\n@labelLineHeight: @relativeLarge;\n@labelTextTransform: uppercase;\n\n/* Text */\n@textValueLineHeight: 1em;\n@textValueMinHeight: 2em;\n@textValueFontWeight: @bold;\n\n/* Label Image */\n@imageHeight: 3rem;\n@imageVerticalAlign: baseline;\n\n/*-------------------\n      Types\n--------------------*/\n\n@horizontalGroupElementMargin: 1em 0em;\n@horizontalLabelDistance: 0.75em;\n\n/*-------------------\n      Variations\n--------------------*/\n\n/* Floated */\n@leftFloatedMargin: 0em 2em 1em 0em;\n@rightFloatedMargin: 0em 0em 1em 2em;\n\n/* Inverted */\n@invertedValueColor: @white;\n@invertedLabelColor: @invertedTextColor;\n\n/* Item Width */\n@itemGroupMargin: 0em 0em -@rowSpacing;\n@itemMargin: 0em 0em @rowSpacing;\n\n/* Size */\n@miniTextValueSize: 1rem;\n@miniValueSize: 1.5rem;\n@miniHorizontalValueSize: 1.5rem;\n\n@tinyTextValueSize: 1rem;\n@tinyValueSize: 2rem;\n@tinyHorizontalValueSize: 2rem;\n\n@smallTextValueSize: 1rem;\n@smallValueSize: 3rem;\n@smallHorizontalValueSize: 2rem;\n\n@textValueSize: 2rem;\n@valueSize: 4rem;\n@horizontalValueSize: 3rem;\n\n@largeTextValueSize: 2.5rem;\n@largeValueSize: 5rem;\n@largeHorizontalValueSize: 4rem;\n\n@hugeTextValueSize: 2.5rem;\n@hugeValueSize: 6rem;\n@hugeHorizontalValueSize: 5rem;\n"
  },
  {
    "path": "semantic/src/themes/duo/elements/loader.overrides",
    "content": "/*******************************\n         Theme Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/themes/duo/elements/loader.variables",
    "content": "/*******************************\n             Loader\n*******************************/\n\n@shapeBorderColor: @primaryColor @primaryColor @secondaryColor @secondaryColor;\n@invertedShapeBorderColor: @lightPrimaryColor @lightPrimaryColor @lightSecondaryColor @lightSecondaryColor;"
  },
  {
    "path": "semantic/src/themes/fixed-width/collections/grid.overrides",
    "content": "/*******************************\n           Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/themes/fixed-width/collections/grid.variables",
    "content": "/* Fixed Page Grid */\n\n@mobileWidth: auto;\n@mobileMargin: 0em;\n@mobileGutter: 0em;\n\n@tabletWidth: auto;\n@tabletMargin: 0em;\n@tabletGutter: 8%;\n\n@computerWidth: 960px;\n@computerMargin: auto;\n@computerGutter: 0;\n\n@largeMonitorWidth: 1180px;\n@largeMonitorMargin: auto;\n@largeMonitorGutter: 0;\n\n@widescreenMonitorWidth: 1300px;\n@widescreenMargin: auto;\n@widescreenMonitorGutter: 0;\n\n@tableWidth: '';"
  },
  {
    "path": "semantic/src/themes/fixed-width/modules/modal.overrides",
    "content": "/*******************************\n           Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/themes/fixed-width/modules/modal.variables",
    "content": "\n/* Responsive Widths */\n@modalComputerWidth: 700px;\n@modalLargeMonitorWidth: 800px;\n@modalWidescreenMonitorWidth: 850px;\n\n@modalComputerMargin: 0em 0em 0em -(@modalComputerWidth / 2);\n@modalLargeMonitorMargin: 0em 0em 0em -(@modalLargeMonitorWidth / 2);\n@modalWidescreenMonitorMargin: 0em 0em 0em -(@modalWidescreenMonitorWidth / 2);\n\n\n/*-------------------\n      Variations\n--------------------*/\n\n/* Sizes */\n@modalSmallRatio: 0.6;\n@modalLargeRatio: 1.2;\n\n/* Derived Responsive Sizes */\n@modalSmallHeaderSize: 1.3em;\n@modalSmallComputerWidth: (@modalComputerWidth * @modalSmallRatio);\n@modalSmallLargeMonitorWidth: (@modalLargeMonitorWidth * @modalSmallRatio);\n@modalSmallWidescreenMonitorWidth: (@modalWidescreenMonitorWidth * @modalSmallRatio);\n\n@modalSmallComputerMargin: 0em 0em 0em -(@modalSmallComputerWidth / 2);\n@modalSmallLargeMonitorMargin: 0em 0em 0em -(@modalSmallLargeMonitorWidth / 2);\n@modalSmallWidescreenMonitorMargin: 0em 0em 0em -(@modalSmallWidescreenMonitorWidth / 2);\n\n@modalLargeHeaderSize: 1.3em;\n@modalLargeComputerWidth: (@modalComputerWidth * @modalLargeRatio);\n@modalLargeLargeMonitorWidth: (@modalLargeMonitorWidth * @modalLargeRatio);\n@modalLargeWidescreenMonitorWidth: (@modalWidescreenMonitorWidth * @modalLargeRatio);\n\n@modalLargeComputerMargin: 0em 0em 0em -(@modalLargeComputerWidth / 2);\n@modalLargeLargeMonitorMargin: 0em 0em 0em -(@modalLargeLargeMonitorWidth / 2);\n@modalLargeWidescreenMonitorMargin: 0em 0em 0em -(@modalLargeWidescreenMonitorWidth / 2);"
  },
  {
    "path": "semantic/src/themes/flat/collections/form.overrides",
    "content": "/*******************************\n           Overrides\n*******************************/\n\n.ui.form input[type=\"text\"],\n.ui.form input[type=\"email\"],\n.ui.form input[type=\"date\"],\n.ui.form input[type=\"password\"],\n.ui.form input[type=\"number\"],\n.ui.form input[type=\"url\"],\n.ui.form input[type=\"tel\"] {\n  border-bottom: 1px solid #DDDDDD;\n}\n\n.ui.form .selection.dropdown {\n  border: none;\n  box-shadow: none !important;\n  border-bottom: 1px solid #DDDDDD;\n  border-radius: 0em !important;\n}\n.ui.form .selection.dropdown > .menu {\n  border-top-width: 1px !important;\n  border-radius: @defaultBorderRadius !important;\n}\n\n.ui.form .ui.icon.input > .icon {\n  width: 1em;\n}"
  },
  {
    "path": "semantic/src/themes/flat/collections/form.variables",
    "content": "/*******************************\n             Form\n*******************************/\n\n/*-------------------\n       Elements\n--------------------*/\n\n\n/* Text */\n@paragraphMargin: 1em 0em;\n\n/* Field */\n@fieldMargin: 0em 0em 1em;\n\n/* Form Label */\n@labelFontSize: @relative11px;\n@labelTextTransform: uppercase;\n\n@groupedLabelTextTransform: none;\n\n/* Input */\n@inputHorizontalPadding: 0.5em;\n@inputBackground: transparent;\n@inputBorder: none;\n@inputBorderRadius: 0em;\n@inputBoxShadow: none;\n@invertedInputColor: @invertedTextColor;\n\n@textAreaPadding: 1em;\n@textAreaBackground: transparent;\n@textAreaFocusBackground: #EEEEEE;\n@textAreaBorder: 1px solid #DDDDDD;\n\n/* Divider */\n@dividerMargin: 1em 0em;\n\n/* Validation Prompt */\n@validationMargin: 0em 0em 0em 1em;\n@validationArrowOffset: -0.3em;\n\n/*-------------------\n        States\n--------------------*/\n\n/* Disabled */\n\n/* Focus */\n@inputFocusPointerSize: 0px;\n@inputErrorPointerSize: 0px;\n\n/* Dropdown Error */\n@dropdownErrorHoverBackground: #FFF2F2;\n@dropdownErrorActiveBackground: #FDCFCF;\n\n/* Focused Error */\n@inputErrorFocusBackground: @negativeBackgroundColor;\n@inputErrorFocusColor: @negativeColorHover;\n@inputErrorFocusBorder: @negativeBorderColor;\n@inputErrorFocusBoxShadow: @inputErrorPointerSize 0em 0em 0em @negativeColorHover inset;\n\n/* Placeholder */\n@inputPlaceholderColor: lighten(@inputColor, 55);\n@inputPlaceholderFocusColor: lighten(@inputColor, 35);\n@inputErrorPlaceholderColor: lighten(@formErrorColor, 10);\n@inputErrorPlaceholderFocusColor: lighten(@formErrorColor, 5);\n\n/* Loading */\n@formLoaderDimmerColor: rgba(255, 255, 255, 0.6);\n@formLoaderPath: \"@{imagePath}/loader-large.gif\";\n@formLoaderPosition: 50% 50%;\n\n/* (x) Wide Field */\n@gutterWidth: 1.5em;\n"
  },
  {
    "path": "semantic/src/themes/flat/globals/site.overrides",
    "content": "/*******************************\n           Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/themes/flat/globals/site.variables",
    "content": "/*******************************\n         Site Settings\n*******************************/\n\n/*-------------------\n        Paths\n--------------------*/\n\n@imagePath : \"../../themes/default/assets/images\";\n@fontPath  : \"../../themes/default/assets/fonts\";\n\n/*-------------------\n       Fonts\n--------------------*/\n\n@headerFont    : \"Open Sans\", \"Helvetica Neue\", Arial, Helvetica, sans-serif;\n@pageFont      : \"Open Sans\", \"Helvetica Neue\", Arial, Helvetica, sans-serif;\n@fontSmoothing : antialiased;\n\n/*-------------------\n      Site Colors\n--------------------*/\n\n/*---  Colors  ---*/\n@blue             : #0074D9;\n@green            : #2ECC40;\n@orange           : #FF851B;\n@pink             : #D9499A;\n@purple           : #A24096;\n@red              : #FF4136;\n@teal             : #39CCCC;\n@yellow           : #FFCB08;\n\n@black            : #191919;\n@grey             : #CCCCCC;\n@white            : #FFFFFF;\n\n/*---  Light Colors  ---*/\n@lightBlue        : #54C8FF;\n@lightGreen       : #2ECC40;\n@lightOrange      : #FF851B;\n@lightPink        : #FF8EDF;\n@lightPurple      : #CDC6FF;\n@lightRed         : #FF695E;\n@lightTeal        : #6DFFFF;\n@lightYellow      : #FFE21F;\n\n@primaryColor     : @blue;\n@secondaryColor   : @black;\n\n\n/*-------------------\n        Page\n--------------------*/\n\n@bodyBackground      : #FCFCFC;\n@fontSize            : 14px;\n@textColor           : rgba(0, 0, 0, 0.8);\n\n@headerMargin        : 1em 0em 1rem;\n@paragraphMargin     : 0em 0em 1em;\n\n@linkColor           : #009FDA;\n@linkUnderline       : none;\n@linkHoverColor      : lighten( @linkColor, 5);\n@linkHoverUnderline  : @linkUnderline;\n\n@highlightBackground : #FFFFCC;\n@highlightColor      : @textColor;\n\n\n\n/*-------------------\n  Background Colors\n--------------------*/\n\n@subtleTransparentBlack : rgba(0, 0, 0, 0.03);\n@transparentBlack       : rgba(0, 0, 0, 0.05);\n@strongTransparentBlack : rgba(0, 0, 0, 0.10);\n\n@subtleTransparentWhite : rgba(255, 255, 255, 0.01);\n@transparentWhite       : rgba(255, 255, 255, 0.05);\n@strongTransparentWhite : rgba(255, 255, 255, 0.01);\n\n/* Used for differentiating neutrals */\n@subtleGradient: linear-gradient(transparent, rgba(0, 0, 0, 0.05));\n\n/* Used for differentiating layers */\n@subtleShadow: 0px 1px 2px 0 rgba(0, 0, 0, 0.05);\n\n\n/*-------------------\n        Grid\n--------------------*/\n\n@columnCount: 16;\n\n/*-------------------\n     Breakpoints\n--------------------*/\n\n@mobileBreakpoint            : 320px;\n@tabletBreakpoint            : 768px;\n@computerBreakpoint          : 992px;\n@largeMonitorBreakpoint      : 1400px;\n@widescreenMonitorBreakpoint : 1900px;\n\n"
  },
  {
    "path": "semantic/src/themes/github/collections/breadcrumb.variables",
    "content": "/*******************************\n         Site Overrides\n*******************************/\n\n@dividerOpacity: 1;\n@dividerSpacing: 0;\n@dividerSize: @big;\n@dividerColor: inherit;\n\n@huge: 1.5384em;\n\n"
  },
  {
    "path": "semantic/src/themes/github/collections/form.overrides",
    "content": "/*******************************\n           Overrides\n*******************************/\n\n.ui.selection.dropdown {\n  background-color: #FAFAFA;\n  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075) inset;\n  border-color: #CCCCCC;\n}\n\n.ui.selection.dropdown:focus {\n  box-shadow:\n    0px 1px 2px rgba(0, 0, 0, 0.075) inset,\n    0px 0px 5px rgba(81, 167, 232, 0.5)\n  ;\n}"
  },
  {
    "path": "semantic/src/themes/github/collections/form.variables",
    "content": "/*******************************\n            Form\n*******************************/\n\n/*-------------------\n       Elements\n--------------------*/\n\n@inputBackground: #FAFAFA;\n@inputBorder: 1px solid #CCCCCC;\n@inputBoxShadow: 0 1px 2px rgba(0, 0, 0, 0.075) inset;\n@inputBorderRadius: 3px;\n\n@labelFontWeight: bold;\n@labelDistance: 6px;\n\n/*-------------------\n        States\n--------------------*/\n\n@inputFocusBackground: #FFFFFF;\n@inputFocusBoxShadow:\n  0px 1px 2px rgba(0, 0, 0, 0.075) inset,\n  0px 0px 5px rgba(81, 167, 232, 0.5)\n;\n@inputFocusBorderColor: #51A7E8;\n@inputFocusBorderRadius: @inputBorderRadius;\n\n/*-------------------\n        Types\n--------------------*/\n\n\n/*-------------------\n      Variations\n--------------------*/\n\n/*-------------------\n       Groups\n--------------------*/\n"
  },
  {
    "path": "semantic/src/themes/github/collections/grid.variables",
    "content": "\n@gutterWidth: 1.538rem;"
  },
  {
    "path": "semantic/src/themes/github/collections/menu.overrides",
    "content": "/*******************************\n           Overrides\n*******************************/\n\n.ui.menu .item > .label {\n  box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0.1) inset;\n}"
  },
  {
    "path": "semantic/src/themes/github/collections/menu.variables",
    "content": "/*-------------------\n      Collection\n--------------------*/\n\n@itemVerticalPadding: 1em;\n@itemHorizontalPadding: 1.25em;\n\n@background: #FFFFFF linear-gradient(rgba(255, 255, 255, 0.05), rgba(0, 0, 0, 0.05));\n@fontWeight: normal;\n\n@activeBorderSize: 0em;\n\n@hoverBackground: rgba(0, 0, 0, 0.02);\n@downBackground: rgba(0, 0, 0, 0.06);\n\n@activeBackground: rgba(0, 0, 0, 0.04);\n@activeHoverBackground: rgba(0, 0, 0, 0.04);\n\n\n@headerBackground: rgba(0, 0, 0, 0.08);\n\n@subMenuMargin: 0.5em -0.6em 0;\n@subMenuHorizontalPadding: 0.7em;\n\n@arrowHoverColor: #EEEEEE;\n@arrowActiveColor: #EEEEEE;\n@arrowVerticalHoverColor: #F4F4F4;\n@arrowVerticalActiveColor: #F4F4F4;\n\n@dividerBackground: #E8E8E8;\n@verticalDividerBackground: #E8E8E8;\n\n/*-------------------\n      Elements\n--------------------*/\n\n@buttonOffset: -0.15em;\n@buttonVerticalPadding: 0.75em;\n\n/*-------------------\n        Types\n--------------------*/\n\n@paginationMinWidth: 3.5em;\n\n@tieredActiveItemBackground: #F5F5F5;\n@tieredActiveMenuBackground: #F5F5F5;\n\n/*-------------------\n      Variations\n--------------------*/\n\n@verticalBackground: #FFFFFF;\n@verticalItemBackground: linear-gradient(rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.02));\n\n@invertedBackground: @black linear-gradient(rgba(255, 255, 255, 0.05), rgba(0, 0, 0, 0.0));\n@invertedBoxShadow             :\n  0px 1px 2px 0px rgba(0, 0, 0, 0.15),\n  0px 0px 0px 1px rgba(255, 255, 255, 0.15)\n;\n@secondaryVerticalPadding: 0.75em;"
  },
  {
    "path": "semantic/src/themes/github/collections/message.overrides",
    "content": ".ui.info.message {\n  background: linear-gradient(#D8EBF8, #D0E3EF);\n}\n.ui.error.message {\n  background: linear-gradient(#F8D8D8, #EFD0D0);\n}\n.ui.warning.message {\n  background: linear-gradient(#FFE3C8, #F5DAC0);\n}\n.ui.success.message {\n}\n"
  },
  {
    "path": "semantic/src/themes/github/collections/message.variables",
    "content": "@background: linear-gradient(rgba(255, 255, 255, 0.1), rgba(0, 0, 0, 0.05)) #FEFEFE;\n@boxShadow:\n  0px 0px 0px 1px rgba(255, 255, 255, 0.3) inset,\n  0px 0px 0px 1px rgba(0, 0, 0, 0.2) inset\n;\n@verticalPadding: 15px;\n@horizontalPadding: 15px;\n\n@headerFontSize: 1.15em;\n\n@infoTextColor: #264C72;\n@warningTextColor: #613A00;\n@errorTextColor: #991111;\n\n@floatingBoxShadow:\n  0px 0px 0px 1px rgba(0, 0, 0, 0.1) inset,\n  0px 2px 3px 0px rgba(0, 0, 0, 0.1),\n  0px 0px 0px 1px rgba(0, 0, 0, 0.05) inset\n;\n\n@infoBorderColor: #97C1DA;\n@errorBorderColor: #DA9797;\n@warningBorderColor: #DCA874;\n\n@small: 12px;\n@medium: 13px;\n@large: 14px;\n@huge: 16px;\n@massive: 18px;\n"
  },
  {
    "path": "semantic/src/themes/github/collections/table.variables",
    "content": "/*******************************\n    User Variable Overrides\n*******************************/\n\n@background: #F8F8F8;\n\n@cellVerticalPadding: @relative6px;\n@cellHorizontalPadding: @relative8px;"
  },
  {
    "path": "semantic/src/themes/github/elements/button.overrides",
    "content": "/*******************************\n           Overrides\n*******************************/\n\n"
  },
  {
    "path": "semantic/src/themes/github/elements/button.variables",
    "content": "/*-------------------\n   Button Variables\n--------------------*/\n\n/* Button Variables */\n@pageFont: Helvetica Neue, Helvetica, Arial, sans-serif;\n@textTransform: none;\n@fontWeight: bold;\n@textColor: #333333;\n\n@textShadow: 0px 1px 0px rgba(255, 255, 255, 0.9);\n@invertedTextShadow: 0px -1px 0px rgba(0, 0, 0, 0.25);\n\n@borderRadius: @relativeBorderRadius;\n\n@verticalPadding: 0.75em;\n@horizontalPadding: 1.15em;\n\n@backgroundColor: #FAFAFA;\n@backgroundImage: linear-gradient(rgba(255, 255, 255, 0.15), rgba(0, 0, 0, 0.1));\n@boxShadow:\n  0 -1px 0 0 rgba(0, 0, 0, 0.05) inset,\n  0 0 0 1px rgba(0, 0, 0, 0.13) inset,\n  0 1px 3px rgba(0, 0, 0, 0.05)\n;\n\n@coloredBackgroundImage: linear-gradient(rgba(255, 255, 255, 0.2), rgba(0, 0, 0, 0.2));\n@coloredBoxShadow:\n  0 -1px 0 0 rgba(0, 0, 0, 0.05) inset,\n  0 0 0 1px rgba(0, 0, 0, 0.1) inset,\n  0 1px 3px rgba(0, 0, 0, 0.05)\n;\n\n@hoverBackgroundColor: #E0E0E0;\n@hoverBackgroundImage: linear-gradient(rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.08));\n@hoverBoxShadow: @boxShadow;\n\n@downBackgroundColor: '';\n@downBackgroundImage: '';\n@downBoxShadow:\n  0 -1px 0 0 rgba(0, 0, 0, 0.05) inset,\n  0 0 0 1px rgba(0, 0, 0, 0.13) inset,\n  0 3px 5px rgba(0, 0, 0, 0.15) inset !important\n;\n@activeBackgroundColor: #DFDFDF;\n@activeBackgroundImage: none;\n@activeBoxShadow:\n  0 -1px 0 0 rgba(0, 0, 0, 0.05) inset,\n  0 0 0 1px rgba(0, 0, 0, 0.13) inset,\n  0 3px 5px rgba(0, 0, 0, 0.1) inset !important\n;\n\n@labeledIconBackgroundColor: transparent;\n@labeledIconBorder: transparent;\n@labeledIconPadding: (@horizontalPadding + 2.25em);\n\n@basicFontWeight: bold;\n@basicTextColor: @linkColor;\n@basicHoverTextColor: @linkHoverColor;\n\n@basicHoverBackground: #E0E0E0;\n\n@blue: #3072B3;\n@green: #60B044;\n@black: #5D5D5D;\n\n@primaryColor: @blue;\n@secondaryColor: @black;\n\n@mini: 0.6rem;\n@tiny: 0.7rem;\n@small: 0.85rem;\n@medium: 0.92rem;\n@large: 1rem;\n@big: 1.125rem;\n@huge: 1.25rem;\n@massive: 1.3rem;\n"
  },
  {
    "path": "semantic/src/themes/github/elements/header.variables",
    "content": "/*******************************\n            Header\n*******************************/\n\n/*-------------------\n       Element\n--------------------*/\n\n@iconMargin: @4px;\n"
  },
  {
    "path": "semantic/src/themes/github/elements/icon.overrides",
    "content": "/* Octicons */\n\n.icon.alert:before { content: '\\f02d'} /*  */\n.icon.alignment.align:before { content: '\\f08a'} /*  */\n.icon.alignment.aligned.to:before { content: '\\f08e'} /*  */\n.icon.alignment.unalign:before { content: '\\f08b'} /*  */\n.icon.arrow.down:before { content: '\\f03f'} /*  */\n.icon.arrow.left:before { content: '\\f040'} /*  */\n.icon.arrow.right:before { content: '\\f03e'} /*  */\n.icon.arrow.small.down:before { content: '\\f0a0'} /*  */\n.icon.arrow.small.left:before { content: '\\f0a1'} /*  */\n.icon.arrow.small.right:before { content: '\\f071'} /*  */\n.icon.arrow.small.up:before { content: '\\f09f'} /*  */\n.icon.arrow.up:before { content: '\\f03d'} /*  */\n.icon.beer:before { content: '\\f069'} /*  */\n.icon.book:before { content: '\\f007'} /*  */\n.icon.bookmark:before { content: '\\f07b'} /*  */\n.icon.briefcase:before { content: '\\f0d3'} /*  */\n.icon.broadcast:before { content: '\\f048'} /*  */\n.icon.browser:before { content: '\\f0c5'} /*  */\n.icon.bug:before { content: '\\f091'} /*  */\n.icon.calendar:before { content: '\\f068'} /*  */\n.icon.check:before { content: '\\f03a'} /*  */\n.icon.checklist:before { content: '\\f076'} /*  */\n.icon.chevron.down:before { content: '\\f0a3'} /*  */\n.icon.chevron.left:before { content: '\\f0a4'} /*  */\n.icon.chevron.right:before { content: '\\f078'} /*  */\n.icon.chevron.up:before { content: '\\f0a2'} /*  */\n.icon.circle.slash:before { content: '\\f084'} /*  */\n.icon.circuit.board:before { content: '\\f0d6'} /*  */\n.icon.clippy:before { content: '\\f035'} /*  */\n.icon.clock:before { content: '\\f046'} /*  */\n.icon.cloud.download:before { content: '\\f00b'} /*  */\n.icon.cloud.upload:before { content: '\\f00c'} /*  */\n.icon.code:before { content: '\\f05f'} /*  */\n.icon.color.mode:before { content: '\\f065'} /*  */\n.icon.comment.add:before,\n.icon.comment:before { content: '\\f02b'} /*  */\n.icon.comment.discussion:before { content: '\\f04f'} /*  */\n.icon.credit.card:before { content: '\\f045'} /*  */\n.icon.dash:before { content: '\\f0ca'} /*  */\n.icon.dashboard:before { content: '\\f07d'} /*  */\n.icon.database:before { content: '\\f096'} /*  */\n.icon.device.camera:before { content: '\\f056'} /*  */\n.icon.device.camera.video:before { content: '\\f057'} /*  */\n.icon.device.desktop:before { content: '\\f27c'} /*  */\n.icon.device.mobile:before { content: '\\f038'} /*  */\n.icon.diff:before { content: '\\f04d'} /*  */\n.icon.diff.added:before { content: '\\f06b'} /*  */\n.icon.diff.ignored:before { content: '\\f099'} /*  */\n.icon.diff.modified:before { content: '\\f06d'} /*  */\n.icon.diff.removed:before { content: '\\f06c'} /*  */\n.icon.diff.renamed:before { content: '\\f06e'} /*  */\n.icon.ellipsis:before { content: '\\f09a'} /*  */\n.icon.eye.unwatch:before,\n.icon.eye.watch:before,\n.icon.eye:before { content: '\\f04e'} /*  */\n.icon.file.binary:before { content: '\\f094'} /*  */\n.icon.file.code:before { content: '\\f010'} /*  */\n.icon.file.directory:before { content: '\\f016'} /*  */\n.icon.file.media:before { content: '\\f012'} /*  */\n.icon.file.pdf:before { content: '\\f014'} /*  */\n.icon.file.submodule:before { content: '\\f017'} /*  */\n.icon.file.symlink.directory:before { content: '\\f0b1'} /*  */\n.icon.file.symlink.file:before { content: '\\f0b0'} /*  */\n.icon.file.text:before { content: '\\f011'} /*  */\n.icon.file.zip:before { content: '\\f013'} /*  */\n.icon.flame:before { content: '\\f0d2'} /*  */\n.icon.fold:before { content: '\\f0cc'} /*  */\n.icon.gear:before { content: '\\f02f'} /*  */\n.icon.gift:before { content: '\\f042'} /*  */\n.icon.gist:before { content: '\\f00e'} /*  */\n.icon.gist.secret:before { content: '\\f08c'} /*  */\n.icon.git.branch.create:before,\n.icon.git.branch.delete:before,\n.icon.git.branch:before { content: '\\f020'} /*  */\n.icon.git.commit:before { content: '\\f01f'} /*  */\n.icon.git.compare:before { content: '\\f0ac'} /*  */\n.icon.git.merge:before { content: '\\f023'} /*  */\n.icon.git.pull.request.abandoned:before,\n.icon.git.pull.request:before { content: '\\f009'} /*  */\n.icon.globe:before { content: '\\f0b6'} /*  */\n.icon.graph:before { content: '\\f043'} /*  */\n.icon.heart:before { content: '\\2665'} /* ♥ */\n.icon.history:before { content: '\\f07e'} /*  */\n.icon.home:before { content: '\\f08d'} /*  */\n.icon.horizontal.rule:before { content: '\\f070'} /*  */\n.icon.hourglass:before { content: '\\f09e'} /*  */\n.icon.hubot:before { content: '\\f09d'} /*  */\n.icon.inbox:before { content: '\\f0cf'} /*  */\n.icon.info:before { content: '\\f059'} /*  */\n.icon.issue.closed:before { content: '\\f028'} /*  */\n.icon.issue.opened:before { content: '\\f026'} /*  */\n.icon.issue.reopened:before { content: '\\f027'} /*  */\n.icon.jersey:before { content: '\\f019'} /*  */\n.icon.jump.down:before { content: '\\f072'} /*  */\n.icon.jump.left:before { content: '\\f0a5'} /*  */\n.icon.jump.right:before { content: '\\f0a6'} /*  */\n.icon.jump.up:before { content: '\\f073'} /*  */\n.icon.key:before { content: '\\f049'} /*  */\n.icon.keyboard:before { content: '\\f00d'} /*  */\n.icon.law:before { content: '\\f0d8'} /*  */\n.icon.light.bulb:before { content: '\\f000'} /*  */\n.icon.linkify:before { content: '\\f05c'} /*  */\n.icon.linkify.external:before { content: '\\f07f'} /*  */\n.icon.list.ordered:before { content: '\\f062'} /*  */\n.icon.list.unordered:before { content: '\\f061'} /*  */\n.icon.location:before { content: '\\f060'} /*  */\n.icon.gist.private:before,\n.icon.mirror.private:before,\n.icon.git.fork.private:before,\n.icon.lock:before { content: '\\f06a'} /*  */\n.icon.logo.github:before { content: '\\f092'} /*  */\n.icon.mail:before { content: '\\f03b'} /*  */\n.icon.mail.read:before { content: '\\f03c'} /*  */\n.icon.mail.reply:before { content: '\\f051'} /*  */\n.icon.mark.github:before { content: '\\f00a'} /*  */\n.icon.markdown:before { content: '\\f0c9'} /*  */\n.icon.megaphone:before { content: '\\f077'} /*  */\n.icon.mention:before { content: '\\f0be'} /*  */\n.icon.microscope:before { content: '\\f089'} /*  */\n.icon.milestone:before { content: '\\f075'} /*  */\n.icon.mirror.public:before,\n.icon.mirror:before { content: '\\f024'} /*  */\n.icon.mortar.board:before { content: '\\f0d7'} /*  */\n.icon.move.down:before { content: '\\f0a8'} /*  */\n.icon.move.left:before { content: '\\f074'} /*  */\n.icon.move.right:before { content: '\\f0a9'} /*  */\n.icon.move.up:before { content: '\\f0a7'} /*  */\n.icon.mute:before { content: '\\f080'} /*  */\n.icon.no.newline:before { content: '\\f09c'} /*  */\n.icon.octoface:before { content: '\\f008'} /*  */\n.icon.organization:before { content: '\\f037'} /*  */\n.icon.package:before { content: '\\f0c4'} /*  */\n.icon.paintcan:before { content: '\\f0d1'} /*  */\n.icon.pencil:before { content: '\\f058'} /*  */\n.icon.person.add:before,\n.icon.person.follow:before,\n.icon.person:before { content: '\\f018'} /*  */\n.icon.pin:before { content: '\\f041'} /*  */\n.icon.playback.fast.forward:before { content: '\\f0bd'} /*  */\n.icon.playback.pause:before { content: '\\f0bb'} /*  */\n.icon.playback.play:before { content: '\\f0bf'} /*  */\n.icon.playback.rewind:before { content: '\\f0bc'} /*  */\n.icon.plug:before { content: '\\f0d4'} /*  */\n.icon.repo.create:before,\n.icon.gist.new:before,\n.icon.file.directory.create:before,\n.icon.file.add:before,\n.icon.plus:before { content: '\\f05d'} /*  */\n.icon.podium:before { content: '\\f0af'} /*  */\n.icon.primitive.dot:before { content: '\\f052'} /*  */\n.icon.primitive.square:before { content: '\\f053'} /*  */\n.icon.pulse:before { content: '\\f085'} /*  */\n.icon.puzzle:before { content: '\\f0c0'} /*  */\n.icon.question:before { content: '\\f02c'} /*  */\n.icon.quote:before { content: '\\f063'} /*  */\n.icon.radio.tower:before { content: '\\f030'} /*  */\n.icon.repo.delete:before,\n.icon.repo:before { content: '\\f001'} /*  */\n.icon.repo.clone:before { content: '\\f04c'} /*  */\n.icon.repo.force.push:before { content: '\\f04a'} /*  */\n.icon.gist.fork:before,\n.icon.repo.forked:before { content: '\\f002'} /*  */\n.icon.repo.pull:before { content: '\\f006'} /*  */\n.icon.repo.push:before { content: '\\f005'} /*  */\n.icon.rocket:before { content: '\\f033'} /*  */\n.icon.rss:before { content: '\\f034'} /*  */\n.icon.ruby:before { content: '\\f047'} /*  */\n.icon.screen.full:before { content: '\\f066'} /*  */\n.icon.screen.normal:before { content: '\\f067'} /*  */\n.icon.search.save:before,\n.icon.search:before { content: '\\f02e'} /*  */\n.icon.server:before { content: '\\f097'} /*  */\n.icon.settings:before { content: '\\f07c'} /*  */\n.icon.log.in:before,\n.icon.sign.in:before { content: '\\f036'} /*  */\n.icon.log.out:before,\n.icon.sign.out:before { content: '\\f032'} /*  */\n.icon.split:before { content: '\\f0c6'} /*  */\n.icon.squirrel:before { content: '\\f0b2'} /*  */\n.icon.star.add:before,\n.icon.star.delete:before,\n.icon.star:before { content: '\\f02a'} /*  */\n.icon.steps:before { content: '\\f0c7'} /*  */\n.icon.stop:before { content: '\\f08f'} /*  */\n.icon.repo.sync:before,\n.icon.sync:before { content: '\\f087'} /*  */\n.icon.tag.remove:before,\n.icon.tag.add:before,\n.icon.tag:before { content: '\\f015'} /*  */\n.icon.telescope:before { content: '\\f088'} /*  */\n.icon.terminal:before { content: '\\f0c8'} /*  */\n.icon.three.bars:before { content: '\\f05e'} /*  */\n.icon.thumbsdown:before { content: '\\f0db'} /*  */\n.icon.thumbsup:before { content: '\\f0da'} /*  */\n.icon.tools:before { content: '\\f031'} /*  */\n.icon.trashcan:before { content: '\\f0d0'} /*  */\n.icon.triangle.down:before { content: '\\f05b'} /*  */\n.icon.triangle.left:before { content: '\\f044'} /*  */\n.icon.triangle.right:before { content: '\\f05a'} /*  */\n.icon.triangle.up:before { content: '\\f0aa'} /*  */\n.icon.unfold:before { content: '\\f039'} /*  */\n.icon.unmute:before { content: '\\f0ba'} /*  */\n.icon.versions:before { content: '\\f064'} /*  */\n.icon.remove.close:before,\n.icon.x:before { content: '\\f081'} /*  */\n.icon.zap:before { content: '\\26A1'} /* ⚡ */\n"
  },
  {
    "path": "semantic/src/themes/github/elements/icon.variables",
    "content": "@fontPath: '../../themes/github/assets/fonts';\n@fontName: 'octicons';\n@fallbackSRC: '';\n\n@width: 1em;\n@height: 1em;\n\n@small: 13px;\n@medium: 16px;\n@large: 18px;\n@big : 20px;\n@huge: 28px;\n@massive: 32px;"
  },
  {
    "path": "semantic/src/themes/github/elements/image.variables",
    "content": "/*******************************\n    User Variable Overrides\n*******************************/\n\n@miniWidth: 20px;"
  },
  {
    "path": "semantic/src/themes/github/elements/input.overrides",
    "content": "/*******************************\n            Input\n*******************************/\n\n/* Labeled Input has padding */\n.ui.labeled.input {\n  background-color: @white;\n  border: @borderWidth solid @borderColor;\n  border-radius: @borderRadius !important;\n}\n.ui.labeled.input input {\n  box-shadow: none !important;\n  border: none !important;\n}\n.ui.labeled.input .label {\n  font-weight: normal;\n  align-self: center;\n  font-size: 12px;\n  margin: @2px;\n  border-radius: @borderRadius !important;\n  padding: @relative5px @relative8px !important;\n}\n\n/* GitHub Uses Focus Group with class name added */\n.ui.labeled.input.focused {\n  border-color: @focusBorderColor;\n  box-shadow: @focusBoxShadow;\n}\n.ui.labeled.input.focused .label {\n  background-color: #E1EAF5;\n  color: #4078C0;\n}"
  },
  {
    "path": "semantic/src/themes/github/elements/input.variables",
    "content": "/*******************************\n            Input\n*******************************/\n\n@boxShadow: 0 1px 2px rgba(0, 0, 0, 0.075) inset;\n\n@verticalPadding: @relative7px;\n@horizontalPadding: @relative8px;\n\n@borderColor: #CCCCCC;\n\n@focusBorderColor: #51A7E8;\n@focusBoxShadow:\n  0 1px 2px rgba(0, 0, 0, 0.075) inset,\n  0 0 5px rgba(81, 167, 232, 0.5)\n;"
  },
  {
    "path": "semantic/src/themes/github/elements/label.overrides",
    "content": "/*******************************\n         Site Overrides\n*******************************/\n\n/* Notification Label on GitHub */\n.ui.floating.blue.label {\n  border: 2px solid #f3f3f3 !important;\n  background-image: linear-gradient(#7aa1d3, #4078c0) !important;\n}"
  },
  {
    "path": "semantic/src/themes/github/elements/label.variables",
    "content": "/*******************************\n    User Variable Overrides\n*******************************/\n\n"
  },
  {
    "path": "semantic/src/themes/github/elements/segment.overrides",
    "content": "/*******************************\n           Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/themes/github/elements/segment.variables",
    "content": "/*******************************\n            Standard\n*******************************/\n\n/*-------------------\n       Segment\n--------------------*/\n\n@segmentBorderWidth: 1px;\n@border: 1px solid #D8DEE2;\n@boxShadow: 0px 1px 3px rgba(0, 0, 0, 0.075);\n\n@verticalPadding: 20px;\n@horizontalPadding: 20px;\n\n@borderRadius: 4px;\n\n/*******************************\n            Variations\n*******************************/\n\n\n/* Raised */\n@raisedBoxShadow: 0px 1px 3px rgba(0, 0, 0, 0.075);\n\n/* Colors */\n@coloredBorderSize: 0.5em;\n\n/* Ordinality */\n@secondaryBackground: #F9F9F9;\n@secondaryColor: @textColor;\n\n@tertiaryBackground:  #F0F0F0;\n@tertiaryColor: @textColor;\n\n@secondaryInvertedBackground: #555555;\n@secondaryInvertedColor: @textColor;\n\n@tertiaryInvertedBackground: #333333;\n@tertiaryInvertedColor: @textColor;\n"
  },
  {
    "path": "semantic/src/themes/github/elements/step.overrides",
    "content": "/*******************************\n           Overrides\n*******************************/\n\n.ui.steps .step:after {\n  display: none;\n}\n.ui.steps .completed.step:before {\n  opacity: 0.5;\n}\n\n.ui.steps .step.active:after {\n  display: block;\n  border: none;\n  border-bottom: 1px solid rgba(0, 0, 0, 0.2);\n  border-left: 1px solid rgba(0, 0, 0, 0.2);\n}\n.ui.vertical.steps .step.active:after {\n  display: block;\n  border: none;\n  top: 50%;\n  right: 0%;\n  border-left: none;\n  border-bottom: 1px solid rgba(0, 0, 0, 0.2);\n  border-right: 1px solid rgba(0, 0, 0, 0.2);\n}"
  },
  {
    "path": "semantic/src/themes/github/elements/step.variables",
    "content": "/*-------------------\n   Step Variables\n--------------------*/\n\n/* Step */\n@background: transparent linear-gradient(transparent, rgba(0, 0, 0, 0.07));\n@verticalPadding: 1em;\n\n@arrowDisplay: none;\n@lastArrowDisplay: none;\n@activeArrowDisplay: block;\n@activeLastArrowDisplay: block;\n\n/* Group */\n@stepsBackground: #FFFFFF;\n@stepsBoxShadow: 0px 0px 1px 0px rgba(0, 0, 0, 0.15);\n\n/* States */\n@activeBackground: #FFFFFF;\n@activeIconColor: @darkTextColor;\n\n/* Arrow */\n@arrowTopOffset: 100%;\n@arrowRightOffset: 50%;\n@arrowBorderColor: rgba(0, 0, 0, 0.2);\n@arrowBorderWidth: 0px 0px @borderWidth @borderWidth;\n"
  },
  {
    "path": "semantic/src/themes/github/globals/site.variables",
    "content": "/*******************************\n     User Global Variables\n*******************************/\n\n@pageMinWidth  : 1049px;\n@pageOverflowX : visible;\n\n@emSize: 13px;\n@fontSize : 13px;\n@fontName : 'Arial';\n@importGoogleFonts : false;\n\n@h1: 2.25em;\n\n@defaultBorderRadius: 0.2307em;\n\n@disabledOpacity: 0.3;\n\n/* Colors */\n@blue: #80A6CD;\n@green: #78CB5B;\n@orange: #D26911;\n@black: #333333;\n@primaryColor: @green;\n@secondaryColor: @black;\n\n/* Links */\n@linkColor: #4078C0;\n@linkHoverColor: @linkColor;\n@linkHoverUnderline: underline;\n\n/* Borders */\n@borderColor: rgba(0, 0, 0, 0.13);\n@solidBorderColor: #DDDDDD;\n@internalBorderColor: rgba(0, 0, 0, 0.06);\n@selectedBorderColor: #51A7E8;\n\n/* Breakpoints */\n@largeMonitorBreakpoint: 1049px;\n@computerBreakpoint: @largeMonitorBreakpoint;\n@tabletBreakpoint: @largeMonitorBreakpoint;\n\n@infoBackgroundColor: #E6F1F6;\n\n@infoTextColor: #4E575B;\n@warningTextColor: #613A00;\n@errorTextColor: #991111;"
  },
  {
    "path": "semantic/src/themes/github/modules/dropdown.overrides",
    "content": "/*******************************\n        User Overrides\n*******************************/\n\n/* Smaller Icon */\n.ui.dropdown > .dropdown.icon {\n  font-size: 12px;\n}\n\n\n/* Dropdown Carets */\n@font-face {\n  font-family: 'Dropdown';\n  src:\n    url(data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMggjB5AAAAC8AAAAYGNtYXAPfuIIAAABHAAAAExnYXNwAAAAEAAAAWgAAAAIZ2x5Zjo82LgAAAFwAAABVGhlYWQAQ88bAAACxAAAADZoaGVhAwcB6QAAAvwAAAAkaG10eAS4ABIAAAMgAAAAIGxvY2EBNgDeAAADQAAAABJtYXhwAAoAFgAAA1QAAAAgbmFtZVcZpu4AAAN0AAABRXBvc3QAAwAAAAAEvAAAACAAAwIAAZAABQAAAUwBZgAAAEcBTAFmAAAA9QAZAIQAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADw2gHg/+D/4AHgACAAAAABAAAAAAAAAAAAAAAgAAAAAAACAAAAAwAAABQAAwABAAAAFAAEADgAAAAKAAgAAgACAAEAIPDa//3//wAAAAAAIPDX//3//wAB/+MPLQADAAEAAAAAAAAAAAAAAAEAAf//AA8AAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAIABJQElABMAABM0NzY3BTYXFhUUDwEGJwYvASY1AAUGBwEACAUGBoAFCAcGgAUBEgcGBQEBAQcECQYHfwYBAQZ/BwYAAQAAAG4BJQESABMAADc0PwE2MzIfARYVFAcGIyEiJyY1AAWABgcIBYAGBgUI/wAHBgWABwaABQWABgcHBgUFBgcAAAABABIASQC3AW4AEwAANzQ/ATYXNhcWHQEUBwYnBi8BJjUSBoAFCAcFBgYFBwgFgAbbBwZ/BwEBBwQJ/wgEBwEBB38GBgAAAAABAAAASQClAW4AEwAANxE0NzYzMh8BFhUUDwEGIyInJjUABQYHCAWABgaABQgHBgVbAQAIBQYGgAUIBwWABgYFBwAAAAEAAAABAADZuaKOXw889QALAgAAAAAA0ABHWAAAAADQAEdYAAAAAAElAW4AAAAIAAIAAAAAAAAAAQAAAeD/4AAAAgAAAAAAASUAAQAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAABAAAAASUAAAElAAAAtwASALcAAAAAAAAACgAUAB4AQgBkAIgAqgAAAAEAAAAIABQAAQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAOAK4AAQAAAAAAAQAOAAAAAQAAAAAAAgAOAEcAAQAAAAAAAwAOACQAAQAAAAAABAAOAFUAAQAAAAAABQAWAA4AAQAAAAAABgAHADIAAQAAAAAACgA0AGMAAwABBAkAAQAOAAAAAwABBAkAAgAOAEcAAwABBAkAAwAOACQAAwABBAkABAAOAFUAAwABBAkABQAWAA4AAwABBAkABgAOADkAAwABBAkACgA0AGMAaQBjAG8AbQBvAG8AbgBWAGUAcgBzAGkAbwBuACAAMQAuADAAaQBjAG8AbQBvAG8Abmljb21vb24AaQBjAG8AbQBvAG8AbgBSAGUAZwB1AGwAYQByAGkAYwBvAG0AbwBvAG4ARgBvAG4AdAAgAGcAZQBuAGUAcgBhAHQAZQBkACAAYgB5ACAASQBjAG8ATQBvAG8AbgAuAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=) format('truetype'),\n    url(data:application/font-woff;charset=utf-8;base64,d09GRk9UVE8AAAVwAAoAAAAABSgAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABDRkYgAAAA9AAAAdkAAAHZLDXE/09TLzIAAALQAAAAYAAAAGAIIweQY21hcAAAAzAAAABMAAAATA9+4ghnYXNwAAADfAAAAAgAAAAIAAAAEGhlYWQAAAOEAAAANgAAADYAQ88baGhlYQAAA7wAAAAkAAAAJAMHAelobXR4AAAD4AAAACAAAAAgBLgAEm1heHAAAAQAAAAABgAAAAYACFAAbmFtZQAABAgAAAFFAAABRVcZpu5wb3N0AAAFUAAAACAAAAAgAAMAAAEABAQAAQEBCGljb21vb24AAQIAAQA6+BwC+BsD+BgEHgoAGVP/i4seCgAZU/+LiwwHi2v4lPh0BR0AAACIDx0AAACNER0AAAAJHQAAAdASAAkBAQgPERMWGyAlKmljb21vb25pY29tb29udTB1MXUyMHVGMEQ3dUYwRDh1RjBEOXVGMERBAAACAYkABgAIAgABAAQABwAKAA0AVgCfAOgBL/yUDvyUDvyUDvuUDvtvi/emFYuQjZCOjo+Pj42Qiwj3lIsFkIuQiY6Hj4iNhouGi4aJh4eHCPsU+xQFiIiGiYaLhouHjYeOCPsU9xQFiI+Jj4uQCA77b4v3FBWLkI2Pjo8I9xT3FAWPjo+NkIuQi5CJjogI9xT7FAWPh42Hi4aLhomHh4eIiIaJhosI+5SLBYaLh42HjoiPiY+LkAgO+92d928Vi5CNkI+OCPcU9xQFjo+QjZCLkIuPiY6Hj4iNhouGCIv7lAWLhomHh4iIh4eJhouGi4aNiI8I+xT3FAWHjomPi5AIDvvdi+YVi/eUBYuQjZCOjo+Pj42Qi5CLkImOhwj3FPsUBY+IjYaLhouGiYeHiAj7FPsUBYiHhomGi4aLh42Hj4iOiY+LkAgO+JQU+JQViwwKAAAAAAMCAAGQAAUAAAFMAWYAAABHAUwBZgAAAPUAGQCEAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAA8NoB4P/g/+AB4AAgAAAAAQAAAAAAAAAAAAAAIAAAAAAAAgAAAAMAAAAUAAMAAQAAABQABAA4AAAACgAIAAIAAgABACDw2v/9//8AAAAAACDw1//9//8AAf/jDy0AAwABAAAAAAAAAAAAAAABAAH//wAPAAEAAAABAAA5emozXw889QALAgAAAAAA0ABHWAAAAADQAEdYAAAAAAElAW4AAAAIAAIAAAAAAAAAAQAAAeD/4AAAAgAAAAAAASUAAQAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAABAAAAASUAAAElAAAAtwASALcAAAAAUAAACAAAAAAADgCuAAEAAAAAAAEADgAAAAEAAAAAAAIADgBHAAEAAAAAAAMADgAkAAEAAAAAAAQADgBVAAEAAAAAAAUAFgAOAAEAAAAAAAYABwAyAAEAAAAAAAoANABjAAMAAQQJAAEADgAAAAMAAQQJAAIADgBHAAMAAQQJAAMADgAkAAMAAQQJAAQADgBVAAMAAQQJAAUAFgAOAAMAAQQJAAYADgA5AAMAAQQJAAoANABjAGkAYwBvAG0AbwBvAG4AVgBlAHIAcwBpAG8AbgAgADEALgAwAGkAYwBvAG0AbwBvAG5pY29tb29uAGkAYwBvAG0AbwBvAG4AUgBlAGcAdQBsAGEAcgBpAGMAbwBtAG8AbwBuAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA) format('woff')\n  ;\n  font-weight: normal;\n  font-style: normal;\n}\n\n.ui.dropdown > .dropdown.icon {\n  font-family: 'Dropdown';\n  line-height: 1;\n  height: 1em;\n  width: 1.23em;\n  backface-visibility: hidden;\n  font-weight: normal;\n  font-style: normal;\n  text-align: center;\n}\n\n.ui.dropdown > .dropdown.icon {\n  width: auto;\n}\n.ui.dropdown > .dropdown.icon:before {\n  content: '\\f0d7';\n}\n\n/* Sub Menu */\n.ui.dropdown .menu .item .dropdown.icon:before {\n  content: '\\f0da'/*rtl:'\\f0d9'*/;\n}\n\n.ui.dropdown .item .left.dropdown.icon:before,\n.ui.dropdown .left.menu .item .dropdown.icon:before {\n  content: \"\\f0d9\"/*rtl:\"\\f0da\"*/;\n}\n\n/* Vertical Menu Dropdown */\n.ui.vertical.menu .dropdown.item > .dropdown.icon:before {\n  content: \"\\f0da\"/*rtl:\"\\f0d9\"*/;\n}"
  },
  {
    "path": "semantic/src/themes/github/modules/dropdown.variables",
    "content": "/*******************************\n    User Variable Overrides\n*******************************/\n\n@transition:\n  width @defaultDuration @defaultEasing\n;\n\n@menuPadding: 0px;\n\n@itemVerticalPadding: @relative8px;\n@itemHorizontalPadding: @relative14px;\n\n@dropdownIconMargin: 0em 0em 0em 2px;\n\n@raisedBoxShadow: 0px 3px 12px rgba(0, 0, 0, 0.15);\n\n@menuPadding: @relative5px 0px;\n\n@menuHeaderMargin: 0em;\n@menuHeaderPadding: @relative6px @itemHorizontalPadding;\n@menuHeaderFontSize: @relative12px;\n@menuHeaderTextTransform: none;\n@menuHeaderFontWeight: normal;\n@menuHeaderColor: #767676;\n\n@menuDividerMargin: @relative8px 0em;\n\n@disabledOpacity: 0.6;\n\n/* States */\n@hoveredItemBackground: #4078C0;\n@hoveredItemColor: @white;\n\n@pointingArrowSize: @relative9px;\n"
  },
  {
    "path": "semantic/src/themes/github/modules/popup.variables",
    "content": "/*******************************\n             Popup\n*******************************/\n\n\n@small: @relative10px;\n@medium: @relative11px;\n@large: @relative13px;\n\n@verticalPadding: @relative7px;\n@horizontalPadding: @relative11px;\n\n"
  },
  {
    "path": "semantic/src/themes/gmail/collections/message.overrides",
    "content": ""
  },
  {
    "path": "semantic/src/themes/gmail/collections/message.variables",
    "content": "@background: #F3F3F3;\n\n@boxShadow: 0px 0px 0px 1px rgba(0, 0, 0, 0.1) inset;\n@borderRadius: 4px;\n@verticalPadding: 7px;\n@horizontalPadding: 15px;\n\n@headerFontSize: 1em;\n\n@floatingBoxShadow: 0px 2px 4px rgba(0, 0, 0, 0.2);\n\n@iconSize: 1.5em;\n@iconDistance: 1em;\n\n@warningBackgroundColor: #F9EDBE;\n"
  },
  {
    "path": "semantic/src/themes/instagram/views/card.overrides",
    "content": "/*******************************\n           Overrides\n*******************************/\n\n\n@import url(http://fonts.googleapis.com/css?family=Montserrat:700,400);\n\n.ui.cards > .card,\n.ui.card {\n  font-family: 'Montserrat';\n  font-size-adjust: 0.5;\n}"
  },
  {
    "path": "semantic/src/themes/instagram/views/card.variables",
    "content": "/*******************************\n             Card\n*******************************/\n\n/*-------------------\n         View\n--------------------*/\n\n@borderBoxShadow: none;\n@shadowBoxShadow: none;\n@boxShadow: none;\n\n\n@internalBorderColor: #EDEDEE;\n@border: 1px solid #EDEDEE;\n\n@contentPadding: 14px 20px;\n\n@metaColor: #A5A7AA;\n\n@linkHoverRaiseDistance: 0px;\n@linkHoverBoxShadow: none;\n@linkHoverBorder: 1px solid #D0D0D8;"
  },
  {
    "path": "semantic/src/themes/material/collections/menu.overrides",
    "content": "@import url(https://fonts.googleapis.com/css?family=Roboto);\n"
  },
  {
    "path": "semantic/src/themes/material/collections/menu.variables",
    "content": "/*******************************\n             Menu\n*******************************/\n\n@fontFamily: 'Roboto', Arial, sans-serif;\n@boxShadow: 0px 1px 6px rgba(0, 0, 0, 0.2);\n@dividerSize: 0px;\n\n@itemVerticalPadding: @relativeLarge;\n@itemHorizontalPadding: @relativeLarge;"
  },
  {
    "path": "semantic/src/themes/material/elements/button.overrides",
    "content": "@import url(https://fonts.googleapis.com/css?family=Roboto);\n\n.ui.primary.button:hover {\n  box-shadow:\n    0px 0px 0px 1px rgba(0, 0, 0, 0.3) inset,\n    0px 2px 3px 0px rgba(0, 0, 0, 0.35) !important\n  ;\n}\n\n.ui.secondary.button:hover {\n  box-shadow:\n    0px 0px 0px 1px rgba(0, 0, 0, 0.2) inset,\n    0px 2px 3px 0px rgba(0, 0, 0, 0.3) !important\n  ;\n}\n"
  },
  {
    "path": "semantic/src/themes/material/elements/button.variables",
    "content": "/*******************************\n            Button\n*******************************/\n\n/*-------------------\n       Element\n--------------------*/\n\n@googleFontName : 'Roboto';\n@pageFont       : 'Roboto', Arial, sans-serif;\n\n@medium: 13px;\n\n@verticalPadding   : 0.8em;\n@horizontalPadding : 0.8em;\n@borderRadius      : @relative3px;\n@color             : #222222;\n@fontWeight        : normal;\n@textTransform     : none;\n\n@backgroundColor      : @white;\n@backgroundImage      : linear-gradient(transparent, rgba(0, 0, 0, 0.02));\n\n@solidBorderColor: #DDDDDD;\n\n@borderBoxShadowColor: @solidBorderColor;\n@borderBoxShadow: 0px 0px 0px 1px @solidBorderColor inset;\n@shadowBoxShadow: 0px 0px 0px 0px transparent;\n\n@transition:\n  opacity 0.3s @defaultEasing,\n  background-color 0.3s @defaultEasing,\n  color 0.3s @defaultEasing,\n  box-shadow 0.3s @defaultEasing,\n  background 0.3s @defaultEasing\n;\n/*-------------------\n        State\n--------------------*/\n\n@hoverBackgroundColor: @white;\n@hoverBoxShadow:\n  @borderBoxShadow,\n  0px 2px 3px 0px rgba(0, 0, 0, 0.2) !important\n;\n\n@downBackgroundColor: @white;\n@downBackgroundImage: linear-gradient(rgba(0, 0, 0, 0.04), rgba(0, 0, 0, 0.04));\n@downTextColor: #222222;\n@downBoxShadow: @borderBoxShadow;\n\n@activeBackgroundColor: #F0F0F0;\n@activeBoxShadow: 0px 0px 0px 1px #DDDDDD;\n\n/*-------------------\n      Variations\n--------------------*/\n\n/* Basic */\n@basicBorderSize: 0px;\n@basicBorderRadius: 4px;\n@basicColoredBorderSize: 1px;\n@basicHoverBackground: @white;\n@basicHoverBoxShadow: @hoverBoxShadow;\n@basicDownBackground: @white;\n@basicDownBoxShadow: @downBoxShadow;\n\n@basicActiveBackground: #FFFFFF;\n@basicActiveBoxShadow: 0px 0px 0px 1px rgba(0, 0, 0, 0.2);\n\n/* Labeled */\n@labeledIconBackgroundColor: transparent;\n@labeledIconWidth: 2em;\n\n@labeledLabelBorderOffset: 0px;\n\n/* Colored */\n@coloredBackgroundImage : @subtleGradient;\n@coloredBoxShadow       : 0px 0px 0px 1px rgba(0, 0, 0, 0.1) inset;\n\n/* Primary */\n@primaryColor       : #4184F3;\n@primaryBoxShadow   : 0px 0px 0px 1px #0157E4 inset;\n\n/* Secondary */\n@secondaryColor           : #EEEEEE;\n@secondaryBackgroundImage : @backgroundImage;\n@secondaryTextColor       : @textColor;\n@secondaryBoxShadow       : @borderBoxShadow;\n\n/* Emotive */\n@positiveColor: #3D9400;\n@negativeColor: #D34836;\n\n/* Inverted */\n@invertedBorderSize: 1px;\n\n"
  },
  {
    "path": "semantic/src/themes/material/elements/header.overrides",
    "content": "/*******************************\n           Overrides\n*******************************/\n\n@import url(https://fonts.googleapis.com/css?family=Roboto);\n\nh1.ui.header,\n.ui.huge.header {\n  font-weight: normal;\n}\n\nh2.ui.header,\n.ui.large.header {\n  font-weight: normal;\n}\n"
  },
  {
    "path": "semantic/src/themes/material/elements/header.variables",
    "content": "/*-------------------\n       Header\n--------------------*/\n\n@headerFont : 'Roboto', Arial, sans-serif;\n@fontWeight: normal;\n\n@iconSize: 2em;\n@iconOffset: 0.2em;\n@iconAlignment: top;\n\n@subHeaderFontSize: 1rem;\n\n\n/* HTML Headings */\n@h1 : 2.25rem;\n@h2 : 2rem;\n@h3 : 1.75rem;\n@h4 : 1.5rem;\n@h5 : 1.25rem;\n\n"
  },
  {
    "path": "semantic/src/themes/material/elements/icon.overrides",
    "content": "/* Material Design Icons */\n\ni.icon.threed.rotation:before { content: '\\e84d'}\ni.icon.ac.unit:before { content: '\\eb3b'}\ni.icon.access.alarm:before { content: '\\e190'}\ni.icon.access.alarms:before { content: '\\e191'}\ni.icon.access.time:before { content: '\\e192'}\ni.icon.accessibility:before { content: '\\e84e'}\ni.icon.accessible:before { content: '\\e914'}\ni.icon.account.balance:before { content: '\\e84f'}\ni.icon.account.balance.wallet:before { content: '\\e850'}\ni.icon.account.box:before { content: '\\e851'}\ni.icon.account.circle:before { content: '\\e853'}\ni.icon.adb:before { content: '\\e60e'}\ni.icon.add:before { content: '\\e145'}\ni.icon.add.a.photo:before { content: '\\e439'}\ni.icon.add.alarm:before { content: '\\e193'}\ni.icon.add.alert:before { content: '\\e003'}\ni.icon.add.box:before { content: '\\e146'}\ni.icon.add.circle:before { content: '\\e147'}\ni.icon.add.circle.outline:before { content: '\\e148'}\ni.icon.add.location:before { content: '\\e567'}\ni.icon.add.shopping.cart:before { content: '\\e854'}\ni.icon.add.to.photos:before { content: '\\e39d'}\ni.icon.add.to.queue:before { content: '\\e05c'}\ni.icon.adjust:before { content: '\\e39e'}\ni.icon.airline.seat.flat:before { content: '\\e630'}\ni.icon.airline.seat.flat.angled:before { content: '\\e631'}\ni.icon.airline.seat.individual.suite:before { content: '\\e632'}\ni.icon.airline.seat.legroom.extra:before { content: '\\e633'}\ni.icon.airline.seat.legroom.normal:before { content: '\\e634'}\ni.icon.airline.seat.legroom.reduced:before { content: '\\e635'}\ni.icon.airline.seat.recline.extra:before { content: '\\e636'}\ni.icon.airline.seat.recline.normal:before { content: '\\e637'}\ni.icon.airplanemode.active:before { content: '\\e195'}\ni.icon.airplanemode.inactive:before { content: '\\e194'}\ni.icon.airplay:before { content: '\\e055'}\ni.icon.airport.shuttle:before { content: '\\eb3c'}\ni.icon.alarm:before { content: '\\e855'}\ni.icon.alarm.add:before { content: '\\e856'}\ni.icon.alarm.off:before { content: '\\e857'}\ni.icon.alarm.on:before { content: '\\e858'}\ni.icon.album:before { content: '\\e019'}\ni.icon.all.inclusive:before { content: '\\eb3d'}\ni.icon.all.out:before { content: '\\e90b'}\ni.icon.android:before { content: '\\e859'}\ni.icon.announcement:before { content: '\\e85a'}\ni.icon.apps:before { content: '\\e5c3'}\ni.icon.archive:before { content: '\\e149'}\ni.icon.arrow.back:before { content: '\\e5c4'}\ni.icon.arrow.downward:before { content: '\\e5db'}\ni.icon.arrow.drop.down:before { content: '\\e5c5'}\ni.icon.arrow.drop.down.circle:before { content: '\\e5c6'}\ni.icon.arrow.drop.up:before { content: '\\e5c7'}\ni.icon.arrow.forward:before { content: '\\e5c8'}\ni.icon.arrow.upward:before { content: '\\e5d8'}\ni.icon.art.track:before { content: '\\e060'}\ni.icon.aspect.ratio:before { content: '\\e85b'}\ni.icon.assessment:before { content: '\\e85c'}\ni.icon.assignment:before { content: '\\e85d'}\ni.icon.assignment.ind:before { content: '\\e85e'}\ni.icon.assignment.late:before { content: '\\e85f'}\ni.icon.assignment.return:before { content: '\\e860'}\ni.icon.assignment.returned:before { content: '\\e861'}\ni.icon.assignment.turned.in:before { content: '\\e862'}\ni.icon.assistant:before { content: '\\e39f'}\ni.icon.assistant.photo:before { content: '\\e3a0'}\ni.icon.attach.file:before { content: '\\e226'}\ni.icon.attach.money:before { content: '\\e227'}\ni.icon.attachment:before { content: '\\e2bc'}\ni.icon.audiotrack:before { content: '\\e3a1'}\ni.icon.autorenew:before { content: '\\e863'}\ni.icon.av.timer:before { content: '\\e01b'}\ni.icon.backspace:before { content: '\\e14a'}\ni.icon.backup:before { content: '\\e864'}\ni.icon.battery.alert:before { content: '\\e19c'}\ni.icon.battery.charging.full:before { content: '\\e1a3'}\ni.icon.battery.full:before { content: '\\e1a4'}\ni.icon.battery.std:before { content: '\\e1a5'}\ni.icon.battery.unknown:before { content: '\\e1a6'}\ni.icon.beach.access:before { content: '\\eb3e'}\ni.icon.beenhere:before { content: '\\e52d'}\ni.icon.block:before { content: '\\e14b'}\ni.icon.bluetooth:before { content: '\\e1a7'}\ni.icon.bluetooth.audio:before { content: '\\e60f'}\ni.icon.bluetooth.connected:before { content: '\\e1a8'}\ni.icon.bluetooth.disabled:before { content: '\\e1a9'}\ni.icon.bluetooth.searching:before { content: '\\e1aa'}\ni.icon.blur.circular:before { content: '\\e3a2'}\ni.icon.blur.linear:before { content: '\\e3a3'}\ni.icon.blur.off:before { content: '\\e3a4'}\ni.icon.blur.on:before { content: '\\e3a5'}\ni.icon.book:before { content: '\\e865'}\ni.icon.bookmark:before { content: '\\e866'}\ni.icon.bookmark.border:before { content: '\\e867'}\ni.icon.border.all:before { content: '\\e228'}\ni.icon.border.bottom:before { content: '\\e229'}\ni.icon.border.clear:before { content: '\\e22a'}\ni.icon.border.color:before { content: '\\e22b'}\ni.icon.border.horizontal:before { content: '\\e22c'}\ni.icon.border.inner:before { content: '\\e22d'}\ni.icon.border.left:before { content: '\\e22e'}\ni.icon.border.outer:before { content: '\\e22f'}\ni.icon.border.right:before { content: '\\e230'}\ni.icon.border.style:before { content: '\\e231'}\ni.icon.border.top:before { content: '\\e232'}\ni.icon.border.vertical:before { content: '\\e233'}\ni.icon.branding.watermark:before { content: '\\e06b'}\ni.icon.brightness.one:before { content: '\\e3a6'}\ni.icon.brightness.two:before { content: '\\e3a7'}\ni.icon.brightness.three:before { content: '\\e3a8'}\ni.icon.brightness.four:before { content: '\\e3a9'}\ni.icon.brightness.five:before { content: '\\e3aa'}\ni.icon.brightness.six:before { content: '\\e3ab'}\ni.icon.brightness.seven:before { content: '\\e3ac'}\ni.icon.brightness.auto:before { content: '\\e1ab'}\ni.icon.brightness.high:before { content: '\\e1ac'}\ni.icon.brightness.low:before { content: '\\e1ad'}\ni.icon.brightness.medium:before { content: '\\e1ae'}\ni.icon.broken.image:before { content: '\\e3ad'}\ni.icon.brush:before { content: '\\e3ae'}\ni.icon.bubble.chart:before { content: '\\e6dd'}\ni.icon.bug.report:before { content: '\\e868'}\ni.icon.build:before { content: '\\e869'}\ni.icon.burst.mode:before { content: '\\e43c'}\ni.icon.business:before { content: '\\e0af'}\ni.icon.business.center:before { content: '\\eb3f'}\ni.icon.cached:before { content: '\\e86a'}\ni.icon.cake:before { content: '\\e7e9'}\ni.icon.call:before { content: '\\e0b0'}\ni.icon.call.end:before { content: '\\e0b1'}\ni.icon.call.made:before { content: '\\e0b2'}\ni.icon.call.merge:before { content: '\\e0b3'}\ni.icon.call.missed:before { content: '\\e0b4'}\ni.icon.call.missed.outgoing:before { content: '\\e0e4'}\ni.icon.call.received:before { content: '\\e0b5'}\ni.icon.call.split:before { content: '\\e0b6'}\ni.icon.call.to.action:before { content: '\\e06c'}\ni.icon.camera:before { content: '\\e3af'}\ni.icon.camera.alt:before { content: '\\e3b0'}\ni.icon.camera.enhance:before { content: '\\e8fc'}\ni.icon.camera.front:before { content: '\\e3b1'}\ni.icon.camera.rear:before { content: '\\e3b2'}\ni.icon.camera.roll:before { content: '\\e3b3'}\ni.icon.cancel:before { content: '\\e5c9'}\ni.icon.card.giftcard:before { content: '\\e8f6'}\ni.icon.card.membership:before { content: '\\e8f7'}\ni.icon.card.travel:before { content: '\\e8f8'}\ni.icon.casino:before { content: '\\eb40'}\ni.icon.cast:before { content: '\\e307'}\ni.icon.cast.connected:before { content: '\\e308'}\ni.icon.center.focus.strong:before { content: '\\e3b4'}\ni.icon.center.focus.weak:before { content: '\\e3b5'}\ni.icon.change.history:before { content: '\\e86b'}\ni.icon.chat:before { content: '\\e0b7'}\ni.icon.chat.bubble:before { content: '\\e0ca'}\ni.icon.chat.bubble.outline:before { content: '\\e0cb'}\ni.icon.check:before { content: '\\e5ca'}\ni.icon.check.box:before { content: '\\e834'}\ni.icon.check.box.outline.blank:before { content: '\\e835'}\ni.icon.check.circle:before { content: '\\e86c'}\ni.icon.chevron.left:before { content: '\\e5cb'}\ni.icon.chevron.right:before { content: '\\e5cc'}\ni.icon.child.care:before { content: '\\eb41'}\ni.icon.child.friendly:before { content: '\\eb42'}\ni.icon.chrome.reader.mode:before { content: '\\e86d'}\ni.icon.class:before { content: '\\e86e'}\ni.icon.clear:before { content: '\\e14c'}\ni.icon.clear.all:before { content: '\\e0b8'}\ni.icon.close:before { content: '\\e5cd'}\ni.icon.closed.caption:before { content: '\\e01c'}\ni.icon.cloud:before { content: '\\e2bd'}\ni.icon.cloud.circle:before { content: '\\e2be'}\ni.icon.cloud.done:before { content: '\\e2bf'}\ni.icon.cloud.download:before { content: '\\e2c0'}\ni.icon.cloud.off:before { content: '\\e2c1'}\ni.icon.cloud.queue:before { content: '\\e2c2'}\ni.icon.cloud.upload:before { content: '\\e2c3'}\ni.icon.code:before { content: '\\e86f'}\ni.icon.collections:before { content: '\\e3b6'}\ni.icon.collections.bookmark:before { content: '\\e431'}\ni.icon.color.lens:before { content: '\\e3b7'}\ni.icon.colorize:before { content: '\\e3b8'}\ni.icon.comment:before { content: '\\e0b9'}\ni.icon.compare:before { content: '\\e3b9'}\ni.icon.compare.arrows:before { content: '\\e915'}\ni.icon.computer:before { content: '\\e30a'}\ni.icon.confirmation.number:before { content: '\\e638'}\ni.icon.contact.mail:before { content: '\\e0d0'}\ni.icon.contact.phone:before { content: '\\e0cf'}\ni.icon.contacts:before { content: '\\e0ba'}\ni.icon.content.copy:before { content: '\\e14d'}\ni.icon.content.cut:before { content: '\\e14e'}\ni.icon.content.paste:before { content: '\\e14f'}\ni.icon.control.point:before { content: '\\e3ba'}\ni.icon.control.point.duplicate:before { content: '\\e3bb'}\ni.icon.copyright:before { content: '\\e90c'}\ni.icon.create:before { content: '\\e150'}\ni.icon.create.new.folder:before { content: '\\e2cc'}\ni.icon.credit.card:before { content: '\\e870'}\ni.icon.crop:before { content: '\\e3be'}\ni.icon.crop.sixteen.nine:before { content: '\\e3bc'}\ni.icon.crop.three.two:before { content: '\\e3bd'}\ni.icon.crop.five.four:before { content: '\\e3bf'}\ni.icon.crop.seven.five:before { content: '\\e3c0'}\ni.icon.crop.din:before { content: '\\e3c1'}\ni.icon.crop.free:before { content: '\\e3c2'}\ni.icon.crop.landscape:before { content: '\\e3c3'}\ni.icon.crop.original:before { content: '\\e3c4'}\ni.icon.crop.portrait:before { content: '\\e3c5'}\ni.icon.crop.rotate:before { content: '\\e437'}\ni.icon.crop.square:before { content: '\\e3c6'}\ni.icon.dashboard:before { content: '\\e871'}\ni.icon.data.usage:before { content: '\\e1af'}\ni.icon.date.range:before { content: '\\e916'}\ni.icon.dehaze:before { content: '\\e3c7'}\ni.icon.delete:before { content: '\\e872'}\ni.icon.delete.forever:before { content: '\\e92b'}\ni.icon.delete.sweep:before { content: '\\e16c'}\ni.icon.description:before { content: '\\e873'}\ni.icon.desktop.mac:before { content: '\\e30b'}\ni.icon.desktop.windows:before { content: '\\e30c'}\ni.icon.details:before { content: '\\e3c8'}\ni.icon.developer.board:before { content: '\\e30d'}\ni.icon.developer.mode:before { content: '\\e1b0'}\ni.icon.device.hub:before { content: '\\e335'}\ni.icon.devices:before { content: '\\e1b1'}\ni.icon.devices.other:before { content: '\\e337'}\ni.icon.dialer.sip:before { content: '\\e0bb'}\ni.icon.dialpad:before { content: '\\e0bc'}\ni.icon.directions:before { content: '\\e52e'}\ni.icon.directions.bike:before { content: '\\e52f'}\ni.icon.directions.boat:before { content: '\\e532'}\ni.icon.directions.bus:before { content: '\\e530'}\ni.icon.directions.car:before { content: '\\e531'}\ni.icon.directions.railway:before { content: '\\e534'}\ni.icon.directions.run:before { content: '\\e566'}\ni.icon.directions.subway:before { content: '\\e533'}\ni.icon.directions.transit:before { content: '\\e535'}\ni.icon.directions.walk:before { content: '\\e536'}\ni.icon.disc.full:before { content: '\\e610'}\ni.icon.dns:before { content: '\\e875'}\ni.icon.do.not.disturb:before { content: '\\e612'}\ni.icon.do.not.disturb.alt:before { content: '\\e611'}\ni.icon.do.not.disturb.off:before { content: '\\e643'}\ni.icon.do.not.disturb.on:before { content: '\\e644'}\ni.icon.dock:before { content: '\\e30e'}\ni.icon.domain:before { content: '\\e7ee'}\ni.icon.done:before { content: '\\e876'}\ni.icon.done.all:before { content: '\\e877'}\ni.icon.donut.large:before { content: '\\e917'}\ni.icon.donut.small:before { content: '\\e918'}\ni.icon.drafts:before { content: '\\e151'}\ni.icon.drag.handle:before { content: '\\e25d'}\ni.icon.drive.eta:before { content: '\\e613'}\ni.icon.dvr:before { content: '\\e1b2'}\ni.icon.edit:before { content: '\\e3c9'}\ni.icon.edit.location:before { content: '\\e568'}\ni.icon.eject:before { content: '\\e8fb'}\ni.icon.email:before { content: '\\e0be'}\ni.icon.enhanced.encryption:before { content: '\\e63f'}\ni.icon.equalizer:before { content: '\\e01d'}\ni.icon.error:before { content: '\\e000'}\ni.icon.error.outline:before { content: '\\e001'}\ni.icon.euro.symbol:before { content: '\\e926'}\ni.icon.ev.station:before { content: '\\e56d'}\ni.icon.event:before { content: '\\e878'}\ni.icon.event.available:before { content: '\\e614'}\ni.icon.event.busy:before { content: '\\e615'}\ni.icon.event.note:before { content: '\\e616'}\ni.icon.event.seat:before { content: '\\e903'}\ni.icon.exit.to.app:before { content: '\\e879'}\ni.icon.expand.less:before { content: '\\e5ce'}\ni.icon.expand.more:before { content: '\\e5cf'}\ni.icon.explicit:before { content: '\\e01e'}\ni.icon.explore:before { content: '\\e87a'}\ni.icon.exposure:before { content: '\\e3ca'}\ni.icon.exposure.neg.1:before { content: '\\e3cb'}\ni.icon.exposure.neg.2:before { content: '\\e3cc'}\ni.icon.exposure.plus.1:before { content: '\\e3cd'}\ni.icon.exposure.plus.2:before { content: '\\e3ce'}\ni.icon.exposure.zero:before { content: '\\e3cf'}\ni.icon.extension:before { content: '\\e87b'}\ni.icon.face:before { content: '\\e87c'}\ni.icon.fast.forward:before { content: '\\e01f'}\ni.icon.fast.rewind:before { content: '\\e020'}\ni.icon.favorite:before { content: '\\e87d'}\ni.icon.favorite.border:before { content: '\\e87e'}\ni.icon.featured.play.list:before { content: '\\e06d'}\ni.icon.featured.video:before { content: '\\e06e'}\ni.icon.feedback:before { content: '\\e87f'}\ni.icon.fiber.dvr:before { content: '\\e05d'}\ni.icon.fiber.manual.record:before { content: '\\e061'}\ni.icon.fiber.new:before { content: '\\e05e'}\ni.icon.fiber.pin:before { content: '\\e06a'}\ni.icon.fiber.smart.record:before { content: '\\e062'}\ni.icon.file.download:before { content: '\\e2c4'}\ni.icon.file.upload:before { content: '\\e2c6'}\ni.icon.filter:before { content: '\\e3d3'}\ni.icon.filter.1:before { content: '\\e3d0'}\ni.icon.filter.2:before { content: '\\e3d1'}\ni.icon.filter.3:before { content: '\\e3d2'}\ni.icon.filter.4:before { content: '\\e3d4'}\ni.icon.filter.5:before { content: '\\e3d5'}\ni.icon.filter.6:before { content: '\\e3d6'}\ni.icon.filter.7:before { content: '\\e3d7'}\ni.icon.filter.8:before { content: '\\e3d8'}\ni.icon.filter.9:before { content: '\\e3d9'}\ni.icon.filter.9.plus:before { content: '\\e3da'}\ni.icon.filter.b.and.w:before { content: '\\e3db'}\ni.icon.filter.center.focus:before { content: '\\e3dc'}\ni.icon.filter.drama:before { content: '\\e3dd'}\ni.icon.filter.frames:before { content: '\\e3de'}\ni.icon.filter.hdr:before { content: '\\e3df'}\ni.icon.filter.list:before { content: '\\e152'}\ni.icon.filter.none:before { content: '\\e3e0'}\ni.icon.filter.tilt.shift:before { content: '\\e3e2'}\ni.icon.filter.vintage:before { content: '\\e3e3'}\ni.icon.find.in.page:before { content: '\\e880'}\ni.icon.find.replace:before { content: '\\e881'}\ni.icon.fingerprint:before { content: '\\e90d'}\ni.icon.first.page:before { content: '\\e5dc'}\ni.icon.fitness.center:before { content: '\\eb43'}\ni.icon.flag:before { content: '\\e153'}\ni.icon.flare:before { content: '\\e3e4'}\ni.icon.flash.auto:before { content: '\\e3e5'}\ni.icon.flash.off:before { content: '\\e3e6'}\ni.icon.flash.on:before { content: '\\e3e7'}\ni.icon.flight:before { content: '\\e539'}\ni.icon.flight.land:before { content: '\\e904'}\ni.icon.flight.takeoff:before { content: '\\e905'}\ni.icon.flip:before { content: '\\e3e8'}\ni.icon.flip.to.back:before { content: '\\e882'}\ni.icon.flip.to.front:before { content: '\\e883'}\ni.icon.folder:before { content: '\\e2c7'}\ni.icon.folder.open:before { content: '\\e2c8'}\ni.icon.folder.shared:before { content: '\\e2c9'}\ni.icon.folder.special:before { content: '\\e617'}\ni.icon.font.download:before { content: '\\e167'}\ni.icon.format.align.center:before { content: '\\e234'}\ni.icon.format.align.justify:before { content: '\\e235'}\ni.icon.format.align.left:before { content: '\\e236'}\ni.icon.format.align.right:before { content: '\\e237'}\ni.icon.format.bold:before { content: '\\e238'}\ni.icon.format.clear:before { content: '\\e239'}\ni.icon.format.color.fill:before { content: '\\e23a'}\ni.icon.format.color.reset:before { content: '\\e23b'}\ni.icon.format.color.text:before { content: '\\e23c'}\ni.icon.format.indent.decrease:before { content: '\\e23d'}\ni.icon.format.indent.increase:before { content: '\\e23e'}\ni.icon.format.italic:before { content: '\\e23f'}\ni.icon.format.line.spacing:before { content: '\\e240'}\ni.icon.format.list.bulleted:before { content: '\\e241'}\ni.icon.format.list.numbered:before { content: '\\e242'}\ni.icon.format.paint:before { content: '\\e243'}\ni.icon.format.quote:before { content: '\\e244'}\ni.icon.format.shapes:before { content: '\\e25e'}\ni.icon.format.size:before { content: '\\e245'}\ni.icon.format.strikethrough:before { content: '\\e246'}\ni.icon.format.textdirection.l.to.r:before { content: '\\e247'}\ni.icon.format.textdirection.r.to.l:before { content: '\\e248'}\ni.icon.format.underlined:before { content: '\\e249'}\ni.icon.forum:before { content: '\\e0bf'}\ni.icon.forward:before { content: '\\e154'}\ni.icon.forward.ten:before { content: '\\e056'}\ni.icon.forward.thirty:before { content: '\\e057'}\ni.icon.forward.five:before { content: '\\e058'}\ni.icon.free.breakfast:before { content: '\\eb44'}\ni.icon.fullscreen:before { content: '\\e5d0'}\ni.icon.fullscreen.exit:before { content: '\\e5d1'}\ni.icon.functions:before { content: '\\e24a'}\ni.icon.g.translate:before { content: '\\e927'}\ni.icon.gamepad:before { content: '\\e30f'}\ni.icon.games:before { content: '\\e021'}\ni.icon.gavel:before { content: '\\e90e'}\ni.icon.gesture:before { content: '\\e155'}\ni.icon.get.app:before { content: '\\e884'}\ni.icon.gif:before { content: '\\e908'}\ni.icon.golf.course:before { content: '\\eb45'}\ni.icon.gps.fixed:before { content: '\\e1b3'}\ni.icon.gps.not.fixed:before { content: '\\e1b4'}\ni.icon.gps.off:before { content: '\\e1b5'}\ni.icon.grade:before { content: '\\e885'}\ni.icon.gradient:before { content: '\\e3e9'}\ni.icon.grain:before { content: '\\e3ea'}\ni.icon.graphic.eq:before { content: '\\e1b8'}\ni.icon.grid.off:before { content: '\\e3eb'}\ni.icon.grid.on:before { content: '\\e3ec'}\ni.icon.group:before { content: '\\e7ef'}\ni.icon.group.add:before { content: '\\e7f0'}\ni.icon.group.work:before { content: '\\e886'}\ni.icon.hd:before { content: '\\e052'}\ni.icon.hdr.off:before { content: '\\e3ed'}\ni.icon.hdr.on:before { content: '\\e3ee'}\ni.icon.hdr.strong:before { content: '\\e3f1'}\ni.icon.hdr.weak:before { content: '\\e3f2'}\ni.icon.headset:before { content: '\\e310'}\ni.icon.headset.mic:before { content: '\\e311'}\ni.icon.healing:before { content: '\\e3f3'}\ni.icon.hearing:before { content: '\\e023'}\ni.icon.help:before { content: '\\e887'}\ni.icon.help.outline:before { content: '\\e8fd'}\ni.icon.high.quality:before { content: '\\e024'}\ni.icon.highlight:before { content: '\\e25f'}\ni.icon.highlight.off:before { content: '\\e888'}\ni.icon.history:before { content: '\\e889'}\ni.icon.home:before { content: '\\e88a'}\ni.icon.hot.tub:before { content: '\\eb46'}\ni.icon.hotel:before { content: '\\e53a'}\ni.icon.hourglass.empty:before { content: '\\e88b'}\ni.icon.hourglass.full:before { content: '\\e88c'}\ni.icon.http:before { content: '\\e902'}\ni.icon.https:before { content: '\\e88d'}\ni.icon.image:before { content: '\\e3f4'}\ni.icon.image.aspect.ratio:before { content: '\\e3f5'}\ni.icon.import.contacts:before { content: '\\e0e0'}\ni.icon.import.export:before { content: '\\e0c3'}\ni.icon.important.devices:before { content: '\\e912'}\ni.icon.inbox:before { content: '\\e156'}\ni.icon.indeterminate.check.box:before { content: '\\e909'}\ni.icon.info:before { content: '\\e88e'}\ni.icon.info.outline:before { content: '\\e88f'}\ni.icon.input:before { content: '\\e890'}\ni.icon.insert.chart:before { content: '\\e24b'}\ni.icon.insert.comment:before { content: '\\e24c'}\ni.icon.insert.drive.file:before { content: '\\e24d'}\ni.icon.insert.emoticon:before { content: '\\e24e'}\ni.icon.insert.invitation:before { content: '\\e24f'}\ni.icon.insert.link:before { content: '\\e250'}\ni.icon.insert.photo:before { content: '\\e251'}\ni.icon.invert.colors:before { content: '\\e891'}\ni.icon.invert.colors.off:before { content: '\\e0c4'}\ni.icon.iso:before { content: '\\e3f6'}\ni.icon.keyboard:before { content: '\\e312'}\ni.icon.keyboard.arrow.down:before { content: '\\e313'}\ni.icon.keyboard.arrow.left:before { content: '\\e314'}\ni.icon.keyboard.arrow.right:before { content: '\\e315'}\ni.icon.keyboard.arrow.up:before { content: '\\e316'}\ni.icon.keyboard.backspace:before { content: '\\e317'}\ni.icon.keyboard.capslock:before { content: '\\e318'}\ni.icon.keyboard.hide:before { content: '\\e31a'}\ni.icon.keyboard.return:before { content: '\\e31b'}\ni.icon.keyboard.tab:before { content: '\\e31c'}\ni.icon.keyboard.voice:before { content: '\\e31d'}\ni.icon.kitchen:before { content: '\\eb47'}\ni.icon.label:before { content: '\\e892'}\ni.icon.label.outline:before { content: '\\e893'}\ni.icon.landscape:before { content: '\\e3f7'}\ni.icon.language:before { content: '\\e894'}\ni.icon.laptop:before { content: '\\e31e'}\ni.icon.laptop.chromebook:before { content: '\\e31f'}\ni.icon.laptop.mac:before { content: '\\e320'}\ni.icon.laptop.windows:before { content: '\\e321'}\ni.icon.last.page:before { content: '\\e5dd'}\ni.icon.launch:before { content: '\\e895'}\ni.icon.layers:before { content: '\\e53b'}\ni.icon.layers.clear:before { content: '\\e53c'}\ni.icon.leak.add:before { content: '\\e3f8'}\ni.icon.leak.remove:before { content: '\\e3f9'}\ni.icon.lens:before { content: '\\e3fa'}\ni.icon.library.add:before { content: '\\e02e'}\ni.icon.library.books:before { content: '\\e02f'}\ni.icon.library.music:before { content: '\\e030'}\ni.icon.lightbulb.outline:before { content: '\\e90f'}\ni.icon.line.style:before { content: '\\e919'}\ni.icon.line.weight:before { content: '\\e91a'}\ni.icon.linear.scale:before { content: '\\e260'}\ni.icon.link:before { content: '\\e157'}\ni.icon.linked.camera:before { content: '\\e438'}\ni.icon.list:before { content: '\\e896'}\ni.icon.live.help:before { content: '\\e0c6'}\ni.icon.live.tv:before { content: '\\e639'}\ni.icon.local.activity:before { content: '\\e53f'}\ni.icon.local.airport:before { content: '\\e53d'}\ni.icon.local.atm:before { content: '\\e53e'}\ni.icon.local.bar:before { content: '\\e540'}\ni.icon.local.cafe:before { content: '\\e541'}\ni.icon.local.car.wash:before { content: '\\e542'}\ni.icon.local.convenience.store:before { content: '\\e543'}\ni.icon.local.dining:before { content: '\\e556'}\ni.icon.local.drink:before { content: '\\e544'}\ni.icon.local.florist:before { content: '\\e545'}\ni.icon.local.gas.station:before { content: '\\e546'}\ni.icon.local.grocery.store:before { content: '\\e547'}\ni.icon.local.hospital:before { content: '\\e548'}\ni.icon.local.hotel:before { content: '\\e549'}\ni.icon.local.laundry.service:before { content: '\\e54a'}\ni.icon.local.library:before { content: '\\e54b'}\ni.icon.local.mall:before { content: '\\e54c'}\ni.icon.local.movies:before { content: '\\e54d'}\ni.icon.local.offer:before { content: '\\e54e'}\ni.icon.local.parking:before { content: '\\e54f'}\ni.icon.local.pharmacy:before { content: '\\e550'}\ni.icon.local.phone:before { content: '\\e551'}\ni.icon.local.pizza:before { content: '\\e552'}\ni.icon.local.play:before { content: '\\e553'}\ni.icon.local.post.office:before { content: '\\e554'}\ni.icon.local.printshop:before { content: '\\e555'}\ni.icon.local.see:before { content: '\\e557'}\ni.icon.local.shipping:before { content: '\\e558'}\ni.icon.local.taxi:before { content: '\\e559'}\ni.icon.location.city:before { content: '\\e7f1'}\ni.icon.location.disabled:before { content: '\\e1b6'}\ni.icon.location.off:before { content: '\\e0c7'}\ni.icon.location.on:before { content: '\\e0c8'}\ni.icon.location.searching:before { content: '\\e1b7'}\ni.icon.lock:before { content: '\\e897'}\ni.icon.lock.open:before { content: '\\e898'}\ni.icon.lock.outline:before { content: '\\e899'}\ni.icon.looks:before { content: '\\e3fc'}\ni.icon.looks.3:before { content: '\\e3fb'}\ni.icon.looks.4:before { content: '\\e3fd'}\ni.icon.looks.5:before { content: '\\e3fe'}\ni.icon.looks.6:before { content: '\\e3ff'}\ni.icon.looks.one:before { content: '\\e400'}\ni.icon.looks.two:before { content: '\\e401'}\ni.icon.loop:before { content: '\\e028'}\ni.icon.loupe:before { content: '\\e402'}\ni.icon.low.priority:before { content: '\\e16d'}\ni.icon.loyalty:before { content: '\\e89a'}\ni.icon.mail:before { content: '\\e158'}\ni.icon.mail.outline:before { content: '\\e0e1'}\ni.icon.map:before { content: '\\e55b'}\ni.icon.markunread:before { content: '\\e159'}\ni.icon.markunread.mailbox:before { content: '\\e89b'}\ni.icon.memory:before { content: '\\e322'}\ni.icon.menu:before { content: '\\e5d2'}\ni.icon.merge.type:before { content: '\\e252'}\ni.icon.message:before { content: '\\e0c9'}\ni.icon.mic:before { content: '\\e029'}\ni.icon.mic.none:before { content: '\\e02a'}\ni.icon.mic.off:before { content: '\\e02b'}\ni.icon.mms:before { content: '\\e618'}\ni.icon.mode.comment:before { content: '\\e253'}\ni.icon.mode.edit:before { content: '\\e254'}\ni.icon.monetization.on:before { content: '\\e263'}\ni.icon.money.off:before { content: '\\e25c'}\ni.icon.monochrome.photos:before { content: '\\e403'}\ni.icon.mood:before { content: '\\e7f2'}\ni.icon.mood.bad:before { content: '\\e7f3'}\ni.icon.more:before { content: '\\e619'}\ni.icon.more.horiz:before { content: '\\e5d3'}\ni.icon.more.vert:before { content: '\\e5d4'}\ni.icon.motorcycle:before { content: '\\e91b'}\ni.icon.mouse:before { content: '\\e323'}\ni.icon.move.to.inbox:before { content: '\\e168'}\ni.icon.movie:before { content: '\\e02c'}\ni.icon.movie.creation:before { content: '\\e404'}\ni.icon.movie.filter:before { content: '\\e43a'}\ni.icon.multiline.chart:before { content: '\\e6df'}\ni.icon.music.note:before { content: '\\e405'}\ni.icon.music.video:before { content: '\\e063'}\ni.icon.my.location:before { content: '\\e55c'}\ni.icon.nature:before { content: '\\e406'}\ni.icon.nature.people:before { content: '\\e407'}\ni.icon.navigate.before:before { content: '\\e408'}\ni.icon.navigate.next:before { content: '\\e409'}\ni.icon.navigation:before { content: '\\e55d'}\ni.icon.near.me:before { content: '\\e569'}\ni.icon.network.cell:before { content: '\\e1b9'}\ni.icon.network.check:before { content: '\\e640'}\ni.icon.network.locked:before { content: '\\e61a'}\ni.icon.network.wifi:before { content: '\\e1ba'}\ni.icon.new.releases:before { content: '\\e031'}\ni.icon.next.week:before { content: '\\e16a'}\ni.icon.nfc:before { content: '\\e1bb'}\ni.icon.no.encryption:before { content: '\\e641'}\ni.icon.no.sim:before { content: '\\e0cc'}\ni.icon.not.interested:before { content: '\\e033'}\ni.icon.note:before { content: '\\e06f'}\ni.icon.note.add:before { content: '\\e89c'}\ni.icon.notifications:before { content: '\\e7f4'}\ni.icon.notifications.active:before { content: '\\e7f7'}\ni.icon.notifications.none:before { content: '\\e7f5'}\ni.icon.notifications.off:before { content: '\\e7f6'}\ni.icon.notifications.paused:before { content: '\\e7f8'}\ni.icon.offline.pin:before { content: '\\e90a'}\ni.icon.ondemand.video:before { content: '\\e63a'}\ni.icon.opacity:before { content: '\\e91c'}\ni.icon.open.in.browser:before { content: '\\e89d'}\ni.icon.open.in.new:before { content: '\\e89e'}\ni.icon.open.with:before { content: '\\e89f'}\ni.icon.pages:before { content: '\\e7f9'}\ni.icon.pageview:before { content: '\\e8a0'}\ni.icon.palette:before { content: '\\e40a'}\ni.icon.pan.tool:before { content: '\\e925'}\ni.icon.panorama:before { content: '\\e40b'}\ni.icon.panorama.fish.eye:before { content: '\\e40c'}\ni.icon.panorama.horizontal:before { content: '\\e40d'}\ni.icon.panorama.vertical:before { content: '\\e40e'}\ni.icon.panorama.wide.angle:before { content: '\\e40f'}\ni.icon.party.mode:before { content: '\\e7fa'}\ni.icon.pause:before { content: '\\e034'}\ni.icon.pause.circle.filled:before { content: '\\e035'}\ni.icon.pause.circle.outline:before { content: '\\e036'}\ni.icon.payment:before { content: '\\e8a1'}\ni.icon.people:before { content: '\\e7fb'}\ni.icon.people.outline:before { content: '\\e7fc'}\ni.icon.perm.camera.mic:before { content: '\\e8a2'}\ni.icon.perm.contact.calendar:before { content: '\\e8a3'}\ni.icon.perm.data.setting:before { content: '\\e8a4'}\ni.icon.perm.device.information:before { content: '\\e8a5'}\ni.icon.perm.identity:before { content: '\\e8a6'}\ni.icon.perm.media:before { content: '\\e8a7'}\ni.icon.perm.phone.msg:before { content: '\\e8a8'}\ni.icon.perm.scan.wifi:before { content: '\\e8a9'}\ni.icon.person:before { content: '\\e7fd'}\ni.icon.person.add:before { content: '\\e7fe'}\ni.icon.person.outline:before { content: '\\e7ff'}\ni.icon.person.pin:before { content: '\\e55a'}\ni.icon.person.pin.circle:before { content: '\\e56a'}\ni.icon.personal.video:before { content: '\\e63b'}\ni.icon.pets:before { content: '\\e91d'}\ni.icon.phone:before { content: '\\e0cd'}\ni.icon.phone.android:before { content: '\\e324'}\ni.icon.phone.bluetooth.speaker:before { content: '\\e61b'}\ni.icon.phone.forwarded:before { content: '\\e61c'}\ni.icon.phone.in.talk:before { content: '\\e61d'}\ni.icon.phone.iphone:before { content: '\\e325'}\ni.icon.phone.locked:before { content: '\\e61e'}\ni.icon.phone.missed:before { content: '\\e61f'}\ni.icon.phone.paused:before { content: '\\e620'}\ni.icon.phonelink:before { content: '\\e326'}\ni.icon.phonelink.erase:before { content: '\\e0db'}\ni.icon.phonelink.lock:before { content: '\\e0dc'}\ni.icon.phonelink.off:before { content: '\\e327'}\ni.icon.phonelink.ring:before { content: '\\e0dd'}\ni.icon.phonelink.setup:before { content: '\\e0de'}\ni.icon.photo:before { content: '\\e410'}\ni.icon.photo.album:before { content: '\\e411'}\ni.icon.photo.camera:before { content: '\\e412'}\ni.icon.photo.filter:before { content: '\\e43b'}\ni.icon.photo.library:before { content: '\\e413'}\ni.icon.photo.size.select.actual:before { content: '\\e432'}\ni.icon.photo.size.select.large:before { content: '\\e433'}\ni.icon.photo.size.select.small:before { content: '\\e434'}\ni.icon.picture.as.pdf:before { content: '\\e415'}\ni.icon.picture.in.picture:before { content: '\\e8aa'}\ni.icon.picture.in.picture.alt:before { content: '\\e911'}\ni.icon.pie.chart:before { content: '\\e6c4'}\ni.icon.pie.chart.outlined:before { content: '\\e6c5'}\ni.icon.pin.drop:before { content: '\\e55e'}\ni.icon.place:before { content: '\\e55f'}\ni.icon.play.arrow:before { content: '\\e037'}\ni.icon.play.circle.filled:before { content: '\\e038'}\ni.icon.play.circle.outline:before { content: '\\e039'}\ni.icon.play.for.work:before { content: '\\e906'}\ni.icon.playlist.add:before { content: '\\e03b'}\ni.icon.playlist.add.check:before { content: '\\e065'}\ni.icon.playlist.play:before { content: '\\e05f'}\ni.icon.plus.one:before { content: '\\e800'}\ni.icon.poll:before { content: '\\e801'}\ni.icon.polymer:before { content: '\\e8ab'}\ni.icon.pool:before { content: '\\eb48'}\ni.icon.portable.wifi.off:before { content: '\\e0ce'}\ni.icon.portrait:before { content: '\\e416'}\ni.icon.power:before { content: '\\e63c'}\ni.icon.power.input:before { content: '\\e336'}\ni.icon.power.settings.new:before { content: '\\e8ac'}\ni.icon.pregnant.woman:before { content: '\\e91e'}\ni.icon.present.to.all:before { content: '\\e0df'}\ni.icon.print:before { content: '\\e8ad'}\ni.icon.priority.high:before { content: '\\e645'}\ni.icon.public:before { content: '\\e80b'}\ni.icon.publish:before { content: '\\e255'}\ni.icon.query.builder:before { content: '\\e8ae'}\ni.icon.question.answer:before { content: '\\e8af'}\ni.icon.queue:before { content: '\\e03c'}\ni.icon.queue.music:before { content: '\\e03d'}\ni.icon.queue.play.next:before { content: '\\e066'}\ni.icon.radio:before { content: '\\e03e'}\ni.icon.radio.button.checked:before { content: '\\e837'}\ni.icon.radio.button.unchecked:before { content: '\\e836'}\ni.icon.rate.review:before { content: '\\e560'}\ni.icon.receipt:before { content: '\\e8b0'}\ni.icon.recent.actors:before { content: '\\e03f'}\ni.icon.record.voice.over:before { content: '\\e91f'}\ni.icon.redeem:before { content: '\\e8b1'}\ni.icon.redo:before { content: '\\e15a'}\ni.icon.refresh:before { content: '\\e5d5'}\ni.icon.remove:before { content: '\\e15b'}\ni.icon.remove.circle:before { content: '\\e15c'}\ni.icon.remove.circle.outline:before { content: '\\e15d'}\ni.icon.remove.from.queue:before { content: '\\e067'}\ni.icon.remove.red.eye:before { content: '\\e417'}\ni.icon.remove.shopping.cart:before { content: '\\e928'}\ni.icon.reorder:before { content: '\\e8fe'}\ni.icon.repeat:before { content: '\\e040'}\ni.icon.repeat.one:before { content: '\\e041'}\ni.icon.replay:before { content: '\\e042'}\ni.icon.replay.ten:before { content: '\\e059'}\ni.icon.replay.thirty:before { content: '\\e05a'}\ni.icon.replay.five:before { content: '\\e05b'}\ni.icon.reply:before { content: '\\e15e'}\ni.icon.reply.all:before { content: '\\e15f'}\ni.icon.report:before { content: '\\e160'}\ni.icon.report.problem:before { content: '\\e8b2'}\ni.icon.restaurant:before { content: '\\e56c'}\ni.icon.restaurant.menu:before { content: '\\e561'}\ni.icon.restore:before { content: '\\e8b3'}\ni.icon.restore.page:before { content: '\\e929'}\ni.icon.ring.volume:before { content: '\\e0d1'}\ni.icon.room:before { content: '\\e8b4'}\ni.icon.room.service:before { content: '\\eb49'}\ni.icon.rotate.ninety.degrees.ccw:before { content: '\\e418'}\ni.icon.rotate.left:before { content: '\\e419'}\ni.icon.rotate.right:before { content: '\\e41a'}\ni.icon.rounded.corner:before { content: '\\e920'}\ni.icon.router:before { content: '\\e328'}\ni.icon.rowing:before { content: '\\e921'}\ni.icon.rss.feed:before { content: '\\e0e5'}\ni.icon.rv.hookup:before { content: '\\e642'}\ni.icon.satellite:before { content: '\\e562'}\ni.icon.save:before { content: '\\e161'}\ni.icon.scanner:before { content: '\\e329'}\ni.icon.schedule:before { content: '\\e8b5'}\ni.icon.school:before { content: '\\e80c'}\ni.icon.screen.lock.landscape:before { content: '\\e1be'}\ni.icon.screen.lock.portrait:before { content: '\\e1bf'}\ni.icon.screen.lock.rotation:before { content: '\\e1c0'}\ni.icon.screen.rotation:before { content: '\\e1c1'}\ni.icon.screen.share:before { content: '\\e0e2'}\ni.icon.sd.card:before { content: '\\e623'}\ni.icon.sd.storage:before { content: '\\e1c2'}\ni.icon.search:before { content: '\\e8b6'}\ni.icon.security:before { content: '\\e32a'}\ni.icon.select.all:before { content: '\\e162'}\ni.icon.send:before { content: '\\e163'}\ni.icon.sentiment.dissatisfied:before { content: '\\e811'}\ni.icon.sentiment.neutral:before { content: '\\e812'}\ni.icon.sentiment.satisfied:before { content: '\\e813'}\ni.icon.sentiment.very.dissatisfied:before { content: '\\e814'}\ni.icon.sentiment.very.satisfied:before { content: '\\e815'}\ni.icon.settings:before { content: '\\e8b8'}\ni.icon.settings.applications:before { content: '\\e8b9'}\ni.icon.settings.backup.restore:before { content: '\\e8ba'}\ni.icon.settings.bluetooth:before { content: '\\e8bb'}\ni.icon.settings.brightness:before { content: '\\e8bd'}\ni.icon.settings.cell:before { content: '\\e8bc'}\ni.icon.settings.ethernet:before { content: '\\e8be'}\ni.icon.settings.input.antenna:before { content: '\\e8bf'}\ni.icon.settings.input.component:before { content: '\\e8c0'}\ni.icon.settings.input.composite:before { content: '\\e8c1'}\ni.icon.settings.input.hdmi:before { content: '\\e8c2'}\ni.icon.settings.input.svideo:before { content: '\\e8c3'}\ni.icon.settings.overscan:before { content: '\\e8c4'}\ni.icon.settings.phone:before { content: '\\e8c5'}\ni.icon.settings.power:before { content: '\\e8c6'}\ni.icon.settings.remote:before { content: '\\e8c7'}\ni.icon.settings.system.daydream:before { content: '\\e1c3'}\ni.icon.settings.voice:before { content: '\\e8c8'}\ni.icon.share:before { content: '\\e80d'}\ni.icon.shop:before { content: '\\e8c9'}\ni.icon.shop.two:before { content: '\\e8ca'}\ni.icon.shopping.basket:before { content: '\\e8cb'}\ni.icon.shopping.cart:before { content: '\\e8cc'}\ni.icon.short.text:before { content: '\\e261'}\ni.icon.show.chart:before { content: '\\e6e1'}\ni.icon.shuffle:before { content: '\\e043'}\ni.icon.signal.cellular.four.bar:before { content: '\\e1c8'}\ni.icon.signal.cellular.connected.no.internet.4.bar:before { content: '\\e1cd'}\ni.icon.signal.cellular.no.sim:before { content: '\\e1ce'}\ni.icon.signal.cellular.null:before { content: '\\e1cf'}\ni.icon.signal.cellular.off:before { content: '\\e1d0'}\ni.icon.signal.wifi.four.bar:before { content: '\\e1d8'}\ni.icon.signal.wifi.four.bar.lock:before { content: '\\e1d9'}\ni.icon.signal.wifi.off:before { content: '\\e1da'}\ni.icon.sim.card:before { content: '\\e32b'}\ni.icon.sim.card.alert:before { content: '\\e624'}\ni.icon.skip.next:before { content: '\\e044'}\ni.icon.skip.previous:before { content: '\\e045'}\ni.icon.slideshow:before { content: '\\e41b'}\ni.icon.slow.motion.video:before { content: '\\e068'}\ni.icon.smartphone:before { content: '\\e32c'}\ni.icon.smoke.free:before { content: '\\eb4a'}\ni.icon.smoking.rooms:before { content: '\\eb4b'}\ni.icon.sms:before { content: '\\e625'}\ni.icon.sms.failed:before { content: '\\e626'}\ni.icon.snooze:before { content: '\\e046'}\ni.icon.sort:before { content: '\\e164'}\ni.icon.sort.by.alpha:before { content: '\\e053'}\ni.icon.spa:before { content: '\\eb4c'}\ni.icon.space.bar:before { content: '\\e256'}\ni.icon.speaker:before { content: '\\e32d'}\ni.icon.speaker.group:before { content: '\\e32e'}\ni.icon.speaker.notes:before { content: '\\e8cd'}\ni.icon.speaker.notes.off:before { content: '\\e92a'}\ni.icon.speaker.phone:before { content: '\\e0d2'}\ni.icon.spellcheck:before { content: '\\e8ce'}\ni.icon.star:before { content: '\\e838'}\ni.icon.star.border:before { content: '\\e83a'}\ni.icon.star.half:before { content: '\\e839'}\ni.icon.stars:before { content: '\\e8d0'}\ni.icon.stay.current.landscape:before { content: '\\e0d3'}\ni.icon.stay.current.portrait:before { content: '\\e0d4'}\ni.icon.stay.primary.landscape:before { content: '\\e0d5'}\ni.icon.stay.primary.portrait:before { content: '\\e0d6'}\ni.icon.stop:before { content: '\\e047'}\ni.icon.stop.screen.share:before { content: '\\e0e3'}\ni.icon.storage:before { content: '\\e1db'}\ni.icon.store:before { content: '\\e8d1'}\ni.icon.store.mall.directory:before { content: '\\e563'}\ni.icon.straighten:before { content: '\\e41c'}\ni.icon.streetview:before { content: '\\e56e'}\ni.icon.strikethrough.s:before { content: '\\e257'}\ni.icon.style:before { content: '\\e41d'}\ni.icon.subdirectory.arrow.left:before { content: '\\e5d9'}\ni.icon.subdirectory.arrow.right:before { content: '\\e5da'}\ni.icon.subject:before { content: '\\e8d2'}\ni.icon.subscriptions:before { content: '\\e064'}\ni.icon.subtitles:before { content: '\\e048'}\ni.icon.subway:before { content: '\\e56f'}\ni.icon.supervisor.account:before { content: '\\e8d3'}\ni.icon.surround.sound:before { content: '\\e049'}\ni.icon.swap.calls:before { content: '\\e0d7'}\ni.icon.swap.horiz:before { content: '\\e8d4'}\ni.icon.swap.vert:before { content: '\\e8d5'}\ni.icon.swap.vertical.circle:before { content: '\\e8d6'}\ni.icon.switch.camera:before { content: '\\e41e'}\ni.icon.switch.video:before { content: '\\e41f'}\ni.icon.sync:before { content: '\\e627'}\ni.icon.sync.disabled:before { content: '\\e628'}\ni.icon.sync.problem:before { content: '\\e629'}\ni.icon.system.update:before { content: '\\e62a'}\ni.icon.system.update.alt:before { content: '\\e8d7'}\ni.icon.tab:before { content: '\\e8d8'}\ni.icon.tab.unselected:before { content: '\\e8d9'}\ni.icon.tablet:before { content: '\\e32f'}\ni.icon.tablet.android:before { content: '\\e330'}\ni.icon.tablet.mac:before { content: '\\e331'}\ni.icon.tag.faces:before { content: '\\e420'}\ni.icon.tap.and.play:before { content: '\\e62b'}\ni.icon.terrain:before { content: '\\e564'}\ni.icon.text.fields:before { content: '\\e262'}\ni.icon.text.format:before { content: '\\e165'}\ni.icon.textsms:before { content: '\\e0d8'}\ni.icon.texture:before { content: '\\e421'}\ni.icon.theaters:before { content: '\\e8da'}\ni.icon.thumb.down:before { content: '\\e8db'}\ni.icon.thumb.up:before { content: '\\e8dc'}\ni.icon.thumbs.up.down:before { content: '\\e8dd'}\ni.icon.time.to.leave:before { content: '\\e62c'}\ni.icon.timelapse:before { content: '\\e422'}\ni.icon.timeline:before { content: '\\e922'}\ni.icon.timer:before { content: '\\e425'}\ni.icon.timer.ten:before { content: '\\e423'}\ni.icon.timer.three:before { content: '\\e424'}\ni.icon.timer.off:before { content: '\\e426'}\ni.icon.title:before { content: '\\e264'}\ni.icon.toc:before { content: '\\e8de'}\ni.icon.today:before { content: '\\e8df'}\ni.icon.toll:before { content: '\\e8e0'}\ni.icon.tonality:before { content: '\\e427'}\ni.icon.touch.app:before { content: '\\e913'}\ni.icon.toys:before { content: '\\e332'}\ni.icon.track.changes:before { content: '\\e8e1'}\ni.icon.traffic:before { content: '\\e565'}\ni.icon.train:before { content: '\\e570'}\ni.icon.tram:before { content: '\\e571'}\ni.icon.transfer.within.a.station:before { content: '\\e572'}\ni.icon.transform:before { content: '\\e428'}\ni.icon.translate:before { content: '\\e8e2'}\ni.icon.trending.down:before { content: '\\e8e3'}\ni.icon.trending.flat:before { content: '\\e8e4'}\ni.icon.trending.up:before { content: '\\e8e5'}\ni.icon.tune:before { content: '\\e429'}\ni.icon.turned.in:before { content: '\\e8e6'}\ni.icon.turned.in.not:before { content: '\\e8e7'}\ni.icon.tv:before { content: '\\e333'}\ni.icon.unarchive:before { content: '\\e169'}\ni.icon.undo:before { content: '\\e166'}\ni.icon.unfold.less:before { content: '\\e5d6'}\ni.icon.unfold.more:before { content: '\\e5d7'}\ni.icon.update:before { content: '\\e923'}\ni.icon.usb:before { content: '\\e1e0'}\ni.icon.verified.user:before { content: '\\e8e8'}\ni.icon.vertical.align.bottom:before { content: '\\e258'}\ni.icon.vertical.align.center:before { content: '\\e259'}\ni.icon.vertical.align.top:before { content: '\\e25a'}\ni.icon.vibration:before { content: '\\e62d'}\ni.icon.video.call:before { content: '\\e070'}\ni.icon.video.label:before { content: '\\e071'}\ni.icon.video.library:before { content: '\\e04a'}\ni.icon.videocam:before { content: '\\e04b'}\ni.icon.videocam.off:before { content: '\\e04c'}\ni.icon.videogame.asset:before { content: '\\e338'}\ni.icon.view.agenda:before { content: '\\e8e9'}\ni.icon.view.array:before { content: '\\e8ea'}\ni.icon.view.carousel:before { content: '\\e8eb'}\ni.icon.view.column:before { content: '\\e8ec'}\ni.icon.view.comfy:before { content: '\\e42a'}\ni.icon.view.compact:before { content: '\\e42b'}\ni.icon.view.day:before { content: '\\e8ed'}\ni.icon.view.headline:before { content: '\\e8ee'}\ni.icon.view.list:before { content: '\\e8ef'}\ni.icon.view.module:before { content: '\\e8f0'}\ni.icon.view.quilt:before { content: '\\e8f1'}\ni.icon.view.stream:before { content: '\\e8f2'}\ni.icon.view.week:before { content: '\\e8f3'}\ni.icon.vignette:before { content: '\\e435'}\ni.icon.visibility:before { content: '\\e8f4'}\ni.icon.visibility.off:before { content: '\\e8f5'}\ni.icon.voice.chat:before { content: '\\e62e'}\ni.icon.voicemail:before { content: '\\e0d9'}\ni.icon.volume.down:before { content: '\\e04d'}\ni.icon.volume.mute:before { content: '\\e04e'}\ni.icon.volume.off:before { content: '\\e04f'}\ni.icon.volume.up:before { content: '\\e050'}\ni.icon.vpn.key:before { content: '\\e0da'}\ni.icon.vpn.lock:before { content: '\\e62f'}\ni.icon.wallpaper:before { content: '\\e1bc'}\ni.icon.warning:before { content: '\\e002'}\ni.icon.watch:before { content: '\\e334'}\ni.icon.watch.later:before { content: '\\e924'}\ni.icon.wb.auto:before { content: '\\e42c'}\ni.icon.wb.cloudy:before { content: '\\e42d'}\ni.icon.wb.incandescent:before { content: '\\e42e'}\ni.icon.wb.iridescent:before { content: '\\e436'}\ni.icon.wb.sunny:before { content: '\\e430'}\ni.icon.wc:before { content: '\\e63d'}\ni.icon.web:before { content: '\\e051'}\ni.icon.web.asset:before { content: '\\e069'}\ni.icon.weekend:before { content: '\\e16b'}\ni.icon.whatshot:before { content: '\\e80e'}\ni.icon.widgets:before { content: '\\e1bd'}\ni.icon.wifi:before { content: '\\e63e'}\ni.icon.wifi.lock:before { content: '\\e1e1'}\ni.icon.wifi.tethering:before { content: '\\e1e2'}\ni.icon.work:before { content: '\\e8f9'}\ni.icon.wrap.text:before { content: '\\e25b'}\ni.icon.youtube.searched.for:before { content: '\\e8fa'}\ni.icon.zoom.in:before { content: '\\e8ff'}\ni.icon.zoom.out:before { content: '\\e900'}\ni.icon.zoom.out.map:before { content: '\\e56b'}\n"
  },
  {
    "path": "semantic/src/themes/material/elements/icon.variables",
    "content": "@fontPath  : '../../themes/material/assets/fonts';\n\n@width: 1em;\n@height: 1em;\n\n@small: 13px;\n@medium: 16px;\n@large: 18px;\n@big : 20px;\n@huge: 28px;\n@massive: 32px;\n"
  },
  {
    "path": "semantic/src/themes/material/globals/site.overrides",
    "content": ""
  },
  {
    "path": "semantic/src/themes/material/globals/site.variables",
    "content": "/*******************************\n         Site Settings\n*******************************/\n\n/*-------------------\n       Fonts\n--------------------*/\n\n@headerFont        : 'Roboto', 'Helvetica Neue', Arial, Helvetica, sans-serif;\n@pageFont          : 'Roboto', 'Helvetica Neue', Arial, Helvetica, sans-serif;\n@googleFontName    : 'Roboto';\n\n/*-------------------\n      Base Sizes\n--------------------*/\n\n@emSize            : 14px;\n@fontSize          : 13px;\n\n/*--------------\n      Page\n---------------*/\n\n@pageBackground      : #F9F9F9;\n@lineHeight          : 1.33;\n@textColor           : #212121;\n\n/*--------------\n  Page Heading\n---------------*/\n\n@headerLineHeight : 1.33em;\n@headerFontWeight : 400;\n\n@h1               : 2.25rem;\n@h2               : 2rem;\n@h3               : 1.75rem;\n@h4               : 1.5rem;\n@h5               : 1.25rem;\n\n\n/*-------------------\n        Paths\n--------------------*/\n\n@imagePath : '../../themes/material/assets/images';\n@fontPath  : '../../themes/material/assets/fonts';\n\n/*--------------\n   Paragraphs\n---------------*/\n\n@paragraphLineHeight: 1.7em;\n\n/*-------------------\n      Site Colors\n--------------------*/\n\n/*---  Colors  ---*/\n@black            : #1B1C1D;\n@blue             : #2196F3;\n@green            : #4CAF50;\n@grey             : #9E9E9E;\n@orange           : #FF9800;\n@pink             : #E91E63;\n@purple           : #9C27B0;\n@red              : #F44336;\n@teal             : #1de9b6;\n@yellow           : #FFEB3B;\n\n/*---  Light Colors  ---*/\n@lightBlack       : #333333;\n@lightBlue        : #2979FF;\n@lightGreen       : #00E676;\n@lightOrange      : #FF9100;\n@lightPink        : #F50057;\n@lightPurple      : #D500F9;\n@lightRed         : #FF1744;\n@lightTeal        : #1DE9B6;\n@lightYellow      : #FFEA00;\n\n/*---   Neutrals  ---*/\n@fullBlack        : #000000;\n@darkGrey         : #AAAAAA;\n@lightGrey        : #DCDDDE;\n@offWhite         : #FAFAFA;\n@darkWhite        : #F0F0F0;\n@white            : #FFFFFF;\n\n/*-------------------\n    Brand Colors\n--------------------*/\n\n@primaryColor        : @blue;\n@secondaryColor      : @grey;\n\n@lightPrimaryColor   : @lightBlue;\n@lightSecondaryColor : @lightGrey;\n\n/*-------------------\n      Paragraph\n--------------------*/\n\n@paragraphMargin     : 0em 0em 1.53em;\n\n/*-------------------\n       Links\n--------------------*/\n\n@linkColor           : #009FDA;\n@linkUnderline       : none;\n@linkHoverColor      : lighten(@linkColor, 5);\n@linkHoverUnderline  : @linkUnderline;\n\n/*-------------------\n  Highlighted Text\n--------------------*/\n\n@highlightBackground : #009FDA;\n@highlightColor      : @white;\n\n/*-------------------\n       Accents\n--------------------*/\n\n/* 4px @ default em */\n@relativeBorderRadius: @relative4px;\n@absoluteBorderRadius: 4px;\n"
  },
  {
    "path": "semantic/src/themes/material/modules/dropdown.overrides",
    "content": "@import url(https://fonts.googleapis.com/css?family=Roboto:400,700);\n\n.ui.dropdown {\n  font-family: 'Roboto';\n}\n"
  },
  {
    "path": "semantic/src/themes/material/modules/dropdown.variables",
    "content": "/*******************************\n             Menu\n*******************************/\n\n@menuBorderRadius: @borderRadius;\n@menuBorderColor: #DADADA;\n@menuBoxShadow: 0px 2px 4px rgba(0, 0, 0, 0.2);\n\n@menuPadding: @relative8px 0em;\n@itemVerticalPadding: 1em;\n@itemHorizontalPadding: 1.5em;\n\n@menuHeaderFontSize: @small;\n@menuHeaderFontWeight: bold;\n@menuHeaderTextTransform: none;\n\n@selectionBorderEmWidth: 0em;\n@selectionItemDivider: none;\n\n@labelBoxShadow: none;"
  },
  {
    "path": "semantic/src/themes/material/modules/modal.overrides",
    "content": "@import url(https://fonts.googleapis.com/css?family=Roboto);\n\n.ui.modal .header {\n  font-family: \"Roboto\", Arial, Sans-serif !important;\n  font-weight: 400 !important;\n}\n"
  },
  {
    "path": "semantic/src/themes/material/modules/modal.variables",
    "content": "@boxShadow: 0px 10px 18px rgba(0, 0, 0, 0.22);\n@borderRadius: 0em;\n\n\n@headerBackground: @white;\n@headerVerticalPadding: 1.7142rem;\n@headerHorizontalPadding: 1.7142rem;\n@headerFontWeight: 400;\n@headerFontFamily: 'Roboto', \"Helvetica Neue\", Arial, sans-serif;\n@headerBorder: none;\n\n@contentPadding: 1rem 2rem 2rem;\n\n@actionBorder: none;\n@actionBackground: @white;"
  },
  {
    "path": "semantic/src/themes/pulsar/elements/loader.overrides",
    "content": "/*******************************\n         Theme Overrides\n*******************************/\n\n.ui.loader:after {\n  -webkit-animation: loader-pulsar 2s infinite linear;\n  animation: loader-pulsar 2s infinite linear;\n}\n\n@-webkit-keyframes loader-pulsar {\n  0% {\n    -webkit-transform: rotate(0deg);\n            transform: rotate(0deg);\n    opacity: 0;\n  }\n  20% {\n    -webkit-transform: rotate(360deg);\n            transform: rotate(360deg);\n  }\n  40% {\n    -webkit-transform: rotate(740deg);\n            transform: rotate(740deg);\n    opacity: 1;\n  }\n  60% {\n    -webkit-transform: rotate(1120deg);\n            transform: rotate(1120deg);\n    opacity: 1;\n  }\n  80% {\n    -webkit-transform: rotate(1440deg);\n            transform: rotate(1440deg);\n  }\n  100% {\n    -webkit-transform: rotate(1800deg);\n            transform: rotate(1800deg);\n    opacity: 0;\n  }\n}\n\n@keyframes loader-pulsar {\n  0% {\n    -webkit-transform: rotate(0deg);\n            transform: rotate(0deg);\n    opacity: 0;\n  }\n  20% {\n    -webkit-transform: rotate(360deg);\n            transform: rotate(360deg);\n  }\n  40% {\n    -webkit-transform: rotate(740deg);\n            transform: rotate(740deg);\n    opacity: 1;\n  }\n  60% {\n    -webkit-transform: rotate(1120deg);\n            transform: rotate(1120deg);\n    opacity: 1;\n  }\n  80% {\n    -webkit-transform: rotate(1440deg);\n            transform: rotate(1440deg);\n  }\n  100% {\n    -webkit-transform: rotate(1800deg);\n            transform: rotate(1800deg);\n    opacity: 0;\n  }\n}"
  },
  {
    "path": "semantic/src/themes/pulsar/elements/loader.variables",
    "content": "/*******************************\n             Loader\n*******************************/\n\n@loaderSpeed: 2s;\n@loaderLineColor: @primaryColor;\n@invertedLoaderLineColor: @lightPrimaryColor;\n"
  },
  {
    "path": "semantic/src/themes/raised/elements/button.overrides",
    "content": "/*******************************\n           Overrides\n*******************************/\n"
  },
  {
    "path": "semantic/src/themes/raised/elements/button.variables",
    "content": "/*******************************\n            Button\n*******************************/\n\n/*-------------------\n       Element\n--------------------*/\n\n@backgroundColor: #F8F8F8;\n@backgroundImage: linear-gradient(transparent, rgba(0, 0, 0, 0.05));\n@verticalAlign: middle;\n@borderRadius: 0.4em;\n@borderBoxShadowColor: @borderColor;\n\n/* Shadow */\n@shadowDistance: 0.3em;\n@verticalPadding: 1em;\n@horizontalPadding: 2em;\n\n/* transition box shadow as well */\n@transition:\n  opacity @defaultDuration @defaultEasing,\n  background-color @defaultDuration @defaultEasing,\n  box-shadow @defaultDuration @defaultEasing,\n  color @defaultDuration @defaultEasing,\n  background @defaultDuration @defaultEasing\n;"
  },
  {
    "path": "semantic/src/themes/resetcss/globals/reset.overrides",
    "content": "/*******************************\n           Overrides\n*******************************/\n\n/**\n * Eric Meyer's Reset CSS v2.0 (http://meyerweb.com/eric/tools/css/reset/)\n * http://cssreset.com\n */\n\nhtml, body, div, span, applet, object, iframe,\nh1, h2, h3, h4, h5, h6, p, blockquote, pre,\na, abbr, acronym, address, big, cite, code,\ndel, dfn, em, img, ins, kbd, q, s, samp,\nsmall, strike, strong, sub, sup, tt, var,\nb, u, i, center,\ndl, dt, dd, ol, ul, li,\nfieldset, form, label, legend,\ntable, caption, tbody, tfoot, thead, tr, th, td,\narticle, aside, canvas, details, embed,\nfigure, figcaption, footer, header, hgroup,\nmenu, nav, output, ruby, section, summary,\ntime, mark, audio, video {\n  margin: 0;\n  padding: 0;\n  border: 0;\n  font-size: 100%;\n  font: inherit;\n  vertical-align: baseline;\n}\n/* HTML5 display-role reset for older browsers */\narticle, aside, details, figcaption, figure,\nfooter, header, hgroup, menu, nav, section {\n  display: block;\n}\nbody {\n  line-height: 1;\n}\nol, ul {\n  list-style: none;\n}\nblockquote, q {\n  quotes: none;\n}\nblockquote:before, blockquote:after,\nq:before, q:after {\n  content: '';\n  content: none;\n}\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}"
  },
  {
    "path": "semantic/src/themes/resetcss/globals/reset.variables",
    "content": "/*******************************\n             Reset\n*******************************/"
  },
  {
    "path": "semantic/src/themes/round/elements/button.overrides",
    "content": ""
  },
  {
    "path": "semantic/src/themes/round/elements/button.variables",
    "content": "/*******************************\n            Button\n*******************************/\n\n/*-------------------\n       Element\n--------------------*/\n@borderRadius: @circularRadius;\n@textTransform: uppercase;\n@backgroundColor: #FFFFFF;\n@backgroundImage: none;\n@fontWeight: bold;\n@textColor: rgba(0, 0, 0, 0.6);\n@boxShadow:\n  0px 0px 0px 2px rgba(0, 0, 0, 0.2) inset\n;\n\n/* Padding */\n@verticalPadding: 1.25em;\n@horizontalPadding: 3em;\n\n/* Icon */\n@iconOpacity: 0.8;\n@iconDistance: 0.4em;\n@iconTransition: opacity @defaultDuration @defaultEasing;\n@iconMargin: 0em @iconDistance 0em -(@iconDistance / 2);\n@iconVerticalAlign: top;\n\n/*-------------------\n        Group\n--------------------*/\n\n@verticalBoxShadow: 0px 0px 0px 1px @borderColor inset;\n\n\n/*-------------------\n        States\n--------------------*/\n\n@hoverBackgroundColor: #FAFAFA;\n@hoverBackgroundImage: none;\n@hoverBoxShadow: 0px 0px 0px 2px rgba(0, 0, 0, 0.3) inset;\n\n@downBackgroundColor: #F0F0F0;\n@downBackgroundImage: none;\n@downBoxShadow: 0px 0px 0px 2px rgba(0, 0, 0, 0.35) inset !important;\n\n@activeBackgroundColor: #DDDDDD;\n@activeBackgroundImage: none;\n@activeBoxShadow: 0px 0px 0px 2px rgba(0, 0, 0, 0.3) inset !important;\n\n@loadingBackgroundColor: #FFFFFF;\n\n/*-------------------\n        Types\n--------------------*/\n\n/* Labeled Icon */\n@labeledIconWidth: 1em + (@verticalPadding * 2);\n@labeledIconBackgroundColor: transparent;\n@labeledIconPadding: (@horizontalPadding + 1em);\n@labeledIconBorder: rgba(0, 0, 0, 0.05);\n@labeledIconColor: '';\n\n@labeledIconLeftShadow: none;\n@labeledIconRightShadow: none;\n\n/* Basic */\n@basicBoxShadow: 0px 0px 0px 1px @borderColor;\n@iconOffset: 0.05em;\n@basicLoadingColor: #FFFFFF;\n\n@basicHoverBackground: #FAFAFA;\n@basicHoverBoxShadow: 0px 0px 0px 1px rgba(0, 0, 0, 0.15);\n\n@basicDownBackground: rgba(0, 0, 0, 0.02);\n@basicDownBoxShadow: 0px 0px 0px 1px rgba(0, 0, 0, 0.2);\n\n@basicActiveBackground: @transparentBlack;\n@basicActiveColor: @selectedTextColor;\n\n/* Basic Inverted */\n@basicInvertedBackground: transparent;\n@basicInvertedHoverBackground: transparent;\n@basicInvertedDownBackground: @transparentWhite;\n@basicInvertedActiveBackground: @transparentWhite;\n\n@basicInvertedBoxShadow: 0px 0px 0px 2px rgba(255, 255, 255, 0.5);\n@basicInvertedHoverBoxShadow: 0px 0px 0px 2px @selectedWhiteBorderColor;\n@basicInvertedDownBoxShadow: 0px 0px 0px 2px @selectedWhiteBorderColor;\n@basicInvertedActiveBoxShadow: 0px 0px 0px 2px @selectedWhiteBorderColor;\n\n@basicInvertedColor: @darkWhite;\n@basicInvertedHoverColor: @darkWhiteHover;\n@basicInvertedDownColor: @darkWhiteActive;\n@basicInvertedActiveColor: @invertedTextColor;\n\n\n/* Basic Group */\n@basicGroupBorder: 1px solid @borderColor;\n@basicGroupBoxShadow: 0px 0px 0px 1px @borderColor;\n\n/*-------------------\n      Variations\n--------------------*/\n\n/* Colors */\n@coloredBackgroundImage: linear-gradient(rgba(255, 255, 255, 0.05), rgba(0, 0, 0, 0.1));\n@coloredBoxShadow: @shadowBoxShadow;\n\n/* Compact */\n@compactVerticalPadding: (@verticalPadding * 0.75);\n@compactHorizontalPadding: (@horizontalPadding * 0.75);\n\n/* Attached */\n@attachedOffset: -1px;\n@attachedBoxShadow: 0px 0px 0px 1px rgba(0, 0, 0, 0.1);\n@attachedHorizontalPadding: 0.75em;\n\n/* Floated */\n@floatedMargin: 0.25em;\n\n/* Animated */\n@animationDuration: 0.3s;\n@animationEasing: ease;\n@fadeScaleHigh: 1.5;\n@fadeScaleLow: 0.75;\n\n/* Sizing */\n@mini: 0.7rem;\n@tiny: 0.8rem;\n@small: 0.875rem;\n@medium: 1rem;\n@large: 1.125rem;\n@big: 1.25rem;\n@huge: 1.375rem;\n@massive: 1.5rem;\n\n"
  },
  {
    "path": "semantic/src/themes/rtl/globals/site.overrides",
    "content": "/*******************************\n        Global Overrides\n*******************************/\n\n/* Import Droid Arabic Kufi */\n@import 'http://fonts.googleapis.com/earlyaccess/droidarabickufi.css';\n"
  },
  {
    "path": "semantic/src/themes/rtl/globals/site.variables",
    "content": "/*******************************\n         Site Settings\n*******************************/\n\n/*-------------------\n       Fonts\n--------------------*/\n\n@googleFontName    : 'Droid Sans';\n\n/* Kufi imported in site.overrides */\n@headerFont        : 'Droid Arabic Kufi', 'Droid Sans', 'Helvetica Neue', Arial, Helvetica, sans-serif;\n@pageFont          : 'Droid Arabic Kufi', 'Droid Sans', 'Helvetica Neue', Arial, Helvetica, sans-serif;\n\n"
  },
  {
    "path": "semantic/src/themes/striped/modules/progress.overrides",
    "content": "/*******************************\n            Progress\n*******************************/\n\n.ui.progress .bar {\n  background-size: 30px 30px;\n  background-image:\n    linear-gradient(\n      135deg, rgba(255, 255, 255, 0.08) 25%, transparent 25%,\n      transparent 50%, rgba(255, 255, 255, 0.08) 50%, rgba(255, 255, 255, 0.08) 75%,\n      transparent 75%, transparent\n    )\n  ;\n}\n\n.ui.progress.active .bar:after {\n  animation: none;\n}\n.ui.progress.active .bar {\n  animation: progress-striped 3s linear infinite;\n}\n@keyframes progress-striped {\n  0% {\n    background-position: 0px 0;\n  }\n  100% {\n    background-position: 60px 0;\n  }\n}\n"
  },
  {
    "path": "semantic/src/themes/striped/modules/progress.variables",
    "content": "/*******************************\n            Progress\n*******************************/\n"
  },
  {
    "path": "semantic/src/themes/timeline/views/feed.overrides",
    "content": "/*******************************\n    User Variable Overrides\n*******************************/\n\n.ui.feed > .event .label {\n  border-left: 3px solid #DDDDDD;\n}\n.ui.feed > .event:last-child .label {\n  border-left-color: transparent;\n}\n\n.ui.feed > .event > .label {\n  margin-left: 1.6em;\n}\n\n.ui.feed > .event > .label > img,\n.ui.feed > .event > .label > .icon {\n  background-color: #009FDA;\n  border-radius: 500rem;\n  color: #FFFFFF;\n  width: 3rem;\n  height: 3rem;\n  line-height: 1.5;\n  left: -1.6rem;\n  opacity: 1;\n  position: relative;\n}\n"
  },
  {
    "path": "semantic/src/themes/timeline/views/feed.variables",
    "content": "/*******************************\n             Feed\n*******************************/\n\n/*-------------------\n      Elements\n--------------------*/\n\n@eventMargin: 0em;\n@eventDivider: none;\n@eventPadding: 0em;\n\n/* Event Label */\n@labelWidth: 3em;\n@labelHeight: auto;\n\n@labeledContentMargin: 0.75em 0em 2em 0.75em;\n\n/* Icon */\n@iconLabelBackground: @primaryColor;\n@iconLabelBorderRadius: @circularRadius;\n@iconLabelColor: @white;\n\n/* Metadata Group */\n@metadataDisplay: inline-block;\n@metadataMargin: 1em 0em 0em;\n@metadataBackground: @white @subtleGradient;\n@metadataBorder: 1px solid @solidBorderColor;\n@metadataBorderRadius: 0.25em;\n@metadataBoxShadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n@metadataPadding: 0.5em 1em;\n@metadataColor: rgba(0, 0, 0, 0.6);\n\n/*-------------------\n      Variations\n--------------------*/\n"
  },
  {
    "path": "semantic/src/themes/twitter/elements/button.overrides",
    "content": "/*******************************\n           Overrides\n*******************************/\n\n.ui.primary.button {\n  box-shadow:\n    0px 0px 0px 1px #3B88C3 inset,\n    0 2px 0 rgba(255, 255, 255, 0.15) inset\n  ;\n}\n.ui.primary.button > .icon {\n  color: #FFFFFF;\n}\n"
  },
  {
    "path": "semantic/src/themes/twitter/elements/button.variables",
    "content": "/*-------------------\n   Global Variables\n--------------------*/\n\n@pageFont: Helvetica Neue, Helvetica, Arial, sans-serif;\n@textColor: #66757F;\n@blue: #55ACEE;\n\n/*-------------------\n   Button Variables\n--------------------*/\n\n@backgroundColor: #F5F8FA;\n@backgroundImage: linear-gradient(@white, @backgroundColor);\n@color: #66757F;\n@borderBoxShadowColor: #E1E8ED;\n\n@textTransform: none;\n@fontWeight: bold;\n@textColor: #333333;\n\n@horizontalPadding: 1.284em;\n@verticalPadding: 0.8571em;\n\n@activeBackgroundColor: rgba(0, 0, 0, 0.1);\n\n@primaryColor: @blue;\n@coloredBackgroundImage: @subtleGradient;\n\n\n/*-------------------\n        States\n--------------------*/\n\n@hoverBackgroundColor: #E1E8ED;\n@hoverBackgroundImage: linear-gradient(@white, @hoverBackgroundColor);\n@hoverColor: #292F33;\n\n@downBackgroundColor: #E1E8ED;\n@downColor: #292F33;\n@downPressedShadow: 0px 1px 4px rgba(0, 0, 0, 0.2) inset;\n\n@labeledIconBackgroundColor: rgba(85, 172, 238, 0.05);\n@labeledIconBorder: rgba(0, 0, 0, 0.1);\n"
  },
  {
    "path": "semantic/tasks/README.md",
    "content": "## Tasks\n\n* Watch - Compile only changed files from source\n* Build - Build all files from source\n* Version - Output version number\n* Install - Run Installer to Set-up Paths\n\n## How to use\n\nThese tasks can be imported into your own gulpfile allowing you to avoid using Semantic's build tools\n\n```javascript\nvar\n  watch = require('path/to/semantic/tasks/watch')\n;\ngulp.task('watch ui', watch);\n```\n"
  },
  {
    "path": "semantic/tasks/admin/components/create.js",
    "content": "/*******************************\n     Create Component Repos\n*******************************/\n\n/*\n This will create individual component repositories for each SUI component\n\n  * copy component files from release\n  * create commonjs files as index.js for NPM release\n  * create release notes that filter only items related to component\n  * custom package.json file from template\n  * create bower.json from template\n  * create README from template\n  * create meteor.js file\n*/\n\nvar\n  gulp            = require('gulp'),\n\n  // node dependencies\n  console         = require('better-console'),\n  del             = require('del'),\n  fs              = require('fs'),\n  path            = require('path'),\n  runSequence     = require('run-sequence'),\n\n  // admin dependencies\n  concatFileNames = require('gulp-concat-filenames'),\n  debug           = require('gulp-debug'),\n  flatten         = require('gulp-flatten'),\n  git             = require('gulp-git'),\n  jsonEditor      = require('gulp-json-editor'),\n  plumber         = require('gulp-plumber'),\n  rename          = require('gulp-rename'),\n  replace         = require('gulp-replace'),\n  tap             = require('gulp-tap'),\n  util            = require('gulp-util'),\n\n  // config\n  config          = require('../../config/user'),\n  release         = require('../../config/admin/release'),\n  project         = require('../../config/project/release'),\n\n  // shorthand\n  version         = project.version,\n  output          = config.paths.output\n\n;\n\n\nmodule.exports = function(callback) {\n  var\n    stream,\n    index,\n    tasks = []\n  ;\n\n  for(index in release.components) {\n\n    var\n      component = release.components[index]\n    ;\n\n    // streams... designed to save time and make coding fun...\n    (function(component) {\n\n      var\n        outputDirectory      = path.join(release.outputRoot, component),\n        isJavascript         = fs.existsSync(output.compressed + component + '.js'),\n        isCSS                = fs.existsSync(output.compressed + component + '.css'),\n        capitalizedComponent = component.charAt(0).toUpperCase() + component.slice(1),\n        packageName          = release.packageRoot + component,\n        repoName             = release.componentRepoRoot + capitalizedComponent,\n        gitURL               = 'https://github.com/' + release.org + '/' + repoName + '.git',\n        repoURL              = 'https://github.com/' + release.org + '/' + repoName + '/',\n        concatSettings = {\n          newline : '',\n          root    : outputDirectory,\n          prepend : \"    '\",\n          append  : \"',\"\n        },\n        regExp               = {\n          match            : {\n            // templated values\n            name      : '{component}',\n            titleName : '{Component}',\n            version   : '{version}',\n            files     : '{files}',\n            // release notes\n            spacedVersions    : /(###.*\\n)\\n+(?=###)/gm,\n            spacedLists       : /(^- .*\\n)\\n+(?=^-)/gm,\n            trim              : /^\\s+|\\s+$/g,\n            unrelatedNotes    : new RegExp('^((?!(^.*(' + component + ').*$|###.*)).)*$', 'gmi'),\n            whitespace        : /\\n\\s*\\n\\s*\\n/gm,\n            // npm\n            componentExport   : /(.*)\\$\\.fn\\.\\w+\\s*=\\s*function\\(([^\\)]*)\\)\\s*{/g,\n            componentReference: '$.fn.' + component,\n            settingsExport    : /\\$\\.fn\\.\\w+\\.settings\\s*=/g,\n            settingsReference : /\\$\\.fn\\.\\w+\\.settings/g,\n            trailingComma     : /,(?=[^,]*$)/,\n            jQuery            : /jQuery/g,\n          },\n          replace : {\n            // readme\n            name              : component,\n            titleName         : capitalizedComponent,\n            // release notes\n            spacedVersions    : '',\n            spacedLists       : '$1',\n            trim              : '',\n            unrelatedNotes    : '',\n            whitespace        : '\\n\\n',\n            // npm\n            componentExport   :  'var _module = module;\\n$1module.exports = function($2) {',\n            componentReference:  '_module.exports',\n            settingsExport    :  'module.exports.settings =',\n            settingsReference :  '_module.exports.settings',\n            jQuery            :  'require(\"jquery\")'\n          }\n        },\n        task = {\n          all      : component + ' creating',\n          repo     : component + ' create repo',\n          bower    : component + ' create bower.json',\n          readme   : component + ' create README',\n          npm      : component + ' create NPM Module',\n          notes    : component + ' create release notes',\n          composer : component + ' create composer.json',\n          package  : component + ' create package.json',\n          meteor   : component + ' create meteor package.js',\n        },\n        // paths to includable assets\n        manifest = {\n          assets    : outputDirectory + '/assets/**/' + component + '?(s).*',\n          component : outputDirectory + '/' + component + '+(.js|.css)'\n        }\n      ;\n\n      // copy dist files into output folder adjusting asset paths\n      gulp.task(task.repo, false, function() {\n        return gulp.src(release.source + component + '.*')\n          .pipe(plumber())\n          .pipe(flatten())\n          .pipe(replace(release.paths.source, release.paths.output))\n          .pipe(gulp.dest(outputDirectory))\n        ;\n      });\n\n      // create npm module\n      gulp.task(task.npm, false, function() {\n        return gulp.src(release.source + component + '!(*.min|*.map).js')\n          .pipe(plumber())\n          .pipe(flatten())\n          .pipe(replace(regExp.match.componentExport, regExp.replace.componentExport))\n          .pipe(replace(regExp.match.componentReference, regExp.replace.componentReference))\n          .pipe(replace(regExp.match.settingsExport, regExp.replace.settingsExport))\n          .pipe(replace(regExp.match.settingsReference, regExp.replace.settingsReference))\n          .pipe(replace(regExp.match.jQuery, regExp.replace.jQuery))\n          .pipe(rename('index.js'))\n          .pipe(gulp.dest(outputDirectory))\n        ;\n      });\n\n      // create readme\n      gulp.task(task.readme, false, function() {\n        return gulp.src(release.templates.readme)\n          .pipe(plumber())\n          .pipe(flatten())\n          .pipe(replace(regExp.match.name, regExp.replace.name))\n          .pipe(replace(regExp.match.titleName, regExp.replace.titleName))\n          .pipe(gulp.dest(outputDirectory))\n        ;\n      });\n\n      // extend bower.json\n      gulp.task(task.bower, false, function() {\n        return gulp.src(release.templates.bower)\n          .pipe(plumber())\n          .pipe(flatten())\n          .pipe(jsonEditor(function(bower) {\n            bower.name = packageName;\n            bower.description = capitalizedComponent + ' - Semantic UI';\n            if(isJavascript) {\n              if(isCSS) {\n                bower.main = [\n                  component + '.js',\n                  component + '.css'\n                ];\n              }\n              else {\n                bower.main = [\n                  component + '.js'\n                ];\n              }\n              bower.dependencies = {\n                jquery: '>=1.8'\n              };\n            }\n            else {\n              bower.main = [\n                component + '.css'\n              ];\n            }\n            return bower;\n          }))\n          .pipe(gulp.dest(outputDirectory))\n        ;\n      });\n\n      // extend package.json\n      gulp.task(task.package, false, function() {\n        return gulp.src(release.templates.package)\n          .pipe(plumber())\n          .pipe(flatten())\n          .pipe(jsonEditor(function(npm) {\n            if(isJavascript) {\n              npm.dependencies = {\n                jquery: 'x.x.x'\n              };\n              npm.main = 'index.js';\n            }\n            npm.name = packageName;\n            if(version) {\n              npm.version = version;\n            }\n            npm.title       = 'Semantic UI - ' + capitalizedComponent;\n            npm.description = 'Single component release of ' + component;\n            npm.repository  = {\n              type : 'git',\n              url  : gitURL\n            };\n            return npm;\n          }))\n          .pipe(gulp.dest(outputDirectory))\n        ;\n      });\n\n      // extend composer.json\n      gulp.task(task.composer, false, function() {\n        return gulp.src(release.templates.composer)\n          .pipe(plumber())\n          .pipe(flatten())\n          .pipe(jsonEditor(function(composer) {\n            if(isJavascript) {\n              composer.dependencies = {\n                jquery: 'x.x.x'\n              };\n              composer.main = component + '.js';\n            }\n            composer.name = 'semantic/' + component;\n            if(version) {\n              composer.version = version;\n            }\n            composer.description = 'Single component release of ' + component;\n            return composer;\n          }))\n          .pipe(gulp.dest(outputDirectory))\n        ;\n      });\n\n      // create release notes\n      gulp.task(task.notes, false, function() {\n        return gulp.src(release.templates.notes)\n          .pipe(plumber())\n          .pipe(flatten())\n          // Remove release notes for lines not mentioning component\n          .pipe(replace(regExp.match.unrelatedNotes, regExp.replace.unrelatedNotes))\n          .pipe(replace(regExp.match.whitespace, regExp.replace.whitespace))\n          .pipe(replace(regExp.match.spacedVersions, regExp.replace.spacedVersions))\n          .pipe(replace(regExp.match.spacedLists, regExp.replace.spacedLists))\n          .pipe(replace(regExp.match.trim, regExp.replace.trim))\n          .pipe(gulp.dest(outputDirectory))\n        ;\n      });\n\n      // Creates meteor package.js\n      gulp.task(task.meteor, function() {\n        var\n          filenames = ''\n        ;\n        return gulp.src(manifest.component)\n          .pipe(concatFileNames('empty.txt', concatSettings))\n          .pipe(tap(function(file) {\n            filenames += file.contents;\n          }))\n          .on('end', function() {\n            gulp.src(manifest.assets)\n              .pipe(concatFileNames('empty.txt', concatSettings))\n              .pipe(tap(function(file) {\n                filenames += file.contents;\n              }))\n              .on('end', function() {\n                // remove trailing slash\n                filenames = filenames.replace(regExp.match.trailingComma, '').trim();\n                gulp.src(release.templates.meteor.component)\n                  .pipe(plumber())\n                  .pipe(flatten())\n                  .pipe(replace(regExp.match.name, regExp.replace.name))\n                  .pipe(replace(regExp.match.titleName, regExp.replace.titleName))\n                  .pipe(replace(regExp.match.version, version))\n                  .pipe(replace(regExp.match.files, filenames))\n                  .pipe(rename(release.files.meteor))\n                  .pipe(gulp.dest(outputDirectory))\n                ;\n              })\n            ;\n          })\n        ;\n      });\n\n\n      // synchronous tasks in orchestrator? I think not\n      gulp.task(task.all, false, function(callback) {\n        runSequence([\n          task.repo,\n          task.npm,\n          task.bower,\n          task.readme,\n          task.package,\n          task.composer,\n          task.notes,\n          task.meteor\n        ], callback);\n      });\n\n      tasks.push(task.all);\n\n    })(component);\n  }\n\n  runSequence(tasks, callback);\n};\n"
  },
  {
    "path": "semantic/tasks/admin/components/init.js",
    "content": "/*******************************\n          Init Repos\n*******************************/\n\n/*\n\n This task pulls the latest version of each component from GitHub\n\n  * Creates new repo if doesnt exist (locally & GitHub)\n  * Adds remote it doesnt exists\n  * Pulls latest changes from repo\n\n*/\n\nvar\n  gulp      = require('gulp'),\n\n  // node dependencies\n  console   = require('better-console'),\n  del       = require('del'),\n  fs        = require('fs'),\n  path      = require('path'),\n  git       = require('gulp-git'),\n  githubAPI = require('github'),\n  mkdirp    = require('mkdirp'),\n\n  // admin files\n  github    = require('../../config/admin/github.js'),\n  release   = require('../../config/admin/release'),\n  project   = require('../../config/project/release'),\n\n\n  // oAuth configuration for GitHub\n  oAuth     = fs.existsSync(__dirname + '/../../config/admin/oauth.js')\n    ? require('../../config/admin/oauth')\n    : false,\n\n  // shorthand\n  version         = project.version\n;\n\nmodule.exports = function(callback) {\n\n  var\n    index = -1,\n    total = release.components.length,\n    timer,\n    stream,\n    stepRepo\n  ;\n\n  if(!oAuth) {\n    console.error('Must add oauth token for GitHub in tasks/config/admin/oauth.js');\n    return;\n  }\n\n  // Do Git commands synchronously per component, to avoid issues\n  stepRepo = function() {\n\n    index = index + 1;\n\n    if(index >= total) {\n      callback();\n      return;\n    }\n\n    var\n      component            = release.components[index],\n      outputDirectory      = path.resolve(release.outputRoot + component),\n      capitalizedComponent = component.charAt(0).toUpperCase() + component.slice(1),\n      repoName             = release.componentRepoRoot + capitalizedComponent,\n\n      gitOptions           = { cwd: outputDirectory },\n      pullOptions          = { args: '-q', cwd: outputDirectory, quiet: true },\n      resetOptions         = { args: '-q --hard', cwd: outputDirectory, quiet: true },\n\n      gitURL               = 'https://github.com/' + release.org + '/' + repoName + '.git',\n      repoURL              = 'https://github.com/' + release.org + '/' + repoName + '/',\n      localRepoSetup       = fs.existsSync(path.join(outputDirectory, '.git'))\n    ;\n\n    console.log('Processing repository: ' + outputDirectory);\n\n    // create folder if doesn't exist\n    if( !fs.existsSync(outputDirectory) ) {\n      mkdirp.sync(outputDirectory);\n    }\n\n    // clean folder\n    if(release.outputRoot.search('../repos') == 0) {\n      console.info('Cleaning dir', outputDirectory);\n      del.sync([outputDirectory + '**/*'], {silent: true, force: true});\n    }\n\n    // set-up local repo\n    function setupRepo() {\n      if(localRepoSetup) {\n        addRemote();\n      }\n      else {\n        initRepo();\n      }\n    }\n\n    function initRepo() {\n      console.info('Initializing repository for ' + component);\n      git.init(gitOptions, function(error) {\n        if(error) {\n          console.error('Error initializing repo', error);\n        }\n        addRemote();\n      });\n    }\n\n    function createRepo() {\n      console.info('Creating GitHub repo ' + repoURL);\n      github.repos.createFromOrg({\n        org      : release.org,\n        name     : repoName,\n        homepage : release.homepage\n      }, function() {\n        setupRepo();\n      });\n    }\n\n    function addRemote() {\n      console.info('Adding remote origin as ' + gitURL);\n      git.addRemote('origin', gitURL, gitOptions, function(){\n        pullFiles();\n      });\n    }\n\n    function pullFiles() {\n      console.info('Pulling ' + component + ' files');\n      git.pull('origin', 'master', pullOptions, function(error) {\n        resetFiles();\n      });\n    }\n\n    function resetFiles() {\n      console.info('Resetting files to head');\n      git.reset('HEAD', resetOptions, function(error) {\n        nextRepo();\n      });\n    }\n\n    function nextRepo() {\n      //console.log('Sleeping for 1 second...');\n      // avoid rate throttling\n      global.clearTimeout(timer);\n      timer = global.setTimeout(function() {\n        stepRepo()\n      }, 0);\n    }\n\n\n    if(localRepoSetup) {\n      pullFiles();\n    }\n    else {\n      setupRepo();\n      // createRepo() only use to create remote repo (easier to do manually)\n    }\n\n  };\n\n  stepRepo();\n\n\n};\n"
  },
  {
    "path": "semantic/tasks/admin/components/update.js",
    "content": "/*******************************\n          Update Repos\n*******************************/\n\n/*\n\n This task update all SUI individual component repos with new versions of components\n\n  * Commits changes from create repo\n  * Pushes changes to GitHub\n  * Tag new releases if version changed in main repo\n\n*/\n\nvar\n  gulp           = require('gulp'),\n\n  // node dependencies\n  console        = require('better-console'),\n  fs             = require('fs'),\n  path           = require('path'),\n  git            = require('gulp-git'),\n  githubAPI      = require('github'),\n  requireDotFile = require('require-dot-file'),\n\n  // admin files\n  github         = require('../../config/admin/github.js'),\n  release        = require('../../config/admin/release'),\n  project        = require('../../config/project/release'),\n\n\n  // oAuth configuration for GitHub\n  oAuth          = fs.existsSync(__dirname + '/../../config/admin/oauth.js')\n    ? require('../../config/admin/oauth')\n    : false,\n\n  // shorthand\n  version = project.version\n;\n\nmodule.exports = function(callback) {\n\n  var\n    index = -1,\n    total = release.components.length,\n    timer,\n    stream,\n    stepRepo\n  ;\n\n  if(!oAuth) {\n    console.error('Must add oauth token for GitHub in tasks/config/admin/oauth.js');\n    return;\n  }\n\n  // Do Git commands synchronously per component, to avoid issues\n  stepRepo = function() {\n\n    index = index + 1;\n    if(index >= total) {\n      callback();\n      return;\n    }\n\n    var\n      component            = release.components[index],\n      outputDirectory      = path.resolve(path.join(release.outputRoot, component)),\n      capitalizedComponent = component.charAt(0).toUpperCase() + component.slice(1),\n      repoName             = release.componentRepoRoot + capitalizedComponent,\n\n      gitURL               = 'https://github.com/' + release.org + '/' + repoName + '.git',\n      repoURL              = 'https://github.com/' + release.org + '/' + repoName + '/',\n\n      commitArgs = (oAuth.name !== undefined && oAuth.email !== undefined)\n        ? '--author \"' + oAuth.name + ' <' + oAuth.email + '>\"'\n        : '',\n\n      componentPackage = fs.existsSync(outputDirectory + 'package.json' )\n        ? require(outputDirectory + 'package.json')\n        : false,\n\n      isNewVersion  = (version && componentPackage.version != version),\n\n      commitMessage = (isNewVersion)\n        ? 'Updated component to version ' + version\n        : 'Updated files from main repo',\n\n      gitOptions      = { cwd: outputDirectory },\n      commitOptions   = { args: commitArgs, cwd: outputDirectory },\n      releaseOptions  = { tag_name: version, owner: release.org, repo: repoName },\n\n      fileModeOptions = { args : 'config core.fileMode false', cwd: outputDirectory },\n      usernameOptions = { args : 'config user.name \"' + oAuth.name + '\"', cwd: outputDirectory },\n      emailOptions    = { args : 'config user.email \"' + oAuth.email + '\"', cwd: outputDirectory },\n      versionOptions =  { args : 'rev-parse --verify HEAD', cwd: outputDirectory },\n\n      localRepoSetup  = fs.existsSync(path.join(outputDirectory, '.git')),\n      canProceed      = true\n    ;\n\n\n    console.info('Processing repository:' + outputDirectory);\n\n    function setConfig() {\n      git.exec(fileModeOptions, function() {\n        git.exec(usernameOptions, function () {\n          git.exec(emailOptions, function () {\n            commitFiles();\n          });\n        });\n      });\n    }\n\n\n    // standard path\n    function commitFiles() {\n      // commit files\n      console.info('Committing ' + component + ' files', commitArgs);\n      gulp.src('./', gitOptions)\n        .pipe(git.add(gitOptions))\n        .pipe(git.commit(commitMessage, commitOptions))\n        .on('error', function(error) {\n          // canProceed = false; bug in git commit <https://github.com/stevelacy/gulp-git/issues/49>\n        })\n        .on('finish', function(callback) {\n          if(canProceed) {\n            pushFiles();\n          }\n          else {\n            console.info('Nothing new to commit');\n            nextRepo();\n          }\n        })\n      ;\n    }\n\n    // push changes to remote\n    function pushFiles() {\n      console.info('Pushing files for ' + component);\n      git.push('origin', 'master', { args: '', cwd: outputDirectory }, function(error) {\n        console.info('Push completed successfully');\n        getSHA();\n      });\n    }\n\n    // gets SHA of last commit\n    function getSHA() {\n      git.exec(versionOptions, function(error, version) {\n        version = version.trim();\n        createRelease(version);\n      });\n    }\n\n    // create release on GitHub.com\n    function createRelease(version) {\n      if(version) {\n        releaseOptions.target_commitish = version;\n      }\n      github.repos.createRelease(releaseOptions, function() {\n        nextRepo();\n      });\n    }\n\n    // Steps to next repository\n    function nextRepo() {\n      console.log('Sleeping for 1 second...');\n      // avoid rate throttling\n      global.clearTimeout(timer);\n      timer = global.setTimeout(stepRepo, 1000);\n    }\n\n\n    if(localRepoSetup) {\n      setConfig();\n    }\n    else {\n      console.error('Repository must be setup before running update components');\n    }\n\n  };\n\n  stepRepo();\n\n};\n"
  },
  {
    "path": "semantic/tasks/admin/distributions/create.js",
    "content": "/*******************************\n     Create Distributions\n*******************************/\n\n/*\n This will create individual distribution repositories for each SUI distribution\n\n  * copy distribution files to release\n  * update package.json file\n*/\n\nvar\n  gulp            = require('gulp'),\n\n  // node dependencies\n  console         = require('better-console'),\n  del             = require('del'),\n  fs              = require('fs'),\n  path            = require('path'),\n  runSequence     = require('run-sequence'),\n  mergeStream     = require('merge-stream'),\n\n  // admin dependencies\n  concatFileNames = require('gulp-concat-filenames'),\n  debug           = require('gulp-debug'),\n  flatten         = require('gulp-flatten'),\n  git             = require('gulp-git'),\n  jsonEditor      = require('gulp-json-editor'),\n  plumber         = require('gulp-plumber'),\n  rename          = require('gulp-rename'),\n  replace         = require('gulp-replace'),\n  tap             = require('gulp-tap'),\n\n  // config\n  config          = require('../../config/user'),\n  release         = require('../../config/admin/release'),\n  project         = require('../../config/project/release'),\n\n  // shorthand\n  version         = project.version,\n  output          = config.paths.output\n\n;\n\n\nmodule.exports = function(callback) {\n  var\n    stream,\n    index,\n    tasks = []\n  ;\n\n  for(index in release.distributions) {\n\n    var\n      distribution = release.distributions[index]\n    ;\n\n    // streams... designed to save time and make coding fun...\n    (function(distribution) {\n\n      var\n        distLowerCase   = distribution.toLowerCase(),\n        outputDirectory = path.join(release.outputRoot, distLowerCase),\n        packageFile     = path.join(outputDirectory, release.files.npm),\n        repoName        = release.distRepoRoot + distribution,\n        regExp          = {\n          match : {\n            files   : '{files}',\n            version : '{version}'\n          }\n        },\n        task = {\n          all     : distribution + ' copying files',\n          repo    : distribution + ' create repo',\n          meteor  : distribution + ' create meteor package.js',\n          package : distribution + ' create package.json'\n        },\n        gatherFiles,\n        createList\n      ;\n\n      // get files for meteor\n      gatherFiles = function(dir) {\n        var\n          dir   = dir || path.resolve('.'),\n          list  = fs.readdirSync(dir),\n          omitted = [\n            '.git',\n            'node_modules',\n            'package.js',\n            'LICENSE',\n            'README.md',\n            'package.json',\n            'bower.json',\n            '.gitignore'\n          ],\n          files = []\n        ;\n        list.forEach(function(file) {\n          var\n            isOmitted = (omitted.indexOf(file) > -1),\n            filePath  = path.join(dir, file),\n            stat      = fs.statSync(filePath)\n          ;\n          if(!isOmitted) {\n            if(stat && stat.isDirectory()) {\n              files = files.concat(gatherFiles(filePath));\n            }\n            else {\n              files.push(filePath.replace(outputDirectory + path.sep, ''));\n            }\n          }\n        });\n        return files;\n      };\n\n      // spaces out list correctly\n      createList = function(files) {\n        var filenames = '';\n        for(var file in files) {\n          if(file == (files.length - 1) ) {\n            filenames += \"'\" + files[file] + \"'\";\n          }\n          else {\n            filenames += \"'\" + files[file] + \"',\\n    \";\n          }\n        }\n        return filenames;\n      };\n\n\n      gulp.task(task.meteor, function() {\n        var\n          files     = gatherFiles(outputDirectory),\n          filenames = createList(files)\n        ;\n        gulp.src(release.templates.meteor[distLowerCase])\n          .pipe(plumber())\n          .pipe(flatten())\n          .pipe(replace(regExp.match.version, version))\n          .pipe(replace(regExp.match.files, filenames))\n          .pipe(rename(release.files.meteor))\n          .pipe(gulp.dest(outputDirectory))\n        ;\n      });\n\n      if(distribution == 'CSS') {\n        gulp.task(task.repo, function() {\n          var\n            themes,\n            components,\n            releases\n          ;\n          themes = gulp.src('dist/themes/default/**/*', { base: 'dist/' })\n            .pipe(gulp.dest(outputDirectory))\n          ;\n          components = gulp.src('dist/components/*', { base: 'dist/' })\n            .pipe(gulp.dest(outputDirectory))\n          ;\n          releases = gulp.src('dist/*', { base: 'dist/' })\n            .pipe(gulp.dest(outputDirectory))\n          ;\n          return mergeStream(themes, components, releases);\n        });\n      }\n      else if(distribution == 'LESS') {\n        gulp.task(task.repo, function() {\n          var\n            definitions,\n            themeImport,\n            themeConfig,\n            siteTheme,\n            themes\n          ;\n          definitions = gulp.src('src/definitions/**/*', { base: 'src/' })\n            .pipe(gulp.dest(outputDirectory))\n          ;\n          themeImport = gulp.src('src/semantic.less', { base: 'src/' })\n            .pipe(gulp.dest(outputDirectory))\n          ;\n          themeImport = gulp.src('src/theme.less', { base: 'src/' })\n            .pipe(gulp.dest(outputDirectory))\n          ;\n          themeConfig = gulp.src('src/theme.config.example', { base: 'src/' })\n            .pipe(gulp.dest(outputDirectory))\n          ;\n          siteTheme = gulp.src('src/_site/**/*', { base: 'src/' })\n            .pipe(gulp.dest(outputDirectory))\n          ;\n          themes = gulp.src('src/themes/**/*', { base: 'src/' })\n            .pipe(gulp.dest(outputDirectory))\n          ;\n          return mergeStream(definitions, themeImport, themeConfig, siteTheme, themes);\n        });\n      }\n\n      // extend package.json\n      gulp.task(task.package, function() {\n        return gulp.src(packageFile)\n          .pipe(plumber())\n          .pipe(jsonEditor(function(package) {\n            if(version) {\n              package.version = version;\n            }\n            return package;\n          }))\n          .pipe(gulp.dest(outputDirectory))\n        ;\n      });\n\n      tasks.push(task.meteor);\n      tasks.push(task.repo);\n      tasks.push(task.package);\n\n    })(distribution);\n  }\n  runSequence(tasks, callback);\n};"
  },
  {
    "path": "semantic/tasks/admin/distributions/init.js",
    "content": "/*******************************\n        Init Dist Repos\n*******************************/\n\n/*\n\n This task pulls the latest version of distribution from GitHub\n\n  * Creates new repo if doesnt exist (locally & GitHub)\n  * Adds remote it doesnt exists\n  * Pulls latest changes from repo\n\n*/\n\nvar\n  gulp      = require('gulp'),\n\n  // node dependencies\n  console   = require('better-console'),\n  del       = require('del'),\n  fs        = require('fs'),\n  path      = require('path'),\n  git       = require('gulp-git'),\n  githubAPI = require('github'),\n  mkdirp    = require('mkdirp'),\n\n  // admin files\n  github    = require('../../config/admin/github.js'),\n  release   = require('../../config/admin/release'),\n  project   = require('../../config/project/release'),\n\n\n  // oAuth configuration for GitHub\n  oAuth     = fs.existsSync(__dirname + '/../../config/admin/oauth.js')\n    ? require('../../config/admin/oauth')\n    : false,\n\n  // shorthand\n  version = project.version\n;\n\nmodule.exports = function(callback) {\n\n  var\n    index = -1,\n    total = release.distributions.length,\n    timer,\n    stream,\n    stepRepo\n  ;\n\n  if(!oAuth) {\n    console.error('Must add oauth token for GitHub in tasks/config/admin/oauth.js');\n    return;\n  }\n\n  // Do Git commands synchronously per component, to avoid issues\n  stepRepo = function() {\n\n    index = index + 1;\n\n    if(index >= total) {\n      callback();\n      return;\n    }\n\n    var\n      component          = release.distributions[index],\n      lowerCaseComponent = component.toLowerCase(),\n      outputDirectory    = path.resolve(release.outputRoot + lowerCaseComponent),\n      repoName           = release.distRepoRoot + component,\n\n      gitOptions         = { cwd: outputDirectory },\n      pullOptions        = { args: '-q', cwd: outputDirectory, quiet: true },\n      resetOptions       = { args: '-q --hard', cwd: outputDirectory, quiet: true },\n      gitURL             = 'git@github.com:' + release.org + '/' + repoName + '.git',\n      repoURL            = 'https://github.com/' + release.org + '/' + repoName + '/',\n      localRepoSetup     = fs.existsSync(path.join(outputDirectory, '.git'))\n    ;\n\n    console.log('Processing repository: ' + outputDirectory);\n\n    // create folder if doesn't exist\n    if( !fs.existsSync(outputDirectory) ) {\n      mkdirp.sync(outputDirectory);\n    }\n\n    // clean folder\n    if(release.outputRoot.search('../repos') == 0) {\n      console.info('Cleaning dir', outputDirectory);\n      del.sync([outputDirectory + '**/*'], {silent: true, force: true});\n    }\n\n    // set-up local repo\n    function setupRepo() {\n      if(localRepoSetup) {\n        addRemote();\n      }\n      else {\n        initRepo();\n      }\n    }\n\n    function initRepo() {\n      console.info('Initializing repository for ' + component);\n      git.init(gitOptions, function(error) {\n        if(error) {\n          console.error('Error initializing repo', error);\n        }\n        addRemote();\n      });\n    }\n\n    function createRepo() {\n      console.info('Creating GitHub repo ' + repoURL);\n      github.repos.createFromOrg({\n        org      : release.org,\n        name     : repoName,\n        homepage : release.homepage\n      }, function() {\n        setupRepo();\n      });\n    }\n\n    function addRemote() {\n      console.info('Adding remote origin as ' + gitURL);\n      git.addRemote('origin', gitURL, gitOptions, function(){\n        pullFiles();\n      });\n    }\n\n    function pullFiles() {\n      console.info('Pulling ' + component + ' files');\n      git.pull('origin', 'master', pullOptions, function(error) {\n        resetFiles();\n      });\n    }\n\n    function resetFiles() {\n      console.info('Resetting files to head');\n      git.reset('HEAD', resetOptions, function(error) {\n        nextRepo();\n      });\n    }\n\n    function nextRepo() {\n      //console.log('Sleeping for 1 second...');\n      // avoid rate throttling\n      global.clearTimeout(timer);\n      timer = global.setTimeout(function() {\n        stepRepo()\n      }, 0);\n    }\n\n\n    if(localRepoSetup) {\n      pullFiles();\n    }\n    else {\n      setupRepo();\n      // createRepo() only use to create remote repo (easier to do manually)\n    }\n\n  };\n\n  stepRepo();\n\n\n};\n"
  },
  {
    "path": "semantic/tasks/admin/distributions/update.js",
    "content": "/*******************************\n          Update Repos\n*******************************/\n\n/*\n\n This task update all SUI individual distribution repos with new versions of distributions\n\n  * Commits changes from create repo\n  * Pushes changes to GitHub\n  * Tag new releases if version changed in main repo\n\n*/\n\nvar\n  gulp           = require('gulp'),\n\n  // node dependencies\n  console        = require('better-console'),\n  fs             = require('fs'),\n  path           = require('path'),\n  git            = require('gulp-git'),\n  githubAPI      = require('github'),\n  requireDotFile = require('require-dot-file'),\n\n  // admin files\n  github         = require('../../config/admin/github.js'),\n  release        = require('../../config/admin/release'),\n  project        = require('../../config/project/release'),\n\n\n  // oAuth configuration for GitHub\n  oAuth          = fs.existsSync(__dirname + '/../../config/admin/oauth.js')\n    ? require('../../config/admin/oauth')\n    : false,\n\n  // shorthand\n  version = project.version\n;\n\nmodule.exports = function(callback) {\n\n  var\n    index = -1,\n    total = release.distributions.length,\n    timer,\n    stream,\n    stepRepo\n  ;\n\n  if(!oAuth) {\n    console.error('Must add oauth token for GitHub in tasks/config/admin/oauth.js');\n    return;\n  }\n\n  // Do Git commands synchronously per distribution, to avoid issues\n  stepRepo = function() {\n\n    index = index + 1;\n    if(index >= total) {\n      callback();\n      return;\n    }\n\n    var\n      distribution         = release.distributions[index],\n      outputDirectory      = path.resolve(path.join(release.outputRoot, distribution.toLowerCase() )),\n      repoName             = release.distRepoRoot + distribution,\n\n      commitArgs = (oAuth.name !== undefined && oAuth.email !== undefined)\n        ? '--author \"' + oAuth.name + ' <' + oAuth.email + '>\"'\n        : '',\n\n      distributionPackage = fs.existsSync(outputDirectory + 'package.json' )\n        ? require(outputDirectory + 'package.json')\n        : false,\n\n      isNewVersion  = (version && distributionPackage.version != version),\n\n      commitMessage = (isNewVersion)\n        ? 'Updated distribution to version ' + version\n        : 'Updated files from main repo',\n\n      gitOptions      = { cwd: outputDirectory },\n      commitOptions   = { args: commitArgs, cwd: outputDirectory },\n      releaseOptions  = { tag_name: version, owner: release.org, repo: repoName },\n\n      fileModeOptions = { args : 'config core.fileMode false', cwd: outputDirectory },\n      usernameOptions = { args : 'config user.name \"' + oAuth.name + '\"', cwd: outputDirectory },\n      emailOptions    = { args : 'config user.email \"' + oAuth.email + '\"', cwd: outputDirectory },\n      versionOptions =  { args : 'rev-parse --verify HEAD', cwd: outputDirectory },\n\n      localRepoSetup  = fs.existsSync(path.join(outputDirectory, '.git')),\n      canProceed      = true\n    ;\n\n\n    console.info('Processing repository:' + outputDirectory);\n\n    function setConfig() {\n      git.exec(fileModeOptions, function() {\n        git.exec(usernameOptions, function () {\n          git.exec(emailOptions, function () {\n            commitFiles();\n          });\n        });\n      });\n    }\n\n    // standard path\n    function commitFiles() {\n      // commit files\n      console.info('Committing ' + distribution + ' files', commitArgs);\n      gulp.src('./', gitOptions)\n        .pipe(git.add(gitOptions))\n        .pipe(git.commit(commitMessage, commitOptions))\n        .on('error', function(error) {\n          // canProceed = false; bug in git commit <https://github.com/stevelacy/gulp-git/issues/49>\n        })\n        .on('finish', function(callback) {\n          if(canProceed) {\n            pushFiles();\n          }\n          else {\n            console.info('Nothing new to commit');\n            nextRepo();\n          }\n        })\n      ;\n    }\n\n    // push changes to remote\n    function pushFiles() {\n      console.info('Pushing files for ' + distribution);\n      git.push('origin', 'master', { args: '', cwd: outputDirectory }, function(error) {\n        console.info('Push completed successfully');\n        getSHA();\n      });\n    }\n\n    // gets SHA of last commit\n    function getSHA() {\n      git.exec(versionOptions, function(error, version) {\n        version = version.trim();\n        createRelease(version);\n      });\n    }\n\n    // create release on GitHub.com\n    function createRelease(version) {\n      if(version) {\n        releaseOptions.target_commitish = version;\n      }\n      github.repos.createRelease(releaseOptions, function() {\n        nextRepo();\n      });\n    }\n\n    // Steps to next repository\n    function nextRepo() {\n      console.log('Sleeping for 1 second...');\n      // avoid rate throttling\n      global.clearTimeout(timer);\n      timer = global.setTimeout(stepRepo, 500);\n    }\n\n\n    if(localRepoSetup) {\n      setConfig();\n    }\n    else {\n      console.error('Repository must be setup before running update distributions');\n    }\n\n  };\n\n  stepRepo();\n\n};\n"
  },
  {
    "path": "semantic/tasks/admin/publish.js",
    "content": "/*******************************\n          Release All\n*******************************/\n\n/*\n This task update all SUI individual component repos with new versions of components\n\n  * Commits changes from create components to GitHub and Tags\n\n*/\n\nvar\n  runSequence = require('run-sequence')\n;\n\n/* Release All */\nmodule.exports = function(callback) {\n\n  runSequence(\n    'update distributions', // commit less/css versions to github\n    'update components', // commit components to github\n    callback\n  );\n\n};"
  },
  {
    "path": "semantic/tasks/admin/register.js",
    "content": "/*******************************\n          Register PM\n*******************************/\n\n/*\n  Task to register component repos with Package Managers\n  * Registers component with bower\n  * Registers component with NPM\n*/\n\nvar\n  // node dependencies\n  process = require('child_process'),\n\n  // config\n  release = require('../config/admin/release'),\n\n  // register components and distributions\n  repos   = release.distributions.concat(release.components),\n  total   = repos.length,\n  index   = -1,\n\n  stream,\n  stepRepo\n;\n\nmodule.exports = function(callback) {\n\n  console.log('Registering repos with package managers');\n\n  // Do Git commands synchronously per component, to avoid issues\n  stepRepo = function() {\n    index = index + 1;\n    if(index >= total) {\n      callback();\n      return;\n    }\n    var\n      repo            = repos[index].toLowerCase(),\n      outputDirectory = release.outputRoot + repo + '/',\n      exec            = process.exec,\n      execSettings    = {cwd: outputDirectory},\n      updateNPM       = 'npm publish'\n    ;\n\n    /* Register with NPM */\n    exec(updateNPM, execSettings, function(err, stdout, stderr) {\n      console.log(err, stdout, stderr);\n      stepRepo();\n    });\n\n  };\n  stepRepo();\n};\n\n"
  },
  {
    "path": "semantic/tasks/admin/release.js",
    "content": "/*******************************\n          Release\n*******************************/\n\n/*\n This task update all SUI individual component repos with new versions of components\n\n  * Initializes repositories with current versions\n  * Creates local files at ../distributions/ with each repo for release\n\n*/\n\nvar\n  runSequence = require('run-sequence')\n;\n\n/* Release All */\nmodule.exports = function(callback) {\n\n  runSequence(\n    //'build', // build Semantic\n    'init distributions', // sync with current github version\n    'create distributions', // update each repo with changes from master repo\n    'init components', // sync with current github version\n    'create components', // update each repo\n    callback\n  );\n\n};"
  },
  {
    "path": "semantic/tasks/build/assets.js",
    "content": "/*******************************\n          Build Task\n*******************************/\n\nvar\n  gulp         = require('gulp'),\n\n  // gulp dependencies\n  chmod        = require('gulp-chmod'),\n  gulpif       = require('gulp-if'),\n\n  // config\n  config       = require('../config/user'),\n  tasks        = require('../config/tasks'),\n\n  // shorthand\n  globs        = config.globs,\n  assets       = config.paths.assets,\n  output       = config.paths.output,\n  source       = config.paths.source,\n\n  log          = tasks.log\n;\n\nmodule.exports = function(callback) {\n\n  console.info('Building assets');\n\n  // copy assets\n  return gulp.src(source.themes + '/**/assets/**/*.*')\n    .pipe(gulpif(config.hasPermission, chmod(config.permission)))\n    .pipe(gulp.dest(output.themes))\n  ;\n\n};"
  },
  {
    "path": "semantic/tasks/build/css.js",
    "content": "/*******************************\n          Build Task\n*******************************/\n\nvar\n  gulp         = require('gulp'),\n\n  // node dependencies\n  console      = require('better-console'),\n  fs           = require('fs'),\n\n  // gulp dependencies\n  autoprefixer = require('gulp-autoprefixer'),\n  chmod        = require('gulp-chmod'),\n  clone        = require('gulp-clone'),\n  flatten      = require('gulp-flatten'),\n  gulpif       = require('gulp-if'),\n  less         = require('gulp-less'),\n  minifyCSS    = require('gulp-clean-css'),\n  plumber      = require('gulp-plumber'),\n  print        = require('gulp-print'),\n  rename       = require('gulp-rename'),\n  replace      = require('gulp-replace'),\n  runSequence  = require('run-sequence'),\n\n  // config\n  config       = require('../config/user'),\n  tasks        = require('../config/tasks'),\n  install      = require('../config/project/install'),\n\n  // shorthand\n  globs        = config.globs,\n  assets       = config.paths.assets,\n  output       = config.paths.output,\n  source       = config.paths.source,\n\n  banner       = tasks.banner,\n  comments     = tasks.regExp.comments,\n  log          = tasks.log,\n  settings     = tasks.settings\n;\n\n// add internal tasks (concat release)\nrequire('../collections/internal')(gulp);\n\nmodule.exports = function(callback) {\n\n  var\n    tasksCompleted = 0,\n    maybeCallback  = function() {\n      tasksCompleted++;\n      if(tasksCompleted === 2) {\n        callback();\n      }\n    },\n\n    stream,\n    compressedStream,\n    uncompressedStream\n  ;\n\n  console.info('Building CSS');\n\n  if( !install.isSetup() ) {\n    console.error('Cannot build files. Run \"gulp install\" to set-up Semantic');\n    return;\n  }\n\n  // unified css stream\n  stream = gulp.src(source.definitions + '/**/' + globs.components + '.less')\n    .pipe(plumber(settings.plumber.less))\n    .pipe(less(settings.less))\n    .pipe(autoprefixer(settings.prefix))\n    .pipe(replace(comments.variables.in, comments.variables.out))\n    .pipe(replace(comments.license.in, comments.license.out))\n    .pipe(replace(comments.large.in, comments.large.out))\n    .pipe(replace(comments.small.in, comments.small.out))\n    .pipe(replace(comments.tiny.in, comments.tiny.out))\n    .pipe(flatten())\n  ;\n\n  // two concurrent streams from same source to concat release\n  uncompressedStream = stream.pipe(clone());\n  compressedStream   = stream.pipe(clone());\n\n  // uncompressed component css\n  uncompressedStream\n    .pipe(plumber())\n    .pipe(replace(assets.source, assets.uncompressed))\n    .pipe(gulpif(config.hasPermission, chmod(config.permission)))\n    .pipe(gulp.dest(output.uncompressed))\n    .pipe(print(log.created))\n    .on('end', function() {\n      runSequence('package uncompressed css', maybeCallback);\n    })\n  ;\n\n  // compressed component css\n  compressedStream = stream\n    .pipe(plumber())\n    .pipe(clone())\n    .pipe(replace(assets.source, assets.compressed))\n    .pipe(minifyCSS(settings.minify))\n    .pipe(rename(settings.rename.minCSS))\n    .pipe(gulpif(config.hasPermission, chmod(config.permission)))\n    .pipe(gulp.dest(output.compressed))\n    .pipe(print(log.created))\n    .on('end', function() {\n      runSequence('package compressed css', maybeCallback);\n    })\n  ;\n\n};\n"
  },
  {
    "path": "semantic/tasks/build/javascript.js",
    "content": "/*******************************\n          Build Task\n*******************************/\n\nvar\n  gulp         = require('gulp'),\n\n  // node dependencies\n  console      = require('better-console'),\n  fs           = require('fs'),\n\n  // gulp dependencies\n  chmod        = require('gulp-chmod'),\n  flatten      = require('gulp-flatten'),\n  gulpif       = require('gulp-if'),\n  plumber      = require('gulp-plumber'),\n  print        = require('gulp-print'),\n  rename       = require('gulp-rename'),\n  replace      = require('gulp-replace'),\n  uglify       = require('gulp-uglify'),\n\n  // config\n  config       = require('../config/user'),\n  tasks        = require('../config/tasks'),\n  install      = require('../config/project/install'),\n\n  // shorthand\n  globs        = config.globs,\n  assets       = config.paths.assets,\n  output       = config.paths.output,\n  source       = config.paths.source,\n\n  banner       = tasks.banner,\n  comments     = tasks.regExp.comments,\n  log          = tasks.log,\n  settings     = tasks.settings\n;\n\n// add internal tasks (concat release)\nrequire('../collections/internal')(gulp);\n\nmodule.exports = function(callback) {\n\n  var\n    stream,\n    compressedStream,\n    uncompressedStream\n  ;\n\n  console.info('Building Javascript');\n\n  if( !install.isSetup() ) {\n    console.error('Cannot build files. Run \"gulp install\" to set-up Semantic');\n    return;\n  }\n\n  // copy source javascript\n  gulp.src(source.definitions + '/**/' + globs.components + '.js')\n    .pipe(plumber())\n    .pipe(flatten())\n    .pipe(replace(comments.license.in, comments.license.out))\n    .pipe(gulp.dest(output.uncompressed))\n    .pipe(gulpif(config.hasPermission, chmod(config.permission)))\n    .pipe(print(log.created))\n    .pipe(uglify(settings.uglify))\n    .pipe(rename(settings.rename.minJS))\n    .pipe(gulp.dest(output.compressed))\n    .pipe(gulpif(config.hasPermission, chmod(config.permission)))\n    .pipe(print(log.created))\n    .on('end', function() {\n      gulp.start('package compressed js');\n      gulp.start('package uncompressed js');\n      callback();\n    })\n  ;\n\n};"
  },
  {
    "path": "semantic/tasks/build.js",
    "content": "/*******************************\n          Build Task\n*******************************/\n\nvar\n  // dependencies\n  gulp         = require('gulp-help')(require('gulp')),\n  runSequence  = require('run-sequence'),\n\n  // config\n  config       = require('./config/user'),\n  install      = require('./config/project/install'),\n\n  // task sequence\n  tasks        = []\n;\n\n\n// sub-tasks\nif(config.rtl) {\n  require('./collections/rtl')(gulp);\n}\nrequire('./collections/build')(gulp);\n\n\nmodule.exports = function(callback) {\n\n  console.info('Building Semantic');\n\n  if( !install.isSetup() ) {\n    console.error('Cannot find semantic.json. Run \"gulp install\" to set-up Semantic');\n    return 1;\n  }\n\n  // check for right-to-left (RTL) language\n  if(config.rtl === true || config.rtl === 'Yes') {\n    gulp.start('build-rtl');\n    return;\n  }\n\n  if(config.rtl == 'both') {\n    tasks.push('build-rtl');\n  }\n\n  tasks.push('build-javascript');\n  tasks.push('build-css');\n  tasks.push('build-assets');\n\n  runSequence(tasks, callback);\n};\n"
  },
  {
    "path": "semantic/tasks/check-install.js",
    "content": "/*******************************\n         Check Install\n*******************************/\n\nvar\n  // node dependencies\n  gulp         = require('gulp'),\n  fs           = require('fs'),\n  console      = require('better-console'),\n  install      = require('./config/project/install')\n;\n\n// export task\nmodule.exports = function() {\n\n  setTimeout(function() {\n    if( !install.isSetup() ) {\n      console.log('Starting install...');\n      gulp.start('install');\n      return;\n    }\n    else {\n      gulp.start('watch');\n    }\n  }, 50); // Delay to allow console.clear to remove messages from check event\n\n\n};"
  },
  {
    "path": "semantic/tasks/clean.js",
    "content": "/*******************************\n          Clean Task\n*******************************/\n\nvar\n  del    = require('del'),\n  config = require('./config/user'),\n  tasks  = require('./config/tasks')\n;\n\n// cleans distribution files\nmodule.exports = function(callback) {\n  return del([config.paths.clean], tasks.settings.del, callback);\n};"
  },
  {
    "path": "semantic/tasks/collections/README.md",
    "content": "## How to use\n\nThese are collections of tasks that are imported together.\n\nTo import them into gulp:\n```javascript\nvar\n  gulp    = require('gulp'),\n  // modified to point to semantic folder\n  install = require('tasks/collections/install')\n;\ngulp = install(gulp);\n\n// tasks are now injected and ready to be used\ngulp.start('install');\n```"
  },
  {
    "path": "semantic/tasks/collections/admin.js",
    "content": "/*******************************\n     Admin Task Collection\n*******************************/\n\n/*\n  This are tasks to be run by project maintainers\n  - Creating Component Repos\n  - Syncing with GitHub via APIs\n  - Modifying package files\n*/\n\n/*******************************\n             Tasks\n*******************************/\n\n\nmodule.exports = function(gulp) {\n  var\n    // less/css distributions\n    initComponents      = require('../admin/components/init'),\n    createComponents    = require('../admin/components/create'),\n    updateComponents    = require('../admin/components/update'),\n\n    // single component releases\n    initDistributions   = require('../admin/distributions/init'),\n    createDistributions = require('../admin/distributions/create'),\n    updateDistributions = require('../admin/distributions/update'),\n\n    release             = require('../admin/release'),\n    publish             = require('../admin/publish'),\n    register            = require('../admin/register')\n  ;\n\n  /* Release */\n  gulp.task('init distributions', 'Grabs each component from GitHub', initDistributions);\n  gulp.task('create distributions', 'Updates files in each repo', createDistributions);\n  gulp.task('init components', 'Grabs each component from GitHub', initComponents);\n  gulp.task('create components', 'Updates files in each repo', createComponents);\n\n  /* Publish */\n  gulp.task('update distributions', 'Commits component updates from create to GitHub', updateDistributions);\n  gulp.task('update components', 'Commits component updates from create to GitHub', updateComponents);\n\n  /* Tasks */\n  gulp.task('release', 'Stages changes in GitHub repos for all distributions', release);\n  gulp.task('publish', 'Publishes all releases (components, package)', publish);\n  gulp.task('register', 'Registers all packages with NPM', register);\n\n};"
  },
  {
    "path": "semantic/tasks/collections/build.js",
    "content": "/*******************************\n        Define Sub-Tasks\n*******************************/\n\nmodule.exports = function(gulp) {\n\n  var\n    // build sub-tasks\n    buildJS      = require('./../build/javascript'),\n    buildCSS     = require('./../build/css'),\n    buildAssets  = require('./../build/assets')\n  ;\n\n  // in case these tasks are undefined during import, less make sure these are available in scope\n  gulp.task('build-javascript', 'Builds all javascript from source', buildJS);\n  gulp.task('build-css', 'Builds all css from source', buildCSS);\n  gulp.task('build-assets', 'Copies all assets from source', buildAssets);\n\n};\n"
  },
  {
    "path": "semantic/tasks/collections/internal.js",
    "content": "/*******************************\n    Internal Task Collection\n*******************************/\n\n/* These tasks create packaged files from **dist** components\n   Not intended to be called directly by a user because\n   these do not build fresh from **src**\n*/\n\nmodule.exports = function(gulp) {\n\n  var\n    // node dependencies\n    fs         = require('fs'),\n    chmod      = require('gulp-chmod'),\n    concat     = require('gulp-concat'),\n    concatCSS  = require('gulp-concat-css'),\n    clone      = require('gulp-clone'),\n    dedupe     = require('gulp-dedupe'),\n    gulpif     = require('gulp-if'),\n    header     = require('gulp-header'),\n    less       = require('gulp-less'),\n    minifyCSS  = require('gulp-clean-css'),\n    plumber    = require('gulp-plumber'),\n    print      = require('gulp-print'),\n    rename     = require('gulp-rename'),\n    replace    = require('gulp-replace'),\n    uglify     = require('gulp-uglify'),\n\n    // user config\n    config     = require('./../config/user'),\n    docsConfig = require('./../config/docs'),\n\n    // install config\n    tasks      = require('./../config/tasks'),\n    release    = require('./../config/project/release'),\n\n    // shorthand\n    globs      = config.globs,\n    assets     = config.paths.assets,\n    output     = config.paths.output,\n\n    banner     = tasks.banner,\n    filenames  = tasks.filenames,\n    log        = tasks.log,\n    settings   = tasks.settings\n  ;\n\n  /*--------------\n      Packaged\n  ---------------*/\n\n  gulp.task('package uncompressed css', function() {\n    return gulp.src(output.uncompressed + '/**/' + globs.components + globs.ignored + '.css')\n      .pipe(plumber())\n      .pipe(dedupe())\n      .pipe(replace(assets.uncompressed, assets.packaged))\n      .pipe(concatCSS(filenames.concatenatedCSS, settings.concatCSS))\n        .pipe(gulpif(config.hasPermission, chmod(config.permission)))\n        .pipe(header(banner, settings.header))\n        .pipe(gulp.dest(output.packaged))\n        .pipe(print(log.created))\n    ;\n  });\n\n  gulp.task('package compressed css', function() {\n    return gulp.src(output.uncompressed + '/**/' + globs.components + globs.ignored + '.css')\n      .pipe(plumber())\n      .pipe(dedupe())\n      .pipe(replace(assets.uncompressed, assets.packaged))\n      .pipe(concatCSS(filenames.concatenatedMinifiedCSS, settings.concatCSS))\n        .pipe(gulpif(config.hasPermission, chmod(config.permission)))\n        .pipe(minifyCSS(settings.concatMinify))\n        .pipe(header(banner, settings.header))\n        .pipe(gulp.dest(output.packaged))\n        .pipe(print(log.created))\n    ;\n  });\n\n  gulp.task('package uncompressed js', function() {\n    return gulp.src(output.uncompressed + '/**/' + globs.components + globs.ignored + '.js')\n      .pipe(plumber())\n      .pipe(dedupe())\n      .pipe(replace(assets.uncompressed, assets.packaged))\n      .pipe(concat(filenames.concatenatedJS))\n        .pipe(header(banner, settings.header))\n        .pipe(gulpif(config.hasPermission, chmod(config.permission)))\n        .pipe(gulp.dest(output.packaged))\n        .pipe(print(log.created))\n    ;\n  });\n\n  gulp.task('package compressed js', function() {\n    return gulp.src(output.uncompressed + '/**/' + globs.components + globs.ignored + '.js')\n      .pipe(plumber())\n      .pipe(dedupe())\n      .pipe(replace(assets.uncompressed, assets.packaged))\n      .pipe(concat(filenames.concatenatedMinifiedJS))\n        .pipe(uglify(settings.concatUglify))\n        .pipe(header(banner, settings.header))\n        .pipe(gulpif(config.hasPermission, chmod(config.permission)))\n        .pipe(gulp.dest(output.packaged))\n        .pipe(print(log.created))\n    ;\n  });\n\n  /*--------------\n        RTL\n  ---------------*/\n\n  if(config.rtl) {\n\n    gulp.task('package uncompressed rtl css', function () {\n      return gulp.src(output.uncompressed + '/**/' + globs.components + globs.ignoredRTL + '.rtl.css')\n        .pipe(dedupe())\n        .pipe(replace(assets.uncompressed, assets.packaged))\n        .pipe(concatCSS(filenames.concatenatedRTLCSS, settings.concatCSS))\n          .pipe(gulpif(config.hasPermission, chmod(config.permission)))\n          .pipe(header(banner, settings.header))\n          .pipe(gulp.dest(output.packaged))\n          .pipe(print(log.created))\n      ;\n    });\n\n    gulp.task('package compressed rtl css', function () {\n      return gulp.src(output.uncompressed + '/**/' + globs.components + globs.ignoredRTL + '.rtl.css')\n        .pipe(dedupe())\n        .pipe(replace(assets.uncompressed, assets.packaged))\n        .pipe(concatCSS(filenames.concatenatedMinifiedRTLCSS, settings.concatCSS))\n          .pipe(gulpif(config.hasPermission, chmod(config.permission)))\n          .pipe(minifyCSS(settings.concatMinify))\n          .pipe(header(banner, settings.header))\n          .pipe(gulp.dest(output.packaged))\n          .pipe(print(log.created))\n      ;\n    });\n\n    gulp.task('package uncompressed docs css', function() {\n      return gulp.src(output.uncompressed + '/**/' + globs.components + globs.ignored + '.css')\n        .pipe(dedupe())\n        .pipe(plumber())\n        .pipe(replace(assets.uncompressed, assets.packaged))\n        .pipe(concatCSS(filenames.concatenatedCSS, settings.concatCSS))\n          .pipe(gulpif(config.hasPermission, chmod(config.permission)))\n          .pipe(gulp.dest(output.packaged))\n          .pipe(print(log.created))\n      ;\n    });\n\n    gulp.task('package compressed docs css', function() {\n      return gulp.src(output.uncompressed + '/**/' + globs.components + globs.ignored + '.css')\n        .pipe(dedupe())\n        .pipe(plumber())\n        .pipe(replace(assets.uncompressed, assets.packaged))\n        .pipe(concatCSS(filenames.concatenatedMinifiedCSS, settings.concatCSS))\n          .pipe(minifyCSS(settings.concatMinify))\n          .pipe(header(banner, settings.header))\n          .pipe(gulpif(config.hasPermission, chmod(config.permission)))\n          .pipe(gulp.dest(output.packaged))\n          .pipe(print(log.created))\n      ;\n    });\n\n  }\n\n  /*--------------\n        Docs\n  ---------------*/\n\n  var\n    docsOutput = docsConfig.paths.output\n  ;\n\n  gulp.task('package uncompressed docs css', function() {\n    return gulp.src(docsOutput.uncompressed + '/**/' + globs.components + globs.ignored + '.css')\n      .pipe(dedupe())\n      .pipe(plumber())\n      .pipe(replace(assets.uncompressed, assets.packaged))\n      .pipe(concatCSS(filenames.concatenatedCSS, settings.concatCSS))\n        .pipe(gulpif(config.hasPermission, chmod(config.permission)))\n        .pipe(gulp.dest(docsOutput.packaged))\n        .pipe(print(log.created))\n    ;\n  });\n\n  gulp.task('package compressed docs css', function() {\n    return gulp.src(docsOutput.uncompressed + '/**/' + globs.components + globs.ignored + '.css')\n      .pipe(dedupe())\n      .pipe(plumber())\n      .pipe(replace(assets.uncompressed, assets.packaged))\n      .pipe(concatCSS(filenames.concatenatedMinifiedCSS, settings.concatCSS))\n        .pipe(minifyCSS(settings.concatMinify))\n        .pipe(header(banner, settings.header))\n        .pipe(gulpif(config.hasPermission, chmod(config.permission)))\n        .pipe(gulp.dest(docsOutput.packaged))\n        .pipe(print(log.created))\n    ;\n  });\n\n  gulp.task('package uncompressed docs js', function() {\n    return gulp.src(docsOutput.uncompressed + '/**/' + globs.components + globs.ignored + '.js')\n      .pipe(dedupe())\n      .pipe(plumber())\n      .pipe(replace(assets.uncompressed, assets.packaged))\n      .pipe(concat(filenames.concatenatedJS))\n        .pipe(header(banner, settings.header))\n        .pipe(gulpif(config.hasPermission, chmod(config.permission)))\n        .pipe(gulp.dest(docsOutput.packaged))\n        .pipe(print(log.created))\n    ;\n  });\n\n  gulp.task('package compressed docs js', function() {\n    return gulp.src(docsOutput.uncompressed + '/**/' + globs.components + globs.ignored + '.js')\n      .pipe(dedupe())\n      .pipe(plumber())\n      .pipe(replace(assets.uncompressed, assets.packaged))\n      .pipe(concat(filenames.concatenatedMinifiedJS))\n        .pipe(uglify(settings.concatUglify))\n        .pipe(header(banner, settings.header))\n        .pipe(gulpif(config.hasPermission, chmod(config.permission)))\n        .pipe(gulp.dest(docsOutput.packaged))\n        .pipe(print(log.created))\n    ;\n  });\n\n};\n"
  },
  {
    "path": "semantic/tasks/collections/rtl.js",
    "content": "/*******************************\n        Define Sub-Tasks\n*******************************/\n\nmodule.exports = function(gulp) {\n\n  var\n    // rtl\n    buildRTL     = require('./../rtl/build'),\n    watchRTL     = require('./../rtl/watch')\n  ;\n\n  gulp.task('watch-rtl', 'Build all files as RTL', watchRTL);\n  gulp.task('build-rtl', 'Watch files as RTL ', buildRTL);\n\n};\n"
  },
  {
    "path": "semantic/tasks/config/admin/github.js",
    "content": "/*******************************\n          GitHub Login\n*******************************/\n/*\n  Logs into GitHub using OAuth\n*/\n\nvar\n  fs          = require('fs'),\n  path        = require('path'),\n  githubAPI   = require('github'),\n\n  // stores oauth info for GitHub API\n  oAuthConfig = path.join(__dirname, 'oauth.js'),\n  oAuth       = fs.existsSync(oAuthConfig)\n    ? require(oAuthConfig)\n    : false,\n  github\n;\n\nif(!oAuth) {\n  console.error('Must add oauth token for GitHub in tasks/config/admin/oauth.js');\n}\n\ngithub = new githubAPI({\n  version    : '3.0.0',\n  debug      : true,\n  protocol   : 'https',\n  timeout    : 5000\n});\n\ngithub.authenticate({\n  type: 'oauth',\n  token: oAuth.token\n});\n\nmodule.exports = github;\n"
  },
  {
    "path": "semantic/tasks/config/admin/oauth.example.js",
    "content": "/*\n Used to import GitHub Auth Token\n To Automate GitHub Updates\n*/\n\nmodule.exports = {\n  token    : 'AN-OAUTH2-TOKEN',\n  username : 'github-username',\n  name     : 'Your Name',\n  email    : 'user@email.com'\n};"
  },
  {
    "path": "semantic/tasks/config/admin/release.js",
    "content": "/*******************************\n        Release Settings\n*******************************/\n\n// release settings\nmodule.exports = {\n\n  // path to components for repos\n  source     : './dist/components/',\n\n  // modified asset paths for component repos\n  paths: {\n    source : '../themes/default/assets/',\n    output : 'assets/'\n  },\n\n  templates: {\n    bower    : './tasks/config/admin/templates/bower.json',\n    composer : './tasks/config/admin/templates/composer.json',\n    package  : './tasks/config/admin/templates/package.json',\n    meteor   : {\n      css       : './tasks/config/admin/templates/css-package.js',\n      component : './tasks/config/admin/templates/component-package.js',\n      less      : './tasks/config/admin/templates/less-package.js',\n    },\n    readme : './tasks/config/admin/templates/README.md',\n    notes  : './RELEASE-NOTES.md'\n  },\n\n  org         : 'Semantic-Org',\n  repo        : 'Semantic-UI',\n\n  // files created for package managers\n  files: {\n    composer : 'composer.json',\n    config   : 'semantic.json',\n    npm      : 'package.json',\n    meteor   : 'package.js'\n  },\n\n  // root name for distribution repos\n  distRepoRoot      : 'Semantic-UI-',\n\n  // root name for single component repos\n  componentRepoRoot : 'UI-',\n\n  // root name for package managers\n  packageRoot          : 'semantic-ui-',\n\n  // root path to repos\n  outputRoot  : '../repos/',\n\n  homepage    : 'http://www.semantic-ui.com',\n\n  // distributions that get separate repos\n  distributions: [\n    'LESS',\n    'CSS'\n  ],\n\n  // components that get separate repositories for bower/npm\n  components : [\n    'accordion',\n    'ad',\n    'api',\n    'breadcrumb',\n    'button',\n    'card',\n    'checkbox',\n    'comment',\n    'container',\n    'dimmer',\n    'divider',\n    'dropdown',\n    'embed',\n    'feed',\n    'flag',\n    'form',\n    'grid',\n    'header',\n    'icon',\n    'image',\n    'input',\n    'item',\n    'label',\n    'list',\n    'loader',\n    'menu',\n    'message',\n    'modal',\n    'nag',\n    'popup',\n    'progress',\n    'rail',\n    'rating',\n    'reset',\n    'reveal',\n    'search',\n    'segment',\n    'shape',\n    'sidebar',\n    'site',\n    'statistic',\n    'step',\n    'sticky',\n    'tab',\n    'table',\n    'transition',\n    'visibility'\n  ]\n};\n"
  },
  {
    "path": "semantic/tasks/config/admin/templates/README.md",
    "content": "# Semantic {Component}\n\nThis repository contains pre-compiled {component} files using the default themes. This is intended for use in projects that do not need all the bells and whistles of Semantic UI, and want to keep file size to a minimum.\n\nFor the latest changes please see the [Release Notes](https://github.com/Semantic-Org/UI-{Component}/blob/master/RELEASE-NOTES.md)\n\n**Special Note**\nAn update in `2.0.8` has fixed an issue which may have prevented some single component modules from working correctly. Please see notes in [this pull request](https://github.com/Semantic-Org/Semantic-UI/pull/2816).\n\nIf you're looking for the full version of Semantic including all components and build tools [check out the main project repository](https://github.com/Semantic-Org/Semantic-UI/tree/1.0)\n\n#### To install with Bower\n```\nbower install semantic-ui-{component}\n```\n\n#### To install with NPM\n```\nnpm install semantic-ui-{component}\n```\n\n#### To install with Meteor\n```\nmeteor add semantic:ui-{component}\n```\n\n\n## Addendum\n\nThis element's definitions (required class names, html structures) are available in the [UI Docs](http://www.semantic-ui.com)\n\nPlease consider checking out [all the benefits to theming](http://www.learnsemantic.com/guide/expert.html) before using these stand-alone releases.\n"
  },
  {
    "path": "semantic/tasks/config/admin/templates/bower.json",
    "content": "{\n  \"name\"        : \"Component\",\n  \"description\" : \"Component distribution\",\n  \"homepage\"    : \"http://www.semantic-ui.com\",\n  \"author\": {\n    \"name\" : \"Jack Lukic\",\n    \"web\"  : \"http://www.jacklukic.com\"\n  },\n  \"ignore\": [\n    \"./index.js\"\n  ],\n  \"keywords\": [\n    \"semantic\",\n    \"ui\",\n    \"css3\",\n    \"framework\"\n  ],\n  \"license\" : [\n    \"http://semantic-ui.mit-license.org/\"\n  ],\n  \"ignore\": [\n    \"docs\",\n    \"node\",\n    \"server\",\n    \"spec\",\n    \"src\",\n    \"test\"\n  ]\n}\n"
  },
  {
    "path": "semantic/tasks/config/admin/templates/component-package.js",
    "content": "\nPackage.describe({\n  name    : 'semantic:ui-{component}',\n  summary : 'Semantic UI - {Component}: Single component release',\n  version : '{version}',\n  git     : 'git://github.com/Semantic-Org/UI-{Component}.git',\n});\n\nPackage.onUse(function(api) {\n  api.versionsFrom('1.0');\n  api.addFiles([\n    {files}\n  ], 'client');\n});\n"
  },
  {
    "path": "semantic/tasks/config/admin/templates/composer.json",
    "content": "{\n  \"name\"        : \"semantic/ui\",\n  \"description\" : \"Semantic empowers designers and developers by creating a shared vocabulary for UI.\",\n  \"homepage\"    : \"http://www.semantic-ui.com\",\n  \"authors\": [\n    {\n      \"name\" : \"Jack Lukic\",\n      \"email\": \"jacklukic@gmail.com\",\n      \"web\"  : \"http://www.jacklukic.com\",\n      \"role\" : \"Creator\"\n    }\n  ],\n  \"keywords\": [\n    \"semantic\",\n    \"ui\",\n    \"css\",\n    \"framework\"\n  ],\n  \"license\" : \"MIT\"\n}"
  },
  {
    "path": "semantic/tasks/config/admin/templates/css-package.js",
    "content": "var\n  where = 'client' // Adds files only to the client\n;\n\nPackage.describe({\n  name    : 'semantic:ui-css',\n  summary : 'Semantic UI - CSS Release of Semantic UI',\n  version : '{version}',\n  git     : 'git://github.com/Semantic-Org/Semantic-UI-CSS.git',\n});\n\nPackage.onUse(function(api) {\n\n  api.versionsFrom('1.0');\n\n  api.use('jquery', 'client');\n\n  api.addFiles([\n    // icons\n    'themes/default/assets/fonts/icons.eot',\n    'themes/default/assets/fonts/icons.svg',\n    'themes/default/assets/fonts/icons.ttf',\n    'themes/default/assets/fonts/icons.woff',\n    'themes/default/assets/fonts/icons.woff2',\n\n    // flags\n    'themes/default/assets/images/flags.png',\n\n    // release\n    'semantic.css',\n    'semantic.js'\n  ], 'client');\n\n});\n"
  },
  {
    "path": "semantic/tasks/config/admin/templates/less-package.js",
    "content": "var\n  where = 'client' // Adds files only to the client\n;\n\nPackage.describe({\n  name    : 'semantic:ui',\n  summary : 'Semantic UI - LESS Release of Semantic UI',\n  version : '{version}',\n  git     : 'git://github.com/Semantic-Org/Semantic-UI-LESS.git',\n});\n\nPackage.onUse(function(api) {\n\n  api.versionsFrom('1.0');\n  api.use('less', 'client');\n\n  api.addFiles([\n    {files}\n  ], 'client');\n\n});\n"
  },
  {
    "path": "semantic/tasks/config/admin/templates/package.json",
    "content": "{\n  \"name\": \"semantic\",\n  \"version\": \"1.0.0\",\n  \"title\": \"Semantic UI\",\n  \"description\": \"Semantic empowers designers and developers by creating a shared vocabulary for UI.\",\n  \"homepage\": \"http://www.semantic-ui.com\",\n  \"author\": \"Jack Lukic <jack@semantic-ui.com>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git://github.com/Semantic-Org/Semantic-UI.git\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/Semantic-Org/Semantic-UI/issues\"\n  },\n  \"devDependencies\": {}\n}\n"
  },
  {
    "path": "semantic/tasks/config/defaults.js",
    "content": "/*******************************\n          Default Paths\n*******************************/\n\nmodule.exports = {\n\n  // base path added to all other paths\n  base : '',\n\n  // base path when installed with npm\n  pmRoot: 'semantic/',\n\n  // octal permission for output files, i.e. 644 (false does not adjust)\n  permission : 744,\n\n  // whether to generate rtl files\n  rtl        : false,\n\n  // file paths\n  files: {\n    config   : 'semantic.json',\n    site     : 'src/site',\n    theme    : 'src/theme.config'\n  },\n\n  // folder paths\n  paths: {\n    source: {\n      config      : 'src/theme.config',\n      definitions : 'src/definitions/',\n      site        : 'src/site/',\n      themes      : 'src/themes/'\n    },\n    output: {\n      packaged     : 'dist/',\n      uncompressed : 'dist/components/',\n      compressed   : 'dist/components/',\n      themes       : 'dist/themes/'\n    },\n    clean : 'dist/'\n  },\n\n  // components to include in package\n  components: [\n\n    // global\n    'reset',\n    'site',\n\n    // elements\n    'button',\n    'container',\n    'divider',\n    'flag',\n    'header',\n    'icon',\n    'image',\n    'input',\n    'label',\n    'list',\n    'loader',\n    'rail',\n    'reveal',\n    'segment',\n    'step',\n\n    // collections\n    'breadcrumb',\n    'form',\n    'grid',\n    'menu',\n    'message',\n    'table',\n\n    // views\n    'ad',\n    'card',\n    'comment',\n    'feed',\n    'item',\n    'statistic',\n\n    // modules\n    'accordion',\n    'checkbox',\n    'dimmer',\n    'dropdown',\n    'embed',\n    'modal',\n    'nag',\n    'popup',\n    'progress',\n    'rating',\n    'search',\n    'shape',\n    'sidebar',\n    'sticky',\n    'tab',\n    'transition',\n\n    // behaviors\n    'api',\n    'form',\n    'state',\n    'visibility'\n  ],\n\n  // whether to load admin tasks\n  admin: false,\n\n  // globs used for matching file patterns\n  globs      : {\n    ignored    : '!(*.min|*.map|*.rtl)',\n    ignoredRTL : '!(*.min|*.map)'\n  }\n\n};\n"
  },
  {
    "path": "semantic/tasks/config/docs.js",
    "content": "/*******************************\n             Docs\n*******************************/\n\n/* Paths used for \"serve-docs\" and \"build-docs\" tasks */\nmodule.exports = {\n  base: '',\n  globs: {\n    eco: '**/*.html.eco'\n  },\n  paths: {\n    clean: '../docs/out/dist/',\n    source: {\n      config      : 'src/theme.config',\n      definitions : 'src/definitions/',\n      site        : 'src/site/',\n      themes      : 'src/themes/'\n    },\n    output: {\n      examples     : '../docs/out/examples/',\n      less         : '../docs/out/src/',\n      metadata     : '../docs/out/',\n      packaged     : '../docs/out/dist/',\n      uncompressed : '../docs/out/dist/components/',\n      compressed   : '../docs/out/dist/components/',\n      themes       : '../docs/out/dist/themes/'\n    },\n    template: {\n      eco: '../docs/server/documents/'\n    },\n  }\n};\n"
  },
  {
    "path": "semantic/tasks/config/npm/gulpfile.js",
    "content": "/*******************************\n            Set-up\n*******************************/\n\nvar\n  gulp         = require('gulp-help')(require('gulp')),\n\n  // read user config to know what task to load\n  config       = require('./tasks/config/user'),\n\n  // watch changes\n  watch        = require('./tasks/watch'),\n\n  // build all files\n  build        = require('./tasks/build'),\n  buildJS      = require('./tasks/build/javascript'),\n  buildCSS     = require('./tasks/build/css'),\n  buildAssets  = require('./tasks/build/assets'),\n\n  // utility\n  clean        = require('./tasks/clean'),\n  version      = require('./tasks/version'),\n\n  // docs tasks\n  serveDocs    = require('./tasks/docs/serve'),\n  buildDocs    = require('./tasks/docs/build'),\n\n  // rtl\n  buildRTL     = require('./tasks/rtl/build'),\n  watchRTL     = require('./tasks/rtl/watch')\n;\n\n\n/*******************************\n             Tasks\n*******************************/\n\ngulp.task('default', false, [\n  'watch'\n]);\n\ngulp.task('watch', 'Watch for site/theme changes', watch);\n\ngulp.task('build', 'Builds all files from source', build);\ngulp.task('build-javascript', 'Builds all javascript from source', buildJS);\ngulp.task('build-css', 'Builds all css from source', buildCSS);\ngulp.task('build-assets', 'Copies all assets from source', buildAssets);\n\ngulp.task('clean', 'Clean dist folder', clean);\ngulp.task('version', 'Displays current version of Semantic', version);\n\n/*--------------\n      Docs\n---------------*/\n\n/*\n  Lets you serve files to a local documentation instance\n  https://github.com/Semantic-Org/Semantic-UI-Docs/\n*/\n\ngulp.task('serve-docs', 'Serve file changes to SUI Docs', serveDocs);\ngulp.task('build-docs', 'Build all files and add to SUI Docs', buildDocs);\n\n\n/*--------------\n      RTL\n---------------*/\n\nif(config.rtl) {\n  gulp.task('watch-rtl', 'Watch files as RTL', watchRTL);\n  gulp.task('build-rtl', 'Build all files as RTL', buildRTL);\n}\n"
  },
  {
    "path": "semantic/tasks/config/project/config.js",
    "content": "/*******************************\n            Set-up\n*******************************/\n\nvar\n  extend   = require('extend'),\n  fs       = require('fs'),\n  path     = require('path'),\n\n  defaults = require('../defaults')\n;\n\n\n/*******************************\n            Exports\n*******************************/\n\nmodule.exports = {\n\n  getPath: function(file, directory) {\n    var\n      configPath,\n      walk = function(directory) {\n        var\n          nextDirectory = path.resolve( path.join(directory, path.sep, '..') ),\n          currentPath   = path.normalize( path.join(directory, file) )\n        ;\n        if( fs.existsSync(currentPath) ) {\n          // found file\n          configPath = path.normalize(directory);\n          return;\n        }\n        else {\n          // reached file system root, let's stop\n          if(nextDirectory == directory) {\n            return;\n          }\n          // otherwise recurse\n          walk(nextDirectory, file);\n        }\n      }\n    ;\n\n    // start walk from outside require-dot-files directory\n    file      = file || defaults.files.config;\n    directory = directory || path.join(__dirname, path.sep, '..');\n    walk(directory);\n    return configPath || '';\n  },\n\n  // adds additional derived values to a config object\n  addDerivedValues: function(config) {\n\n    config = config || extend(false, {}, defaults);\n\n    /*--------------\n       File Paths\n    ---------------*/\n\n    var\n      configPath = this.getPath(),\n      sourcePaths = {},\n      outputPaths = {},\n      folder\n    ;\n\n    // resolve paths (config location + base + path)\n    for(folder in config.paths.source) {\n      if(config.paths.source.hasOwnProperty(folder)) {\n        sourcePaths[folder] = path.resolve(path.join(configPath, config.base, config.paths.source[folder]));\n      }\n    }\n    for(folder in config.paths.output) {\n      if(config.paths.output.hasOwnProperty(folder)) {\n        outputPaths[folder] = path.resolve(path.join(configPath, config.base, config.paths.output[folder]));\n      }\n    }\n\n    // set config paths to full paths\n    config.paths.source = sourcePaths;\n    config.paths.output = outputPaths;\n\n    // resolve \"clean\" command path\n    config.paths.clean = path.resolve( path.join(configPath, config.base, config.paths.clean) );\n\n    /*--------------\n        CSS URLs\n    ---------------*/\n\n    // determine asset paths in css by finding relative path between themes and output\n    // force forward slashes\n\n    config.paths.assets = {\n      source       : '../../themes', // source asset path is always the same\n      uncompressed : './' + path.relative(config.paths.output.uncompressed, config.paths.output.themes).replace(/\\\\/g, '/'),\n      compressed   : './' + path.relative(config.paths.output.compressed, config.paths.output.themes).replace(/\\\\/g, '/'),\n      packaged     : './' + path.relative(config.paths.output.packaged, config.paths.output.themes).replace(/\\\\/g, '/')\n    };\n\n    /*--------------\n       Permission\n    ---------------*/\n\n    if(config.permission) {\n      config.hasPermissions = true;\n    }\n    else {\n      // pass blank object to avoid causing errors\n      config.permission     = {};\n      config.hasPermissions = false;\n    }\n\n    /*--------------\n         Globs\n    ---------------*/\n\n    if(!config.globs) {\n      config.globs = {};\n    }\n\n    // remove duplicates from component array\n    if(config.components instanceof Array) {\n      config.components = config.components.filter(function(component, index) {\n        return config.components.indexOf(component) == index;\n      });\n    }\n\n    // takes component object and creates file glob matching selected components\n    config.globs.components = (typeof config.components == 'object')\n      ? (config.components.length > 1)\n        ? '{' + config.components.join(',') + '}'\n        : config.components[0]\n      : '{' + defaults.components.join(',') + '}'\n    ;\n\n    return config;\n\n  }\n\n};\n\n"
  },
  {
    "path": "semantic/tasks/config/project/install.js",
    "content": "/*******************************\n            Set-up\n*******************************/\n\nvar\n  fs             = require('fs'),\n  path           = require('path'),\n  defaults       = require('../defaults'),\n  release        = require('./release'),\n\n  requireDotFile = require('require-dot-file')\n;\n\n/*******************************\n          When to Ask\n*******************************/\n\n/* Preconditions for install questions */\n\nvar when = {\n\n  // path\n  changeRoot: function(questions) {\n    return (questions.useRoot !== undefined && questions.useRoot !== true);\n  },\n\n  // permissions\n  changePermissions: function(questions) {\n    return (questions.changePermissions && questions.changePermissions === true);\n  },\n\n  // install\n  hasConfig: function() {\n    return requireDotFile('semantic.json', process.cwd());\n  },\n\n  allowOverwrite: function(questions) {\n    return (questions.overwrite === undefined || questions.overwrite == 'yes');\n  },\n  notAuto: function(questions) {\n    return (questions.install !== 'auto' && (questions.overwrite === undefined || questions.overwrite == 'yes'));\n  },\n  custom: function(questions) {\n    return (questions.install === 'custom' && (questions.overwrite === undefined || questions.overwrite == 'yes'));\n  },\n  express: function(questions) {\n    return (questions.install === 'express' && (questions.overwrite === undefined || questions.overwrite == 'yes'));\n  },\n\n  // customize\n  customize: function(questions) {\n    return (questions.customize === true);\n  },\n  primaryColor: function(questions) {\n    return (questions.primaryColor);\n  },\n  secondaryColor: function(questions) {\n    return (questions.secondaryColor);\n  }\n};\n\n/*******************************\n        Response Filters\n*******************************/\n\n/* Filters to user input from install questions */\n\nvar filter = {\n  removeTrailingSlash: function(path) {\n    return path.replace(/(\\/$|\\\\$)+/mg, '');\n  }\n};\n\n/*******************************\n          Configuration\n*******************************/\n\nmodule.exports = {\n\n  // check whether install is setup\n  isSetup: function() {\n    return when.hasConfig();\n  },\n\n  // detect whether there is a semantic.json configuration and that the auto-install option is set to true\n  shouldAutoInstall: function() {\n    var\n      config = when.hasConfig()\n    ;\n    return config['autoInstall'];\n  },\n\n  // checks if files are in a PM directory\n  getPackageManager: function(directory) {\n    var\n      // returns last matching result (avoid sub-module detection)\n      walk = function(directory) {\n        var\n          pathArray     = directory.split(path.sep),\n          folder        = pathArray[pathArray.length - 1],\n          nextDirectory = path.join(directory, path.sep, '..')\n        ;\n        if( folder == 'bower_components') {\n          return {\n            name: 'Bower',\n            root: nextDirectory\n          };\n        }\n        else if(folder == 'node_modules') {\n         return {\n            name: 'NPM',\n            root: nextDirectory\n          };\n        }\n        else if(folder == 'composer') {\n         return {\n            name: 'Composer',\n            root: nextDirectory\n          };\n        }\n        if(path.resolve(directory) == path.resolve(nextDirectory)) {\n          return false;\n        }\n        // recurse downward\n        return walk(nextDirectory);\n      }\n    ;\n    // start walk from current directory if none specified\n    directory = directory || (__dirname + path.sep);\n    return walk(directory);\n  },\n\n  // checks if files is PMed submodule\n  isSubModule: function(directory) {\n    var\n      moduleFolders = 0,\n      walk = function(directory) {\n        var\n          pathArray     = directory.split(path.sep),\n          folder        = pathArray[pathArray.length - 2],\n          nextDirectory = path.join(directory, path.sep, '..')\n        ;\n        if( folder == 'bower_components') {\n          moduleFolders++;\n        }\n        else if(folder == 'node_modules') {\n          moduleFolders++;\n        }\n        else if(folder == 'composer') {\n          moduleFolders++;\n        }\n        if(path.resolve(directory) == path.resolve(nextDirectory)) {\n          return (moduleFolders > 1);\n        }\n        // recurse downward\n        return walk(nextDirectory);\n      }\n    ;\n    // start walk from current directory if none specified\n    directory = directory || (__dirname + path.sep);\n    return walk(directory);\n  },\n\n\n  createJSON: function(answers) {\n    var\n      json = {\n        paths: {\n          source: {},\n          output: {}\n        }\n      }\n    ;\n\n    // add components\n    if(answers.components) {\n      json.components = answers.components;\n    }\n\n    // add rtl choice\n    if(answers.rtl) {\n      json.rtl = answers.rtl;\n    }\n\n    // add permissions\n    if(answers.permission) {\n      json.permission = answers.permission;\n    }\n\n    // add path to semantic\n    if(answers.semanticRoot) {\n      json.base = path.normalize(answers.semanticRoot);\n    }\n\n    // record version number to avoid re-installing on same version\n    json.version = release.version;\n\n    // add dist folder paths\n    if(answers.dist) {\n      answers.dist = path.normalize(answers.dist);\n\n      json.paths.output = {\n        packaged     : path.normalize(answers.dist + '/'),\n        uncompressed : path.normalize(answers.dist + '/components/'),\n        compressed   : path.normalize(answers.dist + '/components/'),\n        themes       : path.normalize(answers.dist + '/themes/')\n      };\n    }\n\n    // add site path\n    if(answers.site) {\n      json.paths.source.site = path.normalize(answers.site + '/');\n    }\n    if(answers.packaged) {\n      json.paths.output.packaged = path.normalize(answers.packaged + '/');\n    }\n    if(answers.compressed) {\n      json.paths.output.compressed = path.normalize(answers.compressed + '/');\n    }\n    if(answers.uncompressed) {\n      json.paths.output.uncompressed = path.normalize(answers.uncompressed + '/');\n    }\n    return json;\n  },\n\n  // files cleaned up after install\n  setupFiles: [\n    './src/theme.config.example',\n    './semantic.json.example',\n    './src/_site'\n  ],\n\n  regExp: {\n    // used to match siteFolder variable in theme.less\n    siteVariable: /@siteFolder .*\\'(.*)/mg\n  },\n\n  // source paths (when installing)\n  source: {\n    config       : './semantic.json.example',\n    definitions  : './src/definitions',\n    gulpFile     : './gulpfile.js',\n    lessImport   : './src/semantic.less',\n    site         : './src/_site',\n    tasks        : './tasks',\n    themeConfig  : './src/theme.config.example',\n    themeImport  : './src/theme.less',\n    themes       : './src/themes',\n    defaultTheme : './src/themes/default',\n    userGulpFile : './tasks/config/npm/gulpfile.js'\n  },\n\n  // expected final filenames\n  files: {\n    config      : 'semantic.json',\n    lessImport  : 'src/semantic.less',\n    site        : 'src/site',\n    themeConfig : 'src/theme.config',\n    themeImport : 'src/theme.less'\n  },\n\n  // folder paths to files relative to root\n  folders: {\n    config       : './',\n    definitions  : 'src/definitions/',\n    lessImport   : 'src/',\n    modules      : 'node_modules/',\n    site         : 'src/site/',\n    tasks        : 'tasks/',\n    themeConfig  : 'src/',\n    themeImport  : 'src/',\n    themes       : 'src/themes/',\n\n    defaultTheme : 'default/' // only path that is relative to another directory and not root\n  },\n\n  // questions asked during install\n  questions: {\n\n    root: [\n      {\n        type    : 'list',\n        name    : 'useRoot',\n        message :\n          '{packageMessage} Is this your project folder? {root}',\n        choices: [\n          {\n            name  : 'Yes',\n            value : true\n          },\n          {\n            name  : 'No, let me specify',\n            value : false\n          }\n        ]\n      },\n      {\n        type    : 'input',\n        name    : 'customRoot',\n        message : 'Please enter the absolute path to your project root',\n        default : '/my/project/path',\n        when    : when.changeRoot\n      },\n      {\n        type    : 'input',\n        name    : 'semanticRoot',\n        message : 'Where should we put Semantic UI inside your project?',\n        default : 'semantic/'\n      }\n    ],\n\n    setup: [\n      {\n        type: 'list',\n        name: 'overwrite',\n        message: 'It looks like you have a semantic.json file already.',\n        when: when.hasConfig,\n        choices: [\n          {\n            name: 'Yes, extend my current settings.',\n            value: 'yes'\n          },\n          {\n            name: 'Skip install',\n            value: 'no'\n          }\n        ]\n      },\n      {\n        type: 'list',\n        name: 'install',\n        message: 'Set-up Semantic UI',\n        when: when.allowOverwrite,\n        choices: [\n          {\n            name: 'Automatic (Use default locations and all components)',\n            value: 'auto'\n          },\n          {\n            name: 'Express (Set components and output folder)',\n            value: 'express'\n          },\n          {\n            name: 'Custom (Customize all src/dist values)',\n            value: 'custom'\n          }\n        ]\n      },\n      {\n        type: 'checkbox',\n        name: 'components',\n        message: 'What components should we include in the package?',\n\n        // duplicated manually from tasks/defaults.js with additional property\n        choices: [\n          { name: \"reset\", checked: true },\n          { name: \"site\", checked: true },\n          { name: \"button\", checked: true },\n          { name: \"container\", checked: true },\n          { name: \"divider\", checked: true },\n          { name: \"flag\", checked: true },\n          { name: \"header\", checked: true },\n          { name: \"icon\", checked: true },\n          { name: \"image\", checked: true },\n          { name: \"input\", checked: true },\n          { name: \"label\", checked: true },\n          { name: \"list\", checked: true },\n          { name: \"loader\", checked: true },\n          { name: \"rail\", checked: true },\n          { name: \"reveal\", checked: true },\n          { name: \"segment\", checked: true },\n          { name: \"step\", checked: true },\n          { name: \"breadcrumb\", checked: true },\n          { name: \"form\", checked: true },\n          { name: \"grid\", checked: true },\n          { name: \"menu\", checked: true },\n          { name: \"message\", checked: true },\n          { name: \"table\", checked: true },\n          { name: \"ad\", checked: true },\n          { name: \"card\", checked: true },\n          { name: \"comment\", checked: true },\n          { name: \"feed\", checked: true },\n          { name: \"item\", checked: true },\n          { name: \"statistic\", checked: true },\n          { name: \"accordion\", checked: true },\n          { name: \"checkbox\", checked: true },\n          { name: \"dimmer\", checked: true },\n          { name: \"dropdown\", checked: true },\n          { name: \"embed\", checked: true },\n          { name: \"modal\", checked: true },\n          { name: \"nag\", checked: true },\n          { name: \"popup\", checked: true },\n          { name: \"progress\", checked: true },\n          { name: \"rating\", checked: true },\n          { name: \"search\", checked: true },\n          { name: \"shape\", checked: true },\n          { name: \"sidebar\", checked: true },\n          { name: \"sticky\", checked: true },\n          { name: \"tab\", checked: true },\n          { name: \"transition\", checked: true },\n          { name: \"api\", checked: true },\n          { name: \"form\", checked: true },\n          { name: \"state\", checked: true },\n          { name: \"visibility\", checked: true }\n        ],\n        when: when.notAuto\n      },\n      {\n        type: 'list',\n        name: 'changePermissions',\n        when: when.notAuto,\n        message: 'Should we set permissions on outputted files?',\n        choices: [\n          {\n            name: 'No',\n            value: false\n          },\n          {\n            name: 'Yes',\n            value: true\n          }\n        ]\n      },\n      {\n        type: 'input',\n        name: 'permission',\n        message: 'What octal file permission should outputted files receive?',\n        default: defaults.permission,\n        when: when.changePermissions\n      },\n      {\n        type: 'list',\n        name: 'rtl',\n        message: 'Do you use a RTL (Right-To-Left) language?',\n        when: when.notAuto,\n        choices: [\n          {\n            name: 'No',\n            value: false\n          },\n          {\n            name: 'Yes',\n            value: true\n          },\n          {\n            name: 'Build Both',\n            value: 'both'\n          }\n        ]\n      },\n      {\n        type: 'input',\n        name: 'dist',\n        message: 'Where should we output Semantic UI?',\n        default: defaults.paths.output.packaged,\n        filter: filter.removeTrailingSlash,\n        when: when.express\n      },\n      {\n        type: 'input',\n        name: 'site',\n        message: 'Where should we put your site folder?',\n        default: defaults.paths.source.site,\n        filter: filter.removeTrailingSlash,\n        when: when.custom\n      },\n      {\n        type: 'input',\n        name: 'packaged',\n        message: 'Where should we output a packaged version?',\n        default: defaults.paths.output.packaged,\n        filter: filter.removeTrailingSlash,\n        when: when.custom\n      },\n      {\n        type: 'input',\n        name: 'compressed',\n        message: 'Where should we output compressed components?',\n        default: defaults.paths.output.compressed,\n        filter: filter.removeTrailingSlash,\n        when: when.custom\n      },\n      {\n        type: 'input',\n        name: 'uncompressed',\n        message: 'Where should we output uncompressed components?',\n        default: defaults.paths.output.uncompressed,\n        filter: filter.removeTrailingSlash,\n        when: when.custom\n      }\n    ],\n\n\n    cleanup: [\n      {\n        type: 'list',\n        name: 'cleanup',\n        message: 'Should we remove set-up files?',\n        choices: [\n          {\n            name: 'Yes (re-install will require redownloading semantic).',\n            value: 'yes'\n          },\n          {\n            name: 'No Thanks',\n            value: 'no'\n          }\n        ]\n      },\n      {\n        type: 'list',\n        name: 'build',\n        message: 'Do you want to build Semantic now?',\n        choices: [\n          {\n            name: 'Yes',\n            value: 'yes'\n          },\n          {\n            name: 'No',\n            value: 'no'\n          }\n        ]\n      },\n    ],\n    site: [\n      {\n        type: 'list',\n        name: 'customize',\n        message: 'You have not yet customized your site, can we help you do that?',\n        choices: [\n          {\n            name: 'Yes, ask me a few questions',\n            value: true\n          },\n          {\n            name: 'No I\\'ll do it myself',\n            value: false\n          }\n        ]\n      },\n      {\n        type: 'list',\n        name: 'headerFont',\n        message: 'Select your header font',\n        choices: [\n          {\n            name: 'Helvetica Neue, Arial, sans-serif',\n            value: 'Helvetica Neue, Arial, sans-serif;'\n          },\n          {\n            name: 'Lato (Google Fonts)',\n            value: 'Lato'\n          },\n          {\n            name: 'Open Sans (Google Fonts)',\n            value: 'Open Sans'\n          },\n          {\n            name: 'Source Sans Pro (Google Fonts)',\n            value: 'Source Sans Pro'\n          },\n          {\n            name: 'Droid (Google Fonts)',\n            value: 'Droid'\n          },\n          {\n            name: 'I\\'ll choose on my own',\n            value: false\n          }\n        ],\n        when: when.customize\n      },\n      {\n        type: 'list',\n        name: 'pageFont',\n        message: 'Select your page font',\n        choices: [\n          {\n            name: 'Helvetica Neue, Arial, sans-serif',\n            value: 'Helvetica Neue, Arial, sans-serif;'\n          },\n          {\n            name: 'Lato (Import from Google Fonts)',\n            value: 'Lato'\n          },\n          {\n            name: 'Open Sans (Import from Google Fonts)',\n            value: 'Open Sans'\n          },\n          {\n            name: 'Source Sans Pro (Import from Google Fonts)',\n            value: 'Source Sans Pro'\n          },\n          {\n            name: 'Droid (Google Fonts)',\n            value: 'Droid'\n          },\n          {\n            name: 'I\\'ll choose on my own',\n            value: false\n          }\n        ],\n        when: when.customize\n      },\n      {\n        type: 'list',\n        name: 'fontSize',\n        message: 'Select your base font size',\n        default: '14px',\n        choices: [\n          {\n            name: '12px',\n          },\n          {\n            name: '13px',\n          },\n          {\n            name: '14px (Recommended)',\n            value: '14px'\n          },\n          {\n            name: '15px',\n          },\n          {\n            name: '16px',\n          },\n          {\n            name: 'I\\'ll choose on my own',\n            value: false\n          }\n        ],\n        when: when.customize\n      },\n      {\n        type: 'list',\n        name: 'primaryColor',\n        message: 'Select the closest name for your primary brand color',\n        default: '14px',\n        choices: [\n          {\n            name: 'Blue'\n          },\n          {\n            name: 'Green'\n          },\n          {\n            name: 'Orange'\n          },\n          {\n            name: 'Pink'\n          },\n          {\n            name: 'Purple'\n          },\n          {\n            name: 'Red'\n          },\n          {\n            name: 'Teal'\n          },\n          {\n            name: 'Yellow'\n          },\n          {\n            name: 'Black'\n          },\n          {\n            name: 'I\\'ll choose on my own',\n            value: false\n          }\n        ],\n        when: when.customize\n      },\n      {\n        type: 'input',\n        name: 'PrimaryHex',\n        message: 'Enter a hexcode for your primary brand color',\n        when: when.primaryColor\n      },\n      {\n        type: 'list',\n        name: 'secondaryColor',\n        message: 'Select the closest name for your secondary brand color',\n        default: '14px',\n        choices: [\n          {\n            name: 'Blue'\n          },\n          {\n            name: 'Green'\n          },\n          {\n            name: 'Orange'\n          },\n          {\n            name: 'Pink'\n          },\n          {\n            name: 'Purple'\n          },\n          {\n            name: 'Red'\n          },\n          {\n            name: 'Teal'\n          },\n          {\n            name: 'Yellow'\n          },\n          {\n            name: 'Black'\n          },\n          {\n            name: 'I\\'ll choose on my own',\n            value: false\n          }\n        ],\n        when: when.customize\n      },\n      {\n        type: 'input',\n        name: 'secondaryHex',\n        message: 'Enter a hexcode for your secondary brand color',\n        when: when.secondaryColor\n      }\n    ]\n\n  },\n\n  settings: {\n\n    /* Rename Files */\n    rename: {\n      json : { extname : '.json' }\n    },\n\n    /* Copy Install Folders */\n    wrench: {\n\n      // overwrite existing files update & install (default theme / definition)\n      overwrite: {\n        forceDelete       : true,\n        excludeHiddenUnix : true,\n        preserveFiles     : false\n      },\n\n      // only create files that don't exist (site theme update)\n      merge: {\n        forceDelete       : false,\n        excludeHiddenUnix : true,\n        preserveFiles     : true\n      }\n\n    }\n  }\n};\n"
  },
  {
    "path": "semantic/tasks/config/project/release.js",
    "content": "/*******************************\n         Release Config\n*******************************/\n\nvar\n  requireDotFile = require('require-dot-file'),\n  config,\n  npmPackage,\n  version\n;\n\n\n/*******************************\n         Derived Values\n*******************************/\n\ntry {\n  config = requireDotFile('semantic.json');\n}\ncatch(error) {}\n\n\ntry {\n  npmPackage = require('../../../package.json');\n}\ncatch(error) {\n  // generate fake package\n  npmPackage = {\n    name: 'Unknown',\n    version: 'x.x'\n  };\n}\n\n// looks for version in config or package.json (whichever is available)\nversion = (npmPackage && npmPackage.version !== undefined && npmPackage.name == 'semantic-ui')\n  ? npmPackage.version\n  : config.version\n;\n\n\n/*******************************\n             Export\n*******************************/\n\nmodule.exports = {\n\n  title      : 'Semantic UI',\n  repository : 'https://github.com/Semantic-Org/Semantic-UI',\n  url        : 'http://www.semantic-ui.com/',\n\n  banner: ''\n    + ' /*' + '\\n'\n    + ' * # <%= title %> - <%= version %>' + '\\n'\n    + ' * <%= repository %>' + '\\n'\n    + ' * <%= url %>' + '\\n'\n    + ' *' + '\\n'\n    + ' * Copyright 2014 Contributors' + '\\n'\n    + ' * Released under the MIT license' + '\\n'\n    + ' * http://opensource.org/licenses/MIT' + '\\n'\n    + ' *' + '\\n'\n    + ' */' + '\\n',\n\n  version    : version\n\n};\n"
  },
  {
    "path": "semantic/tasks/config/tasks.js",
    "content": "var\n  console = require('better-console'),\n  config  = require('./user'),\n  release = require('./project/release')\n;\n\n\nmodule.exports = {\n\n  banner : release.banner,\n\n  log: {\n    created: function(file) {\n      return 'Created: ' + file;\n    },\n    modified: function(file) {\n      return 'Modified: ' + file;\n    }\n  },\n\n  filenames: {\n    concatenatedCSS            : 'semantic.css',\n    concatenatedJS             : 'semantic.js',\n    concatenatedMinifiedCSS    : 'semantic.min.css',\n    concatenatedMinifiedJS     : 'semantic.min.js',\n    concatenatedRTLCSS         : 'semantic.rtl.css',\n    concatenatedMinifiedRTLCSS : 'semantic.rtl.min.css'\n  },\n\n  regExp: {\n\n    comments: {\n\n      // remove all comments from config files (.variable)\n      variables : {\n        in  : /(\\/\\*[\\s\\S]+?\\*\\/+)[\\s\\S]+?\\/\\* End Config \\*\\//,\n        out : '$1',\n      },\n\n      // add version to first comment\n      license: {\n        in  : /(^\\/\\*[\\s\\S]+)(# Semantic UI )([\\s\\S]+?\\*\\/)/,\n        out : '$1$2' + release.version + ' $3'\n      },\n\n      // adds uniform spacing around comments\n      large: {\n        in  : /(\\/\\*\\*\\*\\*[\\s\\S]+?\\*\\/)/mg,\n        out : '\\n\\n$1\\n'\n      },\n      small: {\n        in  : /(\\/\\*---[\\s\\S]+?\\*\\/)/mg,\n        out : '\\n$1\\n'\n      },\n      tiny: {\n        in  : /(\\/\\* [\\s\\S]+? \\*\\/)/mg,\n        out : '\\n$1'\n      }\n    },\n\n    theme: /.*(\\/|\\\\)themes(\\/|\\\\).*?(?=(\\/|\\\\))/mg\n\n  },\n\n  settings: {\n\n    /* Remove Files in Clean */\n    del: {\n      silent : true\n    },\n\n    concatCSS: {\n      rebaseUrls: false\n    },\n\n    /* Comment Banners */\n    header: {\n      title      : release.title,\n      version    : release.version,\n      repository : release.repository,\n      url        : release.url\n    },\n\n    plumber: {\n      less: {\n        errorHandler: function(error) {\n          var\n            regExp = {\n              variable : /@(\\S.*?)\\s/,\n              theme    : /themes[\\/\\\\]+(.*?)[\\/\\\\].*/,\n              element  : /[\\/\\\\]([^\\/\\\\*]*)\\.overrides/\n            },\n            theme,\n            element\n          ;\n          if(error.filename.match(/theme.less/)) {\n            if(error.line == 5) {\n              element  = regExp.variable.exec(error.message)[1];\n              if(element) {\n                console.error('Missing theme.config value for ', element);\n              }\n              console.error('Most likely new UI was added in an update. You will need to add missing elements from theme.config.example');\n            }\n            if(error.line == 46) {\n              element = regExp.element.exec(error.message)[1];\n              theme   = regExp.theme.exec(error.message)[1];\n              console.error(theme + ' is not an available theme for ' + element);\n            }\n          }\n          else {\n            console.log(error);\n          }\n          this.emit('end');\n        }\n      }\n    },\n\n    /* What Browsers to Prefix */\n    prefix: {\n      browsers: [\n        'last 2 versions',\n        '> 1%',\n        'opera 12.1',\n        'bb 10',\n        'android 4'\n      ]\n    },\n\n    /* File Renames */\n    rename: {\n      minJS     : { extname : '.min.js' },\n      minCSS    : { extname : '.min.css' },\n      rtlCSS    : { extname : '.rtl.css' },\n      rtlMinCSS : { extname : '.rtl.min.css' }\n    },\n\n    /* Minified CSS Concat */\n    minify: {\n      processImport       : false,\n      restructuring       : false,\n      keepSpecialComments : 1,\n      roundingPrecision   : -1,\n    },\n\n    /* Minified JS Settings */\n    uglify: {\n      mangle   : true,\n      output: {\n        comments: 'some'\n      }\n    },\n\n    /* Minified Concat CSS Settings */\n    concatMinify: {\n      processImport       : false,\n      restructuring       : false,\n      keepSpecialComments : false,\n      roundingPrecision   : -1,\n    },\n\n    /* Minified Concat JS */\n    concatUglify: {\n      mangle   : true,\n      output: {\n        comments: 'some'\n      }\n    }\n\n  }\n};\n"
  },
  {
    "path": "semantic/tasks/config/user.js",
    "content": "/*******************************\n             Set-up\n*******************************/\n\nvar\n  // npm dependencies\n  extend          = require('extend'),\n  fs              = require('fs'),\n  path            = require('path'),\n  requireDotFile  = require('require-dot-file'),\n\n  // semantic.json defaults\n  defaults        = require('./defaults'),\n  config          = require('./project/config'),\n\n  // Final config object\n  gulpConfig = {},\n\n  // semantic.json settings\n  userConfig\n\n;\n\n\n/*******************************\n          User Config\n*******************************/\n\ntry {\n  // looks for config file across all parent directories\n  userConfig = requireDotFile('semantic.json');\n}\ncatch(error) {\n  if(error.code === 'MODULE_NOT_FOUND') {\n    console.error('No semantic.json config found');\n  }\n}\n\n// extend user config with defaults\ngulpConfig = (!userConfig)\n  ? extend(true, {}, defaults)\n  : extend(false, {}, defaults, userConfig)\n;\n\n/*******************************\n       Add Derived Values\n*******************************/\n\n// adds calculated values\nconfig.addDerivedValues(gulpConfig);\n\n\n/*******************************\n             Export\n*******************************/\n\nmodule.exports = gulpConfig;\n\n"
  },
  {
    "path": "semantic/tasks/docs/build.js",
    "content": "/*******************************\n           Build Docs\n*******************************/\n\nvar\n  gulp         = require('gulp'),\n\n  // node dependencies\n  console      = require('better-console'),\n  fs           = require('fs'),\n  map          = require('map-stream'),\n\n  // gulp dependencies\n  autoprefixer = require('gulp-autoprefixer'),\n  chmod        = require('gulp-chmod'),\n  clone        = require('gulp-clone'),\n  flatten      = require('gulp-flatten'),\n  gulpif       = require('gulp-if'),\n  header       = require('gulp-header'),\n  less         = require('gulp-less'),\n  minifyCSS    = require('gulp-clean-css'),\n  plumber      = require('gulp-plumber'),\n  print        = require('gulp-print'),\n  rename       = require('gulp-rename'),\n  replace      = require('gulp-replace'),\n  uglify       = require('gulp-uglify'),\n\n  // user config\n  config       = require('../config/docs'),\n\n  // install config\n  tasks        = require('../config/tasks'),\n  configSetup  = require('../config/project/config'),\n  install      = require('../config/project/install'),\n\n  // metadata parsing\n  metadata     = require('./metadata'),\n\n  // shorthand\n  globs,\n  assets,\n  output,\n  source,\n\n  banner       = tasks.banner,\n  comments     = tasks.regExp.comments,\n  log          = tasks.log,\n  settings     = tasks.settings\n;\n\n// add internal tasks (concat release)\nrequire('../collections/internal')(gulp);\n\nmodule.exports = function(callback) {\n\n  var\n    stream,\n    compressedStream,\n    uncompressedStream\n  ;\n\n  // use a different config\n  config = configSetup.addDerivedValues(config);\n\n  // shorthand\n  globs  = config.globs;\n  assets = config.paths.assets;\n  output = config.paths.output;\n  source = config.paths.source;\n\n  /*--------------\n   Parse metadata\n   ---------------*/\n\n  // parse all *.html.eco in docs repo, data will end up in\n  // metadata.result object.  Note this assumes that the docs\n  // repository is present and in proper directory location as\n  // specified by docs.json.\n  console.info('Building Metadata');\n  gulp.src(config.paths.template.eco + globs.eco)\n    .pipe(map(metadata.parser))\n    .on('end', function() {\n      fs.writeFile(output.metadata + '/metadata.json', JSON.stringify(metadata.result, null, 2));\n    })\n  ;\n\n  /*--------------\n    Copy Examples\n  ---------------*/\n\n  console.info('Copying examples');\n  // copy src/ to server\n  gulp.src('examples/**/*.*')\n    .pipe(gulp.dest(output.examples))\n    .pipe(print(log.created))\n  ;\n\n  /*--------------\n     Copy Source\n  ---------------*/\n\n  console.info('Copying LESS source');\n  // copy src/ to server\n  gulp.src('src/**/*.*')\n    .pipe(gulp.dest(output.less))\n    .pipe(print(log.created))\n  ;\n\n  /*--------------\n        Build\n  ---------------*/\n\n  console.info('Building Semantic for docs');\n\n  if( !install.isSetup() ) {\n    console.error('Cannot build files. Run \"gulp install\" to set-up Semantic');\n    return;\n  }\n\n  // unified css stream\n  stream = gulp.src(source.definitions + '/**/' + globs.components + '.less')\n    .pipe(plumber())\n    .pipe(less(settings.less))\n    .pipe(autoprefixer(settings.prefix))\n    .pipe(flatten())\n  ;\n\n  // two concurrent streams from same source to concat release\n  uncompressedStream = stream.pipe(clone());\n  compressedStream   = stream.pipe(clone());\n\n  uncompressedStream\n    .pipe(plumber())\n    .pipe(replace(comments.variables.in, comments.variables.out))\n    .pipe(replace(comments.large.in, comments.large.out))\n    .pipe(replace(comments.small.in, comments.small.out))\n    .pipe(replace(comments.tiny.in, comments.tiny.out))\n    .pipe(replace(assets.source, assets.uncompressed))\n    .pipe(header(banner, settings.header))\n    .pipe(gulpif(config.hasPermission, chmod(config.permission)))\n    .pipe(gulp.dest(output.uncompressed))\n    .pipe(print(log.created))\n    .on('end', function() {\n      gulp.start('package uncompressed docs css');\n    })\n  ;\n\n  compressedStream = stream\n    .pipe(plumber())\n    .pipe(clone())\n    .pipe(replace(assets.source, assets.compressed))\n    .pipe(minifyCSS(settings.minify))\n    .pipe(rename(settings.rename.minCSS))\n    .pipe(header(banner, settings.header))\n    .pipe(gulpif(config.hasPermission, chmod(config.permission)))\n    .pipe(gulp.dest(output.compressed))\n    .pipe(print(log.created))\n    .on('end', function() {\n      callback();\n      gulp.start('package compressed docs css');\n    })\n  ;\n\n  // copy assets\n  gulp.src(source.themes + '/**/assets/**/*.*')\n    .pipe(gulpif(config.hasPermission, chmod(config.permission)))\n    .pipe(gulp.dest(output.themes))\n  ;\n\n  // copy source javascript\n  gulp.src(source.definitions + '/**/' + globs.components + '.js')\n    .pipe(plumber())\n    .pipe(flatten())\n    .pipe(gulp.dest(output.uncompressed))\n    .pipe(gulpif(config.hasPermission, chmod(config.permission)))\n    .pipe(print(log.created))\n    .pipe(uglify(settings.uglify))\n    .pipe(rename(settings.rename.minJS))\n    .pipe(header(banner, settings.header))\n    .pipe(gulp.dest(output.compressed))\n    .pipe(gulpif(config.hasPermission, chmod(config.permission)))\n    .pipe(print(log.created))\n    .on('end', function() {\n      gulp.start('package compressed docs js');\n      gulp.start('package uncompressed docs js');\n    })\n  ;\n\n};\n"
  },
  {
    "path": "semantic/tasks/docs/metadata.js",
    "content": "\n/*******************************\n           Summarize Docs\n*******************************/\n\nvar\n  // node dependencies\n  console      = require('better-console'),\n  fs           = require('fs'),\n  YAML         = require('yamljs')\n;\n\nvar data = {};\n\n/**\n * Test for prefix in string.\n * @param {string} str\n * @param {string} prefix\n * @return {boolean}\n */\nfunction startsWith(str, prefix) {\n  return str.indexOf(prefix) === 0;\n};\n\nfunction inArray(needle, haystack) {\n  var length = haystack.length;\n  for(var i = 0; i < length; i++) {\n      if(haystack[i] == needle) return true;\n  }\n  return false;\n}\n\n/**\n * Parses a file for metadata and stores result in data object.\n * @param {File} file - object provided by map-stream.\n * @param {function(?,File)} - callback provided by map-stream to\n * reply when done.\n */\nfunction parser(file, callback) {\n  // file exit conditions\n  if(file.isNull()) {\n    return callback(null, file); // pass along\n  }\n\n  if(file.isStream()) {\n    return callback(new Error('Streaming not supported'));\n  }\n\n  try {\n\n    var\n      /** @type {string} */\n      text     = String(file.contents.toString('utf8')),\n      lines    = text.split('\\n'),\n      filename = file.path.substring(0, file.path.length - 4),\n      key      = 'server/documents',\n      position = filename.indexOf(key)\n    ;\n\n    // exit conditions\n    if(!lines) {\n      return;\n    }\n    if(position < 0) {\n      return callback(null, file);\n    }\n\n    filename = filename.substring(position + key.length + 1, filename.length);\n\n    var\n      lineCount = lines.length,\n      active    = false,\n      yaml      = [],\n      categories = [\n        'UI Element',\n        'UI Global',\n        'UI Collection',\n        'UI View',\n        'UI Module',\n        'UI Behavior'\n      ],\n      index,\n      meta,\n      line\n    ;\n\n    for(index = 0; index < lineCount; index++) {\n\n      line = lines[index];\n\n      // Wait for metadata block to begin\n      if(!active) {\n        if(startsWith(line, '---')) {\n          active = true;\n        }\n        continue;\n      }\n      // End of metadata block, stop parsing.\n      if(startsWith(line, '---')) {\n        break;\n      }\n      yaml.push(line);\n    }\n\n\n    // Parse yaml.\n    meta = YAML.parse(yaml.join('\\n'));\n    if(meta && meta.type && meta.title && inArray(meta.type, categories) ) {\n      meta.category = meta.type;\n      meta.filename = filename;\n      meta.url      = '/' + filename;\n      meta.title    = meta.title;\n      // Primary key will by filepath\n      data[meta.element] = meta;\n    }\n    else {\n      // skip\n      // console.log(meta);\n    }\n\n\n  }\n\n  catch(error) {\n    console.log(error, filename);\n  }\n\n  callback(null, file);\n\n}\n\n/**\n * Export function expected by map-stream.\n */\nmodule.exports = {\n  result : data,\n  parser : parser\n};\n"
  },
  {
    "path": "semantic/tasks/docs/serve.js",
    "content": "/*******************************\n           Serve Docs\n*******************************/\nvar\n  gulp         = require('gulp'),\n\n  // node dependencies\n  console      = require('better-console'),\n  fs           = require('fs'),\n\n  // gulp dependencies\n  autoprefixer = require('gulp-autoprefixer'),\n  chmod        = require('gulp-chmod'),\n  clone        = require('gulp-clone'),\n  gulpif       = require('gulp-if'),\n  header       = require('gulp-header'),\n  less         = require('gulp-less'),\n  minifyCSS    = require('gulp-clean-css'),\n  plumber      = require('gulp-plumber'),\n  print        = require('gulp-print'),\n  rename       = require('gulp-rename'),\n  replace      = require('gulp-replace'),\n  uglify       = require('gulp-uglify'),\n  util         = require('gulp-util'),\n  watch        = require('gulp-watch'),\n\n  // user config\n  config       = require('../config/docs'),\n\n  // task config\n  tasks        = require('../config/tasks'),\n  configSetup  = require('../config/project/config'),\n  install      = require('../config/project/install'),\n\n  // shorthand\n  banner       = tasks.banner,\n  comments     = tasks.regExp.comments,\n  log          = tasks.log,\n  settings     = tasks.settings,\n\n  globs,\n  assets,\n  output,\n  source\n;\n\nrequire('../collections/internal')(gulp);\n\nmodule.exports = function () {\n\n  // use a different config\n  config = configSetup.addDerivedValues(config);\n\n  // shorthand\n  globs  = config.globs;\n  assets = config.paths.assets;\n  output = config.paths.output;\n  source = config.paths.source;\n\n\n  /*--------------\n     Copy Source\n  ---------------*/\n\n  gulp\n    .watch([\n      'src/**/*.*'\n    ], function(file) {\n      console.clear();\n      return gulp.src(file.path, {\n          base: 'src/'\n        })\n        .pipe(gulp.dest(output.less))\n        .pipe(print(log.created))\n      ;\n    })\n  ;\n\n  /*--------------\n    Copy Examples\n  ---------------*/\n\n  gulp\n    .watch([\n      'examples/**/*.*'\n    ], function(file) {\n      console.clear();\n      return gulp.src(file.path, {\n          base: 'examples/'\n        })\n        .pipe(gulp.dest(output.examples))\n        .pipe(print(log.created))\n      ;\n    })\n  ;\n\n  /*--------------\n      Watch CSS\n  ---------------*/\n\n  gulp\n    .watch([\n      source.config,\n      source.definitions   + '/**/*.less',\n      source.site          + '/**/*.{overrides,variables}',\n      source.themes        + '/**/*.{overrides,variables}'\n    ], function(file) {\n\n      var\n        lessPath,\n\n        stream,\n        compressedStream,\n        uncompressedStream,\n\n        isDefinition,\n        isPackagedTheme,\n        isSiteTheme,\n        isConfig\n      ;\n\n      // log modified file\n      gulp.src(file.path)\n        .pipe(print(log.modified))\n      ;\n\n      /*--------------\n         Find Source\n      ---------------*/\n\n      // recompile on *.override , *.variable change\n      isConfig        = (file.path.indexOf('theme.config') !== -1 || file.path.indexOf('site.variables') !== -1);\n      isPackagedTheme = (file.path.indexOf(source.themes) !== -1);\n      isSiteTheme     = (file.path.indexOf(source.site) !== -1);\n      isDefinition    = (file.path.indexOf(source.definitions) !== -1);\n\n      if(isConfig) {\n        // console.info('Rebuilding all files');\n        // cant rebuild paths are wrong\n        // gulp.start('build-docs');\n        return;\n      }\n      else if(isPackagedTheme) {\n        console.log('Change detected in packaged theme');\n        lessPath = util.replaceExtension(file.path, '.less');\n        lessPath = lessPath.replace(tasks.regExp.theme, source.definitions);\n      }\n      else if(isSiteTheme) {\n        console.log('Change detected in site theme');\n        lessPath = util.replaceExtension(file.path, '.less');\n        lessPath = lessPath.replace(source.site, source.definitions);\n      }\n      else {\n        console.log('Change detected in definition');\n        lessPath = file.path;\n      }\n\n      /*--------------\n        Create CSS\n      ---------------*/\n\n      if( fs.existsSync(lessPath) ) {\n\n        // unified css stream\n        stream = gulp.src(lessPath)\n          .pipe(plumber())\n          .pipe(less(settings.less))\n          .pipe(replace(comments.variables.in, comments.variables.out))\n          .pipe(replace(comments.large.in, comments.large.out))\n          .pipe(replace(comments.small.in, comments.small.out))\n          .pipe(replace(comments.tiny.in, comments.tiny.out))\n          .pipe(autoprefixer(settings.prefix))\n          .pipe(gulpif(config.hasPermission, chmod(config.permission)))\n        ;\n\n        // use 2 concurrent streams from same pipe\n        uncompressedStream = stream.pipe(clone());\n        compressedStream   = stream.pipe(clone());\n\n        uncompressedStream\n          .pipe(plumber())\n          .pipe(replace(assets.source, assets.uncompressed))\n          .pipe(header(banner, settings.header))\n          .pipe(gulp.dest(output.uncompressed))\n          .pipe(print(log.created))\n          .on('end', function() {\n            gulp.start('package uncompressed docs css');\n          })\n        ;\n\n        compressedStream = stream\n          .pipe(plumber())\n          .pipe(replace(assets.source, assets.compressed))\n          .pipe(minifyCSS(settings.minify))\n          .pipe(rename(settings.rename.minCSS))\n          .pipe(header(banner, settings.header))\n          .pipe(gulp.dest(output.compressed))\n          .pipe(print(log.created))\n          .on('end', function() {\n            gulp.start('package compressed docs css');\n          })\n        ;\n\n      }\n      else {\n        console.log('Cannot find UI definition at path', lessPath);\n      }\n    })\n  ;\n\n  /*--------------\n      Watch JS\n  ---------------*/\n\n  gulp\n    .watch([\n      source.definitions   + '/**/*.js'\n    ], function(file) {\n      gulp.src(file.path)\n        .pipe(plumber())\n        .pipe(gulpif(config.hasPermission, chmod(config.permission)))\n        .pipe(gulp.dest(output.uncompressed))\n        .pipe(print(log.created))\n        .pipe(uglify(settings.uglify))\n        .pipe(rename(settings.rename.minJS))\n        .pipe(gulp.dest(output.compressed))\n        .pipe(print(log.created))\n        .on('end', function() {\n          gulp.start('package compressed docs js');\n          gulp.start('package uncompressed docs js');\n        })\n      ;\n    })\n  ;\n\n  /*--------------\n    Watch Assets\n  ---------------*/\n\n  // only copy assets that match component names (or their plural)\n  gulp\n    .watch([\n      source.themes   + '/**/assets/**/' + globs.components + '?(s).*'\n    ], function(file) {\n      // copy assets\n      gulp.src(file.path, { base: source.themes })\n        .pipe(gulpif(config.hasPermission, chmod(config.permission)))\n        .pipe(gulp.dest(output.themes))\n        .pipe(print(log.created))\n      ;\n    })\n  ;\n\n\n};\n"
  },
  {
    "path": "semantic/tasks/install.js",
    "content": "/*******************************\n         Install Task\n*******************************/\n\n/*\n   Install tasks\n\n   For more notes\n\n   * Runs automatically after npm update (hooks)\n   * (NPM) Install - Will ask for where to put semantic (outside pm folder)\n   * (NPM) Upgrade - Will look for semantic install, copy over files and update if new version\n   * Standard installer runs asking for paths to site files etc\n\n*/\n\nvar\n  gulp           = require('gulp'),\n\n  // node dependencies\n  console        = require('better-console'),\n  extend         = require('extend'),\n  fs             = require('fs'),\n  mkdirp         = require('mkdirp'),\n  path           = require('path'),\n  runSequence    = require('run-sequence'),\n\n  // gulp dependencies\n  chmod          = require('gulp-chmod'),\n  del            = require('del'),\n  jsonEditor     = require('gulp-json-editor'),\n  plumber        = require('gulp-plumber'),\n  prompt         = require('prompt-sui'),\n  rename         = require('gulp-rename'),\n  replace        = require('gulp-replace'),\n  requireDotFile = require('require-dot-file'),\n  wrench         = require('wrench-sui'),\n\n  // install config\n  install        = require('./config/project/install'),\n\n  // user config\n  config         = require('./config/user'),\n\n  // release config (name/title/etc)\n  release        = require('./config/project/release'),\n\n  // shorthand\n  questions      = install.questions,\n  files          = install.files,\n  folders        = install.folders,\n  regExp         = install.regExp,\n  settings       = install.settings,\n  source         = install.source\n;\n\n// Export install task\nmodule.exports = function (callback) {\n\nvar\n  currentConfig = requireDotFile('semantic.json'),\n  manager       = install.getPackageManager(),\n  rootQuestions = questions.root,\n  installFolder = false,\n  answers\n;\n\nconsole.clear();\n\n/* Test NPM install\nmanager = {\n  name : 'NPM',\n  root : path.normalize(__dirname + '/../')\n};\n*/\n\n\n/* Don't do end user config if SUI is a sub-module */\nif( install.isSubModule() ) {\n  console.info('SUI is a sub-module, skipping end-user install');\n  return;\n}\n\n/*-----------------\n    Update SUI\n-----------------*/\n\n// run update scripts if semantic.json exists\nif(currentConfig && manager.name === 'NPM') {\n\n  var\n    updateFolder = path.join(manager.root, currentConfig.base),\n    updatePaths  = {\n      config       : path.join(manager.root, files.config),\n      tasks        : path.join(updateFolder, folders.tasks),\n      themeImport  : path.join(updateFolder, folders.themeImport),\n      definition   : path.join(currentConfig.paths.source.definitions),\n      site         : path.join(currentConfig.paths.source.site),\n      theme        : path.join(currentConfig.paths.source.themes),\n      defaultTheme : path.join(currentConfig.paths.source.themes, folders.defaultTheme)\n    }\n  ;\n\n  // duck-type if there is a project installed\n  if( fs.existsSync(updatePaths.definition) ) {\n\n    // perform update if new version\n    if(currentConfig.version !== release.version) {\n      console.log('Updating Semantic UI from ' + currentConfig.version + ' to ' + release.version);\n\n      console.info('Updating ui definitions...');\n      wrench.copyDirSyncRecursive(source.definitions, updatePaths.definition, settings.wrench.overwrite);\n\n      console.info('Updating default theme...');\n      wrench.copyDirSyncRecursive(source.themes, updatePaths.theme, settings.wrench.merge);\n      wrench.copyDirSyncRecursive(source.defaultTheme, updatePaths.defaultTheme, settings.wrench.overwrite);\n\n      console.info('Updating tasks...');\n      wrench.copyDirSyncRecursive(source.tasks, updatePaths.tasks, settings.wrench.overwrite);\n\n      console.info('Updating gulpfile.js');\n      gulp.src(source.userGulpFile)\n        .pipe(plumber())\n        .pipe(gulp.dest(updateFolder))\n      ;\n\n      // copy theme import\n      console.info('Updating theme import file');\n      gulp.src(source.themeImport)\n        .pipe(plumber())\n        .pipe(gulp.dest(updatePaths.themeImport))\n      ;\n\n      console.info('Adding new site theme files...');\n      wrench.copyDirSyncRecursive(source.site, updatePaths.site, settings.wrench.merge);\n\n      console.info('Updating version...');\n\n      // update version number in semantic.json\n      gulp.src(updatePaths.config)\n        .pipe(plumber())\n        .pipe(rename(settings.rename.json)) // preserve file extension\n        .pipe(jsonEditor({\n          version: release.version\n        }))\n        .pipe(gulp.dest(manager.root))\n      ;\n\n      console.info('Update complete! Run \"\\x1b[92mgulp build\\x1b[0m\" to rebuild dist/ files.');\n\n      return;\n    }\n    else {\n      console.log('Current version of Semantic UI already installed');\n      return;\n    }\n\n  }\n  else {\n    console.error('Cannot locate files to update at path: ', updatePaths.definition);\n    console.log('Running installer');\n  }\n\n}\n\n/*--------------\n Determine Root\n---------------*/\n\n// PM that supports Build Tools (NPM Only Now)\nif(manager.name == 'NPM') {\n  rootQuestions[0].message = rootQuestions[0].message\n    .replace('{packageMessage}', 'We detected you are using ' + manager.name + ' Nice!')\n    .replace('{root}', manager.root)\n  ;\n  // set default path to detected PM root\n  rootQuestions[0].default = manager.root;\n  rootQuestions[1].default = manager.root;\n\n  // insert PM questions after \"Install Type\" question\n  Array.prototype.splice.apply(questions.setup, [2, 0].concat(rootQuestions));\n\n  // omit cleanup questions for managed install\n  questions.cleanup = [];\n}\n\n\n/*--------------\n   Create SUI\n---------------*/\n\ngulp.task('run setup', function() {\n\n  // If auto-install is switched on, we skip the configuration section and simply reuse the configuration from semantic.json\n  if(install.shouldAutoInstall()) {\n    answers = {\n      overwrite    : 'yes',\n      install      : 'auto',\n      useRoot      : true,\n      semanticRoot : currentConfig.base\n    };\n  }\n  else {\n    return gulp\n      .src('gulpfile.js')\n      .pipe(prompt.prompt(questions.setup, function(setupAnswers) {\n        // hoist\n        answers = setupAnswers;\n      }))\n    ;\n  }\n});\n\ngulp.task('create install files', function(callback) {\n\n  /*--------------\n   Exit Conditions\n  ---------------*/\n\n  // if config exists and user specifies not to proceed\n  if(answers.overwrite !== undefined && answers.overwrite == 'no') {\n    return;\n  }\n  console.clear();\n  if(install.shouldAutoInstall()) {\n    console.log('Auto-Installing (Without User Interaction)');\n  }\n  else {\n    console.log('Installing');\n  }\n  console.log('------------------------------');\n\n\n  /*--------------\n        Paths\n  ---------------*/\n\n  var\n    installPaths = {\n      config            : files.config,\n      configFolder      : folders.config,\n      site              : answers.site || folders.site,\n      themeConfig       : files.themeConfig,\n      themeConfigFolder : folders.themeConfig\n    }\n  ;\n\n  /*--------------\n    NPM Install\n  ---------------*/\n\n  // Check if PM install\n  if(manager && (answers.useRoot || answers.customRoot)) {\n\n    // Set root to custom root path if set\n    if(answers.customRoot) {\n      if(answers.customRoot === '') {\n        console.log('Unable to proceed, invalid project root');\n        return;\n      }\n      manager.root = answers.customRoot;\n    }\n\n    // special install paths only for PM install\n    installPaths = extend(false, {}, installPaths, {\n      definition   : folders.definitions,\n      lessImport   : folders.lessImport,\n      tasks        : folders.tasks,\n      theme        : folders.themes,\n      defaultTheme : path.join(folders.themes, folders.defaultTheme),\n      themeImport  : folders.themeImport\n    });\n\n    // add project root to semantic root\n    installFolder = path.join(manager.root, answers.semanticRoot);\n\n    // add install folder to all output paths\n    for(var destination in installPaths) {\n      if( installPaths.hasOwnProperty(destination) ) {\n        // config goes in project root, rest in install folder\n        installPaths[destination] = (destination == 'config' || destination == 'configFolder')\n          ? path.normalize( path.join(manager.root, installPaths[destination]) )\n          : path.normalize( path.join(installFolder, installPaths[destination]) )\n        ;\n      }\n    }\n\n    // create project folders\n    try {\n      mkdirp.sync(installFolder);\n      mkdirp.sync(installPaths.definition);\n      mkdirp.sync(installPaths.theme);\n      mkdirp.sync(installPaths.tasks);\n    }\n    catch(error) {\n      console.error('NPM does not have permissions to create folders at your specified path. Adjust your folders permissions and run \"npm install\" again');\n    }\n\n    console.log('Installing to \\x1b[92m' + answers.semanticRoot + '\\x1b[0m');\n\n    console.info('Copying UI definitions');\n    wrench.copyDirSyncRecursive(source.definitions, installPaths.definition, settings.wrench.overwrite);\n\n    console.info('Copying UI themes');\n    wrench.copyDirSyncRecursive(source.themes, installPaths.theme, settings.wrench.merge);\n    wrench.copyDirSyncRecursive(source.defaultTheme, installPaths.defaultTheme, settings.wrench.overwrite);\n\n    console.info('Copying gulp tasks');\n    wrench.copyDirSyncRecursive(source.tasks, installPaths.tasks, settings.wrench.overwrite);\n\n    // copy theme import\n    console.info('Adding theme files');\n    gulp.src(source.themeImport)\n      .pipe(plumber())\n      .pipe(gulp.dest(installPaths.themeImport))\n    ;\n    gulp.src(source.lessImport)\n      .pipe(plumber())\n      .pipe(gulp.dest(installPaths.lessImport))\n    ;\n\n    // create gulp file\n    console.info('Creating gulpfile.js');\n    gulp.src(source.userGulpFile)\n      .pipe(plumber())\n      .pipe(gulp.dest(installFolder))\n    ;\n\n  }\n\n\n  /*--------------\n     Site Theme\n  ---------------*/\n\n  // Copy _site templates folder to destination\n  if( fs.existsSync(installPaths.site) ) {\n    console.info('Site folder exists, merging files (no overwrite)', installPaths.site);\n  }\n  else {\n    console.info('Creating site theme folder', installPaths.site);\n  }\n  wrench.copyDirSyncRecursive(source.site, installPaths.site, settings.wrench.merge);\n\n  /*--------------\n    Theme Config\n  ---------------*/\n\n  gulp.task('create theme.config', function() {\n    var\n      // determine path to site theme folder from theme config\n      // force CSS path variable to use forward slashes for paths\n      pathToSite   = path.relative(path.resolve(installPaths.themeConfigFolder), path.resolve(installPaths.site)).replace(/\\\\/g,'/'),\n      siteVariable = \"@siteFolder   : '\" + pathToSite + \"/';\"\n    ;\n\n    // rewrite site variable in theme.less\n    console.info('Adjusting @siteFolder to: ', pathToSite + '/');\n\n    if(fs.existsSync(installPaths.themeConfig)) {\n      console.info('Modifying src/theme.config (LESS config)', installPaths.themeConfig);\n      return gulp.src(installPaths.themeConfig)\n        .pipe(plumber())\n        .pipe(replace(regExp.siteVariable, siteVariable))\n        .pipe(gulp.dest(installPaths.themeConfigFolder))\n      ;\n    }\n    else {\n      console.info('Creating src/theme.config (LESS config)', installPaths.themeConfig);\n      return gulp.src(source.themeConfig)\n        .pipe(plumber())\n        .pipe(rename({ extname : '' }))\n        .pipe(replace(regExp.siteVariable, siteVariable))\n        .pipe(gulp.dest(installPaths.themeConfigFolder))\n      ;\n    }\n  });\n\n  /*--------------\n    Semantic.json\n  ---------------*/\n\n  gulp.task('create semantic.json', function() {\n\n    var\n      jsonConfig = install.createJSON(answers)\n    ;\n\n    // adjust variables in theme.less\n    if( fs.existsSync(installPaths.config) ) {\n      console.info('Extending config file (semantic.json)', installPaths.config);\n      return gulp.src(installPaths.config)\n        .pipe(plumber())\n        .pipe(rename(settings.rename.json)) // preserve file extension\n        .pipe(jsonEditor(jsonConfig))\n        .pipe(gulp.dest(installPaths.configFolder))\n      ;\n    }\n    else {\n      console.info('Creating config file (semantic.json)', installPaths.config);\n      return gulp.src(source.config)\n        .pipe(plumber())\n        .pipe(rename({ extname : '' })) // remove .template from ext\n        .pipe(jsonEditor(jsonConfig))\n        .pipe(gulp.dest(installPaths.configFolder))\n      ;\n    }\n\n  });\n\n  runSequence(\n    'create theme.config',\n    'create semantic.json',\n    callback\n  );\n\n});\n\ngulp.task('clean up install', function() {\n\n  // Completion Message\n  if(installFolder && !install.shouldAutoInstall()) {\n    console.log('\\n Setup Complete! \\n Installing Peer Dependencies. \\x1b[0;31mPlease refrain from ctrl + c\\x1b[0m... \\n After completion navigate to \\x1b[92m' + answers.semanticRoot + '\\x1b[0m and run \"\\x1b[92mgulp build\\x1b[0m\" to build');\n    process.exit(0);\n  }\n  else {\n    console.log('');\n    console.log('');\n  }\n\n  // If auto-install is switched on, we skip the configuration section and simply build the dependencies\n  if(install.shouldAutoInstall()) {\n    return gulp.start('build');\n  }\n  else {\n    return gulp\n      .src('gulpfile.js')\n      .pipe(prompt.prompt(questions.cleanup, function(answers) {\n        if(answers.cleanup == 'yes') {\n          del(install.setupFiles);\n        }\n        if(answers.build == 'yes') {\n          gulp.start('build');\n        }\n      }))\n    ;\n  }\n\n\n});\n\nrunSequence(\n  'run setup',\n  'create install files',\n  'clean up install',\n  callback\n);\n\n};\n"
  },
  {
    "path": "semantic/tasks/rtl/build.js",
    "content": "/*******************************\n          Build Task\n*******************************/\n\nvar\n  gulp         = require('gulp'),\n\n  // node dependencies\n  fs           = require('fs'),\n\n  // gulp dependencies\n  autoprefixer = require('gulp-autoprefixer'),\n  chmod        = require('gulp-chmod'),\n  clone        = require('gulp-clone'),\n  flatten      = require('gulp-flatten'),\n  gulpif       = require('gulp-if'),\n  less         = require('gulp-less'),\n  minifyCSS    = require('gulp-clean-css'),\n  plumber      = require('gulp-plumber'),\n  print        = require('gulp-print'),\n  rename       = require('gulp-rename'),\n  replace      = require('gulp-replace'),\n  rtlcss       = require('gulp-rtlcss'),\n  uglify       = require('gulp-uglify'),\n\n  // user config\n  config       = require('../config/user'),\n\n  // install config\n  tasks        = require('../config/tasks'),\n  install      = require('../config/project/install'),\n\n  // shorthand\n  globs        = config.globs,\n  assets       = config.paths.assets,\n  output       = config.paths.output,\n  source       = config.paths.source,\n\n  banner       = tasks.banner,\n  comments     = tasks.regExp.comments,\n  log          = tasks.log,\n  settings     = tasks.settings\n;\n\n// add internal tasks (concat release)\nrequire('../collections/internal')(gulp);\n\nmodule.exports = function(callback) {\n\n  var\n    stream,\n    compressedStream,\n    uncompressedStream\n  ;\n\n  console.info('Building Semantic');\n\n  if( !install.isSetup() ) {\n    console.error('Cannot build files. Run \"gulp install\" to set-up Semantic');\n    return;\n  }\n\n  // unified css stream\n  stream = gulp.src(source.definitions + '/**/' + globs.components + '.less')\n    .pipe(plumber())\n    .pipe(less(settings.less))\n    .pipe(autoprefixer(settings.prefix))\n    .pipe(rtlcss())\n    .pipe(replace(comments.variables.in, comments.variables.out))\n    .pipe(replace(comments.license.in, comments.license.out))\n    .pipe(replace(comments.large.in, comments.large.out))\n    .pipe(replace(comments.small.in, comments.small.out))\n    .pipe(replace(comments.tiny.in, comments.tiny.out))\n    .pipe(flatten())\n  ;\n\n  // two concurrent streams from same source to concat release\n  uncompressedStream = stream.pipe(clone());\n  compressedStream   = stream.pipe(clone());\n\n  uncompressedStream\n    .pipe(plumber())\n    .pipe(replace(assets.source, assets.uncompressed))\n    .pipe(rename(settings.rename.rtlCSS))\n    .pipe(gulpif(config.hasPermission, chmod(config.permission)))\n    .pipe(gulp.dest(output.uncompressed))\n    .pipe(print(log.created))\n    .on('end', function() {\n      gulp.start('package uncompressed rtl css');\n    })\n  ;\n\n  compressedStream = stream\n    .pipe(plumber())\n    .pipe(clone())\n    .pipe(replace(assets.source, assets.compressed))\n    .pipe(minifyCSS(settings.minify))\n    .pipe(rename(settings.rename.rtlMinCSS))\n    .pipe(gulpif(config.hasPermission, chmod(config.permission)))\n    .pipe(gulp.dest(output.compressed))\n    .pipe(print(log.created))\n    .on('end', function() {\n      callback();\n      gulp.start('package compressed rtl css');\n    })\n  ;\n\n  // copy assets\n  gulp.src(source.themes + '/**/assets/**/' + globs.components + '?(s).*')\n    .pipe(gulpif(config.hasPermission, chmod(config.permission)))\n    .pipe(gulp.dest(output.themes))\n  ;\n\n  // copy source javascript\n  gulp.src(source.definitions + '/**/' + globs.components + '.js')\n    .pipe(plumber())\n    .pipe(flatten())\n    .pipe(replace(comments.license.in, comments.license.out))\n    .pipe(gulpif(config.hasPermission, chmod(config.permission)))\n    .pipe(gulp.dest(output.uncompressed))\n    .pipe(print(log.created))\n    .pipe(uglify(settings.uglify))\n    .pipe(rename(settings.rename.minJS))\n    .pipe(gulp.dest(output.compressed))\n    .pipe(print(log.created))\n    .on('end', function() {\n      gulp.start('package compressed js');\n      gulp.start('package uncompressed js');\n    })\n  ;\n\n};\n"
  },
  {
    "path": "semantic/tasks/rtl/watch.js",
    "content": "/*******************************\n           Watch Task\n*******************************/\n\nvar\n  gulp         = require('gulp'),\n\n  // node deps\n  console      = require('better-console'),\n  fs           = require('fs'),\n\n  // gulp deps\n  autoprefixer = require('gulp-autoprefixer'),\n  chmod        = require('gulp-chmod'),\n  clone        = require('gulp-clone'),\n  gulpif       = require('gulp-if'),\n  less         = require('gulp-less'),\n  minifyCSS    = require('gulp-clean-css'),\n  plumber      = require('gulp-plumber'),\n  print        = require('gulp-print'),\n  rename       = require('gulp-rename'),\n  replace      = require('gulp-replace'),\n  rtlcss       = require('gulp-rtlcss'),\n  uglify       = require('gulp-uglify'),\n  util         = require('gulp-util'),\n  watch        = require('gulp-watch'),\n\n  // user config\n  config       = require('../config/user'),\n\n  // task config\n  tasks        = require('../config/tasks'),\n  install      = require('../config/project/install'),\n\n  // shorthand\n  globs        = config.globs,\n  assets       = config.paths.assets,\n  output       = config.paths.output,\n  source       = config.paths.source,\n\n  banner       = tasks.banner,\n  comments     = tasks.regExp.comments,\n  log          = tasks.log,\n  settings     = tasks.settings\n\n;\n\n// add internal tasks (concat release)\nrequire('../collections/internal')(gulp);\n\nmodule.exports = function(callback) {\n\n  if( !install.isSetup() ) {\n    console.error('Cannot watch files. Run \"gulp install\" to set-up Semantic');\n    return;\n  }\n\n  console.clear();\n  console.log('Watching source files for changes');\n\n  /*--------------\n      Watch CSS\n  ---------------*/\n\n  gulp\n    .watch([\n      source.config,\n      source.definitions   + '/**/*.less',\n      source.site          + '/**/*.{overrides,variables}',\n      source.themes        + '/**/*.{overrides,variables}'\n    ], function(file) {\n\n      var\n        lessPath,\n\n        stream,\n        compressedStream,\n        uncompressedStream,\n\n        isDefinition,\n        isPackagedTheme,\n        isSiteTheme,\n        isConfig\n      ;\n\n      // log modified file\n      gulp.src(file.path)\n        .pipe(print(log.modified))\n      ;\n\n      /*--------------\n         Find Source\n      ---------------*/\n\n      // recompile on *.override , *.variable change\n      isConfig        = (file.path.indexOf('.config') !== -1);\n      isPackagedTheme = (file.path.indexOf(source.themes) !== -1);\n      isSiteTheme     = (file.path.indexOf(source.site) !== -1);\n      isDefinition    = (file.path.indexOf(source.definitions) !== -1);\n\n\n      if(isConfig) {\n        console.log('Change detected in theme config');\n        // cant tell which theme was changed in theme.config, rebuild all\n        gulp.start('build');\n      }\n      else if(isPackagedTheme) {\n        console.log('Change detected in packaged theme');\n        lessPath = lessPath.replace(tasks.regExp.theme, source.definitions);\n        lessPath = util.replaceExtension(file.path, '.less');\n      }\n      else if(isSiteTheme) {\n        console.log('Change detected in site theme');\n        lessPath = lessPath.replace(source.site, source.definitions);\n        lessPath = util.replaceExtension(file.path, '.less');\n      }\n      else if(isDefinition) {\n        console.log('Change detected in definition');\n        lessPath = util.replaceExtension(file.path, '.less');\n      }\n\n      /*--------------\n         Create CSS\n      ---------------*/\n\n      if( fs.existsSync(lessPath) ) {\n\n        // unified css stream\n        stream = gulp.src(lessPath)\n          .pipe(plumber())\n          .pipe(less(settings.less))\n          .pipe(replace(comments.variables.in, comments.variables.out))\n          .pipe(replace(comments.license.in, comments.license.out))\n          .pipe(replace(comments.large.in, comments.large.out))\n          .pipe(replace(comments.small.in, comments.small.out))\n          .pipe(replace(comments.tiny.in, comments.tiny.out))\n          .pipe(autoprefixer(settings.prefix))\n          .pipe(gulpif(config.hasPermission, chmod(config.permission)))\n          .pipe(rtlcss())\n        ;\n\n        // use 2 concurrent streams from same pipe\n        uncompressedStream = stream.pipe(clone());\n        compressedStream   = stream.pipe(clone());\n\n        uncompressedStream\n          .pipe(plumber())\n          .pipe(replace(assets.source, assets.uncompressed))\n          .pipe(rename(settings.rename.rtlCSS))\n          .pipe(gulp.dest(output.uncompressed))\n          .pipe(print(log.created))\n          .on('end', function() {\n            gulp.start('package uncompressed rtl css');\n          })\n        ;\n\n        compressedStream = stream\n          .pipe(plumber())\n          .pipe(replace(assets.source, assets.compressed))\n          .pipe(minifyCSS(settings.minify))\n          .pipe(rename(settings.rename.minCSS))\n          .pipe(rename(settings.rename.rtlMinCSS))\n          .pipe(gulp.dest(output.compressed))\n          .pipe(print(log.created))\n          .on('end', function() {\n            gulp.start('package compressed rtl css');\n          })\n        ;\n\n      }\n      else {\n        console.log('Cannot find UI definition at path', lessPath);\n      }\n    })\n  ;\n\n  /*--------------\n      Watch JS\n  ---------------*/\n\n  gulp\n    .watch([\n      source.definitions   + '/**/*.js'\n    ], function(file) {\n      gulp.src(file.path)\n        .pipe(plumber())\n        .pipe(replace(comments.license.in, comments.license.out))\n        .pipe(gulpif(config.hasPermission, chmod(config.permission)))\n        .pipe(gulp.dest(output.uncompressed))\n        .pipe(print(log.created))\n        .pipe(uglify(settings.uglify))\n        .pipe(rename(settings.rename.minJS))\n        .pipe(gulp.dest(output.compressed))\n        .pipe(print(log.created))\n        .on('end', function() {\n          gulp.start('package compressed js');\n          gulp.start('package uncompressed js');\n        })\n      ;\n    })\n  ;\n\n  /*--------------\n    Watch Assets\n  ---------------*/\n\n  // only copy assets that match component names (or their plural)\n  gulp\n    .watch([\n      source.themes   + '/**/assets/**/' + globs.components + '?(s).*'\n    ], function(file) {\n      // copy assets\n      gulp.src(file.path, { base: source.themes })\n        .pipe(gulpif(config.hasPermission, chmod(config.permission)))\n        .pipe(gulp.dest(output.themes))\n        .pipe(print(log.created))\n      ;\n    })\n  ;\n\n};\n"
  },
  {
    "path": "semantic/tasks/version.js",
    "content": "/*******************************\n          Version Task\n*******************************/\n\nvar\n  release = require('./config/project/release')\n;\n\nmodule.exports = function(callback) {\n  console.log(release.title + ' ' + release.version);\n};"
  },
  {
    "path": "semantic/tasks/watch.js",
    "content": "/*******************************\n           Watch Task\n*******************************/\n\nvar\n  gulp         = require('gulp-help')(require('gulp')),\n\n  // node dependencies\n  console      = require('better-console'),\n  fs           = require('fs'),\n\n  // gulp dependencies\n  autoprefixer = require('gulp-autoprefixer'),\n  chmod        = require('gulp-chmod'),\n  clone        = require('gulp-clone'),\n  gulpif       = require('gulp-if'),\n  less         = require('gulp-less'),\n  minifyCSS    = require('gulp-clean-css'),\n  plumber      = require('gulp-plumber'),\n  print        = require('gulp-print'),\n  rename       = require('gulp-rename'),\n  replace      = require('gulp-replace'),\n  uglify       = require('gulp-uglify'),\n  util         = require('gulp-util'),\n  watch        = require('gulp-watch'),\n\n  // user config\n  config       = require('./config/user'),\n\n  // task config\n  tasks        = require('./config/tasks'),\n  install      = require('./config/project/install'),\n\n  // shorthand\n  globs        = config.globs,\n  assets       = config.paths.assets,\n  output       = config.paths.output,\n  source       = config.paths.source,\n\n  banner       = tasks.banner,\n  comments     = tasks.regExp.comments,\n  log          = tasks.log,\n  settings     = tasks.settings\n\n;\n\n// add tasks referenced using gulp.run (sub-tasks)\nif(config.rtl) {\n  require('./collections/rtl')(gulp);\n}\nrequire('./collections/internal')(gulp);\n\n\n// export task\nmodule.exports = function(callback) {\n\n  if( !install.isSetup() ) {\n    console.error('Cannot watch files. Run \"gulp install\" to set-up Semantic');\n    return;\n  }\n\n  // check for right-to-left (RTL) language\n  if(config.rtl == 'both') {\n    gulp.start('watch-rtl');\n  }\n  if(config.rtl === true || config.rtl === 'Yes') {\n    gulp.start('watch-rtl');\n    return;\n  }\n\n  //console.clear();\n  console.log('Watching source files for changes');\n\n  /*--------------\n      Watch CSS\n  ---------------*/\n\n  gulp\n    .watch([\n      source.config,\n      source.definitions   + '/**/*.less',\n      source.site          + '/**/*.{overrides,variables}',\n      source.themes        + '/**/*.{overrides,variables}'\n    ], function(file) {\n\n      var\n        lessPath,\n\n        stream,\n        compressedStream,\n        uncompressedStream,\n\n        isDefinition,\n        isPackagedTheme,\n        isSiteTheme,\n        isConfig\n      ;\n\n      // log modified file\n      gulp.src(file.path)\n        .pipe(print(log.modified))\n      ;\n\n      /*--------------\n         Find Source\n      ---------------*/\n\n      // recompile on *.override , *.variable change\n      isConfig        = (file.path.indexOf('theme.config') !== -1 || file.path.indexOf('site.variables') !== -1);\n      isPackagedTheme = (file.path.indexOf(source.themes) !== -1);\n      isSiteTheme     = (file.path.indexOf(source.site) !== -1);\n      isDefinition    = (file.path.indexOf(source.definitions) !== -1);\n\n      if(isConfig) {\n        console.info('Rebuilding all UI');\n        // impossible to tell which file was updated in theme.config, rebuild all\n        gulp.start('build-css');\n        return;\n      }\n      else if(isPackagedTheme) {\n        console.log('Change detected in packaged theme');\n        lessPath = util.replaceExtension(file.path, '.less');\n        lessPath = lessPath.replace(tasks.regExp.theme, source.definitions);\n      }\n      else if(isSiteTheme) {\n        console.log('Change detected in site theme');\n        lessPath = util.replaceExtension(file.path, '.less');\n        lessPath = lessPath.replace(source.site, source.definitions);\n      }\n      else {\n        console.log('Change detected in definition');\n        lessPath = file.path;\n      }\n\n      /*--------------\n         Create CSS\n      ---------------*/\n\n      if( fs.existsSync(lessPath) ) {\n\n        // unified css stream\n        stream = gulp.src(lessPath)\n          .pipe(plumber(settings.plumber.less))\n          .pipe(less(settings.less))\n          .pipe(print(log.created))\n          .pipe(replace(comments.variables.in, comments.variables.out))\n          .pipe(replace(comments.license.in, comments.license.out))\n          .pipe(replace(comments.large.in, comments.large.out))\n          .pipe(replace(comments.small.in, comments.small.out))\n          .pipe(replace(comments.tiny.in, comments.tiny.out))\n          .pipe(autoprefixer(settings.prefix))\n          .pipe(gulpif(config.hasPermission, chmod(config.permission)))\n        ;\n\n        // use 2 concurrent streams from same pipe\n        uncompressedStream = stream.pipe(clone());\n        compressedStream   = stream.pipe(clone());\n\n        uncompressedStream\n          .pipe(plumber())\n          .pipe(replace(assets.source, assets.uncompressed))\n          .pipe(gulp.dest(output.uncompressed))\n          .pipe(print(log.created))\n          .on('end', function() {\n            gulp.start('package uncompressed css');\n          })\n        ;\n\n        compressedStream = stream\n          .pipe(plumber())\n          .pipe(replace(assets.source, assets.compressed))\n          .pipe(minifyCSS(settings.minify))\n          .pipe(rename(settings.rename.minCSS))\n          .pipe(gulp.dest(output.compressed))\n          .pipe(print(log.created))\n          .on('end', function() {\n            gulp.start('package compressed css');\n          })\n        ;\n      }\n      else {\n        console.log('Cannot find UI definition at path', lessPath);\n      }\n    })\n  ;\n\n  /*--------------\n      Watch JS\n  ---------------*/\n\n  gulp\n    .watch([\n      source.definitions   + '/**/*.js'\n    ], function(file) {\n      gulp.src(file.path)\n        .pipe(plumber())\n        .pipe(replace(comments.license.in, comments.license.out))\n        .pipe(gulpif(config.hasPermission, chmod(config.permission)))\n        .pipe(gulp.dest(output.uncompressed))\n        .pipe(print(log.created))\n        .pipe(uglify(settings.uglify))\n        .pipe(rename(settings.rename.minJS))\n        .pipe(gulp.dest(output.compressed))\n        .pipe(print(log.created))\n        .on('end', function() {\n          gulp.start('package compressed js');\n          gulp.start('package uncompressed js');\n        })\n      ;\n    })\n  ;\n\n  /*--------------\n    Watch Assets\n  ---------------*/\n\n  // only copy assets that match component names (or their plural)\n  gulp\n    .watch([\n      source.themes   + '/**/assets/**/*.*'\n    ], function(file) {\n      // copy assets\n      gulp.src(file.path, { base: source.themes })\n        .pipe(gulpif(config.hasPermission, chmod(config.permission)))\n        .pipe(gulp.dest(output.themes))\n        .pipe(print(log.created))\n      ;\n    })\n  ;\n\n};\n"
  },
  {
    "path": "semantic.json",
    "content": "{\n  \"base\": \"semantic/\",\n  \"paths\": {\n    \"source\": {\n      \"config\": \"src/theme.config\",\n      \"definitions\": \"src/definitions/\",\n      \"site\": \"src/site/\",\n      \"themes\": \"src/themes/\"\n    },\n    \"output\": {\n      \"packaged\": \"dist/\",\n      \"uncompressed\": \"dist/components/\",\n      \"compressed\": \"dist/components/\",\n      \"themes\": \"dist/themes/\"\n    },\n    \"clean\": \"dist/\"\n  },\n  \"permission\": false,\n  \"autoInstall\": false,\n  \"rtl\": false,\n  \"version\": \"2.3.1\"\n}"
  },
  {
    "path": "src/App.css",
    "content": ".App {\n  text-align: center;\n}\n\n.App-logo {\n  animation: App-logo-spin infinite 20s linear;\n  height: 80px;\n}\n\n.App-header {\n  background-color: #222;\n  height: 150px;\n  padding: 20px;\n  color: white;\n}\n\n.App-intro {\n  font-size: large;\n}\n\n@keyframes App-logo-spin {\n  from { transform: rotate(0deg); }\n  to { transform: rotate(360deg); }\n}\n\n\n.example-enter {\n  opacity: 0.01;\n}\n\n.example-enter.example-enter-active {\n  opacity: 1;\n  transition: opacity 300ms ease-in-out;\n}\n\n.example-leave {\n  opacity: 1;\n}\n\n.example-leave.example-leave-active {\n  opacity: 0.01;\n  transition: opacity 300ms ease-in-out;\n}\n\n.example-appear {\n  opacity: 0.01;\n}\n\n.example-appear.example-appear-active {\n  opacity: 1;\n  transition: opacity 300ms ease-in-out;\n}\n\n\n\n.thumbnail-disappear {\n    -webkit-animation: fadeout 0.5s; /* Safari, Chrome and Opera > 12.1 */\n    -moz-animation: fadeout 0.5s; /* Firefox < 16 */\n    -ms-animation: fadeout 0.5s; /* Internet Explorer */\n    -o-animation: fadeout 0.5s; /* Opera < 12.1 */\n    animation: fadeout 0.5s;\n}\n.thumbnail-appear {\n    -webkit-animation: fadein 0.8s; /* Safari, Chrome and Opera > 12.1 */\n    -moz-animation: fadein 0.8s; /* Firefox < 16 */\n    -ms-animation: fadein 0.8s; /* Internet Explorer */\n    -o-animation: fadein 0.8s; /* Opera < 12.1 */\n    animation: fadein 0.8s;\n}\n@keyframes fadeout {\n    from { opacity: 0; }\n    to   { opacity: 1; }\n}\n\n/* Firefox < 16 */\n@-moz-keyframes fadeout {\n    from { opacity: 0; }\n    to   { opacity: 1; }\n}\n\n/* Safari, Chrome and Opera > 12.1 */\n@-webkit-keyframes fadeout {\n    from { opacity: 0; }\n    to   { opacity: 1; }\n}\n\n/* Internet Explorer */\n@-ms-keyframes fadeout {\n    from { opacity: 0; }\n    to   { opacity: 1; }\n}\n\n/* Opera < 12.1 */\n@-o-keyframes fadeout {\n    from { opacity: 0; }\n    to   { opacity: 1; }\n}\n\n@keyframes fadein {\n    from { opacity: 0; }\n    to   { opacity: 1; }\n}\n\n/* Firefox < 16 */\n@-moz-keyframes fadein {\n    from { opacity: 0; }\n    to   { opacity: 1; }\n}\n\n/* Safari, Chrome and Opera > 12.1 */\n@-webkit-keyframes fadein {\n    from { opacity: 0; }\n    to   { opacity: 1; }\n}\n\n/* Internet Explorer */\n@-ms-keyframes fadein {\n    from { opacity: 0; }\n    to   { opacity: 1; }\n}\n\n/* Opera < 12.1 */\n@-o-keyframes fadein {\n    from { opacity: 0; }\n    to   { opacity: 1; }\n}\n\n.AutoSizerWrapper {\n  flex: 1 1 auto;\n}\n\n.List {\n  border: 1px solid #e0e0e0;\n}\n\n.personRemoveButton{ \ndisplay: none;\n}\n.personCardName:hover .personRemoveButton{\ndisplay : inline;\n}\n\n.gridCellActions{\n  display: none;\n}\n\n.gridCell:hover .gridCellActions {\n  display: inline;\n}\n\n\n.login-background-image {\n    background-image: url('http://666a658c624a3c03a6b2-25cda059d975d2f318c03e90bcf17c40.r92.cf1.rackcdn.com/unsplash_527bf56961712_1.JPG');\n    background-size: cover;\n    display: block;\n    filter: blur(5px);\n    -webkit-filter: blur(5px);\n    height: 800px;\n    left: 0;\n    position: fixed;\n    right: 0;\n    z-index: 1;\n}\n\n\n.login-content {\n    background: rgba(255, 255, 255, 0.35);\n    border-radius: 3px;\n    box-shadow: 0 1px 5px rgba(0, 0, 0, 0.25);\n    top: 10px;\n    left: 0;\n    position: fixed;\n    margin-left: 20px;\n    margin-right: 20px;\n    right: 0;\n    z-index: 2;\n    padding: 0 10px;\n}\n"
  },
  {
    "path": "src/App.js",
    "content": "import React, {Component} from 'react';\nimport {connect} from 'react-redux';\nimport {Route, Switch} from 'react-router-dom';\nimport {ConnectedRouter} from 'react-router-redux';\nimport NotificationSystem from 'reapop';\nimport theme from 'reapop-theme-wybo';\nimport './App.css';\nimport {CountStats} from './components/statistics';\nimport Login from './containers/login';\nimport history from './history';\nimport {\n  FaceScatter,\n  Graph,\n  LocationTree,\n  PhotoMap,\n  Timeline,\n  WordClouds,\n} from './layouts/DataVisualization';\nimport {FaceDashboard} from './layouts/FaceDashboardV3';\nimport {FavoritePhotos} from './layouts/FavoritePhotos';\nimport {HiddenPhotos} from './layouts/HiddenPhotos';\nimport {SignupPage} from './layouts/SignUpPage';\nimport {UserManagement} from './layouts/UserManagement';\nimport {AlbumAutoGalleryView} from './layouts/albumAutoGalleryView';\nimport {AlbumAuto} from './layouts/albumAuto';\nimport {AlbumPeople} from './layouts/albumPeople';\nimport {AlbumPersonGallery} from './layouts/albumPersonGallery';\nimport {AlbumPlace} from './layouts/albumPlace';\nimport {AlbumPlaceGallery} from './layouts/albumPlaceGallery';\nimport {AlbumThing} from './layouts/albumThing';\nimport {AlbumUser} from './layouts/albumUser';\nimport {AlbumUserGallery} from './layouts/albumUserGallery';\nimport {AllPhotosHashListViewRV} from './layouts/allPhotosViewHashRV';\nimport {SideMenuNarrow, TopMenu} from './layouts/menubars';\nimport {NoTimestampPhotosView} from './layouts/noTimestampPhotosView';\nimport {RecentlyAddedPhotos} from './layouts/RecentlyAddedPhotos';\nimport PrivateRoute from './layouts/privateRoute';\n// import {SearchView} from './layouts/search'\nimport {SearchView} from './layouts/searchRV';\nimport {Settings} from './layouts/settings';\nimport {AdminPage} from './layouts/AdminPage';\nimport {Statistics} from './layouts/statistics';\nimport {SecuredImage} from './layouts/Bench';\nimport {UserPublicPage} from './layouts/UserPublicPage';\nimport {PublicUserList} from './layouts/PublicUserList';\nimport {LocationClusterMap} from './components/maps';\nimport {SharedToMe} from './layouts/SharedToMe';\nimport {SharedFromMe} from './layouts/SharedFromMe';\n/*\nstore.subscribe(listener)\n\nvar jwt = null\n\nfunction select(state) {\n  return state.auth.jwtToken\n}\n\nfunction listener() {\n  let token = select(store.getState())\n  jwt = token\n}\n*/\n\nvar topMenuHeight = 55; // don't change this\nvar leftMenuWidth = 85; // don't change this\n\nclass Nav extends React.Component {\n  render() {\n    return (\n      <div>\n        {this.props.showSidebar && <SideMenuNarrow visible={true} />}\n        <TopMenu style={{zIndex: -1}} />\n      </div>\n    );\n  }\n}\n\nconst noMenubarPaths = ['/signup', '/login'];\n\nclass App extends Component {\n  /*\n  componentWillMount() {\n    if (this.props.jwtToken == null) {\n      store.dispatch(push('/login/'))\n    }\n  }\n  */\n\n  render() {\n    const menuSpacing = 0;\n    return (\n      <ConnectedRouter history={history}>\n        <div>\n          <NotificationSystem theme={theme} />\n          {this.props.location &&\n          !noMenubarPaths.includes(this.props.location.pathname) &&\n          !(\n            this.props.location.pathname.startsWith('/public') ||\n            this.props.location.pathname.startsWith('/user/') ||\n            this.props.location.pathname.startsWith('/users/')\n          ) ? (\n            <Nav showSidebar={this.props.showSidebar} />\n          ) : (\n            <div />\n          )}\n\n          <Switch>\n            <PrivateRoute exact path=\"/\" component={AllPhotosHashListViewRV} />\n\n            <Route path=\"/login\" component={Login} />\n\n            <Route path=\"/signup\" component={SignupPage} />\n\n            <Route path=\"/public\" component={UserPublicPage} />\n\n            <Route path=\"/users\" component={PublicUserList} />\n\n            <Route path=\"/user/:username\" component={UserPublicPage} />\n\n            <PrivateRoute path=\"/things\" component={AlbumThing} />\n\n            <PrivateRoute path=\"/recent\" component={RecentlyAddedPhotos} />\n\n            <PrivateRoute path=\"/favorites\" component={FavoritePhotos} />\n\n            <PrivateRoute path=\"/hidden\" component={HiddenPhotos} />\n\n            <PrivateRoute\n              path=\"/notimestamp\"\n              component={NoTimestampPhotosView}\n            />\n\n            <PrivateRoute path=\"/useralbums\" component={AlbumUser} />\n\n            <PrivateRoute path=\"/places\" component={LocationClusterMap} />\n\n            <PrivateRoute path=\"/people\" component={AlbumPeople} />\n\n            <PrivateRoute path=\"/events\" component={AlbumAuto} />\n\n            <PrivateRoute path=\"/statistics\" component={Statistics} />\n\n            <PrivateRoute path=\"/settings\" component={Settings} />\n\n            <PrivateRoute path=\"/faces\" component={FaceDashboard} />\n\n            <PrivateRoute path=\"/search\" component={SearchView} />\n\n            <PrivateRoute path=\"/bench\" component={SecuredImage} />\n\n            <PrivateRoute\n              path=\"/person/:albumID\"\n              component={AlbumPersonGallery}\n            />\n\n            <PrivateRoute\n              path=\"/place/:albumID\"\n              component={AlbumPlaceGallery}\n            />\n\n            <PrivateRoute\n              path=\"/event/:albumID\"\n              component={AlbumAutoGalleryView}\n            />\n\n            <PrivateRoute\n              path=\"/useralbum/:albumID\"\n              component={AlbumUserGallery}\n            />\n\n            <PrivateRoute path=\"/shared/tome/:which\" component={SharedToMe} />\n            <PrivateRoute\n              path=\"/shared/fromme/:which\"\n              component={SharedFromMe}\n            />\n\n            <PrivateRoute path=\"/admin\" component={AdminPage} />\n\n            <PrivateRoute path=\"/map\" component={PhotoMap} />\n            <PrivateRoute path=\"/placetree\" component={LocationTree} />\n            <PrivateRoute path=\"/wordclouds\" component={WordClouds} />\n            <PrivateRoute path=\"/timeline\" component={Timeline} />\n            <PrivateRoute path=\"/socialgraph\" component={Graph} />\n            <PrivateRoute path=\"/facescatter\" component={FaceScatter} />\n            <PrivateRoute path=\"/countstats\" component={CountStats} />\n          </Switch>\n        </div>\n      </ConnectedRouter>\n    );\n  }\n}\n\nApp = connect(store => {\n  return {\n    showSidebar: store.ui.showSidebar,\n    location: store.routerReducer.location,\n  };\n})(App);\n\nexport default App;\n/*\nconst mapStateToProps = (state) => ({\n  router: state.routerReducer\n})\n\nconst mapDispatchToProps = (dispatch) => ({\n})\n\nexport default connect(mapStateToProps, null)(App)\n*/\n"
  },
  {
    "path": "src/App.test.js",
    "content": "import React from 'react';\nimport ReactDOM from 'react-dom';\nimport App from './App';\n\nit('renders without crashing', () => {\n  const div = document.createElement('div');\n  ReactDOM.render(<App />, div);\n});\n"
  },
  {
    "path": "src/actions/albumsActions.js",
    "content": "import axios from \"axios\";\nimport { Server } from \"../api_client/apiClient\";\nimport _ from \"lodash\";\nimport { notify } from \"reapop\";\nimport { push } from \"react-router-redux\";\n\nexport function fetchThingAlbumsList() {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_THING_ALBUMS_LIST\" });\n    Server.get(\"albums/thing/list/\")\n      .then(response => {\n        dispatch({\n          type: \"FETCH_THING_ALBUMS_LIST_FULFILLED\",\n          payload: response.data.results\n        });\n      })\n      .catch(err => {\n        dispatch({ type: \"FETCH_THING_ALBUMS_LIST_REJECTED\", payload: err });\n      });\n  };\n}\n\nexport function fetchThingAlbum(album_id) {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_THING_ALBUMS\" });\n    Server.get(`albums/thing/${album_id}/`)\n      .then(response => {\n        dispatch({\n          type: \"FETCH_THING_ALBUMS_FULFILLED\",\n          payload: response.data\n        });\n      })\n      .catch(err => {\n        dispatch({ type: \"FETCH_THING_ALBUMS_REJECTED\", payload: err });\n      });\n  };\n}\n\nexport function fetchUserAlbumsList() {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_USER_ALBUMS_LIST\" });\n    Server.get(\"albums/user/list/\")\n      .then(response => {\n        dispatch({\n          type: \"FETCH_USER_ALBUMS_LIST_FULFILLED\",\n          payload: response.data.results\n        });\n      })\n      .catch(err => {\n        dispatch({ type: \"FETCH_USER_ALBUMS_LIST_REJECTED\", payload: err });\n      });\n  };\n}\n\nexport function fetchUserAlbum(album_id) {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_USER_ALBUMS\" });\n    Server.get(`albums/user/${album_id}/`)\n      .then(response => {\n        dispatch({\n          type: \"FETCH_USER_ALBUMS_FULFILLED\",\n          payload: response.data\n        });\n      })\n      .catch(err => {\n        dispatch({ type: \"FETCH_USER_ALBUMS_REJECTED\", payload: err });\n      });\n  };\n}\n\nexport function createNewUserAlbum(title, image_hashes) {\n  return function(dispatch) {\n    dispatch({ type: \"CREATE_USER_ALBUMS_LIST\" });\n    Server.post(\"albums/user/edit/\", { title: title, photos: image_hashes })\n      .then(response => {\n        dispatch({\n          type: \"CREATE_USER_ALBUMS_LIST_FULFILLED\",\n          payload: response.data\n        });\n        dispatch(fetchUserAlbumsList());\n        dispatch(\n          notify({\n            message: `${\n              image_hashes.length\n            } photo(s) were successfully added to new album \"${title}\"`,\n            title: \"Create album\",\n            status: \"success\",\n            dismissible: true,\n            dismissAfter: 3000,\n            position: \"br\",\n            buttons:[{\n              name:'View Album', \n              primary:true, \n              onClick: ()=>{\n                dispatch(fetchUserAlbum(response.data.id))\n                dispatch(push(`/useralbum/${response.data.id}/`))\n                console.log(response.data.id)\n              }\n            }]\n\n          })\n        );\n      })\n      .catch(err => {\n        dispatch({ type: \"CREATE_USER_ALBUMS_LIST_REJECTED\", payload: err });\n      });\n  };\n}\n\nexport function deleteUserAlbum(albumID, albumTitle) {\n  return function(dispatch) {\n    dispatch({ type: \"DELTE_USER_ALBUM\" });\n    Server.delete(`/albums/user/${albumID}`)\n      .then(response => {\n        dispatch({ type: \"DELETE_USER_ALBUM_FULFILLED\", payload: albumID });\n        dispatch(fetchUserAlbumsList());\n        dispatch(\n          notify({\n            message: `${albumTitle} was successfully deleted.`,\n            title: \"Delete album\",\n            status: \"success\",\n            dismissible: true,\n            dismissAfter: 3000,\n            position: \"br\"\n          })\n        );\n      })\n      .catch(err => {\n        dispatch({ type: \"DELETE_USER_ALBUM_REJECTED\", payload: err });\n      });\n  };\n}\n\nexport function editUserAlbum(album_id, title, image_hashes) {\n  return function(dispatch) {\n    dispatch({ type: \"EDIT_USER_ALBUMS_LIST\" });\n    Server.patch(`albums/user/edit/${album_id}/`, {\n      title: title,\n      photos: image_hashes\n    })\n      .then(response => {\n        dispatch({\n          type: \"EDIT_USER_ALBUMS_LIST_FULFILLED\",\n          payload: response.data\n        });\n        dispatch(\n          notify({\n            message: `${\n              image_hashes.length\n            } photo(s) were successfully added to existing album \"${title}\"`,\n            title: \"Add to album\",\n            status: \"success\",\n            dismissible: true,\n            dismissAfter: 3000,\n            position: \"br\",\n            buttons:[{\n              name:'View Album', \n              primary:true, \n              onClick: ()=>{\n                dispatch(fetchUserAlbum(album_id))\n                dispatch(push(`/useralbum/${album_id}/`))\n              }\n            }]\n          })\n        );\n        dispatch(fetchUserAlbumsList());\n      })\n      .catch(err => {\n        dispatch({ type: \"EDIT_USER_ALBUMS_LIST_REJECTED\", payload: err });\n      });\n  };\n}\n\nexport function fetchPlaceAlbumsList() {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_PLACE_ALBUMS_LIST\" });\n    Server.get(\"albums/place/list/\")\n      .then(response => {\n        var byGeolocationLevel = _.groupBy(\n          response.data.results,\n          el => el.geolocation_level\n        );\n        dispatch({\n          type: \"GROUP_PLACE_ALBUMS_BY_GEOLOCATION_LEVEL\",\n          payload: byGeolocationLevel\n        });\n        dispatch({\n          type: \"FETCH_PLACE_ALBUMS_LIST_FULFILLED\",\n          payload: response.data.results\n        });\n      })\n      .catch(err => {\n        dispatch({ type: \"FETCH_PLACE_ALBUMS_LIST_REJECTED\", payload: err });\n      });\n  };\n}\n\nexport function fetchPlaceAlbum(album_id) {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_PLACE_ALBUMS\" });\n    Server.get(`albums/place/${album_id}/`)\n      .then(response => {\n        dispatch({\n          type: \"FETCH_PLACE_ALBUMS_FULFILLED\",\n          payload: response.data\n        });\n      })\n      .catch(err => {\n        dispatch({ type: \"FETCH_PLACE_ALBUMS_REJECTED\", payload: err });\n      });\n  };\n}\n\nexport function fetchPeopleAlbums(person_id) {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_PEOPLE_ALBUMS\" });\n    Server.get(`albums/person/${person_id}/`)\n      .then(response => {\n        dispatch({\n          type: \"FETCH_PEOPLE_ALBUMS_FULFILLED\",\n          payload: response.data\n        });\n      })\n      .catch(err => {\n        dispatch({ type: \"FETCH_PEOPLE_ALBUMS_REJECTED\", payload: err });\n      });\n  };\n}\n\nexport function generateAutoAlbums() {\n  return function(dispatch) {\n    dispatch({ type: \"GENERATE_AUTO_ALBUMS\" });\n    Server.get(\"autoalbumgen/\")\n      .then(response => {\n        dispatch({\n          type: \"GENERATE_AUTO_ALBUMS_FULFILLED\",\n          payload: response.data\n        });\n        dispatch(fetchAutoAlbums());\n      })\n      .catch(err => {\n        dispatch({ type: \"GENERATE_AUTO_ALBUMS_REJECTED\", payload: err });\n      });\n  };\n}\n\nexport function fetchAutoAlbums() {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_AUTO_ALBUMS\" });\n    Server.get(\"albums/auto/?page_size=50\")\n      .then(response => {\n        dispatch({\n          type: \"FETCH_AUTO_ALBUMS_FULFILLED\",\n          payload: response.data.results\n        });\n      })\n      .catch(err => {\n        dispatch({ type: \"FETCH_AUTO_ALBUMS_REJECTED\", payload: err });\n      });\n  };\n}\n\n//actions using new list view in backend\n\nexport function fetchAutoAlbumsList() {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_AUTO_ALBUMS_LIST\" });\n    Server.get(\"albums/auto/list/\")\n      .then(response => {\n        dispatch({\n          type: \"FETCH_AUTO_ALBUMS_LIST_FULFILLED\",\n          payload: response.data.results\n        });\n      })\n      .catch(err => {\n        dispatch({ type: \"FETCH_AUTO_ALBUMS_LIST_REJECTED\", payload: err });\n      });\n  };\n}\n\nexport function fetchDateAlbumsList() {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_DATE_ALBUMS_LIST\" });\n    Server.get(\"albums/date/list/\", { timeout: 100000 })\n      .then(response => {\n        dispatch({\n          type: \"FETCH_DATE_ALBUMS_LIST_FULFILLED\",\n          payload: response.data.results\n        });\n      })\n      .catch(err => {\n        dispatch({ type: \"FETCH_DATE_ALBUMS_LIST_REJECTED\", payload: err });\n      });\n  };\n}\n\nexport function fetchDateAlbumsPhotoHashList() {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_DATE_ALBUMS_PHOTO_HASH_LIST\" });\n    Server.get(\"albums/date/photohash/list/\", { timeout: 100000 })\n      .then(response => {\n        var idx2hash = [];\n        response.data.results.forEach(day => {\n          day.photos.forEach(photo => {\n            idx2hash.push(photo.image_hash);\n          });\n        });\n        dispatch({\n          type: \"FETCH_DATE_ALBUMS_PHOTO_HASH_LIST_FULFILLED\",\n          payload: response.data.results\n        });\n        dispatch({ type: \"SET_IDX_TO_IMAGE_HASH\", payload: idx2hash });\n      })\n      .catch(err => {\n        dispatch({\n          type: \"FETCH_DATE_ALBUMS_PHOTO_HASH_LIST_REJECTED\",\n          payload: err\n        });\n      });\n  };\n}\n\n//actions using new retrieve view in backend\nexport function fetchAlbumsAutoGalleries(album_id) {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_AUTO_ALBUMS_RETRIEVE\" });\n\n    Server.get(`albums/auto/${album_id}/`)\n      .then(response => {\n        dispatch({\n          type: \"FETCH_AUTO_ALBUMS_RETRIEVE_FULFILLED\",\n          payload: response.data\n        });\n      })\n      .catch(err => {\n        dispatch({ type: \"FETCH_AUTO_ALBUMS_RETRIEVE_REJECTED\", payload: err });\n      });\n  };\n}\n\nexport function fetchAlbumsDateGalleries(album_id) {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_DATE_ALBUMS_RETRIEVE\" });\n    Server.get(`albums/date/${album_id}/`)\n      .then(response => {\n        dispatch({\n          type: \"FETCH_DATE_ALBUMS_RETRIEVE_FULFILLED\",\n          payload: response.data\n        });\n      })\n      .catch(err => {\n        dispatch({ type: \"FETCH_DATE_ALBUMS_RETRIEVE_REJECTED\", payload: err });\n      });\n  };\n}\n\nexport function toggleAlbumAutoFavorite(album_id, rating) {\n  return function(dispatch) {\n    dispatch({ type: \"TOGGLE_ALBUM_AUTO_FAVORITE\" });\n    Server.patch(`albums/auto/list/${album_id}/`, { favorited: rating })\n      .then(response => {\n        dispatch({\n          type: \"TOGGLE_ALBUM_AUTO_FAVORITE_FULFILLED\",\n          payload: response.data\n        });\n      })\n      .catch(err => {\n        dispatch({ type: \"TOGGLE_ALBUM_AUTO_FAVORITE_REJECTED\", payload: err });\n      });\n  };\n}\n\n// share user album\nexport function setUserAlbumShared(album_id, target_user_id, val_shared) {\n  return function(dispatch) {\n    dispatch({ type: \"SET_ALBUM_USER_SHARED\" });\n    Server.post(\"useralbum/share/\", {\n      shared: val_shared,\n      album_id: album_id,\n      target_user_id: target_user_id\n    })\n      .then(response => {\n        dispatch({ type: \"SET_ALBUM_USER_SHARED_FULFILLED\", payload: response.data });\n        dispatch(fetchUserAlbum(album_id))\n\n        if (val_shared) {\n            dispatch(\n            notify({\n                message: `Album was successfully shared`,\n                title: \"Share album\",\n                status: \"success\",\n                dismissible: true,\n                dismissAfter: 3000,\n                position: \"br\"\n            })\n            );\n        } else {\n            dispatch(\n            notify({\n                message: `Album was successfully unshared`,\n                title: \"Unshare album\",\n                status: \"success\",\n                dismissible: true,\n                dismissAfter: 3000,\n                position: \"br\"\n            })\n            );\n        }\n        \n      })\n      .catch(err => {\n        dispatch({ type: \"SET_ALBUM_USER_SHARED_FULFILLED\", payload: err})\n        console.log(err.content)\n      });\n  };\n}\n\n\n\n//sharing\nexport function fetchUserAlbumsSharedToMe() {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_ALBUMS_SHARED_TO_ME\" });\n    Server.get(\"/albums/user/shared/tome/\")\n      .then(response => {\n        const sharedAlbumssGroupedByOwner = _\n        .toPairs(_.groupBy(response.data.results, \"owner.id\"))\n        .map(el => {\n          return { user_id: parseInt(el[0]), albums: el[1] };\n        });\n        console.log(sharedAlbumssGroupedByOwner)\n\n\n\n        dispatch({\n          type: \"FETCH_ALBUMS_SHARED_TO_ME_FULFILLED\",\n          payload: sharedAlbumssGroupedByOwner\n        });\n      })\n      .catch(err => {\n        dispatch({ type: \"FETCH_ALBUMS_SHARED_TO_ME_REJECTED\", payload: err });\n      });\n  };\n}\n\nexport function fetchUserAlbumsSharedFromMe() {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_ALBUMS_SHARED_FROM_ME\" });\n    Server.get(\"/albums/user/shared/fromme/\")\n      .then(response => {\n        console.log(response.data.results)\n        dispatch({\n          type: \"FETCH_ALBUMS_SHARED_FROM_ME_FULFILLED\",\n          payload: response.data.results\n        });\n      })\n      .catch(err => {\n        dispatch({ type: \"FETCH_ALBUMS_SHARED_FROM_ME_REJECTED\", payload: err });\n      });\n  };\n}\n"
  },
  {
    "path": "src/actions/authActions.js",
    "content": "import { push } from 'react-router-redux';\nimport { Server } from '../api_client/apiClient';\n\n\n\n\n\n\nexport const LOGIN_REQUEST = '@@auth/LOGIN_REQUEST';\nexport const LOGIN_SUCCESS = '@@auth/LOGIN_SUCCESS';\nexport const LOGIN_FAILURE = '@@auth/LOGIN_FAILURE';\n\nexport const TOKEN_REQUEST = '@@auth/TOKEN_REQUEST';\nexport const TOKEN_RECEIVED = '@@auth/TOKEN_RECEIVED';\nexport const TOKEN_FAILURE = '@@auth/TOKEN_FAILURE';\n\n// export const login = (username, password) => ({\n//     [RSAA]: {\n//         endpoint: serverAddress+'/api/auth/token/obtain/',\n//         method: 'POST',\n//         body: JSON.stringify({username, password}),\n//         headers: { 'Content-Type': 'application/json' },\n//         types: [\n//             LOGIN_REQUEST, LOGIN_SUCCESS, LOGIN_FAILURE\n//         ]\n//     }\n// })\n\n// export const refreshAccessToken = (token) => ({\n//     [RSAA]: {\n//         endpoint: serverAddress+'/api/auth/token/refresh/',\n//         method: 'POST',\n//         body: JSON.stringify({refresh: token}),\n//         headers: { 'Content-Type': 'application/json' },\n//         types: [\n//             TOKEN_REQUEST, TOKEN_RECEIVED, TOKEN_FAILURE\n//         ]\n//     }\n// })\n\n\nexport function signup(username,password,email,firstname,lastname) {\n  return function(dispatch) {\n    dispatch({type:\"SIGNUP\"})\n    Server.post('/user/', {email:email, \n        username:username, \n        password:password, \n        scan_directory:'initial',\n        first_name:firstname,\n        last_name:lastname})\n      .then((response) => {\n        dispatch({type: \"SIGNUP_FULFILLED\", payload: response.data})\n        dispatch(push('/login'))\n      })\n      .catch((err) => {\n        dispatch({type: \"SIGNUP_REJECTED\", payload: err})\n      })\n  }\n}\n\nexport function login(username,password,from) {\n  return function(dispatch) {\n    dispatch({type:\"LOGIN\"})\n    Server.post('/auth/token/obtain/', {username:username, password:password})\n      .then((response) => {\n        dispatch({type: \"LOGIN_FULFILLED\", payload: response.data})\n        dispatch(push(from))\n      })\n      .catch((err) => {\n        dispatch({type: \"LOGIN_REJECTED\", payload: err})\n      })\n  }\n}\n\n\nexport function refreshAccessToken(token) {\n  return function(dispatch) {\n    dispatch({type:\"REFRESH_ACCESS_TOKEN\"})\n    Server.post('/auth/token/refresh/', {refresh:token})\n      .then((response) => {\n        dispatch({type: \"REFRESH_ACCESS_TOKEN_FULFILLED\", payload: response.data})\n      })\n      .catch((err) => {\n        dispatch({type: \"REFRESH_ACCESS_TOKEN_REJECTED\", payload: err})\n      })\n  }\n}\n\nexport function logout() {\n  return function(dispatch) {\n    dispatch({type:\"LOGOUT\"})\n  }\n}\n\n//auth.tokens.authentication_token\n"
  },
  {
    "path": "src/actions/facesActions.js",
    "content": "import { notify } from \"reapop\";\nimport { Server } from \"../api_client/apiClient\";\nimport { fetchPeople } from \"./peopleActions\";\n\nexport function setFacesPersonLabel(faceIDs, personName) {\n  return function(dispatch) {\n    dispatch({ type: \"SET_FACES_PERSON_LABEL\" });\n    Server.post(\"labelfaces/\", { person_name: personName, face_ids: faceIDs })\n      .then(response => {\n        dispatch({\n          type: \"SET_FACES_PERSON_LABEL_FULFILLED\",\n          payload: response.data.results\n        });\n        dispatch(\n          notify({\n            message: `${\n              faceIDs.length\n            } face(s) were successfully labeled as person \"${personName}\"`,\n            title: \"Face label\",\n            status: \"success\",\n            dismissible: true,\n            dismissAfter: 3000,\n            position: \"br\"\n          })\n        );\n      })\n      .catch(err => {\n      });\n  };\n}\n\nexport function deleteFaces(faceIDs) {\n  return function(dispatch) {\n    dispatch({ type: \"DELETE_FACES\" });\n    Server.post(\"deletefaces/\", { face_ids: faceIDs })\n      .then(response => {\n        dispatch({\n          type: \"DELETE_FACES_FULFILLED\",\n          payload: response.data.results\n        });\n        dispatch(\n          notify({\n            message: `${\n              response.data.results.length\n            } face(s) were successfully deleted`,\n            title: \"Face delete\",\n            status: \"success\",\n            dismissible: true,\n            dismissAfter: 3000,\n            position: \"br\"\n          })\n        );\n      })\n      .catch(err => {\n      });\n  };\n}\n\nexport function trainFaces() {\n  return function(dispatch) {\n    dispatch({ type: \"TRAIN_FACES\" });\n    dispatch({ type: \"SET_WORKER_AVAILABILITY\", payload: false });\n    dispatch({\n      type: \"SET_WORKER_RUNNING_JOB\",\n      payload: { job_type_str: \"Train Faces\" }\n    });\n\n    dispatch(\n      notify({\n        message: `Training started`,\n        title: \"Face training\",\n        status: \"success\",\n        dismissible: true,\n        dismissAfter: 3000,\n        position: \"br\"\n      })\n    );\n    Server.get(\"trainfaces/\", { timeout: 30000 })\n      .then(response => {\n        dispatch({ type: \"TRAIN_FACES_FULFILLED\", payload: response.data });\n        // dispatch(notify({\n        //   message:`Training finished`,\n        //   title:'Face training',\n        //   status:'success',\n        //   dismissible: true,\n        //   dismissAfter:3000,\n        //   position:'br'}))\n        // dispatch(fetchInferredFacesList())\n        // dispatch(fetchLabeledFacesList())\n      })\n      .catch(err => {\n        dispatch({ type: \"TRAIN_FACES_REJECTED\", payload: err });\n      });\n  };\n}\n\nexport function clusterFaces() {\n  return function(dispatch) {\n    dispatch({ type: \"CLUSTER_FACES\" });\n    Server.get(\"clusterfaces/\")\n      .then(response => {\n        dispatch({ type: \"CLUSTER_FACES_FULFILLED\", payload: response.data });\n        // dispatch(fetchInferredFaces())\n        // dispatch(fetchLabeledFaces())\n      })\n      .catch(err => {\n        dispatch({ type: \"CLUSTER_FACES_REJECTED\", payload: err });\n      });\n  };\n}\n\nexport function fetchInferredFaces() {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_INFERRED_FACES\" });\n    Server.get(\"faces/inferred/\")\n      .then(response => {\n        dispatch({\n          type: \"FETCH_INFERRED_FACES_FULFILLED\",\n          payload: response.data.results\n        });\n      })\n      .catch(err => {\n        dispatch({ type: \"FETCH_INFERRED_FACES_REJECTED\", payload: err });\n      });\n  };\n}\n\nexport function fetchLabeledFaces() {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_LABELED_FACES\" });\n    Server.get(\"faces/labeled/\")\n      .then(response => {\n        dispatch({\n          type: \"FETCH_LABELED_FACES_FULFILLED\",\n          payload: response.data.results\n        });\n      })\n      .catch(err => {\n        dispatch({ type: \"FETCH_LABELED_FACES_REJECTED\", payload: err });\n      });\n  };\n}\n\nexport function fetchFaces() {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_FACES\" });\n    Server.get(\"faces/?page_size=20\")\n      .then(response => {\n        dispatch({\n          type: \"FETCH_FACES_FULFILLED\",\n          payload: response.data.results\n        });\n      })\n      .catch(err => {\n        dispatch({ type: \"FETCH_FACES_REJECTED\", payload: err });\n      });\n  };\n}\n\n// fast face list views\nexport function fetchInferredFacesList() {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_INFERRED_FACES_LIST\" });\n    Server.get(\"faces/inferred/list/\")\n      .then(response => {\n        dispatch({\n          type: \"FETCH_INFERRED_FACES_LIST_FULFILLED\",\n          payload: response.data.results\n        });\n      })\n      .catch(err => {\n        dispatch({ type: \"FETCH_INFERRED_FACES_LIST_REJECTED\", payload: err });\n      });\n  };\n}\n\nexport function fetchLabeledFacesList() {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_LABELED_FACES_LIST\" });\n    Server.get(\"faces/labeled/list/\")\n      .then(response => {\n        dispatch({\n          type: \"FETCH_LABELED_FACES_LIST_FULFILLED\",\n          payload: response.data.results\n        });\n      })\n      .catch(err => {\n        dispatch({ type: \"FETCH_LABELED_FACES_LIST_REJECTED\", payload: err });\n      });\n  };\n}\n\nexport function fetchFacesList() {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_FACES_LIST\" });\n    Server.get(\"faces/list/\")\n      .then(response => {\n        dispatch({\n          type: \"FETCH_FACES_LIST_FULFILLED\",\n          payload: response.data.results\n        });\n      })\n      .catch(err => {\n        dispatch({ type: \"FETCH_FACES_LIST_REJECTED\", payload: err });\n      });\n  };\n}\n\n//fetches a face to label from the server\nexport function fetchFaceToLabel() {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_FACE_TO_LABEL\" });\n    Server.get(\"facetolabel/\")\n      .then(response => {\n        dispatch({\n          type: \"FETCH_FACE_TO_LABEL_FULFILLED\",\n          payload: response.data\n        });\n      })\n      .catch(err => {\n        dispatch({ type: \"FETCH_FACE_TO_LABEL_REJECTED\", payload: err });\n      });\n  };\n}\n\n//loads face to label onclick of the face icons\nexport function loadFaceToLabel(face) {\n  return function(dispatch) {\n    dispatch({ type: \"LOAD_FACE_TO_LABEL\", payload: face });\n  };\n}\n\nexport function deleteFaceAndFetchNext(face_id) {\n  return function(dispatch) {\n    dispatch({ type: \"DELETE_FACE\", payload: face_id });\n    Server.delete(`faces/${face_id}/`)\n      .then(response => {\n        dispatch({ type: \"DELETE_FACE_FULFILLED\" });\n        dispatch(fetchInferredFacesList());\n        dispatch(fetchLabeledFacesList());\n        dispatch(fetchFaceToLabel());\n      })\n      .catch(err => {\n        dispatch({ type: \"DELETE_FACE_REJECTED\" });\n      });\n  };\n}\n\nexport function labelFacePerson(face_id, person_name) {\n  return function(dispatch) {\n    dispatch({ type: \"LABEL_FACE_PERSON\" });\n    var endpoint = `faces/${face_id}/`;\n    Server.patch(endpoint, { person: { name: person_name } })\n      .then(response => {\n        dispatch({\n          type: \"LABEL_FACE_PERSON_FULFILLED\",\n          payload: response.data\n        });\n      })\n      .catch(err => {\n        dispatch({ type: \"LABEL_FACE_PERSON_REJECTED\", payload: err });\n      });\n  };\n}\n\nexport function labelFacePersonAndFetchNext(face_id, person_name) {\n  return function(dispatch) {\n    dispatch({ type: \"LABEL_FACE_PERSON\" });\n    var endpoint = `faces/${face_id}/`;\n    Server.patch(endpoint, { person: { name: person_name } })\n      .then(response1 => {\n        dispatch({\n          type: \"LABEL_FACE_PERSON_FULFILLED\",\n          payload: response1.data\n        });\n        dispatch({ type: \"FETCH_FACE_TO_LABEL\" });\n        Server.get(\"facetolabel/\")\n          .then(response2 => {\n            dispatch({\n              type: \"FETCH_FACE_TO_LABEL_FULFILLED\",\n              payload: response2.data\n            });\n            dispatch(fetchInferredFacesList());\n            dispatch(fetchLabeledFacesList());\n          })\n          .catch(err2 => {\n            dispatch({ type: \"FETCH_FACE_TO_LABEL_REJECTED\", payload: err2 });\n          });\n      })\n      .catch(err1 => {\n        dispatch({ type: \"LABEL_FACE_PERSON_REJECTED\", payload: err1 });\n      });\n  };\n}\n"
  },
  {
    "path": "src/actions/peopleActions.js",
    "content": "import axios from \"axios\";\nimport {Server} from '../api_client/apiClient'\n\n\nexport function fetchPeople() {\n  return function(dispatch) {\n    dispatch({type: \"FETCH_PEOPLE\"});\n    Server.get(\"persons/?page_size=1000\")\n      .then((response) => {\n        var mappedPeopleDropdownOptions = response.data.results.map(function(person){\n          return (\n            {\n              key:person.id,\n              value:person.name,\n              text:person.name,\n              face_url:person.face_url,\n              face_count:person.face_count,\n              face_photo_url:person.face_photo_url\n            }\n          )\n        })\n        dispatch({type: \"FETCH_PEOPLE_FULFILLED\", payload: mappedPeopleDropdownOptions})\n      })\n      .catch((err) => {\n        dispatch({type: \"FETCH_PEOPLE_REJECTED\", payload: err})\n      })\n  }\n}\n\n\n\nexport function addPerson(person_name) {\n  return function(dispatch){\n    dispatch({type:\"ADD_PERSON\"})\n    Server.post(\"persons/\",{\"name\":person_name})\n      .then((response) => {\n        const personDropdownOption = {\n          text:response.data.name, \n          value:response.data.name, \n          key:response.data.id}\n        dispatch({type: \"ADD_PERSON_FULFILLED\", payload:personDropdownOption})\n      })\n      .catch((err) => {\n        dispatch({type:\"ADD_PERSON_REJECTED\", payload:err})\n      })\n  }\n}\n\nexport function deletePerson(person_id) {\n  return function(dispatch){\n    dispatch({type:\"DELETE_PERSON\"})\n    Server.delete(`persons/${person_id}/`)\n      .then((response) => {\n        dispatch(fetchPeople())\n        dispatch({type: \"DELETE_PERSON_FULFILLED\"})\n      })\n      .catch((err) => {\n        dispatch({type:\"DELETE_PERSON_REJECTED\", payload:err})\n      })\n  }\n}\n\n\nexport function addPersonAndSetLabelToFace(person_name,face_id) {\n  return function(dispatch){\n    dispatch({type:\"ADD_PERSON_AND_SET_FACE_LABEL\"})\n    // Make post request to /persons/\n    Server.post(\"persons/\",{\"name\":person_name})\n      .then((response1) => {\n        var personDropdownOption1 = {\n          text: response1.data.name,\n          value: response1.data.name,\n          key: response1.data.id}\n        // Make patch request to update person label \n        var endpoint = `faces/${face_id}/`\n        Server.patch(endpoint,{\"person\":{\"name\":person_name}})\n          .then((response2) => {\n            var personDropdownOption2 = {\n              text: response2.data.person.name,\n              value: response2.data.person.name,\n              key: response2.data.person.id}\n            dispatch({type: \"ADD_PERSON_AND_SET_FACE_LABEL_FULFILLED\", payload: personDropdownOption2})\n          })\n          .catch((err2) => {\n            dispatch({type: \"ADD_PERSON_AND_SET_FACE_LABEL_REJECTED\", payload: err2})\n          })\n      })\n      .catch((err1) => {\n        dispatch({type:\"ADD_PERSON_AND_SET_FACE_LABEL_REJECTED\", payload:err1})\n      })\n  }\n}\n\n\nexport function fetchSocialGraph() {\n  return function(dispatch) {\n    dispatch({type: \"FETCH_SOCIAL_GRAPH\"});\n    Server.get(\"socialgraph\")\n      .then((response) => {\n        dispatch({type: \"FETCH_SOCIAL_GRAPH_FULFILLED\", payload: response.data})\n      })\n      .catch((err) => {\n        dispatch({type: \"FETCH_SOCIAL_GRAPH_REJECTED\", payload: err})\n      })\n  }\n}\n\n\n\n\nexport function fetchEgoGraph(person_id) {\n  return function(dispatch) {\n    dispatch({type: \"FETCH_EGO_GRAPH\"});\n    Server.get(`egograph/?person_id=${person_id}`)\n      .then((response) => {\n        dispatch({type: \"FETCH_EGO_GRAPH_FULFILLED\", payload: {person_id:person_id,data:response.data}})\n      })\n      .catch((err) => {\n        dispatch({type: \"FETCH_EGO_GRAPH_REJECTED\", payload: err})\n      })\n  }\n}\n"
  },
  {
    "path": "src/actions/photosActions.js",
    "content": "import axios from \"axios\";\nimport { Server, serverAddress } from \"../api_client/apiClient\";\nimport _ from \"lodash\";\nimport moment from \"moment\";\nimport { notify } from \"reapop\";\n\nimport { fetchDateAlbumsPhotoHashList } from \"./albumsActions\";\nimport { copyToClipboard } from \"../util/util\";\n\nexport function setPhotosShared(image_hashes, val_shared, target_user) {\n  return function(dispatch) {\n    dispatch({ type: \"SET_PHOTOS_SHARED\" });\n    Server.post(`photosedit/shared/`, {\n      image_hashes: image_hashes,\n      shared: val_shared,\n      target_user_id: target_user.id\n    })\n      .then(response => {\n        dispatch({\n          type: \"SET_PHOTOS_SHARED_FULFILLED\",\n          payload: {\n            image_hashes: image_hashes,\n            shared: val_shared,\n            updatedPhotos: response.data.results\n          }\n        });\n        if (val_shared) {\n          var notificationMessage =\n            \"were successfully shared with \" + target_user.username;\n        } else {\n          var notificationMessage =\n            \"were successfully unshared with \" + target_user.username;\n        }\n        dispatch(\n          notify({\n            message: `${image_hashes.length} photo(s) ` + notificationMessage,\n            title: \"Shared photos\",\n            status: \"success\",\n            dismissible: true,\n            dismissAfter: 3000,\n            position: \"br\"\n          })\n        );\n        if (image_hashes.length === 1) {\n          dispatch(fetchPhotoDetail(image_hashes[0]));\n        }\n      })\n      .catch(err => {\n        dispatch({ type: \"SET_PHOTOS_SHARED_REJECTED\", payload: err });\n      });\n  };\n}\n\nexport function fetchRecentlyAddedPhotos() {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_RECENTLY_ADDED_PHOTOS\" })\n    Server.get(\"photos/recentlyadded/\")\n      .then(response=>{\n        const res = \n          _.toPairs(\n            _.groupBy(response.data.results,el=>moment(el.added_on).format('YYYY-MM-DD'))\n          ).map(pair=>{\n            return {\n              date: pair[0],\n              photos: pair[1],\n              location: null\n            }\n          })\n        var idx2hash = [];\n        res.forEach(day => {\n          day.photos.forEach(photo => {\n            idx2hash.push(photo.image_hash);\n          });\n        });\n\n        dispatch({ type: \"FETCH_RECENTLY_ADDED_PHOTOS_FULFILLED\", payload: {res:res, idx2hash:idx2hash} })\n      })\n      .catch(error=>{\n        dispatch({ type: \"FETCH_RECENTLY_ADDED_PHOTOS_REJECTED\", payload: error })\n      })\n  }\n}\n\nexport function fetchPhotosSharedToMe() {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_PHOTOS_SHARED_TO_ME\" });\n    Server.get(\"photos/shared/tome/\")\n      .then(response => {\n        const sharedPhotosGroupedByOwner = _\n          .toPairs(_.groupBy(response.data.results, \"owner.id\"))\n          .map(el => {\n            return { user_id: parseInt(el[0]), photos: el[1] };\n          });\n\n        dispatch({\n          type: \"FETCH_PHOTOS_SHARED_TO_ME_FULFILLED\",\n          payload: sharedPhotosGroupedByOwner\n        });\n      })\n      .catch(err => {\n        dispatch({\n          type: \"FETCH_PHOTOS_SHARED_TO_ME_REJECTED\",\n          payload: err\n        });\n      });\n  };\n}\n\nexport function fetchPhotosSharedFromMe() {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_PHOTOS_SHARED_FROM_ME\" });\n    Server.get(\"photos/shared/fromme/\")\n      .then(response => {\n\n        const sharedPhotosGroupedBySharedTo = _\n          .toPairs(_.groupBy(response.data.results, \"user_id\"))\n          .map(el => {\n            return { user_id: parseInt(el[0]), photos: el[1].map(item=>{\n              return {...item.photo,shared_to:item.user}\n            }) \n          };\n          });\n        \n          console.log(sharedPhotosGroupedBySharedTo)\n\n        dispatch({\n          type: \"FETCH_PHOTOS_SHARED_FROM_ME_FULFILLED\",\n          payload: sharedPhotosGroupedBySharedTo\n        });\n      })\n      .catch(err => {\n        dispatch({\n          type: \"FETCH_PHOTOS_SHARED_FROM_ME_REJECTED\",\n          payload: err\n        });\n      });\n  };\n}\n\n\n\nexport function setPhotosPublic(image_hashes, val_public) {\n  return function(dispatch) {\n    dispatch({ type: \"SET_PHOTOS_PUBLIC\" });\n    Server.post(`photosedit/makepublic/`, {\n      image_hashes: image_hashes,\n      val_public: val_public\n    })\n      .then(response => {\n        dispatch({\n          type: \"SET_PHOTOS_PUBLIC_FULFILLED\",\n          payload: {\n            image_hashes: image_hashes,\n            val_public: val_public,\n            updatedPhotos: response.data.updated\n          }\n        });\n        if (val_public) {\n          var notificationMessage =\n            \"were successfully added to your public photos. Links to the photos were copied to the clipboard.\";\n          // console.log('links to copy')\n          // console.log(image_hashes.map(ih=>{return serverAddress+'/media/photos/'+ih+'.jpg'}).join(' '))\n          const linksToCopy = image_hashes\n            .map(ih => {\n              return serverAddress.slice(2,serverAddress.length) + \"/media/photos/\" + ih + \".jpg\";\n            })\n            .join(\" \");\n\n          // copyToClipboard(image_hashes.map(ih=>{return serverAddress+'/media/photos/'+ih+'.jpg'}).join(' '))\n          // copyToClipboard('helaelkqwjelkrqwer')\n        } else {\n          var notificationMessage =\n            \"were successfully removed from your public photos\";\n        }\n        dispatch(\n          notify({\n            message: `${response.data.updated.length} photo(s) ` + notificationMessage,\n            title: \"Set photos public\",\n            status: \"success\",\n            dismissible: true,\n            dismissAfter: 3000,\n            position: \"br\"\n          })\n        );\n        if (image_hashes.length === 1) {\n          dispatch(fetchPhotoDetail(image_hashes[0]));\n        }\n      })\n      .catch(err => {\n        dispatch({ type: \"SET_PHOTOS_PUBLIC_REJECTED\", payload: err });\n      });\n  };\n}\n\nexport function setPhotosFavorite(image_hashes, favorite) {\n  return function(dispatch) {\n    dispatch({ type: \"SET_PHOTOS_FAVORITE\" });\n    Server.post(`photosedit/favorite/`, {\n      image_hashes: image_hashes,\n      favorite: favorite\n    })\n      .then(response => {\n        dispatch({\n          type: \"SET_PHOTOS_FAVORITE_FULFILLED\",\n          payload: {\n            image_hashes: image_hashes,\n            favorite: favorite,\n            updatedPhotos: response.data.updated\n          }\n        });\n        if (favorite) {\n          var notificationMessage = \"were successfully added to favorites\";\n        } else {\n          var notificationMessage = \"were successfully removed from favorites\";\n        }\n        dispatch(\n          notify({\n            message: `${response.data.updated.length} photo(s) ` + notificationMessage,\n            title: \"Favorite photos\",\n            status: \"success\",\n            dismissible: true,\n            dismissAfter: 3000,\n            position: \"br\"\n          })\n        );\n        if (image_hashes.length === 1) {\n          dispatch(fetchPhotoDetail(image_hashes[0]));\n        }\n      })\n      .catch(err => {\n        dispatch({ type: \"SET_PHOTOS_FAVORITE_REJECTED\", payload: err });\n      });\n  };\n}\n\nexport function setPhotosHidden(image_hashes, hidden) {\n  return function(dispatch) {\n    dispatch({ type: \"SET_PHOTOS_HIDDEN\" });\n    Server.post(`photosedit/hide/`, {\n      image_hashes: image_hashes,\n      hidden: hidden\n    })\n      .then(response => {\n        dispatch({\n          type: \"SET_PHOTOS_HIDDEN_FULFILLED\",\n          payload: {\n            image_hashes: image_hashes,\n            hidden: hidden,\n            updatedPhotos: response.data.updated\n          }\n        });\n        if (hidden) {\n          var notificationMessage = \"were successfully hidden\";\n        } else {\n          var notificationMessage = \"were successfully unhidden\";\n        }\n        dispatch(\n          notify({\n            message: `${response.data.updated.length} photo(s) ` + notificationMessage,\n            title: \"Hide photos\",\n            status: \"success\",\n            dismissible: true,\n            dismissAfter: 3000,\n            position: \"br\"\n          })\n        );\n        if (image_hashes.length === 1) {\n          dispatch(fetchPhotoDetail(image_hashes[0]));\n        }\n      })\n      .catch(err => {\n        dispatch({ type: \"SET_PHOTOS_HIDDEN_REJECTED\", payload: err });\n      });\n  };\n}\n\nexport function scanPhotos() {\n  return function(dispatch) {\n    dispatch({ type: \"SCAN_PHOTOS\" });\n    dispatch({ type: \"SET_WORKER_AVAILABILITY\", payload: false });\n\n    Server.get(`scanphotos/`)\n      .then(response => {\n        dispatch(\n          notify({\n            message: \"Scan Photos started\",\n            title: \"Scan Photos\",\n            status: \"success\",\n            dismissible: true,\n            dismissAfter: 3000,\n            position: \"br\"\n          })\n        );\n        dispatch({ type: \"SCAN_PHOTOS_FULFILLED\", payload: response.data });\n      })\n      .catch(err => {\n        dispatch({ type: \"SCAN_PHOTOS_REJECTED\", payload: err });\n      });\n  };\n}\n\n\nexport function scanNextcloudPhotos() {\n  return function(dispatch) {\n    dispatch({ type: \"SCAN_PHOTOS\" });\n    dispatch({ type: \"SET_WORKER_AVAILABILITY\", payload: false });\n\n    Server.get(`nextcloud/scanphotos/`)\n      .then(response => {\n        dispatch(\n          notify({\n            message: \"Scan Nextcloud Photos started\",\n            title: \"Scan Photos\",\n            status: \"success\",\n            dismissible: true,\n            dismissAfter: 3000,\n            position: \"br\"\n          })\n        );\n        dispatch({ type: \"SCAN_PHOTOS_FULFILLED\", payload: response.data });\n      })\n      .catch(err => {\n        dispatch({ type: \"SCAN_PHOTOS_REJECTED\", payload: err });\n      });\n  };\n}\n\n\nexport function fetchPhotos() {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_PHOTOS\" });\n    Server.get(\"photos/list/\", { timeout: 100000 })\n      .then(response => {\n        var t0 = performance.now();\n        const res = _.keyBy(response.data.results, \"image_hash\");\n        var t1 = performance.now();\n        dispatch({ type: \"FETCH_PHOTOS_FULFILLED\", payload: res });\n        // dispatch(fetchDateAlbumsPhotoHashList())\n      })\n      .catch(err => {\n        dispatch({ type: \"FETCH_PHOTOS_REJECTED\", payload: err });\n      });\n  };\n}\n\nexport function fetchFavoritePhotos() {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_FAVORITE_PHOTOS\" });\n    Server.get(\"photos/favorites/\", { timeout: 100000 })\n      .then(response => {\n        //var t0 = performance.now();\n        //const res = _.keyBy(response.data.results,'image_hash')\n        //var t1 = performance.now();\n        //console.log(\"Call to doSomething took \" + (t1 - t0) + \" milliseconds.\")\n        dispatch({\n          type: \"FETCH_FAVORITE_PHOTOS_FULFILLED\",\n          payload: response.data.results\n        });\n        // dispatch(fetchDateAlbumsPhotoHashList())\n      })\n      .catch(err => {\n        dispatch({ type: \"FETCH_FAVORITE_PHOTOS_REJECTED\", payload: err });\n      });\n  };\n}\n\nexport function fetchHiddenPhotos() {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_HIDDEN_PHOTOS\" });\n    Server.get(\"photos/hidden/\", { timeout: 100000 })\n      .then(response => {\n        //var t0 = performance.now();\n        //const res = _.keyBy(response.data.results,'image_hash')\n        //var t1 = performance.now();\n        //console.log(\"Call to doSomething took \" + (t1 - t0) + \" milliseconds.\")\n        dispatch({\n          type: \"FETCH_HIDDEN_PHOTOS_FULFILLED\",\n          payload: response.data.results\n        });\n        // dispatch(fetchDateAlbumsPhotoHashList())\n      })\n      .catch(err => {\n        dispatch({ type: \"FETCH_HIDDEN_PHOTOS_REJECTED\", payload: err });\n      });\n  };\n}\n\nexport function fetchPhotoDetail(image_hash) {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_PHOTO_DETAIL\", payload: image_hash });\n    Server.get(`photos/${image_hash}/`, { timeout: 100000 })\n      .then(response => {\n        dispatch({\n          type: \"FETCH_PHOTO_DETAIL_FULFILLED\",\n          payload: response.data\n        });\n      })\n      .catch(err => {\n        dispatch({ type: \"FETCH_PHOTO_DETAIL_REJECTED\", payload: err });\n      });\n  };\n}\n\nexport function simpleFetchPhotos() {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_PHOTOS\" });\n    Server.get(\"photos/\", { timeout: 100000 })\n      .then(response => {\n        dispatch({\n          type: \"FETCH_PHOTOS_FULFILLED\",\n          payload: response.data.results\n        });\n      })\n      .catch(err => {\n        dispatch({ type: \"FETCH_PHOTOS_REJECTED\", payload: err });\n      });\n  };\n}\n\nexport function fetchNoTimestampPhotoList() {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_NO_TIMESTAMP_PHOTOS\" });\n    Server.get(\"photos/notimestamp/list/\", { timeout: 100000 })\n      .then(response => {\n        dispatch({\n          type: \"FETCH_NO_TIMESTAMP_PHOTOS_FULFILLED\",\n          payload: response.data.results\n        });\n      })\n      .catch(err => {\n        dispatch({ type: \"FETCH_NO_TIMESTAMP_PHOTOS_REJECTED\", payload: err });\n      });\n  };\n}\n\nexport function generatePhotoIm2txtCaption(image_hash) {\n  return function(dispatch) {\n    dispatch({ type: \"GENERATE_PHOTO_CAPTION\"});\n    Server.post('photosedit/generateim2txt',{image_hash:image_hash})\n      .then(response => {\n        console.log(response)\n        dispatch({ type: \"GENERATE_PHOTO_CAPTION_FULFILLED\"});\n        dispatch(fetchPhotoDetail(image_hash))\n      })\n      .catch(error => {\n        dispatch({ type: \"GENERATE_PHOTO_CAPTION_REJECTED\"});\n        console.log(error)\n      })\n    \n  }\n}\n"
  },
  {
    "path": "src/actions/publicActions.js",
    "content": "import { notify } from \"reapop\";\nimport { Server } from \"../api_client/apiClient\";\nimport { fetchPeople } from \"./peopleActions\";\n\nexport function fetchUserPublicPhotos(userName) {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_USER_PUBLIC_PHOTOS\" });\n    Server.get(`photos/public/?username=${userName.toLowerCase()}`)\n      .then(response => {\n        dispatch({\n          type: \"FETCH_USER_PUBLIC_PHOTOS_FULFILLED\",\n          payload: { user: userName, photos: response.data.results }\n        });\n      })\n      .catch(err => {\n        dispatch({ type: \"FETCH_USER_PUBLIC_PHOTOS_REJECTED\" });\n      });\n  };\n}\n\nexport function fetchPublicUserList() {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_PUBLIC_USER_LIST\" });\n    Server.get(\"user/\")\n      .then(response => {\n        dispatch({\n          type: \"FETCH_PUBLIC_USER_LIST_FULFILLED\",\n          payload: response.data.results\n        });\n      })\n      .catch(err => {\n        dispatch({\n          type: \"FETCH_PUBLIC_USER_LIST_REJECTED\"\n        });\n      });\n  };\n}\n"
  },
  {
    "path": "src/actions/searchActions.js",
    "content": "import axios from \"axios\";\nimport {Server} from '../api_client/apiClient'\nimport _ from 'lodash'\nimport moment from 'moment'\n\nexport function searchPhotos(query) {\n  return function(dispatch) {\n    if (query.trim().length === 0) {\n      dispatch({type:\"SEARCH_PHOTOS_EMPTY_QUERY_ERROR\"})\n      dispatch({type:\"SEARCH_EMPTY_QUERY_ERROR\"})\n    } else {\n      var url = `photos/?search=${query}`\n      dispatch({type:\"SEARCH_PHOTOS\",payload: query});\n      Server.get(`photos/searchlist/?search=${query}`,{timeout:100000})\n        .then((response) => {\n          var groupedByDate = _.groupBy(response.data.results,(el)=>{\n            if (el.exif_timestamp) {\n                return moment.utc(el.exif_timestamp).format('YYYY-MM-DD')\n            } else {\n                return \"No Timestamp\"\n            }\n          })\n          var groupedByDateList = _.toPairsIn(groupedByDate).map((el)=>{\n            return {date:el[0],photos:el[1]}\n          })\n          var idx2hash = response.data.results.map((el)=>el.image_hash)\n\n          dispatch({type:\"SEARCH_RES_IDX2HASH\",payload: idx2hash})\n          dispatch({type:\"SEARCH_RES_GROUP_BY_DATE\",payload: groupedByDateList})\n          dispatch({type:\"SEARCH_PHOTOS_FULFILLED\",payload: response.data.results})\n        }) \n        .catch((err) => {\n          dispatch({type:\"SEARCH_PHOTOS_REJECTED\",payload: err})        \n        })\n    }\n  }\n}\n\n\nexport function searchPeople(query) {\n    return function(dispatch) {\n        if (query.trim().length === 0) {\n            dispatch({type:\"SEARCH_PHOTOS_EMPTY_QUERY_ERROR\"}) // remove this line later\n            dispatch({type:\"SEARCH_EMPTY_QUERY_ERROR\"})\n        } else {\n            var url = `persons/?search=${query}`\n            dispatch({type:\"SEARCH_PEOPLE\"})\n            Server.get(url)\n            .then((response) => {\n                var mappedPeopleDropdownOptions = response.data.results.map(function(person){\n                return (\n                    {\n                    key:person.id,\n                    value:person.name,\n                    text:person.name,\n                    face_url:person.face_url,\n                    face_count:person.face_count,\n                    face_photo_url:person.face_photo_url\n                    }\n                )\n                })\n                dispatch({type: \"SEARCH_PEOPLE_FULFILLED\", payload: mappedPeopleDropdownOptions})\n            })\n            .catch((err) => {\n                dispatch({type: \"SEARCH_PEOPLE_REJECTED\", payload: err})\n            })\n        }\n    }\n}\n\n\nexport function searchThingAlbums(query) {\n  return function(dispatch) {\n    dispatch({type:\"SEARCH_THING_ALBUMS\"});\n    Server.get(`albums/thing/list/?search=${query}`)\n      .then((response) => {\n        dispatch({type:\"SEARCH_THING_ALBUMS_FULFILLED\", payload: response.data.results})\n      })\n      .catch((err) => {\n        dispatch({type:\"SEARCH_THING_ALBUMS_REJECTED\", payload: err})        \n      })\n  }\n}\n\nexport function searchPlaceAlbums(query) {\n  return function(dispatch) {\n    dispatch({type:\"SEARCH_PLACE_ALBUMS\"});\n    Server.get(`albums/place/list/?search=${query}`)\n      .then((response) => {\n        dispatch({type:\"SEARCH_PLACE_ALBUMS_FULFILLED\", payload: response.data.results})\n      })\n      .catch((err) => {\n        dispatch({type:\"SEARCH_PLACE_ALBUMS_REJECTED\", payload: err})        \n      })\n  }\n}\n"
  },
  {
    "path": "src/actions/uiActions.js",
    "content": "export function toggleSidebar() {\n  return function(dispatch) {\n    dispatch({type:\"TOGGLE_SIDEBAR\"})\n  }\n}\n"
  },
  {
    "path": "src/actions/userActions.js",
    "content": "import { notify } from \"reapop\";\nimport { Server } from \"../api_client/apiClient\";\nimport { fetchDateAlbumsPhotoHashList } from \"./albumsActions\";\nimport { fetchInferredFacesList, fetchLabeledFacesList } from \"./facesActions\";\nimport { fetchPeople } from \"./peopleActions\";\n\nexport function fetchUserSelfDetails(user_id) {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_USER_SELF_DETAILS\" });\n    Server.get(`/user/${user_id}/`)\n      .then(response => {\n        dispatch({\n          type: \"FETCH_USER_SELF_DETAILS_FULFILLED\",\n          payload: response.data\n        });\n      })\n      .catch(error => {\n        dispatch({ type: \"FETCH_USER_SELF_DETAILS_REJECTED\", payload: error });\n      });\n  };\n}\n"
  },
  {
    "path": "src/actions/utilActions.js",
    "content": "import { notify } from \"reapop\";\nimport { Server } from \"../api_client/apiClient\";\nimport { fetchDateAlbumsPhotoHashList } from \"./albumsActions\";\nimport { fetchInferredFacesList, fetchLabeledFacesList } from \"./facesActions\";\nimport { fetchUserSelfDetails} from './userActions' ; \nimport { fetchPeople } from \"./peopleActions\";\n\n\nexport function fetchJobList(page,page_size=10) {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_JOB_LIST\" })\n    Server.get(`jobs/?page_size=${page_size}&page=${page}`)\n      .then(response=>{\n        dispatch({ type: 'FETCH_JOB_LIST_FULFILLED', payload: response.data })\n      })\n      .catch(error=>{\n        dispatch({ type: 'FETCH_JOB_LIST_REJECTED', payload: error})\n      })\n  }\n}\n\nexport function deleteJob(job_id,page=1,page_size=10) {\n  return function(dispatch) {\n    dispatch({ type: \"DELETE_JOB\" })\n    Server.delete(`jobs/${job_id}`)\n      .then(response=>{\n        dispatch(fetchJobList(page,page_size))\n        dispatch({ type: 'DELETE_JOB_FULFILLED', payload: response.data })\n      })\n      .catch(error=>{\n        dispatch({ type: 'DELETE_JOB_REJECTED', payload: error})\n      })\n  }\n}\n\n\nexport function setSiteSettings(siteSettings) {\n  return function(dispatch) {\n    dispatch({ type: \"SET_SITE_SETTINGS\" });\n    Server.post(\"sitesettings/\",siteSettings)\n      .then(response => {\n        dispatch({\n          type: \"SET_SITE_SETTINGS_FULFILLED\",\n          payload: response.data\n        });\n      })\n      .catch(error => {\n        dispatch({ type: \"SET_SITE_SETTINGS_REJECTED\", payload: error });\n      });\n  };\n}\n\n\nexport function fetchSiteSettings() {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_SITE_SETTINGS\" });\n    Server.get(\"sitesettings/\")\n      .then(response => {\n        dispatch({\n          type: \"FETCH_SITE_SETTINGS_FULFILLED\",\n          payload: response.data\n        });\n      })\n      .catch(error => {\n        dispatch({ type: \"FETCH_SITE_SETTINGS_REJECTED\", payload: error });\n      });\n  };\n}\n\n\n// Todo: put this under userActions.js\nexport function fetchUserList() {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_USER_LIST\" });\n    Server.get(\"user/\")\n      .then(response => {\n        dispatch({\n          type: \"FETCH_USER_LIST_FULFILLED\",\n          payload: response.data.results\n        });\n      })\n      .catch(error => {\n        dispatch({ type: \"FETCH_USER_LIST_REJECTED\", payload: error });\n      });\n  };\n}\n\nexport function fetchDirectoryTree() {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_DIRECTORY_TREE\" });\n    Server.get(\"dirtree/\")\n      .then(response => {\n        dispatch({\n          type: \"FETCH_DIRECTORY_TREE_FULFILLED\",\n          payload: response.data\n        });\n      })\n      .catch(error => {\n        dispatch({ type: \"FETCH_DIRECTORY_TREE_REJECTED\", payload: error });\n      });\n  };\n}\n\n\nexport function fetchNextcloudDirectoryTree(path) {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_NEXTCLOUD_DIRECTORY_TREE\" });\n    Server.get(`nextcloud/listdir/?path=${path}`)\n      .then(response => {\n        dispatch({\n          type: \"FETCH_NEXTCLOUD_DIRECTORY_TREE_FULFILLED\",\n          payload: response.data\n        });\n      })\n      .catch(error => {\n        dispatch({ type: \"FETCH_NEXTCLOUD_DIRECTORY_TREE_REJECTED\", payload: error });\n      });\n  };\n}\n\n\nexport function updateUser(user) {\n  return function(dispatch) {\n    dispatch({ type: \"UPDATE_USER\" });\n    console.log(user)\n\n    Server.patch(`user/${user.id}/`,user)\n      .then(response => {\n        dispatch({\n          type: \"UPDATE_USER_FULFILLED\",\n          payload: response.data\n        });\n        dispatch(fetchUserList())\n        dispatch(fetchNextcloudDirectoryTree('/'))\n        dispatch(\n          notify({\n            message: `${user.username}'s information was successfully updated`,\n            title: 'Update user',\n            status: \"success\",\n            dismissible: true,\n            dismissAfter: 3000,\n            position: \"br\"\n          })\n        )\n        dispatch(fetchUserSelfDetails(user.id))\n      })\n      .catch(error => {\n        dispatch({ type: \"UPDATE_USER_REJECTED\", payload: error });\n      });\n  };\n}\n\n\nexport function manageUpdateUser(user) {\n  return function(dispatch) {\n    dispatch({ type: \"UPDATE_USER\" });\n    console.log(user)\n\n    Server.patch(`manage/user/${user.id}/`,user)\n      .then(response => {\n        dispatch({\n          type: \"UPDATE_USER_FULFILLED\",\n          payload: response.data\n        });\n        dispatch(fetchUserList())\n        dispatch(\n          notify({\n            message: `${user.username}'s information was successfully updated`,\n            title: 'Update user',\n            status: \"success\",\n            dismissible: true,\n            dismissAfter: 3000,\n            position: \"br\"\n          })\n        )\n      })\n      .catch(error => {\n        dispatch({ type: \"UPDATE_USER_REJECTED\", payload: error });\n      });\n  };\n}\n\n\n\nexport function fetchWorkerAvailability(prevRunningJob) {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_WORKER_AVAILABILITY\" });\n    Server.get(\"rqavailable/\")\n      .then(response => {\n        if (prevRunningJob !== null && response.data.job_detail === null) {\n          dispatch(\n            notify({\n              message: prevRunningJob.job_type_str + \" finished.\",\n              title: prevRunningJob.job_type_str,\n              status: \"success\",\n              dismissible: true,\n              dismissAfter: 3000,\n              position: \"br\"\n            })\n          );\n          if (prevRunningJob.job_type_str.toLowerCase() === \"train faces\") {\n            dispatch(fetchLabeledFacesList());\n            dispatch(fetchInferredFacesList());\n            dispatch(fetchPeople())\n          }\n          if (prevRunningJob.job_type_str.toLowerCase() === \"scan photos\") {\n            dispatch(fetchDateAlbumsPhotoHashList());\n            dispatch(rebuildSimilarityIndex())\n          }\n        }\n\n        if (response.data.job_detail) {\n          dispatch({ type: \"SET_WORKER_AVAILABILITY\", payload: false });\n        } else {\n          dispatch({ type: \"SET_WORKER_AVAILABILITY\", payload: true });\n        }\n        dispatch({\n          type: \"SET_WORKER_RUNNING_JOB\",\n          payload: response.data.job_detail\n        });\n        // console.log(prevRunningJob);\n        // console.log(response.data.job_detail);\n      })\n      .catch(error => {\n        dispatch({ type: \"SET_WORKER_AVAILABILITY\", payload: false });\n      });\n  };\n}\n\nexport function generateEventAlbums() {\n  return function(dispatch) {\n    dispatch({ type: \"GENERATE_EVENT_ALBUMS\" });\n    dispatch({ type: \"SET_WORKER_AVAILABILITY\", payload: false });\n    dispatch({\n      type: \"SET_WORKER_RUNNING_JOB\",\n      payload: { job_type_str: \"Generate Event Albums\" }\n    });\n    Server.get(`autoalbumgen/`)\n      .then(response => {\n        dispatch(\n          notify({\n            message: \"Generate Event Albums started\",\n            title: \"Generate Event Albums\",\n            status: \"success\",\n            dismissible: true,\n            dismissAfter: 3000,\n            position: \"br\"\n          })\n        );\n        dispatch({\n          type: \"GENERATE_EVENT_ALBUMS_FULFILLED\",\n          payload: response.data\n        });\n      })\n      .catch(err => {\n        dispatch({ type: \"GENERATE_EVENT_ALBUMS_REJECTED\", payload: err });\n      });\n  };\n}\n\nexport function generateEventAlbumTitles() {\n  return function(dispatch) {\n    dispatch({ type: \"GENERATE_EVENT_ALBUMS_TITLES\" });\n    dispatch({ type: \"SET_WORKER_AVAILABILITY\", payload: false });\n    dispatch({\n      type: \"SET_WORKER_RUNNING_JOB\",\n      payload: { job_type_str: \"Regenerate Event Titles\" }\n    });\n\n    Server.get(\"autoalbumtitlegen/\")\n      .then(response => {\n        dispatch(\n          notify({\n            message: \"Regenerate Event Titles started\",\n            title: \"Regenerate Event Titles\",\n            status: \"success\",\n            dismissible: true,\n            dismissAfter: 3000,\n            position: \"br\"\n          })\n        );\n        dispatch({\n          type: \"GENERATE_EVENT_ALBUMS_TITLES_FULFILLED\",\n          payload: response.data\n        });\n      })\n      .catch(err => {\n        dispatch({\n          type: \"GENERATE_EVENT_ALBUMS_TITLES_REJECTED\",\n          payload: err\n        });\n      });\n  };\n}\n\nexport function fetchExampleSearchTerms() {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_EXAMPLE_SEARCH_TERMS\" });\n    Server.get(`searchtermexamples/`)\n      .then(response => {\n        dispatch({\n          type: \"FETCH_EXAMPLE_SEARCH_TERMS_FULFILLED\",\n          payload: response.data.results\n        });\n      })\n      .catch(err => {\n        dispatch({ type: \"FETCH_EXAMPLE_SEARCH_TERMS_REJECTED\", payload: err });\n      });\n  };\n}\n\nexport function fetchLocationSunburst() {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_LOCATION_SUNBURST\" });\n    Server.get(`locationsunburst/`)\n      .then(response => {\n        dispatch({\n          type: \"FETCH_LOCATION_SUNBURST_FULFILLED\",\n          payload: response.data\n        });\n      })\n      .catch(err => {\n        dispatch({ type: \"FETCH_LOCATION_SUNBURST_REJECTED\", payload: err });\n      });\n  };\n}\n\nexport function fetchLocationTimeline() {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_LOCATION_TIMELINE\" });\n    Server.get(`locationtimeline/`)\n      .then(response => {\n        dispatch({\n          type: \"FETCH_LOCATION_TIMELINE_FULFILLED\",\n          payload: response.data\n        });\n      })\n      .catch(err => {\n        dispatch({ type: \"FETCH_LOCATION_TIMELINE_REJECTED\", payload: err });\n      });\n  };\n}\n\nexport function fetchCountStats() {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_COUNT_STATS\" });\n    Server.get(`stats/`)\n      .then(response => {\n        dispatch({\n          type: \"FETCH_COUNT_STATS_FULFILLED\",\n          payload: response.data\n        });\n      })\n      .catch(err => {\n        dispatch({ type: \"FETCH_COUNT_STATS_REJECTED\", payload: err });\n      });\n  };\n}\n\nexport function fetchPhotoScanStatus() {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_PHOTO_SCAN_STATUS\" });\n    Server.get(`watcher/photo/`)\n      .then(response => {\n        dispatch({\n          type: \"FETCH_PHOTO_SCAN_STATUS_FULFILLED\",\n          payload: response.data\n        });\n      })\n      .catch(err => {\n        dispatch({ type: \"FETCH_PHOTO_SCAN_STATUS_REJECTED\", payload: err });\n      });\n  };\n}\n\nexport function fetchAutoAlbumProcessingStatus() {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_AUTO_ALBUM_PROCESSING_STATUS\" });\n    Server.get(`watcher/autoalbum/`)\n      .then(response => {\n        dispatch({\n          type: \"FETCH_AUTO_ALBUM_PROCESSING_STATUS_FULFILLED\",\n          payload: response.data\n        });\n      })\n      .catch(err => {\n        dispatch({\n          type: \"FETCH_AUTO_ALBUM_PROCESSING_STATUS_REJECTED\",\n          payload: err\n        });\n      });\n  };\n}\n\nexport function fetchLocationClusters() {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_LOCATION_CLUSTERS\" });\n    Server.get(`locclust/`)\n      .then(response => {\n        dispatch({\n          type: \"FETCH_LOCATION_CLUSTERS_FULFILLED\",\n          payload: response.data\n        });\n      })\n      .catch(err => {\n        dispatch({ type: \"FETCH_LOCATION_CLUSTERS_REJECTED\", payload: err });\n      });\n  };\n}\n\nexport function fetchPhotoCountryCounts() {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_PHOTO_COUNTRY_COUNTS\" });\n    Server.get(`photocountrycounts/`)\n      .then(response => {\n        dispatch({\n          type: \"FETCH_PHOTO_COUNTRY_COUNTS_FULFILLED\",\n          payload: response.data\n        });\n      })\n      .catch(err => {\n        dispatch({ type: \"FETCH_PHOTO_COUNTRY_COUNTS_REJECTED\", payload: err });\n      });\n  };\n}\n\nexport function fetchPhotoMonthCounts() {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_PHOTO_MONTH_COUNTS\" });\n    Server.get(`photomonthcounts/`)\n      .then(response => {\n        dispatch({\n          type: \"FETCH_PHOTO_MONTH_COUNTS_FULFILLED\",\n          payload: response.data\n        });\n      })\n      .catch(err => {\n        dispatch({ type: \"FETCH_PHOTO_MONTH_COUNTS_REJECTED\", payload: err });\n      });\n  };\n}\n\nexport function fetchWordCloud() {\n  return function(dispatch) {\n    dispatch({ type: \"FETCH_WORDCLOUD\" });\n    Server.get(`wordcloud/`)\n      .then(response => {\n        dispatch({ type: \"FETCH_WORDCLOUD_FULFILLED\", payload: response.data });\n      })\n      .catch(err => {\n        dispatch({ type: \"FETCH_WORDCLOUD_REJECTED\", payload: err });\n      });\n  };\n}\n\nexport function rebuildSimilarityIndex() {\n  return function(dispatch) {\n    dispatch({ type: \"REBUILD_SIMILARITY_INDEX\" });\n    Server.get(`rebuildfaissindex/`)\n      .then(response => {\n        dispatch({ type: \"REBUILD_SIMILARITY_INDEX_FULFILLED\", payload: response.data });\n      })\n      .catch(err => {\n        dispatch({ type: \"REBUILD_SIMILARITY_INDEX_REJECTED\", payload: err });\n      });\n  };\n}\n"
  },
  {
    "path": "src/api_client/apiClient.js",
    "content": "import axios from \"axios\";\nimport { withAuth } from '../reducers'\n\nimport store from '../store'\nimport {refreshAccessToken} from '../actions/authActions'\nimport {isRefreshTokenExpired} from '../reducers/'\nimport cookieClient from 'react-cookie'\n\nstore.subscribe(listener)\n\nfunction select(state) {\n return state.auth\n}\n\nfunction listener() {\n var auth = select(store.getState())\n if (auth.access) {\n  // console.log('api client got header')\n  axios.defaults.headers.common['Authorization'] = \"Bearer \" + auth.access.token;\n }\n}\n\n\nexport var serverAddress = 'http://192.168.1.100'\n\nexport var Server = axios.create({\n    baseURL: 'http://192.168.1.100/api/',\n  headers: {\n    'Content-Type': 'application/json'\n  },\n  withCredentials:true,\n  timeout: 30000,\n});\n\n\n\nServer.interceptors.request.use(function(request) {\n\t// console.log('axios sending request',request)\n\treturn request\n}, function(error) {\n\t// console.log('axios error sending request',error)\n})\n\n\nServer.interceptors.response.use(function (response) {\n  // console.log('axios got response',response)\n  return response;\n}, function (error) {\n  // console.log('axios retrying')\n  const originalRequest = error.config;\n\n  if (error.response.status === 401 && !originalRequest._retry && !isRefreshTokenExpired(store.getState())) {\n\n    originalRequest._retry = true;\n\n    const auth = select(store.getState())\n    const refreshToken = auth.refresh.token\n    // console.log('retrying')\n\n    // store.dispatch(refreshAccessToken(refreshToken))\n    return Server.post(serverAddress+'/api/auth/token/refresh/', { refresh:refreshToken })\n      .then((response) => {\n      \tstore.dispatch({type: \"REFRESH_ACCESS_TOKEN_FULFILLED\", payload: response.data})\n      \t// console.log('setting refreshed access token in retry',response.data)\n        axios.defaults.headers.common['Authorization'] = 'Bearer ' + response.data.access;\n        originalRequest.headers['Authorization'] = 'Bearer ' + response.data.access;\n        return Server(originalRequest);\n      });\n  }\n\n  return Promise.reject(error);\n});\n\n\n\n\n\nexport default {serverAddress, Server}\n"
  },
  {
    "path": "src/api_client/apiClientDeploy.js",
    "content": "\nimport axios from \"axios\";\nimport { withAuth } from '../reducers'\n\nimport store from '../store'\nimport {refreshAccessToken} from '../actions/authActions'\nimport {isRefreshTokenExpired} from '../reducers/'\n\nstore.subscribe(listener)\n\nfunction select(state) {\n return state.auth\n}\n\nfunction listener() {\n var auth = select(store.getState())\n if (auth.access) {\n  // console.log('api client got header')\n  axios.defaults.headers.common['Authorization'] = \"Bearer \" + auth.access.token;\n }\n}\n\nexport var serverAddress = 'changeme'\n\nexport var Server = axios.create({\n  baseURL: 'changeme/api/',\n  headers: {\n    'Content-Type': 'application/json'\n  },\n  timeout: 30000,\n});\n\n\n\nServer.interceptors.request.use(function(request) {\n\t// console.log('axios sending request',request)\n\treturn request\n}, function(error) {\n\t// console.log('axios error sending request',error)\n})\n\n\nServer.interceptors.response.use(function (response) {\n  // console.log('axios got response',response)\n  return response;\n}, function (error) {\n  // console.log('axios retrying')\n  const originalRequest = error.config;\n\n  if (error.response.status === 401 && !originalRequest._retry && !isRefreshTokenExpired(store.getState())) {\n\n    originalRequest._retry = true;\n\n    const auth = select(store.getState())\n    const refreshToken = auth.refresh.token\n    // console.log('retrying')\n\n    // store.dispatch(refreshAccessToken(refreshToken))\n    return Server.post(serverAddress+'/api/auth/token/refresh/', { refresh:refreshToken })\n      .then((response) => {\n      \tstore.dispatch({type: \"REFRESH_ACCESS_TOKEN_FULFILLED\", payload: response.data})\n      \t// console.log('setting refreshed access token in retry',response.data)\n        axios.defaults.headers.common['Authorization'] = 'Bearer ' + response.data.access;\n        originalRequest.headers['Authorization'] = 'Bearer ' + response.data.access;\n        return Server(originalRequest);\n      });\n  }\n\n  return Promise.reject(error);\n});\n\n\n\n\n\nexport default {serverAddress, Server}\n"
  },
  {
    "path": "src/components/LightBoxV2.js",
    "content": "import React, {Component} from 'react';\nimport ReactDOM from 'react-dom';\nimport { List, WindowScroller,AutoSizer } from 'react-virtualized';\nimport 'react-virtualized/styles.css'; // only needs to be imported once\nimport { connect } from \"react-redux\";\nimport {  fetchDateAlbumsPhotoHashList,fetchAlbumsDateGalleries} from '../actions/albumsActions'\nimport {  fetchPhotoDetail, setPhotosFavorite, setPhotosHidden} from '../actions/photosActions'\nimport { Card, Image, Header, Divider, Item, Loader, Dimmer, Sticky, Portal, Grid, List as ListSUI,\n         Container, Label, Popup, Segment, Button, Icon, Table, Transition, Breadcrumb} from 'semantic-ui-react';\nimport {Server, serverAddress} from '../api_client/apiClient'\nimport Modal from 'react-modal'\nimport LazyLoad from 'react-lazyload';\nimport Lightbox from 'react-image-lightbox';\nimport {LocationMap} from '../components/maps'\nimport { push } from 'react-router-redux'\nimport {searchPhotos} from '../actions/searchActions'\nimport styles from '../App.css';\nimport Draggable from 'react-draggable';\nimport debounce from 'lodash/debounce'\nimport * as moment from 'moment';\n\nvar topMenuHeight = 55 // don't change this\nvar leftMenuWidth = 85 // don't change this\nvar SIDEBAR_WIDTH = 85\nvar timelineScrollWidth = 0\nvar DAY_HEADER_HEIGHT = 35\n\nif (window.innerWidth < 600) {\n    var LIGHTBOX_SIDEBAR_WIDTH = window.innerWidth\n} else {\n    var LIGHTBOX_SIDEBAR_WIDTH = 360\n}\n\n\n\nconst colors = [\n  'red', 'orange', 'yellow', 'olive', 'green', 'teal',\n  'blue', 'violet', 'purple', 'pink', 'brown', 'grey', 'black',\n]\n\nconst lightboxStyles = {\n    content: {\n        top:0,\n        left:0,\n        right:0,\n        bottom:0,\n        position:'fixed',\n        borderRadius:0,\n        border:0,\n        padding:0,\n        backgroundColor:'rgba(0,0,0,0.8)',\n    },\n    overlay: {\n        top:0,\n        left:0,\n        right:0,\n        bottom:0,\n        position:'fixed',\n        borderRadius:0,\n        border:0,\n        zIndex:102\n    }\n}\n\nModal.setAppElement('#root')\n\nexport class LightBoxV2 extends Component {\n    state = {\n        showSidebar:false,\n        width:window.innerWidth,\n        height:window.innerHeight,\n        photoPaneWidth:window.innerWidth,\n        photoPaneHeight:window.innerWidth-55\n    }\n\n    constructor(props) {\n        super(props)\n        this.handleResize = this.handleResize.bind(this)\n    }\n\n\n    handleResize() {\n        const width = window.innerWidth\n        const height = window.innerHeight\n        if (this.state.showSidebar) {\n            var photoPaneWidth = width*0.7\n        } else {\n            var photoPaneWidth = width\n        }\n        const photoPaneHeight = height\n        this.setState({width,height,photoPaneHeight,photoPaneWidth})\n    }\n\n\n    componentDidMount(){\n        this.handleResize()\n        window.addEventListener(\"resize\", this.handleResize.bind(this));\n    }\n\n\n    render() {\n        console.log(this.props)\n        if (!this.props.photoDetails[this.props.idx2hash.slice(this.props.lightboxImageIndex)[0]]) {\n            console.log('light box has not gotten main photo detail')\n            var isLoading = true\n            var mainSrc = '/transparentbackground.png'\n            var mainSrcThumbnail = '/transparentbackground.png'\n        } else {\n\n            const photoDetail = this.props.photoDetails[this.props.idx2hash.slice(this.props.lightboxImageIndex)[0]]\n            console.log('light box has got main photo detail')\n            var isLoading = false\n            var mainSrc = serverAddress+'/media/photos/'+this.props.idx2hash.slice(this.props.lightboxImageIndex)[0]+'.jpg'\n            var mainSrcThumbnail = serverAddress+'/media/thumbnails/'+this.props.idx2hash.slice(this.props.lightboxImageIndex)[0]+'.jpg'\n            \n            const isPhotoLandscape = photoDetail.thumbnail_height < photoDetail.thumbnail_width\n            const isViewportLandscape = this.state.photoPaneHeight < this.state.photoPaneWidth\n            \n            console.log('photo is landscape',isPhotoLandscape)\n            console.log('viewport is landscape',isViewportLandscape)\n\n            if (this.props.photoDetails[this.props.idx2hash.slice(this.props.lightboxImageIndex)[0]].hidden && !this.props.showHidden) {\n                var mainSrc = '/hidden.png'\n                var mainSrcThumbnail = '/hidden.png'\n            }\n            \n        }\n        console.log(Modal.defaultStyles)\n        return (\n            <Modal\n              style={lightboxStyles}\n              isOpen={this.props.isOpen}\n              onAfterOpen={()=>{this.props.onImageLoad()}}\n              onRequestClose={this.props.onCloseRequest}>\n\n              <div style={{width:this.state.showSidebar ? '70%' : '100%',color:'#ffffff',display:'inline-block',padding:0,float:'left'}}>\n                <div style={{width:'100%',padding:10,height:55,backgroundColor:'rgba(0,0,0,0.9)'}}>\n                    <Button \n                        floated='right'\n                        onClick={()=>{this.props.onCloseRequest()}}\n                        icon\n                        circular>\n                        <Icon name='close'/>\n                    </Button>\n                    <Button \n                        floated='right'\n                        onClick={()=>{this.setState({showSidebar:!this.state.showSidebar})}}\n                        icon\n                        circular>\n                        <Icon name='info'/>\n                    </Button>\n                </div>\n                <div style={{justifyContent:'center',height:'100%-55px',alignItems:'center'}}>\n                { isLoading && <Loader inverted active/> }\n                { !isLoading && <Image src={mainSrc}/> }\n                </div>\n              </div>\n\n              { this.state.showSidebar &&\n\n                <div style={{padding:10, width: '30%',height:'100%',backgroundColor:'white', display:'inline-block',float:'right'}}>\n                    <Button \n                        floated='right'\n                        onClick={()=>{this.setState({showSidebar:!this.state.showSidebar})}}\n                        icon\n                        circular>\n                        <Icon name='close'/>\n                    </Button>\n                </div>\n\n              }\n\n\n            </Modal>\n        )\n    }\n}\n\nLightBoxV2 = connect((store)=>{\n  return {\n    photoDetails: store.photos.photoDetails,\n    fetchingPhotoDetail: store.photos.fetchingPhotoDetail,\n    fetchedPhotoDetail: store.photos.fetchedPhotoDetail,\n    photos:store.photos.photos,\n    // idx2hash: store.albums.idx2hash,\n    // albumsDatePhotoHashList: store.albums.albumsDatePhotoHashList,\n    // fetchingAlbumsDatePhotoHashList: store.albums.fetchingAlbumsDatePhotoHashList,\n    // fetchedAlbumsDatePhotoHashList: store.albums.fetchedAlbumsDatePhotoHashList,    \n  }\n})(LightBoxV2)\n"
  },
  {
    "path": "src/components/ModalAlbumShare.js",
    "content": "import React, { Component } from \"react\";\nimport {\n  Checkbox,\n  Popup,\n  Input,\n  Item,\n  Menu,\n  Image,\n  Icon,\n  Header,\n  Container,\n  Divider,\n  Button,\n  Label,\n  Loader,\n  Sticky,\n  Accordion\n} from \"semantic-ui-react\";\n\nimport { SecuredImageJWT } from \"../components/SecuredImage\";\n\nimport {\n  FaceToLabel,\n  FacesLabeled,\n  FacesInferred,\n  FaceStatistics,\n  FaceTableLabeled,\n  FaceTableInferred\n} from \"../components/faces\";\nimport FaceClusterScatter from \"../components/faceClusterGraph\";\nimport { connect } from \"react-redux\";\nimport {\n  deleteFaces,\n  setFacesPersonLabel,\n  loadFaceToLabel,\n  trainFaces,\n  clusterFaces,\n  fetchInferredFacesList,\n  fetchLabeledFacesList,\n  fetchFacesList\n} from \"../actions/facesActions\";\nimport LazyLoad from \"react-lazyload\";\nimport _ from \"lodash\";\nimport { Grid, List, WindowScroller, AutoSizer } from \"react-virtualized\";\nimport {\n  calculateFaceGridCellSize,\n  calculateFaceGridCells\n} from \"../util/gridUtils\";\nimport { ScrollSpeed, SCROLL_DEBOUNCE_DURATION } from \"../util/scrollUtils\";\nimport debounce from \"lodash/debounce\";\nimport { fetchPeople, addPerson } from \"../actions/peopleActions\";\nimport { fetchPublicUserList } from \"../actions/publicActions\";\nimport { serverAddress } from \"../api_client/apiClient\";\nimport { setPhotosShared } from \"../actions/photosActions\";\nimport { setUserAlbumShared } from \"../actions/albumsActions\";\n\nimport Modal from \"react-modal\";\nimport moment from \"moment\";\n// <Icon name='id badge' circular />\nvar topMenuHeight = 45; // don't change this\nvar leftMenuWidth = 85; // don't change this\nvar SIDEBAR_WIDTH = 85;\n\nconst SPEED_THRESHOLD = 500;\n\nfunction fuzzy_match(str, pattern) {\n  if (pattern.split(\"\").length > 0) {\n    pattern = pattern.split(\"\").reduce(function(a, b) {\n      return a + \".*\" + b;\n    });\n    return new RegExp(pattern).test(str);\n  } else {\n    return false;\n  }\n}\n\nconst modalStyles = {\n  content: {\n    top: 150,\n    left: 40,\n    right: 40,\n    height: window.innerHeight - 300,\n\n    overflow: \"hidden\",\n    // paddingRight:0,\n    // paddingBottomt:0,\n    // paddingLeft:10,\n    // paddingTop:10,\n    padding: 0,\n    backgroundColor: \"white\"\n  },\n  overlay: {\n    top: 0,\n    left: 0,\n    right: 0,\n    bottom: 0,\n    position: \"fixed\",\n    borderRadius: 0,\n    border: 0,\n    zIndex: 102,\n    backgroundColor: \"rgba(200,200,200,0.8)\"\n  }\n};\n\nexport class ModalAlbumShare extends Component {\n  state = { \n    userNameFilter: \"\",\n    valShare: true,\n  };\n  render() {\n    if (this.state.userNameFilter.length > 0) {\n      var filteredUserList = this.props.pub.publicUserList.filter(\n        el =>\n          fuzzy_match(\n            el.username.toLowerCase(),\n            this.state.userNameFilter.toLowerCase()\n          ) ||\n          fuzzy_match(\n            el.first_name.toLowerCase() + \" \" + el.last_name.toLowerCase(),\n            this.state.userNameFilter.toLowerCase()\n          )\n      );\n    } else {\n      var filteredUserList = this.props.pub.publicUserList;\n    }\n    filteredUserList = filteredUserList.filter(\n      el => el.id !== this.props.auth.access.user_id\n    );\n\n    const allFaces = _.concat(\n      this.props.inferredFacesList,\n      this.props.labeledFacesList\n    );\n\n    console.log(this.props)\n\n    const userAlbum = this.props.albumsUser[this.props.match.params.albumID]\n    console.log(userAlbum)\n\n    return (\n      <Modal\n        ariaHideApp={false}\n        onAfterOpen={() => {\n          this.props.dispatch(fetchPublicUserList());\n        }}\n        isOpen={this.props.isOpen}\n        onRequestClose={() => {\n          this.props.onRequestClose();\n          this.setState({ userNameFilter: \"\" });\n        }}\n        style={modalStyles}\n      >\n        <div style={{ height: 50, width: \"100%\", padding: 7}}>\n          <Header>\n            {this.state.valShare ? \"Share Album\" : \"Unshare Album\"}\n            <Header.Subheader>\n              {this.state.valShare ? \"Share\" : \"Unshare\"} current album with...\n            </Header.Subheader>\n          </Header>\n        </div>\n        <Divider fitted />\n        <div\n          style={{\n            paddingLeft: 10,\n            paddingTop: 10,\n            overflowY: \"scroll\",\n            height: window.innerHeight - 300 - 100,\n            width: \"100%\"\n          }}\n        >\n          <div style={{ paddingRight: 5 }}>\n            <Header as=\"h4\">Search user</Header>\n            <Input\n              fluid\n              onChange={(e, v) => {\n                this.setState({ userNameFilter: v.value });\n              }}\n              placeholder=\"Person name\"\n            />\n          </div>\n          <Divider />\n          {filteredUserList.length > 0 &&\n            filteredUserList.map(item => {\n              if (item.first_name.length > 0 && item.last_name.length > 0) {\n                var displayName = item.first_name + \" \" + item.last_name;\n              } else {\n                var displayName = item.username;\n              }\n              return (\n                <div\n                  key={\"modal_albums_share_user_\" + item.username}\n                  style={{\n                    height: 70,\n                    justifyContent: \"center\",\n                    alignItems: \"center\"\n                  }}\n                >\n                  <Header\n                    as=\"h4\"\n                    onClick={() => {\n                      this.props.dispatch(\n                        setUserAlbumShared(\n                          parseInt(this.props.match.params.albumID), \n                          item.id, \n                          this.state.valShare))\n                      this.props.onRequestClose();\n                    }}\n                  >\n                    <Image circular src=\"/unknown_user.jpg\" />\n                    <Header.Content>\n                      {displayName} \n                      {userAlbum.shared_to.map(e=>e.id).includes(item.id) &&\n                        <Popup \n                          trigger={\n                            <Icon \n                              flipped='horizontally' \n                              name='share'/>\n                          } \n                          inverted \n                          content=\"Shared\"/>\n                      }\n                      <Header.Subheader>\n                        Joined {moment(item.date_joined).format(\"MMMM YYYY\")}\n                      </Header.Subheader>\n                    </Header.Content>\n                  </Header>\n                  <div style={{float:'right',right:10,top:-40,position:'relative'}}>\n                    <Checkbox \n                    inline\n                    slider \n                    checked={userAlbum.shared_to.map(e=>e.id).includes(item.id)}\n                    onChange={(e,d)=>{\n                      this.props.dispatch(\n                        setUserAlbumShared(\n                          parseInt(this.props.match.params.albumID), \n                          item.id, \n                          !userAlbum.shared_to.map(e=>e.id).includes(item.id)))\n                    }}\n                    /> \n                  </div>\n\n                </div>\n              );\n            })}\n        </div>\n      </Modal>\n    );\n  }\n}\n\nModalAlbumShare = connect(store => {\n  return {\n    auth: store.auth,\n    people: store.people.people,\n    fetchingPeople: store.people.fetchingPeople,\n    fetchedPeople: store.people.fetchedPeople,\n\n    albumsUser: store.albums.albumsUser,\n\n    inferredFacesList: store.faces.inferredFacesList,\n    labeledFacesList: store.faces.labeledFacesList,\n\n    fetchingLabeledFacesList: store.faces.fetchingLabeledFacesList,\n    fetchedLabeledFacesList: store.faces.fetchedLabeledFacesList,\n    fetchingInferredFacesList: store.faces.fetchingInferredFacesList,\n    fetchedInferredFacesList: store.faces.fetchedInferredFacesList,\n\n    pub: store.pub\n  };\n})(ModalAlbumShare);\n"
  },
  {
    "path": "src/components/ModalPhotosShare.js",
    "content": "import React, { Component } from \"react\";\nimport {\n  Checkbox,\n  Popup,\n  Input,\n  Item,\n  Menu,\n  Image,\n  Icon,\n  Header,\n  Container,\n  Divider,\n  Button,\n  Label,\n  Loader,\n  Sticky,\n  Accordion\n} from \"semantic-ui-react\";\n\nimport { SecuredImageJWT } from \"../components/SecuredImage\";\n\nimport {\n  FaceToLabel,\n  FacesLabeled,\n  FacesInferred,\n  FaceStatistics,\n  FaceTableLabeled,\n  FaceTableInferred\n} from \"../components/faces\";\nimport FaceClusterScatter from \"../components/faceClusterGraph\";\nimport { connect } from \"react-redux\";\nimport {\n  deleteFaces,\n  setFacesPersonLabel,\n  loadFaceToLabel,\n  trainFaces,\n  clusterFaces,\n  fetchInferredFacesList,\n  fetchLabeledFacesList,\n  fetchFacesList\n} from \"../actions/facesActions\";\nimport LazyLoad from \"react-lazyload\";\nimport _ from \"lodash\";\nimport { Grid, List, WindowScroller, AutoSizer } from \"react-virtualized\";\nimport {\n  calculateFaceGridCellSize,\n  calculateFaceGridCells\n} from \"../util/gridUtils\";\nimport { ScrollSpeed, SCROLL_DEBOUNCE_DURATION } from \"../util/scrollUtils\";\nimport debounce from \"lodash/debounce\";\nimport { fetchPeople, addPerson } from \"../actions/peopleActions\";\nimport { fetchPublicUserList } from \"../actions/publicActions\";\nimport { serverAddress } from \"../api_client/apiClient\";\nimport { setPhotosShared } from \"../actions/photosActions\";\nimport Modal from \"react-modal\";\nimport moment from \"moment\";\n// <Icon name='id badge' circular />\nvar topMenuHeight = 45; // don't change this\nvar leftMenuWidth = 85; // don't change this\nvar SIDEBAR_WIDTH = 85;\n\nconst SPEED_THRESHOLD = 500;\n\nfunction fuzzy_match(str, pattern) {\n  if (pattern.split(\"\").length > 0) {\n    pattern = pattern.split(\"\").reduce(function(a, b) {\n      return a + \".*\" + b;\n    });\n    return new RegExp(pattern).test(str);\n  } else {\n    return false;\n  }\n}\n\nconst modalStyles = {\n  content: {\n    top: 150,\n    left: 40,\n    right: 40,\n    height: window.innerHeight - 300,\n\n    overflow: \"hidden\",\n    // paddingRight:0,\n    // paddingBottomt:0,\n    // paddingLeft:10,\n    // paddingTop:10,\n    padding: 0,\n    backgroundColor: \"white\"\n  },\n  overlay: {\n    top: 0,\n    left: 0,\n    right: 0,\n    bottom: 0,\n    position: \"fixed\",\n    borderRadius: 0,\n    border: 0,\n    zIndex: 102,\n    backgroundColor: \"rgba(200,200,200,0.8)\"\n  }\n};\n\nexport class ModalPhotosShare extends Component {\n  state = { userNameFilter: \"\", valShare: true };\n  render() {\n    if (this.state.userNameFilter.length > 0) {\n      var filteredUserList = this.props.pub.publicUserList.filter(\n        el =>\n          fuzzy_match(\n            el.username.toLowerCase(),\n            this.state.userNameFilter.toLowerCase()\n          ) ||\n          fuzzy_match(\n            el.first_name.toLowerCase() + \" \" + el.last_name.toLowerCase(),\n            this.state.userNameFilter.toLowerCase()\n          )\n      );\n    } else {\n      var filteredUserList = this.props.pub.publicUserList;\n    }\n    filteredUserList = filteredUserList.filter(\n      el => el.id !== this.props.auth.access.user_id\n    );\n\n    const allFaces = _.concat(\n      this.props.inferredFacesList,\n      this.props.labeledFacesList\n    );\n\n    var selectedImageSrcs = this.props.selectedImageHashes.map(image_hash => {\n      return serverAddress + \"/media/square_thumbnails/\" + image_hash + \".jpg\";\n    });\n    return (\n      <Modal\n        ariaHideApp={false}\n        onAfterOpen={() => {\n          this.props.dispatch(fetchPublicUserList());\n        }}\n        isOpen={this.props.isOpen}\n        onRequestClose={() => {\n          this.props.onRequestClose();\n          this.setState({ userNameFilter: \"\" });\n        }}\n        style={modalStyles}\n      >\n        <div style={{ height: 50, width: \"100%\", padding: 7 }}>\n          <Header>\n            {this.state.valShare ? \"Share Photos\" : \"Unshare Photos\"}\n            <Header.Subheader>\n              {this.state.valShare ? \"Share \" : \"Unshare \"} selected{\" \"}\n              {this.props.selectedImageHashes.length} photo(s) with...\n            </Header.Subheader>\n          </Header>\n        </div>\n        <Divider fitted />\n        <div\n          style={{ height: 100, padding: 5, height: 50, overflowY: \"hidden\" }}\n        >\n          <Image.Group>\n            {selectedImageSrcs\n              .slice(0, 100)\n              .map(image => (\n                <SecuredImageJWT\n                  key={\"selected_image\" + image}\n                  height={40}\n                  width={40}\n                  src={image}\n                />\n              ))}\n          </Image.Group>\n        </div>\n        <Divider fitted />\n        <div\n          style={{\n            paddingLeft: 10,\n            paddingTop: 10,\n            overflowY: \"scroll\",\n            height: window.innerHeight - 300 - 100,\n            width: \"100%\"\n          }}\n        >\n          <div style={{ paddingRight: 5 }}>\n            <Header as=\"h4\">Search user</Header>\n            <Input\n              fluid\n              onChange={(e, v) => {\n                this.setState({ userNameFilter: v.value });\n              }}\n              placeholder=\"Person name\"\n            />\n          </div>\n          <Divider />\n          {filteredUserList.length > 0 &&\n            filteredUserList.map(item => {\n              if (item.first_name.length > 0 && item.last_name.length > 0) {\n                var displayName = item.first_name + \" \" + item.last_name;\n              } else {\n                var displayName = item.username;\n              }\n              return (\n                <div\n                  key={\"modal_photos_share_user_\" + item.username}\n                  style={{\n                    height: 70,\n                    justifyContent: \"center\",\n                    alignItems: \"center\"\n                  }}\n                >\n                  <Header\n                    floated=\"left\"\n                    as=\"h4\"\n                    onClick={() => {\n                      //this.props.dispatch(\n                      //  setPhotosShared(\n                      //    this.props.selectedImageHashes,\n                      //    this.state.valShare,\n                      //    item\n                      //  )\n                      //);\n                      //this.props.onRequestClose();\n                    }}\n                  >\n                    <Image circular src=\"/unknown_user.jpg\" />\n                    <Header.Content>\n                      {displayName}\n                      <Header.Subheader>\n                        Joined {moment(item.date_joined).format(\"MMMM YYYY\")}\n                      </Header.Subheader>\n                    </Header.Content>\n                  </Header>\n                  <Header floated=\"right\" as=\"h5\">\n                    <Button.Group size=\"mini\" compact>\n                      <Button\n                        onClick={() => {\n                          this.props.dispatch(\n                            setPhotosShared(\n                              this.props.selectedImageHashes,\n                              true,\n                              item\n                            )\n                          );\n                          //this.props.onRequestClose();\n                        }}\n                        positive\n                        icon\n                      >\n                        <Icon name='linkify'/>\n                        Share\n                      </Button>\n                      <Button.Or/>\n                      <Button\n                        onClick={() => {\n                          this.props.dispatch(\n                            setPhotosShared(\n                              this.props.selectedImageHashes,\n                              false,\n                              item\n                            )\n                          );\n                          //this.props.onRequestClose();\n                        }}\n                        negative\n                        icon\n                      >\n                        <Icon name='linkify'/>\n                        Unshare\n                      </Button>\n                    </Button.Group>\n                  </Header>\n                </div>\n              );\n            })}\n        </div>\n      </Modal>\n    );\n  }\n}\n\nModalPhotosShare = connect(store => {\n  return {\n    auth: store.auth,\n    people: store.people.people,\n    fetchingPeople: store.people.fetchingPeople,\n    fetchedPeople: store.people.fetchedPeople,\n\n    inferredFacesList: store.faces.inferredFacesList,\n    labeledFacesList: store.faces.labeledFacesList,\n\n    fetchingLabeledFacesList: store.faces.fetchingLabeledFacesList,\n    fetchedLabeledFacesList: store.faces.fetchedLabeledFacesList,\n    fetchingInferredFacesList: store.faces.fetchingInferredFacesList,\n    fetchedInferredFacesList: store.faces.fetchedInferredFacesList,\n\n    pub: store.pub\n  };\n})(ModalPhotosShare);\n"
  },
  {
    "path": "src/components/SecuredImage.js",
    "content": "import React, { Component } from \"react\";\nimport { connect } from \"react-redux\";\nimport {\n  fetchPeopleAlbums,\n  fetchAutoAlbums,\n  generateAutoAlbums,\n  fetchAutoAlbumsList\n} from \"../actions/albumsActions\";\nimport { AlbumAutoCard, AlbumAutoGallery } from \"../components/album\";\nimport {\n  Container,\n  Image,\n  Icon,\n  Header,\n  Button,\n  Card,\n  Label,\n  Popup\n} from \"semantic-ui-react\";\nimport {\n  fetchCountStats,\n  fetchPhotoScanStatus,\n  fetchAutoAlbumProcessingStatus\n} from \"../actions/utilActions\";\n\nimport { Server, serverAddress } from \"../api_client/apiClient\";\n\nimport { instanceOf } from 'prop-types';\nimport { withCookies, Cookies } from 'react-cookie';\n\nexport class SecuredImageJWT extends Component {\n  // static propTypes = {\n  //   cookies: instanceOf(Cookies).isRequired\n  // }\n\n  // state = {cookie:null}\n\n  // constructor(props) {\n  //   super(props)\n  // }\n\n  // componentDidMount() {\n  //   if (this.props.auth.access) {\n  //     const {cookies} = this.props\n  //     console.log('setting jwt cookie',this.props.auth.access.token)\n  //     cookies.set('jwt',this.props.auth.access.token, { path: '/' })\n  //   }\n  // }\n\n\n\n  render() {\n    const {\n      height,\n      width,\n      style,\n      src,\n      onClick,\n      size,\n      rounded,\n      avatar,\n      as,\n      to,\n      label,\n      circular,\n    } = this.props;\n    return (\n      <Image\n        {...this.props}\n      />\n    );\n  }\n}\n\nexport class SecuredImage extends Component {\n  state = {\n    imgData: null\n  };\n\n  componentWillMount() {\n    console.log(this.props.src);\n    Server.get(this.props.src)\n      .then(resp => {\n        console.log(\"success\");\n        this.setState({ imgData: resp.data.data });\n      })\n      .catch(err => {\n        console.log(\"fail\");\n      });\n  }\n  render() {\n    const { imgData } = this.state;\n    var newProps = this.props;\n    delete newProps.dispatch;\n    if (imgData) {\n      return <Image {...newProps} src={\"data:image/jpeg;base64,\" + imgData} />;\n    }\n    return <Image {...newProps} src={\"/thumbnail_placeholder.png\"} />;\n  }\n}\n\nSecuredImageJWT = connect(store => {\n  return {\n    auth: store.auth\n  };\n})(SecuredImageJWT);\n\n// SecuredImageJWT = withCookies(SecuredImageJWT)\n"
  },
  {
    "path": "src/components/album.js",
    "content": "import React, {Component} from 'react';\nimport { Card, Image, Header, Divider, Item, Loader, Dimmer,Rating,\n         Container, Label, Popup, Segment, Button, Icon} from 'semantic-ui-react';\nimport Gallery from 'react-grid-gallery'\nimport VisibilitySensor from 'react-visibility-sensor'\nimport { connect } from \"react-redux\";\nimport {\n  BrowserRouter as Router,\n  Route,\n  Link\n} from 'react-router-dom'\nimport {fetchPeopleAlbums, fetchAutoAlbums, generateAutoAlbums,toggleAlbumAutoFavorite,fetchAutoAlbumsList} from '../actions/albumsActions'\nimport { Map, TileLayer, Marker } from 'react-leaflet'\n\nimport {Server, serverAddress} from '../api_client/apiClient'\n\nimport LazyLoad from 'react-lazyload';\n\n/*******************************************************************************\nCOMMON\n*******************************************************************************/\n\n\nexport class AlbumLocationMap extends Component {\n  render() {\n    var photosWithGPS = this.props.photos.filter(function(photo){\n      if (photo.exif_gps_lon !== null && photo.exif_gps_lon){\n        return true\n      }\n      else {\n        return false\n      }\n    })\n    \n    var sum_lat = 0\n    var sum_lon = 0\n    for (var i=0;i<photosWithGPS.length;i++){\n      sum_lat += parseFloat(photosWithGPS[i].exif_gps_lat)\n      sum_lon += parseFloat(photosWithGPS[i].exif_gps_lon)\n    }\n    var avg_lat = sum_lat/photosWithGPS.length\n    var avg_lon = sum_lon/photosWithGPS.length\n\n    var markers = photosWithGPS.map(function(photo){\n      return (\n        <Marker position={[photo.exif_gps_lat, photo.exif_gps_lon]}>\n        </Marker>\n      )\n    })\n    console.log(markers)\n\n    if (photosWithGPS.length>0){\n      return (\n        <div>\n          <Map center={[avg_lat,avg_lon]} zoom={2}>\n            <TileLayer\n              attribution='&copy; <a href=\"http://osm.org/copyright\">OpenStreetMap</a> contributors'\n              url='http://{s}.tile.osm.org/{z}/{x}/{y}.png'/>\n            {markers}\n          </Map>\n          <Divider/>\n        </div>\n      )\n    }\n    else {\n      return (\n        <div></div>\n      )\n    }\n  }\n}\n\n/*******************************************************************************\nPEOPLE ALBUM\n*******************************************************************************/\n\nexport class AlbumPeopleCard extends Component {\n  render() {\n    var album_id = this.props.person.key\n    console.log(this.props)\n    if (this.props.person.value==='unknown'){\n      var personImageSrc = '/unknown_user.jpg'\n    }\n    else {\n      var personImageSrc = serverAddress + this.props.person.face_photo_url\n    }\n    return (\n        <Card>\n          <VisibilitySensor>\n            <Image \n              as={Link}\n              to={`/person/${this.props.person.key}`}\n              size=\"big\"\n              src={personImageSrc}/>\n          </VisibilitySensor>\n          <Card.Content>\n          <Header as='h4'>{this.props.person.text}</Header>\n          <Card.Meta>\n          {this.props.person.face_count} Photos\n          </Card.Meta>        \n          </Card.Content>\n        </Card>\n    )\n  }\n}\n\nexport class AlbumPeopleGallery extends Component {\n  componentWillMount() {\n    console.log('fetching person album',this.props.match.params.albumID)\n    this.props.dispatch(fetchPeopleAlbums(this.props.match.params.albumID))\n  }\n\n  componentWillReceiveProps() {\n    console.log('component did update', this.props.fetchingAlbumsPeople, this.props.match.params.albumID in this.props.albumsPeople)\n\n  }\n\n  render() {\n\n    if (!this.props.fetchingAlbumsPeople) {\n      if (!this.props.match.params.albumID in this.props.albumsPeople){\n        this.props.dispatch(fetchPeopleAlbums(this.props.match.params.albumID))      \n      }\n    }\n\n    var albumID = this.props.match.params.albumID\n    console.log(this.props)\n    if (this.props.match.params.albumID in this.props.albumsPeople) {\n      console.log(albumID)\n      var album = this.props.albumsPeople[albumID]\n      var mappedRenderablePhotoArray = album.photos.map(function(photo){\n        return ({\n          src: serverAddress+photo.image_url,\n          thumbnail: serverAddress+photo.thumbnail_url,\n          thumbnailWidth:photo.thumbnail_width,\n          thumbnailHeight:photo.thumbnail_height,\n        });\n      });\n      console.log(album)\n      var album_name = album.name\n\n      return (\n        <div>\n          <Header as='h1'>\n            {album_name}\n          </Header>\n          <Divider/>\n          <AlbumLocationMap photos={album.photos}/>\n          <div style={{\n              display: \"block\",\n              minHeight: \"1px\",\n              width: \"100%\",\n              overflowX: \"hidden\",\n              overflowY: 'auto'}}>\n            <Gallery \n              images={mappedRenderablePhotoArray}\n              enableImageSelection={false}\n              rowHeight={150}/>\n          </div>\n        </div>\n      )\n\n    }\n    else {\n      return (\n        <div style={{\n          display:\"block\",\n          width:'100%',\n          height:'100%'}}>\n          <Dimmer active>\n            <Loader/>\n          </Dimmer>\n        </div>\n      )\n    }\n  }\n}\n\n/*******************************************************************************\nAUTO GENERATED EVENT ALBUM\n*******************************************************************************/\n\nexport class AlbumAutoGallery extends Component {\n  render() {\n    var albumID = this.props.match.params.albumID\n    if (this.props.fetchedAlbumsAuto) {\n      console.log(albumID)\n      var album = this.props.albumsAuto.filter(function(a){\n        return a.id === albumID\n      })\n\n      var mappedRenderablePhotoArray = album[0].photos.map(function(photo){\n        return ({\n          src: serverAddress+photo.image_url,\n          thumbnail: serverAddress+photo.thumbnail_url,\n          thumbnailWidth:photo.thumbnail_width,\n          thumbnailHeight:photo.thumbnail_height,\n        });\n      });\n\n      var mappedPeopleIcons = album[0].people.map(function(person){\n        return (\n          <Label image>\n            <img src={serverAddress+person.face_url}/>\n            {person.name}\n          </Label>\n        )\n      })\n\n\n      console.log(album)\n    }\n    else {\n      var mappedRenderablePhotoArray = []\n    }\n    return (\n      <div style={{\n          display: \"block\",\n          minHeight: \"1px\",\n          width: \"100%\",\n          border: \"0px solid #ddd\",\n          overflow: \"hidden\"}}>\n        <Header as='h1'>\n          {album[0].title}\n        </Header>\n        {mappedPeopleIcons}\n        <Divider/>\n        <AlbumLocationMap photos={album[0].photos}/>\n        <Gallery \n          images={mappedRenderablePhotoArray}\n          enableImageSelection={false}\n          rowHeight={150}/>\n      </div>\n    )\n  }\n}\n\nexport class AlbumAutoCard extends Component {\n  constructor(props){\n    super(props)\n    this.onRate = this.onRate.bind(this)\n  }\n\n  onRate(e,d) {\n    if (d.rating === 0) {\n      console.log('unfavorited',this.props.album_id)\n      var rating = false\n    }\n    else {\n      console.log('favorited',this.props.album_id)\n      var rating = true\n    }\n    this.props.dispatch(toggleAlbumAutoFavorite(this.props.album_id,rating))\n  }\n\n  render() {\n    var album_id = this.props.album_id\n    if (this.props.people.length > 0) {\n      var mappedPeopleIcons = this.props.people.map(function(person){\n        return (\n\n          <Label key={'auto-album-card-'+album_id+'-person-label-'+person.id} as='a' image>\n            <img src={serverAddress+person.face_url} />\n            {person.name}\n          </Label>\n\n        )\n      })\n      var peoplePopup = (\n        <Popup flowing \n          trigger={<div>{this.props.people.length} People </div>}\n          content={<Label.Group>{mappedPeopleIcons}</Label.Group>}/>\n      )\n    }\n    else {\n      // empty placeholder so the extra portion (with face icons) of the cards line up\n      var peoplePopup = (<div>0 People </div>)\n    }\n\n    var rating = null\n    if (this.props.favorited) {\n      rating = 1\n    }\n    else {\n      rating = 0\n    }\n\n\n    return (\n      <Card key={this.props.key}>\n          <LazyLoad once height={150} placeholder={\n            <Image src={'http://placehold.jp/150x150.png'}/>}>\n          <Image \n            as={Link}\n            to={`/albums/autoview/${this.props.album_id}`}\n            size=\"big\"\n            src={this.props.albumCoverURL}/>\n          </LazyLoad>\n        <Card.Content>\n        <Header as='h4'>{this.props.albumTitle}</Header>\n        <Card.Meta>\n        {this.props.timestamp}\n\n        <br/>{this.props.photoCount} Photos {peoplePopup}\n\n        <div style={{textAlign:'right', position:'absolute',bottom:'10px',right:'10px'}}>\n          <Rating icon='heart' defaultRating={rating} maxRating={1} onRate={this.onRate}/>\n        </div>\n        </Card.Meta>        \n        </Card.Content>\n      </Card>\n    )\n  }\n}\n\n\n\nexport class AlbumAutoCardPlainPlaceholder extends Component {\n  render() {\n    return (\n      <div style={{padding:'5px'}}>\n        <div style={{\n          backgroundColor:\"#9f9f9f\",\n          width:'200px',\n          height:'200px',\n          borderRadius: \"0.3rem\"}}>\n        </div>\n        <div style={{\n          backgroundColor:\"#d4d4d4\",\n          width:'200px',\n          height:'150px',\n          borderRadius: \"0.3rem\"}}>\n        </div>\n      </div>\n    )\n  }\n}\n\nexport class AlbumAutoCardPlain extends Component {\n  constructor(props){\n    super(props)\n    this.onRate = this.onRate.bind(this)\n  }\n\n  onRate(e,d) {\n    if (d.rating === 0) {\n      console.log('unfavorited',this.props.album.id)\n      var rating = false\n    }\n    else {\n      console.log('favorited',this.props.album.id)\n      var rating = true\n    }\n    this.props.dispatch(toggleAlbumAutoFavorite(this.props.album.id,rating))\n  }\n\n  render() {\n    var rating = null\n    if (this.props.album.favorited) {\n      rating = 1\n    }\n    else {\n      rating = 0\n    }\n    var numPeople = this.props.album.people.length\n    var albumId = this.props.album.people.id\n    if (this.props.album.people.length > 0) {\n      var mappedPeopleIcons = this.props.album.people.map(function(person){\n        return (\n          <Image height={30} width={30} shape='circular' src={serverAddress+person.face_url}/>\n        )\n      })\n      mappedPeopleIcons = (\n        <Image.Group>{mappedPeopleIcons}</Image.Group>\n      )\n    }\n    else {\n      // empty placeholder so the extra portion (with face icons) of the cards line up\n      var mappedPeopleIcons = (<div style={{height:'30px', width:'30px', verticalAlign:'middle'}}></div>)\n    }\n    return (\n      <div style={{padding:'5px'}}>\n        <div style={{\n          border:'1px solid #dddddd',\n          width:'200px',\n          height:'350px',\n          position:'relative',\n          borderRadius: \"0.3rem\"}}>\n          <LazyLoad\n            height={200}\n            placeholder={\n              <Image \n                height={200}\n                width={200}\n                src={'/thumbnail_placeholder.png'}/>}>\n            <Image \n              as={Link}\n              to={`/albums/autoview/${this.props.album.id}`}\n              height={200} width={200} \n              src={serverAddress+this.props.album.cover_photo_url}/>\n          </LazyLoad>\n          <div style={{padding:'10px'}}>\n            <span style={{fontSize:'15',fontWeight:'bold'}}>{this.props.album.title}</span><br/>\n            <div style={{paddingTop:'5px'}}>\n              <span style={{color:'grey'}}>{this.props.album.timestamp.split('T')[0]}</span>\n            </div>\n            <div >\n              <span style={{color:'grey',fontWeight:'bold'}}>{this.props.album.photo_count} Photos</span>\n            </div>\n            <div >\n              <Popup\n                trigger={\n                  <span style={{\n                    color:'grey',\n                    fontWeight:'bold'}}>\n                    {this.props.album.people.length} People\n                  </span>}\n                content={mappedPeopleIcons}\n                basic/>\n            </div>\n            <div style={{bottom:'10px', right:'10px', position:'absolute'}}>\n              <Rating icon='heart' defaultRating={rating} maxRating={1} onRate={this.onRate}/>\n            </div>\n          </div>\n        </div>\n      </div>\n    )\n  }\n}\n\n\n\nexport class AlbumDateCardPlaceholder extends Component {\n  constructor(props){\n    super(props)\n  }\n  render() {\n    return (\n      <Card>\n        <VisibilitySensor>\n          <Image \n            src={'http://placehold.jp/150x150.png'}/>\n        </VisibilitySensor>\n        <Card.Content>\n        <Header as='h4'>{this.props.timestamp}</Header>\n        <Card.Meta>\n        <br/>{this.props.photoCount} Photos <div>{this.props.people.length} People </div>\n\n        <div style={{textAlign:'right', position:'absolute',bottom:'10px',right:'10px'}}>\n          <Rating icon='heart'/>\n        </div>\n        </Card.Meta>        \n        </Card.Content>\n      </Card>\n    )\n  }\n}\n\n\n\nexport class AlbumDateCard extends Component {\n  constructor(props){\n    super(props)\n    this.onRate = this.onRate.bind(this)\n  }\n\n  onRate(e,d) {\n    if (d.rating === 0) {\n      console.log('unfavorited',this.props.album_id)\n      var rating = false\n    }\n    else {\n      console.log('favorited',this.props.album_id)\n      var rating = true\n    }\n  }\n\n  render() {\n    var album_id = this.props.album_id\n    if (this.props.people.length > 0) {\n      var mappedPeopleIcons = this.props.people.map(function(person){\n        return (\n\n          <Label key={'date-album-card-'+album_id+'-person-label-'+person.id} as='a' image>\n            <img src={serverAddress+person.face_url} />\n            {person.name}\n          </Label>\n\n        )\n      })\n      var peoplePopup = (\n        <Popup flowing \n          trigger={<div>{this.props.people.length} People </div>}\n          content={<Label.Group>{mappedPeopleIcons}</Label.Group>}/>\n      )\n    }\n    else {\n      // empty placeholder so the extra portion (with face icons) of the cards line up\n      var peoplePopup = (<div>0 People </div>)\n    }\n\n    var rating = null\n    if (this.props.favorited) {\n      rating = 1\n    }\n    else {\n      rating = 0\n    }\n\n\n    return (\n      <Card key={this.props.key}>\n          <LazyLoad once height={300} placeholder={\n            <Image src={'http://placehold.jp/150x150.png'}/>}\n          >\n            <Image \n              as={Link}\n              to={`/albums/dateview/${this.props.album_id}`}\n              size=\"big\"\n              src={this.props.albumCoverURL}/>\n          </LazyLoad>\n        <Card.Content>\n        <Header as='h4'>{this.props.timestamp}</Header>\n        <Card.Meta>\n        <br/>{this.props.photoCount} Photos {peoplePopup}\n\n        <div style={{textAlign:'right', position:'absolute',bottom:'10px',right:'10px'}}>\n          <Rating icon='heart' defaultRating={rating} maxRating={1} onRate={this.onRate}/>\n        </div>\n        </Card.Meta>        \n        </Card.Content>\n      </Card>\n    )\n  }\n}\n\n\n\n\n\n\n\n\nexport class AlbumDateCardPlainPlaceholder extends Component {\n  render() {\n    return (\n      <div style={{paddingLeft:'15px'}}>\n        <div style={{\n          backgroundColor:\"white\",\n          width:'200px',\n          height:'200px'}}>\n        </div>\n        <div style={{\n          width:'200px',\n          height:'50px'}}>\n\n          <div style={{padding:'5px'}}>\n            <div style={{display:'inline-block',backgroundColor:'#b4b4b4',width:80.96,height:18}}></div><br/>\n            \n            <div>\n            <div style={{display:'inline-block',backgroundColor:'#dbdbdb',width:54.97,height:17}}></div><br/>\n            </div>\n            \n          </div>\n\n        </div>\n      </div>\n    )\n  }\n}\n\nexport class AlbumDateCardPlain extends Component {\n  constructor(props){\n    super(props)\n    this.onRate = this.onRate.bind(this)\n  }\n\n  onRate(e,d) {\n    if (d.rating === 0) {\n      console.log('unfavorited',this.props.album.id)\n      var rating = false\n    }\n    else {\n      console.log('favorited',this.props.album.id)\n      var rating = true\n    }\n  }\n\n  render() {\n    var rating = null\n    if (this.props.album.favorited) {\n      rating = 1\n    }\n    else {\n      rating = 0\n    }\n    var numPeople = this.props.album.people.length\n    return (\n      <div style={{paddingLeft:'15px'}}>\n\n        <div style={{\n          width:'200px',\n          height:'200px'}}>\n\n          <LazyLoad\n            height={200}\n            placeholder={\n              <Image \n                height={200}\n                width={200}\n                src={'/thumbnail_placeholder.png'}/>}>\n            <Image \n              as={Link}\n              to={`/albums/dateview/${this.props.album.id}`}\n              height={200} width={200} \n              src={serverAddress+this.props.album.cover_photo_url}/>\n          </LazyLoad>\n        </div>\n\n\n        <div style={{\n          width:'200',\n          height:'50px'}}>\n\n          <div style={{padding:'5px'}}>\n            <span style={{fontSize:'15',fontWeight:'bold'}}>{this.props.album.date}</span><br/>\n            <div>\n              <span style={{color:'grey',fontWeight:'bold'}}>{this.props.album.photo_count} Photos</span>\n            </div>\n          </div>\n        </div>\n\n\n      </div>\n    )\n  }\n}\n\n\n\n\n\n\n\n\n\n\nAlbumAutoCard = connect((store)=>{\n  return {}\n})(AlbumAutoCard)\n\nAlbumAutoCardPlain = connect((store)=>{\n  return {}\n})(AlbumAutoCardPlain)\n\n\nAlbumDateCard = connect((store)=>{\n  return {}\n})(AlbumDateCard)\n\nAlbumDateCardPlain = connect((store)=>{\n  return {}\n})(AlbumDateCardPlain)\n\nAlbumPeopleGallery = connect((store)=>{\n  return {\n    albumsPeople: store.albums.albumsPeople,\n    fetchingAlbumsPeople: store.albums.fetchingAlbumsPeople,\n    fetchedAlbumsPeople: store.albums.fetchedAlbumsPeople,\n  }\n})(AlbumPeopleGallery)\n\nAlbumAutoGallery = connect((store)=>{\n  return {\n    albumsAuto: store.albums.albumsAuto,\n    fetchingAlbumsAuto: store.albums.fetchingAlbumsAuto,\n    fetchedAlbumsAuto: store.albums.fetchedAlbumsAuto,\n  }\n})(AlbumAutoGallery)\n"
  },
  {
    "path": "src/components/authenticatedImage.js",
    "content": "import React, {Component} from 'react';\n\nimport { Card, Image as BasicImage, Header, Divider, Item, Loader, Dimmer, Breadcrumb,\n\n         Container, Label, Popup, Segment, Button, Icon} from 'semantic-ui-react';\n\nimport { connect } from \"react-redux\";\n\n\nexport class Image extends Component {\n\trender() {\n\t\tconst {auth,src, ...rest} = this.props\n\t\tconst newSource = {\n\t\t\turi:src,\n\t\t\theaders:{\n\t\t\t\tAuthorization: \"Bearer \" + auth.access.token\n\t\t\t}\n\t\t}\n\t\treturn (\n\t\t\t<BasicImage \n\t\t\t\t{...rest}\n\t\t\t\tsrc={newSource}/> \n\n\t\t\t\t\n\t\t)\n\t}\n}\n\nImage = connect((store)=>{\n  return {\n  \tauth: store.auth\n  }\n})(Image)\n"
  },
  {
    "path": "src/components/charts/countryPiChart.js",
    "content": "import React, {Component} from 'react'\nimport {Segment, Header, Loader} from 'semantic-ui-react'\nimport Dimensions from 'react-dimensions'\nimport { connect } from \"react-redux\";\nimport {fetchPhotoCountryCounts} from '../../actions/utilActions'\n\nimport Month from 'calendar-months';\nimport {Chart, Bars, Lines, Ticks, Layer, Pies, Transform} from 'rumble-charts'\nimport {Sunburst, LabelSeries} from 'react-vis';\n\n\n\n\n\nexport class CountryPiChart extends Component {\n  constructor(props) {\n    super(props)\n  }\n  componentDidMount() {\n    if (!this.props.fetchedPhotoCountryCounts)\n    {\n      this.props.dispatch(fetchPhotoCountryCounts())\n    }\n  }\n  render(){\n    if (this.props.fetchedPhotoCountryCounts) {\n      var countDict = this.props.photoCountryCounts\n      var counts = Object.keys(countDict).map(function(key){\n        return countDict[key]\n      })\n      if (counts.length === 0){counts = [1]}\n      console.log(counts)\n      var series = [{data:counts}]\n      var map = (\n        <div>\n          <Header as='h3'>Photo Counts by Location</Header>\n            <Chart \n              width={this.props.containerWidth-50}\n              height={200}\n              series={series}>\n              <Transform method={['transpose','stack']}>\n                <Pies combined={true}/>\n              </Transform>\n            </Chart>\n        </div>\n      )\n    }\n    else {\n      var h = 200\n      var w = `${this.props.containerWidth-50}px`\n      var map = (\n        <div>\n          <Header as='h3'>Photo Counts by Location</Header>\n            <div style={{height:h, width:w}}>\n            <Loader active/>\n            </div>\n        </div>\n      )\n    }\n    return (\n      <Segment style={{zIndex:2, height:300}}>\n        {map}\n      </Segment>\n    )\n  }\n}\n\n\n\n\n\nCountryPiChart = connect((store)=>{\n  return {\n    photoCountryCounts: store.util.photoCountryCounts,\n    fetchingPhotoCountryCounts: store.util.fetchingPhotoCountryCounts,\n    fetchedPhotoCountryCounts: store.util.fetchedPhotoCountryCounts,\n  }\n})(CountryPiChart)\n\n\nexport default Dimensions()(CountryPiChart)"
  },
  {
    "path": "src/components/charts/wordCloud.js",
    "content": "import React, {Component} from 'react'\nimport {Segment, Header,Loader} from 'semantic-ui-react'\nimport Dimensions from 'react-dimensions'\nimport { connect } from \"react-redux\";\nimport {fetchWordCloud} from '../../actions/utilActions'\n\nimport Month from 'calendar-months';\nimport {Chart, Bars, Lines, Ticks, Layer, Pies, Transform, Cloud} from 'rumble-charts'\n\n\nexport class WordCloud extends Component {\n  constructor(props) {\n    super(props)\n  }\n\n  componentDidMount() {\n    if (!this.props.fetchedWordCloud) {\n      this.props.dispatch(fetchWordCloud())\n    }\n  }\n\n\n\n  render(){\n    if (this.props.type==='captions'){\n      var title = 'Things'\n    }\n    else if (this.props.type==='location'){\n      var title = 'Locations'\n    }\n    else {\n      var title = 'People'\n    }\n\n\n\n    if (this.props.fetchedWordCloud) {\n      var wordCloud = this.props.wordCloud\n      if (this.props.type==='captions'){\n        var series = [{data:wordCloud.captions}]\n      }\n      else if (this.props.type==='location'){\n        var series = [{data:wordCloud.locations}]        \n      }\n      else {\n        var series = [{data:wordCloud.people}]        \n      }\n      var chart = (\n        <div>\n          <Header as='h3'>{title}</Header>\n            <Chart \n              width={this.props.containerWidth-50}\n              height={this.props.height-70}\n              series={series}>\n              <Transform method={['transpose']}>\n                <Cloud font='sans-serif' minFontsSize={10} maxFontSize={50}/>\n              </Transform>\n            </Chart>\n        </div>\n      )\n    }\n    else {\n      var h = this.props.height-70\n      var w = this.props.containerWidth+60\n      var chart = (\n        <div>\n          <Header as='h3'>{title}{\" \"}<Loader inline size='mini' active/></Header>\n            <div style={{height:h, width:w}}>\n            \n            </div>\n        </div>\n      )\n    }\n    return (\n            <div>\n        {chart}\n        </div>\n    )\n  }\n}\n\nWordCloud = connect((store)=>{\n  return {\n    wordCloud: store.util.wordCloud,\n    fetchingWordCloud: store.util.fetchingWordCloud,\n    fetchedWordCloud: store.util.fetchedWordCloud,\n  }\n})(WordCloud)\n\n\nexport default Dimensions()(WordCloud)\n"
  },
  {
    "path": "src/components/chartyPhotosScrollbar.js",
    "content": "import React, {Component} from 'react'\nimport {Segment, Header, Container} from 'semantic-ui-react'\nimport {XYPlot, XAxis, YAxis, HorizontalGridLines, LineMarkSeries, LineSeries,\n        VerticalBarSeries,HorizontalBarSeries, makeHeightFlexible, makeVisFlexible,\n        MarkSeries, VerticalGridLines, Crosshair, DiscreteColorLegend} from 'react-vis';\n\nimport {Chart, Transform, Bars} from 'rumble-charts'\n\nimport Dimensions from 'react-dimensions'\nimport { connect } from \"react-redux\";\nimport { Graph } from 'react-d3-graph';\nimport {fetchDateAlbumsList, fetchAutoAlbumsList} from '../actions/albumsActions'\n\nimport Month from 'calendar-months';\n\n\n/*\n{\n  x: el.value.x,\n  y: el.value.y,\n  size: el.value.size,\n  name: el.person_name,\n}\n*/\n\nconst FlexibleScroll = makeHeightFlexible(XYPlot)\n\nexport class ChartyPhotosScrollbar extends Component {\n  constructor(props) {\n    super(props)\n    this.preprocessData = this.preprocessData.bind(this)\n  }\n\n  componentWillMount() {\n/*\n    this.props.dispatch(fetchDateAlbumsList())\n*/\n  }\n\n  preprocessData() {\n    var firstEvent = this.props.albumsDateList[this.props.albumsDateList.length-1]\n    var lastEvent = this.props.albumsDateList[0]\n    var firstYear = firstEvent.date.split('-')[0]\n    var firstMonth = firstEvent.date.split('-')[1]\n    var lastYear = lastEvent.date.split('-')[0]\n    var lastMonth = lastEvent.date.split('-')[1]\n\n    var beginning = new Month(firstMonth, firstYear)\n    var end = new Month(lastMonth, lastYear)\n\n\n    var currentMonth = beginning.lastMonth()\n\n    var dataPhotoCounts = []\n    var xAxisLabels = []\n    var xTickValues = []\n\n    var idx = 0\n    while (!currentMonth.lastMonth().isThisMonth()) {\n      currentMonth = currentMonth.nextMonth()\n      var y = currentMonth.year.toString()\n      var m = currentMonth.month.toString()\n\n      if (m.length==1){\n        m = '0'+m\n      }\n\n      //photo counts\n      var thisMonthDateAlbums = this.props.albumsDateList.filter(function(album){\n        var albumYear = album.date.split('-')[0]\n        var albumMonth = album.date.split('-')[1]\n        if (albumYear==y && albumMonth==m){\n          return true}\n        else {\n          return false}\n      })\n\n      var thisMonthPhotoCounts = thisMonthDateAlbums.map(function(album){\n        return album.photo_count\n      })\n\n      var thisMonthTotalPhotoCount = 0\n      for (var i in thisMonthPhotoCounts) {\n        thisMonthTotalPhotoCount += thisMonthPhotoCounts[i]\n      }\n\n\n\n      var datumPhotoCounts = {\n        y: idx,\n        x: thisMonthTotalPhotoCount,\n        month: y+m\n      }\n\n\n\n\n      if (m=='01') {\n        var xAxisLabel = y+'-'+m\n        xTickValues.push(idx)\n      }\n      else {\n        var xAxisLabel = m\n        if (m=='03'||m=='06'||m=='09'){\n          xTickValues.push(idx)\n        }\n      }\n\n\n      xAxisLabels.push(xAxisLabel)\n      dataPhotoCounts.push(datumPhotoCounts)\n      idx += 1\n    }\n\n    return (\n      {\n        markerSeriesPhotoCount:dataPhotoCounts,\n        xAxisLabels:xAxisLabels,\n        xTickValues: xTickValues\n      }\n    )\n  }\n\n  render() {\n    if (this.props.fetchedAlbumsDateList){\n      try {      \n        var preprocessed = this.preprocessData()\n      }\n      catch (err) {\n        var preprocessed = {\n          markerSeriesPhotoCount:[],\n          xAxisLabels:[],\n          xTickValues:[]\n        }\n      }\n    }\n    else {\n      var preprocessed = {\n        markerSeriesPhotoCount:[],\n        xAxisLabels:[],\n        xTickValues:[]\n      }\n    }\n    var reversed = preprocessed.markerSeriesPhotoCount.reverse()\n\n    console.log(series)\n    console.log(reversed)\n\n    var data = reversed.map(function(datum){\n      return datum.x\n    })\n\n    var series = [{data:[0,1,2,3,4]}]\n\n    return (\n      <Chart width={30} height={500} series={series}>\n        <Transform method={['rotate']}>\n          <Bars innerPadding='0%' colors={['#666666']}\n            barStyle={{fillOpacity:0.8}}\n            barAttributes={{\n              onMouseMove: e => e.target.style.fillOpacity = 1,\n              onMouseLeave: e => e.target.style.fillOpacity = 0.8,\n              onClick: (e,d) => console.log(e,d)\n            }}/>\n\n        </Transform>\n      </Chart>    \n    )\n\n  }\n}\n\n\n\nChartyPhotosScrollbar = connect((store)=>{\n  return {\n    albumsDateList: store.albums.albumsDateList,\n    fetchingAlbumsDateList: store.albums.fetchingAlbumsDateList,\n    fetchedAlbumsDateList: store.albums.fetchedAlbumsDateList,\n  }\n})(ChartyPhotosScrollbar)\n\nexport default Dimensions()(ChartyPhotosScrollbar)"
  },
  {
    "path": "src/components/egoGraph.js",
    "content": "import React, {Component} from 'react'\nimport {Segment, Header, Loader} from 'semantic-ui-react'\nimport {XYPlot, XAxis, YAxis, HorizontalGridLines, \n\t\t\t\tMarkSeries, VerticalGridLines, Crosshair} from 'react-vis';\nimport Dimensions from 'react-dimensions'\nimport { connect } from \"react-redux\";\nimport { Graph } from 'react-d3-graph';\nimport { fetchSocialGraph, fetchEgoGraph } from '../actions/peopleActions'\nimport {Server, serverAddress} from '../api_client/apiClient'\nimport LazyLoad from 'react-lazyload';\n\n\n\nexport class EgoGraph extends Component {\n\tcomponentWillMount() {\n\t\tif (!this.props.egoGraph.hasOwnProperty(this.props.person_id)){\n\t\t\tthis.props.dispatch(fetchEgoGraph(this.props.person_id))\n\t\t}\n\t}\n\n\trender(){\n\n\t\tvar data = this.props.socialGraph\n\t\tvar myConfig = {\n\t\t\tautomaticRearrangeAfterDropNode: false,\n\t\t\tstaticGraph:false,\n\t\t    highlightBehavior: true,\n\t\t    maxZoom: 4,\n\t\t    minZoom: 0.1,\n\t\t    node: {\n\t\t    \tfontSize: 17,\n\t\t    \tsize: 600,\n\t\t        color: 'lightblue',\n\t\t        highlightFontSize: 17,\n\t\t        highlightStrokeColor: 'orange'\n\t\t    },\n\t\t    link: {\n\t\t        highlightColor: 'orange',\n\t\t        color: '#12939A',\n\t\t    },\n\t\t    height: this.props.height,\n\t\t    width: this.props.width\n\t\t}\n\n\t\tif (this.props.egoGraph.hasOwnProperty(this.props.person_id)) {\n\t\t\tvar graph = <Graph id='social-graph'\n\t\t\t\t\tconfig={myConfig}\n\t\t\t\t\tdata={this.props.egoGraph[this.props.person_id]}/>\n\t\t}\n\t\telse {\n\t\t\tvar graph = <Loader/>\n\t\t}\n\n\t\treturn (\n\t        <div style={{padding:0,height:this.props.height}}>\n  \t\t\t{graph}\n\t\t\t</div>\n\t\t)\n\t}\n}\n\n\n\n\nEgoGraph = connect((store)=>{\n  return {\n    egoGraph: store.people.egoGraph,\n    fetching: store.people.fetchingEgoGraph,\n    fetched: store.people.fetchedEgoGraph,\n  }\n})(EgoGraph)\n\nexport default Dimensions()(EgoGraph)"
  },
  {
    "path": "src/components/eventCountMonthGraph.js",
    "content": "import React, {Component} from 'react'\nimport {Loader, Grid, Segment, Header} from 'semantic-ui-react'\nimport Dimensions from 'react-dimensions'\nimport { connect } from \"react-redux\";\nimport {fetchDateAlbumsList, fetchAutoAlbumsList} from '../actions/albumsActions'\nimport {fetchPhotoMonthCounts} from '../actions/utilActions'\n\nimport Month from 'calendar-months';\nimport {Chart, Bars, Lines, Ticks, Layer} from 'rumble-charts'\n\n\n/*\n{\n  x: el.value.x,\n  y: el.value.y,\n  size: el.value.size,\n  name: el.person_name,\n}\n*/\n\nexport class EventCountMonthGraph extends Component {\n  constructor(props) {\n    super(props)\n  }\n\n  componentWillMount() {\n    if (!this.props.fetchedPhotoMonthCounts){\n      this.props.dispatch(fetchPhotoMonthCounts())\n    }\n  }\n\n\n  render() {\n    if (this.props.fetchedPhotoMonthCounts) {\n      var countDict = this.props.photoMonthCounts\n      var series = countDict.map(function(el){\n        return {y:el.count,month:el.month}\n      })\n      var xticks = countDict.map(function(el){\n        return el.month\n      })\n      console.log(xticks)\n    }\n    else {\n      return (\n        <div style={{height:280}}>\n        <Header as='h3'>Monthly Photo Counts</Header>\n        <Segment style={{height:250}} basic>\n        <Loader active/>\n        </Segment>\n        </div>\n      )\n    }\n\n    var data = [{\n      data: series\n    }, {\n      data: [0,1,2]\n    }]\n\n    return (\n        <div style={{height:280}}>\n          <Header as='h3'>Monthly Photo Counts</Header>\n          <div>\n            <Chart width={this.props.containerWidth} height={250} series={[data[0]]}>\n              <Layer width='85%' height='85%' position='middle center'>\n                <Ticks\n                  axis='y'\n                  lineLength='100%'\n                  lineVisible={true}\n                  lineStyle={{stroke:'lightgray'}}\n                  labelStyle={{textAnchor:'end',dominantBaseline:'middle',fill:'grey'}}\n                  labelAttributes={{x: -15}}\n                  labelFormat={label => label}/>\n                <Ticks\n                  lineVisible={true}\n                  lineLength='100%'\n                  axis='x'\n                  labelFormat={label => xticks[label]}\n                  labelStyle={{textAnchor:'middle',dominantBaseline:'text-before-edge',fill:'black'}}\n                  labelAttributes={{y: 5}}/>\n                <Bars />\n              </Layer>\n            </Chart>\n          </div>\n        </div>\n    )\n  }\n}\n\n\n\nEventCountMonthGraph = connect((store)=>{\n  return {\n    photoMonthCounts: store.util.photoMonthCounts,\n    fetchingPhotoMonthCounts: store.util.fetchingPhotoMonthCounts,\n    fetchedPhotoMonthCounts: store.util.fetchedPhotoMonthCounts,\n  }\n})(EventCountMonthGraph)\n\n\nexport default Dimensions()(EventCountMonthGraph)\n"
  },
  {
    "path": "src/components/faceClusterGraph.js",
    "content": "import React, { Component } from \"react\";\nimport { Loader, Header, Label } from \"semantic-ui-react\";\nimport {\n  XYPlot,\n  HorizontalGridLines,\n  Hint,\n  MarkSeries,\n  VerticalGridLines,\n} from \"react-vis\";\nimport Dimensions from \"react-dimensions\";\nimport { connect } from \"react-redux\";\nimport { serverAddress } from \"../api_client/apiClient\";\nimport { clusterFaces } from \"../actions/facesActions\";\nimport { SecuredImageJWT } from \"./SecuredImage\";\nexport class FaceClusterScatter extends Component {\n  state = {\n    crosshairValues: [],\n    hintValue: null,\n  };\n\n  componentWillMount() {\n    this.props.dispatch(clusterFaces());\n  }\n  render() {\n    var person_names = [\n      ...new Set(\n        this.props.facesVis.map(function (el) {\n          return el.person_name;\n        })\n      ),\n    ];\n    var facesVis = this.props.facesVis;\n\n    var mappedScatter = person_names.map(function (person_name, idx) {\n      var thisPersonVis = facesVis.filter(function (el) {\n        return person_name === el.person_name;\n      });\n      var thisPersonData = thisPersonVis.map(function (el) {\n        return {\n          x: el.value.x,\n          y: el.value.y,\n          size: el.value.size,\n          name: el.person_name,\n          color: el.color,\n          face_url: el.face_url,\n          photo: el.photo,\n        };\n      });\n      return (\n        <MarkSeries\n          colorType=\"literal\"\n          key={\"cluster-marker-\" + idx}\n          animation\n          onValueClick={(d, info) => {\n            this.setState({ hintValue: d });\n          }}\n          data={thisPersonData}\n        />\n      );\n    }, this);\n    if (this.props.clustered) {\n      return (\n        <div style={{ padding: 10 }}>\n          <Header as=\"h3\">\n            Face Embeddings\n            <Header.Subheader>\n              People with similar looking faces should be grouped closer\n              together in this plot (Click on a point to see the label).\n            </Header.Subheader>\n          </Header>\n\n          <XYPlot\n            width={this.props.containerWidth - 30}\n            height={this.props.height}\n          >\n            <HorizontalGridLines />\n            <VerticalGridLines />\n            {mappedScatter}\n            {this.state.hintValue && (\n              <Hint value={this.state.hintValue}>\n                <Label color=\"black\">\n                  {this.state.hintValue.name}\n                  <SecuredImageJWT\n                    style={{ borderRadius: \"1em\" }}\n                    floated=\"right\"\n                    height={70}\n                    width={70}\n                    shape=\"rounded\"\n                    src={serverAddress + this.state.hintValue.face_url}\n                  ></SecuredImageJWT>\n                </Label>\n              </Hint>\n            )}\n          </XYPlot>\n        </div>\n      );\n    } else {\n      return (\n        <div style={{ padding: 10 }}>\n          <Loader active />\n        </div>\n      );\n    }\n  }\n}\n\nFaceClusterScatter = connect((store) => {\n  return {\n    facesVis: store.faces.facesVis,\n    training: store.faces.training,\n    trained: store.faces.trained,\n    clustering: store.faces.clustering,\n    clustered: store.faces.clustered,\n  };\n})(FaceClusterScatter);\n\nexport default Dimensions()(FaceClusterScatter);\n"
  },
  {
    "path": "src/components/faces.js",
    "content": "import React, { Component } from 'react';\nimport { connect } from \"react-redux\";\nimport { Image, Header, Message, Dropdown, Divider, Card, \n         Container, Segment, Button, Icon, Popup, Loader, \n         Dimmer, Grid, Reveal, Statistic, Label, Table,\n         Modal } from 'semantic-ui-react';\nimport { fetchPeople, \n         addPerson ,\n         addPersonAndSetLabelToFace} from '../actions/peopleActions';\nimport { fetchFaces, \n         fetchLabeledFaces,\n         fetchInferredFaces,\n         deleteFaceAndFetchNext, \n         labelFacePerson ,\n         fetchFaceToLabel,\n         loadFaceToLabel,\n         trainFaces,\n         labelFacePersonAndFetchNext} from '../actions/facesActions';\nimport VisibilitySensor from 'react-visibility-sensor'\nimport {Server, serverAddress} from '../api_client/apiClient'\nimport LazyLoad from 'react-lazyload';\n\n\nexport class FaceStatistics extends Component {\n  render() {\n    return (\n      <Statistic.Group size='mini'>\n        <Statistic>\n          <Statistic.Value>{this.props.labeledFaces.length}</Statistic.Value>\n          <Statistic.Label>Labelled</Statistic.Label>\n        </Statistic>\n        <Statistic>\n          <Statistic.Value>{this.props.inferredFaces.length}</Statistic.Value>\n          <Statistic.Label>Inferred</Statistic.Label>\n        </Statistic>\n      </Statistic.Group>\n    )\n  }\n}\n\n\nexport class EditableFaceIcon extends Component {\n  state = {}\n\n  handleShow = () => this.setState({ active: true })\n  handleHide = () => this.setState({ active: false })\n  handleClick = () => this.props.dispatch(loadFaceToLabel(this.props.face))\n\n  render() {\n    const { active } = this.state\n    const content = (\n      <Icon link color='black' name='write' onClick={this.handleClick}/>\n    )\n    return (\n      <LazyLoad threshold\n        height={60} \n        width={60} \n        placeholder={\n          <Image height={60} width={60} avatar\n            shape='rounded' src={'/unknown_user.jpg'}/>\n        }>\n        <Popup\n          inverted\n          trigger={\n            <Dimmer.Dimmable \n              as={Image}\n              height={60}\n              width={60}\n              avatar\n              dimmed={active}\n              shape='rounded'\n              dimmer={{ active, content, inverted:true}}\n              onMouseEnter={this.handleShow}\n              onMouseLeave={this.handleHide}\n              src={this.props.face_url}/>}\n            content={this.props.person_name}/>\n      </LazyLoad>\n    )\n  }\n}\n\nexport class FaceTableLabeled extends Component{\n  componentWillMount() {\n    this.props.dispatch(fetchLabeledFaces())\n  }\n  render() {\n    var person_names = [... new Set(this.props.labeledFaces.map(function(face){return face.person.name}))]\n    var faces = this.props.labeledFaces\n    var mappedRows = person_names.map(function(person_name){\n      var thisPersonsFaces = faces.filter(function(face){\n        return person_name===face.person.name\n      })\n      var mappedFaceIcons = thisPersonsFaces.map(function(face){\n        return (\n          <EditableFaceIcon\n            key={face.id}\n            face={face}\n            person_name={face.person.name}\n            face_url={serverAddress+face.face_url}\n            face_id={face.id}/>        \n        )\n      })\n      return (\n        <Table.Row key={\"table-row-labeled-\"+person_name}>\n          <Table.Cell width={3}>{person_name}</Table.Cell>\n          <Table.Cell>{mappedFaceIcons}</Table.Cell>\n        </Table.Row>\n      )\n    })\n    return (\n      <Table compact celled selectable>\n        <Table.Header>\n          <Table.Row>\n            <Table.HeaderCell>Person</Table.HeaderCell>\n            <Table.HeaderCell>Faces</Table.HeaderCell>\n          </Table.Row>\n        </Table.Header>\n        <Table.Body>\n          {mappedRows}\n        </Table.Body>\n      </Table>\n    )\n  }\n}\n\nexport class FaceTableInferred extends Component{\n  componentWillMount() {\n    this.props.dispatch(fetchInferredFaces())\n  }\n  render() {\n    var person_names = [... new Set(this.props.inferredFaces.map(function(face){return face.person.name}))]\n    var faces = this.props.inferredFaces\n    var mappedRows = person_names.map(function(person_name){\n      var thisPersonsFaces = faces.filter(function(face){\n        return person_name===face.person.name\n      })\n      var mappedFaceIcons = thisPersonsFaces.map(function(face){\n        return (\n          <EditableFaceIcon\n            key={face.id}\n            face={face}\n            person_name={face.person.name}\n            face_url={serverAddress+face.face_url}\n            face_id={face.id}/>        \n        )\n      })\n      return (\n        <Table.Row key={\"table-row-inferred-\"+person_name}>\n          <Table.Cell width={3}>{person_name}</Table.Cell>\n          <Table.Cell>{mappedFaceIcons}</Table.Cell>\n        </Table.Row>\n      )\n    })\n    return (\n      <Table compact celled selectable >\n        <Table.Header>\n          <Table.Row>\n            <Table.HeaderCell>Person</Table.HeaderCell>\n            <Table.HeaderCell>Faces</Table.HeaderCell>\n          </Table.Row>\n        </Table.Header>\n        <Table.Body>\n          {mappedRows}\n        </Table.Body>\n      </Table>\n    )\n  }\n}\n\n\n\nexport class FacesLabeled extends Component {\n  componentWillMount() {\n    this.props.dispatch(fetchLabeledFaces())\n  }\n  render() {\n    var mappedFaceCards = this.props.labeledFaces.map(function(face){\n      return (\n          <EditableFaceIcon\n            key={face.id}\n            person_name={face.person.name}\n            face_url={serverAddress+face.face_url}\n            face_id={face.id}/>\n      )\n    })\n    return (\n      <Container>\n        <Header dividing as='h2'>\n          Labeled Faces\n          <Label>\n            <Icon name='user circle outline' />{this.props.labeledFaces.length}\n          </Label>\n        </Header>\n        {mappedFaceCards}\n      </Container>\n    )\n  }\n}\n\nexport class FacesInferred extends Component {\n  componentWillMount() {\n    this.props.dispatch(fetchInferredFaces())\n  }\n  render() {\n    var mappedFaceCards = this.props.inferredFaces.map(function(face){\n      return (\n          <EditableFaceIcon\n            key={face.id}\n            person_name={face.person.name}\n            face_url={serverAddress+face.face_url}\n            face_id={face.id}/>\n      )\n    })\n    return (\n      <Container>\n        <Header dividing as='h2'>\n          Inferred Faces\n          <Label>\n            <Icon name='user circle outline' />{this.props.inferredFaces.length}\n          </Label>\n        </Header>\n        {mappedFaceCards}\n      </Container>\n    )\n  }\n}\n\n\nexport class FaceCards extends Component {\n  componentWillMount() {\n    this.props.dispatch(fetchFaces())\n    this.props.dispatch(fetchPeople())\n  }\n\n  render() {\n    var mappedFaceCards = this.props.faces.map(function(face){\n      return (\n        <FaceCard\n          key={face.id}\n          face_id={face.id}\n          name={face.person.name}\n          face_url={serverAddress+face.face_url}/>\n      )\n    })\n    return (\n      <div>\n        <Button>Train</Button>\n        <Card.Group>\n            {mappedFaceCards}\n        </Card.Group>\n      </div>\n    )\n  }\n}\n\nexport class FaceToLabel extends Component {\n  componentWillMount() {\n    this.props.dispatch(fetchFaceToLabel())\n    this.props.dispatch(fetchPeople())\n  }\n\n  render() {\n    console.log(this.props)\n    return (\n          <FaceCard\n            card_loading={this.props.faceToLabelFetching}\n            key={this.props.faceToLabel.id}\n            face_id={this.props.faceToLabel.id}\n            name={\"hello\"}\n            image_hash={this.props.faceToLabel.photo}\n            person_label_probability={this.props.faceToLabel.person_label_probability}\n            face_url={this.props.faceToLabel.image}/>\n    )\n  }\n}\n\n\nexport class FaceCard extends Component {\n  state = { modalOpen: false }\n  handleOpen = () => this.setState({ modalOpen: true })\n  handleClose = () => this.setState({ modalOpen: false })\n\n  render() {\n    let image = null;\n    if (this.props.card_loading){\n      image = (\n        <div>\n          <Dimmer active inverted>\n            <Loader inverted />\n          </Dimmer>\n          <Image\n            src={'/unknown_user.jpg'}\n            floated='right'\n            hidden\n            height={70}\n            width={70}\n            shape='rounded'/>\n        </div>\n      )\n    }\n    else {\n      image = <Image \n        style={{borderRadius:'1em'}}\n        floated='right'\n        height={70}\n        width={70}\n        shape='rounded'\n        src={this.props.face_url} />\n    }\n\n    if (this.props.face_id == null){\n      return (\n          <Card fluid style={{height:220}}>\n            <Card.Content>\n              <Card.Header>\n                {image}\n                {\"No more face to label!\"}\n              </Card.Header>\n            </Card.Content>\n            <Card.Content extra>\n              <FaceCardMenu face_id={this.props.face_id}/>\n            </Card.Content>\n          </Card>      \n      )\n    }\n\n    return (\n      <div>\n        <Card fluid style={{height:220}}>\n          <Card.Content>\n            <Card.Header>\n              {image}\n              {\"Who is this person?\"}\n            </Card.Header>\n          </Card.Content>\n          <Card.Content extra>\n            <FaceCardMenu face_id={this.props.face_id} image_hash={this.props.image_hash}/>\n          </Card.Content>\n        </Card>\n\n\n      </div>\n    );\n  }\n}\n\nexport class FaceCardMenu extends Component {\n  handleAddPerson = (e, {value}) => {\n    console.log('handing add', value, this.props.face_id)\n    this.props.dispatch(addPerson(value))\n    this.currentValue = value\n  }\n\n  handleChange = (e, {value}) => {\n    console.log('handing change')\n    this.currentValue = value\n  }\n\n  handleDeleteFace = e => {\n    this.props.dispatch(deleteFaceAndFetchNext(this.props.face_id))\n  }\n\n  handleSubmit = e => {\n    this.props.dispatch(labelFacePersonAndFetchNext(this.props.face_id,this.currentValue))\n  }\n\n  render() {\n    if (this.props.face_id == null){\n      var buttonGroup = (\n          <Popup\n            trigger={<Button \n              color='green'\n              fluid \n              icon='star'/>}\n            position=\"top center\"\n            content=\"Woohoo!\"\n            size=\"tiny\"\n            inverted\n            basic/>\n      )\n    }\n    else {\n      var buttonGroup = (\n        <div className='ui four buttons'>\n          <Popup\n            trigger={<Button \n              onClick={this.handleDeleteFace}\n              color='red' \n              icon='trash'/>}\n            position=\"top center\"\n            content=\"Forget this face\"\n            size=\"tiny\"\n            inverted\n            basic/>\n\n          <Popup \n            trigger={\n              <Button \n              color='orange' \n              icon='photo'/>\n            }\n            on='hover'\n            flowing\n            hideOnScroll\n            position=\"bottom center\"\n            content={<Image size='large' src={serverAddress+'/media/thumbnails_big/'+this.props.image_hash+'.jpg'}/>}/>\n        \n          <Popup \n            trigger={\n              <Button fluid\n                loading={this.props.training} \n                color='blue'  \n                onClick={()=>{this.props.dispatch(trainFaces())}}>\n                <Icon name='lightning'/>\n              </Button>\n            }\n            inverted\n            size=\"tiny\"\n            position=\"top center\"\n            content=\"Train the classifier\"/>    \n\n          <Popup\n            trigger={<Button \n              onClick={this.handleSubmit}\n              color='green' \n              icon='plus'/>}\n            position=\"top center\"\n            content=\"Submit label and show next face\"\n            size=\"tiny\"\n            inverted\n            basic/>\n        </div>\n      )\n    }\n\n    return (\n      <div>\n        <Dropdown  \n          placeholder='Choose Person' \n          search \n          fluid\n          selection \n          allowAdditions\n          loading={this.props.personAdding || this.props.peopleFetching}\n          onAddItem={this.handleAddPerson}\n          onChange={this.handleChange}\n          options={this.props.people} />\n          <Divider/>\n          {buttonGroup}\n        </div>\n    )\n  } \n}\n\nEditableFaceIcon = connect((store)=>{\n  return {\n    faceToLabel: store.faces.faceToLabel\n  }\n})(EditableFaceIcon)\n\nFaceTableInferred = connect((store)=>{\n  return {\n    inferredFaces: store.faces.inferredFaces\n  }\n})(FaceTableInferred)\n\nFaceTableLabeled = connect((store)=>{\n  return {\n    labeledFaces: store.faces.labeledFaces,\n  }\n})(FaceTableLabeled)\n\nFaceStatistics = connect((store)=>{\n  return {\n    labeledFaces: store.faces.labeledFaces,\n    inferredFaces: store.faces.inferredFaces\n  }\n})(FaceStatistics)\n\nFacesLabeled = connect((store)=>{\n  return {\n    labeledFaces: store.faces.labeledFaces,\n    fetchingLabeledFaces: store.faces.fetchingLabeledFaces,\n    fetchedLabeledFaces: store.faces.fetchedLabeledFaces\n  }\n})(FacesLabeled)\n\nFacesInferred = connect((store)=>{\n  return {\n    inferredFaces: store.faces.inferredFaces,\n    fetchingInferredFaces: store.faces.fetchingInferredFaces,\n    fetchedInferredFaces: store.faces.fetchedInferredFaces\n  }\n})(FacesInferred)\n\nFaceToLabel = connect((store)=>{\n  return {\n    faceToLabel: store.faces.faceToLabel,\n    facesFetched:store.faces.fetched,\n    faceToLabelFetching: store.faces.fetchingFaceToLabel,\n    faceToLabelFetched: store.faces.fetchedFaceToLabel,\n  }\n})(FaceToLabel)\n\nFaceCards = connect((store)=>{\n  return {\n    faces: store.faces.faces,\n    faceToLabel: store.faces.faceToLabel,\n    facesFetched:store.faces.fetched\n  }\n})(FaceCards)\n\nFaceCard = connect((store)=>{\n  return {\n    people: store.people.people,\n    peopleFetching: store.people.fetching,\n    training: store.faces.training\n  }\n})(FaceCard)\n\nFaceCardMenu = connect((store)=>{\n  return {\n    training: store.faces.training,\n    faceToLabel: store.faces.faceToLabel,\n    people: store.people.people,\n    peopleFetching: store.people.fetching,\n    personAdding: store.people.adding,\n  }\n})(FaceCardMenu)\n"
  },
  {
    "path": "src/components/imageInfoTable.js",
    "content": "import React, {Component} from 'react'\nimport {Table, Header, Divider, Rating, Grid, List} from 'semantic-ui-react'\nimport { connect } from \"react-redux\";\nimport {LocationMap} from \"./maps\"\n\nexport class ImageInfoTable extends Component {\n\trender() {\n        var photo = this.props.photo\n        console.log(photo)\n        if (photo.exif_json != null){\n            var exif = photo.exif_json\n        }\n        else {\n            var exif = {}\n        }\n\n        if (photo.geolocation_json.features != undefined && photo.geolocation_json.features.length > 0){\n            var geolocation = photo.search_location\n\t\t}\n\t\telse {\n\t\t\tvar geolocation = 'No location information'\n\t\t}\n\n        if (photo.people != null && Object.keys(photo.people).length > 0){\n            var people = photo.people\n        }\n        else {\n            var people = [\"Could not find faces.\"]\n        }\n\n        if (photo.search_captions != null) {\n            var captions = photo.search_captions.split(\",\").map((caption)=><List.Item>{caption}</List.Item>)\n        } \n        else {\n            var captions = null\n        }\n\n\t\treturn (\n            <div>\n\n                <div style={{padding:10}}>\n                    <Header inverted as='h3'>Map</Header>\n                    <LocationMap photos={[photo]}/>\n                </div>\n\n                <div style={{padding:10}}>\n                    <Grid stackable columns={3} divided>\n                        <Grid.Row>\n                        <Grid.Column>\n                            <Header inverted as='h3'>EXIF Information</Header>\n                            <Table basic inverted compact='very' celled striped>\n                                <Table.Body>\n                                    <Table.Row>\n                                        <Table.Cell>Width</Table.Cell>\n                                        <Table.Cell>{exif['EXIF ExifImageWidth']}</Table.Cell>\n                                    </Table.Row>\n                                    <Table.Row>\n                                        <Table.Cell>Length</Table.Cell>\n                                        <Table.Cell>{exif['EXIF ExifImageLength']}</Table.Cell>\n                                    </Table.Row>\n                                    <Table.Row>\n                                        <Table.Cell>Aperture</Table.Cell>\n                                        <Table.Cell>{exif['EXIF ApertureValue']}</Table.Cell>\n                                    </Table.Row>\n                                    <Table.Row>\n                                        <Table.Cell>Exposure</Table.Cell>\n                                        <Table.Cell>{exif['EXIF ExposureTime']}</Table.Cell>\n                                    </Table.Row>\n                                    <Table.Row>\n                                        <Table.Cell>Shutter Speed</Table.Cell>\n                                        <Table.Cell>{exif['EXIF ShutterSpeedValue']}</Table.Cell>\n                                    </Table.Row>\n                                    <Table.Row>\n                                        <Table.Cell>Lens</Table.Cell>\n                                        <Table.Cell>{exif['EXIF LensModel']}</Table.Cell>\n                                    </Table.Row>\n                                    <Table.Row>\n                                        <Table.Cell>Camera</Table.Cell>\n                                        <Table.Cell>{exif['Image Model']}</Table.Cell>\n                                    </Table.Row>\n                                    <Table.Row>\n                                        <Table.Cell>Time Taken</Table.Cell>\n                                        <Table.Cell>{exif['EXIF DateTimeOriginal']}</Table.Cell>\n                                    </Table.Row>\n                                    <Table.Row>\n                                        <Table.Cell>Location</Table.Cell>\n                                        <Table.Cell>{geolocation}</Table.Cell>\n                                    </Table.Row>\n                                </Table.Body>\n                            </Table>\n                        </Grid.Column>\n                        <Grid.Column>\n                            <Header inverted as='h3'>Captions</Header>\n                            <List>\n                            {captions}\n                            </List>\n                        </Grid.Column>\n                        <Grid.Column>\n                            <Header inverted as='h3'>People</Header>\n                            <List>\n                            {photo.people.map((person)=><List.Item>{person}</List.Item>)}\n                            </List>\n                        </Grid.Column>\n                        </Grid.Row>\n                    </Grid>\n                </div>\n            </div>\n\t\t)\t\t\t\n\t}\n}"
  },
  {
    "path": "src/components/lightBox.js",
    "content": "import React, { Component } from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { List, WindowScroller, AutoSizer } from \"react-virtualized\";\nimport \"react-virtualized/styles.css\"; // only needs to be imported once\nimport { connect } from \"react-redux\";\nimport {\n  fetchDateAlbumsPhotoHashList,\n  fetchAlbumsDateGalleries\n} from \"../actions/albumsActions\";\nimport { copyToClipboard } from \"../util/util\";\nimport {\n  fetchPhotoDetail,\n  setPhotosFavorite,\n  setPhotosHidden,\n  setPhotosPublic,\n  generatePhotoIm2txtCaption\n} from \"../actions/photosActions\";\nimport {\n  Card,\n  Image,\n  Header,\n  Divider,\n  Item,\n  Loader,\n  Dimmer,\n  Form,\n  Modal,\n  Sticky,\n  Portal,\n  Grid,\n  List as ListSUI,\n  Container,\n  Label,\n  Popup,\n  Segment,\n  Button,\n  Input,\n  Icon,\n  Table,\n  Transition,\n  Breadcrumb\n} from \"semantic-ui-react\";\nimport { Server, serverAddress } from \"../api_client/apiClient\";\nimport LazyLoad from \"react-lazyload\";\nimport Lightbox from \"react-image-lightbox\";\nimport { LocationMap } from \"../components/maps\";\nimport { push } from \"react-router-redux\";\nimport { searchPhotos } from \"../actions/searchActions\";\nimport styles from \"../App.css\";\nimport Draggable from \"react-draggable\";\nimport debounce from \"lodash/debounce\";\nimport * as moment from \"moment\";\nimport { Link } from \"react-router-dom\";\n\nvar topMenuHeight = 55; // don't change this\nvar leftMenuWidth = 85; // don't change this\nvar SIDEBAR_WIDTH = 85;\nvar timelineScrollWidth = 0;\nvar DAY_HEADER_HEIGHT = 35;\n\nif (window.innerWidth < 600) {\n  var LIGHTBOX_SIDEBAR_WIDTH = window.innerWidth;\n} else {\n  var LIGHTBOX_SIDEBAR_WIDTH = 360;\n}\n\nconst colors = [\n  \"red\",\n  \"orange\",\n  \"yellow\",\n  \"olive\",\n  \"green\",\n  \"teal\",\n  \"blue\",\n  \"violet\",\n  \"purple\",\n  \"pink\",\n  \"brown\",\n  \"grey\",\n  \"black\"\n];\n\nexport class LightBox extends Component {\n  state = {\n    lightboxSidebarShow: false\n  };\n\n  render() {\n    const authGetParams = !this.props.isPublic\n      ? \"?jwt=\" + this.props.auth.access.token\n      : \"\";\n    if (\n      !this.props.photoDetails[\n        this.props.idx2hash.slice(this.props.lightboxImageIndex)[0]\n      ]\n    ) {\n      console.log(\"light box has not gotten main photo detail\");\n      var mainSrc = \"/transparentbackground.png\";\n      var mainSrcThumbnail = \"/transparentbackground.png\";\n    } else {\n      console.log(\"light box has got main photo detail\");\n      var mainSrc =\n        serverAddress +\n        \"/media/thumbnails_big/\" +\n        this.props.idx2hash.slice(this.props.lightboxImageIndex)[0] +\n        \".jpg\";\n      var mainSrcThumbnail =\n        serverAddress +\n        \"/media/thumbnails_small/\" +\n        this.props.idx2hash.slice(this.props.lightboxImageIndex)[0] +\n        \".jpg\";\n      if (\n        this.props.photoDetails[\n          this.props.idx2hash.slice(this.props.lightboxImageIndex)[0]\n        ].hidden &&\n        !this.props.showHidden\n      ) {\n        var mainSrc = \"/hidden.png\";\n        var mainSrcThumbnail = \"/hidden.png\";\n      }\n    }\n\n    return (\n      <div>\n        <Lightbox\n          animationDisabled={true}\n          mainSrc={mainSrc}\n          nextSrc={\n            serverAddress +\n            \"/media/thumbnails_big/\" +\n            this.props.idx2hash.slice(\n              (this.props.lightboxImageIndex + 1) % this.props.idx2hash.length\n            )[0] +\n            \".jpg\"\n          }\n          prevSrc={\n            serverAddress +\n            \"/media/thumbnails_big/\" +\n            this.props.idx2hash.slice(\n              (this.props.lightboxImageIndex - 1) % this.props.idx2hash.length\n            )[0] +\n            \".jpg\"\n          }\n          mainSrcThumbnail={mainSrcThumbnail}\n          nextSrcThumbnail={\n            serverAddress +\n            \"/media/thumbnails_small/\" +\n            this.props.idx2hash.slice(\n              (this.props.lightboxImageIndex + 1) % this.props.idx2hash.length\n            )[0] +\n            \".jpg\"\n          }\n          prevSrcThumbnail={\n            serverAddress +\n            \"/media/thumbnails_small/\" +\n            this.props.idx2hash.slice(\n              (this.props.lightboxImageIndex - 1) % this.props.idx2hash.length\n            )[0] +\n            \".jpg\"\n          }\n          toolbarButtons={[\n            <div>\n              {!this.props.photoDetails[\n                this.props.idx2hash[this.props.lightboxImageIndex]\n              ] && (\n                <Button\n                  loading\n                  color=\"black\"\n                  icon\n                  circular\n                  disabled={this.props.isPublic}\n                >\n                  <Icon name=\"hide\" color={\"grey\"} />\n                </Button>\n              )}\n              {!this.props.photoDetails[\n                this.props.idx2hash[this.props.lightboxImageIndex]\n              ] && (\n                <Button\n                  loading\n                  color=\"black\"\n                  icon\n                  circular\n                  disabled={this.props.isPublic}\n                >\n                  <Icon name=\"star\" color={\"grey\"} />\n                </Button>\n              )}\n              {!this.props.photoDetails[\n                this.props.idx2hash[this.props.lightboxImageIndex]\n              ] && (\n                <Button\n                  loading\n                  color=\"black\"\n                  icon\n                  circular\n                  disabled={this.props.isPublic}\n                >\n                  <Icon name=\"globe\" color={\"grey\"} />\n                </Button>\n              )}\n              {this.props.photoDetails[\n                this.props.idx2hash[this.props.lightboxImageIndex]\n              ] && (\n                <Button\n                  disabled={this.props.isPublic}\n                  onClick={() => {\n                    const image_hash = this.props.idx2hash[\n                      this.props.lightboxImageIndex\n                    ];\n                    const val = !this.props.photoDetails[image_hash].hidden;\n                    this.props.dispatch(setPhotosHidden([image_hash], val));\n                  }}\n                  color=\"black\"\n                  icon\n                  circular\n                >\n                  <Icon\n                    name=\"hide\"\n                    color={\n                      this.props.photoDetails[\n                        this.props.idx2hash[this.props.lightboxImageIndex]\n                      ].hidden\n                        ? \"red\"\n                        : \"grey\"\n                    }\n                  />\n                </Button>\n              )}\n              {this.props.photoDetails[\n                this.props.idx2hash[this.props.lightboxImageIndex]\n              ] && (\n                <Button\n                  disabled={this.props.isPublic}\n                  onClick={() => {\n                    const image_hash = this.props.idx2hash[\n                      this.props.lightboxImageIndex\n                    ];\n                    const val = !this.props.photoDetails[image_hash].favorited;\n                    this.props.dispatch(setPhotosFavorite([image_hash], val));\n                  }}\n                  color=\"black\"\n                  icon\n                  circular\n                >\n                  <Icon\n                    name=\"star\"\n                    color={\n                      this.props.photoDetails[\n                        this.props.idx2hash[this.props.lightboxImageIndex]\n                      ].favorited\n                        ? \"yellow\"\n                        : \"grey\"\n                    }\n                  />\n                </Button>\n              )}\n              {this.props.photoDetails[\n                this.props.idx2hash[this.props.lightboxImageIndex]\n              ] && (\n                <Button\n                  disabled={this.props.isPublic}\n                  onClick={() => {\n                    const image_hash = this.props.idx2hash[\n                      this.props.lightboxImageIndex\n                    ];\n                    const val = !this.props.photoDetails[image_hash].public;\n                    this.props.dispatch(setPhotosPublic([image_hash], val));\n                    copyToClipboard(\n                      serverAddress.replace('//','') + \"/media/thumbnails_big/\" + image_hash + \".jpg\"\n                    );\n                  }}\n                  color=\"black\"\n                  icon\n                  circular\n                >\n                  <Icon\n                    name=\"globe\"\n                    color={\n                      this.props.photoDetails[\n                        this.props.idx2hash[this.props.lightboxImageIndex]\n                      ].public\n                        ? \"green\"\n                        : \"grey\"\n                    }\n                  />\n                </Button>\n              )}\n              <Button\n                icon\n                active={this.state.lightboxSidebarShow}\n                circular\n                onClick={() => {\n                  this.setState({\n                    lightboxSidebarShow: !this.state.lightboxSidebarShow\n                  });\n                }}\n              >\n                <Icon name=\"info\" />\n              </Button>\n            </div>\n          ]}\n          onCloseRequest={this.props.onCloseRequest}\n          onAfterOpen={() => {\n            console.log(\"lightbox trying to fetch photo detail\");\n            this.props.onImageLoad();\n          }}\n          onMovePrevRequest={this.props.onMovePrevRequest}\n          onMoveNextRequest={this.props.onMoveNextRequest}\n          sidebarWidth={\n            this.state.lightboxSidebarShow ? LIGHTBOX_SIDEBAR_WIDTH : 0\n          }\n          reactModalStyle={{\n            content: {\n              // transform: this.state.lightboxSidebarShow ? `scale(0.5,1)` : ''\n              // right: this.state.lightboxSidebarShow ? LIGHTBOX_SIDEBAR_WIDTH : 0,\n              // width: this.state.lightboxSidebarShow ? window.innerWidth - LIGHTBOX_SIDEBAR_WIDTH : window.innerWidth,\n            },\n            overlay: {\n              right: this.state.lightboxSidebarShow\n                ? LIGHTBOX_SIDEBAR_WIDTH\n                : 0,\n              width: this.state.lightboxSidebarShow\n                ? window.innerWidth - LIGHTBOX_SIDEBAR_WIDTH\n                : window.innerWidth\n            }\n          }}\n        />\n        <Transition\n          visible={this.state.lightboxSidebarShow}\n          animation=\"fade left\"\n          duration={500}\n        >\n          <div\n            style={{\n              right: 0,\n              top: 0,\n              float: \"right\",\n              backgroundColor: \"white\",\n              width: LIGHTBOX_SIDEBAR_WIDTH,\n              height: window.innerHeight,\n              whiteSpace: \"normal\",\n              position: \"fixed\",\n              overflowY: \"scroll\",\n              overflowX: \"hidden\",\n              zIndex: 1000\n            }}\n          >\n            {this.props.photoDetails.hasOwnProperty(\n              this.props.idx2hash[this.props.lightboxImageIndex]\n            ) && (\n              <div style={{ width: LIGHTBOX_SIDEBAR_WIDTH }}>\n                <div\n                  style={{\n                    paddingLeft: 30,\n                    paddingRight: 30,\n                    fontSize: \"14px\",\n                    lineHeight: \"normal\",\n                    whiteSpace: \"normal\",\n                    wordWrap: \"break-all\"\n                  }}\n                >\n                  <Button\n                    floated=\"right\"\n                    circular\n                    icon=\"close\"\n                    onClick={() => {\n                      this.setState({ lightboxSidebarShow: false });\n                      this.forceUpdate();\n                    }}\n                  />\n                  <Header as=\"h3\">Details</Header>\n\n                  <Item.Group relaxed>\n                    <Item>\n                      <Item.Content verticalAlign=\"middle\">\n                        <Item.Header>\n                          <Icon name=\"calendar\" /> Time Taken\n                        </Item.Header>\n                        <Item.Description>\n                          {moment.utc(\n                            this.props.photoDetails[\n                              this.props.idx2hash[this.props.lightboxImageIndex]\n                            ].exif_timestamp\n                          ).format(\"dddd, MMMM Do YYYY, h:mm a\")}\n                        </Item.Description>\n                      </Item.Content>\n                    </Item>\n\n                    <Item>\n                      <Item.Content verticalAlign=\"middle\">\n                        <Item.Header>\n                          <Icon name=\"file\" /> File Path\n                        </Item.Header>\n                        <Item.Description>\n                          <Breadcrumb\n                            as={Link}\n                            to={serverAddress+'/media/photos/'+this.props.idx2hash[this.props.lightboxImageIndex]+'.jpg'}\n                            target='_blank'\n                            divider=\"/\"\n                            sections={this.props.photoDetails[\n                              this.props.idx2hash[this.props.lightboxImageIndex]\n                            ].image_path\n                              .split(\"/\")\n                              .map(el => {\n                                return { key: el, content: el };\n                              })}\n                          />\n                        </Item.Description>\n                      </Item.Content>\n                    </Item>\n\n                    { this.props.photoDetails[\n                              this.props.idx2hash[this.props.lightboxImageIndex]\n                            ].people.length > 0 &&\n                    (<Item>\n                      <Item.Content verticalAlign=\"middle\">\n                        <Item.Header>\n                          <Icon name=\"users\" /> People\n                        </Item.Header>\n                        <Item.Description>\n                          <Label.Group>\n                            {this.props.photoDetails[\n                              this.props.idx2hash[this.props.lightboxImageIndex]\n                            ].people.map((nc, idx) => (\n                              <Label\n                                color={\n                                  colors[\n                                    idx %\n                                      this.props.photoDetails[\n                                        this.props.idx2hash[\n                                          this.props.lightboxImageIndex\n                                        ]\n                                      ].people.length\n                                  ]\n                                }\n                                onClick={() => {\n                                  this.props.dispatch(searchPhotos(nc));\n                                  this.props.dispatch(push(\"/search\"));\n                                }}\n                              >\n                                <Icon name=\"user\" />\n                                {nc}\n                              </Label>\n                            ))}\n                          </Label.Group>\n                        </Item.Description>\n                      </Item.Content>\n                    </Item>)\n                    }\n\n                    {\n                            this.props.photoDetails[\n                              this.props.idx2hash[this.props.lightboxImageIndex]\n                            ].search_location &&\n                    (<Item>\n                      <Item.Content verticalAlign=\"middle\">\n                        <Item.Header>\n                          <Icon name=\"point\" /> Location\n                        </Item.Header>\n                        <Item.Description>\n                          {\n                            this.props.photoDetails[\n                              this.props.idx2hash[this.props.lightboxImageIndex]\n                            ].search_location\n                          }\n                        </Item.Description>\n                      </Item.Content>\n                    </Item>)\n                    }\n\n                    <div\n                      style={{\n                        width: LIGHTBOX_SIDEBAR_WIDTH - 70,\n                        whiteSpace: \"normal\",\n                        lineHeight: \"normal\"\n                      }}\n                    >\n                      {this.props.photoDetails[\n                        this.props.idx2hash[this.props.lightboxImageIndex]\n                      ].exif_gps_lat && (\n                        <LocationMap\n                          zoom={8}\n                          photos={[\n                            this.props.photoDetails[\n                              this.props.idx2hash[this.props.lightboxImageIndex]\n                            ]\n                          ]}\n                        />\n                      )}\n                    </div>\n\n                    <Item>\n                      <Item.Content verticalAlign=\"middle\">\n                        <Item.Header>\n                          <Icon name=\"write\" /> Caption\n                        </Item.Header>\n                        <Item.Description>\n                          {false &&\n                            this.props.photoDetails[\n                              this.props.idx2hash[this.props.lightboxImageIndex]\n                            ].captions_json.im2txt}\n                          <Form>\n                            <Form.TextArea\n                              disabled={this.props.isPublic}\n                              fluid\n                              placeholder={\n                                this.props.photoDetails[\n                                  this.props.idx2hash[\n                                    this.props.lightboxImageIndex\n                                  ]\n                                ].captions_json.im2txt\n                              }\n                            >\n                              {\n                                this.props.photoDetails[\n                                  this.props.idx2hash[\n                                    this.props.lightboxImageIndex\n                                  ]\n                                ].captions_json.im2txt\n                              }\n                            </Form.TextArea>\n                            <Button\n                              disabled={this.props.isPublic}\n                              floated=\"left\"\n                              size=\"small\"\n                              color=\"green\"\n                            >\n                              Submit\n                            </Button>\n                            <Button\n                              loading={this.props.generatingCaptionIm2txt}\n                              onClick={()=>{this.props.dispatch(generatePhotoIm2txtCaption(this.props.idx2hash[this.props.lightboxImageIndex]))}}\n                              disabled={this.props.isPublic | this.props.generatingCaptionIm2txt}\n                              floated=\"left\"\n                              size=\"small\"\n                              color=\"blue\"\n                            >\n                              Generate\n                            </Button>\n                            <Button\n                              disabled={this.props.isPublic}\n                              floated=\"right\"\n                              size=\"small\"\n                              basic\n                            >\n                              Cancel\n                            </Button>\n                          </Form>\n                        </Item.Description>\n                      </Item.Content>\n                    </Item>\n\n                    <Item>\n                      <Item.Content verticalAlign=\"middle\">\n                        <Item.Header>\n                          <Icon name=\"tags\" /> Scene\n                        </Item.Header>\n                        <Item.Description>\n                          <p>\n                            <b>Attributes</b>\n                          </p>\n                          <Label.Group>\n                            {this.props.photoDetails[\n                              this.props.idx2hash[this.props.lightboxImageIndex]\n                            ].captions_json.places365.attributes.map(\n                              (nc, idx) => (\n                                <Label\n                                  key={\n                                    \"lightbox_attribute_label_\" +\n                                    this.props.idx2hash[\n                                      this.props.lightboxImageIndex\n                                    ] +\n                                    \"_\" +\n                                    nc\n                                  }\n                                  tag\n                                  color={\n                                    colors[\n                                      idx %\n                                        this.props.photoDetails[\n                                          this.props.idx2hash[\n                                            this.props.lightboxImageIndex\n                                          ]\n                                        ].search_captions.split(\" , \").length\n                                    ]\n                                  }\n                                  color=\"blue\"\n                                  onClick={() => {\n                                    this.props.dispatch(searchPhotos(nc));\n                                    this.props.dispatch(push(\"/search\"));\n                                  }}\n                                >\n                                  {nc}\n                                </Label>\n                              )\n                            )}\n                          </Label.Group>\n                          <p>\n                            <b>Categories</b>\n                          </p>\n                          <Label.Group>\n                            {this.props.photoDetails[\n                              this.props.idx2hash[this.props.lightboxImageIndex]\n                            ].captions_json.places365.categories.map(\n                              (nc, idx) => (\n                                <Label\n                                  key={\n                                    \"lightbox_category_label_\" +\n                                    this.props.idx2hash[\n                                      this.props.lightboxImageIndex\n                                    ] +\n                                    \"_\" +\n                                    nc\n                                  }\n                                  tag\n                                  color={\n                                    colors[\n                                      idx %\n                                        this.props.photoDetails[\n                                          this.props.idx2hash[\n                                            this.props.lightboxImageIndex\n                                          ]\n                                        ].search_captions.split(\" , \").length\n                                    ]\n                                  }\n                                  color=\"teal\"\n                                  onClick={() => {\n                                    this.props.dispatch(searchPhotos(nc));\n                                    this.props.dispatch(push(\"/search\"));\n                                  }}\n                                >\n                                  {nc}\n                                </Label>\n                              )\n                            )}\n                          </Label.Group>\n                        </Item.Description>\n                      </Item.Content>\n                    </Item>\n                    <Item>\n                      <Item.Content verticalAlign=\"middle\">\n                        <Item.Header>\n                          <Icon name=\"images\"/>Similar Photos\n                        </Item.Header>\n                        <Item.Description>\n                          <Image.Group>\n                          {\n                                this.props.photoDetails[\n                                  this.props.idx2hash[\n                                    this.props.lightboxImageIndex\n                                  ]\n                                ].similar_photos.slice(0,30).map(el=>(\n                                  <Image width={95} height={95} \n                                    src={serverAddress+\"/media/square_thumbnails_small/\"+el.image_hash+\".jpg\"}/>\n                                ))\n                          }\n                          </Image.Group>\n                        </Item.Description>\n                      </Item.Content>\n                    </Item>\n\n                  </Item.Group>\n                </div>\n              </div>\n            )}\n          </div>\n        </Transition>\n      </div>\n    );\n  }\n}\n\nLightBox = connect(store => {\n  return {\n    auth: store.auth,\n    photoDetails: store.photos.photoDetails,\n    fetchingPhotoDetail: store.photos.fetchingPhotoDetail,\n    fetchedPhotoDetail: store.photos.fetchedPhotoDetail,\n    generatingCaptionIm2txt: store.photos.generatingCaptionIm2txt,\n    generatedCaptionIm2txt: store.photos.generatedCaptionIm2txt,\n    photos: store.photos.photos\n    // idx2hash: store.albums.idx2hash,\n    // albumsDatePhotoHashList: store.albums.albumsDatePhotoHashList,\n    // fetchingAlbumsDatePhotoHashList: store.albums.fetchingAlbumsDatePhotoHashList,\n    // fetchedAlbumsDatePhotoHashList: store.albums.fetchedAlbumsDatePhotoHashList,\n  };\n})(LightBox);\n"
  },
  {
    "path": "src/components/locationDurationStackedBar.js",
    "content": "import React, {Component} from 'react'\nimport {Label,Grid, Segment, Header, Loader} from 'semantic-ui-react'\nimport Dimensions from 'react-dimensions'\nimport { connect } from \"react-redux\";\nimport {fetchDateAlbumsList, fetchAutoAlbumsList} from '../actions/albumsActions'\nimport {fetchLocationTimeline} from '../actions/utilActions'\n\nimport Month from 'calendar-months';\nimport {Chart, Bars, Lines, Ticks, Layer, Transform, Handlers} from 'rumble-charts'\nimport moment from 'moment'\n\nimport {\n  Hint,\n  XYPlot,\n  XAxis,\n  YAxis,\n  VerticalGridLines,\n  HorizontalGridLines,\n  HorizontalBarSeries,\n  HorizontalBarSeriesCanvas\n} from 'react-vis'\n/*\n{\n  x: el.value.x,\n  y: el.value.y,\n  size: el.value.size,\n  name: el.person_name,\n}\n*/\n\nexport class LocationDurationStackedBar extends Component {\n  state = {hintValue:null}\n\n  componentWillMount() {\n    if (!this.props.fetchedLocationTimeline){\n      this.props.dispatch(fetchLocationTimeline())\n    }\n  }\n\n\n  render() {\n    if (this.props.fetchedLocationTimeline){\n      return (\n          <div style={{height:280}}>\n            <Header as='h3'>Location Timeline</Header>\n            <div>\n\n\n              <XYPlot\n                width={this.props.containerWidth-30}\n                height={300}\n                stackBy=\"x\">\n                <XAxis tickFormat={v=> {\n                    return(moment.unix(this.props.locationTimeline[0].start+ v).format('YYYY-MM'))\n                }}/>\n\n                {this.props.locationTimeline.map((el)=>\n                  <HorizontalBarSeries\n                    onValueMouseOver={(d,info)=>{\n                        this.setState({hintValue:d})\n                    }}\n                    style={{fill:el.color,stroke:el.color}}\n                    data={[{\n                        y:1,\n                        x:el.data[0],\n                        loc:el.loc,\n                        start:el.start,\n                        end:el.end\n                    }]}/>\n                )}\n                \n                { this.state.hintValue && (\n                    <Hint value={this.state.hintValue}>\n                            <Label color='black'>\n                                {this.state.hintValue.loc}\n                                {' from ' + moment.unix(this.state.hintValue.start).format('YYYY-MM-DD') + \n                                 ' to ' + moment.unix(this.state.hintValue.end).format('YYYY-MM-DD')}\n                            </Label>\n                    </Hint>\n                )} \n\n\n              </XYPlot>\n\n\n            </div>\n          </div>\n      )\n    } else {\n      return (\n        <div style={{height:280}}>\n        <Header as='h3'>Location Timeline</Header>\n        <Segment style={{height:250}} basic>\n        <Loader active/>\n        </Segment>\n        </div>\n      )\n    }\n  }\n}\n\nLocationDurationStackedBar = connect((store)=>{\n  return {\n    locationTimeline: store.util.locationTimeline,\n    fetchingLocationTimeline: store.util.fetchingLocationTimeline,\n    fetchedLocationTimeline: store.util.fetchedLocationTimeline,\n  }\n})(LocationDurationStackedBar)\n\n\nexport default Dimensions()(LocationDurationStackedBar)\n\n\n// <Chart width={this.props.containerWidth} height={250} series={this.props.locationTimeline}>\n//   <Layer width='80%' height='85%' position='middle center'>\n//     <Transform method={['stack', 'rotate']}>\n//       <Bars combined={true} innerPadding='2%' />\n//     </Transform>\n//   </Layer>\n// </Chart>\n"
  },
  {
    "path": "src/components/locationLink.js",
    "content": "import React from \"react\";\nimport { Group } from \"@vx/group\";\nimport { Tree } from \"@vx/hierarchy\";\nimport { LinearGradient } from \"@vx/gradient\";\nimport { hierarchy } from \"d3-hierarchy\";\nimport { pointRadial } from \"d3-shape\";\nimport { fetchLocationSunburst } from \"../actions/utilActions\";\nimport { connect } from \"react-redux\";\nimport { Dropdown, Form } from \"semantic-ui-react\";\n\nimport {\n  LinkHorizontal,\n  LinkVertical,\n  LinkRadial,\n  LinkHorizontalStep,\n  LinkVerticalStep,\n  LinkRadialStep,\n  LinkHorizontalCurve,\n  LinkVerticalCurve,\n  LinkRadialCurve,\n  LinkHorizontalLine,\n  LinkVerticalLine,\n  LinkRadialLine\n} from \"@vx/shape\";\n\nexport class LocationLink extends React.Component {\n  state = {\n    layout: \"cartesian\",\n    orientation: \"horizontal\",\n    linkType: \"diagonal\",\n    stepPercent: 0.5\n  };\n\n  componentWillMount() {\n    if (!this.props.locationSunburst.children) {\n      this.props.dispatch(fetchLocationSunburst());\n    }\n  }\n\n  render() {\n    const {\n      // data,\n      width,\n      height,\n      events = false,\n      margin = {\n        top: 20,\n        left: 70,\n        right: 70,\n        bottom: 20\n      }\n    } = this.props;\n    const { layout, orientation, linkType, stepPercent } = this.state;\n\n    if (width < 10) return null;\n    if (this.props.fetchedLocationSunburst) return null;\n\n    const innerWidth = width - margin.left - margin.right;\n    const innerHeight = height - margin.top - margin.bottom;\n\n    let origin;\n    let sizeWidth;\n    let sizeHeight;\n\n    if (layout === \"polar\") {\n      origin = {\n        x: innerWidth / 2,\n        y: innerHeight / 2\n      };\n      sizeWidth = 2 * Math.PI;\n      sizeHeight = Math.min(innerWidth, innerHeight) / 2;\n    } else {\n      origin = { x: 0, y: 0 };\n      if (orientation === \"vertical\") {\n        sizeWidth = innerWidth;\n        sizeHeight = innerHeight;\n      } else {\n        sizeWidth = innerHeight;\n        sizeHeight = innerWidth;\n      }\n    }\n\n    return (\n      <div style={{padding:10}}>\n        <div>\n          <Form unstackable widths=\"equal\">\n            <Form.Group>\n              <Form.Dropdown\n                label=\"Layout\"\n                fluid\n                labeled\n                selection\n                onChange={(e, d) => this.setState({ layout: d.value })}\n                options={[\n                  { text: \"cartesian\", value: \"cartesian\" },\n                  { text: \"polar\", value: \"polar\" }\n                ]}\n                defaultValue={layout}\n              />\n\n              <Form.Dropdown\n                label=\"Orientation\"\n                fluid\n                selection\n                onChange={(e, d) => this.setState({ orientation: d.value })}\n                defaultValue={orientation}\n                options={[\n                  { text: \"vertical\", value: \"vertical\" },\n                  { text: \"horizontal\", value: \"horizontal\" }\n                ]}\n                disabled={layout === \"polar\"}\n              />\n\n              <Form.Dropdown\n                label=\"Link Type\"\n                fluid\n                selection\n                onChange={(e, d) => this.setState({ linkType: d.value })}\n                options={[\n                  { text: \"diagonal\", value: \"diagonal\" },\n                  { text: \"step\", value: \"step\" },\n                  { text: \"curve\", value: \"curve\" },\n                  { text: \"line\", value: \"line\" }\n                ]}\n                defaultValue={linkType}\n              />\n            </Form.Group>\n          </Form>\n        </div>\n\n        <svg width={width} height={height}>\n          <LinearGradient id=\"lg\" from=\"#fd9b93\" to=\"#fe6e9e\" />\n          <rect width={width} height={height} rx={3} fill=\"#ffffff\" />\n          <Tree\n            top={margin.top}\n            left={margin.left}\n            root={hierarchy(\n              this.props.locationSunburst,\n              d => (d.isExpanded ? d.children : null)\n            )}\n            size={[sizeWidth, sizeHeight]}\n            separation={(a, b) => (a.parent === b.parent ? 1 : 0.5) / a.depth}\n          >\n            {({ data }) => (\n              <Group top={origin.y} left={origin.x}>\n                {data.links().map((link, i) => {\n                  let LinkComponent;\n\n                  if (layout === \"polar\") {\n                    if (linkType === \"step\") {\n                      LinkComponent = LinkRadialStep;\n                    } else if (linkType === \"curve\") {\n                      LinkComponent = LinkRadialCurve;\n                    } else if (linkType === \"line\") {\n                      LinkComponent = LinkRadialLine;\n                    } else {\n                      LinkComponent = LinkRadial;\n                    }\n                  } else {\n                    if (orientation === \"vertical\") {\n                      if (linkType === \"step\") {\n                        LinkComponent = LinkVerticalStep;\n                      } else if (linkType === \"curve\") {\n                        LinkComponent = LinkVerticalCurve;\n                      } else if (linkType === \"line\") {\n                        LinkComponent = LinkVerticalLine;\n                      } else {\n                        LinkComponent = LinkVertical;\n                      }\n                    } else {\n                      if (linkType === \"step\") {\n                        LinkComponent = LinkHorizontalStep;\n                      } else if (linkType === \"curve\") {\n                        LinkComponent = LinkHorizontalCurve;\n                      } else if (linkType === \"line\") {\n                        LinkComponent = LinkHorizontalLine;\n                      } else {\n                        LinkComponent = LinkHorizontal;\n                      }\n                    }\n                  }\n\n                  return (\n                    <LinkComponent\n                      data={link}\n                      percent={stepPercent}\n                      stroke=\"grey\"\n                      strokeWidth=\"2\"\n                      fill=\"none\"\n                      key={i}\n                    />\n                  );\n                })}\n\n                {data.descendants().map((node, key) => {\n                  const width = 120;\n                  const height = 30;\n\n                  let top;\n                  let left;\n                  if (layout === \"polar\") {\n                    const [radialX, radialY] = pointRadial(node.x, node.y);\n                    top = radialY;\n                    left = radialX;\n                  } else {\n                    if (orientation === \"vertical\") {\n                      top = node.y;\n                      left = node.x;\n                    } else {\n                      top = node.x;\n                      left = node.y;\n                    }\n                  }\n\n                  return (\n                    <Group top={top} left={left} key={key}>\n                      {node.depth === 0 && (\n                        <rect\n                          height={height}\n                          width={width}\n                          y={-height / 2}\n                          x={-width / 2}\n                          fill=\"#1b5a94\"\n                          rx={5}\n                          stroke=\"#dddddd\"\n                          onClick={() => {\n                            node.data.isExpanded = !node.data.isExpanded;\n                            this.forceUpdate();\n                          }}\n                        />\n                      )}\n                      {node.depth !== 0 && (\n                        <rect\n                          height={height}\n                          width={width}\n                          y={-height / 2}\n                          x={-width / 2}\n                          fill={node.data.children ? \"#1b6c94\" : \"#1b8594\"}\n                          stroke={node.data.children ? \"#dddddd\" : \"#dddddd\"}\n                          strokeWidth={2}\n                          strokeDasharray={!node.data.children ? \"0\" : \"0\"}\n                          strokeOpacity={!node.data.children ? 1 : 1}\n                          rx={!node.data.children ? 5 : 5}\n                          onClick={() => {\n                            node.data.isExpanded = !node.data.isExpanded;\n                            this.forceUpdate();\n                          }}\n                        />\n                      )}\n                      <text\n                        dy={\".33em\"}\n                        fontSize={11}\n                        fontFamily=\"Arial\"\n                        textAnchor={\"middle\"}\n                        style={{ pointerEvents: \"none\" }}\n                        fill={\n                          node.depth === 0\n                            ? \"white\"\n                            : node.children\n                              ? \"white\"\n                              : \"white\"\n                        }\n                      >\n                        {node.data.name}\n                      </text>\n                    </Group>\n                  );\n                })}\n              </Group>\n            )}\n          </Tree>\n        </svg>\n      </div>\n    );\n  }\n}\n\nLocationLink = connect(store => {\n  return {\n    locationSunburst: store.util.locationSunburst,\n    fetchingLocationSunburst: store.util.fetchingLocationSunburst,\n    fetchedLocationSunburst: store.util.fetechedLocationSunburst\n  };\n})(LocationLink);\n"
  },
  {
    "path": "src/components/maps.js",
    "content": "import React, { Component } from \"react\";\nimport { connect } from \"react-redux\";\nimport { Loader, Flag, Segment, Image, Header, Icon } from \"semantic-ui-react\";\nimport { Map, TileLayer, Marker, Popup } from \"react-leaflet\";\nimport { scanPhotos, fetchPhotos } from \"../actions/photosActions\";\nimport { fetchAutoAlbumsList } from \"../actions/albumsActions\";\nimport { fetchLocationClusters } from \"../actions/utilActions\";\nimport { Server, serverAddress } from \"../api_client/apiClient\";\nimport MarkerClusterGroup from \"react-leaflet-markercluster\";\nimport { fetchPlaceAlbumsList } from \"../actions/albumsActions\";\nimport { Grid, List, WindowScroller, AutoSizer } from \"react-virtualized\";\nimport { countryNames } from \"../util/countryNames\";\nimport { Link } from \"react-router-dom\";\nimport { SecuredImageJWT } from \"../components/SecuredImage\";\nimport _ from \"lodash\";\nvar topMenuHeight = 45; // don't change this\nvar ESCAPE_KEY = 27;\nvar ENTER_KEY = 13;\nvar RIGHT_ARROW_KEY = 39;\nvar UP_ARROW_KEY = 38;\nvar LEFT_ARROW_KEY = 37;\nvar DOWN_ARROW_KEY = 40;\n\nvar SIDEBAR_WIDTH = 85;\n\nexport class LocationMap extends Component {\n  render() {\n    var photosWithGPS = this.props.photos.filter(function(photo) {\n      if (photo.exif_gps_lon !== null && photo.exif_gps_lon) {\n        return true;\n      } else {\n        return false;\n      }\n    });\n\n    var sum_lat = 0;\n    var sum_lon = 0;\n    for (var i = 0; i < photosWithGPS.length; i++) {\n      sum_lat += parseFloat(photosWithGPS[i].exif_gps_lat);\n      sum_lon += parseFloat(photosWithGPS[i].exif_gps_lon);\n    }\n    var avg_lat = sum_lat / photosWithGPS.length;\n    var avg_lon = sum_lon / photosWithGPS.length;\n\n    var markers = photosWithGPS.map(function(photo) {\n      return (\n        <Marker\n          key={photo.image_hash}\n          position={[photo.exif_gps_lat, photo.exif_gps_lon]}\n        >\n          <Popup>\n            <div>\n              <Image src={photo.square_thumbnail} />\n            </div>\n          </Popup>\n        </Marker>\n      );\n    });\n    console.log(markers);\n\n    if (photosWithGPS.length > 0) {\n      if (this.props.zoom) {\n        var zoom = this.props.zoom;\n      } else {\n        var zoom = 2;\n      }\n      return (\n        <Segment style={{ zIndex: 2, height: this.props.height, padding: 0 }}>\n          <Map\n            style={{ height: this.props.height }}\n            center={[avg_lat, avg_lon]}\n            zoom={zoom}\n          >\n            <TileLayer\n              attribution=\"&copy; <a href=&quot;http://osm.org/copyright&quot;>OpenStreetMap</a> contributors\"\n              url=\"http://{s}.tile.osm.org/{z}/{x}/{y}.png\"\n            />\n            {markers}\n          </Map>\n        </Segment>\n      );\n    } else {\n      return (\n        <Segment style={{ height: this.props.height }}>\n          <Loader active>Map loading...</Loader>\n        </Segment>\n      );\n    }\n  }\n}\n\nexport class EventMap extends Component {\n  constructor(props) {\n    super(props);\n    this.preprocess = this.preprocess.bind(this);\n  }\n\n  componentDidMount() {\n    this.props.dispatch(fetchAutoAlbumsList());\n  }\n\n  preprocess() {\n    var eventsWithGPS = this.props.albumsAutoList.filter(function(album) {\n      if (album.gps_lat != null && album.gps_lon != null) {\n        return true;\n      } else {\n        return false;\n      }\n    });\n\n    var sum_lat = 0;\n    var sum_lon = 0;\n    for (var i = 0; i < eventsWithGPS.length; i++) {\n      sum_lat += parseFloat(eventsWithGPS[i].gps_lat);\n      sum_lon += parseFloat(eventsWithGPS[i].gps_lon);\n    }\n    var avg_lat = sum_lat / eventsWithGPS.length;\n    var avg_lon = sum_lon / eventsWithGPS.length;\n\n    var markers = eventsWithGPS.map(function(album) {\n      return <Marker position={[album.gps_lat, album.gps_lon]} />;\n    });\n    return [avg_lat, avg_lon, markers];\n  }\n\n  render() {\n    if (this.props.fetchedAlbumsAutoList) {\n      var res = this.preprocess();\n      var avg_lat = res[0];\n      var avg_lon = res[1];\n      var markers = res[2];\n\n      return (\n        <div>\n          <Map center={[avg_lat, avg_lon]} zoom={2}>\n            <TileLayer\n              attribution=\"&copy; <a href=&quot;http://osm.org/copyright&quot;>OpenStreetMap</a> contributors\"\n              url=\"http://{s}.tile.osm.org/{z}/{x}/{y}.png\"\n            />\n            {markers}\n          </Map>\n        </div>\n      );\n    } else {\n      return <div />;\n    }\n  }\n}\n\nexport class LocationClusterMap extends Component {\n  state = {\n    visibleMarkers: [],\n    visiblePlaceAlbums: [],\n    locationClusters: [],\n    width: window.innerWidth,\n    height: window.innerHeight,\n    entrySquareSize: 200,\n    gridHeight: window.innerHeight - topMenuHeight - 300,\n    headerHeight: 60,\n    numEntrySquaresPerRow: 3\n  };\n\n  constructor(props) {\n    super(props);\n    this.mapRef = React.createRef();\n    this.preprocess = this.preprocess.bind(this);\n    this.calculateEntrySquareSize = this.calculateEntrySquareSize.bind(this);\n  }\n\n  componentDidMount() {\n    this.calculateEntrySquareSize();\n    window.addEventListener(\"resize\", this.calculateEntrySquareSize);\n    if (this.props.albumsPlaceList.length === 0) {\n      this.props.dispatch(fetchPlaceAlbumsList());\n    }\n    if (!this.props.fetchedLocationClusters) {\n      this.props.dispatch(fetchLocationClusters());\n    }\n  }\n\n  onViewportChanged = viewport => {\n    console.log(viewport);\n    this.setState({ viewport });\n    const bounds = this.mapRef.current.leafletElement.getBounds();\n\n    const visibleMarkers = this.props.locationClusters.filter(loc => {\n      const markerLat = loc[0];\n      const markerLng = loc[1];\n      if (\n        markerLat < bounds._northEast.lat &&\n        markerLat > bounds._southWest.lat &&\n        markerLng < bounds._northEast.lng &&\n        markerLng > bounds._southWest.lng\n      ) {\n        return true;\n      } else {\n        return false;\n      }\n    });\n\n    const visiblePlaceNames = visibleMarkers.map(el => el[2]);\n\n    const visiblePlaceAlbums = this.props.albumsPlaceList.filter(el => {\n      if (visiblePlaceNames.includes(el.title)) {\n        return true;\n      } else {\n        return false;\n      }\n    });\n\n    console.log(visibleMarkers);\n    this.setState({\n      visibleMarkers: visibleMarkers,\n      visiblePlaceAlbums: _.sortBy(visiblePlaceAlbums, [\n        \"geolocation_level\",\n        \"photo_count\"\n      ])\n    });\n  };\n\n  static getDerivedStateFromProps(nextProps, prevState) {\n    if (prevState.locationClusters.length === 0) {\n      const visibleMarkers = nextProps.locationClusters;\n      const visiblePlaceNames = visibleMarkers.map(el => el[2]);\n      const visiblePlaceAlbums = nextProps.albumsPlaceList.filter(el => {\n        if (visiblePlaceNames.includes(el.title)) {\n          return true;\n        } else {\n          return false;\n        }\n      });\n\n      return {\n        visibleMarkers: nextProps.locationClusters,\n        locationClusters: nextProps.locationClusters,\n        visiblePlaceAlbums: _.sortBy(visiblePlaceAlbums, [\n          \"geolocation_level\",\n          \"photo_count\"\n        ])\n      };\n    } else {\n      return { ...prevState };\n    }\n  }\n\n  preprocess() {\n    var markers = this.props.locationClusters.map(function(loc) {\n      if (loc[0] !== 0) {\n        return <Marker position={[loc[0], loc[1]]} title={loc[2]} />;\n      }\n    });\n    return markers;\n  }\n\n  componentWillUnmount() {\n    window.removeEventListener(\"resize\", this.calculateEntrySquareSize);\n  }\n\n  calculateEntrySquareSize() {\n    if (window.innerWidth < 600) {\n      var numEntrySquaresPerRow = 2;\n    } else if (window.innerWidth < 800) {\n      var numEntrySquaresPerRow = 3;\n    } else if (window.innerWidth < 1000) {\n      var numEntrySquaresPerRow = 4;\n    } else if (window.innerWidth < 1200) {\n      var numEntrySquaresPerRow = 5;\n    } else {\n      var numEntrySquaresPerRow = 6;\n    }\n\n    var columnWidth = window.innerWidth - SIDEBAR_WIDTH - 5 - 5 - 15;\n\n    var entrySquareSize = columnWidth / numEntrySquaresPerRow;\n    var numEntrySquaresPerRow = numEntrySquaresPerRow;\n    this.setState({\n      ...this.state,\n      width: window.innerWidth,\n      height: window.innerHeight,\n      entrySquareSize: entrySquareSize,\n      numEntrySquaresPerRow: numEntrySquaresPerRow\n    });\n  }\n\n  cellRenderer = ({ columnIndex, key, rowIndex, style }) => {\n    var place = this.state.visiblePlaceAlbums;\n    var albumPlaceIndex =\n      rowIndex * this.state.numEntrySquaresPerRow + columnIndex;\n    if (albumPlaceIndex < place.length) {\n      return (\n        <div key={key} style={style}>\n          <div\n            onClick={() => {\n              // store.dispatch(push(`/place/${this.props.albumsPlaceList[albumPlaceIndex].id}/`))\n              // store.dispatch(searchPhotos(this.props.albumsPlaceList[albumPlaceIndex].title))\n              // store.dispatch(push('/search'))\n            }}\n            style={{ padding: 5 }}\n          >\n            {place[albumPlaceIndex].cover_photos.slice(0, 1).map(photo => {\n              return (\n                <SecuredImageJWT\n                  label={{\n                    as: \"a\",\n                    corner: \"left\",\n                    icon: \"map marker alternate\"\n                  }}\n                  style={{ display: \"inline-block\", zIndex: 1 }}\n                  width={this.state.entrySquareSize - 10}\n                  height={this.state.entrySquareSize - 10}\n                  as={Link}\n                  to={`/place/${place[albumPlaceIndex].id}/`}\n                  src={\n                    serverAddress +\n                    \"/media/square_thumbnails/\" +\n                    photo.image_hash +\n                    \".jpg\"\n                  }\n                />\n              );\n            })}\n          </div>\n          <div style={{ paddingLeft: 15, paddingRight: 15, height: 50 }}>\n            {countryNames.includes(\n              place[albumPlaceIndex].title.toLowerCase()\n            ) ? (\n              <Flag name={place[albumPlaceIndex].title.toLowerCase()} />\n            ) : (\n              \"\"\n            )}\n            <b>{place[albumPlaceIndex].title}</b>\n            <br /> {place[albumPlaceIndex].photo_count} Photos\n          </div>\n        </div>\n      );\n    } else {\n      return <div key={key} style={style} />;\n    }\n  };\n\n  render() {\n    console.log(this.state);\n    if (this.props.fetchedLocationClusters) {\n      var markers = this.preprocess();\n\n      return (\n        <div>\n          <div\n            style={{\n              height: this.state.headerHeight,\n              paddingTop: 10,\n              paddingRight: 5\n            }}\n          >\n            <Header as=\"h2\">\n              <Icon name=\"map outline\" />\n              <Header.Content>\n                Places{\" \"}\n                <Loader\n                  size=\"tiny\"\n                  inline\n                  active={this.props.fetchingAlbumsPlaceList}\n                />\n                <Header.Subheader>\n                  Showing {this.state.visiblePlaceAlbums.length} places on the map\n                </Header.Subheader>\n              </Header.Content>\n            </Header>\n          </div>\n          <div style={{ marginLeft: -5 }}>\n            <Map\n              ref={this.mapRef}\n              className=\"markercluster-map\"\n              style={{\n                height: 240\n              }}\n              onViewportChanged={this.onViewportChanged}\n              center={[40, 0]}\n              zoom={2}\n            >\n              <TileLayer\n                attribution=\"&copy; <a href=&quot;https://osm.org/copyright&quot;>OpenStreetMap</a> contributors\"\n                url=\"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png\"\n              />\n              <MarkerClusterGroup>{markers}</MarkerClusterGroup>\n            </Map>\n          </div>\n          <AutoSizer\n            disableHeight\n            style={{ outline: \"none\", padding: 0, margin: 0 }}\n          >\n            {({ width }) => (\n              <Grid\n                style={{ outline: \"none\" }}\n                disableHeader={false}\n                cellRenderer={this.cellRenderer}\n                columnWidth={this.state.entrySquareSize}\n                columnCount={this.state.numEntrySquaresPerRow}\n                height={this.state.gridHeight}\n                rowHeight={this.state.entrySquareSize + 60}\n                rowCount={Math.ceil(\n                  this.state.visiblePlaceAlbums.length /\n                    this.state.numEntrySquaresPerRow.toFixed(1)\n                )}\n                width={width}\n              />\n            )}\n          </AutoSizer>\n        </div>\n      );\n    } else {\n      return (\n        <div style={{ height: this.props.height }}>\n          <Loader active>Map loading...</Loader>\n        </div>\n      );\n    }\n  }\n}\n\nexport class AllPhotosMap extends Component {\n  componentDidMount() {\n    this.props.dispatch(fetchPhotos());\n  }\n\n  render() {\n    if (this.props.fetchedPhotos) {\n      var map = <LocationMap photos={this.props.photos} />;\n    } else {\n      var map = <div />;\n    }\n    return <div>{map}</div>;\n  }\n}\n\nAllPhotosMap = connect(store => {\n  return {\n    photos: store.photos.photos,\n    fetchingPhotos: store.photos.fetchingPhotos,\n    fetchedPhotos: store.photos.fetchedPhotos\n  };\n})(AllPhotosMap);\n\nEventMap = connect(store => {\n  return {\n    albumsAutoList: store.albums.albumsAutoList,\n    fetchingAlbumsAutoList: store.albums.fetchingAlbumsAutoList,\n    fetchedAlbumsAutoList: store.albums.fetchedAlbumsAutoList\n  };\n})(EventMap);\n\nLocationClusterMap = connect(store => {\n  return {\n    albumsPlaceList: store.albums.albumsPlaceList,\n    locationClusters: store.util.locationClusters,\n    fetchingLocationClusters: store.util.fetchingLocationClusters,\n    fetchedLocationClusters: store.util.fetchedLocationClusters\n  };\n})(LocationClusterMap);\n"
  },
  {
    "path": "src/components/modalPhotoView.js",
    "content": "import React, {Component} from 'react';\nimport { Card, Image, Header, Divider, Item, Loader, Dimmer, Modal, Grid, \n         Container, Label, Popup, Segment, Button, Icon, Table} from 'semantic-ui-react';\n\nimport {ImageInfoTable} from './imageInfoTable';\nimport {serverAddress} from '../api_client/apiClient'\n\n\nexport class ModalPhotoViewVertical extends Component {\n  constructor() {\n    super();\n    this.state = {\n      width:  100,\n      height: 100,\n    }\n  }\n  /**\n   * Calculate & Update state of new dimensions\n   */\n  updateDimensions() {\n    if (this.props.photos.length > 0) { \n      var update_height  = window.innerHeight-100;\n      var update_width = update_height*this.props.photos[this.props.idx].thumbnail_width/this.props.photos[this.props.idx].thumbnail_height\n\n      if (update_width > window.innerWidth-100) {\n        var update_width = window.innerWidth-100\n        var update_height = update_width*this.props.photos[this.props.idx].thumbnail_height/this.props.photos[this.props.idx].thumbnail_width\n      }\n      if (this.refs.modalPhotoViewRef){\n        this.setState({ width: update_width, height: update_height });\n      }\n    }\n  }\n\n\n\n  /**\n   * Add event listener\n   */\n  componentDidMount() {\n    this.updateDimensions();\n    window.addEventListener(\"resize\", this.updateDimensions.bind(this));\n  }\n\n  componentWillUnmount() {\n   window.removeEventListener(\"resize\", this.updateDimensions.bind(this)); \n  }\n\n  render() {\n    if (this.props.photos.length > 0) {\n      var update_height  = window.innerHeight-100;\n      var update_width = update_height*this.props.photos[this.props.idx].thumbnail_width/this.props.photos[this.props.idx].thumbnail_height\n\n      if (update_width > window.innerWidth-100) {\n        var update_width = window.innerWidth-100\n        var update_height = update_width*this.props.photos[this.props.idx].thumbnail_height/this.props.photos[this.props.idx].thumbnail_width\n      }\n      return (\n\n          <div ref=\"modalPhotoViewRef\">\n            <div style={{textAlign:'center'}}>\n              <Image \n                inline\n                height={update_height} \n                width={update_width}\n                src={serverAddress+this.props.photos[this.props.idx].image_url}/>\n            </div>\n          \n            <Header style={{textAlign:'center'}} inverted as='h4'>{this.props.photos[this.props.idx].image_path}</Header>\n\n            <Divider/>\n\n            <div style={{padding:'10px'}}>\n              <ImageInfoTable photo={this.props.photos[this.props.idx]}/>\n            </div>\n\n          </div>\n      )\n    } \n    else {\n      return <div></div>\n    } \n  }\n}"
  },
  {
    "path": "src/components/people.js",
    "content": "import React, { Component } from 'react';\nimport { connect } from \"react-redux\";\nimport { Image, Header, Message, Dropdown, Divider, Card, \n         Container, Segment, Button, Icon, Popup, Loader, \n         Dimmer, Grid, Reveal, Statistic, Label, Table,\n         Modal } from 'semantic-ui-react';\nimport { fetchPeople, \n         addPerson ,\n         addPersonAndSetLabelToFace} from '../actions/peopleActions';\nimport { fetchFaces, \n         fetchLabeledFaces,\n         fetchInferredFaces,\n         deleteFaceAndFetchNext, \n         labelFacePerson ,\n         fetchFaceToLabel,\n         loadFaceToLabel,\n         labelFacePersonAndFetchNext} from '../actions/facesActions';\n\nimport SocialGraph from './socialGraph'\nimport {Server, serverAddress} from '../api_client/apiClient'\n\nexport class PeopleCardGroup extends Component {\n  componentWillMount() {\n    this.props.dispatch(fetchPeople())\n  }\n\n  render() {\n    var cards = this.props.people.map(function(person,idx){\n      return (\n        <PersonCard key={'person-card-'+person.text}\n          name={person.text} \n          photo_count={person.face_count}\n          face_url={serverAddress+person.face_url}/>\n      )\n    })\n    return (\n      <Card.Group stackable itemsPerRow={3}>\n        {cards}\n      </Card.Group>\n    )\n  }\n}\n\nexport class PersonCard extends Component {\n  render() {\n    return (\n      <Card>\n        <Card.Content>\n          <Image \n            floated='right' \n            src={this.props.face_url} \n            height={60}\n            width={60}\n            shape='rounded'/>\n          <Card.Header>\n            {this.props.name}\n          </Card.Header>\n          <Card.Meta>\n            {this.props.photo_count} Faces\n          </Card.Meta>\n        </Card.Content>\n        <Card.Content extra>\n          <div className='ui two buttons'>\n          <Button icon='remove'/>\n          <Button icon='photo'/>\n          </div>\n        </Card.Content>\n      </Card>\n    )\n  }\n}\n\nPeopleCardGroup = connect((store)=>{\n  return {\n    people: store.people.people,\n    peopleFetching: store.people.fetching,\n    peopleFetched: store.people.fetched,\n  }\n})(PeopleCardGroup)\n\nexport default PeopleCardGroup"
  },
  {
    "path": "src/components/socialGraph.js",
    "content": "import React, {Component} from 'react'\nimport {Segment, Header, Loader} from 'semantic-ui-react'\nimport {XYPlot, XAxis, YAxis, HorizontalGridLines, \n\t\t\t\tMarkSeries, VerticalGridLines, Crosshair} from 'react-vis';\nimport Dimensions from 'react-dimensions'\nimport { connect } from \"react-redux\";\nimport { Graph } from 'react-d3-graph';\nimport { fetchSocialGraph } from '../actions/peopleActions'\nimport {Server, serverAddress} from '../api_client/apiClient'\nimport LazyLoad from 'react-lazyload';\n\n\n\nexport class SocialGraph extends Component {\n\tcomponentWillMount() {\n\t\tif (!this.props.fetched){\n\t\t\tthis.props.dispatch(fetchSocialGraph())\n\t\t}\n\t}\n\n\trender(){\n\t\tvar width = this.props.containerWidth\n\n\t\tconsole.log('social graph width',width)\n\t\tvar data = this.props.socialGraph\n\t\tvar myConfig = {\n\t\t\tautomaticRearrangeAfterDropNode: false,\n\t\t\tstaticGraph:true,\n\t\t    nodeHighlightBehavior: true,\n\t\t    maxZoom: 4,\n\t\t    minZoom: 0.1,\n\t\t    node: {\n\t\t    \tfontSize: 10,\n\t\t    \tsize: 500,\n\t\t        color: 'lightblue',\n\t\t        highlightFontSize: 15,\n\t\t        highlightStrokeColor: 'orange'\n\t\t    },\n\t\t    link: {\n\t\t        highlightColor: 'orange',\n\t\t        color: '#12939A',\n\t\t    },\n\t\t    height: this.props.height,\n\t\t    width: width\n\t\t}\n\n\t\tif (this.props.fetched && this.props.socialGraph.nodes.length > 0) {\n            console.log(this.props.socialGraph)\n\t\t\tvar graph = <Graph id='social-graph'\n\t\t\t\t\tconfig={myConfig}\n\t\t\t\t\tdata={this.props.socialGraph}/>\n\t\t}\n\t\telse {\n\t\t\tvar graph = <Loader active>Fetching Social Graph</Loader>\n\t\t}\n\n\t\tconsole.log(this.props)\n\t\treturn (\n\t\t\t<div>\n\t\t\t\t{graph}\n\t\t\t</div>\n\t\t)\n\t}\n}\n\n\n\n\nSocialGraph = connect((store)=>{\n  return {\n    socialGraph: store.people.socialGraph,\n    fetching: store.people.fetchingSocialGraph,\n    fetched: store.people.fetchedSocialGraph,\n  }\n})(SocialGraph)\n\nexport default Dimensions()(SocialGraph)\n"
  },
  {
    "path": "src/components/statistics.js",
    "content": "import React, {Component} from 'react'\nimport { Statistic, Grid, Image, Icon, Header, \n\t\t\t\t Container, Divider, Button, Loader,\n\t\t\t\t Dimmer, Segment} from 'semantic-ui-react'\nimport { connect } from \"react-redux\";\n\nimport {fetchCountStats} from '../actions/utilActions'\n\n\nexport class CountStats extends Component {\n\tcomponentWillMount() {\n\t\tthis.props.dispatch(fetchCountStats())\n\t}\n\n\trender() {\n\t\tif (this.props.fetchedCountStats) {\n\t\t\tvar statsGroup = (\n\t\t\t  <div style={{height:'60px'}}>\n\t\t\t    <Statistic.Group size='tiny'  widths='five'>\n\t\t\t      <Statistic>\n\t\t\t        <Statistic.Value>{this.props.countStats.num_photos}</Statistic.Value>\n\t\t\t        <Statistic.Label><Icon name='image'/>Photos</Statistic.Label>\n\t\t\t      </Statistic>\n\t\t\t      <Statistic>\n\t\t\t        <Statistic.Value>{this.props.countStats.num_people}</Statistic.Value>\n\t\t\t        <Statistic.Label><Icon name='users'/>People</Statistic.Label>\n\t\t\t      </Statistic>\n\t\t\t      <Statistic>\n\t\t\t        <Statistic.Value>{this.props.countStats.num_faces}</Statistic.Value>\n\t\t\t        <Statistic.Label><Icon name='user circle outline'/>Faces</Statistic.Label>\n\t\t\t      </Statistic>\n\t\t\t      <Statistic>\n\t\t\t        <Statistic.Value>{this.props.countStats.num_albumauto}</Statistic.Value>\n\t\t\t        <Statistic.Label><Icon name='wizard'/>Events</Statistic.Label>\n\t\t\t      </Statistic>\n\t\t\t      <Statistic>\n\t\t\t        <Statistic.Value>{this.props.countStats.num_albumdate}</Statistic.Value>\n\t\t\t        <Statistic.Label><Icon name='calendar'/>Days</Statistic.Label>\n\t\t\t      </Statistic>\n\t\t\t    </Statistic.Group>\n\t\t\t  </div>\n\t\t\t)\n\t\t}\n\t\telse {\n\t\t\tvar statsGroup = (\n\t\t\t  <div style={{height:'60px'}}>\n\t\t\t    <Statistic.Group size='tiny'  widths='five'>\n\t\t\t      <Statistic>\n\t\t\t        <Statistic.Value>-</Statistic.Value>\n\t\t\t        <Statistic.Label><Icon name='image'/>Photos</Statistic.Label>\n\t\t\t      </Statistic>\n\t\t\t      <Statistic>\n\t\t\t        <Statistic.Value>-</Statistic.Value>\n\t\t\t        <Statistic.Label><Icon name='users'/>People</Statistic.Label>\n\t\t\t      </Statistic>\n\t\t\t      <Statistic>\n\t\t\t        <Statistic.Value>-</Statistic.Value>\n\t\t\t        <Statistic.Label><Icon name='user circle outline'/>Faces</Statistic.Label>\n\t\t\t      </Statistic>\n\t\t\t      <Statistic>\n\t\t\t        <Statistic.Value>-</Statistic.Value>\n\t\t\t        <Statistic.Label><Icon name='wizard'/>Events</Statistic.Label>\n\t\t\t      </Statistic>\n\t\t\t      <Statistic>\n\t\t\t        <Statistic.Value>-</Statistic.Value>\n\t\t\t        <Statistic.Label><Icon name='calendar'/>Days</Statistic.Label>\n\t\t\t      </Statistic>\n\t\t\t    </Statistic.Group>\n\t\t\t  </div>\n\t\t\t)\t\t}\n\t\tconsole.log('rendering')\n\t\treturn (\n                <div>\n\t\t\t{statsGroup}\n            </div>\n\t\t)\n\t}\n}\n\nCountStats = connect((store)=>{\n  return {\n    countStats: store.util.countStats,\n    fetchingCountStats: store.util.fetchingCountStats,\n    fetchedCountStats: store.util.fetchedCountStats,\n  }\n})(CountStats)\n"
  },
  {
    "path": "src/containers/login.js",
    "content": "import React from 'react'\nimport { connect } from 'react-redux'\nimport { Redirect } from 'react-router-dom'\nimport {LoginPage} from '../layouts/loginPage'\nimport {login} from  '../actions/authActions'\nimport { fetchSiteSettings } from '../actions/utilActions'\nimport {authErrors, isAuthenticated, isRefreshTokenExpired} from '../reducers'\n\n\nconst Login = (props) => {\n  if(props.isAuthenticated) {\n    console.log(props)\n    if (props.location.state) {\n      return (\n        <Redirect to={props.location.state.from.pathname} />\n      )\n    } else {\n      return (\n        <Redirect to='/' />        \n      )\n    }\n  } else {\n    console.log(props)\n    return (\n      <div className=\"login-page\">\n        <LoginPage {...props}/>\n      </div>\n    )\n  }\n}\n\nconst mapStateToProps = (state) => ({\n  errors: authErrors(state),\n  siteSettings: state.util.siteSettings,\n  isAuthenticated: !isRefreshTokenExpired(state),\n})\n\nconst mapDispatchToProps = (dispatch) => ({\n  onSubmit: (username, password) => {\n    dispatch(login(username, password))\n  },\n  fetchSiteSettings: () => {\n    dispatch(fetchSiteSettings())  \n  }\n\n})\n\nexport default connect(mapStateToProps, mapDispatchToProps)(Login)\n"
  },
  {
    "path": "src/history.js",
    "content": "import createHistory from 'history/createBrowserHistory';\n\nexport default createHistory();\n"
  },
  {
    "path": "src/index.css",
    "content": "body {\n  margin: 0;\n  padding: 0;\n  font-family: sans-serif;\n}\n\n"
  },
  {
    "path": "src/index.js",
    "content": "import React from 'react';\nimport ReactDOM from 'react-dom';\n\nimport 'semantic-ui-css/semantic.min.css';\nimport 'react-vis/dist/style.css'\nimport 'font-awesome/css/font-awesome.min.css';\nimport 'react-leaflet-markercluster/dist/styles.min.css'; // css\nimport { CookiesProvider } from 'react-cookie'\n\n\n\nimport App from './App';\nimport registerServiceWorker from './registerServiceWorker';\nimport configureStore from \"./store\"\nimport { Provider } from \"react-redux\"\n\nimport {LoginPage} from './layouts/loginPage'\nimport {CountryPiChart} from './components/charts/countryPiChart'\n\nimport history from './history'\nimport store from './store'\n\n// export const store = configureStore(history)\n\n\n\nReactDOM.render(\n<Provider store={store}>\n    <CookiesProvider>\n\t\t<App/>\n    </CookiesProvider>\n</Provider>\n, document.getElementById('root'));\n\nregisterServiceWorker();\n"
  },
  {
    "path": "src/layouts/AdminPage.js",
    "content": "import React, {Component} from 'react';\nimport {\n  Form,\n  Radio,\n  Label,\n  Step,\n  Progress,\n  List,\n  Grid,\n  Image,\n  Icon,\n  Item,\n  Header,\n  Segment,\n  Accordion,\n  Container,\n  Message,\n  Input,\n  Button,\n  Loader,\n  Table,\n  Dropdown,\n  Popup,\n  Divider,\n  Pagination,\n} from 'semantic-ui-react';\nimport {connect} from 'react-redux';\nimport {Link} from 'react-router-dom';\n\nimport Modal from 'react-modal';\nimport moment from 'moment';\n\nimport {\n  fetchCountStats,\n  fetchPhotoScanStatus,\n  fetchWordCloud,\n  generateEventAlbums,\n  fetchAutoAlbumProcessingStatus,\n  generateEventAlbumTitles,\n  fetchWorkerAvailability,\n  setSiteSettings,\n  fetchSiteSettings,\n  updateUser,\n  fetchNextcloudDirectoryTree,\n  fetchJobList,\n  deleteJob,\n  fetchUserList,\n  fetchDirectoryTree,\n  manageUpdateUser,\n} from '../actions/utilActions';\nimport {\n  scanPhotos,\n  scanNextcloudPhotos,\n  fetchPhotos,\n} from '../actions/photosActions';\nimport {fetchUserSelfDetails} from '../actions/userActions';\nimport CountryPiChart from '../components/charts/countryPiChart';\nimport {CountStats} from '../components/statistics';\nimport WordCloud from '../components/charts/wordCloud';\n\nimport {AllPhotosMap, EventMap, LocationClusterMap} from '../components/maps';\nimport EventCountMonthGraph from '../components/eventCountMonthGraph';\nimport FaceClusterScatter from '../components/faceClusterGraph';\nimport SocialGraph from '../components/socialGraph';\nimport LazyLoad from 'react-lazyload';\nimport {LocationLink} from '../components/locationLink';\n\nimport Dropzone from 'react-dropzone';\nimport AvatarEditor from 'react-avatar-editor';\nimport MaterialIcon, {colorPallet} from 'material-icons-react';\nimport SortableTree from 'react-sortable-tree';\nimport FileExplorerTheme from 'react-sortable-tree-theme-file-explorer';\n\nexport class AdminPage extends Component {\n  state = {modalOpen: false, userToEdit: null};\n\n  componentDidMount() {\n    if (this.props.auth.access.is_admin) {\n      this.props.dispatch(fetchSiteSettings());\n      this.props.dispatch(fetchJobList());\n      this.props.dispatch(fetchUserList());\n      this.props.dispatch(fetchDirectoryTree());\n    }\n  }\n\n  render() {\n    if (!this.props.auth.access.is_admin) {\n      return <div>Unauthorized</div>;\n    }\n\n    if (this.props.userSelfDetails.square_avatar) {\n      var avatarImgSrc = this.props.userSelfDetails.square_avatar;\n    } else if (this.state.avatarImgSrc) {\n      var avatarImgSrc = this.state.avatarImgSrc;\n    } else {\n      var avatarImgSrc = '/unknown_user.jpg';\n    }\n\n    var buttonsDisabled = !this.props.workerAvailability;\n\n    return (\n      <div style={{padding: 10}}>\n        <Header as=\"h2\">\n          <Icon name=\"wrench\" />\n          <Header.Content>Admin Area</Header.Content>\n        </Header>\n\n        <Divider />\n        <Header as=\"h3\">Site settings</Header>\n\n        <Grid>\n          <Grid.Row>\n            <Grid.Column width={4} textAlign=\"left\">\n              <b>Allow user registration</b>\n            </Grid.Column>\n\n            <Grid.Column width={12}>\n              <Form>\n                <Form.Group>\n                  <Form.Field>\n                    <Radio\n                      label=\"Allow\"\n                      name=\"radioGroup\"\n                      onChange={() =>\n                        this.props.dispatch(\n                          setSiteSettings({allow_registration: true}),\n                        )\n                      }\n                      checked={this.props.siteSettings.allow_registration}\n                    />\n                  </Form.Field>\n                  <Form.Field>\n                    <Radio\n                      label=\"Do not allow\"\n                      name=\"radioGroup\"\n                      onChange={() =>\n                        this.props.dispatch(\n                          setSiteSettings({allow_registration: false}),\n                        )\n                      }\n                      checked={!this.props.siteSettings.allow_registration}\n                    />\n                  </Form.Field>\n                </Form.Group>\n              </Form>\n            </Grid.Column>\n          </Grid.Row>\n        </Grid>\n\n        <Divider />\n        <Header as=\"h3\">\n          Users\n          <Loader size=\"mini\" active={this.props.fetchingUserList} inline />\n        </Header>\n\n        <Table compact celled>\n          <Table.Header>\n            <Table.Row>\n              <Table.HeaderCell>Username</Table.HeaderCell>\n              <Table.HeaderCell>Scan Directory</Table.HeaderCell>\n              <Table.HeaderCell>Photo Count</Table.HeaderCell>\n              <Table.HeaderCell>Last Login</Table.HeaderCell>\n            </Table.Row>\n          </Table.Header>\n          <Table.Body>\n            {this.props.userList.map(user => {\n              return (\n                <Table.Row>\n                  <Table.Cell>{user.username}</Table.Cell>\n                  <Table.Cell error={!user.scan_directory}>\n                    <Icon\n                      name=\"edit\"\n                      onClick={() => {\n                        this.setState({\n                          userToEdit: user,\n                          modalOpen: true,\n                        });\n                      }}\n                    />\n                    {user.scan_directory ? user.scan_directory : 'Not set'}\n                  </Table.Cell>\n                  <Table.Cell>{user.photo_count}</Table.Cell>\n                  <Table.Cell>{moment(user.date_joined).fromNow()}</Table.Cell>\n                </Table.Row>\n              );\n            })}\n          </Table.Body>\n        </Table>\n\n        <Divider />\n\n        <JobList />\n\n        <ModalScanDirectoryEdit\n          onRequestClose={() => {\n            this.setState({modalOpen: false});\n          }}\n          userToEdit={this.state.userToEdit}\n          isOpen={this.state.modalOpen}\n        />\n      </div>\n    );\n  }\n}\n\nconst modalStyles = {\n  content: {\n    top: 150,\n    left: 40,\n    right: 40,\n    height: window.innerHeight - 300,\n\n    overflow: 'hidden',\n    // paddingRight:0,\n    // paddingBottomt:0,\n    // paddingLeft:10,\n    // paddingTop:10,\n    padding: 0,\n    backgroundColor: 'white',\n  },\n  overlay: {\n    top: 0,\n    left: 0,\n    right: 0,\n    bottom: 0,\n    position: 'fixed',\n    borderRadius: 0,\n    border: 0,\n    zIndex: 102,\n    backgroundColor: 'rgba(200,200,200,0.8)',\n  },\n};\n\nclass JobList extends Component {\n  state = {activePage: 1, pageSize: 10};\n\n  componentDidMount() {\n    if (this.props.auth.access.is_admin) {\n      this.props.dispatch(\n        fetchJobList(this.state.activePage, this.state.pageSize),\n      );\n    }\n  }\n\n  render() {\n    return (\n      <div>\n        <Header as=\"h3\">\n          Worker Logs{' '}\n          <Loader size=\"mini\" active={this.props.fetchingJobList} inline />\n        </Header>\n        <Button\n          size=\"mini\"\n          onClick={() => {\n            this.props.dispatch(\n              fetchJobList(this.state.activePage, this.state.pageSize),\n            );\n          }}>\n          Reload\n        </Button>\n        <Table compact attached=\"top\" celled>\n          <Table.Header>\n            <Table.Row>\n              <Table.HeaderCell>Status</Table.HeaderCell>\n              <Table.HeaderCell>Job Type</Table.HeaderCell>\n              <Table.HeaderCell width={5}>Progress</Table.HeaderCell>\n              <Table.HeaderCell>Queued</Table.HeaderCell>\n              <Table.HeaderCell>Started</Table.HeaderCell>\n              <Table.HeaderCell>Duration</Table.HeaderCell>\n              <Table.HeaderCell>Started By</Table.HeaderCell>\n              <Table.HeaderCell>Delete</Table.HeaderCell>\n            </Table.Row>\n          </Table.Header>\n          <Table.Body>\n            {this.props.jobList.map(job => {\n              let progressPerc = 0;\n              if (job.result.progress) {\n                progressPerc =\n                  (job.result.progress.current.toFixed() /\n                    job.result.progress.target) *\n                  100;\n              }\n              if (job.finished && !job.failed) {\n                progressPerc = 100;\n              }\n              const jobSuccess = job.finished && !job.failed;\n              return (\n                <Table.Row\n                  key={job.job_id}\n                  error={job.failed}\n                  warning={!job.finished_at}>\n                  <Table.Cell>\n                    {job.finished ? (\n                      job.failed ? (\n                        <Icon name=\"warning sign\" color=\"red\" />\n                      ) : (\n                        <Icon name=\"checkmark\" color=\"green\" />\n                      )\n                    ) : job.started_at ? (\n                      <Icon name=\"refresh\" loading color=\"yellow\" />\n                    ) : (\n                      <Icon name=\"wait\" color=\"blue\" />\n                    )}\n                  </Table.Cell>\n                  <Table.Cell>{job.job_type_str}</Table.Cell>\n                  <Table.Cell>\n                    {job.result.progress.target !== 0 && !job.finished ? (\n                      <Progress\n                        indicating\n                        size=\"small\"\n                        progress=\"ratio\"\n                        value={job.result.progress.current}\n                        total={\n                          job.result.progress.target > 0\n                            ? job.result.progress.target\n                            : 1\n                        }\n                        active={!job.finished}\n                        success={jobSuccess}>\n                        {(\n                          job.result.progress.current.toFixed(2) /\n                          job.result.progress.target\n                        ).toFixed(2) * 100}\n                        %\n                      </Progress>\n                    ) : job.finished ? (\n                      <Progress\n                        success={!job.failed}\n                        error={job.failed}\n                        percent={100}>\n                        {job.result.progress.current} Item(s) processed{' '}\n                      </Progress>\n                    ) : null}\n                  </Table.Cell>\n                  <Table.Cell>{moment(job.queued_at).fromNow()}</Table.Cell>\n                  <Table.Cell>\n                    {job.started_at ? moment(job.started_at).fromNow() : ''}\n                  </Table.Cell>\n\n                  <Table.Cell>\n                    {job.finished\n                      ? moment\n                          .duration(\n                            moment(job.finished_at) - moment(job.started_at),\n                          )\n                          .humanize()\n                      : job.started_at\n                      ? 'running'\n                      : ''}\n                  </Table.Cell>\n                  <Table.Cell>{job.started_by.username}</Table.Cell>\n                  <Table.Cell>\n                    <Popup\n                      trigger={\n                        <Button\n                          onClick={() => {\n                            this.props.dispatch(\n                              deleteJob(\n                                job.id,\n                                this.state.activatePage,\n                                this.state.pageSize,\n                              ),\n                            );\n                          }}\n                          color=\"red\"\n                          size=\"tiny\">\n                          Remove\n                        </Button>\n                      }\n                      content=\"Does not actually stop the job, only removes this entry from DB. Use only in cases when you know that a job failed ungracefully, by inspecting the logs, etc.\"\n                    />\n                  </Table.Cell>\n                </Table.Row>\n              );\n            })}\n          </Table.Body>\n        </Table>\n        <Pagination\n          attached=\"bottom\"\n          defaultActivePage={this.state.page}\n          ellipsisItem={{\n            content: <Icon name=\"ellipsis horizontal\" />,\n            icon: true,\n          }}\n          firstItem={{content: <Icon name=\"angle double left\" />, icon: true}}\n          lastItem={{content: <Icon name=\"angle double right\" />, icon: true}}\n          prevItem={{content: <Icon name=\"angle left\" />, icon: true}}\n          nextItem={{content: <Icon name=\"angle right\" />, icon: true}}\n          totalPages={Math.ceil(\n            this.props.jobCount.toFixed(1) / this.state.pageSize,\n          )}\n          onPageChange={(e, d) => {\n            console.log(d.activePage);\n            this.setState({activePage: d.activePage});\n            this.props.dispatch(\n              fetchJobList(d.activePage, this.state.pageSize),\n            );\n          }}\n        />\n      </div>\n    );\n  }\n}\n\nclass ModalScanDirectoryEdit extends Component {\n  constructor(props) {\n    super(props);\n    this.state = {newScanDirectory: '', treeData: []};\n    this.nodeClicked = this.nodeClicked.bind(this);\n    this.inputRef = React.createRef();\n  }\n\n  static getDerivedStateFromProps(nextProps, prevState) {\n    if (prevState.treeData.length === 0) {\n      return {...prevState, treeData: nextProps.directoryTree};\n    } else {\n      return prevState;\n    }\n  }\n\n  nodeClicked(event, rowInfo) {\n    console.log(rowInfo);\n    this.inputRef.current.inputRef.value = rowInfo.node.absolute_path;\n    this.setState({newScanDirectory: rowInfo.node.absolute_path});\n  }\n\n  render() {\n    console.log(this.inputRef);\n    return (\n      <Modal\n        ariaHideApp={false}\n        isOpen={this.props.isOpen}\n        onRequestClose={() => {\n          this.props.onRequestClose();\n          this.setState({newScanDirectory: ''});\n        }}\n        style={modalStyles}>\n        <div style={{padding: 10}}>\n          <Header as=\"h3\">\n            Set the scan directory for user \"\n            {this.props.userToEdit ? this.props.userToEdit.username : '...'}\"\n            <Header.Subheader>\n              When the user \"\n              {this.props.userToEdit ? this.props.userToEdit.username : '...'}\"\n              clicks on the 'scan photos' button, photos in the directory that\n              you specify here will be imported under the user's account.\n            </Header.Subheader>\n          </Header>\n        </div>\n        <Grid>\n          <Grid.Row>\n            <Grid.Column>\n              <div style={{padding: 10}}>\n                <Header as=\"h5\">User's current directory</Header>\n              </div>\n              <div style={{padding: 7}}>\n                <Input\n                  ref={this.inputRef}\n                  type=\"text\"\n                  placeholder={\n                    this.props.userToEdit\n                      ? this.props.userToEdit.scan_directory === ''\n                        ? 'not set'\n                        : this.props.userToEdit.scan_directory\n                      : '...'\n                  }\n                  action\n                  fluid>\n                  <input />\n                  <Button\n                    type=\"submit\"\n                    color=\"green\"\n                    onClick={() => {\n                      const newUserData = {\n                        ...this.props.userToEdit,\n                        scan_directory: this.state.newScanDirectory,\n                      };\n                      console.log(newUserData);\n                      this.props.dispatch(manageUpdateUser(newUserData));\n                      this.props.onRequestClose();\n                    }}>\n                    Update\n                  </Button>\n                </Input>\n              </div>\n            </Grid.Column>\n          </Grid.Row>\n          <Grid.Row>\n            <Grid.Column>\n              <div style={{padding: 10}}>\n                <Header as=\"h5\">Choose a directory from below</Header>\n              </div>\n              <div\n                style={{\n                  height: 300,\n                  width: '100%',\n                  paddingLeft: 7,\n                  paddingTop: 7,\n                  paddingBottom: 7,\n                }}>\n                <SortableTree\n                  innerStyle={{outline: 'none'}}\n                  canDrag={() => false}\n                  canDrop={() => false}\n                  treeData={this.state.treeData}\n                  onChange={treeData => this.setState({treeData})}\n                  theme={FileExplorerTheme}\n                  generateNodeProps={rowInfo => {\n                    let nodeProps = {\n                      onClick: event => this.nodeClicked(event, rowInfo),\n                    };\n                    if (this.state.selectedNodeId === rowInfo.node.id) {\n                      nodeProps.className = 'selected-node';\n                    }\n                    return nodeProps;\n                  }}\n                />\n              </div>\n            </Grid.Column>\n          </Grid.Row>\n        </Grid>\n      </Modal>\n    );\n  }\n}\n\nJobList = connect(store => {\n  return {\n    auth: store.auth,\n    jobList: store.util.jobList,\n    jobCount: store.util.jobCount,\n    fetchingJobList: store.util.fetchingJobList,\n    fetchedJobList: store.util.fetchedJobList,\n  };\n})(JobList);\n\nModalScanDirectoryEdit = connect(store => {\n  return {\n    auth: store.auth,\n\n    directoryTree: store.util.directoryTree,\n    fetchingDirectoryTree: store.util.fetchingDirectoryTree,\n    fetchedDirectoryTree: store.util.fetchedDirectoryTree,\n\n    userList: store.util.userList,\n    fetchingUSerList: store.util.fetchingUserList,\n    fetchedUserList: store.util.fetchedUserList,\n  };\n})(ModalScanDirectoryEdit);\n\nAdminPage = connect(store => {\n  return {\n    auth: store.auth,\n    util: store.util,\n    gridType: store.ui.gridType,\n    siteSettings: store.util.siteSettings,\n    statusPhotoScan: store.util.statusPhotoScan,\n    statusAutoAlbumProcessing: store.util.statusAutoAlbumProcessing,\n    generatingAutoAlbums: store.util.generatingAutoAlbums,\n    scanningPhotos: store.photos.scanningPhotos,\n    fetchedCountStats: store.util.fetchedCountStats,\n    workerAvailability: store.util.workerAvailability,\n    fetchedNextcloudDirectoryTree: store.util.fetchedNextcloudDirectoryTree,\n    userSelfDetails: store.user.userSelfDetails,\n    fetchingJobList: store.util.fetchingJobList,\n    fetchedJobList: store.util.fetchedJobList,\n    userList: store.util.userList,\n    fetchingUserList: store.util.fetchingUserList,\n    fetchedUserList: store.util.fetchedUserList,\n  };\n})(AdminPage);\n"
  },
  {
    "path": "src/layouts/Bench.js",
    "content": "import React, {Component} from 'react';\nimport { connect } from \"react-redux\";\nimport {fetchPeopleAlbums, fetchAutoAlbums, generateAutoAlbums, fetchAutoAlbumsList} from '../actions/albumsActions'\nimport {AlbumAutoCard, AlbumAutoGallery} from '../components/album'\nimport {Container, Image, Icon, Header, Button, Card, Label, Popup} from 'semantic-ui-react'\nimport {fetchCountStats,fetchPhotoScanStatus,\n        fetchAutoAlbumProcessingStatus} from '../actions/utilActions'\n\nimport {Server, serverAddress} from '../api_client/apiClient'\n\n\n\nexport class SecuredImage extends Component {\n    state ={\n        imgData:null\n    }\n\n    componentWillMount() {\n        Server.get(this.props.src)\n          .then((resp)=>{\n              console.log(resp)\n              this.setState({imgData:resp.data.data})\n          })\n          .catch((err)=>{\n              console.log('img load error')\n              console.log(err)\n          })\n    }\n    render() {\n        const {imgData} = this.state\n        const imgProps = {...this.props, src:'data:image/jpeg;base64,'+imgData}\n        \n        if (imgData) {\n            return (\n                <Image {...imgProps}/>\n            ) \n        }\n        return (\n            <div>hello</div>\n        )\n    }\n}\n"
  },
  {
    "path": "src/layouts/DataVisualization.js",
    "content": "import React, { Component } from \"react\";\nimport {\n  Popup,\n  Segment,\n  Grid,\n  Image,\n  Icon,\n  Header,\n  Container,\n  Divider,\n  Button,\n  Loader,\n  Menu\n} from \"semantic-ui-react\";\nimport { connect } from \"react-redux\";\n\nimport {\n  fetchCountStats,\n  fetchPhotoScanStatus,\n  fetchWordCloud,\n  fetchAutoAlbumProcessingStatus\n} from \"../actions/utilActions\";\nimport { scanPhotos, fetchPhotos } from \"../actions/photosActions\";\n\nimport CountryPiChart from \"../components/charts/countryPiChart\";\nimport { CountStats } from \"../components/statistics\";\nimport WordCloud from \"../components/charts/wordCloud\";\nimport { LocationLink } from \"../components/locationLink\";\n\nimport { AllPhotosMap, EventMap, LocationClusterMap } from \"../components/maps\";\nimport EventCountMonthGraph from \"../components/eventCountMonthGraph\";\nimport LocationDurationStackedBar from \"../components/locationDurationStackedBar\";\n\nimport FaceClusterScatter from \"../components/faceClusterGraph\";\nimport SocialGraph from \"../components/socialGraph\";\nimport LazyLoad from \"react-lazyload\";\n\nexport class LocationTree extends Component {\n  render() {\n    return (\n      <div>\n        <LocationLink\n          width={window.innerWidth - 120}\n          height={window.innerHeight - 50}\n        />\n      </div>\n    );\n  }\n}\n\nexport class PhotoMap extends Component {\n  render() {\n    return (\n      <div style={{ marginLeft: -5 }}>\n        <LocationClusterMap\n          height={window.innerHeight - 55}\n        />\n      </div>\n    );\n  }\n}\n\nexport class WordClouds extends Component {\n  componentWillMount() {\n    this.props.dispatch(fetchWordCloud());\n  }\n\n  render() {\n    return (\n      <div style={{ padding: 10 }}>\n        <div>\n          <WordCloud height={320} type=\"location\" />\n          <Divider hidden />\n          <WordCloud height={320} type=\"captions\" />\n          <Divider hidden />\n          <WordCloud height={320} type=\"people\" />\n        </div>\n      </div>\n    );\n  }\n}\n\nWordClouds = connect(store => {\n  return {\n    statusPhotoScan: store.util.statusPhotoScan,\n    statusAutoAlbumProcessing: store.util.statusAutoAlbumProcessing,\n    generatingAlbumsAuto: store.albums.generatingAlbumsAuto,\n    scanningPhotos: store.photos.scanningPhotos,\n    fetchedCountStats: store.util.fetchedCountStats\n  };\n})(WordClouds);\n\nexport class Timeline extends Component {\n  render() {\n    return (\n      <div style={{ padding: 10 }}>\n        <div>\n          <EventCountMonthGraph />\n          <Divider hidden />\n          <LocationDurationStackedBar />\n        </div>\n      </div>\n    );\n  }\n}\n\nexport class Graph extends Component {\n  render() {\n    return (\n      <div style={{ maringLeft: -5 }}>\n        <SocialGraph height={window.innerHeight - 60} />\n      </div>\n    );\n  }\n}\n\nexport class FaceScatter extends Component {\n  render() {\n    return (\n      <div>\n        <FaceClusterScatter height={window.innerHeight - 55} />\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "src/layouts/FaceDashboardV3.js",
    "content": "import React, { Component } from \"react\";\nimport {\n  Checkbox,\n  Popup,\n  Input,\n  Item,\n  Menu,\n  Image,\n  Icon,\n  Header,\n  Container,\n  Divider,\n  Button,\n  Label,\n  Loader,\n  Sticky,\n  Accordion,\n} from \"semantic-ui-react\";\n\nimport { SecuredImageJWT } from \"../components/SecuredImage\";\n\nimport { connect } from \"react-redux\";\nimport {\n  deleteFaces,\n  setFacesPersonLabel,\n  loadFaceToLabel,\n  trainFaces,\n  clusterFaces,\n  fetchInferredFacesList,\n  fetchLabeledFacesList,\n  fetchFacesList,\n} from \"../actions/facesActions\";\nimport LazyLoad from \"react-lazyload\";\nimport _ from \"lodash\";\nimport {\n  Grid,\n  List,\n  WindowScroller,\n  AutoSizer,\n  CellMeasurer,\n} from \"react-virtualized\";\nimport {\n  calculateFaceGridCellSize,\n  calculateFaceGridCells,\n} from \"../util/gridUtils\";\nimport { ScrollSpeed, SCROLL_DEBOUNCE_DURATION } from \"../util/scrollUtils\";\nimport debounce from \"lodash/debounce\";\nimport { fetchPeople, addPerson } from \"../actions/peopleActions\";\nimport { serverAddress } from \"../api_client/apiClient\";\nimport Modal from \"react-modal\";\nimport moment from \"moment\";\n// <Icon name='id badge' circular />\nvar topMenuHeight = 45; // don't change this\nvar leftMenuWidth = 85; // don't change this\nvar SIDEBAR_WIDTH = 85;\n\nconst SPEED_THRESHOLD = 500;\n\nfunction fuzzy_match(str, pattern) {\n  if (pattern.split(\"\").length > 0) {\n    pattern = pattern\n      .split(\"\")\n      .map((a) => _.escapeRegExp(a))\n      .reduce(function (a, b) {\n        return a + \".*\" + b;\n      });\n    return new RegExp(pattern).test(str);\n  } else {\n    return false;\n  }\n}\n\nconst modalStyles = {\n  content: {\n    top: 150,\n    left: 40,\n    right: 40,\n    height: window.innerHeight - 300,\n\n    overflow: \"hidden\",\n    padding: 0,\n    backgroundColor: \"white\",\n  },\n  overlay: {\n    top: 0,\n    left: 0,\n    right: 0,\n    bottom: 0,\n    position: \"fixed\",\n    borderRadius: 0,\n    border: 0,\n    zIndex: 102,\n    backgroundColor: \"rgba(200,200,200,0.8)\",\n  },\n};\n\nclass ModalPersonEdit extends Component {\n  state = { newPersonName: \"\" };\n  render() {\n    if (this.state.newPersonName.length > 0) {\n      var filteredPeopleList = this.props.people.filter((el) =>\n        fuzzy_match(\n          el.text.toLowerCase(),\n          this.state.newPersonName.toLowerCase()\n        )\n      );\n    } else {\n      var filteredPeopleList = this.props.people;\n    }\n\n    const allFaces = _.concat(\n      this.props.inferredFacesList,\n      this.props.labeledFacesList\n    );\n\n    var selectedImageIDs = this.props.selectedFaces.map((faceID) => {\n      const res = allFaces.filter((face) => face.id === faceID)[0].image;\n      const splitBySlash = res.split(\"/\");\n      console.log(splitBySlash[splitBySlash.length - 1]);\n      const faceImageID = splitBySlash[splitBySlash.length - 1];\n      return faceImageID;\n    });\n    return (\n      <Modal\n        ariaHideApp={false}\n        onAfterOpen={() => {\n          this.props.dispatch(fetchPeople());\n        }}\n        isOpen={this.props.isOpen}\n        onRequestClose={() => {\n          this.props.onRequestClose();\n          this.setState({ newPersonName: \"\" });\n        }}\n        style={modalStyles}\n      >\n        <div style={{ height: 50, width: \"100%\", padding: 7 }}>\n          <Header>\n            Label faces\n            <Header.Subheader>\n              Label selected {this.props.selectedFaces.length} face(s) as...\n            </Header.Subheader>\n          </Header>\n        </div>\n        <Divider fitted />\n        <div\n          style={{ height: 100, padding: 5, height: 50, overflowY: \"hidden\" }}\n        >\n          <Image.Group>\n            {selectedImageIDs.map((image) => (\n              <SecuredImageJWT\n                key={\"selected_image\" + image}\n                height={40}\n                width={40}\n                src={serverAddress + \"/media/faces/\" + image}\n              />\n            ))}\n          </Image.Group>\n        </div>\n        <Divider fitted />\n        <div\n          style={{\n            paddingLeft: 10,\n            paddingTop: 10,\n            overflowY: \"scroll\",\n            height: window.innerHeight - 300 - 100,\n            width: \"100%\",\n          }}\n        >\n          <div style={{ paddingRight: 5 }}>\n            <Header as=\"h4\">New person</Header>\n            <Popup\n              inverted\n              content={\n                'Album \"' +\n                this.state.newPersonName.trim() +\n                '\" already exists.'\n              }\n              position=\"bottom center\"\n              open={this.props.people\n                .map((el) => el.text.toLowerCase().trim())\n                .includes(this.state.newPersonName.toLowerCase().trim())}\n              trigger={\n                <Input\n                  fluid\n                  error={this.props.people\n                    .map((el) => el.text.toLowerCase().trim())\n                    .includes(this.state.newPersonName.toLowerCase().trim())}\n                  onChange={(e, v) => {\n                    this.setState({ newPersonName: v.value });\n                  }}\n                  placeholder=\"Person name\"\n                  action\n                >\n                  <input />\n                  <Button\n                    positive\n                    onClick={() => {\n                      this.props.dispatch(\n                        setFacesPersonLabel(\n                          this.props.selectedFaces,\n                          this.state.newPersonName\n                        )\n                      );\n                      this.props.onRequestClose();\n                      this.setState({ newPersonName: \"\" });\n                    }}\n                    disabled={this.props.people\n                      .map((el) => el.text.toLowerCase().trim())\n                      .includes(this.state.newPersonName.toLowerCase().trim())}\n                    type=\"submit\"\n                  >\n                    Add Person\n                  </Button>\n                </Input>\n              }\n            />\n          </div>\n          <Divider />\n          {filteredPeopleList.length > 0 &&\n            filteredPeopleList.map((item) => {\n              return (\n                <div\n                  key={\"modal_person_face_label_\" + item.text}\n                  style={{\n                    height: 70,\n                    justifyContent: \"center\",\n                    alignItems: \"center\",\n                  }}\n                >\n                  <Header\n                    as=\"h4\"\n                    onClick={() => {\n                      this.props.dispatch(\n                        setFacesPersonLabel(this.props.selectedFaces, item.text)\n                      );\n                      this.props.onRequestClose();\n                      // console.log('trying to add photos: ',this.props.selectedFaces)\n                      // console.log('to user album id: ',item.id)\n                    }}\n                  >\n                    <SecuredImageJWT\n                      circular\n                      height={60}\n                      width={60}\n                      src={serverAddress + item.face_url}\n                    />\n                    <Header.Content>\n                      {item.text}\n                      <Header.Subheader>\n                        {item.face_count} Photo(s)\n                      </Header.Subheader>\n                    </Header.Content>\n                  </Header>\n                </div>\n              );\n            })}\n        </div>\n      </Modal>\n    );\n  }\n}\n\nexport class FaceDashboard extends Component {\n  state = {\n    lastChecked: null,\n    activeItem: \"labeled\",\n    entrySquareSize: 200,\n    numEntrySquaresPerRow: 10,\n    selectMode: false,\n    selectedFaces: [],\n    modalPersonEditOpen: false,\n    topRowPersonName: null,\n  };\n\n  handleItemClick = (e, { name }) => this.setState({ activeItem: name });\n\n  scrollSpeedHandler = new ScrollSpeed();\n\n  handleScroll = ({ scrollTop }) => {\n    // scrollSpeed represents the number of pixels scrolled since the last scroll event was fired\n    const scrollSpeed = Math.abs(\n      this.scrollSpeedHandler.getScrollSpeed(scrollTop)\n    );\n\n    if (scrollSpeed >= SPEED_THRESHOLD) {\n      this.setState({\n        isScrollingFast: true,\n        scrollTop: scrollTop,\n      });\n    }\n\n    // Since this method is debounced, it will only fire once scrolling has stopped for the duration of SCROLL_DEBOUNCE_DURATION\n    this.handleScrollEnd();\n  };\n\n  handleScrollEnd = debounce(() => {\n    const { isScrollingFast } = this.state;\n\n    if (isScrollingFast) {\n      this.setState({\n        isScrollingFast: false,\n      });\n    }\n  }, SCROLL_DEBOUNCE_DURATION);\n\n  componentDidMount() {\n    this.props.dispatch(fetchInferredFacesList());\n    this.props.dispatch(fetchLabeledFacesList());\n    this.handleResize();\n    window.addEventListener(\"resize\", this.handleResize.bind(this));\n  }\n\n  static getDerivedStateFromProps(nextProps, prevState) {\n    var t0 = performance.now();\n\n    var inferredGroupedByPerson = _.groupBy(\n      nextProps.inferredFacesList,\n      (el) => el.person_name\n    );\n    var inferredGroupedByPersonList = _.sortBy(\n      _.toPairsIn(inferredGroupedByPerson),\n      (el) => el[0]\n    ).map((el) => {\n      return {\n        person_name: el[0],\n        faces: _.reverse(\n          _.sortBy(el[1], (el2) => el2.person_label_probability)\n        ),\n      };\n    });\n\n    var labeledGroupedByPerson = _.groupBy(\n      nextProps.labeledFacesList,\n      (el) => el.person_name\n    );\n    var labeledGroupedByPersonList = _.sortBy(\n      _.toPairsIn(labeledGroupedByPerson),\n      (el) => el[0]\n    ).map((el) => {\n      return { person_name: el[0], faces: el[1] };\n    });\n    var t1 = performance.now();\n\n    var idx2hash = [];\n\n    const inferredCellContents = calculateFaceGridCells(\n      inferredGroupedByPersonList,\n      prevState.numEntrySquaresPerRow\n    ).cellContents;\n    const labeledCellContents = calculateFaceGridCells(\n      labeledGroupedByPersonList,\n      prevState.numEntrySquaresPerRow\n    ).cellContents;\n    const nextState = {\n      ...prevState,\n      inferredCellContents,\n      labeledCellContents,\n      inferredGroupedByPersonList,\n      labeledGroupedByPersonList,\n    };\n    return nextState;\n  }\n\n  handleResize() {\n    if (this.props.showSidebar) {\n      var columnWidth = window.innerWidth - SIDEBAR_WIDTH - 5 - 5 - 10;\n    } else {\n      var columnWidth = window.innerWidth - 5 - 5 - 10;\n    }\n\n    const {\n      entrySquareSize,\n      numEntrySquaresPerRow,\n    } = calculateFaceGridCellSize(columnWidth);\n\n    this.setState({\n      width: window.innerWidth,\n      height: window.innerHeight,\n      entrySquareSize: entrySquareSize,\n      numEntrySquaresPerRow: numEntrySquaresPerRow,\n    });\n\n    if (this.state.inferredGroupedByPersonList) {\n      const inferredCellContents = calculateFaceGridCells(\n        this.state.inferredGroupedByPersonList,\n        numEntrySquaresPerRow\n      ).cellContents;\n      this.setState({\n        inferredCellContents,\n      });\n    }\n    if (this.state.labeledGroupedByPersonList) {\n      const labeledCellContents = calculateFaceGridCells(\n        this.state.labeledGroupedByPersonList,\n        numEntrySquaresPerRow\n      ).cellContents;\n      this.setState({\n        labeledCellContents,\n      });\n    }\n  }\n\n  handleClick(e, cell) {\n    if (!this.state.lastChecked) {\n      this.state.lastChecked = cell;\n      this.onFaceSelect(cell.id);\n      return;\n    }\n    if (e.shiftKey) {\n      var currentCellsInRowFormat =\n        this.state.activeItem === \"labeled\"\n          ? this.state.labeledCellContents\n          : this.state.inferredCellContents;\n\n      var allFacesInCells = [];\n      for (var i = 0; i < currentCellsInRowFormat.length; i++) {\n        for (var j = 0; j < this.state.numEntrySquaresPerRow; j++) {\n          allFacesInCells.push(currentCellsInRowFormat[i][j]);\n        }\n      }\n      var start = allFacesInCells.indexOf(cell);\n      var end = allFacesInCells.indexOf(this.state.lastChecked);\n      console.log(start);\n      console.log(end);\n\n      var facesToSelect = allFacesInCells.slice(\n        Math.min(start, end),\n        Math.max(start, end) + 1\n      );\n      facesToSelect.forEach((face) => this.onFaceSelect(face.id));\n      return;\n    }\n    this.onFaceSelect(cell.id);\n    this.state.lastChecked = cell;\n  }\n\n  onFaceSelect(faceID) {\n    var selectedFaces = this.state.selectedFaces;\n    if (selectedFaces.includes(faceID)) {\n      selectedFaces = selectedFaces.filter((item) => item !== faceID);\n    } else {\n      selectedFaces.push(faceID);\n    }\n    this.setState({ selectedFaces: selectedFaces });\n    console.log(selectedFaces.length)\n    console.log(selectedFaces > 0)\n    this.setState({ selectMode: selectedFaces.length > 0 });\n  }\n\n  cellRenderer = ({ columnIndex, key, rowIndex, style }) => {\n    if (this.state.activeItem === \"labeled\") {\n      var cell = this.state.labeledCellContents[rowIndex][columnIndex];\n    } else {\n      var cell = this.state.inferredCellContents[rowIndex][columnIndex];\n    }\n\n    if (cell) {\n      if (!cell.image) {\n        return (\n          <div\n            key={key}\n            style={{\n              ...style,\n              paddingTop: this.state.entrySquareSize / 2.0 - 35,\n              width: this.state.width,\n              height: this.state.entrySquareSize,\n              justifyContent: \"center\",\n              alignItems: \"center\",\n            }}\n          >\n            <Header size=\"huge\">\n              {cell.person_name}\n              <Header.Subheader>{cell.faces.length} Faces</Header.Subheader>\n            </Header>\n            <Divider />\n          </div>\n        );\n      } else {\n        const labelProbability = cell.person_label_probability;\n        const labelProbabilityColor =\n          labelProbability > 0.9\n            ? \"green\"\n            : labelProbability > 0.8\n            ? \"yellow\"\n            : labelProbability > 0.7\n            ? \"orange\"\n            : \"red\";\n\n        var labelProbabilityIcon = (\n          <div style={{ right: 6, bottom: 6, position: \"absolute\" }}>\n            <Popup\n              trigger={\n                <Icon\n                  circular\n                  style={{ backgroundColor: \"white\" }}\n                  color={labelProbabilityColor}\n                  name=\"circle\"\n                />\n              }\n              on=\"focus\"\n              flowing\n              inverted\n              hideOnScroll\n              position=\"bottom center\"\n              content={`Confidence: ${(labelProbability * 100).toFixed(1)}%`}\n            />\n          </div>\n        );\n        var showPhotoIcon = (\n          <div style={{ left: 6, bottom: 6, position: \"absolute\" }}>\n            <Popup\n              trigger={\n                <Icon\n                  circular\n                  style={{ backgroundColor: \"white\" }}\n                  color=\"black\"\n                  name=\"image\"\n                />\n              }\n              on=\"focus\"\n              flowing\n              hideOnScroll\n              inverted\n              position=\"bottom center\"\n              content={\n                <SecuredImageJWT\n                  size=\"large\"\n                  src={\n                    serverAddress +\n                    \"/media/thumbnails_big/\" +\n                    cell.photo +\n                    \".jpg\"\n                  }\n                />\n              }\n            />\n          </div>\n        );\n\n        if (this.state.isScrollingFast) {\n          return (\n            <div key={key} style={{ ...style, padding: 5 }}>\n              <SecuredImageJWT\n                rounded\n                src={\"/thumbnail_placeholder.png\"}\n                height={this.state.entrySquareSize - 10}\n                width={this.state.entrySquareSize - 10}\n              />\n            </div>\n          );\n        } else {\n          // TODO: janky shit going on in the next line!\n          var faceImageSrc =\n            serverAddress +\n            \"/media/faces/\" +\n            _.reverse(cell.image.split(\"/\"))[0];\n          if (this.state.selectMode) {\n            const isSelected = this.state.selectedFaces.includes(cell.id);\n            return (\n              <div key={key} style={{ ...style, padding: 5 }}>\n                <div\n                  style={{\n                    padding: 10,\n                    backgroundColor: isSelected ? \"#AED6F1\" : \"#eeeeee\",\n                  }}\n                >\n                  <SecuredImageJWT\n                    rounded\n                    onClick={(e) => {\n                      this.handleClick(e, cell);\n                    }}\n                    src={faceImageSrc}\n                    height={this.state.entrySquareSize - 30}\n                    width={this.state.entrySquareSize - 30}\n                  />\n                  {this.state.activeItem === \"inferred\" && labelProbabilityIcon}\n                  {showPhotoIcon}\n                </div>\n              </div>\n            );\n          } else {\n            return (\n              <div key={key} style={{ ...style, padding: 5 }}>\n                <SecuredImageJWT\n                  rounded\n                  onClick={(e) => {\n                    this.handleClick(e, cell);\n                  }}\n                  src={faceImageSrc}\n                  height={this.state.entrySquareSize - 10}\n                  width={this.state.entrySquareSize - 10}\n                />\n                {this.state.activeItem === \"inferred\" && labelProbabilityIcon}\n                {showPhotoIcon}\n              </div>\n            );\n          }\n        }\n      }\n    } else {\n      return <div key={key} style={style} />;\n    }\n  };\n\n  render() {\n    const { activeItem } = this.state;\n    return (\n      <div>\n        <div style={{ marginLeft: -5, height: 40 }}>\n          <Menu pointing secondary>\n            <Menu.Item\n              name=\"labeled\"\n              active={activeItem === \"labeled\"}\n              onClick={this.handleItemClick}\n            >\n              {\"Labeled \"}{\" \"}\n              <Loader\n                size=\"mini\"\n                inline\n                active={this.props.fetchingLabeledFacesList}\n              />\n            </Menu.Item>\n            <Menu.Item\n              name=\"inferred\"\n              active={activeItem === \"inferred\"}\n              onClick={this.handleItemClick}\n            >\n              {\"Inferred \"}{\" \"}\n              <Loader\n                size=\"mini\"\n                inline\n                active={this.props.fetchingInferredFacesList}\n              />\n            </Menu.Item>\n          </Menu>\n        </div>\n        <div\n          style={{\n            right: 0,\n            top: topMenuHeight,\n            position: \"fixed\",\n            padding: 5,\n          }}\n        >\n          <Label basic>{this.state.topRowPersonName}</Label>\n        </div>\n\n        <div\n          style={{\n            marginLeft: -5,\n            paddingLeft: 5,\n            paddingRight: 5,\n            height: 40,\n            paddingTop: 4,\n            backgroundColor: this.state.selectMode ? \"#AED6F1\" : \"#eeeeee\",\n          }}\n        >\n          <Checkbox\n            label={`${this.state.selectedFaces.length} selected`}\n            style={{ padding: 5 }}\n            toggle\n            checked={this.state.selectMode}\n            onClick={() => {\n              this.setState({ selectMode: !this.state.selectMode });\n            }}\n          />\n\n          <Button.Group compact floated=\"right\">\n            <Popup\n              inverted\n              trigger={\n                <Button\n                  color=\"green\"\n                  disabled={this.state.selectedFaces.length === 0}\n                  onClick={() => {\n                    if (this.state.selectedFaces.length > 0) {\n                      this.setState({ modalPersonEditOpen: true });\n                    }\n                  }}\n                  icon=\"plus\"\n                />\n              }\n              content=\"Add to an existing album or create a new album\"\n            />\n            <Popup\n              inverted\n              trigger={\n                <Button\n                  color=\"red\"\n                  disabled={this.state.selectedFaces.length === 0}\n                  onClick={() => {\n                    this.props.dispatch(deleteFaces(this.state.selectedFaces));\n                    this.setState({ selectedFaces: [] });\n                  }}\n                  icon=\"trash\"\n                />\n              }\n              content=\"delete faces\"\n            />\n\n            <Popup\n              inverted\n              trigger={\n                <Button\n                  disabled={!this.props.workerAvailability}\n                  loading={\n                    this.props.workerRunningJob &&\n                    this.props.workerRunningJob.job_type_str == \"Train Faces\"\n                  }\n                  color=\"blue\"\n                  onClick={() => {\n                    this.props.dispatch(trainFaces());\n                  }}\n                  icon=\"lightning\"\n                />\n              }\n              content=\"Train a classifier and automatically label faces\"\n            />\n          </Button.Group>\n        </div>\n\n        <div>\n          <AutoSizer\n            disableHeight\n            style={{ outline: \"none\", padding: 0, margin: 0 }}\n          >\n            {({ width }) => (\n              <Grid\n                style={{ outline: \"none\" }}\n                onScroll={this.handleScroll}\n                disableHeader={false}\n                onSectionRendered={({ rowStartIndex }) => {\n                  if (activeItem === \"labeled\") {\n                    this.setState({\n                      topRowPersonName: this.state.labeledCellContents[\n                        rowStartIndex\n                      ][0].person_name,\n                    });\n                  } else {\n                    this.setState({\n                      topRowPersonName: this.state.inferredCellContents[\n                        rowStartIndex\n                      ][0].person_name,\n                    });\n                  }\n                  // console.log(this.state.labeledCellContents[rowStartIndex][0].person_name)\n                }}\n                cellRenderer={this.cellRenderer}\n                columnWidth={this.state.entrySquareSize}\n                columnCount={this.state.numEntrySquaresPerRow}\n                height={this.state.height - topMenuHeight - 40 - 40}\n                rowHeight={this.state.entrySquareSize}\n                rowCount={\n                  activeItem === \"labeled\"\n                    ? this.state.labeledCellContents.length\n                    : this.state.inferredCellContents.length\n                }\n                width={width}\n              />\n            )}\n          </AutoSizer>\n        </div>\n\n        <ModalPersonEdit\n          isOpen={this.state.modalPersonEditOpen}\n          onRequestClose={() => {\n            this.setState({\n              modalPersonEditOpen: false,\n              selectedFaces: [],\n            });\n          }}\n          selectedFaces={this.state.selectedFaces}\n        />\n      </div>\n    );\n  }\n}\n\nFaceDashboard = connect((store) => {\n  return {\n    workerAvailability: store.util.workerAvailability,\n    workerRunningJob: store.util.workerRunningJob,\n\n    showSidebar: store.ui.showSidebar,\n\n    facesList: store.faces.facesList,\n    inferredFacesList: store.faces.inferredFacesList,\n    labeledFacesList: store.faces.labeledFacesList,\n\n    people: store.people.people,\n\n    facesVis: store.faces.facesVis,\n    training: store.faces.training,\n    trained: store.faces.trained,\n    fetchingLabeledFacesList: store.faces.fetchingLabeledFacesList,\n    fetchedLabeledFacesList: store.faces.fetchedLabeledFacesList,\n    fetchingInferredFacesList: store.faces.fetchingInferredFacesList,\n    fetchedInferredFacesList: store.faces.fetchedInferredFacesList,\n  };\n})(FaceDashboard);\n\nModalPersonEdit = connect((store) => {\n  return {\n    people: store.people.people,\n    fetchingPeople: store.people.fetchingPeople,\n    fetchedPeople: store.people.fetchedPeople,\n\n    inferredFacesList: store.faces.inferredFacesList,\n    labeledFacesList: store.faces.labeledFacesList,\n\n    fetchingLabeledFacesList: store.faces.fetchingLabeledFacesList,\n    fetchedLabeledFacesList: store.faces.fetchedLabeledFacesList,\n    fetchingInferredFacesList: store.faces.fetchingInferredFacesList,\n    fetchedInferredFacesList: store.faces.fetchedInferredFacesList,\n  };\n})(ModalPersonEdit);\n"
  },
  {
    "path": "src/layouts/FavoritePhotos.js",
    "content": "\nimport React, {Component} from 'react';\nimport { connect } from \"react-redux\";\nimport {fetchPeopleAlbums, fetchAutoAlbums, generateAutoAlbums} from '../actions/albumsActions'\nimport {Container, Icon, Divider, Header, Image, Button, Card, Loader} from 'semantic-ui-react'\nimport { fetchPeople, fetchEgoGraph } from '../actions/peopleActions';\nimport { fetchFavoritePhotos, fetchPhotoDetail, fetchNoTimestampPhotoList} from '../actions/photosActions';\n\nimport {Server, serverAddress} from '../api_client/apiClient'\nimport { Grid, List, WindowScroller,AutoSizer } from 'react-virtualized';\nimport {EgoGraph} from '../components/egoGraph'\nimport { push } from 'react-router-redux'\nimport {LightBox} from '../components/lightBox'\nimport moment from 'moment'\nimport _ from 'lodash'\nimport debounce from 'lodash/debounce'\n\n\nimport {calculateGridCells, calculateGridCellSize} from '../util/gridUtils'\nimport {ScrollSpeed, SPEED_THRESHOLD, SCROLL_DEBOUNCE_DURATION} from '../util/scrollUtils'\n\nimport {PhotoListView} from './ReusablePhotoListView'\n\n\nvar topMenuHeight = 55 // don't change this\nvar ESCAPE_KEY = 27;\nvar ENTER_KEY = 13;\nvar RIGHT_ARROW_KEY = 39;\nvar UP_ARROW_KEY = 38;\nvar LEFT_ARROW_KEY = 37;\nvar DOWN_ARROW_KEY = 40;\nvar DAY_HEADER_HEIGHT = 70\nvar leftMenuWidth = 85 // don't change this\n\nvar SIDEBAR_WIDTH = 85;\n\nexport class FavoritePhotos extends Component {\n  state = {\n    photosGroupedByDate: [],\n    idx2hash: [],\n  }\n\n  componentDidMount() {\n    this.props.dispatch(fetchFavoritePhotos())\n  }\n\n\n\n  static getDerivedStateFromProps(nextProps,prevState){\n      const photos = nextProps.favoritePhotos\n      if (prevState.idx2hash.length !== photos.length) {\n\n          var t0 = performance.now();\n          var groupedByDate = _.groupBy(photos,(el)=>{\n              if (el.exif_timestamp) {\n                  return moment(el.exif_timestamp).format('YYYY-MM-DD')\n              } else {\n                  return \"No Timestamp\"\n              }\n          })\n          var groupedByDateList = _.reverse(_.sortBy(_.toPairsIn(groupedByDate).map((el)=>{\n              return {date:el[0],photos:el[1]}\n          }),(el)=>el.date))\n\n          var idx2hash = []\n          groupedByDateList.forEach((g)=>{\n              g.photos.forEach((p)=>{\n                  idx2hash.push(p.image_hash)\n              })\n          })\n\n          \n          var t1 = performance.now();\n          return {\n              ...prevState, \n              photosGroupedByDate: groupedByDateList,\n              idx2hash:idx2hash,\n          }\n      } else {\n        return null\n      }\n  }\n\n\n\n  render() {\n    const {favoritePhotos,fetchingFavoritePhotos,fetchedFavoritePhotos} = this.props\n    return (\n      <PhotoListView \n        showHidden={false}\n        title={\"Favorite Photos\"}\n        loading={fetchingFavoritePhotos}\n        titleIconName={'star'}\n        photosGroupedByDate={this.state.photosGroupedByDate}\n        idx2hash={this.state.idx2hash}\n      />\n    )  \n  }\n}\n\n/*\nexport class AlbumPersonGallery extends Component {\n\n  constructor() {\n    super();\n    this.listRef = React.createRef()\n    this.handleResize = this.handleResize.bind(this)\n    this.cellRenderer = this.cellRenderer.bind(this)\n    this.onPhotoClick = this.onPhotoClick.bind(this)\n    this.state = {\n        photosGroupedByDate: [],\n        cellContents: [[]],\n        hash2row: {},\n        idx2hash: [],\n        lightboxImageIndex: 1,\n        lightboxShow:false,\n        lightboxSidebarShow:false,\n        scrollToIndex: undefined,\n        width:  window.innerWidth,\n        height: window.innerHeight,\n        entrySquareSize:200,\n        numEntrySquaresPerRow:3,\n        currTopRenderedRowIdx:0,\n        scrollTop:0,\n        gridHeight: window.innerHeight- topMenuHeight - 60,\n        showGraph:false,\n    }\n  }\n\n\n  scrollSpeedHandler = new ScrollSpeed()\n\n  handleScroll = ({scrollTop}) => {\n      // scrollSpeed represents the number of pixels scrolled since the last scroll event was fired\n      const scrollSpeed = Math.abs(this.scrollSpeedHandler.getScrollSpeed(scrollTop));\n\n      if (scrollSpeed >= SPEED_THRESHOLD) {\n        this.setState({\n          isScrollingFast: true,\n          scrollTop:scrollTop\n        });\n      }\n\n      // Since this method is debounced, it will only fire once scrolling has stopped for the duration of SCROLL_DEBOUNCE_DURATION\n      this.handleScrollEnd();\n  }\n\n  handleScrollEnd = debounce(() => {\n  const {isScrollingFast} = this.state;\n\n  if (isScrollingFast) {\n    this.setState({\n      isScrollingFast: false,\n    });\n  }\n  }, SCROLL_DEBOUNCE_DURATION);\n\n\n\n\n  componentDidMount() {\n    this.handleResize();\n    window.addEventListener(\"resize\", this.handleResize.bind(this));\n    if (this.props.people.length == 0){\n      this.props.dispatch(fetchPeopleAlbums(this.props.match.params.albumID))\n    }\n    this.props.dispatch(fetchEgoGraph(this.props.match.params.albumID))\n  }\n\n  componentWillUnmount() {\n    window.removeEventListener(\"resize\", this.handleResize.bind(this))\n  }\n\n\n  handleResize() {\n    var columnWidth = window.innerWidth - SIDEBAR_WIDTH - 5 - 5 - 10\n    const {entrySquareSize,numEntrySquaresPerRow} = calculateGridCellSize(columnWidth)\n    var {cellContents,hash2row} = calculateGridCells(this.state.photosGroupedByDate,numEntrySquaresPerRow)\n\n    this.setState({\n      width:  window.innerWidth,\n      height: window.innerHeight,\n      entrySquareSize:entrySquareSize,\n      numEntrySquaresPerRow:numEntrySquaresPerRow,\n      cellContents: cellContents,\n      hash2row: hash2row\n    })\n    if (this.listRef.current) {\n        this.listRef.current.recomputeGridSize()\n    }\n  }\n\n    onPhotoClick(hash) {\n        this.setState({lightboxImageIndex:this.state.idx2hash.indexOf(hash),lightboxShow:true})\n    }\n\n \n\n\n\n    static getDerivedStateFromProps(nextProps,prevState){\n      if (nextProps.albumsPeople.hasOwnProperty(nextProps.match.params.albumID)){\n        const photos = nextProps.albumsPeople[nextProps.match.params.albumID].photos\n        if (prevState.idx2hash.length != photos.length) {\n\n            var t0 = performance.now();\n            var groupedByDate = _.groupBy(photos,(el)=>{\n                if (el.exif_timestamp) {\n                    return moment(el.exif_timestamp).format('YYYY-MM-DD')\n                } else {\n                    return \"No Timestamp\"\n                }\n            })\n            var groupedByDateList = _.reverse(_.sortBy(_.toPairsIn(groupedByDate).map((el)=>{\n                return {date:el[0],photos:el[1]}\n            }),(el)=>el.date))\n\n            var idx2hash = []\n            groupedByDateList.forEach((g)=>{\n                g.photos.forEach((p)=>{\n                    idx2hash.push(p.image_hash)\n                })\n            })\n\n            \n            var {cellContents,hash2row} = calculateGridCells(groupedByDateList,prevState.numEntrySquaresPerRow)\n            console.log(cellContents)\n            var t1 = performance.now();\n            console.log(t1-t0)\n            return {\n                ...prevState, \n                photosGroupedByDate: groupedByDateList,\n                idx2hash:idx2hash,\n                cellContents: cellContents,\n                hash2row:hash2row\n            }\n        } else {\n          return null\n        }\n      } else {\n        return null\n      }\n    }\n\n\n\n    cellRenderer = ({ columnIndex, key, rowIndex, style }) => {\n        if (this.state.cellContents[rowIndex][columnIndex]) { // non-empty cell\n            const cell = this.state.cellContents[rowIndex][columnIndex]\n            if (cell.date) { // header cell has 'date' attribute\n                return ( \n                    <div key={key} style={{...style,width:this.state.width,height:DAY_HEADER_HEIGHT,paddingTop:20}}>\n                        <div style={{backgroundColor:'white'}}>\n                            <Header as='h3'>\n                                <Icon name='calendar outline'/>\n                                <Header.Content>\n                                    { cell.date=='No Timestamp' ? \"No Timestamp\" : moment(cell.date).format(\"MMM Do YYYY, dddd\")}\n                                    <Header.Subheader>\n                                        <Icon name='photo'/>{cell.photos.length} Photos\n                                    </Header.Subheader>\n                                </Header.Content>\n                            </Header>\n                        </div>\n                    </div>                \n                )   \n                \n                // if (!this.state.isScrollingFast){\n                // } else {\n                //     return (\n                //         <div key={key} style={{\n                //             ...style,\n                //             backgroundColor:'#dddddd',\n                //             width:250,\n                //             marginTop:2,\n                //             height:DAY_HEADER_HEIGHT-4,\n                //             paddingTop:10}}>\n                //         </div>                \n                //     )        \n                // } \n                \n            } else { // photo cell doesn't have 'date' attribute\n                if (!this.state.isScrollingFast) {\n                    return (\n                        <div key={key} style={style}>\n                            <Image key={'daygroup_image_'+cell.image_hash} style={{display:'inline-block',padding:1,margin:0}}\n                                onClick={()=>{\n                                    this.onPhotoClick(cell.image_hash)\n                                }}\n                                height={this.state.entrySquareSize} \n                                width={this.state.entrySquareSize} \n                                src={serverAddress+'/media/square_thumbnails/'+cell.image_hash+'.jpg'}/>\n                        </div>                                \n                    )\n                } else {\n                    return (\n                        <div key={key} style={{...style,\n                            width:this.state.entrySquareSize-2,\n                            height:this.state.entrySquareSize-2,\n                            backgroundColor:'#eeeeee'}}>\n                        </div>                                \n                    )\n                }\n\n            }\n\n        } else { // empty cell\n            return (\n                <div key={key} style={style}>\n                </div>\n            )\n        }\n    }\n\n\n  \n  getPhotoDetails(image_hash) {\n      if (!this.props.photoDetails.hasOwnProperty(image_hash)) {\n          this.props.dispatch(fetchPhotoDetail(image_hash))\n      }\n  }\n\n  render() {\n    if (this.props.albumsPeople.hasOwnProperty(this.props.match.params.albumID)) {\n        var totalListHeight = this.state.cellContents.map((row,index)=>{\n            if (row[0].date) { //header row\n                return DAY_HEADER_HEIGHT\n            } else { //photo row\n                return this.state.entrySquareSize\n            }\n        }).reduce((a,b)=>(a+b),0)\n\t    return (\n\t      <div>\n\n          <div style={{position:'fixed',top:topMenuHeight+22,right:5,float:'right'}}>\n\n          </div>\n\n\n\n\t      \t<div style={{height:this.state.headerHeight,paddingTop:10,paddingRight:5}}>\n\n\n            <Header as='h2'>\n              <Icon name='user circle' />\n              <Header.Content>\n                  {this.props.albumsPeople[this.props.match.params.albumID].name + \" \"}\n                  <Button \n                    size='tiny'\n                    compact\n                    icon='share alternate'\n                    active={this.state.showGraph}\n                    circular\n                    onClick={()=>{\n                        this.setState({\n                        showGraph: !this.state.showGraph,\n                        gridHeight: !this.state.showGraph ? this.state.height - topMenuHeight - 260 : this.state.height - topMenuHeight - 60,\n                        headerHeight: !this.state.showGraph ? 260 : 60\n                        })}\n                    }/>\n                <Header.Subheader>\n          \t      {this.props.albumsPeople[this.props.match.params.albumID].photos.length} Photos\n                </Header.Subheader>\n              </Header.Content>\n            </Header>\n\n\n            {this.state.showGraph && <EgoGraph height={200-20} width={this.state.width-SIDEBAR_WIDTH-12 } person_id={this.props.match.params.albumID}/>}\n\n\n\t      \t</div>\n\n\n                <AutoSizer disableHeight style={{outline:'none',padding:0,margin:0}}>\n                  {({width}) => (\n                    <Grid\n                      ref={this.listRef}\n                      onSectionRendered={({rowStartIndex})=>{\n                        var date = this.state.cellContents[rowStartIndex][0].date\n                        if (date) {\n                            if (date=='No Timestamp') {\n                                this.setState({\n                                    currTopRenderedRowIdx:rowStartIndex,\n                                    date:date,\n                                    fromNow:date\n                                })\n                            } else {\n                                this.setState({\n                                    currTopRenderedRowIdx:rowStartIndex,\n                                    date:moment(date).format(\"MMMM Do YYYY\"),\n                                    fromNow:moment(date).fromNow()\n                                })\n                            }\n                        }\n                      }}\n                      overscanRowCount={5}\n                      style={{outline:'none'}}\n                      cellRenderer={this.cellRenderer}\n                      onScroll={this.handleScroll}\n                      columnWidth={this.state.entrySquareSize}\n                      columnCount={this.state.numEntrySquaresPerRow}\n                      height={this.state.height- topMenuHeight - 60}\n                      estimatedRowSize={totalListHeight/this.state.cellContents.length.toFixed(1)}\n                      rowHeight={({index})=> {\n                        if (this.state.cellContents[index][0].date) { //header row\n                            return DAY_HEADER_HEIGHT\n                        } else { //photo row\n                            return this.state.entrySquareSize\n                        }\n                      }}\n                      rowCount={this.state.cellContents.length}\n                      width={width}\n                    />\n                  )}\n                </AutoSizer>\n\n            { this.state.cellContents[this.state.currTopRenderedRowIdx][0] && (\n                <div style={{\n                    right:0,\n                    top:topMenuHeight + 10+ (0 / totalListHeight) * (this.state.height - topMenuHeight - 50 - 20),\n                    position:'fixed',\n                    float:'left',\n                    width:180,\n                    padding:0,\n                    height:50,\n                    zIndex:100,\n                }}>\n                    <div style={{textAlign:'right',paddingRight:30}} className='handle'>\n                        <b>{this.state.date}</b> <br/>\n                    </div>\n                    <div style={{textAlign:'right',paddingRight:30}}>\n                        {this.state.fromNow}\n                    </div>\n                </div>\n            )}\n\n\n          { this.state.lightboxShow &&\n              <LightBox\n                  idx2hash={this.state.idx2hash}\n                  lightboxImageIndex={this.state.lightboxImageIndex}\n\n                  onCloseRequest={() => this.setState({ lightboxShow: false })}\n                  onImageLoad={()=>{\n                      this.getPhotoDetails(this.state.idx2hash[this.state.lightboxImageIndex])\n                  }}\n                  onMovePrevRequest={() => {\n                      var nextIndex = (this.state.lightboxImageIndex + this.state.idx2hash.length - 1) % this.state.idx2hash.length\n                      this.setState({\n                          lightboxImageIndex:nextIndex\n                      })\n                      var rowIdx = this.state.hash2row[this.state.idx2hash[nextIndex]]\n                      this.listRef.current.scrollToCell({columnIndex:0,rowIndex:rowIdx})\n                      this.getPhotoDetails(this.state.idx2hash[nextIndex])\n                  }}\n                  onMoveNextRequest={() => {\n                      var nextIndex = (this.state.lightboxImageIndex + this.state.idx2hash.length + 1) % this.state.idx2hash.length\n                      this.setState({\n                          lightboxImageIndex:nextIndex\n                      })\n                      var rowIdx = this.state.hash2row[this.state.idx2hash[nextIndex]]\n                      this.listRef.current.scrollToCell({columnIndex:0,rowIndex:rowIdx})\n                      this.getPhotoDetails(this.state.idx2hash[nextIndex])\n                  }}/>\n          }\n\n\t\t\t\t</div>\n\t    )\n    }\n    else {\n    \treturn (\n    \t\t<div><Loader active/></div>\n    \t)\n    }\n  }\n}\n*/\n\nFavoritePhotos = connect((store)=>{\n  return {\n    favoritePhotos: store.photos.favoritePhotos,\n    fetchingFavoritePhotos: store.photos.fetchingFavoritePhotos,\n    fetchedFavoritePhotos: store.photos.fetchedFavoritePhotos,\n\n    albumsPeople: store.albums.albumsPeople,\n    fetchingAlbumsPeople: store.albums.fetchingAlbumsPeople,\n    fetchedAlbumsPeople: store.albums.fetchedAlbumsPeople,\n    people: store.people.people,\n    fetchedPeople: store.people.fetched,\n    fetchingPeople: store.people.fetching,\n    photoDetails: store.photos.photoDetails,\n    fetchingPhotoDetail: store.photos.fetchingPhotoDetail,\n    fetchedPhotoDetail: store.photos.fetchedPhotoDetail,\n  }\n})(FavoritePhotos)\n"
  },
  {
    "path": "src/layouts/HiddenPhotos.js",
    "content": "import React, {Component} from 'react';\nimport { connect } from \"react-redux\";\nimport {fetchPeopleAlbums, fetchAutoAlbums, generateAutoAlbums} from '../actions/albumsActions'\nimport {Container, Icon, Divider, Header, Image, Button, Card, Loader} from 'semantic-ui-react'\nimport { fetchPeople, fetchEgoGraph } from '../actions/peopleActions';\nimport { fetchHiddenPhotos, fetchFavoritePhotos, fetchPhotoDetail, fetchNoTimestampPhotoList} from '../actions/photosActions';\n\nimport {Server, serverAddress} from '../api_client/apiClient'\nimport { Grid, List, WindowScroller,AutoSizer } from 'react-virtualized';\nimport {EgoGraph} from '../components/egoGraph'\nimport { push } from 'react-router-redux'\nimport {LightBox} from '../components/lightBox'\nimport moment from 'moment'\nimport _ from 'lodash'\nimport debounce from 'lodash/debounce'\n\n\nimport {calculateGridCells, calculateGridCellSize} from '../util/gridUtils'\nimport {ScrollSpeed, SPEED_THRESHOLD, SCROLL_DEBOUNCE_DURATION} from '../util/scrollUtils'\n\nimport {PhotoListView} from './ReusablePhotoListView'\n\n\nvar topMenuHeight = 55 // don't change this\nvar ESCAPE_KEY = 27;\nvar ENTER_KEY = 13;\nvar RIGHT_ARROW_KEY = 39;\nvar UP_ARROW_KEY = 38;\nvar LEFT_ARROW_KEY = 37;\nvar DOWN_ARROW_KEY = 40;\nvar DAY_HEADER_HEIGHT = 70\nvar leftMenuWidth = 85 // don't change this\n\nvar SIDEBAR_WIDTH = 85;\n\nexport class HiddenPhotos extends Component {\n  state = {\n    photosGroupedByDate: [],\n    idx2hash: [],\n  }\n\n  componentDidMount() {\n    this.props.dispatch(fetchHiddenPhotos())\n  }\n\n\n\n  static getDerivedStateFromProps(nextProps,prevState){\n      const photos = nextProps.hiddenPhotos\n      if (prevState.idx2hash.length !== photos.length) {\n\n          var t0 = performance.now();\n          var groupedByDate = _.groupBy(photos,(el)=>{\n              if (el.exif_timestamp) {\n                  return moment(el.exif_timestamp).format('YYYY-MM-DD')\n              } else {\n                  return \"No Timestamp\"\n              }\n          })\n          var groupedByDateList = _.reverse(_.sortBy(_.toPairsIn(groupedByDate).map((el)=>{\n              return {date:el[0],photos:el[1]}\n          }),(el)=>el.date))\n\n          var idx2hash = []\n          groupedByDateList.forEach((g)=>{\n              g.photos.forEach((p)=>{\n                  idx2hash.push(p.image_hash)\n              })\n          })\n\n          \n          var t1 = performance.now();\n          return {\n              ...prevState, \n              photosGroupedByDate: groupedByDateList,\n              idx2hash:idx2hash,\n          }\n      } else {\n        return null\n      }\n  }\n\n\n\n  render() {\n    const {hiddenPhotos,fetchingHiddenPhotos,fetchedHiddenPhotos} = this.props\n    return (\n      <PhotoListView \n        showHidden={true}\n        title={\"Hidden Photos\"}\n        loading={fetchingHiddenPhotos}\n        titleIconName={'hide'}\n        photosGroupedByDate={this.state.photosGroupedByDate}\n        idx2hash={this.state.idx2hash}\n      />\n    )  \n  }\n}\n\n/*\nexport class AlbumPersonGallery extends Component {\n\n  constructor() {\n    super();\n    this.listRef = React.createRef()\n    this.handleResize = this.handleResize.bind(this)\n    this.cellRenderer = this.cellRenderer.bind(this)\n    this.onPhotoClick = this.onPhotoClick.bind(this)\n    this.state = {\n        photosGroupedByDate: [],\n        cellContents: [[]],\n        hash2row: {},\n        idx2hash: [],\n        lightboxImageIndex: 1,\n        lightboxShow:false,\n        lightboxSidebarShow:false,\n        scrollToIndex: undefined,\n        width:  window.innerWidth,\n        height: window.innerHeight,\n        entrySquareSize:200,\n        numEntrySquaresPerRow:3,\n        currTopRenderedRowIdx:0,\n        scrollTop:0,\n        gridHeight: window.innerHeight- topMenuHeight - 60,\n        showGraph:false,\n    }\n  }\n\n\n  scrollSpeedHandler = new ScrollSpeed()\n\n  handleScroll = ({scrollTop}) => {\n      // scrollSpeed represents the number of pixels scrolled since the last scroll event was fired\n      const scrollSpeed = Math.abs(this.scrollSpeedHandler.getScrollSpeed(scrollTop));\n\n      if (scrollSpeed >= SPEED_THRESHOLD) {\n        this.setState({\n          isScrollingFast: true,\n          scrollTop:scrollTop\n        });\n      }\n\n      // Since this method is debounced, it will only fire once scrolling has stopped for the duration of SCROLL_DEBOUNCE_DURATION\n      this.handleScrollEnd();\n  }\n\n  handleScrollEnd = debounce(() => {\n  const {isScrollingFast} = this.state;\n\n  if (isScrollingFast) {\n    this.setState({\n      isScrollingFast: false,\n    });\n  }\n  }, SCROLL_DEBOUNCE_DURATION);\n\n\n\n\n  componentDidMount() {\n    this.handleResize();\n    window.addEventListener(\"resize\", this.handleResize.bind(this));\n    if (this.props.people.length == 0){\n      this.props.dispatch(fetchPeopleAlbums(this.props.match.params.albumID))\n    }\n    this.props.dispatch(fetchEgoGraph(this.props.match.params.albumID))\n  }\n\n  componentWillUnmount() {\n    window.removeEventListener(\"resize\", this.handleResize.bind(this))\n  }\n\n\n  handleResize() {\n    var columnWidth = window.innerWidth - SIDEBAR_WIDTH - 5 - 5 - 10\n    const {entrySquareSize,numEntrySquaresPerRow} = calculateGridCellSize(columnWidth)\n    var {cellContents,hash2row} = calculateGridCells(this.state.photosGroupedByDate,numEntrySquaresPerRow)\n\n    this.setState({\n      width:  window.innerWidth,\n      height: window.innerHeight,\n      entrySquareSize:entrySquareSize,\n      numEntrySquaresPerRow:numEntrySquaresPerRow,\n      cellContents: cellContents,\n      hash2row: hash2row\n    })\n    if (this.listRef.current) {\n        this.listRef.current.recomputeGridSize()\n    }\n  }\n\n    onPhotoClick(hash) {\n        this.setState({lightboxImageIndex:this.state.idx2hash.indexOf(hash),lightboxShow:true})\n    }\n\n \n\n\n\n    static getDerivedStateFromProps(nextProps,prevState){\n      if (nextProps.albumsPeople.hasOwnProperty(nextProps.match.params.albumID)){\n        const photos = nextProps.albumsPeople[nextProps.match.params.albumID].photos\n        if (prevState.idx2hash.length != photos.length) {\n\n            var t0 = performance.now();\n            var groupedByDate = _.groupBy(photos,(el)=>{\n                if (el.exif_timestamp) {\n                    return moment(el.exif_timestamp).format('YYYY-MM-DD')\n                } else {\n                    return \"No Timestamp\"\n                }\n            })\n            var groupedByDateList = _.reverse(_.sortBy(_.toPairsIn(groupedByDate).map((el)=>{\n                return {date:el[0],photos:el[1]}\n            }),(el)=>el.date))\n\n            var idx2hash = []\n            groupedByDateList.forEach((g)=>{\n                g.photos.forEach((p)=>{\n                    idx2hash.push(p.image_hash)\n                })\n            })\n\n            \n            var {cellContents,hash2row} = calculateGridCells(groupedByDateList,prevState.numEntrySquaresPerRow)\n            console.log(cellContents)\n            var t1 = performance.now();\n            console.log(t1-t0)\n            return {\n                ...prevState, \n                photosGroupedByDate: groupedByDateList,\n                idx2hash:idx2hash,\n                cellContents: cellContents,\n                hash2row:hash2row\n            }\n        } else {\n          return null\n        }\n      } else {\n        return null\n      }\n    }\n\n\n\n    cellRenderer = ({ columnIndex, key, rowIndex, style }) => {\n        if (this.state.cellContents[rowIndex][columnIndex]) { // non-empty cell\n            const cell = this.state.cellContents[rowIndex][columnIndex]\n            if (cell.date) { // header cell has 'date' attribute\n                return ( \n                    <div key={key} style={{...style,width:this.state.width,height:DAY_HEADER_HEIGHT,paddingTop:20}}>\n                        <div style={{backgroundColor:'white'}}>\n                            <Header as='h3'>\n                                <Icon name='calendar outline'/>\n                                <Header.Content>\n                                    { cell.date=='No Timestamp' ? \"No Timestamp\" : moment(cell.date).format(\"MMM Do YYYY, dddd\")}\n                                    <Header.Subheader>\n                                        <Icon name='photo'/>{cell.photos.length} Photos\n                                    </Header.Subheader>\n                                </Header.Content>\n                            </Header>\n                        </div>\n                    </div>                \n                )   \n                \n                // if (!this.state.isScrollingFast){\n                // } else {\n                //     return (\n                //         <div key={key} style={{\n                //             ...style,\n                //             backgroundColor:'#dddddd',\n                //             width:250,\n                //             marginTop:2,\n                //             height:DAY_HEADER_HEIGHT-4,\n                //             paddingTop:10}}>\n                //         </div>                \n                //     )        \n                // } \n                \n            } else { // photo cell doesn't have 'date' attribute\n                if (!this.state.isScrollingFast) {\n                    return (\n                        <div key={key} style={style}>\n                            <Image key={'daygroup_image_'+cell.image_hash} style={{display:'inline-block',padding:1,margin:0}}\n                                onClick={()=>{\n                                    this.onPhotoClick(cell.image_hash)\n                                }}\n                                height={this.state.entrySquareSize} \n                                width={this.state.entrySquareSize} \n                                src={serverAddress+'/media/square_thumbnails/'+cell.image_hash+'.jpg'}/>\n                        </div>                                \n                    )\n                } else {\n                    return (\n                        <div key={key} style={{...style,\n                            width:this.state.entrySquareSize-2,\n                            height:this.state.entrySquareSize-2,\n                            backgroundColor:'#eeeeee'}}>\n                        </div>                                \n                    )\n                }\n\n            }\n\n        } else { // empty cell\n            return (\n                <div key={key} style={style}>\n                </div>\n            )\n        }\n    }\n\n\n  \n  getPhotoDetails(image_hash) {\n      if (!this.props.photoDetails.hasOwnProperty(image_hash)) {\n          this.props.dispatch(fetchPhotoDetail(image_hash))\n      }\n  }\n\n  render() {\n    if (this.props.albumsPeople.hasOwnProperty(this.props.match.params.albumID)) {\n        var totalListHeight = this.state.cellContents.map((row,index)=>{\n            if (row[0].date) { //header row\n                return DAY_HEADER_HEIGHT\n            } else { //photo row\n                return this.state.entrySquareSize\n            }\n        }).reduce((a,b)=>(a+b),0)\n\t    return (\n\t      <div>\n\n          <div style={{position:'fixed',top:topMenuHeight+22,right:5,float:'right'}}>\n\n          </div>\n\n\n\n\t      \t<div style={{height:this.state.headerHeight,paddingTop:10,paddingRight:5}}>\n\n\n            <Header as='h2'>\n              <Icon name='user circle' />\n              <Header.Content>\n                  {this.props.albumsPeople[this.props.match.params.albumID].name + \" \"}\n                  <Button \n                    size='tiny'\n                    compact\n                    icon='share alternate'\n                    active={this.state.showGraph}\n                    circular\n                    onClick={()=>{\n                        this.setState({\n                        showGraph: !this.state.showGraph,\n                        gridHeight: !this.state.showGraph ? this.state.height - topMenuHeight - 260 : this.state.height - topMenuHeight - 60,\n                        headerHeight: !this.state.showGraph ? 260 : 60\n                        })}\n                    }/>\n                <Header.Subheader>\n          \t      {this.props.albumsPeople[this.props.match.params.albumID].photos.length} Photos\n                </Header.Subheader>\n              </Header.Content>\n            </Header>\n\n\n            {this.state.showGraph && <EgoGraph height={200-20} width={this.state.width-SIDEBAR_WIDTH-12 } person_id={this.props.match.params.albumID}/>}\n\n\n\t      \t</div>\n\n\n                <AutoSizer disableHeight style={{outline:'none',padding:0,margin:0}}>\n                  {({width}) => (\n                    <Grid\n                      ref={this.listRef}\n                      onSectionRendered={({rowStartIndex})=>{\n                        var date = this.state.cellContents[rowStartIndex][0].date\n                        if (date) {\n                            if (date=='No Timestamp') {\n                                this.setState({\n                                    currTopRenderedRowIdx:rowStartIndex,\n                                    date:date,\n                                    fromNow:date\n                                })\n                            } else {\n                                this.setState({\n                                    currTopRenderedRowIdx:rowStartIndex,\n                                    date:moment(date).format(\"MMMM Do YYYY\"),\n                                    fromNow:moment(date).fromNow()\n                                })\n                            }\n                        }\n                      }}\n                      overscanRowCount={5}\n                      style={{outline:'none'}}\n                      cellRenderer={this.cellRenderer}\n                      onScroll={this.handleScroll}\n                      columnWidth={this.state.entrySquareSize}\n                      columnCount={this.state.numEntrySquaresPerRow}\n                      height={this.state.height- topMenuHeight - 60}\n                      estimatedRowSize={totalListHeight/this.state.cellContents.length.toFixed(1)}\n                      rowHeight={({index})=> {\n                        if (this.state.cellContents[index][0].date) { //header row\n                            return DAY_HEADER_HEIGHT\n                        } else { //photo row\n                            return this.state.entrySquareSize\n                        }\n                      }}\n                      rowCount={this.state.cellContents.length}\n                      width={width}\n                    />\n                  )}\n                </AutoSizer>\n\n            { this.state.cellContents[this.state.currTopRenderedRowIdx][0] && (\n                <div style={{\n                    right:0,\n                    top:topMenuHeight + 10+ (0 / totalListHeight) * (this.state.height - topMenuHeight - 50 - 20),\n                    position:'fixed',\n                    float:'left',\n                    width:180,\n                    padding:0,\n                    height:50,\n                    zIndex:100,\n                }}>\n                    <div style={{textAlign:'right',paddingRight:30}} className='handle'>\n                        <b>{this.state.date}</b> <br/>\n                    </div>\n                    <div style={{textAlign:'right',paddingRight:30}}>\n                        {this.state.fromNow}\n                    </div>\n                </div>\n            )}\n\n\n          { this.state.lightboxShow &&\n              <LightBox\n                  idx2hash={this.state.idx2hash}\n                  lightboxImageIndex={this.state.lightboxImageIndex}\n\n                  onCloseRequest={() => this.setState({ lightboxShow: false })}\n                  onImageLoad={()=>{\n                      this.getPhotoDetails(this.state.idx2hash[this.state.lightboxImageIndex])\n                  }}\n                  onMovePrevRequest={() => {\n                      var nextIndex = (this.state.lightboxImageIndex + this.state.idx2hash.length - 1) % this.state.idx2hash.length\n                      this.setState({\n                          lightboxImageIndex:nextIndex\n                      })\n                      var rowIdx = this.state.hash2row[this.state.idx2hash[nextIndex]]\n                      this.listRef.current.scrollToCell({columnIndex:0,rowIndex:rowIdx})\n                      this.getPhotoDetails(this.state.idx2hash[nextIndex])\n                  }}\n                  onMoveNextRequest={() => {\n                      var nextIndex = (this.state.lightboxImageIndex + this.state.idx2hash.length + 1) % this.state.idx2hash.length\n                      this.setState({\n                          lightboxImageIndex:nextIndex\n                      })\n                      var rowIdx = this.state.hash2row[this.state.idx2hash[nextIndex]]\n                      this.listRef.current.scrollToCell({columnIndex:0,rowIndex:rowIdx})\n                      this.getPhotoDetails(this.state.idx2hash[nextIndex])\n                  }}/>\n          }\n\n\t\t\t\t</div>\n\t    )\n    }\n    else {\n    \treturn (\n    \t\t<div><Loader active/></div>\n    \t)\n    }\n  }\n}\n*/\n\nHiddenPhotos = connect((store)=>{\n  return {\n    favoritePhotos: store.photos.favoritePhotos,\n    fetchingFavoritePhotos: store.photos.fetchingFavoritePhotos,\n    fetchedFavoritePhotos: store.photos.fetchedFavoritePhotos,\n\n    hiddenPhotos: store.photos.hiddenPhotos,\n    fetchingHiddenPhotos: store.photos.fetchingHiddenPhotos,\n    fetchedHiddenPhotos: store.photos.fetchedHiddenPhotos,\n\n    albumsPeople: store.albums.albumsPeople,\n    fetchingAlbumsPeople: store.albums.fetchingAlbumsPeople,\n    fetchedAlbumsPeople: store.albums.fetchedAlbumsPeople,\n    people: store.people.people,\n    fetchedPeople: store.people.fetched,\n    fetchingPeople: store.people.fetching,\n    photoDetails: store.photos.photoDetails,\n    fetchingPhotoDetail: store.photos.fetchingPhotoDetail,\n    fetchedPhotoDetail: store.photos.fetchedPhotoDetail,\n  }\n})(HiddenPhotos)\n"
  },
  {
    "path": "src/layouts/PublicUserList.js",
    "content": "import React, { Component } from \"react\";\nimport { Header, Image, Item, Icon, Grid, Divider } from \"semantic-ui-react\";\nimport {\n  fetchUserPublicPhotos,\n  fetchPublicUserList\n} from \"../actions/publicActions\";\nimport { connect } from \"react-redux\";\nimport { PhotoListView } from \"./ReusablePhotoListView\";\nimport _ from \"lodash\";\nimport moment from \"moment\";\nimport {\n  TopMenu,\n  SideMenuNarrow,\n  TopMenuPublic,\n  SideMenuNarrowPublic\n} from \"./menubars\";\nimport { Link } from \"react-router-dom\";\nimport { serverAddress } from \"../api_client/apiClient\";\n\nvar TOP_MENU_HEIGHT = 45; // don't change this\nvar LEFT_MENU_WIDTH = 85; // don't change this\n\nexport class PublicUserList extends Component {\n  componentDidMount() {\n    this.props.dispatch(fetchPublicUserList());\n  }\n  render() {\n    if (this.props.auth.access) {\n      var menu = (\n        <div>\n          {this.props.ui.showSidebar && <SideMenuNarrow />}\n          <TopMenu />\n        </div>\n      );\n    } else {\n      var menu = (\n        <div>\n          {this.props.ui.showSidebar && <SideMenuNarrowPublic />}\n          <TopMenuPublic />\n        </div>\n      );\n    }\n    return (\n      <div>\n        {menu}\n        <div\n          style={{\n            paddingTop: TOP_MENU_HEIGHT,\n            paddingLeft: this.props.ui.showSidebar ? LEFT_MENU_WIDTH + 5 : 5\n          }}\n        >\n          <div style={{ height: 60, paddingTop: 10 }}>\n            <Header as=\"h2\">\n              <Icon name=\"users circle\" />\n              <Header.Content>\n                Users{\" \"}\n                <Header.Subheader>\n                  Showing {this.props.pub.publicUserList.length} users\n                </Header.Subheader>\n              </Header.Content>\n            </Header>\n          </div>\n          <div style={{ padding: 10 }}>\n            {this.props.pub.publicUserList.map((el, idx) => {\n              if (el.first_name.length > 0 && el.last_name.length > 0) {\n                var displayName = el.first_name + \" \" + el.last_name;\n              } else {\n                var displayName = el.username;\n              }\n\n              return (\n                <div style={{padding:10}}>\n                  <Header as={Link} to={`/user/${el.username}/`}>\n                    <Image circular src=\"/unknown_user.jpg\" />\n                    <Header.Content>\n                      {displayName}\n                      <Header.Subheader>\n                        {el.public_photo_count} public photos\n                      </Header.Subheader>\n                    </Header.Content>\n                  </Header>\n                  {false && (\n                    <Grid doubling stackable>\n                      <Divider />\n                      <Grid.Row\n                        columns={this.props.ui.gridType === \"dense\" ? 5 : 3}\n                      >\n                        {el.public_photo_samples\n                          .slice(0, this.props.ui.gridType === \"dense\" ? 10 : 6)\n                          .map(photo => (\n                            <Grid.Column>\n                              <Image\n                                src={\n                                  serverAddress +\n                                  \"/media/square_thumbnails/\" +\n                                  photo.image_hash +\n                                  \".jpg\"\n                                }\n                              />\n                              <Divider hidden />\n                            </Grid.Column>\n                          ))}\n                      </Grid.Row>\n                    </Grid>\n                  )}\n                </div>\n              );\n            })}\n          </div>\n        </div>\n      </div>\n    );\n  }\n}\n\nPublicUserList = connect(store => {\n  return {\n    pub: store.pub,\n    ui: store.ui,\n    auth: store.auth\n  };\n})(PublicUserList);\n"
  },
  {
    "path": "src/layouts/RVListExample.js",
    "content": "/**\n * @flow\n */\nimport cn from \"classnames\";\nimport Immutable from \"immutable\";\nimport PropTypes from \"prop-types\";\nimport React, { PureComponent } from \"react\";\nimport {\n  fetchPeopleAlbums, \n  fetchAutoAlbums, \n  fetchDateAlbumsList} from '../actions/albumsActions'\nimport {fetchPhotos} from '../actions/photosActions'\n\nimport {\n  Collection,\n  CellMeasurer,\n  CellMeasurerCache,\n  createMasonryCellPositioner,\n  Masonry,\n  AutoSizer,\n  List,\n  WindowScroller,\n} from 'react-virtualized';\nimport { connect } from \"react-redux\";\nimport { Card, Image, Header, Divider, Item, Loader, Dimmer,\n         Container, Label, Popup, Segment, Button, Icon} from 'semantic-ui-react';\nimport {Server, serverAddress} from '../api_client/apiClient'\n\nfunction toInt(n){ return Math.round(Number(n)); };\n\n\nconst cache = new CellMeasurerCache({\n  defaultHeight: 50,\n  fixedWidth: true\n});\n\n\nexport class ListExample extends PureComponent {\n  constructor(props, context) {\n    super(props, context);\n\n    this.state = {\n      groupedPhotos: {},\n      thumbnailSize: 150\n    };\n\n    // this._getRowHeight = this._getRowHeight.bind(this);\n    // this._onResize = this._onResize.bind(this);\n    // this._noRowsRenderer = this._noRowsRenderer.bind(this);\n    // this._onRowCountChange = this._onRowCountChange.bind(this);\n    // this._onScrollToRowChange = this._onScrollToRowChange.bind(this);\n    this._rowRenderer = this._rowRenderer.bind(this);\n    this._renderAutoSizer = this._renderAutoSizer.bind(this);\n    this._renderList = this._renderList.bind(this);\n    this.groupPhotosByDate = this.groupPhotosByDate.bind(this);\n  }\n\n\n  componentWillMount(){\n    this.props.dispatch(fetchPhotos())\n  }\n\n  groupPhotosByDate(photos) {\n    var photosGroupedByDate = {}\n    photosGroupedByDate['Unknown Date'] = []\n    photos.map(function(photo){\n      if (photo.exif_timestamp != null) {\n        var date = photo.exif_timestamp.split('T')[0]\n        if (photosGroupedByDate.hasOwnProperty(date)){\n          photosGroupedByDate[date].push(photo)\n        }\n        else{\n          photosGroupedByDate[date] = []\n          photosGroupedByDate[date].push(photo)\n        }\n      }\n      else {\n        photosGroupedByDate['Unknown Date'].push(photo)        \n      }\n    })\n    return photosGroupedByDate\n  }\n\n\n\n  componentWillReceiveProps(nextProps) {\n    if (nextProps.photos.length > 0){\n      var groupedPhotos = this.groupPhotosByDate(nextProps.photos)\n      this.setState({groupedPhotos:groupedPhotos})\n    }\n  }\n\n  render() {\n    if (this.props.fetchedPhotos) {\n      return (\n        <WindowScroller>\n          {this._renderAutoSizer}\n        </WindowScroller>\n      );\n    }\n    else {\n      return (\n        <div>fetching photos</div>\n      )\n    }\n  }\n\n  _renderList({width}){\n   return (\n      <List\n        autoHeight={true}\n        height={1000}\n        deferredMeasurementCache={cache}\n        rowCount={20}\n        rowHeight={cache.rowHeight}\n        rowRenderer={this._rowRenderer}\n        width={width}/>\n    );  \n  }\n\n  _renderAutoSizer({ height, scrollTop }) {\n    this._height = height;\n    this._scrollTop = scrollTop;\n    return (\n      <AutoSizer\n        onResize={this._onResize}\n        scrollTop={this._scrollTop}>\n        {this._renderList}\n      </AutoSizer>\n    );\n  }\n\n  // _onResize({ width }) {\n  //   this._width = width - 215;\n  // }\n\n\n\n\n  // _getRowHeight({ index }) {\n  //   var key = Object.keys(this.state.groupedPhotos)[index];\n  //   var numPhotosInGroup = this.state.groupedPhotos[key].length\n  //   var numPhotosPerRow = toInt(Math.floor(this._width/(this.state.thumbnailSize+7)))\n  //   var numPhotosPerCol = toInt(Math.ceil(numPhotosInGroup/numPhotosPerRow))\n  //   var rowHeight = numPhotosPerCol * (this.state.thumbnailSize+7)\n\n  //   var rowHeight = toInt(rowHeight)\n  //   console.log(rowHeight)\n  //   return toInt(rowHeight)+100\n  // }\n\n  //   var thumbnailSize = this.state.thumbnailSize+7\n  //   var height = 0\n  //   var keys = Object.keys(this.state.groupedPhotos)\n  //   console.log(keys.length)\n  //   var groupedPhotos = this.state.groupedPhotos\n  //   var width = this._width\n  //   keys.map(function(key){\n  //     var numPhotosInGroup = groupedPhotos[key].length\n  //     var numPhotosPerRow = width/thumbnailSize\n  //     var numPhotosPerCol = numPhotosInGroup/numPhotosPerRow\n  //     var rowHeight = numPhotosPerCol * thumbnailSize\n  //     height += rowHeight\n  //   })\n  //   return toInt(height)\n  // }\n\n  // _noRowsRenderer() {\n  //   return <div style={{height:'500px'}}>No rows</div>;\n  // }\n\n  // _onRowCountChange(event) {\n  //   console.log('row count changed')\n  //   const rowCount = parseInt(event.target.value, 10) || 0;\n\n  //   this.setState({ rowCount });\n  // }\n\n  // _onScrollToRowChange(event) {\n  //   const { rowCount } = this.state;\n  //   let scrollToIndex = Math.min(\n  //     rowCount - 1,\n  //     parseInt(event.target.value, 10)\n  //   );\n\n  //   if (isNaN(scrollToIndex)) {\n  //     scrollToIndex = undefined;\n  //   }\n\n  //   this.setState({ scrollToIndex });\n  // }\n\n  _rowRenderer({ index, isScrolling, key, parent, style, isVisible }) {\n    console.log(index,isVisible)\n    console.log(this.props.photos.length)\n\n    var group = this.state.groupedPhotos[Object.keys(this.state.groupedPhotos)[index]]\n    var thumbnailSize = this.state.thumbnailSize\n    var mappedImages = group.map(function(photo,idx){\n      return (\n          <Image key={'image-'+index+'-'+idx}\n            height={thumbnailSize}\n            width={thumbnailSize}\n            src={serverAddress+photo.square_thumbnail_url}/>\n      )\n    })\n\n    return (\n      <CellMeasurer\n        cache={cache}\n        columnIndex={0}\n        key={key}\n        parent={parent}\n        rowIndex={index}>\n        {\n          ({measure}) => (\n            <div style={style}>\n            {index}:<img onLoad={measure} src={serverAddress+this.props.photos[index].thumbnail_url}/>\n            </div>\n          )\n        }\n      </CellMeasurer>\n    )\n  }\n}\n\n\n\n\n\nListExample = connect((store)=>{\n  return {\n    fetchingPhotos:store.photos.fetchingPhotos,\n    fetchedPhotos:store.photos.fetchedPhotos,\n    photos:store.photos.photos,\n  }\n})(ListExample)\n\n\n"
  },
  {
    "path": "src/layouts/RecentlyAddedPhotos.js",
    "content": "import React, { Component } from \"react\";\n\nimport { connect } from \"react-redux\";\nimport {fetchRecentlyAddedPhotos} from '../actions/photosActions';\nimport {Container, Icon, Divider, Header, Image, Button, Flag, Card, Loader} from 'semantic-ui-react'\nimport { push } from 'react-router-redux'\n\nimport _ from 'lodash'\nimport moment from 'moment'\nimport {PhotoListView} from './ReusablePhotoListView'\n\nvar topMenuHeight = 55 // don't change this\nvar ESCAPE_KEY = 27;\nvar ENTER_KEY = 13;\nvar RIGHT_ARROW_KEY = 39;\nvar UP_ARROW_KEY = 38;\nvar LEFT_ARROW_KEY = 37;\nvar DOWN_ARROW_KEY = 40;\n\nvar SIDEBAR_WIDTH = 85;\n\nvar DAY_HEADER_HEIGHT = 70\nvar leftMenuWidth = 85 // don't change this\n\nexport class RecentlyAddedPhotos extends Component {\n  componentDidMount() {\n    this.props.dispatch(fetchRecentlyAddedPhotos())\n  }\n    render() {\n        const {fetchingRecentlyAddedPhotos,fetchedRecentlyAddedPhotos} = this.props\n        return (\n            <PhotoListView \n                title={\"Recently Added\"}\n                loading={fetchingRecentlyAddedPhotos}\n                titleIconName={'clock'}\n                photosGroupedByDate={this.props.recentlyAddedPhotos.slice(0,1)}\n                idx2hash={this.props.recentlyAddedIdx2hash}\n                dayHeaderPrefix={'Added on ' }\n            />\n        )\n    }\n}\n\nRecentlyAddedPhotos = connect(store => {\n  return {\n    fetchingRecentlyAddedPhotos: store.photos.fetchingRecentlyAddedPhotos,\n    fetchedRecentlyAddedPhotos: store.photos.fetchedRecentlyAddedPhotos,\n    recentlyAddedPhotos: store.photos.recentlyAddedPhotos,\n    recentlyAddedIdx2hash: store.photos.recentlyAddedIdx2hash\n  };\n})(RecentlyAddedPhotos);\n"
  },
  {
    "path": "src/layouts/ReusablePhotoListView.js",
    "content": "import React, { Component } from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { Grid, WindowScroller, AutoSizer } from \"react-virtualized\";\nimport \"react-virtualized/styles.css\"; // only needs to be imported once\nimport { connect } from \"react-redux\";\n\nimport {\n  fetchDateAlbumsPhotoHashList,\n  fetchAlbumsDateGalleries,\n  fetchUserAlbumsList,\n  editUserAlbum,\n  createNewUserAlbum\n} from \"../actions/albumsActions\";\n\nimport {\n  fetchPhotos,\n  fetchPhotoDetail,\n  setPhotosFavorite,\n  setPhotosHidden,\n  setPhotosPublic\n} from \"../actions/photosActions\";\n\nimport { copyToClipboard } from \"../util/util\";\nimport { SecuredImage, SecuredImageJWT } from \"../components/SecuredImage\";\nimport { ModalPhotosShare } from \"../components/ModalPhotosShare\";\nimport { ModalAlbumShare } from \"../components/ModalAlbumShare\";\nimport {\n  Dropdown,\n  Checkbox,\n  Card,\n  Header,\n  Divider,\n  Item,\n  Loader,\n  Dimmer,\n  Sticky,\n  Portal,\n  Image,\n  List,\n  Input,\n  Rating,\n  Container,\n  Label,\n  Popup,\n  Segment,\n  Button,\n  Icon,\n  Table,\n  Transition,\n  Breadcrumb\n} from \"semantic-ui-react\";\n\nimport { Server, serverAddress } from \"../api_client/apiClient\";\nimport { LightBox } from \"../components/lightBox\";\nimport { LightBoxV2 } from \"../components/LightBoxV2\";\nimport LazyLoad from \"react-lazyload\";\n// import Lightbox from 'react-image-lightbox';\nimport { LocationMap } from \"../components/maps\";\nimport { push } from \"react-router-redux\";\nimport { searchPhotos } from \"../actions/searchActions\";\nimport styles from \"../App.css\";\nimport Draggable from \"react-draggable\";\nimport debounce from \"lodash/debounce\";\nimport _ from \"lodash\";\nimport * as moment from \"moment\";\nimport Modal from \"react-modal\";\n\nimport { calculateGridCells, calculateGridCellSize } from \"../util/gridUtils\";\nimport {\n  ScrollSpeed,\n  SPEED_THRESHOLD,\n  SCROLL_DEBOUNCE_DURATION\n} from \"../util/scrollUtils\";\n\nvar TOP_MENU_HEIGHT = 45; // don't change this\nvar LEFT_MENU_WIDTH = 85; // don't change this\nvar SIDEBAR_WIDTH = 85;\nvar TIMELINE_SCROLL_WIDTH = 0;\nvar DAY_HEADER_HEIGHT = 70;\n\nif (window.innerWidth < 600) {\n  var LIGHTBOX_SIDEBAR_WIDTH = window.innerWidth;\n} else {\n  var LIGHTBOX_SIDEBAR_WIDTH = 360;\n}\n\nfunction fuzzy_match(str, pattern) {\n  if (pattern.split(\"\").length > 0) {\n    pattern = pattern.split(\"\").reduce(function(a, b) {\n      return a + \".*\" + b;\n    });\n    return new RegExp(pattern).test(str);\n  } else {\n    return false;\n  }\n}\n\nconst customStyles = {\n  content: {\n    top: 150,\n    left: 40,\n    right: 40,\n    height: window.innerHeight - 300,\n\n    overflow: \"hidden\",\n    // paddingRight:0,\n    // paddingBottomt:0,\n    // paddingLeft:10,\n    // paddingTop:10,\n    padding: 0,\n    backgroundColor: \"white\"\n  },\n  overlay: {\n    top: 0,\n    left: 0,\n    right: 0,\n    bottom: 0,\n    position: \"fixed\",\n    borderRadius: 0,\n    border: 0,\n    zIndex: 102,\n    backgroundColor: \"rgba(200,200,200,0.8)\"\n  }\n};\n\nexport class PhotoListView extends Component {\n  constructor(props) {\n    super(props);\n    this.cellRenderer = this.cellRenderer.bind(this);\n    this.handleResize = this.handleResize.bind(this);\n    this.onPhotoClick = this.onPhotoClick.bind(this);\n    this.getPhotoDetails = this.getPhotoDetails.bind(this);\n    this.listRef = React.createRef();\n    this.state = {\n      cellContents: [[]],\n      imagesGroupedByDate: [],\n      hash2row: {},\n      idx2hash: [],\n      photos: {},\n      lightboxImageIndex: 1,\n      lightboxShow: false,\n      lightboxSidebarShow: false,\n      scrollToIndex: undefined,\n      width: window.innerWidth,\n      height: window.innerHeight,\n      entrySquareSize: 200,\n      numEntrySquaresPerRow: 10,\n      currTopRenderedRowIdx: 0,\n      scrollTop: 0,\n      selectMode: false,\n      selectedImageHashes: [],\n      modalAddToAlbumOpen: false,\n      modalSharePhotosOpen: false,\n      modalAlbumShareOpen: false\n    };\n  }\n\n  scrollSpeedHandler = new ScrollSpeed();\n\n  handleScroll = ({ scrollTop }) => {\n    // scrollSpeed represents the number of pixels scrolled since the last scroll event was fired\n    const scrollSpeed = Math.abs(\n      this.scrollSpeedHandler.getScrollSpeed(scrollTop)\n    );\n\n    if (scrollSpeed >= SPEED_THRESHOLD) {\n      this.setState({\n        isScrollingFast: true,\n        scrollTop: scrollTop\n      });\n    }\n\n    // Since this method is debounced, it will only fire once scrolling has stopped for the duration of SCROLL_DEBOUNCE_DURATION\n    this.handleScrollEnd();\n  };\n\n  handleScrollEnd = debounce(() => {\n    const { isScrollingFast } = this.state;\n\n    if (isScrollingFast) {\n      this.setState({\n        isScrollingFast: false\n      });\n    }\n  }, SCROLL_DEBOUNCE_DURATION);\n\n  componentDidMount() {\n    // this.props.dispatch(fetchPhotos())\n    // if (this.props.photosGroupedByDate.length < 1) {\n    //     this.props.dispatch(fetchDateAlbumsPhotoHashList())\n    // }\n    this.handleResize();\n    window.addEventListener(\"resize\", this.handleResize);\n  }\n  componentWillUnmount() {\n    window.removeEventListener(\"resize\", this.handleResize);\n    this.scrollSpeedHandler.clearTimeout();\n  }\n\n  handleResize() {\n    if (this.props.showSidebar) {\n      var columnWidth = window.innerWidth - SIDEBAR_WIDTH - 5 - 5 - 10;\n    } else {\n      var columnWidth = window.innerWidth - 5 - 5 - 10;\n    }\n\n    const { entrySquareSize, numEntrySquaresPerRow } = calculateGridCellSize(\n      columnWidth\n    );\n    var { cellContents, hash2row } = calculateGridCells(\n      this.props.photosGroupedByDate,\n      numEntrySquaresPerRow\n    );\n\n    this.setState({\n      width: window.innerWidth,\n      height: window.innerHeight,\n      entrySquareSize: entrySquareSize,\n      numEntrySquaresPerRow: numEntrySquaresPerRow,\n      cellContents: cellContents,\n      hash2row: hash2row\n    });\n    if (this.listRef.current) {\n      this.listRef.current.recomputeGridSize();\n    }\n  }\n\n  onPhotoClick(hash) {\n    this.setState({\n      lightboxImageIndex: this.props.idx2hash.indexOf(hash),\n      lightboxShow: true\n    });\n  }\n\n  onPhotoSelect(hash) {\n    var selectedImageHashes = this.state.selectedImageHashes;\n    if (selectedImageHashes.includes(hash)) {\n      selectedImageHashes = selectedImageHashes.filter(item => item !== hash);\n    } else {\n      selectedImageHashes.push(hash);\n    }\n    this.setState({ selectedImageHashes: selectedImageHashes });\n    if (selectedImageHashes.length === 0) {\n      this.setState({ selectMode: false });\n    }\n  }\n\n  onGroupSelect(hashes) {\n    if (\n      _.intersection(hashes, this.state.selectedImageHashes).length ===\n      hashes.length\n    ) {\n      // for deselect\n      var selectedImageHashes = _.difference(\n        this.state.selectedImageHashes,\n        hashes\n      );\n    } else {\n      var selectedImageHashes = _.union(this.state.selectedImageHashes, hashes);\n    }\n    this.setState({ selectedImageHashes: selectedImageHashes });\n    if (selectedImageHashes.length === 0) {\n      this.setState({ selectMode: false });\n    }\n  }\n\n  cellRenderer = ({ columnIndex, key, rowIndex, style }) => {\n    if (this.state.cellContents[rowIndex][columnIndex]) {\n      // non-empty cell\n      const cell = this.state.cellContents[rowIndex][columnIndex];\n      if (cell.date) {\n        // header cell has 'date' attribute\n        if (this.state.selectMode) {\n          return (\n            <div\n              key={key}\n              style={{\n                ...style,\n                width: this.state.width,\n                height: DAY_HEADER_HEIGHT,\n                paddingTop: 20\n              }}\n            >\n              <div\n                style={{ backgroundColor: \"white\", display: \"inline-block\" }}\n              >\n                <Header as=\"h3\">\n                  <Icon name=\"calendar outline\" />\n                  <Header.Content>\n                    {cell.date === \"No Timestamp\"\n                      ? \"No Timestamp\"\n                      : this.props.dayHeaderPrefix \n                        ? this.props.dayHeaderPrefix + moment(cell.date).format(\"MMM Do YYYY, dddd\") \n                        : moment(cell.date).format(\"MMM Do YYYY, dddd\")}\n                    <Header.Subheader>\n                      <Icon name=\"photo\" />\n                      {cell.photos.length} Photos\n                    </Header.Subheader>\n                  </Header.Content>\n                </Header>\n              </div>\n              <div\n                style={{ float: \"left\", top: 3, left: 0, position: \"relative\" }}\n              >\n                <Button\n                  circular\n                  color={\n                    _.intersection(\n                      cell.photos.map(el => el.image_hash),\n                      this.state.selectedImageHashes\n                    ).length === cell.photos.length\n                      ? \"blue\"\n                      : \"grey\"\n                  }\n                  onClick={() => {\n                    const hashes = cell.photos.map(p => p.image_hash);\n                    this.onGroupSelect(hashes);\n                  }}\n                  size=\"mini\"\n                  icon=\"checkmark\"\n                />\n              </div>\n            </div>\n          );\n        } else {\n          return (\n            <div\n              key={key}\n              style={{\n                ...style,\n                width: this.state.width,\n                height: DAY_HEADER_HEIGHT,\n                paddingTop: 20\n              }}\n            >\n              <div style={{ backgroundColor: \"white\" }}>\n                <Header as=\"h3\">\n                  <Icon name=\"calendar outline\" />\n                  <Header.Content>\n                    {cell.date === \"No Timestamp\"\n                      ? \"No Timestamp\"\n                      : this.props.dayHeaderPrefix \n                        ? this.props.dayHeaderPrefix + moment(cell.date).format(\"MMM Do YYYY, dddd\") \n                        : moment(cell.date).format(\"MMM Do YYYY, dddd\")}\n                    {cell.location ? (\n                      <Header.Subheader>\n                        <Icon name=\"map\" />\n                        {cell.location.places.join(\", \")}\n                      </Header.Subheader>\n                    ) : (\n                      <Header.Subheader>\n                        <Icon name=\"photo\" />\n                        {cell.photos.length} Photos\n                      </Header.Subheader>\n                    )}\n                  </Header.Content>\n                </Header>\n              </div>\n            </div>\n          );\n        }\n      } else {\n        // photo cell doesn't have 'date' attribute\n\n        if (!this.state.isScrollingFast) {\n          // photo cell not scrolling fast\n          if (\n            this.props.photoDetails[cell.image_hash]\n              ? this.props.photoDetails[cell.image_hash].favorited\n              : cell.favorited\n          ) {\n            var favIcon = (\n              <div style={{ right: 6, bottom: 6, position: \"absolute\" }}>\n                <Icon\n                  circular\n                  onClick={() => {\n                    this.props.dispatch(\n                      setPhotosFavorite([cell.image_hash], false)\n                    );\n                  }}\n                  style={{ backgroundColor: \"white\" }}\n                  color=\"yellow\"\n                  name=\"star\"\n                />\n              </div>\n            );\n          } else {\n            var favIcon = (\n              <div\n                className=\"gridCellActions\"\n                style={{ right: 6, bottom: 6, position: \"absolute\" }}\n              >\n                <Popup\n                  inverted\n                  flowing\n                  size=\"mini\"\n                  content=\"Add photo to favorites\"\n                  trigger={\n                    <Icon\n                      circular\n                      onClick={() => {\n                        this.props.dispatch(\n                          setPhotosFavorite([cell.image_hash], true)\n                        );\n                      }}\n                      style={{ backgroundColor: \"white\" }}\n                      color=\"grey\"\n                      name=\"star\"\n                    />\n                  }\n                />\n              </div>\n            );\n          }\n\n          if (\n            this.props.photoDetails[cell.image_hash]\n              ? this.props.photoDetails[cell.image_hash].hidden\n              : cell.hidden\n          ) {\n            var hiddenIcon = (\n              <div style={{ left: 6, bottom: 6, position: \"absolute\" }}>\n                <Icon\n                  circular\n                  onClick={() => {\n                    this.props.dispatch(\n                      setPhotosHidden([cell.image_hash], false)\n                    );\n                  }}\n                  style={{ backgroundColor: \"white\" }}\n                  color=\"red\"\n                  name=\"hide\"\n                />\n              </div>\n            );\n          } else {\n            var hiddenIcon = (\n              <div\n                className=\"gridCellActions\"\n                style={{ left: 6, bottom: 6, position: \"absolute\" }}\n              >\n                <Popup\n                  inverted\n                  flowing\n                  size=\"mini\"\n                  content=\"Hide photo\"\n                  trigger={\n                    <Icon\n                      circular\n                      onClick={() => {\n                        this.props.dispatch(\n                          setPhotosHidden([cell.image_hash], true)\n                        );\n                      }}\n                      style={{ backgroundColor: \"white\" }}\n                      color=\"grey\"\n                      name=\"hide\"\n                    />\n                  }\n                />\n              </div>\n            );\n          }\n\n          if (\n            this.props.photoDetails[cell.image_hash]\n              ? this.props.photoDetails[cell.image_hash].public\n              : cell.public\n          ) {\n            var publicIcon = (\n              <div style={{ right: 6, top: 6, position: \"absolute\" }}>\n                <Icon\n                  circular\n                  onClick={() => {\n                    this.props.dispatch(\n                      setPhotosPublic([cell.image_hash], false)\n                    );\n                  }}\n                  style={{ backgroundColor: \"white\" }}\n                  color=\"green\"\n                  name=\"globe\"\n                />\n              </div>\n            );\n          } else {\n            var publicIcon = (\n              <div\n                className=\"gridCellActions\"\n                style={{ right: 6, top: 6, position: \"absolute\" }}\n              >\n                <Popup\n                  inverted\n                  flowing\n                  size=\"mini\"\n                  content=\"Make public and copy link to clipboard\"\n                  trigger={\n                    <Icon\n                      circular\n                      onClick={() => {\n                        this.props.dispatch(\n                          setPhotosPublic([cell.image_hash], true)\n                        );\n                        copyToClipboard(\n                          serverAddress.replace('//','') +\n                            \"/media/photos/\" +\n                            cell.image_hash +\n                            \".jpg\"\n                        );\n                      }}\n                      style={{ backgroundColor: \"white\" }}\n                      name=\"globe\"\n                      color=\"grey\"\n                    />\n                  }\n                />\n              </div>\n            );\n          }\n\n          if (this.state.selectMode) {\n            // select mode\n            return (\n              <div\n                className=\"gridCell\"\n                key={key}\n                style={{\n                  ...style,\n                  padding: 15,\n                  backgroundColor: this.state.selectedImageHashes.includes(\n                    cell.image_hash\n                  )\n                    ? \"#AED6F1\"\n                    : \"#eeeeee\",\n                  margin: 1,\n                  width: style.width - 2,\n                  height: style.height - 2\n                }}\n              >\n                {(this.props.photoDetails[cell.image_hash]\n                  ? this.props.photoDetails[cell.image_hash].hidden\n                  : cell.hidden) && !this.props.showHidden ? (\n                  <div\n                    style={{\n                      height: this.state.entrySquareSize - 32,\n                      width: this.state.entrySquareSize - 32,\n                      padding: 0,\n                      margin: 0,\n                      backgroundColor: \"#dddddd\"\n                    }}\n                  />\n                ) : (\n                  <SecuredImageJWT\n                    isPublic={this.props.isPublic}\n                    key={\"daygroup_image_\" + cell.image_hash}\n                    style={{ display: \"inline-block\", padding: 1, margin: 0 }}\n                    height={this.state.entrySquareSize - 30}\n                    width={this.state.entrySquareSize - 30}\n                    src={\n                      serverAddress +\n                      \"/media/square_thumbnails/\" +\n                      cell.image_hash +\n                      \".jpg\"\n                    }\n                  />\n                )}\n\n                <div style={{ left: 5, top: 5, position: \"absolute\" }}>\n                  <Icon\n                    style={{ backgroundColor: \"white\" }}\n                    circular\n                    onClick={() => {\n                      this.onPhotoSelect(cell.image_hash);\n                    }}\n                    name={\n                      this.state.selectedImageHashes.includes(cell.image_hash)\n                        ? \"checkmark\"\n                        : \"\"\n                    }\n                    color={\n                      this.state.selectedImageHashes.includes(cell.image_hash)\n                        ? \"blue\"\n                        : \"grey\"\n                    }\n                  />\n                </div>\n                {!this.props.isPublic && hiddenIcon}\n                {!this.props.isPublic && favIcon}\n                {!this.props.isPublic && publicIcon}\n              </div>\n            );\n          } else {\n            // normal mode\n\n            return (\n              <div className=\"gridCell\" key={key} style={style}>\n                {(this.props.photoDetails[cell.image_hash]\n                  ? this.props.photoDetails[cell.image_hash].hidden\n                  : cell.hidden) && !this.props.showHidden ? (\n                  <div\n                    style={{\n                      height: this.state.entrySquareSize - 2,\n                      width: this.state.entrySquareSize - 2,\n                      padding: 0,\n                      backgroundColor: \"#dddddd\"\n                    }}\n                  />\n                ) : (\n                  <SecuredImageJWT\n                    isPublic={this.props.isPublic}\n                    key={\"daygroup_image_\" + cell.image_hash}\n                    style={{ display: \"inline-block\", padding: 1, margin: 0 }}\n                    onClick={() => {\n                      this.onPhotoClick(cell.image_hash);\n                    }}\n                    height={this.state.entrySquareSize}\n                    width={this.state.entrySquareSize}\n                    src={\n                      serverAddress +\n                      \"/media/square_thumbnails/\" +\n                      cell.image_hash +\n                      \".jpg\"\n                    }\n                  />\n                )}\n\n                <div\n                  className=\"gridCellActions\"\n                  style={{ left: 6, top: 6, position: \"absolute\" }}\n                >\n                  {!this.props.isPublic && (\n                    <Icon\n                      style={{ backgroundColor: \"white\" }}\n                      circular\n                      onClick={() => {\n                        if (!this.props.isPublic) {\n                          this.onPhotoSelect(cell.image_hash);\n                          this.setState({ selectMode: true });\n                        }\n                      }}\n                      name=\"checkmark\"\n                      color={\n                        this.state.selectedImageHashes.includes(cell.image_hash)\n                          ? \"blue\"\n                          : \"grey\"\n                      }\n                    />\n                  )}\n                </div>\n                {!this.props.isPublic && hiddenIcon}\n                {!this.props.isPublic && favIcon}\n                {!this.props.isPublic && publicIcon}\n              </div>\n            );\n          }\n        } else {\n          return (\n            <div\n              key={key}\n              style={{\n                ...style,\n                width: this.state.entrySquareSize - 2,\n                height: this.state.entrySquareSize - 2,\n                backgroundColor: this.state.selectedImageHashes.includes(\n                  cell.image_hash\n                )\n                  ? \"#AED6F1\"\n                  : \"#eeeeee\"\n              }}\n            />\n          );\n        }\n      }\n    } else {\n      // empty cell\n      return <div key={key} style={style} />;\n    }\n  };\n\n  getPhotoDetails(image_hash) {\n    this.props.dispatch(fetchPhotoDetail(image_hash));\n  }\n\n  componentDidUpdate(prevProps, prevState, snapshot) {\n    if (prevProps.showSidebar !== this.props.showSidebar) {\n      this.handleResize();\n    }\n    if (prevProps.gridType !== this.props.gridType) {\n      this.handleResize();\n    }\n  }\n\n  static getDerivedStateFromProps(nextProps, prevState) {\n    var t0 = performance.now();\n    const imagesGroupedByDate = nextProps.photosGroupedByDate;\n    var t1 = performance.now();\n\n    var idx2hash = [];\n\n    const { cellContents, hash2row } = calculateGridCells(\n      imagesGroupedByDate,\n      prevState.numEntrySquaresPerRow\n    );\n    const nextState = {\n      ...prevState,\n      cellContents,\n      hash2row,\n      imagesGroupedByDate\n    };\n    return nextState;\n  }\n\n  render() {\n    const { lightboxImageIndex } = this.state;\n    if (\n      this.props.loading ||\n      this.props.idx2hash.length < 1 ||\n      this.props.photosGroupedByDate.length < 1\n    ) {\n      //if (true) {\n      return (\n        <div>\n          <div style={{ height: 60, paddingTop: 10 }}>\n            <Header as=\"h2\">\n              <Icon name={this.props.titleIconName} />\n              <Header.Content>\n                {this.props.title}\n                <Loader inline active={this.props.loading} size=\"mini\" />\n                {this.props.loading ? (\n                  <Header.Subheader>Loading...</Header.Subheader>\n                ) : (\n                  <Header.Subheader>\n                    {this.props.photosGroupedByDate.length} Days,{\" \"}\n                    {this.props.idx2hash.length} Photos\n                  </Header.Subheader>\n                )}\n              </Header.Content>\n            </Header>\n          </div>\n\n          {this.props.idx2hash.length < 1 ||\n          this.props.photosGroupedByDate.length < 1 ? (\n            <div\n              style={{\n                display: \"flex\",\n                justifyContent: \"center\",\n                alignItems: \"center\",\n                height: this.state.height - TOP_MENU_HEIGHT - 60\n                // width:this.state.width\n              }}\n            >\n              <Header>{this.props.noResultsMessage}</Header>\n            </div>\n          ) : (\n            <AutoSizer\n              disableHeight\n              style={{ outline: \"none\", padding: 0, margin: 0 }}\n            >\n              {({ width }) => (\n                <Grid\n                  overscanRowCount={0}\n                  style={{ outline: \"none\" }}\n                  cellRenderer={({ columnIndex, key, rowIndex, style }) => {\n                    if (rowIndex % 3 === 0 && columnIndex === 0) {\n                      return (\n                        <div\n                          key={key}\n                          style={{\n                            ...style,\n                            width: this.state.width,\n                            height: DAY_HEADER_HEIGHT,\n                            paddingTop: 20\n                          }}\n                        >\n                          <div\n                            style={{\n                              backgroundColor: \"#dddddd\",\n                              height: 40,\n                              width: 260\n                            }}\n                          />\n                        </div>\n                      );\n                    } else if (rowIndex % 3 === 0 && columnIndex > 0) {\n                      return <div key={key} style={style} />;\n                    } else {\n                      return (\n                        <div style={{ ...style }} key={key}>\n                          <SecuredImageJWT\n                            isPublic={this.props.isPublic}\n                            style={{ padding: 1, margin: 0 }}\n                            height={this.state.entrySquareSize}\n                            width={this.state.entrySquareSize}\n                            src=\"/thumbnail_placeholder.png\"\n                          />\n                        </div>\n                      );\n                    }\n                  }}\n                  columnWidth={width / this.state.numEntrySquaresPerRow}\n                  columnCount={this.state.numEntrySquaresPerRow}\n                  height={this.state.height - TOP_MENU_HEIGHT - 60}\n                  rowHeight={({ index }) => {\n                    if (index % 3) {\n                      return (\n                        width.toFixed(1) / this.state.numEntrySquaresPerRow\n                      );\n                    } else {\n                      return DAY_HEADER_HEIGHT;\n                    }\n                  }}\n                  rowCount={5000}\n                  width={width}\n                />\n              )}\n            </AutoSizer>\n          )}\n        </div>\n      );\n    }\n    var totalListHeight = this.state.cellContents\n      .map((row, index) => {\n        if (row[0].date) {\n          //header row\n          return DAY_HEADER_HEIGHT;\n        } else {\n          //photo row\n          return this.state.entrySquareSize;\n        }\n      })\n      .reduce((a, b) => a + b, 0);\n\n    console.log(this.props);\n\n    if (this.props.route.location.pathname.startsWith(\"/useralbum/\")) {\n      var isUserAlbum = true;\n    } else {\n      var isUserAlbum = false;\n    }\n\n    return (\n      <div>\n        <div style={{ height: 60, paddingTop: 10 }}>\n          <Header as=\"h2\">\n            <Icon name={this.props.titleIconName} />\n            <Header.Content>\n              {this.props.title}{\" \"}\n              <Header.Subheader>\n                {this.props.photosGroupedByDate.length} days,{\" \"}\n                {this.props.idx2hash.length} photos\n                {this.props.additionalSubHeader}\n              </Header.Subheader>\n            </Header.Content>\n          </Header>\n        </div>\n\n        {true &&\n          !this.props.isPublic && (\n            <div\n              style={{\n                marginLeft: -5,\n                paddingLeft: 5,\n                paddingRight: 5,\n                height: 40,\n                paddingTop: 4,\n                backgroundColor: \"#f6f6f6\"\n              }}\n            >\n              {/* <Checkbox\n                fitted\n                label={\" \"}\n                style={{ padding: 5 }}\n                toggle\n                checked={this.state.selectMode}\n                onClick={() => {\n                  this.setState({ selectMode: !this.state.selectMode });\n                  if (this.state.selectMode) {\n                    this.setState({ selectedImageHashes: [] });\n                  }\n                }}\n              /> */}\n\n              <Button.Group\n                compact\n                floated=\"left\"\n                style={{ paddingLeft: 2, paddingRight: 2 }}\n              >\n                <Popup\n                  trigger={\n                    <Button\n                      icon=\"checkmark\"\n                      compact\n                      active={this.state.selectMode}\n                      color={this.state.selectMode ? \"blue\" : \"null\"}\n                      onClick={() => {\n                        this.setState({ selectMode: !this.state.selectMode });\n                        if (this.state.selectMode) {\n                          this.setState({ selectedImageHashes: [] });\n                        }\n                      }}\n                      label={{\n                        as: \"a\",\n                        basic: true,\n                        content: `${\n                          this.state.selectedImageHashes.length\n                        } selected`\n                      }}\n                      labelPosition=\"right\"\n                    />\n                  }\n                  content=\"Toggle select mode\"\n                  inverted\n                />\n              </Button.Group>\n\n              <Button.Group\n                compact\n                floated=\"left\"\n                style={{ paddingLeft: 2, paddingRight: 2 }}\n              >\n                <Popup\n                  inverted\n                  trigger={\n                    <Button\n                      icon\n                      compact\n                      positive={\n                        this.state.selectedImageHashes.length !==\n                        this.props.idx2hash.length\n                      }\n                      negative={\n                        this.state.selectedImageHashes.length ===\n                        this.props.idx2hash.length\n                      }\n                      onClick={() => {\n                        if (\n                          this.state.selectedImageHashes.length ===\n                          this.props.idx2hash.length\n                        ) {\n                          this.setState({ selectedImageHashes: [] });\n                        } else {\n                          this.setState({\n                            selectMode: true,\n                            selectedImageHashes: this.props.idx2hash\n                          });\n                        }\n                      }}\n                    >\n                      <Icon\n                        name={\n                          this.state.selectedImageHashes.length ===\n                          this.props.idx2hash.length\n                            ? \"check circle outline\"\n                            : \"check circle\"\n                        }\n                      />\n                    </Button>\n                  }\n                  content={\n                    this.state.selectedImageHashes.length ===\n                    this.props.idx2hash.length\n                      ? \"Deselect all\"\n                      : \"Select All\"\n                  }\n                />\n              </Button.Group>\n\n              <Button.Group\n                style={{ paddingLeft: 2, paddingRight: 2 }}\n                compact\n                floated=\"right\"\n                color=\"orange\"\n              >\n                <Dropdown\n                  icon=\"ellipsis vertical\"\n                  pointing=\"top right\"\n                  floating\n                  button\n                  compact\n                  floated=\"right\"\n                  className=\"icon\"\n                  color=\"blue\"\n                >\n                  <Dropdown.Menu>\n                    <Dropdown.Header>\n                      <Icon name='image'/>Photo Actions ({this.state.selectedImageHashes.length} selected)\n                    </Dropdown.Header>\n\n                    <Dropdown.Divider />\n                    <Dropdown.Item\n                      disabled={this.state.selectedImageHashes.length === 0}\n                      onClick={() => {\n                        this.props.dispatch(\n                          setPhotosFavorite(\n                            this.state.selectedImageHashes,\n                            true\n                          )\n                        );\n                      }}\n                    >\n                      <Icon name=\"star\" color=\"yellow\" />\n                      {\"  Favorite\"}\n                    </Dropdown.Item>\n                    <Dropdown.Item\n                      disabled={this.state.selectedImageHashes.length === 0}\n                      onClick={() => {\n                        this.props.dispatch(\n                          setPhotosFavorite(\n                            this.state.selectedImageHashes,\n                            false\n                          )\n                        );\n                      }}\n                    >\n                      <Icon name=\"star outline\" color=\"yellow\" />\n                      {\"  Unfavorite\"}\n                    </Dropdown.Item>\n\n                    <Dropdown.Divider />\n                    <Dropdown.Item\n                      disabled={this.state.selectedImageHashes.length === 0}\n                      onClick={() => {\n                        this.props.dispatch(\n                          setPhotosHidden(this.state.selectedImageHashes, true)\n                        );\n                      }}\n                    >\n                      <Icon name=\"hide\" color=\"red\" />\n                      {\"  Hide\"}\n                    </Dropdown.Item>\n                    <Dropdown.Item\n                      disabled={this.state.selectedImageHashes.length === 0}\n                      onClick={() => {\n                        this.props.dispatch(\n                          setPhotosHidden(this.state.selectedImageHashes, false)\n                        );\n                      }}\n                    >\n                      <Icon name=\"unhide\" color=\"black\" />\n                      {\"  Unhide\"}\n                    </Dropdown.Item>\n\n                    <Dropdown.Divider />\n                    <Dropdown.Item\n                      disabled={this.state.selectedImageHashes.length === 0}\n                      onClick={() => {\n                        this.props.dispatch(\n                          setPhotosPublic(this.state.selectedImageHashes, true)\n                        );\n                        const linksToCopy = this.state.selectedImageHashes\n                          .map(\n                            ih => serverAddress.replace('//','') + \"/media/photos/\" + ih + \".jpg\"\n                          )\n                          .join(\"\\n\");\n                        copyToClipboard(linksToCopy);\n                      }}\n                    >\n                      <Icon name=\"globe\" />\n                      {\"  Make Public\"}\n                    </Dropdown.Item>\n                    <Dropdown.Item\n                      disabled={this.state.selectedImageHashes.length === 0}\n                      onClick={() => {\n                        this.props.dispatch(\n                          setPhotosPublic(this.state.selectedImageHashes, false)\n                        );\n                      }}\n                    >\n                      <Icon name=\"key\" />\n                      {\"  Make Private\"}\n                    </Dropdown.Item>\n\n                    <Dropdown.Divider />\n                    <Popup\n                      inverted\n                      position='left center'\n                      trigger={\n                        <Dropdown.Item\n                          disabled={this.state.selectedImageHashes.length === 0}\n                          onClick={() => {\n                            if (this.state.selectedImageHashes.length > 0) {\n                              this.setState({ modalSharePhotosOpen: true });\n                            }\n                          }}\n                        >\n                          <Icon name=\"share\" />\n                          {\"  Sharing\"}\n                        </Dropdown.Item>\n                      }\n                      content=\"Open sharing panel for selected photos\"\n                    />\n                    <Dropdown.Divider/>\n                    <Dropdown.Header>\n                      <Icon name='images'/>Album Actions\n                    </Dropdown.Header>\n                    <Popup\n                      inverted\n                      position='left center'\n                      trigger={\n                        <Dropdown.Item\n                          disabled={!this.props.route.location.pathname.startsWith(\"/useralbum/\")}\n                          onClick={() => {\n                              //todo\n                            this.setState({ modalAlbumShareOpen: true });\n                          }}\n                        >\n                          <Icon name=\"share\" />\n                          {\"  Sharing\"}\n                        </Dropdown.Item>\n                      }\n                      content=\"Open sharing panel for the current album\"\n                    />\n                    \n\n\n\n                  </Dropdown.Menu>\n                </Dropdown>\n              </Button.Group>\n\n              <Button.Group\n                style={{ paddingLeft: 2, paddingRight: 2 }}\n                floated=\"right\"\n                compact\n                color=\"teal\"\n              >\n                <Dropdown\n                  disabled={this.state.selectedImageHashes.length === 0}\n                  pointing=\"top right\"\n                  icon=\"plus\"\n                  floating\n                  button\n                  compact\n                  floated=\"right\"\n                  className=\"icon\"\n                >\n                  <Dropdown.Menu>\n                    <Dropdown.Header>\n                      Album ({this.state.selectedImageHashes.length} selected)\n                    </Dropdown.Header>\n                    <Dropdown.Divider />\n                    <Dropdown.Item\n                      onClick={() => {\n                        if (this.state.selectedImageHashes.length > 0) {\n                          this.setState({ modalAddToAlbumOpen: true });\n                        }\n                      }}\n                    >\n                      <Icon name=\"bookmark\" color=\"red\" />\n                      {\" Album\"}\n                    </Dropdown.Item>\n                  </Dropdown.Menu>\n                </Dropdown>\n              </Button.Group>\n\n              {false && isUserAlbum && (\n                <Popup\n                  inverted\n                  trigger={\n                    <Button.Group\n                      style={{ paddingLeft: 2, paddingRight: 2 }}\n                      floated=\"right\"\n                      compact\n                      icon\n                      onClick={() => {\n                        this.setState({ modalAlbumShareOpen: true });\n                      }}\n                    >\n                      <Button icon=\"share alternate\" />\n                    </Button.Group>\n                  }\n                  content=\"Share album\"\n                />\n              )}\n\n              <Button.Group\n                style={{ paddingLeft: 2, paddingRight: 2 }}\n                floated=\"right\"\n                compact\n              >\n                <Popup\n                  inverted\n                  trigger={\n                    <Button\n                      active={this.props.gridType === \"dense\"}\n                      onClick={() => {\n                        this.props.dispatch({\n                          type: \"SET_GRID_TYPE\",\n                          payload: \"dense\"\n                        });\n                      }}\n                      icon\n                    >\n                      <Icon name=\"grid layout\" />\n                    </Button>\n                  }\n                  content=\"Small thumbnails\"\n                />\n                <Popup\n                  inverted\n                  trigger={\n                    <Button\n                      active={this.props.gridType === \"loose\"}\n                      onClick={() => {\n                        this.props.dispatch({\n                          type: \"SET_GRID_TYPE\",\n                          payload: \"loose\"\n                        });\n                      }}\n                      icon\n                    >\n                      <Icon name=\"block layout\" />\n                    </Button>\n                  }\n                  content=\"Big thumbnails\"\n                />\n              </Button.Group>\n            </div>\n          )}\n\n        <AutoSizer\n          disableHeight\n          style={{ outline: \"none\", padding: 0, margin: 0 }}\n        >\n          {({ width }) => (\n            <Grid\n              ref={this.listRef}\n              onSectionRendered={({ rowStartIndex }) => {\n                const cell = this.state.cellContents[rowStartIndex][0];\n                if (cell.date) {\n                  var date = cell.date;\n                  if (date == \"No Timestamp\") {\n                    this.setState({\n                      date: date,\n                      fromNow: date\n                    });\n                  } else {\n                    this.setState({\n                      date: moment(date).format(\"MMMM Do YYYY\"),\n                      fromNow: moment(date).fromNow()\n                    });\n                  }\n                }\n              }}\n              overscanRowCount={5}\n              style={{ outline: \"none\" }}\n              cellRenderer={this.cellRenderer}\n              onScroll={this.handleScroll}\n              columnWidth={this.state.entrySquareSize}\n              columnCount={this.state.numEntrySquaresPerRow}\n              height={\n                this.props.isPublic\n                  ? this.state.height - TOP_MENU_HEIGHT - 60\n                  : this.state.height - TOP_MENU_HEIGHT - 60 - 40\n                // this.state.selectMode\n                //   ? this.state.height - TOP_MENU_HEIGHT - 60 - 40\n                //   : this.state.height - TOP_MENU_HEIGHT - 60\n              }\n              estimatedRowSize={\n                totalListHeight / this.state.cellContents.length.toFixed(1)\n              }\n              rowHeight={({ index }) => {\n                if (this.state.cellContents[index][0].date) {\n                  //header row\n                  return DAY_HEADER_HEIGHT;\n                } else {\n                  //photo row\n                  return this.state.entrySquareSize;\n                }\n              }}\n              rowCount={this.state.cellContents.length}\n              width={width}\n            />\n          )}\n        </AutoSizer>\n\n        {this.state.cellContents[this.state.currTopRenderedRowIdx][0] && (\n          <div\n            style={{\n              right: 0,\n              top:\n                TOP_MENU_HEIGHT +\n                10 +\n                (0 / totalListHeight) *\n                  (this.state.height - TOP_MENU_HEIGHT - 50 - 20),\n              position: \"fixed\",\n              float: \"left\",\n              width: 180,\n              padding: 0,\n              height: 50,\n              zIndex: 100\n            }}\n          >\n            <div\n              style={{ textAlign: \"right\", paddingRight: 30 }}\n              className=\"handle\"\n            >\n              <b>\n              {\n                this.props.dayHeaderPrefix \n                  ? this.props.dayHeaderPrefix + this.state.date\n                  : this.state.date\n              }</b> <br />\n            </div>\n            <div style={{ textAlign: \"right\", paddingRight: 30 }}>\n              {this.state.fromNow}\n            </div>\n          </div>\n        )}\n\n        <div\n          style={{\n            backgroundColor: \"white\",\n            position: \"fixed\",\n            right: 0,\n            top: TOP_MENU_HEIGHT,\n            height: this.state.height - TOP_MENU_HEIGHT,\n            width: TIMELINE_SCROLL_WIDTH\n          }}\n        />\n\n        {this.state.lightboxShow &&\n          false && (\n            <LightBoxV2\n              isOpen={this.state.lightboxShow}\n              onCloseRequest={() => {\n                this.setState({ lightboxShow: false });\n              }}\n              idx2hash={this.props.idx2hash}\n              lightboxImageIndex={this.state.lightboxImageIndex}\n              onImageLoad={() => {\n                this.getPhotoDetails(\n                  this.props.idx2hash[this.state.lightboxImageIndex]\n                );\n              }}\n            />\n          )}\n\n        {this.state.lightboxShow && (\n          <LightBox\n            isPublic={this.props.isPublic}\n            showHidden={this.props.showHidden}\n            idx2hash={this.props.idx2hash}\n            lightboxImageIndex={this.state.lightboxImageIndex}\n            onCloseRequest={() => this.setState({ lightboxShow: false })}\n            onImageLoad={() => {\n              this.getPhotoDetails(\n                this.props.idx2hash[this.state.lightboxImageIndex]\n              );\n            }}\n            onMovePrevRequest={() => {\n              var prevIndex =\n                (this.state.lightboxImageIndex +\n                  this.props.idx2hash.length -\n                  1) %\n                this.props.idx2hash.length;\n              this.setState({\n                lightboxImageIndex: prevIndex\n              });\n              var rowIdx = this.state.hash2row[this.props.idx2hash[prevIndex]];\n              this.listRef.current.scrollToCell({\n                columnIndex: 0,\n                rowIndex: rowIdx\n              });\n              this.getPhotoDetails(this.props.idx2hash[prevIndex]);\n            }}\n            onMoveNextRequest={() => {\n              var nextIndex =\n                (this.state.lightboxImageIndex +\n                  this.props.idx2hash.length +\n                  1) %\n                this.props.idx2hash.length;\n              this.setState({\n                lightboxImageIndex: nextIndex\n              });\n              var rowIdx = this.state.hash2row[this.props.idx2hash[nextIndex]];\n              this.listRef.current.scrollToCell({\n                columnIndex: 0,\n                rowIndex: rowIdx\n              });\n              this.getPhotoDetails(this.props.idx2hash[nextIndex]);\n            }}\n          />\n        )}\n\n        {!this.props.isPublic && (\n          <ModalAlbumEdit\n            isOpen={this.state.modalAddToAlbumOpen}\n            onRequestClose={() => {\n              this.setState({\n                modalAddToAlbumOpen: false\n              });\n            }}\n            selectedImageHashes={this.state.selectedImageHashes}\n          />\n        )}\n        {!this.props.isPublic && (\n          <ModalPhotosShare\n            isOpen={this.state.modalSharePhotosOpen}\n            onRequestClose={() => {\n              this.setState({\n                modalSharePhotosOpen: false\n              });\n            }}\n            selectedImageHashes={this.state.selectedImageHashes}\n          />\n        )}\n        {!this.props.isPublic &&\n          isUserAlbum && (\n            <ModalAlbumShare\n              isOpen={this.state.modalAlbumShareOpen}\n              onRequestClose={() => {\n                this.setState({\n                  modalAlbumShareOpen: false\n                });\n              }}\n              match={this.props.match}\n              selectedImageHashes={this.state.selectedImageHashes}\n            />\n          )}\n      </div>\n    );\n  }\n}\n\nclass ModalAlbumEdit extends Component {\n  state = { newAlbumTitle: \"\" };\n  render() {\n    if (this.state.newAlbumTitle.length > 0) {\n      var filteredUserAlbumList = this.props.albumsUserList.filter(el =>\n        fuzzy_match(\n          el.title.toLowerCase(),\n          this.state.newAlbumTitle.toLowerCase()\n        )\n      );\n    } else {\n      var filteredUserAlbumList = this.props.albumsUserList;\n    }\n    return (\n      <Modal\n        ariaHideApp={false}\n        onAfterOpen={() => {\n          this.props.dispatch(fetchUserAlbumsList());\n        }}\n        isOpen={this.props.isOpen}\n        onRequestClose={() => {\n          this.props.onRequestClose();\n          this.setState({ newAlbumTitle: \"\" });\n        }}\n        style={customStyles}\n      >\n        <div style={{ height: 50, width: \"100%\", padding: 7 }}>\n          <Header>\n            Add to Album\n            <Header.Subheader>\n              Add selected {this.props.selectedImageHashes.length} photo(s)\n              to...\n            </Header.Subheader>\n          </Header>\n        </div>\n        <Divider fitted />\n        <div\n          style={{ height: 100, padding: 5, height: 50, overflowY: \"hidden\" }}\n        >\n          <Image.Group>\n            {this.props.selectedImageHashes.map(image_hash => (\n              <SecuredImageJWT\n                isPublic={this.props.isPublic}\n                height={40}\n                width={40}\n                src={\n                  serverAddress +\n                  \"/media/square_thumbnails/\" +\n                  image_hash +\n                  \".jpg\"\n                }\n              />\n            ))}\n          </Image.Group>\n        </div>\n        <Divider fitted />\n        <div\n          style={{\n            paddingLeft: 10,\n            paddingTop: 10,\n            overflowY: \"scroll\",\n            height: window.innerHeight - 300 - 100,\n            width: \"100%\"\n          }}\n        >\n          <div style={{ paddingRight: 5 }}>\n            <Header as=\"h4\">New album</Header>\n            <Popup\n              inverted\n              content={\n                'Album \"' +\n                this.state.newAlbumTitle.trim() +\n                '\" already exists.'\n              }\n              position=\"bottom center\"\n              open={this.props.albumsUserList\n                .map(el => el.title.toLowerCase().trim())\n                .includes(this.state.newAlbumTitle.toLowerCase().trim())}\n              trigger={\n                <Input\n                  fluid\n                  error={this.props.albumsUserList\n                    .map(el => el.title.toLowerCase().trim())\n                    .includes(this.state.newAlbumTitle.toLowerCase().trim())}\n                  onChange={(e, v) => {\n                    this.setState({ newAlbumTitle: v.value });\n                  }}\n                  placeholder=\"Album title\"\n                  action\n                >\n                  <input />\n                  <Button\n                    positive\n                    onClick={() => {\n                      this.props.dispatch(\n                        createNewUserAlbum(\n                          this.state.newAlbumTitle,\n                          this.props.selectedImageHashes\n                        )\n                      );\n                      this.props.onRequestClose();\n                      this.setState({ newAlbumTitle: \"\" });\n                    }}\n                    disabled={this.props.albumsUserList\n                      .map(el => el.title.toLowerCase().trim())\n                      .includes(this.state.newAlbumTitle.toLowerCase().trim())}\n                    type=\"submit\"\n                  >\n                    Create\n                  </Button>\n                </Input>\n              }\n            />\n          </div>\n          <Divider />\n          {filteredUserAlbumList.length > 0 &&\n            filteredUserAlbumList.map(item => {\n              return (\n                <div\n                  key={`useralbum_${item.id}`}\n                  style={{\n                    height: 70,\n                    justifyContent: \"center\",\n                    alignItems: \"center\"\n                  }}\n                >\n                  <Header\n                    as=\"h4\"\n                    onClick={() => {\n                      this.props.dispatch(\n                        editUserAlbum(\n                          item.id,\n                          item.title,\n                          this.props.selectedImageHashes\n                        )\n                      );\n                      this.props.onRequestClose();\n                    }}\n                    as=\"a\"\n                  >\n                    <SecuredImageJWT\n                      isPublic={this.props.isPublic}\n                      height={50}\n                      width={50}\n                      src={\n                        item.cover_photos[0]\n                          ? serverAddress +\n                            \"/media/square_thumbnails_small/\" +\n                            item.cover_photos[0].image_hash +\n                            \".jpg\"\n                          : \"/thumbnail_placeholder.png\"\n                      }\n                    />\n                    <Header.Content>\n                      {item.title}\n                      <Header.Subheader>\n                        {item.photo_count} Item(s) <br />\n                        {\"Updated \" + moment(item.created_on).fromNow()}\n                      </Header.Subheader>\n                    </Header.Content>\n                  </Header>\n                </div>\n              );\n            })}\n        </div>\n      </Modal>\n    );\n  }\n}\n\nModalAlbumEdit = connect(store => {\n  return {\n    albumsUserList: store.albums.albumsUserList,\n    fetchingAlbumsUserList: store.albums.fetchingAlbumsUserList,\n    fetchedAlbumsUserList: store.albums.fetchedAlbumsUserList\n  };\n})(ModalAlbumEdit);\n\nPhotoListView = connect(store => {\n  return {\n    showSidebar: store.ui.showSidebar,\n    gridType: store.ui.gridType,\n\n    photos: store.photos.photos,\n    fetchingPhotos: store.photos.fetchingPhotos,\n    fetchedPhotos: store.photos.fetchedPhotos,\n\n    photoDetails: store.photos.photoDetails,\n    fetchingPhotoDetail: store.photos.fetchingPhotoDetail,\n    fetchedPhotoDetail: store.photos.fetchedPhotoDetail,\n\n    route: store.routerReducer\n  };\n})(PhotoListView);\n//photosGroupedByDate\n//idx2hash\n//title\n//subtitle\n//titleIconName\n//titleIconColor\n//isPublic\n"
  },
  {
    "path": "src/layouts/SharedFromMe.js",
    "content": "import React, { Component } from \"react\";\nimport {\n  Header,\n  Image,\n  Item,\n  Icon,\n  Grid as SUGrid,\n  Divider,\n  Menu,\n  Loader,\n  Label,\n  Button,\n  Popup\n} from \"semantic-ui-react\";\nimport { fetchPhotosSharedFromMe } from \"../actions/photosActions\";\nimport { fetchPublicUserList } from \"../actions/publicActions\";\nimport { fetchUserAlbumsSharedFromMe, deleteUserAlbum } from \"../actions/albumsActions\";\nimport { connect } from \"react-redux\";\nimport { PhotoListView } from \"./ReusablePhotoListView\";\nimport _ from \"lodash\";\nimport moment from \"moment\";\nimport {\n  TopMenu,\n  SideMenuNarrow,\n  TopMenuPublic,\n  SideMenuNarrowPublic\n} from \"./menubars\";\nimport { Link } from \"react-router-dom\";\nimport { serverAddress } from \"../api_client/apiClient\";\nimport { SecuredImageJWT } from \"../components/SecuredImage\";\nimport { Grid, List, WindowScroller, AutoSizer } from \"react-virtualized\";\nimport {\n  calculateGridCellSize,\n  calculateGridCells,\n  calculateSharedPhotoGridCells,\n  calculateSharedAlbumGridCells\n} from \"../util/gridUtils\";\nimport { ScrollSpeed, SCROLL_DEBOUNCE_DURATION } from \"../util/scrollUtils\";\nimport debounce from \"lodash/debounce\";\n\nvar TOP_MENU_HEIGHT = 45; // don't change this\nvar LEFT_MENU_WIDTH = 85; // don't change this\nconst SPEED_THRESHOLD = 300;\nvar SIDEBAR_WIDTH = 85;\nvar DAY_HEADER_HEIGHT = 70;\n\nexport class SharedFromMe extends Component {\n  state = {\n    activeItem: this.props.match.params.which,\n    entrySquareSize: 200,\n    numEntrySquaresPerRow: 10,\n    photoGridContents: null,\n    albumGridContents: null,\n    isScrollingFast: false,\n    topRowOwner: null\n  };\n\n  constructor(props) {\n    super(props);\n    this.photoGridRef = React.createRef();\n  }\n\n  scrollSpeedHandler = new ScrollSpeed();\n\n  handleScroll = ({ scrollTop }) => {\n    // scrollSpeed represents the number of pixels scrolled since the last scroll event was fired\n    const scrollSpeed = Math.abs(\n      this.scrollSpeedHandler.getScrollSpeed(scrollTop)\n    );\n\n    if (scrollSpeed >= SPEED_THRESHOLD) {\n      this.setState({\n        isScrollingFast: true,\n        scrollTop: scrollTop\n      });\n    }\n\n    // Since this method is debounced, it will only fire once scrolling has stopped for the duration of SCROLL_DEBOUNCE_DURATION\n    this.handleScrollEnd();\n  };\n\n  handleScrollEnd = debounce(() => {\n    const { isScrollingFast } = this.state;\n\n    if (isScrollingFast) {\n      this.setState({\n        isScrollingFast: false\n      });\n    }\n  }, SCROLL_DEBOUNCE_DURATION);\n\n  componentDidMount() {\n    this.props.dispatch(fetchPublicUserList());\n    this.props.dispatch(fetchPhotosSharedFromMe());\n    this.props.dispatch(fetchUserAlbumsSharedFromMe());\n    this.handleResize();\n    window.addEventListener(\"resize\", this.handleResize.bind(this));\n  }\n  handleItemClick = (e, { name }) => this.setState({ activeItem: name });\n\n  static getDerivedStateFromProps(nextProps, prevState) {\n    var photoGridContents = calculateSharedPhotoGridCells(\n      nextProps.photos.photosSharedFromMe,\n      prevState.numEntrySquaresPerRow\n    ).cellContents;\n\n\n    return {\n      activeItem: nextProps.match.params.which,\n      photoGridContents: photoGridContents,\n    };\n  }\n\n  handleResize() {\n    if (this.props.showSidebar) {\n      var columnWidth = window.innerWidth - SIDEBAR_WIDTH - 5 - 5 - 10;\n    } else {\n      var columnWidth = window.innerWidth - 5 - 5 - 10;\n    }\n\n    const { entrySquareSize, numEntrySquaresPerRow } = calculateGridCellSize(\n      columnWidth\n    );\n\n    this.setState({\n      width: window.innerWidth,\n      height: window.innerHeight,\n      entrySquareSize: entrySquareSize,\n      numEntrySquaresPerRow: numEntrySquaresPerRow\n    });\n    if (this.photoGridRef.current) {\n      this.photoGridRef.current.recomputeGridSize();\n    }\n  }\n\n  photoCellRenderer = ({ columnIndex, key, rowIndex, style }) => {\n    var cell = this.state.photoGridContents[rowIndex][columnIndex];\n    if (this.state.photoGridContents[rowIndex][columnIndex]) {\n      // non empty cell\n      const cell = this.state.photoGridContents[rowIndex][columnIndex];\n      if (cell.user_id) {\n        // sharer info header\n        const owner = this.props.pub.publicUserList.filter(\n          e => e.id === cell.user_id\n        )[0];\n        if (owner && owner.last_name.length + owner.first_name.length > 0) {\n          var displayName = owner.first_name + \" \" + owner.last_name;\n        } else if (owner) {\n          var displayName = owner.username;\n        } else {\n          var displayName = cell.user_id;\n        }\n        return (\n          <div\n            key={key}\n            style={{\n              ...style,\n              width: this.state.width,\n              height: DAY_HEADER_HEIGHT,\n              paddingTop: 15,\n              paddingLeft: 5\n            }}\n          >\n            <Header as=\"h3\">\n              <Icon name=\"user circle outline\" />\n              <Header.Content>\n                {displayName}\n                <Header.Subheader>\n                  <Icon name=\"photo\" />\n                  you shared {cell.photos.length} photos\n                </Header.Subheader>\n              </Header.Content>\n            </Header>\n          </div>\n        );\n      } else {\n        // photo cell\n        return (\n          <div key={key} style={{ ...style, padding: 1 }}>\n            {this.state.isScrollingFast ? (\n              <div\n                style={{\n                  margin: 1,\n                  backgroundColor: \"#dddddd\",\n                  width: this.state.entrySquareSize - 2,\n                  height: this.state.entrySquareSize - 2\n                }}\n              />\n            ) : (\n              <SecuredImageJWT\n                width={this.state.entrySquareSize - 2}\n                height={this.state.entrySquareSize - 2}\n                src={\n                  serverAddress +\n                  \"/media/square_thumbnails/\" +\n                  cell.image_hash +\n                  \".jpg\"\n                }\n              />\n            )}\n          </div>\n        );\n      }\n    } else {\n      // empty cell\n      return <div key={key} style={style} />;\n    }\n  };\n\n  albumCellRenderer = ({ columnIndex, key, rowIndex, style }) => {\n    var albumUserIndex =\n      rowIndex * this.state.numEntrySquaresPerRow + columnIndex;\n    if (albumUserIndex < this.props.albumsSharedFromMe.length) {\n      return (\n        <div key={key} style={style}>\n          <div\n            onClick={() => {\n                //todo\n            }}\n            style={{ padding: 5 }}\n          >\n            <SecuredImageJWT\n              label={{ as: 'a', corner: 'left', icon: 'bookmark', color: 'red' }}\n              style={{ display: \"inline-block\" }}\n              as={Link}\n              to={`/useralbum/${this.props.albumsSharedFromMe[albumUserIndex].id}`}\n              width={this.state.entrySquareSize - 10}\n              height={this.state.entrySquareSize - 10}\n              src={\n                serverAddress +\n                \"/media/square_thumbnails/\" +\n                this.props.albumsSharedFromMe[albumUserIndex].cover_photos[0]\n                  .image_hash +\n                \".jpg\"\n              }\n            />\n          </div>\n          <div\n            className=\"personCardName\"\n            style={{ paddingLeft: 15, paddingRight: 15, height: 50 }}\n          >\n            \n            {\n              this.props.albumsSharedFromMe[albumUserIndex].shared_to.length>0 && \n              <Popup \n                style={{padding:10}}\n                size='tiny'\n                position='center right'\n                header='Shared with:'\n                trigger={<Icon name='users'/>}\n                content={\n                  this.props.albumsSharedFromMe[albumUserIndex].shared_to.map(el=>{\n                    return <div><Icon name='user circle'/><b>{el.username}</b></div>\n                  })\n                }/>\n\n            }\n            <b>{this.props.albumsSharedFromMe[albumUserIndex].title}</b> <br />\n            {this.props.albumsSharedFromMe[albumUserIndex].photo_count} Photo(s)\n            {true && (\n              <div\n                className=\"personRemoveButton\"\n                style={{ right: 0, position: \"absolute\" }}\n              >\n                <Popup\n                  wide=\"very\"\n                  hoverable\n                  flowing\n                  trigger={<Icon color=\"grey\" name=\"remove\" />}\n                  content={\n                    <div style={{ textAlign: \"center\" }}>\n                      Are you sure you want to delete{\" \"}\n                      <b>{this.props.albumsSharedFromMe[albumUserIndex].title}</b>?<br />\n                      This action cannot be undone!<br />\n                      <Divider />\n                      <div>\n                        <Button\n                          onClick={() =>\n                            this.props.dispatch(\n                              deleteUserAlbum(\n                                this.props.albumsSharedFromMe[albumUserIndex].id,\n                                this.props.albumsSharedFromMe[albumUserIndex].title\n                              )\n                            )\n                          }\n                          negative\n                        >\n                          Yes\n                        </Button>\n                      </div>\n                    </div>\n                  }\n                  on=\"focus\"\n                  position=\"bottom center\"\n                />\n              </div>\n            )}\n          </div>\n        </div>\n      );\n    } else {\n      return <div key={key} style={style} />;\n    }\n  };\n\n  render() {\n    const { activeItem } = this.state;\n\n    if (activeItem === \"photos\") {\n      var subheader = (\n        <Header.Subheader>\n          {\"   \"}\n          {this.props.photos.photosSharedFromMe.length > 0 &&\n            this.props.photos.photosSharedFromMe\n              .map(el => el.photos.length)\n              .reduce((a, b) => a + b)}{\" \"}\n          {\" \"}photo share(s) with {\" \"}\n          {this.props.photos.photosSharedFromMe.length}{\" \"} user(s) \n        </Header.Subheader>\n      );\n      var totalListHeight = this.state.photoGridContents\n        .map((row, index) => {\n          if (row[0].user_id) {\n            //header row\n            return DAY_HEADER_HEIGHT;\n          } else {\n            //photo row\n            return this.state.entrySquareSize;\n          }\n        })\n        .reduce((a, b) => a + b, 0);\n    } else {\n      var subheader = (\n        <Header.Subheader>\n          You shared{\" \"}\n          {this.props.albums.albumsSharedFromMe.length} albums\n        </Header.Subheader>\n      );\n    }\n    return (\n      <div>\n        <div style={{ height: 60, paddingTop: 10 }}>\n          <Header as=\"h2\">\n            <Icon.Group size=\"big\">\n              <Icon \n                name={activeItem==='photos' ? \"image outline\" :'images outline'}/>\n              <Icon\n                corner\n                name=\"share\"\n                color=\"red\"\n                size='mimi'\n              />\n            </Icon.Group>\n            <Header.Content style={{paddingLeft:10}}>\n              {activeItem === \"photos\" ? \"Photos\" : \"Albums\"} you shared{\" \"}\n              {subheader}\n            </Header.Content>\n          </Header>\n        </div>\n        <div style={{ marginLeft: -5, height: 40 }}>\n          <Menu pointing secondary>\n            <Menu.Item\n              as={Link}\n              to=\"/shared/fromme/photos/\"\n              name=\"photos\"\n              active={activeItem === \"photos\"}\n            >\n              {\"Photos \"} <Loader size=\"mini\" inline />\n            </Menu.Item>\n            <Menu.Item\n              as={Link}\n              to=\"/shared/fromme/albums/\"\n              name=\"albums\"\n              active={activeItem === \"albums\"}\n            >\n              {\"Albums \"} <Loader size=\"mini\" inline />\n            </Menu.Item>\n          </Menu>\n        </div>\n        <div\n          style={{\n            right: 0,\n            top: TOP_MENU_HEIGHT + 60,\n            position: \"fixed\",\n            padding: 5\n          }}\n        >\n          {this.state.topRowOwner && activeItem==='photos' && (\n            <Label basic>Shared to: {this.state.topRowOwner}</Label>\n          )}\n        </div>\n\n        {activeItem === \"photos\" && this.state.photoGridContents.length === 0}\n\n        {activeItem === \"photos\" &&\n          this.props.photos.fetchingPhotosSharedFromMe &&\n          !this.props.photos.fetchedPhotosSharedFromMe && (\n            <Loader active>Loading photos you shared...</Loader>\n          )}\n\n        {activeItem === \"photos\" &&\n          this.state.photoGridContents.length === 0 &&\n          this.props.photos.fetchedPhotosSharedFromMe && (\n            <div>You haven't shared any photos with anyone.</div>\n          )}\n\n        {activeItem === \"photos\" &&\n          this.state.photoGridContents.length > 0 &&\n          this.state.photoGridContents && (\n            <div>\n              <AutoSizer\n                disableHeight\n                style={{ outline: \"none\", padding: 0, margin: 0 }}\n              >\n                {({ width }) => (\n                  <Grid\n                    ref={this.photoGridRef}\n                    onSectionRendered={({ rowStartIndex }) => {\n                      const cell = this.state.photoGridContents[\n                        rowStartIndex\n                      ][0];\n                      if (cell.user_id) {\n                        var sharedTo = cell.photos[0].shared_to.username;\n                      } else {\n                        var sharedTo = cell.shared_to.username;\n                      }\n                      this.setState({ topRowOwner: sharedTo });\n                    }}\n                    style={{ outline: \"none\" }}\n                    disableHeader={false}\n                    onScroll={this.handleScroll}\n                    cellRenderer={this.photoCellRenderer}\n                    columnWidth={this.state.entrySquareSize}\n                    columnCount={this.state.numEntrySquaresPerRow}\n                    height={this.state.height - 45 - 60 - 40}\n                    rowHeight={this.state.entrySquareSize}\n                    rowCount={this.state.photoGridContents.length}\n                    rowHeight={({ index }) => {\n                      if (this.state.photoGridContents[index][0].user_id) {\n                        //header row\n                        return DAY_HEADER_HEIGHT;\n                      } else {\n                        //photo row\n                        return this.state.entrySquareSize;\n                      }\n                    }}\n                    estimatedRowSize={\n                      totalListHeight /\n                      this.state.photoGridContents.length.toFixed(1)\n                    }\n                    width={width}\n                  />\n                )}\n              </AutoSizer>\n            </div>\n          )}\n\n        {activeItem === \"albums\" &&\n          this.props.albums.fetchingAlbumsSharedFromMe &&\n          !this.props.albums.fetchedAlbumsSharedFromMe && (\n            <Loader active>Loading albums shared with you...</Loader>\n          )}\n\n        {activeItem === \"albums\" &&\n          this.props.albums.albumsSharedFromMe.length === 0 &&\n          this.props.albums.fetchedAlbumsSharedFromMe && (\n            <div>You haven't shared any albums yet.</div>\n          )}\n\n        {activeItem === \"albums\" &&\n          this.props.albums.fetchedAlbumsSharedFromMe &&\n          this.props.albums.albumsSharedFromMe.length > 0 && (\n            <div>\n              <AutoSizer\n                disableHeight\n                style={{ outline: \"none\", padding: 0, margin: 0 }}\n              >\n                {({ width }) => (\n                  <Grid\n                    ref={this.photoGridRef}\n                    style={{ outline: \"none\" }}\n                    disableHeader={false}\n                    onScroll={this.handleScroll}\n                    cellRenderer={this.albumCellRenderer}\n                    columnWidth={this.state.entrySquareSize}\n                    columnCount={this.state.numEntrySquaresPerRow}\n                    height={this.state.height - 45 - 60 - 40}\n                    rowHeight={this.state.entrySquareSize+60}\n                    rowCount={Math.ceil(\n                        this.props.albums.albumsSharedFromMe.length /\n                        this.state.numEntrySquaresPerRow.toFixed(1)\n                    )}\n                    width={width}\n                  />\n                )}\n              </AutoSizer>\n            </div>\n          )}\n\n        {false &&\n          activeItem === \"photos\" && (\n            <div style={{ paddingTop: 13, paddingLeft: 10, paddingRight: 10 }}>\n              {this.props.photos.photosSharedFromMe.map((el, idx) => {\n                const owner = this.props.pub.publicUserList.filter(\n                  e => e.id === el.user_id\n                )[0];\n                if (\n                  owner &&\n                  owner.last_name.length + owner.first_name.length > 0\n                ) {\n                  var displayName = owner.first_name + \" \" + owner.last_name;\n                } else if (owner) {\n                  var displayName = owner.username;\n                } else {\n                  var displayName = el.user_id;\n                }\n\n                return (\n                  <div style={{ padding: 10 }}>\n                    <Header>\n                      <Image circular src=\"/unknown_user.jpg\" />\n                      <Header.Content>\n                        {displayName}\n                        <Header.Subheader>\n                          shared {el.photos.length} photos\n                        </Header.Subheader>\n                      </Header.Content>\n                    </Header>\n                    {true && (\n                      <div>\n                        <SUGrid doubling unstackable>\n                          <SUGrid.Row\n                            columns={this.props.ui.gridType === \"dense\" ? 5 : 3}\n                          >\n                            {el.photos\n                              //.slice(\n                              //  0,\n                              //  this.props.ui.gridType === \"dense\" ? 5 : 3\n                              //)\n                              .map(photo => (\n                                <SUGrid.Column>\n                                  <SecuredImageJWT\n                                    src={\n                                      serverAddress +\n                                      \"/media/square_thumbnails/\" +\n                                      photo.image_hash +\n                                      \".jpg\"\n                                    }\n                                  />\n                                </SUGrid.Column>\n                              ))}\n                          </SUGrid.Row>\n                        </SUGrid>\n                      </div>\n                    )}\n                  </div>\n                );\n              })}\n            </div>\n          )}\n        {false &&\n          activeItem === \"albums\" && (\n            <div style={{ paddingTop: 13, paddingLeft: 10, paddingRight: 10 }}>\n              {this.props.albums.albumsSharedFromMe.map((el, idx) => {\n                const owner = this.props.pub.publicUserList.filter(\n                  e => e.id === el.user_id\n                )[0];\n                if (\n                  owner &&\n                  owner.last_name.length + owner.first_name.length > 0\n                ) {\n                  var displayName = owner.first_name + \" \" + owner.last_name;\n                } else if (owner) {\n                  var displayName = owner.username;\n                } else {\n                  var displayName = el.user_id;\n                }\n\n                return (\n                  <div style={{ padding: 10 }}>\n                    <Header>\n                      <Image circular src=\"/unknown_user.jpg\" />\n                      <Header.Content>\n                        {displayName}\n                        <Header.Subheader>\n                          shared {el.albums.length} albums\n                        </Header.Subheader>\n                      </Header.Content>\n                    </Header>\n                    {true && (\n                      <div>\n                        <SUGrid doubling unstackable>\n                          <SUGrid.Row\n                            columns={this.props.ui.gridType === \"dense\" ? 5 : 3}\n                          >\n                            {el.albums\n                              //.slice(\n                              //  0,\n                              //  this.props.ui.gridType === \"dense\" ? 5 : 3\n                              //)\n                              .map(album => (\n                                <SUGrid.Column>\n                                  <SecuredImageJWT\n                                    as={Link}\n                                    to={`/useralbum/${album.id}/`}\n                                    label={{\n                                      as: \"a\",\n                                      corner: \"left\",\n                                      icon: \"bookmark\",\n                                      color: \"red\"\n                                    }}\n                                    src={\n                                      serverAddress +\n                                      \"/media/square_thumbnails/\" +\n                                      album.cover_photos[0].image_hash +\n                                      \".jpg\"\n                                    }\n                                  />\n                                  <div\n                                    style={{\n                                      paddingLeft: 15,\n                                      paddingRight: 15,\n                                      paddingTop: 5\n                                    }}\n                                  >\n                                    <b>{album.title}</b>\n                                    <br />\n                                    {album.photo_count} Photos\n                                  </div>\n                                </SUGrid.Column>\n                              ))}\n                          </SUGrid.Row>\n                        </SUGrid>\n                      </div>\n                    )}\n                  </div>\n                );\n              })}\n            </div>\n          )}\n      </div>\n    );\n  }\n}\n\nSharedFromMe = connect(store => {\n  return {\n    showSidebar: store.ui.showSidebar,\n    pub: store.pub,\n    ui: store.ui,\n    auth: store.auth,\n    photos: store.photos,\n    albums: store.albums,\n    albumsSharedFromMe: store.albums.albumsSharedFromMe\n\n  };\n})(SharedFromMe);\n"
  },
  {
    "path": "src/layouts/SharedToMe.js",
    "content": "import React, { Component } from \"react\";\nimport {\n  Header,\n  Image,\n  Item,\n  Icon,\n  Grid as SUGrid,\n  Divider,\n  Menu,\n  Loader,\n  Label\n} from \"semantic-ui-react\";\nimport { fetchPhotosSharedToMe, fetchPhotosSharedFromMe } from \"../actions/photosActions\";\nimport { fetchPublicUserList } from \"../actions/publicActions\";\nimport { fetchUserAlbumsSharedToMe } from \"../actions/albumsActions\";\nimport { connect } from \"react-redux\";\nimport { PhotoListView } from \"./ReusablePhotoListView\";\nimport _ from \"lodash\";\nimport moment from \"moment\";\nimport {\n  TopMenu,\n  SideMenuNarrow,\n  TopMenuPublic,\n  SideMenuNarrowPublic\n} from \"./menubars\";\nimport { Link } from \"react-router-dom\";\nimport { serverAddress } from \"../api_client/apiClient\";\nimport { SecuredImageJWT } from \"../components/SecuredImage\";\nimport { Grid, List, WindowScroller, AutoSizer } from \"react-virtualized\";\nimport {\n  calculateGridCellSize,\n  calculateGridCells,\n  calculateSharedPhotoGridCells,\n  calculateSharedAlbumGridCells\n} from \"../util/gridUtils\";\nimport { ScrollSpeed, SCROLL_DEBOUNCE_DURATION } from \"../util/scrollUtils\";\nimport debounce from \"lodash/debounce\";\n\nvar TOP_MENU_HEIGHT = 45; // don't change this\nvar LEFT_MENU_WIDTH = 85; // don't change this\nconst SPEED_THRESHOLD = 300;\nvar SIDEBAR_WIDTH = 85;\nvar DAY_HEADER_HEIGHT = 70;\n\nexport class SharedToMe extends Component {\n  state = {\n    activeItem: this.props.match.params.which,\n    entrySquareSize: 200,\n    numEntrySquaresPerRow: 10,\n    photoGridContents: null,\n    albumGridContents: null,\n    isScrollingFast: false,\n    topRowOwner: null,\n  };\n\n  constructor(props) {\n    super(props);\n    this.photoGridRef = React.createRef();\n  }\n\n  scrollSpeedHandler = new ScrollSpeed();\n\n  handleScroll = ({ scrollTop }) => {\n    // scrollSpeed represents the number of pixels scrolled since the last scroll event was fired\n    const scrollSpeed = Math.abs(\n      this.scrollSpeedHandler.getScrollSpeed(scrollTop)\n    );\n\n    if (scrollSpeed >= SPEED_THRESHOLD) {\n      this.setState({\n        isScrollingFast: true,\n        scrollTop: scrollTop\n      });\n    }\n\n    // Since this method is debounced, it will only fire once scrolling has stopped for the duration of SCROLL_DEBOUNCE_DURATION\n    this.handleScrollEnd();\n  };\n\n  handleScrollEnd = debounce(() => {\n    const { isScrollingFast } = this.state;\n\n    if (isScrollingFast) {\n      this.setState({\n        isScrollingFast: false\n      });\n    }\n  }, SCROLL_DEBOUNCE_DURATION);\n\n  componentDidMount() {\n    this.props.dispatch(fetchPublicUserList());\n    this.props.dispatch(fetchPhotosSharedToMe());\n    this.props.dispatch(fetchPhotosSharedFromMe());\n    this.props.dispatch(fetchUserAlbumsSharedToMe());\n    this.handleResize();\n    window.addEventListener(\"resize\", this.handleResize.bind(this));\n  }\n  handleItemClick = (e, { name }) => this.setState({ activeItem: name });\n\n  static getDerivedStateFromProps(nextProps, prevState) {\n    var photoGridContents = calculateSharedPhotoGridCells(\n      nextProps.photos.photosSharedToMe,\n      prevState.numEntrySquaresPerRow\n    ).cellContents;\n\n    const albumGridContents = calculateSharedAlbumGridCells(\n      nextProps.albums.albumsSharedToMe,\n      prevState.numEntrySquaresPerRow\n    ).cellContents;\n\n    return {\n      activeItem: nextProps.match.params.which,\n      photoGridContents: photoGridContents,\n      albumGridContents: albumGridContents\n    };\n  }\n\n  handleResize() {\n    if (this.props.showSidebar) {\n      var columnWidth = window.innerWidth - SIDEBAR_WIDTH - 5 - 5 - 10;\n    } else {\n      var columnWidth = window.innerWidth - 5 - 5 - 10;\n    }\n\n    const { entrySquareSize, numEntrySquaresPerRow } = calculateGridCellSize(\n      columnWidth\n    );\n\n    this.setState({\n      width: window.innerWidth,\n      height: window.innerHeight,\n      entrySquareSize: entrySquareSize,\n      numEntrySquaresPerRow: numEntrySquaresPerRow\n    });\n    if (this.photoGridRef.current) {\n      this.photoGridRef.current.recomputeGridSize();\n    }\n  }\n\n  photoCellRenderer = ({ columnIndex, key, rowIndex, style }) => {\n    var cell = this.state.photoGridContents[rowIndex][columnIndex];\n    if (this.state.photoGridContents[rowIndex][columnIndex]) {\n      // non empty cell\n      const cell = this.state.photoGridContents[rowIndex][columnIndex];\n      if (cell.user_id) {\n        // sharer info header\n        const owner = this.props.pub.publicUserList.filter(\n          e => e.id === cell.user_id\n        )[0];\n        if (owner && owner.last_name.length + owner.first_name.length > 0) {\n          var displayName = owner.first_name + \" \" + owner.last_name;\n        } else if (owner) {\n          var displayName = owner.username;\n        } else {\n          var displayName = cell.user_id;\n        }\n        return (\n          <div\n            key={key}\n            style={{\n              ...style,\n              width: this.state.width,\n              height: DAY_HEADER_HEIGHT,\n              paddingTop: 15,\n              paddingLeft: 5\n            }}\n          >\n            <Header as=\"h3\">\n              <Icon name=\"user circle outline\" />\n              <Header.Content>\n                {displayName}\n                <Header.Subheader>\n                  <Icon name=\"photo\" />\n                  shared {cell.photos.length} photos with you\n                </Header.Subheader>\n              </Header.Content>\n            </Header>\n          </div>\n        );\n      } else {\n        // photo cell\n        return (\n          <div key={key} style={{ ...style, padding: 1 }}>\n            {this.state.isScrollingFast ? (\n              <div\n                style={{\n                  margin: 1,\n                  backgroundColor: \"#dddddd\",\n                  width: this.state.entrySquareSize - 2,\n                  height: this.state.entrySquareSize - 2\n                }}\n              />\n            ) : (\n              <SecuredImageJWT\n                width={this.state.entrySquareSize - 2}\n                height={this.state.entrySquareSize - 2}\n                src={\n                  serverAddress +\n                  \"/media/square_thumbnails/\" +\n                  cell.image_hash +\n                  \".jpg\"\n                }\n              />\n            )}\n          </div>\n        );\n      }\n    } else {\n      // empty cell\n      return <div key={key} style={style} />;\n    }\n  };\n\n  albumCellRenderer = ({ columnIndex, key, rowIndex, style }) => {\n    var cell = this.state.albumGridContents[rowIndex][columnIndex];\n    if (this.state.albumGridContents[rowIndex][columnIndex]) {\n      // non empty cell\n      const cell = this.state.albumGridContents[rowIndex][columnIndex];\n      if (cell.user_id) {\n        // sharer info header\n        const owner = this.props.pub.publicUserList.filter(\n          e => e.id === cell.user_id\n        )[0];\n        if (owner && owner.last_name.length + owner.first_name.length > 0) {\n          var displayName = owner.first_name + \" \" + owner.last_name;\n        } else if (owner) {\n          var displayName = owner.username;\n        } else {\n          var displayName = cell.user_id;\n        }\n        return (\n          <div\n            key={key}\n            style={{\n              ...style,\n              width: this.state.width,\n              height: DAY_HEADER_HEIGHT,\n              paddingTop: 15,\n              paddingLeft: 5\n            }}\n          >\n            <Header as=\"h3\">\n              <Icon name=\"user circle outline\" />\n              <Header.Content>\n                {displayName}\n                <Header.Subheader>\n                  <Icon name=\"images\" />\n                  shared {cell.albums.length} albums with you\n                </Header.Subheader>\n              </Header.Content>\n            </Header>\n          </div>\n        );\n      } else {\n        // photo cell\n        return (\n          <div key={key} style={{ ...style, padding: 1 }}>\n            <SecuredImageJWT\n              label={{\n                as: \"a\",\n                corner: \"left\",\n                icon: \"bookmark\",\n                color: \"red\"\n              }}\n              as={Link}\n              to={`/useralbum/${cell.id}/`}\n              width={this.state.entrySquareSize - 2}\n              height={this.state.entrySquareSize - 2}\n              src={\n                serverAddress +\n                \"/media/square_thumbnails/\" +\n                cell.cover_photos[0].image_hash +\n                \".jpg\"\n              }\n            />\n            <div style={{ height: 40, paddingLeft: 10, paddingTop: 5 }}>\n              <b>{cell.title}</b>\n              <br />\n              {cell.photo_count} photo(s)\n            </div>\n          </div>\n        );\n      }\n    } else {\n      // empty cell\n      return <div key={key} style={style} />;\n    }\n  };\n\n  render() {\n    const { activeItem } = this.state;\n\n    if (activeItem === \"photos\") {\n      var subheader = (\n        <Header.Subheader>\n          {this.props.photos.photosSharedToMe.length} user(s) shared{\" \"}\n          {this.props.photos.photosSharedToMe.length > 0 &&\n            this.props.photos.photosSharedToMe\n              .map(el => el.photos.length)\n              .reduce((a, b) => a + b)}{\" \"}\n          photo(s) with you\n        </Header.Subheader>\n      );\n      var totalListHeight = this.state.photoGridContents\n        .map((row, index) => {\n          if (row[0].user_id) {\n            //header row\n            return DAY_HEADER_HEIGHT;\n          } else {\n            //photo row\n            return this.state.entrySquareSize;\n          }\n        })\n        .reduce((a, b) => a + b, 0);\n    } else {\n      var subheader = (\n        <Header.Subheader>\n          {this.props.albums.albumsSharedToMe.length} user(s) shared{\" \"}\n          {this.props.albums.albumsSharedToMe.length > 0 &&\n            this.props.albums.albumsSharedToMe\n              .map(el => el.albums.length)\n              .reduce((a, b) => a + b)}{\" \"}\n          album(s) with you\n        </Header.Subheader>\n      );\n      var totalListHeight = this.state.albumGridContents\n        .map((row, index) => {\n          if (row[0].user_id) {\n            //header row\n            return DAY_HEADER_HEIGHT;\n          } else {\n            //photo row\n            return this.state.entrySquareSize + 40;\n          }\n        })\n        .reduce((a, b) => a + b, 0);\n    }\n    return (\n      <div>\n        <div style={{ height: 60, paddingTop: 10 }}>\n          <Header as=\"h2\">\n            <Icon.Group size=\"big\">\n              <Icon \n                name={activeItem==='photos' ? \"image outline\" :'images outline'}/>\n              <Icon\n                corner\n                name=\"share\"\n                color=\"green\"\n                size='mimi'\n              />\n            </Icon.Group>\n            <Header.Content style={{paddingLeft:10}}>\n              {activeItem === \"photos\" ? \"Photos\" : \"Albums\"} others shared{\" \"}\n              {subheader}\n            </Header.Content>\n          </Header>\n        </div>\n        <div style={{ marginLeft: -5, height: 40 }}>\n          <Menu pointing secondary>\n            <Menu.Item\n              as={Link}\n              to=\"/shared/tome/photos/\"\n              name=\"photos\"\n              active={activeItem === \"photos\"}\n            >\n              {\"Photos \"} <Loader size=\"mini\" inline />\n            </Menu.Item>\n            <Menu.Item\n              as={Link}\n              to=\"/shared/tome/albums/\"\n              name=\"albums\"\n              active={activeItem === \"albums\"}\n            >\n              {\"Albums \"} <Loader size=\"mini\" inline />\n            </Menu.Item>\n          </Menu>\n        </div>\n        <div\n          style={{\n            right: 0,\n            top: TOP_MENU_HEIGHT + 60,\n            position: \"fixed\",\n            padding: 5\n          }}\n        >\n          {this.state.topRowOwner && <Label basic>Shared by: {this.state.topRowOwner}</Label>}\n        </div>\n\n        {activeItem === \"photos\" && this.state.photoGridContents.length === 0}\n\n        {activeItem === \"photos\" &&\n          this.props.photos.fetchingPhotosSharedToMe &&\n          !this.props.photos.fetchedPhotosSharedToMe && (\n            <Loader active>Loading photos shared with you...</Loader>\n          )}\n\n        {activeItem === \"photos\" &&\n          this.state.photoGridContents.length === 0 &&\n          this.props.photos.fetchedPhotosSharedToMe && (\n            <div>No one has shared any photos with you yet.</div>\n          )}\n\n        {activeItem === \"photos\" &&\n          this.state.photoGridContents.length > 0 &&\n          this.state.photoGridContents && (\n            <div>\n              <AutoSizer\n                disableHeight\n                style={{ outline: \"none\", padding: 0, margin: 0 }}\n              >\n                {({ width }) => (\n                  <Grid\n                    ref={this.photoGridRef}\n                    onSectionRendered={({ rowStartIndex }) => {\n                      const cell = this.state.photoGridContents[rowStartIndex][0]\n                      if (cell.user_id) {\n                        var owner = cell.photos[0].owner.username\n                      } else {\n                        var owner = cell.owner.username\n                      }\n                      this.setState({topRowOwner:owner})\n                    }}\n                    style={{ outline: \"none\" }}\n                    disableHeader={false}\n                    onScroll={this.handleScroll}\n                    cellRenderer={this.photoCellRenderer}\n                    columnWidth={this.state.entrySquareSize}\n                    columnCount={this.state.numEntrySquaresPerRow}\n                    height={this.state.height - 45 - 60 - 40}\n                    rowHeight={this.state.entrySquareSize}\n                    rowCount={this.state.photoGridContents.length}\n                    rowHeight={({ index }) => {\n                      if (this.state.photoGridContents[index][0].user_id) {\n                        //header row\n                        return DAY_HEADER_HEIGHT;\n                      } else {\n                        //photo row\n                        return this.state.entrySquareSize;\n                      }\n                    }}\n                    estimatedRowSize={\n                      totalListHeight /\n                      this.state.photoGridContents.length.toFixed(1)\n                    }\n                    width={width}\n                  />\n                )}\n              </AutoSizer>\n            </div>\n          )}\n\n        {activeItem === \"albums\" &&\n          this.props.albums.fetchingAlbumsSharedToMe &&\n          !this.props.albums.fetchedAlbumsSharedToMe && (\n            <Loader active>Loading albums shared with you...</Loader>\n          )}\n\n        {activeItem === \"albums\" &&\n          this.state.albumGridContents.length === 0 &&\n          this.props.albums.fetchedAlbumsSharedToMe && (\n            <div>No one has shared any albums with you yet.</div>\n          )}\n\n        {activeItem === \"albums\" &&\n          this.props.albums.fetchedAlbumsSharedToMe &&\n          this.state.albumGridContents.length > 0 && (\n            <div>\n              <AutoSizer\n                disableHeight\n                style={{ outline: \"none\", padding: 0, margin: 0 }}\n              >\n                {({ width }) => (\n                  <Grid\n                    ref={this.photoGridRef}\n                    onSectionRendered={({ rowStartIndex }) => {\n                      const cell = this.state.albumGridContents[rowStartIndex][0]\n                      if (cell.user_id) {\n                        var owner = cell.albums[0].owner.username\n                      } else {\n                        var owner = cell.owner.username\n                      }\n                      this.setState({topRowOwner:owner})\n                    }}\n                    style={{ outline: \"none\" }}\n                    disableHeader={false}\n                    onScroll={this.handleScroll}\n                    cellRenderer={this.albumCellRenderer}\n                    columnWidth={this.state.entrySquareSize}\n                    columnCount={this.state.numEntrySquaresPerRow}\n                    height={this.state.height - 45 - 60 - 40}\n                    rowHeight={this.state.entrySquareSize}\n                    rowCount={this.state.albumGridContents.length}\n                    rowHeight={({ index }) => {\n                      if (this.state.albumGridContents[index][0].user_id) {\n                        //header row\n                        return DAY_HEADER_HEIGHT;\n                      } else {\n                        //photo row\n                        return this.state.entrySquareSize + 40;\n                      }\n                    }}\n                    estimatedRowSize={\n                      totalListHeight /\n                      this.state.albumGridContents.length.toFixed(1)\n                    }\n                    width={width}\n                  />\n                )}\n              </AutoSizer>\n            </div>\n          )}\n\n        {false &&\n          activeItem === \"photos\" && (\n            <div style={{ paddingTop: 13, paddingLeft: 10, paddingRight: 10 }}>\n              {this.props.photos.photosSharedToMe.map((el, idx) => {\n                const owner = this.props.pub.publicUserList.filter(\n                  e => e.id === el.user_id\n                )[0];\n                if (\n                  owner &&\n                  owner.last_name.length + owner.first_name.length > 0\n                ) {\n                  var displayName = owner.first_name + \" \" + owner.last_name;\n                } else if (owner) {\n                  var displayName = owner.username;\n                } else {\n                  var displayName = el.user_id;\n                }\n\n                return (\n                  <div style={{ padding: 10 }}>\n                    <Header>\n                      <Image circular src=\"/unknown_user.jpg\" />\n                      <Header.Content>\n                        {displayName}\n                        <Header.Subheader>\n                          shared {el.photos.length} photos\n                        </Header.Subheader>\n                      </Header.Content>\n                    </Header>\n                    {true && (\n                      <div>\n                        <SUGrid doubling unstackable>\n                          <SUGrid.Row\n                            columns={this.props.ui.gridType === \"dense\" ? 5 : 3}\n                          >\n                            {el.photos\n                              //.slice(\n                              //  0,\n                              //  this.props.ui.gridType === \"dense\" ? 5 : 3\n                              //)\n                              .map(photo => (\n                                <SUGrid.Column>\n                                  <SecuredImageJWT\n                                    src={\n                                      serverAddress +\n                                      \"/media/square_thumbnails/\" +\n                                      photo.image_hash +\n                                      \".jpg\"\n                                    }\n                                  />\n                                </SUGrid.Column>\n                              ))}\n                          </SUGrid.Row>\n                        </SUGrid>\n                      </div>\n                    )}\n                  </div>\n                );\n              })}\n            </div>\n          )}\n        {false &&\n          activeItem === \"albums\" && (\n            <div style={{ paddingTop: 13, paddingLeft: 10, paddingRight: 10 }}>\n              {this.props.albums.albumsSharedToMe.map((el, idx) => {\n                const owner = this.props.pub.publicUserList.filter(\n                  e => e.id === el.user_id\n                )[0];\n                if (\n                  owner &&\n                  owner.last_name.length + owner.first_name.length > 0\n                ) {\n                  var displayName = owner.first_name + \" \" + owner.last_name;\n                } else if (owner) {\n                  var displayName = owner.username;\n                } else {\n                  var displayName = el.user_id;\n                }\n\n                return (\n                  <div style={{ padding: 10 }}>\n                    <Header>\n                      <Image circular src=\"/unknown_user.jpg\" />\n                      <Header.Content>\n                        {displayName}\n                        <Header.Subheader>\n                          shared {el.albums.length} albums\n                        </Header.Subheader>\n                      </Header.Content>\n                    </Header>\n                    {true && (\n                      <div>\n                        <SUGrid doubling unstackable>\n                          <SUGrid.Row\n                            columns={this.props.ui.gridType === \"dense\" ? 5 : 3}\n                          >\n                            {el.albums\n                              //.slice(\n                              //  0,\n                              //  this.props.ui.gridType === \"dense\" ? 5 : 3\n                              //)\n                              .map(album => (\n                                <SUGrid.Column>\n                                  <SecuredImageJWT\n                                    as={Link}\n                                    to={`/useralbum/${album.id}/`}\n                                    label={{\n                                      as: \"a\",\n                                      corner: \"left\",\n                                      icon: \"bookmark\",\n                                      color: \"red\"\n                                    }}\n                                    src={\n                                      serverAddress +\n                                      \"/media/square_thumbnails/\" +\n                                      album.cover_photos[0].image_hash +\n                                      \".jpg\"\n                                    }\n                                  />\n                                  <div\n                                    style={{\n                                      paddingLeft: 15,\n                                      paddingRight: 15,\n                                      paddingTop: 5\n                                    }}\n                                  >\n                                    <b>{album.title}</b>\n                                    <br />\n                                    {album.photo_count} Photos\n                                  </div>\n                                </SUGrid.Column>\n                              ))}\n                          </SUGrid.Row>\n                        </SUGrid>\n                      </div>\n                    )}\n                  </div>\n                );\n              })}\n            </div>\n          )}\n      </div>\n    );\n  }\n}\n\nSharedToMe = connect(store => {\n  return {\n    showSidebar: store.ui.showSidebar,\n    pub: store.pub,\n    ui: store.ui,\n    auth: store.auth,\n    photos: store.photos,\n    albums: store.albums\n  };\n})(SharedToMe);\n"
  },
  {
    "path": "src/layouts/SignUpPage.js",
    "content": "import React, { Component } from \"react\";\nimport {\n  Card,\n  Image,\n  Input,\n  Header,\n  Divider,\n  Message,\n  Item,\n  Loader,\n  Dimmer,\n  Rating,\n  Dropdown,\n  Container,\n  Label,\n  Popup,\n  Segment,\n  Button,\n  Icon,\n  Form\n} from \"semantic-ui-react\";\nimport { connect } from \"react-redux\";\n\nimport { login, signup } from \"../actions/authActions\";\nimport * as reducers from \"../reducers\";\n\nimport { push } from \"react-router-redux\";\n\nexport class SignupPage extends Component {\n  constructor(props) {\n    super(props);\n    this.onSubmit = this.onSubmit.bind(this);\n    this.handleServerProtocolChange = this.handleServerProtocolChange.bind(\n      this\n    );\n  }\n\n  state = {\n    username: \"\",\n    password: \"\",\n    firstname:\"\",\n    lastname:\"\",\n    passwordConfirm: \"\",\n    serverAddress: \"\",\n    email: \"\",\n    serverProtocol: \"https://\"\n  };\n\n  handleChange = (e, { name, value }) => this.setState({ [name]: value });\n\n  handleServerProtocolChange = (e, { name, value }) =>\n    this.setState({ serverProtocol: value });\n\n  onSubmit(event) {\n    event.preventDefault();\n    this.props.dispatch(\n      signup(\n        this.state.username.toLowerCase(),\n        this.state.password,\n        this.state.email\n      )\n    );\n    // console.log(this.props);\n    // console.log(this.state.password)\n    // this.props.onSubmit(this.state.username.toLowerCase(), this.state.password);\n  }\n\n  render() {\n\n    const {\n      username,\n      password,\n      firstname,\n      lastname,\n      email,\n      passwordConfirm,\n      serverAddress\n    } = this.state;\n\n    return (\n      <div\n        style={{\n          paddingTop: 150,\n          position: \"fixed\",\n          left: 0,\n          top: 0,\n          width: \"100%\",\n          height: \"100%\",\n          overflowY: \"auto\",\n          // background:\"url('/login_background.jpg')\",\n          backgroundColor: \"#dddddd\",\n          backgroundSize: \"cover\"\n        }}\n      >\n        <div style={{ maxWidth: 500, padding: 20, margin: \"0 auto\" }}>\n          <Header as=\"h3\" textAlign=\"center\">\n            <Image src={\"/logo.png\"} />\n            <Header.Content>Ownphotos</Header.Content>\n          </Header>\n          <Segment attached>\n            <Header>Signup</Header>\n            <Form>\n              <Form.Field>\n                <label>User Name</label>\n                <Form.Input\n                  icon=\"user\"\n                  placeholder=\"Username\"\n                  name=\"username\"\n                  value={username}\n                  onChange={this.handleChange}\n                />\n              </Form.Field>\n              <Form.Field>\n                <label>Email</label>\n                <Form.Input\n                  icon=\"mail\"\n                  placeholder=\"Email\"\n                  name=\"email\"\n                  value={email}\n                  onChange={this.handleChange}\n                />\n              </Form.Field>\n              <Form.Field>\n                <label>First name</label>\n                <Form.Input\n                  placeholder=\"First name\"\n                  name=\"firstname\"\n                  value={firstname}\n                  onChange={this.handleChange}\n                />\n              </Form.Field>\n              <Form.Field>\n                <label>Last name</label>\n                <Form.Input\n                  placeholder=\"Last name\"\n                  name=\"lastname\"\n                  value={lastname}\n                  onChange={this.handleChange}\n                />\n              </Form.Field>\n              <Form.Field>\n                <label>Password</label>\n                <Form.Input\n                  error={\n                    this.state.passwordConfirm.length > 0 &&\n                    this.state.password !== this.state.passwordConfirm\n                  }\n                  icon=\"lock\"\n                  type=\"password\"\n                  placeholder=\"Password\"\n                  name=\"password\"\n                  value={password}\n                  onChange={this.handleChange}\n                />\n                <label>Confirm Password</label>\n                <Form.Input\n                  error={\n                    this.state.passwordConfirm.length > 0 &&\n                    this.state.password !== this.state.passwordConfirm\n                  }\n                  icon=\"lock\"\n                  type=\"password\"\n                  placeholder=\"Confirm password\"\n                  name=\"passwordConfirm\"\n                  value={passwordConfirm}\n                  onChange={this.handleChange}\n                />\n                <Divider />\n              </Form.Field>\n              <Button\n                onClick={() => {\n                  this.props.dispatch(\n                    signup(\n                      this.state.username.toLowerCase(),\n                      this.state.password,\n                      this.state.email,\n                      this.state.firstname,\n                      this.state.lastname\n                    )\n                  );\n                }}\n                disabled={\n                  this.state.password.length === 0 ||\n                  this.state.password !== this.state.passwordConfirm\n                }\n                fluid\n                color=\"blue\"\n              >\n                Sign Up\n              </Button>\n            </Form>\n          </Segment>\n          {this.props.errors &&\n            this.props.errors.non_field_errors && (\n              <Message color=\"red\" secondary attached>\n                {this.props.errors.non_field_errors}\n              </Message>\n            )}\n          {this.props.errors &&\n            this.props.errors.password && (\n              <Message color=\"red\" secondary attached>\n                Password may not be blank!\n              </Message>\n            )}\n          {this.props.errors &&\n            this.props.errors.username && (\n              <Message color=\"red\" secondary attached=\"bottom\">\n                Username may not be blank!\n              </Message>\n            )}\n        </div>\n        <div\n          style={{\n            maxWidth: 400,\n            textAlign: \"center\",\n            paddingTop: \"10%\",\n            margin: \"0 auto\"\n          }}\n        />\n      </div>\n    );\n  }\n}\n\nSignupPage = connect(store => {\n  return {\n    auth: store.auth\n  };\n})(SignupPage);\n"
  },
  {
    "path": "src/layouts/UserManagement.js",
    "content": "import moment from \"moment\";\nimport React, { Component } from \"react\";\nimport Modal from \"react-modal\";\nimport { connect } from \"react-redux\";\nimport SortableTree from \"react-sortable-tree\";\nimport FileExplorerTheme from \"react-sortable-tree-theme-file-explorer\";\nimport { Button, Grid, Header, Icon, Input, Loader, Table } from \"semantic-ui-react\";\nimport { fetchDirectoryTree, fetchUserList, manageUpdateUser} from \"../actions/utilActions\";\n\n\n\n\nconst modalStyles = {\n  content: {\n    top: 150,\n    left: 40,\n    right: 40,\n    height: window.innerHeight - 300,\n\n    overflow: \"hidden\",\n    // paddingRight:0,\n    // paddingBottomt:0,\n    // paddingLeft:10,\n    // paddingTop:10,\n    padding: 0,\n    backgroundColor: \"white\"\n  },\n  overlay: {\n    top: 0,\n    left: 0,\n    right: 0,\n    bottom: 0,\n    position: \"fixed\",\n    borderRadius: 0,\n    border: 0,\n    zIndex: 102,\n    backgroundColor: \"rgba(200,200,200,0.8)\"\n  }\n};\n\nexport class UserManagement extends Component {\n  state = { modalOpen: false, userToEdit: null };\n\n  componentDidMount() {\n    if (this.props.auth.access.is_admin) {\n      this.props.dispatch(fetchUserList());\n      this.props.dispatch(fetchDirectoryTree());\n    }\n  }\n\n  render() {\n    if (!this.props.auth.access.is_admin) {\n      return <div>You have no access</div>;\n    }\n    if (this.props.fetching) {\n      return (\n        <div>\n          <Loader active />\n        </div>\n      );\n    }\n    return (\n      <div style={{padding:10}}>\n        <Header>User Management</Header>\n        <div>\n          <Table compact selectable celled striped>\n            <Table.Header>\n              <Table.HeaderCell>Username</Table.HeaderCell>\n              <Table.HeaderCell>Scan Directory</Table.HeaderCell>\n              <Table.HeaderCell>Photo Count</Table.HeaderCell>\n              <Table.HeaderCell>Last Login</Table.HeaderCell>\n            </Table.Header>\n            <Table.Body>\n              {this.props.userList.map(user => {\n                return (\n                  <Table.Row>\n                    <Table.Cell>{user.username}</Table.Cell>\n                    <Table.Cell warning={!user.scan_directory}>\n                      <Icon\n                        name=\"edit\"\n                        onClick={() => {\n                          this.setState({\n                            userToEdit: user,\n                            modalOpen: true\n                          });\n                        }}\n                      />\n                      {user.scan_directory ? user.scan_directory : \"Not set\"}\n                    </Table.Cell>\n                    <Table.Cell>{user.photo_count}</Table.Cell>\n                    <Table.Cell>\n                      {moment(user.date_joined).fromNow()}\n                    </Table.Cell>\n                  </Table.Row>\n                );\n              })}\n            </Table.Body>\n          </Table>\n        </div>\n        <ModalScanDirectoryEdit\n          onRequestClose={() => {\n            this.setState({ modalOpen: false });\n          }}\n          userToEdit={this.state.userToEdit}\n          isOpen={this.state.modalOpen}\n        />\n      </div>\n    );\n  }\n}\n\nclass ModalScanDirectoryEdit extends Component {\n  constructor(props) {\n    super(props);\n    this.state = { newScanDirectory: \"\", treeData: [] };\n    this.nodeClicked = this.nodeClicked.bind(this);\n    this.inputRef = React.createRef();\n  }\n\n  static getDerivedStateFromProps(nextProps, prevState) {\n    if (prevState.treeData.length === 0) {\n      return { ...prevState, treeData: nextProps.directoryTree };\n    } else {\n      return prevState;\n    }\n  }\n\n  nodeClicked(event, rowInfo) {\n    console.log(rowInfo);\n    this.inputRef.current.inputRef.value = rowInfo.node.absolute_path;\n    this.setState({ newScanDirectory: rowInfo.node.absolute_path });\n  }\n\n  render() {\n    console.log(this.inputRef);\n    return (\n      <Modal\n        ariaHideApp={false}\n        isOpen={this.props.isOpen}\n        onRequestClose={() => {\n          this.props.onRequestClose();\n          this.setState({ newScanDirectory: \"\" });\n        }}\n        style={modalStyles}\n      >\n        <div style={{ padding: 10 }}>\n          <Header as=\"h3\">\n            Set the scan directory for user \"{this.props.userToEdit\n              ? this.props.userToEdit.username\n              : \"...\"}\"\n            <Header.Subheader>\n              When the user \"{this.props.userToEdit\n                ? this.props.userToEdit.username\n                : \"...\"}\" clicks on the 'scan photos' button, photos in the\n              directory that you specify here will be imported under the user's\n              account.\n            </Header.Subheader>\n          </Header>\n        </div>\n        <Grid>\n          <Grid.Row>\n            <Grid.Column>\n              <div style={{ padding: 10 }}>\n                <Header as=\"h5\">User's current directory</Header>\n              </div>\n              <div style={{ padding: 7 }}>\n                <Input\n                  ref={this.inputRef}\n                  type=\"text\"\n                  placeholder={\n                    this.props.userToEdit\n                      ? this.props.userToEdit.scan_directory === \"\"\n                        ? \"not set\"\n                        : this.props.userToEdit.scan_directory\n                      : \"...\"\n                  }\n                  action\n                  fluid\n                >\n                  <input />\n                  <Button\n                    type=\"submit\"\n                    color=\"green\"\n                    onClick={() => {\n                      const newUserData = {\n                        ...this.props.userToEdit,\n                        scan_directory: this.state.newScanDirectory\n                      };\n                      console.log(newUserData);\n                      this.props.dispatch(manageUpdateUser(newUserData));\n                      this.props.onRequestClose()\n                    }}\n                  >\n                    Update\n                  </Button>\n                </Input>\n              </div>\n            </Grid.Column>\n          </Grid.Row>\n          <Grid.Row>\n            <Grid.Column>\n              <div style={{ padding: 10 }}>\n                <Header as=\"h5\">Choose a directory from below</Header>\n              </div>\n              <div\n                style={{\n                  height: 300,\n                  width: \"100%\",\n                  paddingLeft: 7,\n                  paddingTop: 7,\n                  paddingBottom: 7\n                }}\n              >\n                <SortableTree\n                  innerStyle={{ outline: \"none\" }}\n                  canDrag={() => false}\n                  canDrop={() => false}\n                  treeData={this.state.treeData}\n                  onChange={treeData => this.setState({ treeData })}\n                  theme={FileExplorerTheme}\n                  generateNodeProps={rowInfo => {\n                    let nodeProps = {\n                      onClick: event => this.nodeClicked(event, rowInfo)\n                    };\n                    if (this.state.selectedNodeId === rowInfo.node.id) {\n                      nodeProps.className = \"selected-node\";\n                    }\n                    return nodeProps;\n                  }}\n                />\n              </div>\n            </Grid.Column>\n          </Grid.Row>\n        </Grid>\n      </Modal>\n    );\n  }\n}\n\nUserManagement = connect(store => {\n  return {\n    auth: store.auth,\n\n    userList: store.util.userList,\n    fetchingUSerList: store.util.fetchingUserList,\n    fetchedUserList: store.util.fetchedUserList\n  };\n})(UserManagement);\n\nModalScanDirectoryEdit = connect(store => {\n  return {\n    auth: store.auth,\n\n    directoryTree: store.util.directoryTree,\n    fetchingDirectoryTree: store.util.fetchingDirectoryTree,\n    fetchedDirectoryTree: store.util.fetchedDirectoryTree,\n\n    userList: store.util.userList,\n    fetchingUSerList: store.util.fetchingUserList,\n    fetchedUserList: store.util.fetchedUserList\n  };\n})(ModalScanDirectoryEdit);\n"
  },
  {
    "path": "src/layouts/UserPublicPage.js",
    "content": "import React, { Component } from \"react\";\nimport { Header } from \"semantic-ui-react\";\nimport { fetchUserPublicPhotos } from \"../actions/publicActions\";\nimport { connect } from \"react-redux\";\nimport { PhotoListView } from \"./ReusablePhotoListView\";\nimport _ from \"lodash\";\nimport moment from \"moment\";\nimport {\n  TopMenu,\n  SideMenuNarrow,\n  TopMenuPublic,\n  SideMenuNarrowPublic\n} from \"./menubars\";\n\nvar TOP_MENU_HEIGHT = 45; // don't change this\nvar LEFT_MENU_WIDTH = 85; // don't change this\n\nexport class UserPublicPage extends Component {\n  state = {\n    photosGroupedByDate: [],\n    idx2hash: [],\n    username: null\n  };\n\n  componentDidMount() {\n    this.props.dispatch(\n      fetchUserPublicPhotos(this.props.match.params.username)\n    );\n    // this.props.dispatch({ type: \"HIDE_SIDEBAR\" });\n  }\n\n  static getDerivedStateFromProps(nextProps, prevState) {\n    if (\n      nextProps.pub.userPublicPhotos.hasOwnProperty(\n        nextProps.match.params.username\n      )\n    ) {\n      const photos =\n        nextProps.pub.userPublicPhotos[nextProps.match.params.username];\n      if (prevState.idx2hash.length !== photos.length) {\n        var t0 = performance.now();\n        var groupedByDate = _.groupBy(photos, el => {\n          if (el.exif_timestamp) {\n            return moment.utc(el.exif_timestamp).format(\"YYYY-MM-DD\");\n          } else {\n            return \"No Timestamp\";\n          }\n        });\n        var groupedByDateList = _.reverse(\n          _.sortBy(\n            _.toPairsIn(groupedByDate).map(el => {\n              return { date: el[0], photos: el[1] };\n            }),\n            el => el.date\n          )\n        );\n        var idx2hash = [];\n        groupedByDateList.forEach(g => {\n          g.photos.forEach(p => {\n            idx2hash.push(p.image_hash);\n          });\n        });\n        var t1 = performance.now();\n        return {\n          ...prevState,\n          photosGroupedByDate: groupedByDateList,\n          idx2hash: idx2hash,\n          username: nextProps.match.params.username\n        };\n      } else {\n        return null;\n      }\n    } else {\n      return null;\n    }\n  }\n\n  render() {\n    const { fetchingAlbumsUser } = this.props;\n    if (this.props.auth.access) {\n      var menu = (\n        <div>\n          {this.props.ui.showSidebar && <SideMenuNarrow />}\n          <TopMenu />\n        </div>\n      );\n    } else {\n      var menu = (\n        <div>\n          {this.props.ui.showSidebar && <SideMenuNarrowPublic />}\n          <TopMenuPublic />\n        </div>\n      );\n    }\n    return (\n      <div>\n        {menu}\n        <div\n          style={{\n            paddingTop: TOP_MENU_HEIGHT,\n            paddingLeft: this.props.ui.showSidebar ? LEFT_MENU_WIDTH + 5 : 5\n          }}\n        >\n          <PhotoListView\n            title={\n              this.props.auth.access &&\n              this.props.auth.access.name === this.props.match.params.username\n                ? \"Your public photos\"\n                : \"Public photos of \" + this.props.match.params.username\n            }\n            loading={this.props.pub.fetchingUserPublicPhotos}\n            titleIconName={\"globe\"}\n            photosGroupedByDate={this.state.photosGroupedByDate}\n            idx2hash={this.state.idx2hash}\n            isPublic={\n              this.props.auth.access === undefined ||\n              this.props.auth.access.name !== this.props.match.params.username\n            }\n          />\n        </div>\n      </div>\n    );\n  }\n}\nUserPublicPage = connect(store => {\n  return {\n    pub: store.pub,\n    ui: store.ui,\n    auth: store.auth\n  };\n})(UserPublicPage);\n"
  },
  {
    "path": "src/layouts//",
    "content": "import React, {Component} from 'react';\nimport { connect } from \"react-redux\";\nimport {fetchPlaceAlbum, fetchAutoAlbums, generateAutoAlbums} from '../actions/albumsActions'\nimport {Container, Icon, Divider, Header, Image, Button, Flag, Card, Loader} from 'semantic-ui-react'\nimport { fetchPeople, fetchEgoGraph } from '../actions/peopleActions';\nimport { fetchPhotoDetail, fetchNoTimestampPhotoList} from '../actions/photosActions';\n\nimport {Server, serverAddress} from '../api_client/apiClient'\nimport { Grid, List, WindowScroller,AutoSizer } from 'react-virtualized';\nimport {EgoGraph} from '../components/egoGraph'\nimport { push } from 'react-router-redux'\nimport {countryNames} from '../util/countryNames'\nimport {AllPhotosMap, EventMap, LocationClusterMap, LocationMap} from '../components/maps'\nimport {LightBox} from '../components/lightBox'\n\nimport _ from 'lodash'\nimport moment from 'moment'\nimport {PhotoListView} from './ReusablePhotoListView'\n\n\nvar topMenuHeight = 55 // don't change this\nvar ESCAPE_KEY = 27;\nvar ENTER_KEY = 13;\nvar RIGHT_ARROW_KEY = 39;\nvar UP_ARROW_KEY = 38;\nvar LEFT_ARROW_KEY = 37;\nvar DOWN_ARROW_KEY = 40;\n\nvar SIDEBAR_WIDTH = 85;\n\nvar DAY_HEADER_HEIGHT = 70\nvar leftMenuWidth = 85 // don't change this\n\n\n\n\nexport class AlbumPlaceGallery extends Component {\n    state = {\n      photosGroupedByDate: [],\n      idx2hash: [],\n      albumID: null,\n    }\n  \n    componentDidMount() {\n        this.props.dispatch(fetchPlaceAlbum(this.props.match.params.albumID))\n    }\n\n\n    componentDidUpdate() {\n        console.log('component did update')\n        if (this.props.match.params.albumID != this.state.albumID && !this.props.fetchingAlbumsPlace) {\n            this.props.dispatch(fetchPlaceAlbum(this.props.match.params.albumID))\n        }\n    }\n\n  \n  \n  \n    static getDerivedStateFromProps(nextProps,prevState){\n        if (nextProps.albumsPlace.hasOwnProperty(nextProps.match.params.albumID)){\n            const photos = nextProps.albumsPlace[nextProps.match.params.albumID].photos\n            if (prevState.idx2hash.length != photos.length) {\n\n                var t0 = performance.now();\n                var groupedByDate = _.groupBy(photos,(el)=>{\n                    if (el.exif_timestamp) {\n                        return moment(el.exif_timestamp).format('YYYY-MM-DD')\n                    } else {\n                        return \"No Timestamp\"\n                    }\n                })\n                var groupedByDateList = _.reverse(_.sortBy(_.toPairsIn(groupedByDate).map((el)=>{\n                    return {date:el[0],photos:el[1]}\n                }),(el)=>el.date))\n                var idx2hash = []\n                groupedByDateList.forEach((g)=>{\n                    g.photos.forEach((p)=>{\n                        idx2hash.push(p.image_hash)\n                    })\n                })\n                var t1 = performance.now();\n                console.log(t1-t0)\n                return {\n                    ...prevState, \n                    photosGroupedByDate: groupedByDateList,\n                    idx2hash:idx2hash,\n                    albumID:nextProps.match.params.albumID\n                }\n            } else {\n                return null\n            }\n        } else {\n            return null\n        }\n    }\n  \n  \n  \n    render() {\n      const {fetchingAlbumsPlace} = this.props\n      return (\n        <PhotoListView \n          title={this.props.albumsPlace[this.props.match.params.albumID] ? this.props.albumsPlace[this.props.match.params.albumID].title : \"Loading... \"}\n          loading={fetchingAlbumsPlace}\n          titleIconName={'map outline'}\n          photosGroupedByDate={this.state.photosGroupedByDate}\n          idx2hash={this.state.idx2hash}\n        />\n      )  \n    }\n  }\n\n\n\n\n\n\n\n/*\nexport class AlbumPlaceGallery extends Component {\n    state = {\n      photosGroupedByDate: [],\n      idx2hash: [],\n      lightboxImageIndex: 1,\n      lightboxShow:false,\n      width:  window.innerWidth,\n      height: window.innerHeight,\n      entrySquareSize:200,\n      showMap:false,\n      gridHeight: window.innerHeight- topMenuHeight - 60,\n      headerHeight: 60,\n      currTopRenderedRowIdx:0,\n      numEntrySquaresPerRow:2,\n    }\n\n  constructor() {\n    super();\n    this.listRef = React.createRef()\n    this.calculateEntrySquareSize = this.calculateEntrySquareSize.bind(this)\n    this.cellRenderer = this.cellRenderer.bind(this)\n    this.onPhotoClick = this.onPhotoClick.bind(this)\n  }\n\n  componentDidMount() {\n    this.calculateEntrySquareSize();\n    window.addEventListener(\"resize\", this.calculateEntrySquareSize.bind(this));\n    this.props.dispatch(fetchPlaceAlbum(this.props.match.params.albumID))\n  }\n\n  componentWillUnmount() {\n    window.removeEventListener(\"resize\", this.calculateEntrySquareSize.bind(this))\n  }\n\n\n  calculateEntrySquareSize() {\n    if (window.innerWidth < 600) {\n      var numEntrySquaresPerRow = 2\n    } \n    else if (window.innerWidth < 800) {\n      var numEntrySquaresPerRow = 4\n    }\n    else if (window.innerWidth < 1000) {\n      var numEntrySquaresPerRow = 6\n    }\n    else if (window.innerWidth < 1200) {\n      var numEntrySquaresPerRow = 8\n    }\n    else {\n      var numEntrySquaresPerRow = 10\n    }\n\n    var columnWidth = window.innerWidth - SIDEBAR_WIDTH - 5 - 5 - 15\n\n    var entrySquareSize = columnWidth / numEntrySquaresPerRow\n    var numEntrySquaresPerRow = numEntrySquaresPerRow\n    this.setState({\n      width:  window.innerWidth,\n      height: window.innerHeight,\n      entrySquareSize:entrySquareSize,\n      numEntrySquaresPerRow:numEntrySquaresPerRow\n    })\n    if (this.listRef.current) {\n        this.listRef.current.recomputeRowHeights()\n    }\n  }\n\n    onPhotoClick(hash) {\n        this.setState({lightboxImageIndex:this.state.idx2hash.indexOf(hash),lightboxShow:true})\n    }\n\n    static getDerivedStateFromProps(nextProps,prevState){\n      if (nextProps.albumsPlace.hasOwnProperty(nextProps.match.params.albumID)){\n        const photos = nextProps.albumsPlace[nextProps.match.params.albumID].photos\n        if (prevState.idx2hash.length != photos.length) {\n            var groupedByDate = _.groupBy(photos,(el)=>{\n                if (el.exif_timestamp) {\n                    return moment(el.exif_timestamp).format('YYYY-MM-DD')\n                } else {\n                    return \"No Timestamp\"\n                }\n            })\n            console.log(groupedByDate)\n            var groupedByDateList = _.reverse(_.sortBy(_.toPairsIn(groupedByDate).map((el)=>{\n                return {date:el[0],photos:el[1]}\n            }),(el)=>el.date))\n\n            var idx2hash = []\n            groupedByDateList.forEach((g)=>{\n                g.photos.forEach((p)=>{\n                    idx2hash.push(p.image_hash)\n                })\n            })\n\n            console.log(groupedByDateList)\n            return {\n                ...prevState, \n                photosGroupedByDate: groupedByDateList,\n                idx2hash:idx2hash\n            }\n        } else {\n          return null\n        }\n      } else {\n        return null\n      }\n    }\n\n\n    rowRenderer = ({index, isScrolling, key, style}) => {\n        const {isScrollingFast} = this.state;\n        var rowHeight = this.state.entrySquareSize * Math.ceil(this.state.photosGroupedByDate[index].photos.length/this.state.numEntrySquaresPerRow.toFixed(1)) + DAY_HEADER_HEIGHT\n        if (isScrollingFast) {\n            return (\n                <div key={key} style={{...style,height:rowHeight}}>\n                    <div style={{backgroundColor:'white'}}>\n                    <DayGroupPlaceholder\n                        key={index}\n                        onPhotoClick={this.onPhotoClick}\n                        day={this.state.photosGroupedByDate[index]} \n                        itemSize={this.state.entrySquareSize} \n                        numItemsPerRow={this.state.numEntrySquaresPerRow}/>\n                    </div>\n                </div>\n            )\n        }\n        else {\n            return (\n                <div key={key} style={{...style,height:rowHeight}}>\n                    <div style={{backgroundColor:'white'}}>\n                    <DayGroup \n                        key={index}\n                        onPhotoClick={this.onPhotoClick}\n                        day={this.state.photosGroupedByDate[index]} \n                        itemSize={this.state.entrySquareSize} \n                        numItemsPerRow={this.state.numEntrySquaresPerRow}/>\n                    </div>\n                </div>\n            )        }\n    }\n\n    getRowHeight = ({index}) => {\n        var rowHeight = this.state.entrySquareSize * Math.ceil(this.state.photosGroupedByDate[index].photos.length/this.state.numEntrySquaresPerRow.toFixed(1)) + DAY_HEADER_HEIGHT\n        return (\n            rowHeight\n        )\n    }\n\n\n  cellRenderer = ({ columnIndex, key, rowIndex, style }) => {\n      var photoIndex = rowIndex * this.state.numEntrySquaresPerRow + columnIndex\n      if (photoIndex < this.props.albumsPlace[this.props.match.params.albumID].photos.length) {\n      \tvar image_hash = this.props.albumsPlace[this.props.match.params.albumID].photos[photoIndex].image_hash\n        return (\n          <div key={key} style={style}>\n            <div \n              onClick={()=>{\n                this.onPhotoClick(photoIndex)\n                console.log('clicked')\n                // this.props.dispatch(push(`/person/${this.props.albumsPlace[this.props.match.params.albumID][photoIndex].key}`))\n              }}>\n              <Image \n              \theight={this.state.entrySquareSize-5}\n              \twidth={this.state.entrySquareSize-5}\n              \tsrc={serverAddress+'/media/square_thumbnails/'+image_hash+'.jpg'}/>\n\n            </div>\n          </div>\n        )\n      }\n      else {\n        return (\n          <div key={key} style={style}>\n          </div>\n        )\n      }\n  }\n\n  getPhotoDetails(image_hash) {\n      if (!this.props.photoDetails.hasOwnProperty(image_hash)) {\n          this.props.dispatch(fetchPhotoDetail(image_hash))\n      }\n  }\n\n  render() {\n    var entrySquareSize = this.state.entrySquareSize\n    var numEntrySquaresPerRow = this.state.numEntrySquaresPerRow\n    if (this.props.albumsPlace.hasOwnProperty(this.props.match.params.albumID)) {\n      var totalListHeight = this.state.photosGroupedByDate.map((day,index)=>{\n          return (\n              this.getRowHeight({index})\n          )\n      }).reduce((a,b)=>(a+b),0)\n\t    return (\n\t      <div>\n\n          <div style={{position:'fixed',top:topMenuHeight+10,right:10,float:'right'}}>\n            <Button \n              active={this.state.showMap}\n              color='blue'\n              icon labelPosition='right'\n              onClick={()=>{\n                this.setState({\n                  showMap: !this.state.showMap,\n                  gridHeight: !this.state.showMap ? this.state.height - topMenuHeight - 260 : this.state.height - topMenuHeight - 60,\n                  headerHeight: !this.state.showMap ? 260 : 60\n                })}\n              }\n              floated='right'>\n                <Icon name='map' inverted/>{this.state.showMap ? \"Hide Map\" : \"Show Map\"}\n              </Button>\n          </div>\n\n\n\n\t      \t<div style={{height:this.state.headerHeight,paddingTop:10,paddingRight:5}}>\n\n\n            <Header as='h2'>\n              <Icon name='map pin' />\n              <Header.Content>\n                {this.props.albumsPlace[this.props.match.params.albumID].title} \n                {countryNames.includes(this.props.albumsPlace[this.props.match.params.albumID].title.toLowerCase()) && <Flag style={{paddingLeft:10}} name={this.props.albumsPlace[this.props.match.params.albumID].title.toLowerCase()}/>}\n                <Header.Subheader>\n          \t      {this.props.albumsPlace[this.props.match.params.albumID].photos.length} Photos\n                </Header.Subheader>\n              </Header.Content>\n            </Header>\n\n\n          {this.state.showMap && <LocationMap zoom={4} photos={_.sampleSize(this.props.albumsPlace[this.props.match.params.albumID].photos,100)} height={200-20}/>}\n\n\n\t      \t</div>\n                    <List\n                        ref={this.listRef}\n                        style={{outline:'none',paddingRight:0,marginRight:0}}\n                        onRowsRendered={({ overscanStartIndex, overscanStopIndex, startIndex, stopIndex })=>{\n                            this.setState({currTopRenderedRowIdx:startIndex})\n                        }}\n                        height={this.state.gridHeight}\n                        overscanRowCount={5}\n                        rowCount={this.state.photosGroupedByDate.length}\n                        rowHeight={this.getRowHeight}\n                        rowRenderer={this.rowRenderer}\n                        onScroll={this.handleScroll}\n                        estimatedRowSize={totalListHeight/this.state.photosGroupedByDate.length.toFixed(10)}\n                        width={this.state.width-leftMenuWidth-5}/>  \n\n          { this.state.lightboxShow &&\n              <LightBox\n                  idx2hash={this.state.idx2hash}\n                  lightboxImageIndex={this.state.lightboxImageIndex}\n\n                  onCloseRequest={() => this.setState({ lightboxShow: false })}\n                  onImageLoad={()=>{\n                      this.getPhotoDetails(this.state.idx2hash[this.state.lightboxImageIndex])\n                  }}\n                  onMovePrevRequest={() => {\n                      var nextIndex = (this.state.lightboxImageIndex + this.state.idx2hash.length - 1) % this.state.idx2hash.length\n                      this.setState({\n                          lightboxImageIndex:nextIndex\n                      })\n                      this.getPhotoDetails(this.state.idx2hash[nextIndex])\n                  }}\n                  onMoveNextRequest={() => {\n                      var nextIndex = (this.state.lightboxImageIndex + this.state.idx2hash.length + 1) % this.state.idx2hash.length\n                      this.setState({\n                          lightboxImageIndex:nextIndex\n                      })\n                      this.getPhotoDetails(this.state.idx2hash[nextIndex])\n                  }}/>\n          }\n\n\n\n\t\t\t\t</div>\n\t    )\n    }\n    else {\n    \treturn (\n    \t\t<div><Loader active/></div>\n    \t)\n    }\n  }\n}\n*/\n\nAlbumPlaceGallery = connect((store)=>{\n  return {\n    albumsPlace: store.albums.albumsPlace,\n    fetchingAlbumsPlace: store.albums.fetchingAlbumsPlace,\n    fetchedAlbumsPlace: store.albums.fetchedAlbumsPlace,\n    photoDetails: store.photos.photoDetails,\n    fetchingPhotoDetail: store.photos.fetchingPhotoDetail,\n    fetchedPhotoDetail: store.photos.fetchedPhotoDetail,\n  }\n})(AlbumPlaceGallery)\n"
  },
  {
    "path": "src/layouts/albumAuto.js",
    "content": "import React, { Component } from \"react\";\nimport { connect } from \"react-redux\";\nimport {\n  fetchPeopleAlbums,\n  fetchAutoAlbums,\n  fetchAutoAlbumsList\n} from \"../actions/albumsActions\";\nimport {\n  Container,\n  Icon,\n  Header,\n  Button,\n  Card,\n  Loader,\n  Label,\n  Popup,\n  Image,\n  Divider\n} from \"semantic-ui-react\";\nimport {\n  fetchCountStats,\n  fetchPhotoScanStatus,\n  fetchAutoAlbumProcessingStatus\n} from \"../actions/utilActions\";\nimport { Grid, List, WindowScroller, AutoSizer } from \"react-virtualized\";\n\nimport { Server, serverAddress } from \"../api_client/apiClient\";\nimport LazyLoad from \"react-lazyload\";\nimport { AlbumAutoMonths } from \"./albumAutoMonths\";\nimport { AlbumDateMonths } from \"./albumDateMonths\";\n\nimport {\n  fetchUserAlbumsList,\n  fetchThingAlbumsList,\n  deleteUserAlbum\n} from \"../actions/albumsActions\";\nimport { searchPhotos } from \"../actions/searchActions\";\nimport { push } from \"react-router-redux\";\nimport store from \"../store\";\nimport { Link } from \"react-router-dom\";\nimport { SecuredImageJWT } from \"../components/SecuredImage\";\n\nvar topMenuHeight = 45; // don't change this\nvar ESCAPE_KEY = 27;\nvar ENTER_KEY = 13;\nvar RIGHT_ARROW_KEY = 39;\nvar UP_ARROW_KEY = 38;\nvar LEFT_ARROW_KEY = 37;\nvar DOWN_ARROW_KEY = 40;\n\nvar SIDEBAR_WIDTH = 85;\n\nexport class AlbumAuto extends Component {\n  constructor() {\n    super();\n    this.setState({\n      width: window.innerWidth,\n      height: window.innerHeight,\n      entrySquareSize: 200\n    });\n    this.calculateEntrySquareSize = this.calculateEntrySquareSize.bind(this);\n    this.cellRenderer = this.cellRenderer.bind(this);\n  }\n\n  componentWillMount() {\n    this.calculateEntrySquareSize();\n    window.addEventListener(\"resize\", this.calculateEntrySquareSize);\n    if (this.props.albumsAutoList.length === 0) {\n      this.props.dispatch(fetchAutoAlbumsList());\n    }\n  }\n\n  calculateEntrySquareSize() {\n    if (window.innerWidth < 600) {\n      var numEntrySquaresPerRow = 2;\n    } else if (window.innerWidth < 800) {\n      var numEntrySquaresPerRow = 3;\n    } else if (window.innerWidth < 1000) {\n      var numEntrySquaresPerRow = 4;\n    } else if (window.innerWidth < 1200) {\n      var numEntrySquaresPerRow = 5;\n    } else {\n      var numEntrySquaresPerRow = 6;\n    }\n\n    var columnWidth = window.innerWidth - SIDEBAR_WIDTH - 5 - 5 - 15;\n\n    var entrySquareSize = columnWidth / numEntrySquaresPerRow;\n    var numEntrySquaresPerRow = numEntrySquaresPerRow;\n    this.setState({\n      width: window.innerWidth,\n      height: window.innerHeight,\n      entrySquareSize: entrySquareSize,\n      numEntrySquaresPerRow: numEntrySquaresPerRow\n    });\n  }\n\n  cellRenderer = ({ columnIndex, key, rowIndex, style }) => {\n    var albumAutoIndex =\n      rowIndex * this.state.numEntrySquaresPerRow + columnIndex;\n    if (albumAutoIndex < this.props.albumsAutoList.length) {\n      return (\n        <div key={key} style={style}>\n          <div\n            onClick={() => {\n            }}\n            style={{ padding: 5 }}\n          >\n            <SecuredImageJWT\n              label={{ as: 'a', corner: 'left', icon: 'wizard' }}\n              style={{ display: \"inline-block\" }}\n              as={Link}\n              to={`/event/${this.props.albumsAutoList[albumAutoIndex].id}`}\n              width={this.state.entrySquareSize - 10}\n              height={this.state.entrySquareSize - 10}\n              src={\n                serverAddress +\n                \"/media/square_thumbnails/\" +\n                this.props.albumsAutoList[albumAutoIndex].photos[0]+\".jpg\"\n              }\n            />\n          </div>\n          <div\n            className=\"personCardName\"\n            style={{ paddingLeft: 15, paddingRight: 15, height: 50 }}\n          >\n            <b>{this.props.albumsAutoList[albumAutoIndex].title}</b> <br />\n            {this.props.albumsAutoList[albumAutoIndex].photos.length} Photo(s)\n          </div>\n        </div>\n      );\n    } else {\n      return <div key={key} style={style} />;\n    }\n  };\n\n  render() {\n    var entrySquareSize = this.state.entrySquareSize;\n    var numEntrySquaresPerRow = this.state.numEntrySquaresPerRow;\n    return (\n      <div>\n        <div style={{ height: 60, paddingTop: 10 }}>\n          <Header as=\"h2\">\n            <Icon name=\"wizard\" />\n            <Header.Content>\n              Events{\" \"}\n              <Loader\n                size=\"tiny\"\n                inline\n                active={this.props.fetchingAlbumsAutoList}\n              />\n              <Header.Subheader>\n                Showing {this.props.albumsAutoList.length} Auto created albums\n              </Header.Subheader>\n            </Header.Content>\n          </Header>\n        </div>\n\n        <AutoSizer\n          disableHeight\n          style={{ outline: \"none\", padding: 0, margin: 0 }}\n        >\n          {({ width }) => (\n            <Grid\n              style={{ outline: \"none\" }}\n              disableHeader={false}\n              cellRenderer={this.cellRenderer}\n              columnWidth={this.state.entrySquareSize}\n              columnCount={this.state.numEntrySquaresPerRow}\n              height={this.state.height - topMenuHeight - 60}\n              rowHeight={this.state.entrySquareSize + 120}\n              rowCount={Math.ceil(\n                this.props.albumsAutoList.length /\n                  this.state.numEntrySquaresPerRow.toFixed(1)\n              )}\n              width={width}\n            />\n          )}\n        </AutoSizer>\n      </div>\n    );\n  }\n}\n\nexport class EntrySquare extends Component {\n  render() {\n    var images = this.props.cover_photos.map(function(photo) {\n      return (\n        <SecuredImageJWT\n          style={{ display: \"inline-block\" }}\n          width={this.props.size / 2 - 20}\n          height={this.props.size / 2 - 20}\n          src={\n            serverAddress +\n            \"/media/square_thumbnails/\" +\n            photo.image_hash +\n            \".jpg\"\n          }\n        />\n      );\n    }, this);\n    return (\n      <div\n        style={{\n          width: this.props.size,\n          display: \"inline-block\",\n          paddingLeft: 10,\n          paddingRight: 10\n        }}\n        onClick={() => {\n          store.dispatch(searchPhotos(this.props.title));\n          store.dispatch(push(\"/search\"));\n        }}\n      >\n        <div style={{ height: this.props.size }}>\n          <LazyLoad\n            once={true}\n            unmountIfInvisible={true}\n            height={this.props.size}\n          >\n            <Image.Group>{images}</Image.Group>\n          </LazyLoad>\n        </div>\n        <div style={{ height: 100 }}>\n          <b>{this.props.title}</b> ({this.props.photoCount})\n        </div>\n      </div>\n    );\n  }\n}\n\nAlbumAuto = connect(store => {\n  return {\n    auth: store.auth,\n    albumsAutoList: store.albums.albumsAutoList,\n    fetchingAlbumsAutoList: store.albums.fetchingAlbumsAutoList,\n    fetchedAlbumsAutoList: store.albums.fetchedAlbumsAutoList\n  };\n})(AlbumAuto);\n\n\n// import React, { Component } from \"react\";\n// import { connect } from \"react-redux\";\n// import {\n//   fetchPeopleAlbums,\n//   fetchAutoAlbums,\n//   generateAutoAlbums,\n//   fetchAutoAlbumsList\n// } from \"../actions/albumsActions\";\n// import { AlbumAutoCard, AlbumAutoGallery } from \"../components/album\";\n// import {\n//   Container,\n//   Icon,\n//   Header,\n//   Button,\n//   Card,\n//   Label,\n//   Popup\n// } from \"semantic-ui-react\";\n// import {\n//   fetchCountStats,\n//   fetchPhotoScanStatus,\n//   fetchAutoAlbumProcessingStatus\n// } from \"../actions/utilActions\";\n// import { SecuredImageJWT } from \"../components/SecuredImage\";\n\n// import { Server, serverAddress } from \"../api_client/apiClient\";\n\n// export class AlbumAuto extends Component {\n//   componentWillMount() {\n//     this.props.dispatch(fetchAutoAlbumsList());\n//     var _dispatch = this.props.dispatch;\n//     var intervalId = setInterval(function() {\n//       _dispatch(fetchPhotoScanStatus());\n//       _dispatch(fetchAutoAlbumProcessingStatus());\n//     }, 2000);\n//     this.setState({ intervalId: intervalId });\n//   }\n\n//   componentWillUnmount() {\n//     clearInterval(this.state.intervalId);\n//   }\n\n//   handleAutoAlbumGen = e => this.props.dispatch(generateAutoAlbums());\n\n//   render() {\n//     if (this.props.fetchedAlbumsAutoList) {\n//       var match = this.props.match;\n//       var mappedAlbumCards = this.props.albumsAutoList.map(function(album) {\n//         var albumTitle = album.title;\n//         var albumDate = album.timestamp.split(\"T\")[0];\n//         try {\n//           var albumCoverURL = album.cover_photo_url;\n//         } catch (err) {\n//           console.log(err);\n//           var albumCoverURL = null;\n//         }\n//         return (\n//           <AlbumAutoCard\n//             match={match}\n//             key={\"album-auto-\" + album.id}\n//             albumTitle={albumTitle}\n//             timestamp={albumDate}\n//             people={album.people}\n//             album_id={album.id}\n//             albumCoverURL={serverAddress + albumCoverURL}\n//             photoCount={album.photo_count}\n//           />\n//         );\n//       });\n//     } else {\n//       var mappedAlbumCards = null;\n//     }\n\n//     return (\n//       <div>\n//         <Card.Group stackable itemsPerRow={this.props.itemsPerRow}>\n//           {mappedAlbumCards}\n//         </Card.Group>\n//       </div>\n//     );\n//   }\n// }\n\n// AlbumAuto = connect(store => {\n//   return {\n//     albumsAuto: store.albums.albumsAuto,\n//     fetchingAlbumsAuto: store.albums.fetchingAlbumsAuto,\n//     fetchedAlbumsAuto: store.albums.fetchedAlbumsAuto,\n\n//     albumsAutoList: store.albums.albumsAutoList,\n//     fetchingAlbumsAutoList: store.albums.fetchingAlbumsAutoList,\n//     fetchedAlbumsAutoList: store.albums.fetchedAlbumsAutoList,\n\n//     generatingAlbumsAuto: store.albums.generatingAlbumsAuto,\n//     generatedAlbumsAuto: store.albums.generatedAlbumsAuto,\n//     statusAutoAlbumProcessing: store.util.statusAutoAlbumProcessing,\n//     statusPhotoScan: store.util.statusPhotoScan,\n//     scanningPhotos: store.photos.scanningPhotos\n//   };\n// })(AlbumAuto);\n"
  },
  {
    "path": "src/layouts/albumAutoGalleryView.js",
    "content": "import React, { Component } from \"react\";\nimport {\n  Card,\n  Header,\n  Divider,\n  Item,\n  Loader,\n  Dimmer,\n  Breadcrumb,\n  Image,\n  Container,\n  Label,\n  Popup,\n  Segment,\n  Button,\n  Icon\n} from \"semantic-ui-react\";\nimport Gallery from \"react-grid-gallery\";\nimport VisibilitySensor from \"react-visibility-sensor\";\nimport { connect } from \"react-redux\";\n// import {Image} from '../components/authenticatedImage'\nimport { BrowserRouter as Router, Route, Link } from \"react-router-dom\";\nimport {\n  fetchPeopleAlbums,\n  fetchAutoAlbums,\n  generateAutoAlbums,\n  fetchAlbumsAutoGalleries\n} from \"../actions/albumsActions\";\nimport { Map, TileLayer, Marker } from \"react-leaflet\";\nimport { Server, serverAddress } from \"../api_client/apiClient\";\nimport {\n  fetchPhotoDetail,\n  fetchNoTimestampPhotoList\n} from \"../actions/photosActions\";\n\nimport * as moment from \"moment\";\nimport _ from \"lodash\";\nimport { push } from \"react-router-redux\";\nimport LazyLoad from \"react-lazyload\";\nimport { SecuredImageJWT } from \"../components/SecuredImage\";\n\nimport { Grid, List, WindowScroller, AutoSizer } from \"react-virtualized\";\nimport { LightBox } from \"../components/lightBox\";\n\nvar topMenuHeight = 45; // don't change this\nvar ESCAPE_KEY = 27;\nvar ENTER_KEY = 13;\nvar RIGHT_ARROW_KEY = 39;\nvar UP_ARROW_KEY = 38;\nvar LEFT_ARROW_KEY = 37;\nvar DOWN_ARROW_KEY = 40;\n\nvar SIDEBAR_WIDTH = 85;\n\nconst colors = [\n  \"red\",\n  \"orange\",\n  \"yellow\",\n  \"olive\",\n  \"green\",\n  \"teal\",\n  \"blue\",\n  \"violet\",\n  \"purple\",\n  \"pink\",\n  \"brown\",\n  \"grey\",\n  \"black\"\n];\n\nexport class AlbumLocationMap extends Component {\n  render() {\n    var photosWithGPS = this.props.photos.filter(function(photo) {\n      if (photo.exif_gps_lon !== null && photo.exif_gps_lon) {\n        return true;\n      } else {\n        return false;\n      }\n    });\n\n    var sum_lat = 0;\n    var sum_lon = 0;\n    for (var i = 0; i < photosWithGPS.length; i++) {\n      sum_lat += parseFloat(photosWithGPS[i].exif_gps_lat);\n      sum_lon += parseFloat(photosWithGPS[i].exif_gps_lon);\n    }\n    var avg_lat = sum_lat / photosWithGPS.length;\n    var avg_lon = sum_lon / photosWithGPS.length;\n\n    var markers = photosWithGPS.map(function(photo, idx) {\n      return (\n        <Marker\n          key={\"marker-\" + photo.id + \"-\" + idx}\n          position={[photo.exif_gps_lat, photo.exif_gps_lon]}\n        />\n      );\n    });\n    if (photosWithGPS.length > 0) {\n      return (\n        <div style={{ padding: 0 }}>\n          <Map center={[avg_lat, avg_lon]} zoom={6}>\n            <TileLayer\n              attribution=\"&copy; <a href=&quot;http://osm.org/copyright&quot;>OpenStreetMap</a> contributors\"\n              url=\"http://{s}.tile.osm.org/{z}/{x}/{y}.png\"\n            />\n            {markers}\n          </Map>\n        </div>\n      );\n    } else {\n      return <div />;\n    }\n  }\n}\n\n/*******************************************************************************\nAUTO GENERATED EVENT ALBUM\n*******************************************************************************/\n\nexport class AlbumAutoGalleryView extends Component {\n  state = {\n    idx2hash: [],\n    lightboxImageIndex: 0,\n    lightboxShow: false,\n    headerHeight: 80,\n    width: window.innerWidth,\n    height: window.innerHeight,\n    showMap: false,\n    entrySquareSize: 200,\n    gridHeight: window.innerHeight - topMenuHeight - 60\n  };\n\n  constructor(props) {\n    super(props);\n    this.onPhotoClick = this.onPhotoClick.bind(this);\n  }\n\n  componentWillMount() {\n    this.props.dispatch(\n      fetchAlbumsAutoGalleries(this.props.match.params.albumID)\n    );\n    this.calculateEntrySquareSize();\n    window.addEventListener(\"resize\", this.calculateEntrySquareSize.bind(this));\n  }\n\n  calculateEntrySquareSize() {\n    if (window.innerWidth < 600) {\n      var numEntrySquaresPerRow = 2;\n    } else if (window.innerWidth < 800) {\n      var numEntrySquaresPerRow = 4;\n    } else if (window.innerWidth < 1000) {\n      var numEntrySquaresPerRow = 6;\n    } else if (window.innerWidth < 1200) {\n      var numEntrySquaresPerRow = 8;\n    } else {\n      var numEntrySquaresPerRow = 10;\n    }\n\n    var columnWidth = window.innerWidth - SIDEBAR_WIDTH - 20;\n\n    var entrySquareSize = columnWidth / numEntrySquaresPerRow;\n    var numEntrySquaresPerRow = numEntrySquaresPerRow;\n    this.setState({\n      width: window.innerWidth,\n      height: window.innerHeight,\n      entrySquareSize: entrySquareSize,\n      numEntrySquaresPerRow: numEntrySquaresPerRow\n    });\n  }\n\n  // componentWillReceiveProps(nextProps){\n  //   console.log('componen receiving props')\n  //   var albumID = nextProps.match.params.albumID\n  //   if (nextProps.albumsAutoGalleries.hasOwnProperty(albumID) && !nextProps.fetchingAlbumsAutoGalleries && this.state.idx2hash.length==0) {\n  //       var album = nextProps.albumsAutoGalleries[nextProps.match.params.albumID]\n  //       var photos = _.sortBy(album.photos,'exif_timestamp')\n  //       var idx2hash = album.photos.map((el)=>el.image_hash)\n  //       console.log(idx2hash)\n  //       this.setState({idx2hash:idx2hash})\n  //   }\n  // }\n\n  onPhotoClick(image_hash) {\n    // var album = this.props.albumsAutoGalleries[this.props.match.params.albumID]\n    // var photos = _.sortBy(album.photos,'exif_timestamp')\n\n    // // if (this.state.idx2hash.length != this.props.albumsAutoGalleries[this.props.match.params.albumID].photos.length) {\n    // if (this.state.idx2hash.length == 0) {\n    //     this.setState({idx2hash:this.props.albumsAutoGalleries[this.props.match.params.albumID].photos.map((el)=>el.image_hash)})\n    // }\n    this.setState({\n      lightboxImageIndex: this.state.idx2hash.indexOf(image_hash),\n      lightboxShow: true\n    });\n  }\n\n  cellRenderer = ({ columnIndex, key, rowIndex, style }) => {\n    var photoIndex = rowIndex * this.state.numEntrySquaresPerRow + columnIndex;\n    if (\n      photoIndex <\n      this.props.albumsAutoGalleries[this.props.match.params.albumID].photos\n        .length\n    ) {\n      var image_hash = this.props.albumsAutoGalleries[\n        this.props.match.params.albumID\n      ].photos[photoIndex].image_hash;\n      return (\n        <div key={key} style={style}>\n          <div\n            onClick={() => {\n              this.onPhotoClick(photoIndex);\n              // this.props.dispatch(push(`/person/${this.props.albumsPlace[this.props.match.params.albumID][photoIndex].key}`))\n            }}\n          >\n            <SecuredImageJWT\n              height={this.state.entrySquareSize - 5}\n              width={this.state.entrySquareSize - 5}\n              src={\n                serverAddress +\n                \"/media/square_thumbnails/\" +\n                image_hash +\n                \".jpg\"\n              }\n            />\n          </div>\n        </div>\n      );\n    } else {\n      return <div key={key} style={style} />;\n    }\n  };\n\n  getPhotoDetails(image_hash) {\n    if (!this.props.photoDetails.hasOwnProperty(image_hash)) {\n      this.props.dispatch(fetchPhotoDetail(image_hash));\n    }\n  }\n\n  render() {\n    var entrySquareSize = this.state.entrySquareSize;\n    var numEntrySquaresPerRow = this.state.numEntrySquaresPerRow;\n    var albumID = this.props.match.params.albumID;\n    if (\n      this.props.albumsAutoGalleries.hasOwnProperty(albumID) &&\n      !this.props.fetchingAlbumsAutoGalleries\n    ) {\n      var album = this.props.albumsAutoGalleries[\n        this.props.match.params.albumID\n      ];\n      var photos = _.sortBy(album.photos, \"exif_timestamp\").map((el, idx) => {\n        return { ...el, idx: idx };\n      });\n      var idx2hash = _\n        .sortBy(album.photos, \"exif_timestamp\")\n        .map((el, idx) => el.image_hash);\n      var byDate = _.groupBy(\n        _.sortBy(photos, \"exif_timestamp\"),\n        photo => photo.exif_timestamp.split(\"T\")[0]\n      );\n      return (\n        <div>\n          <div style={{ paddingTop: 10, paddingRight: 5 }}>\n            <Header as=\"h2\">\n              <Icon name=\"wizard\" />\n              <Header.Content>\n                {album.title}\n                <Header.Subheader>\n                  <Icon name=\"photo\" /> {album.photos.length} Photos <br />\n                  <Icon name=\"calendar outline\" />{\" \"}\n                  <b>\n                    {moment(album.photos[0].exif_timestamp).format(\n                      \"MMMM Do YYYY\"\n                    )}\n                  </b>{\" \"}\n                  -\n                  <b>\n                    {moment(\n                      album.photos[album.photos.length - 1].exif_timestamp\n                    ).format(\" MMMM Do YYYY\")}\n                  </b>\n                </Header.Subheader>\n              </Header.Content>\n            </Header>\n          </div>\n\n          <div\n            style={{\n              position: \"fixed\",\n              top: topMenuHeight + 10,\n              right: 10,\n              float: \"right\",\n              zIndex: 1000\n            }}\n          >\n            <Button\n              active={this.state.showMap}\n              color=\"blue\"\n              icon\n              labelPosition=\"right\"\n              onClick={() => {\n                this.setState({\n                  showMap: !this.state.showMap\n                });\n              }}\n              floated=\"right\"\n            >\n              <Icon name=\"map\" inverted />\n              {this.state.showMap ? \"Hide Maps\" : \"Show Maps\"}\n            </Button>\n          </div>\n\n          <Divider hidden />\n\n          <div>\n            {album.people.length > 0 && (\n              <div>\n                <Header as=\"h3\">\n                  <Icon name=\"users\" /> People\n                </Header>\n\n                <Label.Group circular>\n                  {album.people.map((person, idx) => (\n                    <Label\n                      as={Link}\n                      to={`/person/${person.id}`}\n                      color={colors[idx % album.people.length]}\n                    >\n                      <SecuredImageJWT\n                        avatar\n                        spaced=\"right\"\n                        src={serverAddress + person.face_url}\n                      />\n                      <b>{person.name}</b>\n                    </Label>\n                  ))}\n                </Label.Group>\n              </div>\n            )}\n\n            <div>\n              {_.toPairs(byDate).map((v, i) => {\n                var locations = v[1]\n                  .filter(\n                    photo => (photo.geolocation_json.features ? true : false)\n                  )\n                  .map(photo => {\n                    if (photo.geolocation_json.features) {\n                      return photo.geolocation_json.features[\n                        photo.geolocation_json.features.length - 3\n                      ].text;\n                    }\n                  });\n                return (\n                  <div>\n                    <Divider hidden />\n\n                    <Header>\n                      <Icon name=\"calendar outline\" />\n                      <Header.Content>\n                        {`Day ${i + 1} - ` +\n                          moment(v[0]).format(\"MMMM Do YYYY\")}\n                        <Header.Subheader>\n                          <Breadcrumb\n                            divider={<Icon name=\"right chevron\" />}\n                            sections={_.uniq(locations).map(e => {\n                              return { key: e, content: e };\n                            })}\n                          />\n                        </Header.Subheader>\n                      </Header.Content>\n                    </Header>\n\n                    {locations.length > 0 &&\n                      this.state.showMap && (\n                        <div\n                          style={{\n                            margin: \"auto\",\n                            paddingLeft: 3,\n                            paddingRight: 2.5,\n                            paddingTop: 10,\n                            paddingBottom: 5\n                          }}\n                        >\n                          <AlbumLocationMap photos={v[1]} />\n                        </div>\n                      )}\n\n                    {v[1].map(photo => (\n                      <div style={{ display: \"inline-block\" }}>\n                        <LazyLoad\n                          height={this.state.entrySquareSize}\n                          placeholder={\n                            <Image\n                              style={{ paddingLeft: 2.5, paddingRight: 2.5 }}\n                              height={this.state.entrySquareSize}\n                              width={this.state.entrySquareSize}\n                              src={\"/thumbnail_placeholder.png\"}\n                            />\n                          }\n                        >\n                          <SecuredImageJWT\n                            onClick={() =>\n                              this.setState({\n                                lightboxImageIndex: idx2hash.indexOf(\n                                  photo.image_hash\n                                ),\n                                lightboxShow: true\n                              })\n                            }\n                            style={{ paddingLeft: 2.5, paddingRight: 2.5 }}\n                            height={this.state.entrySquareSize}\n                            width={this.state.entrySquareSize}\n                            src={serverAddress + photo.square_thumbnail_url}\n                          />\n                        </LazyLoad>\n                      </div>\n                    ))}\n                  </div>\n                );\n              })}\n            </div>\n          </div>\n\n          {this.state.lightboxShow && (\n            <LightBox\n              idx2hash={idx2hash}\n              lightboxImageIndex={this.state.lightboxImageIndex}\n              onCloseRequest={() => this.setState({ lightboxShow: false })}\n              onImageLoad={() => {\n                this.getPhotoDetails(idx2hash[this.state.lightboxImageIndex]);\n              }}\n              onMovePrevRequest={() => {\n                var nextIndex =\n                  (this.state.lightboxImageIndex + idx2hash.length - 1) %\n                  idx2hash.length;\n                this.setState({\n                  lightboxImageIndex: nextIndex\n                });\n                this.getPhotoDetails(idx2hash[nextIndex]);\n              }}\n              onMoveNextRequest={() => {\n                var nextIndex =\n                  (this.state.lightboxImageIndex + idx2hash.length + 1) %\n                  idx2hash.length;\n                this.setState({\n                  lightboxImageIndex: nextIndex\n                });\n                this.getPhotoDetails(idx2hash[nextIndex]);\n              }}\n            />\n          )}\n        </div>\n      );\n    } else {\n      return (\n        <div>\n          <Dimmer active>\n            <Loader active />\n          </Dimmer>\n        </div>\n      );\n    }\n  }\n}\n\nAlbumAutoGalleryView = connect(store => {\n  return {\n    fetchingAlbumsAutoGalleries: store.albums.fetchingAlbumsAutoGalleries,\n    fetchedAlbumsAutoGalleries: store.albums.fetchedAlbumsAutoGalleries,\n    albumsAutoGalleries: store.albums.albumsAutoGalleries,\n    photoDetails: store.photos.photoDetails,\n    fetchingPhotoDetail: store.photos.fetchingPhotoDetail,\n    fetchedPhotoDetail: store.photos.fetchedPhotoDetail\n  };\n})(AlbumAutoGalleryView);\n\n/*\n\nexport class AlbumAutoGalleryView extends Component {\n  componentWillMount() {\n    this.props.dispatch(fetchAlbumsAutoGalleries(this.props.match.params.albumID))\n  }\n\n  render() {\n    console.log(this.props)\n    var albumID = this.props.match.params.albumID\n    console.log('property exists',this.props.albumsAutoGalleries.hasOwnProperty(albumID))\n    console.log('the property',this.props.albumsAutoGalleries[albumID])\n    if (this.props.albumsAutoGalleries.hasOwnProperty(albumID) && !this.props.fetchingAlbumsAutoGalleries) {\n      var mappedRenderablePhotoArray = this.props.albumsAutoGalleries[albumID].photos.map(function(photo){\n        return ({\n          src: serverAddress+photo.image_url,\n          thumbnail: serverAddress+photo.thumbnail_url,\n          thumbnailWidth:photo.thumbnail_width,\n          thumbnailHeight:photo.thumbnail_height,\n        });\n      });\n\n      var mappedPeopleIcons = this.props.albumsAutoGalleries[albumID].people.map(function(person){\n        return (\n          <Label key={'gallery-person-icon-'+albumID+'-'+person.id} image>\n            <img src={serverAddress+person.face_url}/>\n            {person.name}\n          </Label>\n        )\n      })\n\n      var renderable = (\n        <div style={{\n            display: \"block\",\n            minHeight: \"1px\",\n            width: \"100%\",\n            border: \"0px solid #ddd\",\n            overflow: \"hidden\"}}>\n          <AlbumLocationMap photos={this.props.albumsAutoGalleries[albumID].photos}/>\n\n        <Header  as='h2' textAlign='center'>\n          <Header.Content>\n            {this.props.albumsAutoGalleries[albumID].title}\n            <Header.Subheader>{this.props.albumsAutoGalleries[albumID].photos.length} Photos</Header.Subheader>\n            {mappedPeopleIcons}\n          </Header.Content>\n        </Header>\n\n\n\n          <Divider/>\n          <Gallery \n            images={mappedRenderablePhotoArray}\n            enableImageSelection={false}\n            rowHeight={250}/>\n        </div>\n      )\n    }\n    else {\n      var renderable = (\n        <div>\n          <Dimmer active>\n            <Loader active/>\n          </Dimmer>\n        </div>\n      )\n    }\n    return (\n      <div>\n      {renderable}\n      </div>\n    )\n  }\n}\n\n*/\n"
  },
  {
    "path": "src/layouts/albumAutoMonths.js",
    "content": "import React, {Component} from 'react';\nimport { connect } from \"react-redux\";\nimport {fetchPeopleAlbums, fetchAutoAlbums, generateAutoAlbums, fetchAutoAlbumsList} from '../actions/albumsActions'\nimport {AlbumAutoCard, AlbumAutoCardPlain, AlbumAutoCardPlainPlaceholder, AlbumAutoGallery} from '../components/album'\nimport {Container, Icon, Header, Button, Card, Label, Popup, Divider} from 'semantic-ui-react'\nimport {fetchCountStats,fetchPhotoScanStatus,\n        fetchAutoAlbumProcessingStatus} from '../actions/utilActions'\n\nimport {Server, serverAddress} from '../api_client/apiClient'\nimport LazyLoad from 'react-lazyload';\n\n\nexport class AlbumAutoMonthCards extends Component {\n  render() {\n\n      var match = this.props.match\n      var month = this.props.month\n      var mappedAlbumCards = this.props.albums.map(function(album){\n        var albumTitle = album.title\n        var albumDate = album.timestamp.split('T')[0]\n        try {\n          var albumCoverURL = album.cover_photo_url\n        }\n        catch(err) {\n          console.log(err)\n          var albumCoverURL = null\n        }\n        return (\n          <LazyLoad height={360} placeholder={<AlbumAutoCardPlainPlaceholder/>}>\n            <AlbumAutoCardPlain album={album}/>\n          </LazyLoad>\n        )\n      })\n\n\n    return (\n      <div style={{paddingTop:'20px'}}>\n        <Header dividing as='h2'>\n          <Header.Content>\n            {this.props.month}\n            <Header.Subheader>{this.props.albums.length} Events</Header.Subheader>\n          </Header.Content>\n        </Header>\n        <div>\n          <Card.Group stackable itemsPerRow={5}>\n          {mappedAlbumCards}\n          </Card.Group>\n        </div>\n      </div>\n    )\n  }\n}\n\n\n\nexport class AlbumAutoMonths extends Component {\n  constructor(props){\n    super(props)\n    this.groupEventsByMonth.bind(this)\n  }\n\n  componentWillMount() {\n    this.props.dispatch(fetchAutoAlbumsList())\n    var _dispatch = this.props.dispatch\n    /*\n    var intervalId = setInterval(function(){\n        _dispatch(fetchPhotoScanStatus())\n        _dispatch(fetchAutoAlbumProcessingStatus())\n      },2000\n    )\n    this.setState({intervalId:intervalId})\n    */\n  }\n\n  componentWillUnmount() {\n    //clearInterval(this.state.intervalId)\n  }\n\n  shouldComponentUpdate(nextProps, nextState){\n    console.log('should component update?')\n    if (nextProps.albumsAutoList === this.props.albumsAutoList) {\n      console.log('no')\n      return false\n    }\n    else {\n      console.log('yes')\n      return true\n    }\n  }\n\n\n  handleAutoAlbumGen = e => this.props.dispatch(generateAutoAlbums())\n\n  groupEventsByMonth() {\n    var allMonths = this.props.albumsAutoList.map(function(album){\n      var yearMonthDate = album.timestamp.split('T')[0]\n      var yearMonth = yearMonthDate.split('-').slice(0,2).join('-')\n      return yearMonth\n    })\n\n    var months = new Set(allMonths)\n    months = [...months]\n    var eventsByMonth = {}\n    months.map(function(month){\n      eventsByMonth[month] = []\n    })\n    this.props.albumsAutoList.map(function(album){\n      var yearMonthDate = album.timestamp.split('T')[0]\n      var yearMonth = yearMonthDate.split('-').slice(0,2).join('-')\n      eventsByMonth[yearMonth].push(album)\n    })\n    console.log(eventsByMonth)\n    return eventsByMonth\n  }\n\n  render() {\n    var eventsByMonth = this.groupEventsByMonth()\n    if (this.props.fetchedAlbumsAutoList) {\n      var match = this.props.match\n      var eventsByMonthCardGroups = []\n      for (var month in eventsByMonth) {\n        if (eventsByMonth.hasOwnProperty(month)) {\n          var cardsMonth = (\n            <AlbumAutoMonthCards key={month} month={month} albums={eventsByMonth[month]}/>\n          )\n          eventsByMonthCardGroups.push(cardsMonth)\n        }\n      }\n      console.log(eventsByMonthCardGroups)\n\n\n    }\n    else {\n      var eventsByMonthCardGroups = null\n    }\n\n\n    return (\n      <Container fluid>\n\n        {eventsByMonthCardGroups}\n      </Container>\n    )\n  }\n}\n\n\n\n\n\nAlbumAutoMonths = connect((store)=>{\n  return {\n    albumsAuto: store.albums.albumsAuto,\n    fetchingAlbumsAuto: store.albums.fetchingAlbumsAuto,\n    fetchedAlbumsAuto: store.albums.fetchedAlbumsAuto,\n    \n    albumsAutoList: store.albums.albumsAutoList,\n    fetchingAlbumsAutoList: store.albums.fetchingAlbumsAutoList,\n    fetchedAlbumsAutoList: store.albums.fetchedAlbumsAutoList,\n\n    generatingAlbumsAuto: store.albums.generatingAlbumsAuto,\n    generatedAlbumsAuto: store.albums.generatedAlbumsAuto,\n    statusAutoAlbumProcessing: store.util.statusAutoAlbumProcessing,\n    statusPhotoScan: store.util.statusPhotoScan,\n    scanningPhotos: store.photos.scanningPhotos,\n\n  }\n})(AlbumAutoMonths)\n"
  },
  {
    "path": "src/layouts/albumAutoRV.js",
    "content": "import React, { Component } from \"react\";\nimport { connect } from \"react-redux\";\nimport {\n  fetchPeopleAlbums,\n  fetchAutoAlbums,\n  fetchAutoAlbumsList\n} from \"../actions/albumsActions\";\nimport { AlbumAutoCard, AlbumAutoGallery } from \"../components/album\";\nimport {\n  Container,\n  Icon,\n  Header,\n  Image,\n  Button,\n  Card,\n  Label,\n  Popup,\n  Rating,\n  Loader\n} from \"semantic-ui-react\";\nimport {\n  fetchCountStats,\n  fetchPhotoScanStatus,\n  fetchAutoAlbumProcessingStatus\n} from \"../actions/utilActions\";\nimport { Grid, List, WindowScroller, AutoSizer } from \"react-virtualized\";\nimport { Server, serverAddress } from \"../api_client/apiClient\";\nimport * as moment from \"moment\";\nimport debounce from \"lodash/debounce\";\nimport { push } from \"react-router-redux\";\nimport { Link } from \"react-router-dom\";\nimport { SecuredImageJWT } from \"../components/SecuredImage\";\n\nvar topMenuHeight = 45; // don't change this\nvar leftMenuWidth = 85; // don't change this\nvar SIDEBAR_WIDTH = 85;\nvar timelineScrollWidth = 0;\nvar DAY_HEADER_HEIGHT = 35;\n\nclass ScrollSpeed {\n  clear = () => {\n    this.lastPosition = null;\n    this.delta = 0;\n  };\n  getScrollSpeed(scrollOffset) {\n    if (this.lastPosition != null) {\n      this.delta = scrollOffset - this.lastPosition;\n    }\n    this.lastPosition = scrollOffset;\n\n    window.clearTimeout(this._timeout);\n    this._timeout = window.setTimeout(this.clear, 50);\n\n    return this.delta;\n  }\n}\n\nconst SPEED_THRESHOLD = 1000; // Tweak this to whatever feels right for your app\nconst SCROLL_DEBOUNCE_DURATION = 100; // In milliseconds\n\nexport class AlbumAutoRV extends Component {\n  constructor(props) {\n    super(props);\n    this.cellRenderer = this.cellRenderer.bind(this);\n    this.calculateEntrySquareSize = this.calculateEntrySquareSize.bind(this);\n    this.state = {\n      scrollToIndex: undefined,\n      width: window.innerWidth,\n      height: window.innerHeight,\n      entrySquareSize: 200,\n      currTopRenderedCellIdx: 0,\n      isScrollingFast: false\n    };\n  }\n  getScrollSpeed = new ScrollSpeed().getScrollSpeed;\n\n  handleScroll = ({ scrollTop }) => {\n    // scrollSpeed represents the number of pixels scrolled since the last scroll event was fired\n    const scrollSpeed = Math.abs(this.getScrollSpeed(scrollTop));\n\n    if (scrollSpeed >= SPEED_THRESHOLD) {\n      this.setState({\n        isScrollingFast: true,\n        scrollTop: scrollTop\n      });\n    }\n\n    // Since this method is debounced, it will only fire once scrolling has stopped for the duration of SCROLL_DEBOUNCE_DURATION\n    this.handleScrollEnd();\n  };\n\n  handleScrollEnd = debounce(() => {\n    const { isScrollingFast } = this.state;\n\n    if (isScrollingFast) {\n      this.setState({\n        isScrollingFast: false\n      });\n    }\n  }, SCROLL_DEBOUNCE_DURATION);\n\n  componentWillMount() {\n    this.props.dispatch(fetchAutoAlbumsList());\n    this.calculateEntrySquareSize();\n    window.addEventListener(\"resize\", this.calculateEntrySquareSize.bind(this));\n  }\n\n  calculateEntrySquareSize() {\n    if (window.innerWidth < 400) {\n      var numEntrySquaresPerRow = 1;\n    } else if (window.innerWidth < 600) {\n      var numEntrySquaresPerRow = 2;\n    } else if (window.innerWidth < 800) {\n      var numEntrySquaresPerRow = 3;\n    } else if (window.innerWidth < 1000) {\n      var numEntrySquaresPerRow = 4;\n    } else if (window.innerWidth < 1200) {\n      var numEntrySquaresPerRow = 5;\n    } else {\n      var numEntrySquaresPerRow = 6;\n    }\n\n    var columnWidth = window.innerWidth - SIDEBAR_WIDTH - 15;\n\n    var entrySquareSize = columnWidth / numEntrySquaresPerRow;\n    var numEntrySquaresPerRow = numEntrySquaresPerRow;\n    this.setState({\n      width: window.innerWidth,\n      height: window.innerHeight,\n      entrySquareSize: entrySquareSize,\n      numEntrySquaresPerRow: numEntrySquaresPerRow\n    });\n    console.log(\"column width:\", columnWidth);\n    console.log(\"item size:\", entrySquareSize);\n    console.log(\"num items per row\", numEntrySquaresPerRow);\n  }\n\n  cellRenderer = ({ columnIndex, key, rowIndex, style }) => {\n    const { isScrollingFast } = this.state;\n\n    var albumAutoIndex =\n      rowIndex * this.state.numEntrySquaresPerRow + columnIndex;\n    if (albumAutoIndex < this.props.albumsAutoList.length) {\n      if (!isScrollingFast) {\n        var image = (\n          <SecuredImageJWT\n            height={this.props.entrySquareSize}\n            width={this.props.entrySquareSize}\n            src={\n              serverAddress +\n              \"/media/square_thumbnails/\" +\n              this.props.albumsAutoList[albumAutoIndex].photos[0] +\n              \".jpg\"\n            }\n          />\n        );\n      } else {\n        var image = (\n          <Image\n            height={this.props.entrySquareSize}\n            width={this.props.entrySquareSize}\n            src={\"/thumbnail_placeholder.png\"}\n          />\n        );\n      }\n\n      return (\n        <div key={key} style={style}>\n          <div style={{ padding: 10 }}>\n            <Card\n              as={Link}\n              to={`/event/${this.props.albumsAutoList[albumAutoIndex].id}`}\n              style={{ height: this.state.entrySquareSize + 110 }}\n            >\n              {image}\n              <Card.Content>\n                <Card.Header>\n                  {moment(\n                    this.props.albumsAutoList[albumAutoIndex].timestamp\n                  ).format(\"MMMM YYYY\")}\n                </Card.Header>\n                <Card.Meta>\n                  {this.props.albumsAutoList[albumAutoIndex].photos.length}{\" \"}\n                  Items\n                </Card.Meta>\n                <Card.Description>\n                  {this.props.albumsAutoList[albumAutoIndex].title}\n                </Card.Description>\n              </Card.Content>\n            </Card>\n          </div>\n        </div>\n      );\n    } else {\n      return <div key={key} style={style} />;\n    }\n  };\n\n  render() {\n    return (\n      <div>\n        <div style={{ height: 60, paddingTop: 10 }}>\n          <Header as=\"h2\">\n            <Icon name=\"wizard\" />\n            <Header.Content>\n              Events{\" \"}\n              <Loader\n                size=\"tiny\"\n                inline\n                active={this.props.fetchingAlbumsAutoList}\n              />\n              <Header.Subheader>\n                {this.props.albumsAutoList.length} Events\n              </Header.Subheader>\n            </Header.Content>\n          </Header>\n        </div>\n\n        <AutoSizer\n          disableHeight\n          style={{ outline: \"none\", padding: 0, margin: 0 }}\n        >\n          {({ width }) => (\n            <Grid\n              style={{ outline: \"none\" }}\n              headerHeight={100}\n              onScroll={this.handleScroll}\n              disableHeader={false}\n              cellRenderer={this.cellRenderer}\n              columnWidth={this.state.entrySquareSize}\n              columnCount={this.state.numEntrySquaresPerRow}\n              height={this.state.height - topMenuHeight - 60}\n              rowHeight={this.state.entrySquareSize + 130}\n              rowCount={Math.ceil(\n                this.props.albumsAutoList.length /\n                  this.state.numEntrySquaresPerRow.toFixed(1)\n              )}\n              width={width}\n            />\n          )}\n        </AutoSizer>\n      </div>\n    );\n  }\n}\n\nAlbumAutoRV = connect(store => {\n  return {\n    albumsAuto: store.albums.albumsAuto,\n    fetchingAlbumsAuto: store.albums.fetchingAlbumsAuto,\n    fetchedAlbumsAuto: store.albums.fetchedAlbumsAuto,\n\n    albumsAutoList: store.albums.albumsAutoList,\n    fetchingAlbumsAutoList: store.albums.fetchingAlbumsAutoList,\n    fetchedAlbumsAutoList: store.albums.fetchedAlbumsAutoList,\n\n    generatingAlbumsAuto: store.albums.generatingAlbumsAuto,\n    generatedAlbumsAuto: store.albums.generatedAlbumsAuto,\n    statusAutoAlbumProcessing: store.util.statusAutoAlbumProcessing,\n    statusPhotoScan: store.util.statusPhotoScan,\n    scanningPhotos: store.photos.scanningPhotos\n  };\n})(AlbumAutoRV);\n"
  },
  {
    "path": "src/layouts/albumDateGalleryView.js",
    "content": "import React, {Component} from 'react';\nimport { Card, Image, Header, Divider, Item, Loader, Dimmer,\n         Container, Label, Popup, Segment, Button, Icon} from 'semantic-ui-react';\nimport Gallery from 'react-grid-gallery'\nimport VisibilitySensor from 'react-visibility-sensor'\nimport { connect } from \"react-redux\";\nimport {\n  BrowserRouter as Router,\n  Route,\n  Link\n} from 'react-router-dom'\nimport {fetchPeopleAlbums, fetchAutoAlbums, generateAutoAlbums, fetchAlbumsDateGalleries} from '../actions/albumsActions'\nimport { Map, TileLayer, Marker } from 'react-leaflet'\nimport {Server, serverAddress} from '../api_client/apiClient'\n\n\n/*******************************************************************************\nCOMMON\n*******************************************************************************/\n\n\nexport class AlbumLocationMap extends Component {\n  render() {\n    var photosWithGPS = this.props.photos.filter(function(photo){\n      if (photo.exif_gps_lon !== null && photo.exif_gps_lon){\n        return true\n      }\n      else {\n        return false\n      }\n    })\n    \n    var sum_lat = 0\n    var sum_lon = 0\n    for (var i=0;i<photosWithGPS.length;i++){\n      sum_lat += parseFloat(photosWithGPS[i].exif_gps_lat)\n      sum_lon += parseFloat(photosWithGPS[i].exif_gps_lon)\n    }\n    var avg_lat = sum_lat/photosWithGPS.length\n    var avg_lon = sum_lon/photosWithGPS.length\n\n    var markers = photosWithGPS.map(function(photo,idx){\n      return (\n        <Marker key={'marker-'+photo.id+'-'+idx} position={[photo.exif_gps_lat, photo.exif_gps_lon]}>\n        </Marker>\n      )\n    })\n    console.log(markers)\n\n    if (photosWithGPS.length>0){\n      return (\n        <div>\n          <Map center={[avg_lat,avg_lon]} zoom={2}>\n            <TileLayer\n              attribution='&copy; <a href=\"http://osm.org/copyright\">OpenStreetMap</a> contributors'\n              url='http://{s}.tile.osm.org/{z}/{x}/{y}.png'/>\n            {markers}\n          </Map>\n          <Divider/>\n        </div>\n      )\n    }\n    else {\n      return (\n        <div></div>\n      )\n    }\n  }\n}\n\n/*******************************************************************************\nAUTO GENERATED EVENT ALBUM\n*******************************************************************************/\n\nexport class AlbumDateGalleryView extends Component {\n  componentWillMount() {\n    this.props.dispatch(fetchAlbumsDateGalleries(this.props.match.params.albumID))\n  }\n\n  render() {\n    console.log(this.props)\n    var albumID = this.props.match.params.albumID\n    console.log('property exists',this.props.albumsDateGalleries.hasOwnProperty(albumID))\n    console.log('the property',this.props.albumsDateGalleries[albumID])\n    if (this.props.albumsDateGalleries.hasOwnProperty(albumID) && !this.props.fetchingAlbumsDateGalleries) {\n      console.log('here!')\n      console.log(this.props.albumsDateGalleries[albumID].photos)\n      var mappedRenderablePhotoArray = this.props.albumsDateGalleries[albumID].photos.map(function(photo){\n        return ({\n          src: serverAddress+photo.image_url,\n          thumbnail: serverAddress+photo.thumbnail_url,\n          thumbnailWidth:photo.thumbnail_width,\n          thumbnailHeight:photo.thumbnail_height,\n        });\n      });\n\n      var renderable = (\n        <div style={{\n            display: \"block\",\n            minHeight: \"1px\",\n            width: \"100%\",\n            border: \"0px solid #ddd\",\n            overflow: \"hidden\"}}>\n          <AlbumLocationMap photos={this.props.albumsDateGalleries[albumID].photos}/>\n\n        <Header  as='h2' textAlign='center'>\n          <Header.Content>\n            {this.props.albumsDateGalleries[albumID].date}\n            <Header.Subheader>{this.props.albumsDateGalleries[albumID].photos.length} Photos</Header.Subheader>\n          </Header.Content>\n        </Header>\n\n\n\n          <Divider/>\n          <Gallery \n            images={mappedRenderablePhotoArray}\n            enableImageSelection={false}\n            rowHeight={250}/>\n        </div>\n      )\n    }\n    else {\n      var renderable = (\n        <div>\n          <Dimmer active>\n            <Loader active/>\n          </Dimmer>\n        </div>\n      )\n    }\n    return (\n      <div>\n      {renderable}\n      </div>\n    )\n  }\n}\n\n\n\nAlbumDateGalleryView = connect((store)=>{\n  return {\n    fetchingAlbumsDateGalleries: store.albums.fetchingAlbumsDateGalleries,\n    fetchedAlbumsDateGalleries: store.albums.fetchedAlbumsDateGalleries,\n    albumsDateGalleries: store.albums.albumsDateGalleries,\n  }\n})(AlbumDateGalleryView)\n\n"
  },
  {
    "path": "src/layouts/albumDateMonths.js",
    "content": "import React, {Component} from 'react';\nimport { connect } from \"react-redux\";\nimport {fetchPeopleAlbums, fetchAutoAlbums, generateAutoAlbums, fetchDateAlbumsList} from '../actions/albumsActions'\nimport {AlbumDateCard, AlbumDateCardPlaceholder, AlbumDateCardPlain, AlbumDateCardPlainPlaceholder, AlbumAutoGallery} from '../components/album'\nimport {Container, Icon, Header, Button, Card, Label, Popup, Divider} from 'semantic-ui-react'\nimport {fetchCountStats,fetchPhotoScanStatus,\n        fetchAutoAlbumProcessingStatus} from '../actions/utilActions'\n\nimport {Server, serverAddress} from '../api_client/apiClient'\nimport LazyLoad from 'react-lazyload';\n\n\nexport class AlbumDateMonthCards extends Component {\n  render() {\n\n      var match = this.props.match\n      var month = this.props.month\n      var mappedAlbumCards = this.props.albums.map(function(album){\n        var albumTitle = album.title\n        var albumDate = album.date\n        try {\n          var albumCoverURL = album.cover_photo_url\n        }\n        catch(err) {\n          console.log(err)\n          var albumCoverURL = null\n        }\n        return (\n          <LazyLoad height={290} placeholder={<AlbumDateCardPlainPlaceholder/>}> \n            <AlbumDateCardPlain album={album}/>\n          </LazyLoad>\n        )\n      })\n\n\n    return (\n      <div style={{paddingTop:'20px'}}>\n        <Header dividing as='h2'>\n          <Header.Content>\n            {this.props.month}\n            <Header.Subheader>{this.props.albums.length} Days</Header.Subheader>\n          </Header.Content>\n        </Header>\n        <div>\n          <Card.Group stackable itemsPerRow={5}>\n          {mappedAlbumCards}\n          </Card.Group>\n        </div>\n      </div>\n    )\n  }\n}\n\n\n\nexport class AlbumDateMonths extends Component {\n  constructor(props){\n    super(props)\n    this.groupDatesByMonth.bind(this)\n  }\n\n  componentWillMount() {\n    this.props.dispatch(fetchDateAlbumsList())\n\n  }\n\n  shouldComponentUpdate(nextProps, nextState){\n    console.log('should component update?')\n    if (nextProps.albumsDateList === this.props.albumsDateList) {\n      console.log('no')\n      return false\n    }\n    else {\n      console.log('yes')\n      return true\n    }\n  }\n\n  groupDatesByMonth() {\n    var allMonths = this.props.albumsDateList.map(function(album){\n      var yearMonth = album.date.split('-').slice(0,2).join('-')\n      return yearMonth\n    })\n\n    var months = new Set(allMonths)\n    months = [...months]\n    var eventsByMonth = {}\n    months.map(function(month){\n      eventsByMonth[month] = []\n    })\n    this.props.albumsDateList.map(function(album){\n      var yearMonth = album.date.split('-').slice(0,2).join('-')\n      eventsByMonth[yearMonth].push(album)\n    })\n    console.log(eventsByMonth)\n    return eventsByMonth\n  }\n\n  render() {\n    if (this.props.fetchedAlbumsDateList) {\n      var eventsByMonth = this.groupDatesByMonth()\n      var match = this.props.match\n      var datesByMonthCardGroups = []\n      for (var month in eventsByMonth) {\n        if (eventsByMonth.hasOwnProperty(month)) {\n          var cardsMonth = (\n            <AlbumDateMonthCards key={month} month={month} albums={eventsByMonth[month]}/>\n          )\n          datesByMonthCardGroups.push(cardsMonth)\n        }\n      }\n      console.log(datesByMonthCardGroups)\n\n\n    }\n    else {\n      var datesByMonthCardGroups = null\n    }\n\n\n    return (\n      <div>\n        {datesByMonthCardGroups}\n      </div>\n    )\n  }\n}\n\n\n\n\n\nAlbumDateMonths = connect((store)=>{\n  return {\n    albumsDateList: store.albums.albumsDateList,\n    fetchingAlbumsDateList: store.albums.fetchingAlbumsDateList,\n    fetchedAlbumsDateList: store.albums.fetchedAlbumsDateList,\n  }\n})(AlbumDateMonths)\n"
  },
  {
    "path": "src/layouts/albumPeople.js",
    "content": "import React, { Component } from \"react\";\nimport { connect } from \"react-redux\";\nimport {\n  fetchPeopleAlbums,\n  fetchAutoAlbums,\n  generateAutoAlbums\n} from \"../actions/albumsActions\";\nimport { AlbumPeopleCard, AlbumPeopleGallery } from \"../components/album\";\nimport {\n  Popup,\n  Modal,\n  Container,\n  Icon,\n  Divider,\n  Header,\n  Image,\n  Loader,\n  Button,\n  Card\n} from \"semantic-ui-react\";\nimport { fetchPeople, deletePerson } from \"../actions/peopleActions\";\n\nimport { Server, serverAddress } from \"../api_client/apiClient\";\nimport { Grid, List, WindowScroller, AutoSizer } from \"react-virtualized\";\nimport { Link } from \"react-router-dom\";\nimport { SecuredImageJWT } from \"../components/SecuredImage\";\n\nimport { push } from \"react-router-redux\";\n\nvar topMenuHeight = 45; // don't change this\nvar ESCAPE_KEY = 27;\nvar ENTER_KEY = 13;\nvar RIGHT_ARROW_KEY = 39;\nvar UP_ARROW_KEY = 38;\nvar LEFT_ARROW_KEY = 37;\nvar DOWN_ARROW_KEY = 40;\n\nvar SIDEBAR_WIDTH = 85;\n\nexport class AlbumPeople extends Component {\n  constructor(props) {\n    super(props);\n\n    this.calculateEntrySquareSize = this.calculateEntrySquareSize.bind(this);\n    this.cellRenderer = this.cellRenderer.bind(this);\n  }\n\n  state = {\n    width: window.innerWidth,\n    height: window.innerHeight,\n    entrySquareSize: 200\n  };\n\n  componentWillMount() {\n    this.calculateEntrySquareSize();\n    window.addEventListener(\"resize\", this.calculateEntrySquareSize);\n    if (this.props.people.length === 0) {\n      this.props.dispatch(fetchPeople());\n    }\n  }\n\n  componentWillUnmount() {\n    window.removeEventListener(\"resize\", this.calculateEntrySquareSize);\n  }\n\n  calculateEntrySquareSize() {\n    if (window.innerWidth < 600) {\n      var numEntrySquaresPerRow = 2;\n    } else if (window.innerWidth < 800) {\n      var numEntrySquaresPerRow = 3;\n    } else if (window.innerWidth < 1000) {\n      var numEntrySquaresPerRow = 4;\n    } else if (window.innerWidth < 1200) {\n      var numEntrySquaresPerRow = 5;\n    } else {\n      var numEntrySquaresPerRow = 6;\n    }\n\n    var columnWidth = window.innerWidth - SIDEBAR_WIDTH - 5 - 5 - 15;\n\n    var entrySquareSize = columnWidth / numEntrySquaresPerRow;\n    var numEntrySquaresPerRow = numEntrySquaresPerRow;\n    this.setState({\n      width: window.innerWidth,\n      height: window.innerHeight,\n      entrySquareSize: entrySquareSize,\n      numEntrySquaresPerRow: numEntrySquaresPerRow\n    });\n  }\n\n  cellRenderer = ({ columnIndex, key, rowIndex, style }) => {\n    var albumPersonIndex =\n      rowIndex * this.state.numEntrySquaresPerRow + columnIndex;\n    if (albumPersonIndex < this.props.people.length) {\n      return (\n        <div key={key} style={style}>\n          <div\n            onClick={() => {\n              if (\n                !this.props.albumsPeople.hasOwnProperty(\n                  this.props.people[albumPersonIndex].key\n                )\n              ) {\n                this.props.dispatch(\n                  fetchPeopleAlbums(this.props.people[albumPersonIndex].key)\n                );\n              }\n              // this.props.dispatch(push(`/person/${this.props.people[albumPersonIndex].key}`))\n            }}\n            style={{ padding: 5 }}\n          >\n            {this.props.people[albumPersonIndex].face_count > 0 ? (\n              this.props.people[albumPersonIndex].text === \"unknown\" ? (\n                <Image\n                  label={{ as: \"a\", corner: \"left\", icon: \"user circle\" }}\n                  height={this.state.entrySquareSize - 10}\n                  width={this.state.entrySquareSize - 10}\n                  as={Link}\n                  to={`/person/${this.props.people[albumPersonIndex].key}`}\n                  src={'/unknown_user.jpg'}\n                />\n              ) : (\n                <SecuredImageJWT\n                  label={{ as: \"a\", corner: \"left\", icon: \"user circle\" }}\n                  height={this.state.entrySquareSize - 10}\n                  width={this.state.entrySquareSize - 10}\n                  as={Link}\n                  to={`/person/${this.props.people[albumPersonIndex].key}`}\n                  src={\n                    serverAddress +\n                    this.props.people[albumPersonIndex].face_photo_url\n                  }\n                />\n              )\n            ) : (\n              <Image\n                height={this.state.entrySquareSize - 10}\n                width={this.state.entrySquareSize - 10}\n                src={\"/unknown_user.jpg\"}\n              />\n            )}\n          </div>\n          <div\n            className=\"personCardName\"\n            style={{ paddingLeft: 15, paddingRight: 15, height: 50 }}\n          >\n            <b>{this.props.people[albumPersonIndex].text}</b> <br />\n            {this.props.people[albumPersonIndex].face_count} Photos\n            {this.props.people[albumPersonIndex].text.toLowerCase() !=\n              \"unknown\" && (\n              <div\n                className=\"personRemoveButton\"\n                style={{ right: 0, position: \"absolute\" }}\n              >\n                <Popup\n                  wide=\"very\"\n                  hoverable\n                  flowing\n                  trigger={<Icon color=\"grey\" name=\"remove\" />}\n                  content={\n                    <div style={{ textAlign: \"center\" }}>\n                      Are you sure you want to delete{\" \"}\n                      <b>{this.props.people[albumPersonIndex].text}</b>?<br />\n                      This action cannot be undone!<br />\n                      All the faces associated with this person will be tagged{\" \"}\n                      <i>unknown</i>.\n                      <Divider />\n                      <div>\n                        <Button\n                          onClick={() =>\n                            this.props.dispatch(\n                              deletePerson(\n                                this.props.people[albumPersonIndex].key\n                              )\n                            )\n                          }\n                          negative\n                        >\n                          Yes\n                        </Button>\n                      </div>\n                    </div>\n                  }\n                  on=\"click\"\n                  position=\"bottom center\"\n                />\n              </div>\n            )}\n          </div>\n        </div>\n      );\n    } else {\n      return <div key={key} style={style} />;\n    }\n  };\n\n  render() {\n    var entrySquareSize = this.state.entrySquareSize;\n    var numEntrySquaresPerRow = this.state.numEntrySquaresPerRow;\n    return (\n      <div>\n        <div style={{ height: 60, paddingTop: 10 }}>\n          <Header as=\"h2\">\n            <Icon name=\"users\" />\n            <Header.Content>\n              People{\" \"}\n              <Loader size=\"tiny\" inline active={this.props.fetchingPeople} />\n              <Header.Subheader>\n                {this.props.people.length} People\n              </Header.Subheader>\n            </Header.Content>\n          </Header>\n        </div>\n\n        <AutoSizer\n          disableHeight\n          style={{ outline: \"none\", padding: 0, margin: 0 }}\n        >\n          {({ width }) => (\n            <Grid\n              style={{ outline: \"none\" }}\n              headerHeight={100}\n              disableHeader={false}\n              cellRenderer={this.cellRenderer}\n              columnWidth={this.state.entrySquareSize}\n              columnCount={this.state.numEntrySquaresPerRow}\n              height={this.state.height - topMenuHeight - 60}\n              rowHeight={this.state.entrySquareSize + 60}\n              rowCount={Math.ceil(\n                this.props.people.length /\n                  this.state.numEntrySquaresPerRow.toFixed(1)\n              )}\n              width={width}\n            />\n          )}\n        </AutoSizer>\n      </div>\n    );\n  }\n}\n\nAlbumPeople = connect(store => {\n  return {\n    albumsPeople: store.albums.albumsPeople,\n    fetchingAlbumsPeople: store.albums.fetchingAlbumsPeople,\n    fetchedAlbumsPeople: store.albums.fetchedAlbumsPeople,\n    people: store.people.people,\n    fetchedPeople: store.people.fetched,\n    fetchingPeople: store.people.fetching\n  };\n})(AlbumPeople);\n"
  },
  {
    "path": "src/layouts/albumPersonGallery.js",
    "content": "import React, {Component} from 'react';\nimport { connect } from \"react-redux\";\nimport {fetchPeopleAlbums, fetchAutoAlbums, generateAutoAlbums} from '../actions/albumsActions'\nimport {Container, Icon, Divider, Header, Image, Button, Card, Loader} from 'semantic-ui-react'\nimport { fetchPeople, fetchEgoGraph } from '../actions/peopleActions';\nimport { fetchPhotoDetail, fetchNoTimestampPhotoList} from '../actions/photosActions';\n\nimport {Server, serverAddress} from '../api_client/apiClient'\nimport { Grid, List, WindowScroller,AutoSizer } from 'react-virtualized';\nimport {EgoGraph} from '../components/egoGraph'\nimport { push } from 'react-router-redux'\nimport {LightBox} from '../components/lightBox'\nimport moment from 'moment'\nimport _ from 'lodash'\nimport debounce from 'lodash/debounce'\n\n\nimport {calculateGridCells, calculateGridCellSize} from '../util/gridUtils'\nimport {ScrollSpeed, SPEED_THRESHOLD, SCROLL_DEBOUNCE_DURATION} from '../util/scrollUtils'\n\nimport {PhotoListView} from './ReusablePhotoListView'\n\n\nvar topMenuHeight = 55 // don't change this\nvar ESCAPE_KEY = 27;\nvar ENTER_KEY = 13;\nvar RIGHT_ARROW_KEY = 39;\nvar UP_ARROW_KEY = 38;\nvar LEFT_ARROW_KEY = 37;\nvar DOWN_ARROW_KEY = 40;\nvar DAY_HEADER_HEIGHT = 70\nvar leftMenuWidth = 85 // don't change this\n\nvar SIDEBAR_WIDTH = 85;\n\nexport class AlbumPersonGallery extends Component {\n  state = {\n    photosGroupedByDate: [],\n    idx2hash: [],\n  }\n\n  componentDidMount() {\n    if (this.props.people.length === 0){\n      this.props.dispatch(fetchPeopleAlbums(this.props.match.params.albumID))\n    }\n  }\n\n\n\n  static getDerivedStateFromProps(nextProps,prevState){\n    if (nextProps.albumsPeople.hasOwnProperty(nextProps.match.params.albumID)){\n      const photos = nextProps.albumsPeople[nextProps.match.params.albumID].photos\n      if (prevState.idx2hash.length !== photos.length) {\n\n          var t0 = performance.now();\n          var groupedByDate = _.groupBy(photos,(el)=>{\n              if (el.exif_timestamp) {\n                  return moment.utc(el.exif_timestamp).format('YYYY-MM-DD')\n              } else {\n                  return \"No Timestamp\"\n              }\n          })\n          var groupedByDateList = _.reverse(_.sortBy(_.toPairsIn(groupedByDate).map((el)=>{\n              return {date:el[0],photos:el[1]}\n          }),(el)=>el.date))\n\n          var idx2hash = []\n          groupedByDateList.forEach((g)=>{\n              g.photos.forEach((p)=>{\n                  idx2hash.push(p.image_hash)\n              })\n          })\n\n          \n          var t1 = performance.now();\n          return {\n              ...prevState, \n              photosGroupedByDate: groupedByDateList,\n              idx2hash:idx2hash,\n          }\n      } else {\n        return null\n      }\n    } else {\n      return null\n    }\n  }\n\n\n\n  render() {\n    const {albumsPeople,fetchingAlbumsPeople,fetchedAlbumsPeople,fetchingPeople} = this.props\n    return (\n      <PhotoListView \n        title={this.props.albumsPeople[this.props.match.params.albumID] ? this.props.albumsPeople[this.props.match.params.albumID].name : \"Loading... \"}\n        loading={fetchingAlbumsPeople || fetchingPeople}\n        titleIconName={'user'}\n        photosGroupedByDate={this.state.photosGroupedByDate}\n        idx2hash={this.state.idx2hash}\n      />\n    )  \n  }\n}\n\n/*\nexport class AlbumPersonGallery extends Component {\n\n  constructor() {\n    super();\n    this.listRef = React.createRef()\n    this.handleResize = this.handleResize.bind(this)\n    this.cellRenderer = this.cellRenderer.bind(this)\n    this.onPhotoClick = this.onPhotoClick.bind(this)\n    this.state = {\n        photosGroupedByDate: [],\n        cellContents: [[]],\n        hash2row: {},\n        idx2hash: [],\n        lightboxImageIndex: 1,\n        lightboxShow:false,\n        lightboxSidebarShow:false,\n        scrollToIndex: undefined,\n        width:  window.innerWidth,\n        height: window.innerHeight,\n        entrySquareSize:200,\n        numEntrySquaresPerRow:3,\n        currTopRenderedRowIdx:0,\n        scrollTop:0,\n        gridHeight: window.innerHeight- topMenuHeight - 60,\n        showGraph:false,\n    }\n  }\n\n\n  scrollSpeedHandler = new ScrollSpeed()\n\n  handleScroll = ({scrollTop}) => {\n      // scrollSpeed represents the number of pixels scrolled since the last scroll event was fired\n      const scrollSpeed = Math.abs(this.scrollSpeedHandler.getScrollSpeed(scrollTop));\n\n      if (scrollSpeed >= SPEED_THRESHOLD) {\n        this.setState({\n          isScrollingFast: true,\n          scrollTop:scrollTop\n        });\n      }\n\n      // Since this method is debounced, it will only fire once scrolling has stopped for the duration of SCROLL_DEBOUNCE_DURATION\n      this.handleScrollEnd();\n  }\n\n  handleScrollEnd = debounce(() => {\n  const {isScrollingFast} = this.state;\n\n  if (isScrollingFast) {\n    this.setState({\n      isScrollingFast: false,\n    });\n  }\n  }, SCROLL_DEBOUNCE_DURATION);\n\n\n\n\n  componentDidMount() {\n    this.handleResize();\n    window.addEventListener(\"resize\", this.handleResize.bind(this));\n    if (this.props.people.length == 0){\n      this.props.dispatch(fetchPeopleAlbums(this.props.match.params.albumID))\n    }\n    this.props.dispatch(fetchEgoGraph(this.props.match.params.albumID))\n  }\n\n  componentWillUnmount() {\n    window.removeEventListener(\"resize\", this.handleResize.bind(this))\n  }\n\n\n  handleResize() {\n    var columnWidth = window.innerWidth - SIDEBAR_WIDTH - 5 - 5 - 10\n    const {entrySquareSize,numEntrySquaresPerRow} = calculateGridCellSize(columnWidth)\n    var {cellContents,hash2row} = calculateGridCells(this.state.photosGroupedByDate,numEntrySquaresPerRow)\n\n    this.setState({\n      width:  window.innerWidth,\n      height: window.innerHeight,\n      entrySquareSize:entrySquareSize,\n      numEntrySquaresPerRow:numEntrySquaresPerRow,\n      cellContents: cellContents,\n      hash2row: hash2row\n    })\n    if (this.listRef.current) {\n        this.listRef.current.recomputeGridSize()\n    }\n  }\n\n    onPhotoClick(hash) {\n        this.setState({lightboxImageIndex:this.state.idx2hash.indexOf(hash),lightboxShow:true})\n    }\n\n \n\n\n\n    static getDerivedStateFromProps(nextProps,prevState){\n      if (nextProps.albumsPeople.hasOwnProperty(nextProps.match.params.albumID)){\n        const photos = nextProps.albumsPeople[nextProps.match.params.albumID].photos\n        if (prevState.idx2hash.length != photos.length) {\n\n            var t0 = performance.now();\n            var groupedByDate = _.groupBy(photos,(el)=>{\n                if (el.exif_timestamp) {\n                    return moment(el.exif_timestamp).format('YYYY-MM-DD')\n                } else {\n                    return \"No Timestamp\"\n                }\n            })\n            var groupedByDateList = _.reverse(_.sortBy(_.toPairsIn(groupedByDate).map((el)=>{\n                return {date:el[0],photos:el[1]}\n            }),(el)=>el.date))\n\n            var idx2hash = []\n            groupedByDateList.forEach((g)=>{\n                g.photos.forEach((p)=>{\n                    idx2hash.push(p.image_hash)\n                })\n            })\n\n            \n            var {cellContents,hash2row} = calculateGridCells(groupedByDateList,prevState.numEntrySquaresPerRow)\n            console.log(cellContents)\n            var t1 = performance.now();\n            console.log(t1-t0)\n            return {\n                ...prevState, \n                photosGroupedByDate: groupedByDateList,\n                idx2hash:idx2hash,\n                cellContents: cellContents,\n                hash2row:hash2row\n            }\n        } else {\n          return null\n        }\n      } else {\n        return null\n      }\n    }\n\n\n\n    cellRenderer = ({ columnIndex, key, rowIndex, style }) => {\n        if (this.state.cellContents[rowIndex][columnIndex]) { // non-empty cell\n            const cell = this.state.cellContents[rowIndex][columnIndex]\n            if (cell.date) { // header cell has 'date' attribute\n                return ( \n                    <div key={key} style={{...style,width:this.state.width,height:DAY_HEADER_HEIGHT,paddingTop:20}}>\n                        <div style={{backgroundColor:'white'}}>\n                            <Header as='h3'>\n                                <Icon name='calendar outline'/>\n                                <Header.Content>\n                                    { cell.date=='No Timestamp' ? \"No Timestamp\" : moment(cell.date).format(\"MMM Do YYYY, dddd\")}\n                                    <Header.Subheader>\n                                        <Icon name='photo'/>{cell.photos.length} Photos\n                                    </Header.Subheader>\n                                </Header.Content>\n                            </Header>\n                        </div>\n                    </div>                \n                )   \n                \n                // if (!this.state.isScrollingFast){\n                // } else {\n                //     return (\n                //         <div key={key} style={{\n                //             ...style,\n                //             backgroundColor:'#dddddd',\n                //             width:250,\n                //             marginTop:2,\n                //             height:DAY_HEADER_HEIGHT-4,\n                //             paddingTop:10}}>\n                //         </div>                \n                //     )        \n                // } \n                \n            } else { // photo cell doesn't have 'date' attribute\n                if (!this.state.isScrollingFast) {\n                    return (\n                        <div key={key} style={style}>\n                            <Image key={'daygroup_image_'+cell.image_hash} style={{display:'inline-block',padding:1,margin:0}}\n                                onClick={()=>{\n                                    this.onPhotoClick(cell.image_hash)\n                                }}\n                                height={this.state.entrySquareSize} \n                                width={this.state.entrySquareSize} \n                                src={serverAddress+'/media/square_thumbnails/'+cell.image_hash+'.jpg'}/>\n                        </div>                                \n                    )\n                } else {\n                    return (\n                        <div key={key} style={{...style,\n                            width:this.state.entrySquareSize-2,\n                            height:this.state.entrySquareSize-2,\n                            backgroundColor:'#eeeeee'}}>\n                        </div>                                \n                    )\n                }\n\n            }\n\n        } else { // empty cell\n            return (\n                <div key={key} style={style}>\n                </div>\n            )\n        }\n    }\n\n\n  \n  getPhotoDetails(image_hash) {\n      if (!this.props.photoDetails.hasOwnProperty(image_hash)) {\n          this.props.dispatch(fetchPhotoDetail(image_hash))\n      }\n  }\n\n  render() {\n    if (this.props.albumsPeople.hasOwnProperty(this.props.match.params.albumID)) {\n        var totalListHeight = this.state.cellContents.map((row,index)=>{\n            if (row[0].date) { //header row\n                return DAY_HEADER_HEIGHT\n            } else { //photo row\n                return this.state.entrySquareSize\n            }\n        }).reduce((a,b)=>(a+b),0)\n\t    return (\n\t      <div>\n\n          <div style={{position:'fixed',top:topMenuHeight+22,right:5,float:'right'}}>\n\n          </div>\n\n\n\n\t      \t<div style={{height:this.state.headerHeight,paddingTop:10,paddingRight:5}}>\n\n\n            <Header as='h2'>\n              <Icon name='user circle' />\n              <Header.Content>\n                  {this.props.albumsPeople[this.props.match.params.albumID].name + \" \"}\n                  <Button \n                    size='tiny'\n                    compact\n                    icon='share alternate'\n                    active={this.state.showGraph}\n                    circular\n                    onClick={()=>{\n                        this.setState({\n                        showGraph: !this.state.showGraph,\n                        gridHeight: !this.state.showGraph ? this.state.height - topMenuHeight - 260 : this.state.height - topMenuHeight - 60,\n                        headerHeight: !this.state.showGraph ? 260 : 60\n                        })}\n                    }/>\n                <Header.Subheader>\n          \t      {this.props.albumsPeople[this.props.match.params.albumID].photos.length} Photos\n                </Header.Subheader>\n              </Header.Content>\n            </Header>\n\n\n            {this.state.showGraph && <EgoGraph height={200-20} width={this.state.width-SIDEBAR_WIDTH-12 } person_id={this.props.match.params.albumID}/>}\n\n\n\t      \t</div>\n\n\n                <AutoSizer disableHeight style={{outline:'none',padding:0,margin:0}}>\n                  {({width}) => (\n                    <Grid\n                      ref={this.listRef}\n                      onSectionRendered={({rowStartIndex})=>{\n                        var date = this.state.cellContents[rowStartIndex][0].date\n                        if (date) {\n                            if (date=='No Timestamp') {\n                                this.setState({\n                                    currTopRenderedRowIdx:rowStartIndex,\n                                    date:date,\n                                    fromNow:date\n                                })\n                            } else {\n                                this.setState({\n                                    currTopRenderedRowIdx:rowStartIndex,\n                                    date:moment(date).format(\"MMMM Do YYYY\"),\n                                    fromNow:moment(date).fromNow()\n                                })\n                            }\n                        }\n                      }}\n                      overscanRowCount={5}\n                      style={{outline:'none'}}\n                      cellRenderer={this.cellRenderer}\n                      onScroll={this.handleScroll}\n                      columnWidth={this.state.entrySquareSize}\n                      columnCount={this.state.numEntrySquaresPerRow}\n                      height={this.state.height- topMenuHeight - 60}\n                      estimatedRowSize={totalListHeight/this.state.cellContents.length.toFixed(1)}\n                      rowHeight={({index})=> {\n                        if (this.state.cellContents[index][0].date) { //header row\n                            return DAY_HEADER_HEIGHT\n                        } else { //photo row\n                            return this.state.entrySquareSize\n                        }\n                      }}\n                      rowCount={this.state.cellContents.length}\n                      width={width}\n                    />\n                  )}\n                </AutoSizer>\n\n            { this.state.cellContents[this.state.currTopRenderedRowIdx][0] && (\n                <div style={{\n                    right:0,\n                    top:topMenuHeight + 10+ (0 / totalListHeight) * (this.state.height - topMenuHeight - 50 - 20),\n                    position:'fixed',\n                    float:'left',\n                    width:180,\n                    padding:0,\n                    height:50,\n                    zIndex:100,\n                }}>\n                    <div style={{textAlign:'right',paddingRight:30}} className='handle'>\n                        <b>{this.state.date}</b> <br/>\n                    </div>\n                    <div style={{textAlign:'right',paddingRight:30}}>\n                        {this.state.fromNow}\n                    </div>\n                </div>\n            )}\n\n\n          { this.state.lightboxShow &&\n              <LightBox\n                  idx2hash={this.state.idx2hash}\n                  lightboxImageIndex={this.state.lightboxImageIndex}\n\n                  onCloseRequest={() => this.setState({ lightboxShow: false })}\n                  onImageLoad={()=>{\n                      this.getPhotoDetails(this.state.idx2hash[this.state.lightboxImageIndex])\n                  }}\n                  onMovePrevRequest={() => {\n                      var nextIndex = (this.state.lightboxImageIndex + this.state.idx2hash.length - 1) % this.state.idx2hash.length\n                      this.setState({\n                          lightboxImageIndex:nextIndex\n                      })\n                      var rowIdx = this.state.hash2row[this.state.idx2hash[nextIndex]]\n                      this.listRef.current.scrollToCell({columnIndex:0,rowIndex:rowIdx})\n                      this.getPhotoDetails(this.state.idx2hash[nextIndex])\n                  }}\n                  onMoveNextRequest={() => {\n                      var nextIndex = (this.state.lightboxImageIndex + this.state.idx2hash.length + 1) % this.state.idx2hash.length\n                      this.setState({\n                          lightboxImageIndex:nextIndex\n                      })\n                      var rowIdx = this.state.hash2row[this.state.idx2hash[nextIndex]]\n                      this.listRef.current.scrollToCell({columnIndex:0,rowIndex:rowIdx})\n                      this.getPhotoDetails(this.state.idx2hash[nextIndex])\n                  }}/>\n          }\n\n\t\t\t\t</div>\n\t    )\n    }\n    else {\n    \treturn (\n    \t\t<div><Loader active/></div>\n    \t)\n    }\n  }\n}\n*/\n\nAlbumPersonGallery = connect((store)=>{\n  return {\n    albumsPeople: store.albums.albumsPeople,\n    fetchingAlbumsPeople: store.albums.fetchingAlbumsPeople,\n    fetchedAlbumsPeople: store.albums.fetchedAlbumsPeople,\n    people: store.people.people,\n    fetchedPeople: store.people.fetched,\n    fetchingPeople: store.people.fetching,\n    photoDetails: store.photos.photoDetails,\n    fetchingPhotoDetail: store.photos.fetchingPhotoDetail,\n    fetchedPhotoDetail: store.photos.fetchedPhotoDetail,\n  }\n})(AlbumPersonGallery)\n"
  },
  {
    "path": "src/layouts/albumPlace.js",
    "content": "import React, { Component } from \"react\";\nimport { connect } from \"react-redux\";\nimport {\n  AlbumDateCard,\n  AlbumDateCardPlaceholder,\n  AlbumDateCardPlain,\n  AlbumDateCardPlainPlaceholder,\n  AlbumAutoGallery\n} from \"../components/album\";\nimport {\n  Container,\n  Icon,\n  Dropdown,\n  Header,\n  Button,\n  Card,\n  Loader,\n  Label,\n  Popup,\n  Image,\n  Flag,\n  Divider,\n  Grid as GridSUI\n} from \"semantic-ui-react\";\nimport {\n  fetchCountStats,\n  fetchPhotoScanStatus,\n  fetchAutoAlbumProcessingStatus\n} from \"../actions/utilActions\";\n\nimport { Server, serverAddress } from \"../api_client/apiClient\";\nimport LazyLoad from \"react-lazyload\";\nimport { AlbumAutoMonths } from \"./albumAutoMonths\";\nimport { AlbumDateMonths } from \"./albumDateMonths\";\n\nimport { fetchPlaceAlbumsList } from \"../actions/albumsActions\";\nimport { searchPhotos } from \"../actions/searchActions\";\nimport { push } from \"react-router-redux\";\nimport store from \"../store\";\nimport { Grid, List, WindowScroller, AutoSizer } from \"react-virtualized\";\nimport { AllPhotosMap, EventMap, LocationClusterMap } from \"../components/maps\";\nimport CountryPiChart from \"../components/charts/countryPiChart\";\nimport WordCloud from \"../components/charts/wordCloud\";\nimport { Link } from \"react-router-dom\";\nimport { SecuredImageJWT } from \"../components/SecuredImage\";\n\nimport { countryNames } from \"../util/countryNames\";\nimport _ from \"lodash\";\n\nvar topMenuHeight = 45; // don't change this\nvar ESCAPE_KEY = 27;\nvar ENTER_KEY = 13;\nvar RIGHT_ARROW_KEY = 39;\nvar UP_ARROW_KEY = 38;\nvar LEFT_ARROW_KEY = 37;\nvar DOWN_ARROW_KEY = 40;\n\nvar SIDEBAR_WIDTH = 85;\n\nexport class AlbumPlace extends Component {\n  constructor() {\n    super();\n    this.state = {\n      geolocationLevel: 1,\n      width: window.innerWidth,\n      height: window.innerHeight,\n      entrySquareSize: 200,\n      showMap: false,\n      gridHeight: window.innerHeight - topMenuHeight - 60,\n      headerHeight: 60\n    };\n    this.calculateEntrySquareSize = this.calculateEntrySquareSize.bind(this);\n    this.cellRenderer = this.cellRenderer.bind(this);\n  }\n\n  componentWillMount() {\n    this.calculateEntrySquareSize();\n    window.addEventListener(\"resize\", this.calculateEntrySquareSize);\n    if (this.props.albumsPlaceList.length === 0) {\n      this.props.dispatch(fetchPlaceAlbumsList());\n    }\n  }\n\n  componentWillUnmount() {\n    window.removeEventListener(\"resize\", this.calculateEntrySquareSize);\n  }\n\n  calculateEntrySquareSize() {\n    if (window.innerWidth < 600) {\n      var numEntrySquaresPerRow = 2;\n    } else if (window.innerWidth < 800) {\n      var numEntrySquaresPerRow = 3;\n    } else if (window.innerWidth < 1000) {\n      var numEntrySquaresPerRow = 4;\n    } else if (window.innerWidth < 1200) {\n      var numEntrySquaresPerRow = 5;\n    } else {\n      var numEntrySquaresPerRow = 6;\n    }\n\n    var columnWidth = window.innerWidth - SIDEBAR_WIDTH - 5 - 5 - 15;\n\n    var entrySquareSize = columnWidth / numEntrySquaresPerRow;\n    var numEntrySquaresPerRow = numEntrySquaresPerRow;\n    this.setState({\n      ...this.state,\n      width: window.innerWidth,\n      height: window.innerHeight,\n      entrySquareSize: entrySquareSize,\n      numEntrySquaresPerRow: numEntrySquaresPerRow\n    });\n  }\n\n  cellRenderer = ({ columnIndex, key, rowIndex, style }) => {\n    var place = this.props.albumsPlaceListGroupedByGeolocationLevel[\n      this.state.geolocationLevel\n    ];\n    var albumPlaceIndex =\n      rowIndex * this.state.numEntrySquaresPerRow + columnIndex;\n    if (albumPlaceIndex < place.length) {\n      return (\n        <div key={key} style={style}>\n          <div\n            onClick={() => {\n              // store.dispatch(push(`/place/${this.props.albumsPlaceList[albumPlaceIndex].id}/`))\n              // store.dispatch(searchPhotos(this.props.albumsPlaceList[albumPlaceIndex].title))\n              // store.dispatch(push('/search'))\n            }}\n            style={{ padding: 5 }}\n          >\n            {place[albumPlaceIndex].cover_photos.slice(0, 1).map(photo => {\n              return (\n                <SecuredImageJWT\n                  label={{ as: 'a', corner: 'left', icon: 'map marker alternate' }}\n                  style={{ display: \"inline-block\", zIndex: 1 }}\n                  width={this.state.entrySquareSize - 10}\n                  height={this.state.entrySquareSize - 10}\n                  as={Link}\n                  to={`/place/${place[albumPlaceIndex].id}/`}\n                  src={\n                    serverAddress +\n                    \"/media/square_thumbnails/\" +\n                    photo.image_hash +\n                    \".jpg\"\n                  }\n                />\n              );\n            })}\n          </div>\n          <div style={{ paddingLeft: 15, paddingRight: 15, height: 50 }}>\n            {countryNames.includes(\n              place[albumPlaceIndex].title.toLowerCase()\n            ) ? (\n              <Flag name={place[albumPlaceIndex].title.toLowerCase()} />\n            ) : (\n              \"\"\n            )}\n            <b>{place[albumPlaceIndex].title}</b>\n            <br /> {place[albumPlaceIndex].photo_count} Photos\n          </div>\n        </div>\n      );\n    } else {\n      return <div key={key} style={style} />;\n    }\n  };\n\n  render() {\n    var album = this.props.albumsPlaceListGroupedByGeolocationLevel[\n      this.state.geolocationLevel\n    ];\n    var entrySquareSize = this.state.entrySquareSize;\n    var numEntrySquaresPerRow = this.state.numEntrySquaresPerRow;\n    var geolocationLevelOptions = _\n      .keys(this.props.albumsPlaceListGroupedByGeolocationLevel)\n      .map(el => ({ key: el, value: el, text: \"Location Level \" + `${el}` }));\n    return (\n      <div>\n        <div\n          style={{\n            position: \"fixed\",\n            top: topMenuHeight + 10,\n            right: 10,\n            float: \"right\",\n            zIndex: 10\n          }}\n        >\n          <Dropdown\n            className=\"icon\"\n            button\n            labeled\n            icon=\"filter\"\n            placeholder=\"Location Level\"\n            onChange={(e, { value }) =>\n              this.setState({ geolocationLevel: value })\n            }\n            defaultValue={\"1\"}\n            options={geolocationLevelOptions}\n          />\n\n          <Button\n            active={this.state.showMap}\n            color=\"blue\"\n            icon\n            labelPosition=\"right\"\n            onClick={() => {\n              this.setState({\n                showMap: !this.state.showMap,\n                gridHeight: !this.state.showMap\n                  ? this.state.height - topMenuHeight - 260\n                  : this.state.height - topMenuHeight - 60,\n                headerHeight: !this.state.showMap ? 260 : 60\n              });\n            }}\n            floated=\"right\"\n          >\n            <Icon name=\"map\" inverted />\n            {this.state.showMap ? \"Hide Map\" : \"Show Map\"}\n          </Button>\n        </div>\n\n        <div\n          style={{\n            height: this.state.headerHeight,\n            paddingTop: 10,\n            paddingRight: 5\n          }}\n        >\n          <Header as=\"h2\">\n            <Icon name=\"map outline\" />\n            <Header.Content>\n              Places{\" \"}\n              <Loader\n                size=\"tiny\"\n                inline\n                active={this.props.fetchingAlbumsPlaceList}\n              />\n              <Header.Subheader>\n                Showing top {this.props.albumsPlaceList.length} places\n              </Header.Subheader>\n            </Header.Content>\n          </Header>\n\n          {this.state.showMap && <LocationClusterMap height={200 - 20} />}\n        </div>\n        {album ? (\n          <AutoSizer\n            disableHeight\n            style={{ outline: \"none\", padding: 0, margin: 0 }}\n          >\n            {({ width }) => (\n              <Grid\n                style={{ outline: \"none\" }}\n                disableHeader={false}\n                cellRenderer={this.cellRenderer}\n                columnWidth={this.state.entrySquareSize}\n                columnCount={this.state.numEntrySquaresPerRow}\n                height={this.state.gridHeight}\n                rowHeight={this.state.entrySquareSize + 60}\n                rowCount={Math.ceil(\n                  this.props.albumsPlaceListGroupedByGeolocationLevel[\n                    this.state.geolocationLevel\n                  ].length / this.state.numEntrySquaresPerRow.toFixed(1)\n                )}\n                width={width}\n              />\n            )}\n          </AutoSizer>\n        ) : (\n          <div />\n        )}\n      </div>\n    );\n  }\n}\n\nexport class EntrySquare extends Component {\n  render() {\n    var images = this.props.coverPhotoUrls.map(function(coverPhotoUrl) {\n      return (\n        <SecuredImageJWT\n          style={{ display: \"inline-block\" }}\n          width={this.props.size / 2 - 20}\n          height={this.props.size / 2 - 20}\n          src={serverAddress + coverPhotoUrl}\n        />\n      );\n    }, this);\n    return (\n      <div\n        style={{\n          width: this.props.size,\n          display: \"inline-block\",\n          paddingLeft: 10,\n          paddingRight: 10\n        }}\n        onClick={() => {\n          store.dispatch(searchPhotos(this.props.title));\n          store.dispatch(push(\"/search\"));\n        }}\n      >\n        <div style={{ height: this.props.size }}>\n          <LazyLoad\n            once={true}\n            unmountIfInvisible={true}\n            height={this.props.size}\n          >\n            <Image.Group>{images}</Image.Group>\n          </LazyLoad>\n        </div>\n        <div style={{ height: 100 }}>\n          <b>{this.props.title}</b> ({this.props.photoCount})\n        </div>\n      </div>\n    );\n  }\n}\n\nAlbumPlace = connect(store => {\n  return {\n    albumsPlaceList: store.albums.albumsPlaceList,\n    albumsPlaceListGroupedByGeolocationLevel:\n      store.albums.albumsPlaceListGroupedByGeolocationLevel,\n    fetchingAlbumsPlaceList: store.albums.fetchingAlbumsPlaceList,\n    fetchedAlbumsPlaceList: store.albums.fetchedAlbumsPlaceList\n  };\n})(AlbumPlace);\n"
  },
  {
    "path": "src/layouts/albumPlaceGallery.js",
    "content": "import React, {Component} from 'react';\nimport { connect } from \"react-redux\";\nimport {fetchPlaceAlbum, fetchAutoAlbums, generateAutoAlbums} from '../actions/albumsActions'\nimport {Container, Icon, Divider, Header, Image, Button, Flag, Card, Loader} from 'semantic-ui-react'\n\nimport { push } from 'react-router-redux'\n\nimport _ from 'lodash'\nimport moment from 'moment'\nimport {PhotoListView} from './ReusablePhotoListView'\n\n\nconst topMenuHeight = 55 // don't change this\nconst ESCAPE_KEY = 27;\nconst ENTER_KEY = 13;\nconst RIGHT_ARROW_KEY = 39;\nconst UP_ARROW_KEY = 38;\nconst LEFT_ARROW_KEY = 37;\nconst DOWN_ARROW_KEY = 40;\n\nconst SIDEBAR_WIDTH = 85;\n\nconst DAY_HEADER_HEIGHT = 70\nconst leftMenuWidth = 85 // don't change this\n\n\n\n\nexport class AlbumPlaceGallery extends Component {\n    state = {\n      photosGroupedByDate: [],\n      idx2hash: [],\n      albumID: null,\n    }\n  \n    componentDidMount() {\n        this.props.dispatch(fetchPlaceAlbum(this.props.match.params.albumID))\n    }\n\n\n\n  \n  \n  \n    static getDerivedStateFromProps(nextProps,prevState){\n        if (nextProps.albumsPlace.hasOwnProperty(nextProps.match.params.albumID)){\n            const photos = nextProps.albumsPlace[nextProps.match.params.albumID].photos\n            if (prevState.idx2hash.length !== photos.length) {\n\n                var t0 = performance.now();\n                var groupedByDate = _.groupBy(photos,(el)=>{\n                    if (el.exif_timestamp) {\n                        return moment.utc(el.exif_timestamp).format('YYYY-MM-DD')\n                    } else {\n                        return \"No Timestamp\"\n                    }\n                })\n                var groupedByDateList = _.reverse(_.sortBy(_.toPairsIn(groupedByDate).map((el)=>{\n                    return {date:el[0],photos:el[1]}\n                }),(el)=>el.date))\n                var idx2hash = []\n                groupedByDateList.forEach((g)=>{\n                    g.photos.forEach((p)=>{\n                        idx2hash.push(p.image_hash)\n                    })\n                })\n                var t1 = performance.now();\n                return {\n                    ...prevState, \n                    photosGroupedByDate: groupedByDateList,\n                    idx2hash:idx2hash,\n                    albumID:nextProps.match.params.albumID\n                }\n            } else {\n                return null\n            }\n        } else {\n            return null\n        }\n    }\n  \n  \n  \n    render() {\n      const {fetchingAlbumsPlace} = this.props\n      return (\n        <PhotoListView \n          title={this.props.albumsPlace[this.props.match.params.albumID] ? this.props.albumsPlace[this.props.match.params.albumID].title : \"Loading... \"}\n          loading={fetchingAlbumsPlace}\n          titleIconName={'map outline'}\n          photosGroupedByDate={this.state.photosGroupedByDate}\n          idx2hash={this.state.idx2hash}\n        />\n      )  \n    }\n  }\n\n\nAlbumPlaceGallery = connect((store)=>{\n  return {\n    albumsPlace: store.albums.albumsPlace,\n    fetchingAlbumsPlace: store.albums.fetchingAlbumsPlace,\n    fetchedAlbumsPlace: store.albums.fetchedAlbumsPlace,\n    photoDetails: store.photos.photoDetails,\n    fetchingPhotoDetail: store.photos.fetchingPhotoDetail,\n    fetchedPhotoDetail: store.photos.fetchedPhotoDetail,\n  }\n})(AlbumPlaceGallery)\n"
  },
  {
    "path": "src/layouts/albumThing.js",
    "content": "import React, { Component } from \"react\";\nimport { connect } from \"react-redux\";\nimport {\n  AlbumDateCard,\n  AlbumDateCardPlaceholder,\n  AlbumDateCardPlain,\n  AlbumDateCardPlainPlaceholder,\n  AlbumAutoGallery\n} from \"../components/album\";\nimport {\n  Container,\n  Icon,\n  Header,\n  Button,\n  Card,\n  Loader,\n  Label,\n  Popup,\n  Image,\n  Divider\n} from \"semantic-ui-react\";\nimport {\n  fetchCountStats,\n  fetchPhotoScanStatus,\n  fetchAutoAlbumProcessingStatus\n} from \"../actions/utilActions\";\nimport { Grid, List, WindowScroller, AutoSizer } from \"react-virtualized\";\n\nimport { Server, serverAddress } from \"../api_client/apiClient\";\nimport LazyLoad from \"react-lazyload\";\nimport { AlbumAutoMonths } from \"./albumAutoMonths\";\nimport { AlbumDateMonths } from \"./albumDateMonths\";\n\nimport { fetchThingAlbumsList } from \"../actions/albumsActions\";\nimport { searchPhotos } from \"../actions/searchActions\";\nimport { push } from \"react-router-redux\";\nimport store from \"../store\";\nimport { Link } from \"react-router-dom\";\nimport { SecuredImageJWT } from \"../components/SecuredImage\";\n\nvar topMenuHeight = 45; // don't change this\nvar ESCAPE_KEY = 27;\nvar ENTER_KEY = 13;\nvar RIGHT_ARROW_KEY = 39;\nvar UP_ARROW_KEY = 38;\nvar LEFT_ARROW_KEY = 37;\nvar DOWN_ARROW_KEY = 40;\n\nvar SIDEBAR_WIDTH = 85;\n\nexport class AlbumThing extends Component {\n  constructor() {\n    super();\n    this.setState({\n      width: window.innerWidth,\n      height: window.innerHeight,\n      entrySquareSize: 200\n    });\n    this.calculateEntrySquareSize = this.calculateEntrySquareSize.bind(this);\n    this.cellRenderer = this.cellRenderer.bind(this);\n  }\n\n  componentWillMount() {\n    this.calculateEntrySquareSize();\n    window.addEventListener(\"resize\", this.calculateEntrySquareSize);\n    if (this.props.albumsThingList.length === 0) {\n      this.props.dispatch(fetchThingAlbumsList());\n    }\n  }\n\n  componentWillUnount() {\n    window.removeEventListener(\"resize\", this.calculateEntrySquareSize);\n  }\n\n  calculateEntrySquareSize() {\n    if (window.innerWidth < 600) {\n      var numEntrySquaresPerRow = 2;\n    } else if (window.innerWidth < 800) {\n      var numEntrySquaresPerRow = 3;\n    } else if (window.innerWidth < 1000) {\n      var numEntrySquaresPerRow = 4;\n    } else if (window.innerWidth < 1200) {\n      var numEntrySquaresPerRow = 5;\n    } else {\n      var numEntrySquaresPerRow = 6;\n    }\n\n    var columnWidth = window.innerWidth - SIDEBAR_WIDTH - 5 - 5 - 15;\n\n    var entrySquareSize = columnWidth / numEntrySquaresPerRow;\n    var numEntrySquaresPerRow = numEntrySquaresPerRow;\n    this.setState({\n      width: window.innerWidth,\n      height: window.innerHeight,\n      entrySquareSize: entrySquareSize,\n      numEntrySquaresPerRow: numEntrySquaresPerRow\n    });\n  }\n\n  cellRenderer = ({ columnIndex, key, rowIndex, style }) => {\n    var albumThingIndex =\n      rowIndex * this.state.numEntrySquaresPerRow + columnIndex;\n    if (albumThingIndex < this.props.albumsThingList.length) {\n      return (\n        <div key={key} style={style}>\n          <div\n            onClick={() => {\n              store.dispatch(\n                searchPhotos(this.props.albumsThingList[albumThingIndex].title)\n              );\n              store.dispatch(push(\"/search\"));\n            }}\n            style={{ padding: 5 }}\n          >\n            {this.props.albumsThingList[albumThingIndex].cover_photos\n              .slice(0, 1)\n              .map(photo => {\n                return (\n                  <SecuredImageJWT\n                    label={{ as: 'a', corner: 'left', icon: 'tag' }}\n                    style={{ display: \"inline-block\" }}\n                    width={this.state.entrySquareSize - 10}\n                    height={this.state.entrySquareSize - 10}\n                    src={\n                      serverAddress +\n                      \"/media/square_thumbnails/\" +\n                      photo.image_hash +\n                      \".jpg\"\n                    }\n                  />\n                );\n              })}\n          </div>\n          <div style={{ paddingLeft: 15, paddingRight: 15, height: 50 }}>\n            \n            <b>{this.props.albumsThingList[albumThingIndex].title}</b>\n            <br />\n            {this.props.albumsThingList[albumThingIndex].photo_count} Photos\n          </div>\n        </div>\n      );\n    } else {\n      return <div key={key} style={style} />;\n    }\n  };\n\n  render() {\n    var entrySquareSize = this.state.entrySquareSize;\n    var numEntrySquaresPerRow = this.state.numEntrySquaresPerRow;\n    return (\n      <div>\n        <div style={{ height: 60, paddingTop: 10 }}>\n          <Header as=\"h2\">\n            <Icon name=\"tags\" />\n            <Header.Content>\n              Things{\" \"}\n              <Loader\n                size=\"tiny\"\n                inline\n                active={this.props.fetchingAlbumsThingList}\n              />\n              <Header.Subheader>\n                Showing top {this.props.albumsThingList.length} things\n              </Header.Subheader>\n            </Header.Content>\n          </Header>\n        </div>\n\n        <AutoSizer\n          disableHeight\n          style={{ outline: \"none\", padding: 0, margin: 0 }}\n        >\n          {({ width }) => (\n            <Grid\n              style={{ outline: \"none\" }}\n              disableHeader={false}\n              cellRenderer={this.cellRenderer}\n              columnWidth={this.state.entrySquareSize}\n              columnCount={this.state.numEntrySquaresPerRow}\n              height={this.state.height - topMenuHeight - 60}\n              rowHeight={this.state.entrySquareSize + 60}\n              rowCount={Math.ceil(\n                this.props.albumsThingList.length /\n                  this.state.numEntrySquaresPerRow.toFixed(1)\n              )}\n              width={width}\n            />\n          )}\n        </AutoSizer>\n      </div>\n    );\n  }\n}\n\nexport class EntrySquare extends Component {\n  render() {\n    var images = this.props.cover_photos.map(function(photo) {\n      return (\n        <SecuredImageJWT\n          style={{ display: \"inline-block\" }}\n          width={this.props.size / 2 - 20}\n          height={this.props.size / 2 - 20}\n          src={\n            serverAddress +\n            \"/media/square_thumbnails/\" +\n            photo.image_hash +\n            \".jpg\"\n          }\n        />\n      );\n    }, this);\n    return (\n      <div\n        style={{\n          width: this.props.size,\n          display: \"inline-block\",\n          paddingLeft: 10,\n          paddingRight: 10\n        }}\n        onClick={() => {\n          store.dispatch(searchPhotos(this.props.title));\n          store.dispatch(push(\"/search\"));\n        }}\n      >\n        <div style={{ height: this.props.size }}>\n          <LazyLoad\n            once={true}\n            unmountIfInvisible={true}\n            height={this.props.size}\n          >\n            <Image.Group>{images}</Image.Group>\n          </LazyLoad>\n        </div>\n        <div style={{ height: 100 }}>\n          <b>{this.props.title}</b> ({this.props.photoCount})\n        </div>\n      </div>\n    );\n  }\n}\n\nAlbumThing = connect(store => {\n  return {\n    albumsThingList: store.albums.albumsThingList,\n    fetchingAlbumsThingList: store.albums.fetchingAlbumsThingList,\n    fetchedAlbumsThingList: store.albums.fetchedAlbumsThingList\n  };\n})(AlbumThing);\n"
  },
  {
    "path": "src/layouts/albumUser.js",
    "content": "import React, { Component } from \"react\";\nimport { connect } from \"react-redux\";\nimport {\n  AlbumDateCard,\n  AlbumDateCardPlaceholder,\n  AlbumDateCardPlain,\n  AlbumDateCardPlainPlaceholder,\n  AlbumAutoGallery\n} from \"../components/album\";\nimport {\n  Container,\n  Icon,\n  Header,\n  Button,\n  Card,\n  Loader,\n  Label,\n  Popup,\n  Image,\n  Divider\n} from \"semantic-ui-react\";\nimport {\n  fetchCountStats,\n  fetchPhotoScanStatus,\n  fetchAutoAlbumProcessingStatus\n} from \"../actions/utilActions\";\nimport { Grid, List, WindowScroller, AutoSizer } from \"react-virtualized\";\n\nimport { Server, serverAddress } from \"../api_client/apiClient\";\nimport LazyLoad from \"react-lazyload\";\nimport { AlbumAutoMonths } from \"./albumAutoMonths\";\nimport { AlbumDateMonths } from \"./albumDateMonths\";\n\nimport {\n  fetchUserAlbumsList,\n  fetchThingAlbumsList,\n  deleteUserAlbum\n} from \"../actions/albumsActions\";\nimport { searchPhotos } from \"../actions/searchActions\";\nimport { push } from \"react-router-redux\";\nimport store from \"../store\";\nimport { Link } from \"react-router-dom\";\nimport { SecuredImageJWT } from \"../components/SecuredImage\";\n\nvar topMenuHeight = 45; // don't change this\nvar ESCAPE_KEY = 27;\nvar ENTER_KEY = 13;\nvar RIGHT_ARROW_KEY = 39;\nvar UP_ARROW_KEY = 38;\nvar LEFT_ARROW_KEY = 37;\nvar DOWN_ARROW_KEY = 40;\n\nvar SIDEBAR_WIDTH = 85;\n\nexport class AlbumUser extends Component {\n  constructor() {\n    super();\n    this.setState({\n      width: window.innerWidth,\n      height: window.innerHeight,\n      entrySquareSize: 200\n    });\n    this.calculateEntrySquareSize = this.calculateEntrySquareSize.bind(this);\n    this.cellRenderer = this.cellRenderer.bind(this);\n  }\n\n  componentWillMount() {\n    this.calculateEntrySquareSize();\n    window.addEventListener(\"resize\", this.calculateEntrySquareSize.bind(this));\n    if (this.props.albumsUserList.length === 0) {\n      this.props.dispatch(fetchUserAlbumsList());\n    }\n  }\n\n  calculateEntrySquareSize() {\n    if (window.innerWidth < 600) {\n      var numEntrySquaresPerRow = 2;\n    } else if (window.innerWidth < 800) {\n      var numEntrySquaresPerRow = 3;\n    } else if (window.innerWidth < 1000) {\n      var numEntrySquaresPerRow = 4;\n    } else if (window.innerWidth < 1200) {\n      var numEntrySquaresPerRow = 5;\n    } else {\n      var numEntrySquaresPerRow = 6;\n    }\n\n    var columnWidth = window.innerWidth - SIDEBAR_WIDTH - 5 - 5 - 15;\n\n    var entrySquareSize = columnWidth / numEntrySquaresPerRow;\n    var numEntrySquaresPerRow = numEntrySquaresPerRow;\n    this.setState({\n      width: window.innerWidth,\n      height: window.innerHeight,\n      entrySquareSize: entrySquareSize,\n      numEntrySquaresPerRow: numEntrySquaresPerRow\n    });\n  }\n\n  cellRenderer = ({ columnIndex, key, rowIndex, style }) => {\n    var albumUserIndex =\n      rowIndex * this.state.numEntrySquaresPerRow + columnIndex;\n    if (albumUserIndex < this.props.albumsUserList.length) {\n      return (\n        <div key={key} style={style}>\n          <div\n            onClick={() => {\n                //todo\n            }}\n            style={{ padding: 5 }}\n          >\n            <SecuredImageJWT\n              label={{ as: 'a', corner: 'left', icon: 'bookmark', color: 'red' }}\n              style={{ display: \"inline-block\" }}\n              as={Link}\n              to={`/useralbum/${this.props.albumsUserList[albumUserIndex].id}`}\n              width={this.state.entrySquareSize - 10}\n              height={this.state.entrySquareSize - 10}\n              src={\n                serverAddress +\n                \"/media/square_thumbnails/\" +\n                this.props.albumsUserList[albumUserIndex].cover_photos[0]\n                  .image_hash +\n                \".jpg\"\n              }\n            />\n          </div>\n          <div\n            className=\"personCardName\"\n            style={{ paddingLeft: 15, paddingRight: 15, height: 50 }}\n          >\n            \n            {\n              this.props.albumsUserList[albumUserIndex].shared_to.length>0 && \n              <Popup \n                style={{padding:10}}\n                size='tiny'\n                position='center right'\n                header='Shared with:'\n                trigger={<Icon name='users'/>}\n                content={\n                  this.props.albumsUserList[albumUserIndex].shared_to.map(el=>{\n                    return <div><Icon name='user circle'/><b>{el.username}</b></div>\n                  })\n                }/>\n\n            }\n            <b>{this.props.albumsUserList[albumUserIndex].title}</b> <br />\n            {this.props.albumsUserList[albumUserIndex].photo_count} Photo(s)\n            {true && (\n              <div\n                className=\"personRemoveButton\"\n                style={{ right: 0, position: \"absolute\" }}\n              >\n                <Popup\n                  wide=\"very\"\n                  hoverable\n                  flowing\n                  trigger={<Icon color=\"grey\" name=\"remove\" />}\n                  content={\n                    <div style={{ textAlign: \"center\" }}>\n                      Are you sure you want to delete{\" \"}\n                      <b>{this.props.albumsUserList[albumUserIndex].title}</b>?<br />\n                      This action cannot be undone!<br />\n                      <Divider />\n                      <div>\n                        <Button\n                          onClick={() =>\n                            this.props.dispatch(\n                              deleteUserAlbum(\n                                this.props.albumsUserList[albumUserIndex].id,\n                                this.props.albumsUserList[albumUserIndex].title\n                              )\n                            )\n                          }\n                          negative\n                        >\n                          Yes\n                        </Button>\n                      </div>\n                    </div>\n                  }\n                  on=\"focus\"\n                  position=\"bottom center\"\n                />\n              </div>\n            )}\n          </div>\n        </div>\n      );\n    } else {\n      return <div key={key} style={style} />;\n    }\n  };\n\n  render() {\n    var entrySquareSize = this.state.entrySquareSize;\n    var numEntrySquaresPerRow = this.state.numEntrySquaresPerRow;\n    return (\n      <div>\n        <div style={{ height: 60, paddingTop: 10 }}>\n          <Header as=\"h2\">\n            <Icon name=\"bookmark\" />\n            <Header.Content>\n              My Albums{\" \"}\n              <Loader\n                size=\"tiny\"\n                inline\n                active={this.props.fetchingAlbumsUserList}\n              />\n              <Header.Subheader>\n                Showing {this.props.albumsUserList.length} user created albums\n              </Header.Subheader>\n            </Header.Content>\n          </Header>\n        </div>\n\n        <AutoSizer\n          disableHeight\n          style={{ outline: \"none\", padding: 0, margin: 0 }}\n        >\n          {({ width }) => (\n            <Grid\n              style={{ outline: \"none\" }}\n              disableHeader={false}\n              cellRenderer={this.cellRenderer}\n              columnWidth={this.state.entrySquareSize}\n              columnCount={this.state.numEntrySquaresPerRow}\n              height={this.state.height - topMenuHeight - 60}\n              rowHeight={this.state.entrySquareSize + 60}\n              rowCount={Math.ceil(\n                this.props.albumsUserList.length /\n                  this.state.numEntrySquaresPerRow.toFixed(1)\n              )}\n              width={width}\n            />\n          )}\n        </AutoSizer>\n      </div>\n    );\n  }\n}\n\nexport class EntrySquare extends Component {\n  render() {\n    var images = this.props.cover_photos.map(function(photo) {\n      return (\n        <SecuredImageJWT\n          style={{ display: \"inline-block\" }}\n          width={this.props.size / 2 - 20}\n          height={this.props.size / 2 - 20}\n          src={\n            serverAddress +\n            \"/media/square_thumbnails/\" +\n            photo.image_hash +\n            \".jpg\"\n          }\n        />\n      );\n    }, this);\n    return (\n      <div\n        style={{\n          width: this.props.size,\n          display: \"inline-block\",\n          paddingLeft: 10,\n          paddingRight: 10\n        }}\n        onClick={() => {\n          store.dispatch(searchPhotos(this.props.title));\n          store.dispatch(push(\"/search\"));\n        }}\n      >\n        <div style={{ height: this.props.size }}>\n          <LazyLoad\n            once={true}\n            unmountIfInvisible={true}\n            height={this.props.size}\n          >\n            <Image.Group>{images}</Image.Group>\n          </LazyLoad>\n        </div>\n        <div style={{ height: 100 }}>\n          <b>{this.props.title}</b> ({this.props.photoCount})\n        </div>\n      </div>\n    );\n  }\n}\n\nAlbumUser = connect(store => {\n  return {\n    albumsUserList: store.albums.albumsUserList,\n    fetchingAlbumsUserList: store.albums.fetchingAlbumsUserList,\n    fetchedAlbumsUserList: store.albums.fetchedAlbumsUserList\n  };\n})(AlbumUser);\n"
  },
  {
    "path": "src/layouts/albumUserGallery.js",
    "content": "import React, { Component } from \"react\";\nimport { connect } from \"react-redux\";\nimport {\n  fetchUserAlbum,\n  fetchPlaceAlbum,\n  fetchAutoAlbums,\n  generateAutoAlbums\n} from \"../actions/albumsActions\";\nimport {\n  Container,\n  Icon,\n  Divider,\n  Header,\n  Image,\n  Button,\n  Flag,\n  Card,\n  Loader,\n  Label\n} from \"semantic-ui-react\";\nimport { fetchPeople, fetchEgoGraph } from \"../actions/peopleActions\";\nimport {\n  fetchPhotoDetail,\n  fetchNoTimestampPhotoList\n} from \"../actions/photosActions\";\n\nimport { Server, serverAddress } from \"../api_client/apiClient\";\nimport { Grid, List, WindowScroller, AutoSizer } from \"react-virtualized\";\nimport { EgoGraph } from \"../components/egoGraph\";\nimport { push } from \"react-router-redux\";\nimport { countryNames } from \"../util/countryNames\";\nimport {\n  AllPhotosMap,\n  EventMap,\n  LocationClusterMap,\n  LocationMap\n} from \"../components/maps\";\nimport { LightBox } from \"../components/lightBox\";\n\nimport _ from \"lodash\";\nimport moment from \"moment\";\nimport { PhotoListView } from \"./ReusablePhotoListView\";\n\nvar topMenuHeight = 45; // don't change this\nvar ESCAPE_KEY = 27;\nvar ENTER_KEY = 13;\nvar RIGHT_ARROW_KEY = 39;\nvar UP_ARROW_KEY = 38;\nvar LEFT_ARROW_KEY = 37;\nvar DOWN_ARROW_KEY = 40;\n\nvar SIDEBAR_WIDTH = 85;\n\nvar DAY_HEADER_HEIGHT = 70;\nvar leftMenuWidth = 85; // don't change this\n\nexport class AlbumUserGallery extends Component {\n  state = {\n    photosGroupedByDate: [],\n    idx2hash: [],\n    albumID: null\n  };\n\n  componentDidMount() {\n    this.props.dispatch(fetchUserAlbum(this.props.match.params.albumID));\n  }\n\n  static getDerivedStateFromProps(nextProps, prevState) {\n    if (nextProps.albumsUser.hasOwnProperty(nextProps.match.params.albumID)) {\n      const photos =\n        nextProps.albumsUser[nextProps.match.params.albumID].photos;\n      if (prevState.idx2hash.length != photos.length) {\n        var t0 = performance.now();\n        var groupedByDate = _.groupBy(photos, el => {\n          if (el.exif_timestamp) {\n            return moment.utc(el.exif_timestamp).format(\"YYYY-MM-DD\");\n          } else {\n            return \"No Timestamp\";\n          }\n        });\n        var groupedByDateList = _.reverse(\n          _.sortBy(\n            _.toPairsIn(groupedByDate).map(el => {\n              return { date: el[0], photos: el[1] };\n            }),\n            el => el.date\n          )\n        );\n        var idx2hash = [];\n        groupedByDateList.forEach(g => {\n          g.photos.forEach(p => {\n            idx2hash.push(p.image_hash);\n          });\n        });\n        var t1 = performance.now();\n        console.log(t1 - t0);\n        return {\n          ...prevState,\n          photosGroupedByDate: groupedByDateList,\n          idx2hash: idx2hash,\n          albumID: nextProps.match.params.albumID\n        };\n      } else {\n        return null;\n      }\n    } else {\n      return null;\n    }\n  }\n\n  render() {\n    const { fetchingAlbumsUser } = this.props;\n    console.log(this.props);\n    const isPublic =\n      this.props.albumsUser[this.props.match.params.albumID] &&\n      this.props.albumsUser[this.props.match.params.albumID].owner.id !==\n        this.props.auth.access.user_id;\n    return (\n      <PhotoListView\n        title={\n          this.props.albumsUser[this.props.match.params.albumID]\n            ? this.props.albumsUser[this.props.match.params.albumID].title\n            : \"Loading... \"\n        }\n        additionalSubHeader={\n          this.props.albumsUser[this.props.match.params.albumID] && isPublic ? (\n            <span>\n              {\", \"}owned by{\" \"}\n              <b style={{ color: \"black\" }}>\n                {this.props.albumsUser[this.props.match.params.albumID].owner\n                  .id === this.props.auth.access.user_id\n                  ? \"you\"\n                  : this.props.albumsUser[this.props.match.params.albumID].owner\n                      .username}\n              </b>\n            </span>\n          ) : (\n            \"\"\n          )\n        }\n        loading={fetchingAlbumsUser}\n        titleIconName={\"bookmark\"}\n        photosGroupedByDate={this.state.photosGroupedByDate}\n        idx2hash={this.state.idx2hash}\n        match={this.props.match}\n        isPublic={isPublic}\n      />\n    );\n  }\n}\n\nAlbumUserGallery = connect(store => {\n  return {\n    auth: store.auth,\n    albumsUser: store.albums.albumsUser,\n    fetchingAlbumsUser: store.albums.fetchingAlbumsUser,\n    fetchedAlbumsUser: store.albums.fetchedAlbumsUser,\n    photoDetails: store.photos.photoDetails,\n    fetchingPhotoDetail: store.photos.fetchingPhotoDetail,\n    fetchedPhotoDetail: store.photos.fetchedPhotoDetail\n  };\n})(AlbumUserGallery);\n"
  },
  {
    "path": "src/layouts/albums.js",
    "content": "import React, {Component} from 'react';\nimport { connect } from \"react-redux\";\nimport {fetchPeopleAlbums, fetchAutoAlbums, generateAutoAlbums, fetchDateAlbumsList} from '../actions/albumsActions'\nimport {AlbumDateCard, AlbumDateCardPlaceholder, AlbumDateCardPlain, AlbumDateCardPlainPlaceholder, AlbumAutoGallery} from '../components/album'\nimport {Container, Icon, Header, Button, Card, Label, Popup, Image, Divider} from 'semantic-ui-react'\nimport {fetchCountStats,fetchPhotoScanStatus,\n        fetchAutoAlbumProcessingStatus} from '../actions/utilActions'\n\nimport {Server, serverAddress} from '../api_client/apiClient'\nimport LazyLoad from 'react-lazyload';\nimport {AlbumAutoMonths} from './albumAutoMonths'\nimport {AlbumDateMonths} from './albumDateMonths'\n\n\nvar ESCAPE_KEY = 27;\nvar ENTER_KEY = 13;\nvar RIGHT_ARROW_KEY = 39;\nvar UP_ARROW_KEY = 38;\nvar LEFT_ARROW_KEY = 37;\nvar DOWN_ARROW_KEY = 40;\n\nvar SIDEBAR_WIDTH = 85;\n\nexport class Albums extends Component {\n  constructor() {\n    super();\n  \tthis.setState({\n      width:  window.innerWidth,\n      height: window.innerHeight,\n      entrySquareSize:200\n  \t})\n    this.calculateEntrySquareSize = this.calculateEntrySquareSize.bind(this)\n  }\n\n  componentWillMount() {\n    this.calculateEntrySquareSize();\n    window.addEventListener(\"resize\", this.calculateEntrySquareSize.bind(this));\n  }\n\n  calculateEntrySquareSize() {\n  \tif (window.innerWidth < 600) {\n  \t\tvar numEntrySquaresPerRow = 2\n  \t} \n    else if (window.innerWidth < 800) {\n      var numEntrySquaresPerRow = 3\n    }\n  \telse if (window.innerWidth < 1000) {\n  \t\tvar numEntrySquaresPerRow = 4\n  \t}\n    else if (window.innerWidth < 1200) {\n      var numEntrySquaresPerRow = 5\n    }\n  \telse {\n  \t\tvar numEntrySquaresPerRow = 6\n  \t}\n\n    var columnWidth = window.innerWidth - SIDEBAR_WIDTH - 5 - 5 - 15\n\n    console.log(columnWidth)\n    var entrySquareSize = columnWidth / numEntrySquaresPerRow\n    var numEntrySquaresPerRow = numEntrySquaresPerRow\n  \tthis.setState({\n      width:  window.innerWidth,\n      height: window.innerHeight,\n      entrySquareSize:entrySquareSize,\n      numEntrySquaresPerRow:numEntrySquaresPerRow\n  \t})\n  }\n\n\n\trender () {\n\t\tvar entrySquareSize = this.state.entrySquareSize\n    var numEntrySquaresPerRow = this.state.numEntrySquaresPerRow\n\t\treturn (\n\t\t\t\t<div>\n        <div>\n\t\t\t\t<EntrySquare size={entrySquareSize} title='People'/>\n\t\t\t\t<EntrySquare size={entrySquareSize} title='Things'/>\n\t\t\t\t<EntrySquare size={entrySquareSize} title='Places'/>\n\t\t\t\t<EntrySquare size={entrySquareSize} title='Days'/>\n\t\t\t\t<EntrySquare size={entrySquareSize} title='TBI'/>\n\t\t\t\t<EntrySquare size={entrySquareSize} title='TBI'/>\n        </div>\n        <Divider/>\n\n\t\t\t\t</div>\n\t\t)\n\t}\n}\n\nexport class EntrySquare extends Component {\n\trender () {\n\t\treturn (\n\t\t\t<div style={{\n        width:this.props.size,\n        display:'inline-block',\n        paddingLeft:10,\n        paddingRight:10}}>\n\t\t\t\t<Image \n\t\t\t\t\twidth={this.props.size-20} \n\t\t\t\t\theight={this.props.size-20}\n\t\t\t\t\tsrc={'/thumbnail_placeholder.png'}/>\n\t\t\t\t<div style={{paddingTop:10,paddingBottom:20}}>\n\t\t\t\t\t{this.props.title}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t)\n\t}\n}"
  },
  {
    "path": "src/layouts/albumsAutoListCardView.js",
    "content": "import Immutable from \"immutable\";\nimport PropTypes from \"prop-types\";\nimport React, { PureComponent, Component} from \"react\";\nimport {\n  Collection,\n  CellMeasurer,\n  CellMeasurerCache,\n  createMasonryCellPositioner,\n  Masonry,\n  AutoSizer,\n  WindowScroller,\n} from 'react-virtualized';\nimport styles from 'react-virtualized/styles.css'; // only needs to be imported once\nimport { Card, Image, Header, Divider, Item, Loader, Dimmer,\n         Container, Label, Popup, Segment, Button, Icon, Rating} from 'semantic-ui-react';\nimport { connect } from \"react-redux\";\n\n\nimport {fetchAutoAlbumsList} from '../actions/albumsActions'\n\nimport {\n  BrowserRouter as Router,\n  Route,\n  Link\n} from 'react-router-dom'\n\nimport {fetchPeopleAlbums, fetchAutoAlbums, generateAutoAlbums} from '../actions/albumsActions'\nimport {fetchCountStats,fetchPhotoScanStatus,\n        fetchAutoAlbumProcessingStatus} from '../actions/utilActions'\n\nimport {Server, serverAddress} from '../api_client/apiClient'\n\n\nconst month2month = {\n  \"01\":\"January\",\n  \"02\":\"February\",\n  \"03\":\"March\",\n  \"04\":\"April\",\n  \"05\":\"May\",\n  \"06\":\"June\",\n  \"07\":\"July\",\n  \"08\":\"August\",\n  \"09\":\"September\",\n  \"10\":\"October\",\n  \"11\":\"November\",\n  \"12\":\"December\"\n}\n\n\nexport class AlbumsAutoListCardView extends Component {\n  constructor(props){\n    super(props)\n    this.insertMonthCardsIntoAlbumsList = this.insertMonthCardsIntoAlbumsList.bind(this)\n  }\n\n  insertMonthCardsIntoAlbumsList(){\n    var newAlbumsList = []\n\n    this.props.albumsAutoList.map(function(album){\n      if (newAlbumsList.length>0){\n        var lastMonth = newAlbumsList[newAlbumsList.length-1].timestamp.split('T')[0].split('-').slice(0,2).join('-')\n        var thisMonth = album.timestamp.split('T')[0].split('-').slice(0,2).join('-')\n        if (lastMonth==thisMonth) {\n          newAlbumsList.push(album)\n        } \n        else {\n          newAlbumsList.push(thisMonth)\n          newAlbumsList.push(album)          \n        }\n      }\n      else {\n        var newMonth = album.timestamp.split('T')[0].split('-').slice(0,2).join('-')\n        newAlbumsList.push(newMonth)\n        newAlbumsList.push(album)\n      }\n    })\n    return newAlbumsList\n  }\n\n  render() {\n    if (this.props.fetchedAlbumsAutoList) {\n      var albumListWithMonthCards = this.insertMonthCardsIntoAlbumsList()\n      return (\n        <div style={{padding:\"10px\"}}>\n          <AlbumsAutoListHeader/>\n          <AlbumsAutoListCards albums={albumListWithMonthCards}/>\n        </div>\n      )\n    }\n    else {\n      return (\n        <div style={{padding:\"10px\"}}>\n          <AlbumsAutoListHeader/>\n          <Dimmer active>\n            <Loader active>\n              Loading Event Albums List...\n              Might take a while if not cached in the server.\n            </Loader>\n          </Dimmer>\n        </div>\n      )      \n    }\n  }\n}\n\n\nexport class MonthCard extends Component {\n  render() {\n    return (\n      <div style={{\n        width:'150px',\n        height:'300px'}}>\n        <div style={{position:'absolute',top:'100px',textAlign:'center'}}>\n          <Header as='h1'>\n            <Header.Content>\n              {month2month[this.props.month.split('-')[1]]}\n              <Header.Subheader as='h1' textAlign=\"center\">\n                {this.props.month.split('-')[0]}\n              </Header.Subheader>\n            </Header.Content>\n          </Header>\n        </div>\n      </div>\n    )\n  }\n}\n\n\nexport class AlbumAutoCard extends Component {\n  render() {\n    var numPeople = this.props.album.people.length\n    var albumId = this.props.album.people.id\n    if (this.props.album.people.length > 0) {\n      var mappedPeopleIcons = this.props.album.people.map(function(person){\n        return (\n          <Image height={30} width={30} shape='circular' src={serverAddress+person.face_url}/>\n        )\n      })\n      mappedPeopleIcons = (\n        <Image.Group>{mappedPeopleIcons}</Image.Group>\n      )\n    }\n    else {\n      // empty placeholder so the extra portion (with face icons) of the cards line up\n      var mappedPeopleIcons = (<div style={{height:'30px', width:'30px', verticalAlign:'middle'}}></div>)\n    }\n    return (\n      <div style={{\n        border:'1px solid #dddddd',\n        width:'150px',\n        height:'300px',\n        borderRadius: \"0.3rem\"}}>\n        <Image \n          as={Link}\n          to={`/albums/autoview/${this.props.album.id}`}\n          height={200} width={150} \n          src={serverAddress+this.props.album.cover_photo_url}/>\n        <div style={{padding:'10px'}}>\n          <span style={{fontSize:'15',fontWeight:'bold'}}>{this.props.album.title}</span><br/>\n          <div style={{paddingTop:'5px'}}>\n            <span style={{color:'grey'}}>{this.props.album.timestamp.split('T')[0]}</span>\n          </div>\n          <div style={{paddingTop:'5px', textAlign:'right',top:'240px',position:'absolute'}}>\n            <span style={{color:'grey',fontWeight:'bold'}}>{this.props.album.photo_count} Photos</span>\n          </div>\n          <div style={{paddingTop:'5px', textAlign:'right',top:'260px',position:'absolute'}}>\n            <Popup\n              trigger={\n                <span style={{\n                  color:'grey',\n                  fontWeight:'bold'}}>\n                  {this.props.album.people.length} People\n                </span>}\n              content={mappedPeopleIcons}\n              basic/>\n          </div>\n          <div style={{paddingTop:'5px', textAlign:'right',top:'260px',left:'120px',position:'absolute'}}>\n            <Rating icon='heart' defaultRating={0} maxRating={1} />\n          </div>\n        </div>\n      </div>\n    )\n  }\n}\n\nexport class AlbumsAutoListHeader extends Component {\n\n  componentWillMount() {\n    this.props.dispatch(fetchAutoAlbumsList())\n    var _dispatch = this.props.dispatch\n    var intervalId = setInterval(function(){\n        _dispatch(fetchPhotoScanStatus())\n        _dispatch(fetchAutoAlbumProcessingStatus())\n      },2000\n    )\n    this.setState({intervalId:intervalId})\n  }\n\n  componentWillUnmount() {\n    clearInterval(this.state.intervalId)\n  }\n\n  handleAutoAlbumGen = e => this.props.dispatch(generateAutoAlbums())\n\n\n  render() {\n    return (\n      <div>\n        <div style={{width:'100%', textAlign:'center', paddingTop:'20px'}}>\n          <Icon.Group size='huge'>\n            <Icon inverted circular name='image'/>\n            <Icon inverted circular corner name='wizard'/>\n          </Icon.Group>\n        </div>\n        <Header as='h2' icon textAlign='center'>\n          <Header.Content>\n            Events\n            <Header.Subheader>View automatically generated event albums</Header.Subheader>\n          </Header.Content>\n        </Header>\n        <Divider hidden/>\n        <div>\n          <Button \n            onClick={this.handleAutoAlbumGen}\n            loading={this.props.statusAutoAlbumProcessing.status}\n            disabled={\n              this.props.statusAutoAlbumProcessing.status||\n              this.props.statusPhotoScan.status||\n              this.props.generatingAlbumsAuto||\n              this.props.scanningPhotos\n            }\n            fluid \n            color='blue'>\n            <Icon name='wizard'/>Generate More\n          </Button>\n        </div>\n      </div>\n    )\n  }\n}\n\n\n\n\n\nexport class AlbumsAutoListCards extends PureComponent {\n  constructor(props, context) {\n    super(props, context);\n\n    this._columnCount = 0;\n\n    this._cache = new CellMeasurerCache({\n      defaultHeight: 10,\n      defaultWidth: 150,\n      fixedWidth: true\n    });\n\n    this._columnHeights = {};\n\n    this.state = {\n      columnWidth: 150,\n      height: 200,\n      gutterSize: 10,\n      windowScrollerEnabled: true\n    };\n\n\n    this._cellRenderer = this._cellRenderer.bind(this);\n    this._onResize = this._onResize.bind(this);\n    this._renderAutoSizer = this._renderAutoSizer.bind(this);\n    this._renderMasonry = this._renderMasonry.bind(this);\n    this._setMasonryRef = this._setMasonryRef.bind(this);\n  }\n\n  render() {\n    const {\n      columnWidth,\n      height,\n      gutterSize,\n      windowScrollerEnabled\n    } = this.state;\n\n    let child;\n\n    if (windowScrollerEnabled) {\n      child = (\n        <WindowScroller>\n          {this._renderAutoSizer}\n        </WindowScroller>\n      );\n    } else {\n      child = this._renderAutoSizer({ height });\n    }\n\n    return (\n      <div style={{paddingTop:'10px'}}>{child}</div>\n    );\n\n  }\n\n  _calculateColumnCount() {\n    const { columnWidth, gutterSize } = this.state;\n\n    this._columnCount = Math.floor(this._width / (columnWidth + gutterSize));\n  }\n\n  _cellRenderer({ index, key, parent, style }) {\n    const { columnWidth } = this.state;\n    if (typeof(this.props.albums[index])=='object'){\n      return (\n        <CellMeasurer cache={this._cache} index={index} key={key} parent={parent}>\n          <div\n            className={styles.Cell}\n            style={{\n              ...style,\n              width: columnWidth\n            }}\n          >\n            <div\n              style={{\n              }}/>\n              <AlbumAutoCard album={this.props.albums[index]}/>\n\n          </div>\n        </CellMeasurer>\n      );\n    }\n    else {\n      return (\n        <CellMeasurer cache={this._cache} index={index} key={key} parent={parent}>\n          <div\n            className={styles.Cell}\n            style={{\n              ...style,\n              width: columnWidth\n            }}\n          >\n            <div\n              style={{\n              }}/>\n              <MonthCard month={this.props.albums[index]}/>\n\n          </div>\n        </CellMeasurer>      )\n    }\n  }\n\n  _initCellPositioner() {\n    if (typeof this._cellPositioner === \"undefined\") {\n      const { columnWidth, gutterSize } = this.state;\n\n      this._cellPositioner = createMasonryCellPositioner({\n        cellMeasurerCache: this._cache,\n        columnCount: this._columnCount,\n        columnWidth,\n        spacer: gutterSize\n      });\n    }\n  }\n\n  _onResize({ width }) {\n    this._width = width;\n\n    this._columnHeights = {};\n    this._calculateColumnCount();\n    this._resetCellPositioner();\n    this._masonry.recomputeCellPositions();\n  }\n\n  _renderAutoSizer({ height, scrollTop }) {\n    this._height = height;\n    this._scrollTop = scrollTop;\n\n    return (\n      <AutoSizer\n        disableHeight\n        onResize={this._onResize}\n        scrollTop={this._scrollTop}\n      >\n        {this._renderMasonry}\n      </AutoSizer>\n    );\n  }\n\n  _renderMasonry({ width }) {\n    this._width = width;\n\n    this._calculateColumnCount();\n    this._initCellPositioner();\n\n    const { height, windowScrollerEnabled } = this.state;\n    console.log(height)\n    return (\n      <div style={{paddingLeft:'10px'}}>\n        <Masonry\n          autoHeight={windowScrollerEnabled}\n          cellCount={this.props.albumsAutoList.length}\n          cellMeasurerCache={this._cache}\n          cellPositioner={this._cellPositioner}\n          cellRenderer={this._cellRenderer}\n          height={windowScrollerEnabled ? this._height : height}\n          ref={this._setMasonryRef}\n          scrollTop={this._scrollTop}\n          width={width}/>\n      </div>\n    );\n  }\n\n  _resetCellPositioner() {\n    const { columnWidth, gutterSize } = this.state;\n\n    this._cellPositioner.reset({\n      columnCount: this._columnCount,\n      columnWidth,\n      spacer: gutterSize\n    });\n  }\n\n  _setMasonryRef(ref) {\n    this._masonry = ref;\n  }\n}\n\n\nAlbumsAutoListCardView = connect((store)=>{\n  return {\n    albumsAutoList: store.albums.albumsAutoList,\n    fetchingAlbumsAutoList: store.albums.fetchingAlbumsAutoList,\n    fetchedAlbumsAutoList: store.albums.fetchedAlbumsAutoList,\n    generatingAlbumsAuto: store.albums.generatingAlbumsAuto,\n    generatedAlbumsAuto: store.albums.generatedAlbumsAuto,\n    statusAutoAlbumProcessing: store.util.statusAutoAlbumProcessing,\n    statusPhotoScan: store.util.statusPhotoScan,\n    scanningPhotos: store.photos.scanningPhotos,\n  }\n})(AlbumsAutoListCardView)\n\n\n\nAlbumsAutoListCards = connect((store)=>{\n  return {\n    albumsAutoList: store.albums.albumsAutoList,\n    fetchingAlbumsAutoList: store.albums.fetchingAlbumsAutoList,\n    fetchedAlbumsAutoList: store.albums.fetchedAlbumsAutoList,\n    generatingAlbumsAuto: store.albums.generatingAlbumsAuto,\n    generatedAlbumsAuto: store.albums.generatedAlbumsAuto,\n    statusAutoAlbumProcessing: store.util.statusAutoAlbumProcessing,\n    statusPhotoScan: store.util.statusPhotoScan,\n    scanningPhotos: store.photos.scanningPhotos,\n  }\n})(AlbumsAutoListCards)\n\n\n\nAlbumsAutoListHeader = connect((store)=>{\n  return {\n    albumsAutoList: store.albums.albumsAutoList,\n    fetchingAlbumsAutoList: store.albums.fetchingAlbumsAutoList,\n    fetchedAlbumsAutoList: store.albums.fetchedAlbumsAutoList,\n    generatingAlbumsAuto: store.albums.generatingAlbumsAuto,\n    generatedAlbumsAuto: store.albums.generatedAlbumsAuto,\n    statusAutoAlbumProcessing: store.util.statusAutoAlbumProcessing,\n    statusPhotoScan: store.util.statusPhotoScan,\n    scanningPhotos: store.photos.scanningPhotos,\n  }\n})(AlbumsAutoListHeader)\n\n\n"
  },
  {
    "path": "src/layouts/albumsAutoListCardViewMonthGroup.js",
    "content": "import Immutable from \"immutable\";\nimport PropTypes from \"prop-types\";\nimport React, { PureComponent, Component} from \"react\";import {\n  Collection,\n  CellMeasurer,\n  CellMeasurerCache,\n  createMasonryCellPositioner,\n  Masonry,\n  List,\n  AutoSizer,\n  WindowScroller,\n} from 'react-virtualized';\nimport styles from 'react-virtualized/styles.css'; // only needs to be imported once\nimport { Card, Image, Header, Divider, Item, Loader, Dimmer,\n         Container, Label, Popup, Segment, Button, Icon, Rating} from 'semantic-ui-react';\nimport { connect } from \"react-redux\";\n\n\nimport {fetchAutoAlbumsList} from '../actions/albumsActions'\n\nimport {\n  BrowserRouter as Router,\n  Route,\n  Link\n} from 'react-router-dom'\n\nimport {fetchPeopleAlbums, fetchAutoAlbums, generateAutoAlbums} from '../actions/albumsActions'\nimport {fetchCountStats,fetchPhotoScanStatus,\n        fetchAutoAlbumProcessingStatus} from '../actions/utilActions'\nimport {Server, serverAddress} from '../api_client/apiClient'\n\n\n\n\nexport class ListExample extends PureComponent {\n  constructor(props, context) {\n    super(props, context);\n\n    this.state = {\n      listHeight: 300,\n      listRowHeight: 50,\n      overscanRowCount: 10,\n      rowCount: 10,\n      scrollToIndex: undefined,\n      showScrollingPlaceholder: false,\n      useDynamicRowHeight: false\n    };\n\n    this._getRowHeight = this._getRowHeight.bind(this);\n    this._noRowsRenderer = this._noRowsRenderer.bind(this);\n    this._onRowCountChange = this._onRowCountChange.bind(this);\n    this._onScrollToRowChange = this._onScrollToRowChange.bind(this);\n    this._rowRenderer = this._rowRenderer.bind(this);\n  }\n\n  render() {\n    const {\n      listHeight,\n      listRowHeight,\n      overscanRowCount,\n      rowCount,\n      scrollToIndex,\n      showScrollingPlaceholder,\n      useDynamicRowHeight\n    } = this.state;\n\n    return (\n        <div>\n        <WindowScroller>\n          <AutoSizer disableHeight>\n            {({ width }) =>\n              <List\n                ref=\"List\"\n                className={styles.List}\n                height={listHeight}\n                overscanRowCount={overscanRowCount}\n                noRowsRenderer={this._noRowsRenderer}\n                rowCount={rowCount}\n                rowHeight={\n                  useDynamicRowHeight ? this._getRowHeight : listRowHeight\n                }\n                rowRenderer={this._rowRenderer}\n                scrollToIndex={scrollToIndex}\n                width={width}\n              />}\n          </AutoSizer>\n          </WindowScroller>\n        </div>\n    );\n  }\n\n  _getDatum(index) {\n    const list = [1,2,3,4,5];\n\n    return list[index % list.length];\n  }\n\n  _getRowHeight({ index }) {\n    return this._getDatum(index);\n  }\n\n  _noRowsRenderer() {\n    return <div>No rows</div>;\n  }\n\n  _onRowCountChange(event) {\n    const rowCount = parseInt(event.target.value, 10) || 0;\n\n    this.setState({ rowCount });\n  }\n\n  _onScrollToRowChange(event) {\n    const { rowCount } = this.state;\n    let scrollToIndex = Math.min(\n      rowCount - 1,\n      parseInt(event.target.value, 10)\n    );\n\n    if (isNaN(scrollToIndex)) {\n      scrollToIndex = undefined;\n    }\n\n    this.setState({ scrollToIndex });\n  }\n\n  _rowRenderer({ index, isScrolling, key, style }) {\n    const { showScrollingPlaceholder, useDynamicRowHeight } = this.state;\n\n    return (\n      <div>\n        hello\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "src/layouts/allPhotosGroupedByDate.js",
    "content": "import React, {Component} from 'react';\nimport { Card, Image, Header, Divider, Item, Loader, Dimmer,\n         Container, Label, Popup, Segment, Button, Icon} from 'semantic-ui-react';\nimport Gallery from 'react-grid-gallery'\nimport VisibilitySensor from 'react-visibility-sensor'\nimport { connect } from \"react-redux\";\nimport {\n  BrowserRouter as Router,\n  Route,\n  Link\n} from 'react-router-dom'\nimport {simpleFetchPhotos} from '../actions/photosActions'\nimport { Map, TileLayer, Marker } from 'react-leaflet'\nimport {Server, serverAddress} from '../api_client/apiClient'\nimport {fetchDateAlbumsList} from '../actions/albumsActions'\nimport LazyLoad from 'react-lazyload';\n\n\n        // <div style={{\n        //     display: \"block\",\n        //     minHeight: \"1px\",\n        //     width: \"100%\",\n        //     padding: '10px',\n        //     overflowX: \"hidden\",\n        //     overflowY: 'auto'}}>\n        //   <Gallery \n        //     images={mappedRenderablePhotoArray}\n        //     enableImageSelection={false}\n        //     rowHeight={250}/>\n        // </div>\nvar SIDEBAR_WIDTH = 85;\n\nclass ImagePlaceholder extends Component {\n  render () {\n    return (\n      <div style={{height:this.props.size,width:this.props.size}}>\n      </div>\n    )\n  }\n}\n\nexport class AllPhotosGroupedByDate extends Component {\n  constructor(props){\n    super(props)\n    this.groupPhotosByDate = this.groupPhotosByDate.bind(this)\n    this.receivedAllProps = this.receivedAllProps.bind(this)\n    this.calculateEntrySquareSize = this.calculateEntrySquareSize.bind(this)\n    this.groupedPhotosToImageGrids = this.groupedPhotosToImageGrids.bind(this)\n  \tthis.setState({\n      width:  window.innerWidth,\n      height: window.innerHeight,\n      entrySquareSize:200\n  \t})\n  }\n\n  calculateEntrySquareSize() {\n  \tif (window.innerWidth < 600) {\n  \t\tvar numEntrySquaresPerRow = 4\n  \t} \n    else if (window.innerWidth < 800) {\n      var numEntrySquaresPerRow = 6\n    }\n  \telse if (window.innerWidth < 1000) {\n  \t\tvar numEntrySquaresPerRow = 8\n  \t}\n    else if (window.innerWidth < 1200) {\n      var numEntrySquaresPerRow = 10\n    }\n  \telse {\n  \t\tvar numEntrySquaresPerRow = 12\n  \t}\n\n    var columnWidth = window.innerWidth - SIDEBAR_WIDTH - 5 - 5 - 15\n\n    console.log(columnWidth)\n    var entrySquareSize = columnWidth / numEntrySquaresPerRow\n    var numEntrySquaresPerRow = numEntrySquaresPerRow\n  \tthis.setState({\n      width:  window.innerWidth,\n      height: window.innerHeight,\n      entrySquareSize:entrySquareSize,\n      numEntrySquaresPerRow:numEntrySquaresPerRow\n  \t})\n  }\n\n  receivedAllProps() {\n    if (this.props.fetchedPhotos && \n        !this.props.photos.length==0 && \n        !this.props.fetchingPhotos &&\n        this.props.fetchedPhotos) {\n\n      console.log(\"fetchedPhotos\",this.props.fetchedPhotos)\n      console.log(\"photos\",this.props.photos.length)\n      console.log(\"fetchingPhotos\",this.props.fetchingPhotos)\n      console.log(\"fetchedPhotos\",this.props.fetchedPhotos)\n      console.log(\"albumsDateList\",this.props.albumsDateList.length)\n      console.log(\"fetchingAlbumsDateList\",this.props.fetchingAlbumsDateList)\n      console.log(\"fetchedAlbumsDateList\",this.props.fetchedAlbumsDateList)\n\n\n      return true\n    }\n    else {\n      return false\n    }\n  }\n\n  componentWillMount() {\n    this.props.dispatch(simpleFetchPhotos())\n    this.calculateEntrySquareSize();\n    window.addEventListener(\"resize\", this.calculateEntrySquareSize.bind(this));\n  }\n\n  groupPhotosByDate() {\n    var photosGroupedByDate = {}\n    photosGroupedByDate['Unknown Date'] = []\n\n    this.props.photos.map(function(photo){\n      if (photo.exif_timestamp != null) {\n        var date = photo.exif_timestamp.split('T')[0]\n        if (photosGroupedByDate.hasOwnProperty(date)){\n          photosGroupedByDate[date].push(photo)\n        }\n        else{\n          photosGroupedByDate[date] = []\n          photosGroupedByDate[date].push(photo)\n        }\n      }\n      else {\n        photosGroupedByDate['Unknown Date'].push(photo)        \n      }\n    })\n    return photosGroupedByDate\n  }\n\n\n  groupedPhotosToImageGrids(groupedPhotos) {\n    var imageGrids = []\n    for (var date in groupedPhotos) {\n      if (groupedPhotos.hasOwnProperty(date)) {\n        var imageGrid = groupedPhotos[date].map(function(photo){\n          return (\n\t\t\t<div style={{\n                width:this.state.entrySquareSize,\n                display:'inline-block'}}>\n            <LazyLoad once offset={500} height={this.state.entrySquareSize} placeholder={<ImagePlaceholder size={this.props.entrySquareSize}/>}>\n              <Image \n                style={{\n                    marginLeft:0,\n                    marginRight:0,\n                    marginTop:0,\n                    marginBottom:0,\n                    paddingLeft:1,\n                    paddingRight:1,\n                    paddingTop:1,\n                    paddingBottom:1}}\n                height={this.state.entrySquareSize} \n                width={this.state.entrySquareSize} \n                src={serverAddress+'/media/square_thumbnails_tiny/'+photo.image_hash+'.jpg'}/>\n            </LazyLoad>\n            </div>\n\n          )\n        },this)\n        var groupHeight = this.state.entrySquareSize*Math.ceil(groupedPhotos[date].length/this.state.numEntrySquaresPerRow.toFixed(1))\n        var renderableImageGrid = (\n          <div key={date} style={{paddingBottom:'20px'}}>\n\n            <Header as='h2'>\n              <Header.Content>\n              {date}\n              <Header.Subheader>\n              {imageGrid.length} Photos\n              </Header.Subheader>\n              </Header.Content>\n            </Header>\n            \n            <LazyLoad \n                height={groupHeight} \n                offset={500} \n                placeholder={\n                    <div style={{\n                        height:groupHeight, \n                        backgroundColor:'white'}}></div>\n                }>\n            <Image.Group>\n              {imageGrid}\n            </Image.Group>\n            </LazyLoad>\n          </div>\n        )\n        imageGrids.push(renderableImageGrid)\n      }\n    }\n    return imageGrids\n  }\n\n\n  render() {\n    var entrySquareSize = this.state.entrySquareSize\n    var numEntrySquaresPerRow = this.state.numEntrySquaresPerRow\n    console.log('received all props?', this.receivedAllProps())\n    if (this.props.fetchedPhotos){\n      var groupedPhotos = this.groupPhotosByDate()\n      var renderable = this.groupedPhotosToImageGrids(groupedPhotos)\n    }\n    else {\n      var renderable = (\n        <div>\n          <Dimmer active>\n            <Loader active>\n              <Header color='grey'>Loading Photos</Header>\n              {\"If you just added a lot of photos, or haven't visited this page in a while, \"} \n              {\"this might take a long time, depending on the number of photos in your library. \"}\n              {\"After the intial load, subsequent visits to this page should be faster from caching.\"}\n            </Loader>\n          </Dimmer>\n        </div>\n      )\n    }\n    return (\n      <div>\n        {renderable}\n      </div>\n    )\n  }\n}\n\n\n\n\nAllPhotosGroupedByDate = connect((store)=>{\n  return {\n    fetchedPhotos: store.photos.fetchedPhotos,\n    fetchingPhotos: store.photos.fetchingPhotos,\n    photos: store.photos.photos,    \n    albumsDateList: store.albums.albumsDateList,\n    fetchingAlbumsDateList: store.albums.fetchingAlbumsDateList,\n    fetchedAlbumsDateList: store.albums.fetchedAlbumsDateList,\n  }\n})(AllPhotosGroupedByDate)\n"
  },
  {
    "path": "src/layouts/allPhotosView.js",
    "content": "import React, {Component} from 'react';\nimport { Card, Image, Header, Divider, Item, Loader, Dimmer, Modal, Grid, Sticky, \n         Container, Label, Popup, Segment, Button, Icon, Table, Transition} from 'semantic-ui-react';\nimport Gallery from 'react-grid-gallery'\nimport VisibilitySensor from 'react-visibility-sensor'\nimport { connect } from \"react-redux\";\nimport {\n  BrowserRouter as Router,\n  Route,\n  Link\n} from 'react-router-dom'\nimport {fetchDateAlbumsList,fetchAlbumsDateGalleries} from '../actions/albumsActions'\nimport { Map, TileLayer, Marker } from 'react-leaflet'\nimport {Server, serverAddress} from '../api_client/apiClient'\nimport LazyLoad from 'react-lazyload';\nimport {ChartyPhotosScrollbar} from '../components/chartyPhotosScrollbar'\n\n\n\nimport {ImageInfoTable} from '../components/imageInfoTable'\nimport {ModalPhotoViewVertical} from '../components/modalPhotoView';\n\nimport ContentLoader from \"react-content-loader\"\n\nvar ESCAPE_KEY = 27;\nvar ENTER_KEY = 13;\nvar RIGHT_ARROW_KEY = 39;\nvar UP_ARROW_KEY = 38;\nvar LEFT_ARROW_KEY = 37;\nvar DOWN_ARROW_KEY = 40;\n\nvar SIDEBAR_WIDTH = 85;\n\n\nfunction calculateDayHeight(numPhotos,sidebarVisible) {\n\n  var columnWidth = window.innerWidth - SIDEBAR_WIDTH - 5 - 5 - 15 \n\n  var photoSize = 250\n  \n  var spacePerRow = Math.floor(columnWidth / photoSize)\n  if (spacePerRow >= numPhotos) {\n    var numRows = 1\n    var numCols = numPhotos\n  }\n  else {\n    var numRows = Math.ceil( numPhotos / spacePerRow )\n    var numCols = spacePerRow\n  }\n\n  return numRows * photoSize + 2\n}\n\nclass DayPlaceholder extends Component {\n  constructor() {\n    super();\n    this.state = {\n      width:  800,\n      height: 182\n    }\n    this.calculatePlaceholderSize = this.calculatePlaceholderSize.bind(this)\n  }\n\n\n\n  /**\n   * Add event listener\n   */\n  componentDidMount() {\n    this.calculatePlaceholderSize();\n    window.addEventListener(\"resize\", this.calculatePlaceholderSize.bind(this));\n  }\n\n  /**\n   * Remove event listener\n  componentWillUnmount() {\n    window.removeEventListener(\"resize\", this.updateDimensions.bind(this));\n  }\n   */\n\n  calculatePlaceholderSize() {\n    var numPhotos = this.props.numPhotos\n    var photoSize = 250\n    // var columnWidth = this.state.width - 120\n\n\n    var columnWidth = window.innerWidth - SIDEBAR_WIDTH - 5 - 5 - 15\n\n\n\n    var spacePerRow = Math.floor(columnWidth / photoSize)\n    if (spacePerRow >= numPhotos) {\n      var numRows = 1\n      var numCols = numPhotos\n    }\n    else {\n      var numRows = Math.ceil( numPhotos / spacePerRow )\n      var numCols = spacePerRow\n    }\n\n\n    var boxHeight = numRows * photoSize + 2\n    var boxWidth = numCols * photoSize\n\n    return {height:boxHeight,width:boxWidth}\n  }\n\n  render() {\n    var size = this.calculatePlaceholderSize()\n    var h = `${size.height}px`\n    var w = `${size.width}px`\n\n    return (\n      <div ref=\"placeholderRef\" style={{\n        textAlign:'center', \n        verticalAlign:'center', \n        height:h, \n        width:w, \n        backgroundColor:'white'}}>\n      </div>\n    )\n  }\n}\n\nclass PhotoDayGroup extends Component {\n  constructor() {\n    super()\n    this.state = {modalPhotoIndex:0, showModal:false}\n    this.onPhotoClick = this.onPhotoClick.bind(this)\n    this._handleKeyDown = this._handleKeyDown.bind(this)\n  }\n\n  _handleKeyDown (event) {\n      switch( event.keyCode ) {\n          case ESCAPE_KEY:\n              if (this.refs.photoGroupRef){\n                this.setState({showModal:false});                \n              }\n              break;\n          case RIGHT_ARROW_KEY:\n              if (this.state.modalPhotoIndex < this.props.albumsDateGalleries[this.props.album.id].photos.length-1) {\n                if (this.refs.photoGroupRef) {\n                  this.setState({modalPhotoIndex:this.state.modalPhotoIndex+1})\n                }\n              }\n              break;\n          case LEFT_ARROW_KEY:\n              if (this.state.modalPhotoIndex > 0) {\n                if (this.refs.photoGroupRef){\n                  this.setState({modalPhotoIndex:this.state.modalPhotoIndex-1})\n                }\n              }\n              break;\n          default: \n              break;\n      }\n  }\n\n\n  componentWillUnmount() {\n    document.removeEventListener(\"keydown\", this._handleKeyDown.bind(this));\n  }\n\n\n  onPhotoClick(idx) {\n    this.setState({modalPhotoIndex:idx,showModal:true})\n\n  }\n\n  componentWillMount() {\n\n    if (!this.props.albumsDateGalleries.hasOwnProperty(this.props.album.id)) {\n      this.props.dispatch(fetchAlbumsDateGalleries(this.props.album.id))\n    }\n    document.addEventListener('keydown',this._handleKeyDown)\n  }\n\n  render() {\n    if (this.props.albumsDateGalleries.hasOwnProperty(this.props.album.id)) {\n      var photos = this.props.albumsDateGalleries[this.props.album.id].photos\n      var images = this.props.albumsDateGalleries[this.props.album.id].photos.map(function(image,idx){\n        return (\n          <LazyLoad \n            offset={1000}\n            key={'thumbnail_'+image.image_hash}\n            debounce={300}\n            height={250} \n            placeholder={\n              <Image style={{marginLeft:0,marginRight:0,marginTop:0,marginBottom:0,paddingLeft:1,paddingRight:1,paddingTop:1,paddingBottom:1}}\n                key={'thumbnailPlaceholder_'+image.image_hash}\n                height={250} \n                width={250} \n                src={'/thumbnail_placeholder.png'}/>\n              }\n            >\n\n              <Image style={{marginLeft:0,marginRight:0,marginTop:0,marginBottom:0,paddingLeft:1,paddingRight:1,paddingTop:1,paddingBottom:1}}\n                key={image.image_hash}\n                onClick={()=>{this.onPhotoClick(idx)}}\n                height={250} \n                width={250} \n                src={serverAddress+image.square_thumbnail_url}/>\n\n\n          </LazyLoad>  \n        )\n      },this)\n      return(\n        <div ref=\"photoGroupRef\">\n          <Image.Group style={{marginLeft:0,marginRight:0,marginTop:0,marginBottom:0,paddingLeft:1,paddingRight:1,paddingTop:1,paddingBottom:1}}>\n            {images}\n          </Image.Group>\n\n          <Modal \n            basic\n            size='fullscreen'\n            open={this.state.showModal}\n            onClose={(e)=>{this.setState({showModal:false})}}>\n            <Modal.Header style={{textAlign:'center'}}>\n            Showing photos from <b>{this.props.album.date}</b> ({this.state.modalPhotoIndex+1}/{images.length})\n            </Modal.Header>\n            <ModalPhotoViewVertical \n              open={this.state.showModal} \n              photos={photos} \n              idx={this.state.modalPhotoIndex} />\n          </Modal>\n\n        </div>\n      )\n    }\n    else {\n      return(<DayPlaceholder sidebarVisible={this.props.sidebarVisible} numPhotos={this.props.album.photo_count}/>)\n    }\n  }\n}\n\n\nclass PhotoDayGroupReactGridGallery extends Component {\n  componentWillMount() {\n    if (!this.props.albumsDateGalleries.hasOwnProperty(this.props.album.id)) {\n      this.props.dispatch(fetchAlbumsDateGalleries(this.props.album.id))\n    }\n  }\n  render() {\n    if (this.props.albumsDateGalleries.hasOwnProperty(this.props.album.id)) {\n      var photos = this.props.albumsDateGalleries[this.props.album.id].photos\n      var images = this.props.albumsDateGalleries[this.props.album.id].photos.map(function(image,idx){\n        return (\n          {\n            src:serverAddress+image.image_url,\n            thumbnail: serverAddress+image.thumbnail_url,\n            thumbnailWidth: image.thumbnail_width,\n            thumbnailHeight: image.thumbnail_height,\n            isSelected: false,\n            caption: image.search_captions\n          }\n        )\n      })\n\n\n      return(\n        <div style={{\n            display: \"block\",\n            minHeight: \"1px\",\n            width: \"100%\",\n            overflowX: \"hidden\",\n            overflowY: 'auto'}}>\n          <Gallery images={images} rowHeight={250} showLightboxThumbnails={true}/>\n        </div>\n      )\n    }\n    else {\n      return(<DayPlaceholder sidebarVisible={this.props.sidebarVisible} numPhotos={this.props.album.photo_count}/>)\n    }\n  }}\n\n\n\nexport class AllPhotosView extends Component {\n\n  componentWillMount() {\n    this.props.dispatch(fetchDateAlbumsList())\n  }\n\n\n  render() {\n    if (this.props.fetchedAlbumsDateList) {\n      var photoDayGroups = this.props.albumsDateList.map(function(album){\n        return (\n          <div style={{paddingBottom:'20px'}} key={'album_'+album.date}>\n            <Header dividing as='h2'>\n              <Header.Content>\n                {album.date}\n                <Header.Subheader>{album.photo_count} Photos</Header.Subheader>\n              </Header.Content>\n            </Header>\n            <LazyLoad \n              offset={1000}\n              unmountIfInvisible={false}\n              height={calculateDayHeight(album.photo_count,this.props.sidebarVisible)} \n              placeholder={(\n                <div style={{height:calculateDayHeight(album.photo_count,this.props.sidebarVisible)}}></div>\n              )}>\n\n              <PhotoDayGroup sidebarVisible={true} key={'photoDayGroup_'+album.id} album={album}/>\n\n            </LazyLoad>\n          </div>\n        )\n      },this)\n      return (\n        <div>\n          {photoDayGroups}\n        </div>\n      )      \n    }\n    else {\n      return (\n        <div style={{paddingTop:'20%'}}>\n          <Loader active inline='centered' />\n        </div>\n      )\n    }\n  }\n}\n\n\nPhotoDayGroup = connect((store)=>{\n  return {\n    albumsDateGalleries: store.albums.albumsDateGalleries,\n  }\n})(PhotoDayGroup)\n\nPhotoDayGroupReactGridGallery = connect((store)=>{\n  return {\n    albumsDateGalleries: store.albums.albumsDateGalleries,\n  }\n})(PhotoDayGroupReactGridGallery)\n\nAllPhotosView = connect((store)=>{\n  return {\n    albumsDateList: store.albums.albumsDateList,\n    fetchingAlbumsDateList: store.albums.fetchingAlbumsDateList,\n    fetchedAlbumsDateList: store.albums.fetchedAlbumsDateList,    \n  }\n})(AllPhotosView)\n"
  },
  {
    "path": "src/layouts/allPhotosViewHash.js",
    "content": "import React, {Component} from 'react';\nimport { Card, Image, Header, Divider, Item, Loader, Dimmer, Modal, Grid, Sticky, \n         Container, Label, Popup, Segment, Button, Icon, Table, Transition} from 'semantic-ui-react';\nimport Gallery from 'react-grid-gallery'\nimport VisibilitySensor from 'react-visibility-sensor'\nimport { connect } from \"react-redux\";\nimport {\n  BrowserRouter as Router,\n  Route,\n  Link\n} from 'react-router-dom'\nimport {  fetchDateAlbumsPhotoHashList,fetchAlbumsDateGalleries} from '../actions/albumsActions'\nimport { Map, TileLayer, Marker } from 'react-leaflet'\nimport {Server, serverAddress} from '../api_client/apiClient'\nimport LazyLoad from 'react-lazyload';\nimport {ChartyPhotosScrollbar} from '../components/chartyPhotosScrollbar'\n\n\n\nimport {ImageInfoTable} from '../components/imageInfoTable'\nimport {ModalPhotoViewVertical} from '../components/modalPhotoView';\n\nimport ContentLoader from \"react-content-loader\"\n\nvar ESCAPE_KEY = 27;\nvar ENTER_KEY = 13;\nvar RIGHT_ARROW_KEY = 39;\nvar UP_ARROW_KEY = 38;\nvar LEFT_ARROW_KEY = 37;\nvar DOWN_ARROW_KEY = 40;\n\nvar SIDEBAR_WIDTH = 85;\n\n\nclass DayGroupPlaceholder extends Component {\n    render () {\n        var photos = this.props.day.photos.map(function(photo) {\n            return (\n            <Image key={'daygroup_placholder_image_'+photo.image_hash} style={{display:'inline-block',padding:1,margin:0}}\n                height={this.props.itemSize} \n                width={this.props.itemSize} \n                src={serverAddress+'/media/square_thumbnails_tiny/'+photo.image_hash+'.jpg'}/>\n            )\n        },this)\n        var gridHeight = this.props.itemSize * Math.ceil(this.props.day.photos.length/this.props.numItemsPerRow.toFixed(1))\n        return (\n            <div key={'daygroup_placeholder_'+this.props.day}style={{paddingTop:20}}>\n                <Header dividing as='h2'>{this.props.day.date}...</Header>\n                <div style={{height:gridHeight}}>\n\n                </div>\n            </div>\n        )\n    }\n}\n\n\nclass DayGroup extends Component {\n    render () {\n        var photos = this.props.day.photos.map(function(photo) {\n            return (\n                <LazyLoad \n                    key={'daygroup_photos_'+photo.image_hash}\n                    once\n                    offset={100}\n                    placeholder={\n                        <div style={{display:'inline-block',padding:1,margin:0}}></div>\n                    }\n                    >\n                        <Image key={'daygroup_image_'+photo.image_hash} style={{display:'inline-block',padding:1,margin:0}}\n                            height={this.props.itemSize} \n                            width={this.props.itemSize} \n                            src={serverAddress+'/media/square_thumbnails_small/'+photo.image_hash+'.jpg'}/>\n                </LazyLoad>\n            )\n        },this)\n        var gridHeight = this.props.itemSize * Math.ceil(this.props.day.photos.length/this.props.numItemsPerRow.toFixed(1))\n        return (\n            <LazyLoad \n                key={'daygroup_grid_'+this.props.day}\n                once \n                offset={500}\n                placeholder={\n                    <DayGroupPlaceholder \n                        numItemsPerRow={this.props.numItemsPerRow} \n                        itemSize={this.props.itemSize} \n                        day={this.props.day}/>}>\n                <div style={{paddingTop:20}}>\n                    <Header dividing as='h2'>{this.props.day.date}</Header>\n                    <div style={{height:gridHeight}}>\n                    {photos}\n                    </div>\n                </div>\n            </LazyLoad>\n        )\n    }\n}\n\n\nexport class AllPhotosHashListView extends Component {\n    constructor(props){\n        super(props)\n        this.calculateEntrySquareSize = this.calculateEntrySquareSize.bind(this)\n        this.setState({\n            width:  window.innerWidth,\n            height: window.innerHeight,\n            entrySquareSize:200\n        })\n    }\n    componentWillMount() {\n        if (this.props.albumsDatePhotoHashList.length < 1) {\n            this.props.dispatch(fetchDateAlbumsPhotoHashList())\n        }\n        this.calculateEntrySquareSize();\n        window.addEventListener(\"resize\", this.calculateEntrySquareSize.bind(this));\n        \n    }\n\n    calculateEntrySquareSize() {\n        if (window.innerWidth < 600) {\n            var numEntrySquaresPerRow = 2\n        } \n        else if (window.innerWidth < 800) {\n            var numEntrySquaresPerRow = 3\n        }\n        else if (window.innerWidth < 1000) {\n            var numEntrySquaresPerRow = 4\n        }\n        else if (window.innerWidth < 1200) {\n            var numEntrySquaresPerRow = 5\n        }\n        else {\n            var numEntrySquaresPerRow = 6\n        }\n\n        var columnWidth = window.innerWidth - SIDEBAR_WIDTH - 5 - 5 - 15\n\n\n        var entrySquareSize = columnWidth / numEntrySquaresPerRow\n        var numEntrySquaresPerRow = numEntrySquaresPerRow\n        this.setState({\n            width:  window.innerWidth,\n            height: window.innerHeight,\n            entrySquareSize:entrySquareSize,\n            numEntrySquaresPerRow:numEntrySquaresPerRow\n        })\n        console.log('column width:',columnWidth)\n        console.log('item size:',entrySquareSize)\n        console.log('num items per row',numEntrySquaresPerRow)\n    }\n\n    render () {\n        if (this.props.fetchingAlbumsDatePhotoHashList) {\n            return (<div><Loader active/></div>)\n        }\n        else {\n            console.time('someFunction');\n            var pageContent = this.props.albumsDatePhotoHashList.map(function(day){\n                return (\n                    <DayGroup \n                        key={'daygroup_'+day.date}\n                        day={day} \n                        itemSize={this.state.entrySquareSize} \n                        numItemsPerRow={this.state.numEntrySquaresPerRow}/>\n                )\n            },this)\n            console.timeEnd('someFunction');\n        }\n\n\n        return (\n            <div>{pageContent}</div>\n        )\n    }\n}\n\n\nAllPhotosHashListView = connect((store)=>{\n  return {\n    albumsDatePhotoHashList: store.albums.albumsDatePhotoHashList,\n    fetchingAlbumsDatePhotoHashList: store.albums.fetchingAlbumsDatePhotoHashList,\n    fetchedAlbumsDatePhotoHashList: store.albums.fetchedAlbumsDatePhotoHashList,    \n  }\n})(AllPhotosHashListView)\n"
  },
  {
    "path": "src/layouts/allPhotosViewHashRV.js",
    "content": "import React, {Component} from 'react';\nimport ReactDOM from 'react-dom';\nimport { Grid, WindowScroller,AutoSizer } from 'react-virtualized';\nimport 'react-virtualized/styles.css'; // only needs to be imported once\nimport { connect } from \"react-redux\";\n\nimport {  \n    fetchDateAlbumsPhotoHashList,\n    fetchAlbumsDateGalleries,\n    fetchUserAlbumsList,\n    editUserAlbum,\n    createNewUserAlbum} from '../actions/albumsActions'\n\nimport { \n    fetchPhotos, \n    fetchPhotoDetail, \n    setPhotosFavorite,\n    setPhotosHidden} from '../actions/photosActions'\n\nimport { \n    Card, \n    Image, \n    Header, \n    Divider, \n    Item, \n    Loader, \n    Dimmer, \n    Sticky, \n    Portal, \n    List, \n    Input, \n    Rating, \n    Container, \n    Label, \n    Popup, \n    Segment, \n    Button, \n    Icon, \n    Table, \n    Transition, \n    Breadcrumb} from 'semantic-ui-react';\n\nimport {Server, serverAddress} from '../api_client/apiClient'\nimport {LightBox} from '../components/lightBox'\nimport LazyLoad from 'react-lazyload';\n// import Lightbox from 'react-image-lightbox';\nimport {LocationMap} from '../components/maps'\nimport { push } from 'react-router-redux'\nimport {searchPhotos} from '../actions/searchActions'\nimport styles from '../App.css';\nimport Draggable from 'react-draggable';\nimport debounce from 'lodash/debounce'\nimport _ from 'lodash'\nimport * as moment from 'moment';\nimport Modal from 'react-modal';\n\nimport {calculateGridCells, calculateGridCellSize} from '../util/gridUtils'\nimport {ScrollSpeed, SPEED_THRESHOLD, SCROLL_DEBOUNCE_DURATION} from '../util/scrollUtils'\nimport {fuzzy_match} from '../util/fuzzyMatch'\nimport {PhotoListView} from './ReusablePhotoListView'\n\nvar TOP_MENU_HEIGHT = 55 // don't change this\nvar LEFT_MENU_WIDTH = 85 // don't change this\nvar SIDEBAR_WIDTH = 85\nvar TIMELINE_SCROLL_WIDTH = 0\nvar DAY_HEADER_HEIGHT = 70\n\nif (window.innerWidth < 600) {\n    var LIGHTBOX_SIDEBAR_WIDTH = window.innerWidth\n} else {\n    var LIGHTBOX_SIDEBAR_WIDTH = 360\n}\n\nconst customStyles = {\n    content : {\n        top:150,\n        left:window.innerWidth < 600 ? 15+SIDEBAR_WIDTH : '20%',\n        right:window.innerWidth < 600 ? 15 : '20%',\n        height:window.innerHeight-300,\n        width:window.innerWidth < 600 ? window.innerWidth-30-SIDEBAR_WIDTH : '60%' ,\n        overflow:'hidden',\n        // paddingRight:0,\n        // paddingBottomt:0,\n        // paddingLeft:10,\n        // paddingTop:10,\n        padding:0,\n        backgroundColor:'white'\n    }\n};\n\n\n\n\n\n\n\nexport class AllPhotosHashListViewRV extends Component {\n    componentDidMount() {\n        // this.props.dispatch(fetchPhotos())\n        if (this.props.albumsDatePhotoHashList.length < 1) {\n            this.props.dispatch(fetchDateAlbumsPhotoHashList())\n        }\n    }\n\n    render() {\n        const {fetchingAlbumsDatePhotoHashList,fetchedAlbumsDatePhotoHashList} = this.props\n        return (\n            <PhotoListView \n                title={\"Photos\"}\n                loading={fetchingAlbumsDatePhotoHashList}\n                titleIconName={'images'}\n                photosGroupedByDate={this.props.albumsDatePhotoHashList}\n                idx2hash={this.props.idx2hash}\n            />\n        )\n    }\n}\n\nAllPhotosHashListViewRV = connect((store)=>{\n  return {\n    showSidebar: store.ui.showSidebar,\n\n    photos: store.photos.photos,\n    fetchingPhotos: store.photos.fetchingPhotos,\n    fetchedPhotos: store.photos.fetchedPhotos,\n\n    photoDetails: store.photos.photoDetails,\n    fetchingPhotoDetail: store.photos.fetchingPhotoDetail,\n    fetchedPhotoDetail: store.photos.fetchedPhotoDetail,\n\n    idx2hash: store.albums.idx2hash,\n\n    albumsDatePhotoHashList: store.albums.albumsDatePhotoHashList,\n    fetchingAlbumsDatePhotoHashList: store.albums.fetchingAlbumsDatePhotoHashList,\n    fetchedAlbumsDatePhotoHashList: store.albums.fetchedAlbumsDatePhotoHashList,    \n  }\n})(AllPhotosHashListViewRV)\n"
  },
  {
    "path": "src/layouts/allPhotosViewLL.js",
    "content": "// all photos using lazyload\n\nimport React, {Component} from 'react'\nimport { connect } from \"react-redux\";\nimport {fetchPhotos} from '../actions/photosActions'\nimport {Server, serverAddress} from '../api_client/apiClient'\n\n\nexport class AllPhotosViewLL extends Component {\n  constructor(props){\n    super(props)\n    this.groupPhotosByDate = this.groupPhotosByDate.bind(this)\n  }\n\n  componentWillMount() {\n    this.props.dispatch(fetchPhotos())\n  }\n\n  groupPhotosByDate() {\n    var dates = []\n    this.props.photos.map(function(photo){\n      if (photo.exif_timestamp != null) {\n        dates.push(photo.exif_timestamp.split('T')[0])\n      }\n    })\n    dates = new Set(dates)\n    dates = Array.from(dates)\n    dates.push('undated')\n    console.log(dates)\n\n    var photosGroupedByDate = {}\n    \n    dates.map(function(date){\n      photosGroupedByDate[date] = []\n    })\n\n    this.props.photos.map(function(photo){\n      if (photo.exif_timestamp != null){\n        var d = photo.exif_timestamp.split('T')[0]\n        photosGroupedByDate[d].push(photo)\n      }\n      else {\n        photosGroupedByDate['undated'].push(photo)\n      }\n    })\n    console.log(photosGroupedByDate)\n  }\n\n  render() {\n    if (this.props.fetchedPhotos) {\n      this.groupPhotosByDate()\n    }\n    return (\n      <div>hello</div>\n    )\n  }\n}\n\nAllPhotosViewLL = connect((store)=>{\n  return {\n    fetchedPhotos: store.photos.fetchedPhotos,\n    fetchingPhotosfetchedPhotos: store.photos.fetchingPhotos,\n    photos: store.photos.photos,\n  }\n})(AllPhotosViewLL)\n\n"
  },
  {
    "path": "src/layouts/allPhotosViewRV.js",
    "content": "import Immutable from \"immutable\";\nimport PropTypes from \"prop-types\";\nimport React, { PureComponent, Component} from \"react\";\nimport {\n  Collection,\n  CellMeasurer,\n  CellMeasurerCache,\n  createMasonryCellPositioner,\n  Masonry,\n  AutoSizer,\n  WindowScroller,\n} from 'react-virtualized';\nimport styles from 'react-virtualized/styles.css'; // only needs to be imported once\nimport { Card, Image, Header, Divider, Item, Loader, Dimmer, List,\n         Container, Label, Popup, Segment, Button, Icon, Rating} from 'semantic-ui-react';\nimport { connect } from \"react-redux\";\n\n\nimport {fetchAutoAlbumsList} from '../actions/albumsActions'\n\nimport {\n  BrowserRouter as Router,\n  Route,\n  Link\n} from 'react-router-dom'\n\nimport {fetchPhotos} from '../actions/photosActions'\nimport {fetchPeopleAlbums, generateAutoAlbums} from '../actions/albumsActions'\nimport {fetchCountStats,fetchPhotoScanStatus,\n        fetchAutoAlbumProcessingStatus} from '../actions/utilActions'\n\nimport {Server, serverAddress} from '../api_client/apiClient'\n\nimport {ChartyPhotosScrollbar} from '../components/chartyPhotosScrollbar'\nimport {fetchDateAlbumsList} from '../actions/albumsActions'\n\nconst month2month = {\n  \"01\":\"January\",\n  \"02\":\"February\",\n  \"03\":\"March\",\n  \"04\":\"April\",\n  \"05\":\"May\",\n  \"06\":\"June\",\n  \"07\":\"July\",\n  \"08\":\"August\",\n  \"09\":\"September\",\n  \"10\":\"October\",\n  \"11\":\"November\",\n  \"12\":\"December\"\n}\n\n\nexport class PhotosListCardView extends Component {\n  constructor(props){\n    super(props)\n    this.insertMonthCardIntoPhotosList = this.insertMonthCardIntoPhotosList.bind(this)\n  }\n\n  componentWillMount(){\n    this.props.dispatch(fetchPhotos())\n  }\n\n  insertMonthCardIntoPhotosList(){\n    var newPhotosList = []\n\n\n    var sortedPhotos = this.props.photos.sort(function(a,b){\n      // Turn your strings into dates, and then subtract them\n      // to get a value that is either negative, positive, or zero.\n      return new Date(b.exif_timestamp) - new Date(a.exif_timestamp);\n    });\n\n\n    sortedPhotos.map(function(photo){\n      if (newPhotosList.length>0){\n        if (photo.exif_timestamp == null) { \n          var newMonth = \"Unknown-date\"\n        }\n        else {\n          var lastMonth = newPhotosList[newPhotosList.length-1].exif_timestamp.split('T')[0].split('-').slice(0,2).join('-')\n          var thisMonth = photo.exif_timestamp.split('T')[0].split('-').slice(0,2).join('-')\n          if (lastMonth==thisMonth) {\n            newPhotosList.push(photo)\n          } \n          else {\n            newPhotosList.push(thisMonth)\n            newPhotosList.push(photo)          \n          }\n        }\n      }\n      else {\n        if (photo.exif_timestamp == null) { \n          var newMonth = \"Unknown-date\"\n        }\n\n        else {\n          var newMonth = photo.exif_timestamp.split('T')[0].split('-').slice(0,2).join('-')\n          newPhotosList.push(newMonth)\n          newPhotosList.push(photo)\n        }\n      }\n    })\n    console.log(newPhotosList)\n    newPhotosList.map(function(photo){\n      console.log(typeof(photo)=='string')\n    })\n    return newPhotosList\n  }\n\n  render() {\n    if (this.props.fetchedPhotos) {\n      var photosListWithMonthCards = this.insertMonthCardIntoPhotosList()\n      var months = photosListWithMonthCards.filter(function(element){\n        if (typeof(element)=='string'){\n          return true\n        }\n        else {\n          return false\n        }\n      })\n      var monthScroll = months.map(function(month){\n        return <List.Item>{month.split('-')[1]}</List.Item>\n      })\n      return (\n        <div>\n          <div style={{\n            position:'fixed',\n            right:'0px',\n            height:\"100%\",\n            width:'80px',\n            border:'1px solid #dddddd',\n            backgroundColor:'#f2f2f2'}}>\n            <ChartyPhotosScrollbar/>\n          </div>\n          <div style={{paddingRight:'90px'}}>\n            <div style={{width:'100%', textAlign:'center', paddingTop:'20px'}}>\n              <Icon.Group size='huge'>\n                <Icon inverted circular name='image'/>\n              </Icon.Group>\n            </div>\n            <Header as='h2' icon textAlign='center'>\n              <Header.Content>\n                Photos\n                <Header.Subheader>All photos</Header.Subheader>\n              </Header.Content>\n            </Header>\n\n            <Divider hidden/>\n            <PhotoListCards photos={photosListWithMonthCards}/>\n          </div>\n        </div>\n      )\n    }\n    else {\n      return (\n        <div style={{padding:\"10px\"}}>\n          <Dimmer active>\n            <Loader active>\n              Loading photos...\n            </Loader>\n          </Dimmer>\n        </div>\n      )      \n    }\n  }\n}\n\n\nexport class MonthCard extends Component {\n  render() {\n    return (\n        <div style={{\n          border:'1px solid #dddddd',\n          width:'150px',\n          height:'150px',\n          padding:'10px',\n          borderRadius: \"0.3rem\"}}>\n          <Header dividing as='h2'>\n              {month2month[this.props.month.split('-')[1]]}\n          </Header>\n          <Header textAlign='left' as='h3'>\n              {this.props.month.split('-')[0]}\n          </Header>\n        </div>\n    )\n  }\n}\n\n\nexport class PhotoCard extends Component {\n  render() {\n    return (\n      <div style={{\n        width:'150px',\n        height:'150px'}}>\n          <Image \n            height={150} \n            width={150} \n            src={serverAddress+this.props.photo.tiny_square_thumbnail_url}/>\n      </div>\n    )\n  }\n}\n\n\n\n\n\n\nexport class PhotoListCards extends PureComponent {\n  constructor(props, context) {\n    super(props, context);\n\n    this._columnCount = 0;\n\n    this._cache = new CellMeasurerCache({\n      defaultHeight: 150,\n      defaultWidth: 150,\n      fixedWidth: true\n    });\n\n    this._columnHeights = {};\n\n    this.state = {\n      columnWidth: 150,\n      height: 150,\n      gutterSize: 5,\n      windowScrollerEnabled: true\n    };\n\n\n    this._cellRenderer = this._cellRenderer.bind(this);\n    this._onResize = this._onResize.bind(this);\n    this._renderAutoSizer = this._renderAutoSizer.bind(this);\n    this._renderMasonry = this._renderMasonry.bind(this);\n    this._setMasonryRef = this._setMasonryRef.bind(this);\n  }\n\n  render() {\n    const {\n      columnWidth,\n      height,\n      gutterSize,\n      windowScrollerEnabled\n    } = this.state;\n\n    let child;\n\n    if (windowScrollerEnabled) {\n      child = (\n        <WindowScroller>\n          {this._renderAutoSizer}\n        </WindowScroller>\n      );\n    } else {\n      child = this._renderAutoSizer({ height });\n    }\n\n    return (\n      <div style={{paddingTop:'10px'}}>{child}</div>\n    );\n\n  }\n\n  _calculateColumnCount() {\n    const { columnWidth, gutterSize } = this.state;\n\n    this._columnCount = Math.floor(this._width / (columnWidth + gutterSize));\n  }\n\n  _cellRenderer({ index, key, parent, style }) {\n    const { columnWidth } = this.state;\n    if (typeof(this.props.photos[index])=='string') {\n      console.log('rendering month card')\n      return (\n        <CellMeasurer cache={this._cache} index={index} key={key} parent={parent}>\n          <div\n            className={styles.Cell}\n            style={{\n              ...style,\n              width: columnWidth\n            }}\n          >\n            <div\n              style={{\n              }}/>\n              <MonthCard month={this.props.photos[index]}/>\n\n          </div>\n        </CellMeasurer>      \n      )\n    }\n    else if (typeof(this.props.photos[index])=='object'){\n      return (\n        <CellMeasurer cache={this._cache} index={index} key={key} parent={parent}>\n          <div\n            className={styles.Cell}\n            style={{\n              ...style,\n              width: columnWidth\n            }}\n          >\n            <div\n              style={{\n              }}/>\n              <PhotoCard photo={this.props.photos[index]}/>\n\n          </div>\n        </CellMeasurer>\n      );\n    }\n  }\n\n  _initCellPositioner() {\n    if (typeof this._cellPositioner === \"undefined\") {\n      const { columnWidth, gutterSize } = this.state;\n\n      this._cellPositioner = createMasonryCellPositioner({\n        cellMeasurerCache: this._cache,\n        columnCount: this._columnCount,\n        columnWidth,\n        spacer: gutterSize\n      });\n    }\n  }\n\n  _onResize({ width }) {\n    this._width = width;\n\n    this._columnHeights = {};\n    this._calculateColumnCount();\n    this._resetCellPositioner();\n    this._masonry.recomputeCellPositions();\n  }\n\n  _renderAutoSizer({ height, scrollTop }) {\n    this._height = height;\n    this._scrollTop = scrollTop;\n\n    return (\n      <AutoSizer\n        disableHeight\n        onResize={this._onResize}\n        scrollTop={this._scrollTop}\n      >\n        {this._renderMasonry}\n      </AutoSizer>\n    );\n  }\n\n  _renderMasonry({ width }) {\n    this._width = width;\n\n    this._calculateColumnCount();\n    this._initCellPositioner();\n\n    const { height, windowScrollerEnabled } = this.state;\n    return (\n      <div style={{paddingLeft:'10px'}}>\n        <Masonry\n          autoHeight={windowScrollerEnabled}\n          cellCount={this.props.photos.length}\n          cellMeasurerCache={this._cache}\n          cellPositioner={this._cellPositioner}\n          cellRenderer={this._cellRenderer}\n          height={windowScrollerEnabled ? this._height : height}\n          ref={this._setMasonryRef}\n          scrollTop={this._scrollTop}\n          width={width}/>\n      </div>\n    );\n  }\n\n  _resetCellPositioner() {\n    const { columnWidth, gutterSize } = this.state;\n\n    this._cellPositioner.reset({\n      columnCount: this._columnCount,\n      columnWidth,\n      spacer: gutterSize\n    });\n  }\n\n  _setMasonryRef(ref) {\n    this._masonry = ref;\n  }\n}\n\n\nPhotosListCardView = connect((store)=>{\n  return {\n    fetchedPhotos: store.photos.fetchedPhotos,\n    fetchingPhotosfetchedPhotos: store.photos.fetchingPhotos,\n    photos: store.photos.photos,\n  }\n})(PhotosListCardView)\n\n"
  },
  {
    "path": "src/layouts/favoriteAutoAlbums.js",
    "content": "import React, { Component } from 'react';\nimport { connect } from \"react-redux\";\nimport {fetchPeopleAlbums, fetchAutoAlbums, generateAutoAlbums, fetchAutoAlbumsList} from '../actions/albumsActions'\nimport {AlbumAutoCard, AlbumAutoGallery} from '../components/album'\nimport {Container, Icon, Header, Button, Card, Label, Popup, Divider} from 'semantic-ui-react'\nimport {Server, serverAddress} from '../api_client/apiClient'\n\nexport class FavoriteAutoAlbumsView extends Component {\n\tconstructor(props){\n\t\tsuper(props)\n\t\tthis.filterFavoriteAutoAlbums = this.filterFavoriteAutoAlbums.bind(this)\n\t}\n\n\tcomponentWillMount(){\n\t\tif (this.props.albumsAutoList.length==0){\n\t\t\tthis.props.dispatch(fetchAutoAlbumsList())\n\t\t} \n\t}\n\n\tfilterFavoriteAutoAlbums(){\n\t\tvar favoriteAutoAlbums = this.props.albumsAutoList.filter(function(album){\n\t\t\tif (album.favorited){\n\t\t\t\treturn true\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn false\n\t\t\t}\n\t\t})\n\t\treturn favoriteAutoAlbums\n\t}\n\n\n\n\trender() {\n\t\tvar favoriteAutoAlbums = this.filterFavoriteAutoAlbums()\n\t\tconsole.log(favoriteAutoAlbums)\n\n\t\tvar match = this.props.match\n\t\tvar mappedFavoriteAutoAlbumCard = favoriteAutoAlbums.map(function(album){\n      var albumTitle = album.title\n      var albumDate = album.timestamp.split('T')[0]\n      try {\n        var albumCoverURL = album.cover_photo_url\n      }\n      catch(err) {\n        console.log(err)\n        var albumCoverURL = null\n      }\n\t\t\treturn (\n        <AlbumAutoCard \n        \tmatch={match}\n          key={'album-auto-favorite-'+album.id+'-'+album.favorited}\n          albumTitle={albumTitle}\n          timestamp={albumDate}\n          people={album.people}\n          favorited={album.favorited}\n          album_id={album.id}\n          albumCoverURL={serverAddress+albumCoverURL}\n          photoCount={album.photo_count}/>\n\t\t\t)\n\t\t})\n\t\treturn (\n\t\t\t<Container fluid>\n        <div style={{width:'100%', textAlign:'center'}}>\n          <Icon.Group size='huge'>\n            <Icon inverted circular name='heart' color='pink'/>\n            <Icon inverted circular corner name='wizard'/>\n          </Icon.Group>\n        </div>\n        <Header as='h2' icon textAlign='center'>\n          <Header.Content>\n            Favorite Events\n            <Header.Subheader>View your favorite automatically generated event albums</Header.Subheader>\n            <Header.Subheader>{mappedFavoriteAutoAlbumCard.length} Favorites</Header.Subheader>\n          </Header.Content>\n        </Header>\n\t\t\t\t<Card.Group itemsPerRow={5} stackable>\n\t\t\t\t\t{mappedFavoriteAutoAlbumCard}\n\t\t\t\t</Card.Group>\n\t\t\t</Container>\n\t\t)\n\t}\n}\n\n\n\nFavoriteAutoAlbumsView = connect((store)=>{\n  return {\n    albumsAuto: store.albums.albumsAuto,\n    fetchingAlbumsAuto: store.albums.fetchingAlbumsAuto,\n    fetchedAlbumsAuto: store.albums.fetchedAlbumsAuto,\n    \n    albumsAutoList: store.albums.albumsAutoList,\n    fetchingAlbumsAutoList: store.albums.fetchingAlbumsAutoList,\n    fetchedAlbumsAutoList: store.albums.fetchedAlbumsAutoList,\n\n    generatingAlbumsAuto: store.albums.generatingAlbumsAuto,\n    generatedAlbumsAuto: store.albums.generatedAlbumsAuto,\n    statusAutoAlbumProcessing: store.util.statusAutoAlbumProcessing,\n    statusPhotoScan: store.util.statusPhotoScan,\n    scanningPhotos: store.photos.scanningPhotos,\n\n  }\n})(FavoriteAutoAlbumsView)\n"
  },
  {
    "path": "src/layouts/loginPage.js",
    "content": "import React, { Component } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport {\n  Button,\n  Divider,\n  Form,\n  Header,\n  Image,\n  Message,\n  Segment\n} from \"semantic-ui-react\";\n\nconst options = [\n  { key: \"https://\", text: \"https://\", value: \"https://\" },\n  { key: \"http://\", text: \"http://\", value: \"http://\" }\n];\n\nexport class LoginPage extends Component {\n  constructor(props) {\n    super(props);\n    this.onSubmit = this.onSubmit.bind(this);\n    this.handleServerProtocolChange = this.handleServerProtocolChange.bind(\n      this\n    );\n  }\n\n  state = {\n    username: \"\",\n    password: \"\",\n    serverAddress: \"\",\n    serverProtocol: \"https://\"\n  };\n  componentDidMount() {\n    this.props.fetchSiteSettings()\n  }\n\n  handleChange = (e, { name, value }) => this.setState({ [name]: value });\n\n  handleServerProtocolChange = (e, { name, value }) =>\n    this.setState({ serverProtocol: value });\n\n  onSubmit(event) {\n    event.preventDefault();\n    this.props.onSubmit(this.state.username.toLowerCase(), this.state.password);\n  }\n\n  render() {\n\n    const { username, password, serverAddress } = this.state;\n\n    return (\n      <div\n        style={{\n          paddingTop: 150,\n          position: \"fixed\",\n          left: 0,\n          top: 0,\n          width: \"100%\",\n          height: \"100%\",\n          overflowY: \"auto\",\n          // background:\"url('/login_background.jpg')\",\n          backgroundColor: \"#dddddd\",\n          backgroundSize: \"cover\"\n        }}\n      >\n        <div style={{ maxWidth: 500, padding: 20, margin: \"0 auto\" }}>\n          <Header as=\"h3\" textAlign=\"center\">\n            <Image src={\"/logo.png\"} />\n            <Header.Content>Ownphotos</Header.Content>\n          </Header>\n          <Segment attached>\n            <Header>Login</Header>\n\n            <Form onSubmit={this.onSubmit}>\n              <Form.Field>\n                <label>User Name</label>\n                <Form.Input\n                  icon=\"user\"\n                  placeholder=\"Username\"\n                  name=\"username\"\n                  value={username}\n                  onChange={this.handleChange}\n                />\n              </Form.Field>\n              <Form.Field>\n                <label>Password</label>\n                <Form.Input\n                  icon=\"lock\"\n                  type=\"password\"\n                  placeholder=\"Password\"\n                  name=\"password\"\n                  value={password}\n                  onChange={this.handleChange}\n                />\n                <Divider />\n                <Form.Button fluid color=\"blue\" content=\"Log in\" />\n\n                {\n                  this.props.siteSettings.allow_registration &&\n                    <div>\n                      <Divider />\n                      <Button\n                        disabled={!this.props.siteSettings.allow_registration}\n                        as={Link}\n                        to=\"/signup\"\n                        fluid\n                        color=\"green\"\n                        content=\"Sign up\"\n                      />\n                    </div>\n                }\n\n\n              </Form.Field>\n            </Form>\n          </Segment>\n          {this.props.errors &&\n            this.props.errors.data && (\n              <Message color=\"red\" secondary attached>\n                {this.props.errors.data.non_field_errors[0]}\n              </Message>\n            )}\n          {this.props.errors &&\n            this.props.errors.non_field_errors && (\n              <Message color=\"red\" secondary attached>\n                No connection to backend server\n              </Message>\n            )}\n          {this.props.errors &&\n            this.props.errors.password && (\n              <Message color=\"red\" secondary attached>\n                Password may not be blank!\n              </Message>\n            )}\n          {this.props.errors &&\n            this.props.errors.username && (\n              <Message color=\"red\" secondary attached=\"bottom\">\n                Username may not be blank!\n              </Message>\n            )}\n        </div>\n        <div\n          style={{\n            maxWidth: 400,\n            textAlign: \"center\",\n            paddingTop: \"10%\",\n            margin: \"0 auto\"\n          }}\n        >\n          A comfy place for your photos.\n        </div>\n      </div>\n    );\n  }\n}\n\n// <Form.Field>\n//   <label>Server Address</label>\n//   <Input\n//     icon='server'\n//     label={\n//     <Dropdown\n//       onChange={this.handleServerProtocolChange}\n//       defaultValue='https://'\n//       options={options} />\n//     }\n//     placeholder='ownphotos.example.com'\n//     name='serverAddress'\n//     value={serverAddress}\n//     onChange={this.handleChange} />\n// </Form.Field>\n"
  },
  {
    "path": "src/layouts/menubars.js",
    "content": "import _ from \"lodash\";\nimport React, { Component } from \"react\";\nimport { connect } from \"react-redux\";\nimport { Link } from \"react-router-dom\";\nimport { push } from \"react-router-redux\";\nimport {\n  Button,\n  Divider,\n  Dropdown,\n  Header,\n  Icon,\n  Image,\n  Input,\n  Menu,\n  Popup,\n  Segment,\n  Sidebar,\n  Progress,\n} from \"semantic-ui-react\";\nimport {\n  fetchPeopleAlbums,\n  fetchPlaceAlbum,\n  fetchPlaceAlbumsList,\n  fetchThingAlbumsList,\n  fetchUserAlbum,\n  fetchUserAlbumsList,\n} from \"../actions/albumsActions\";\nimport { logout } from \"../actions/authActions\";\nimport { fetchPeople } from \"../actions/peopleActions\";\nimport {\n  searchPeople,\n  searchPhotos,\n  searchPlaceAlbums,\n  searchThingAlbums,\n} from \"../actions/searchActions\";\nimport { toggleSidebar } from \"../actions/uiActions\";\nimport {\n  fetchCountStats,\n  fetchExampleSearchTerms,\n  fetchWorkerAvailability,\n} from \"../actions/utilActions\";\nimport { serverAddress } from \"../api_client/apiClient\";\nimport { SecuredImageJWT } from \"../components/SecuredImage\";\n\nvar ENTER_KEY = 13;\nvar topMenuHeight = 45; // don't change this\n\nfunction fuzzy_match(str, pattern) {\n  if (pattern.split(\"\").length > 0) {\n    pattern = pattern.split(\"\").reduce(function (a, b) {\n      return a + \".*\" + b;\n    });\n    return new RegExp(pattern).test(str);\n  } else {\n    return false;\n  }\n}\n\nexport class TopMenuPublic extends Component {\n  render() {\n    return (\n      <div>\n        <Menu\n          style={{ contentAlign: \"left\", backgroundColor: \"#eeeeee\" }}\n          borderless\n          fixed=\"top\"\n          size=\"mini\"\n        >\n          <Menu.Menu position=\"left\">\n            <Menu.Item>\n              <Icon\n                size=\"big\"\n                onClick={() => {\n                  this.props.dispatch(toggleSidebar());\n                }}\n                name={\"sidebar\"}\n              />\n              <Button\n                color=\"black\"\n                style={{\n                  padding: 2,\n                }}\n              >\n                <Image height={30} src=\"/logo-white.png\" />\n              </Button>\n            </Menu.Item>\n          </Menu.Menu>\n\n          <Menu.Item>\n            <Button\n              attached=\"left\"\n              onClick={() => {\n                this.props.dispatch({\n                  type: \"SET_GRID_TYPE\",\n                  payload: \"dense\",\n                });\n              }}\n              icon\n              active={this.props.gridType === \"dense\"}\n            >\n              <Icon name=\"grid layout\" />\n            </Button>\n            <Button\n              attached=\"right\"\n              onClick={() => {\n                this.props.dispatch({\n                  type: \"SET_GRID_TYPE\",\n                  payload: \"loose\",\n                });\n              }}\n              icon\n              active={this.props.gridType === \"loose\"}\n            >\n              <Icon name=\"block layout\" />\n            </Button>\n          </Menu.Item>\n\n          <Menu.Item position=\"right\">\n            <Button as={Link} to=\"/login\">\n              Login\n            </Button>\n          </Menu.Item>\n        </Menu>\n      </div>\n    );\n  }\n}\n\nexport class TopMenu extends Component {\n  state = {\n    searchText: \"\",\n    warningPopupOpen: false,\n    showEmptyQueryWarning: false,\n    width: window.innerWidth,\n    exampleSearchTerm: \"Search...\",\n    searchBarFocused: false,\n    filteredExampleSearchTerms: [],\n    filteredSuggestedPeople: [],\n  };\n\n  constructor(props) {\n    super(props);\n    this.handleSearch = this.handleSearch.bind(this);\n    this.handleChange = this.handleChange.bind(this);\n    this.handleResize = this.handleResize.bind(this);\n    this._handleKeyDown = this._handleKeyDown.bind(this);\n    this.filterSearchSuggestions = this.filterSearchSuggestions.bind(this);\n  }\n\n  handleResize() {\n    this.setState({ width: window.innerWidth });\n  }\n\n  componentDidMount() {\n    this.props.dispatch(fetchPeople());\n    this.props.dispatch(fetchPlaceAlbumsList());\n    this.props.dispatch(fetchThingAlbumsList());\n    this.props.dispatch(fetchUserAlbumsList());\n    this.props.dispatch(fetchExampleSearchTerms());\n    this.props.dispatch(fetchCountStats());\n    window.addEventListener(\"resize\", this.handleResize.bind(this));\n    this.exampleSearchTermCylcer = setInterval(() => {\n      this.setState({\n        exampleSearchTerm:\n          \"Search \" +\n          this.props.exampleSearchTerms[\n            Math.floor(Math.random() * this.props.exampleSearchTerms.length)\n          ],\n      });\n    }, 5000);\n\n    var _dispatch = this.props.dispatch;\n    this.setState({ dispatch: _dispatch });\n    var intervalId = setInterval(() => {\n      _dispatch(fetchWorkerAvailability(this.props.workerRunningJob));\n    }, 2000);\n    this.setState({ intervalId: intervalId });\n  }\n\n  static getDerivedStateFromProps(nextProps, prevState) {\n    if (prevState.searchText.trim().length === 0) {\n      var filteredExampleSearchTerms = [];\n      var filteredSuggestedPeople = [];\n      var filteredSuggestedPlaces = [];\n      var filteredSuggestedThings = [];\n      var filteredSuggestedUserAlbums = [];\n    } else {\n      filteredExampleSearchTerms = nextProps.exampleSearchTerms.filter((el) =>\n        fuzzy_match(el.toLowerCase(), prevState.searchText.toLowerCase())\n      );\n      filteredSuggestedPeople = nextProps.people.filter((person) =>\n        fuzzy_match(\n          person.text.toLowerCase(),\n          prevState.searchText.toLowerCase()\n        )\n      );\n      filteredSuggestedPlaces = nextProps.albumsPlaceList.filter((place) =>\n        fuzzy_match(\n          place.title.toLowerCase(),\n          prevState.searchText.toLowerCase()\n        )\n      );\n      filteredSuggestedThings = nextProps.albumsThingList.filter((thing) =>\n        fuzzy_match(\n          thing.title.toLowerCase(),\n          prevState.searchText.toLowerCase()\n        )\n      );\n      filteredSuggestedUserAlbums = nextProps.albumsUserList.filter((album) =>\n        fuzzy_match(\n          album.title.toLowerCase(),\n          prevState.searchText.toLowerCase()\n        )\n      );\n    }\n    return {\n      ...prevState,\n      filteredSuggestedPeople,\n      filteredExampleSearchTerms,\n      filteredSuggestedPlaces,\n      filteredSuggestedThings,\n      filteredSuggestedUserAlbums,\n    };\n  }\n\n  componentWillUnmount() {\n    window.removeEventListener(\"resize\", this.handleResize.bind(this));\n    clearInterval(this.state.intervalId);\n  }\n\n  _handleKeyDown(event) {\n    switch (event.keyCode) {\n      case ENTER_KEY:\n        this.props.dispatch(searchPhotos(this.state.searchText));\n        this.props.dispatch(push(\"/search\"));\n        break;\n      default:\n        break;\n    }\n  }\n\n  filterSearchSuggestions() {\n    if (this.state.searchText.trim().length === 0) {\n      var filteredExampleSearchTerms = [];\n      var filteredSuggestedPeople = [];\n      var filteredSuggestedPlaces = [];\n      var filteredSuggestedThings = [];\n      var filteredSuggestedUserAlbums = [];\n    } else {\n      filteredExampleSearchTerms = this.props.exampleSearchTerms.filter((el) =>\n        fuzzy_match(el.toLowerCase(), this.state.searchText.toLowerCase())\n      );\n      filteredSuggestedPeople = this.props.people.filter((person) =>\n        fuzzy_match(\n          person.text.toLowerCase(),\n          this.state.searchText.toLowerCase()\n        )\n      );\n      filteredSuggestedPlaces = this.props.albumsPlaceList.filter((place) =>\n        fuzzy_match(\n          place.title.toLowerCase(),\n          this.state.searchText.toLowerCase()\n        )\n      );\n      filteredSuggestedThings = this.props.albumsThingList.filter((thing) =>\n        fuzzy_match(\n          thing.title.toLowerCase(),\n          this.state.searchText.toLowerCase()\n        )\n      );\n      filteredSuggestedUserAlbums = this.props.albumsUserList.filter((album) =>\n        fuzzy_match(\n          album.title.toLowerCase(),\n          this.state.searchText.toLowerCase()\n        )\n      );\n    }\n    this.setState({\n      filteredSuggestedPeople,\n      filteredExampleSearchTerms,\n      filteredSuggestedPlaces,\n      filteredSuggestedThings,\n      filteredSuggestedUserAlbums,\n    });\n  }\n\n  handleSearch(e, d) {\n    if (this.state.searchText.length > 0) {\n      this.props.dispatch(searchPhotos(this.state.searchText));\n      this.props.dispatch(searchPeople(this.state.searchText));\n      this.props.dispatch(searchThingAlbums(this.state.searchText));\n      this.props.dispatch(searchPlaceAlbums(this.state.searchText));\n      this.props.dispatch(push(\"/search\"));\n    } else {\n      this.setState({ warningPopupOpen: true, showEmptyQueryWarning: true });\n      this.timeout = setTimeout(() => {\n        this.setState({ warningPopupOpen: false, showEmptyQueryWarning: true });\n      }, 2500);\n    }\n  }\n\n  handleChange(e, d) {\n    this.state.searchText = d.value;\n    this.filterSearchSuggestions();\n  }\n\n  render() {\n    var searchBarWidth =\n      this.state.width > 600 ? this.state.width - 200 : this.state.width - 220;\n    var searchBarWidth = this.state.width - 300;\n\n    const {\n      filteredSuggestedUserAlbums,\n      filteredExampleSearchTerms,\n      filteredSuggestedPeople,\n      filteredSuggestedPlaces,\n      filteredSuggestedThings,\n    } = this.state;\n\n    let runningJobPopupProgress = null;\n    if (\n      this.props.workerRunningJob &&\n      this.props.workerRunningJob.result &&\n      this.props.workerRunningJob.result.progress\n    ) {\n      runningJobPopupProgress = (\n        <div style={{ width: 150 }}>\n          <Progress\n            indicating\n            progress=\"ratio\"\n            value={this.props.workerRunningJob.result.progress.current}\n            total={this.props.workerRunningJob.result.progress.target}\n          >\n            Running {this.props.workerRunningJob.job_type_str} ...\n          </Progress>\n        </div>\n      );\n    }\n\n    return (\n      <div>\n        <Menu\n          style={{ contentAlign: \"left\", backgroundColor: \"#eeeeee\" }}\n          borderless\n          fixed=\"top\"\n          size=\"mini\"\n        >\n          <Menu.Menu position=\"left\">\n            <Menu.Item>\n              <Icon\n                size=\"big\"\n                onClick={() => {\n                  this.props.dispatch(toggleSidebar());\n                }}\n                name={\"sidebar\"}\n              />\n              <Button\n                color=\"black\"\n                style={{\n                  padding: 2,\n                }}\n              >\n                <Image height={30} src=\"/logo-white.png\" />\n              </Button>\n            </Menu.Item>\n          </Menu.Menu>\n\n          <Menu.Menu position=\"right\">\n            <Menu.Item>\n              <Input\n                size=\"large\"\n                onFocus={() => {\n                  this.setState({ searchBarFocused: true });\n                }}\n                onBlur={() => {\n                  _.debounce(() => {\n                    this.setState({ searchBarFocused: false });\n                  }, 200)();\n                }}\n                onKeyDown={(event) => {\n                  switch (event.keyCode) {\n                    case ENTER_KEY:\n                      this.props.dispatch(searchPhotos(this.state.searchText));\n                      this.props.dispatch(push(\"/search\"));\n                      this.setState({searchBarFocused: false});\n                      break;\n                    default:\n                      break;\n                  }\n                }}\n                onChange={this.handleChange}\n                action={{\n                  icon: \"search\",\n                  color: \"blue\",\n                  loading: this.props.searchingPhotos,\n                  onClick: this.handleSearch,\n                }}\n                placeholder={this.state.exampleSearchTerm}\n              />\n            </Menu.Item>\n            <Menu.Item>\n              <Popup\n                trigger={\n                  <Icon\n                    style={{ paddingRight: 10 }}\n                    name=\"circle\"\n                    color={!this.props.workerAvailability ? \"red\" : \"green\"}\n                  />\n                }\n                position=\"bottom center\"\n                content={\n                  this.props.workerAvailability\n                    ? \"Worker available! You can start scanning more photos, infer face labels, auto create event albums, or regenerate auto event album titles.\"\n                    : !this.props.workerAvailability &&\n                      this.props.workerRunningJob\n                    ? runningJobPopupProgress\n                    : \"Busy...\"\n                }\n              />\n\n              <Dropdown\n                size=\"big\"\n                button\n                icon=\"user\"\n                labeled\n                text={this.props.auth.access.name}\n                floating\n                className=\"icon\"\n              >\n                <Dropdown.Menu>\n                  <Dropdown.Header>\n                    Logged in as <b>{this.props.auth.access.name}</b>\n                  </Dropdown.Header>\n                  <Dropdown.Item onClick={() => this.props.dispatch(logout())}>\n                    <Icon name=\"sign out\" />\n                    <b>Logout</b>\n                  </Dropdown.Item>\n                  <Dropdown.Item\n                    onClick={() => this.props.dispatch(push(\"/settings\"))}\n                  >\n                    <Icon name=\"settings\" />\n                    <b>Settings</b>\n                  </Dropdown.Item>\n                  {this.props.auth.access.is_admin && <Dropdown.Divider />}\n\n                  {this.props.auth.access.is_admin && (\n                    <Dropdown.Item\n                      onClick={() => this.props.dispatch(push(\"/admin\"))}\n                    >\n                      <Icon name=\"wrench\" />\n                      <b>Admin Area</b>\n                    </Dropdown.Item>\n                  )}\n                </Dropdown.Menu>\n              </Dropdown>\n            </Menu.Item>\n          </Menu.Menu>\n        </Menu>\n        {this.state.searchBarFocused && (\n          <div\n            style={{\n              paddingTop: 5,\n              paddingLeft: 10,\n              paddingRight: 10,\n              width: searchBarWidth,\n              textAlign: \"left\",\n              zIndex: 120,\n              top: topMenuHeight,\n              left: (this.state.width - searchBarWidth) / 2,\n              position: \"absolute\",\n            }}\n          >\n            <Header as=\"h3\" attached=\"top\">\n              Search Suggestions\n            </Header>\n            {filteredExampleSearchTerms.length > 0 && (\n              <Segment\n                attached\n                raised\n                textAlign=\"left\"\n                style={{ paddingTop: 0, paddingRight: 0, paddingBottom: 0 }}\n              >\n                <div\n                  style={{\n                    maxHeight: window.innerHeight / 8,\n                    overflowY: \"auto\",\n                  }}\n                >\n                  <div style={{ height: 10 }} />\n                  {filteredExampleSearchTerms.slice(0, 10).map((el) => {\n                    return (\n                      <p\n                        key={\"suggestion_\" + el}\n                        onClick={() => {\n                          this.props.dispatch(searchPhotos(el));\n                          this.props.dispatch(searchPeople(el));\n                          this.props.dispatch(searchThingAlbums(el));\n                          this.props.dispatch(searchPlaceAlbums(el));\n                          this.props.dispatch(push(\"/search\"));\n                        }}\n                      >\n                        <Icon name=\"search\" />\n                        {el}\n                      </p>\n                    );\n                  })}\n                  <div style={{ height: 5 }} />\n                </div>\n              </Segment>\n            )}\n            {filteredSuggestedUserAlbums.length > 0 && (\n              <Header as=\"h4\" attached>\n                My Albums\n              </Header>\n            )}\n            {filteredSuggestedUserAlbums.length > 0 && (\n              <Segment\n                attached\n                raised\n                textAlign=\"left\"\n                style={{ paddingTop: 0, paddingRight: 0, paddingBottom: 0 }}\n              >\n                <div\n                  style={{\n                    maxHeight: window.innerHeight / 8,\n                    overflowY: \"auto\",\n                  }}\n                >\n                  <div style={{ height: 10 }} />\n                  {filteredSuggestedUserAlbums.slice(0, 10).map((album) => {\n                    return (\n                      <p\n                        key={\"suggestion_place_\" + album.title}\n                        onClick={() => {\n                          this.props.dispatch(push(`/useralbum/${album.id}`));\n                          this.props.dispatch(fetchUserAlbum(album.id));\n                        }}\n                      >\n                        <Icon name=\"bookmark\" />\n                        {album.title}\n                      </p>\n                    );\n                  })}\n                  <div style={{ height: 5 }} />\n                </div>\n              </Segment>\n            )}\n\n            {filteredSuggestedPlaces.length > 0 && (\n              <Header as=\"h4\" attached>\n                Places\n              </Header>\n            )}\n            {filteredSuggestedPlaces.length > 0 && (\n              <Segment\n                attached\n                raised\n                textAlign=\"left\"\n                style={{ paddingTop: 0, paddingRight: 0, paddingBottom: 0 }}\n              >\n                <div\n                  style={{\n                    maxHeight: window.innerHeight / 8,\n                    overflowY: \"auto\",\n                  }}\n                >\n                  <div style={{ height: 10 }} />\n                  {filteredSuggestedPlaces.slice(0, 10).map((place) => {\n                    return (\n                      <p\n                        key={\"suggestion_place_\" + place.title}\n                        onClick={() => {\n                          this.props.dispatch(push(`/place/${place.id}`));\n                          this.props.dispatch(fetchPlaceAlbum(place.id));\n                        }}\n                      >\n                        <Icon name=\"map outline\" />\n                        {place.title}\n                      </p>\n                    );\n                  })}\n                  <div style={{ height: 5 }} />\n                </div>\n              </Segment>\n            )}\n\n            {filteredSuggestedThings.length > 0 && (\n              <Header as=\"h4\" attached>\n                Things\n              </Header>\n            )}\n            {filteredSuggestedThings.length > 0 && (\n              <Segment\n                attached\n                raised\n                textAlign=\"left\"\n                style={{ paddingTop: 0, paddingRight: 0, paddingBottom: 0 }}\n              >\n                <div\n                  style={{\n                    maxHeight: window.innerHeight / 8,\n                    overflowY: \"auto\",\n                  }}\n                >\n                  <div style={{ height: 10 }} />\n                  {filteredSuggestedThings.slice(0, 10).map((thing) => {\n                    return (\n                      <p\n                        key={\"suggestion_thing_\" + thing.title}\n                        onClick={() => {\n                          this.props.dispatch(push(`/search`));\n                          this.props.dispatch(searchPhotos(thing.title));\n                        }}\n                      >\n                        <Icon name=\"tag\" />\n                        {thing.title}\n                      </p>\n                    );\n                  })}\n                  <div style={{ height: 5 }} />\n                </div>\n              </Segment>\n            )}\n\n            {filteredSuggestedPeople.length > 0 && (\n              <Header as=\"h4\" attached>\n                People\n              </Header>\n            )}\n            {filteredSuggestedPeople.length > 0 && (\n              <Segment attached raised style={{ padding: 0 }}>\n                <div\n                  style={{\n                    maxWidth: searchBarWidth - 5,\n                    height: 60,\n                    padding: 5,\n                    overflow: \"hidden\",\n                  }}\n                >\n                  <Image.Group>\n                    {filteredSuggestedPeople.map((person) => {\n                      return (\n                        <Popup\n                          inverted\n                          content={person.text}\n                          trigger={\n                            <SecuredImageJWT\n                              key={\"suggestion_person_\" + person.key}\n                              onClick={() => {\n                                this.props.dispatch(\n                                  push(`/person/${person.key}`)\n                                );\n                                this.props.dispatch(\n                                  fetchPeopleAlbums(person.key)\n                                );\n                              }}\n                              height={50}\n                              width={50}\n                              circular\n                              src={serverAddress + person.face_url}\n                            />\n                          }\n                        />\n                      );\n                    })}\n                  </Image.Group>\n                </div>\n              </Segment>\n            )}\n\n            <Header as=\"h4\" attached>\n              <Header.Content as={Link} to=\"/favorites\">\n                <Icon name=\"star\" color=\"yellow\" /> Favorites\n              </Header.Content>\n            </Header>\n            <Header as=\"h4\" attached=\"bottom\">\n              <Header.Content as={Link} to=\"/hidden\">\n                <Icon name=\"hide\" color=\"red\" /> Hidden\n              </Header.Content>\n            </Header>\n          </div>\n        )}\n      </div>\n    );\n  }\n}\n\nexport class SideMenuNarrowPublic extends Component {\n  render() {\n    return (\n      <Menu\n        borderless\n        icon=\"labeled\"\n        vertical\n        fixed=\"left\"\n        floated\n        pointing\n        width=\"thin\"\n      >\n        <Divider hidden />\n        <Divider hidden />\n        <Divider hidden />\n        <Divider hidden />\n\n        <Dropdown\n          pointing=\"left\"\n          item\n          icon={\n            <Icon.Group size=\"big\">\n              <Icon name=\"globe\" />\n            </Icon.Group>\n          }\n        >\n          <Dropdown.Menu>\n            <Dropdown.Header>Public</Dropdown.Header>\n            <Dropdown.Item as={Link} to=\"/users/\">\n              <Icon name=\"users\" />\n              {\"  Users\"}\n            </Dropdown.Item>\n          </Dropdown.Menu>\n        </Dropdown>\n        <div style={{ marginTop: -17 }}>\n          <small>Public</small>\n        </div>\n      </Menu>\n    );\n  }\n}\n\nexport class SideMenuNarrow extends Component {\n  state = { activeItem: \"all photos\" };\n\n  handleItemClick = (e, { name }) => this.setState({ activeItem: name });\n  handleLogout = (e, { name }) => this.props.dispatch(logout());\n\n  render() {\n    var authMenu = (\n      <Menu.Item onClick={this.handleLogout} name=\"loginout\">\n        <Popup\n          inverted\n          size=\"mini\"\n          position=\"right center\"\n          content=\"Sign out\"\n          trigger={<Icon name=\"sign out\" corner />}\n        />\n      </Menu.Item>\n    );\n\n    const { activeItem } = this.state;\n    return (\n      <Menu\n        borderless\n        icon=\"labeled\"\n        vertical\n        fixed=\"left\"\n        floated\n        pointing\n        width=\"thin\"\n      >\n        <Divider hidden />\n        <Divider hidden />\n        <Divider hidden />\n        <Divider hidden />\n\n        {false && (\n          <Menu.Item name=\"logo\">\n            <img height={40} src=\"/logo.png\" />\n            <p>\n              <small>Ownphotos</small>\n            </p>\n          </Menu.Item>\n        )}\n\n        <Dropdown\n          pointing=\"left\"\n          item\n          icon={\n            <Icon.Group size=\"big\">\n              <Icon name=\"image outline\" />\n            </Icon.Group>\n          }\n        >\n          <Dropdown.Menu>\n            <Dropdown.Header>Photos</Dropdown.Header>\n            <Dropdown.Item as={Link} to=\"/\">\n              <Icon color=\"green\" name=\"calendar check outline\" />\n              {\"  With Timestamp\"}\n            </Dropdown.Item>\n            <Dropdown.Item as={Link} to=\"/notimestamp\">\n              <Icon color=\"red\" name=\"calendar times outline\" />\n              {\"  Without Timestamp\"}\n            </Dropdown.Item>\n            <Dropdown.Divider />\n\n            <Dropdown.Item as={Link} to=\"/recent\">\n              <Icon name=\"clock\" />\n              {\"  Recently Added\"}\n            </Dropdown.Item>\n            <Dropdown.Divider />\n\n            <Dropdown.Item as={Link} to=\"/hidden\">\n              <Icon color=\"red\" name=\"hide\" />\n              {\"  Hidden\"}\n            </Dropdown.Item>\n            <Dropdown.Item as={Link} to=\"/favorites\">\n              <Icon name=\"star\" color=\"yellow\" />\n              {\"  Favorites\"}\n            </Dropdown.Item>\n            <Dropdown.Item\n              disabled={!this.props.auth.access}\n              as={Link}\n              to={\n                this.props.auth.access\n                  ? `/user/${this.props.auth.access.name}`\n                  : \"/\"\n              }\n            >\n              <Icon color=\"green\" name=\"globe\" />\n              {\"  My Public Photos\"}\n            </Dropdown.Item>\n          </Dropdown.Menu>\n        </Dropdown>\n        <div style={{ marginTop: -17 }}>\n          <small>Photos</small>\n        </div>\n\n        <Divider hidden />\n\n        <Dropdown\n          pointing=\"left\"\n          item\n          icon={\n            <Icon.Group size=\"big\">\n              <Icon name=\"images outline\" />\n              <Icon name=\"bookmark\" corner />\n            </Icon.Group>\n          }\n        >\n          <Dropdown.Menu>\n            <Dropdown.Header>Albums</Dropdown.Header>\n            <Dropdown.Item as={Link} to=\"/people\">\n              <Icon name=\"users\" />\n              {\"  People\"}\n            </Dropdown.Item>\n            <Dropdown.Item as={Link} to=\"/places\">\n              <Icon name=\"map\" />\n              {\"  Places\"}\n            </Dropdown.Item>\n            <Dropdown.Item as={Link} to=\"/things\">\n              <Icon name=\"tags\" />\n              {\"  Things\"}\n            </Dropdown.Item>\n            <Dropdown.Divider />\n            <Dropdown.Item as={Link} to=\"/useralbums\">\n              <Icon name=\"bookmark\" />\n              {\"  My Albums\"}\n            </Dropdown.Item>\n            <Dropdown.Item as={Link} to=\"/events\">\n              <Icon name=\"wizard\" />\n              {\"  Auto Created Albums\"}\n            </Dropdown.Item>\n          </Dropdown.Menu>\n        </Dropdown>\n        <div style={{ marginTop: -17 }}>\n          <small>Albums</small>\n        </div>\n\n        <Divider hidden />\n        <Dropdown\n          pointing=\"left\"\n          item\n          icon={\n            <Icon.Group size=\"big\">\n              <Icon name=\"bar chart\" />\n            </Icon.Group>\n          }\n        >\n          <Dropdown.Menu>\n            <Dropdown.Header>Data Visualization</Dropdown.Header>\n            <Dropdown.Item as={Link} to=\"/placetree\">\n              <Icon name=\"sitemap\" />\n              {\"  Place Tree\"}\n            </Dropdown.Item>\n\n            <Dropdown.Item as={Link} to=\"/wordclouds\">\n              <Icon name=\"cloud\" />\n              {\"  Word Clouds\"}\n            </Dropdown.Item>\n\n            <Dropdown.Item as={Link} to=\"/timeline\">\n              <Icon name=\"bar chart\" />\n              {\"  Timeline\"}\n            </Dropdown.Item>\n\n            <Dropdown.Item as={Link} to=\"/socialgraph\">\n              <Icon name=\"share alternate\" />\n              {\"  Social Graph\"}\n            </Dropdown.Item>\n\n            <Dropdown.Item as={Link} to=\"/facescatter\">\n              <Icon name=\"users circle\" />\n              {\"  Face Clusters\"}\n            </Dropdown.Item>\n          </Dropdown.Menu>\n        </Dropdown>\n        <div style={{ marginTop: -17 }}>\n          <small>Data Viz</small>\n        </div>\n\n        <Divider hidden />\n        <Dropdown\n          pointing=\"left\"\n          item\n          icon={\n            <Icon.Group size=\"big\">\n              <Icon name=\"dashboard\" />\n            </Icon.Group>\n          }\n        >\n          <Dropdown.Menu>\n            <Dropdown.Header>Dashboards</Dropdown.Header>\n            <Dropdown.Item as={Link} to=\"/faces\">\n              <Icon name=\"user circle outline\" />\n              {\"  Face Recognition\"}\n            </Dropdown.Item>\n            <Dropdown.Item as={Link} to=\"/settings\">\n              <Icon name=\"database\" />\n              {\"  Library\"}\n            </Dropdown.Item>\n          </Dropdown.Menu>\n        </Dropdown>\n        <div style={{ marginTop: -17 }}>\n          <small>Dashboards</small>\n        </div>\n\n        {this.props.auth && (\n          <div>\n            <Divider hidden />\n            <Dropdown\n              pointing=\"left\"\n              item\n              icon={\n                <Icon.Group size=\"big\">\n                  <Icon name=\"users\" />\n                </Icon.Group>\n              }\n            >\n              <Dropdown.Menu>\n                <Dropdown.Header>Sharing</Dropdown.Header>\n\n                <Dropdown.Item\n                  disabled={!this.props.auth.access}\n                  as={Link}\n                  to={`/users/`}\n                >\n                  <Icon name=\"globe\" />\n                  {\"  Public photos\"}\n                </Dropdown.Item>\n\n                <Dropdown.Item as={Link} to=\"/shared/fromme/photos/\">\n                  <Icon name=\"share\" color=\"red\" />\n                  {\"  You shared\"}\n                </Dropdown.Item>\n\n                <Dropdown.Item as={Link} to=\"/shared/tome/photos/\">\n                  <Icon name=\"share\" color=\"green\" />\n                  {\"  Shared with you\"}\n                </Dropdown.Item>\n              </Dropdown.Menu>\n            </Dropdown>\n            <div style={{ marginTop: -17 }}>\n              <small>Sharing</small>\n            </div>\n          </div>\n        )}\n      </Menu>\n    );\n  }\n}\n\nexport class SideMenu extends Component {\n  state = { activeItem: \"photos\" };\n\n  handleItemClick = (e, { name }) => this.setState({ activeItem: name });\n  handleLogout = (e, { name }) => this.props.dispatch(logout());\n\n  render() {\n    if (this.props.jwtToken == null) {\n      var authMenu = (\n        <Menu.Item name=\"loginout\" as={Link} to=\"/login\">\n          <Icon name=\"sign out\" corner /> Log In\n        </Menu.Item>\n      );\n    } else {\n      var authMenu = (\n        <Menu.Item\n          onClick={this.handleLogout}\n          name=\"loginout\"\n          as={Link}\n          to=\"/login\"\n        >\n          <Icon name=\"sign in\" corner /> Log Out\n        </Menu.Item>\n      );\n    }\n\n    const { activeItem } = this.state;\n    return (\n      <Sidebar\n        as={Menu}\n        vertical\n        fixed=\"left\"\n        width=\"thin\"\n        color=\"black\"\n        animation=\"overlay\"\n        floated\n        pointing\n        borderless\n        inverted\n      >\n        <Menu.Item name=\"logo\">\n          <img src=\"/logo-white.png\" />\n        </Menu.Item>\n\n        {authMenu}\n\n        <Menu.Item\n          onClick={this.handleItemClick}\n          active={activeItem === \"all photos\"}\n          name=\"all photos\"\n          as={Link}\n          to=\"/\"\n        >\n          <Icon name=\"image\" corner />\n          Browse\n        </Menu.Item>\n\n        <Menu.Item\n          onClick={this.handleItemClick}\n          active={activeItem === \"search\"}\n          name=\"search\"\n          as={Link}\n          to=\"/search\"\n        >\n          <Icon name=\"search\" corner />\n          Search\n        </Menu.Item>\n\n        <Menu.Item>\n          <Menu.Header>\n            <Icon name=\"heart\" />\n            Favorites\n          </Menu.Header>\n          <Menu.Menu>\n            <Menu.Item\n              onClick={this.handleItemClick}\n              active={activeItem === \"favorites auto albums\"}\n              name=\"favorites auto albums\"\n              content=\"Events\"\n              as={Link}\n              to=\"/favorite/auto\"\n            />\n          </Menu.Menu>\n        </Menu.Item>\n\n        <Menu.Item>\n          <Menu.Header>\n            <Icon name=\"image\" />\n            Albums\n          </Menu.Header>\n          <Menu.Menu>\n            <Menu.Item\n              onClick={this.handleItemClick}\n              active={activeItem === \"people albums\"}\n              content=\"People\"\n              name=\"people albums\"\n              as={Link}\n              to=\"/albums/people\"\n            />\n            <Menu.Item\n              onClick={this.handleItemClick}\n              active={activeItem === \"auto albums\"}\n              content=\"Events\"\n              name=\"auto albums\"\n              as={Link}\n              to=\"/albums/auto\"\n            />\n            <Menu.Item\n              onClick={this.handleItemClick}\n              active={activeItem === \"date albums\"}\n              content=\"Days\"\n              name=\"date albums\"\n              as={Link}\n              to=\"/albums/date\"\n            />\n          </Menu.Menu>\n        </Menu.Item>\n\n        <Menu.Item>\n          <Menu.Header>\n            <Icon name=\"dashboard\" />\n            Dashboards\n          </Menu.Header>\n          <Menu.Menu>\n            <Menu.Item\n              onClick={this.handleItemClick}\n              active={activeItem === \"faces dashboard\"}\n              name=\"faces dashboard\"\n              content=\"Faces\"\n              as={Link}\n              to=\"/faces\"\n            />\n            <Menu.Item\n              onClick={this.handleItemClick}\n              active={activeItem === \"people dashboard\"}\n              name=\"people dashboard\"\n              content=\"People\"\n              as={Link}\n              to=\"/people\"\n            />\n\n            <Menu.Item\n              onClick={this.handleItemClick}\n              active={activeItem === \"statistics\"}\n              name=\"statistics\"\n              content=\"Statistics\"\n              as={Link}\n              to=\"/statistics\"\n            />\n          </Menu.Menu>\n        </Menu.Item>\n      </Sidebar>\n    );\n  }\n}\n\nSideMenu = connect((store) => {\n  return {\n    jwtToken: store.auth.jwtToken,\n  };\n})(SideMenu);\n\nTopMenu = connect((store) => {\n  return {\n    showSidebar: store.ui.showSidebar,\n    gridType: store.ui.gridType,\n\n    workerAvailability: store.util.workerAvailability,\n    workerRunningJob: store.util.workerRunningJob,\n\n    auth: store.auth,\n    jwtToken: store.auth.jwtToken,\n    exampleSearchTerms: store.util.exampleSearchTerms,\n    fetchingExampleSearchTerms: store.util.fetchingExampleSearchTerms,\n    fetchedExampleSearchTerms: store.util.fetchedExampleSearchTerms,\n    searchError: store.search.error,\n    searchingPhotos: store.search.searchingPhotos,\n    searchedPhotos: store.search.searchedPhotos,\n    people: store.people.people,\n    fetchingPeople: store.people.fetchingPeople,\n    fetchedPeople: store.people.fetchedPeople,\n\n    albumsThingList: store.albums.albumsThingList,\n    fetchingAlbumsThingList: store.albums.fetchingAlbumsThingList,\n    fetchedAlbumsThingList: store.albums.fetchedAlbumsThingList,\n\n    albumsUserList: store.albums.albumsUserList,\n    fetchingAlbumsUserList: store.albums.fetchingAlbumsUserList,\n    fetchedAlbumsUserList: store.albums.fetchedAlbumsUserList,\n\n    albumsPlaceList: store.albums.albumsPlaceList,\n    fetchingAlbumsPlaceList: store.albums.fetchingAlbumsPlaceList,\n    fetchedAlbumsPlaceList: store.albums.fetchedAlbumsPlaceList,\n  };\n})(TopMenu);\n\nTopMenuPublic = connect((store) => {\n  return {\n    showSidebar: store.ui.showSidebar,\n    gridType: store.ui.gridType,\n  };\n})(TopMenuPublic);\n\nSideMenuNarrow = connect((store) => {\n  return {\n    auth: store.auth,\n    jwtToken: store.auth.jwtToken,\n    location: store.routerReducer.location,\n  };\n})(SideMenuNarrow);\n"
  },
  {
    "path": "src/layouts/noTimestampPhotosView.js",
    "content": "import React, {Component} from 'react';\nimport { connect } from \"react-redux\";\nimport {Popup, Modal, Container, Icon, Divider, Header, Loader, Image, Button, Card} from 'semantic-ui-react'\nimport { fetchPhotoDetail, fetchNoTimestampPhotoList} from '../actions/photosActions';\n\nimport {Server, serverAddress} from '../api_client/apiClient'\nimport { Grid, List, WindowScroller,AutoSizer } from 'react-virtualized';\nimport {LightBox} from '../components/lightBox'\n\nimport { push } from 'react-router-redux'\nimport {calculateGridCells, calculateGridCellSize} from '../util/gridUtils'\n\nimport {ScrollSpeed, SPEED_THRESHOLD, SCROLL_DEBOUNCE_DURATION} from '../util/scrollUtils'\nimport debounce from 'lodash/debounce'\nimport _ from 'lodash'\nimport moment from 'moment'\nimport {PhotoListView} from './ReusablePhotoListView'\n\nvar topMenuHeight = 55 // don't change this\nvar ESCAPE_KEY = 27;\nvar ENTER_KEY = 13;\nvar RIGHT_ARROW_KEY = 39;\nvar UP_ARROW_KEY = 38;\nvar LEFT_ARROW_KEY = 37;\nvar DOWN_ARROW_KEY = 40;\n\nvar SIDEBAR_WIDTH = 85;\n\n\nexport class NoTimestampPhotosView extends Component {\n    state = {\n      photosGroupedByDate: [],\n      idx2hash: [],\n      albumID: null,\n    }\n  \n    componentDidMount() {\n        this.props.dispatch(fetchNoTimestampPhotoList())\n    }\n\n    static getDerivedStateFromProps(nextProps,prevState){\n        const photos = nextProps.noTimestampPhotos.filter(photo=>photo.image_hash)\n        if (prevState.idx2hash.length !== photos.length) {\n\n            var t0 = performance.now();\n            var groupedByDate = _.groupBy(photos,(el)=>{\n                if (el.exif_timestamp) {\n                    return moment(el.exif_timestamp).format('YYYY-MM-DD')\n                } else {\n                    return \"No Timestamp\"\n                }\n            })\n            var groupedByDateList = _.reverse(_.sortBy(_.toPairsIn(groupedByDate).map((el)=>{\n                return {date:el[0],photos:el[1]}\n            }),(el)=>el.date))\n            var idx2hash = []\n            groupedByDateList.forEach((g)=>{\n                g.photos.forEach((p)=>{\n                    idx2hash.push(p.image_hash)\n                })\n            })\n            var t1 = performance.now();\n            console.log(t1-t0)\n            return {\n                ...prevState, \n                photosGroupedByDate: groupedByDateList,\n                idx2hash:idx2hash,\n                albumID:nextProps.match.params.albumID\n            }\n        } else {\n            return null\n        }\n\n    }\n  \n  \n  \n    render() {\n      const {fetchingNoTimestampPhotos} = this.props\n      return (\n        <PhotoListView \n          title={\"Photos without Timestamps\"}\n          loading={fetchingNoTimestampPhotos}\n          titleIconName={'images outline'}\n          photosGroupedByDate={this.state.photosGroupedByDate}\n          idx2hash={this.state.idx2hash}\n        />\n      )  \n    }\n  }\n\n\n\n/*\nexport class NoTimestampPhotosView extends Component {\n\n    constructor(props){\n        super(props)\n        this.cellRenderer = this.cellRenderer.bind(this)\n        this.getRowHeight = this.getRowHeight.bind(this)\n        this.handleResize = this.handleResize.bind(this)\n        this.onPhotoClick = this.onPhotoClick.bind(this)\n        this.getPhotoDetails = this.getPhotoDetails.bind(this)\n        this.state = {\n            idx2hash: [],\n            lightboxImageIndex: 1,\n            lightboxShow:false,\n            lightboxSidebarShow:false,\n            scrollToIndex: undefined,\n            width:  window.innerWidth,\n            height: window.innerHeight,\n            entrySquareSize:200,\n            currTopRenderedRowIdx:0\n        }\n    }\n    componentWillMount() {\n        this.props.dispatch(fetchNoTimestampPhotoList())\n        this.handleResize();\n        window.addEventListener(\"resize\", this.handleResize.bind(this));\n    }\n    componentWillUnmount() {\n        window.removeEventListener(\"resize\",this.handleResize.bind(this))\n    }\n\n    scrollSpeedHandler = new ScrollSpeed();\n\n    handleScroll = ({scrollTop}) => {\n        // scrollSpeed represents the number of pixels scrolled since the last scroll event was fired\n        const scrollSpeed = Math.abs(this.scrollSpeedHandler.getScrollSpeed(scrollTop));\n\n        if (scrollSpeed >= SPEED_THRESHOLD) {\n          this.setState({\n            isScrollingFast: true,\n            scrollTop:scrollTop\n          });\n        }\n\n        // Since this method is debounced, it will only fire once scrolling has stopped for the duration of SCROLL_DEBOUNCE_DURATION\n        this.handleScrollEnd();\n    }\n\n    handleScrollEnd = debounce(() => {\n    const {isScrollingFast} = this.state;\n\n    if (isScrollingFast) {\n      this.setState({\n        isScrollingFast: false,\n      });\n    }\n    }, SCROLL_DEBOUNCE_DURATION);\n\n\n\n    handleResize() {\n        var columnWidth = window.innerWidth - SIDEBAR_WIDTH - 5 - 5 - 10\n        const {entrySquareSize,numEntrySquaresPerRow} = calculateGridCellSize(columnWidth)\n        this.setState({\n            width:  window.innerWidth,\n            height: window.innerHeight,\n            entrySquareSize:entrySquareSize,\n            numEntrySquaresPerRow:numEntrySquaresPerRow\n        })\n    }\n\n    cellRenderer = ({ columnIndex, key, rowIndex, style }) => {\n        var photoResIdx = rowIndex * this.state.numEntrySquaresPerRow + columnIndex\n        if (photoResIdx < this.props.noTimestampPhotos.length) {\n            if (this.state.isScrollingFast) {\n                return (\n                    <div key={key} style={{...style,\n                        width:this.state.entrySquareSize-2,\n                        height:this.state.entrySquareSize-2,\n                        backgroundColor:'#eeeeee'}}>\n                    </div>          \n                )\n            }\n\n        \tif (this.props.noTimestampPhotos[photoResIdx].image_hash.length > 0) {\n\t            return (\n                    <div key={key} style={style}>\n                        <Image key={'daygroup_image_'+this.props.noTimestampPhotos[photoResIdx].image_hash} style={{display:'inline-block',padding:1,margin:0}}\n                            onClick={()=>{\n                                this.onPhotoClick(photoResIdx)\n                            }}\n                            height={this.state.entrySquareSize} \n                            width={this.state.entrySquareSize} \n                            src={serverAddress+'/media/square_thumbnails/'+this.props.noTimestampPhotos[photoResIdx].image_hash+'.jpg'}/>\n                    </div>         \n\t            )\n        \t} else {\n\t            return (\n                    <div key={key} style={{...style,\n                        padding:1,\n                        width:this.state.entrySquareSize-2,\n                        height:this.state.entrySquareSize-2,\n                        backgroundColor:'#eeeeee'}}>\n                    </div>         \n\t            )\n\n        \t}\n        } else {\n            return (<div></div>)\n        }\n    }\n\n\n    getRowHeight = ({index}) => {\n        var rowHeight = this.state.entrySquareSize \n        return (\n            rowHeight\n        )\n    }\n\n\n    onPhotoClick(idx) {\n        if (this.state.idx2hash.length != this.props.noTimestampPhotos.length) {\n            this.setState({idx2hash:this.props.noTimestampPhotos.map((el)=>el.image_hash)})\n        }\n        this.setState({lightboxImageIndex:idx,lightboxShow:true})\n\n    }\n\n    _setRef = windowScroller => {\n        this._windowScroller = windowScroller;\n    };\n    \n    getPhotoDetails(image_hash) {\n        if (!this.props.photoDetails.hasOwnProperty(image_hash)) {\n            this.props.dispatch(fetchPhotoDetail(image_hash))\n        }\n    }\n\n    render() {\n\n        if ( this.props.searchingPhotos ) {\n            if ( this.props.query ) {\n                return (\n                    <div>\n                        <Loader active>\n                        </Loader>\n                    </div>\n                )\n            }\n        }\n        // else {\n        //     return (\n        //         <div style={{padding:100}}> \n        //             <Header textAlign='center'>\n        //             Search for something using the search bar on the top right\n        //             </Header>\n        //         </div>\n        //     )\n        // }\n\n        return (\n            <div style={{}}>\n\n                <div style={{height:60,paddingTop:10}}>\n\n                  <Header as='h2'>\n                    <Icon name='picture' />\n                    <Header.Content>\n                      Photos without Timestamps\n                      <Header.Subheader>\n                        {this.props.noTimestampPhotos.length} Photos\n                      </Header.Subheader>\n                    </Header.Content>\n                  </Header>\n\n                </div>\n\n\n                <AutoSizer disableHeight style={{outline:'none',padding:0,margin:0}}>\n                  {({width}) => (\n                    <Grid\n                      style={{outline:'none'}}\n                      onScroll={this.handleScroll}\n                      cellRenderer={this.cellRenderer}\n                      columnWidth={this.state.entrySquareSize}\n                      columnCount={this.state.numEntrySquaresPerRow}\n                      height={this.state.height - topMenuHeight -60 }\n                      rowHeight={this.state.entrySquareSize}\n                      rowCount={Math.ceil(this.props.noTimestampPhotos.length/this.state.numEntrySquaresPerRow.toFixed(1))}\n                      width={width}/>\n                  )}\n                </AutoSizer>\n\n                { this.state.lightboxShow &&\n                    <LightBox\n                        idx2hash={this.state.idx2hash}\n                        lightboxImageIndex={this.state.lightboxImageIndex}\n\n                        onCloseRequest={() => this.setState({ lightboxShow: false })}\n                        onImageLoad={()=>{\n                            this.getPhotoDetails(this.state.idx2hash[this.state.lightboxImageIndex])\n                        }}\n                        onMovePrevRequest={() => {\n                            var nextIndex = (this.state.lightboxImageIndex + this.state.idx2hash.length - 1) % this.state.idx2hash.length\n                            this.setState({\n                                lightboxImageIndex:nextIndex\n                            })\n                            this.getPhotoDetails(this.state.idx2hash[nextIndex])\n                        }}\n                        onMoveNextRequest={() => {\n                            var nextIndex = (this.state.lightboxImageIndex + this.state.idx2hash.length + 1) % this.state.idx2hash.length\n                            this.setState({\n                                lightboxImageIndex:nextIndex\n                            })\n                            this.getPhotoDetails(this.state.idx2hash[nextIndex])\n                        }}/>\n                }\n\n\n            </div>\n            \n        )\n    }\n}\n*/\n\nNoTimestampPhotosView = connect((store)=>{\n  return {\n  \tfetchingNoTimestampPhotos: store.photos.fetchingNoTimestampPhotos,\n\tfetchedNoTimestampPhotos: store.photos.fetchedNoTimestampPhotos,\n    noTimestampPhotos: store.photos.noTimestampPhotos,\n    photoDetails: store.photos.photoDetails,\n    fetchingPhotoDetail: store.photos.fetchingPhotoDetail,\n    fetchedPhotoDetail: store.photos.fetchedPhotoDetail,\n  }\n})(NoTimestampPhotosView)\n\n\n"
  },
  {
    "path": "src/layouts/notImplementedPlaceholder.js",
    "content": "import React, {Component} from 'react'\n\nexport class NotImplementedPlaceholder extends Component {\n\trender() {\n\t\treturn (\n\t\t\t<div>Not implemented yet!</div>\n\t\t)\n\t}\n}"
  },
  {
    "path": "src/layouts/peopleDashboard.js",
    "content": "import React, { Component } from 'react';\nimport { connect } from \"react-redux\";\nimport { Image, Header, Message, Dropdown, Divider, Card, \n         Container, Segment, Button, Icon, Popup, Loader, \n         Dimmer, Grid, Reveal, Statistic, Label, Table,\n         Modal } from 'semantic-ui-react';\nimport { fetchPeople, \n         addPerson ,\n         addPersonAndSetLabelToFace} from '../actions/peopleActions';\nimport { fetchFaces, \n         fetchLabeledFaces,\n         fetchInferredFaces,\n         deleteFaceAndFetchNext, \n         labelFacePerson ,\n         fetchFaceToLabel,\n         loadFaceToLabel,\n         labelFacePersonAndFetchNext} from '../actions/facesActions';\n\nimport SocialGraph from '../components/socialGraph'\nimport PeopleCardGroup from '../components/people'\n\nexport class PeopleDashboard extends Component {\n  render() {\n    return (\n      <Container fluid>\n        <Header dividing as='h2' icon textAlign='center'>\n          <Header.Content>\n            <Icon size='small' name='users'/>People Dashboard\n            <Header.Subheader>Manage people in your photos</Header.Subheader>\n          </Header.Content>\n        </Header>\n\n\n\n        <SocialGraph/>\n\n        <Header as='h3'>People</Header>\n        <PeopleCardGroup/>\n      </Container>\n    )\n  }  \n}"
  },
  {
    "path": "src/layouts/privateRoute.js",
    "content": "\n\nimport React from 'react'\nimport { connect } from 'react-redux'\nimport * as reducers from '../reducers'\nimport {\n  BrowserRouter as Router,\n  Route,\n  Switch,\n  Redirect\n} from 'react-router-dom'\nimport {SideMenuNarrow, TopMenu} from './menubars'\n\nvar topMenuHeight = 45 // don't change this\nvar leftMenuWidth = 85 // don't change this\nvar leftMenuWidth = 85 // don't change this\n\n      // <div>\n      //   <Nav />\n      //   <Component {...props}/>\n      // </div>\n\n\nconst PrivateRoute = ({ component: Component, isAuthenticated, showSidebar, ...rest }) => {\n  return (\n    <Route {...rest} render={props => (\n      isAuthenticated ? (\n        <div>\n          <div style={{paddingLeft:showSidebar ? leftMenuWidth+5 : 5,paddingRight:0}}>\n            <div style={{paddingTop:topMenuHeight}}>\n              <Component {...props}/>\n            </div>\n          </div>\n        </div>\n      ) : (\n        <Redirect to={{\n          pathname: '/login',\n          state: { from: props.location }\n        }}/>\n      )\n    )}/>\n  )\n}\n\n\n\n\n\nclass Nav extends React.Component {\n  render() {\n    return (\n      <div>\n        <SideMenuNarrow/>\n        <TopMenu style={{zIndex:-1}}/>\n      </div>\n    )\n  }\n}\n\n\nconst mapStateToProps = (state) => ({\n      isAuthenticated: !reducers.isRefreshTokenExpired(state),\n      showSidebar: state.ui.showSidebar\n})\n\nexport default connect(mapStateToProps, null)(PrivateRoute);\n"
  },
  {
    "path": "src/layouts/searchMultipleResultsCategories.js",
    "content": "import React, {Component} from 'react';\nimport ReactDOM from 'react-dom';\nimport { Grid, List, WindowScroller,AutoSizer } from 'react-virtualized';\nimport 'react-virtualized/styles.css'; // only needs to be imported once\nimport { connect } from \"react-redux\";\nimport {  fetchDateAlbumsPhotoHashList,fetchAlbumsDateGalleries} from '../actions/albumsActions'\nimport {  fetchPhotoDetail} from '../actions/photosActions'\nimport { Card, Image, Header, Divider, Item, Loader, Dimmer, Modal, Sticky, Portal, Input,\n         Container, Label, Popup, Segment, Button, Icon, Table, Transition} from 'semantic-ui-react';\nimport {Server, serverAddress} from '../api_client/apiClient'\nimport LazyLoad from 'react-lazyload';\n// import Lightbox from 'react-image-lightbox';\nimport {LightBox} from '../components/lightBox'\n\nimport {LocationMap} from '../components/maps'\nimport { push } from 'react-router-redux'\nimport {searchPhotos} from '../actions/searchActions'\nimport * as moment from 'moment';\nimport debounce from 'lodash/debounce'\n\nimport {calculateGridCells, calculateGridCellSize} from '../util/gridUtils'\nimport {ScrollSpeed, SPEED_THRESHOLD, SCROLL_DEBOUNCE_DURATION} from '../util/scrollUtils'\n\nvar topMenuHeight = 55 // don't change this\nvar leftMenuWidth = 85 // don't change this\nvar SIDEBAR_WIDTH = 85\nvar timelineScrollWidth = 0\nvar DAY_HEADER_HEIGHT = 70\n\nif (window.innerWidth < 600) {\n    var LIGHTBOX_SIDEBAR_WIDTH = window.innerWidth\n} else {\n    var LIGHTBOX_SIDEBAR_WIDTH = 360\n}\n\n\nexport class SearchMultipleCategories extends Component {\n\n    constructor(props){\n        super(props)\n        this.cellRenderer = this.cellRenderer.bind(this)\n        this.handleResize = this.handleResize.bind(this)\n        this.onPhotoClick = this.onPhotoClick.bind(this)\n        this.getPhotoDetails = this.getPhotoDetails.bind(this)\n        this.listRef = React.createRef()\n        this.state = {\n            cellContents: [[]],\n            hash2row: {},\n            idx2hash: [],\n            lightboxImageIndex: 1,\n            lightboxShow:false,\n            lightboxSidebarShow:false,\n            scrollToIndex: undefined,\n            width:  window.innerWidth,\n            height: window.innerHeight,\n            entrySquareSize:200,\n            numEntrySquaresPerRow:3,\n            currTopRenderedRowIdx:0,\n            scrollTop:0,\n        }\n    }\n\n    scrollSpeedHandler = new ScrollSpeed()\n\n    handleScroll = ({scrollTop}) => {\n        // scrollSpeed represents the number of pixels scrolled since the last scroll event was fired\n        const scrollSpeed = Math.abs(this.scrollSpeedHandler.getScrollSpeed(scrollTop));\n\n        if (scrollSpeed >= SPEED_THRESHOLD) {\n          this.setState({\n            isScrollingFast: true,\n            scrollTop:scrollTop\n          });\n        }\n\n        // Since this method is debounced, it will only fire once scrolling has stopped for the duration of SCROLL_DEBOUNCE_DURATION\n        this.handleScrollEnd();\n    }\n\n    handleScrollEnd = debounce(() => {\n    const {isScrollingFast} = this.state;\n\n    if (isScrollingFast) {\n      this.setState({\n        isScrollingFast: false,\n      });\n    }\n    }, SCROLL_DEBOUNCE_DURATION);\n\n\n\n    componentDidMount() {\n        //if (this.props.albumsDatePhotoHashList.length < 1) {\n        //    this.props.dispatch(fetchDateAlbumsPhotoHashList())\n        //}\n        this.handleResize();\n        window.addEventListener(\"resize\", this.handleResize.bind(this));\n    }\n    componentWillUnmount() {\n        window.removeEventListener(\"resize\", this.handleResize.bind(this))\n        this.scrollSpeedHandler.clearTimeout()\n    }\n\n    handleResize() {\n        var columnWidth = window.innerWidth - SIDEBAR_WIDTH - 5 - 5 - 10\n        const {entrySquareSize,numEntrySquaresPerRow} = calculateGridCellSize(columnWidth)\n        var {cellContents,hash2row} = calculateGridCells(this.props.searchPhotosResGroupedByDate,numEntrySquaresPerRow)\n\n        this.setState({\n            width:  window.innerWidth,\n            height: window.innerHeight,\n            entrySquareSize:entrySquareSize,\n            numEntrySquaresPerRow:numEntrySquaresPerRow,\n            cellContents: cellContents,\n            hash2row:hash2row\n        })\n        if (this.listRef.current) {\n            this.listRef.current.recomputeGridSize()\n        }\n    }\n\n    cellRenderer = ({ columnIndex, key, rowIndex, style }) => {\n        if (this.state.cellContents[rowIndex][columnIndex]) { // non-empty cell\n            const cell = this.state.cellContents[rowIndex][columnIndex]\n            if (cell.date) { // header cell has 'date' attribute\n                return ( \n                    <div key={key} style={{...style,width:this.state.width,height:DAY_HEADER_HEIGHT,paddingTop:20}}>\n                        <div style={{backgroundColor:'white'}}>\n                            <Header as='h3'>\n                                <Icon name='calendar outline'/>\n                                <Header.Content>\n                                    { cell.date=='No Timestamp' ? \"No Timestamp\" : moment(cell.date).format(\"MMM Do YYYY, dddd\")}\n                                    <Header.Subheader>\n                                        <Icon name='photo'/>{cell.photos.length} Photos\n                                    </Header.Subheader>\n                                </Header.Content>\n                            </Header>\n                        </div>\n                    </div>                \n                )   \n                /*\n                if (!this.state.isScrollingFast){\n                } else {\n                    return (\n                        <div key={key} style={{\n                            ...style,\n                            backgroundColor:'#dddddd',\n                            width:250,\n                            marginTop:2,\n                            height:DAY_HEADER_HEIGHT-4,\n                            paddingTop:10}}>\n                        </div>                \n                    )        \n                } \n                */\n            } else { // photo cell doesn't have 'date' attribute\n                if (!this.state.isScrollingFast) {\n                    return (\n                        <div key={key} style={style}>\n                            <Image key={'daygroup_image_'+cell.image_hash} style={{display:'inline-block',padding:1,margin:0}}\n                                onClick={()=>{\n                                    this.onPhotoClick(cell.image_hash)\n                                }}\n                                height={this.state.entrySquareSize} \n                                width={this.state.entrySquareSize} \n                                src={serverAddress+'/media/square_thumbnails/'+cell.image_hash+'.jpg'}/>\n                        </div>                                \n                    )\n                } else {\n                    return (\n                        <div key={key} style={{...style,\n                            width:this.state.entrySquareSize-2,\n                            height:this.state.entrySquareSize-2,\n                            backgroundColor:'#eeeeee'}}>\n                        </div>                                \n                    )\n                }\n\n            }\n\n        } else { // empty cell\n            return (\n                <div key={key} style={style}>\n                </div>\n            )\n        }\n    }\n\n\n    onPhotoClick(hash) {\n        this.setState({lightboxImageIndex:this.props.idx2hash.indexOf(hash),lightboxShow:true})\n    }\n\n    getPhotoDetails(image_hash) {\n        if (!this.props.photoDetails.hasOwnProperty(image_hash)) {\n            this.props.dispatch(fetchPhotoDetail(image_hash))\n        }\n    }\n\n    static getDerivedStateFromProps(nextProps,prevState){\n        const {cellContents,hash2row} = calculateGridCells(nextProps.searchPhotosResGroupedByDate,prevState.numEntrySquaresPerRow)\n        return {...prevState,cellContents,hash2row}\n    }\n\n\n    render() {\n\n        const {lightboxImageIndex} = this.state\n        if ( !this.props.query || this.props.query.length < 0) {\n            return (<div>You must search for something</div>)}\n        if ( !this.props.searchingPhotos && !this.props.searchedPhotos) {\n            return (<div>Search failed!</div>)\n        }\n        if ( this.props.searchingPhotos && !this.props.searchedPhotos) {\n            return (<div><Loader active/></div>)\n        }\n        if (this.props.searchPhotosResGroupedByDate.length < 1){\n            return (<div>No results!</div>)\n        }\n\n        // var totalListHeight = this.state.entrySquareSize * this.state.cellContents.length\n        var totalListHeight = this.state.cellContents.map((row,index)=>{\n            if (row[0].date) { //header row\n                return DAY_HEADER_HEIGHT\n            } else { //photo row\n                return this.state.entrySquareSize\n            }\n        }).reduce((a,b)=>(a+b),0)\n        console.log(this.state.cellContents)\n\n        return (\n            <div>\n                <div style={{height:60,paddingTop:10}}>\n\n                  <Header as='h2'>\n                    <Icon name='search' />\n                    <Header.Content>\n                      Search results for \"{this.props.query}\"\n                      <Header.Subheader>\n                        {this.props.searchPhotosResGroupedByDate.length} Days, {this.props.searchPhotosRes.length} Photos\n                      </Header.Subheader>\n                    </Header.Content>\n                  </Header>\n\n                </div>\n\n\n\n                <AutoSizer disableHeight style={{outline:'none',padding:0,margin:0}}>\n                  {({width}) => (\n                    <Grid\n                      ref={this.listRef}\n                      onSectionRendered={({rowStartIndex})=>{\n                        var date = this.state.cellContents[rowStartIndex][0].date\n                        if (date) {\n                            if (date=='No Timestamp') {\n                                this.setState({\n                                    currTopRenderedRowIdx:rowStartIndex,\n                                    date:date,\n                                    fromNow:date\n                                })\n                            } else {\n                                this.setState({\n                                    currTopRenderedRowIdx:rowStartIndex,\n                                    date:moment(date).format(\"MMMM Do YYYY\"),\n                                    fromNow:moment(date).fromNow()\n                                })\n                            }\n                        }\n                      }}\n                      overscanRowCount={5}\n                      style={{outline:'none'}}\n                      cellRenderer={this.cellRenderer}\n                      onScroll={this.handleScroll}\n                      columnWidth={this.state.entrySquareSize}\n                      columnCount={this.state.numEntrySquaresPerRow}\n                      height={this.state.height- topMenuHeight - 60}\n                      estimatedRowSize={totalListHeight/this.state.cellContents.length.toFixed(1)}\n                      rowHeight={({index})=> {\n                        if (this.state.cellContents[index][0].date) { //header row\n                            return DAY_HEADER_HEIGHT\n                        } else { //photo row\n                            return this.state.entrySquareSize\n                        }\n                      }}\n                      rowCount={this.state.cellContents.length}\n                      width={width}\n                    />\n                  )}\n                </AutoSizer>\n\n            { this.state.cellContents[this.state.currTopRenderedRowIdx][0] && (\n                <div style={{\n                    right:0,\n                    top:topMenuHeight + 10+ (0 / totalListHeight) * (this.state.height - topMenuHeight - 50 - 20),\n                    position:'fixed',\n                    float:'left',\n                    width:180,\n                    padding:0,\n                    height:50,\n                    zIndex:100,\n                }}>\n                    <div style={{textAlign:'right',paddingRight:30}} className='handle'>\n                        <b>{this.state.date}</b> <br/>\n                    </div>\n                    <div style={{textAlign:'right',paddingRight:30}}>\n                        {this.state.fromNow}\n                    </div>\n                </div>\n            )}\n\n                <div style={{\n                    backgroundColor:'white',\n                    position:'fixed',\n                    right:0,\n                    top:topMenuHeight,\n                    height:this.state.height-topMenuHeight,\n                    width:timelineScrollWidth}}>\n                        \n                </div>\n\n                { this.state.lightboxShow &&\n                    <LightBox\n                        idx2hash={this.props.idx2hash}\n                        lightboxImageIndex={this.state.lightboxImageIndex}\n\n                        onCloseRequest={() => this.setState({ lightboxShow: false })}\n                        onImageLoad={()=>{\n                            this.getPhotoDetails(this.props.idx2hash[this.state.lightboxImageIndex])\n                        }}\n                        onMovePrevRequest={() => {\n                            var nextIndex = (this.state.lightboxImageIndex + this.props.idx2hash.length - 1) % this.props.idx2hash.length\n                            this.setState({\n                                lightboxImageIndex:nextIndex\n                            })\n                            var rowIdx = this.state.hash2row[this.props.idx2hash[nextIndex]]\n                            this.listRef.current.scrollToCell({columnIndex:0,rowIndex:rowIdx})\n                            this.getPhotoDetails(this.props.idx2hash[nextIndex])\n                        }}\n                        onMoveNextRequest={() => {\n                            var nextIndex = (this.state.lightboxImageIndex + this.props.idx2hash.length + 1) % this.props.idx2hash.length\n                            this.setState({\n                                lightboxImageIndex:nextIndex\n                            })\n                            var rowIdx = this.state.hash2row[this.props.idx2hash[nextIndex]]\n                            this.listRef.current.scrollToCell({columnIndex:0,rowIndex:rowIdx})\n                            this.getPhotoDetails(this.props.idx2hash[nextIndex])\n                        }}/>\n                }\n\n            </div>\n            \n        )\n    }\n}\n\n\n\n\nSearchMultipleCategories = connect((store)=>{\n  return {\n    searchingPhotos: store.search.searchingPhotos,\n    searchedPhotos: store.search.searchedPhotos,\n    searchPhotosRes: store.search.searchPhotosRes,\n    searchPhotosResGroupedByDate: store.search.searchPhotosResGroupedByDate,\n\n    searchingPeople: store.search.searchingPeople,\n    searchedPeople: store.search.searchedPeople,\n    searchPeopleRes: store.search.searchPeopleRes,\n\n    searchingThingAlbums: store.search.searchingThingAlbums,\n    searchedThingAlbums: store.search.searchedThingAlbums,\n    searchThingAlbumsRes: store.search.searchThingAlbumsRes,\n   \n    searchingPlaceAlbums: store.search.searchingPlaceAlbums,\n    searchedPlaceAlbums: store.search.searchedPlaceAlbums,\n    searchPlaceAlbumsRes: store.search.searchPlaceAlbumsRes,\n\n    query: store.search.query,\n\n    photoDetails: store.photos.photoDetails,\n    fetchingPhotoDetail: store.photos.fetchingPhotoDetail,\n    fetchedPhotoDetail: store.photos.fetchedPhotoDetail,\n    idx2hash: store.search.idx2hash,\n    albumsDatePhotoHashList: store.albums.albumsDatePhotoHashList,\n    fetchingAlbumsDatePhotoHashList: store.albums.fetchingAlbumsDatePhotoHashList,\n    fetchedAlbumsDatePhotoHashList: store.albums.fetchedAlbumsDatePhotoHashList,    \n  }\n})(SearchMultipleCategories)\n"
  },
  {
    "path": "src/layouts/searchRV.js",
    "content": "import React, {Component} from 'react';\nimport ReactDOM from 'react-dom';\nimport { Grid, List, WindowScroller,AutoSizer } from 'react-virtualized';\nimport 'react-virtualized/styles.css'; // only needs to be imported once\nimport { connect } from \"react-redux\";\nimport {  fetchDateAlbumsPhotoHashList,fetchAlbumsDateGalleries} from '../actions/albumsActions'\nimport {  fetchPhotoDetail} from '../actions/photosActions'\nimport { Card, Image, Header, Divider, Item, Loader, Dimmer, Modal, Sticky, Portal, Input,\n         Container, Label, Popup, Segment, Button, Icon, Table, Transition} from 'semantic-ui-react';\nimport {Server, serverAddress} from '../api_client/apiClient'\nimport LazyLoad from 'react-lazyload';\n// import Lightbox from 'react-image-lightbox';\nimport {LightBox} from '../components/lightBox'\n\nimport {LocationMap} from '../components/maps'\nimport { push } from 'react-router-redux'\nimport {searchPhotos} from '../actions/searchActions'\nimport * as moment from 'moment';\nimport debounce from 'lodash/debounce'\n\nimport {PhotoListView} from './ReusablePhotoListView'\n\nvar TOP_MENU_HEIGHT = 55 // don't change this\nvar LEFT_MENU_WIDTH = 85 // don't change this\nvar SIDEBAR_WIDTH = 85\nvar TIMELINE_SCROLL_WIDTH = 0\nvar DAY_HEADER_HEIGHT = 70\n\nif (window.innerWidth < 600) {\n    var LIGHTBOX_SIDEBAR_WIDTH = window.innerWidth\n} else {\n    var LIGHTBOX_SIDEBAR_WIDTH = 360\n}\n\n\nclass ScrollSpeed {\n  clear = () => {\n    this.lastPosition = null;\n    this.delta = 0;\n  };\n  getScrollSpeed(scrollOffset) {\n    if (this.lastPosition != null) {\n      this.delta = scrollOffset - this.lastPosition;\n    }\n    this.lastPosition = scrollOffset;\n\n    window.clearTimeout(this._timeout);\n    this._timeout = window.setTimeout(this.clear, 50);\n\n    return this.delta;\n  }\n}\n\n\nconst SPEED_THRESHOLD = 1000; // Tweak this to whatever feels right for your app\nconst SCROLL_DEBOUNCE_DURATION = 100; // In milliseconds\n\n\n\n\n\nexport class SearchView extends Component {\n    render() {\n        const {searchingPhotos,searchedPhotos,searchQuery} = this.props\n        return (\n            <PhotoListView \n                title={searchingPhotos ? `Searching \"${searchQuery}\"...` : searchQuery===null ? \"Search for things, places, people, and time.\" : `\"${searchQuery}\"`}\n                loading={searchingPhotos}\n                titleIconName={'search'}\n                subtitle={\"hehehe\"}\n                photosGroupedByDate={this.props.searchPhotosResGroupedByDate}\n                idx2hash={this.props.idx2hash}\n            />\n        )\n    }\n}\n\n\n\n\n\n\n\n\n\nclass DayGroupPlaceholder extends Component {\n    render () {\n        var numRows = Math.ceil(this.props.day.photos.length/this.props.numItemsPerRow.toFixed(1))\n        var gridHeight = this.props.itemSize * numRows\n        var photos = this.props.day.photos.map(function(photo) {\n            return (\n                <Image key={'daygroup_image_placeholder_'+photo.image_hash} style={{display:'inline-block',padding:1,margin:0}}\n                    height={this.props.itemSize} \n                    width={this.props.itemSize} \n                    src={'/thumbnail_placeholder.png'}/>\n            )\n        },this)\n        return (\n            <div key={'daygroup_placeholder_'+this.props.day}>\n                <div style={{fontSize:17,height:DAY_HEADER_HEIGHT,paddingTop:20,paddingBottom:5}}>\n                <Header as='h3'>\n                <Icon name='calendar outline'/>\n                <Header.Content>\n                {moment(this.props.day.date).format(\"MMM Do YYYY, dddd\")}\n                <Header.Subheader>\n                    <Icon name='photo'/>{this.props.day.photos.length} Photos\n                </Header.Subheader>\n                </Header.Content>\n                </Header>\n                </div>\n                <div style={{height:gridHeight}}>\n                {photos}\n                </div>\n            </div>\n        )\n    }\n}\n\n\nclass DayGroup extends Component {\n    render () {\n        var photos = this.props.day.photos.map(function(photo) {\n            return (\n                <Image key={'daygroup_image_'+photo.image_hash} style={{display:'inline-block',padding:1,margin:0}}\n                    onClick={()=>{\n                        this.props.onPhotoClick(photo.image_hash)\n                    }}\n                    height={this.props.itemSize} \n                    width={this.props.itemSize} \n                    src={serverAddress+'/media/square_thumbnails/'+photo.image_hash+'.jpg'}/>\n            )\n        },this)\n        var gridHeight = this.props.itemSize * Math.ceil(this.props.day.photos.length/this.props.numItemsPerRow.toFixed(1))\n        return (\n            <div key={'daygroup_grid_'+this.props.day} style={{}}>\n                <div style={{fontSize:17,height:DAY_HEADER_HEIGHT,paddingTop:20,paddingBottom:5}}>\n                <Header as='h3'>\n                <Icon name='calendar outline'/>\n                <Header.Content>\n                {moment(this.props.day.date).format(\"MMM Do YYYY, dddd\")}\n                <Header.Subheader>\n                    <Icon name='photo'/>{this.props.day.photos.length} Photos\n                </Header.Subheader>\n                </Header.Content>\n                </Header>\n                </div>\n                <div style={{height:gridHeight}}>\n                {photos}\n                </div>\n            </div>\n        )\n    }\n}\n\nexport class SearchViewRV extends Component {\n\n    constructor(props){\n        super(props)\n        this.cellRenderer = this.cellRenderer.bind(this)\n        this.getRowHeight = this.getRowHeight.bind(this)\n        this.calculateEntrySquareSize = this.calculateEntrySquareSize.bind(this)\n        this.onPhotoClick = this.onPhotoClick.bind(this)\n        this.getPhotoDetails = this.getPhotoDetails.bind(this)\n        this.state = {\n            idx2hash: [],\n            lightboxImageIndex: 1,\n            lightboxShow:false,\n            lightboxSidebarShow:false,\n            scrollToIndex: undefined,\n            width:  window.innerWidth,\n            height: window.innerHeight,\n            entrySquareSize:200,\n            currTopRenderedRowIdx:0,\n            scrollTop:0\n        }\n    }\n\n    getScrollSpeed = new ScrollSpeed().getScrollSpeed;\n\n    handleScroll = ({scrollTop}) => {\n        // scrollSpeed represents the number of pixels scrolled since the last scroll event was fired\n        const scrollSpeed = Math.abs(this.getScrollSpeed(scrollTop));\n\n        if (scrollSpeed >= SPEED_THRESHOLD) {\n          this.setState({\n            isScrollingFast: true,\n            scrollTop:scrollTop\n          });\n        }\n\n        // Since this method is debounced, it will only fire once scrolling has stopped for the duration of SCROLL_DEBOUNCE_DURATION\n        this.handleScrollEnd();\n    }\n\n    handleScrollEnd = debounce(() => {\n    const {isScrollingFast} = this.state;\n\n    if (isScrollingFast) {\n      this.setState({\n        isScrollingFast: false,\n      });\n    }\n    }, SCROLL_DEBOUNCE_DURATION);\n\n\n\n    componentWillMount() {\n        //if (this.props.albumsDatePhotoHashList.length < 1) {\n        //    this.props.dispatch(fetchDateAlbumsPhotoHashList())\n        //}\n        this.calculateEntrySquareSize();\n        window.addEventListener(\"resize\", this.calculateEntrySquareSize.bind(this));\n    }\n\n    calculateEntrySquareSize() {\n        if (window.innerWidth < 600) {\n            var numEntrySquaresPerRow = 3\n        } \n        else if (window.innerWidth < 800) {\n            var numEntrySquaresPerRow = 4\n        }\n        else if (window.innerWidth < 1000) {\n            var numEntrySquaresPerRow = 6\n        }\n        else if (window.innerWidth < 1200) {\n            var numEntrySquaresPerRow = 6\n        }\n        else {\n            var numEntrySquaresPerRow = 6 \n        }\n\n        var columnWidth = window.innerWidth - SIDEBAR_WIDTH - 5 - 5 - 10\n\n\n        var entrySquareSize = columnWidth / numEntrySquaresPerRow\n        var numEntrySquaresPerRow = numEntrySquaresPerRow\n        this.setState({\n            width:  window.innerWidth,\n            height: window.innerHeight,\n            entrySquareSize:entrySquareSize,\n            numEntrySquaresPerRow:numEntrySquaresPerRow\n        })\n    }\n\n    cellRenderer = ({ columnIndex, key, rowIndex, style }) => {\n        return (\n            <div key={key} style={style}>\n                <div style={{backgroundColor:'white'}}>\n                hello from row {rowIndex}\n                </div>\n            </div>\n        )\n    }\n\n    rowRenderer = ({index, isScrolling, key, style}) => {\n        const {isScrollingFast} = this.state;\n        var rowHeight = this.state.entrySquareSize * Math.ceil(this.props.searchPhotosResGroupedByDate[index].photos.length/this.state.numEntrySquaresPerRow.toFixed(1)) + DAY_HEADER_HEIGHT\n        if (isScrollingFast) {\n            return (\n                <div key={key} style={{...style,height:rowHeight}}>\n                    <div style={{backgroundColor:'white'}}>\n                    <DayGroupPlaceholder\n                        key={index}\n                        onPhotoClick={this.onPhotoClick}\n                        day={this.props.searchPhotosResGroupedByDate[index]} \n                        itemSize={this.state.entrySquareSize} \n                        numItemsPerRow={this.state.numEntrySquaresPerRow}/>\n                    </div>\n                </div>\n            )\n        }\n        else {\n            return (\n                <div key={key} style={{...style,height:rowHeight}}>\n                    <div style={{backgroundColor:'white'}}>\n                    <DayGroup \n                        key={index}\n                        onPhotoClick={this.onPhotoClick}\n                        day={this.props.searchPhotosResGroupedByDate[index]} \n                        itemSize={this.state.entrySquareSize} \n                        numItemsPerRow={this.state.numEntrySquaresPerRow}/>\n                    </div>\n                </div>\n            )        }\n    }\n\n    getRowHeight = ({index}) => {\n        var rowHeight = this.state.entrySquareSize * Math.ceil(this.props.searchPhotosResGroupedByDate[index].photos.length/this.state.numEntrySquaresPerRow.toFixed(1)) + DAY_HEADER_HEIGHT\n        return (\n            rowHeight\n        )\n    }\n\n\n    onPhotoClick(hash) {\n        this.setState({lightboxImageIndex:this.props.idx2hash.indexOf(hash),lightboxShow:true})\n\n    }\n\n    _setRef = windowScroller => {\n        this._windowScroller = windowScroller;\n    };\n    \n    getPhotoDetails(image_hash) {\n        if (!this.props.photoDetails.hasOwnProperty(image_hash)) {\n            this.props.dispatch(fetchPhotoDetail(image_hash))\n        }\n    }\n\n    render() {\n        const {lightboxImageIndex} = this.state\n        if ( !this.props.query || this.props.query.length < 0) {\n            return (<div>You must search for something</div>)}\n        if ( this.props.searchPhotosResGroupedByDate.length < 1 || this.props.searchingPhotos) {\n            return (<div><Loader active/></div>)\n        }\n        var totalListHeight = this.props.searchPhotosResGroupedByDate.map((day,index)=>{\n            return (\n                this.getRowHeight({index})\n            )\n        }).reduce((a,b)=>(a+b),0)\n        return (\n            <div>\n                <div style={{height:60,paddingTop:10}}>\n\n                  <Header as='h2'>\n                    <Icon name='search' />\n                    <Header.Content>\n                      Search results for \"{this.props.query}\"\n                      <Header.Subheader>\n                        {this.props.searchPhotosResGroupedByDate.length} Days, {this.props.searchPhotosRes.length} Photos\n                      </Header.Subheader>\n                    </Header.Content>\n                  </Header>\n\n                </div>\n\n                    <List\n                        style={{outline:'none',paddingRight:0,marginRight:0}}\n                        onRowsRendered={({ overscanStartIndex, overscanStopIndex, startIndex, stopIndex })=>{\n                            this.setState({currTopRenderedRowIdx:startIndex})\n                        }}\n                        height={this.state.height-TOP_MENU_HEIGHT-60}\n                        overscanRowCount={5}\n                        rowCount={this.props.searchPhotosResGroupedByDate.length}\n                        rowHeight={this.getRowHeight}\n                        rowRenderer={this.rowRenderer}\n                        onScroll={this.handleScroll}\n                        estimatedRowSize={totalListHeight/this.props.searchPhotosResGroupedByDate.length.toFixed(10)}\n                        width={this.state.width-LEFT_MENU_WIDTH-5}/>\n\n            { (\n                <div style={{\n                    right:0,\n                    top:TOP_MENU_HEIGHT + 10+ (0 / totalListHeight) * (this.state.height - TOP_MENU_HEIGHT - 50 - 20),\n                    position:'fixed',\n                    float:'left',\n                    width:180,\n                    padding:0,\n                    height:50,\n                    zIndex:100,\n                }}>\n                    <div style={{textAlign:'right',paddingRight:30}} className='handle'>\n                        <b>{moment(this.props.searchPhotosResGroupedByDate[this.state.currTopRenderedRowIdx].date).format(\"MMMM YYYY\") }</b> <br/>\n                    </div>\n                    <div style={{textAlign:'right',paddingRight:30}}>\n                        {moment(this.props.searchPhotosResGroupedByDate[this.state.currTopRenderedRowIdx].date).fromNow()}\n                    </div>\n                </div>\n            )}\n\n                <div style={{\n                    backgroundColor:'white',\n                    position:'fixed',\n                    right:0,\n                    top:TOP_MENU_HEIGHT,\n                    height:this.state.height-TOP_MENU_HEIGHT,\n                    width:TIMELINE_SCROLL_WIDTH}}>\n                        \n                </div>\n\n                { this.state.lightboxShow &&\n                    <LightBox\n                        idx2hash={this.props.idx2hash}\n                        lightboxImageIndex={this.state.lightboxImageIndex}\n\n                        onCloseRequest={() => this.setState({ lightboxShow: false })}\n                        onImageLoad={()=>{\n                            this.getPhotoDetails(this.props.idx2hash[this.state.lightboxImageIndex])\n                        }}\n                        onMovePrevRequest={() => {\n                            var nextIndex = (this.state.lightboxImageIndex + this.props.idx2hash.length - 1) % this.props.idx2hash.length\n                            this.setState({\n                                lightboxImageIndex:nextIndex\n                            })\n                            this.getPhotoDetails(this.props.idx2hash[nextIndex])\n                        }}\n                        onMoveNextRequest={() => {\n                            var nextIndex = (this.state.lightboxImageIndex + this.props.idx2hash.length + 1) % this.props.idx2hash.length\n                            this.setState({\n                                lightboxImageIndex:nextIndex\n                            })\n                            this.getPhotoDetails(this.props.idx2hash[nextIndex])\n                        }}/>\n                }\n\n\n\n            </div>\n            \n        )\n    }\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/*\n\nexport class SearchViewRV extends Component {\n\n    constructor(props){\n        super(props)\n        this.cellRenderer = this.cellRenderer.bind(this)\n        this.getRowHeight = this.getRowHeight.bind(this)\n        this.calculateEntrySquareSize = this.calculateEntrySquareSize.bind(this)\n        this.onPhotoClick = this.onPhotoClick.bind(this)\n        this.getPhotoDetails = this.getPhotoDetails.bind(this)\n        this.state = {\n            idx2hash: [],\n            lightboxImageIndex: 1,\n            lightboxShow:false,\n            lightboxSidebarShow:false,\n            scrollToIndex: undefined,\n            width:  window.innerWidth,\n            height: window.innerHeight,\n            entrySquareSize:200,\n            currTopRenderedRowIdx:0,\n            isScrollingFast: false\n        }\n    }\n\n    getScrollSpeed = new ScrollSpeed().getScrollSpeed;\n\n    handleScroll = ({scrollTop}) => {\n        // scrollSpeed represents the number of pixels scrolled since the last scroll event was fired\n        const scrollSpeed = Math.abs(this.getScrollSpeed(scrollTop));\n\n        if (scrollSpeed >= SPEED_THRESHOLD) {\n          this.setState({\n            isScrollingFast: true,\n            scrollTop:scrollTop\n          });\n        }\n\n        // Since this method is debounced, it will only fire once scrolling has stopped for the duration of SCROLL_DEBOUNCE_DURATION\n        this.handleScrollEnd();\n    }\n\n    handleScrollEnd = debounce(() => {\n    const {isScrollingFast} = this.state;\n\n    if (isScrollingFast) {\n      this.setState({\n        isScrollingFast: false,\n      });\n    }\n    }, SCROLL_DEBOUNCE_DURATION);\n\n\n\n    componentWillMount() {\n        if (this.props.albumsDatePhotoHashList.length < 1) {\n            this.props.dispatch(fetchDateAlbumsPhotoHashList())\n        }\n        this.calculateEntrySquareSize();\n        window.addEventListener(\"resize\", this.calculateEntrySquareSize.bind(this));\n    }\n\n    calculateEntrySquareSize() {\n        if (window.innerWidth < 600) {\n            var numEntrySquaresPerRow = 3\n        } \n        else if (window.innerWidth < 800) {\n            var numEntrySquaresPerRow = 4\n        }\n        else if (window.innerWidth < 1000) {\n            var numEntrySquaresPerRow = 5\n        }\n        else if (window.innerWidth < 1200) {\n            var numEntrySquaresPerRow = 6\n        }\n        else {\n            var numEntrySquaresPerRow = 8\n        }\n\n        var columnWidth = window.innerWidth - SIDEBAR_WIDTH - 15\n\n\n        var entrySquareSize = columnWidth / numEntrySquaresPerRow\n        var numEntrySquaresPerRow = numEntrySquaresPerRow\n        this.setState({\n            width:  window.innerWidth,\n            height: window.innerHeight,\n            entrySquareSize:entrySquareSize,\n            numEntrySquaresPerRow:numEntrySquaresPerRow\n        })\n        console.log('column width:',columnWidth)\n        console.log('item size:',entrySquareSize)\n        console.log('num items per row',numEntrySquaresPerRow)\n    }\n\n    cellRenderer = ({ columnIndex, key, rowIndex, style }) => {\n        const {isScrollingFast} = this.state;\n        var photoResIdx = rowIndex * this.state.numEntrySquaresPerRow + columnIndex\n\n        if (isScrollingFast) {\n            return (\n                <div key={key} style={style}>\n                    <div style={{backgroundColor:'white',paddingRight:5}}>\n                    <Image \n                        onClick={()=>this.onPhotoClick(photoResIdx)}\n                        src={'/thumbnail_placeholder.png'}/>\n                    </div>\n                </div>            )\n        }\n\n\n        if (photoResIdx < this.props.searchPhotosRes.length) {\n            return (\n                <div key={key} style={style}>\n                    <div style={{backgroundColor:'white',paddingRight:5}}>\n                    <Image \n                        onClick={()=>this.onPhotoClick(photoResIdx)}\n                        src={serverAddress+'/media/square_thumbnails/'+this.props.searchPhotosRes[photoResIdx].image_hash+'.jpg'}/>\n                    </div>\n                </div>\n            )\n        } else {\n            return (<div></div>)\n        }\n    }\n\n\n    getRowHeight = ({index}) => {\n        var rowHeight = this.state.entrySquareSize \n        return (\n            rowHeight\n        )\n    }\n\n\n    onPhotoClick(idx) {\n        console.log('clicked',idx)\n\n        if (this.state.idx2hash.length != this.props.searchPhotosRes.length) {\n            this.setState({idx2hash:this.props.searchPhotosRes.map((el)=>el.image_hash)})\n        }\n\n        this.setState({lightboxImageIndex:idx,lightboxShow:true})\n\n    }\n\n    _setRef = windowScroller => {\n        this._windowScroller = windowScroller;\n    };\n    \n    getPhotoDetails(image_hash) {\n        if (!this.props.photoDetails.hasOwnProperty(image_hash)) {\n            this.props.dispatch(fetchPhotoDetail(image_hash))\n        }\n    }\n\n    render() {\n\n        if ( this.props.searchingPhotos ) {\n            if ( this.props.query ) {\n                return (\n                    <Container>\n                        <Loader active>\n                        Searching <b>{this.props.query}</b>...\n                        </Loader>\n                    </Container>\n                )\n            }\n        }\n\n\n\n        return (\n            <div style={{paddingRight:TIMELINE_SCROLL_WIDTH}}>\n\n                <div style={{height:60,paddingTop:10,paddingRight:5}}>\n\n                  <Header as='h2'>\n                    <Icon name='search' />\n                    <Header.Content>\n                      Search\n                      <Header.Subheader>\n                        { \n                            this.props.query ? \n                            (`Showing ${this.props.searchPhotosRes.length} results for \"${this.props.query}\"`) :\n                            (\"Search for people, places, things, and time.\")\n                        }\n                      </Header.Subheader>\n                    </Header.Content>\n                  </Header>\n                  \n                </div>\n\n                <AutoSizer disableHeight style={{outline:'none',padding:0,margin:0}}>\n                  {({width}) => (\n                    <Grid\n                      style={{outline:'none'}}\n                      cellRenderer={this.cellRenderer}\n                      onScroll={this.handleScroll}\n                      columnWidth={this.state.entrySquareSize}\n                      columnCount={this.state.numEntrySquaresPerRow}\n                      height={this.state.height- TOP_MENU_HEIGHT - 60}\n                      rowHeight={this.state.entrySquareSize}\n                      rowCount={Math.ceil(this.props.searchPhotosRes.length/this.state.numEntrySquaresPerRow.toFixed(1))}\n                      width={width}\n                    />\n                  )}\n                </AutoSizer>\n\n\n\n                { this.state.lightboxShow && this.props.searchPhotosRes.length > 0 &&\n                    <LightBox\n                        idx2hash={this.state.idx2hash}\n                        lightboxImageIndex={this.state.lightboxImageIndex}\n\n                        onCloseRequest={() => this.setState({ lightboxShow: false })}\n                        onImageLoad={()=>{\n                            this.getPhotoDetails(this.state.idx2hash[this.state.lightboxImageIndex])\n                        }}\n                        onMovePrevRequest={() => {\n                            var nextIndex = (this.state.lightboxImageIndex + this.state.idx2hash.length - 1) % this.state.idx2hash.length\n                            this.setState({\n                                lightboxImageIndex:nextIndex\n                            })\n                            this.getPhotoDetails(this.state.idx2hash[nextIndex])\n                        }}\n                        onMoveNextRequest={() => {\n                            var nextIndex = (this.state.lightboxImageIndex + this.state.idx2hash.length + 1) % this.state.idx2hash.length\n                            this.setState({\n                                lightboxImageIndex:nextIndex\n                            })\n                            this.getPhotoDetails(this.state.idx2hash[nextIndex])\n                        }}/>\n                }\n\n            </div>\n            \n        )\n    }\n}\n*/\n\nSearchView = connect((store)=>{\n  return {\n    searchingPhotos: store.search.searchingPhotos,\n    searchedPhotos: store.search.searchedPhotos,\n    searchPhotosRes: store.search.searchPhotosRes,\n    searchPhotosResGroupedByDate: store.search.searchPhotosResGroupedByDate,\n    searchQuery: store.search.query,\n\n    photoDetails: store.photos.photoDetails,\n    fetchingPhotoDetail: store.photos.fetchingPhotoDetail,\n    fetchedPhotoDetail: store.photos.fetchedPhotoDetail,\n    idx2hash: store.search.idx2hash,\n    albumsDatePhotoHashList: store.albums.albumsDatePhotoHashList,\n    fetchingAlbumsDatePhotoHashList: store.albums.fetchingAlbumsDatePhotoHashList,\n    fetchedAlbumsDatePhotoHashList: store.albums.fetchedAlbumsDatePhotoHashList,    \n  }\n})(SearchView)\n\n\nSearchViewRV = connect((store)=>{\n  return {\n    searchingPhotos: store.search.searchingPhotos,\n    searchedPhotos: store.search.searchedPhotos,\n    searchPhotosRes: store.search.searchPhotosRes,\n    searchPhotosResGroupedByDate: store.search.searchPhotosResGroupedByDate,\n    query: store.search.query,\n\n    photoDetails: store.photos.photoDetails,\n    fetchingPhotoDetail: store.photos.fetchingPhotoDetail,\n    fetchedPhotoDetail: store.photos.fetchedPhotoDetail,\n    idx2hash: store.search.idx2hash,\n    albumsDatePhotoHashList: store.albums.albumsDatePhotoHashList,\n    fetchingAlbumsDatePhotoHashList: store.albums.fetchingAlbumsDatePhotoHashList,\n    fetchedAlbumsDatePhotoHashList: store.albums.fetchedAlbumsDatePhotoHashList,    \n  }\n})(SearchViewRV)\n"
  },
  {
    "path": "src/layouts/settings.js",
    "content": "import React, {Component} from 'react';\nimport {\n  Form,\n  Radio,\n  Label,\n  Step,\n  Progress,\n  List,\n  Grid,\n  Image,\n  Icon,\n  Item,\n  Header,\n  Segment,\n  Accordion,\n  Container,\n  Message,\n  Input,\n  Button,\n  Loader,\n  Table,\n  Dropdown,\n  Popup,\n  Divider,\n} from 'semantic-ui-react';\nimport {connect} from 'react-redux';\nimport {Link} from 'react-router-dom';\n\nimport Modal from 'react-modal';\nimport moment from 'moment';\n\nimport {\n  fetchCountStats,\n  fetchPhotoScanStatus,\n  fetchWordCloud,\n  generateEventAlbums,\n  fetchAutoAlbumProcessingStatus,\n  generateEventAlbumTitles,\n  fetchWorkerAvailability,\n  setSiteSettings,\n  fetchSiteSettings,\n  updateUser,\n  fetchNextcloudDirectoryTree,\n  fetchJobList,\n} from '../actions/utilActions';\nimport {trainFaces} from '../actions/facesActions';\nimport {\n  scanPhotos,\n  scanNextcloudPhotos,\n  fetchPhotos,\n} from '../actions/photosActions';\nimport {fetchUserSelfDetails} from '../actions/userActions';\nimport CountryPiChart from '../components/charts/countryPiChart';\nimport {CountStats} from '../components/statistics';\nimport WordCloud from '../components/charts/wordCloud';\n\nimport {AllPhotosMap, EventMap, LocationClusterMap} from '../components/maps';\nimport EventCountMonthGraph from '../components/eventCountMonthGraph';\nimport FaceClusterScatter from '../components/faceClusterGraph';\nimport SocialGraph from '../components/socialGraph';\nimport LazyLoad from 'react-lazyload';\nimport {LocationLink} from '../components/locationLink';\n\nimport Dropzone from 'react-dropzone';\nimport AvatarEditor from 'react-avatar-editor';\nimport MaterialIcon, {colorPallet} from 'material-icons-react';\nimport SortableTree from 'react-sortable-tree';\nimport FileExplorerTheme from 'react-sortable-tree-theme-file-explorer';\n\nexport class Settings extends Component {\n  state = {\n    accordionOneActive: false,\n    accordionTwoActive: false,\n    accordionThreeActive: false,\n    accordionFourActive: false,\n    avatarImgSrc: null,\n    userSelfDetails: {},\n    modalNextcloudScanDirectoryOpen: false,\n  };\n\n  constructor(props) {\n    super(props);\n    this.dropzoneRef = React.createRef();\n  }\n\n  onPhotoScanButtonClick = e => {\n    this.props.dispatch(scanPhotos());\n  };\n\n  onGenerateEventAlbumsButtonClick = e => {\n    this.props.dispatch(generateEventAlbums());\n  };\n\n  componentDidMount() {\n    this.props.dispatch(fetchCountStats());\n    this.props.dispatch(fetchSiteSettings());\n    this.props.dispatch(fetchUserSelfDetails(this.props.auth.access.user_id));\n    this.props.dispatch(fetchNextcloudDirectoryTree('/'));\n    if (this.props.auth.access.is_admin) {\n      this.props.dispatch(fetchJobList());\n    }\n  }\n\n  onAvatarFileDrop(files) {\n    console.log(files);\n    this.setState({avatarImgSrc: files[0].preview});\n  }\n\n  static getDerivedStateFromProps(nextProps, prevState) {\n    if (!prevState.userSelfDetails.id && nextProps.userSelfDetails.id) {\n      return {...prevState, userSelfDetails: nextProps.userSelfDetails};\n    }\n\n    return prevState;\n  }\n\n  render() {\n    if (this.props.userSelfDetails.square_avatar) {\n      var avatarImgSrc = this.props.userSelfDetails.square_avatar;\n    } else if (this.state.avatarImgSrc) {\n      var avatarImgSrc = this.state.avatarImgSrc;\n    } else {\n      var avatarImgSrc = '/unknown_user.jpg';\n    }\n\n    let buttonsDisabled = !this.props.workerAvailability;\n    buttonsDisabled = false;\n\n    return (\n      <div style={{padding: 10}}>\n        <Header as=\"h2\">\n          <MaterialIcon icon=\"settings\" color=\"#000000\" size={32} />\n          <Header.Content>Settings</Header.Content>\n        </Header>\n\n        <div>\n          <Header as=\"h3\">Account</Header>\n\n          <Grid>\n            <Grid.Row>\n              <Grid.Column width={4} textAlign=\"left\">\n                <b>Public Avatar</b>\n              </Grid.Column>\n\n              <Grid.Column width={12}>\n                <div\n                  style={{\n                    display: 'inline-block',\n                    verticalAlign: 'top',\n                    padding: 5,\n                  }}>\n                  <Dropzone\n                    disableClick\n                    style={{width: 150, height: 150, borderRadius: 75}}\n                    ref={node => {\n                      this.dropzoneRef = node;\n                    }}\n                    onDrop={(accepted, rejected) => {\n                      console.log(accepted);\n                      this.setState({\n                        avatarImgSrc: accepted[0].preview,\n                      });\n                    }}>\n                    <AvatarEditor\n                      width={150}\n                      height={150}\n                      border={0}\n                      image={avatarImgSrc}\n                    />\n                  </Dropzone>\n                </div>\n                <div\n                  style={{\n                    display: 'inline-block',\n                    verticalAlign: 'top',\n                    padding: 5,\n                  }}>\n                  <p>\n                    <b>Upload new avatar</b>\n                  </p>\n                  <Button\n                    size=\"small\"\n                    onClick={() => {\n                      this.dropzoneRef.open();\n                    }}>\n                    <Icon name=\"image\" />\n                    Choose image\n                  </Button>\n                  <Button size=\"small\" color=\"green\">\n                    <Icon name=\"upload\" />\n                    Upload\n                  </Button>\n                  <p>The maximum file size allowed is 200KB.</p>\n                </div>\n              </Grid.Column>\n            </Grid.Row>\n\n            <Grid.Row>\n              <Grid.Column width={4} textAlign=\"left\">\n                <b>Account Information</b>\n              </Grid.Column>\n\n              <Grid.Column width={12}>\n                <Form>\n                  <Form.Group widths=\"equal\">\n                    <Form.Input\n                      fluid\n                      label=\"First name\"\n                      placeholder=\"First name\"\n                    />\n                    <Form.Input\n                      fluid\n                      label=\"Last name\"\n                      placeholder=\"Last name\"\n                    />\n                  </Form.Group>\n                  <Form.Input fluid label=\"E-mail\" placeholder=\"email\" />\n                </Form>{' '}\n                <div style={{paddingTop: 10}}>\n                  <Button size=\"small\" color=\"green\" floated=\"left\">\n                    Update profile settings\n                  </Button>\n                  <Button size=\"small\" basic floated=\"right\">\n                    Cancel\n                  </Button>\n                </div>\n              </Grid.Column>\n            </Grid.Row>\n\n            <Grid.Row>\n              <Grid.Column width={4} textAlign=\"left\">\n                <b>Scan Directory</b>\n              </Grid.Column>\n\n              <Grid.Column width={12}>\n                <Input\n                  type=\"text\"\n                  action\n                  fluid\n                  disabled\n                  placeholder={this.props.auth.access.scan_directory}>\n                  <input />\n                  <Popup\n                    inverted\n                    trigger={<Button type=\"submit\">Change</Button>}\n                    content=\"Only admin can change this.\"\n                  />\n                </Input>\n              </Grid.Column>\n            </Grid.Row>\n          </Grid>\n        </div>\n\n        <Divider />\n        <Header as=\"h3\">Nextcloud</Header>\n\n        <Grid>\n          <Grid.Row>\n            <Grid.Column width={4} textAlign=\"left\">\n              <b>Credentials</b>\n              <Popup\n                position=\"right center\"\n                inverted\n                trigger={<Icon size=\"small\" name=\"question\" />}\n                content=\"Use application password\"\n              />\n            </Grid.Column>\n\n            <Grid.Column width={12}>\n              <Form>\n                <Form.Group widths=\"equal\">\n                  <Form.Input\n                    fluid\n                    onChange={(e, d) => {\n                      this.setState({\n                        userSelfDetails: {\n                          ...this.state.userSelfDetails,\n                          nextcloud_server_address: d.value,\n                        },\n                      });\n                      console.log(d.value);\n                    }}\n                    label=\"Server address\"\n                    placeholder=\"https://...\">\n                    <input\n                      value={\n                        this.state.userSelfDetails.nextcloud_server_address\n                      }\n                    />\n                  </Form.Input>\n                  <Form.Input\n                    fluid\n                    onChange={(e, d) => {\n                      this.setState({\n                        userSelfDetails: {\n                          ...this.state.userSelfDetails,\n                          nextcloud_username: d.value,\n                        },\n                      });\n                      console.log(d.value);\n                    }}\n                    label=\"User name\"\n                    placeholder=\"User name\">\n                    <input\n                      value={this.state.userSelfDetails.nextcloud_username}\n                    />\n                  </Form.Input>\n                  <Form.Input\n                    fluid\n                    onChange={(e, d) => {\n                      this.setState({\n                        userSelfDetails: {\n                          ...this.state.userSelfDetails,\n                          nextcloud_app_password: d.value,\n                        },\n                      });\n                      console.log(d.value);\n                    }}\n                    type=\"password\"\n                    label=\"Nextcloud App Password\"\n                    placeholder=\"Nextcloud App Password\"\n                  />\n                </Form.Group>\n              </Form>{' '}\n              <div>\n                <Button\n                  disabled={!this.state.userSelfDetails.nextcloud_app_password}\n                  onClick={() => {\n                    const ud = this.state.userSelfDetails;\n                    delete ud['scan_directory'];\n                    this.props.dispatch(updateUser(ud));\n                  }}\n                  size=\"small\"\n                  color=\"blue\"\n                  floated=\"left\">\n                  Update Nextcloud credentials\n                </Button>\n                <Button\n                  onClick={() => {\n                    this.setState({\n                      userSelfDetails: this.props.userSelfDetails,\n                    });\n                  }}\n                  size=\"small\"\n                  basic\n                  floated=\"right\">\n                  Cancel\n                </Button>\n              </div>\n            </Grid.Column>\n          </Grid.Row>\n          <Grid.Row>\n            <Grid.Column width={4} textAlign=\"left\">\n              <b>Nextcloud Scan Directory</b>\n              <Popup\n                trigger={\n                  <Icon\n                    size=\"small\"\n                    name=\"circle\"\n                    color={\n                      this.props.fetchedNextcloudDirectoryTree ? 'green' : 'red'\n                    }\n                  />\n                }\n                inverted\n                position=\"right center\"\n                content={\n                  this.props.fetchedNextcloudDirectoryTree\n                    ? 'Logged into Nextcloud'\n                    : 'Not logged into Nextcloud'\n                }\n              />\n            </Grid.Column>\n\n            <Grid.Column width={12}>\n              <Input\n                type=\"text\"\n                action\n                fluid\n                disabled={\n                  this.state.userDetails &&\n                  !this.props.userSelfDetails.nextcloud_username\n                }\n                placeholder={\n                  this.props.userSelfDetails.nextcloud_scan_directory\n                }>\n                <input value={this.props.userSelfDetails.nextcloud_scan_directory} />\n                <Button\n                  disabled={!this.props.fetchedNextcloudDirectoryTree}\n                  onClick={() => {\n                    this.setState({modalNextcloudScanDirectoryOpen: true});\n                  }}\n                  type=\"submit\">\n                  Change\n                </Button>\n              </Input>\n            </Grid.Column>\n          </Grid.Row>\n        </Grid>\n\n        <Divider />\n        <Header as=\"h3\">Appearance</Header>\n\n        <Grid>\n          <Grid.Row>\n            <Grid.Column width={4} textAlign=\"left\">\n              <b>Thumbnail size</b>\n            </Grid.Column>\n\n            <Grid.Column width={12}>\n              <Form>\n                <Form.Group>\n                  <Form.Field>\n                    <Radio\n                      label=\"Big\"\n                      name=\"radioGroup\"\n                      value=\"loose\"\n                      onChange={() =>\n                        this.props.dispatch({\n                          type: 'SET_GRID_TYPE',\n                          payload: 'loose',\n                        })\n                      }\n                      checked={this.props.gridType === 'loose'}\n                    />\n                  </Form.Field>\n                  <Form.Field>\n                    <Radio\n                      label=\"Small\"\n                      name=\"radioGroup\"\n                      value=\"dense\"\n                      onChange={() =>\n                        this.props.dispatch({\n                          type: 'SET_GRID_TYPE',\n                          payload: 'dense',\n                        })\n                      }\n                      checked={this.props.gridType === 'dense'}\n                    />\n                  </Form.Field>\n                </Form.Group>\n              </Form>\n            </Grid.Column>\n          </Grid.Row>\n        </Grid>\n\n        <Divider />\n        <Header as=\"h3\">Library</Header>\n\n        <CountStats />\n        <Divider hidden />\n\n        <Grid stackable>\n          <Grid.Row columns={3}>\n            <Grid.Column>\n              <Segment>\n                <Header textAlign=\"center\">\n                  {this.props.util.countStats.num_photos} Photos\n                </Header>\n                <Divider />\n                <Button\n                  attached=\"top\"\n                  fluid\n                  color=\"green\"\n                  onClick={this.onPhotoScanButtonClick}\n                  disabled={buttonsDisabled}>\n                  <Icon\n                    name=\"refresh\"\n                    loading={\n                      this.props.statusPhotoScan.status &&\n                      this.props.statusPhotoScan.added\n                    }\n                  />\n                  {this.props.statusPhotoScan.added\n                    ? 'Scanning photos (file system)' +\n                      `(${this.props.statusPhotoScan.added}/${\n                        this.props.statusPhotoScan.to_add\n                      })`\n                    : 'Scan photos (file system)'}\n                </Button>\n                <Button\n                  attached=\"bottom\"\n                  fluid\n                  onClick={() => {\n                    this.props.dispatch(scanNextcloudPhotos());\n                  }}\n                  disabled={\n                    !this.props.fetchedNextcloudDirectoryTree ||\n                    buttonsDisabled ||\n                    !this.props.userSelfDetails.nextcloud_scan_directory\n                  }\n                  color=\"blue\">\n                  <Icon name=\"refresh\" />\n                  Scan photos (Nextcloud)\n                </Button>\n\n                <Divider hidden />\n                <List bulleted>\n                  <List.Item>\n                    Make a list of all jpg files in subdirectories. For each jpg\n                    file:\n                  </List.Item>\n                  <List.Item>\n                    If the filepath exists in the database, we skip.\n                  </List.Item>\n                  <List.Item>\n                    Calculate a unique ID of the image file (md5)\n                  </List.Item>\n                  <List.Item>\n                    If this image file is already in the database, we skip.\n                  </List.Item>\n                  <List.Item>Generate a number of thumbnails </List.Item>\n                  <List.Item>Generate image captions </List.Item>\n                  <List.Item>Extract Exif information </List.Item>\n                  <List.Item>\n                    Reverse geolocate to get location names from GPS coordinates{' '}\n                  </List.Item>\n                  <List.Item>Extract faces. </List.Item>\n                  <List.Item>Add photo to thing and place albums. </List.Item>\n                </List>\n              </Segment>\n            </Grid.Column>\n            <Grid.Column>\n              <Segment>\n                <Header textAlign=\"center\">\n                  {this.props.util.countStats.num_albumauto} Event Albums\n                </Header>\n                <Divider />\n                <Button\n                  fluid\n                  attached={this.state.accordionTwoActive ? 'bottom' : false}\n                  onClick={this.onGenerateEventAlbumsButtonClick}\n                  disabled={false && buttonsDisabled}\n                  color=\"green\">\n                  <Icon name=\"wizard\" />\n                  Generate Event Albums\n                </Button>\n                <Divider hidden />\n                <p>\n                  The backend server will first group photos by time taken. If\n                  two consecutive photos are taken within 12 hours of each\n                  other, the two photos are considered to be from the same\n                  event. After groups are put together in this way, it\n                  automatically generates a title for this album.\n                </p>\n                <Divider />\n                <Button\n                  attached={this.state.accordionThreeActive ? 'bottom' : false}\n                  onClick={() => {\n                    this.props.dispatch(generateEventAlbumTitles());\n                  }}\n                  indicating=\"true\"\n                  disabled={false && buttonsDisabled}\n                  color=\"green\"\n                  fluid>\n                  <Icon name=\"wizard\" />\n                  Regenerate Event Titles\n                </Button>\n                <Divider hidden />\n                <p>\n                  Automatically generated albums have names of people in the\n                  titles. If you trained your face classifier after making event\n                  albums, you can generate new titles for already existing event\n                  albums to reflect the new names associated with the faces in\n                  photos.\n                </p>\n              </Segment>\n            </Grid.Column>\n            <Grid.Column>\n              <Segment>\n                <Header textAlign=\"center\">\n                  {this.props.util.countStats.num_faces} Faces,{' '}\n                  {this.props.util.countStats.num_people} People\n                </Header>\n                <Divider />\n                <Button\n                  onClick={() => {\n                    this.props.dispatch(trainFaces());\n                  }}\n                  fluid\n                  color=\"green\">\n                  <Icon name=\"lightning\" /> Train Faces\n                </Button>\n                <Divider hidden />\n\n                <Table celled>\n                  <Table.Body>\n                    <Table.Row>\n                      <Table.Cell>\n                        <b>\n                          <Icon name=\"lightning\" />\n                          Inferred\n                        </b>\n                      </Table.Cell>\n                      <Table.Cell textAlign=\"center\">\n                        {this.props.util.countStats.num_inferred_faces} faces\n                      </Table.Cell>\n                    </Table.Row>\n                    <Table.Row>\n                      <Table.Cell>\n                        <b>\n                          <Icon name=\"tag\" />\n                          Labeled\n                        </b>\n                      </Table.Cell>\n                      <Table.Cell textAlign=\"center\">\n                        {this.props.util.countStats.num_labeled_faces} faces\n                      </Table.Cell>\n                    </Table.Row>\n                    <Table.Row>\n                      <Table.Cell>\n                        <b>\n                          <Icon name=\"question\" />\n                          Unknown\n                        </b>\n                      </Table.Cell>\n                      <Table.Cell textAlign=\"center\">\n                        {this.props.util.countStats.num_unknown_faces} faces\n                      </Table.Cell>\n                    </Table.Row>\n                  </Table.Body>\n                </Table>\n                <Divider hidden />\n                <Button fluid as={Link} to=\"/faces\">\n                  <Icon name=\"share\" />\n                  Face Dashboard\n                </Button>\n              </Segment>\n            </Grid.Column>\n          </Grid.Row>\n        </Grid>\n\n        <ModalNextcloudScanDirectoryEdit\n          onRequestClose={() => {\n            this.setState({modalNextcloudScanDirectoryOpen: false});\n          }}\n          userToEdit={this.state.userSelfDetails}\n          isOpen={this.state.modalNextcloudScanDirectoryOpen}\n        />\n      </div>\n    );\n  }\n}\n\nconst modalStyles = {\n  content: {\n    top: 50,\n    left: 50,\n    right: 50,\n    height: window.innerHeight - 100,\n\n    overflow: 'hidden',\n    // paddingRight:0,\n    // paddingBottomt:0,\n    // paddingLeft:10,\n    // paddingTop:10,\n    padding: 0,\n    backgroundColor: 'white',\n  },\n  overlay: {\n    top: 0,\n    left: 0,\n    right: 0,\n    bottom: 0,\n    position: 'fixed',\n    borderRadius: 0,\n    border: 0,\n    zIndex: 102,\n    backgroundColor: 'rgba(200,200,200,0.8)',\n  },\n};\n\nclass ModalNextcloudScanDirectoryEdit extends Component {\n  constructor(props) {\n    super(props);\n    this.state = {newScanDirectory: '', treeData: []};\n    this.nodeClicked = this.nodeClicked.bind(this);\n    this.inputRef = React.createRef();\n  }\n\n  static getDerivedStateFromProps(nextProps, prevState) {\n    if (prevState.treeData.length === 0) {\n      return {...prevState, treeData: nextProps.nextcloudDirectoryTree};\n    } else {\n      return prevState;\n    }\n  }\n\n  nodeClicked(event, rowInfo) {\n    console.log(rowInfo);\n    this.inputRef.current.inputRef.value = rowInfo.node.absolute_path;\n    this.setState({newScanDirectory: rowInfo.node.absolute_path});\n  }\n\n  render() {\n    console.log(this.props.userToEdit);\n    return (\n      <Modal\n        ariaHideApp={false}\n        isOpen={this.props.isOpen}\n        onRequestClose={() => {\n          this.props.onRequestClose();\n          this.setState({newScanDirectory: ''});\n        }}\n        style={modalStyles}\n        onAfterOpen={() => {\n          this.props.dispatch(fetchNextcloudDirectoryTree('/'));\n        }}>\n        <div style={{padding: 10}}>\n          <Header as=\"h3\">Set your Nextcloud scan directory</Header>\n        </div>\n        <div style={{padding: 10}}>\n          <Header as=\"h5\">Current Nextcloud scan directory</Header>\n        </div>\n        <div style={{padding: 7}}>\n          <Input\n            ref={this.inputRef}\n            type=\"text\"\n            placeholder={\n              this.props.userToEdit\n                ? this.props.userToEdit.nextcloud_scan_directory === ''\n                  ? 'not set'\n                  : this.props.userToEdit.nextcloud_scan_directory\n                : '...'\n            }\n            action\n            fluid>\n            <input value={this.state.newScanDirectory} />\n            <Button\n              disabled={this.state.newScanDirectory === ''}\n              type=\"submit\"\n              color=\"green\"\n              onClick={() => {\n                const newUserData = {\n                  ...this.props.userToEdit,\n                  nextcloud_scan_directory: this.state.newScanDirectory,\n                };\n                console.log(newUserData);\n                const ud = newUserData;\n                delete ud['scan_directory'];\n                this.props.dispatch(updateUser(ud));\n                this.props.onRequestClose();\n              }}>\n              Update\n            </Button>\n            <Button\n              onClick={() => {\n                this.props.onRequestClose();\n              }}>\n              Cancel\n            </Button>\n          </Input>\n        </div>\n        <Divider />\n        <div style={{paddingLeft: 10}}>\n          <Header as=\"h5\">Choose a directory from below</Header>\n        </div>\n        <div\n          style={{\n            height: window.innerHeight - 100 - 40.44 - 36 - 52 - 30 - 10,\n            width: '100%',\n            paddingLeft: 7,\n            paddingTop: 7,\n            paddingBottom: 7,\n          }}>\n          <SortableTree\n            innerStyle={{outline: 'none'}}\n            canDrag={() => false}\n            canDrop={() => false}\n            treeData={this.state.treeData}\n            onChange={treeData => this.setState({treeData})}\n            theme={FileExplorerTheme}\n            generateNodeProps={rowInfo => {\n              let nodeProps = {\n                onClick: event => this.nodeClicked(event, rowInfo),\n              };\n              if (this.state.selectedNodeId === rowInfo.node.id) {\n                nodeProps.className = 'selected-node';\n              }\n              return nodeProps;\n            }}\n          />\n        </div>\n      </Modal>\n    );\n  }\n}\n\nclass JobList extends Component {\n  componentDidMount() {\n    if (this.props.auth.access.is_admin) {\n      this.props.dispatch(fetchJobList());\n    }\n  }\n\n  render() {\n    return (\n      <div>\n        <Table celled compact basic>\n          <Table.Header>\n            <Table.Row>\n              <Table.HeaderCell>Finished</Table.HeaderCell>\n              <Table.HeaderCell>Failed</Table.HeaderCell>\n              <Table.HeaderCell>Job Type</Table.HeaderCell>\n              <Table.HeaderCell>Time Started</Table.HeaderCell>\n              <Table.HeaderCell>Time Finished</Table.HeaderCell>\n              <Table.HeaderCell>Duration</Table.HeaderCell>\n              <Table.HeaderCell>Started By</Table.HeaderCell>\n            </Table.Row>\n          </Table.Header>\n          <Table.Body>\n            {this.props.jobList.map(job => {\n              return (\n                <Table.Row\n                  key={job.job_id}\n                  error={job.failed}\n                  positive={!job.failed}\n                  warning={!job.finished_at}>\n                  <Table.Cell>{job.finished ? 'true' : 'false'}</Table.Cell>\n                  <Table.Cell>\n                    {job.finished\n                      ? job.failed\n                        ? 'true'\n                        : 'false'\n                      : 'stil running...'}\n                  </Table.Cell>\n                  <Table.Cell>{job.job_type_str}</Table.Cell>\n                  <Table.Cell>\n                    {moment(job.started_at).format('YYYY-MM-DD') +\n                      ' (' +\n                      moment(job.started_at).fromNow() +\n                      ')'}\n                  </Table.Cell>\n                  <Table.Cell>\n                    {job.finished_at\n                      ? moment(job.finished_at).format('YYYY-MM-DD') +\n                        ' (' +\n                        moment(job.finished_at).fromNow() +\n                        ')'\n                      : 'still running...'}\n                  </Table.Cell>\n                  <Table.Cell>\n                    {job.finished\n                      ? moment\n                          .duration(\n                            moment(job.finished_at) - moment(job.started_at),\n                          )\n                          .humanize()\n                      : 'still running...'}\n                  </Table.Cell>\n                  <Table.Cell>{job.started_by.username}</Table.Cell>\n                </Table.Row>\n              );\n            })}\n          </Table.Body>\n        </Table>\n      </div>\n    );\n  }\n}\n\nJobList = connect(store => {\n  return {\n    auth: store.auth,\n    jobList: store.util.jobList,\n    fetchingJobList: store.util.fetchingJobList,\n    fetchedJobList: store.util.fetchedJobList,\n  };\n})(JobList);\n\nModalNextcloudScanDirectoryEdit = connect(store => {\n  return {\n    auth: store.auth,\n\n    nextcloudDirectoryTree: store.util.nextcloudDirectoryTree,\n    fetchingNextcloudDirectoryTree: store.util.fetchingNextcloudDirectoryTree,\n    fetchedNextcloudDirectoryTree: store.util.fetchedNextcloudDirectoryTree,\n\n    userList: store.util.userList,\n    fetchingUSerList: store.util.fetchingUserList,\n    fetchedUserList: store.util.fetchedUserList,\n  };\n})(ModalNextcloudScanDirectoryEdit);\n\nSettings = connect(store => {\n  return {\n    auth: store.auth,\n    util: store.util,\n    gridType: store.ui.gridType,\n    siteSettings: store.util.siteSettings,\n    statusPhotoScan: store.util.statusPhotoScan,\n    statusAutoAlbumProcessing: store.util.statusAutoAlbumProcessing,\n    generatingAutoAlbums: store.util.generatingAutoAlbums,\n    scanningPhotos: store.photos.scanningPhotos,\n    fetchedCountStats: store.util.fetchedCountStats,\n    workerAvailability: store.util.workerAvailability,\n    fetchedNextcloudDirectoryTree: store.util.fetchedNextcloudDirectoryTree,\n    userSelfDetails: store.user.userSelfDetails,\n  };\n})(Settings);\n"
  },
  {
    "path": "src/layouts/statistics.js",
    "content": "import React, {Component} from 'react'\nimport { Popup, Segment, Grid, Image, Icon, Header, Container, Divider, Button, Loader, Menu} from 'semantic-ui-react'\nimport { connect } from \"react-redux\";\n\nimport {fetchCountStats,fetchPhotoScanStatus,fetchWordCloud,\n        fetchAutoAlbumProcessingStatus} from '../actions/utilActions'\nimport {scanPhotos,fetchPhotos} from '../actions/photosActions'\n\nimport CountryPiChart from '../components/charts/countryPiChart'\nimport {CountStats} from '../components/statistics'\nimport WordCloud from '../components/charts/wordCloud'\nimport {LocationLink} from '../components/locationLink'\n\nimport {AllPhotosMap, EventMap, LocationClusterMap} from '../components/maps'\nimport EventCountMonthGraph from '../components/eventCountMonthGraph'\nimport LocationDurationStackedBar from '../components/locationDurationStackedBar'\n\nimport FaceClusterScatter  from '../components/faceClusterGraph'\nimport SocialGraph from '../components/socialGraph'\nimport LazyLoad from 'react-lazyload';\n\nexport class Statistics extends Component {\n\n  state = { activeItem: 'map' }\n\n  handleItemClick = (e, { name }) => this.setState({ activeItem: name })\n\n  // componentDidMount() {\n  //   var _dispatch = this.props.dispatch\n  //   this.setState({dispatch:_dispatch})\n  //   var intervalId = setInterval(function(){\n  //       _dispatch(fetchPhotoScanStatus())\n  //       _dispatch(fetchAutoAlbumProcessingStatus())\n  //     },2000\n  //   )\n  //   this.setState({intervalId:intervalId})\n  // }\n\n  // componentWillUnmount() {\n  //   clearInterval(this.state.intervalId)\n  // }\n\n  // onPhotoScanButtonClick = e => {\n  //   this.props.dispatch(scanPhotos())\n  // }\n  \n\n  render() {\n    const {activeItem} = this.state\n\n\n    return (\n      <div style={{padding:10}}>\n\n        <CountStats/>\n\n        <div>\n\n        <Menu stackable={false} pointing secondary widths={6}>\n          <Popup \n            inverted \n            position='bottom center' \n            content=\"Map\" \n            trigger={\n                <Menu.Item \n                    icon='map' \n                    active={activeItem==='map'} \n                    onClick={()=>{this.setState({activeItem:'map'})}}/>\n            }/>\n          <Popup \n            inverted \n            position='bottom center' \n            content=\"Location tree\"\n            trigger={\n                <Menu.Item \n                    icon='sitemap' \n                    active={activeItem==='location tree'} \n                    onClick={()=>{this.setState({activeItem:'location tree'})}}/>\n            }/>\n          <Popup \n            inverted \n            position='bottom center' \n            content=\"Wordclouds\" \n            trigger={\n                <Menu.Item \n                    icon='cloud' \n                    active={activeItem==='wordcloud'} \n                    onClick={()=>{this.setState({activeItem:'wordcloud'})}}/>\n            }/>\n          <Popup \n            inverted \n            position='bottom center' \n            content=\"Timeline\" \n            trigger={\n                <Menu.Item \n                    icon='area chart' \n                    active={activeItem==='timeline'} \n                    onClick={()=>{this.setState({activeItem:'timeline'})}}/>\n            }/>\n          <Popup \n            inverted \n            position='bottom center' \n            content=\"Social graph\"\n            trigger={\n                <Menu.Item \n                    icon='share alternate' \n                    active={activeItem==='social graph'} \n                    onClick={()=>{this.setState({activeItem:'social graph'})}}/>\n            }/>\n          <Popup \n            inverted \n            position='bottom center' \n            content=\"Face clusters\"\n            trigger={\n                <Menu.Item \n                    icon='user circle outline' \n                    active={activeItem==='face clusters'} \n                    onClick={()=>{this.setState({activeItem:'face clusters'})}}/>\n            }/>\n        </Menu>\n\n        </div>\n\n\n\n\n        { activeItem==='location tree' && (\n            <div>\n                <Divider hidden/>\n                <LocationLink width={window.innerWidth-120} height={window.innerHeight - 50}/>\n            </div>\n        )}\n\n        { activeItem==='map' && (\n            <div style={{paddingTop:10}}>\n                <LocationClusterMap height={window.innerHeight-250}/>\n            </div>\n        )}\n\n        { activeItem==='wordcloud' && (\n            <div>\n                <Divider hidden/>\n                <WordCloud height={320} type='location'/>\n                <Divider hidden/>\n                <WordCloud height={320} type='captions'/>\n                <Divider hidden/>\n                <WordCloud height={320} type='people'/>\n            </div>\n        )}\n\n        { activeItem==='timeline' && (\n            <div>\n                <Divider hidden/>\n                <EventCountMonthGraph />\n                <Divider hidden/>\n                <LocationDurationStackedBar/>\n            </div>\n        )}\n\n        { activeItem==='social graph' && (\n            <div>\n                <Divider hidden/>\n                <SocialGraph height={window.innerHeight - 300}/>\n            </div>\n        )}\n\n        { activeItem==='face clusters' && (\n            <div>\n                <Divider hidden/>\n                <FaceClusterScatter height={window.innerHeight-320}/>\n            </div>\n        )}\n      </div>\n    )\n  }\n}\n\n\n\nStatistics = connect((store)=>{\n  return {\n    statusPhotoScan: store.util.statusPhotoScan,\n    statusAutoAlbumProcessing: store.util.statusAutoAlbumProcessing,\n    generatingAlbumsAuto: store.albums.generatingAlbumsAuto,\n    scanningPhotos: store.photos.scanningPhotos,\n    fetchedCountStats: store.util.fetchedCountStats,\n  }\n})(Statistics)\n\n\n"
  },
  {
    "path": "src/layouts/vigTest.js",
    "content": "import React, { Component} from \"react\";\n\nimport VirtualizedItemGrid from 'react-virtualized-item-grid';\nimport { Image } from 'semantic-ui-react';\nimport {Server, serverAddress} from '../api_client/apiClient'\n\nexport class MyList extends Component {\n  itemRenderer(item) {\n    console.log(item)\n    return <div><Image src=\"http://localhost:8000/media/square_thumbnails/77e17ac90e343dceb146f58b5cca7d93.jpg\"/></div>;\n  }\n\n  render() {\n    return (\n      <VirtualizedItemGrid\n        idealItemWidth={30}\n        items={[1,2,3,4,5]}\n        renderItem={this.itemRenderer}/>\n    )\n  }\n}\n\n"
  },
  {
    "path": "src/middleware.js",
    "content": "import { isRSAA, apiMiddleware } from 'redux-api-middleware';\n\nimport { TOKEN_RECEIVED, refreshAccessToken } from './actions/authActions'\nimport { refreshToken, isAccessTokenExpired } from './reducers'\n\n\nexport function createApiMiddleware() {\n  let postponedRSAAs = []\n\n  return ({ dispatch, getState }) => {\n    const rsaaMiddleware = apiMiddleware({dispatch, getState})\n\n    return (next) => (action) => {\n      const nextCheckPostoned = (nextAction) => {\n          // Run postponed actions after token refresh\n          if (nextAction.type === TOKEN_RECEIVED) {\n            next(nextAction);\n            postponedRSAAs.forEach((postponed) => {\n              rsaaMiddleware(next)(postponed)\n            })\n            postponedRSAAs = []\n          } else {\n            next(nextAction)\n          }\n      }\n\n      if(isRSAA(action)) {\n        const state = getState(),\n              token = refreshToken(state)\n\n        if(token && isAccessTokenExpired(state)) {\n          postponedRSAAs.push(action)\n          if(postponedRSAAs.length === 1) {\n            return  rsaaMiddleware(nextCheckPostoned)(refreshAccessToken(token))\n          } else {\n            return\n          }\n        }\n\n        return rsaaMiddleware(next)(action);\n      }\n      return next(action);\n    }\n  }\n}\n\nexport default createApiMiddleware();"
  },
  {
    "path": "src/pig.js",
    "content": "(function(global) {\n  'use strict';\n\n  /**\n   * This is a manager for our resize handlers. You can add a callback, disable\n   * all resize handlers, and re-enable handlers after they have been disabled.\n   *\n   * optimizedResize is adapted from Mozilla code:\n   * https://developer.mozilla.org/en-US/docs/Web/Events/resize\n   */\n  var optimizedResize = (function() {\n    var callbacks = [];\n    var running = false;\n\n    // fired on resize event\n    function resize() {\n      if (!running) {\n        running = true;\n        if (window.requestAnimationFrame) {\n          window.requestAnimationFrame(runCallbacks);\n        } else {\n          setTimeout(runCallbacks, 66);\n        }\n      }\n    }\n\n    // run the actual callbacks\n    function runCallbacks() {\n      callbacks.forEach(function(callback) {\n        callback();\n      });\n\n      running = false;\n    }\n\n    return {\n      /**\n       * Add a callback to be run on resize.\n       *\n       * @param {function} callback - the callback to run on resize.\n       */\n      add: function(callback) {\n        if (!callbacks.length) {\n          window.addEventListener('resize', resize);\n        }\n\n        callbacks.push(callback);\n      },\n\n      /**\n       * Disables all resize handlers.\n       */\n      disable: function() {\n        window.removeEventListener('resize', resize);\n      },\n\n      /**\n       * Enables all resize handlers, if they were disabled.\n       */\n      reEnable: function() {\n        window.addEventListener('resize', resize);\n      }\n    };\n  }());\n\n  /**\n   * Inject CSS needed to make the grid work in the <head></head>.\n   *\n   * @param {string} classPrefix - the prefix associated with this library that\n   *                               should be prepended to classnames.\n   * @param {string} containerId - ID of the container for the images.\n   */\n  function _injectStyle(containerId, classPrefix, transitionSpeed) {\n\n    var css = (\n      '#' + containerId + ' {' +\n      '  position: relative;' +\n      '}' +\n      '.' + classPrefix + '-figure {' +\n      '  background-color: #D5D5D5;' +\n      '  overflow: hidden;' +\n      '  left: 0;' +\n      '  position: absolute;' +\n      '  top: 0;' +\n      '  margin: 0;' +\n      '}' +\n      '.' + classPrefix + '-figure img {' +\n      '  left: 0;' +\n      '  position: absolute;' +\n      '  top: 0;' +\n      '  height: 100%;' +\n      '  width: 100%;' +\n      '  opacity: 0;' +\n      '  transition: ' + (transitionSpeed / 1000) + 's ease opacity;' +\n      '  -webkit-transition: ' + (transitionSpeed / 1000) + 's ease opacity;' +\n      '}' +\n      '.' + classPrefix + '-figure img.' + classPrefix + '-thumbnail {' +\n      '  -webkit-filter: blur(30px);' +\n      '  filter: blur(30px);' +\n      '  left: auto;' +\n      '  position: relative;' +\n      '  width: auto;' +\n      '}' +\n      '.' + classPrefix + '-figure img.' + classPrefix + '-loaded {' +\n      '  opacity: 1;' +\n      '}'\n    );\n\n    var head = document.head || document.getElementsByTagName(\"head\")[0];\n    var style = document.createElement(\"style\");\n\n    style.type = \"text/css\";\n    if (style.styleSheet) {\n      style.styleSheet.cssText = css;\n    } else {\n      style.appendChild(document.createTextNode(css));\n    }\n\n    head.appendChild(style);\n  }\n\n  /**\n   * Extend obj1 with each key in obj2, overriding default values in obj1 with\n   * values in obj2\n   *\n   * @param {object} obj1 - The object to extend.\n   * @param {object} obj2 - The overrides to apply onto obj1.\n   */\n  function _extend(obj1, obj2) {\n    for (var i in obj2) {\n      if (obj2.hasOwnProperty(i)) {\n        obj1[i] = obj2[i];\n      }\n    }\n  }\n\n  /**\n   * Returns the distance from `elem` to the top of the page. This is done by\n   * walking up the node tree, getting the offsetTop of each parent node, until\n   * the top of the page.\n   *\n   * @param {object} elem - The element to compute the offset of.\n   **/\n  function _getOffsetTop(elem){\n      var offsetTop = 0;\n      do {\n        if (!isNaN(elem.offsetTop)){\n            offsetTop += elem.offsetTop;\n        }\n        elem = elem.offsetParent;\n      } while(elem);\n      return offsetTop;\n  }\n\n  /**\n   * Creates an instance of the progressive image grid, inserting boilerplate\n   * CSS and loading image data. Instantiating an instance of the Pig class\n   * does not cause any images to appear however. After instantiating, call the\n   * `enable()` function on the returned instance:\n   *\n   *   var pig = new Pig(imageData, opts);\n   *   pig.enable();\n   *\n   * @param {array} imageData - An array of metadata about each image to\n   *                            include in the grid.\n   * @param {string} imageData[0].filename - The filename of the image.\n   * @param {string} imageData[0].aspectRatio - The aspect ratio of the image.\n   * @param {object} options - An object containing overrides for the default\n   *                           options. See below for the full list of options\n   *                           and defaults.\n   *\n   * @returns {object} The Pig instance.\n   */\n  function Pig(imageData, options) {\n    // Global State\n    this.inRAF = false;\n    this.isTransitioning = false;\n    this.minAspectRatioRequiresTransition = false;\n    this.minAspectRatio = null;\n    this.latestYOffset = 0;\n    this.lastWindowWidth = window.innerWidth;\n    this.scrollDirection = 'down';\n\n    // List of images that are loading or completely loaded on screen.\n    this.visibleImages = [];\n\n    // These are the default settings, which may be overridden.\n    this.settings = {\n\n      /**\n       * Type: string\n       * Default: 'pig'\n       * Description: The class name of the element inside of which images should\n       *   be loaded.\n       */\n      containerId: 'pig',\n\n      /**\n       * Type: string\n       * Default: 'pig'\n       * Description: The prefix associated with this library that should be\n       *   prepended to class names within the grid.\n       */\n      classPrefix: 'pig',\n\n      /**\n       * Type: string\n       * Default: 'figure'\n       * Description: The tag name to use for each figure. The default setting is\n       *   to use a <figure></figure> tag.\n       */\n      figureTagName: 'figure',\n\n      /**\n       * Type: string\n       * Default: 'group'\n       * Description: The tag name to use for each group. The default setting is\n       *   to use a <group></group> tag.\n       */\n      groupTagName: 'group',\n\n      /**\n       * Type: string\n       * Default: 'groupheadline'\n       * Description: The tag name to use for each group headline. The default setting is\n       *   to use a <groupheadline></groupheadline> tag.\n       */\n      groupHeadlineTagName: 'groupheadline',\n\n      /**\n       * Type: boolean\n       * Default: false\n       * Description: Enables/disables the group headline, the default is false.\n       */\n      enableGroupHeadline: false,\n\n      /**\n       * Type: boolean\n       * Default: false\n       * Description: True: Start a new row per group.\n       *              False: Try to fit multiple groups into one row. If a group requires\n       *                     more than one row, fallback to start with a new row for this group.\n       */\n      newRowPerGroup: true,\n\n      /**\n       * Type: number\n       * Default: 'groupHeadlineHeight'\n       * Description: The height of the group headline in pixel. The default is 48px.\n       */\n      groupHeadlineHeight: 48,\n\n      /**\n       * Get the HTML code for a group headline.\n       *\n       * @param {Number} groupid - The id of the group. This id is equal to the id given in the imageData.\n       *\n       * @returns {String} The HTML code for the group headline.\n       */\n      getGroupHeadlineHTML: function(groupid) {\n        return '<h2>' + groupid + '</h2>';\n      },\n\n      /**\n       * Type: Number\n       * Default: 64\n       * Description: Size in pixels of the gap between groups in one row. This setting is only used if enableGroupHeadline == true.\n       */\n      spaceBetweenGroups: 64,\n\n      /**\n       * Type: Number\n       * Default: 8\n       * Description: Size in pixels of the gap between images in the grid.\n       */\n      spaceBetweenImages: 8,\n\n      /**\n       * Type: Number\n       * Default: 500\n       * Description: Transition speed in milliseconds\n       */\n      transitionSpeed: 500,\n\n      /**\n       * Type: Number\n       * Default: 3000\n       * Description: Height in pixels of images to preload in the direction\n       *   that the user is scrolling. For example, in the default case, if the\n       *   user is scrolling down, 1000px worth of images will be loaded below\n       *   the viewport.\n       */\n      primaryImageBufferHeight: 1000,\n\n      /**\n       * Type: Number\n       * Default: 100\n       * Description: Height in pixels of images to preload in the direction\n       *   that the user is NOT scrolling. For example, in the default case, if\n       *   the user is scrolling down, 300px worth of images will be loaded\n       *   above the viewport.  Images further up will be removed.\n       */\n      secondaryImageBufferHeight: 300,\n\n      /**\n       * Type: Number\n       * Default: 20\n       * Description: The height in pixels of the thumbnail that should be\n       *   loaded and blurred to give the effect that images are loading out of\n       *   focus and then coming into focus.\n       */\n      thumbnailSize: 20,\n\n      /**\n       * Get the URL for an image with the given filename & size.\n       *\n       * @param {string} filename - The filename of the image.\n       * @param {Number} size - The size (height in pixels) of the image.\n       *\n       * @returns {string} The URL of the image at the given size.\n       */\n      urlForSize: function(filename, size) {\n        return '/img/' + size + '/' + filename;\n      },\n\n      /**\n       * Get the minimum required aspect ratio for a valid row of images. The\n       * perfect rows are maintained by building up a row of images by adding\n       * together their aspect ratios (the aspect ratio when they are placed\n       * next to each other) until that aspect ratio exceeds the value returned\n       * by this function. Responsive reordering is achieved through changes\n       * to what this function returns at different values of the passed\n       * parameter `lastWindowWidth`.\n       *\n       * @param {Number} lastWindowWidth - The last computed width of the\n       *                                   browser window.\n       *\n       * @returns {Number} The minimum aspect ratio at this window width.\n       */\n      getMinAspectRatio: function(lastWindowWidth) {\n        if (lastWindowWidth <= 640)\n          return 2;\n        else if (lastWindowWidth <= 1280)\n          return 4;\n        else if (lastWindowWidth <= 1920)\n          return 5;\n        return 6;\n      },\n\n      /**\n       * Get the image size (height in pixels) to use for this window width.\n       * Responsive resizing of images is achieved through changes to what this\n       * function returns at different values of the passed parameter\n       * `lastWindowWidth`.\n       *\n       * @param {Number} lastWindowWidth - The last computed width of the\n       *                                   browser window.\n       *\n       * @returns {Number} The size (height in pixels) of the images to load.\n       */\n      getImageSize: function(lastWindowWidth) {\n        if (lastWindowWidth <= 640)\n          return 100;\n        else if (lastWindowWidth <= 1920)\n          return 250;\n        return 500;\n      }\n    };\n\n    // We extend the default settings with the provided overrides.\n    _extend(this.settings, options || {});\n\n    // Find the container to load images into, if it exists.\n    this.container = document.getElementById(this.settings.containerId);\n    if (!this.container) {\n      console.error('Could not find element with ID ' + this.settings.containerId);\n    }\n\n    // Our global reference for images in the grid.  Note that not all of these\n    // images are necessarily in view or loaded.\n    this.images = this._parseImageData(imageData);\n\n    // Inject our boilerplate CSS.\n    _injectStyle(this.settings.containerId, this.settings.classPrefix, this.settings.transitionSpeed);\n\n    // Allows for chaining with `enable()`.\n    return this;\n  }\n\n  /**\n   * Because we may be transitioning a very large number of elements on a\n   * resize, and because we cannot reliably determine when all elements are\n   * done transitioning, we have to approximate the amount of time it will take\n   * for the browser to be expected to complete with a transition. This\n   * constant gives the scale factor to apply to the given transition time. For\n   * example, if transitionTimeoutScaleFactor is 1.5 and transition speed is\n   * given as 500ms, we will wait 750ms before assuming that we are actually\n   * done resizing.\n   *\n   * @returns {Number} Time in milliseconds before we can consider a resize to\n   *   have been completed.\n   */\n  Pig.prototype._getTransitionTimeout = function() {\n    var transitionTimeoutScaleFactor = 1.5;\n    return this.settings.transitionSpeed * transitionTimeoutScaleFactor;\n  };\n\n  /**\n   * Gives the CSS property string to set for the transition value, depending\n   * on whether or not we are transitioning.\n   *\n   * @returns {string} a value for the `transition` CSS property.\n   */\n  Pig.prototype._getTransitionString = function() {\n    if (this.isTransitioning) {\n      return (this.settings.transitionSpeed / 1000) + 's transform ease';\n    }\n\n    return 'none';\n  };\n\n  /**\n   * Computes the current value for `this.minAspectRatio`, using the\n   * `getMinAspectRatio` function defined in the settings. Then,\n   * `this.minAspectRatioRequiresTransition` will be set, depending on whether\n   * or not the value of this.minAspectRatio has changed.\n   */\n  Pig.prototype._recomputeMinAspectRatio = function() {\n    var oldMinAspectRatio = this.minAspectRatio;\n    this.minAspectRatio = this.settings.getMinAspectRatio(this.lastWindowWidth);\n\n    if (oldMinAspectRatio !== null && oldMinAspectRatio !== this.minAspectRatio)\n      this.minAspectRatioRequiresTransition = true;\n    else\n      this.minAspectRatioRequiresTransition = false;\n  };\n\n  /**\n   * Creates new instances of the ProgressiveImage class for each of the images\n   * defined in `imageData`.\n   *\n   * @param {array} imageData - An array of metadata about each image to\n   *                            include in the grid.\n   * @param {string} imageData[0].filename - The filename of the image.\n   * @param {string} imageData[0].aspectRatio - The aspect ratio of the image.\n   *\n   * @returns {Array[ProgressiveImage]} - An array of ProgressiveImage\n   *                                      instances that we created.\n   */\n  Pig.prototype._parseImageData = function(imageData) {\n    var progressiveGroups = [];\n\n    imageData.forEach(function(group, gindex) {\n      var progressive_group = new ProgressiveGroup(group.groupid, gindex, this);\n\n      group.images.forEach(function(image, index) {\n        var progressiveImage = new ProgressiveImage(image, index, this, progressive_group);\n        progressive_group.addImage(progressiveImage);\n      }.bind(this));\n\n      progressiveGroups.push(progressive_group);\n    }.bind(this));\n\n    return progressiveGroups;\n  };\n  /**\n   * This computes the layout of the entire grid, setting the height, width,\n   * translateX, translateY, and transtion values for each ProgessiveImage in\n   * `this.images`. These styles are set on the ProgressiveImage.style property,\n   * but are not set on the DOM.\n   *\n   * This separation of concerns (computing layout and DOM manipulation) is\n   * paramount to the performance of the PIG. While we need to manipulate the\n   * DOM every time we scroll (adding or remove images, etc.), we only need to\n   * compute the layout of the PIG on load and on resize. Therefore, this\n   * function will compute the entire grid layout but will not manipulate the\n   * DOM at all.\n   *\n   * All DOM manipulation occurs in `_doLayout`.\n   */\n  Pig.prototype._computeLayout = function() {\n    // Constants\n    var wrapperWidth = parseInt(this.container.clientWidth);\n\n    // State\n    var row = []; // The list of images in the current row.\n    var translateX = 0; // The current translateX value that we are at\n    var translateY = 0; // The current translateY value that we are at\n    var rowAspectRatio = 0; // The aspect ratio of the row we are building\n\n    // Compute the minimum aspect ratio that should be applied to the rows.\n    this._recomputeMinAspectRatio();\n\n    // If we are not currently transitioning, and our minAspectRatio has just\n    // changed, then we mark isTransitioning true. If this is the case, then\n    // `this._getTransitionString()` will ensure that each image has a value\n    // like \"0.5s ease all\". This will cause images to animate as they change\n    // position. (They need to change position because the minAspectRatio has\n    // changed.) Once we determine that the transtion is probably over (using\n    // `this._getTransitionTimeout`) we unset `this.isTransitioning`, so that\n    // future calls to `_computeLayout` will set \"transition: none\".\n    if (!this.isTransitioning && this.minAspectRatioRequiresTransition) {\n      this.isTransitioning = true;\n      setTimeout(function() {\n        this.isTransitioning = false;\n      }, this._getTransitionTimeout());\n    }\n\n    // Get the valid-CSS transition string.\n    var transition = this._getTransitionString();\n    var rows = [];\n\n    // Loop through all our images, building them up into rows and computing\n    // the working rowAspectRatio.\n    [].forEach.call(this.images, function(group, gindex) {\n      var self = this;\n      //either get the aspect ratio of the group or take a real big value\n      var next_group_aspect_ratio = gindex + 1 < this.images.length ? this.images[gindex + 1].getAspectRatio() : 1000;\n\n      [].forEach.call(group.images, function(image, index) {\n        var self = this;\n        rowAspectRatio += parseFloat(image.aspectRatio);\n        row.push(image);\n\n\n        var last_group_row = index + 1 === group.images.length;\n        var last_global_row = last_group_row && gindex == this.images.length;\n        // Either we have enabled a new row per group, the row aspect ratio\n        // plus the next group aspect ratio is greater than the allowed aspect ratio\n        // or the current row belongs to a group that occupies multiple rows\n        var new_row_for_next_group = this.settings.newRowPerGroup ||\n            (rowAspectRatio + next_group_aspect_ratio) >= this.minAspectRatio ||\n            translateY !== 0;\n        var out_of_images = last_global_row || (last_group_row && new_row_for_next_group);\n\n        // When the rowAspectRatio exceeds the minimum acceptable aspect ratio,\n        // or when we're out of images, we say that we have all the images we\n        // need for this row, and compute the style values for each of these\n        // images.\n        if (rowAspectRatio >= this.minAspectRatio || out_of_images) {\n          // count the number of groups in this row\n          var groups_in_row = row.reduce(function (groups, current) {\n            if (groups.indexOf(current.getGroupIndex()) === -1) {\n              groups.push(current.getGroupIndex());\n            }\n\n            return groups;\n          }, []).length;\n\n          // Make sure that the last row also has a reasonable height\n          rowAspectRatio = Math.max(rowAspectRatio, this.minAspectRatio);\n\n          // Compute this row's height.\n          var totalDesiredWidthOfImages = wrapperWidth - this.settings.spaceBetweenImages * (row.length - 1) -\n              this.settings.spaceBetweenGroups * (groups_in_row - 1);\n          var rowHeight = totalDesiredWidthOfImages / rowAspectRatio;\n\n          // For each image in the row, compute the width, height, translateX,\n          // and translateY values, and set them (and the transition value we\n          // found above) on each image.\n          //\n          // NOTE: This does not manipulate the DOM, rather it just sets the\n          //       style values on the ProgressiveImage instance. The DOM nodes\n          //       will be updated in _doLayout.\n          var last_group_index = row[0].getGroupIndex();\n          row.forEach(function(img) {\n            var imageWidth = rowHeight * img.aspectRatio;\n\n            // If we start with a new group in the row, reset the translateX\n            if (last_group_index !== img.getGroupIndex()) {\n              translateX = 0;\n              last_group_index = img.getGroupIndex();\n            }\n\n            // This is NOT DOM manipulation.\n            img.style = {\n                width: parseInt(imageWidth),\n                height: parseInt(rowHeight),\n                translateX: translateX,\n                translateY: translateY,\n                transition: transition\n            };\n\n            // The next image is this.settings.spaceBetweenImages pixels to the\n            // right of this image.\n            translateX += imageWidth + this.settings.spaceBetweenImages;\n          }.bind(self));\n\n          rows.push(row);\n          // Reset our state variables for next row.\n          row = [];\n          rowAspectRatio = 0;\n          translateY += parseInt(rowHeight) + this.settings.spaceBetweenImages;\n          translateX = 0;\n        }\n      }.bind(self));\n\n      translateY = 0;\n    }.bind(this));\n\n    // Now we iterate over all generated rows and update the corresponding groups.\n    // This means we set the width, height, top and left of each group.\n    var group_top = 0;\n    rows.forEach(function(row, rindex) {\n      var seen_groups = [];\n      var group_width = 0;\n      var row_height = 0;\n      var group_left = 0;\n      var last_row = rindex + 1 === rows.length;\n      var group_top_updated_for_row = false;\n      var self = this;\n      row.forEach(function(img, index) {\n        var last_row_img = index + 1 === row.length + 1;\n        var last_global_img = last_row_img && last_row;\n\n        row_height = img.style.height + (last_row ? 0 : this.settings.spaceBetweenImages);\n\n        // If we did not have seen this group in this row already, we have to set some variables:\n        // First, we update the group_left value, if we got multiple groups per row, we need to move them\n        // to the right, so that they do not overlap each other.\n        // Second, we reset the group_width, because we start with a new group.\n        // Third, we update the height of the group.\n        if (seen_groups.indexOf(img.getGroupIndex()) === -1) {\n          group_left += group_width + (group_width === 0 ? 0 : this.settings.spaceBetweenGroups - this.settings.spaceBetweenImages);\n          group_width = 0;\n          seen_groups.push(img.getGroupIndex());\n          img.getGroup().style.height += row_height;\n        }\n\n        group_width += img.style.width + (last_row_img ? 0 : this.settings.spaceBetweenImages);\n\n        img.getGroup().style.width = Math.max(img.getGroup().style.width, group_width);\n\n        img.getGroup().style.left = group_left;\n\n        // Now we need to update the group top value.\n        // But, as we can have one group in multiple rows, we only want to update the top of the group once.\n        // So, we first check that the current group top is equal to 0 and then we check that either we have group headlines enabled\n        // or that the current group is not the first group.\n        if (img.getGroup().style.top === 0 && (this.settings.groupHeadlineHeight || img.getGroupIndex() > 0)) {\n          // We only update the group_top once per row, because when we have multiple groups in one row,\n          // all should start at the same top.\n          if (!group_top_updated_for_row) {\n            group_top += (this.settings.enableGroupHeadline ? this.settings.groupHeadlineHeight : 0);\n            group_top_updated_for_row = true;\n          }\n\n          img.getGroup().style.top = group_top;\n        }\n      }.bind(self));\n\n      group_top += row_height;\n    }.bind(this));\n\n    // No space below the last image\n    this.totalHeight = group_top - this.settings.spaceBetweenImages;\n  };\n\n\n  /**\n   * Update the DOM to reflect the style values of each image in the PIG,\n   * adding or removing images appropriately.\n   *\n   * PIG ensures that there are not too many images loaded into the DOM at once\n   * by maintaining a buffer region around the viewport in which images are\n   * allowed, removing all images below and above. Because all of our layout\n   * is computed using CSS transforms, removing an image above the buffer will\n   * not cause the gird to reshuffle.\n   *\n   * The primary buffer is the buffer in the direction of the user's scrolling.\n   * (Below if they are scrolling down, above if they are scrolling up.) The\n   * size of this buffer determines the experience of scrolling down the page.\n   *\n   * The secondary buffer is the buffer in the opposite direction of the user's\n   * scrolling.  The size of this buffer determines the experience of changing\n   * scroll directions. (Too small, and we have to reload a ton of images above\n   * the viewport if the user changes scroll directions.)\n   *\n   * While the entire grid has been computed, only images within the viewport,\n   * the primary buffer, and the secondary buffer will exist in the DOM.\n   *\n   *\n   *             Illustration: the primary and secondary buffers\n   *\n   *\n   * +---------------------------+\n   * |                           |\n   * |                           |\n   * |                           |\n   * |                           |\n   * + - - - - - - - - - - - - - +                   -------\n   * |                           |                      A\n   * |     Secondary Buffer      |   this.setting.secondaryImageBufferHeight\n   * |                           |                      V\n   * +---------------------------+                   -------\n   * |                           |                      A\n   * |                           |                      |\n   * |                           |                      |\n   * |        Viewport           |              window.innerHeight\n   * |                           |                      |\n   * |                           |                      |\n   * |                           |                      V\n   * +---------------------------+                   -------\n   * |                           |                      A\n   * |                           |                      |\n   * |                           |                      |\n   * |                           |                      |\n   * |      Primary Buffer       |    this.settings.primaryImageBufferHeight\n   * |                           |                      |\n   * |                           |                      |\n   * |                           |                      |\n   * |                           |                      V\n   * + - - - - - - - - - - - - - +                   -------\n   * |                           |\n   * |    (Scroll direction)     |\n   * |            |              |\n   * |            |              |\n   * |            V              |\n   * |                           |\n   *\n   */\n  Pig.prototype._doLayout = function() {\n\n    // Set the container height\n    this.container.style.height = this.totalHeight + 'px';\n\n    // Get the top and bottom buffers heights.\n    var bufferTop =\n      (this.scrollDirection === 'up') ?\n      this.settings.primaryImageBufferHeight :\n      this.settings.secondaryImageBufferHeight;\n    var bufferBottom =\n      (this.scrollDirection === 'down') ?\n      this.settings.secondaryImageBufferHeight :\n      this.settings.primaryImageBufferHeight;\n\n    // Now we compute the location of the top and bottom buffers:\n    var containerOffset = _getOffsetTop(this.container);\n    var windowHeight = window.innerHeight;\n\n    // This is the top of the top buffer. If the bottom of an image is above\n    // this line, it will be removed.\n    var minTranslateYPlusHeight = this.latestYOffset - containerOffset - bufferTop;\n\n    // This is the bottom of the bottom buffer.  If the top of an image is\n    // below this line, it will be removed.\n    var maxTranslateY = this.latestYOffset + windowHeight + bufferBottom;\n\n    // Here, we loop over every image, determine if it is inside our buffers or\n    // no, and either insert it or remove it appropriately.\n    this.images.forEach(function(group) {\n      group.updateVisibility(minTranslateYPlusHeight, maxTranslateY);\n    }.bind(this));\n  };\n\n  /**\n   * Create our onScroll handler and return it.\n   *\n   * @returns {function} Our optimized onScroll handler.\n   */\n  Pig.prototype._getOnScroll = function() {\n    var _this = this;\n\n    /**\n     * This function is called on scroll. It computes variables about the page\n     * position and scroll direction, and then calls a _doLayout guarded by a\n     * window.requestAnimationFrame.\n     *\n     * We use the boolean variable _this.inRAF to ensure that we don't overload\n     * the number of layouts we perform by starting another layout while we are\n     * in the middle of doing one.\n     *\n     * @returns {function} The onScroll handler that we should attach.\n     */\n    var onScroll = function() {\n      // Compute the scroll direction using the latestYOffset and the\n      // previousYOffset\n      var newYOffset = window.pageYOffset;\n      _this.previousYOffset = _this.latestYOffset || newYOffset;\n      _this.latestYOffset = newYOffset;\n      _this.scrollDirection = (_this.latestYOffset > _this.previousYOffset) ? 'down' : 'up';\n\n      // Call _this.doLayout, guarded by window.requestAnimationFrame\n      if (!_this.inRAF) {\n        _this.inRAF = true;\n        window.requestAnimationFrame(function() {\n          _this._doLayout();\n          _this.inRAF = false;\n        });\n      }\n    };\n\n    return onScroll;\n  };\n\n  /**\n   * Enable scroll and resize handlers, and run a complete layout computation /\n   * application.\n   *\n   * @returns {object} The Pig instance, for easy chaining with the constructor.\n   */\n  Pig.prototype.enable = function() {\n    this.onScroll = this._getOnScroll();\n    window.addEventListener('scroll', this.onScroll);\n\n    this.onScroll();\n    this._computeLayout();\n    this._doLayout();\n\n    optimizedResize.add(function() {\n      this.lastWindowWidth = window.innerWidth;\n      this._computeLayout();\n      this._doLayout();\n    }.bind(this));\n\n    return this;\n  };\n\n  /**\n   * Remove all scroll and resize listeners.\n   *\n   * @returns {object} The Pig instance.\n   */\n  Pig.prototype.disable = function() {\n    window.removeEventListener('scroll', this.onScroll);\n    optimizedResize.disable();\n    return this;\n  };\n\n  /**\n   * This class manages a single group, a group contains one to multiple images.\n   * It keeps track of the group's height, width, and position in the grid.\n   *\n   * However, this element may or may not actually exist in the DOM. The actual\n   * DOM element may loaded and unloaded depending on where it is with respect\n   * to the viewport. This class is responsible for managing the DOM elements.\n   *\n   * @param {number} groupid - This id is equal to the id given by the user in the image data.\n   * @param {index} index - The index of the group in the pig.images array.\n   * @param {object} pig - The pig instance.\n   */\n  function ProgressiveGroup(groupid, index, pig) {\n    this.groupid = groupid;\n    this.index = index;\n    this.images = [];\n    this.pig = pig;\n\n    this.classNames = {\n      group: pig.settings.classPrefix + '-group',\n      headline: pig.settings.classPrefix + 'group-headline'\n    };\n\n    this.existsOnPage = false;\n\n    if (pig.settings.enableGroupHeadline) {\n      this.createHeadline();\n    }\n\n    this.style = {\n      width: 0,\n      height: 0,\n      top: 0,\n      left: 0\n    };\n  }\n\n  /**\n   * Adds an image to this group.\n   */\n  ProgressiveGroup.prototype.addImage = function(image) {\n    this.images.push(image);\n  };\n\n  /**\n   * Computes the aspect ratio of the whole group.\n   *\n   * @returns {number} The aspect ratio of this group.\n   */\n  ProgressiveGroup.prototype.getAspectRatio = function() {\n    var aspect_ratio = 0.0;\n    this.images.forEach(function(image) {\n      aspect_ratio += parseFloat(image.aspectRatio);\n    });\n\n    return aspect_ratio;\n  };\n\n  /**\n   * Returns the index of this group.\n   *\n   * @returns {number} The index of this group in the pig.images array.\n   */\n  ProgressiveGroup.prototype.getIndex = function() {\n    return this.index;\n  };\n\n  /**\n   * Checks if this group is currently visible/invisible in the viewport.\n   * If the group is visible in the current viewport, the dom element is\n   * added to the root dom element, otherwise the group dom element is removed.\n   * This function also calls the updateVisibility function of all images, but\n   * only if the group itself is visible.\n   *\n   * @param {number} miny - The top of the viewport.\n   * @param {number} maxy - The bottom of the viewport.\n   */\n  ProgressiveGroup.prototype.updateVisibility = function(miny, maxy) {\n    var top = this.style.top;\n    var top_plus_height = this.style.height + top;\n\n    if (this.headline) {\n      top -= this.pig.settings.groupHeadlineHeight;\n    }\n\n    if (top <= maxy && top_plus_height >= miny) {\n      this.load();\n      this.images.forEach(function(img) { img.updateVisibility(miny - top, maxy - top); });\n    } else {\n      this.hide();\n    }\n  };\n\n  /**\n   * Get the DOM element associated with this ProgressiveGroup. We default to\n   * using this.element, and we create it if it doesn't exist.\n   *\n   * @returns {HTMLElement} The DOM element associated with this instance.\n   */\n  ProgressiveGroup.prototype.getElement = function() {\n    if (!this.element) {\n      this.element = document.createElement(this.pig.settings.groupTagName);\n      this.element.className = this.classNames.group;\n\n      if (this.headline) {\n        this.element.appendChild(this.headline);\n      }\n\n      this._updateStyles();\n    }\n\n    return this.element;\n  };\n\n  /**\n   * Creates the headline for this group.\n   */\n  ProgressiveGroup.prototype.createHeadline = function() {\n    if (!this.headline) {\n      this.headline = document.createElement(this.pig.settings.groupHeadlineTagName);\n      this.headline.className = this.classNames.headline;\n    }\n  };\n\n  /**\n   * Updates the style attribute to reflect this style property on this object.\n   */\n  ProgressiveGroup.prototype._updateStyles = function() {\n    this.getElement().style.position = 'absolute';\n    this.getElement().style.width = this.style.width + 'px';\n    this.getElement().style.height = this.style.height + 'px';\n    this.getElement().style.top = this.style.top + 'px';\n    this.getElement().style.left = this.style.left + 'px';\n\n    if (this.headline) {\n      var height = this.pig.settings.groupHeadlineHeight;\n\n      this.headline.style.minWidth = '100%';\n      this.headline.style.height = height + 'px';\n      this.headline.style.top = '-' + height + 'px';\n      this.headline.innerHTML = this.pig.settings.getGroupHeadlineHTML(this.groupid);\n      this.headline.style.position = 'absolute';\n    }\n  };\n\n  /**\n   * Loads this group into the DOM.\n   */\n  ProgressiveGroup.prototype.load = function() {\n    if (!this.existsOnPage) {\n      this.pig.container.appendChild(this.getElement());\n      this._updateStyles();\n    }\n\n    this.existsOnPage = true;\n  };\n\n  /**\n   * Unloads this group from the DOM.\n   */\n  ProgressiveGroup.prototype.hide = function() {\n    if (this.existsOnPage) {\n      this.pig.container.removeChild(this.getElement());\n    }\n\n    this.existsOnPage = false;\n  };\n\n  /**\n   * This class manages a single image. It keeps track of the image's height,\n   * width, and position in the grid. An instance of this class is associated\n   * with a single image figure, which looks like this:\n   *\n   *   <figure class=\"pig-figure\" style=\"transform: ...\">\n   *     <img class=\"pig-thumbnail pig-loaded\" src=\"/path/to/thumbnail/image.jpg\" />\n   *     <img class=\"pig-loaded\" src=\"/path/to/500px/image.jpg\" />\n   *   </figure>\n   *\n   * However, this element may or may not actually exist in the DOM. The actual\n   * DOM element may loaded and unloaded depending on where it is with respect\n   * to the viewport. This class is responsible for managing the DOM elements.\n   *\n   * This class also manages the blur-into-focus load effect.  First, the\n   * <figure> element is inserted into the page. Then, a very small thumbnail\n   * is loaded, stretched out to the full size of the image.  This pixelated\n   * image is then blurred using CSS filter: blur(). Then, the full image is\n   * loaded, with opacity:0.  Once it has loaded, it is given the `pig-loaded`\n   * class, and its opacity is set to 1.  This creates an effect where there is\n   * first a blurred version of the image, and then it appears to come into\n   * focus.\n   *\n   * @param {array} singleImageData - An array of metadata about each image to\n   *                                  include in the grid.\n   * @param {string} singleImageData[0].filename - The filename of the image.\n   * @param {string} singleImageData[0].aspectRatio - The aspect ratio of the\n   *                                                  image.\n   * @param {object} group - The group this image belongs to.\n   */\n  function ProgressiveImage(singleImageData, index, pig, group) {\n    // Global State\n    this.existsOnPage = false; // True if the element exists on the page.\n\n    // Instance information\n    this.aspectRatio = singleImageData.aspectRatio;  // Aspect Ratio\n    this.filename = singleImageData.filename;  // Filename\n    this.index = index;  // The index in the list of images\n\n    // The Pig instance\n    this.pig = pig;\n\n    // The group the image belongs to\n    this.group = group;\n\n    this.classNames = {\n      figure: pig.settings.classPrefix + '-figure',\n      thumbnail: pig.settings.classPrefix + '-thumbnail',\n      loaded: pig.settings.classPrefix + '-loaded'\n    };\n\n    return this;\n  }\n\n  /**\n   * Returns the index of the group this image belongs to.\n   */\n  ProgressiveImage.prototype.getGroupIndex = function() {\n    return this.group.getIndex();\n  };\n\n  /**\n   * Returns the group this image belongs to.\n   */\n  ProgressiveImage.prototype.getGroup = function() {\n    return this.group;\n  };\n\n  /**\n   * Updates the visibility of this image.\n   *\n   * @param {number} miny - The top of the viewport.\n   * @param {number} maxy - The bottom of the viewport.\n   */\n  ProgressiveImage.prototype.updateVisibility = function(miny, maxy) {\n    if (this.style.translateY <= maxy && this.style.translateY + this.style.height >= miny) {\n      this.load();\n    } else {\n      this.hide();\n    }\n  };\n\n  /**\n   * Load the image element associated with this ProgressiveImage into the DOM.\n   *\n   * This function will append the figure into the DOM, create and insert the\n   * thumbnail, and create and insert the full image.\n   */\n  ProgressiveImage.prototype.load = function() {\n    // Create a new image element, and insert it into the DOM. It doesn't\n    // matter the order of the figure elements, because all positioning\n    // is done using transforms.\n    this.existsOnPage = true;\n    this._updateStyles();\n    this.group.getElement().appendChild(this.getElement());\n\n    // We run the rest of the function in a 100ms setTimeout so that if the\n    // user is scrolling down the page very fast and hide() is called within\n    // 100ms of load(), the hide() function will set this.existsOnPage to false\n    // and we can exit.\n    setTimeout(function() {\n\n      // The image was hidden very quickly after being loaded, so don't bother\n      // loading it at all.\n      if (!this.existsOnPage) {\n        return;\n      }\n\n      // Show thumbnail\n      if (!this.thumbnail) {\n        this.thumbnail = new Image();\n        this.thumbnail.src = this.pig.settings.urlForSize(this.filename, this.pig.settings.thumbnailSize);\n        this.thumbnail.className = this.classNames.thumbnail;\n        this.thumbnail.onload = function() {\n\n          // We have to make sure thumbnail still exists, we may have already been\n          // deallocated if the user scrolls too fast.\n          if (this.thumbnail) {\n            this.thumbnail.className += ' ' + this.classNames.loaded;\n          }\n        }.bind(this);\n\n        this.getElement().appendChild(this.thumbnail);\n      }\n\n      // Show full image\n      if (!this.fullImage) {\n        this.fullImage = new Image();\n        this.fullImage.src = this.pig.settings.urlForSize(this.filename, this.pig.settings.getImageSize(this.pig.lastWindowWidth));\n        this.fullImage.onload = function() {\n\n          // We have to make sure fullImage still exists, we may have already been\n          // deallocated if the user scrolls too fast.\n          if (this.fullImage) {\n            this.fullImage.className += ' ' + this.classNames.loaded;\n          }\n        }.bind(this);\n\n        this.getElement().appendChild(this.fullImage);\n      }\n    }.bind(this), 100);\n  };\n\n  /**\n   * Removes the figure from the DOM, removes the thumbnail and full image, and\n   * deletes the this.thumbnail and this.fullImage properties off of the\n   * ProgressiveImage object.\n   */\n  ProgressiveImage.prototype.hide = function() {\n    // Remove the images from the element, so that if a user is scrolling super\n    // fast, we won't try to load every image we scroll past.\n    if (this.getElement()) {\n      if (this.thumbnail) {\n        this.thumbnail.src = '';\n        this.getElement().removeChild(this.thumbnail);\n        delete this.thumbnail;\n      }\n\n      if (this.fullImage) {\n        this.fullImage.src = '';\n        this.getElement().removeChild(this.fullImage);\n        delete this.fullImage;\n      }\n    }\n\n    // Remove the image from the DOM.\n    if (this.existsOnPage) {\n      this.group.getElement().removeChild(this.getElement());\n    }\n\n    this.existsOnPage = false;\n  };\n\n  /**\n   * Get the DOM element associated with this ProgressiveImage. We default to\n   * using this.element, and we create it if it doesn't exist.\n   *\n   * @returns {HTMLElement} The DOM element associated with this instance.\n   */\n  ProgressiveImage.prototype.getElement = function() {\n    if (!this.element) {\n      this.element = document.createElement(this.pig.settings.figureTagName);\n      this.element.className = this.classNames.figure;\n      this._updateStyles();\n    }\n\n    return this.element;\n  };\n\n  /**\n   * Updates the style attribute to reflect this style property on this object.\n   */\n  ProgressiveImage.prototype._updateStyles = function() {\n    this.getElement().style.transition = this.style.transition;\n    this.getElement().style.width = this.style.width + 'px';\n    this.getElement().style.height = this.style.height + 'px';\n    this.getElement().style.transform = (\n      'translate3d(' + this.style.translateX + 'px,' +\n        this.style.translateY + 'px, 0)');\n  };\n\n  // Export Pig into the global scope.\n  if (typeof define === 'function' && define.amd) {\n    define(Pig);\n  } else if (typeof module !== 'undefined' && module.exports) {\n    module.exports = Pig;\n  } else {\n    global.Pig = Pig;\n  }\n\n}(this));\n"
  },
  {
    "path": "src/reducers/albumsReducer.js",
    "content": "export default function reducer(\n  state = {\n    albumsUserList: [],\n    fetchingAlbumsUserList: false,\n    fetchedAlbumsUserList: false,\n\n    albumsUser: {},\n    fetchingAlbumsUser: false,\n    fetchedAlbumsUser: false,\n\n    albumsPeople: [],\n    fetchingAlbumsPeople: false,\n    fetchedAlbumsPeople: false,\n\n    albumsAuto: [],\n    fetchingAlbumsAuto: false,\n    fetchedAlbumsAuto: false,\n\n    generatingAlbumsAuto: false,\n    generatedAlbumsAuto: false,\n\n    albumsAutoList: [],\n    fetchingAlbumsAutoList: false,\n    fetchedAlbumsAutoList: false,\n\n    albumsAutoGalleries: {},\n    fetchingAlbumsAutoGalleries: false,\n    fetchedAlbumsAutoGalleries: false,\n\n    albumsDateList: [],\n    fetchingAlbumsDateList: false,\n    fetchedAlbumsDateList: false,\n\n    albumsDatePhotoHashList: [],\n    fetchingAlbumsDatePhotoHashList: false,\n    fetchedAlbumsDatePhotoHashList: false,\n    idx2hash: [],\n\n    albumsDateGalleries: {},\n    fetchingAlbumsDateGalleries: false,\n    fetchedAlbumsDateGalleries: false,\n\n    albumsThingList: [],\n    fetchingAlbumsThingList: false,\n    fetchedAlbumsThingList: false,\n\n    albumsPlaceList: [],\n    albumsPlaceListGroupedByGeolocationLevel: {},\n    fetchingAlbumsPlaceList: false,\n    fetchedAlbumsPlaceList: false,\n\n    albumsPlace: {},\n    fetchingAlbumsPlace: false,\n    fetchedAlbumsPlace: false,\n\n    albumsSharedToMe: [],\n    fetchingAlbumsSharedToMe: false,\n    fetchedAlbumsSharedToMe: false,\n\n    albumsSharedFromMe: [],\n    fetchingAlbumsSharedFromMe: false,\n    fetchedAlbumsSharedFromMe: false,\n\n    error: null\n  },\n  action\n) {\n  switch (action.type) {\n\n\n    case \"FETCH_ALBUMS_SHARED_TO_ME\": {\n      return { ...state, fetchingAlbumsSharedToMe: true };\n    }\n    case \"FETCH_ALBUMS_SHARED_TO_ME_FULFILLED\": {\n      return {\n        ...state,\n        fetchingAlbumsSharedToMe: false,\n        fetchedAlbumsSharedToMe: true,\n        albumsSharedToMe: action.payload\n      };\n    }\n    case \"FETCH_ALBUMS_SHARED_TO_ME_REJECTED\": {\n      return {\n        ...state,\n        fetchingAlbumsSharedToMe: false,\n        fetchedAlbumsSharedToMe: false\n      };\n    }\n\n\n    case \"FETCH_ALBUMS_SHARED_FROM_ME\": {\n      return { ...state, fetchingAlbumsSharedFromMe: true };\n    }\n    case \"FETCH_ALBUMS_SHARED_FROM_ME_FULFILLED\": {\n      console.log(action.payload)\n      return {\n        ...state,\n        fetchingAlbumsSharedFromMe: false,\n        fetchedAlbumsSharedFromMe: true,\n        albumsSharedFromMe: action.payload\n      };\n    }\n    case \"FETCH_ALBUMS_SHARED_FROM_ME_REJECTED\": {\n      return {\n        ...state,\n        fetchingAlbumsSharedFromMe: false,\n        fetchedAlbumsSharedFromMe: false\n      };\n    }\n\n\n\n    case \"FETCH_PEOPLE_ALBUMS\": {\n      return { ...state, fetchingAlbumsPeople: true };\n    }\n    case \"FETCH_PEOPLE_ALBUMS_REJECTED\": {\n      return { ...state, fetchingAlbumsPeople: false, error: action.payload };\n    }\n    case \"FETCH_PEOPLE_ALBUMS_FULFILLED\": {\n      var new_album = { ...state.albumsPeople };\n      new_album[action.payload.id] = action.payload;\n      return {\n        ...state,\n        fetchingAlbumsPeople: false,\n        fetchedAlbumsPeople: true,\n        albumsPeople: new_album\n      };\n    }\n\n    case \"FETCH_AUTO_ALBUMS\": {\n      return { ...state, fetchingAlbumsAuto: true };\n    }\n    case \"FETCH_AUTO_ALBUMS_REJECTED\": {\n      return { ...state, fetchingAlbumsAuto: false, error: action.payload };\n    }\n    case \"FETCH_AUTO_ALBUMS_FULFILLED\": {\n      return {\n        ...state,\n        fetchingAlbumsAuto: false,\n        fetchedAlbumsAuto: true,\n        albumsAuto: action.payload\n      };\n    }\n\n    case \"GENERATE_AUTO_ALBUMS\": {\n      return { ...state, generatingAlbumsAuto: true };\n    }\n    case \"GENERATE_AUTO_ALBUMS_REJECTED\": {\n      return { ...state, generatingAlbumsAuto: false, error: action.payload };\n    }\n    case \"GENERATE_AUTO_ALBUMS_FULFILLED\": {\n      return {\n        ...state,\n        generatingAlbumsAuto: false,\n        generatedAlbumsAuto: true\n      };\n    }\n\n    case \"FETCH_AUTO_ALBUMS_LIST\": {\n      return { ...state, fetchingAlbumsAutoList: true };\n    }\n    case \"FETCH_AUTO_ALBUMS_LIST_REJECTED\": {\n      return { ...state, fetchingAlbumsAutoList: false, error: action.payload };\n    }\n    case \"FETCH_AUTO_ALBUMS_LIST_FULFILLED\": {\n      return {\n        ...state,\n        fetchingAlbumsAutoList: false,\n        fetchedAlbumsAutoList: true,\n        albumsAutoList: action.payload\n      };\n    }\n\n    case \"FETCH_AUTO_ALBUMS_RETRIEVE\": {\n      return { ...state, fetchingAlbumsAutoGalleries: true };\n    }\n    case \"FETCH_AUTO_ALBUMS_RETRIEVE_REJECTED\": {\n      return {\n        ...state,\n        fetchingAlbumsAutoGalleries: false,\n        error: action.payload\n      };\n    }\n    case \"FETCH_AUTO_ALBUMS_RETRIEVE_FULFILLED\": {\n      var new_album = { ...state.albumsAutoGalleries };\n      new_album[action.payload.id] = action.payload;\n      return {\n        ...state,\n        fetchingAlbumsAutoGalleries: false,\n        fetchedAlbumsAutoGalleries: true,\n        albumsAutoGalleries: new_album\n      };\n    }\n\n    case \"FETCH_DATE_ALBUMS_LIST\": {\n      return { ...state, fetchingAlbumsDateList: true };\n    }\n    case \"FETCH_DATE_ALBUMS_LIST_REJECTED\": {\n      return { ...state, fetchingAlbumsDateList: false, error: action.payload };\n    }\n    case \"FETCH_DATE_ALBUMS_LIST_FULFILLED\": {\n      return {\n        ...state,\n        fetchingAlbumsDateList: false,\n        fetchedAlbumsDateList: true,\n        albumsDateList: action.payload\n      };\n    }\n\n    case \"FETCH_DATE_ALBUMS_PHOTO_HASH_LIST\": {\n      return { ...state, fetchingAlbumsDatePhotoHashList: true };\n    }\n    case \"FETCH_DATE_ALBUMS_PHOTO_HASH_LIST_REJECTED\": {\n      return {\n        ...state,\n        fetchingAlbumsDatePhotoHashList: false,\n        error: action.payload\n      };\n    }\n    case \"FETCH_DATE_ALBUMS_PHOTO_HASH_LIST_FULFILLED\": {\n      return {\n        ...state,\n        fetchingAlbumsDatePhotoHashList: false,\n        fetchedAlbumsDatePhotoHashList: true,\n        albumsDatePhotoHashList: action.payload\n      };\n    }\n\n    case \"SET_IDX_TO_IMAGE_HASH\": {\n      return {\n        ...state,\n        idx2hash: action.payload\n      };\n    }\n\n    case \"FETCH_DATE_ALBUMS_RETRIEVE\": {\n      return { ...state, fetchingAlbumsDateGalleries: true };\n    }\n    case \"FETCH_DATE_ALBUMS_RETRIEVE_REJECTED\": {\n      return {\n        ...state,\n        fetchingAlbumsDateGalleries: false,\n        error: action.payload\n      };\n    }\n    case \"FETCH_DATE_ALBUMS_RETRIEVE_FULFILLED\": {\n      var new_album = { ...state.albumsDateGalleries };\n      new_album[action.payload.id] = action.payload;\n      return {\n        ...state,\n        fetchingAlbumsDateGalleries: false,\n        fetchedAlbumsDateGalleries: true,\n        albumsDateGalleries: new_album\n      };\n    }\n\n    case \"FETCH_THING_ALBUMS_LIST\": {\n      return { ...state, fetchingAlbumsThingList: true };\n    }\n    case \"FETCH_THING_ALBUMS_LIST_REJECTED\": {\n      return {\n        ...state,\n        fetchingAlbumsThingList: false,\n        error: action.payload\n      };\n    }\n    case \"FETCH_THING_ALBUMS_LIST_FULFILLED\": {\n      return {\n        ...state,\n        fetchingAlbumsThingList: false,\n        fetchedAlbumsThingList: true,\n        albumsThingList: action.payload\n      };\n    }\n\n    case \"GROUP_PLACE_ALBUMS_BY_GEOLOCATION_LEVEL\": {\n      return {\n        ...state,\n        albumsPlaceListGroupedByGeolocationLevel: action.payload\n      };\n    }\n\n    case \"FETCH_PLACE_ALBUMS_LIST\": {\n      return { ...state, fetchingAlbumsPlaceList: true };\n    }\n    case \"FETCH_PLACE_ALBUMS_LIST_REJECTED\": {\n      return {\n        ...state,\n        fetchingAlbumsPlaceList: false,\n        error: action.payload\n      };\n    }\n    case \"FETCH_PLACE_ALBUMS_LIST_FULFILLED\": {\n      return {\n        ...state,\n        fetchingAlbumsPlaceList: false,\n        fetchedAlbumsPlaceList: true,\n        albumsPlaceList: action.payload\n      };\n    }\n\n    case \"FETCH_PLACE_ALBUMS\": {\n      return { ...state, fetchingAlbumsPlace: true };\n    }\n    case \"FETCH_PLACE_ALBUMS_REJECTED\": {\n      return { ...state, fetchingAlbumsPlace: false, error: action.payload };\n    }\n    case \"FETCH_PLACE_ALBUMS_FULFILLED\": {\n      return {\n        ...state,\n        fetchingAlbumsPlace: false,\n        fetchedAlbumsPlace: true,\n        albumsPlace: {\n          ...state.albumsPlace,\n          [action.payload.id]: action.payload\n        }\n      };\n    }\n\n    case \"FETCH_USER_ALBUMS_LIST\": {\n      return { ...state, fetchingAlbumsUserList: true };\n    }\n    case \"FETCH_USER_ALBUMS_LIST_REJECTED\": {\n      return { ...state, fetchingAlbumsUserList: false, error: action.payload };\n    }\n    case \"FETCH_USER_ALBUMS_LIST_FULFILLED\": {\n      return {\n        ...state,\n        fetchingAlbumsUserList: false,\n        fetchedAlbumsUserList: true,\n        albumsUserList: action.payload\n      };\n    }\n\n    case \"FETCH_USER_ALBUMS\": {\n      return { ...state, fetchingAlbumsUser: true };\n    }\n    case \"FETCH_USER_ALBUMS_REJECTED\": {\n      return { ...state, fetchingAlbumsUser: false, error: action.payload };\n    }\n    case \"FETCH_USER_ALBUMS_FULFILLED\": {\n      return {\n        ...state,\n        fetchingAlbumsUser: false,\n        fetchedAlbumsUser: true,\n        albumsUser: { ...state.albumsUser, [action.payload.id]: action.payload }\n      };\n    }\n\n    case \"TOGGLE_ALBUM_AUTO_FAVORITE\": {\n      return { ...state };\n    }\n    case \"TOGGLE_ALBUM_AUTO_FAVORITE_REJECTED\": {\n      return { ...state };\n    }\n    case \"TOGGLE_ALBUM_AUTO_FAVORITE_FULFILLED\": {\n      var new_album = { ...state.albumsAutoGalleries };\n      new_album[action.payload.id] = action.payload;\n\n      var new_album_list = [...state.albumsAutoList];\n\n      var index = -1;\n\n      for (var i = 0; i < new_album_list.length; i++) {\n        if (new_album_list[i].id === action.payload.id) {\n          index = i;\n        }\n      }\n\n      if (index !== -1) {\n        new_album_list[index] = action.payload;\n      }\n\n      return {\n        ...state,\n        fetchingAlbumsAutoGalleries: false,\n        fetchedAlbumsAutoGalleries: true,\n        albumsAutoGalleries: new_album,\n        albumsAutoList: new_album_list\n      };\n    }\n\n    default: {\n      return { ...state };\n    }\n  }\n}\n\n// FETCH_AUTO_ALBUMS_LIST\n// FETCH_AUTO_ALBUMS_LIST_FULFILLED\n// FETCH_AUTO_ALBUMS_LIST_REJECTED\n\n// TOGGLE_ALBUM_AUTO_FAVORITE\n// TOGGLE_ALBUM_AUTO_FAVORITE_FULFILLED\n// TOGGLE_ALBUM_AUTO_FAVORITE_REJECTED\n"
  },
  {
    "path": "src/reducers/authReducer.js",
    "content": "import jwtDecode from 'jwt-decode'\nimport * as auth from '../actions/authActions'\n\n\n\nconst initialState = {\n    access: undefined,\n    refresh: undefined,\n    errors: {},\n}\n\nexport default (state=initialState, action) => {\n    switch(action.type) {\n        case \"LOGIN_FULFILLED\": \n            return {\n            access: {\n                token: action.payload.access,\n                ...jwtDecode(action.payload.access)\n            },\n            refresh: {\n                token: action.payload.refresh,\n                ...jwtDecode(action.payload.refresh)\n            },\n            errors: {}\n        }\n        case \"LOGIN_REJECTED\": \n            return {\n            ...state,\n            errors: action.payload.response||{non_field_errors:action.payload.message}\n        }\n        case \"REFRESH_ACCESS_TOKEN_FULFILLED\": \n            return {\n            ...state,\n            access: {\n                token: action.payload.access,\n                ...jwtDecode(action.payload.access)\n            },\n            errors: {}\n        }\n\n        case auth.LOGIN_SUCCESS:\n            return {\n            access: {\n                token: action.payload.access,\n                ...jwtDecode(action.payload.access)\n            },\n            refresh: {\n                token: action.payload.refresh,\n                ...jwtDecode(action.payload.refresh)\n            },\n            errors: {}\n        }\n        case auth.TOKEN_RECEIVED:\n            return {\n            ...state,\n            access: {\n                token: action.payload.access,\n                ...jwtDecode(action.payload.access)\n            }\n        }\n        case auth.LOGIN_FAILURE:\n        case auth.TOKEN_FAILURE:\n            return {\n            access: undefined,\n            refresh: undefined,\n            errors: \n                action.payload.response || \n                {'non_field_errors': action.payload.statusText},\n        }\n\n        default:\n            return state\n        }\n}\n\n\nexport function accessToken(state) {\n    if (state.access) {\n        return  state.access.token\n    }\n}\n    \nexport function refreshToken(state) {\n    if (state.refresh) {\n        return  state.refresh.token\n    }\n}\n    \nexport function isAccessTokenExpired(state) {\n    if (state.access && state.access.exp) {\n        return 1000 * state.access.exp - (new Date()).getTime() < 5000\n    }\n    return true\n}\n\nexport function isRefreshTokenExpired(state) {\n    if (state.refresh && state.refresh.exp) {\n        return 1000 * state.refresh.exp - (new Date()).getTime() < 5000\n    }\n    return true\n}\n\nexport function isAuthenticated(state) {\n    // return true\n    return !isAccessTokenExpired(state)\n}\n\nexport function errors(state) {\n    return  state.errors\n}\n\n\n\n\n\n/*\nexport default function reducer(state={\n    jwtToken: null,\n    error: null,\n  }, action) {\n\n  switch (action.type) {\n  \tcase \"LOGIN_FULFILLED\": {\n  \t\treturn {...state, jwtToken: 'JWT '+action.payload}\n  \t}\n\n    case \"LOGOUT\": {\n      return { jwtToken: null}      \n    }\n\n    default: {\n      return {...state}\n    }\n  }\n}\n*/\n\n"
  },
  {
    "path": "src/reducers/facesReducer.js",
    "content": "export default function reducer(\n  state = {\n    faces: [],\n    fetching: false,\n    fetched: false,\n\n    labeledFaces: [],\n    fetchingLabeledFaces: false,\n    fetchedLabeledFaces: false,\n\n    inferredFaces: [],\n    fetchingInferredFaces: false,\n    fetchedInferredFaces: false,\n\n    facesList: [],\n    fetchingFacesList: false,\n    fetchedFacesList: false,\n\n    labeledFacesList: [],\n    fetchingLabeledFacesList: false,\n    fetchedLabeledFacesList: false,\n\n    inferredFacesList: [],\n    fetchingInferredFacesList: false,\n    fetchedInferredFacesList: false,\n\n    faceToLabel: {},\n    fetchingFaceToLabel: false,\n    fetchedFaceToLabel: false,\n\n    facesVis: [],\n    training: false,\n    trained: false,\n\n    clustering: false,\n    clustered: false,\n\n    error: null\n  },\n  action\n) {\n  switch (action.type) {\n    // all faces\n    case \"FETCH_FACES\": {\n      return { ...state, fetching: true };\n    }\n    case \"FETCH_FACES_REJECTED\": {\n      return { ...state, fetching: false, error: action.payload };\n    }\n    case \"FETCH_FACES_FULFILLED\": {\n      return {\n        ...state,\n        fetching: false,\n        fetched: true,\n        faces: action.payload\n      };\n    }\n\n    // labeled faces\n    case \"FETCH_LABELED_FACES\": {\n      return { ...state, fetchingLabeledFaces: true };\n    }\n    case \"FETCH_LABELED_FACES_REJECTED\": {\n      return { ...state, fetchingLabeledFaces: false, error: action.payload };\n    }\n    case \"FETCH_LABELED_FACES_FULFILLED\": {\n      return {\n        ...state,\n        fetchingLabeledFaces: false,\n        fetchedLabeledFaces: true,\n        labeledFaces: action.payload\n      };\n    }\n\n    // inferred faces\n    case \"FETCH_INFERRED_FACES\": {\n      return { ...state, fetchingInferredFaces: true };\n    }\n    case \"FETCH_INFERRED_FACES_REJECTED\": {\n      return { ...state, fetchingInferredFaces: false, error: action.payload };\n    }\n    case \"FETCH_INFERRED_FACES_FULFILLED\": {\n      return {\n        ...state,\n        fetchingInferredFaces: false,\n        fetchedInferredFaces: true,\n        inferredFaces: action.payload\n      };\n    }\n\n    // fast list\n    case \"FETCH_FACES_LIST\": {\n      return { ...state, fetchingFacesList: true };\n    }\n    case \"FETCH_FACES_LIST_REJECTED\": {\n      return { ...state, fetchingFacesList: false, error: action.payload };\n    }\n    case \"FETCH_FACES_LIST_FULFILLED\": {\n      return {\n        ...state,\n        fetchingFacesList: false,\n        fetchedFacesList: true,\n        facesList: action.payload\n      };\n    }\n\n    // labeled faces\n    case \"FETCH_LABELED_FACES_LIST\": {\n      return { ...state, fetchingLabeledFacesList: true };\n    }\n    case \"FETCH_LABELED_FACES_LIST_REJECTED\": {\n      return {\n        ...state,\n        fetchingLabeledFacesList: false,\n        error: action.payload\n      };\n    }\n    case \"FETCH_LABELED_FACES_LIST_FULFILLED\": {\n      return {\n        ...state,\n        fetchingLabeledFacesList: false,\n        fetchedLabeledFacesList: true,\n        labeledFacesList: action.payload\n      };\n    }\n\n    // inferred faces\n    case \"FETCH_INFERRED_FACES_LIST\": {\n      return { ...state, fetchingInferredFacesList: true };\n    }\n    case \"FETCH_INFERRED_FACES_LIST_REJECTED\": {\n      return {\n        ...state,\n        fetchingInferredFacesList: false,\n        error: action.payload\n      };\n    }\n    case \"FETCH_INFERRED_FACES_LIST_FULFILLED\": {\n      return {\n        ...state,\n        fetchingInferredFacesList: false,\n        fetchedInferredFacesList: true,\n        inferredFacesList: action.payload\n      };\n    }\n\n    // mass labeling faces\n    case \"SET_FACES_PERSON_LABEL_FULFILLED\": {\n      const justLabeledFaceIDs = action.payload.map(face => face.id);\n\n      var newInferredFacesList = state.inferredFacesList.filter(\n        face => !justLabeledFaceIDs.includes(face.id)\n      );\n      var newLabeledFacesList = state.labeledFacesList.filter(\n        face => !justLabeledFaceIDs.includes(face.id)\n      );\n\n      action.payload.forEach(justLabeledFace => {\n        newLabeledFacesList.push(justLabeledFace);\n      });\n\n      return {\n        ...state,\n        inferredFacesList: newInferredFacesList,\n        labeledFacesList: newLabeledFacesList\n      };\n    }\n\n    // mass labeling faces\n    case \"DELETE_FACES_FULFILLED\": {\n      const justDeletedFaces = action.payload;\n      var newInferredFacesList = state.inferredFacesList.filter(\n        face => !justDeletedFaces.includes(face.id)\n      );\n      var newLabeledFacesList = state.labeledFacesList.filter(\n        face => !justDeletedFaces.includes(face.id)\n      );\n\n      return {\n        ...state,\n        inferredFacesList: newInferredFacesList,\n        labeledFacesList: newLabeledFacesList\n      };\n    }\n\n    //face to label\n    case \"FETCH_FACE_TO_LABEL\": {\n      return { ...state, fetchingFaceToLabel: true };\n    }\n    case \"FETCH_FACE_TO_LABEL_REJECTED\": {\n      return { ...state, fetchingFaceToLabel: false, error: action.payload };\n    }\n    case \"FETCH_FACE_TO_LABEL_FULFILLED\": {\n      return {\n        ...state,\n        fetchingFaceToLabel: false,\n        fetchedFaceToLabel: true,\n        faceToLabel: action.payload\n      };\n    }\n\n    case \"LOAD_FACE_TO_LABEL\": {\n      return { ...state, faceToLabel: action.payload };\n    }\n\n    //train faces\n    case \"TRAIN_FACES\": {\n      return { ...state, training: true };\n    }\n    case \"TRAIN_FACES_REJECTED\": {\n      return { ...state, training: false, error: action.payload };\n    }\n    case \"TRAIN_FACES_FULFILLED\": {\n      return {\n        ...state,\n        training: false,\n        trained: true,\n        facesVis: action.payload\n      };\n    }\n\n    //train faces\n    case \"CLUSTER_FACES\": {\n      return { ...state, clustering: true };\n    }\n    case \"CLUSTER_FACES_REJECTED\": {\n      return { ...state, clustering: false, error: action.payload };\n    }\n    case \"CLUSTER_FACES_FULFILLED\": {\n      return {\n        ...state,\n        clustering: false,\n        clustered: true,\n        facesVis: action.payload\n      };\n    }\n\n    //delete face\n    case \"DELETE_FACE\": {\n      return {\n        ...state,\n        faces: state.faces.filter(element => element.id !== action.payload)\n      };\n    }\n\n    default: {\n      return { ...state };\n    }\n  }\n}\n"
  },
  {
    "path": "src/reducers/index.js",
    "content": "import { combineReducers } from \"redux\"\nimport { routerReducer } from 'react-router-redux'\nimport {reducer as notificationsReducer} from 'reapop'\n\nimport people from \"./peopleReducer\"\nimport faces from \"./facesReducer\"\nimport albums from './albumsReducer'\nimport util from './utilReducer'\nimport photos from './photosReducer'\n//import auth from './authReducer'\nimport auth, * as fromAuth from './authReducer'\nimport search from './searchReducer'\nimport ui from './uiReducer'\nimport pub from './publicReducer'\nimport user from './userReducer'\n\nconst appReducer = combineReducers({\n  people,\n  faces,\n  albums,\n  util,\n  photos,\n  auth,\n  search,\n  routerReducer,\n  ui,\n  pub,\n  user,\n  notifications: notificationsReducer()\n  \n})\n\nexport default (state,action) => {\n\tif (action.type === 'LOGOUT') {\n\t\tstate = {}\n\t}\n\n\treturn appReducer(state,action)\n}\n\nexport const isAuthenticated =\n    state => fromAuth.isAuthenticated(state.auth)\nexport const accessToken = \n    state => fromAuth.accessToken(state.auth)\nexport const isAccessTokenExpired =\n    state => fromAuth.isAccessTokenExpired(state.auth)\nexport const refreshToken =\n    state => fromAuth.refreshToken(state.auth)\nexport const isRefreshTokenExpired =\n    state => fromAuth.isRefreshTokenExpired(state.auth)\nexport const authErrors =\n    state => fromAuth.errors(state.auth)\n\nexport function withAuth(headers) {\n  return (state) => { \n    return ({\n      ...headers,\n      'Authorization': `Bearer ${accessToken(state)}`\n    })\n  }\n}\n"
  },
  {
    "path": "src/reducers/peopleReducer.js",
    "content": "export default function reducer(state={\n    people: [],\n    socialGraph: {},\n    egoGraph: {},\n    fetching: false,\n    fetched: false,\n    adding: false,\n    added: false,\n    error: null,\n    fetchingSocialGraph: false,\n    fetchedSocialGraph: false,\n    fetchingEgoGraph: false,\n    fetchedEgoGraph: false,\n  }, action) {\n\n    switch (action.type) {\n      case \"FETCH_PEOPLE\": {\n        return {...state, fetching: true}\n      }\n      case \"FETCH_PEOPLE_REJECTED\": {\n        return {...state, fetching: false, error: action.payload}\n      }\n      case \"FETCH_PEOPLE_FULFILLED\": {\n        return {\n          ...state,\n          fetching: false,\n          fetched: true,\n          people: action.payload,\n        }\n      }\n\n\n      case \"ADD_PERSON\": {\n        return {...state, adding: true}\n      }\n      case \"ADD_PERSON_REJECTED\": {\n        return {...state, adding: false, error: action.payload}\n      }\n      case \"ADD_PERSON_FULFILLED\": {\n        const newState = Object.assign({}, state, {adding:false}, {added:true})\n        newState.people = state.people.concat(action.payload)\n        return newState\n      }\n\n\n      case \"ADD_PERSON_AND_SET_FACE_LABEL\": {\n        return {...state, adding: true}\n      }\n      case \"ADD_PERSON_AND_SET_FACE_LABEL_REJECTED\": {\n        return {...state, adding: false, error: action.payload}\n      }\n      case \"ADD_PERSON_AND_SET_FACE_LABEL_FULFILLED\": {\n        const newState = Object.assign({}, state, {adding:false}, {added:true})\n        newState.people = state.people.concat(action.payload)\n        return newState\n      }\n\n\n\n\n      case \"FETCH_SOCIAL_GRAPH\": {\n        return {...state, fetchingSocialGraph: true}\n      }\n      case \"FETCH_SOCIAL_GRAPH_REJECTED\": {\n        return {...state, fetchingSocialGraph: false, error: action.payload}\n      }\n      case \"FETCH_SOCIAL_GRAPH_FULFILLED\": {\n        return {\n          ...state,\n          fetchingSocialGraph: false,\n          fetchedSocialGraph: true,\n          socialGraph: action.payload,\n        }\n      }\n\n\n\n\n\n      case \"FETCH_EGO_GRAPH\": {\n        return {...state, fetchingEgoGraph: true}\n      }\n      case \"FETCH_EGO_GRAPH_REJECTED\": {\n        return {...state, fetchingEgoGraph: false, error: action.payload}\n      }\n      case \"FETCH_EGO_GRAPH_FULFILLED\": {\n        return {\n          ...state,\n          fetchingEgoGraph: false,\n          fetchedEgoGraph: true,\n          egoGraph: {...state.egoGraph, [action.payload.person_id]:action.payload.data},\n        }\n      }\n\n\n\n\n\n\n\n\n      default: {\n        return {...state}\n      }\n    }\n}\n\n"
  },
  {
    "path": "src/reducers/photosReducer.js",
    "content": "export default function reducer(\n  state = {\n    scanningPhotos: false,\n    scannedPhotos: false,\n    error: null,\n\n    photoDetails: {},\n    fetchingPhotoDetail: false,\n    fetchedPhotoDetail: false,\n\n    photos: {},\n    fetchedPhotos: false,\n    fetchingPhotos: false,\n\n    favoritePhotos: [],\n    fetchingFavoritePhotos: false,\n    fetchedFavoritePhotos: false,\n\n    hiddenPhotos: [],\n    fetchingHiddenPhotos: false,\n    fetchedHiddenPhotos: false,\n\n    noTimestampPhotos: [],\n    fetchingNoTimestampPhotos: false,\n    fetchedNoTimestampPhotos: false,\n\n    publicPhotos: [],\n    fetchingPublicPhotos: false,\n    fetchedPublicPhotos: false,\n\n    photosSharedToMe: [],\n    fetchingPhotosSharedToMe: false,\n    fetchedPhotosSharedToMe: false,\n\n    photosSharedFromMe: [],\n    fetchingPhotosSharedFromMe: false,\n    fetchedPhotosSharedFromMe: false,\n\n    recentlyAddedPhotos: [],\n    recentlyAddedIdx2hash: [],\n    fetchingRecentlyAddedPhotos: false,\n    fetchedRecentlyAddedPhotos: false,\n\n    generatingCaptionIm2txt: false,\n    generatedCaptionIm2txt: false,\n  },\n  action\n) {\n  switch (action.type) {\n    case \"GENERATE_PHOTO_CAPTION\": {\n      return {...state, generatingCaptionIm2txt: true}\n    }\n\n    case \"GENERATE_PHOTO_CAPTION_FULFILLED\": {\n      return {...state, generatingCaptionIm2txt: false, generatedCaptionIm2txt: true}\n    }\n\n    case \"GENERATE_PHOTO_CAPTION_REJECTED\": {\n      return {...state, generatingCaptionIm2txt: false, generatedCaptionIm2txt: false}\n    }\n\n\n\n\n\n\n    case \"FETCH_RECENTLY_ADDED_PHOTOS\" : {\n      return {...state, fetchingRecentlyAddedPhotos: true}\n    } \n\n    case \"FETCH_RECENTLY_ADDED_PHOTOS_FULFILLED\" : {\n      return {\n        ...state,\n        fetchingRecentlyAddedPhotos: false,\n        fetchedRecentlyAddedPhotos: true,\n        recentlyAddedPhotos: action.payload.res,\n        recentlyAddedIdx2hash: action.payload.idx2hash\n           \n      }\n    } \n\n    case \"FETCH_RECENTLY_ADDED_PHOTOS_REJECTED\" : {\n      return {\n        ...state,\n        fetchingRecentlyAddedPhotos: false,\n        fetchedRecentlyAddedPhotos: false\n      }\n    } \n\n\n\n\n\n\n    case \"FETCH_PHOTOS_SHARED_TO_ME\": {\n      return { ...state, fetchingPhotosSharedToMe: true };\n    }\n    case \"FETCH_PHOTOS_SHARED_TO_ME_FULFILLED\": {\n      return {\n        ...state,\n        fetchingPhotosSharedToMe: false,\n        fetchedPhotosSharedToMe: true,\n        photosSharedToMe: action.payload\n      };\n    }\n    case \"FETCH_PHOTOS_SHARED_TO_ME_REJECTED\": {\n      return {\n        ...state,\n        fetchingPhotosSharedToMe: false,\n        fetchedPhotosSharedToMe: false\n      };\n    }\n\n\n\n    case \"FETCH_PHOTOS_SHARED_FROM_ME\": {\n      return { ...state, fetchingPhotosSharedFromMe: true };\n    }\n    case \"FETCH_PHOTOS_SHARED_FROM_ME_FULFILLED\": {\n      return {\n        ...state,\n        fetchingPhotosSharedFromMe: false,\n        fetchedPhotosSharedFromMe: true,\n        photosSharedFromMe: action.payload\n      };\n    }\n    case \"FETCH_PHOTOS_SHARED_FROM_ME_REJECTED\": {\n      return {\n        ...state,\n        fetchingPhotosSharedFromMe: false,\n        fetchedPhotosSharedFromMe: false\n      };\n    }\n\n\n\n\n\n\n    case \"SCAN_PHOTOS\": {\n      return { ...state, scanningPhotos: true };\n    }\n    case \"SCAN_PHOTOS_REJECTED\": {\n      return { ...state, scanningPhotos: false, error: action.payload };\n    }\n    case \"SCAN_PHOTOS_FULFILLED\": {\n      return {\n        ...state,\n        scanningPhotos: false,\n        scannedPhotos: true\n      };\n    }\n\n    case \"FETCH_PHOTOS\": {\n      return { ...state, fetchingPhotos: true };\n    }\n    case \"FETCH_PHOTOS_REJECTED\": {\n      return { ...state, fetchingPhotos: false, error: action.payload };\n    }\n    case \"FETCH_PHOTOS_FULFILLED\": {\n      return {\n        ...state,\n        fetchingPhotos: false,\n        fetchedPhotos: true,\n        photos: action.payload\n      };\n    }\n\n    case \"FETCH_FAVORITE_PHOTOS\": {\n      return { ...state, fetchingFavoritePhotos: true };\n    }\n    case \"FETCH_FAVORITE_PHOTOS_REJECTED\": {\n      return { ...state, fetchingFavoritePhotos: false, error: action.payload };\n    }\n    case \"FETCH_FAVORITE_PHOTOS_FULFILLED\": {\n      return {\n        ...state,\n        fetchingFavoritePhotos: false,\n        fetchedFavoritePhotos: true,\n        favoritePhotos: action.payload\n      };\n    }\n\n    case \"FETCH_HIDDEN_PHOTOS\": {\n      return { ...state, fetchingHiddenPhotos: true };\n    }\n    case \"FETCH_HIDDEN_PHOTOS_REJECTED\": {\n      return { ...state, fetchingHiddenPhotos: false, error: action.payload };\n    }\n    case \"FETCH_HIDDEN_PHOTOS_FULFILLED\": {\n      return {\n        ...state,\n        fetchingHiddenPhotos: false,\n        fetchedHiddenPhotos: true,\n        hiddenPhotos: action.payload\n      };\n    }\n\n    case \"FETCH_NO_TIMESTAMP_PHOTOS\": {\n      return { ...state, fetchingNoTimestampPhotos: true };\n    }\n    case \"FETCH_NO_TIMESTAMP_PHOTOS_REJECTED\": {\n      return {\n        ...state,\n        fetchingNoTimestampPhotos: false,\n        error: action.payload\n      };\n    }\n    case \"FETCH_NO_TIMESTAMP_PHOTOS_FULFILLED\": {\n      return {\n        ...state,\n        fetchingNoTimestampPhotos: false,\n        fetchedNoTimestampPhotos: true,\n        noTimestampPhotos: action.payload\n      };\n    }\n\n    case \"FETCH_PHOTO_DETAIL\": {\n      return {\n        ...state,\n        fetchingPhotoDetail: true\n      };\n    }\n    case \"FETCH_PHOTO_DETAIL_FULFILLED\": {\n      var newPhotoDetails = { ...state.photoDetails };\n      newPhotoDetails[action.payload.image_hash] = action.payload;\n      return {\n        ...state,\n        fetchingPhotoDetail: false,\n        fetchedPhotoDetail: true,\n        photoDetails: newPhotoDetails\n      };\n    }\n    case \"FETCH_PHOTO_DETAIL_REJECTED\": {\n      return { ...state, fetchingPhotoDetail: false, error: action.payload };\n    }\n\n    case \"SET_PHOTOS_PUBLIC_FULFILLED\": {\n      var valPublic = action.payload.public;\n      var imageHashes = action.payload.image_hashes;\n      var updatedPhotos = action.payload.updatedPhotos;\n      var newPhotos = { ...state.photoDetails };\n\n      var updatedPhotosImageHashes = updatedPhotos.map(\n        photo => photo.image_hash\n      );\n\n      updatedPhotos.forEach(photo => {\n        newPhotos[[photo.image_hash]] = photo;\n      });\n\n      var newPublicPhotos = [...state.publicPhotos];\n\n      if (valPublic) {\n        updatedPhotos.forEach(photo => {\n          newPublicPhotos.push(photo);\n        });\n      } else {\n        newPublicPhotos = newPublicPhotos.filter(photo => {\n          if (updatedPhotosImageHashes.includes(photo.image_hash)) {\n            return false;\n          } else {\n            return true;\n          }\n        });\n      }\n\n      return {\n        ...state,\n        photoDetails: newPhotos,\n        publicPhotos: newPublicPhotos\n      };\n    }\n\n    case \"SET_PHOTOS_FAVORITE_FULFILLED\": {\n      var valFavorite = action.payload.favorite;\n      var imageHashes = action.payload.image_hashes;\n      var updatedPhotos = action.payload.updatedPhotos;\n      var newPhotos = { ...state.photoDetails };\n\n      var updatedPhotosImageHashes = updatedPhotos.map(\n        photo => photo.image_hash\n      );\n\n      updatedPhotos.forEach(photo => {\n        newPhotos[[photo.image_hash]] = photo;\n      });\n\n      var newFavoritePhotos = [...state.favoritePhotos];\n\n      if (valFavorite) {\n        updatedPhotos.forEach(photo => {\n          newFavoritePhotos.push(photo);\n        });\n      } else {\n        newFavoritePhotos = newFavoritePhotos.filter(photo => {\n          if (updatedPhotosImageHashes.includes(photo.image_hash)) {\n            return false;\n          } else {\n            return true;\n          }\n        });\n      }\n\n      return {\n        ...state,\n        photoDetails: newPhotos,\n        favoritePhotos: newFavoritePhotos\n      };\n    }\n\n    case \"SET_PHOTOS_HIDDEN_FULFILLED\": {\n      var valHidden = action.payload.hidden;\n      var imageHashes = action.payload.image_hashes;\n      var updatedPhotos = action.payload.updatedPhotos;\n      var newPhotos = { ...state.photoDetails };\n\n      var updatedPhotosImageHashes = updatedPhotos.map(\n        photo => photo.image_hash\n      );\n\n      updatedPhotos.forEach(photo => {\n        newPhotos[[photo.image_hash]] = photo;\n      });\n\n      var newHiddenPhotos = [...state.hiddenPhotos];\n\n      if (valFavorite) {\n        updatedPhotos.forEach(photo => {\n          newHiddenPhotos.push(photo);\n        });\n      } else {\n        newHiddenPhotos = newHiddenPhotos.filter(photo => {\n          if (updatedPhotosImageHashes.includes(photo.image_hash)) {\n            return false;\n          } else {\n            return true;\n          }\n        });\n      }\n\n      return {\n        ...state,\n        photoDetails: newPhotos,\n        hiddenPhotos: newHiddenPhotos\n      };\n    }\n\n    default: {\n      return { ...state };\n    }\n  }\n}\n"
  },
  {
    "path": "src/reducers/publicReducer.js",
    "content": "export default function reducer(\n  state = {\n    userPublicPhotos: {},\n    fetchingUserPublicPhotos: false,\n    fetchedUserPublicPhotos: false,\n\n    publicUserList: [],\n    fetchingPublicUserList: false,\n    fetchedPublicUserList: false,\n\n    error: null\n  },\n  action\n) {\n  switch (action.type) {\n    case \"FETCH_USER_PUBLIC_PHOTOS\": {\n      return {\n        ...state,\n        fetchingUserPublicPhotos: true\n      };\n    }\n    case \"FETCH_USER_PUBLIC_PHOTOS_FULFILLED\": {\n      return {\n        ...state,\n        fetchingUserPublicPhotos: false,\n        fetchedUserPublicPhotos: false,\n        userPublicPhotos: {\n          ...state.userPublicPhotos,\n          [action.payload.user]: action.payload.photos\n        }\n      };\n    }\n\n\n    case \"FETCH_PUBLIC_USER_LIST\": {\n      return {\n        ...state,\n        fetchingPublicUserList: true\n      };\n    }\n    case \"FETCH_PUBLIC_USER_LIST_FULFILLED\": {\n      return {\n        ...state,\n        fetchingPublicUserList: false,\n        fetchedPublicUserList: false,\n        publicUserList: action.payload\n      };\n    }\n\n\n\n    default: {\n      return { ...state };\n    }\n  }\n}\n"
  },
  {
    "path": "src/reducers/searchReducer.js",
    "content": "export default function reducer(state={\n    searchPhotosRes: [],\n    searchPhotosResGroupedByDate: [],\n    idx2hash:[],\n    searchPeopleRes: [],\n    searchPlaceAlbumsRes: [],\n    searchThingAlbumsRes: [],\n\n    searchingPhotos: false,\n    searchedPhotos: false,\n    searchingPeople: false,\n    searchedPeople: false,\n    searchingThingAlbums: false,\n    searchedThingAlbums: false,\n    searchingPlaceAlbums: false,\n    searchedPlaceAlbums: false,\n\n    error: null,\n    query: null,\n  }, action) {\n\n  switch (action.type) {\n    case \"SEARCH_PHOTOS_EMPTY_QUERY_ERROR\": {\n      return {...state, error:\"Search query cannot be empty!\"}\n    }\n  \tcase \"SEARCH_PHOTOS\": {\n  \t\treturn {...state, searchPhotoRes: [], searchingPhotos: true, query:action.payload}\n  \t}\n\n    case \"SEARCH_PHOTOS_REJECTED\": {\n      return { ...state, searchingPhotos: false, error: action.payload}\n    }\n\n    case \"SEARCH_RES_GROUP_BY_DATE\": {\n      return { ...state, searchPhotosResGroupedByDate: action.payload}\n    }\n\n    case \"SEARCH_RES_IDX2HASH\": {\n      return { ...state, idx2hash: action.payload}\n    }\n\n    case \"SEARCH_PHOTOS_FULFILLED\": {\n      return {\n        ...state,\n        searchingPhotos: false,\n        searchedPhotos: true,\n        searchPhotosRes: action.payload\n      }\n    }\n\n\n    case \"SEARCH_PEOPLE\": {\n  \t\treturn {...state, searchPeopleRes: [], searchingPeople: true}\n    }\n    case \"SEARCH_PEOPLE_FULFILLED\": {\n      return {\n        ...state,\n        searchingPeople: false,\n        searchedPeople: true,\n        searchPeopleRes: action.payload\n      }\n    }\n    case \"SEARCH_PEOPLE_REJECTED\": {\n      return { ...state, searchingPeople: false, error: action.payload}\n    }\n\n\n\n\n    case \"SEARCH_THING_ALBUMS\": {\n  \t\treturn {...state, searchThingAlbumsRes: [], searchingThingAlbums: true}\n    }\n    case \"SEARCH_THING_ALBUMS_FULFILLED\": {\n      return {\n        ...state,\n        searchingThingAlbums: false,\n        searchedThingAlbums: true,\n        searchThingAlbumsRes: action.payload\n      }\n    }\n    case \"SEARCH_THING_ALBUMS_REJECTED\": {\n      return { ...state, searchingPeople: false, error: action.payload}\n    }\n\n\n    case \"SEARCH_PLACE_ALBUMS\": {\n  \t\treturn {...state, searchPlaceAlbumsRes: [], searchingPlaceAlbums: true}\n    }\n    case \"SEARCH_PLACE_ALBUMS_FULFILLED\": {\n      return {\n        ...state,\n        searchingPlaceAlbums: false,\n        searchedPlaceAlbums: true,\n        searchPlaceAlbumsRes: action.payload\n      }\n    }\n    case \"SEARCH_PLACE_ALBUMS_REJECTED\": {\n      return { ...state, searchingPlaceAlbums: false, error: action.payload}\n    }\n\n\n\n    default: {\n      return {...state}\n    }\n  }\n}\n"
  },
  {
    "path": "src/reducers/uiReducer.js",
    "content": "export default function reducer(state={\n    showSidebar: true,\n    contentWidth: window.innerWidth-20,\n    gridType:'loose',\n    error: null,\n  }, action) {\n\n  switch (action.type) {\n    case \"TOGGLE_SIDEBAR\": {\n        const showSidebar = !state.showSidebar\n        const contentWidth = showSidebar ? window.innerWidth - 85 : window.innerWidth \n\n        return {...state, showSidebar: !state.showSidebar, contentWidth:contentWidth}\n    }\n\n    case \"HIDE_SIDEBAR\": {\n        return {...state, showSidebar: false}\n    }\n\n    case \"SET_GRID_TYPE\": {\n        return {...state,gridType:action.payload}\n    }\n\n    default: {\n      return {...state}\n    }\n  }\n}\n"
  },
  {
    "path": "src/reducers/userReducer.js",
    "content": "export default function reducer(\n  state = {\n    userDetails: {},\n    fetchingUserDetails: false,\n    fetchedUserDetails: false,\n\n    userSelfDetails: {},\n    fetchingUserSelfDetails: false,\n    fetchedUserSelfDetails: false,\n\n    error: null\n  },\n  action\n) {\n  switch (action.type) {\n    case \"FETCH_USER_SELF_DETAILS\": {\n      return { ...state, fetchingUserSelfDetails: true };\n    }\n    case \"FETCH_USER_SELF_DETAILS_FULFILLED\": {\n      return {\n        ...state,\n        fetchingUserSelfDetails: false,\n        fetchedUserSelfDetails: true,\n        userSelfDetails: action.payload\n      };\n    }\n    case \"FETCH_USER_SELF_DETAILS_REJECTED\": {\n      return { ...state, fetchingUserDetails: false, error: action.payload };\n    }\n\n    default: {\n      return { ...state };\n    }\n  }\n}\n"
  },
  {
    "path": "src/reducers/utilReducer.js",
    "content": "export default function reducer(\n  state = {\n\n    siteSettings: {},\n    fetchingSiteSettings: false,\n    fetchedSiteSettings: false,\n\n    countStats: {},\n    fetchingCountStats: false,\n    fetchedCountStats: false,\n\n    photoCountryCounts: {},\n    fetchingPhotoCountryCounts: false,\n    fetchedPhotoCountryCounts: false,\n\n    photoMonthCounts: [],\n    fetchingPhotoMonthCounts: false,\n    fetchedPhotoMonthCounts: false,\n\n    statusPhotoScan: { status: true },\n    statusAutoAlbumProcessing: { status: true },\n\n    generatingAutoAlbums: false,\n\n    locationClusters: [],\n    fetchingLocationClusters: false,\n    fetchedLocationClusters: false,\n\n    wordCloud: {},\n    fetchingWordCloud: false,\n    fetchedWordCloud: false,\n\n    exampleSearchTerms: [],\n    fetchingExampleSearchTerms: false,\n    fetchedExampleSearchTerms: false,\n\n    locationSunburst: { name: \"Loading...\" },\n    fetchingLocationSunburst: false,\n    fetchedLocationSunburst: false,\n\n    locationTimeline: [],\n    fetchingLocationTimeline: false,\n    fetchedLocationTimeline: false,\n\n    workerAvailability: false,\n    workerRunningJob: null,\n\n    userList: [],\n    fetchingUserList: false,\n    fetchedUserList: false,\n\n    directoryTree:[],\n    fetchingDirectoryTree:false,\n    fetchedDirectoryTree:false,\n\n    nextcloudDirectoryTree:[],\n    fetchingNextcloudDirectoryTree:false,\n    fetchedNextcloudDirectoryTree:false,\n\n    jobList: [],\n    jobCount: 0,\n    fetchingJobList: false,\n    fetchedJobList: false,\n\n    error: null\n  },\n  action\n) {\n  switch (action.type) {\n\n    case \"FETCH_JOB_LIST\": {\n      return {\n        ...state,\n        fetchingJobList: true\n      };\n    }\n    case \"FETCH_JOB_LIST_FULFILLED\": {\n      return {\n        ...state,\n        jobList: action.payload.results,\n        jobCount: action.payload.count,\n        fetchedJobList: true,\n        fetchingJobList: false\n      }\n    }\n    case \"FETCH_JOB_LIST_REJECTED\": {\n      return {\n        ...state,\n        fetchingJobList: false,\n        fetchedJobList: false\n      };\n    }\n\n\n\n\n\n\n    case \"SET_SITE_SETTINGS_FULFILLED\": {\n      return {\n        ...state,\n        siteSettings: action.payload\n      };\n    }\n\n\n\n    case \"FETCH_SITE_SETTINGS\": {\n      return { ...state, fetchingSiteSettings: true };\n    }\n    case \"FETCH_SITE_SETTINGS_FULFILLED\": {\n      return {\n        ...state,\n        fetchingSiteSettings: false,\n        fetchedSiteSettings: true,\n        siteSettings: action.payload\n      };\n    }\n    case \"FETCH_SITE_SETTINGS_REJECTED\": {\n      return {\n        ...state,\n        fetchingSiteSettings:false,\n      }\n    }\n\n\n\n    case \"FETCH_USER_LIST\": {\n      return { ...state, fetchingUserList: true };\n    }\n    case \"FETCH_USER_LIST_FULFILLED\": {\n      return {\n        ...state,\n        fetchingUserList: false,\n        fetchedUserList: true,\n        userList: action.payload\n      };\n    }\n    case \"FETCH_USER_LIST_REJECTED\": {\n      return {\n        ...state,\n        fetchingUserList:false,\n      }\n    }\n\n    case \"FETCH_DIRECTORY_TREE\": {\n      return { ...state, fetchingDirectoryTree: true };\n    }\n    case \"FETCH_DIRECTORY_TREE_FULFILLED\": {\n      return {\n        ...state,\n        fetchingDirectoryTree: false,\n        fetchedDirectoryTree: true,\n        directoryTree: action.payload\n      };\n    }\n    case \"FETCH_DIRECTORY_TREE_REJECTED\": {\n      return {\n        ...state,\n        fetchingDirectoryTree:false,\n      }\n    }\n                                          \n    case \"FETCH_NEXTCLOUD_DIRECTORY_TREE\": {\n      return { ...state, fetchingNextcloudDirectoryTree: true };\n    }\n    case \"FETCH_NEXTCLOUD_DIRECTORY_TREE_FULFILLED\": {\n      return {\n        ...state,\n        fetchingNextcloudDirectoryTree: false,\n        fetchedNextcloudDirectoryTree: true,\n        nextcloudDirectoryTree: action.payload\n      };\n    }\n    case \"FETCH_NEXTCLOUD_DIRECTORY_TREE_REJECTED\": {\n      return {\n        ...state,\n        fetchingNextcloudDirectoryTree:false,\n        fetchedNextcloudDirectoryTree: false,\n      }\n    }\n\n    case \"SET_WORKER_AVAILABILITY\": {\n      return { ...state, workerAvailability: action.payload };\n    }\n    case \"SET_WORKER_RUNNING_JOB\": {\n      return { ...state, workerRunningJob: action.payload };\n    }\n\n    case \"GENERATE_EVENT_ALBUMS\": {\n      return { ...state, generatingAutoAlbums: true };\n    }\n    case \"GENERATE_EVENT_ALBUMS_REJECTED\": {\n      return { ...state, generatingAutoAlbums: false, error: action.payload };\n    }\n    case \"GENERATE_EVENT_ALBUMS_FULFILLED\": {\n      return {\n        ...state,\n        generatingAutoAlbums: false\n      };\n    }\n\n    case \"FETCH_LOCATION_TIMELINE\": {\n      return { ...state, fetchingLocationTimeline: true };\n    }\n    case \"FETCH_LOCATION_TIMELINE_REJECTED\": {\n      return {\n        ...state,\n        fetchingLocationTimeline: false,\n        error: action.payload\n      };\n    }\n    case \"FETCH_LOCATION_TIMELINE_FULFILLED\": {\n      return {\n        ...state,\n        fetchingLocationTimeline: false,\n        fetchedLocationTimeline: true,\n        locationTimeline: action.payload\n      };\n    }\n\n    case \"FETCH_LOCATION_SUNBURST\": {\n      return { ...state, fetchingLocationSunburst: true };\n    }\n    case \"FETCH_LOCATION_SUNBURST_REJECTED\": {\n      return {\n        ...state,\n        fetchingLocationSunburst: false,\n        error: action.payload\n      };\n    }\n    case \"FETCH_LOCATION_SUNBURST_FULFILLED\": {\n      return {\n        ...state,\n        fetchingLocationSunburst: false,\n        fetchedLocationSunburst: true,\n        locationSunburst: action.payload\n      };\n    }\n\n    case \"FETCH_EXAMPLE_SEARCH_TERMS\": {\n      return { ...state, fetchingExampleSearchTerms: true };\n    }\n    case \"FETCH_EXAMPLE_SEARCH_TERMS_REJECTED\": {\n      return {\n        ...state,\n        fetchingExampleSearchTerms: false,\n        error: action.payload\n      };\n    }\n    case \"FETCH_EXAMPLE_SEARCH_TERMS_FULFILLED\": {\n      return {\n        ...state,\n        fetchingExampleSearchTerms: false,\n        fetchedExampleSearchTerms: true,\n        exampleSearchTerms: action.payload\n      };\n    }\n\n    case \"FETCH_COUNT_STATS\": {\n      return { ...state, fetchingCountStats: true };\n    }\n    case \"FETCH_COUNT_STATS_REJECTED\": {\n      return { ...state, fetchingCountStats: false, error: action.payload };\n    }\n    case \"FETCH_COUNT_STATS_FULFILLED\": {\n      return {\n        ...state,\n        fetchingCountStats: false,\n        fetchedCountStats: true,\n        countStats: action.payload\n      };\n    }\n\n    case \"FETCH_LOCATION_CLUSTERS\": {\n      return { ...state, fetchingLocationClusters: true };\n    }\n    case \"FETCH_LOCATION_CLUSTERS_REJECTED\": {\n      return {\n        ...state,\n        fetchingLocationClusters: false,\n        error: action.payload\n      };\n    }\n    case \"FETCH_LOCATION_CLUSTERS_FULFILLED\": {\n      return {\n        ...state,\n        fetchingLocationClusters: false,\n        fetchedLocationClusters: true,\n        locationClusters: action.payload\n      };\n    }\n\n    case \"FETCH_PHOTO_COUNTRY_COUNTS\": {\n      return { ...state, fetchingPhotoCountryCounts: true };\n    }\n    case \"FETCH_PHOTO_COUNTRY_COUNTS_REJECTED\": {\n      return {\n        ...state,\n        fetchingPhotoCountryCounts: false,\n        error: action.payload\n      };\n    }\n    case \"FETCH_PHOTO_COUNTRY_COUNTS_FULFILLED\": {\n      return {\n        ...state,\n        fetchingPhotoCountryCounts: false,\n        fetchedPhotoCountryCounts: true,\n        photoCountryCounts: action.payload\n      };\n    }\n\n    case \"FETCH_PHOTO_MONTH_COUNTS\": {\n      return { ...state, fetchingPhotoMonthCounts: true };\n    }\n    case \"FETCH_PHOTO_MONTH_COUNTS_REJECTED\": {\n      return {\n        ...state,\n        fetchingPhotoMonthCounts: false,\n        error: action.payload\n      };\n    }\n    case \"FETCH_PHOTO_MONTH_COUNTS_FULFILLED\": {\n      return {\n        ...state,\n        fetchingPhotoMonthCounts: false,\n        fetchedPhotoMonthCounts: true,\n        photoMonthCounts: action.payload\n      };\n    }\n\n    case \"FETCH_WORDCLOUD\": {\n      return { ...state, fetchingWordCloud: true };\n    }\n    case \"FETCH_WORDCLOUD_REJECTED\": {\n      return { ...state, fetchingWordCloud: false, error: action.payload };\n    }\n    case \"FETCH_WORDCLOUD_FULFILLED\": {\n      return {\n        ...state,\n        fetchingWordCloud: false,\n        fetchedWordCloud: true,\n        wordCloud: action.payload\n      };\n    }\n\n    case \"FETCH_PHOTO_SCAN_STATUS\": {\n      return { ...state, fetchingPhotoScanStatus: true };\n    }\n    case \"FETCH_PHOTO_SCAN_STATUS_REJECTED\": {\n      return {\n        ...state,\n        fetchingPhotoScanStatus: false,\n        error: action.payload\n      };\n    }\n    case \"FETCH_PHOTO_SCAN_STATUS_FULFILLED\": {\n      return {\n        ...state,\n        fetchingPhotoScanStatus: false,\n        fetchedPhotoScanStatus: true,\n        statusPhotoScan: action.payload\n      };\n    }\n\n    case \"FETCH_AUTO_ALBUM_PROCESSING_STATUS\": {\n      return { ...state, fetchingAutoAlbumProcessingStatus: true };\n    }\n    case \"FETCH_AUTO_ALBUM_PROCESSING_STATUS_REJECTED\": {\n      return {\n        ...state,\n        fetchingAutoAlbumProcessingStatus: false,\n        error: action.payload\n      };\n    }\n    case \"FETCH_AUTO_ALBUM_PROCESSING_STATUS_FULFILLED\": {\n      return {\n        ...state,\n        fetchingAutoAlbumProcessingStatus: false,\n        fetchedAutoAlbumProcessingStatus: true,\n        statusAutoAlbumProcessing: action.payload\n      };\n    }\n\n    default: {\n      return { ...state };\n    }\n  }\n}\n\n// FETCH_LOCATION_CLUSTERS\n// FETCH_LOCATION_CLUSTERS_REJECTED\n// FETCH_LOCATION_CLUSTERS_FULFILLED\n"
  },
  {
    "path": "src/registerServiceWorker.js",
    "content": "// In production, we register a service worker to serve assets from local cache.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on the \"N+1\" visit to a page, since previously\n// cached resources are updated in the background.\n\n// To learn more about the benefits of this model, read https://goo.gl/KwvDNy.\n// This link also includes instructions on opting out of this behavior.\n\nconst isLocalhost = Boolean(\n  window.location.hostname === 'localhost' ||\n    // [::1] is the IPv6 localhost address.\n    window.location.hostname === '[::1]' ||\n    // 127.0.0.1/8 is considered localhost for IPv4.\n    window.location.hostname.match(\n      /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n    )\n);\n\nexport default function register() {\n  if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n    // The URL constructor is available in all browsers that support SW.\n    const publicUrl = new URL(process.env.PUBLIC_URL, window.location);\n    if (publicUrl.origin !== window.location.origin) {\n      // Our service worker won't work if PUBLIC_URL is on a different origin\n      // from what our page is served on. This might happen if a CDN is used to\n      // serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374\n      return;\n    }\n\n    window.addEventListener('load', () => {\n      const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n      if (!isLocalhost) {\n        // Is not local host. Just register service worker\n        registerValidSW(swUrl);\n      } else {\n        // This is running on localhost. Lets check if a service worker still exists or not.\n        checkValidServiceWorker(swUrl);\n      }\n    });\n  }\n}\n\nfunction registerValidSW(swUrl) {\n  navigator.serviceWorker\n    .register(swUrl)\n    .then(registration => {\n      registration.onupdatefound = () => {\n        const installingWorker = registration.installing;\n        installingWorker.onstatechange = () => {\n          if (installingWorker.state === 'installed') {\n            if (navigator.serviceWorker.controller) {\n              // At this point, the old content will have been purged and\n              // the fresh content will have been added to the cache.\n              // It's the perfect time to display a \"New content is\n              // available; please refresh.\" message in your web app.\n              console.log('New content is available; please refresh.');\n            } else {\n              // At this point, everything has been precached.\n              // It's the perfect time to display a\n              // \"Content is cached for offline use.\" message.\n              console.log('Content is cached for offline use.');\n            }\n          }\n        };\n      };\n    })\n    .catch(error => {\n      console.error('Error during service worker registration:', error);\n    });\n}\n\nfunction checkValidServiceWorker(swUrl) {\n  // Check if the service worker can be found. If it can't reload the page.\n  fetch(swUrl)\n    .then(response => {\n      // Ensure service worker exists, and that we really are getting a JS file.\n      if (\n        response.status === 404 ||\n        response.headers.get('content-type').indexOf('javascript') === -1\n      ) {\n        // No service worker found. Probably a different app. Reload the page.\n        navigator.serviceWorker.ready.then(registration => {\n          registration.unregister().then(() => {\n            window.location.reload();\n          });\n        });\n      } else {\n        // Service worker found. Proceed as normal.\n        registerValidSW(swUrl);\n      }\n    })\n    .catch(() => {\n      console.log(\n        'No internet connection found. App is running in offline mode.'\n      );\n    });\n}\n\nexport function unregister() {\n  if ('serviceWorker' in navigator) {\n    navigator.serviceWorker.ready.then(registration => {\n      registration.unregister();\n    });\n  }\n}\n"
  },
  {
    "path": "src/routerExample.js",
    "content": "import React from 'react'\nimport {\n  BrowserRouter as Router,\n  Route,\n  Link\n} from 'react-router-dom'\n\nconst BasicExample = () => (\n  <Router>\n    <div>\n      <ul>\n        <li><Link to=\"/\">Home</Link></li>\n        <li><Link to=\"/about\">About</Link></li>\n        <li><Link to=\"/topics\">Topics</Link></li>\n      </ul>\n\n      <hr/>\n\n      <Route exact path=\"/\" component={Home}/>\n      <Route path=\"/about\" component={About}/>\n      <Route path=\"/topics\" component={Topics}/>\n    </div>\n  </Router>\n)\n\nconst Home = () => (\n  <div>\n    <h2>Home</h2>\n  </div>\n)\n\nconst About = () => (\n  <div>\n    <h2>About</h2>\n  </div>\n)\n\nconst Topics = ({ match }) => (\n  <div>\n    <h2>Topics</h2>\n    <ul>\n      <li>\n        <Link to={`${match.url}/rendering`}>\n          Rendering with React\n        </Link>\n      </li>\n      <li>\n        <Link to={`${match.url}/components`}>\n          Components\n        </Link>\n      </li>\n      <li>\n        <Link to={`${match.url}/props-v-state`}>\n          Props v. State\n        </Link>\n      </li>\n    </ul>\n\n    <Route path={`${match.url}/:topicId`} component={Topic}/>\n    <Route exact path={match.url} render={() => (\n      <h3>Please select a topic.</h3>\n    )}/>\n  </div>\n)\n\nconst Topic = ({ match }) => (\n  <div>\n    <h3>{match.params.topicId}</h3>\n  </div>\n)\n\nexport default BasicExample"
  },
  {
    "path": "src/routes/index.js",
    "content": "import React               from 'react';  \nimport { Route, Redirect } from 'react-router-dom'  \n\nimport {Sidebar} from './layouts/sidebar'\n\nimport {AlbumPeopleGallery, AlbumAutoGallery} from './components/album'\n\nimport {Statistics} from './layouts/statistics'\nimport {FacesDashboard} from './layouts/facesDashboard'\nimport {PeopleDashboard} from './layouts/peopleDashboard'\nimport {AlbumAuto} from './layouts/albumAuto'\nimport {AlbumPeople} from './layouts/albumPeople'\n\nimport {AlbumsAutoListCardView} from './layouts/albumsAutoListCardView'\n\nimport {AlbumAutoGalleryView} from './layouts/albumAutoGalleryView'\nimport {AlbumDateGalleryView} from './layouts/albumDateGalleryView'\nimport {AlbumAutoMonths} from './layouts/albumAutoMonths'\nimport {AlbumDateMonths} from './layouts/albumDateMonths'\n\nimport {AllPhotosView} from './layouts/allPhotosView'\nimport {AllPhotosGroupedByDate} from './layouts/allPhotosGroupedByDate'\n\nimport {FavoriteAutoAlbumsView} from './layouts/favoriteAutoAlbums'\n\nimport EventCountMonthGraph from './components/eventCountMonthGraph'\n\nimport {ListExample} from './layouts/RVListExample'\n\nimport {PhotosListCardView} from './layouts/allPhotosViewRV'\nimport {ChartyPhotosScrollbar} from './components/chartyPhotosScrollbar'\n\nimport {AllPhotosViewLL} from './layouts/allPhotosViewLL'\n\nimport {LoginPage} from './layouts/loginPage'\n\n\n\nexport default function configRoutes() {  \n  return (\n    <div>\n      <Navigation />\n      <Route exact path=\"/\" component={AllPhotosViewLL} />\n      <Route path=\"/login\" component={loginPage} />\n      <AuthenticatedRoute path=\"/photos\" component={allPhotosGroupedByDate} />\n    </div>\n  );\n}\n\nconst AuthenticatedRoute = ({ component: Component, ...rest }) => (  \n  <Route {...rest} render={props => (\n    localStorage.getItem('phoenixAuthToken') ? (\n      <Component {...props}/>\n    ) : (\n      <Redirect to={{\n        pathname: '/sign_in',\n        state: { from: props.location }\n      }}/>\n    )\n  )}/>\n)"
  },
  {
    "path": "src/store.js",
    "content": "import { applyMiddleware, createStore } from 'redux';\nimport promise from \"redux-promise-middleware\";\nimport thunk from \"redux-thunk\"\nimport { createLogger } from \"redux-logger\";\nimport storage from 'redux-persist/es/storage'\n// import { apiMiddleware } from 'redux-api-middleware';\nimport { createFilter   } from 'redux-persist-transform-filter';\nimport { persistReducer, persistStore } from 'redux-persist'\nimport rootReducer from \"./reducers\";\nimport history from './history'\nimport { ConnectedRouter, routerReducer, routerMiddleware, push } from 'react-router-redux'\nimport apiMiddleware from './middleware';\n\n//const middleware = applyMiddleware(  thunk,  createLogger(), apiMiddleware, routerMiddleware(history) );\n//export default createStore(reducer, middleware);\n\n\n\n\nconst configureStore = (history) => {\n    const persistedFilter = createFilter(\n        'auth', ['access', 'refresh']);\n\n    const reducer = persistReducer(\n        {\n            key: 'polls',\n            storage: storage,\n            whitelist: ['auth'],\n            transforms: [persistedFilter]\n        },\n        rootReducer)\n\n    const store = createStore(\n        reducer, {},\n        applyMiddleware(  \n            thunk,  \n            createLogger(), \n            // apiMiddleware, \n            routerMiddleware(history) )\n    )\n\n    persistStore(store)\n\n    return store\n}\n\nexport default configureStore(history)\n"
  },
  {
    "path": "src/util/countryNames.js",
    "content": "export const countryNames = [\n\t\"afghanistan\",\n\t\"af\",\n\t\"aland islands\",\n\t\"ax\",\n\t\"albania\",\n\t\"al\",\n\t\"algeria\",\n\t\"dz\",\n\t\"american samoa\",\n\t\"as\",\n\t\"andorra\",\n\t\"ad\",\n\t\"angola\",\n\t\"ao\",\n\t\"anguilla\",\n\t\"ai\",\n\t\"antigua\",\n\t\"ag\",\n\t\"argentina\",\n\t\"ar\",\n\t\"armenia\",\n\t\"am\",\n\t\"aruba\",\n\t\"aw\",\n\t\"australia\",\n\t\"au\",\n\t\"austria\",\n\t\"at\",\n\t\"azerbaijan\",\n\t\"az\",\n\t\"bahamas\",\n\t\"bs\",\n\t\"bahrain\",\n\t\"bh\",\n\t\"bangladesh\",\n\t\"bd\",\n\t\"barbados\",\n\t\"bb\",\n\t\"belarus\",\n\t\"by\",\n\t\"belgium\",\n\t\"be\",\n\t\"belize\",\n\t\"bz\",\n\t\"benin\",\n\t\"bj\",\n\t\"bermuda\",\n\t\"bm\",\n\t\"bhutan\",\n\t\"bt\",\n\t\"bolivia\",\n\t\"bo\",\n\t\"bosnia\",\n\t\"ba\",\n\t\"botswana\",\n\t\"bw\",\n\t\"bouvet island\",\n\t\"bv\",\n\t\"brazil\",\n\t\"br\",\n\t\"british virgin islands\",\n\t\"vg\",\n\t\"brunei\",\n\t\"bn\",\n\t\"bulgaria\",\n\t\"bg\",\n\t\"burkina faso\",\n\t\"bf\",\n\t\"burma\",\n\t\"mm\",\n\t\"myanmar\",\n\t\"burundi\",\n\t\"bi\",\n\t\"caicos islands\",\n\t\"tc\",\n\t\"cambodia\",\n\t\"kh\",\n\t\"cameroon\",\n\t\"cm\",\n\t\"canada\",\n\t\"ca\",\n\t\"cape verde\",\n\t\"cv\",\n\t\"cayman islands\",\n\t\"ky\",\n\t\"central african republic\",\n\t\"cf\",\n\t\"chad\",\n\t\"td\",\n\t\"chile\",\n\t\"cl\",\n\t\"china\",\n\t\"cn\",\n\t\"christmas island\",\n\t\"cx\",\n\t\"cocos islands\",\n\t\"cc\",\n\t\"colombia\",\n\t\"co\",\n\t\"comoros\",\n\t\"km\",\n\t\"congo\",\n\t\"cd\",\n\t\"congo brazzaville\",\n\t\"cg\",\n\t\"cook islands\",\n\t\"ck\",\n\t\"costa rica\",\n\t\"cr\",\n\t\"cote divoire\",\n\t\"ci\",\n\t\"croatia\",\n\t\"hr\",\n\t\"cuba\",\n\t\"cu\",\n\t\"cyprus\",\n\t\"cy\",\n\t\"czech republic\",\n\t\"cz\",\n\t\"denmark\",\n\t\"dk\",\n\t\"djibouti\",\n\t\"dj\",\n\t\"dominica\",\n\t\"dm\",\n\t\"dominican republic\",\n\t\"do\",\n\t\"ecuador\",\n\t\"ec\",\n\t\"egypt\",\n\t\"eg\",\n\t\"el salvador\",\n\t\"sv\",\n\t\"equatorial guinea\",\n\t\"gq\",\n\t\"eritrea\",\n\t\"er\",\n\t\"estonia\",\n\t\"ee\",\n\t\"ethiopia\",\n\t\"et\",\n\t\"europeanunion\",\n\t\"eu\",\n\t\"falkland islands\",\n\t\"fk\",\n\t\"faroe islands\",\n\t\"fo\",\n\t\"fiji\",\n\t\"fj\",\n\t\"finland\",\n\t\"fi\",\n\t\"france\",\n\t\"fr\",\n\t\"french guiana\",\n\t\"gf\",\n\t\"french polynesia\",\n\t\"pf\",\n\t\"french territories\",\n\t\"tf\",\n\t\"gabon\",\n\t\"ga\",\n\t\"gambia\",\n\t\"gm\",\n\t\"georgia\",\n\t\"ge\",\n\t\"germany\",\n\t\"de\",\n\t\"ghana\",\n\t\"gh\",\n\t\"gibraltar\",\n\t\"gi\",\n\t\"greece\",\n\t\"gr\",\n\t\"greenland\",\n\t\"gl\",\n\t\"grenada\",\n\t\"gd\",\n\t\"guadeloupe\",\n\t\"gp\",\n\t\"guam\",\n\t\"gu\",\n\t\"guatemala\",\n\t\"gt\",\n\t\"guinea\",\n\t\"gn\",\n\t\"guinea-bissau\",\n\t\"gw\",\n\t\"guyana\",\n\t\"gy\",\n\t\"haiti\",\n\t\"ht\",\n\t\"heard island\",\n\t\"hm\",\n\t\"honduras\",\n\t\"hn\",\n\t\"hong kong\",\n\t\"hk\",\n\t\"hungary\",\n\t\"hu\",\n\t\"iceland\",\n\t\"is\",\n\t\"india\",\n\t\"in\",\n\t\"indian ocean territory\",\n\t\"io\",\n\t\"indonesia\",\n\t\"id\",\n\t\"iran\",\n\t\"ir\",\n\t\"iraq\",\n\t\"iq\",\n\t\"ireland\",\n\t\"ie\",\n\t\"israel\",\n\t\"il\",\n\t\"italy\",\n\t\"it\",\n\t\"jamaica\",\n\t\"jm\",\n\t\"jan mayen\",\n\t\"sj\",\n\t\"svalbard\",\n\t\"japan\",\n\t\"jp\",\n\t\"jordan\",\n\t\"jo\",\n\t\"kazakhstan\",\n\t\"kz\",\n\t\"kenya\",\n\t\"ke\",\n\t\"kiribati\",\n\t\"ki\",\n\t\"kuwait\",\n\t\"kw\",\n\t\"kyrgyzstan\",\n\t\"kg\",\n\t\"laos\",\n\t\"la\",\n\t\"latvia\",\n\t\"lv\",\n\t\"lebanon\",\n\t\"lb\",\n\t\"lesotho\",\n\t\"ls\",\n\t\"liberia\",\n\t\"lr\",\n\t\"libya\",\n\t\"ly\",\n\t\"liechtenstein\",\n\t\"li\",\n\t\"lithuania\",\n\t\"lt\",\n\t\"luxembourg\",\n\t\"lu\",\n\t\"macau\",\n\t\"mo\",\n\t\"macedonia\",\n\t\"mk\",\n\t\"madagascar\",\n\t\"mg\",\n\t\"malawi\",\n\t\"mw\",\n\t\"malaysia\",\n\t\"my\",\n\t\"maldives\",\n\t\"mv\",\n\t\"mali\",\n\t\"ml\",\n\t\"malta\",\n\t\"mt\",\n\t\"marshall islands\",\n\t\"mh\",\n\t\"martinique\",\n\t\"mq\",\n\t\"mauritania\",\n\t\"mr\",\n\t\"mauritius\",\n\t\"mu\",\n\t\"mayotte\",\n\t\"yt\",\n\t\"mexico\",\n\t\"mx\",\n\t\"micronesia\",\n\t\"fm\",\n\t\"moldova\",\n\t\"md\",\n\t\"monaco\",\n\t\"mc\",\n\t\"mongolia\",\n\t\"mn\",\n\t\"montenegro\",\n\t\"me\",\n\t\"montserrat\",\n\t\"ms\",\n\t\"morocco\",\n\t\"ma\",\n\t\"mozambique\",\n\t\"mz\",\n\t\"namibia\",\n\t\"na\",\n\t\"nauru\",\n\t\"nr\",\n\t\"nepal\",\n\t\"np\",\n\t\"netherlands\",\n\t\"nl\",\n\t\"netherlandsantilles\",\n\t\"an\",\n\t\"new caledonia\",\n\t\"nc\",\n\t\"new guinea\",\n\t\"pg\",\n\t\"new zealand\",\n\t\"nz\",\n\t\"nicaragua\",\n\t\"ni\",\n\t\"niger\",\n\t\"ne\",\n\t\"nigeria\",\n\t\"ng\",\n\t\"niue\",\n\t\"nu\",\n\t\"norfolk island\",\n\t\"nf\",\n\t\"north korea\",\n\t\"kp\",\n\t\"northern mariana islands\",\n\t\"mp\",\n\t\"norway\",\n\t\"no\",\n\t\"oman\",\n\t\"om\",\n\t\"pakistan\",\n\t\"pk\",\n\t\"palau\",\n\t\"pw\",\n\t\"palestine\",\n\t\"ps\",\n\t\"panama\",\n\t\"pa\",\n\t\"paraguay\",\n\t\"py\",\n\t\"peru\",\n\t\"pe\",\n\t\"philippines\",\n\t\"ph\",\n\t\"pitcairn islands\",\n\t\"pn\",\n\t\"poland\",\n\t\"pl\",\n\t\"portugal\",\n\t\"pt\",\n\t\"puerto rico\",\n\t\"pr\",\n\t\"qatar\",\n\t\"qa\",\n\t\"reunion\",\n\t\"re\",\n\t\"romania\",\n\t\"ro\",\n\t\"russia\",\n\t\"ru\",\n\t\"rwanda\",\n\t\"rw\",\n\t\"saint helena\",\n\t\"sh\",\n\t\"saint kitts and nevis\",\n\t\"kn\",\n\t\"saint lucia\",\n\t\"lc\",\n\t\"saint pierre\",\n\t\"pm\",\n\t\"saint vincent\",\n\t\"vc\",\n\t\"samoa\",\n\t\"ws\",\n\t\"san marino\",\n\t\"sm\",\n\t\"sandwich islands\",\n\t\"gs\",\n\t\"sao tome\",\n\t\"st\",\n\t\"saudi arabia\",\n\t\"sa\",\n\t\"scotland\",\n\t\"gb sct\",\n\t\"senegal\",\n\t\"sn\",\n\t\"serbia\",\n\t\"cs\",\n\t\"serbia\",\n\t\"rs\",\n\t\"seychelles\",\n\t\"sc\",\n\t\"sierra leone\",\n\t\"sl\",\n\t\"singapore\",\n\t\"sg\",\n\t\"slovakia\",\n\t\"sk\",\n\t\"slovenia\",\n\t\"si\",\n\t\"solomon islands\",\n\t\"sb\",\n\t\"somalia\",\n\t\"so\",\n\t\"south africa\",\n\t\"za\",\n\t\"south korea\",\n\t\"kr\",\n\t\"spain\",\n\t\"es\",\n\t\"sri lanka\",\n\t\"lk\",\n\t\"sudan\",\n\t\"sd\",\n\t\"suriname\",\n\t\"sr\",\n\t\"swaziland\",\n\t\"sz\",\n\t\"sweden\",\n\t\"se\",\n\t\"switzerland\",\n\t\"ch\",\n\t\"syria\",\n\t\"sy\",\n\t\"taiwan\",\n\t\"tw\",\n\t\"tajikistan\",\n\t\"tj\",\n\t\"tanzania\",\n\t\"tz\",\n\t\"thailand\",\n\t\"th\",\n\t\"timorleste\",\n\t\"tl\",\n\t\"togo\",\n\t\"tg\",\n\t\"tokelau\",\n\t\"tk\",\n\t\"tonga\",\n\t\"to\",\n\t\"trinidad\",\n\t\"tt\",\n\t\"tunisia\",\n\t\"tn\",\n\t\"turkey\",\n\t\"tr\",\n\t\"turkmenistan\",\n\t\"tm\",\n\t\"tuvalu\",\n\t\"tv\",\n\t\"u.a.e.\",\n\t\"ae\",\n\t\"united arab emirates\",\n\t\"uganda\",\n\t\"ug\",\n\t\"ukraine\",\n\t\"ua\",\n\t\"united kingdom\",\n\t\"gb\",\n\t\"united states\",\n\t\"us\",\n\t\"america\",\n\t\"uruguay\",\n\t\"uy\",\n\t\"us minor islands\",\n\t\"um\",\n\t\"us virgin islands\",\n\t\"vi\",\n\t\"uzbekistan\",\n\t\"uz\",\n\t\"vanuatu\",\n\t\"vu\",\n\t\"vatican city\",\n\t\"va\",\n\t\"venezuela\",\n\t\"ve\",\n\t\"vietnam\",\n\t\"vn\",\n\t\"wales\",\n\t\"gb wls\",\n\t\"wallis and futuna\",\n\t\"wf\",\n\t\"western sahara\",\n\t\"eh\",\n\t\"yemen\",\n\t\"ye\",\n\t\"zambia\",\n\t\"zm\",\n\t\"zimbabwe\",\n\t\"zw\"]"
  },
  {
    "path": "src/util/fuzzyMatch.js",
    "content": "export const fuzzy_match = (str,pattern) => {\n    if (pattern.split(\"\").length > 0) {\n        pattern = pattern.split(\"\").reduce(function(a,b){ return a+\".*\"+b; });\n        return (new RegExp(pattern)).test(str);\n    } else {\n        return false\n    }\n};\n"
  },
  {
    "path": "src/util/gridUtils.js",
    "content": "import store from '../store'\nimport _ from 'lodash'\n\nstore.subscribe(listener)\n\nfunction select(state) {\n return state.ui\n}\n\nvar gridType = 'dense'\n\nfunction listener() {\n var ui = select(store.getState())\n gridType = ui.gridType\n}\n\n\nexport const calculateSharedPhotoGridCells = (groupedBySharerList,itemsPerRow) => {\n    var gridContents = []\n    var rowCursor = []\n  \n    groupedBySharerList.forEach((group)=>{\n      gridContents.push([group])\n      var currRowIdx = gridContents.length\n      _.reverse(_.sortBy(group.photos,'exif_timestamp')).forEach((photo,idx)=>{\n        if (idx === 0 ) {\n          rowCursor = []\n        }\n        if (idx > 0 && idx % itemsPerRow === 0) {\n          gridContents.push(rowCursor)\n        }\n        if (idx % itemsPerRow === 0) {\n          rowCursor = []\n        }\n        rowCursor.push(photo)\n        if (idx === group.photos.length-1) {\n          gridContents.push(rowCursor)        \n        }\n  \n      })\n    })\n    return {cellContents:gridContents}\n}\n\nexport const calculateSharedAlbumGridCells = (groupedBySharerList,itemsPerRow) => {\n    var gridContents = []\n    var rowCursor = []\n  \n    groupedBySharerList.forEach((group)=>{\n      gridContents.push([group])\n      var currRowIdx = gridContents.length\n      group.albums.forEach((album,idx)=>{\n        if (idx === 0 ) {\n          rowCursor = []\n        }\n        if (idx > 0 && idx % itemsPerRow === 0) {\n          gridContents.push(rowCursor)\n        }\n        if (idx % itemsPerRow === 0) {\n          rowCursor = []\n        }\n        rowCursor.push(album)\n        if (idx === group.albums.length-1) {\n          gridContents.push(rowCursor)        \n        }\n      })\n    })\n    return {cellContents:gridContents}\n}\n\n\nexport const calculateGridCells = (groupedByDateList,itemsPerRow) => {\n    var gridContents = []\n    var rowCursor = []\n    var hash2row = {}\n  \n    groupedByDateList.forEach((day)=>{\n      gridContents.push([day])\n      var currRowIdx = gridContents.length\n      day.photos.forEach((photo,idx)=>{\n        if (idx === 0 ) {\n          rowCursor = []\n        }\n        if (idx > 0 && idx % itemsPerRow === 0) {\n          gridContents.push(rowCursor)\n        }\n        if (idx % itemsPerRow === 0) {\n          rowCursor = []\n        }\n        rowCursor.push(photo)\n        hash2row[[photo.image_hash]] = currRowIdx\n        if (idx === day.photos.length-1) {\n          gridContents.push(rowCursor)        \n        }\n  \n      })\n    })\n    return {cellContents:gridContents,hash2row:hash2row}\n  }\n  \n\nexport const calculateGridCellSize = (gridWidth) => {\n    var numEntrySquaresPerRow\n    \n    if (gridType==='dense') {\n        if (gridWidth < 600) {\n            numEntrySquaresPerRow = 2\n        } \n        else if (gridWidth < 800) {\n            numEntrySquaresPerRow = 3\n        }\n        else if (gridWidth < 1000) {\n            numEntrySquaresPerRow = 5\n        }\n        else if (gridWidth < 1200) {\n            numEntrySquaresPerRow = 7\n        }\n        else {\n            numEntrySquaresPerRow = 8 \n        }\n    } else {\n        if (gridWidth < 600) {\n            numEntrySquaresPerRow = 1\n        } \n        else if (gridWidth < 800) {\n            numEntrySquaresPerRow = 2\n        }\n        else if (gridWidth < 1000) {\n            numEntrySquaresPerRow = 3\n        }\n        else if (gridWidth < 1200) {\n            numEntrySquaresPerRow = 4\n        }\n        else {\n            numEntrySquaresPerRow = 4\n        }\n    }\n\n\n\n    var entrySquareSize = gridWidth / numEntrySquaresPerRow\n    var numEntrySquaresPerRow = numEntrySquaresPerRow\n\n    return {\n        entrySquareSize: entrySquareSize,\n        numEntrySquaresPerRow: numEntrySquaresPerRow\n    }\n\n}\n\n\n\n\nexport const calculateFaceGridCells = (groupedByPersonList,itemsPerRow) => {\n    var gridContents = []\n    var rowCursor = []\n    var hash2row = {}\n  \n    groupedByPersonList.forEach((person)=>{\n      gridContents.push([person])\n      var currRowIdx = gridContents.length\n      person.faces.forEach((face,idx)=>{\n        if (idx === 0 ) {\n          rowCursor = []\n        }\n        if (idx > 0 && idx % itemsPerRow === 0) {\n          gridContents.push(rowCursor)\n        }\n        if (idx % itemsPerRow === 0) {\n          rowCursor = []\n        }\n        rowCursor.push(face)\n        hash2row[[face.image_hash]] = currRowIdx\n        if (idx === person.faces.length-1) {\n          gridContents.push(rowCursor)        \n        }\n  \n      })\n    })\n    return {cellContents:gridContents,hash2row:hash2row}\n  }\n\n\n\n\nexport const calculateFaceGridCellSize = (gridWidth) => {\n    var numEntrySquaresPerRow\n    if (gridWidth < 300) {\n        numEntrySquaresPerRow = 2\n    }     \n    else if (gridWidth < 600) {\n        numEntrySquaresPerRow = 3\n    } \n    else if (gridWidth < 800) {\n        numEntrySquaresPerRow = 4\n    }\n    else if (gridWidth < 1000) {\n        numEntrySquaresPerRow = 6\n    }\n    else if (gridWidth < 1200) {\n        numEntrySquaresPerRow = 8\n    }\n    else {\n        numEntrySquaresPerRow = 10\n    }\n\n    var entrySquareSize = gridWidth / numEntrySquaresPerRow\n    var numEntrySquaresPerRow = numEntrySquaresPerRow\n\n    return {\n        entrySquareSize: entrySquareSize,\n        numEntrySquaresPerRow: numEntrySquaresPerRow\n    }\n\n}\n"
  },
  {
    "path": "src/util/scrollUtils.js",
    "content": "export class ScrollSpeed {\n    clear = () => {\n      this.lastPosition = null;\n      this.delta = 0;\n    };\n    getScrollSpeed(scrollOffset) {\n      if (this.lastPosition != null) {\n        this.delta = scrollOffset - this.lastPosition;\n      }\n      this.lastPosition = scrollOffset;\n  \n      window.clearTimeout(this._timeout);\n      this._timeout = window.setTimeout(this.clear, 50);\n  \n      return this.delta;\n    }\n    clearTimeout() {\n      window.clearTimeout(this._timeout)\n    }\n  }\n  \nexport const SPEED_THRESHOLD = 500; // Tweak this to whatever feels right for your app\nexport const SCROLL_DEBOUNCE_DURATION = 250; // In milliseconds\n  "
  },
  {
    "path": "src/util/util.js",
    "content": "export const copyToClipboard = str => {\n  const el = document.createElement(\"textarea\");\n  el.value = str;\n  document.body.appendChild(el);\n  el.select();\n  document.execCommand(\"copy\");\n  document.body.removeChild(el);\n};\n"
  }
]