[
  {
    "path": ".dockerignore",
    "content": ".git\nconfig/database.yml\n.envrc\n.env\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: \"[BUG]\"\nlabels: bug\nassignees: Mehonoshin\n\n---\n\n**Describe the bug**\nA clear and concise description of what the bug is.\n\n**To Reproduce**\nSteps to reproduce the behavior:\n1. Go to '...'\n2. Click on '....'\n3. Scroll down to '....'\n4. See error\n\n**Expected behavior**\nA clear and concise description of what you expected to happen.\n\n**Screenshots**\nIf applicable, add screenshots to help explain your problem.\n\n**Server (please complete the following information):**\n - OS: [e.g. iOS]\n - Browser [e.g. chrome, safari]\n - Version [e.g. 22]\n\n**Smartphone (please complete the following information):**\n - Device: [e.g. iPhone6]\n - OS: [e.g. iOS8.1]\n - Browser [e.g. stock browser, safari]\n - Version [e.g. 22]\n\n**Additional context**\nAdd any other context about the problem here.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "content": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: enhancement\nassignees: ''\n\n---\n\n**Is your feature request related to a problem? Please describe.**\nA clear and concise description of what the problem is. Ex. I'm always frustrated when [...]\n\n**Describe the solution you'd like**\nA clear and concise description of what you want to happen.\n\n**Describe alternatives you've considered**\nA clear and concise description of any alternative solutions or features you've considered.\n\n**Additional context**\nAdd any other context or screenshots about the feature request here.\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "content": "Issue #ID\n\n### Description\n\nExplain what is the purpose of this PR\n\n### Testing steps\n\nExplain how to test your PR manually\n\n* Step 1\n* Step 2\n* Step 3\n\n### Checklist\n\nMake sure that all steps a checked before the merge\n\n- [ ] RSpec tests are passing on CI\n- [ ] `bin/cop -a` does not return any warnings\n- [ ] Tested manually\n\n### Screenshots\n\nProvide screenshots of implemented functionality\n"
  },
  {
    "path": ".gitignore",
    "content": "# See http://help.github.com/ignore-files/ for more about ignoring files.\n#\n# If you find yourself ignoring temporary files generated by your text editor\n# or operating system, you probably want to add a global ignore instead:\n#   git config --global core.excludesfile '~/.gitignore_global'\n\n# Ignore bundler config.\n/.bundle\n\n# Ignore the default SQLite database.\n/db/*.sqlite3\n/db/*.sqlite3-journal\n\n# Ignore all logfiles and tempfiles.\n/log/**\n/tmp/*\n.rvmrc\n.powrc\n.DS_Store\ncoverage/*\n\nconfig/settings.local.yml\nconfig/settings/*.local.yml\nconfig/environments/*.local.yml\n\n.envrc\npublic/uploads/*\nconfig/database.yml\n.ruby-version\n.ruby-gemset\n\n.vagrant/\nsandi_meter/**/*\n.env\n.idea/\n\ndump.rdb\n"
  },
  {
    "path": ".hound.yml",
    "content": "scss:\n  enabled: false\n\nhaml:\n  enabled: false\n\nrubocop:\n  config_file: .rubocop.yml\n"
  },
  {
    "path": ".irbrc",
    "content": "# frozen_string_literal: true\n\nrequire 'awesome_print'\nAwesomePrint.irb!\n"
  },
  {
    "path": ".rspec",
    "content": "--color\n/*--profile*/\n"
  },
  {
    "path": ".rubocop.yml",
    "content": "# These are all the cops that are enabled in the default configuration.\n\n#################### Bundler ###############################\n\nAllCops:\n  Exclude:\n    - db/**\n\nBundler/DuplicatedGem:\n  Description: 'Checks for duplicate gem entries in Gemfile.'\n  Enabled: true\n  Include:\n    - '**/*.gemfile'\n    - '**/Gemfile'\n    - '**/gems.rb'\n\nBundler/InsecureProtocolSource:\n  Description: >-\n    The source `:gemcutter`, `:rubygems` and `:rubyforge` are deprecated\n    because HTTP requests are insecure. Please change your source to\n    'https://rubygems.org' if possible, or 'http://rubygems.org' if not.\n  Enabled: true\n  Include:\n    - '**/*.gemfile'\n    - '**/Gemfile'\n    - '**/gems.rb'\n\nBundler/OrderedGems:\n  Description: >-\n    Gems within groups in the Gemfile should be alphabetically sorted.\n  Enabled: true\n  Include:\n    - '**/*.gemfile'\n    - '**/Gemfile'\n    - '**/gems.rb'\n\n#################### Gemspec ###############################\n\nGemspec/DuplicatedAssignment:\n  Description: 'An attribute assignment method calls should be listed only once in a gemspec.'\n  Enabled: true\n  Include:\n    - '**/*.gemspec'\n\nGemspec/OrderedDependencies:\n  Description: >-\n    Dependencies in the gemspec should be alphabetically sorted.\n  Enabled: true\n  Include:\n    - '**/*.gemspec'\n\nGemspec/RequiredRubyVersion:\n  Description: 'Checks that `required_ruby_version` of gemspec and `TargetRubyVersion` of .rubocop.yml are equal.'\n  Enabled: true\n  Include:\n    - '**/*.gemspec'\n\n#################### Layout ###############################\n\nLayout/AccessModifierIndentation:\n  Description: Check indentation of private/protected visibility modifiers.\n  StyleGuide: '#indent-public-private-protected'\n  Enabled: true\n\nLayout/AlignArray:\n  Description: >-\n    Align the elements of an array literal if they span more than\n    one line.\n  StyleGuide: '#align-multiline-arrays'\n  Enabled: true\n\nLayout/AlignHash:\n  Description: >-\n    Align the elements of a hash literal if they span more than\n    one line.\n  Enabled: true\n\nLayout/AlignParameters:\n  Description: >-\n    Align the parameters of a method call if they span more\n    than one line.\n  StyleGuide: '#no-double-indent'\n  Enabled: true\n\nLayout/BlockAlignment:\n  Description: 'Align block ends correctly.'\n  Enabled: true\n\nLayout/BlockEndNewline:\n  Description: 'Put end statement of multiline block on its own line.'\n  Enabled: true\n\nLayout/CaseIndentation:\n  Description: 'Indentation of when in a case/when/[else/]end.'\n  StyleGuide: '#indent-when-to-case'\n  Enabled: true\n\nLayout/ClosingParenthesisIndentation:\n  Description: 'Checks the indentation of hanging closing parentheses.'\n  Enabled: true\n\nLayout/CommentIndentation:\n  Description: 'Indentation of comments.'\n  Enabled: true\n\nLayout/ConditionPosition:\n  Description: >-\n    Checks for condition placed in a confusing position relative to\n    the keyword.\n  StyleGuide: '#same-line-condition'\n  Enabled: true\n\nLayout/DefEndAlignment:\n  Description: 'Align ends corresponding to defs correctly.'\n  Enabled: true\n\nLayout/DotPosition:\n  Description: 'Checks the position of the dot in multi-line method calls.'\n  StyleGuide: '#consistent-multi-line-chains'\n  Enabled: true\n\nLayout/ElseAlignment:\n  Description: 'Align elses and elsifs correctly.'\n  Enabled: true\n\nLayout/EmptyComment:\n  Description: 'Checks empty comment.'\n  Enabled: true\n\nLayout/EmptyLineAfterMagicComment:\n  Description: 'Add an empty line after magic comments to separate them from code.'\n  StyleGuide: '#separate-magic-comments-from-code'\n  Enabled: true\n\nLayout/EmptyLineBetweenDefs:\n  Description: 'Use empty lines between defs.'\n  StyleGuide: '#empty-lines-between-methods'\n  Enabled: true\n\nLayout/EmptyLines:\n  Description: \"Don't use several empty lines in a row.\"\n  StyleGuide: '#two-or-more-empty-lines'\n  Enabled: true\n\nLayout/EmptyLinesAroundAccessModifier:\n  Description: \"Keep blank lines around access modifiers.\"\n  StyleGuide: '#empty-lines-around-access-modifier'\n  Enabled: true\n\nLayout/EmptyLinesAroundArguments:\n  Description: \"Keeps track of empty lines around method arguments.\"\n  Enabled: true\n\nLayout/EmptyLinesAroundBeginBody:\n  Description: \"Keeps track of empty lines around begin-end bodies.\"\n  StyleGuide: '#empty-lines-around-bodies'\n  Enabled: true\n\nLayout/EmptyLinesAroundBlockBody:\n  Description: \"Keeps track of empty lines around block bodies.\"\n  StyleGuide: '#empty-lines-around-bodies'\n  Enabled: true\n\nLayout/EmptyLinesAroundClassBody:\n  Description: \"Keeps track of empty lines around class bodies.\"\n  StyleGuide: '#empty-lines-around-bodies'\n  Enabled: true\n\nLayout/EmptyLinesAroundExceptionHandlingKeywords:\n  Description: \"Keeps track of empty lines around exception handling keywords.\"\n  StyleGuide: '#empty-lines-around-bodies'\n  Enabled: true\n\nLayout/EmptyLinesAroundMethodBody:\n  Description: \"Keeps track of empty lines around method bodies.\"\n  StyleGuide: '#empty-lines-around-bodies'\n  Enabled: true\n\nLayout/EmptyLinesAroundModuleBody:\n  Description: \"Keeps track of empty lines around module bodies.\"\n  StyleGuide: '#empty-lines-around-bodies'\n  Enabled: true\n\nLayout/EndAlignment:\n  Description: 'Align ends correctly.'\n  Enabled: true\n\nLayout/EndOfLine:\n  Description: 'Use Unix-style line endings.'\n  StyleGuide: '#crlf'\n  Enabled: true\n\nLayout/ExtraSpacing:\n  Description: 'Do not use unnecessary spacing.'\n  Enabled: true\n\nLayout/FirstParameterIndentation:\n  Description: 'Checks the indentation of the first parameter in a method call.'\n  Enabled: true\n\nLayout/IndentArray:\n  Description: >-\n    Checks the indentation of the first element in an array\n    literal.\n  Enabled: true\n\nLayout/IndentAssignment:\n  Description: >-\n    Checks the indentation of the first line of the\n    right-hand-side of a multi-line assignment.\n  Enabled: true\n\nLayout/IndentHash:\n  Description: 'Checks the indentation of the first key in a hash literal.'\n  Enabled: true\n\nLayout/IndentHeredoc:\n  Description: 'This cops checks the indentation of the here document bodies.'\n  StyleGuide: '#squiggly-heredocs'\n  Enabled: true\n\nLayout/IndentationConsistency:\n  Description: 'Keep indentation straight.'\n  StyleGuide: '#spaces-indentation'\n  Enabled: true\n\nLayout/IndentationWidth:\n  Description: 'Use 2 spaces for indentation.'\n  StyleGuide: '#spaces-indentation'\n  Enabled: true\n\nLayout/InitialIndentation:\n  Description: >-\n    Checks the indentation of the first non-blank non-comment line in a file.\n  Enabled: true\n\nLayout/LeadingCommentSpace:\n  Description: 'Comments should start with a space.'\n  StyleGuide: '#hash-space'\n  Enabled: true\n\nLayout/MultilineArrayBraceLayout:\n  Description: >-\n    Checks that the closing brace in an array literal is\n    either on the same line as the last array element, or\n    a new line.\n  Enabled: true\n\nLayout/MultilineBlockLayout:\n  Description: 'Ensures newlines after multiline block do statements.'\n  Enabled: true\n\nLayout/MultilineHashBraceLayout:\n  Description: >-\n    Checks that the closing brace in a hash literal is\n    either on the same line as the last hash element, or\n    a new line.\n  Enabled: true\n\nLayout/MultilineMethodCallBraceLayout:\n  Description: >-\n    Checks that the closing brace in a method call is\n    either on the same line as the last method argument, or\n    a new line.\n  Enabled: true\n\nLayout/MultilineMethodCallIndentation:\n  Description: >-\n    Checks indentation of method calls with the dot operator\n    that span more than one line.\n  Enabled: true\n\nLayout/MultilineMethodDefinitionBraceLayout:\n  Description: >-\n    Checks that the closing brace in a method definition is\n    either on the same line as the last method parameter, or\n    a new line.\n  Enabled: true\n\nLayout/MultilineOperationIndentation:\n  Description: >-\n    Checks indentation of binary operations that span more than\n    one line.\n  Enabled: true\n\nLayout/RescueEnsureAlignment:\n  Description: 'Align rescues and ensures correctly.'\n  Enabled: true\n\nLayout/SpaceAfterColon:\n  Description: 'Use spaces after colons.'\n  StyleGuide: '#spaces-operators'\n  Enabled: true\n\nLayout/SpaceAfterComma:\n  Description: 'Use spaces after commas.'\n  StyleGuide: '#spaces-operators'\n  Enabled: true\n\nLayout/SpaceAfterMethodName:\n  Description: >-\n    Do not put a space between a method name and the opening\n    parenthesis in a method definition.\n  StyleGuide: '#parens-no-spaces'\n  Enabled: true\n\nLayout/SpaceAfterNot:\n  Description: Tracks redundant space after the ! operator.\n  StyleGuide: '#no-space-bang'\n  Enabled: true\n\nLayout/SpaceAfterSemicolon:\n  Description: 'Use spaces after semicolons.'\n  StyleGuide: '#spaces-operators'\n  Enabled: true\n\nLayout/SpaceAroundBlockParameters:\n  Description: 'Checks the spacing inside and after block parameters pipes.'\n  Enabled: true\n\nLayout/SpaceAroundEqualsInParameterDefault:\n  Description: >-\n    Checks that the equals signs in parameter default assignments\n    have or don't have surrounding space depending on\n    configuration.\n  StyleGuide: '#spaces-around-equals'\n  Enabled: true\n\nLayout/SpaceAroundKeyword:\n  Description: 'Use a space around keywords if appropriate.'\n  Enabled: true\n\nLayout/SpaceAroundOperators:\n  Description: 'Use a single space around operators.'\n  StyleGuide: '#spaces-operators'\n  Enabled: true\n\nLayout/SpaceBeforeBlockBraces:\n  Description: >-\n    Checks that the left block brace has or doesn't have space\n    before it.\n  Enabled: true\n\nLayout/SpaceBeforeComma:\n  Description: 'No spaces before commas.'\n  Enabled: true\n\nLayout/SpaceBeforeComment:\n  Description: >-\n    Checks for missing space between code and a comment on the\n    same line.\n  Enabled: true\n\nLayout/SpaceBeforeFirstArg:\n  Description: >-\n    Checks that exactly one space is used between a method name\n    and the first argument for method calls without parentheses.\n  Enabled: true\n\nLayout/SpaceBeforeSemicolon:\n  Description: 'No spaces before semicolons.'\n  Enabled: true\n\nLayout/SpaceInLambdaLiteral:\n  Description: 'Checks for spaces in lambda literals.'\n  Enabled: true\n\nLayout/SpaceInsideArrayLiteralBrackets:\n  Description: 'Checks the spacing inside array literal brackets.'\n  Enabled: true\n\nLayout/SpaceInsideArrayPercentLiteral:\n  Description: 'No unnecessary additional spaces between elements in %i/%w literals.'\n  Enabled: true\n\nLayout/SpaceInsideBlockBraces:\n  Description: >-\n    Checks that block braces have or don't have surrounding space.\n    For blocks taking parameters, checks that the left brace has\n    or doesn't have trailing space.\n  Enabled: true\n\nLayout/SpaceInsideHashLiteralBraces:\n  Description: \"Use spaces inside hash literal braces - or don't.\"\n  StyleGuide: '#spaces-operators'\n  Enabled: true\n\nLayout/SpaceInsideParens:\n  Description: 'No spaces after ( or before ).'\n  StyleGuide: '#spaces-braces'\n  Enabled: true\n\nLayout/SpaceInsidePercentLiteralDelimiters:\n  Description: 'No unnecessary spaces inside delimiters of %i/%w/%x literals.'\n  Enabled: true\n\nLayout/SpaceInsideRangeLiteral:\n  Description: 'No spaces inside range literals.'\n  StyleGuide: '#no-space-inside-range-literals'\n  Enabled: true\n\nLayout/SpaceInsideReferenceBrackets:\n  Description: 'Checks the spacing inside referential brackets.'\n  Enabled: true\n\nLayout/SpaceInsideStringInterpolation:\n  Description: 'Checks for padding/surrounding spaces inside string interpolation.'\n  StyleGuide: '#string-interpolation'\n  Enabled: true\n\nLayout/Tab:\n  Description: 'No hard tabs.'\n  StyleGuide: '#spaces-indentation'\n  Enabled: true\n\nLayout/TrailingBlankLines:\n  Description: 'Checks trailing blank lines and final newline.'\n  StyleGuide: '#newline-eof'\n  Enabled: true\n\nLayout/TrailingWhitespace:\n  Description: 'Avoid trailing whitespace.'\n  StyleGuide: '#no-trailing-whitespace'\n  Enabled: true\n\n#################### Lint ##################################\n### Warnings\n\nLint/AmbiguousBlockAssociation:\n  Description: >-\n    Checks for ambiguous block association with method when param passed without\n    parentheses.\n  StyleGuide: '#syntax'\n  Enabled: true\n\nLint/AmbiguousOperator:\n  Description: >-\n    Checks for ambiguous operators in the first argument of a\n    method invocation without parentheses.\n  StyleGuide: '#method-invocation-parens'\n  Enabled: true\n\nLint/AmbiguousRegexpLiteral:\n  Description: >-\n    Checks for ambiguous regexp literals in the first argument of\n    a method invocation without parentheses.\n  Enabled: true\n\nLint/AssignmentInCondition:\n  Description: \"Don't use assignment in conditions.\"\n  StyleGuide: '#safe-assignment-in-condition'\n  Enabled: true\n\nLint/BigDecimalNew:\n  Description: '`BigDecimal.new()` is deprecated. Use `BigDecimal()` instead.'\n  Enabled: true\n\nLint/BooleanSymbol:\n  Description: 'Check for `:true` and `:false` symbols.'\n  Enabled: true\n\nLint/CircularArgumentReference:\n  Description: \"Default values in optional keyword arguments and optional ordinal arguments should not refer back to the name of the argument.\"\n  Enabled: true\n\nLint/Debugger:\n  Description: 'Check for debugger calls.'\n  Enabled: true\n\nLint/DeprecatedClassMethods:\n  Description: 'Check for deprecated class method calls.'\n  Enabled: true\n\nLint/DuplicateCaseCondition:\n  Description: 'Do not repeat values in case conditionals.'\n  Enabled: true\n\nLint/DuplicateMethods:\n  Description: 'Check for duplicate method definitions.'\n  Enabled: true\n\nLint/DuplicatedKey:\n  Description: 'Check for duplicate keys in hash literals.'\n  Enabled: true\n\nLint/EachWithObjectArgument:\n  Description: 'Check for immutable argument given to each_with_object.'\n  Enabled: true\n\nLint/ElseLayout:\n  Description: 'Check for odd code arrangement in an else block.'\n  Enabled: true\n\nLint/EmptyEnsure:\n  Description: 'Checks for empty ensure block.'\n  Enabled: true\n  AutoCorrect: false\n\nLint/EmptyExpression:\n  Description: 'Checks for empty expressions.'\n  Enabled: true\n\nLint/EmptyInterpolation:\n  Description: 'Checks for empty string interpolation.'\n  Enabled: true\n\nLint/EmptyWhen:\n  Description: 'Checks for `when` branches with empty bodies.'\n  Enabled: true\n\nLint/EndInMethod:\n  Description: 'END blocks should not be placed inside method definitions.'\n  Enabled: true\n\nLint/EnsureReturn:\n  Description: 'Do not use return in an ensure block.'\n  StyleGuide: '#no-return-ensure'\n  Enabled: true\n\nLint/FloatOutOfRange:\n  Description: >-\n    Catches floating-point literals too large or small for Ruby to\n    represent.\n  Enabled: true\n\nLint/FormatParameterMismatch:\n  Description: 'The number of parameters to format/sprint must match the fields.'\n  Enabled: true\n\nLint/HandleExceptions:\n  Description: \"Don't suppress exception.\"\n  StyleGuide: '#dont-hide-exceptions'\n  Enabled: true\n\nLint/ImplicitStringConcatenation:\n  Description: >-\n    Checks for adjacent string literals on the same line, which\n    could better be represented as a single string literal.\n  Enabled: true\n\nLint/IneffectiveAccessModifier:\n  Description: >-\n    Checks for attempts to use `private` or `protected` to set\n    the visibility of a class method, which does not work.\n  Enabled: true\n\nLint/InheritException:\n  Description: 'Avoid inheriting from the `Exception` class.'\n  Enabled: true\n\nLint/InterpolationCheck:\n  Description: 'Raise warning for interpolation in single q strs'\n  Enabled: true\n\nLint/LiteralAsCondition:\n  Description: 'Checks of literals used in conditions.'\n  Enabled: true\n\nLint/LiteralInInterpolation:\n  Description: 'Checks for literals used in interpolation.'\n  Enabled: true\n\nLint/Loop:\n  Description: >-\n    Use Kernel#loop with break rather than begin/end/until or\n    begin/end/while for post-loop tests.\n  StyleGuide: '#loop-with-break'\n  Enabled: true\n\nLint/MissingCopEnableDirective:\n  Description: 'Checks for a `# rubocop:enable` after `# rubocop:disable`'\n  Enabled: true\n\nLint/MultipleCompare:\n  Description: \"Use `&&` operator to compare multiple value.\"\n  Enabled: true\n\nLint/NestedMethodDefinition:\n  Description: 'Do not use nested method definitions.'\n  StyleGuide: '#no-nested-methods'\n  Enabled: true\n\nLint/NestedPercentLiteral:\n  Description: 'Checks for nested percent literals.'\n  Enabled: true\n\nLint/NextWithoutAccumulator:\n  Description:  >-\n    Do not omit the accumulator when calling `next`\n    in a `reduce`/`inject` block.\n  Enabled: true\n\nLint/NonLocalExitFromIterator:\n  Description: 'Do not use return in iterator to cause non-local exit.'\n  Enabled: true\n\nLint/OrderedMagicComments:\n  Description: 'Checks the proper ordering of magic comments and whether a magic comment is not placed before a shebang.'\n  Enabled: true\n\nLint/ParenthesesAsGroupedExpression:\n  Description: >-\n    Checks for method calls with a space before the opening\n    parenthesis.\n  StyleGuide: '#parens-no-spaces'\n  Enabled: true\n\nLint/PercentStringArray:\n  Description: >-\n    Checks for unwanted commas and quotes in %w/%W literals.\n  Enabled: true\n\nLint/PercentSymbolArray:\n  Description: >-\n    Checks for unwanted commas and colons in %i/%I literals.\n  Enabled: true\n\nLint/RandOne:\n  Description: >-\n    Checks for `rand(1)` calls. Such calls always return `0`\n    and most likely a mistake.\n  Enabled: true\n\nLint/RedundantWithIndex:\n  Description: 'Checks for redundant `with_index`.'\n  Enabled: true\n\nLint/RedundantWithObject:\n  Description: 'Checks for redundant `with_object`.'\n  Enabled: true\n\nLint/RegexpAsCondition:\n  Description: >-\n    Do not use regexp literal as a condition.\n    The regexp literal matches `$_` implicitly.\n  Enabled: true\n\nLint/RequireParentheses:\n  Description: >-\n    Use parentheses in the method call to avoid confusion\n    about precedence.\n  Enabled: true\n\nLint/RescueException:\n  Description: 'Avoid rescuing the Exception class.'\n  StyleGuide: '#no-blind-rescues'\n  Enabled: true\n\nLint/RescueType:\n  Description: 'Avoid rescuing from non constants that could result in a `TypeError`.'\n  Enabled: true\n\nLint/ReturnInVoidContext:\n  Description: 'Checks for return in void context.'\n  Enabled: true\n\nLint/SafeNavigationChain:\n  Description: 'Do not chain ordinary method call after safe navigation operator.'\n  Enabled: true\n\nLint/ScriptPermission:\n  Description: 'Grant script file execute permission.'\n  Enabled: true\n\nLint/ShadowedArgument:\n  Description: 'Avoid reassigning arguments before they were used.'\n  Enabled: true\n\nLint/ShadowedException:\n  Description: >-\n    Avoid rescuing a higher level exception\n    before a lower level exception.\n  Enabled: true\n\nLint/ShadowingOuterLocalVariable:\n  Description: >-\n    Do not use the same name as outer local variable\n    for block arguments or block local variables.\n  Enabled: true\n\nLint/StringConversionInInterpolation:\n  Description: 'Checks for Object#to_s usage in string interpolation.'\n  StyleGuide: '#no-to-s'\n  Enabled: true\n\nLint/Syntax:\n  Description: 'Checks syntax error'\n  Enabled: true\n\nLint/UnderscorePrefixedVariableName:\n  Description: 'Do not use prefix `_` for a variable that is used.'\n  Enabled: true\n\nLint/UnifiedInteger:\n  Description: 'Use Integer instead of Fixnum or Bignum'\n  Enabled: true\n\nLint/UnneededCopDisableDirective:\n  Description: >-\n    Checks for rubocop:disable comments that can be removed.\n    Note: this cop is not disabled when disabling all cops.\n    It must be explicitly disabled.\n  Enabled: true\n\nLint/UnneededCopEnableDirective:\n  Description: Checks for rubocop:enable comments that can be removed.\n\n  Enabled: true\n\nLint/UnneededRequireStatement:\n  Description: 'Checks for unnecessary `require` statement.'\n  Enabled: true\n\nLint/UnneededSplatExpansion:\n  Description: 'Checks for splat unnecessarily being called on literals'\n  Enabled: true\n\nLint/UnreachableCode:\n  Description: 'Unreachable code.'\n  Enabled: true\n\nLint/UnusedBlockArgument:\n  Description: 'Checks for unused block arguments.'\n  StyleGuide: '#underscore-unused-vars'\n  Enabled: true\n\nLint/UnusedMethodArgument:\n  Description: 'Checks for unused method arguments.'\n  StyleGuide: '#underscore-unused-vars'\n  Enabled: true\n\nLint/UriEscapeUnescape:\n  Description: >-\n    `URI.escape` method is obsolete and should not be used. Instead, use\n    `CGI.escape`, `URI.encode_www_form` or `URI.encode_www_form_component`\n    depending on your specific use case.\n    Also `URI.unescape` method is obsolete and should not be used. Instead, use\n    `CGI.unescape`, `URI.decode_www_form` or `URI.decode_www_form_component`\n    depending on your specific use case.\n  Enabled: true\n\nLint/UriRegexp:\n  Description: 'Use `URI::DEFAULT_PARSER.make_regexp` instead of `URI.regexp`.'\n  Enabled: true\n\nLint/UselessAccessModifier:\n  Description: 'Checks for useless access modifiers.'\n  Enabled: true\n  ContextCreatingMethods: []\n  MethodCreatingMethods: []\n\nLint/UselessAssignment:\n  Description: 'Checks for useless assignment to a local variable.'\n  StyleGuide: '#underscore-unused-vars'\n  Enabled: true\n\nLint/UselessComparison:\n  Description: 'Checks for comparison of something with itself.'\n  Enabled: true\n\nLint/UselessElseWithoutRescue:\n  Description: 'Checks for useless `else` in `begin..end` without `rescue`.'\n  Enabled: true\n\nLint/UselessSetterCall:\n  Description: 'Checks for useless setter call to a local variable.'\n  Enabled: true\n\nLint/Void:\n  Description: 'Possible use of operator/literal/variable in void context.'\n  Enabled: true\n\n#################### Metrics ###############################\n\nMetrics/AbcSize:\n  Description: >-\n    A calculated magnitude based on number of assignments,\n    branches, and conditions.\n  Reference: 'http://c2.com/cgi/wiki?AbcMetric'\n  Enabled: true\n\nMetrics/BlockLength:\n  Description: 'Avoid long blocks with many lines.'\n  Enabled: true\n  Exclude:\n    - '**/*_spec.rb'\n    - 'db/schema.rb'\n    - 'config/routes.rb'\n    - 'spec/factories/**/*.rb'\n    - 'config/initializers/*.rb'\n    - 'config/environments/*.rb'\n    - 'Vagrantfile'\n\nMetrics/BlockNesting:\n  Description: 'Avoid excessive block nesting'\n  StyleGuide: '#three-is-the-number-thou-shalt-count'\n  Enabled: true\n\nMetrics/ClassLength:\n  Description: 'Avoid classes longer than 100 lines of code.'\n  Enabled: true\n\nMetrics/CyclomaticComplexity:\n  Description: >-\n    A complexity metric that is strongly correlated to the number\n    of test cases needed to validate a method.\n  Enabled: true\n\nMetrics/LineLength:\n  Description: 'Limit lines to 80 characters.'\n  StyleGuide: '#80-character-limits'\n  Enabled: true\n  Max: 120\n  Exclude:\n    - 'db/seeds.rb'\n    - 'config/initializers/*.rb'\n\nMetrics/MethodLength:\n  Description: 'Avoid methods longer than 10 lines of code.'\n  StyleGuide: '#short-methods'\n  Enabled: true\n\nMetrics/ModuleLength:\n  Description: 'Avoid modules longer than 100 lines of code.'\n  Enabled: true\n\nMetrics/ParameterLists:\n  Description: 'Avoid parameter lists longer than three or four parameters.'\n  StyleGuide: '#too-many-params'\n  Enabled: true\n\nMetrics/PerceivedComplexity:\n  Description: >-\n    A complexity metric geared towards measuring complexity for a\n    human reader.\n  Enabled: true\n\n#################### Naming ##############################\n\nNaming/AccessorMethodName:\n  Description: Check the naming of accessor methods for get_/set_.\n  StyleGuide: '#accessor_mutator_method_names'\n  Enabled: true\n\nNaming/AsciiIdentifiers:\n  Description: 'Use only ascii symbols in identifiers.'\n  StyleGuide: '#english-identifiers'\n  Enabled: true\n\nNaming/BinaryOperatorParameterName:\n  Description: 'When defining binary operators, name the argument other.'\n  StyleGuide: '#other-arg'\n  Enabled: true\n\nNaming/ClassAndModuleCamelCase:\n  Description: 'Use CamelCase for classes and modules.'\n  StyleGuide: '#camelcase-classes'\n  Enabled: true\n\nNaming/ConstantName:\n  Description: 'Constants should use SCREAMING_SNAKE_CASE.'\n  StyleGuide: '#screaming-snake-case'\n  Enabled: true\n\nNaming/FileName:\n  Description: 'Use snake_case for source file names.'\n  StyleGuide: '#snake-case-files'\n  Enabled: true\n\nNaming/HeredocDelimiterCase:\n  Description: 'Use configured case for heredoc delimiters.'\n  StyleGuide: '#heredoc-delimiters'\n  Enabled: true\n\nNaming/HeredocDelimiterNaming:\n  Description: 'Use descriptive heredoc delimiters.'\n  StyleGuide: '#heredoc-delimiters'\n  Enabled: true\n\nNaming/MemoizedInstanceVariableName:\n  Description: >-\n    Memoized method name should match memo instance variable name.\n  Enabled: true\n\nNaming/MethodName:\n  Description: 'Use the configured style when naming methods.'\n  StyleGuide: '#snake-case-symbols-methods-vars'\n  Enabled: true\n\nNaming/PredicateName:\n  Description: 'Check the names of predicate methods.'\n  StyleGuide: '#bool-methods-qmark'\n  Enabled: true\n\nNaming/UncommunicativeBlockParamName:\n  Description: >-\n    Checks for block parameter names that contain capital letters,\n    end in numbers, or do not meet a minimal length.\n  Enabled: true\n\nNaming/UncommunicativeMethodParamName:\n  Description: >-\n    Checks for method parameter names that contain capital letters,\n    end in numbers, or do not meet a minimal length.\n  Enabled: true\n\nNaming/VariableName:\n  Description: 'Use the configured style when naming variables.'\n  StyleGuide: '#snake-case-symbols-methods-vars'\n  Enabled: true\n\nNaming/VariableNumber:\n  Description: 'Use the configured style when numbering variables.'\n  Enabled: true\n\n#################### Performance ###########################\n\nPerformance/Caller:\n  Description: >-\n    Use `caller(n..n)` instead of `caller`.\n  Enabled: true\n\nPerformance/CaseWhenSplat:\n  Description: >-\n    Place `when` conditions that use splat at the end\n    of the list of `when` branches.\n  Enabled: true\n\nPerformance/Casecmp:\n  Description: >-\n    Use `casecmp` rather than `downcase ==`, `upcase ==`, `== downcase`, or `== upcase`..\n  Reference: 'https://github.com/JuanitoFatas/fast-ruby#stringcasecmp-vs-stringdowncase---code'\n  Enabled: true\n\nPerformance/CompareWithBlock:\n  Description: 'Use `sort_by(&:foo)` instead of `sort { |a, b| a.foo <=> b.foo }`.'\n  Enabled: true\n\nPerformance/Count:\n  Description: >-\n    Use `count` instead of `select...size`, `reject...size`,\n    `select...count`, `reject...count`, `select...length`,\n    and `reject...length`.\n  # This cop has known compatibility issues with `ActiveRecord` and other\n  # frameworks. ActiveRecord's `count` ignores the block that is passed to it.\n  # For more information, see the documentation in the cop itself.\n  # If you understand the known risk, you can disable `SafeMode`.\n  SafeMode: true\n  Enabled: true\n\nPerformance/Detect:\n  Description: >-\n    Use `detect` instead of `select.first`, `find_all.first`,\n    `select.last`, and `find_all.last`.\n  Reference: 'https://github.com/JuanitoFatas/fast-ruby#enumerabledetect-vs-enumerableselectfirst-code'\n  # This cop has known compatibility issues with `ActiveRecord` and other\n  # frameworks. `ActiveRecord` does not implement a `detect` method and `find`\n  # has its own meaning. Correcting `ActiveRecord` methods with this cop\n  # should be considered unsafe.\n  SafeMode: true\n  Enabled: true\n\nPerformance/DoubleStartEndWith:\n  Description: >-\n    Use `str.{start,end}_with?(x, ..., y, ...)`\n    instead of `str.{start,end}_with?(x, ...) || str.{start,end}_with?(y, ...)`.\n  Enabled: true\n\nPerformance/EndWith:\n  Description: 'Use `end_with?` instead of a regex match anchored to the end of a string.'\n  Reference: 'https://github.com/JuanitoFatas/fast-ruby#stringmatch-vs-stringstart_withstringend_with-code-start-code-end'\n  # This will change to a new method call which isn't guaranteed to be on the\n  # object. Switching these methods has to be done with knowledge of the types\n  # of the variables which rubocop doesn't have.\n  AutoCorrect: false\n  Enabled: true\n\nPerformance/FixedSize:\n  Description: 'Do not compute the size of statically sized objects except in constants'\n  Enabled: true\n\nPerformance/FlatMap:\n  Description: >-\n    Use `Enumerable#flat_map`\n    instead of `Enumerable#map...Array#flatten(1)`\n    or `Enumberable#collect..Array#flatten(1)`\n  Reference: 'https://github.com/JuanitoFatas/fast-ruby#enumerablemaparrayflatten-vs-enumerableflat_map-code'\n  Enabled: true\n  EnabledForFlattenWithoutParams: false\n  # If enabled, this cop will warn about usages of\n  # `flatten` being called without any parameters.\n  # This can be dangerous since `flat_map` will only flatten 1 level, and\n  # `flatten` without any parameters can flatten multiple levels.\n\nPerformance/LstripRstrip:\n  Description: 'Use `strip` instead of `lstrip.rstrip`.'\n  Enabled: true\n\nPerformance/RangeInclude:\n  Description: 'Use `Range#cover?` instead of `Range#include?`.'\n  Reference: 'https://github.com/JuanitoFatas/fast-ruby#cover-vs-include-code'\n  Enabled: true\n\nPerformance/RedundantBlockCall:\n  Description: 'Use `yield` instead of `block.call`.'\n  Reference: 'https://github.com/JuanitoFatas/fast-ruby#proccall-and-block-arguments-vs-yieldcode'\n  Enabled: true\n\nPerformance/RedundantMatch:\n  Description: >-\n    Use `=~` instead of `String#match` or `Regexp#match` in a context where the\n    returned `MatchData` is not needed.\n  Enabled: true\n\nPerformance/RedundantMerge:\n  Description: 'Use Hash#[]=, rather than Hash#merge! with a single key-value pair.'\n  Reference: 'https://github.com/JuanitoFatas/fast-ruby#hashmerge-vs-hash-code'\n  Enabled: true\n\nPerformance/RedundantSortBy:\n  Description: 'Use `sort` instead of `sort_by { |x| x }`.'\n  Enabled: true\n\nPerformance/RegexpMatch:\n  Description: >-\n    Use `match?` instead of `Regexp#match`, `String#match`, `Symbol#match`,\n    `Regexp#===`, or `=~` when `MatchData` is not used.\n  Enabled: true\n\nPerformance/ReverseEach:\n  Description: 'Use `reverse_each` instead of `reverse.each`.'\n  Reference: 'https://github.com/JuanitoFatas/fast-ruby#enumerablereverseeach-vs-enumerablereverse_each-code'\n  Enabled: true\n\nPerformance/Sample:\n  Description: >-\n    Use `sample` instead of `shuffle.first`,\n    `shuffle.last`, and `shuffle[Integer]`.\n  Reference: 'https://github.com/JuanitoFatas/fast-ruby#arrayshufflefirst-vs-arraysample-code'\n  Enabled: true\n\nPerformance/Size:\n  Description: >-\n    Use `size` instead of `count` for counting\n    the number of elements in `Array` and `Hash`.\n  Reference: 'https://github.com/JuanitoFatas/fast-ruby#arraylength-vs-arraysize-vs-arraycount-code'\n  Enabled: true\n\nPerformance/StartWith:\n  Description: 'Use `start_with?` instead of a regex match anchored to the beginning of a string.'\n  Reference: 'https://github.com/JuanitoFatas/fast-ruby#stringmatch-vs-stringstart_withstringend_with-code-start-code-end'\n  # This will change to a new method call which isn't guaranteed to be on the\n  # object. Switching these methods has to be done with knowledge of the types\n  # of the variables which rubocop doesn't have.\n  AutoCorrect: false\n  Enabled: true\n\nPerformance/StringReplacement:\n  Description: >-\n    Use `tr` instead of `gsub` when you are replacing the same\n    number of characters. Use `delete` instead of `gsub` when\n    you are deleting characters.\n  Reference: 'https://github.com/JuanitoFatas/fast-ruby#stringgsub-vs-stringtr-code'\n  Enabled: true\n\nPerformance/TimesMap:\n  Description: 'Checks for .times.map calls.'\n  AutoCorrect: false\n  Enabled: true\n\nPerformance/UnfreezeString:\n  Description: 'Use unary plus to get an unfrozen string literal.'\n  Enabled: true\n\nPerformance/UriDefaultParser:\n  Description: 'Use `URI::DEFAULT_PARSER` instead of `URI::Parser.new`.'\n  Enabled: true\n\n#################### Rails #################################\n\nRails/ActionFilter:\n  Description: 'Enforces consistent use of action filter methods.'\n  Enabled: true\n\nRails/ActiveRecordAliases:\n  Description: >-\n    Avoid Active Record aliases:\n    Use `update` instead of `update_attributes`.\n    Use `update!` instead of `update_attributes!`.\n  Enabled: true\n\nRails/ActiveSupportAliases:\n  Description: >-\n    Avoid ActiveSupport aliases of standard ruby methods:\n    `String#starts_with?`, `String#ends_with?`,\n    `Array#append`, `Array#prepend`.\n  Enabled: true\n\nRails/ApplicationJob:\n  Description: 'Check that jobs subclass ApplicationJob.'\n  Enabled: true\n\nRails/ApplicationRecord:\n  Description: 'Check that models subclass ApplicationRecord.'\n  Enabled: true\n\nRails/Blank:\n  Description: 'Enforce using `blank?` and `present?`.'\n  Enabled: true\n  # Convert checks for `nil` or `empty?` to `blank?`\n  NilOrEmpty: true\n  # Convert usages of not `present?` to `blank?`\n  NotPresent: true\n  # Convert usages of `unless` `present?` to `if` `blank?`\n  UnlessPresent: true\n\nRails/CreateTableWithTimestamps:\n  Description: >-\n    Checks the migration for which timestamps are not included\n    when creating a new table.\n  Enabled: true\n\nRails/Date:\n  Description: >-\n    Checks the correct usage of date aware methods,\n    such as Date.today, Date.current etc.\n  Enabled: true\n\nRails/Delegate:\n  Description: 'Prefer delegate method for delegations.'\n  Enabled: true\n\nRails/DelegateAllowBlank:\n  Description: 'Do not use allow_blank as an option to delegate.'\n  Enabled: true\n\nRails/DynamicFindBy:\n  Description: 'Use `find_by` instead of dynamic `find_by_*`.'\n  StyleGuide: 'https://github.com/bbatsov/rails-style-guide#find_by'\n  Enabled: true\n\nRails/EnumUniqueness:\n  Description: 'Avoid duplicate integers in hash-syntax `enum` declaration.'\n  Enabled: true\n\nRails/EnvironmentComparison:\n  Description: \"Favor `Rails.env.production?` over `Rails.env == 'production'`\"\n  Enabled: true\n\nRails/Exit:\n  Description: >-\n    Favor `fail`, `break`, `return`, etc. over `exit` in\n    application or library code outside of Rake files to avoid\n    exits during unit testing or running in production.\n  Enabled: true\n\nRails/FilePath:\n  Description: 'Use `Rails.root.join` for file path joining.'\n  Enabled: true\n\nRails/FindBy:\n  Description: 'Prefer find_by over where.first.'\n  StyleGuide: 'https://github.com/bbatsov/rails-style-guide#find_by'\n  Enabled: true\n\nRails/FindEach:\n  Description: 'Prefer all.find_each over all.find.'\n  StyleGuide: 'https://github.com/bbatsov/rails-style-guide#find-each'\n  Enabled: true\n\nRails/HasAndBelongsToMany:\n  Description: 'Prefer has_many :through to has_and_belongs_to_many.'\n  StyleGuide: 'https://github.com/bbatsov/rails-style-guide#has-many-through'\n  Enabled: true\n\nRails/HasManyOrHasOneDependent:\n  Description: 'Define the dependent option to the has_many and has_one associations.'\n  StyleGuide: 'https://github.com/bbatsov/rails-style-guide#has_many-has_one-dependent-option'\n  Enabled: true\n\nRails/HttpPositionalArguments:\n  Description: 'Use keyword arguments instead of positional arguments in http method calls.'\n  Enabled: true\n  Include:\n    - 'spec/**/*'\n    - 'test/**/*'\n\nRails/HttpStatus:\n  Description: 'Enforces use of symbolic or numeric value to define HTTP status.'\n  Enabled: true\n\nRails/InverseOf:\n  Description: 'Checks for associations where the inverse cannot be determined automatically.'\n  Enabled: true\n\nRails/LexicallyScopedActionFilter:\n  Description: \"Checks that methods specified in the filter's `only` or `except` options are explicitly defined in the controller.\"\n  StyleGuide: 'https://github.com/bbatsov/rails-style-guide#lexically-scoped-action-filter'\n  Enabled: true\n\nRails/NotNullColumn:\n  Description: 'Do not add a NOT NULL column without a default value'\n  Enabled: true\n\nRails/Output:\n  Description: 'Checks for calls to puts, print, etc.'\n  Enabled: true\n\nRails/OutputSafety:\n  Description: 'The use of `html_safe` or `raw` may be a security risk.'\n  Enabled: true\n\nRails/PluralizationGrammar:\n  Description: 'Checks for incorrect grammar when using methods like `3.day.ago`.'\n  Enabled: true\n\nRails/Presence:\n  Description: 'Checks code that can be written more easily using `Object#presence` defined by Active Support.'\n  Enabled: true\n\nRails/Present:\n  Description: 'Enforce using `blank?` and `present?`.'\n  Enabled: true\n  NotNilAndNotEmpty: true\n  # Convert checks for not `nil` and not `empty?` to `present?`\n  NotBlank: true\n  # Convert usages of not `blank?` to `present?`\n  UnlessBlank: true\n  # Convert usages of `unless` `blank?` to `if` `present?`\n\nRails/ReadWriteAttribute:\n  Description: >-\n    Checks for read_attribute(:attr) and\n    write_attribute(:attr, val).\n  StyleGuide: 'https://github.com/bbatsov/rails-style-guide#read-attribute'\n  Enabled: true\n\nRails/RedundantReceiverInWithOptions:\n  Description: 'Checks for redundant receiver in `with_options`.'\n  Enabled: true\n\nRails/RelativeDateConstant:\n  Description: 'Do not assign relative date to constants.'\n  Enabled: true\n\nRails/RequestReferer:\n  Description: 'Use consistent syntax for request.referer.'\n  Enabled: true\n\nRails/ReversibleMigration:\n  Description: 'Checks whether the change method of the migration file is reversible.'\n  StyleGuide: 'https://github.com/bbatsov/rails-style-guide#reversible-migration'\n  Reference: 'http://api.rubyonrails.org/classes/ActiveRecord/Migration/CommandRecorder.html'\n  Enabled: true\n\nRails/SafeNavigation:\n  Description: \"Use Ruby's safe navigation operator (`&.`) instead of `try!`\"\n  Enabled: true\n\nRails/ScopeArgs:\n  Description: 'Checks the arguments of ActiveRecord scopes.'\n  Enabled: true\n\nRails/SkipsModelValidations:\n  Description: >-\n    Use methods that skips model validations with caution.\n    See reference for more information.\n  Reference: 'http://guides.rubyonrails.org/active_record_validations.html#skipping-validations'\n  Enabled: true\n\nRails/TimeZone:\n  Description: 'Checks the correct usage of time zone aware methods.'\n  StyleGuide: 'https://github.com/bbatsov/rails-style-guide#time'\n  Reference: 'http://danilenko.org/2012/7/6/rails_timezones'\n  Enabled: true\n\nRails/UniqBeforePluck:\n  Description: 'Prefer the use of uniq or distinct before pluck.'\n  Enabled: true\n\nRails/UnknownEnv:\n  Description: 'Use correct environment name.'\n  Enabled: true\n\nRails/Validation:\n  Description: 'Use validates :attribute, hash of validations.'\n  Enabled: true\n\n#################### Security ##############################\n\nSecurity/Eval:\n  Description: 'The use of eval represents a serious security risk.'\n  Enabled: true\n\nSecurity/JSONLoad:\n  Description: >-\n    Prefer usage of `JSON.parse` over `JSON.load` due to potential\n    security issues. See reference for more information.\n  Reference: 'http://ruby-doc.org/stdlib-2.3.0/libdoc/json/rdoc/JSON.html#method-i-load'\n  Enabled: true\n  # Autocorrect here will change to a method that may cause crashes depending\n  # on the value of the argument.\n  AutoCorrect: false\n\nSecurity/MarshalLoad:\n  Description: >-\n    Avoid using of `Marshal.load` or `Marshal.restore` due to potential\n    security issues. See reference for more information.\n  Reference: 'http://ruby-doc.org/core-2.3.3/Marshal.html#module-Marshal-label-Security+considerations'\n  Enabled: true\n\nSecurity/Open:\n  Description: 'The use of Kernel#open represents a serious security risk.'\n  Enabled: true\n\nSecurity/YAMLLoad:\n  Description: >-\n    Prefer usage of `YAML.safe_load` over `YAML.load` due to potential\n    security issues. See reference for more information.\n  Reference: 'https://ruby-doc.org/stdlib-2.3.3/libdoc/yaml/rdoc/YAML.html#module-YAML-label-Security'\n  Enabled: true\n\n#################### Style ###############################\n\nStyle/Alias:\n  Description: 'Use alias instead of alias_method.'\n  StyleGuide: '#alias-method'\n  Enabled: true\n\nStyle/AndOr:\n  Description: 'Use &&/|| instead of and/or.'\n  StyleGuide: '#no-and-or-or'\n  Enabled: true\n\nStyle/ArrayJoin:\n  Description: 'Use Array#join instead of Array#*.'\n  StyleGuide: '#array-join'\n  Enabled: true\n\nStyle/AsciiComments:\n  Description: 'Use only ascii symbols in comments.'\n  StyleGuide: '#english-comments'\n  Enabled: true\n\nStyle/Attr:\n  Description: 'Checks for uses of Module#attr.'\n  StyleGuide: '#attr'\n  Enabled: true\n\nStyle/BarePercentLiterals:\n  Description: 'Checks if usage of %() or %Q() matches configuration.'\n  StyleGuide: '#percent-q-shorthand'\n  Enabled: true\n\nStyle/BeginBlock:\n  Description: 'Avoid the use of BEGIN blocks.'\n  StyleGuide: '#no-BEGIN-blocks'\n  Enabled: true\n\nStyle/BlockComments:\n  Description: 'Do not use block comments.'\n  StyleGuide: '#no-block-comments'\n  Enabled: true\n\nStyle/BlockDelimiters:\n  Description: >-\n    Avoid using {...} for multi-line blocks (multiline chaining is\n    always ugly).\n    Prefer {...} over do...end for single-line blocks.\n  StyleGuide: '#single-line-blocks'\n  Enabled: true\n\nStyle/BracesAroundHashParameters:\n  Description: 'Enforce braces style around hash parameters.'\n  Enabled: true\n\nStyle/CaseEquality:\n  Description: 'Avoid explicit use of the case equality operator(===).'\n  StyleGuide: '#no-case-equality'\n  Enabled: true\n\nStyle/CharacterLiteral:\n  Description: 'Checks for uses of character literals.'\n  StyleGuide: '#no-character-literals'\n  Enabled: true\n\nStyle/ClassAndModuleChildren:\n  Description: 'Checks style of children classes and modules.'\n  StyleGuide: '#namespace-definition'\n  # Moving from compact to nested children requires knowledge of whether the\n  # outer parent is a module or a class. Moving from nested to compact requires\n  # verification that the outer parent is defined elsewhere. Rubocop does not\n  # have the knowledge to perform either operation safely and thus requires\n  # manual oversight.\n  AutoCorrect: false\n  Enabled: true\n\nStyle/ClassCheck:\n  Description: 'Enforces consistent use of `Object#is_a?` or `Object#kind_of?`.'\n  Enabled: true\n\nStyle/ClassMethods:\n  Description: 'Use self when defining module/class methods.'\n  StyleGuide: '#def-self-class-methods'\n  Enabled: true\n\nStyle/ClassVars:\n  Description: 'Avoid the use of class variables.'\n  StyleGuide: '#no-class-vars'\n  Enabled: true\n\nStyle/ColonMethodCall:\n  Description: 'Do not use :: for method call.'\n  StyleGuide: '#double-colons'\n  Enabled: true\n\nStyle/ColonMethodDefinition:\n  Description: 'Do not use :: for defining class methods.'\n  StyleGuide: '#colon-method-definition'\n  Enabled: true\n\nStyle/CommandLiteral:\n  Description: 'Use `` or %x around command literals.'\n  StyleGuide: '#percent-x'\n  Enabled: true\n\nStyle/CommentAnnotation:\n  Description: >-\n    Checks formatting of special comments\n    (TODO, FIXME, OPTIMIZE, HACK, REVIEW).\n  StyleGuide: '#annotate-keywords'\n  Enabled: true\n\nStyle/CommentedKeyword:\n  Description: 'Do not place comments on the same line as certain keywords.'\n  Enabled: true\n\nStyle/ConditionalAssignment:\n  Description: >-\n    Use the return value of `if` and `case` statements for\n    assignment to a variable and variable comparison instead\n    of assigning that variable inside of each branch.\n  Enabled: true\n\nStyle/DateTime:\n  Description: 'Use Date or Time over DateTime.'\n  StyleGuide: '#date--time'\n  Enabled: true\n\nStyle/DefWithParentheses:\n  Description: 'Use def with parentheses when there are arguments.'\n  StyleGuide: '#method-parens'\n  Enabled: true\n\nStyle/Dir:\n  Description: >-\n    Use the `__dir__` method to retrieve the canonicalized\n    absolute path to the current file.\n  Enabled: true\n\nStyle/Documentation:\n  Description: 'Document classes and non-namespace modules.'\n  Enabled: false\n  Exclude:\n    - 'spec/**/*'\n    - 'test/**/*'\n    - 'db/**/*'\n    - 'config/**/*'\n\nStyle/DoubleNegation:\n  Description: 'Checks for uses of double negation (!!).'\n  StyleGuide: '#no-bang-bang'\n  Enabled: true\n\nStyle/EachForSimpleLoop:\n  Description: >-\n    Use `Integer#times` for a simple loop which iterates a fixed\n    number of times.\n  Enabled: true\n\nStyle/EachWithObject:\n  Description: 'Prefer `each_with_object` over `inject` or `reduce`.'\n  Enabled: true\n\nStyle/EmptyBlockParameter:\n  Description: 'Omit pipes for empty block parameters.'\n  Enabled: true\n\nStyle/EmptyCaseCondition:\n  Description: 'Avoid empty condition in case statements.'\n  Enabled: true\n\nStyle/EmptyElse:\n  Description: 'Avoid empty else-clauses.'\n  Enabled: true\n\nStyle/EmptyLambdaParameter:\n  Description: 'Omit parens for empty lambda parameters.'\n  Enabled: true\n\nStyle/EmptyLiteral:\n  Description: 'Prefer literals to Array.new/Hash.new/String.new.'\n  StyleGuide: '#literal-array-hash'\n  Enabled: true\n\nStyle/EmptyMethod:\n  Description: 'Checks the formatting of empty method definitions.'\n  StyleGuide: '#no-single-line-methods'\n  Enabled: true\n\nStyle/Encoding:\n  Description: 'Use UTF-8 as the source file encoding.'\n  StyleGuide: '#utf-8'\n  Enabled: true\n\nStyle/EndBlock:\n  Description: 'Avoid the use of END blocks.'\n  StyleGuide: '#no-END-blocks'\n  Enabled: true\n\nStyle/EvalWithLocation:\n  Description: 'Pass `__FILE__` and `__LINE__` to `eval` method, as they are used by backtraces.'\n  Enabled: true\n\nStyle/EvenOdd:\n  Description: 'Favor the use of Integer#even? && Integer#odd?'\n  StyleGuide: '#predicate-methods'\n  Enabled: true\n\nStyle/ExpandPathArguments:\n  Description: \"Use `expand_path(__dir__)` instead of `expand_path('..', __FILE__)`.\"\n  Enabled: true\n\nStyle/FlipFlop:\n  Description: 'Checks for flip flops'\n  StyleGuide: '#no-flip-flops'\n  Enabled: true\n\nStyle/For:\n  Description: 'Checks use of for or each in multiline loops.'\n  StyleGuide: '#no-for-loops'\n  Enabled: true\n\nStyle/FormatString:\n  Description: 'Enforce the use of Kernel#sprintf, Kernel#format or String#%.'\n  StyleGuide: '#sprintf'\n  Enabled: true\n\nStyle/FormatStringToken:\n  Description: 'Use a consistent style for format string tokens.'\n  Enabled: true\n\nStyle/FrozenStringLiteralComment:\n  Description: >-\n    Add the frozen_string_literal comment to the top of files\n    to help transition from Ruby 2.3.0 to Ruby 3.0.\n  Enabled: true\n  Exclude:\n    - 'db/**/*'\n\nStyle/GlobalVars:\n  Description: 'Do not introduce global variables.'\n  StyleGuide: '#instance-vars'\n  Reference: 'http://www.zenspider.com/Languages/Ruby/QuickRef.html'\n  Enabled: true\n\nStyle/GuardClause:\n  Description: 'Check for conditionals that can be replaced with guard clauses'\n  StyleGuide: '#no-nested-conditionals'\n  Enabled: true\n\nStyle/HashSyntax:\n  Description: >-\n    Prefer Ruby 1.9 hash syntax { a: 1, b: 2 } over 1.8 syntax\n    { :a => 1, :b => 2 }.\n  StyleGuide: '#hash-literals'\n  Enabled: true\n\nStyle/IdenticalConditionalBranches:\n  Description: >-\n    Checks that conditional statements do not have an identical\n    line at the end of each branch, which can validly be moved\n    out of the conditional.\n  Enabled: true\n\nStyle/IfInsideElse:\n  Description: 'Finds if nodes inside else, which can be converted to elsif.'\n  Enabled: true\n\nStyle/IfUnlessModifier:\n  Description: >-\n    Favor modifier if/unless usage when you have a\n    single-line body.\n  StyleGuide: '#if-as-a-modifier'\n  Enabled: true\n\nStyle/IfUnlessModifierOfIfUnless:\n  Description: >-\n    Avoid modifier if/unless usage on conditionals.\n  Enabled: true\n\nStyle/IfWithSemicolon:\n  Description: 'Do not use if x; .... Use the ternary operator instead.'\n  StyleGuide: '#no-semicolon-ifs'\n  Enabled: true\n\nStyle/InfiniteLoop:\n  Description: 'Use Kernel#loop for infinite loops.'\n  StyleGuide: '#infinite-loop'\n  Enabled: true\n\nStyle/InverseMethods:\n  Description: >-\n    Use the inverse method instead of `!.method`\n    if an inverse method is defined.\n  Enabled: true\n\nStyle/Lambda:\n  Description: 'Use the new lambda literal syntax for single-line blocks.'\n  StyleGuide: '#lambda-multi-line'\n  Enabled: true\n\nStyle/LambdaCall:\n  Description: 'Use lambda.call(...) instead of lambda.(...).'\n  StyleGuide: '#proc-call'\n  Enabled: true\n\nStyle/LineEndConcatenation:\n  Description: >-\n    Use \\ instead of + or << to concatenate two string literals at\n    line end.\n  Enabled: true\n\nStyle/MethodCallWithoutArgsParentheses:\n  Description: 'Do not use parentheses for method calls with no arguments.'\n  StyleGuide: '#method-invocation-parens'\n  Enabled: true\n\nStyle/MethodDefParentheses:\n  Description: >-\n    Checks if the method definitions have or don't have\n    parentheses.\n  StyleGuide: '#method-parens'\n  Enabled: true\n\nStyle/MethodMissingSuper:\n  Description: 'Avoid using `method_missing`.'\n  StyleGuide: '#no-method-missing'\n  Enabled: true\n\nStyle/MinMax:\n  Description: >-\n    Use `Enumerable#minmax` instead of `Enumerable#min`\n    and `Enumerable#max` in conjunction.'\n  Enabled: true\n\nStyle/MixinGrouping:\n  Description: 'Checks for grouping of mixins in `class` and `module` bodies.'\n  StyleGuide: '#mixin-grouping'\n  Enabled: true\n\nStyle/MixinUsage:\n  Description: 'Checks that `include`, `extend` and `prepend` exists at the top level.'\n  Enabled: true\n\nStyle/ModuleFunction:\n  Description: 'Checks for usage of `extend self` in modules.'\n  StyleGuide: '#module-function'\n  Enabled: true\n\nStyle/MultilineBlockChain:\n  Description: 'Avoid multi-line chains of blocks.'\n  StyleGuide: '#single-line-blocks'\n  Enabled: true\n\nStyle/MultilineIfModifier:\n  Description: 'Only use if/unless modifiers on single line statements.'\n  StyleGuide: '#no-multiline-if-modifiers'\n  Enabled: true\n\nStyle/MultilineIfThen:\n  Description: 'Do not use then for multi-line if/unless.'\n  StyleGuide: '#no-then'\n  Enabled: true\n\nStyle/MultilineMemoization:\n  Description: 'Wrap multiline memoizations in a `begin` and `end` block.'\n  Enabled: true\n\nStyle/MultilineTernaryOperator:\n  Description: >-\n    Avoid multi-line ?: (the ternary operator);\n    use if/unless instead.\n  StyleGuide: '#no-multiline-ternary'\n  Enabled: true\n\nStyle/MultipleComparison:\n  Description: >-\n    Avoid comparing a variable with multiple items in a conditional,\n    use Array#include? instead.\n  Enabled: true\n\nStyle/MutableConstant:\n  Description: 'Do not assign mutable objects to constants.'\n  Enabled: true\n\nStyle/NegatedIf:\n  Description: >-\n    Favor unless over if for negative conditions\n    (or control flow or).\n  StyleGuide: '#unless-for-negatives'\n  Enabled: true\n\nStyle/NegatedWhile:\n  Description: 'Favor until over while for negative conditions.'\n  StyleGuide: '#until-for-negatives'\n  Enabled: true\n\nStyle/NestedModifier:\n  Description: 'Avoid using nested modifiers.'\n  StyleGuide: '#no-nested-modifiers'\n  Enabled: true\n\nStyle/NestedParenthesizedCalls:\n  Description: >-\n    Parenthesize method calls which are nested inside the\n    argument list of another parenthesized method call.\n  Enabled: true\n\nStyle/NestedTernaryOperator:\n  Description: 'Use one expression per branch in a ternary operator.'\n  StyleGuide: '#no-nested-ternary'\n  Enabled: true\n\nStyle/Next:\n  Description: 'Use `next` to skip iteration instead of a condition at the end.'\n  StyleGuide: '#no-nested-conditionals'\n  Enabled: true\n\nStyle/NilComparison:\n  Description: 'Prefer x.nil? to x == nil.'\n  StyleGuide: '#predicate-methods'\n  Enabled: true\n\nStyle/NonNilCheck:\n  Description: 'Checks for redundant nil checks.'\n  StyleGuide: '#no-non-nil-checks'\n  Enabled: true\n\nStyle/Not:\n  Description: 'Use ! instead of not.'\n  StyleGuide: '#bang-not-not'\n  Enabled: true\n\nStyle/NumericLiteralPrefix:\n  Description: 'Use smallcase prefixes for numeric literals.'\n  StyleGuide: '#numeric-literal-prefixes'\n  Enabled: true\n\nStyle/NumericLiterals:\n  Description: >-\n    Add underscores to large numeric literals to improve their\n    readability.\n  StyleGuide: '#underscores-in-numerics'\n  Enabled: true\n  Exclude:\n    - 'db/**/*'\n\nStyle/NumericPredicate:\n  Description: >-\n    Checks for the use of predicate- or comparison methods for\n    numeric comparisons.\n  StyleGuide: '#predicate-methods'\n  # This will change to a new method call which isn't guaranteed to be on the\n  # object. Switching these methods has to be done with knowledge of the types\n  # of the variables which rubocop doesn't have.\n  AutoCorrect: false\n  Enabled: true\n\nStyle/OneLineConditional:\n  Description: >-\n    Favor the ternary operator(?:) over\n    if/then/else/end constructs.\n  StyleGuide: '#ternary-operator'\n  Enabled: true\n\nStyle/OptionalArguments:\n  Description: >-\n    Checks for optional arguments that do not appear at the end\n    of the argument list\n  StyleGuide: '#optional-arguments'\n  Enabled: true\n\nStyle/OrAssignment:\n  Description: 'Recommend usage of double pipe equals (||=) where applicable.'\n  StyleGuide: '#double-pipe-for-uninit'\n  Enabled: true\n\nStyle/ParallelAssignment:\n  Description: >-\n    Check for simple usages of parallel assignment.\n    It will only warn when the number of variables\n    matches on both sides of the assignment.\n  StyleGuide: '#parallel-assignment'\n  Enabled: true\n\nStyle/ParenthesesAroundCondition:\n  Description: >-\n    Don't use parentheses around the condition of an\n    if/unless/while.\n  StyleGuide: '#no-parens-around-condition'\n  Enabled: true\n\nStyle/PercentLiteralDelimiters:\n  Description: 'Use `%`-literal delimiters consistently'\n  StyleGuide: '#percent-literal-braces'\n  Enabled: true\n\nStyle/PercentQLiterals:\n  Description: 'Checks if uses of %Q/%q match the configured preference.'\n  Enabled: true\n\nStyle/PerlBackrefs:\n  Description: 'Avoid Perl-style regex back references.'\n  StyleGuide: '#no-perl-regexp-last-matchers'\n  Enabled: true\n\nStyle/PreferredHashMethods:\n  Description: 'Checks use of `has_key?` and `has_value?` Hash methods.'\n  StyleGuide: '#hash-key'\n  Enabled: true\n\nStyle/Proc:\n  Description: 'Use proc instead of Proc.new.'\n  StyleGuide: '#proc'\n  Enabled: true\n\nStyle/RaiseArgs:\n  Description: 'Checks the arguments passed to raise/fail.'\n  StyleGuide: '#exception-class-messages'\n  Enabled: true\n\nStyle/RandomWithOffset:\n  Description: >-\n    Prefer to use ranges when generating random numbers instead of\n    integers with offsets.\n  StyleGuide: '#random-numbers'\n  Enabled: true\n\nStyle/RedundantBegin:\n  Description: \"Don't use begin blocks when they are not needed.\"\n  StyleGuide: '#begin-implicit'\n  Enabled: true\n\nStyle/RedundantConditional:\n  Description: \"Don't return true/false from a conditional.\"\n  Enabled: true\n\nStyle/RedundantException:\n  Description: \"Checks for an obsolete RuntimeException argument in raise/fail.\"\n  StyleGuide: '#no-explicit-runtimeerror'\n  Enabled: true\n\nStyle/RedundantFreeze:\n  Description: \"Checks usages of Object#freeze on immutable objects.\"\n  Enabled: true\n\nStyle/RedundantParentheses:\n  Description: \"Checks for parentheses that seem not to serve any purpose.\"\n  Enabled: true\n\nStyle/RedundantReturn:\n  Description: \"Don't use return where it's not required.\"\n  StyleGuide: '#no-explicit-return'\n  Enabled: true\n\nStyle/RedundantSelf:\n  Description: \"Don't use self where it's not needed.\"\n  StyleGuide: '#no-self-unless-required'\n  Enabled: true\n\nStyle/RegexpLiteral:\n  Description: 'Use / or %r around regular expressions.'\n  StyleGuide: '#percent-r'\n  Enabled: true\n\nStyle/RescueModifier:\n  Description: 'Avoid using rescue in its modifier form.'\n  StyleGuide: '#no-rescue-modifiers'\n  Enabled: true\n\nStyle/RescueStandardError:\n  Description: 'Avoid rescuing without specifying an error class.'\n  Enabled: true\n\nStyle/SafeNavigation:\n  Description: >-\n    This cop transforms usages of a method call safeguarded by\n    a check for the existence of the object to\n    safe navigation (`&.`).\n  Enabled: true\n\nStyle/SelfAssignment:\n  Description: >-\n    Checks for places where self-assignment shorthand should have\n    been used.\n  StyleGuide: '#self-assignment'\n  Enabled: true\n\nStyle/Semicolon:\n  Description: \"Don't use semicolons to terminate expressions.\"\n  StyleGuide: '#no-semicolon'\n  Enabled: true\n\nStyle/SignalException:\n  Description: 'Checks for proper usage of fail and raise.'\n  StyleGuide: '#prefer-raise-over-fail'\n  Enabled: true\n\nStyle/SingleLineMethods:\n  Description: 'Avoid single-line methods.'\n  StyleGuide: '#no-single-line-methods'\n  Enabled: true\n\nStyle/SpecialGlobalVars:\n  Description: 'Avoid Perl-style global variables.'\n  StyleGuide: '#no-cryptic-perlisms'\n  Enabled: true\n\nStyle/StabbyLambdaParentheses:\n  Description: 'Check for the usage of parentheses around stabby lambda arguments.'\n  StyleGuide: '#stabby-lambda-with-args'\n  Enabled: true\n\nStyle/StderrPuts:\n  Description: 'Use `warn` instead of `$stderr.puts`.'\n  StyleGuide: '#warn'\n  Enabled: true\n\nStyle/StringLiterals:\n  Description: 'Checks if uses of quotes match the configured preference.'\n  StyleGuide: '#consistent-string-literals'\n  Enabled: true\n  Exclude:\n    - \"db/schema.rb\"\n\nStyle/StringLiteralsInInterpolation:\n  Description: >-\n    Checks if uses of quotes inside expressions in interpolated\n    strings match the configured preference.\n  Enabled: true\n\nStyle/StructInheritance:\n  Description: 'Checks for inheritance from Struct.new.'\n  StyleGuide: '#no-extend-struct-new'\n  Enabled: true\n\nStyle/SymbolArray:\n  Description: 'Use %i or %I for arrays of symbols.'\n  StyleGuide: '#percent-i'\n  Enabled: true\n\nStyle/SymbolLiteral:\n  Description: 'Use plain symbols instead of string symbols when possible.'\n  Enabled: true\n\nStyle/SymbolProc:\n  Description: 'Use symbols as procs instead of blocks when possible.'\n  Enabled: true\n\nStyle/TernaryParentheses:\n  Description: 'Checks for use of parentheses around ternary conditions.'\n  Enabled: true\n\nStyle/TrailingBodyOnClass:\n  Description: 'Class body goes below class statement.'\n  Enabled: true\n\nStyle/TrailingBodyOnMethodDefinition:\n  Description: 'Method body goes below definition.'\n  Enabled: true\n\nStyle/TrailingBodyOnModule:\n  Description: 'Module body goes below module statement.'\n  Enabled: true\n\nStyle/TrailingCommaInArguments:\n  Description: 'Checks for trailing comma in argument lists.'\n  StyleGuide: '#no-trailing-params-comma'\n  Enabled: true\n\nStyle/TrailingCommaInArrayLiteral:\n  Description: 'Checks for trailing comma in array literals.'\n  StyleGuide: '#no-trailing-array-commas'\n  Enabled: true\n\nStyle/TrailingCommaInHashLiteral:\n  Description: 'Checks for trailing comma in hash literals.'\n  Enabled: true\n\nStyle/TrailingMethodEndStatement:\n  Description: 'Checks for trailing end statement on line of method body.'\n  Enabled: true\n\nStyle/TrailingUnderscoreVariable:\n  Description: >-\n    Checks for the usage of unneeded trailing underscores at the\n    end of parallel variable assignment.\n  AllowNamedUnderscoreVariables: true\n  Enabled: true\n\nStyle/TrivialAccessors:\n  Description: 'Prefer attr_* methods to trivial readers/writers.'\n  StyleGuide: '#attr_family'\n  Enabled: true\n\nStyle/UnlessElse:\n  Description: >-\n    Do not use unless with else. Rewrite these with the positive\n    case first.\n  StyleGuide: '#no-else-with-unless'\n  Enabled: true\n\nStyle/UnneededCapitalW:\n  Description: 'Checks for %W when interpolation is not needed.'\n  Enabled: true\n\nStyle/UnneededInterpolation:\n  Description: 'Checks for strings that are just an interpolated expression.'\n  Enabled: true\n\nStyle/UnneededPercentQ:\n  Description: 'Checks for %q/%Q when single quotes or double quotes would do.'\n  StyleGuide: '#percent-q'\n  Enabled: true\n\nStyle/UnpackFirst:\n  Description: >-\n    Checks for accessing the first element of `String#unpack`\n    instead of using `unpack1`\n  Enabled: true\n\nStyle/VariableInterpolation:\n  Description: >-\n    Don't interpolate global, instance and class variables\n    directly in strings.\n  StyleGuide: '#curlies-interpolate'\n  Enabled: true\n\nStyle/WhenThen:\n  Description: 'Use when x then ... for one-line cases.'\n  StyleGuide: '#one-line-cases'\n  Enabled: true\n\nStyle/WhileUntilDo:\n  Description: 'Checks for redundant do after while or until.'\n  StyleGuide: '#no-multiline-while-do'\n  Enabled: true\n\nStyle/WhileUntilModifier:\n  Description: >-\n    Favor modifier while/until usage when you have a\n    single-line body.\n  StyleGuide: '#while-as-a-modifier'\n  Enabled: true\n\nStyle/WordArray:\n  Description: 'Use %w or %W for arrays of words.'\n  StyleGuide: '#percent-w'\n  Enabled: true\n\nStyle/YodaCondition:\n  Description: 'Do not use literals as the first operand of a comparison.'\n  Reference: 'https://en.wikipedia.org/wiki/Yoda_conditions'\n  Enabled: true\n\nStyle/ZeroLengthPredicate:\n  Description: 'Use #empty? when testing for objects of length 0.'\n  Enabled: true\n"
  },
  {
    "path": ".travis.yml",
    "content": "dist: xenial\nlanguage: ruby\nsudo: true\ncache: bundler\n\ngit:\n  depth: 50\n\nrvm:\n  - 2.5.3\n\nservices:\n  - postgresql\n  - redis-server\n\nmatrix:\n  include:\n    - rvm: 2.5.3\n      name: 'RuboCop (for changed files)'\n      if: branch != master\n      script:\n        - echo \"$(git --no-pager diff --name-only $TRAVIS_COMMIT_RANGE)\" | xargs bundle exec rubocop \"$@\"\n\n    - rvm: 2.5.3\n      name: 'Perform DB setup (with seeds)'\n      before_script:\n        - cp config/database.yml.sample config/database.yml\n      script:\n        - bundle exec rake db:setup\n\n    - rvm: 2.5.3\n      name: 'Tests'\n      addons:\n        apt:\n          sources:\n            - google-chrome\n          packages:\n            - google-chrome-stable\n      before_install:\n        - sudo apt-get update\n        - sudo apt-get install chromium-chromedriver\n      before_script:\n        - export PATH=$PATH:/usr/lib/chromium-browser/\n        - cp config/database.yml.sample config/database.yml\n        - cp .env.test .env\n        - bundle exec rake db:create\n        - bundle exec rake db:schema:load\n      script:\n        - bundle exec rspec\n"
  },
  {
    "path": "Dockerfile",
    "content": "FROM ruby:2.5\nLABEL Stanislav Mekhonoshin <ejabberd@gmail.com>\n\nARG secret_token\n\nRUN curl -sL https://deb.nodesource.com/setup_10.x | bash -\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n  nodejs \\\n  netcat\n\nWORKDIR /app\nCOPY ./ .\nENV RAILS_ENV production\nENV SECRET_TOKEN=$secret_token\n\nRUN gem install foreman\nRUN bundle install\nRUN cp config/database.yml.sample config/database.yml\n\nRUN rake assets:precompile\n\nCMD rm -f /app/tmp/pids/server.pid && rails db:migrate && foreman start -f Procfile\n"
  },
  {
    "path": "Dockerfile.dev",
    "content": "FROM ruby:2.5\nLABEL Stanislav Mekhonoshin <ejabberd@gmail.com>\n\nARG secret_token\nENV SECRET_TOKEN=$secret_token\n\nRUN curl -sL https://deb.nodesource.com/setup_10.x | bash -\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n  apt-utils \\\n  xvfb \\\n  libxi6 \\\n  libgconf-2-4 \\\n  netcat \\\n  wget \\\n  gcc \\\n  g++ \\\n  make \\\n  unzip \\\n  nodejs \\\n  openjdk-8-jre-headless\n\nRUN curl -sS -o - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add \\\n  && echo \"deb http://dl.google.com/linux/chrome/deb/ stable main\" >> /etc/apt/sources.list.d/google-chrome.list \\\n  && apt-get -y update \\\n  && apt-get -y install google-chrome-stable \\\n  && rm -rf /var/lib/apt/lists/* /var/cache/apt/*\n\nRUN wget -N http://chromedriver.storage.googleapis.com/$(curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE)/chromedriver_linux64.zip -P ~/ \\\n  && unzip ~/chromedriver_linux64.zip -d ~/ \\\n  && rm ~/chromedriver_linux64.zip \\\n  && mv -f ~/chromedriver /usr/local/bin/chromedriver \\\n  && chown root:root /usr/local/bin/chromedriver \\\n  && chmod 0755 /usr/local/bin/chromedriver\n\nRUN wget -N http://selenium-release.storage.googleapis.com/3.9/selenium-server-standalone-3.9.0.jar -P ~/ \\\n  && mv -f ~/selenium-server-standalone-3.9.0.jar /usr/local/bin/selenium-server-standalone.jar \\\n  && chown root:root /usr/local/bin/selenium-server-standalone.jar \\\n  && chmod 0755 /usr/local/bin/selenium-server-standalone.jar\n\nWORKDIR /app\nCOPY ./ .\nRUN cp config/database.yml.sample config/database.yml\n\nRUN gem install foreman\nRUN bundle install -j 4\n\nRUN rake assets:precompile\n"
  },
  {
    "path": "Gemfile",
    "content": "# frozen_string_literal: true\n\nsource 'http://rubygems.org'\n# TODO: temporary disable http, until ruby upgrade with new openssl\n# source 'https://rubygems.org'\n\ngem 'rails', '4.2.11'\n\ngem 'pg', '~> 0.15.1'\ngem 'pghero'\ngem 'thin'\n\ngem 'chartkick'\n\ngem 'aasm'\ngem 'activemerchant', '~> 1.32.1'\ngem 'bootstrap', '~> 4.2.1'\ngem 'cancan'\ngem 'clockwork'\ngem 'devise', '4.5.0'\ngem 'devise-i18n', '~> 0.10.3'\ngem 'font-awesome-sass', '~> 5.6.1'\ngem 'kaminari'\ngem 'rails-i18n'\ngem 'simple_form'\ngem 'slim'\n# Temporary broken with rails 4.2\ngem 'active_model_serializers' # , github: 'rails-api/active_model_serializers', branch: '0-9-stable'\n\ngem 'ransack', '1.5.1'\n\n# TODO: switch to stable version\ngem 'carrierwave'\ngem 'draper', '1.4.0'\ngem 'gibbon'\ngem 'mechanize'\ngem 'rails_config'\ngem 'russian_central_bank'\ngem 'show_for', github: 'plataformatec/show_for'\ngem 'whenever', '0.9.0', require: false\n\ngem 'sidekiq'\ngem 'sinatra', require: false\n\ngem 'rollbar'\n# TODO: make it optional via ENV flag\ngem 'newrelic_rpm'\n\ngem 'json', '~> 1.8'\ngem 'thread_safe', '0.3.6'\n\ngroup :assets do\n  gem 'coffee-rails', '~> 4.1.0'\n  gem 'sass-rails'\n  gem 'uglifier'\nend\n\ngem 'jquery-rails'\ngem 'jquery-ui-rails'\n\ngem 'ffi', '>= 1.9.24'\ngem 'jbuilder', '~> 1.0.1'\n\ngroup :development do\n  gem 'better_errors'\n  gem 'foreman'\n  gem 'letter_opener'\n  gem 'migration_opener'\n  gem 'rubocop', require: false\n  gem 'sandi_meter', require: false\n  gem 'web-console', '~> 2.0'\nend\n\ngroup :test, :development do\n  gem 'capybara'\n  gem 'database_cleaner', '1.0.0.RC1'\n  gem 'dotenv-rails'\n  gem 'factory_girl_rails', '~> 4.0'\n  gem 'faker'\n  gem 'i18n-tasks', '~> 0.9.28'\n  gem 'pry-rails'\n  gem 'rspec-its'\n  gem 'rspec-rails', '~> 3.8'\n  gem 'shoulda-matchers', '4.0.0.rc1'\n  gem 'vcr'\n  # TODO: switch to stable version\n  gem 'selenium-webdriver'\n  gem 'timecop'\nend\n\ngroup :test do\n  gem 'simplecov', require: false\n  # TODO: switch to webmock since fakeweb is not supported anymore\n  gem 'capybara-email'\n  gem 'clockwork-test'\n  gem 'fakeweb', github: 'chrisk/fakeweb'\n  gem 'zonebie'\nend\n"
  },
  {
    "path": "LICENSE",
    "content": "Copyright (c) 2015 SmartVPN.biz\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\nall copies 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\nTHE SOFTWARE."
  },
  {
    "path": "Procfile",
    "content": "web: bundle exec rails s -p 3000 -b 0.0.0.0\nworker: bundle exec sidekiq -q high -q default -q mailers\nclockwork: clockwork config/clock.rb\n"
  },
  {
    "path": "README.md",
    "content": "# SmartVPN Billing\n\n[![Build Status](https://travis-ci.org/Mehonoshin/smartvpn-billing.svg?branch=master)](https://travis-ci.org/Mehonoshin/smartvpn-billing)\n[![](https://images.microbadger.com/badges/version/mexx/smartvpn-billing.svg)](https://hub.docker.com/r/mexx/smartvpn-billing)\n[![Inline docs](http://inch-ci.org/github/Mehonoshin/smartvpn-billing.svg?branch=master)](http://inch-ci.org/github/Mehonoshin/smartvpn-billing)\n\n<a href=\"https://imgbb.com/\"><img src=\"https://image.ibb.co/gEVXM9/Screen-Shot-2018-10-14-at-18-34-17.png\" alt=\"smartvpn-billing\" border=\"0\"></a>\n\n\n## About\n\nThis repo contains just billing system for SmartVPN project.\nAll further documentation in this repo relates only to billing system.\n\nIf you are looking for general documentation about the whole SmartVPN please visit [Mehonoshin/smartvpn](https://github.com/Mehonoshin/smartvpn) repo.\n\n## Docker image\n\nThe docker image is built automatically on every merge to master. You can always pull the latest version of the image from Docker Hub.\n\n```\ndocker pull mexx/smartvpn-billing\n```\n\nFor more information about the builds visit docker hub page [mexx/smartvpn-billing](https://hub.docker.com/r/mexx/smartvpn-billing)\n\n## Contribution guidelines\n\nTBD\n\n### Development setup\n\n#### Set Up and Running app locally\n\n1. Clone repo `git clone git@github.com:Mehonoshin/smartvpn-billing.git`\n2. `cd smartvpn-billing`\n3. `cp config/database.yml.sample config/database.yml` and enter the username and password for access to your database.\n4. `cp .env.sample .env`\n5. The file `.env` contains all the env variables used in the application.\n6. `bundle install`\n7. `rake db:setup`\n8. `rails server`\n\n#### Start Up and Developing with Docker\n\n1. Clone repo `git clone git@github.com:Mehonoshin/smartvpn-billing.git`\n2. `cd smartvpn-billing`\n3. `docker-compose -f docker-compose.development.yml up`\n4. `cp .env.sample .env`\n5. Edit your `SECRET_TOKEN` in `.env`\n6. Go to http://lvh.me:3000\n\n*How to run usual RoR command into docker*\n1. `docker-compose -f docker-compose.development.yml up`\n2. `docker-compose exec app bash` - connect to running container as named app\n3. `RAILS_ENV=test ./bin/rake db:setup` - setup test database\n4. `./bin/rails console` - run rails console\n5. `RAILS_ENV=test bundle exec rspec spec` - start rspec tests\n\nHow it works :)\nhttps://www.youtube.com/watch?v=VFRKPO5LHDg\n\n### Admin access\n\n* To get admin access you can go to [http://localhost:3000/admins/sign_in](http://localhost:3000/admins/sign_in)\n* Email: `admin@smartvpn.biz`\n* Password: `1234567`\n\nOther accounts created during seeding can be found at:\n* [Admins](https://github.com/Mehonoshin/smartvpn-billing/blob/master/db/seeds/06_admin.rb)\n* [Users](https://github.com/Mehonoshin/smartvpn-billing/blob/master/db/seeds/04_default_user.rb#L8)\n"
  },
  {
    "path": "Rakefile",
    "content": "# frozen_string_literal: true\n\n# Add your own tasks in files placed in lib/tasks ending in .rake,\n# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.\n\nrequire File.expand_path('config/application', __dir__)\n\nSmartvpn::Application.load_tasks\n"
  },
  {
    "path": "Vagrantfile",
    "content": "# frozen_string_literal: true\n\n# -*- mode: ruby -*-\n# vi: set ft=ruby :\n\nrequire 'date'\n\n# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!\nVAGRANTFILE_API_VERSION = '2'\nDEFAULT_BOX = 'Sgoettschkes/debian7'\nSUBNET = '192.168.33'\n\nVagrant.configure(VAGRANTFILE_API_VERSION) do |config|\n  config.vm.box = DEFAULT_BOX\n\n  config.vm.define 'dev', primary: true do |dev|\n    dev.vm.network :private_network, ip: \"#{SUBNET}.10\"\n    dev.vm.network :forwarded_port, guest: 5432, host: 5432 # pq\n    dev.vm.network :forwarded_port, guest: 6379, host: 6379 # redis\n    script = <<~SCRIPT\n            date --set #{DateTime.now.strftime('%Y-%m-%d')}\n            date --set #{DateTime.now.strftime('%H:%M')}\n            set -e\n\n            DEBIAN_FRONTEND=noninteractive\n\n            apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 9D6D8F6BC857C906\n            apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 7638D0442B90D010\n            apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 7638D0442B90D010\n\n            apt-get -qqy update\n\n            PG_PKG=postgresql\n            PG_INSTALLED=$(dpkg -l | grep -q ${PG_PKG} || echo \"NOT\")\n            if [ \"x${PG_INSTALLED}\" = \"xNOT\" ] ; then\n\n              echo 'deb http://apt.postgresql.org/pub/repos/apt/ wheezy-pgdg main' > /etc/apt/sources.list.d/pgdg.list\n              wget https://www.postgresql.org/media/keys/ACCC4CF8.asc --no-check-certificate\n              apt-key add ACCC4CF8.asc\n              apt-get update\n\n            echo 'Name: libraries/restart-without-asking\n      Template: libraries/restart-without-asking\n      Value: true\n      Owners: libssl1.0.0\n      Flags: seen' >> /var/cache/debconf/config.dat\n\n              apt-get -qyf install postgresql-10 postgresql-contrib-10 postgresql postgresql-contrib\n\n              sed -i \"s|#listen_addresses.*$|listen_addresses = '*' |g\" /etc/postgresql/9.3/main/postgresql.conf\n              echo \"host    all             all             all               trust\" > /etc/postgresql/9.3/main/pg_hba.conf\n              /etc/init.d/postgresql restart\n            fi\n\n            REDIS_PKG=redis-server\n            REDIS_INSTALLED=$(dpkg -l | grep -q ${REDIS_PKG} || echo \"NOT\")\n            if [ \"x${REDIS_INSTALLED}\" = \"xNOT\" ] ; then\n              apt-get -qy install $REDIS_PKG\n              sed -i \"s|bind 127.0.0.1|#bind = 127.0.0.1|g\" /etc/redis/redis.conf\n              /etc/init.d/redis-server restart\n            fi\n\n            echo DONE\n    SCRIPT\n    dev.vm.provision :shell, inline: script\n  end\n\n  config.vm.define 'stage' do |stage|\n    stage.vm.network :private_network, ip: \"#{SUBNET}.11\"\n  end\n\n  config.vm.define 'node' do |node|\n    node.vm.network :private_network, ip: \"#{SUBNET}.12\"\n  end\nend\n"
  },
  {
    "path": "app/assets/images/README.txt",
    "content": "----------------------------\nIMAGE DIRECTORY (/img)\n----------------------------\n\nThis directory should contain all images used throughout the site.\nImages within the root are used by css as background images.\n\n----------------------------\nSUB DIRECTORIES\n----------------------------\n\nAll other images to within sub-directories related to the section of the site they appear in. Maintaining this structure is optionally but recommended.\n\n/blog - all blog related photos\n/customers - customer/client logos\n/features - app feature screenshots\n/slides - slide images used on homepage banner\n/team - team member photos used in the about section\n/misc - random images\n\n\n----------------------------\nIMAGE & PHOTO CREDITS\n----------------------------\n* Slideshow graphics: http://medialoot.com & http://www.premiumpixels.com/\n* Team photos: http://www.flickr.com/photos/vectorportal/sets/72157622868867274/\n* Blog photos: http://www.flickr.com/photos/xjrlokix/ (Ben Fredericson)\n* Patterns: http://subtlepatterns.com/"
  },
  {
    "path": "app/assets/images/invoice/license.txt",
    "content": "These icons were gathered from: iconfinder.com\r\n\r\n"
  },
  {
    "path": "app/assets/javascripts/admin.js.coffee",
    "content": "#= require jquery\n#= require jquery_ujs\n#= require jquery3\n#= require popper\n#= require bootstrap-sprockets\n#= require Chart.bundle\n#= require chartkick\n"
  },
  {
    "path": "app/assets/javascripts/application.js.coffee",
    "content": "#= require jquery\n#= require jquery_ujs\n#= require ./theme/bootstrap-transition\n#= require ./theme/bootstrap-alert\n#= require ./theme/bootstrap-affix\n#= require ./theme/bootstrap-modal\n#= require ./theme/bootstrap-dropdown\n#= require ./theme/bootstrap-scrollspy\n#= require ./theme/bootstrap-tab\n#= require ./theme/bootstrap-tooltip\n#= require ./theme/bootstrap-popover\n#= require ./theme/bootstrap-button\n#= require ./theme/bootstrap-collapse\n#= require ./theme/bootstrap-carousel\n#= require ./theme/bootstrap-typeahead\n#= require ./theme/jquery.quicksand\n#= require ./theme/jquery.flexslider-min\n#= require ./theme/script\n#= require jquery.ui.all\n#= require main\n#= require options\n\n\n#= require jquery3\n#= require popper\n#= require bootstrap-sprockets\n"
  },
  {
    "path": "app/assets/javascripts/main.js.coffee",
    "content": "$ ->\n  credentialsToggler = $('.collapsable-credentials .toggler')\n  vpnCredentials = $('.collapsable-credentials .vpn-credential')\n\n  credentialsToggler.click (e) ->\n    e.preventDefault()\n    vpnCredentials.toggle()\n\n  $(\"input.datepicker\").each (i) ->\n    $(this).datepicker\n      altFormat: \"mm-dd-yy\"\n      dateFormat: \"mm-dd-yy\"\n      altField: $(this).next()\n"
  },
  {
    "path": "app/assets/javascripts/options.js.coffee",
    "content": "class @Options\n  constructor: (scope) ->\n    @option = $(scope)\n    @bind()\n\n  bind: ->\n    @option.find('select').on 'change', @update\n\n  update: (ev) ->\n    $(ev.target).closest('form').submit()\n\n$ ->\n  $(\"tr.option\").each ->\n    new Options(this)\n\n\n"
  },
  {
    "path": "app/assets/javascripts/theme/bootstrap-affix.js",
    "content": "/* ==========================================================\n * bootstrap-affix.js v2.2.2\n * http://twitter.github.com/bootstrap/javascript.html#affix\n * ==========================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================== */\n\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* AFFIX CLASS DEFINITION\n  * ====================== */\n\n  var Affix = function (element, options) {\n    this.options = $.extend({}, $.fn.affix.defaults, options)\n    this.$window = $(window)\n      .on('scroll.affix.data-api', $.proxy(this.checkPosition, this))\n      .on('click.affix.data-api',  $.proxy(function () { setTimeout($.proxy(this.checkPosition, this), 1) }, this))\n    this.$element = $(element)\n    this.checkPosition()\n  }\n\n  Affix.prototype.checkPosition = function () {\n    if (!this.$element.is(':visible')) return\n\n    var scrollHeight = $(document).height()\n      , scrollTop = this.$window.scrollTop()\n      , position = this.$element.offset()\n      , offset = this.options.offset\n      , offsetBottom = offset.bottom\n      , offsetTop = offset.top\n      , reset = 'affix affix-top affix-bottom'\n      , affix\n\n    if (typeof offset != 'object') offsetBottom = offsetTop = offset\n    if (typeof offsetTop == 'function') offsetTop = offset.top()\n    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()\n\n    affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ?\n      false    : offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ?\n      'bottom' : offsetTop != null && scrollTop <= offsetTop ?\n      'top'    : false\n\n    if (this.affixed === affix) return\n\n    this.affixed = affix\n    this.unpin = affix == 'bottom' ? position.top - scrollTop : null\n\n    this.$element.removeClass(reset).addClass('affix' + (affix ? '-' + affix : ''))\n  }\n\n\n /* AFFIX PLUGIN DEFINITION\n  * ======================= */\n\n  var old = $.fn.affix\n\n  $.fn.affix = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('affix')\n        , options = typeof option == 'object' && option\n      if (!data) $this.data('affix', (data = new Affix(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.affix.Constructor = Affix\n\n  $.fn.affix.defaults = {\n    offset: 0\n  }\n\n\n /* AFFIX NO CONFLICT\n  * ================= */\n\n  $.fn.affix.noConflict = function () {\n    $.fn.affix = old\n    return this\n  }\n\n\n /* AFFIX DATA-API\n  * ============== */\n\n  $(window).on('load', function () {\n    $('[data-spy=\"affix\"]').each(function () {\n      var $spy = $(this)\n        , data = $spy.data()\n\n      data.offset = data.offset || {}\n\n      data.offsetBottom && (data.offset.bottom = data.offsetBottom)\n      data.offsetTop && (data.offset.top = data.offsetTop)\n\n      $spy.affix(data)\n    })\n  })\n\n\n}(window.jQuery);"
  },
  {
    "path": "app/assets/javascripts/theme/bootstrap-alert.js",
    "content": "/* ==========================================================\n * bootstrap-alert.js v2.2.2\n * http://twitter.github.com/bootstrap/javascript.html#alerts\n * ==========================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================== */\n\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* ALERT CLASS DEFINITION\n  * ====================== */\n\n  var dismiss = '[data-dismiss=\"alert\"]'\n    , Alert = function (el) {\n        $(el).on('click', dismiss, this.close)\n      }\n\n  Alert.prototype.close = function (e) {\n    var $this = $(this)\n      , selector = $this.attr('data-target')\n      , $parent\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') //strip for ie7\n    }\n\n    $parent = $(selector)\n\n    e && e.preventDefault()\n\n    $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent())\n\n    $parent.trigger(e = $.Event('close'))\n\n    if (e.isDefaultPrevented()) return\n\n    $parent.removeClass('in')\n\n    function removeElement() {\n      $parent\n        .trigger('closed')\n        .remove()\n    }\n\n    $.support.transition && $parent.hasClass('fade') ?\n      $parent.on($.support.transition.end, removeElement) :\n      removeElement()\n  }\n\n\n /* ALERT PLUGIN DEFINITION\n  * ======================= */\n\n  var old = $.fn.alert\n\n  $.fn.alert = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('alert')\n      if (!data) $this.data('alert', (data = new Alert(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  $.fn.alert.Constructor = Alert\n\n\n /* ALERT NO CONFLICT\n  * ================= */\n\n  $.fn.alert.noConflict = function () {\n    $.fn.alert = old\n    return this\n  }\n\n\n /* ALERT DATA-API\n  * ============== */\n\n  $(document).on('click.alert.data-api', dismiss, Alert.prototype.close)\n\n}(window.jQuery);"
  },
  {
    "path": "app/assets/javascripts/theme/bootstrap-button.js",
    "content": "/* ============================================================\n * bootstrap-button.js v2.2.2\n * http://twitter.github.com/bootstrap/javascript.html#buttons\n * ============================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ============================================================ */\n\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* BUTTON PUBLIC CLASS DEFINITION\n  * ============================== */\n\n  var Button = function (element, options) {\n    this.$element = $(element)\n    this.options = $.extend({}, $.fn.button.defaults, options)\n  }\n\n  Button.prototype.setState = function (state) {\n    var d = 'disabled'\n      , $el = this.$element\n      , data = $el.data()\n      , val = $el.is('input') ? 'val' : 'html'\n\n    state = state + 'Text'\n    data.resetText || $el.data('resetText', $el[val]())\n\n    $el[val](data[state] || this.options[state])\n\n    // push to event loop to allow forms to submit\n    setTimeout(function () {\n      state == 'loadingText' ?\n        $el.addClass(d).attr(d, d) :\n        $el.removeClass(d).removeAttr(d)\n    }, 0)\n  }\n\n  Button.prototype.toggle = function () {\n    var $parent = this.$element.closest('[data-toggle=\"buttons-radio\"]')\n\n    $parent && $parent\n      .find('.active')\n      .removeClass('active')\n\n    this.$element.toggleClass('active')\n  }\n\n\n /* BUTTON PLUGIN DEFINITION\n  * ======================== */\n\n  var old = $.fn.button\n\n  $.fn.button = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('button')\n        , options = typeof option == 'object' && option\n      if (!data) $this.data('button', (data = new Button(this, options)))\n      if (option == 'toggle') data.toggle()\n      else if (option) data.setState(option)\n    })\n  }\n\n  $.fn.button.defaults = {\n    loadingText: 'loading...'\n  }\n\n  $.fn.button.Constructor = Button\n\n\n /* BUTTON NO CONFLICT\n  * ================== */\n\n  $.fn.button.noConflict = function () {\n    $.fn.button = old\n    return this\n  }\n\n\n /* BUTTON DATA-API\n  * =============== */\n\n  $(document).on('click.button.data-api', '[data-toggle^=button]', function (e) {\n    var $btn = $(e.target)\n    if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')\n    $btn.button('toggle')\n  })\n\n}(window.jQuery);"
  },
  {
    "path": "app/assets/javascripts/theme/bootstrap-carousel.js",
    "content": "/* ==========================================================\n * bootstrap-carousel.js v2.2.2\n * http://twitter.github.com/bootstrap/javascript.html#carousel\n * ==========================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================== */\n\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* CAROUSEL CLASS DEFINITION\n  * ========================= */\n\n  var Carousel = function (element, options) {\n    this.$element = $(element)\n    this.options = options\n    this.options.pause == 'hover' && this.$element\n      .on('mouseenter', $.proxy(this.pause, this))\n      .on('mouseleave', $.proxy(this.cycle, this))\n  }\n\n  Carousel.prototype = {\n\n    cycle: function (e) {\n      if (!e) this.paused = false\n      this.options.interval\n        && !this.paused\n        && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))\n      return this\n    }\n\n  , to: function (pos) {\n      var $active = this.$element.find('.item.active')\n        , children = $active.parent().children()\n        , activePos = children.index($active)\n        , that = this\n\n      if (pos > (children.length - 1) || pos < 0) return\n\n      if (this.sliding) {\n        return this.$element.one('slid', function () {\n          that.to(pos)\n        })\n      }\n\n      if (activePos == pos) {\n        return this.pause().cycle()\n      }\n\n      return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos]))\n    }\n\n  , pause: function (e) {\n      if (!e) this.paused = true\n      if (this.$element.find('.next, .prev').length && $.support.transition.end) {\n        this.$element.trigger($.support.transition.end)\n        this.cycle()\n      }\n      clearInterval(this.interval)\n      this.interval = null\n      return this\n    }\n\n  , next: function () {\n      if (this.sliding) return\n      return this.slide('next')\n    }\n\n  , prev: function () {\n      if (this.sliding) return\n      return this.slide('prev')\n    }\n\n  , slide: function (type, next) {\n      var $active = this.$element.find('.item.active')\n        , $next = next || $active[type]()\n        , isCycling = this.interval\n        , direction = type == 'next' ? 'left' : 'right'\n        , fallback  = type == 'next' ? 'first' : 'last'\n        , that = this\n        , e\n\n      this.sliding = true\n\n      isCycling && this.pause()\n\n      $next = $next.length ? $next : this.$element.find('.item')[fallback]()\n\n      e = $.Event('slide', {\n        relatedTarget: $next[0]\n      })\n\n      if ($next.hasClass('active')) return\n\n      if ($.support.transition && this.$element.hasClass('slide')) {\n        this.$element.trigger(e)\n        if (e.isDefaultPrevented()) return\n        $next.addClass(type)\n        $next[0].offsetWidth // force reflow\n        $active.addClass(direction)\n        $next.addClass(direction)\n        this.$element.one($.support.transition.end, function () {\n          $next.removeClass([type, direction].join(' ')).addClass('active')\n          $active.removeClass(['active', direction].join(' '))\n          that.sliding = false\n          setTimeout(function () { that.$element.trigger('slid') }, 0)\n        })\n      } else {\n        this.$element.trigger(e)\n        if (e.isDefaultPrevented()) return\n        $active.removeClass('active')\n        $next.addClass('active')\n        this.sliding = false\n        this.$element.trigger('slid')\n      }\n\n      isCycling && this.cycle()\n\n      return this\n    }\n\n  }\n\n\n /* CAROUSEL PLUGIN DEFINITION\n  * ========================== */\n\n  var old = $.fn.carousel\n\n  $.fn.carousel = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('carousel')\n        , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option)\n        , action = typeof option == 'string' ? option : options.slide\n      if (!data) $this.data('carousel', (data = new Carousel(this, options)))\n      if (typeof option == 'number') data.to(option)\n      else if (action) data[action]()\n      else if (options.interval) data.cycle()\n    })\n  }\n\n  $.fn.carousel.defaults = {\n    interval: 5000\n  , pause: 'hover'\n  }\n\n  $.fn.carousel.Constructor = Carousel\n\n\n /* CAROUSEL NO CONFLICT\n  * ==================== */\n\n  $.fn.carousel.noConflict = function () {\n    $.fn.carousel = old\n    return this\n  }\n\n /* CAROUSEL DATA-API\n  * ================= */\n\n  $(document).on('click.carousel.data-api', '[data-slide]', function (e) {\n    var $this = $(this), href\n      , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) //strip for ie7\n      , options = $.extend({}, $target.data(), $this.data())\n    $target.carousel(options)\n    e.preventDefault()\n  })\n\n}(window.jQuery);"
  },
  {
    "path": "app/assets/javascripts/theme/bootstrap-collapse.js",
    "content": "/* =============================================================\n * bootstrap-collapse.js v2.2.2\n * http://twitter.github.com/bootstrap/javascript.html#collapse\n * =============================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ============================================================ */\n\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* COLLAPSE PUBLIC CLASS DEFINITION\n  * ================================ */\n\n  var Collapse = function (element, options) {\n    this.$element = $(element)\n    this.options = $.extend({}, $.fn.collapse.defaults, options)\n\n    if (this.options.parent) {\n      this.$parent = $(this.options.parent)\n    }\n\n    this.options.toggle && this.toggle()\n  }\n\n  Collapse.prototype = {\n\n    constructor: Collapse\n\n  , dimension: function () {\n      var hasWidth = this.$element.hasClass('width')\n      return hasWidth ? 'width' : 'height'\n    }\n\n  , show: function () {\n      var dimension\n        , scroll\n        , actives\n        , hasData\n\n      if (this.transitioning) return\n\n      dimension = this.dimension()\n      scroll = $.camelCase(['scroll', dimension].join('-'))\n      actives = this.$parent && this.$parent.find('> .accordion-group > .in')\n\n      if (actives && actives.length) {\n        hasData = actives.data('collapse')\n        if (hasData && hasData.transitioning) return\n        actives.collapse('hide')\n        hasData || actives.data('collapse', null)\n      }\n\n      this.$element[dimension](0)\n      this.transition('addClass', $.Event('show'), 'shown')\n      $.support.transition && this.$element[dimension](this.$element[0][scroll])\n    }\n\n  , hide: function () {\n      var dimension\n      if (this.transitioning) return\n      dimension = this.dimension()\n      this.reset(this.$element[dimension]())\n      this.transition('removeClass', $.Event('hide'), 'hidden')\n      this.$element[dimension](0)\n    }\n\n  , reset: function (size) {\n      var dimension = this.dimension()\n\n      this.$element\n        .removeClass('collapse')\n        [dimension](size || 'auto')\n        [0].offsetWidth\n\n      this.$element[size !== null ? 'addClass' : 'removeClass']('collapse')\n\n      return this\n    }\n\n  , transition: function (method, startEvent, completeEvent) {\n      var that = this\n        , complete = function () {\n            if (startEvent.type == 'show') that.reset()\n            that.transitioning = 0\n            that.$element.trigger(completeEvent)\n          }\n\n      this.$element.trigger(startEvent)\n\n      if (startEvent.isDefaultPrevented()) return\n\n      this.transitioning = 1\n\n      this.$element[method]('in')\n\n      $.support.transition && this.$element.hasClass('collapse') ?\n        this.$element.one($.support.transition.end, complete) :\n        complete()\n    }\n\n  , toggle: function () {\n      this[this.$element.hasClass('in') ? 'hide' : 'show']()\n    }\n\n  }\n\n\n /* COLLAPSE PLUGIN DEFINITION\n  * ========================== */\n\n  var old = $.fn.collapse\n\n  $.fn.collapse = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('collapse')\n        , options = typeof option == 'object' && option\n      if (!data) $this.data('collapse', (data = new Collapse(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.collapse.defaults = {\n    toggle: true\n  }\n\n  $.fn.collapse.Constructor = Collapse\n\n\n /* COLLAPSE NO CONFLICT\n  * ==================== */\n\n  $.fn.collapse.noConflict = function () {\n    $.fn.collapse = old\n    return this\n  }\n\n\n /* COLLAPSE DATA-API\n  * ================= */\n\n  $(document).on('click.collapse.data-api', '[data-toggle=collapse]', function (e) {\n    var $this = $(this), href\n      , target = $this.attr('data-target')\n        || e.preventDefault()\n        || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '') //strip for ie7\n      , option = $(target).data('collapse') ? 'toggle' : $this.data()\n    $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed')\n    $(target).collapse(option)\n  })\n\n}(window.jQuery);"
  },
  {
    "path": "app/assets/javascripts/theme/bootstrap-dropdown.js",
    "content": "/* ============================================================\n * bootstrap-dropdown.js v2.2.2\n * http://twitter.github.com/bootstrap/javascript.html#dropdowns\n * ============================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ============================================================ */\n\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* DROPDOWN CLASS DEFINITION\n  * ========================= */\n\n  var toggle = '[data-toggle=dropdown]'\n    , Dropdown = function (element) {\n        var $el = $(element).on('click.dropdown.data-api', this.toggle)\n        $('html').on('click.dropdown.data-api', function () {\n          $el.parent().removeClass('open')\n        })\n      }\n\n  Dropdown.prototype = {\n\n    constructor: Dropdown\n\n  , toggle: function (e) {\n      var $this = $(this)\n        , $parent\n        , isActive\n\n      if ($this.is('.disabled, :disabled')) return\n\n      $parent = getParent($this)\n\n      isActive = $parent.hasClass('open')\n\n      clearMenus()\n\n      if (!isActive) {\n        $parent.toggleClass('open')\n      }\n\n      $this.focus()\n\n      return false\n    }\n\n  , keydown: function (e) {\n      var $this\n        , $items\n        , $active\n        , $parent\n        , isActive\n        , index\n\n      if (!/(38|40|27)/.test(e.keyCode)) return\n\n      $this = $(this)\n\n      e.preventDefault()\n      e.stopPropagation()\n\n      if ($this.is('.disabled, :disabled')) return\n\n      $parent = getParent($this)\n\n      isActive = $parent.hasClass('open')\n\n      if (!isActive || (isActive && e.keyCode == 27)) return $this.click()\n\n      $items = $('[role=menu] li:not(.divider):visible a', $parent)\n\n      if (!$items.length) return\n\n      index = $items.index($items.filter(':focus'))\n\n      if (e.keyCode == 38 && index > 0) index--                                        // up\n      if (e.keyCode == 40 && index < $items.length - 1) index++                        // down\n      if (!~index) index = 0\n\n      $items\n        .eq(index)\n        .focus()\n    }\n\n  }\n\n  function clearMenus() {\n    $(toggle).each(function () {\n      getParent($(this)).removeClass('open')\n    })\n  }\n\n  function getParent($this) {\n    var selector = $this.attr('data-target')\n      , $parent\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\\s]*$)/, '') //strip for ie7\n    }\n\n    $parent = $(selector)\n    $parent.length || ($parent = $this.parent())\n\n    return $parent\n  }\n\n\n  /* DROPDOWN PLUGIN DEFINITION\n   * ========================== */\n\n  var old = $.fn.dropdown\n\n  $.fn.dropdown = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('dropdown')\n      if (!data) $this.data('dropdown', (data = new Dropdown(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  $.fn.dropdown.Constructor = Dropdown\n\n\n /* DROPDOWN NO CONFLICT\n  * ==================== */\n\n  $.fn.dropdown.noConflict = function () {\n    $.fn.dropdown = old\n    return this\n  }\n\n\n  /* APPLY TO STANDARD DROPDOWN ELEMENTS\n   * =================================== */\n\n  $(document)\n    .on('click.dropdown.data-api touchstart.dropdown.data-api', clearMenus)\n    .on('click.dropdown touchstart.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })\n    .on('touchstart.dropdown.data-api', '.dropdown-menu', function (e) { e.stopPropagation() })\n    .on('click.dropdown.data-api touchstart.dropdown.data-api'  , toggle, Dropdown.prototype.toggle)\n    .on('keydown.dropdown.data-api touchstart.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)\n\n}(window.jQuery);"
  },
  {
    "path": "app/assets/javascripts/theme/bootstrap-modal.js",
    "content": "/* =========================================================\n * bootstrap-modal.js v2.2.2\n * http://twitter.github.com/bootstrap/javascript.html#modals\n * =========================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================= */\n\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* MODAL CLASS DEFINITION\n  * ====================== */\n\n  var Modal = function (element, options) {\n    this.options = options\n    this.$element = $(element)\n      .delegate('[data-dismiss=\"modal\"]', 'click.dismiss.modal', $.proxy(this.hide, this))\n    this.options.remote && this.$element.find('.modal-body').load(this.options.remote)\n  }\n\n  Modal.prototype = {\n\n      constructor: Modal\n\n    , toggle: function () {\n        return this[!this.isShown ? 'show' : 'hide']()\n      }\n\n    , show: function () {\n        var that = this\n          , e = $.Event('show')\n\n        this.$element.trigger(e)\n\n        if (this.isShown || e.isDefaultPrevented()) return\n\n        this.isShown = true\n\n        this.escape()\n\n        this.backdrop(function () {\n          var transition = $.support.transition && that.$element.hasClass('fade')\n\n          if (!that.$element.parent().length) {\n            that.$element.appendTo(document.body) //don't move modals dom position\n          }\n\n          that.$element\n            .show()\n\n          if (transition) {\n            that.$element[0].offsetWidth // force reflow\n          }\n\n          that.$element\n            .addClass('in')\n            .attr('aria-hidden', false)\n\n          that.enforceFocus()\n\n          transition ?\n            that.$element.one($.support.transition.end, function () { that.$element.focus().trigger('shown') }) :\n            that.$element.focus().trigger('shown')\n\n        })\n      }\n\n    , hide: function (e) {\n        e && e.preventDefault()\n\n        var that = this\n\n        e = $.Event('hide')\n\n        this.$element.trigger(e)\n\n        if (!this.isShown || e.isDefaultPrevented()) return\n\n        this.isShown = false\n\n        this.escape()\n\n        $(document).off('focusin.modal')\n\n        this.$element\n          .removeClass('in')\n          .attr('aria-hidden', true)\n\n        $.support.transition && this.$element.hasClass('fade') ?\n          this.hideWithTransition() :\n          this.hideModal()\n      }\n\n    , enforceFocus: function () {\n        var that = this\n        $(document).on('focusin.modal', function (e) {\n          if (that.$element[0] !== e.target && !that.$element.has(e.target).length) {\n            that.$element.focus()\n          }\n        })\n      }\n\n    , escape: function () {\n        var that = this\n        if (this.isShown && this.options.keyboard) {\n          this.$element.on('keyup.dismiss.modal', function ( e ) {\n            e.which == 27 && that.hide()\n          })\n        } else if (!this.isShown) {\n          this.$element.off('keyup.dismiss.modal')\n        }\n      }\n\n    , hideWithTransition: function () {\n        var that = this\n          , timeout = setTimeout(function () {\n              that.$element.off($.support.transition.end)\n              that.hideModal()\n            }, 500)\n\n        this.$element.one($.support.transition.end, function () {\n          clearTimeout(timeout)\n          that.hideModal()\n        })\n      }\n\n    , hideModal: function (that) {\n        this.$element\n          .hide()\n          .trigger('hidden')\n\n        this.backdrop()\n      }\n\n    , removeBackdrop: function () {\n        this.$backdrop.remove()\n        this.$backdrop = null\n      }\n\n    , backdrop: function (callback) {\n        var that = this\n          , animate = this.$element.hasClass('fade') ? 'fade' : ''\n\n        if (this.isShown && this.options.backdrop) {\n          var doAnimate = $.support.transition && animate\n\n          this.$backdrop = $('<div class=\"modal-backdrop ' + animate + '\" />')\n            .appendTo(document.body)\n\n          this.$backdrop.click(\n            this.options.backdrop == 'static' ?\n              $.proxy(this.$element[0].focus, this.$element[0])\n            : $.proxy(this.hide, this)\n          )\n\n          if (doAnimate) this.$backdrop[0].offsetWidth // force reflow\n\n          this.$backdrop.addClass('in')\n\n          doAnimate ?\n            this.$backdrop.one($.support.transition.end, callback) :\n            callback()\n\n        } else if (!this.isShown && this.$backdrop) {\n          this.$backdrop.removeClass('in')\n\n          $.support.transition && this.$element.hasClass('fade')?\n            this.$backdrop.one($.support.transition.end, $.proxy(this.removeBackdrop, this)) :\n            this.removeBackdrop()\n\n        } else if (callback) {\n          callback()\n        }\n      }\n  }\n\n\n /* MODAL PLUGIN DEFINITION\n  * ======================= */\n\n  var old = $.fn.modal\n\n  $.fn.modal = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('modal')\n        , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)\n      if (!data) $this.data('modal', (data = new Modal(this, options)))\n      if (typeof option == 'string') data[option]()\n      else if (options.show) data.show()\n    })\n  }\n\n  $.fn.modal.defaults = {\n      backdrop: true\n    , keyboard: true\n    , show: true\n  }\n\n  $.fn.modal.Constructor = Modal\n\n\n /* MODAL NO CONFLICT\n  * ================= */\n\n  $.fn.modal.noConflict = function () {\n    $.fn.modal = old\n    return this\n  }\n\n\n /* MODAL DATA-API\n  * ============== */\n\n  $(document).on('click.modal.data-api', '[data-toggle=\"modal\"]', function (e) {\n    var $this = $(this)\n      , href = $this.attr('href')\n      , $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\\s]+$)/, ''))) //strip for ie7\n      , option = $target.data('modal') ? 'toggle' : $.extend({ remote:!/#/.test(href) && href }, $target.data(), $this.data())\n\n    e.preventDefault()\n\n    $target\n      .modal(option)\n      .one('hide', function () {\n        $this.focus()\n      })\n  })\n\n}(window.jQuery);\n"
  },
  {
    "path": "app/assets/javascripts/theme/bootstrap-popover.js",
    "content": "/* ===========================================================\n * bootstrap-popover.js v2.2.2\n * http://twitter.github.com/bootstrap/javascript.html#popovers\n * ===========================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =========================================================== */\n\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* POPOVER PUBLIC CLASS DEFINITION\n  * =============================== */\n\n  var Popover = function (element, options) {\n    this.init('popover', element, options)\n  }\n\n\n  /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js\n     ========================================== */\n\n  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, {\n\n    constructor: Popover\n\n  , setContent: function () {\n      var $tip = this.tip()\n        , title = this.getTitle()\n        , content = this.getContent()\n\n      $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)\n      $tip.find('.popover-content')[this.options.html ? 'html' : 'text'](content)\n\n      $tip.removeClass('fade top bottom left right in')\n    }\n\n  , hasContent: function () {\n      return this.getTitle() || this.getContent()\n    }\n\n  , getContent: function () {\n      var content\n        , $e = this.$element\n        , o = this.options\n\n      content = $e.attr('data-content')\n        || (typeof o.content == 'function' ? o.content.call($e[0]) :  o.content)\n\n      return content\n    }\n\n  , tip: function () {\n      if (!this.$tip) {\n        this.$tip = $(this.options.template)\n      }\n      return this.$tip\n    }\n\n  , destroy: function () {\n      this.hide().$element.off('.' + this.type).removeData(this.type)\n    }\n\n  })\n\n\n /* POPOVER PLUGIN DEFINITION\n  * ======================= */\n\n  var old = $.fn.popover\n\n  $.fn.popover = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('popover')\n        , options = typeof option == 'object' && option\n      if (!data) $this.data('popover', (data = new Popover(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.popover.Constructor = Popover\n\n  $.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, {\n    placement: 'right'\n  , trigger: 'click'\n  , content: ''\n  , template: '<div class=\"popover\"><div class=\"arrow\"></div><div class=\"popover-inner\"><h3 class=\"popover-title\"></h3><div class=\"popover-content\"></div></div></div>'\n  })\n\n\n /* POPOVER NO CONFLICT\n  * =================== */\n\n  $.fn.popover.noConflict = function () {\n    $.fn.popover = old\n    return this\n  }\n\n}(window.jQuery);"
  },
  {
    "path": "app/assets/javascripts/theme/bootstrap-scrollspy.js",
    "content": "/* =============================================================\n * bootstrap-scrollspy.js v2.2.2\n * http://twitter.github.com/bootstrap/javascript.html#scrollspy\n * =============================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ============================================================== */\n\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* SCROLLSPY CLASS DEFINITION\n  * ========================== */\n\n  function ScrollSpy(element, options) {\n    var process = $.proxy(this.process, this)\n      , $element = $(element).is('body') ? $(window) : $(element)\n      , href\n    this.options = $.extend({}, $.fn.scrollspy.defaults, options)\n    this.$scrollElement = $element.on('scroll.scroll-spy.data-api', process)\n    this.selector = (this.options.target\n      || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) //strip for ie7\n      || '') + ' .nav li > a'\n    this.$body = $('body')\n    this.refresh()\n    this.process()\n  }\n\n  ScrollSpy.prototype = {\n\n      constructor: ScrollSpy\n\n    , refresh: function () {\n        var self = this\n          , $targets\n\n        this.offsets = $([])\n        this.targets = $([])\n\n        $targets = this.$body\n          .find(this.selector)\n          .map(function () {\n            var $el = $(this)\n              , href = $el.data('target') || $el.attr('href')\n              , $href = /^#\\w/.test(href) && $(href)\n            return ( $href\n              && $href.length\n              && [[ $href.position().top + self.$scrollElement.scrollTop(), href ]] ) || null\n          })\n          .sort(function (a, b) { return a[0] - b[0] })\n          .each(function () {\n            self.offsets.push(this[0])\n            self.targets.push(this[1])\n          })\n      }\n\n    , process: function () {\n        var scrollTop = this.$scrollElement.scrollTop() + this.options.offset\n          , scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight\n          , maxScroll = scrollHeight - this.$scrollElement.height()\n          , offsets = this.offsets\n          , targets = this.targets\n          , activeTarget = this.activeTarget\n          , i\n\n        if (scrollTop >= maxScroll) {\n          return activeTarget != (i = targets.last()[0])\n            && this.activate ( i )\n        }\n\n        for (i = offsets.length; i--;) {\n          activeTarget != targets[i]\n            && scrollTop >= offsets[i]\n            && (!offsets[i + 1] || scrollTop <= offsets[i + 1])\n            && this.activate( targets[i] )\n        }\n      }\n\n    , activate: function (target) {\n        var active\n          , selector\n\n        this.activeTarget = target\n\n        $(this.selector)\n          .parent('.active')\n          .removeClass('active')\n\n        selector = this.selector\n          + '[data-target=\"' + target + '\"],'\n          + this.selector + '[href=\"' + target + '\"]'\n\n        active = $(selector)\n          .parent('li')\n          .addClass('active')\n\n        if (active.parent('.dropdown-menu').length)  {\n          active = active.closest('li.dropdown').addClass('active')\n        }\n\n        active.trigger('activate')\n      }\n\n  }\n\n\n /* SCROLLSPY PLUGIN DEFINITION\n  * =========================== */\n\n  var old = $.fn.scrollspy\n\n  $.fn.scrollspy = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('scrollspy')\n        , options = typeof option == 'object' && option\n      if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.scrollspy.Constructor = ScrollSpy\n\n  $.fn.scrollspy.defaults = {\n    offset: 10\n  }\n\n\n /* SCROLLSPY NO CONFLICT\n  * ===================== */\n\n  $.fn.scrollspy.noConflict = function () {\n    $.fn.scrollspy = old\n    return this\n  }\n\n\n /* SCROLLSPY DATA-API\n  * ================== */\n\n  $(window).on('load', function () {\n    $('[data-spy=\"scroll\"]').each(function () {\n      var $spy = $(this)\n      $spy.scrollspy($spy.data())\n    })\n  })\n\n}(window.jQuery);"
  },
  {
    "path": "app/assets/javascripts/theme/bootstrap-tab.js",
    "content": "/* ========================================================\n * bootstrap-tab.js v2.2.2\n * http://twitter.github.com/bootstrap/javascript.html#tabs\n * ========================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================== */\n\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* TAB CLASS DEFINITION\n  * ==================== */\n\n  var Tab = function (element) {\n    this.element = $(element)\n  }\n\n  Tab.prototype = {\n\n    constructor: Tab\n\n  , show: function () {\n      var $this = this.element\n        , $ul = $this.closest('ul:not(.dropdown-menu)')\n        , selector = $this.attr('data-target')\n        , previous\n        , $target\n        , e\n\n      if (!selector) {\n        selector = $this.attr('href')\n        selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') //strip for ie7\n      }\n\n      if ( $this.parent('li').hasClass('active') ) return\n\n      previous = $ul.find('.active:last a')[0]\n\n      e = $.Event('show', {\n        relatedTarget: previous\n      })\n\n      $this.trigger(e)\n\n      if (e.isDefaultPrevented()) return\n\n      $target = $(selector)\n\n      this.activate($this.parent('li'), $ul)\n      this.activate($target, $target.parent(), function () {\n        $this.trigger({\n          type: 'shown'\n        , relatedTarget: previous\n        })\n      })\n    }\n\n  , activate: function ( element, container, callback) {\n      var $active = container.find('> .active')\n        , transition = callback\n            && $.support.transition\n            && $active.hasClass('fade')\n\n      function next() {\n        $active\n          .removeClass('active')\n          .find('> .dropdown-menu > .active')\n          .removeClass('active')\n\n        element.addClass('active')\n\n        if (transition) {\n          element[0].offsetWidth // reflow for transition\n          element.addClass('in')\n        } else {\n          element.removeClass('fade')\n        }\n\n        if ( element.parent('.dropdown-menu') ) {\n          element.closest('li.dropdown').addClass('active')\n        }\n\n        callback && callback()\n      }\n\n      transition ?\n        $active.one($.support.transition.end, next) :\n        next()\n\n      $active.removeClass('in')\n    }\n  }\n\n\n /* TAB PLUGIN DEFINITION\n  * ===================== */\n\n  var old = $.fn.tab\n\n  $.fn.tab = function ( option ) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('tab')\n      if (!data) $this.data('tab', (data = new Tab(this)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.tab.Constructor = Tab\n\n\n /* TAB NO CONFLICT\n  * =============== */\n\n  $.fn.tab.noConflict = function () {\n    $.fn.tab = old\n    return this\n  }\n\n\n /* TAB DATA-API\n  * ============ */\n\n  $(document).on('click.tab.data-api', '[data-toggle=\"tab\"], [data-toggle=\"pill\"]', function (e) {\n    e.preventDefault()\n    $(this).tab('show')\n  })\n\n}(window.jQuery);"
  },
  {
    "path": "app/assets/javascripts/theme/bootstrap-tooltip.js",
    "content": "/* ===========================================================\n * bootstrap-tooltip.js v2.2.2\n * http://twitter.github.com/bootstrap/javascript.html#tooltips\n * Inspired by the original jQuery.tipsy by Jason Frame\n * ===========================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================== */\n\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* TOOLTIP PUBLIC CLASS DEFINITION\n  * =============================== */\n\n  var Tooltip = function (element, options) {\n    this.init('tooltip', element, options)\n  }\n\n  Tooltip.prototype = {\n\n    constructor: Tooltip\n\n  , init: function (type, element, options) {\n      var eventIn\n        , eventOut\n\n      this.type = type\n      this.$element = $(element)\n      this.options = this.getOptions(options)\n      this.enabled = true\n\n      if (this.options.trigger == 'click') {\n        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))\n      } else if (this.options.trigger != 'manual') {\n        eventIn = this.options.trigger == 'hover' ? 'mouseenter' : 'focus'\n        eventOut = this.options.trigger == 'hover' ? 'mouseleave' : 'blur'\n        this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))\n        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))\n      }\n\n      this.options.selector ?\n        (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :\n        this.fixTitle()\n    }\n\n  , getOptions: function (options) {\n      options = $.extend({}, $.fn[this.type].defaults, options, this.$element.data())\n\n      if (options.delay && typeof options.delay == 'number') {\n        options.delay = {\n          show: options.delay\n        , hide: options.delay\n        }\n      }\n\n      return options\n    }\n\n  , enter: function (e) {\n      var self = $(e.currentTarget)[this.type](this._options).data(this.type)\n\n      if (!self.options.delay || !self.options.delay.show) return self.show()\n\n      clearTimeout(this.timeout)\n      self.hoverState = 'in'\n      this.timeout = setTimeout(function() {\n        if (self.hoverState == 'in') self.show()\n      }, self.options.delay.show)\n    }\n\n  , leave: function (e) {\n      var self = $(e.currentTarget)[this.type](this._options).data(this.type)\n\n      if (this.timeout) clearTimeout(this.timeout)\n      if (!self.options.delay || !self.options.delay.hide) return self.hide()\n\n      self.hoverState = 'out'\n      this.timeout = setTimeout(function() {\n        if (self.hoverState == 'out') self.hide()\n      }, self.options.delay.hide)\n    }\n\n  , show: function () {\n      var $tip\n        , inside\n        , pos\n        , actualWidth\n        , actualHeight\n        , placement\n        , tp\n\n      if (this.hasContent() && this.enabled) {\n        $tip = this.tip()\n        this.setContent()\n\n        if (this.options.animation) {\n          $tip.addClass('fade')\n        }\n\n        placement = typeof this.options.placement == 'function' ?\n          this.options.placement.call(this, $tip[0], this.$element[0]) :\n          this.options.placement\n\n        inside = /in/.test(placement)\n\n        $tip\n          .detach()\n          .css({ top: 0, left: 0, display: 'block' })\n          .insertAfter(this.$element)\n\n        pos = this.getPosition(inside)\n\n        actualWidth = $tip[0].offsetWidth\n        actualHeight = $tip[0].offsetHeight\n\n        switch (inside ? placement.split(' ')[1] : placement) {\n          case 'bottom':\n            tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2}\n            break\n          case 'top':\n            tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2}\n            break\n          case 'left':\n            tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth}\n            break\n          case 'right':\n            tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width}\n            break\n        }\n\n        $tip\n          .offset(tp)\n          .addClass(placement)\n          .addClass('in')\n      }\n    }\n\n  , setContent: function () {\n      var $tip = this.tip()\n        , title = this.getTitle()\n\n      $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)\n      $tip.removeClass('fade in top bottom left right')\n    }\n\n  , hide: function () {\n      var that = this\n        , $tip = this.tip()\n\n      $tip.removeClass('in')\n\n      function removeWithAnimation() {\n        var timeout = setTimeout(function () {\n          $tip.off($.support.transition.end).detach()\n        }, 500)\n\n        $tip.one($.support.transition.end, function () {\n          clearTimeout(timeout)\n          $tip.detach()\n        })\n      }\n\n      $.support.transition && this.$tip.hasClass('fade') ?\n        removeWithAnimation() :\n        $tip.detach()\n\n      return this\n    }\n\n  , fixTitle: function () {\n      var $e = this.$element\n      if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {\n        $e.attr('data-original-title', $e.attr('title') || '').removeAttr('title')\n      }\n    }\n\n  , hasContent: function () {\n      return this.getTitle()\n    }\n\n  , getPosition: function (inside) {\n      return $.extend({}, (inside ? {top: 0, left: 0} : this.$element.offset()), {\n        width: this.$element[0].offsetWidth\n      , height: this.$element[0].offsetHeight\n      })\n    }\n\n  , getTitle: function () {\n      var title\n        , $e = this.$element\n        , o = this.options\n\n      title = $e.attr('data-original-title')\n        || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)\n\n      return title\n    }\n\n  , tip: function () {\n      return this.$tip = this.$tip || $(this.options.template)\n    }\n\n  , validate: function () {\n      if (!this.$element[0].parentNode) {\n        this.hide()\n        this.$element = null\n        this.options = null\n      }\n    }\n\n  , enable: function () {\n      this.enabled = true\n    }\n\n  , disable: function () {\n      this.enabled = false\n    }\n\n  , toggleEnabled: function () {\n      this.enabled = !this.enabled\n    }\n\n  , toggle: function (e) {\n      var self = $(e.currentTarget)[this.type](this._options).data(this.type)\n      self[self.tip().hasClass('in') ? 'hide' : 'show']()\n    }\n\n  , destroy: function () {\n      this.hide().$element.off('.' + this.type).removeData(this.type)\n    }\n\n  }\n\n\n /* TOOLTIP PLUGIN DEFINITION\n  * ========================= */\n\n  var old = $.fn.tooltip\n\n  $.fn.tooltip = function ( option ) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('tooltip')\n        , options = typeof option == 'object' && option\n      if (!data) $this.data('tooltip', (data = new Tooltip(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.tooltip.Constructor = Tooltip\n\n  $.fn.tooltip.defaults = {\n    animation: true\n  , placement: 'top'\n  , selector: false\n  , template: '<div class=\"tooltip\"><div class=\"tooltip-arrow\"></div><div class=\"tooltip-inner\"></div></div>'\n  , trigger: 'hover'\n  , title: ''\n  , delay: 0\n  , html: false\n  }\n\n\n /* TOOLTIP NO CONFLICT\n  * =================== */\n\n  $.fn.tooltip.noConflict = function () {\n    $.fn.tooltip = old\n    return this\n  }\n\n}(window.jQuery);"
  },
  {
    "path": "app/assets/javascripts/theme/bootstrap-transition.js",
    "content": "/* ===================================================\n * bootstrap-transition.js v2.2.2\n * http://twitter.github.com/bootstrap/javascript.html#transitions\n * ===================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================== */\n\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n  /* CSS TRANSITION SUPPORT (http://www.modernizr.com/)\n   * ======================================================= */\n\n  $(function () {\n\n    $.support.transition = (function () {\n\n      var transitionEnd = (function () {\n\n        var el = document.createElement('bootstrap')\n          , transEndEventNames = {\n               'WebkitTransition' : 'webkitTransitionEnd'\n            ,  'MozTransition'    : 'transitionend'\n            ,  'OTransition'      : 'oTransitionEnd otransitionend'\n            ,  'transition'       : 'transitionend'\n            }\n          , name\n\n        for (name in transEndEventNames){\n          if (el.style[name] !== undefined) {\n            return transEndEventNames[name]\n          }\n        }\n\n      }())\n\n      return transitionEnd && {\n        end: transitionEnd\n      }\n\n    })()\n\n  })\n\n}(window.jQuery);"
  },
  {
    "path": "app/assets/javascripts/theme/bootstrap-typeahead.js",
    "content": "/* =============================================================\n * bootstrap-typeahead.js v2.2.2\n * http://twitter.github.com/bootstrap/javascript.html#typeahead\n * =============================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ============================================================ */\n\n\n!function($){\n\n  \"use strict\"; // jshint ;_;\n\n\n /* TYPEAHEAD PUBLIC CLASS DEFINITION\n  * ================================= */\n\n  var Typeahead = function (element, options) {\n    this.$element = $(element)\n    this.options = $.extend({}, $.fn.typeahead.defaults, options)\n    this.matcher = this.options.matcher || this.matcher\n    this.sorter = this.options.sorter || this.sorter\n    this.highlighter = this.options.highlighter || this.highlighter\n    this.updater = this.options.updater || this.updater\n    this.source = this.options.source\n    this.$menu = $(this.options.menu)\n    this.shown = false\n    this.listen()\n  }\n\n  Typeahead.prototype = {\n\n    constructor: Typeahead\n\n  , select: function () {\n      var val = this.$menu.find('.active').attr('data-value')\n      this.$element\n        .val(this.updater(val))\n        .change()\n      return this.hide()\n    }\n\n  , updater: function (item) {\n      return item\n    }\n\n  , show: function () {\n      var pos = $.extend({}, this.$element.position(), {\n        height: this.$element[0].offsetHeight\n      })\n\n      this.$menu\n        .insertAfter(this.$element)\n        .css({\n          top: pos.top + pos.height\n        , left: pos.left\n        })\n        .show()\n\n      this.shown = true\n      return this\n    }\n\n  , hide: function () {\n      this.$menu.hide()\n      this.shown = false\n      return this\n    }\n\n  , lookup: function (event) {\n      var items\n\n      this.query = this.$element.val()\n\n      if (!this.query || this.query.length < this.options.minLength) {\n        return this.shown ? this.hide() : this\n      }\n\n      items = $.isFunction(this.source) ? this.source(this.query, $.proxy(this.process, this)) : this.source\n\n      return items ? this.process(items) : this\n    }\n\n  , process: function (items) {\n      var that = this\n\n      items = $.grep(items, function (item) {\n        return that.matcher(item)\n      })\n\n      items = this.sorter(items)\n\n      if (!items.length) {\n        return this.shown ? this.hide() : this\n      }\n\n      return this.render(items.slice(0, this.options.items)).show()\n    }\n\n  , matcher: function (item) {\n      return ~item.toLowerCase().indexOf(this.query.toLowerCase())\n    }\n\n  , sorter: function (items) {\n      var beginswith = []\n        , caseSensitive = []\n        , caseInsensitive = []\n        , item\n\n      while (item = items.shift()) {\n        if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item)\n        else if (~item.indexOf(this.query)) caseSensitive.push(item)\n        else caseInsensitive.push(item)\n      }\n\n      return beginswith.concat(caseSensitive, caseInsensitive)\n    }\n\n  , highlighter: function (item) {\n      var query = this.query.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, '\\\\$&')\n      return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) {\n        return '<strong>' + match + '</strong>'\n      })\n    }\n\n  , render: function (items) {\n      var that = this\n\n      items = $(items).map(function (i, item) {\n        i = $(that.options.item).attr('data-value', item)\n        i.find('a').html(that.highlighter(item))\n        return i[0]\n      })\n\n      items.first().addClass('active')\n      this.$menu.html(items)\n      return this\n    }\n\n  , next: function (event) {\n      var active = this.$menu.find('.active').removeClass('active')\n        , next = active.next()\n\n      if (!next.length) {\n        next = $(this.$menu.find('li')[0])\n      }\n\n      next.addClass('active')\n    }\n\n  , prev: function (event) {\n      var active = this.$menu.find('.active').removeClass('active')\n        , prev = active.prev()\n\n      if (!prev.length) {\n        prev = this.$menu.find('li').last()\n      }\n\n      prev.addClass('active')\n    }\n\n  , listen: function () {\n      this.$element\n        .on('blur',     $.proxy(this.blur, this))\n        .on('keypress', $.proxy(this.keypress, this))\n        .on('keyup',    $.proxy(this.keyup, this))\n\n      if (this.eventSupported('keydown')) {\n        this.$element.on('keydown', $.proxy(this.keydown, this))\n      }\n\n      this.$menu\n        .on('click', $.proxy(this.click, this))\n        .on('mouseenter', 'li', $.proxy(this.mouseenter, this))\n    }\n\n  , eventSupported: function(eventName) {\n      var isSupported = eventName in this.$element\n      if (!isSupported) {\n        this.$element.setAttribute(eventName, 'return;')\n        isSupported = typeof this.$element[eventName] === 'function'\n      }\n      return isSupported\n    }\n\n  , move: function (e) {\n      if (!this.shown) return\n\n      switch(e.keyCode) {\n        case 9: // tab\n        case 13: // enter\n        case 27: // escape\n          e.preventDefault()\n          break\n\n        case 38: // up arrow\n          e.preventDefault()\n          this.prev()\n          break\n\n        case 40: // down arrow\n          e.preventDefault()\n          this.next()\n          break\n      }\n\n      e.stopPropagation()\n    }\n\n  , keydown: function (e) {\n      this.suppressKeyPressRepeat = ~$.inArray(e.keyCode, [40,38,9,13,27])\n      this.move(e)\n    }\n\n  , keypress: function (e) {\n      if (this.suppressKeyPressRepeat) return\n      this.move(e)\n    }\n\n  , keyup: function (e) {\n      switch(e.keyCode) {\n        case 40: // down arrow\n        case 38: // up arrow\n        case 16: // shift\n        case 17: // ctrl\n        case 18: // alt\n          break\n\n        case 9: // tab\n        case 13: // enter\n          if (!this.shown) return\n          this.select()\n          break\n\n        case 27: // escape\n          if (!this.shown) return\n          this.hide()\n          break\n\n        default:\n          this.lookup()\n      }\n\n      e.stopPropagation()\n      e.preventDefault()\n  }\n\n  , blur: function (e) {\n      var that = this\n      setTimeout(function () { that.hide() }, 150)\n    }\n\n  , click: function (e) {\n      e.stopPropagation()\n      e.preventDefault()\n      this.select()\n    }\n\n  , mouseenter: function (e) {\n      this.$menu.find('.active').removeClass('active')\n      $(e.currentTarget).addClass('active')\n    }\n\n  }\n\n\n  /* TYPEAHEAD PLUGIN DEFINITION\n   * =========================== */\n\n  var old = $.fn.typeahead\n\n  $.fn.typeahead = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('typeahead')\n        , options = typeof option == 'object' && option\n      if (!data) $this.data('typeahead', (data = new Typeahead(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.typeahead.defaults = {\n    source: []\n  , items: 8\n  , menu: '<ul class=\"typeahead dropdown-menu\"></ul>'\n  , item: '<li><a href=\"#\"></a></li>'\n  , minLength: 1\n  }\n\n  $.fn.typeahead.Constructor = Typeahead\n\n\n /* TYPEAHEAD NO CONFLICT\n  * =================== */\n\n  $.fn.typeahead.noConflict = function () {\n    $.fn.typeahead = old\n    return this\n  }\n\n\n /* TYPEAHEAD DATA-API\n  * ================== */\n\n  $(document).on('focus.typeahead.data-api', '[data-provide=\"typeahead\"]', function (e) {\n    var $this = $(this)\n    if ($this.data('typeahead')) return\n    e.preventDefault()\n    $this.typeahead($this.data())\n  })\n\n}(window.jQuery);\n"
  },
  {
    "path": "app/assets/javascripts/theme/html5shim.js",
    "content": "/*! HTML5 Shiv vpre3.6 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed\n  Uncompressed source: https://github.com/aFarkas/html5shiv  */\n(function(a,b){function h(a,b){var c=a.createElement(\"p\"),d=a.getElementsByTagName(\"head\")[0]||a.documentElement;return c.innerHTML=\"x<style>\"+b+\"</style>\",d.insertBefore(c.lastChild,d.firstChild)}function i(){var a=l.elements;return typeof a==\"string\"?a.split(\" \"):a}function j(a){var b={},c=a.createElement,f=a.createDocumentFragment,g=f();a.createElement=function(a){if(!l.shivMethods)return c(a);var f;return b[a]?f=b[a].cloneNode():e.test(a)?f=(b[a]=c(a)).cloneNode():f=c(a),f.canHaveChildren&&!d.test(a)?g.appendChild(f):f},a.createDocumentFragment=Function(\"h,f\",\"return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&(\"+i().join().replace(/\\w+/g,function(a){return c(a),g.createElement(a),'c(\"'+a+'\")'})+\");return n}\")(l,g)}function k(a){var b;return a.documentShived?a:(l.shivCSS&&!f&&(b=!!h(a,\"article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio{display:none}canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden]{display:none}audio[controls]{display:inline-block;*display:inline;*zoom:1}mark{background:#FF0;color:#000}\")),g||(b=!j(a)),b&&(a.documentShived=b),a)}var c=a.html5||{},d=/^<|^(?:button|form|map|select|textarea|object|iframe|option|optgroup)$/i,e=/^<|^(?:a|b|button|code|div|fieldset|form|h1|h2|h3|h4|h5|h6|i|iframe|img|input|label|li|link|ol|option|p|param|q|script|select|span|strong|style|table|tbody|td|textarea|tfoot|th|thead|tr|ul)$/i,f,g;(function(){var c=b.createElement(\"a\");c.innerHTML=\"<xyz></xyz>\",f=\"hidden\"in c,f&&typeof injectElementWithStyles==\"function\"&&injectElementWithStyles(\"#modernizr{}\",function(b){b.hidden=!0,f=(a.getComputedStyle?getComputedStyle(b,null):b.currentStyle).display==\"none\"}),g=c.childNodes.length==1||function(){try{b.createElement(\"a\")}catch(a){return!0}var c=b.createDocumentFragment();return typeof c.cloneNode==\"undefined\"||typeof c.createDocumentFragment==\"undefined\"||typeof c.createElement==\"undefined\"}()})();var l={elements:c.elements||\"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video\",shivCSS:c.shivCSS!==!1,shivMethods:c.shivMethods!==!1,type:\"default\",shivDocument:k};a.html5=l,k(b)})(this,document)"
  },
  {
    "path": "app/assets/javascripts/theme/jquery.flexslider-min.js",
    "content": "/*\n * jQuery FlexSlider v2.1\n * Copyright 2012 WooThemes\n * Contributing Author: Tyler Smith\n */\n ;(function(d){d.flexslider=function(i,k){var a=d(i),c=d.extend({},d.flexslider.defaults,k),e=c.namespace,p=\"ontouchstart\"in window||window.DocumentTouch&&document instanceof DocumentTouch,t=p?\"touchend\":\"click\",l=\"vertical\"===c.direction,m=c.reverse,h=0<c.itemWidth,r=\"fade\"===c.animation,s=\"\"!==c.asNavFor,f={};d.data(i,\"flexslider\",a);f={init:function(){a.animating=!1;a.currentSlide=c.startAt;a.animatingTo=a.currentSlide;a.atEnd=0===a.currentSlide||a.currentSlide===a.last;a.containerSelector=c.selector.substr(0,\n c.selector.search(\" \"));a.slides=d(c.selector,a);a.container=d(a.containerSelector,a);a.count=a.slides.length;a.syncExists=0<d(c.sync).length;\"slide\"===c.animation&&(c.animation=\"swing\");a.prop=l?\"top\":\"marginLeft\";a.args={};a.manualPause=!1;var b=a,g;if(g=!c.video)if(g=!r)if(g=c.useCSS)a:{g=document.createElement(\"div\");var n=[\"perspectiveProperty\",\"WebkitPerspective\",\"MozPerspective\",\"OPerspective\",\"msPerspective\"],e;for(e in n)if(void 0!==g.style[n[e]]){a.pfx=n[e].replace(\"Perspective\",\"\").toLowerCase();\n a.prop=\"-\"+a.pfx+\"-transform\";g=!0;break a}g=!1}b.transitions=g;\"\"!==c.controlsContainer&&(a.controlsContainer=0<d(c.controlsContainer).length&&d(c.controlsContainer));\"\"!==c.manualControls&&(a.manualControls=0<d(c.manualControls).length&&d(c.manualControls));c.randomize&&(a.slides.sort(function(){return Math.round(Math.random())-0.5}),a.container.empty().append(a.slides));a.doMath();s&&f.asNav.setup();a.setup(\"init\");c.controlNav&&f.controlNav.setup();c.directionNav&&f.directionNav.setup();c.keyboard&&\n (1===d(a.containerSelector).length||c.multipleKeyboard)&&d(document).bind(\"keyup\",function(b){b=b.keyCode;if(!a.animating&&(39===b||37===b))b=39===b?a.getTarget(\"next\"):37===b?a.getTarget(\"prev\"):!1,a.flexAnimate(b,c.pauseOnAction)});c.mousewheel&&a.bind(\"mousewheel\",function(b,g){b.preventDefault();var d=0>g?a.getTarget(\"next\"):a.getTarget(\"prev\");a.flexAnimate(d,c.pauseOnAction)});c.pausePlay&&f.pausePlay.setup();c.slideshow&&(c.pauseOnHover&&a.hover(function(){!a.manualPlay&&!a.manualPause&&a.pause()},\n function(){!a.manualPause&&!a.manualPlay&&a.play()}),0<c.initDelay?setTimeout(a.play,c.initDelay):a.play());p&&c.touch&&f.touch();(!r||r&&c.smoothHeight)&&d(window).bind(\"resize focus\",f.resize);setTimeout(function(){c.start(a)},200)},asNav:{setup:function(){a.asNav=!0;a.animatingTo=Math.floor(a.currentSlide/a.move);a.currentItem=a.currentSlide;a.slides.removeClass(e+\"active-slide\").eq(a.currentItem).addClass(e+\"active-slide\");a.slides.click(function(b){b.preventDefault();var b=d(this),g=b.index();\n !d(c.asNavFor).data(\"flexslider\").animating&&!b.hasClass(\"active\")&&(a.direction=a.currentItem<g?\"next\":\"prev\",a.flexAnimate(g,c.pauseOnAction,!1,!0,!0))})}},controlNav:{setup:function(){a.manualControls?f.controlNav.setupManual():f.controlNav.setupPaging()},setupPaging:function(){var b=1,g;a.controlNavScaffold=d('<ol class=\"'+e+\"control-nav \"+e+(\"thumbnails\"===c.controlNav?\"control-thumbs\":\"control-paging\")+'\"></ol>');if(1<a.pagingCount)for(var n=0;n<a.pagingCount;n++)g=\"thumbnails\"===c.controlNav?\n '<img src=\"'+a.slides.eq(n).attr(\"data-thumb\")+'\"/>':\"<a>\"+b+\"</a>\",a.controlNavScaffold.append(\"<li>\"+g+\"</li>\"),b++;a.controlsContainer?d(a.controlsContainer).append(a.controlNavScaffold):a.append(a.controlNavScaffold);f.controlNav.set();f.controlNav.active();a.controlNavScaffold.delegate(\"a, img\",t,function(b){b.preventDefault();var b=d(this),g=a.controlNav.index(b);b.hasClass(e+\"active\")||(a.direction=g>a.currentSlide?\"next\":\"prev\",a.flexAnimate(g,c.pauseOnAction))});p&&a.controlNavScaffold.delegate(\"a\",\n \"click touchstart\",function(a){a.preventDefault()})},setupManual:function(){a.controlNav=a.manualControls;f.controlNav.active();a.controlNav.live(t,function(b){b.preventDefault();var b=d(this),g=a.controlNav.index(b);b.hasClass(e+\"active\")||(g>a.currentSlide?a.direction=\"next\":a.direction=\"prev\",a.flexAnimate(g,c.pauseOnAction))});p&&a.controlNav.live(\"click touchstart\",function(a){a.preventDefault()})},set:function(){a.controlNav=d(\".\"+e+\"control-nav li \"+(\"thumbnails\"===c.controlNav?\"img\":\"a\"),\n a.controlsContainer?a.controlsContainer:a)},active:function(){a.controlNav.removeClass(e+\"active\").eq(a.animatingTo).addClass(e+\"active\")},update:function(b,c){1<a.pagingCount&&\"add\"===b?a.controlNavScaffold.append(d(\"<li><a>\"+a.count+\"</a></li>\")):1===a.pagingCount?a.controlNavScaffold.find(\"li\").remove():a.controlNav.eq(c).closest(\"li\").remove();f.controlNav.set();1<a.pagingCount&&a.pagingCount!==a.controlNav.length?a.update(c,b):f.controlNav.active()}},directionNav:{setup:function(){var b=d('<ul class=\"'+\n e+'direction-nav\"><li><a class=\"'+e+'prev\" href=\"#\">'+c.prevText+'</a></li><li><a class=\"'+e+'next\" href=\"#\">'+c.nextText+\"</a></li></ul>\");a.controlsContainer?(d(a.controlsContainer).append(b),a.directionNav=d(\".\"+e+\"direction-nav li a\",a.controlsContainer)):(a.append(b),a.directionNav=d(\".\"+e+\"direction-nav li a\",a));f.directionNav.update();a.directionNav.bind(t,function(b){b.preventDefault();b=d(this).hasClass(e+\"next\")?a.getTarget(\"next\"):a.getTarget(\"prev\");a.flexAnimate(b,c.pauseOnAction)});\n p&&a.directionNav.bind(\"click touchstart\",function(a){a.preventDefault()})},update:function(){var b=e+\"disabled\";1===a.pagingCount?a.directionNav.addClass(b):c.animationLoop?a.directionNav.removeClass(b):0===a.animatingTo?a.directionNav.removeClass(b).filter(\".\"+e+\"prev\").addClass(b):a.animatingTo===a.last?a.directionNav.removeClass(b).filter(\".\"+e+\"next\").addClass(b):a.directionNav.removeClass(b)}},pausePlay:{setup:function(){var b=d('<div class=\"'+e+'pauseplay\"><a></a></div>');a.controlsContainer?\n (a.controlsContainer.append(b),a.pausePlay=d(\".\"+e+\"pauseplay a\",a.controlsContainer)):(a.append(b),a.pausePlay=d(\".\"+e+\"pauseplay a\",a));f.pausePlay.update(c.slideshow?e+\"pause\":e+\"play\");a.pausePlay.bind(t,function(b){b.preventDefault();d(this).hasClass(e+\"pause\")?(a.manualPause=!0,a.manualPlay=!1,a.pause()):(a.manualPause=!1,a.manualPlay=!0,a.play())});p&&a.pausePlay.bind(\"click touchstart\",function(a){a.preventDefault()})},update:function(b){\"play\"===b?a.pausePlay.removeClass(e+\"pause\").addClass(e+\n \"play\").text(c.playText):a.pausePlay.removeClass(e+\"play\").addClass(e+\"pause\").text(c.pauseText)}},touch:function(){function b(b){j=l?d-b.touches[0].pageY:d-b.touches[0].pageX;p=l?Math.abs(j)<Math.abs(b.touches[0].pageX-e):Math.abs(j)<Math.abs(b.touches[0].pageY-e);if(!p||500<Number(new Date)-k)b.preventDefault(),!r&&a.transitions&&(c.animationLoop||(j/=0===a.currentSlide&&0>j||a.currentSlide===a.last&&0<j?Math.abs(j)/q+2:1),a.setProps(f+j,\"setTouch\"))}function g(){i.removeEventListener(\"touchmove\",\n b,!1);if(a.animatingTo===a.currentSlide&&!p&&null!==j){var h=m?-j:j,l=0<h?a.getTarget(\"next\"):a.getTarget(\"prev\");a.canAdvance(l)&&(550>Number(new Date)-k&&50<Math.abs(h)||Math.abs(h)>q/2)?a.flexAnimate(l,c.pauseOnAction):r||a.flexAnimate(a.currentSlide,c.pauseOnAction,!0)}i.removeEventListener(\"touchend\",g,!1);f=j=e=d=null}var d,e,f,q,j,k,p=!1;i.addEventListener(\"touchstart\",function(j){a.animating?j.preventDefault():1===j.touches.length&&(a.pause(),q=l?a.h:a.w,k=Number(new Date),f=h&&m&&a.animatingTo===\n a.last?0:h&&m?a.limit-(a.itemW+c.itemMargin)*a.move*a.animatingTo:h&&a.currentSlide===a.last?a.limit:h?(a.itemW+c.itemMargin)*a.move*a.currentSlide:m?(a.last-a.currentSlide+a.cloneOffset)*q:(a.currentSlide+a.cloneOffset)*q,d=l?j.touches[0].pageY:j.touches[0].pageX,e=l?j.touches[0].pageX:j.touches[0].pageY,i.addEventListener(\"touchmove\",b,!1),i.addEventListener(\"touchend\",g,!1))},!1)},resize:function(){!a.animating&&a.is(\":visible\")&&(h||a.doMath(),r?f.smoothHeight():h?(a.slides.width(a.computedW),\n a.update(a.pagingCount),a.setProps()):l?(a.viewport.height(a.h),a.setProps(a.h,\"setTotal\")):(c.smoothHeight&&f.smoothHeight(),a.newSlides.width(a.computedW),a.setProps(a.computedW,\"setTotal\")))},smoothHeight:function(b){if(!l||r){var c=r?a:a.viewport;b?c.animate({height:a.slides.eq(a.animatingTo).height()},b):c.height(a.slides.eq(a.animatingTo).height())}},sync:function(b){var g=d(c.sync).data(\"flexslider\"),e=a.animatingTo;switch(b){case \"animate\":g.flexAnimate(e,c.pauseOnAction,!1,!0);break;case \"play\":!g.playing&&\n !g.asNav&&g.play();break;case \"pause\":g.pause()}}};a.flexAnimate=function(b,g,n,i,k){s&&1===a.pagingCount&&(a.direction=a.currentItem<b?\"next\":\"prev\");if(!a.animating&&(a.canAdvance(b,k)||n)&&a.is(\":visible\")){if(s&&i)if(n=d(c.asNavFor).data(\"flexslider\"),a.atEnd=0===b||b===a.count-1,n.flexAnimate(b,!0,!1,!0,k),a.direction=a.currentItem<b?\"next\":\"prev\",n.direction=a.direction,Math.ceil((b+1)/a.visible)-1!==a.currentSlide&&0!==b)a.currentItem=b,a.slides.removeClass(e+\"active-slide\").eq(b).addClass(e+\n \"active-slide\"),b=Math.floor(b/a.visible);else return a.currentItem=b,a.slides.removeClass(e+\"active-slide\").eq(b).addClass(e+\"active-slide\"),!1;a.animating=!0;a.animatingTo=b;c.before(a);g&&a.pause();a.syncExists&&!k&&f.sync(\"animate\");c.controlNav&&f.controlNav.active();h||a.slides.removeClass(e+\"active-slide\").eq(b).addClass(e+\"active-slide\");a.atEnd=0===b||b===a.last;c.directionNav&&f.directionNav.update();b===a.last&&(c.end(a),c.animationLoop||a.pause());if(r)p?(a.slides.eq(a.currentSlide).css({opacity:0,\n zIndex:1}),a.slides.eq(b).css({opacity:1,zIndex:2}),a.slides.unbind(\"webkitTransitionEnd transitionend\"),a.slides.eq(a.currentSlide).bind(\"webkitTransitionEnd transitionend\",function(){c.after(a)}),a.animating=!1,a.currentSlide=a.animatingTo):(a.slides.eq(a.currentSlide).fadeOut(c.animationSpeed,c.easing),a.slides.eq(b).fadeIn(c.animationSpeed,c.easing,a.wrapup));else{var q=l?a.slides.filter(\":first\").height():a.computedW;h?(b=c.itemWidth>a.w?2*c.itemMargin:c.itemMargin,b=(a.itemW+b)*a.move*a.animatingTo,\n b=b>a.limit&&1!==a.visible?a.limit:b):b=0===a.currentSlide&&b===a.count-1&&c.animationLoop&&\"next\"!==a.direction?m?(a.count+a.cloneOffset)*q:0:a.currentSlide===a.last&&0===b&&c.animationLoop&&\"prev\"!==a.direction?m?0:(a.count+1)*q:m?(a.count-1-b+a.cloneOffset)*q:(b+a.cloneOffset)*q;a.setProps(b,\"\",c.animationSpeed);if(a.transitions){if(!c.animationLoop||!a.atEnd)a.animating=!1,a.currentSlide=a.animatingTo;a.container.unbind(\"webkitTransitionEnd transitionend\");a.container.bind(\"webkitTransitionEnd transitionend\",\n function(){a.wrapup(q)})}else a.container.animate(a.args,c.animationSpeed,c.easing,function(){a.wrapup(q)})}c.smoothHeight&&f.smoothHeight(c.animationSpeed)}};a.wrapup=function(b){!r&&!h&&(0===a.currentSlide&&a.animatingTo===a.last&&c.animationLoop?a.setProps(b,\"jumpEnd\"):a.currentSlide===a.last&&(0===a.animatingTo&&c.animationLoop)&&a.setProps(b,\"jumpStart\"));a.animating=!1;a.currentSlide=a.animatingTo;c.after(a)};a.animateSlides=function(){a.animating||a.flexAnimate(a.getTarget(\"next\"))};a.pause=\n function(){clearInterval(a.animatedSlides);a.playing=!1;c.pausePlay&&f.pausePlay.update(\"play\");a.syncExists&&f.sync(\"pause\")};a.play=function(){a.animatedSlides=setInterval(a.animateSlides,c.slideshowSpeed);a.playing=!0;c.pausePlay&&f.pausePlay.update(\"pause\");a.syncExists&&f.sync(\"play\")};a.canAdvance=function(b,g){var d=s?a.pagingCount-1:a.last;return g?!0:s&&a.currentItem===a.count-1&&0===b&&\"prev\"===a.direction?!0:s&&0===a.currentItem&&b===a.pagingCount-1&&\"next\"!==a.direction?!1:b===a.currentSlide&&\n !s?!1:c.animationLoop?!0:a.atEnd&&0===a.currentSlide&&b===d&&\"next\"!==a.direction?!1:a.atEnd&&a.currentSlide===d&&0===b&&\"next\"===a.direction?!1:!0};a.getTarget=function(b){a.direction=b;return\"next\"===b?a.currentSlide===a.last?0:a.currentSlide+1:0===a.currentSlide?a.last:a.currentSlide-1};a.setProps=function(b,g,d){var e,f=b?b:(a.itemW+c.itemMargin)*a.move*a.animatingTo;e=-1*function(){if(h)return\"setTouch\"===g?b:m&&a.animatingTo===a.last?0:m?a.limit-(a.itemW+c.itemMargin)*a.move*a.animatingTo:a.animatingTo===\n a.last?a.limit:f;switch(g){case \"setTotal\":return m?(a.count-1-a.currentSlide+a.cloneOffset)*b:(a.currentSlide+a.cloneOffset)*b;case \"setTouch\":return b;case \"jumpEnd\":return m?b:a.count*b;case \"jumpStart\":return m?a.count*b:b;default:return b}}()+\"px\";a.transitions&&(e=l?\"translate3d(0,\"+e+\",0)\":\"translate3d(\"+e+\",0,0)\",d=void 0!==d?d/1E3+\"s\":\"0s\",a.container.css(\"-\"+a.pfx+\"-transition-duration\",d));a.args[a.prop]=e;(a.transitions||void 0===d)&&a.container.css(a.args)};a.setup=function(b){if(r)a.slides.css({width:\"100%\",\n \"float\":\"left\",marginRight:\"-100%\",position:\"relative\"}),\"init\"===b&&(p?a.slides.css({opacity:0,display:\"block\",webkitTransition:\"opacity \"+c.animationSpeed/1E3+\"s ease\",zIndex:1}).eq(a.currentSlide).css({opacity:1,zIndex:2}):a.slides.eq(a.currentSlide).fadeIn(c.animationSpeed,c.easing)),c.smoothHeight&&f.smoothHeight();else{var g,n;\"init\"===b&&(a.viewport=d('<div class=\"'+e+'viewport\"></div>').css({overflow:\"hidden\",position:\"relative\"}).appendTo(a).append(a.container),a.cloneCount=0,a.cloneOffset=\n 0,m&&(n=d.makeArray(a.slides).reverse(),a.slides=d(n),a.container.empty().append(a.slides)));c.animationLoop&&!h&&(a.cloneCount=2,a.cloneOffset=1,\"init\"!==b&&a.container.find(\".clone\").remove(),a.container.append(a.slides.first().clone().addClass(\"clone\")).prepend(a.slides.last().clone().addClass(\"clone\")));a.newSlides=d(c.selector,a);g=m?a.count-1-a.currentSlide+a.cloneOffset:a.currentSlide+a.cloneOffset;l&&!h?(a.container.height(200*(a.count+a.cloneCount)+\"%\").css(\"position\",\"absolute\").width(\"100%\"),\n setTimeout(function(){a.newSlides.css({display:\"block\"});a.doMath();a.viewport.height(a.h);a.setProps(g*a.h,\"init\")},\"init\"===b?100:0)):(a.container.width(200*(a.count+a.cloneCount)+\"%\"),a.setProps(g*a.computedW,\"init\"),setTimeout(function(){a.doMath();a.newSlides.css({width:a.computedW,\"float\":\"left\",display:\"block\"});c.smoothHeight&&f.smoothHeight()},\"init\"===b?100:0))}h||a.slides.removeClass(e+\"active-slide\").eq(a.currentSlide).addClass(e+\"active-slide\")};a.doMath=function(){var b=a.slides.first(),\n d=c.itemMargin,e=c.minItems,f=c.maxItems;a.w=a.width();a.h=b.height();a.boxPadding=b.outerWidth()-b.width();h?(a.itemT=c.itemWidth+d,a.minW=e?e*a.itemT:a.w,a.maxW=f?f*a.itemT:a.w,a.itemW=a.minW>a.w?(a.w-d*e)/e:a.maxW<a.w?(a.w-d*f)/f:c.itemWidth>a.w?a.w:c.itemWidth,a.visible=Math.floor(a.w/(a.itemW+d)),a.move=0<c.move&&c.move<a.visible?c.move:a.visible,a.pagingCount=Math.ceil((a.count-a.visible)/a.move+1),a.last=a.pagingCount-1,a.limit=1===a.pagingCount?0:c.itemWidth>a.w?(a.itemW+2*d)*a.count-a.w-\n d:(a.itemW+d)*a.count-a.w-d):(a.itemW=a.w,a.pagingCount=a.count,a.last=a.count-1);a.computedW=a.itemW-a.boxPadding};a.update=function(b,d){a.doMath();h||(b<a.currentSlide?a.currentSlide+=1:b<=a.currentSlide&&0!==b&&(a.currentSlide-=1),a.animatingTo=a.currentSlide);if(c.controlNav&&!a.manualControls)if(\"add\"===d&&!h||a.pagingCount>a.controlNav.length)f.controlNav.update(\"add\");else if(\"remove\"===d&&!h||a.pagingCount<a.controlNav.length)h&&a.currentSlide>a.last&&(a.currentSlide-=1,a.animatingTo-=1),\n f.controlNav.update(\"remove\",a.last);c.directionNav&&f.directionNav.update()};a.addSlide=function(b,e){var f=d(b);a.count+=1;a.last=a.count-1;l&&m?void 0!==e?a.slides.eq(a.count-e).after(f):a.container.prepend(f):void 0!==e?a.slides.eq(e).before(f):a.container.append(f);a.update(e,\"add\");a.slides=d(c.selector+\":not(.clone)\",a);a.setup();c.added(a)};a.removeSlide=function(b){var e=isNaN(b)?a.slides.index(d(b)):b;a.count-=1;a.last=a.count-1;isNaN(b)?d(b,a.slides).remove():l&&m?a.slides.eq(a.last).remove():\n a.slides.eq(b).remove();a.doMath();a.update(e,\"remove\");a.slides=d(c.selector+\":not(.clone)\",a);a.setup();c.removed(a)};f.init()};d.flexslider.defaults={namespace:\"flex-\",selector:\".slides > li\",animation:\"fade\",easing:\"swing\",direction:\"horizontal\",reverse:!1,animationLoop:!0,smoothHeight:!1,startAt:0,slideshow:!0,slideshowSpeed:7E3,animationSpeed:600,initDelay:0,randomize:!1,pauseOnAction:!0,pauseOnHover:!1,useCSS:!0,touch:!0,video:!1,controlNav:!0,directionNav:!0,prevText:\"Previous\",nextText:\"Next\",\n keyboard:!0,multipleKeyboard:!1,mousewheel:!1,pausePlay:!1,pauseText:\"Pause\",playText:\"Play\",controlsContainer:\"\",manualControls:\"\",sync:\"\",asNavFor:\"\",itemWidth:0,itemMargin:0,minItems:0,maxItems:0,move:0,start:function(){},before:function(){},after:function(){},end:function(){},added:function(){},removed:function(){}};d.fn.flexslider=function(i){void 0===i&&(i={});if(\"object\"===typeof i)return this.each(function(){var a=d(this),c=a.find(i.selector?i.selector:\".slides > li\");1===c.length?(c.fadeIn(400),\n i.start&&i.start(a)):void 0==a.data(\"flexslider\")&&new d.flexslider(this,i)});var k=d(this).data(\"flexslider\");switch(i){case \"play\":k.play();break;case \"pause\":k.pause();break;case \"next\":k.flexAnimate(k.getTarget(\"next\"),!0);break;case \"prev\":case \"previous\":k.flexAnimate(k.getTarget(\"prev\"),!0);break;default:\"number\"===typeof i&&k.flexAnimate(i,!0)}}})(jQuery);"
  },
  {
    "path": "app/assets/javascripts/theme/jquery.quicksand.js",
    "content": "/*\n\nQuicksand 1.2.2\n\nReorder and filter items with a nice shuffling animation.\n\nCopyright (c) 2010 Jacek Galanciak (razorjack.net) and agilope.com\nBig thanks for Piotr Petrus (riddle.pl) for deep code review and wonderful docs & demos.\n\nDual licensed under the MIT and GPL version 2 licenses.\nhttp://github.com/jquery/jquery/blob/master/MIT-LICENSE.txt\nhttp://github.com/jquery/jquery/blob/master/GPL-LICENSE.txt\n\nProject site: http://razorjack.net/quicksand\nGithub site: http://github.com/razorjack/quicksand\n\n*/\n\n(function ($) {\n    $.fn.quicksand = function (collection, customOptions) {     \n        var options = {\n            duration: 750,\n            easing: 'swing',\n            attribute: 'data-id', // attribute to recognize same items within source and dest\n            adjustHeight: 'auto', // 'dynamic' animates height during shuffling (slow), 'auto' adjusts it before or after the animation, false leaves height constant\n            useScaling: true, // disable it if you're not using scaling effect or want to improve performance\n            enhancement: function(c) {}, // Visual enhacement (eg. font replacement) function for cloned elements\n            selector: '> *',\n            dx: 0,\n            dy: 0\n        };\n        $.extend(options, customOptions);\n        \n        if ($.browser.msie || (typeof($.fn.scale) == 'undefined')) {\n            // Got IE and want scaling effect? Kiss my ass.\n            options.useScaling = false;\n        }\n        \n        var callbackFunction;\n        if (typeof(arguments[1]) == 'function') {\n            var callbackFunction = arguments[1];\n        } else if (typeof(arguments[2] == 'function')) {\n            var callbackFunction = arguments[2];\n        }\n    \n        \n        return this.each(function (i) {\n            var val;\n            var animationQueue = []; // used to store all the animation params before starting the animation; solves initial animation slowdowns\n            var $collection = $(collection).clone(); // destination (target) collection\n            var $sourceParent = $(this); // source, the visible container of source collection\n            var sourceHeight = $(this).css('height'); // used to keep height and document flow during the animation\n            \n            var destHeight;\n            var adjustHeightOnCallback = false;\n            \n            var offset = $($sourceParent).offset(); // offset of visible container, used in animation calculations\n            var offsets = []; // coordinates of every source collection item            \n            \n            var $source = $(this).find(options.selector); // source collection items\n            \n            // Replace the collection and quit if IE6\n            if ($.browser.msie && $.browser.version.substr(0,1)<7) {\n                $sourceParent.html('').append($collection);\n                return;\n            }\n\n            // Gets called when any animation is finished\n            var postCallbackPerformed = 0; // prevents the function from being called more than one time\n            var postCallback = function () {\n                \n                if (!postCallbackPerformed) {\n                    postCallbackPerformed = 1;\n                    \n                    // hack: \n                    // used to be: $sourceParent.html($dest.html()); // put target HTML into visible source container\n                    // but new webkit builds cause flickering when replacing the collections\n                    $toDelete = $sourceParent.find('> *');\n                    $sourceParent.prepend($dest.find('> *'));\n                    $toDelete.remove();\n                         \n                    if (adjustHeightOnCallback) {\n                        $sourceParent.css('height', destHeight);\n                    }\n                    options.enhancement($sourceParent); // Perform custom visual enhancements on a newly replaced collection\n                    if (typeof callbackFunction == 'function') {\n                        callbackFunction.call(this);\n                    }                    \n                }\n            };\n            \n            // Position: relative situations\n            var $correctionParent = $sourceParent.offsetParent();\n            var correctionOffset = $correctionParent.offset();\n            if ($correctionParent.css('position') == 'relative') {\n                if ($correctionParent.get(0).nodeName.toLowerCase() == 'body') {\n\n                } else {\n                    correctionOffset.top += (parseFloat($correctionParent.css('border-top-width')) || 0);\n                    correctionOffset.left +=( parseFloat($correctionParent.css('border-left-width')) || 0);\n                }\n            } else {\n                correctionOffset.top -= (parseFloat($correctionParent.css('border-top-width')) || 0);\n                correctionOffset.left -= (parseFloat($correctionParent.css('border-left-width')) || 0);\n                correctionOffset.top -= (parseFloat($correctionParent.css('margin-top')) || 0);\n                correctionOffset.left -= (parseFloat($correctionParent.css('margin-left')) || 0);\n            }\n            \n            // perform custom corrections from options (use when Quicksand fails to detect proper correction)\n            if (isNaN(correctionOffset.left)) {\n                correctionOffset.left = 0;\n            }\n            if (isNaN(correctionOffset.top)) {\n                correctionOffset.top = 0;\n            }\n            \n            correctionOffset.left -= options.dx;\n            correctionOffset.top -= options.dy;\n\n            // keeps nodes after source container, holding their position\n            $sourceParent.css('height', $(this).height());\n            \n            // get positions of source collections\n            $source.each(function (i) {\n                offsets[i] = $(this).offset();\n            });\n            \n            // stops previous animations on source container\n            $(this).stop();\n            var dx = 0; var dy = 0;\n            $source.each(function (i) {\n                $(this).stop(); // stop animation of collection items\n                var rawObj = $(this).get(0);\n                if (rawObj.style.position == 'absolute') {\n                    dx = -options.dx;\n                    dy = -options.dy;\n                } else {\n                    dx = options.dx;\n                    dy = options.dy;                    \n                }\n\n                rawObj.style.position = 'absolute';\n                rawObj.style.margin = '0';\n\n                rawObj.style.top = (offsets[i].top - parseFloat(rawObj.style.marginTop) - correctionOffset.top + dy) + 'px';\n                rawObj.style.left = (offsets[i].left - parseFloat(rawObj.style.marginLeft) - correctionOffset.left + dx) + 'px';\n            });\n                    \n            // create temporary container with destination collection\n            var $dest = $($sourceParent).clone();\n            var rawDest = $dest.get(0);\n            rawDest.innerHTML = '';\n            rawDest.setAttribute('id', '');\n            rawDest.style.height = 'auto';\n            rawDest.style.width = $sourceParent.width() + 'px';\n            $dest.append($collection);      \n            // insert node into HTML\n            // Note that the node is under visible source container in the exactly same position\n            // The browser render all the items without showing them (opacity: 0.0)\n            // No offset calculations are needed, the browser just extracts position from underlayered destination items\n            // and sets animation to destination positions.\n            $dest.insertBefore($sourceParent);\n            $dest.css('opacity', 0.0);\n            rawDest.style.zIndex = -1;\n            \n            rawDest.style.margin = '0';\n            rawDest.style.position = 'absolute';\n            rawDest.style.top = offset.top - correctionOffset.top + 'px';\n            rawDest.style.left = offset.left - correctionOffset.left + 'px';\n            \n            \n    \n            \n\n            if (options.adjustHeight === 'dynamic') {\n                // If destination container has different height than source container\n                // the height can be animated, adjusting it to destination height\n                $sourceParent.animate({height: $dest.height()}, options.duration, options.easing);\n            } else if (options.adjustHeight === 'auto') {\n                destHeight = $dest.height();\n                if (parseFloat(sourceHeight) < parseFloat(destHeight)) {\n                    // Adjust the height now so that the items don't move out of the container\n                    $sourceParent.css('height', destHeight);\n                } else {\n                    //  Adjust later, on callback\n                    adjustHeightOnCallback = true;\n                }\n            }\n                \n            // Now it's time to do shuffling animation\n            // First of all, we need to identify same elements within source and destination collections    \n            $source.each(function (i) {\n                var destElement = [];\n                if (typeof(options.attribute) == 'function') {\n                    \n                    val = options.attribute($(this));\n                    $collection.each(function() {\n                        if (options.attribute(this) == val) {\n                            destElement = $(this);\n                            return false;\n                        }\n                    });\n                } else {\n                    destElement = $collection.filter('[' + options.attribute + '=' + $(this).attr(options.attribute) + ']');\n                }\n                if (destElement.length) {\n                    // The item is both in source and destination collections\n                    // It it's under different position, let's move it\n                    if (!options.useScaling) {\n                        animationQueue.push(\n                                            {\n                                                element: $(this), \n                                                animation: \n                                                    {top: destElement.offset().top - correctionOffset.top, \n                                                     left: destElement.offset().left - correctionOffset.left, \n                                                     opacity: 1.0\n                                                    }\n                                            });\n\n                    } else {\n                        animationQueue.push({\n                                            element: $(this), \n                                            animation: {top: destElement.offset().top - correctionOffset.top, \n                                                        left: destElement.offset().left - correctionOffset.left, \n                                                        opacity: 1.0, \n                                                        scale: '1.0'\n                                                       }\n                                            });\n\n                    }\n                } else {\n                    // The item from source collection is not present in destination collections\n                    // Let's remove it\n                    if (!options.useScaling) {\n                        animationQueue.push({element: $(this), \n                                             animation: {opacity: '0.0'}});\n                    } else {\n                        animationQueue.push({element: $(this), animation: {opacity: '0.0', \n                                         scale: '0.0'}});\n                    }\n                }\n            });\n            \n            $collection.each(function (i) {\n                // Grab all items from target collection not present in visible source collection\n                \n                var sourceElement = [];\n                var destElement = [];\n                if (typeof(options.attribute) == 'function') {\n                    val = options.attribute($(this));\n                    $source.each(function() {\n                        if (options.attribute(this) == val) {\n                            sourceElement = $(this);\n                            return false;\n                        }\n                    });                 \n\n                    $collection.each(function() {\n                        if (options.attribute(this) == val) {\n                            destElement = $(this);\n                            return false;\n                        }\n                    });\n                } else {\n                    sourceElement = $source.filter('[' + options.attribute + '=' + $(this).attr(options.attribute) + ']');\n                    destElement = $collection.filter('[' + options.attribute + '=' + $(this).attr(options.attribute) + ']');\n                }\n                \n                var animationOptions;\n                if (sourceElement.length === 0) {\n                    // No such element in source collection...\n                    if (!options.useScaling) {\n                        animationOptions = {\n                            opacity: '1.0'\n                        };\n                    } else {\n                        animationOptions = {\n                            opacity: '1.0',\n                            scale: '1.0'\n                        };\n                    }\n                    // Let's create it\n                    d = destElement.clone();\n                    var rawDestElement = d.get(0);\n                    rawDestElement.style.position = 'absolute';\n                    rawDestElement.style.margin = '0';\n                    rawDestElement.style.top = destElement.offset().top - correctionOffset.top + 'px';\n                    rawDestElement.style.left = destElement.offset().left - correctionOffset.left + 'px';\n                    d.css('opacity', 0.0); // IE\n                    if (options.useScaling) {\n                        d.css('transform', 'scale(0.0)');\n                    }\n                    d.appendTo($sourceParent);\n                    \n                    animationQueue.push({element: $(d), \n                                         animation: animationOptions});\n                }\n            });\n            \n            $dest.remove();\n            options.enhancement($sourceParent); // Perform custom visual enhancements during the animation\n            for (i = 0; i < animationQueue.length; i++) {\n                animationQueue[i].element.animate(animationQueue[i].animation, options.duration, options.easing, postCallback);\n            }\n        });\n    };\n})(jQuery);"
  },
  {
    "path": "app/assets/javascripts/theme/script.js",
    "content": "/********************************************************\r\n *\r\n * Custom Javascript code for Enkel Bootstrap theme\r\n * Written by Themelize.me (http://themelize.me)\r\n *\r\n *******************************************************/\r\n$(document).ready(function() {\r\n  var defaultColour = 'green';\r\n  \r\n  //Bootstrap tooltip\r\n  // invoke by adding _tooltip to a tags (this makes it validate)\r\n  $('body').tooltip({\r\n    selector: \"a[class*=_tooltip]\"\r\n  });\r\n    \r\n  //Bootstrap popover\r\n  // invoke by adding _popover to a tags (this makes it validate)\r\n  $('body').popover({\r\n    selector: \"a[class*=_popover]\",\r\n    trigger: \"hover\"\r\n  });\r\n  \r\n  //show hide elements\r\n  $('.show-hide').each(function() {\r\n    $(this).click(function() {\r\n      var state = 'open'; //assume target is closed & needs opening\r\n      var target = $(this).attr('data-target');\r\n      var targetState = $(this).attr('data-target-state');\r\n      \r\n      //allows trigger link to say target is open & should be closed\r\n      if (typeof targetState !== 'undefined' && targetState !== false) {\r\n        state = targetState;\r\n      }\r\n      \r\n      if (state == 'undefined') {\r\n        state = 'open';\r\n      }\r\n      \r\n      $(target).toggleClass('show-hide-'+ state);\r\n      $(this).toggleClass(state);      \r\n    });\r\n  });\r\n  \r\n  //colour switch\r\n  $('.colour-switcher a').click(function() {\r\n    var c = $(this).attr('href').replace('#','');\r\n    $('.colour-switcher a').removeClass('active');\r\n    $('.colour-switcher a.'+ c).addClass('active');\r\n    \r\n    if (c != defaultColour) {\r\n      $('#colour-scheme').attr('href','css/colour-'+ c +'.css');\r\n    }\r\n    else {\r\n      $('#colour-scheme').attr('href', '#');\r\n    }\r\n  });\r\n  \r\n  //flexslider\r\n  $('.flexslider').each(function() {\r\n    var sliderSettings =  {\r\n      animation: $(this).attr('data-transition'),\r\n      selector: \".slides > .slide\",\r\n      controlNav: true,\r\n      smoothHeight: true\r\n    };\r\n    \r\n    var sliderNav = $(this).attr('data-slidernav');\r\n    if (sliderNav != 'auto') {\r\n      sliderSettings = $.extend({}, sliderSettings, {\r\n        manualControls: sliderNav +' li a',\r\n        controlsContainer: '.flexslider-wrapper'\r\n      });\r\n    }\r\n    \r\n    $(this).flexslider(sliderSettings);\r\n  });   \r\n\r\n  //jQuery Quicksand plugin\r\n  //@based on: http://www.evoluted.net/thinktank/web-development/jquery-quicksand-tutorial-filtering\r\n  var $filters = $('#quicksand-categories');\r\n  var $filterType = $filters.find('li.active a').attr('class');\r\n  var $holder = $('ul#quicksand');\r\n  var $data = $holder.clone();\r\n\r\n  // react to filters being used\r\n  $filters.find('li a').click(function(e) {\r\n    $filters.find('li').removeClass('active');\r\n    var $filterType = $(this).attr('class');\r\n    $(this).parent().addClass('active');\r\n    if ($filterType == 'all') {\r\n      var $filteredData = $data.find('li');\r\n    } \r\n    else {\r\n      var $filteredData = $data.find('li[data-type=' + $filterType + ']');\r\n    }\r\n\r\n    // call quicksand and assign transition parameters\r\n    $holder.quicksand($filteredData, {\r\n      duration: 800,\r\n    });\r\n    e.preventDefault();\r\n  });\r\n  \r\n});"
  },
  {
    "path": "app/assets/stylesheets/admin.scss",
    "content": "@import \"bootstrap\";\n@import \"font-awesome-sprockets\";\n@import \"font-awesome\";\n@import \"main-admin\";\n\n"
  },
  {
    "path": "app/assets/stylesheets/application.scss",
    "content": "@import \"main\";\n@import \"theme/bootstrap.css.scss\";\n@import \"theme/custom-colour\";\n@import \"theme/responsive\";\n@import \"theme/flexslider\";\n@import \"theme/theme-style\";\n@import \"jquery.ui.all\";\n"
  },
  {
    "path": "app/assets/stylesheets/main-admin.scss",
    "content": "html,\nbody {\n  height: 100%;\n}\n"
  },
  {
    "path": "app/assets/stylesheets/main.scss",
    "content": "// Place all the styles related to the Main controller here.\n\n// They will automatically be included in application.css.\n// You can use Sass (SCSS) here: http://sass-lang.com/\nhtml {\n  height: 100%;\n}\nbody {\n  height: 100%;\n}\nul.nav.nav-tabs {\n  li > a {\n    color: #00adbb;\n  }\n  li > a:hover {\n    color: #00adbb;\n  }\n\n}\n\n.navbar .nav {\n  float: none;\n}\n\n.green, .active, .enabled {\n  color: green;\n}\n\n.red, .disabled {\n  color: red;\n}\n\n.pending {\n  color: yellow;\n}\n\n.orange {\n  color: orange;\n}\n\n.bold, .state {\n  font-weight: bold;\n}\n\n.content {\n  margin-bottom: 20px;\n  min-height: 1000px;\n  height: 100%;\n}\n\n.notifications {\n  margin-top: 20px;\n}\n\n#footer {\n  position: fixed;\n  bottom: 0px;\n  width: 100%;\n}\n\n.container {\n  .info {\n    line-height: 0.7;\n  }\n}\n\nform.button_to {\n  margin: 0px;\n}\n\n.collapsable-credentials {\n  float: right;\n  position: relative;\n  top: -110px;\n  min-height: 20px;\n  max-width: 400px;\n  padding: 10px;\n\n  .vpn-credential {\n    display: none;\n  }\n}\n\ninput.reflink-input {\n  width: 500px;\n}\n"
  },
  {
    "path": "app/assets/stylesheets/shared.css.scss",
    "content": ".state {\n  font-weight: bold;\n\n  &.disabled {\n    color: red;\n  }\n\n  &.enabled, &.active {\n    color: green;\n  }\n\n  &.pending {\n    color: yellow;\n  }\n}\n"
  },
  {
    "path": "app/assets/stylesheets/theme/bootstrap.css.scss",
    "content": "/*!\n * Bootstrap v2.2.2\n *\n * Copyright 2012 Twitter, Inc\n * Licensed under the Apache License v2.0\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Designed and built with all the love in the world @twitter by @mdo and @fat.\n */\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nnav,\nsection {\n  display: block;\n}\naudio,\ncanvas,\nvideo {\n  display: inline-block;\n  *display: inline;\n  *zoom: 1;\n}\naudio:not([controls]) {\n  display: none;\n}\nhtml {\n  font-size: 100%;\n  -webkit-text-size-adjust: 100%;\n  -ms-text-size-adjust: 100%;\n}\na:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\na:hover,\na:active {\n  outline: 0;\n}\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\nsup {\n  top: -0.5em;\n}\nsub {\n  bottom: -0.25em;\n}\nimg {\n  /* Responsive images (ensure images don't scale beyond their parents) */\n\n  max-width: 100%;\n  /* Part 1: Set a maxium relative to the parent */\n\n  width: auto\\9;\n  /* IE7-8 need help adjusting responsive images */\n\n  height: auto;\n  /* Part 2: Scale the height according to the width, otherwise you get stretching */\n\n  vertical-align: middle;\n  border: 0;\n  -ms-interpolation-mode: bicubic;\n}\n#map_canvas img,\n.google-maps img {\n  max-width: none;\n}\nbutton,\ninput,\nselect,\ntextarea {\n  margin: 0;\n  font-size: 100%;\n  vertical-align: middle;\n}\nbutton,\ninput {\n  *overflow: visible;\n  line-height: normal;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  padding: 0;\n  border: 0;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  -webkit-appearance: button;\n  cursor: pointer;\n}\nlabel,\nselect,\nbutton,\ninput[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"],\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  cursor: pointer;\n}\ninput[type=\"search\"] {\n  -webkit-box-sizing: content-box;\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n  -webkit-appearance: textfield;\n}\ninput[type=\"search\"]::-webkit-search-decoration,\ninput[type=\"search\"]::-webkit-search-cancel-button {\n  -webkit-appearance: none;\n}\ntextarea {\n  overflow: auto;\n  vertical-align: top;\n}\n@media print {\n  * {\n    text-shadow: none !important;\n    color: #000 !important;\n    background: transparent !important;\n    box-shadow: none !important;\n  }\n  a,\n  a:visited {\n    text-decoration: underline;\n  }\n  a[href]:after {\n    content: \" (\" attr(href) \")\";\n  }\n  abbr[title]:after {\n    content: \" (\" attr(title) \")\";\n  }\n  .ir a:after,\n  a[href^=\"javascript:\"]:after,\n  a[href^=\"#\"]:after {\n    content: \"\";\n  }\n  pre,\n  blockquote {\n    border: 1px solid #999;\n    page-break-inside: avoid;\n  }\n  thead {\n    display: table-header-group;\n  }\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n  img {\n    max-width: 100% !important;\n  }\n  @page  {\n    margin: 0.5cm;\n  }\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n}\n.clearfix {\n  *zoom: 1;\n}\n.clearfix:before,\n.clearfix:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.clearfix:after {\n  clear: both;\n}\n.hide-text {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n.input-block-level {\n  display: block;\n  width: 100%;\n  min-height: 30px;\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\nbody {\n  margin: 0;\n  font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  line-height: 20px;\n  color: #333333;\n  background-color: #fcfcfc;\n}\na {\n  color: #55a79a;\n  text-decoration: none;\n}\na:hover {\n  color: #44857b;\n  text-decoration: underline;\n}\n.img-rounded {\n  -webkit-border-radius: 6px;\n  -moz-border-radius: 6px;\n  border-radius: 6px;\n}\n.img-polaroid {\n  padding: 4px;\n  background-color: #fff;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n  -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n.img-circle {\n  -webkit-border-radius: 500px;\n  -moz-border-radius: 500px;\n  border-radius: 500px;\n}\n.row {\n  margin-left: -20px;\n  *zoom: 1;\n}\n.row:before,\n.row:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.row:after {\n  clear: both;\n}\n[class*=\"span\"] {\n  float: left;\n  min-height: 1px;\n  margin-left: 20px;\n}\n.container,\n.navbar-static-top .container,\n.navbar-fixed-top .container,\n.navbar-fixed-bottom .container {\n  width: 940px;\n}\n.span12 {\n  width: 940px;\n}\n.span11 {\n  width: 860px;\n}\n.span10 {\n  width: 780px;\n}\n.span9 {\n  width: 700px;\n}\n.span8 {\n  width: 620px;\n}\n.span7 {\n  width: 540px;\n}\n.span6 {\n  width: 460px;\n}\n.span5 {\n  width: 380px;\n}\n.span4 {\n  width: 300px;\n}\n.span3 {\n  width: 220px;\n}\n.span2 {\n  width: 140px;\n}\n.span1 {\n  width: 60px;\n}\n.offset12 {\n  margin-left: 980px;\n}\n.offset11 {\n  margin-left: 900px;\n}\n.offset10 {\n  margin-left: 820px;\n}\n.offset9 {\n  margin-left: 740px;\n}\n.offset8 {\n  margin-left: 660px;\n}\n.offset7 {\n  margin-left: 580px;\n}\n.offset6 {\n  margin-left: 500px;\n}\n.offset5 {\n  margin-left: 420px;\n}\n.offset4 {\n  margin-left: 340px;\n}\n.offset3 {\n  margin-left: 260px;\n}\n.offset2 {\n  margin-left: 180px;\n}\n.offset1 {\n  margin-left: 100px;\n}\n.row-fluid {\n  width: 100%;\n  *zoom: 1;\n}\n.row-fluid:before,\n.row-fluid:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.row-fluid:after {\n  clear: both;\n}\n.row-fluid [class*=\"span\"] {\n  display: block;\n  width: 100%;\n  min-height: 30px;\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  float: left;\n  margin-left: 2.127659574468085%;\n  *margin-left: 2.074468085106383%;\n}\n.row-fluid [class*=\"span\"]:first-child {\n  margin-left: 0;\n}\n.row-fluid .controls-row [class*=\"span\"] + [class*=\"span\"] {\n  margin-left: 2.127659574468085%;\n}\n.row-fluid .span12 {\n  width: 100%;\n  *width: 99.94680851063829%;\n}\n.row-fluid .span11 {\n  width: 91.48936170212765%;\n  *width: 91.43617021276594%;\n}\n.row-fluid .span10 {\n  width: 82.97872340425532%;\n  *width: 82.92553191489361%;\n}\n.row-fluid .span9 {\n  width: 74.46808510638297%;\n  *width: 74.41489361702126%;\n}\n.row-fluid .span8 {\n  width: 65.95744680851064%;\n  *width: 65.90425531914893%;\n}\n.row-fluid .span7 {\n  width: 57.44680851063829%;\n  *width: 57.39361702127659%;\n}\n.row-fluid .span6 {\n  width: 48.93617021276595%;\n  *width: 48.88297872340425%;\n}\n.row-fluid .span5 {\n  width: 40.42553191489362%;\n  *width: 40.37234042553192%;\n}\n.row-fluid .span4 {\n  width: 31.914893617021278%;\n  *width: 31.861702127659576%;\n}\n.row-fluid .span3 {\n  width: 23.404255319148934%;\n  *width: 23.351063829787233%;\n}\n.row-fluid .span2 {\n  width: 14.893617021276595%;\n  *width: 14.840425531914894%;\n}\n.row-fluid .span1 {\n  width: 6.382978723404255%;\n  *width: 6.329787234042553%;\n}\n.row-fluid .offset12 {\n  margin-left: 104.25531914893617%;\n  *margin-left: 104.14893617021275%;\n}\n.row-fluid .offset12:first-child {\n  margin-left: 102.12765957446808%;\n  *margin-left: 102.02127659574467%;\n}\n.row-fluid .offset11 {\n  margin-left: 95.74468085106382%;\n  *margin-left: 95.6382978723404%;\n}\n.row-fluid .offset11:first-child {\n  margin-left: 93.61702127659574%;\n  *margin-left: 93.51063829787232%;\n}\n.row-fluid .offset10 {\n  margin-left: 87.23404255319149%;\n  *margin-left: 87.12765957446807%;\n}\n.row-fluid .offset10:first-child {\n  margin-left: 85.1063829787234%;\n  *margin-left: 84.99999999999999%;\n}\n.row-fluid .offset9 {\n  margin-left: 78.72340425531914%;\n  *margin-left: 78.61702127659572%;\n}\n.row-fluid .offset9:first-child {\n  margin-left: 76.59574468085106%;\n  *margin-left: 76.48936170212764%;\n}\n.row-fluid .offset8 {\n  margin-left: 70.2127659574468%;\n  *margin-left: 70.10638297872339%;\n}\n.row-fluid .offset8:first-child {\n  margin-left: 68.08510638297872%;\n  *margin-left: 67.9787234042553%;\n}\n.row-fluid .offset7 {\n  margin-left: 61.70212765957446%;\n  *margin-left: 61.59574468085106%;\n}\n.row-fluid .offset7:first-child {\n  margin-left: 59.574468085106375%;\n  *margin-left: 59.46808510638297%;\n}\n.row-fluid .offset6 {\n  margin-left: 53.191489361702125%;\n  *margin-left: 53.085106382978715%;\n}\n.row-fluid .offset6:first-child {\n  margin-left: 51.063829787234035%;\n  *margin-left: 50.95744680851063%;\n}\n.row-fluid .offset5 {\n  margin-left: 44.68085106382979%;\n  *margin-left: 44.57446808510638%;\n}\n.row-fluid .offset5:first-child {\n  margin-left: 42.5531914893617%;\n  *margin-left: 42.4468085106383%;\n}\n.row-fluid .offset4 {\n  margin-left: 36.170212765957444%;\n  *margin-left: 36.06382978723405%;\n}\n.row-fluid .offset4:first-child {\n  margin-left: 34.04255319148936%;\n  *margin-left: 33.93617021276596%;\n}\n.row-fluid .offset3 {\n  margin-left: 27.659574468085104%;\n  *margin-left: 27.5531914893617%;\n}\n.row-fluid .offset3:first-child {\n  margin-left: 25.53191489361702%;\n  *margin-left: 25.425531914893618%;\n}\n.row-fluid .offset2 {\n  margin-left: 19.148936170212764%;\n  *margin-left: 19.04255319148936%;\n}\n.row-fluid .offset2:first-child {\n  margin-left: 17.02127659574468%;\n  *margin-left: 16.914893617021278%;\n}\n.row-fluid .offset1 {\n  margin-left: 10.638297872340425%;\n  *margin-left: 10.53191489361702%;\n}\n.row-fluid .offset1:first-child {\n  margin-left: 8.51063829787234%;\n  *margin-left: 8.404255319148938%;\n}\n[class*=\"span\"].hide,\n.row-fluid [class*=\"span\"].hide {\n  display: none;\n}\n[class*=\"span\"].pull-right,\n.row-fluid [class*=\"span\"].pull-right {\n  float: right;\n}\n.container {\n  margin-right: auto;\n  margin-left: auto;\n  *zoom: 1;\n}\n.container:before,\n.container:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.container:after {\n  clear: both;\n}\n.container-fluid {\n  padding-right: 20px;\n  padding-left: 20px;\n  *zoom: 1;\n}\n.container-fluid:before,\n.container-fluid:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.container-fluid:after {\n  clear: both;\n}\np {\n  margin: 0 0 10px;\n}\n.lead {\n  margin-bottom: 20px;\n  font-size: 21px;\n  font-weight: 200;\n  line-height: 30px;\n}\nsmall {\n  font-size: 85%;\n}\nstrong {\n  font-weight: bold;\n}\nem {\n  font-style: italic;\n}\ncite {\n  font-style: normal;\n}\n.muted {\n  color: rgba(36, 36, 36, 0.8);\n}\na.muted:hover {\n  color: rgba(10, 10, 10, 0.8);\n}\n.text-warning {\n  color: #c09853;\n}\na.text-warning:hover {\n  color: #a47e3c;\n}\n.text-error {\n  color: #b94a48;\n}\na.text-error:hover {\n  color: #953b39;\n}\n.text-info {\n  color: #3a87ad;\n}\na.text-info:hover {\n  color: #2d6987;\n}\n.text-success {\n  color: #468847;\n}\na.text-success:hover {\n  color: #356635;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n  margin: 10px 0;\n  font-family: inherit;\n  font-weight: bold;\n  line-height: 20px;\n  color: inherit;\n  text-rendering: optimizelegibility;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small {\n  font-weight: normal;\n  line-height: 1;\n  color: rgba(36, 36, 36, 0.8);\n}\nh1,\nh2,\nh3 {\n  line-height: 40px;\n}\nh1 {\n  font-size: 38.5px;\n}\nh2 {\n  font-size: 31.5px;\n}\nh3 {\n  font-size: 24.5px;\n}\nh4 {\n  font-size: 17.5px;\n}\nh5 {\n  font-size: 14px;\n}\nh6 {\n  font-size: 11.9px;\n}\nh1 small {\n  font-size: 24.5px;\n}\nh2 small {\n  font-size: 17.5px;\n}\nh3 small {\n  font-size: 14px;\n}\nh4 small {\n  font-size: 14px;\n}\n.page-header {\n  padding-bottom: 9px;\n  margin: 20px 0 30px;\n  border-bottom: 1px solid #e6e6e6;\n}\nul,\nol {\n  padding: 0;\n  margin: 0 0 10px 25px;\n}\nul ul,\nul ol,\nol ol,\nol ul {\n  margin-bottom: 0;\n}\nli {\n  line-height: 20px;\n}\nul.unstyled,\nol.unstyled {\n  margin-left: 0;\n  list-style: none;\n}\nul.inline,\nol.inline {\n  margin-left: 0;\n  list-style: none;\n}\nul.inline > li,\nol.inline > li {\n  display: inline-block;\n  padding-left: 5px;\n  padding-right: 5px;\n}\ndl {\n  margin-bottom: 20px;\n}\ndt,\ndd {\n  line-height: 20px;\n}\ndt {\n  font-weight: bold;\n}\ndd {\n  margin-left: 10px;\n}\n.dl-horizontal {\n  *zoom: 1;\n}\n.dl-horizontal:before,\n.dl-horizontal:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.dl-horizontal:after {\n  clear: both;\n}\n.dl-horizontal dt {\n  float: left;\n  width: 160px;\n  clear: left;\n  text-align: right;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n.dl-horizontal dd {\n  margin-left: 180px;\n}\nhr {\n  margin: 20px 0;\n  border: 0;\n  border-top: 1px solid #e6e6e6;\n  border-bottom: 1px solid #ffffff;\n}\nabbr[title],\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted rgba(36, 36, 36, 0.8);\n}\nabbr.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\nblockquote {\n  padding: 0 0 0 15px;\n  margin: 0 0 20px;\n  border-left: 5px solid #e6e6e6;\n}\nblockquote p {\n  margin-bottom: 0;\n  font-size: 16px;\n  font-weight: 300;\n  line-height: 25px;\n}\nblockquote small {\n  display: block;\n  line-height: 20px;\n  color: rgba(36, 36, 36, 0.8);\n}\nblockquote small:before {\n  content: '\\2014 \\00A0';\n}\nblockquote.pull-right {\n  float: right;\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid #e6e6e6;\n  border-left: 0;\n}\nblockquote.pull-right p,\nblockquote.pull-right small {\n  text-align: right;\n}\nblockquote.pull-right small:before {\n  content: '';\n}\nblockquote.pull-right small:after {\n  content: '\\00A0 \\2014';\n}\nq:before,\nq:after,\nblockquote:before,\nblockquote:after {\n  content: \"\";\n}\naddress {\n  display: block;\n  margin-bottom: 20px;\n  font-style: normal;\n  line-height: 20px;\n}\ncode,\npre {\n  padding: 0 3px 2px;\n  font-family: Monaco, Menlo, Consolas, \"Courier New\", monospace;\n  font-size: 12px;\n  color: #333333;\n  -webkit-border-radius: 3px;\n  -moz-border-radius: 3px;\n  border-radius: 3px;\n}\ncode {\n  padding: 2px 4px;\n  color: #d14;\n  background-color: #f7f7f9;\n  border: 1px solid #e1e1e8;\n  white-space: nowrap;\n}\npre {\n  display: block;\n  padding: 9.5px;\n  margin: 0 0 10px;\n  font-size: 13px;\n  line-height: 20px;\n  word-break: break-all;\n  word-wrap: break-word;\n  white-space: pre;\n  white-space: pre-wrap;\n  background-color: #f5f5f5;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n}\npre.prettyprint {\n  margin-bottom: 20px;\n}\npre code {\n  padding: 0;\n  color: inherit;\n  white-space: pre;\n  white-space: pre-wrap;\n  background-color: transparent;\n  border: 0;\n}\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\nform {\n  margin: 0 0 20px;\n}\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 20px;\n  font-size: 21px;\n  line-height: 40px;\n  color: #333333;\n  border: 0;\n  border-bottom: 1px solid #e5e5e5;\n}\nlegend small {\n  font-size: 15px;\n  color: rgba(36, 36, 36, 0.8);\n}\nlabel,\ninput,\nbutton,\nselect,\ntextarea {\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 20px;\n}\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n}\nlabel {\n  display: block;\n  margin-bottom: 5px;\n}\nselect,\ntextarea,\ninput[type=\"text\"],\ninput[type=\"password\"],\ninput[type=\"datetime\"],\ninput[type=\"datetime-local\"],\ninput[type=\"date\"],\ninput[type=\"month\"],\ninput[type=\"time\"],\ninput[type=\"week\"],\ninput[type=\"number\"],\ninput[type=\"email\"],\ninput[type=\"url\"],\ninput[type=\"search\"],\ninput[type=\"tel\"],\ninput[type=\"color\"],\n.uneditable-input {\n  display: inline-block;\n  height: 20px;\n  padding: 4px 6px;\n  margin-bottom: 10px;\n  font-size: 14px;\n  line-height: 20px;\n  color: #242424;\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n  vertical-align: middle;\n}\ninput,\ntextarea,\n.uneditable-input {\n  width: 206px;\n}\ntextarea {\n  height: auto;\n}\ntextarea,\ninput[type=\"text\"],\ninput[type=\"password\"],\ninput[type=\"datetime\"],\ninput[type=\"datetime-local\"],\ninput[type=\"date\"],\ninput[type=\"month\"],\ninput[type=\"time\"],\ninput[type=\"week\"],\ninput[type=\"number\"],\ninput[type=\"email\"],\ninput[type=\"url\"],\ninput[type=\"search\"],\ninput[type=\"tel\"],\ninput[type=\"color\"],\n.uneditable-input {\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -webkit-transition: border linear .2s, box-shadow linear .2s;\n  -moz-transition: border linear .2s, box-shadow linear .2s;\n  -o-transition: border linear .2s, box-shadow linear .2s;\n  transition: border linear .2s, box-shadow linear .2s;\n}\ntextarea:focus,\ninput[type=\"text\"]:focus,\ninput[type=\"password\"]:focus,\ninput[type=\"datetime\"]:focus,\ninput[type=\"datetime-local\"]:focus,\ninput[type=\"date\"]:focus,\ninput[type=\"month\"]:focus,\ninput[type=\"time\"]:focus,\ninput[type=\"week\"]:focus,\ninput[type=\"number\"]:focus,\ninput[type=\"email\"]:focus,\ninput[type=\"url\"]:focus,\ninput[type=\"search\"]:focus,\ninput[type=\"tel\"]:focus,\ninput[type=\"color\"]:focus,\n.uneditable-input:focus {\n  border-color: rgba(82, 168, 236, 0.8);\n  outline: 0;\n  outline: thin dotted \\9;\n  /* IE6-9 */\n\n  -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);\n  -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);\n  box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  *margin-top: 0;\n  /* IE7 */\n\n  margin-top: 1px \\9;\n  /* IE8-9 */\n\n  line-height: normal;\n}\ninput[type=\"file\"],\ninput[type=\"image\"],\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"],\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  width: auto;\n}\nselect,\ninput[type=\"file\"] {\n  height: 30px;\n  /* In IE7, the height of the select element cannot be changed by height, only font-size */\n\n  *margin-top: 4px;\n  /* For IE7, add top margin to align select with labels */\n\n  line-height: 30px;\n}\nselect {\n  width: 220px;\n  border: 1px solid #cccccc;\n  background-color: #ffffff;\n}\nselect[multiple],\nselect[size] {\n  height: auto;\n}\nselect:focus,\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n.uneditable-input,\n.uneditable-textarea {\n  color: rgba(36, 36, 36, 0.8);\n  background-color: #fcfcfc;\n  border-color: #cccccc;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);\n  -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);\n  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);\n  cursor: not-allowed;\n}\n.uneditable-input {\n  overflow: hidden;\n  white-space: nowrap;\n}\n.uneditable-textarea {\n  width: auto;\n  height: auto;\n}\ninput:-moz-placeholder,\ntextarea:-moz-placeholder {\n  color: rgba(36, 36, 36, 0.8);\n}\ninput:-ms-input-placeholder,\ntextarea:-ms-input-placeholder {\n  color: rgba(36, 36, 36, 0.8);\n}\ninput::-webkit-input-placeholder,\ntextarea::-webkit-input-placeholder {\n  color: rgba(36, 36, 36, 0.8);\n}\n.radio,\n.checkbox {\n  min-height: 20px;\n  padding-left: 20px;\n}\n.radio input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"] {\n  float: left;\n  margin-left: -20px;\n}\n.controls > .radio:first-child,\n.controls > .checkbox:first-child {\n  padding-top: 5px;\n}\n.radio.inline,\n.checkbox.inline {\n  display: inline-block;\n  padding-top: 5px;\n  margin-bottom: 0;\n  vertical-align: middle;\n}\n.radio.inline + .radio.inline,\n.checkbox.inline + .checkbox.inline {\n  margin-left: 10px;\n}\n.input-mini {\n  width: 60px;\n}\n.input-small {\n  width: 90px;\n}\n.input-medium {\n  width: 150px;\n}\n.input-large {\n  width: 210px;\n}\n.input-xlarge {\n  width: 270px;\n}\n.input-xxlarge {\n  width: 530px;\n}\ninput[class*=\"span\"],\nselect[class*=\"span\"],\ntextarea[class*=\"span\"],\n.uneditable-input[class*=\"span\"],\n.row-fluid input[class*=\"span\"],\n.row-fluid select[class*=\"span\"],\n.row-fluid textarea[class*=\"span\"],\n.row-fluid .uneditable-input[class*=\"span\"] {\n  float: none;\n  margin-left: 0;\n}\n.input-append input[class*=\"span\"],\n.input-append .uneditable-input[class*=\"span\"],\n.input-prepend input[class*=\"span\"],\n.input-prepend .uneditable-input[class*=\"span\"],\n.row-fluid input[class*=\"span\"],\n.row-fluid select[class*=\"span\"],\n.row-fluid textarea[class*=\"span\"],\n.row-fluid .uneditable-input[class*=\"span\"],\n.row-fluid .input-prepend [class*=\"span\"],\n.row-fluid .input-append [class*=\"span\"] {\n  display: inline-block;\n}\ninput,\ntextarea,\n.uneditable-input {\n  margin-left: 0;\n}\n.controls-row [class*=\"span\"] + [class*=\"span\"] {\n  margin-left: 20px;\n}\ninput.span12, textarea.span12, .uneditable-input.span12 {\n  width: 926px;\n}\ninput.span11, textarea.span11, .uneditable-input.span11 {\n  width: 846px;\n}\ninput.span10, textarea.span10, .uneditable-input.span10 {\n  width: 766px;\n}\ninput.span9, textarea.span9, .uneditable-input.span9 {\n  width: 686px;\n}\ninput.span8, textarea.span8, .uneditable-input.span8 {\n  width: 606px;\n}\ninput.span7, textarea.span7, .uneditable-input.span7 {\n  width: 526px;\n}\ninput.span6, textarea.span6, .uneditable-input.span6 {\n  width: 446px;\n}\ninput.span5, textarea.span5, .uneditable-input.span5 {\n  width: 366px;\n}\ninput.span4, textarea.span4, .uneditable-input.span4 {\n  width: 286px;\n}\ninput.span3, textarea.span3, .uneditable-input.span3 {\n  width: 206px;\n}\ninput.span2, textarea.span2, .uneditable-input.span2 {\n  width: 126px;\n}\ninput.span1, textarea.span1, .uneditable-input.span1 {\n  width: 46px;\n}\n.controls-row {\n  *zoom: 1;\n}\n.controls-row:before,\n.controls-row:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.controls-row:after {\n  clear: both;\n}\n.controls-row [class*=\"span\"],\n.row-fluid .controls-row [class*=\"span\"] {\n  float: left;\n}\n.controls-row .checkbox[class*=\"span\"],\n.controls-row .radio[class*=\"span\"] {\n  padding-top: 5px;\n}\ninput[disabled],\nselect[disabled],\ntextarea[disabled],\ninput[readonly],\nselect[readonly],\ntextarea[readonly] {\n  cursor: not-allowed;\n  background-color: #e6e6e6;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"][readonly],\ninput[type=\"checkbox\"][readonly] {\n  background-color: transparent;\n}\n.control-group.warning .control-label,\n.control-group.warning .help-block,\n.control-group.warning .help-inline {\n  color: #c09853;\n}\n.control-group.warning .checkbox,\n.control-group.warning .radio,\n.control-group.warning input,\n.control-group.warning select,\n.control-group.warning textarea {\n  color: #c09853;\n}\n.control-group.warning input,\n.control-group.warning select,\n.control-group.warning textarea {\n  border-color: #c09853;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.control-group.warning input:focus,\n.control-group.warning select:focus,\n.control-group.warning textarea:focus {\n  border-color: #a47e3c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;\n  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;\n}\n.control-group.warning .input-prepend .add-on,\n.control-group.warning .input-append .add-on {\n  color: #c09853;\n  background-color: #fcf8e3;\n  border-color: #c09853;\n}\n.control-group.error .control-label,\n.control-group.error .help-block,\n.control-group.error .help-inline {\n  color: #b94a48;\n}\n.control-group.error .checkbox,\n.control-group.error .radio,\n.control-group.error input,\n.control-group.error select,\n.control-group.error textarea {\n  color: #b94a48;\n}\n.control-group.error input,\n.control-group.error select,\n.control-group.error textarea {\n  border-color: #b94a48;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.control-group.error input:focus,\n.control-group.error select:focus,\n.control-group.error textarea:focus {\n  border-color: #953b39;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;\n  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;\n}\n.control-group.error .input-prepend .add-on,\n.control-group.error .input-append .add-on {\n  color: #b94a48;\n  background-color: #f2dede;\n  border-color: #b94a48;\n}\n.control-group.success .control-label,\n.control-group.success .help-block,\n.control-group.success .help-inline {\n  color: #468847;\n}\n.control-group.success .checkbox,\n.control-group.success .radio,\n.control-group.success input,\n.control-group.success select,\n.control-group.success textarea {\n  color: #468847;\n}\n.control-group.success input,\n.control-group.success select,\n.control-group.success textarea {\n  border-color: #468847;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.control-group.success input:focus,\n.control-group.success select:focus,\n.control-group.success textarea:focus {\n  border-color: #356635;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;\n  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;\n}\n.control-group.success .input-prepend .add-on,\n.control-group.success .input-append .add-on {\n  color: #468847;\n  background-color: #dff0d8;\n  border-color: #468847;\n}\n.control-group.info .control-label,\n.control-group.info .help-block,\n.control-group.info .help-inline {\n  color: #3a87ad;\n}\n.control-group.info .checkbox,\n.control-group.info .radio,\n.control-group.info input,\n.control-group.info select,\n.control-group.info textarea {\n  color: #3a87ad;\n}\n.control-group.info input,\n.control-group.info select,\n.control-group.info textarea {\n  border-color: #3a87ad;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.control-group.info input:focus,\n.control-group.info select:focus,\n.control-group.info textarea:focus {\n  border-color: #2d6987;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;\n  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;\n}\n.control-group.info .input-prepend .add-on,\n.control-group.info .input-append .add-on {\n  color: #3a87ad;\n  background-color: #d9edf7;\n  border-color: #3a87ad;\n}\ninput:focus:invalid,\ntextarea:focus:invalid,\nselect:focus:invalid {\n  color: #b94a48;\n  border-color: #ee5f5b;\n}\ninput:focus:invalid:focus,\ntextarea:focus:invalid:focus,\nselect:focus:invalid:focus {\n  border-color: #e9322d;\n  -webkit-box-shadow: 0 0 6px #f8b9b7;\n  -moz-box-shadow: 0 0 6px #f8b9b7;\n  box-shadow: 0 0 6px #f8b9b7;\n}\n.form-actions {\n  padding: 19px 20px 20px;\n  margin-top: 20px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border-top: 1px solid #e5e5e5;\n  *zoom: 1;\n}\n.form-actions:before,\n.form-actions:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.form-actions:after {\n  clear: both;\n}\n.help-block,\n.help-inline {\n  color: #595959;\n}\n.help-block {\n  display: block;\n  margin-bottom: 10px;\n}\n.help-inline {\n  display: inline-block;\n  *display: inline;\n  /* IE7 inline-block hack */\n\n  *zoom: 1;\n  vertical-align: middle;\n  padding-left: 5px;\n}\n.input-append,\n.input-prepend {\n  margin-bottom: 5px;\n  font-size: 0;\n  white-space: nowrap;\n}\n.input-append input,\n.input-prepend input,\n.input-append select,\n.input-prepend select,\n.input-append .uneditable-input,\n.input-prepend .uneditable-input,\n.input-append .dropdown-menu,\n.input-prepend .dropdown-menu {\n  font-size: 14px;\n}\n.input-append input,\n.input-prepend input,\n.input-append select,\n.input-prepend select,\n.input-append .uneditable-input,\n.input-prepend .uneditable-input {\n  position: relative;\n  margin-bottom: 0;\n  *margin-left: 0;\n  vertical-align: top;\n  -webkit-border-radius: 0 2px 2px 0;\n  -moz-border-radius: 0 2px 2px 0;\n  border-radius: 0 2px 2px 0;\n}\n.input-append input:focus,\n.input-prepend input:focus,\n.input-append select:focus,\n.input-prepend select:focus,\n.input-append .uneditable-input:focus,\n.input-prepend .uneditable-input:focus {\n  z-index: 2;\n}\n.input-append .add-on,\n.input-prepend .add-on {\n  display: inline-block;\n  width: auto;\n  height: 20px;\n  min-width: 16px;\n  padding: 4px 5px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 20px;\n  text-align: center;\n  text-shadow: 0 1px 0 #ffffff;\n  background-color: #e6e6e6;\n  border: 1px solid #ccc;\n}\n.input-append .add-on,\n.input-prepend .add-on,\n.input-append .btn,\n.input-prepend .btn,\n.input-append .btn-group > .dropdown-toggle,\n.input-prepend .btn-group > .dropdown-toggle {\n  vertical-align: top;\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n}\n.input-append .active,\n.input-prepend .active {\n  background-color: #a9dba9;\n  border-color: #46a546;\n}\n.input-prepend .add-on,\n.input-prepend .btn {\n  margin-right: -1px;\n}\n.input-prepend .add-on:first-child,\n.input-prepend .btn:first-child {\n  -webkit-border-radius: 2px 0 0 2px;\n  -moz-border-radius: 2px 0 0 2px;\n  border-radius: 2px 0 0 2px;\n}\n.input-append input,\n.input-append select,\n.input-append .uneditable-input {\n  -webkit-border-radius: 2px 0 0 2px;\n  -moz-border-radius: 2px 0 0 2px;\n  border-radius: 2px 0 0 2px;\n}\n.input-append input + .btn-group .btn:last-child,\n.input-append select + .btn-group .btn:last-child,\n.input-append .uneditable-input + .btn-group .btn:last-child {\n  -webkit-border-radius: 0 2px 2px 0;\n  -moz-border-radius: 0 2px 2px 0;\n  border-radius: 0 2px 2px 0;\n}\n.input-append .add-on,\n.input-append .btn,\n.input-append .btn-group {\n  margin-left: -1px;\n}\n.input-append .add-on:last-child,\n.input-append .btn:last-child,\n.input-append .btn-group:last-child > .dropdown-toggle {\n  -webkit-border-radius: 0 2px 2px 0;\n  -moz-border-radius: 0 2px 2px 0;\n  border-radius: 0 2px 2px 0;\n}\n.input-prepend.input-append input,\n.input-prepend.input-append select,\n.input-prepend.input-append .uneditable-input {\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n}\n.input-prepend.input-append input + .btn-group .btn,\n.input-prepend.input-append select + .btn-group .btn,\n.input-prepend.input-append .uneditable-input + .btn-group .btn {\n  -webkit-border-radius: 0 2px 2px 0;\n  -moz-border-radius: 0 2px 2px 0;\n  border-radius: 0 2px 2px 0;\n}\n.input-prepend.input-append .add-on:first-child,\n.input-prepend.input-append .btn:first-child {\n  margin-right: -1px;\n  -webkit-border-radius: 2px 0 0 2px;\n  -moz-border-radius: 2px 0 0 2px;\n  border-radius: 2px 0 0 2px;\n}\n.input-prepend.input-append .add-on:last-child,\n.input-prepend.input-append .btn:last-child {\n  margin-left: -1px;\n  -webkit-border-radius: 0 2px 2px 0;\n  -moz-border-radius: 0 2px 2px 0;\n  border-radius: 0 2px 2px 0;\n}\n.input-prepend.input-append .btn-group:first-child {\n  margin-left: 0;\n}\ninput.search-query {\n  padding-right: 14px;\n  padding-right: 4px \\9;\n  padding-left: 14px;\n  padding-left: 4px \\9;\n  /* IE7-8 doesn't have border-radius, so don't indent the padding */\n\n  margin-bottom: 0;\n  -webkit-border-radius: 15px;\n  -moz-border-radius: 15px;\n  border-radius: 15px;\n}\n/* Allow for input prepend/append in search forms */\n.form-search .input-append .search-query,\n.form-search .input-prepend .search-query {\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n}\n.form-search .input-append .search-query {\n  -webkit-border-radius: 14px 0 0 14px;\n  -moz-border-radius: 14px 0 0 14px;\n  border-radius: 14px 0 0 14px;\n}\n.form-search .input-append .btn {\n  -webkit-border-radius: 0 14px 14px 0;\n  -moz-border-radius: 0 14px 14px 0;\n  border-radius: 0 14px 14px 0;\n}\n.form-search .input-prepend .search-query {\n  -webkit-border-radius: 0 14px 14px 0;\n  -moz-border-radius: 0 14px 14px 0;\n  border-radius: 0 14px 14px 0;\n}\n.form-search .input-prepend .btn {\n  -webkit-border-radius: 14px 0 0 14px;\n  -moz-border-radius: 14px 0 0 14px;\n  border-radius: 14px 0 0 14px;\n}\n.form-search input,\n.form-inline input,\n.form-horizontal input,\n.form-search textarea,\n.form-inline textarea,\n.form-horizontal textarea,\n.form-search select,\n.form-inline select,\n.form-horizontal select,\n.form-search .help-inline,\n.form-inline .help-inline,\n.form-horizontal .help-inline,\n.form-search .uneditable-input,\n.form-inline .uneditable-input,\n.form-horizontal .uneditable-input,\n.form-search .input-prepend,\n.form-inline .input-prepend,\n.form-horizontal .input-prepend,\n.form-search .input-append,\n.form-inline .input-append,\n.form-horizontal .input-append {\n  display: inline-block;\n  *display: inline;\n  /* IE7 inline-block hack */\n\n  *zoom: 1;\n  margin-bottom: 0;\n  vertical-align: middle;\n}\n.form-search .hide,\n.form-inline .hide,\n.form-horizontal .hide {\n  display: none;\n}\n.form-search label,\n.form-inline label,\n.form-search .btn-group,\n.form-inline .btn-group {\n  display: inline-block;\n}\n.form-search .input-append,\n.form-inline .input-append,\n.form-search .input-prepend,\n.form-inline .input-prepend {\n  margin-bottom: 0;\n}\n.form-search .radio,\n.form-search .checkbox,\n.form-inline .radio,\n.form-inline .checkbox {\n  padding-left: 0;\n  margin-bottom: 0;\n  vertical-align: middle;\n}\n.form-search .radio input[type=\"radio\"],\n.form-search .checkbox input[type=\"checkbox\"],\n.form-inline .radio input[type=\"radio\"],\n.form-inline .checkbox input[type=\"checkbox\"] {\n  float: left;\n  margin-right: 3px;\n  margin-left: 0;\n}\n.control-group {\n  margin-bottom: 10px;\n}\nlegend + .control-group {\n  margin-top: 20px;\n  -webkit-margin-top-collapse: separate;\n}\n.form-horizontal .control-group {\n  margin-bottom: 20px;\n  *zoom: 1;\n}\n.form-horizontal .control-group:before,\n.form-horizontal .control-group:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.form-horizontal .control-group:after {\n  clear: both;\n}\n.form-horizontal .control-label {\n  float: left;\n  width: 160px;\n  padding-top: 5px;\n  text-align: right;\n}\n.form-horizontal .controls {\n  *display: inline-block;\n  *padding-left: 20px;\n  margin-left: 180px;\n  *margin-left: 0;\n}\n.form-horizontal .controls:first-child {\n  *padding-left: 180px;\n}\n.form-horizontal .help-block {\n  margin-bottom: 0;\n}\n.form-horizontal input + .help-block,\n.form-horizontal select + .help-block,\n.form-horizontal textarea + .help-block,\n.form-horizontal .uneditable-input + .help-block,\n.form-horizontal .input-prepend + .help-block,\n.form-horizontal .input-append + .help-block {\n  margin-top: 10px;\n}\n.form-horizontal .form-actions {\n  padding-left: 180px;\n}\ntable {\n  max-width: 100%;\n  background-color: transparent;\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n.table {\n  width: 100%;\n  margin-bottom: 20px;\n}\n.table th,\n.table td {\n  padding: 8px;\n  line-height: 20px;\n  text-align: left;\n  vertical-align: top;\n  border-top: 1px solid #dddddd;\n}\n.table th {\n  font-weight: bold;\n}\n.table thead th {\n  vertical-align: bottom;\n}\n.table caption + thead tr:first-child th,\n.table caption + thead tr:first-child td,\n.table colgroup + thead tr:first-child th,\n.table colgroup + thead tr:first-child td,\n.table thead:first-child tr:first-child th,\n.table thead:first-child tr:first-child td {\n  border-top: 0;\n}\n.table tbody + tbody {\n  border-top: 2px solid #dddddd;\n}\n.table .table {\n  background-color: #fcfcfc;\n}\n.table-condensed th,\n.table-condensed td {\n  padding: 4px 5px;\n}\n.table-bordered {\n  border: 1px solid #dddddd;\n  border-collapse: separate;\n  *border-collapse: collapse;\n  border-left: 0;\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n}\n.table-bordered th,\n.table-bordered td {\n  border-left: 1px solid #dddddd;\n}\n.table-bordered caption + thead tr:first-child th,\n.table-bordered caption + tbody tr:first-child th,\n.table-bordered caption + tbody tr:first-child td,\n.table-bordered colgroup + thead tr:first-child th,\n.table-bordered colgroup + tbody tr:first-child th,\n.table-bordered colgroup + tbody tr:first-child td,\n.table-bordered thead:first-child tr:first-child th,\n.table-bordered tbody:first-child tr:first-child th,\n.table-bordered tbody:first-child tr:first-child td {\n  border-top: 0;\n}\n.table-bordered thead:first-child tr:first-child > th:first-child,\n.table-bordered tbody:first-child tr:first-child > td:first-child {\n  -webkit-border-top-left-radius: 2px;\n  -moz-border-radius-topleft: 2px;\n  border-top-left-radius: 2px;\n}\n.table-bordered thead:first-child tr:first-child > th:last-child,\n.table-bordered tbody:first-child tr:first-child > td:last-child {\n  -webkit-border-top-right-radius: 2px;\n  -moz-border-radius-topright: 2px;\n  border-top-right-radius: 2px;\n}\n.table-bordered thead:last-child tr:last-child > th:first-child,\n.table-bordered tbody:last-child tr:last-child > td:first-child,\n.table-bordered tfoot:last-child tr:last-child > td:first-child {\n  -webkit-border-bottom-left-radius: 2px;\n  -moz-border-radius-bottomleft: 2px;\n  border-bottom-left-radius: 2px;\n}\n.table-bordered thead:last-child tr:last-child > th:last-child,\n.table-bordered tbody:last-child tr:last-child > td:last-child,\n.table-bordered tfoot:last-child tr:last-child > td:last-child {\n  -webkit-border-bottom-right-radius: 2px;\n  -moz-border-radius-bottomright: 2px;\n  border-bottom-right-radius: 2px;\n}\n.table-bordered tfoot + tbody:last-child tr:last-child td:first-child {\n  -webkit-border-bottom-left-radius: 0;\n  -moz-border-radius-bottomleft: 0;\n  border-bottom-left-radius: 0;\n}\n.table-bordered tfoot + tbody:last-child tr:last-child td:last-child {\n  -webkit-border-bottom-right-radius: 0;\n  -moz-border-radius-bottomright: 0;\n  border-bottom-right-radius: 0;\n}\n.table-bordered caption + thead tr:first-child th:first-child,\n.table-bordered caption + tbody tr:first-child td:first-child,\n.table-bordered colgroup + thead tr:first-child th:first-child,\n.table-bordered colgroup + tbody tr:first-child td:first-child {\n  -webkit-border-top-left-radius: 2px;\n  -moz-border-radius-topleft: 2px;\n  border-top-left-radius: 2px;\n}\n.table-bordered caption + thead tr:first-child th:last-child,\n.table-bordered caption + tbody tr:first-child td:last-child,\n.table-bordered colgroup + thead tr:first-child th:last-child,\n.table-bordered colgroup + tbody tr:first-child td:last-child {\n  -webkit-border-top-right-radius: 2px;\n  -moz-border-radius-topright: 2px;\n  border-top-right-radius: 2px;\n}\n.table-striped tbody > tr:nth-child(odd) > td,\n.table-striped tbody > tr:nth-child(odd) > th {\n  background-color: #f9f9f9;\n}\n.table-hover tbody tr:hover td,\n.table-hover tbody tr:hover th {\n  background-color: #f5f5f5;\n}\ntable td[class*=\"span\"],\ntable th[class*=\"span\"],\n.row-fluid table td[class*=\"span\"],\n.row-fluid table th[class*=\"span\"] {\n  display: table-cell;\n  float: none;\n  margin-left: 0;\n}\n.table td.span1,\n.table th.span1 {\n  float: none;\n  width: 44px;\n  margin-left: 0;\n}\n.table td.span2,\n.table th.span2 {\n  float: none;\n  width: 124px;\n  margin-left: 0;\n}\n.table td.span3,\n.table th.span3 {\n  float: none;\n  width: 204px;\n  margin-left: 0;\n}\n.table td.span4,\n.table th.span4 {\n  float: none;\n  width: 284px;\n  margin-left: 0;\n}\n.table td.span5,\n.table th.span5 {\n  float: none;\n  width: 364px;\n  margin-left: 0;\n}\n.table td.span6,\n.table th.span6 {\n  float: none;\n  width: 444px;\n  margin-left: 0;\n}\n.table td.span7,\n.table th.span7 {\n  float: none;\n  width: 524px;\n  margin-left: 0;\n}\n.table td.span8,\n.table th.span8 {\n  float: none;\n  width: 604px;\n  margin-left: 0;\n}\n.table td.span9,\n.table th.span9 {\n  float: none;\n  width: 684px;\n  margin-left: 0;\n}\n.table td.span10,\n.table th.span10 {\n  float: none;\n  width: 764px;\n  margin-left: 0;\n}\n.table td.span11,\n.table th.span11 {\n  float: none;\n  width: 844px;\n  margin-left: 0;\n}\n.table td.span12,\n.table th.span12 {\n  float: none;\n  width: 924px;\n  margin-left: 0;\n}\n.table tbody tr.success td {\n  background-color: #dff0d8;\n}\n.table tbody tr.error td {\n  background-color: #f2dede;\n}\n.table tbody tr.warning td {\n  background-color: #fcf8e3;\n}\n.table tbody tr.info td {\n  background-color: #d9edf7;\n}\n.table-hover tbody tr.success:hover td {\n  background-color: #d0e9c6;\n}\n.table-hover tbody tr.error:hover td {\n  background-color: #ebcccc;\n}\n.table-hover tbody tr.warning:hover td {\n  background-color: #faf2cc;\n}\n.table-hover tbody tr.info:hover td {\n  background-color: #c4e3f3;\n}\n/*  Font Awesome 3.0\n    the iconic font designed for use with Twitter Bootstrap\n    -------------------------------------------------------\n    The full suite of pictographic icons, examples, and documentation\n    can be found at: http://fortawesome.github.com/Font-Awesome/\n\n    License\n    -------------------------------------------------------\n    • The Font Awesome font is licensed under the SIL Open Font License - http://scripts.sil.org/OFL\n    • Font Awesome CSS, LESS, and SASS files are licensed under the MIT License -\n      http://opensource.org/licenses/mit-license.html\n    • The Font Awesome pictograms are licensed under the CC BY 3.0 License - http://creativecommons.org/licenses/by/3.0/\n    • Attribution is no longer required in Font Awesome 3.0, but much appreciated:\n      \"Font Awesome by Dave Gandy - http://fortawesome.github.com/Font-Awesome\"\n\n    Contact\n    -------------------------------------------------------\n    Email: dave@davegandy.com\n    Twitter: http://twitter.com/fortaweso_me\n    Work: Lead Product Designer @ http://kyruus.com\n\n    */\n@font-face {\n  font-family: 'FontAwesome';\n  src: font-url('fontawesome-webfont.eot');\n  src: font-url('fontawesome-webfont.eot?#iefix') format('embedded-opentype'), font-url('fontawesome-webfont.woff') format('woff'), font-url('fontawesome-webfont.ttf') format('truetype');\n  font-weight: normal;\n  font-style: normal;\n}\n/*  Font Awesome styles\n    ------------------------------------------------------- */\n/* includes sprites.less reset */\n[class^=\"icon-\"],\n[class*=\" icon-\"] {\n  font-family: FontAwesome;\n  font-weight: normal;\n  font-style: normal;\n  text-decoration: inherit;\n  display: inline;\n  width: auto;\n  height: auto;\n  line-height: normal;\n  vertical-align: baseline;\n  background-image: none !important;\n  background-position: 0% 0%;\n  background-repeat: repeat;\n}\n[class^=\"icon-\"]:before,\n[class*=\" icon-\"]:before {\n  text-decoration: inherit;\n  display: inline-block;\n  speak: none;\n}\n/* makes sure icons active on rollover in links */\na [class^=\"icon-\"],\na [class*=\" icon-\"] {\n  display: inline-block;\n}\n/* makes the font 33% larger relative to the icon container */\n.icon-large:before {\n  vertical-align: -10%;\n  font-size: 1.3333333333333333em;\n}\n.btn [class^=\"icon-\"],\n.nav [class^=\"icon-\"],\n.btn [class*=\" icon-\"],\n.nav [class*=\" icon-\"] {\n  display: inline;\n  /* keeps button heights with and without icons the same */\n\n  line-height: .6em;\n}\n.btn [class^=\"icon-\"].icon-spin,\n.nav [class^=\"icon-\"].icon-spin,\n.btn [class*=\" icon-\"].icon-spin,\n.nav [class*=\" icon-\"].icon-spin {\n  display: inline-block;\n}\nli [class^=\"icon-\"],\nli [class*=\" icon-\"] {\n  display: inline-block;\n  width: 1.25em;\n  text-align: center;\n}\nli [class^=\"icon-\"].icon-large,\nli [class*=\" icon-\"].icon-large {\n  /* increased font size for icon-large */\n\n  width: 1.5625em;\n}\nul.icons {\n  list-style-type: none;\n  text-indent: -0.75em;\n}\nul.icons li [class^=\"icon-\"],\nul.icons li [class*=\" icon-\"] {\n  width: .75em;\n}\n.icon-muted {\n  color: #eeeeee;\n}\n.icon-border {\n  border: solid 1px #eeeeee;\n  padding: .2em .25em .15em;\n  -webkit-border-radius: 3px;\n  -moz-border-radius: 3px;\n  border-radius: 3px;\n}\n.icon-2x {\n  font-size: 2em;\n}\n.icon-2x.icon-border {\n  border-width: 2px;\n  -webkit-border-radius: 4px;\n  -moz-border-radius: 4px;\n  border-radius: 4px;\n}\n.icon-3x {\n  font-size: 3em;\n}\n.icon-3x.icon-border {\n  border-width: 3px;\n  -webkit-border-radius: 5px;\n  -moz-border-radius: 5px;\n  border-radius: 5px;\n}\n.icon-4x {\n  font-size: 4em;\n}\n.icon-4x.icon-border {\n  border-width: 4px;\n  -webkit-border-radius: 6px;\n  -moz-border-radius: 6px;\n  border-radius: 6px;\n}\n.pull-right {\n  float: right;\n}\n.pull-left {\n  float: left;\n}\n[class^=\"icon-\"].pull-left,\n[class*=\" icon-\"].pull-left {\n  margin-right: .35em;\n}\n[class^=\"icon-\"].pull-right,\n[class*=\" icon-\"].pull-right {\n  margin-left: .35em;\n}\n.btn [class^=\"icon-\"].pull-left.icon-2x,\n.btn [class*=\" icon-\"].pull-left.icon-2x,\n.btn [class^=\"icon-\"].pull-right.icon-2x,\n.btn [class*=\" icon-\"].pull-right.icon-2x {\n  margin-top: .35em;\n}\n.btn [class^=\"icon-\"].icon-spin.icon-large,\n.btn [class*=\" icon-\"].icon-spin.icon-large {\n  height: .75em;\n}\n.btn.btn-small [class^=\"icon-\"].pull-left.icon-2x,\n.btn.btn-small [class*=\" icon-\"].pull-left.icon-2x,\n.btn.btn-small [class^=\"icon-\"].pull-right.icon-2x,\n.btn.btn-small [class*=\" icon-\"].pull-right.icon-2x {\n  margin-top: .45em;\n}\n.btn.btn-large [class^=\"icon-\"].pull-left.icon-2x,\n.btn.btn-large [class*=\" icon-\"].pull-left.icon-2x,\n.btn.btn-large [class^=\"icon-\"].pull-right.icon-2x,\n.btn.btn-large [class*=\" icon-\"].pull-right.icon-2x {\n  margin-top: .2em;\n}\n.icon-spin {\n  display: inline-block;\n  -moz-animation: spin 2s infinite linear;\n  -o-animation: spin 2s infinite linear;\n  -webkit-animation: spin 2s infinite linear;\n  animation: spin 2s infinite linear;\n}\n@-moz-keyframes spin {\n  0% {\n    -moz-transform: rotate(0deg);\n  }\n  100% {\n    -moz-transform: rotate(359deg);\n  }\n}\n@-webkit-keyframes spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n  }\n}\n@-o-keyframes spin {\n  0% {\n    -o-transform: rotate(0deg);\n  }\n  100% {\n    -o-transform: rotate(359deg);\n  }\n}\n@-ms-keyframes spin {\n  0% {\n    -ms-transform: rotate(0deg);\n  }\n  100% {\n    -ms-transform: rotate(359deg);\n  }\n}\n@keyframes spin {\n  0% {\n    transform: rotate(0deg);\n  }\n  100% {\n    transform: rotate(359deg);\n  }\n}\n/*  Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\n    readers do not read off random characters that represent icons */\n.icon-glass:before {\n  content: \"\\f000\";\n}\n.icon-music:before {\n  content: \"\\f001\";\n}\n.icon-search:before {\n  content: \"\\f002\";\n}\n.icon-envelope:before {\n  content: \"\\f003\";\n}\n.icon-heart:before {\n  content: \"\\f004\";\n}\n.icon-star:before {\n  content: \"\\f005\";\n}\n.icon-star-empty:before {\n  content: \"\\f006\";\n}\n.icon-user:before {\n  content: \"\\f007\";\n}\n.icon-film:before {\n  content: \"\\f008\";\n}\n.icon-th-large:before {\n  content: \"\\f009\";\n}\n.icon-th:before {\n  content: \"\\f00a\";\n}\n.icon-th-list:before {\n  content: \"\\f00b\";\n}\n.icon-ok:before {\n  content: \"\\f00c\";\n}\n.icon-remove:before {\n  content: \"\\f00d\";\n}\n.icon-zoom-in:before {\n  content: \"\\f00e\";\n}\n.icon-zoom-out:before {\n  content: \"\\f010\";\n}\n.icon-off:before {\n  content: \"\\f011\";\n}\n.icon-signal:before {\n  content: \"\\f012\";\n}\n.icon-cog:before {\n  content: \"\\f013\";\n}\n.icon-trash:before {\n  content: \"\\f014\";\n}\n.icon-home:before {\n  content: \"\\f015\";\n}\n.icon-file:before {\n  content: \"\\f016\";\n}\n.icon-time:before {\n  content: \"\\f017\";\n}\n.icon-road:before {\n  content: \"\\f018\";\n}\n.icon-download-alt:before {\n  content: \"\\f019\";\n}\n.icon-download:before {\n  content: \"\\f01a\";\n}\n.icon-upload:before {\n  content: \"\\f01b\";\n}\n.icon-inbox:before {\n  content: \"\\f01c\";\n}\n.icon-play-circle:before {\n  content: \"\\f01d\";\n}\n.icon-repeat:before {\n  content: \"\\f01e\";\n}\n/* \\f020 doesn't work in Safari. all shifted one down */\n.icon-refresh:before {\n  content: \"\\f021\";\n}\n.icon-list-alt:before {\n  content: \"\\f022\";\n}\n.icon-lock:before {\n  content: \"\\f023\";\n}\n.icon-flag:before {\n  content: \"\\f024\";\n}\n.icon-headphones:before {\n  content: \"\\f025\";\n}\n.icon-volume-off:before {\n  content: \"\\f026\";\n}\n.icon-volume-down:before {\n  content: \"\\f027\";\n}\n.icon-volume-up:before {\n  content: \"\\f028\";\n}\n.icon-qrcode:before {\n  content: \"\\f029\";\n}\n.icon-barcode:before {\n  content: \"\\f02a\";\n}\n.icon-tag:before {\n  content: \"\\f02b\";\n}\n.icon-tags:before {\n  content: \"\\f02c\";\n}\n.icon-book:before {\n  content: \"\\f02d\";\n}\n.icon-bookmark:before {\n  content: \"\\f02e\";\n}\n.icon-print:before {\n  content: \"\\f02f\";\n}\n.icon-camera:before {\n  content: \"\\f030\";\n}\n.icon-font:before {\n  content: \"\\f031\";\n}\n.icon-bold:before {\n  content: \"\\f032\";\n}\n.icon-italic:before {\n  content: \"\\f033\";\n}\n.icon-text-height:before {\n  content: \"\\f034\";\n}\n.icon-text-width:before {\n  content: \"\\f035\";\n}\n.icon-align-left:before {\n  content: \"\\f036\";\n}\n.icon-align-center:before {\n  content: \"\\f037\";\n}\n.icon-align-right:before {\n  content: \"\\f038\";\n}\n.icon-align-justify:before {\n  content: \"\\f039\";\n}\n.icon-list:before {\n  content: \"\\f03a\";\n}\n.icon-indent-left:before {\n  content: \"\\f03b\";\n}\n.icon-indent-right:before {\n  content: \"\\f03c\";\n}\n.icon-facetime-video:before {\n  content: \"\\f03d\";\n}\n.icon-picture:before {\n  content: \"\\f03e\";\n}\n.icon-pencil:before {\n  content: \"\\f040\";\n}\n.icon-map-marker:before {\n  content: \"\\f041\";\n}\n.icon-adjust:before {\n  content: \"\\f042\";\n}\n.icon-tint:before {\n  content: \"\\f043\";\n}\n.icon-edit:before {\n  content: \"\\f044\";\n}\n.icon-share:before {\n  content: \"\\f045\";\n}\n.icon-check:before {\n  content: \"\\f046\";\n}\n.icon-move:before {\n  content: \"\\f047\";\n}\n.icon-step-backward:before {\n  content: \"\\f048\";\n}\n.icon-fast-backward:before {\n  content: \"\\f049\";\n}\n.icon-backward:before {\n  content: \"\\f04a\";\n}\n.icon-play:before {\n  content: \"\\f04b\";\n}\n.icon-pause:before {\n  content: \"\\f04c\";\n}\n.icon-stop:before {\n  content: \"\\f04d\";\n}\n.icon-forward:before {\n  content: \"\\f04e\";\n}\n.icon-fast-forward:before {\n  content: \"\\f050\";\n}\n.icon-step-forward:before {\n  content: \"\\f051\";\n}\n.icon-eject:before {\n  content: \"\\f052\";\n}\n.icon-chevron-left:before {\n  content: \"\\f053\";\n}\n.icon-chevron-right:before {\n  content: \"\\f054\";\n}\n.icon-plus-sign:before {\n  content: \"\\f055\";\n}\n.icon-minus-sign:before {\n  content: \"\\f056\";\n}\n.icon-remove-sign:before {\n  content: \"\\f057\";\n}\n.icon-ok-sign:before {\n  content: \"\\f058\";\n}\n.icon-question-sign:before {\n  content: \"\\f059\";\n}\n.icon-info-sign:before {\n  content: \"\\f05a\";\n}\n.icon-screenshot:before {\n  content: \"\\f05b\";\n}\n.icon-remove-circle:before {\n  content: \"\\f05c\";\n}\n.icon-ok-circle:before {\n  content: \"\\f05d\";\n}\n.icon-ban-circle:before {\n  content: \"\\f05e\";\n}\n.icon-arrow-left:before {\n  content: \"\\f060\";\n}\n.icon-arrow-right:before {\n  content: \"\\f061\";\n}\n.icon-arrow-up:before {\n  content: \"\\f062\";\n}\n.icon-arrow-down:before {\n  content: \"\\f063\";\n}\n.icon-share-alt:before {\n  content: \"\\f064\";\n}\n.icon-resize-full:before {\n  content: \"\\f065\";\n}\n.icon-resize-small:before {\n  content: \"\\f066\";\n}\n.icon-plus:before {\n  content: \"\\f067\";\n}\n.icon-minus:before {\n  content: \"\\f068\";\n}\n.icon-asterisk:before {\n  content: \"\\f069\";\n}\n.icon-exclamation-sign:before {\n  content: \"\\f06a\";\n}\n.icon-gift:before {\n  content: \"\\f06b\";\n}\n.icon-leaf:before {\n  content: \"\\f06c\";\n}\n.icon-fire:before {\n  content: \"\\f06d\";\n}\n.icon-eye-open:before {\n  content: \"\\f06e\";\n}\n.icon-eye-close:before {\n  content: \"\\f070\";\n}\n.icon-warning-sign:before {\n  content: \"\\f071\";\n}\n.icon-plane:before {\n  content: \"\\f072\";\n}\n.icon-calendar:before {\n  content: \"\\f073\";\n}\n.icon-random:before {\n  content: \"\\f074\";\n}\n.icon-comment:before {\n  content: \"\\f075\";\n}\n.icon-magnet:before {\n  content: \"\\f076\";\n}\n.icon-chevron-up:before {\n  content: \"\\f077\";\n}\n.icon-chevron-down:before {\n  content: \"\\f078\";\n}\n.icon-retweet:before {\n  content: \"\\f079\";\n}\n.icon-shopping-cart:before {\n  content: \"\\f07a\";\n}\n.icon-folder-close:before {\n  content: \"\\f07b\";\n}\n.icon-folder-open:before {\n  content: \"\\f07c\";\n}\n.icon-resize-vertical:before {\n  content: \"\\f07d\";\n}\n.icon-resize-horizontal:before {\n  content: \"\\f07e\";\n}\n.icon-bar-chart:before {\n  content: \"\\f080\";\n}\n.icon-twitter-sign:before {\n  content: \"\\f081\";\n}\n.icon-facebook-sign:before {\n  content: \"\\f082\";\n}\n.icon-camera-retro:before {\n  content: \"\\f083\";\n}\n.icon-key:before {\n  content: \"\\f084\";\n}\n.icon-cogs:before {\n  content: \"\\f085\";\n}\n.icon-comments:before {\n  content: \"\\f086\";\n}\n.icon-thumbs-up:before {\n  content: \"\\f087\";\n}\n.icon-thumbs-down:before {\n  content: \"\\f088\";\n}\n.icon-star-half:before {\n  content: \"\\f089\";\n}\n.icon-heart-empty:before {\n  content: \"\\f08a\";\n}\n.icon-signout:before {\n  content: \"\\f08b\";\n}\n.icon-linkedin-sign:before {\n  content: \"\\f08c\";\n}\n.icon-pushpin:before {\n  content: \"\\f08d\";\n}\n.icon-external-link:before {\n  content: \"\\f08e\";\n}\n.icon-signin:before {\n  content: \"\\f090\";\n}\n.icon-trophy:before {\n  content: \"\\f091\";\n}\n.icon-github-sign:before {\n  content: \"\\f092\";\n}\n.icon-upload-alt:before {\n  content: \"\\f093\";\n}\n.icon-lemon:before {\n  content: \"\\f094\";\n}\n.icon-phone:before {\n  content: \"\\f095\";\n}\n.icon-check-empty:before {\n  content: \"\\f096\";\n}\n.icon-bookmark-empty:before {\n  content: \"\\f097\";\n}\n.icon-phone-sign:before {\n  content: \"\\f098\";\n}\n.icon-twitter:before {\n  content: \"\\f099\";\n}\n.icon-facebook:before {\n  content: \"\\f09a\";\n}\n.icon-github:before {\n  content: \"\\f09b\";\n}\n.icon-unlock:before {\n  content: \"\\f09c\";\n}\n.icon-credit-card:before {\n  content: \"\\f09d\";\n}\n.icon-rss:before {\n  content: \"\\f09e\";\n}\n.icon-hdd:before {\n  content: \"\\f0a0\";\n}\n.icon-bullhorn:before {\n  content: \"\\f0a1\";\n}\n.icon-bell:before {\n  content: \"\\f0a2\";\n}\n.icon-certificate:before {\n  content: \"\\f0a3\";\n}\n.icon-hand-right:before {\n  content: \"\\f0a4\";\n}\n.icon-hand-left:before {\n  content: \"\\f0a5\";\n}\n.icon-hand-up:before {\n  content: \"\\f0a6\";\n}\n.icon-hand-down:before {\n  content: \"\\f0a7\";\n}\n.icon-circle-arrow-left:before {\n  content: \"\\f0a8\";\n}\n.icon-circle-arrow-right:before {\n  content: \"\\f0a9\";\n}\n.icon-circle-arrow-up:before {\n  content: \"\\f0aa\";\n}\n.icon-circle-arrow-down:before {\n  content: \"\\f0ab\";\n}\n.icon-globe:before {\n  content: \"\\f0ac\";\n}\n.icon-wrench:before {\n  content: \"\\f0ad\";\n}\n.icon-tasks:before {\n  content: \"\\f0ae\";\n}\n.icon-filter:before {\n  content: \"\\f0b0\";\n}\n.icon-briefcase:before {\n  content: \"\\f0b1\";\n}\n.icon-fullscreen:before {\n  content: \"\\f0b2\";\n}\n.icon-group:before {\n  content: \"\\f0c0\";\n}\n.icon-link:before {\n  content: \"\\f0c1\";\n}\n.icon-cloud:before {\n  content: \"\\f0c2\";\n}\n.icon-beaker:before {\n  content: \"\\f0c3\";\n}\n.icon-cut:before {\n  content: \"\\f0c4\";\n}\n.icon-copy:before {\n  content: \"\\f0c5\";\n}\n.icon-paper-clip:before {\n  content: \"\\f0c6\";\n}\n.icon-save:before {\n  content: \"\\f0c7\";\n}\n.icon-sign-blank:before {\n  content: \"\\f0c8\";\n}\n.icon-reorder:before {\n  content: \"\\f0c9\";\n}\n.icon-list-ul:before {\n  content: \"\\f0ca\";\n}\n.icon-list-ol:before {\n  content: \"\\f0cb\";\n}\n.icon-strikethrough:before {\n  content: \"\\f0cc\";\n}\n.icon-underline:before {\n  content: \"\\f0cd\";\n}\n.icon-table:before {\n  content: \"\\f0ce\";\n}\n.icon-magic:before {\n  content: \"\\f0d0\";\n}\n.icon-truck:before {\n  content: \"\\f0d1\";\n}\n.icon-pinterest:before {\n  content: \"\\f0d2\";\n}\n.icon-pinterest-sign:before {\n  content: \"\\f0d3\";\n}\n.icon-google-plus-sign:before {\n  content: \"\\f0d4\";\n}\n.icon-google-plus:before {\n  content: \"\\f0d5\";\n}\n.icon-money:before {\n  content: \"\\f0d6\";\n}\n.icon-caret-down:before {\n  content: \"\\f0d7\";\n}\n.icon-caret-up:before {\n  content: \"\\f0d8\";\n}\n.icon-caret-left:before {\n  content: \"\\f0d9\";\n}\n.icon-caret-right:before {\n  content: \"\\f0da\";\n}\n.icon-columns:before {\n  content: \"\\f0db\";\n}\n.icon-sort:before {\n  content: \"\\f0dc\";\n}\n.icon-sort-down:before {\n  content: \"\\f0dd\";\n}\n.icon-sort-up:before {\n  content: \"\\f0de\";\n}\n.icon-envelope-alt:before {\n  content: \"\\f0e0\";\n}\n.icon-linkedin:before {\n  content: \"\\f0e1\";\n}\n.icon-undo:before {\n  content: \"\\f0e2\";\n}\n.icon-legal:before {\n  content: \"\\f0e3\";\n}\n.icon-dashboard:before {\n  content: \"\\f0e4\";\n}\n.icon-comment-alt:before {\n  content: \"\\f0e5\";\n}\n.icon-comments-alt:before {\n  content: \"\\f0e6\";\n}\n.icon-bolt:before {\n  content: \"\\f0e7\";\n}\n.icon-sitemap:before {\n  content: \"\\f0e8\";\n}\n.icon-umbrella:before {\n  content: \"\\f0e9\";\n}\n.icon-paste:before {\n  content: \"\\f0ea\";\n}\n.icon-lightbulb:before {\n  content: \"\\f0eb\";\n}\n.icon-exchange:before {\n  content: \"\\f0ec\";\n}\n.icon-cloud-download:before {\n  content: \"\\f0ed\";\n}\n.icon-cloud-upload:before {\n  content: \"\\f0ee\";\n}\n.icon-user-md:before {\n  content: \"\\f0f0\";\n}\n.icon-stethoscope:before {\n  content: \"\\f0f1\";\n}\n.icon-suitcase:before {\n  content: \"\\f0f2\";\n}\n.icon-bell-alt:before {\n  content: \"\\f0f3\";\n}\n.icon-coffee:before {\n  content: \"\\f0f4\";\n}\n.icon-food:before {\n  content: \"\\f0f5\";\n}\n.icon-file-alt:before {\n  content: \"\\f0f6\";\n}\n.icon-building:before {\n  content: \"\\f0f7\";\n}\n.icon-hospital:before {\n  content: \"\\f0f8\";\n}\n.icon-ambulance:before {\n  content: \"\\f0f9\";\n}\n.icon-medkit:before {\n  content: \"\\f0fa\";\n}\n.icon-fighter-jet:before {\n  content: \"\\f0fb\";\n}\n.icon-beer:before {\n  content: \"\\f0fc\";\n}\n.icon-h-sign:before {\n  content: \"\\f0fd\";\n}\n.icon-plus-sign-alt:before {\n  content: \"\\f0fe\";\n}\n.icon-double-angle-left:before {\n  content: \"\\f100\";\n}\n.icon-double-angle-right:before {\n  content: \"\\f101\";\n}\n.icon-double-angle-up:before {\n  content: \"\\f102\";\n}\n.icon-double-angle-down:before {\n  content: \"\\f103\";\n}\n.icon-angle-left:before {\n  content: \"\\f104\";\n}\n.icon-angle-right:before {\n  content: \"\\f105\";\n}\n.icon-angle-up:before {\n  content: \"\\f106\";\n}\n.icon-angle-down:before {\n  content: \"\\f107\";\n}\n.icon-desktop:before {\n  content: \"\\f108\";\n}\n.icon-laptop:before {\n  content: \"\\f109\";\n}\n.icon-tablet:before {\n  content: \"\\f10a\";\n}\n.icon-mobile-phone:before {\n  content: \"\\f10b\";\n}\n.icon-circle-blank:before {\n  content: \"\\f10c\";\n}\n.icon-quote-left:before {\n  content: \"\\f10d\";\n}\n.icon-quote-right:before {\n  content: \"\\f10e\";\n}\n.icon-spinner:before {\n  content: \"\\f110\";\n}\n.icon-circle:before {\n  content: \"\\f111\";\n}\n.icon-reply:before {\n  content: \"\\f112\";\n}\n.icon-github-alt:before {\n  content: \"\\f113\";\n}\n.icon-folder-close-alt:before {\n  content: \"\\f114\";\n}\n.icon-folder-open-alt:before {\n  content: \"\\f115\";\n}\n.dropup,\n.dropdown {\n  position: relative;\n}\n.dropdown-toggle {\n  *margin-bottom: -3px;\n}\n.dropdown-toggle:active,\n.open .dropdown-toggle {\n  outline: 0;\n}\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  vertical-align: top;\n  border-top: 4px solid #000000;\n  border-right: 4px solid transparent;\n  border-left: 4px solid transparent;\n  content: \"\";\n}\n.dropdown .caret {\n  margin-top: 8px;\n  margin-left: 2px;\n}\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0;\n  list-style: none;\n  background-color: #ffffff;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  *border-right-width: 2px;\n  *border-bottom-width: 2px;\n  -webkit-border-radius: 6px;\n  -moz-border-radius: 6px;\n  border-radius: 6px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  -webkit-background-clip: padding-box;\n  -moz-background-clip: padding;\n  background-clip: padding-box;\n}\n.dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n.dropdown-menu .divider {\n  *width: 100%;\n  height: 1px;\n  margin: 9px 1px;\n  *margin: -5px 0 5px;\n  overflow: hidden;\n  background-color: #e5e5e5;\n  border-bottom: 1px solid #ffffff;\n}\n.dropdown-menu li > a {\n  display: block;\n  padding: 3px 20px;\n  clear: both;\n  font-weight: normal;\n  line-height: 20px;\n  color: #242424;\n  white-space: nowrap;\n}\n.dropdown-menu li > a:hover,\n.dropdown-menu li > a:focus,\n.dropdown-submenu:hover > a {\n  text-decoration: none;\n  color: #ffffff;\n  background-color: rgba(31, 31, 31, 0.8);\n  background-image: -moz-linear-gradient(top, rgba(36, 36, 36, 0.8), rgba(23, 23, 23, 0.8));\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(rgba(36, 36, 36, 0.8)), to(rgba(23, 23, 23, 0.8)));\n  background-image: -webkit-linear-gradient(top, rgba(36, 36, 36, 0.8), rgba(23, 23, 23, 0.8));\n  background-image: -o-linear-gradient(top, rgba(36, 36, 36, 0.8), rgba(23, 23, 23, 0.8));\n  background-image: linear-gradient(to bottom, rgba(36, 36, 36, 0.8), rgba(23, 23, 23, 0.8));\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#cc242424', endColorstr='#cc171717', GradientType=0);\n}\n.dropdown-menu .active > a,\n.dropdown-menu .active > a:hover {\n  color: #242424;\n  text-decoration: none;\n  outline: 0;\n  background-color: rgba(31, 31, 31, 0.8);\n  background-image: -moz-linear-gradient(top, rgba(36, 36, 36, 0.8), rgba(23, 23, 23, 0.8));\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(rgba(36, 36, 36, 0.8)), to(rgba(23, 23, 23, 0.8)));\n  background-image: -webkit-linear-gradient(top, rgba(36, 36, 36, 0.8), rgba(23, 23, 23, 0.8));\n  background-image: -o-linear-gradient(top, rgba(36, 36, 36, 0.8), rgba(23, 23, 23, 0.8));\n  background-image: linear-gradient(to bottom, rgba(36, 36, 36, 0.8), rgba(23, 23, 23, 0.8));\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#cc242424', endColorstr='#cc171717', GradientType=0);\n}\n.dropdown-menu .disabled > a,\n.dropdown-menu .disabled > a:hover {\n  color: rgba(36, 36, 36, 0.8);\n}\n.dropdown-menu .disabled > a:hover {\n  text-decoration: none;\n  background-color: transparent;\n  background-image: none;\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  cursor: default;\n}\n.open {\n  *z-index: 1000;\n}\n.open > .dropdown-menu {\n  display: block;\n}\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n  border-top: 0;\n  border-bottom: 4px solid #000000;\n  content: \"\";\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-bottom: 1px;\n}\n.dropdown-submenu {\n  position: relative;\n}\n.dropdown-submenu > .dropdown-menu {\n  top: 0;\n  left: 100%;\n  margin-top: -6px;\n  margin-left: -1px;\n  -webkit-border-radius: 0 6px 6px 6px;\n  -moz-border-radius: 0 6px 6px 6px;\n  border-radius: 0 6px 6px 6px;\n}\n.dropdown-submenu:hover > .dropdown-menu {\n  display: block;\n}\n.dropup .dropdown-submenu > .dropdown-menu {\n  top: auto;\n  bottom: 0;\n  margin-top: 0;\n  margin-bottom: -2px;\n  -webkit-border-radius: 5px 5px 5px 0;\n  -moz-border-radius: 5px 5px 5px 0;\n  border-radius: 5px 5px 5px 0;\n}\n.dropdown-submenu > a:after {\n  display: block;\n  content: \" \";\n  float: right;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n  border-width: 5px 0 5px 5px;\n  border-left-color: #cccccc;\n  margin-top: 5px;\n  margin-right: -10px;\n}\n.dropdown-submenu:hover > a:after {\n  border-left-color: #ffffff;\n}\n.dropdown-submenu.pull-left {\n  float: none;\n}\n.dropdown-submenu.pull-left > .dropdown-menu {\n  left: -100%;\n  margin-left: 10px;\n  -webkit-border-radius: 6px 0 6px 6px;\n  -moz-border-radius: 6px 0 6px 6px;\n  border-radius: 6px 0 6px 6px;\n}\n.dropdown .dropdown-menu .nav-header {\n  padding-left: 20px;\n  padding-right: 20px;\n}\n.typeahead {\n  z-index: 1051;\n  margin-top: 2px;\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n}\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: #eeeeee;\n  border: 1px solid #dcdcdc;\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n  border-color: #ddd;\n  border-color: rgba(0, 0, 0, 0.15);\n}\n.well-large {\n  padding: 24px;\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n}\n.well-small {\n  padding: 9px;\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n}\n.fade {\n  opacity: 0;\n  -webkit-transition: opacity 0.15s linear;\n  -moz-transition: opacity 0.15s linear;\n  -o-transition: opacity 0.15s linear;\n  transition: opacity 0.15s linear;\n}\n.fade.in {\n  opacity: 1;\n}\n.collapse {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  -webkit-transition: height 0.35s ease;\n  -moz-transition: height 0.35s ease;\n  -o-transition: height 0.35s ease;\n  transition: height 0.35s ease;\n}\n.collapse.in {\n  height: auto;\n}\n.close {\n  float: right;\n  font-size: 20px;\n  font-weight: bold;\n  line-height: 20px;\n  color: #000000;\n  text-shadow: 0 1px 0 #ffffff;\n  opacity: 0.2;\n  filter: alpha(opacity=20);\n}\n.close:hover {\n  color: #000000;\n  text-decoration: none;\n  cursor: pointer;\n  opacity: 0.4;\n  filter: alpha(opacity=40);\n}\nbutton.close {\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n  -webkit-appearance: none;\n}\n.btn {\n  display: inline-block;\n  *display: inline;\n  /* IE7 inline-block hack */\n\n  *zoom: 1;\n  padding: 4px 12px;\n  margin-bottom: 0;\n  font-size: 14px;\n  line-height: 20px;\n  text-align: center;\n  vertical-align: middle;\n  cursor: pointer;\n  color: #333333;\n  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);\n  background-color: #f5f5f5;\n  background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));\n  background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);\n  border-color: #e6e6e6 #e6e6e6 #bfbfbf;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #e6e6e6;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  border: 1px solid #bbbbbb;\n  *border: 0;\n  border-bottom-color: #a2a2a2;\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n  *margin-left: .3em;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);\n  -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);\n  box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);\n}\n.btn:hover,\n.btn:active,\n.btn.active,\n.btn.disabled,\n.btn[disabled] {\n  color: #333333;\n  background-color: #e6e6e6;\n  *background-color: #d9d9d9;\n}\n.btn:active,\n.btn.active {\n  background-color: #cccccc \\9;\n}\n.btn:first-child {\n  *margin-left: 0;\n}\n.btn:hover {\n  color: #333333;\n  text-decoration: none;\n  background-position: 0 -15px;\n  -webkit-transition: background-position 0.1s linear;\n  -moz-transition: background-position 0.1s linear;\n  -o-transition: background-position 0.1s linear;\n  transition: background-position 0.1s linear;\n}\n.btn:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n.btn.active,\n.btn:active {\n  background-image: none;\n  outline: 0;\n  -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);\n  -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);\n  box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);\n}\n.btn.disabled,\n.btn[disabled] {\n  cursor: default;\n  background-image: none;\n  opacity: 0.65;\n  filter: alpha(opacity=65);\n  -webkit-box-shadow: none;\n  -moz-box-shadow: none;\n  box-shadow: none;\n}\n.btn-large {\n  padding: 11px 19px;\n  font-size: 17.5px;\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n}\n.btn-large [class^=\"icon-\"],\n.btn-large [class*=\" icon-\"] {\n  margin-top: 4px;\n}\n.btn-small {\n  padding: 2px 10px;\n  font-size: 11.9px;\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n}\n.btn-small [class^=\"icon-\"],\n.btn-small [class*=\" icon-\"] {\n  margin-top: 0;\n}\n.btn-mini [class^=\"icon-\"],\n.btn-mini [class*=\" icon-\"] {\n  margin-top: -1px;\n}\n.btn-mini {\n  padding: 1px 6px;\n  font-size: 10.5px;\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n}\n.btn-block {\n  display: block;\n  width: 100%;\n  padding-left: 0;\n  padding-right: 0;\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n.btn-primary.active,\n.btn-warning.active,\n.btn-danger.active,\n.btn-success.active,\n.btn-info.active,\n.btn-inverse.active {\n  color: rgba(255, 255, 255, 0.75);\n}\n.btn {\n  border-color: #c5c5c5;\n  border-color: rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25);\n}\n.btn-primary {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #4e998e;\n  background-image: -moz-linear-gradient(top, #55a79a, #44857b);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#55a79a), to(#44857b));\n  background-image: -webkit-linear-gradient(top, #55a79a, #44857b);\n  background-image: -o-linear-gradient(top, #55a79a, #44857b);\n  background-image: linear-gradient(to bottom, #55a79a, #44857b);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff55a79a', endColorstr='#ff44857b', GradientType=0);\n  border-color: #44857b #44857b #2a534c;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #44857b;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.btn-primary:hover,\n.btn-primary:active,\n.btn-primary.active,\n.btn-primary.disabled,\n.btn-primary[disabled] {\n  color: #ffffff;\n  background-color: #44857b;\n  *background-color: #3b746b;\n}\n.btn-primary:active,\n.btn-primary.active {\n  background-color: #33635c \\9;\n}\n.btn-warning {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #faa732;\n  background-image: -moz-linear-gradient(top, #fbb450, #f89406);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));\n  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);\n  background-image: -o-linear-gradient(top, #fbb450, #f89406);\n  background-image: linear-gradient(to bottom, #fbb450, #f89406);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);\n  border-color: #f89406 #f89406 #ad6704;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #f89406;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.btn-warning:hover,\n.btn-warning:active,\n.btn-warning.active,\n.btn-warning.disabled,\n.btn-warning[disabled] {\n  color: #ffffff;\n  background-color: #f89406;\n  *background-color: #df8505;\n}\n.btn-warning:active,\n.btn-warning.active {\n  background-color: #c67605 \\9;\n}\n.btn-danger {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #da4f49;\n  background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));\n  background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f);\n  background-image: -o-linear-gradient(top, #ee5f5b, #bd362f);\n  background-image: linear-gradient(to bottom, #ee5f5b, #bd362f);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);\n  border-color: #bd362f #bd362f #802420;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #bd362f;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.btn-danger:hover,\n.btn-danger:active,\n.btn-danger.active,\n.btn-danger.disabled,\n.btn-danger[disabled] {\n  color: #ffffff;\n  background-color: #bd362f;\n  *background-color: #a9302a;\n}\n.btn-danger:active,\n.btn-danger.active {\n  background-color: #942a25 \\9;\n}\n.btn-success {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #318b20;\n  background-image: -moz-linear-gradient(top, #1b7b00, #51a351);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#1b7b00), to(#51a351));\n  background-image: -webkit-linear-gradient(top, #1b7b00, #51a351);\n  background-image: -o-linear-gradient(top, #1b7b00, #51a351);\n  background-image: linear-gradient(to bottom, #1b7b00, #51a351);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff1b7b00', endColorstr='#ff51a351', GradientType=0);\n  border-color: #51a351 #51a351 #387038;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #51a351;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.btn-success:hover,\n.btn-success:active,\n.btn-success.active,\n.btn-success.disabled,\n.btn-success[disabled] {\n  color: #ffffff;\n  background-color: #51a351;\n  *background-color: #499249;\n}\n.btn-success:active,\n.btn-success.active {\n  background-color: #408140 \\9;\n}\n.btn-info {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #49afcd;\n  background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));\n  background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4);\n  background-image: -o-linear-gradient(top, #5bc0de, #2f96b4);\n  background-image: linear-gradient(to bottom, #5bc0de, #2f96b4);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);\n  border-color: #2f96b4 #2f96b4 #1f6377;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #2f96b4;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.btn-info:hover,\n.btn-info:active,\n.btn-info.active,\n.btn-info.disabled,\n.btn-info[disabled] {\n  color: #ffffff;\n  background-color: #2f96b4;\n  *background-color: #2a85a0;\n}\n.btn-info:active,\n.btn-info.active {\n  background-color: #24748c \\9;\n}\n.btn-inverse {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #161616;\n  background-image: -moz-linear-gradient(top, #242424, #000000);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#242424), to(#000000));\n  background-image: -webkit-linear-gradient(top, #242424, #000000);\n  background-image: -o-linear-gradient(top, #242424, #000000);\n  background-image: linear-gradient(to bottom, #242424, #000000);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff242424', endColorstr='#ff000000', GradientType=0);\n  border-color: #000000 #000000 #000000;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #000000;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.btn-inverse:hover,\n.btn-inverse:active,\n.btn-inverse.active,\n.btn-inverse.disabled,\n.btn-inverse[disabled] {\n  color: #ffffff;\n  background-color: #000000;\n  *background-color: #000000;\n}\n.btn-inverse:active,\n.btn-inverse.active {\n  background-color: #000000 \\9;\n}\nbutton.btn,\ninput[type=\"submit\"].btn {\n  *padding-top: 3px;\n  *padding-bottom: 3px;\n}\nbutton.btn::-moz-focus-inner,\ninput[type=\"submit\"].btn::-moz-focus-inner {\n  padding: 0;\n  border: 0;\n}\nbutton.btn.btn-large,\ninput[type=\"submit\"].btn.btn-large {\n  *padding-top: 7px;\n  *padding-bottom: 7px;\n}\nbutton.btn.btn-small,\ninput[type=\"submit\"].btn.btn-small {\n  *padding-top: 3px;\n  *padding-bottom: 3px;\n}\nbutton.btn.btn-mini,\ninput[type=\"submit\"].btn.btn-mini {\n  *padding-top: 1px;\n  *padding-bottom: 1px;\n}\n.btn-link,\n.btn-link:active,\n.btn-link[disabled] {\n  background-color: transparent;\n  background-image: none;\n  -webkit-box-shadow: none;\n  -moz-box-shadow: none;\n  box-shadow: none;\n}\n.btn-link {\n  border-color: transparent;\n  cursor: pointer;\n  color: #55a79a;\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n}\n.btn-link:hover {\n  color: #44857b;\n  text-decoration: underline;\n  background-color: transparent;\n}\n.btn-link[disabled]:hover {\n  color: #333333;\n  text-decoration: none;\n}\n.btn-group {\n  position: relative;\n  display: inline-block;\n  *display: inline;\n  /* IE7 inline-block hack */\n\n  *zoom: 1;\n  font-size: 0;\n  vertical-align: middle;\n  white-space: nowrap;\n  *margin-left: .3em;\n}\n.btn-group:first-child {\n  *margin-left: 0;\n}\n.btn-group + .btn-group {\n  margin-left: 5px;\n}\n.btn-toolbar {\n  font-size: 0;\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.btn-toolbar > .btn + .btn,\n.btn-toolbar > .btn-group + .btn,\n.btn-toolbar > .btn + .btn-group {\n  margin-left: 5px;\n}\n.btn-group > .btn {\n  position: relative;\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n}\n.btn-group > .btn + .btn {\n  margin-left: -1px;\n}\n.btn-group > .btn,\n.btn-group > .dropdown-menu,\n.btn-group > .popover {\n  font-size: 14px;\n}\n.btn-group > .btn-mini {\n  font-size: 10.5px;\n}\n.btn-group > .btn-small {\n  font-size: 11.9px;\n}\n.btn-group > .btn-large {\n  font-size: 17.5px;\n}\n.btn-group > .btn:first-child {\n  margin-left: 0;\n  -webkit-border-top-left-radius: 2px;\n  -moz-border-radius-topleft: 2px;\n  border-top-left-radius: 2px;\n  -webkit-border-bottom-left-radius: 2px;\n  -moz-border-radius-bottomleft: 2px;\n  border-bottom-left-radius: 2px;\n}\n.btn-group > .btn:last-child,\n.btn-group > .dropdown-toggle {\n  -webkit-border-top-right-radius: 2px;\n  -moz-border-radius-topright: 2px;\n  border-top-right-radius: 2px;\n  -webkit-border-bottom-right-radius: 2px;\n  -moz-border-radius-bottomright: 2px;\n  border-bottom-right-radius: 2px;\n}\n.btn-group > .btn.large:first-child {\n  margin-left: 0;\n  -webkit-border-top-left-radius: 2px;\n  -moz-border-radius-topleft: 2px;\n  border-top-left-radius: 2px;\n  -webkit-border-bottom-left-radius: 2px;\n  -moz-border-radius-bottomleft: 2px;\n  border-bottom-left-radius: 2px;\n}\n.btn-group > .btn.large:last-child,\n.btn-group > .large.dropdown-toggle {\n  -webkit-border-top-right-radius: 2px;\n  -moz-border-radius-topright: 2px;\n  border-top-right-radius: 2px;\n  -webkit-border-bottom-right-radius: 2px;\n  -moz-border-radius-bottomright: 2px;\n  border-bottom-right-radius: 2px;\n}\n.btn-group > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group > .btn:active,\n.btn-group > .btn.active {\n  z-index: 2;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n  padding-left: 8px;\n  padding-right: 8px;\n  -webkit-box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);\n  -moz-box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);\n  box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);\n  *padding-top: 5px;\n  *padding-bottom: 5px;\n}\n.btn-group > .btn-mini + .dropdown-toggle {\n  padding-left: 5px;\n  padding-right: 5px;\n  *padding-top: 2px;\n  *padding-bottom: 2px;\n}\n.btn-group > .btn-small + .dropdown-toggle {\n  *padding-top: 5px;\n  *padding-bottom: 4px;\n}\n.btn-group > .btn-large + .dropdown-toggle {\n  padding-left: 12px;\n  padding-right: 12px;\n  *padding-top: 7px;\n  *padding-bottom: 7px;\n}\n.btn-group.open .dropdown-toggle {\n  background-image: none;\n  -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);\n  -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);\n  box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);\n}\n.btn-group.open .btn.dropdown-toggle {\n  background-color: #e6e6e6;\n}\n.btn-group.open .btn-primary.dropdown-toggle {\n  background-color: #44857b;\n}\n.btn-group.open .btn-warning.dropdown-toggle {\n  background-color: #f89406;\n}\n.btn-group.open .btn-danger.dropdown-toggle {\n  background-color: #bd362f;\n}\n.btn-group.open .btn-success.dropdown-toggle {\n  background-color: #51a351;\n}\n.btn-group.open .btn-info.dropdown-toggle {\n  background-color: #2f96b4;\n}\n.btn-group.open .btn-inverse.dropdown-toggle {\n  background-color: #000000;\n}\n.btn .caret {\n  margin-top: 8px;\n  margin-left: 0;\n}\n.btn-mini .caret,\n.btn-small .caret,\n.btn-large .caret {\n  margin-top: 6px;\n}\n.btn-large .caret {\n  border-left-width: 5px;\n  border-right-width: 5px;\n  border-top-width: 5px;\n}\n.dropup .btn-large .caret {\n  border-bottom-width: 5px;\n}\n.btn-primary .caret,\n.btn-warning .caret,\n.btn-danger .caret,\n.btn-info .caret,\n.btn-success .caret,\n.btn-inverse .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\n.btn-group-vertical {\n  display: inline-block;\n  *display: inline;\n  /* IE7 inline-block hack */\n\n  *zoom: 1;\n}\n.btn-group-vertical > .btn {\n  display: block;\n  float: none;\n  max-width: 100%;\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n}\n.btn-group-vertical > .btn + .btn {\n  margin-left: 0;\n  margin-top: -1px;\n}\n.btn-group-vertical > .btn:first-child {\n  -webkit-border-radius: 2px 2px 0 0;\n  -moz-border-radius: 2px 2px 0 0;\n  border-radius: 2px 2px 0 0;\n}\n.btn-group-vertical > .btn:last-child {\n  -webkit-border-radius: 0 0 2px 2px;\n  -moz-border-radius: 0 0 2px 2px;\n  border-radius: 0 0 2px 2px;\n}\n.btn-group-vertical > .btn-large:first-child {\n  -webkit-border-radius: 2px 2px 0 0;\n  -moz-border-radius: 2px 2px 0 0;\n  border-radius: 2px 2px 0 0;\n}\n.btn-group-vertical > .btn-large:last-child {\n  -webkit-border-radius: 0 0 2px 2px;\n  -moz-border-radius: 0 0 2px 2px;\n  border-radius: 0 0 2px 2px;\n}\n.alert {\n  padding: 8px 35px 8px 14px;\n  margin-bottom: 20px;\n  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);\n  background-color: #fcf8e3;\n  border: 1px solid #fbeed5;\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n}\n.alert,\n.alert h4 {\n  color: #c09853;\n}\n.alert h4 {\n  margin: 0;\n}\n.alert .close {\n  position: relative;\n  top: -2px;\n  right: -21px;\n  line-height: 20px;\n}\n.alert-success {\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n  color: #468847;\n}\n.alert-success h4 {\n  color: #468847;\n}\n.alert-danger,\n.alert-error {\n  background-color: #f2dede;\n  border-color: #eed3d7;\n  color: #b94a48;\n}\n.alert-danger h4,\n.alert-error h4 {\n  color: #b94a48;\n}\n.alert-info {\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n  color: #3a87ad;\n}\n.alert-info h4 {\n  color: #3a87ad;\n}\n.alert-block {\n  padding-top: 14px;\n  padding-bottom: 14px;\n}\n.alert-block > p,\n.alert-block > ul {\n  margin-bottom: 0;\n}\n.alert-block p + p {\n  margin-top: 5px;\n}\n.nav {\n  margin-left: 0;\n  margin-bottom: 20px;\n  list-style: none;\n}\n.nav > li > a {\n  display: block;\n}\n.nav > li > a:hover {\n  text-decoration: none;\n  background-color: #e6e6e6;\n}\n.nav > li > a > img {\n  max-width: none;\n}\n.nav > .pull-right {\n  float: right;\n}\n.nav-header {\n  display: block;\n  padding: 3px 15px;\n  font-size: 11px;\n  font-weight: bold;\n  line-height: 20px;\n  color: rgba(36, 36, 36, 0.8);\n  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);\n  text-transform: uppercase;\n}\n.nav li + .nav-header {\n  margin-top: 9px;\n}\n.nav-list {\n  padding-left: 15px;\n  padding-right: 15px;\n  margin-bottom: 0;\n}\n.nav-list > li > a,\n.nav-list .nav-header {\n  margin-left: -15px;\n  margin-right: -15px;\n  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);\n}\n.nav-list > li > a {\n  padding: 3px 15px;\n}\n.nav-list > .active > a,\n.nav-list > .active > a:hover {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n  background-color: #55a79a;\n}\n.nav-list [class^=\"icon-\"],\n.nav-list [class*=\" icon-\"] {\n  margin-right: 2px;\n}\n.nav-list .divider {\n  *width: 100%;\n  height: 1px;\n  margin: 9px 1px;\n  *margin: -5px 0 5px;\n  overflow: hidden;\n  background-color: #e5e5e5;\n  border-bottom: 1px solid #ffffff;\n}\n.nav-tabs,\n.nav-pills {\n  *zoom: 1;\n}\n.nav-tabs:before,\n.nav-pills:before,\n.nav-tabs:after,\n.nav-pills:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.nav-tabs:after,\n.nav-pills:after {\n  clear: both;\n}\n.nav-tabs > li,\n.nav-pills > li {\n  float: left;\n}\n.nav-tabs > li > a,\n.nav-pills > li > a {\n  padding-right: 12px;\n  padding-left: 12px;\n  margin-right: 2px;\n  line-height: 14px;\n}\n.nav-tabs {\n  border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n  margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n  padding-top: 8px;\n  padding-bottom: 8px;\n  line-height: 20px;\n  border: 1px solid transparent;\n  -webkit-border-radius: 4px 4px 0 0;\n  -moz-border-radius: 4px 4px 0 0;\n  border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n  border-color: #e6e6e6 #e6e6e6 #dddddd;\n}\n.nav-tabs > .active > a,\n.nav-tabs > .active > a:hover {\n  color: #242424;\n  background-color: #fcfcfc;\n  border: 1px solid #ddd;\n  border-bottom-color: transparent;\n  cursor: default;\n}\n.nav-pills > li > a {\n  padding-top: 8px;\n  padding-bottom: 8px;\n  margin-top: 2px;\n  margin-bottom: 2px;\n  -webkit-border-radius: 5px;\n  -moz-border-radius: 5px;\n  border-radius: 5px;\n}\n.nav-pills > .active > a,\n.nav-pills > .active > a:hover {\n  color: #ffffff;\n  background-color: #55a79a;\n}\n.nav-stacked > li {\n  float: none;\n}\n.nav-stacked > li > a {\n  margin-right: 0;\n}\n.nav-tabs.nav-stacked {\n  border-bottom: 0;\n}\n.nav-tabs.nav-stacked > li > a {\n  border: 1px solid #ddd;\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n}\n.nav-tabs.nav-stacked > li:first-child > a {\n  -webkit-border-top-right-radius: 4px;\n  -moz-border-radius-topright: 4px;\n  border-top-right-radius: 4px;\n  -webkit-border-top-left-radius: 4px;\n  -moz-border-radius-topleft: 4px;\n  border-top-left-radius: 4px;\n}\n.nav-tabs.nav-stacked > li:last-child > a {\n  -webkit-border-bottom-right-radius: 4px;\n  -moz-border-radius-bottomright: 4px;\n  border-bottom-right-radius: 4px;\n  -webkit-border-bottom-left-radius: 4px;\n  -moz-border-radius-bottomleft: 4px;\n  border-bottom-left-radius: 4px;\n}\n.nav-tabs.nav-stacked > li > a:hover {\n  border-color: #ddd;\n  z-index: 2;\n}\n.nav-pills.nav-stacked > li > a {\n  margin-bottom: 3px;\n}\n.nav-pills.nav-stacked > li:last-child > a {\n  margin-bottom: 1px;\n}\n.nav-tabs .dropdown-menu {\n  -webkit-border-radius: 0 0 6px 6px;\n  -moz-border-radius: 0 0 6px 6px;\n  border-radius: 0 0 6px 6px;\n}\n.nav-pills .dropdown-menu {\n  -webkit-border-radius: 6px;\n  -moz-border-radius: 6px;\n  border-radius: 6px;\n}\n.nav .dropdown-toggle .caret {\n  border-top-color: #55a79a;\n  border-bottom-color: #55a79a;\n  margin-top: 6px;\n}\n.nav .dropdown-toggle:hover .caret {\n  border-top-color: #44857b;\n  border-bottom-color: #44857b;\n}\n/* move down carets for tabs */\n.nav-tabs .dropdown-toggle .caret {\n  margin-top: 8px;\n}\n.nav .active .dropdown-toggle .caret {\n  border-top-color: #fff;\n  border-bottom-color: #fff;\n}\n.nav-tabs .active .dropdown-toggle .caret {\n  border-top-color: #242424;\n  border-bottom-color: #242424;\n}\n.nav > .dropdown.active > a:hover {\n  cursor: pointer;\n}\n.nav-tabs .open .dropdown-toggle,\n.nav-pills .open .dropdown-toggle,\n.nav > li.dropdown.open.active > a:hover {\n  color: #ffffff;\n  background-color: rgba(36, 36, 36, 0.8);\n  border-color: rgba(36, 36, 36, 0.8);\n}\n.nav li.dropdown.open .caret,\n.nav li.dropdown.open.active .caret,\n.nav li.dropdown.open a:hover .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n  opacity: 1;\n  filter: alpha(opacity=100);\n}\n.tabs-stacked .open > a:hover {\n  border-color: rgba(36, 36, 36, 0.8);\n}\n.tabbable {\n  *zoom: 1;\n}\n.tabbable:before,\n.tabbable:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.tabbable:after {\n  clear: both;\n}\n.tab-content {\n  overflow: auto;\n}\n.tabs-below > .nav-tabs,\n.tabs-right > .nav-tabs,\n.tabs-left > .nav-tabs {\n  border-bottom: 0;\n}\n.tab-content > .tab-pane,\n.pill-content > .pill-pane {\n  display: none;\n}\n.tab-content > .active,\n.pill-content > .active {\n  display: block;\n}\n.tabs-below > .nav-tabs {\n  border-top: 1px solid #ddd;\n}\n.tabs-below > .nav-tabs > li {\n  margin-top: -1px;\n  margin-bottom: 0;\n}\n.tabs-below > .nav-tabs > li > a {\n  -webkit-border-radius: 0 0 4px 4px;\n  -moz-border-radius: 0 0 4px 4px;\n  border-radius: 0 0 4px 4px;\n}\n.tabs-below > .nav-tabs > li > a:hover {\n  border-bottom-color: transparent;\n  border-top-color: #ddd;\n}\n.tabs-below > .nav-tabs > .active > a,\n.tabs-below > .nav-tabs > .active > a:hover {\n  border-color: transparent #ddd #ddd #ddd;\n}\n.tabs-left > .nav-tabs > li,\n.tabs-right > .nav-tabs > li {\n  float: none;\n}\n.tabs-left > .nav-tabs > li > a,\n.tabs-right > .nav-tabs > li > a {\n  min-width: 74px;\n  margin-right: 0;\n  margin-bottom: 3px;\n}\n.tabs-left > .nav-tabs {\n  float: left;\n  margin-right: 19px;\n  border-right: 1px solid #ddd;\n}\n.tabs-left > .nav-tabs > li > a {\n  margin-right: -1px;\n  -webkit-border-radius: 4px 0 0 4px;\n  -moz-border-radius: 4px 0 0 4px;\n  border-radius: 4px 0 0 4px;\n}\n.tabs-left > .nav-tabs > li > a:hover {\n  border-color: #e6e6e6 #dddddd #e6e6e6 #e6e6e6;\n}\n.tabs-left > .nav-tabs .active > a,\n.tabs-left > .nav-tabs .active > a:hover {\n  border-color: #ddd transparent #ddd #ddd;\n  *border-right-color: #ffffff;\n}\n.tabs-right > .nav-tabs {\n  float: right;\n  margin-left: 19px;\n  border-left: 1px solid #ddd;\n}\n.tabs-right > .nav-tabs > li > a {\n  margin-left: -1px;\n  -webkit-border-radius: 0 4px 4px 0;\n  -moz-border-radius: 0 4px 4px 0;\n  border-radius: 0 4px 4px 0;\n}\n.tabs-right > .nav-tabs > li > a:hover {\n  border-color: #e6e6e6 #e6e6e6 #e6e6e6 #dddddd;\n}\n.tabs-right > .nav-tabs .active > a,\n.tabs-right > .nav-tabs .active > a:hover {\n  border-color: #ddd #ddd #ddd transparent;\n  *border-left-color: #ffffff;\n}\n.nav > .disabled > a {\n  color: rgba(36, 36, 36, 0.8);\n}\n.nav > .disabled > a:hover {\n  text-decoration: none;\n  background-color: transparent;\n  cursor: default;\n}\n.navbar {\n  overflow: visible;\n  margin-bottom: 20px;\n  *position: relative;\n  *z-index: 2;\n}\n.navbar-inner {\n  min-height: 30px;\n  padding-left: 20px;\n  padding-right: 20px;\n  background-color: rgba(36, 36, 36, 0.88);\n  background-image: -moz-linear-gradient(top, rgba(36, 36, 36, 0.8), #242424);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(rgba(36, 36, 36, 0.8)), to(#242424));\n  background-image: -webkit-linear-gradient(top, rgba(36, 36, 36, 0.8), #242424);\n  background-image: -o-linear-gradient(top, rgba(36, 36, 36, 0.8), #242424);\n  background-image: linear-gradient(to bottom, rgba(36, 36, 36, 0.8), #242424);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#cc242424', endColorstr='#ff242424', GradientType=0);\n  border: 1px solid #000000;\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n  -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);\n  -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);\n  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);\n  *zoom: 1;\n}\n.navbar-inner:before,\n.navbar-inner:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.navbar-inner:after {\n  clear: both;\n}\n.navbar .container {\n  width: auto;\n}\n.nav-collapse.collapse {\n  height: auto;\n  overflow: visible;\n}\n.navbar .brand {\n  float: left;\n  display: block;\n  padding: 5px 20px 5px;\n  margin-left: -20px;\n  font-size: 20px;\n  font-weight: 200;\n  color: rgba(255, 255, 255, 0.8);\n  text-shadow: 0 1px 0 rgba(36, 36, 36, 0.8);\n}\n.navbar .brand:hover {\n  text-decoration: none;\n}\n.navbar-text {\n  margin-bottom: 0;\n  line-height: 30px;\n  color: rgba(255, 255, 255, 0.7);\n}\n.navbar-link {\n  color: rgba(255, 255, 255, 0.7);\n}\n.navbar-link:hover {\n  color: #242424;\n}\n.navbar .divider-vertical {\n  height: 30px;\n  margin: 0 9px;\n  border-left: 1px solid #242424;\n  border-right: 1px solid rgba(36, 36, 36, 0.8);\n}\n.navbar .btn,\n.navbar .btn-group {\n  margin-top: 0px;\n}\n.navbar .btn-group .btn,\n.navbar .input-prepend .btn,\n.navbar .input-append .btn {\n  margin-top: 0;\n}\n.navbar-form {\n  margin-bottom: 0;\n  *zoom: 1;\n}\n.navbar-form:before,\n.navbar-form:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.navbar-form:after {\n  clear: both;\n}\n.navbar-form input,\n.navbar-form select,\n.navbar-form .radio,\n.navbar-form .checkbox {\n  margin-top: 0px;\n}\n.navbar-form input,\n.navbar-form select,\n.navbar-form .btn {\n  display: inline-block;\n  margin-bottom: 0;\n}\n.navbar-form input[type=\"image\"],\n.navbar-form input[type=\"checkbox\"],\n.navbar-form input[type=\"radio\"] {\n  margin-top: 3px;\n}\n.navbar-form .input-append,\n.navbar-form .input-prepend {\n  margin-top: 5px;\n  white-space: nowrap;\n}\n.navbar-form .input-append input,\n.navbar-form .input-prepend input {\n  margin-top: 0;\n}\n.navbar-search {\n  position: relative;\n  float: left;\n  margin-top: 0px;\n  margin-bottom: 0;\n}\n.navbar-search .search-query {\n  margin-bottom: 0;\n  padding: 4px 14px;\n  font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n  font-size: 13px;\n  font-weight: normal;\n  line-height: 1;\n  -webkit-border-radius: 15px;\n  -moz-border-radius: 15px;\n  border-radius: 15px;\n}\n.navbar-static-top {\n  position: static;\n  margin-bottom: 0;\n}\n.navbar-static-top .navbar-inner {\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: 1030;\n  margin-bottom: 0;\n}\n.navbar-fixed-top .navbar-inner,\n.navbar-static-top .navbar-inner {\n  border-width: 0 0 1px;\n}\n.navbar-fixed-bottom .navbar-inner {\n  border-width: 1px 0 0;\n}\n.navbar-fixed-top .navbar-inner,\n.navbar-fixed-bottom .navbar-inner {\n  padding-left: 0;\n  padding-right: 0;\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n}\n.navbar-static-top .container,\n.navbar-fixed-top .container,\n.navbar-fixed-bottom .container {\n  width: 940px;\n}\n.navbar-fixed-top {\n  top: 0;\n}\n.navbar-fixed-top .navbar-inner,\n.navbar-static-top .navbar-inner {\n  -webkit-box-shadow: 0 1px 10px rgba(0,0,0,.1);\n  -moz-box-shadow: 0 1px 10px rgba(0,0,0,.1);\n  box-shadow: 0 1px 10px rgba(0,0,0,.1);\n}\n.navbar-fixed-bottom {\n  bottom: 0;\n}\n.navbar-fixed-bottom .navbar-inner {\n  -webkit-box-shadow: 0 -1px 10px rgba(0,0,0,.1);\n  -moz-box-shadow: 0 -1px 10px rgba(0,0,0,.1);\n  box-shadow: 0 -1px 10px rgba(0,0,0,.1);\n}\n.navbar .nav {\n  position: relative;\n  left: 0;\n  display: block;\n  float: left;\n  margin: 0 10px 0 0;\n}\n.navbar .nav.pull-right {\n  float: right;\n  margin-right: 0;\n}\n.navbar .nav > li {\n  float: left;\n}\n.navbar .nav > li > a {\n  float: none;\n  padding: 5px 15px 5px;\n  color: rgba(255, 255, 255, 0.7);\n  text-decoration: none;\n  text-shadow: 0 1px 0 rgba(36, 36, 36, 0.8);\n}\n.navbar .nav .dropdown-toggle .caret {\n  margin-top: 8px;\n}\n.navbar .nav > li > a:focus,\n.navbar .nav > li > a:hover {\n  background-color: transparent;\n  color: #242424;\n  text-decoration: none;\n}\n.navbar .nav > .active > a,\n.navbar .nav > .active > a:hover,\n.navbar .nav > .active > a:focus {\n  color: #242424;\n  text-decoration: none;\n  background-color: transparent;\n  -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);\n  -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);\n  box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);\n}\n.navbar .btn-navbar {\n  display: none;\n  float: right;\n  padding: 7px 10px;\n  margin-left: 5px;\n  margin-right: 5px;\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: rgba(23, 23, 23, 0.88);\n  background-image: -moz-linear-gradient(top, rgba(23, 23, 23, 0.8), #171717);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(rgba(23, 23, 23, 0.8)), to(#171717));\n  background-image: -webkit-linear-gradient(top, rgba(23, 23, 23, 0.8), #171717);\n  background-image: -o-linear-gradient(top, rgba(23, 23, 23, 0.8), #171717);\n  background-image: linear-gradient(to bottom, rgba(23, 23, 23, 0.8), #171717);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#cc171717', endColorstr='#ff171717', GradientType=0);\n  border-color: #171717 #171717 #000000;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #171717;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);\n  -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);\n  box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);\n}\n.navbar .btn-navbar:hover,\n.navbar .btn-navbar:active,\n.navbar .btn-navbar.active,\n.navbar .btn-navbar.disabled,\n.navbar .btn-navbar[disabled] {\n  color: #ffffff;\n  background-color: #171717;\n  *background-color: #0a0a0a;\n}\n.navbar .btn-navbar:active,\n.navbar .btn-navbar.active {\n  background-color: #000000 \\9;\n}\n.navbar .btn-navbar .icon-bar {\n  display: block;\n  width: 18px;\n  height: 2px;\n  background-color: #f5f5f5;\n  -webkit-border-radius: 1px;\n  -moz-border-radius: 1px;\n  border-radius: 1px;\n  -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);\n  -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);\n  box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);\n}\n.btn-navbar .icon-bar + .icon-bar {\n  margin-top: 3px;\n}\n.navbar .nav > li > .dropdown-menu:before {\n  content: '';\n  display: inline-block;\n  border-left: 7px solid transparent;\n  border-right: 7px solid transparent;\n  border-bottom: 7px solid #ccc;\n  border-bottom-color: rgba(0, 0, 0, 0.2);\n  position: absolute;\n  top: -7px;\n  left: 9px;\n}\n.navbar .nav > li > .dropdown-menu:after {\n  content: '';\n  display: inline-block;\n  border-left: 6px solid transparent;\n  border-right: 6px solid transparent;\n  border-bottom: 6px solid #ffffff;\n  position: absolute;\n  top: -6px;\n  left: 10px;\n}\n.navbar-fixed-bottom .nav > li > .dropdown-menu:before {\n  border-top: 7px solid #ccc;\n  border-top-color: rgba(0, 0, 0, 0.2);\n  border-bottom: 0;\n  bottom: -7px;\n  top: auto;\n}\n.navbar-fixed-bottom .nav > li > .dropdown-menu:after {\n  border-top: 6px solid #ffffff;\n  border-bottom: 0;\n  bottom: -6px;\n  top: auto;\n}\n.navbar .nav li.dropdown > a:hover .caret {\n  border-top-color: #242424;\n  border-bottom-color: #242424;\n}\n.navbar .nav li.dropdown.open > .dropdown-toggle,\n.navbar .nav li.dropdown.active > .dropdown-toggle,\n.navbar .nav li.dropdown.open.active > .dropdown-toggle {\n  background-color: transparent;\n  color: #242424;\n}\n.navbar .nav li.dropdown > .dropdown-toggle .caret {\n  border-top-color: rgba(255, 255, 255, 0.7);\n  border-bottom-color: rgba(255, 255, 255, 0.7);\n}\n.navbar .nav li.dropdown.open > .dropdown-toggle .caret,\n.navbar .nav li.dropdown.active > .dropdown-toggle .caret,\n.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {\n  border-top-color: #242424;\n  border-bottom-color: #242424;\n}\n.navbar .pull-right > li > .dropdown-menu,\n.navbar .nav > li > .dropdown-menu.pull-right {\n  left: auto;\n  right: 0;\n}\n.navbar .pull-right > li > .dropdown-menu:before,\n.navbar .nav > li > .dropdown-menu.pull-right:before {\n  left: auto;\n  right: 12px;\n}\n.navbar .pull-right > li > .dropdown-menu:after,\n.navbar .nav > li > .dropdown-menu.pull-right:after {\n  left: auto;\n  right: 13px;\n}\n.navbar .pull-right > li > .dropdown-menu .dropdown-menu,\n.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu {\n  left: auto;\n  right: 100%;\n  margin-left: 0;\n  margin-right: -1px;\n  -webkit-border-radius: 6px 0 6px 6px;\n  -moz-border-radius: 6px 0 6px 6px;\n  border-radius: 6px 0 6px 6px;\n}\n.navbar-inverse .navbar-inner {\n  background-color: rgba(161, 207, 199, 0.9400000000000001);\n  background-image: -moz-linear-gradient(top, rgba(85, 167, 154, 0.9), #ffffff);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(rgba(85, 167, 154, 0.9)), to(#ffffff));\n  background-image: -webkit-linear-gradient(top, rgba(85, 167, 154, 0.9), #ffffff);\n  background-image: -o-linear-gradient(top, rgba(85, 167, 154, 0.9), #ffffff);\n  background-image: linear-gradient(to bottom, rgba(85, 167, 154, 0.9), #ffffff);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e655a79a', endColorstr='#ffffffff', GradientType=0);\n  border-color: #44857b;\n}\n.navbar-inverse .brand,\n.navbar-inverse .nav > li > a {\n  color: #55a79a;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.navbar-inverse .brand:hover,\n.navbar-inverse .nav > li > a:hover {\n  color: #ffffff;\n}\n.navbar-inverse .brand {\n  color: #55a79a;\n}\n.navbar-inverse .navbar-text {\n  color: #55a79a;\n}\n.navbar-inverse .nav > li > a:focus,\n.navbar-inverse .nav > li > a:hover {\n  background-color: #55a79a;\n  color: #ffffff;\n}\n.navbar-inverse .nav .active > a,\n.navbar-inverse .nav .active > a:hover,\n.navbar-inverse .nav .active > a:focus {\n  color: #ffffff;\n  background-color: #55a79a;\n}\n.navbar-inverse .navbar-link {\n  color: #55a79a;\n}\n.navbar-inverse .navbar-link:hover {\n  color: #ffffff;\n}\n.navbar-inverse .divider-vertical {\n  border-left-color: #ffffff;\n  border-right-color: rgba(85, 167, 154, 0.9);\n}\n.navbar-inverse .nav li.dropdown.open > .dropdown-toggle,\n.navbar-inverse .nav li.dropdown.active > .dropdown-toggle,\n.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle {\n  background-color: #55a79a;\n  color: #ffffff;\n}\n.navbar-inverse .nav li.dropdown > a:hover .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\n.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret {\n  border-top-color: #55a79a;\n  border-bottom-color: #55a79a;\n}\n.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret,\n.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret,\n.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\n.navbar-inverse .navbar-search .search-query {\n  color: #ffffff;\n  background-color: #ffffff;\n  border-color: #ffffff;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);\n  -moz-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);\n  box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);\n  -webkit-transition: none;\n  -moz-transition: none;\n  -o-transition: none;\n  transition: none;\n}\n.navbar-inverse .navbar-search .search-query:-moz-placeholder {\n  color: #55a79a;\n}\n.navbar-inverse .navbar-search .search-query:-ms-input-placeholder {\n  color: #55a79a;\n}\n.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder {\n  color: #55a79a;\n}\n.navbar-inverse .navbar-search .search-query:focus,\n.navbar-inverse .navbar-search .search-query.focused {\n  padding: 5px 15px;\n  color: #333333;\n  text-shadow: 0 1px 0 #ffffff;\n  background-color: #ffffff;\n  border: 0;\n  -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);\n  -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);\n  box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);\n  outline: 0;\n}\n.navbar-inverse .btn-navbar {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: rgba(151, 191, 185, 0.9400000000000001);\n  background-image: -moz-linear-gradient(top, rgba(76, 150, 138, 0.9), #f2f2f2);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(rgba(76, 150, 138, 0.9)), to(#f2f2f2));\n  background-image: -webkit-linear-gradient(top, rgba(76, 150, 138, 0.9), #f2f2f2);\n  background-image: -o-linear-gradient(top, rgba(76, 150, 138, 0.9), #f2f2f2);\n  background-image: linear-gradient(to bottom, rgba(76, 150, 138, 0.9), #f2f2f2);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e64c968a', endColorstr='#fff2f2f2', GradientType=0);\n  border-color: #f2f2f2 #f2f2f2 #cccccc;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #f2f2f2;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.navbar-inverse .btn-navbar:hover,\n.navbar-inverse .btn-navbar:active,\n.navbar-inverse .btn-navbar.active,\n.navbar-inverse .btn-navbar.disabled,\n.navbar-inverse .btn-navbar[disabled] {\n  color: #ffffff;\n  background-color: #f2f2f2;\n  *background-color: #e5e5e5;\n}\n.navbar-inverse .btn-navbar:active,\n.navbar-inverse .btn-navbar.active {\n  background-color: #d9d9d9 \\9;\n}\n.breadcrumb {\n  padding: 8px 15px;\n  margin: 0 0 20px;\n  list-style: none;\n  background-color: #f5f5f5;\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n}\n.breadcrumb > li {\n  display: inline-block;\n  *display: inline;\n  /* IE7 inline-block hack */\n\n  *zoom: 1;\n  text-shadow: 0 1px 0 #ffffff;\n}\n.breadcrumb > li > .divider {\n  padding: 0 5px;\n  color: #ccc;\n}\n.breadcrumb > .active {\n  color: rgba(36, 36, 36, 0.8);\n}\n.pagination {\n  margin: 20px 0;\n}\n.pagination ul {\n  display: inline-block;\n  *display: inline;\n  /* IE7 inline-block hack */\n\n  *zoom: 1;\n  margin-left: 0;\n  margin-bottom: 0;\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n  -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.pagination ul > li {\n  display: inline;\n}\n.pagination ul > li > a,\n.pagination ul > li > span {\n  float: left;\n  padding: 4px 12px;\n  line-height: 20px;\n  text-decoration: none;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-left-width: 0;\n}\n.pagination ul > li > a:hover,\n.pagination ul > .active > a,\n.pagination ul > .active > span {\n  background-color: #f5f5f5;\n}\n.pagination ul > .active > a,\n.pagination ul > .active > span {\n  color: rgba(36, 36, 36, 0.8);\n  cursor: default;\n}\n.pagination ul > .disabled > span,\n.pagination ul > .disabled > a,\n.pagination ul > .disabled > a:hover {\n  color: rgba(36, 36, 36, 0.8);\n  background-color: transparent;\n  cursor: default;\n}\n.pagination ul > li:first-child > a,\n.pagination ul > li:first-child > span {\n  border-left-width: 1px;\n  -webkit-border-top-left-radius: 2px;\n  -moz-border-radius-topleft: 2px;\n  border-top-left-radius: 2px;\n  -webkit-border-bottom-left-radius: 2px;\n  -moz-border-radius-bottomleft: 2px;\n  border-bottom-left-radius: 2px;\n}\n.pagination ul > li:last-child > a,\n.pagination ul > li:last-child > span {\n  -webkit-border-top-right-radius: 2px;\n  -moz-border-radius-topright: 2px;\n  border-top-right-radius: 2px;\n  -webkit-border-bottom-right-radius: 2px;\n  -moz-border-radius-bottomright: 2px;\n  border-bottom-right-radius: 2px;\n}\n.pagination-centered {\n  text-align: center;\n}\n.pagination-right {\n  text-align: right;\n}\n.pagination-large ul > li > a,\n.pagination-large ul > li > span {\n  padding: 11px 19px;\n  font-size: 17.5px;\n}\n.pagination-large ul > li:first-child > a,\n.pagination-large ul > li:first-child > span {\n  -webkit-border-top-left-radius: 2px;\n  -moz-border-radius-topleft: 2px;\n  border-top-left-radius: 2px;\n  -webkit-border-bottom-left-radius: 2px;\n  -moz-border-radius-bottomleft: 2px;\n  border-bottom-left-radius: 2px;\n}\n.pagination-large ul > li:last-child > a,\n.pagination-large ul > li:last-child > span {\n  -webkit-border-top-right-radius: 2px;\n  -moz-border-radius-topright: 2px;\n  border-top-right-radius: 2px;\n  -webkit-border-bottom-right-radius: 2px;\n  -moz-border-radius-bottomright: 2px;\n  border-bottom-right-radius: 2px;\n}\n.pagination-mini ul > li:first-child > a,\n.pagination-small ul > li:first-child > a,\n.pagination-mini ul > li:first-child > span,\n.pagination-small ul > li:first-child > span {\n  -webkit-border-top-left-radius: 2px;\n  -moz-border-radius-topleft: 2px;\n  border-top-left-radius: 2px;\n  -webkit-border-bottom-left-radius: 2px;\n  -moz-border-radius-bottomleft: 2px;\n  border-bottom-left-radius: 2px;\n}\n.pagination-mini ul > li:last-child > a,\n.pagination-small ul > li:last-child > a,\n.pagination-mini ul > li:last-child > span,\n.pagination-small ul > li:last-child > span {\n  -webkit-border-top-right-radius: 2px;\n  -moz-border-radius-topright: 2px;\n  border-top-right-radius: 2px;\n  -webkit-border-bottom-right-radius: 2px;\n  -moz-border-radius-bottomright: 2px;\n  border-bottom-right-radius: 2px;\n}\n.pagination-small ul > li > a,\n.pagination-small ul > li > span {\n  padding: 2px 10px;\n  font-size: 11.9px;\n}\n.pagination-mini ul > li > a,\n.pagination-mini ul > li > span {\n  padding: 1px 6px;\n  font-size: 10.5px;\n}\n.pager {\n  margin: 20px 0;\n  list-style: none;\n  text-align: center;\n  *zoom: 1;\n}\n.pager:before,\n.pager:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.pager:after {\n  clear: both;\n}\n.pager li {\n  display: inline;\n}\n.pager li > a,\n.pager li > span {\n  display: inline-block;\n  padding: 5px 14px;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  -webkit-border-radius: 15px;\n  -moz-border-radius: 15px;\n  border-radius: 15px;\n}\n.pager li > a:hover {\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\n.pager .next > a,\n.pager .next > span {\n  float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n  float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > span {\n  color: rgba(36, 36, 36, 0.8);\n  background-color: #fff;\n  cursor: default;\n}\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  background-color: #000000;\n}\n.modal-backdrop.fade {\n  opacity: 0;\n}\n.modal-backdrop,\n.modal-backdrop.fade.in {\n  opacity: 0.8;\n  filter: alpha(opacity=80);\n}\n.modal {\n  position: fixed;\n  top: 10%;\n  left: 50%;\n  z-index: 1050;\n  width: 560px;\n  margin-left: -280px;\n  background-color: #ffffff;\n  border: 1px solid #999;\n  border: 1px solid rgba(0, 0, 0, 0.3);\n  *border: 1px solid #999;\n  /* IE6-7 */\n\n  -webkit-border-radius: 6px;\n  -moz-border-radius: 6px;\n  border-radius: 6px;\n  -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);\n  -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);\n  box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);\n  -webkit-background-clip: padding-box;\n  -moz-background-clip: padding-box;\n  background-clip: padding-box;\n  outline: none;\n}\n.modal.fade {\n  -webkit-transition: opacity .3s linear, top .3s ease-out;\n  -moz-transition: opacity .3s linear, top .3s ease-out;\n  -o-transition: opacity .3s linear, top .3s ease-out;\n  transition: opacity .3s linear, top .3s ease-out;\n  top: -25%;\n}\n.modal.fade.in {\n  top: 10%;\n}\n.modal-header {\n  padding: 9px 15px;\n  border-bottom: 1px solid #eee;\n}\n.modal-header .close {\n  margin-top: 2px;\n}\n.modal-header h3 {\n  margin: 0;\n  line-height: 30px;\n}\n.modal-body {\n  position: relative;\n  overflow-y: auto;\n  max-height: 400px;\n  padding: 15px;\n}\n.modal-form {\n  margin-bottom: 0;\n}\n.modal-footer {\n  padding: 14px 15px 15px;\n  margin-bottom: 0;\n  text-align: right;\n  background-color: #f5f5f5;\n  border-top: 1px solid #ddd;\n  -webkit-border-radius: 0 0 6px 6px;\n  -moz-border-radius: 0 0 6px 6px;\n  border-radius: 0 0 6px 6px;\n  -webkit-box-shadow: inset 0 1px 0 #ffffff;\n  -moz-box-shadow: inset 0 1px 0 #ffffff;\n  box-shadow: inset 0 1px 0 #ffffff;\n  *zoom: 1;\n}\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.modal-footer:after {\n  clear: both;\n}\n.modal-footer .btn + .btn {\n  margin-left: 5px;\n  margin-bottom: 0;\n}\n.modal-footer .btn-group .btn + .btn {\n  margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n  margin-left: 0;\n}\n.tooltip {\n  position: absolute;\n  z-index: 1030;\n  display: block;\n  visibility: visible;\n  padding: 5px;\n  font-size: 11px;\n  opacity: 0;\n  filter: alpha(opacity=0);\n}\n.tooltip.in {\n  opacity: 0.8;\n  filter: alpha(opacity=80);\n}\n.tooltip.top {\n  margin-top: -3px;\n}\n.tooltip.right {\n  margin-left: 3px;\n}\n.tooltip.bottom {\n  margin-top: 3px;\n}\n.tooltip.left {\n  margin-left: -3px;\n}\n.tooltip-inner {\n  max-width: 200px;\n  padding: 3px 8px;\n  color: #ffffff;\n  text-align: center;\n  text-decoration: none;\n  background-color: #000000;\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n}\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n  bottom: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000000;\n}\n.tooltip.right .tooltip-arrow {\n  top: 50%;\n  left: 0;\n  margin-top: -5px;\n  border-width: 5px 5px 5px 0;\n  border-right-color: #000000;\n}\n.tooltip.left .tooltip-arrow {\n  top: 50%;\n  right: 0;\n  margin-top: -5px;\n  border-width: 5px 0 5px 5px;\n  border-left-color: #000000;\n}\n.tooltip.bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000000;\n}\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1010;\n  display: none;\n  width: 236px;\n  padding: 1px;\n  text-align: left;\n  background-color: #ffffff;\n  -webkit-background-clip: padding-box;\n  -moz-background-clip: padding;\n  background-clip: padding-box;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  -webkit-border-radius: 6px;\n  -moz-border-radius: 6px;\n  border-radius: 6px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  white-space: normal;\n}\n.popover.top {\n  margin-top: -10px;\n}\n.popover.right {\n  margin-left: 10px;\n}\n.popover.bottom {\n  margin-top: 10px;\n}\n.popover.left {\n  margin-left: -10px;\n}\n.popover-title {\n  margin: 0;\n  padding: 8px 14px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 18px;\n  background-color: #f7f7f7;\n  border-bottom: 1px solid #ebebeb;\n  -webkit-border-radius: 5px 5px 0 0;\n  -moz-border-radius: 5px 5px 0 0;\n  border-radius: 5px 5px 0 0;\n}\n.popover-content {\n  padding: 9px 14px;\n}\n.popover .arrow,\n.popover .arrow:after {\n  position: absolute;\n  display: block;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.popover .arrow {\n  border-width: 11px;\n}\n.popover .arrow:after {\n  border-width: 10px;\n  content: \"\";\n}\n.popover.top .arrow {\n  left: 50%;\n  margin-left: -11px;\n  border-bottom-width: 0;\n  border-top-color: #999;\n  border-top-color: rgba(0, 0, 0, 0.25);\n  bottom: -11px;\n}\n.popover.top .arrow:after {\n  bottom: 1px;\n  margin-left: -10px;\n  border-bottom-width: 0;\n  border-top-color: #ffffff;\n}\n.popover.right .arrow {\n  top: 50%;\n  left: -11px;\n  margin-top: -11px;\n  border-left-width: 0;\n  border-right-color: #999;\n  border-right-color: rgba(0, 0, 0, 0.25);\n}\n.popover.right .arrow:after {\n  left: 1px;\n  bottom: -10px;\n  border-left-width: 0;\n  border-right-color: #ffffff;\n}\n.popover.bottom .arrow {\n  left: 50%;\n  margin-left: -11px;\n  border-top-width: 0;\n  border-bottom-color: #999;\n  border-bottom-color: rgba(0, 0, 0, 0.25);\n  top: -11px;\n}\n.popover.bottom .arrow:after {\n  top: 1px;\n  margin-left: -10px;\n  border-top-width: 0;\n  border-bottom-color: #ffffff;\n}\n.popover.left .arrow {\n  top: 50%;\n  right: -11px;\n  margin-top: -11px;\n  border-right-width: 0;\n  border-left-color: #999;\n  border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left .arrow:after {\n  right: 1px;\n  border-right-width: 0;\n  border-left-color: #ffffff;\n  bottom: -10px;\n}\n.thumbnails {\n  margin-left: -20px;\n  list-style: none;\n  *zoom: 1;\n}\n.thumbnails:before,\n.thumbnails:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.thumbnails:after {\n  clear: both;\n}\n.row-fluid .thumbnails {\n  margin-left: 0;\n}\n.thumbnails > li {\n  float: left;\n  margin-bottom: 20px;\n  margin-left: 20px;\n}\n.thumbnail {\n  display: block;\n  padding: 4px;\n  line-height: 20px;\n  border: 1px solid #ddd;\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);\n  -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);\n  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);\n  -webkit-transition: all 0.2s ease-in-out;\n  -moz-transition: all 0.2s ease-in-out;\n  -o-transition: all 0.2s ease-in-out;\n  transition: all 0.2s ease-in-out;\n}\na.thumbnail:hover {\n  border-color: #55a79a;\n  -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);\n  -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);\n  box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);\n}\n.thumbnail > img {\n  display: block;\n  max-width: 100%;\n  margin-left: auto;\n  margin-right: auto;\n}\n.thumbnail .caption {\n  padding: 9px;\n  color: #242424;\n}\n.media,\n.media-body {\n  overflow: hidden;\n  *overflow: visible;\n  zoom: 1;\n}\n.media,\n.media .media {\n  margin-top: 15px;\n}\n.media:first-child {\n  margin-top: 0;\n}\n.media-object {\n  display: block;\n}\n.media-heading {\n  margin: 0 0 5px;\n}\n.media .pull-left {\n  margin-right: 10px;\n}\n.media .pull-right {\n  margin-left: 10px;\n}\n.media-list {\n  margin-left: 0;\n  list-style: none;\n}\n.label,\n.badge {\n  display: inline-block;\n  padding: 2px 4px;\n  font-size: 11.844px;\n  font-weight: bold;\n  line-height: 14px;\n  color: #ffffff;\n  vertical-align: baseline;\n  white-space: nowrap;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: rgba(36, 36, 36, 0.8);\n}\n.label {\n  -webkit-border-radius: 3px;\n  -moz-border-radius: 3px;\n  border-radius: 3px;\n}\n.badge {\n  padding-left: 9px;\n  padding-right: 9px;\n  -webkit-border-radius: 9px;\n  -moz-border-radius: 9px;\n  border-radius: 9px;\n}\n.label:empty,\n.badge:empty {\n  display: none;\n}\na.label:hover,\na.badge:hover {\n  color: #ffffff;\n  text-decoration: none;\n  cursor: pointer;\n}\n.label-important,\n.badge-important {\n  background-color: #b94a48;\n}\n.label-important[href],\n.badge-important[href] {\n  background-color: #953b39;\n}\n.label-warning,\n.badge-warning {\n  background-color: #f89406;\n}\n.label-warning[href],\n.badge-warning[href] {\n  background-color: #c67605;\n}\n.label-success,\n.badge-success {\n  background-color: #468847;\n}\n.label-success[href],\n.badge-success[href] {\n  background-color: #356635;\n}\n.label-info,\n.badge-info {\n  background-color: #3a87ad;\n}\n.label-info[href],\n.badge-info[href] {\n  background-color: #2d6987;\n}\n.label-inverse,\n.badge-inverse {\n  background-color: #333333;\n}\n.label-inverse[href],\n.badge-inverse[href] {\n  background-color: #1a1a1a;\n}\n.btn .label,\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n.btn-mini .label,\n.btn-mini .badge {\n  top: 0;\n}\n@-webkit-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n@-moz-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n@-ms-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n@-o-keyframes progress-bar-stripes {\n  from {\n    background-position: 0 0;\n  }\n  to {\n    background-position: 40px 0;\n  }\n}\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n.progress {\n  overflow: hidden;\n  height: 20px;\n  margin-bottom: 20px;\n  background-color: #f7f7f7;\n  background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));\n  background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9);\n  background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9);\n  background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n  -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n}\n.progress .bar {\n  width: 0%;\n  height: 100%;\n  color: #ffffff;\n  float: left;\n  font-size: 12px;\n  text-align: center;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #0e90d2;\n  background-image: -moz-linear-gradient(top, #149bdf, #0480be);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));\n  background-image: -webkit-linear-gradient(top, #149bdf, #0480be);\n  background-image: -o-linear-gradient(top, #149bdf, #0480be);\n  background-image: linear-gradient(to bottom, #149bdf, #0480be);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  -webkit-transition: width 0.6s ease;\n  -moz-transition: width 0.6s ease;\n  -o-transition: width 0.6s ease;\n  transition: width 0.6s ease;\n}\n.progress .bar + .bar {\n  -webkit-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);\n  -moz-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);\n  box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);\n}\n.progress-striped .bar {\n  background-color: #149bdf;\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  -webkit-background-size: 40px 40px;\n  -moz-background-size: 40px 40px;\n  -o-background-size: 40px 40px;\n  background-size: 40px 40px;\n}\n.progress.active .bar {\n  -webkit-animation: progress-bar-stripes 2s linear infinite;\n  -moz-animation: progress-bar-stripes 2s linear infinite;\n  -ms-animation: progress-bar-stripes 2s linear infinite;\n  -o-animation: progress-bar-stripes 2s linear infinite;\n  animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-danger .bar,\n.progress .bar-danger {\n  background-color: #dd514c;\n  background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));\n  background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);\n  background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);\n  background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0);\n}\n.progress-danger.progress-striped .bar,\n.progress-striped .bar-danger {\n  background-color: #ee5f5b;\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-success .bar,\n.progress .bar-success {\n  background-color: #5eb95e;\n  background-image: -moz-linear-gradient(top, #62c462, #57a957);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));\n  background-image: -webkit-linear-gradient(top, #62c462, #57a957);\n  background-image: -o-linear-gradient(top, #62c462, #57a957);\n  background-image: linear-gradient(to bottom, #62c462, #57a957);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0);\n}\n.progress-success.progress-striped .bar,\n.progress-striped .bar-success {\n  background-color: #62c462;\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-info .bar,\n.progress .bar-info {\n  background-color: #4bb1cf;\n  background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));\n  background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);\n  background-image: -o-linear-gradient(top, #5bc0de, #339bb9);\n  background-image: linear-gradient(to bottom, #5bc0de, #339bb9);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0);\n}\n.progress-info.progress-striped .bar,\n.progress-striped .bar-info {\n  background-color: #5bc0de;\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-warning .bar,\n.progress .bar-warning {\n  background-color: #faa732;\n  background-image: -moz-linear-gradient(top, #fbb450, #f89406);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));\n  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);\n  background-image: -o-linear-gradient(top, #fbb450, #f89406);\n  background-image: linear-gradient(to bottom, #fbb450, #f89406);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);\n}\n.progress-warning.progress-striped .bar,\n.progress-striped .bar-warning {\n  background-color: #fbb450;\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.accordion {\n  margin-bottom: 20px;\n}\n.accordion-group {\n  margin-bottom: 2px;\n  border: 1px solid #e5e5e5;\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n}\n.accordion-heading {\n  border-bottom: 0;\n}\n.accordion-heading .accordion-toggle {\n  display: block;\n  padding: 8px 15px;\n}\n.accordion-toggle {\n  cursor: pointer;\n}\n.accordion-inner {\n  padding: 9px 15px;\n  border-top: 1px solid #e5e5e5;\n}\n.carousel {\n  position: relative;\n  margin-bottom: 20px;\n  line-height: 1;\n}\n.carousel-inner {\n  overflow: hidden;\n  width: 100%;\n  position: relative;\n}\n.carousel-inner > .item {\n  display: none;\n  position: relative;\n  -webkit-transition: 0.6s ease-in-out left;\n  -moz-transition: 0.6s ease-in-out left;\n  -o-transition: 0.6s ease-in-out left;\n  transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img {\n  display: block;\n  line-height: 1;\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  display: block;\n}\n.carousel-inner > .active {\n  left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n.carousel-inner > .next {\n  left: 100%;\n}\n.carousel-inner > .prev {\n  left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n  left: 0;\n}\n.carousel-inner > .active.left {\n  left: -100%;\n}\n.carousel-inner > .active.right {\n  left: 100%;\n}\n.carousel-control {\n  position: absolute;\n  top: 40%;\n  left: 15px;\n  width: 40px;\n  height: 40px;\n  margin-top: -20px;\n  font-size: 60px;\n  font-weight: 100;\n  line-height: 30px;\n  color: #ffffff;\n  text-align: center;\n  background: #080808;\n  border: 3px solid #ffffff;\n  -webkit-border-radius: 23px;\n  -moz-border-radius: 23px;\n  border-radius: 23px;\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n.carousel-control.right {\n  left: auto;\n  right: 15px;\n}\n.carousel-control:hover {\n  color: #ffffff;\n  text-decoration: none;\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\n.carousel-caption {\n  position: absolute;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  padding: 15px;\n  background: #333333;\n  background: rgba(0, 0, 0, 0.75);\n}\n.carousel-caption h4,\n.carousel-caption p {\n  color: #ffffff;\n  line-height: 20px;\n}\n.carousel-caption h4 {\n  margin: 0 0 5px;\n}\n.carousel-caption p {\n  margin-bottom: 0;\n}\n.hero-unit {\n  padding: 60px;\n  margin-bottom: 30px;\n  font-size: 18px;\n  font-weight: 200;\n  line-height: 30px;\n  color: inherit;\n  background-color: #e6e6e6;\n  -webkit-border-radius: 6px;\n  -moz-border-radius: 6px;\n  border-radius: 6px;\n}\n.hero-unit h1 {\n  margin-bottom: 0;\n  font-size: 60px;\n  line-height: 1;\n  color: inherit;\n  letter-spacing: -1px;\n}\n.hero-unit li {\n  line-height: 30px;\n}\n.pull-right {\n  float: right;\n}\n.pull-left {\n  float: left;\n}\n.hide {\n  display: none;\n}\n.show {\n  display: block;\n}\n.invisible {\n  visibility: hidden;\n}\n.affix {\n  position: fixed;\n}\n"
  },
  {
    "path": "app/assets/stylesheets/theme/custom-colour.css",
    "content": "/*/////////////////////////////////////////////////////////////////////\n // \n // Custom theme code styles\n // Written by Themelize.me (http://themelize.me)\n // \n // This is an empty starter template for overriding styles\n // set by Bootstrap & the theme\n // \n // ----------------------------------------------------\n // \n // Remove unused code for better performances\n // \n // ----------------------------------------------------\n // \n // @see - Usefuls tools online for editing\n // 1. http://charliepark.org/bootstrap_buttons/ - Button style generator\n // 2. http://www.colorzilla.com/gradient-editor/ - CSS3 gradient maker\n // \n // @note\n // To ensure custom styles are picked up\n // wrap definitions in body tag\n // ie.\n // body .navbar-inner {\n //   background: #ff0000;\n // }\n // \n /////////////////////////////////////////////////////////////////////*/\n.clearfix {\n  *zoom: 1;\n}\n.clearfix:before,\n.clearfix:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.clearfix:after {\n  clear: both;\n}\n.hide-text {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n.input-block-level {\n  display: block;\n  width: 100%;\n  min-height: 30px;\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\n/* primary colour */\n/* primary colour */\n/* primary colour */\n/* primary colour */\n/* primary colour */\n/* primary colour */\n/* primary colour */\n/*\n * --------------------------------------------------\n * 1. Common Elements\n *--------------------------------------------------\n */\nbody a {\n  color: #00adbb;\n  text-decoration: none;\n}\nbody a:hover {\n  color: #007e88;\n  text-decoration: underline;\n}\nbody .btn.btn-primary,\nbody .btn.btn-navbar {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #009aa7;\n  background-image: -moz-linear-gradient(top, #00adbb, #007e88);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#00adbb), to(#007e88));\n  background-image: -webkit-linear-gradient(top, #00adbb, #007e88);\n  background-image: -o-linear-gradient(top, #00adbb, #007e88);\n  background-image: linear-gradient(to bottom, #00adbb, #007e88);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff00adbb', endColorstr='#ff007e88', GradientType=0);\n  border-color: #007e88 #007e88 #00373b;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #007e88;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\nbody .btn.btn-primary:hover,\nbody .btn.btn-navbar:hover,\nbody .btn.btn-primary:active,\nbody .btn.btn-navbar:active,\nbody .btn.btn-primary.active,\nbody .btn.btn-navbar.active,\nbody .btn.btn-primary.disabled,\nbody .btn.btn-navbar.disabled,\nbody .btn.btn-primary[disabled],\nbody .btn.btn-navbar[disabled] {\n  color: #ffffff;\n  background-color: #007e88;\n  *background-color: #00666e;\n}\nbody .btn.btn-primary:active,\nbody .btn.btn-navbar:active,\nbody .btn.btn-primary.active,\nbody .btn.btn-navbar.active {\n  background-color: #004f55 \\9;\n}\nbody #footer {\n  border-top: 2px solid #00adbb;\n  /* primary colour */\n\n}\nbody #footer #toplink i {\n  color: #00adbb;\n  /* primary colour */\n\n}\nbody #header-hidden-link a.show-hide,\nbody .flexslider-wrapper .flex-control-nav li a.flex-active,\nbody .static-banner .flex-control-nav li a.flex-active {\n  background: #00adbb;\n  /* primary colour */\n\n}\n/*\n * --------------------------------------------------\n * 2. Header & Navigation \n *--------------------------------------------------\n */\nbody #navigation .header-hidden {\n  background: #00adbb;\n  /* primary colour */\n\n}\nbody #navigation .header {\n  border-top-color: #00adbb;\n  /* primary colour */\n\n}\nbody #navigation .brand {\n  color: #00adbb;\n  /* primary colour */\n\n}\nbody #navigation .btn-primary {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #009aa7;\n  background-image: -moz-linear-gradient(top, #00adbb, #007e88);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#00adbb), to(#007e88));\n  background-image: -webkit-linear-gradient(top, #00adbb, #007e88);\n  background-image: -o-linear-gradient(top, #00adbb, #007e88);\n  background-image: linear-gradient(to bottom, #00adbb, #007e88);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff00adbb', endColorstr='#ff007e88', GradientType=0);\n  border-color: #007e88 #007e88 #00373b;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #007e88;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  /* @see: Button maker: http://charliepark.org/bootstrap_buttons/ */\n\n}\nbody #navigation .btn-primary:hover,\nbody #navigation .btn-primary:active,\nbody #navigation .btn-primary.active,\nbody #navigation .btn-primary.disabled,\nbody #navigation .btn-primary[disabled] {\n  color: #ffffff;\n  background-color: #007e88;\n  *background-color: #00666e;\n}\nbody #navigation .btn-primary:active,\nbody #navigation .btn-primary.active {\n  background-color: #004f55 \\9;\n}\nbody #navigation .navbar-inner {\n  border-bottom-color: #00adbb;\n  /* primary colour */\n\n}\nbody #navigation .navbar-inverse .navbar-inner {\n  background-color: rgba(0, 173, 187, 0.22);\n  background-image: -moz-linear-gradient(top, rgba(0, 173, 187, 0.3), rgba(0, 173, 187, 0.1));\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(rgba(0, 173, 187, 0.3)), to(rgba(0, 173, 187, 0.1)));\n  background-image: -webkit-linear-gradient(top, rgba(0, 173, 187, 0.3), rgba(0, 173, 187, 0.1));\n  background-image: -o-linear-gradient(top, rgba(0, 173, 187, 0.3), rgba(0, 173, 187, 0.1));\n  background-image: linear-gradient(to bottom, rgba(0, 173, 187, 0.3), rgba(0, 173, 187, 0.1));\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#4d00adbb', endColorstr='#1a00adbb', GradientType=0);\n  /* @see: Gradient maker: http://www.colorzilla.com/gradient-editor/ */\n\n}\nbody #navigation .navbar .nav .divider-vertical {\n  border-left-color: #00666e;\n  border-right-color: rgba(255, 255, 255, 0.15);\n}\nbody #navigation .navbar .nav#main-menu li {\n  border-left-color: #00666e;\n  border-right-color: rgba(255, 255, 255, 0.15);\n}\nbody #navigation .navbar .nav#main-menu li.home-link a {\n  color: #00adbb;\n  /* primary colour */\n\n}\nbody #navigation .navbar .nav#main-menu .dropdown-menu {\n  border-bottom-color: #00adbb;\n  /* primary colour */\n\n}\nbody #navigation .navbar .nav#main-menu .dropdown-menu li a.menu-item:hover {\n  border-bottom-color: #00adbb;\n  /* primary colour */\n\n}\nbody #navigation .navbar .nav > li > a:focus,\nbody #navigation .navbar .nav > li > a:hover {\n  /*color: #ffffff;*/\n}\nbody #navigation .navbar .nav > .active > a,\nbody #navigation .navbar .nav > .active > a:hover,\nbody #navigation .navbar .nav > .active > a:focus {\n  /*color: #ffffff;*/\n}\nbody #navigation .navbar .nav > li > .btn,\nbody #navigation .navbar .nav > li > .btn-navbar {\n  color: #333333;\n  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);\n  background-color: #f5f5f5;\n  background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));\n  background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);\n  border-color: #e6e6e6 #e6e6e6 #bfbfbf;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #e6e6e6;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\nbody #navigation .navbar .nav > li > .btn:hover,\nbody #navigation .navbar .nav > li > .btn-navbar:hover,\nbody #navigation .navbar .nav > li > .btn:active,\nbody #navigation .navbar .nav > li > .btn-navbar:active,\nbody #navigation .navbar .nav > li > .btn.active,\nbody #navigation .navbar .nav > li > .btn-navbar.active,\nbody #navigation .navbar .nav > li > .btn.disabled,\nbody #navigation .navbar .nav > li > .btn-navbar.disabled,\nbody #navigation .navbar .nav > li > .btn[disabled],\nbody #navigation .navbar .nav > li > .btn-navbar[disabled] {\n  color: #333333;\n  background-color: #e6e6e6;\n  *background-color: #d9d9d9;\n}\nbody #navigation .navbar .nav > li > .btn:active,\nbody #navigation .navbar .nav > li > .btn-navbar:active,\nbody #navigation .navbar .nav > li > .btn.active,\nbody #navigation .navbar .nav > li > .btn-navbar.active {\n  background-color: #cccccc \\9;\n}\nbody #navigation .navbar .nav > li > .btn.btn-primary,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-primary,\nbody #navigation .navbar .nav > li > .btn.btn-navbar,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-navbar,\nbody #navigation .navbar .nav > li > .btn:focus,\nbody #navigation .navbar .nav > li > .btn-navbar:focus {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #009aa7;\n  background-image: -moz-linear-gradient(top, #00adbb, #007e88);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#00adbb), to(#007e88));\n  background-image: -webkit-linear-gradient(top, #00adbb, #007e88);\n  background-image: -o-linear-gradient(top, #00adbb, #007e88);\n  background-image: linear-gradient(to bottom, #00adbb, #007e88);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff00adbb', endColorstr='#ff007e88', GradientType=0);\n  border-color: #007e88 #007e88 #00373b;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #007e88;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\nbody #navigation .navbar .nav > li > .btn.btn-primary:hover,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-primary:hover,\nbody #navigation .navbar .nav > li > .btn.btn-navbar:hover,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-navbar:hover,\nbody #navigation .navbar .nav > li > .btn:focus:hover,\nbody #navigation .navbar .nav > li > .btn-navbar:focus:hover,\nbody #navigation .navbar .nav > li > .btn.btn-primary:active,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-primary:active,\nbody #navigation .navbar .nav > li > .btn.btn-navbar:active,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-navbar:active,\nbody #navigation .navbar .nav > li > .btn:focus:active,\nbody #navigation .navbar .nav > li > .btn-navbar:focus:active,\nbody #navigation .navbar .nav > li > .btn.btn-primary.active,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-primary.active,\nbody #navigation .navbar .nav > li > .btn.btn-navbar.active,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-navbar.active,\nbody #navigation .navbar .nav > li > .btn:focus.active,\nbody #navigation .navbar .nav > li > .btn-navbar:focus.active,\nbody #navigation .navbar .nav > li > .btn.btn-primary.disabled,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-primary.disabled,\nbody #navigation .navbar .nav > li > .btn.btn-navbar.disabled,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-navbar.disabled,\nbody #navigation .navbar .nav > li > .btn:focus.disabled,\nbody #navigation .navbar .nav > li > .btn-navbar:focus.disabled,\nbody #navigation .navbar .nav > li > .btn.btn-primary[disabled],\nbody #navigation .navbar .nav > li > .btn-navbar.btn-primary[disabled],\nbody #navigation .navbar .nav > li > .btn.btn-navbar[disabled],\nbody #navigation .navbar .nav > li > .btn-navbar.btn-navbar[disabled],\nbody #navigation .navbar .nav > li > .btn:focus[disabled],\nbody #navigation .navbar .nav > li > .btn-navbar:focus[disabled] {\n  color: #ffffff;\n  background-color: #007e88;\n  *background-color: #00666e;\n}\nbody #navigation .navbar .nav > li > .btn.btn-primary:active,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-primary:active,\nbody #navigation .navbar .nav > li > .btn.btn-navbar:active,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-navbar:active,\nbody #navigation .navbar .nav > li > .btn:focus:active,\nbody #navigation .navbar .nav > li > .btn-navbar:focus:active,\nbody #navigation .navbar .nav > li > .btn.btn-primary.active,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-primary.active,\nbody #navigation .navbar .nav > li > .btn.btn-navbar.active,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-navbar.active,\nbody #navigation .navbar .nav > li > .btn:focus.active,\nbody #navigation .navbar .nav > li > .btn-navbar:focus.active {\n  background-color: #004f55 \\9;\n}\nbody #navigation .navbar .nav > li > .dropdown-menu:before {\n  border-bottom-color: rgba(0, 0, 0, 0.2);\n}\nbody #navigation .navbar .nav > li > .dropdown-menu:after {\n  border-bottom: 6px solid #ffffff;\n}\nbody #navigation .navbar-fixed-bottom .nav > li > .dropdown-menu:before {\n  border-top-color: rgba(0, 0, 0, 0.2);\n}\nbody #navigation .navbar-fixed-bottom .nav > li > .dropdown-menu:after {\n  border-top: 6px solid #ffffff;\n}\nbody #navigation .navbar .nav li.dropdown > a:hover .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\nbody #navigation .navbar .nav li.dropdown.open > .dropdown-toggle,\nbody #navigation .navbar .nav li.dropdown.active > .dropdown-toggle,\nbody #navigation .navbar .nav li.dropdown.open.active > .dropdown-toggle {\n  color: #ffffff;\n}\nbody #navigation .navbar .nav li.dropdown > .dropdown-toggle .caret {\n  border-top-color: rgba(255, 255, 255, 0.8);\n  border-bottom-color: rgba(255, 255, 255, 0.8);\n}\nbody #navigation .navbar .nav li.dropdown.open > .dropdown-toggle .caret,\nbody #navigation .navbar .nav li.dropdown.active > .dropdown-toggle .caret,\nbody #navigation .navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\nbody #navigation .dropdown-menu .divider {\n  *width: 100%;\n  height: 1px;\n  margin: 9px 1px;\n  *margin: -5px 0 5px;\n  overflow: hidden;\n  background-color: #e5e5e5;\n  border-bottom: 1px solid #ffffff;\n}\nbody #navigation .dropdown-menu li > a {\n  color: #242424;\n}\nbody #navigation .dropdown-menu li > a:hover,\nbody #navigation .dropdown-menu li > a:focus,\nbody #navigation .dropdown-submenu:hover > a {\n  color: #ffffff;\n  background-color: rgba(31, 31, 31, 0.8);\n  background-image: -moz-linear-gradient(top, rgba(36, 36, 36, 0.8), rgba(23, 23, 23, 0.8));\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(rgba(36, 36, 36, 0.8)), to(rgba(23, 23, 23, 0.8)));\n  background-image: -webkit-linear-gradient(top, rgba(36, 36, 36, 0.8), rgba(23, 23, 23, 0.8));\n  background-image: -o-linear-gradient(top, rgba(36, 36, 36, 0.8), rgba(23, 23, 23, 0.8));\n  background-image: linear-gradient(to bottom, rgba(36, 36, 36, 0.8), rgba(23, 23, 23, 0.8));\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#cc242424', endColorstr='#cc171717', GradientType=0);\n  /* @see: Gradient maker: http://www.colorzilla.com/gradient-editor/ */\n\n}\nbody #navigation .dropdown-menu .active > a,\nbody #navigation .dropdown-menu .active > a:hover {\n  color: #242424;\n  background-color: rgba(31, 31, 31, 0.8);\n  background-image: -moz-linear-gradient(top, rgba(36, 36, 36, 0.8), rgba(23, 23, 23, 0.8));\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(rgba(36, 36, 36, 0.8)), to(rgba(23, 23, 23, 0.8)));\n  background-image: -webkit-linear-gradient(top, rgba(36, 36, 36, 0.8), rgba(23, 23, 23, 0.8));\n  background-image: -o-linear-gradient(top, rgba(36, 36, 36, 0.8), rgba(23, 23, 23, 0.8));\n  background-image: linear-gradient(to bottom, rgba(36, 36, 36, 0.8), rgba(23, 23, 23, 0.8));\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#cc242424', endColorstr='#cc171717', GradientType=0);\n  /* @see: Gradient maker: http://www.colorzilla.com/gradient-editor/ */\n\n}\n/*\n * --------------------------------------------------\n * 3. Content Area\n *-------------------------------------------------- \n */\nbody .pricing-stack .well .price {\n  color: #00adbb;\n  /* primary colour */\n\n}\nbody .pricing-stack .well.active {\n  border-color: #00adbb;\n  /* primary colour */\n\n}\nbody .pricing-stack .well.active .price {\n  background: #00adbb;\n  /* primary colour */\n\n  border-color: #00adbb;\n}\nbody .tabbable > ul.nav-tabs li.active a,\nbody ul.nav-tabs li.active a,\nbody .tabbable > ul.nav-tabs li.active a:hover,\nbody ul.nav-tabs li.active a:hover {\n  color: #00adbb;\n  border-top-color: #00adbb;\n  /* primary colour */\n\n}\nbody .section-menu ul.nav-list li.active > a,\nbody .section-menu ul.nav-list li.active > a:hover {\n  color: #00adbb;\n  border-left-color: #00adbb;\n  /* primary colour */\n\n}\nbody .stats .stat .well {\n  background-color: #007e88;\n  background-image: -webkit-gradient(radial, center center, 0, center center, 460, from(#00adbb), to(#007e88));\n  background-image: -webkit-radial-gradient(circle, #00adbb, #007e88);\n  background-image: -moz-radial-gradient(circle, #00adbb, #007e88);\n  background-image: -o-radial-gradient(circle, #00adbb, #007e88);\n  background-repeat: no-repeat;\n}\nbody .stats .stat .well:after {\n  border-top-color: #00adbb;\n  /* primary colour */\n\n}\nbody .date-wrapper span.date-m {\n  background: #00adbb;\n  /* primary colour */\n\n}\nbody .tags .tag {\n  color: #00adbb;\n  /* primary colour */\n\n}\n/*\n * --------------------------------------------------\n * 3. Misc\n * Other stuff\n *--------------------------------------------------\n */body .icon-inverse,\nli .icon-inverse {\n  background: #00adbb;\n  /* primary colour */\n\n}\nbody .icon-inverse-50,\nli .icon-inverse-50 {\n  background: rgba(0, 173, 187, 0.5);\n}\nbody .primary-colour {\n  color: #00adbb;\n  /* primary colour */\n\n}\nbody .primary-colour-bg {\n  background: #00adbb;\n  /* primary colour */\n\n}\nbody .primary-colour-bg-50 {\n  background: rgba(0, 173, 187, 0.5);\n}\nbody .spacer {\n  color: #00adbb;\n  /* primary colour */\n\n}\nbody .spacer.dark {\n  color: #007e88;\n}\nbody .social-media a:hover {\n  background: #00adbb;\n  /* primary colour */\n\n}\nbody a .de-em {\n  color: rgba(0, 173, 187, 0.8);\n}\n"
  },
  {
    "path": "app/assets/stylesheets/theme/flexslider.css",
    "content": "/*\n * jQuery FlexSlider v2.0\n * http://www.woothemes.com/flexslider/\n *\n * Copyright 2012 WooThemes\n * Free to use under the GPLv2 license.\n * http://www.gnu.org/licenses/gpl-2.0.html\n *\n * Contributing author: Tyler Smith (@mbmufffin)\n */\n\n \n/* Browser Resets */\n.flex-container a:active,\n.flexslider a:active,\n.flex-container a:focus,\n.flexslider a:focus  {outline: none;}\n.slides,\n.flex-control-nav,\n.flex-direction-nav {margin: 0; padding: 0; list-style: none;} \n\n/* FlexSlider Necessary Styles\n*********************************/ \n.flexslider {margin: 0; padding: 0;}\n.flexslider .slides > li {display: none; -webkit-backface-visibility: hidden;} /* Hide the slides before the JS is loaded. Avoids image jumping */\n.flexslider .slides img {width: 100%; display: block;}\n.flex-pauseplay span {text-transform: capitalize;}\n\n/* Clearfix for the .slides element */\n.slides:after {content: \".\"; display: block; clear: both; visibility: hidden; line-height: 0; height: 0;} \nhtml[xmlns] .slides {display: block;} \n* html .slides {height: 1%;}\n\n/* No JavaScript Fallback */\n/* If you are not using another script, such as Modernizr, make sure you\n * include js that eliminates this class on page load */\n.no-js .slides > li:first-child {display: block;}\n\n\n/* FlexSlider Default Theme\n*********************************/\n.flexslider {margin: 0 0 60px; background: #fff; border: 4px solid #fff; position: relative; -webkit-border-radius: 4px; -moz-border-radius: 4px; -o-border-radius: 4px; border-radius: 4px; box-shadow: 0 1px 4px rgba(0,0,0,.2); -webkit-box-shadow: 0 1px 4px rgba(0,0,0,.2); -moz-box-shadow: 0 1px 4px rgba(0,0,0,.2); -o-box-shadow: 0 1px 4px rgba(0,0,0,.2); zoom: 1;}\n.flex-viewport {max-height: 2000px; -webkit-transition: all 1s ease; -moz-transition: all 1s ease; transition: all 1s ease;}\n.loading .flex-viewport {max-height: 300px;}\n.flexslider .slides {zoom: 1;}\n\n.carousel li {margin-right: 5px}\n\n\n/* Direction Nav */\n.flex-direction-nav {*height: 0;}\n.flex-direction-nav a {width: 30px; height: 30px; margin: -20px 0 0; display: block; background: url(../img/bg_direction_nav.png) no-repeat 0 0; position: absolute; top: 50%; z-index: 10; cursor: pointer; text-indent: -9999px; opacity: 0; -webkit-transition: all .3s ease;}\n.flex-direction-nav .flex-next {background-position: 100% 0; right: -36px; }\n.flex-direction-nav .flex-prev {left: -36px;}\n.flexslider:hover .flex-next {opacity: 0.8; right: 5px;}\n.flexslider:hover .flex-prev {opacity: 0.8; left: 5px;}\n.flexslider:hover .flex-next:hover, .flexslider:hover .flex-prev:hover {opacity: 1;}\n.flex-direction-nav .flex-disabled {opacity: .3!important; filter:alpha(opacity=30); cursor: default;}\n\n/* Control Nav */\n.flex-control-nav {width: 100%; position: absolute; bottom: -40px; text-align: center;}\n.flex-control-nav li {margin: 0 6px; display: inline-block; zoom: 1; *display: inline;}\n.flex-control-paging li a {width: 11px; height: 11px; display: block; background: #666; background: rgba(0,0,0,0.5); cursor: pointer; text-indent: -9999px; -webkit-border-radius: 20px; -moz-border-radius: 20px; -o-border-radius: 20px; border-radius: 20px; box-shadow: inset 0 0 3px rgba(0,0,0,0.3);}\n.flex-control-paging li a:hover { background: #333; background: rgba(0,0,0,0.7); }\n.flex-control-paging li a.flex-active { background: #000; background: rgba(0,0,0,0.9); cursor: default; }\n\n.flex-control-thumbs {margin: 5px 0 0; position: static; overflow: hidden;}\n.flex-control-thumbs li {width: 25%; float: left; margin: 0;}\n.flex-control-thumbs img {width: 100%; display: block; opacity: .7; cursor: pointer;}\n.flex-control-thumbs img:hover {opacity: 1;}\n.flex-control-thumbs .flex-active {opacity: 1; cursor: default;}\n\n@media screen and (max-width: 860px) {\n  .flex-direction-nav .flex-prev {opacity: 1; left: 0;}\n  .flex-direction-nav .flex-next {opacity: 1; right: 0;}\n}"
  },
  {
    "path": "app/assets/stylesheets/theme/responsive.css",
    "content": "/*!\n * Bootstrap Responsive v2.2.2\n *\n * Copyright 2012 Twitter, Inc\n * Licensed under the Apache License v2.0\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Designed and built with all the love in the world @twitter by @mdo and @fat.\n */\n@-ms-viewport {\n  width: device-width;\n}\n.clearfix {\n  *zoom: 1;\n}\n.clearfix:before,\n.clearfix:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.clearfix:after {\n  clear: both;\n}\n.hide-text {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n.input-block-level {\n  display: block;\n  width: 100%;\n  min-height: 30px;\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\n.hidden {\n  display: none;\n  visibility: hidden;\n}\n.visible-phone {\n  display: none !important;\n}\n.visible-tablet {\n  display: none !important;\n}\n.hidden-desktop {\n  display: none !important;\n}\n.visible-desktop {\n  display: inherit !important;\n}\n@media (min-width: 768px) and (max-width: 979px) {\n  .hidden-desktop {\n    display: inherit !important;\n  }\n  .visible-desktop {\n    display: none !important ;\n  }\n  .visible-tablet {\n    display: inherit !important;\n  }\n  .hidden-tablet {\n    display: none !important;\n  }\n}\n@media (max-width: 767px) {\n  .hidden-desktop {\n    display: inherit !important;\n  }\n  .visible-desktop {\n    display: none !important;\n  }\n  .visible-phone {\n    display: inherit !important;\n  }\n  .hidden-phone {\n    display: none !important;\n  }\n}\n@media (min-width: 1200px) {\n  .row {\n    margin-left: -30px;\n    *zoom: 1;\n  }\n  .row:before,\n  .row:after {\n    display: table;\n    content: \"\";\n    line-height: 0;\n  }\n  .row:after {\n    clear: both;\n  }\n  [class*=\"span\"] {\n    float: left;\n    min-height: 1px;\n    margin-left: 30px;\n  }\n  .container,\n  .navbar-static-top .container,\n  .navbar-fixed-top .container,\n  .navbar-fixed-bottom .container {\n    width: 1170px;\n  }\n  .span12 {\n    width: 1170px;\n  }\n  .span11 {\n    width: 1070px;\n  }\n  .span10 {\n    width: 970px;\n  }\n  .span9 {\n    width: 870px;\n  }\n  .span8 {\n    width: 770px;\n  }\n  .span7 {\n    width: 670px;\n  }\n  .span6 {\n    width: 570px;\n  }\n  .span5 {\n    width: 470px;\n  }\n  .span4 {\n    width: 370px;\n  }\n  .span3 {\n    width: 270px;\n  }\n  .span2 {\n    width: 170px;\n  }\n  .span1 {\n    width: 70px;\n  }\n  .offset12 {\n    margin-left: 1230px;\n  }\n  .offset11 {\n    margin-left: 1130px;\n  }\n  .offset10 {\n    margin-left: 1030px;\n  }\n  .offset9 {\n    margin-left: 930px;\n  }\n  .offset8 {\n    margin-left: 830px;\n  }\n  .offset7 {\n    margin-left: 730px;\n  }\n  .offset6 {\n    margin-left: 630px;\n  }\n  .offset5 {\n    margin-left: 530px;\n  }\n  .offset4 {\n    margin-left: 430px;\n  }\n  .offset3 {\n    margin-left: 330px;\n  }\n  .offset2 {\n    margin-left: 230px;\n  }\n  .offset1 {\n    margin-left: 130px;\n  }\n  .row-fluid {\n    width: 100%;\n    *zoom: 1;\n  }\n  .row-fluid:before,\n  .row-fluid:after {\n    display: table;\n    content: \"\";\n    line-height: 0;\n  }\n  .row-fluid:after {\n    clear: both;\n  }\n  .row-fluid [class*=\"span\"] {\n    display: block;\n    width: 100%;\n    min-height: 30px;\n    -webkit-box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    box-sizing: border-box;\n    float: left;\n    margin-left: 2.564102564102564%;\n    *margin-left: 2.5109110747408616%;\n  }\n  .row-fluid [class*=\"span\"]:first-child {\n    margin-left: 0;\n  }\n  .row-fluid .controls-row [class*=\"span\"] + [class*=\"span\"] {\n    margin-left: 2.564102564102564%;\n  }\n  .row-fluid .span12 {\n    width: 100%;\n    *width: 99.94680851063829%;\n  }\n  .row-fluid .span11 {\n    width: 91.45299145299145%;\n    *width: 91.39979996362975%;\n  }\n  .row-fluid .span10 {\n    width: 82.90598290598291%;\n    *width: 82.8527914166212%;\n  }\n  .row-fluid .span9 {\n    width: 74.35897435897436%;\n    *width: 74.30578286961266%;\n  }\n  .row-fluid .span8 {\n    width: 65.81196581196582%;\n    *width: 65.75877432260411%;\n  }\n  .row-fluid .span7 {\n    width: 57.26495726495726%;\n    *width: 57.21176577559556%;\n  }\n  .row-fluid .span6 {\n    width: 48.717948717948715%;\n    *width: 48.664757228587014%;\n  }\n  .row-fluid .span5 {\n    width: 40.17094017094017%;\n    *width: 40.11774868157847%;\n  }\n  .row-fluid .span4 {\n    width: 31.623931623931625%;\n    *width: 31.570740134569924%;\n  }\n  .row-fluid .span3 {\n    width: 23.076923076923077%;\n    *width: 23.023731587561375%;\n  }\n  .row-fluid .span2 {\n    width: 14.52991452991453%;\n    *width: 14.476723040552828%;\n  }\n  .row-fluid .span1 {\n    width: 5.982905982905983%;\n    *width: 5.929714493544281%;\n  }\n  .row-fluid .offset12 {\n    margin-left: 105.12820512820512%;\n    *margin-left: 105.02182214948171%;\n  }\n  .row-fluid .offset12:first-child {\n    margin-left: 102.56410256410257%;\n    *margin-left: 102.45771958537915%;\n  }\n  .row-fluid .offset11 {\n    margin-left: 96.58119658119658%;\n    *margin-left: 96.47481360247316%;\n  }\n  .row-fluid .offset11:first-child {\n    margin-left: 94.01709401709402%;\n    *margin-left: 93.91071103837061%;\n  }\n  .row-fluid .offset10 {\n    margin-left: 88.03418803418803%;\n    *margin-left: 87.92780505546462%;\n  }\n  .row-fluid .offset10:first-child {\n    margin-left: 85.47008547008548%;\n    *margin-left: 85.36370249136206%;\n  }\n  .row-fluid .offset9 {\n    margin-left: 79.48717948717949%;\n    *margin-left: 79.38079650845607%;\n  }\n  .row-fluid .offset9:first-child {\n    margin-left: 76.92307692307693%;\n    *margin-left: 76.81669394435352%;\n  }\n  .row-fluid .offset8 {\n    margin-left: 70.94017094017094%;\n    *margin-left: 70.83378796144753%;\n  }\n  .row-fluid .offset8:first-child {\n    margin-left: 68.37606837606839%;\n    *margin-left: 68.26968539734497%;\n  }\n  .row-fluid .offset7 {\n    margin-left: 62.393162393162385%;\n    *margin-left: 62.28677941443899%;\n  }\n  .row-fluid .offset7:first-child {\n    margin-left: 59.82905982905982%;\n    *margin-left: 59.72267685033642%;\n  }\n  .row-fluid .offset6 {\n    margin-left: 53.84615384615384%;\n    *margin-left: 53.739770867430444%;\n  }\n  .row-fluid .offset6:first-child {\n    margin-left: 51.28205128205128%;\n    *margin-left: 51.175668303327875%;\n  }\n  .row-fluid .offset5 {\n    margin-left: 45.299145299145295%;\n    *margin-left: 45.1927623204219%;\n  }\n  .row-fluid .offset5:first-child {\n    margin-left: 42.73504273504273%;\n    *margin-left: 42.62865975631933%;\n  }\n  .row-fluid .offset4 {\n    margin-left: 36.75213675213675%;\n    *margin-left: 36.645753773413354%;\n  }\n  .row-fluid .offset4:first-child {\n    margin-left: 34.18803418803419%;\n    *margin-left: 34.081651209310785%;\n  }\n  .row-fluid .offset3 {\n    margin-left: 28.205128205128204%;\n    *margin-left: 28.0987452264048%;\n  }\n  .row-fluid .offset3:first-child {\n    margin-left: 25.641025641025642%;\n    *margin-left: 25.53464266230224%;\n  }\n  .row-fluid .offset2 {\n    margin-left: 19.65811965811966%;\n    *margin-left: 19.551736679396257%;\n  }\n  .row-fluid .offset2:first-child {\n    margin-left: 17.094017094017094%;\n    *margin-left: 16.98763411529369%;\n  }\n  .row-fluid .offset1 {\n    margin-left: 11.11111111111111%;\n    *margin-left: 11.004728132387708%;\n  }\n  .row-fluid .offset1:first-child {\n    margin-left: 8.547008547008547%;\n    *margin-left: 8.440625568285142%;\n  }\n  input,\n  textarea,\n  .uneditable-input {\n    margin-left: 0;\n  }\n  .controls-row [class*=\"span\"] + [class*=\"span\"] {\n    margin-left: 30px;\n  }\n  input.span12, textarea.span12, .uneditable-input.span12 {\n    width: 1156px;\n  }\n  input.span11, textarea.span11, .uneditable-input.span11 {\n    width: 1056px;\n  }\n  input.span10, textarea.span10, .uneditable-input.span10 {\n    width: 956px;\n  }\n  input.span9, textarea.span9, .uneditable-input.span9 {\n    width: 856px;\n  }\n  input.span8, textarea.span8, .uneditable-input.span8 {\n    width: 756px;\n  }\n  input.span7, textarea.span7, .uneditable-input.span7 {\n    width: 656px;\n  }\n  input.span6, textarea.span6, .uneditable-input.span6 {\n    width: 556px;\n  }\n  input.span5, textarea.span5, .uneditable-input.span5 {\n    width: 456px;\n  }\n  input.span4, textarea.span4, .uneditable-input.span4 {\n    width: 356px;\n  }\n  input.span3, textarea.span3, .uneditable-input.span3 {\n    width: 256px;\n  }\n  input.span2, textarea.span2, .uneditable-input.span2 {\n    width: 156px;\n  }\n  input.span1, textarea.span1, .uneditable-input.span1 {\n    width: 56px;\n  }\n  .thumbnails {\n    margin-left: -30px;\n  }\n  .thumbnails > li {\n    margin-left: 30px;\n  }\n  .row-fluid .thumbnails {\n    margin-left: 0;\n  }\n}\n@media (min-width: 768px) and (max-width: 979px) {\n  .row {\n    margin-left: -20px;\n    *zoom: 1;\n  }\n  .row:before,\n  .row:after {\n    display: table;\n    content: \"\";\n    line-height: 0;\n  }\n  .row:after {\n    clear: both;\n  }\n  [class*=\"span\"] {\n    float: left;\n    min-height: 1px;\n    margin-left: 20px;\n  }\n  .container,\n  .navbar-static-top .container,\n  .navbar-fixed-top .container,\n  .navbar-fixed-bottom .container {\n    width: 724px;\n  }\n  .span12 {\n    width: 724px;\n  }\n  .span11 {\n    width: 662px;\n  }\n  .span10 {\n    width: 600px;\n  }\n  .span9 {\n    width: 538px;\n  }\n  .span8 {\n    width: 476px;\n  }\n  .span7 {\n    width: 414px;\n  }\n  .span6 {\n    width: 352px;\n  }\n  .span5 {\n    width: 290px;\n  }\n  .span4 {\n    width: 228px;\n  }\n  .span3 {\n    width: 166px;\n  }\n  .span2 {\n    width: 104px;\n  }\n  .span1 {\n    width: 42px;\n  }\n  .offset12 {\n    margin-left: 764px;\n  }\n  .offset11 {\n    margin-left: 702px;\n  }\n  .offset10 {\n    margin-left: 640px;\n  }\n  .offset9 {\n    margin-left: 578px;\n  }\n  .offset8 {\n    margin-left: 516px;\n  }\n  .offset7 {\n    margin-left: 454px;\n  }\n  .offset6 {\n    margin-left: 392px;\n  }\n  .offset5 {\n    margin-left: 330px;\n  }\n  .offset4 {\n    margin-left: 268px;\n  }\n  .offset3 {\n    margin-left: 206px;\n  }\n  .offset2 {\n    margin-left: 144px;\n  }\n  .offset1 {\n    margin-left: 82px;\n  }\n  .row-fluid {\n    width: 100%;\n    *zoom: 1;\n  }\n  .row-fluid:before,\n  .row-fluid:after {\n    display: table;\n    content: \"\";\n    line-height: 0;\n  }\n  .row-fluid:after {\n    clear: both;\n  }\n  .row-fluid [class*=\"span\"] {\n    display: block;\n    width: 100%;\n    min-height: 30px;\n    -webkit-box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    box-sizing: border-box;\n    float: left;\n    margin-left: 2.7624309392265194%;\n    *margin-left: 2.709239449864817%;\n  }\n  .row-fluid [class*=\"span\"]:first-child {\n    margin-left: 0;\n  }\n  .row-fluid .controls-row [class*=\"span\"] + [class*=\"span\"] {\n    margin-left: 2.7624309392265194%;\n  }\n  .row-fluid .span12 {\n    width: 100%;\n    *width: 99.94680851063829%;\n  }\n  .row-fluid .span11 {\n    width: 91.43646408839778%;\n    *width: 91.38327259903608%;\n  }\n  .row-fluid .span10 {\n    width: 82.87292817679558%;\n    *width: 82.81973668743387%;\n  }\n  .row-fluid .span9 {\n    width: 74.30939226519337%;\n    *width: 74.25620077583166%;\n  }\n  .row-fluid .span8 {\n    width: 65.74585635359117%;\n    *width: 65.69266486422946%;\n  }\n  .row-fluid .span7 {\n    width: 57.18232044198895%;\n    *width: 57.12912895262725%;\n  }\n  .row-fluid .span6 {\n    width: 48.61878453038674%;\n    *width: 48.56559304102504%;\n  }\n  .row-fluid .span5 {\n    width: 40.05524861878453%;\n    *width: 40.00205712942283%;\n  }\n  .row-fluid .span4 {\n    width: 31.491712707182323%;\n    *width: 31.43852121782062%;\n  }\n  .row-fluid .span3 {\n    width: 22.92817679558011%;\n    *width: 22.87498530621841%;\n  }\n  .row-fluid .span2 {\n    width: 14.3646408839779%;\n    *width: 14.311449394616199%;\n  }\n  .row-fluid .span1 {\n    width: 5.801104972375691%;\n    *width: 5.747913483013988%;\n  }\n  .row-fluid .offset12 {\n    margin-left: 105.52486187845304%;\n    *margin-left: 105.41847889972962%;\n  }\n  .row-fluid .offset12:first-child {\n    margin-left: 102.76243093922652%;\n    *margin-left: 102.6560479605031%;\n  }\n  .row-fluid .offset11 {\n    margin-left: 96.96132596685082%;\n    *margin-left: 96.8549429881274%;\n  }\n  .row-fluid .offset11:first-child {\n    margin-left: 94.1988950276243%;\n    *margin-left: 94.09251204890089%;\n  }\n  .row-fluid .offset10 {\n    margin-left: 88.39779005524862%;\n    *margin-left: 88.2914070765252%;\n  }\n  .row-fluid .offset10:first-child {\n    margin-left: 85.6353591160221%;\n    *margin-left: 85.52897613729868%;\n  }\n  .row-fluid .offset9 {\n    margin-left: 79.8342541436464%;\n    *margin-left: 79.72787116492299%;\n  }\n  .row-fluid .offset9:first-child {\n    margin-left: 77.07182320441989%;\n    *margin-left: 76.96544022569647%;\n  }\n  .row-fluid .offset8 {\n    margin-left: 71.2707182320442%;\n    *margin-left: 71.16433525332079%;\n  }\n  .row-fluid .offset8:first-child {\n    margin-left: 68.50828729281768%;\n    *margin-left: 68.40190431409427%;\n  }\n  .row-fluid .offset7 {\n    margin-left: 62.70718232044199%;\n    *margin-left: 62.600799341718584%;\n  }\n  .row-fluid .offset7:first-child {\n    margin-left: 59.94475138121547%;\n    *margin-left: 59.838368402492065%;\n  }\n  .row-fluid .offset6 {\n    margin-left: 54.14364640883978%;\n    *margin-left: 54.037263430116376%;\n  }\n  .row-fluid .offset6:first-child {\n    margin-left: 51.38121546961326%;\n    *margin-left: 51.27483249088986%;\n  }\n  .row-fluid .offset5 {\n    margin-left: 45.58011049723757%;\n    *margin-left: 45.47372751851417%;\n  }\n  .row-fluid .offset5:first-child {\n    margin-left: 42.81767955801105%;\n    *margin-left: 42.71129657928765%;\n  }\n  .row-fluid .offset4 {\n    margin-left: 37.01657458563536%;\n    *margin-left: 36.91019160691196%;\n  }\n  .row-fluid .offset4:first-child {\n    margin-left: 34.25414364640884%;\n    *margin-left: 34.14776066768544%;\n  }\n  .row-fluid .offset3 {\n    margin-left: 28.45303867403315%;\n    *margin-left: 28.346655695309746%;\n  }\n  .row-fluid .offset3:first-child {\n    margin-left: 25.69060773480663%;\n    *margin-left: 25.584224756083227%;\n  }\n  .row-fluid .offset2 {\n    margin-left: 19.88950276243094%;\n    *margin-left: 19.783119783707537%;\n  }\n  .row-fluid .offset2:first-child {\n    margin-left: 17.12707182320442%;\n    *margin-left: 17.02068884448102%;\n  }\n  .row-fluid .offset1 {\n    margin-left: 11.32596685082873%;\n    *margin-left: 11.219583872105325%;\n  }\n  .row-fluid .offset1:first-child {\n    margin-left: 8.56353591160221%;\n    *margin-left: 8.457152932878806%;\n  }\n  input,\n  textarea,\n  .uneditable-input {\n    margin-left: 0;\n  }\n  .controls-row [class*=\"span\"] + [class*=\"span\"] {\n    margin-left: 20px;\n  }\n  input.span12, textarea.span12, .uneditable-input.span12 {\n    width: 710px;\n  }\n  input.span11, textarea.span11, .uneditable-input.span11 {\n    width: 648px;\n  }\n  input.span10, textarea.span10, .uneditable-input.span10 {\n    width: 586px;\n  }\n  input.span9, textarea.span9, .uneditable-input.span9 {\n    width: 524px;\n  }\n  input.span8, textarea.span8, .uneditable-input.span8 {\n    width: 462px;\n  }\n  input.span7, textarea.span7, .uneditable-input.span7 {\n    width: 400px;\n  }\n  input.span6, textarea.span6, .uneditable-input.span6 {\n    width: 338px;\n  }\n  input.span5, textarea.span5, .uneditable-input.span5 {\n    width: 276px;\n  }\n  input.span4, textarea.span4, .uneditable-input.span4 {\n    width: 214px;\n  }\n  input.span3, textarea.span3, .uneditable-input.span3 {\n    width: 152px;\n  }\n  input.span2, textarea.span2, .uneditable-input.span2 {\n    width: 90px;\n  }\n  input.span1, textarea.span1, .uneditable-input.span1 {\n    width: 28px;\n  }\n}\n@media (max-width: 767px) {\n  body {\n    padding-left: 20px;\n    padding-right: 20px;\n  }\n  .navbar-fixed-top,\n  .navbar-fixed-bottom,\n  .navbar-static-top {\n    margin-left: -20px;\n    margin-right: -20px;\n  }\n  .container-fluid {\n    padding: 0;\n  }\n  .dl-horizontal dt {\n    float: none;\n    clear: none;\n    width: auto;\n    text-align: left;\n  }\n  .dl-horizontal dd {\n    margin-left: 0;\n  }\n  .container {\n    width: auto;\n  }\n  .row-fluid {\n    width: 100%;\n  }\n  .row,\n  .thumbnails {\n    margin-left: 0;\n  }\n  .thumbnails > li {\n    float: none;\n    margin-left: 0;\n  }\n  [class*=\"span\"],\n  .uneditable-input[class*=\"span\"],\n  .row-fluid [class*=\"span\"] {\n    float: none;\n    display: block;\n    width: 100%;\n    margin-left: 0;\n    -webkit-box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    box-sizing: border-box;\n  }\n  .span12,\n  .row-fluid .span12 {\n    width: 100%;\n    -webkit-box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    box-sizing: border-box;\n  }\n  .row-fluid [class*=\"offset\"]:first-child {\n    margin-left: 0;\n  }\n  .input-large,\n  .input-xlarge,\n  .input-xxlarge,\n  input[class*=\"span\"],\n  select[class*=\"span\"],\n  textarea[class*=\"span\"],\n  .uneditable-input {\n    display: block;\n    width: 100%;\n    min-height: 30px;\n    -webkit-box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    box-sizing: border-box;\n  }\n  .input-prepend input,\n  .input-append input,\n  .input-prepend input[class*=\"span\"],\n  .input-append input[class*=\"span\"] {\n    display: inline-block;\n    width: auto;\n  }\n  .controls-row [class*=\"span\"] + [class*=\"span\"] {\n    margin-left: 0;\n  }\n  .modal {\n    position: fixed;\n    top: 20px;\n    left: 20px;\n    right: 20px;\n    width: auto;\n    margin: 0;\n  }\n  .modal.fade {\n    top: -100px;\n  }\n  .modal.fade.in {\n    top: 20px;\n  }\n}\n@media (max-width: 480px) {\n  .nav-collapse {\n    -webkit-transform: translate3d(0, 0, 0);\n  }\n  .page-header h1 small {\n    display: block;\n    line-height: 20px;\n  }\n  input[type=\"checkbox\"],\n  input[type=\"radio\"] {\n    border: 1px solid #ccc;\n  }\n  .form-horizontal .control-label {\n    float: none;\n    width: auto;\n    padding-top: 0;\n    text-align: left;\n  }\n  .form-horizontal .controls {\n    margin-left: 0;\n  }\n  .form-horizontal .control-list {\n    padding-top: 0;\n  }\n  .form-horizontal .form-actions {\n    padding-left: 10px;\n    padding-right: 10px;\n  }\n  .media .pull-left,\n  .media .pull-right {\n    float: none;\n    display: block;\n    margin-bottom: 10px;\n  }\n  .media-object {\n    margin-right: 0;\n    margin-left: 0;\n  }\n  .modal {\n    top: 10px;\n    left: 10px;\n    right: 10px;\n  }\n  .modal-header .close {\n    padding: 10px;\n    margin: -10px;\n  }\n  .carousel-caption {\n    position: static;\n  }\n}\n@media (max-width: 979px) {\n  body {\n    padding-top: 0;\n  }\n  .navbar-fixed-top,\n  .navbar-fixed-bottom {\n    position: static;\n  }\n  .navbar-fixed-top {\n    margin-bottom: 20px;\n  }\n  .navbar-fixed-bottom {\n    margin-top: 20px;\n  }\n  .navbar-fixed-top .navbar-inner,\n  .navbar-fixed-bottom .navbar-inner {\n    padding: 5px;\n  }\n  .navbar .container {\n    width: auto;\n    padding: 0;\n  }\n  .navbar .brand {\n    padding-left: 10px;\n    padding-right: 10px;\n    margin: 0 0 0 -5px;\n  }\n  .nav-collapse {\n    clear: both;\n  }\n  .nav-collapse .nav {\n    float: none;\n    margin: 0 0 10px;\n  }\n  .nav-collapse .nav > li {\n    float: none;\n  }\n  .nav-collapse .nav > li > a {\n    margin-bottom: 2px;\n  }\n  .nav-collapse .nav > .divider-vertical {\n    display: none;\n  }\n  .nav-collapse .nav .nav-header {\n    color: rgba(255, 255, 255, 0.7);\n    text-shadow: none;\n  }\n  .nav-collapse .nav > li > a,\n  .nav-collapse .dropdown-menu a {\n    padding: 9px 15px;\n    font-weight: bold;\n    color: rgba(255, 255, 255, 0.7);\n    -webkit-border-radius: 3px;\n    -moz-border-radius: 3px;\n    border-radius: 3px;\n  }\n  .nav-collapse .btn {\n    padding: 4px 10px 4px;\n    font-weight: normal;\n    -webkit-border-radius: 2px;\n    -moz-border-radius: 2px;\n    border-radius: 2px;\n  }\n  .nav-collapse .dropdown-menu li + li a {\n    margin-bottom: 2px;\n  }\n  .nav-collapse .nav > li > a:hover,\n  .nav-collapse .dropdown-menu a:hover {\n    background-color: #242424;\n  }\n  .navbar-inverse .nav-collapse .nav > li > a,\n  .navbar-inverse .nav-collapse .dropdown-menu a {\n    color: #55a79a;\n  }\n  .navbar-inverse .nav-collapse .nav > li > a:hover,\n  .navbar-inverse .nav-collapse .dropdown-menu a:hover {\n    background-color: #ffffff;\n  }\n  .nav-collapse.in .btn-group {\n    margin-top: 5px;\n    padding: 0;\n  }\n  .nav-collapse .dropdown-menu {\n    position: static;\n    top: auto;\n    left: auto;\n    float: none;\n    display: none;\n    max-width: none;\n    margin: 0 15px;\n    padding: 0;\n    background-color: transparent;\n    border: none;\n    -webkit-border-radius: 0;\n    -moz-border-radius: 0;\n    border-radius: 0;\n    -webkit-box-shadow: none;\n    -moz-box-shadow: none;\n    box-shadow: none;\n  }\n  .nav-collapse .open > .dropdown-menu {\n    display: block;\n  }\n  .nav-collapse .dropdown-menu:before,\n  .nav-collapse .dropdown-menu:after {\n    display: none;\n  }\n  .nav-collapse .dropdown-menu .divider {\n    display: none;\n  }\n  .nav-collapse .nav > li > .dropdown-menu:before,\n  .nav-collapse .nav > li > .dropdown-menu:after {\n    display: none;\n  }\n  .nav-collapse .navbar-form,\n  .nav-collapse .navbar-search {\n    float: none;\n    padding: 10px 15px;\n    margin: 10px 0;\n    border-top: 1px solid #242424;\n    border-bottom: 1px solid #242424;\n    -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n    -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n    box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n  }\n  .navbar-inverse .nav-collapse .navbar-form,\n  .navbar-inverse .nav-collapse .navbar-search {\n    border-top-color: #ffffff;\n    border-bottom-color: #ffffff;\n  }\n  .navbar .nav-collapse .nav.pull-right {\n    float: none;\n    margin-left: 0;\n  }\n  .nav-collapse,\n  .nav-collapse.collapse {\n    overflow: hidden;\n    height: 0;\n  }\n  .navbar .btn-navbar {\n    display: block;\n  }\n  .navbar-static .navbar-inner {\n    padding-left: 10px;\n    padding-right: 10px;\n  }\n}\n@media (min-width: 980px) {\n  .nav-collapse.collapse {\n    height: auto !important;\n    overflow: visible !important;\n  }\n}\n"
  },
  {
    "path": "app/assets/stylesheets/theme/theme-style.css",
    "content": "/*******************************************************\n *\n * Custom theme code styles\n * Written by Themelize.me (http://themelize.me)\n * \n *******************************************************/\n.clearfix {\n  *zoom: 1;\n}\n.clearfix:before,\n.clearfix:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.clearfix:after {\n  clear: both;\n}\n.hide-text {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n.input-block-level {\n  display: block;\n  width: 100%;\n  min-height: 30px;\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\nbody,\nhtml {\n  font-family: \"Open Sans\", Arial, serif;\n  background: #ffffff;\n}\nh1 {\n  font-size: 31.5px;\n}\nh2 {\n  font-size: 27.3px;\n}\nh3 {\n  font-size: 24.5px;\n}\nh4 {\n  font-size: 17.5px;\n}\nh5 {\n  font-size: 14px;\n}\nh6 {\n  font-size: 11.9px;\n}\nh1 small {\n  font-size: 21.7px;\n}\nh2 small {\n  font-size: 14.700000000000001px;\n}\nh3 small {\n  font-size: 14px;\n}\nh4 small {\n  font-size: 14px;\n}\n.page-title {\n  margin: 0;\n}\n.page-title small {\n  color: rgba(51, 51, 51, 0.5);\n}\na:focus {\n  outline: none;\n}\n.colour-switcher a {\n  text-indent: -10000px;\n  display: inline-block;\n  width: 40px;\n  height: 40px;\n  border: 3px solid rgba(255, 255, 255, 0.5);\n}\n.colour-switcher a:hover,\n.colour-switcher a.active {\n  border: 3px solid #ffffff;\n}\n.colour-switcher p {\n  margin-top: 1em;\n}\n.colour-switcher .green {\n  background: #55a79a;\n}\n.colour-switcher .red {\n  background: #be3e1d;\n}\n.colour-switcher .blue {\n  background: #00adbb;\n}\n.colour-switcher.page a {\n  width: 200px;\n  height: 200px;\n  border: 3px solid rgba(36, 36, 36, 0.2);\n}\n.colour-switcher.page a:hover,\n.colour-switcher.page a.active {\n  border: 3px solid rgba(36, 36, 36, 0.6);\n}\n#header-hidden-link {\n  position: absolute;\n  right: 0;\n  top: -10px;\n}\n#header-hidden-link a.show-hide,\n#header-hidden-link a.top-link {\n  font-size: 0;\n  line-height: 1;\n  background: #55a79a;\n  padding: 0 10px;\n  -webkit-border-radius: 0 0 3px 3px;\n  -moz-border-radius: 0 0 3px 3px;\n  border-radius: 0 0 3px 3px;\n  height: 20px;\n  display: block;\n  text-align: center;\n  color: rgba(255, 255, 255, 0.8);\n}\n#header-hidden-link a.show-hide i,\n#header-hidden-link a.top-link i {\n  font-size: 16px;\n  line-height: 1;\n}\n#header-hidden-link a.show-hide:hover,\n#header-hidden-link a.top-link:hover {\n  text-decoration: none;\n  color: #ffffff;\n}\n#header-hidden-link a.show-hide > i:before {\n  content: \"\\f078\";\n  font-family: 'FontAwesome';\n  font-size: 16px;\n  font-style: normal;\n}\n#header-hidden-link a.show-hide.open > i:before {\n  content: \"\\f077\";\n}\n.show-hide-open {\n  height: auto !important;\n  min-height: 40px;\n  max-height: 40000px;\n}\n.show-hide-close {\n  height: 0;\n  overflow: hidden;\n}\n/* --------------------------------------------------\n * Zones & Regions\n *-------------------------------------------------- */\n#navigation {\n  *zoom: 1;\n}\n#navigation:before,\n#navigation:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n#navigation:after {\n  clear: both;\n}\n#navigation .header-hidden {\n  background: #55a79a;\n  -webkit-transition: all 0.4s ease-out;\n  -moz-transition: all 0.4s ease-out;\n  -o-transition: all 0.4s ease-out;\n  transition: all 0.4s ease-out;\n  height: 0;\n  overflow: hidden;\n}\n#navigation .header-hidden.show-hide-open {\n  padding: 10px 0;\n}\n#navigation .header-hidden a {\n  color: #ffffff;\n}\n#navigation .header {\n  padding: 10px 0 10px 0;\n  background: rgba(255, 255, 255, 0.9);\n  border-top: 1px solid #55a79a;\n  color: #242424;\n  height: 60px;\n}\n#navigation .header .header-inner {\n  position: relative;\n}\n#navigation .header .social-media {\n  margin: 20px 0 0 0;\n}\n#navigation .navbar {\n  margin: 0;\n}\n#navigation .navbar-inner {\n  margin: 0;\n  padding: 0 8px;\n  -webkit-border-radius: 3px;\n  -moz-border-radius: 3px;\n  border-radius: 3px;\n  border: 0;\n  border-bottom: 3px solid #55a79a;\n  background-image: image('bg_noise-2.png');\n  background-position: left top;\n  background-repeat: repeat;\n  -webkit-box-shadow: 1px 1px 10px rgba(36, 36, 36, 0.6);\n  -moz-box-shadow: 1px 1px 10px rgba(36, 36, 36, 0.6);\n  box-shadow: 1px 1px 10px rgba(36, 36, 36, 0.6);\n}\n#navigation .brand {\n  font-weight: 400;\n  font-family: \"Rambla\", Arial, serif;\n  padding: 0;\n  margin: 8px 0 0 0;\n  display: block;\n  border: none;\n  text-shadow: none;\n  line-height: 1;\n  color: #55a79a;\n}\n#navigation .brand h1 {\n  font-size: 39.5px;\n  font-weight: bold;\n  margin: 0;\n  padding: 0;\n  line-height: 1;\n}\n#navigation .brand h1 span {\n  color: rgba(36, 36, 36, 0.8);\n  font-weight: 700;\n}\n#navigation .brand:hover {\n  text-decoration: none;\n  cursor: pointer;\n}\n#navigation .slogan {\n  color: #888;\n  font-size: 13.9px;\n  margin: 8px 0 0 1em;\n  padding: 12px 0 8px 1em;\n  border-left: 1px solid #e6e6e6;\n  float: left;\n}\n#navigation .navbar .btn-navbar {\n  padding: 8px;\n  margin: 0;\n}\n#navigation .nav-select {\n  display: none;\n  float: left;\n}\n#navigation .navbar .nav li.divider-vertical {\n  margin: 0 20px;\n  border-left-color: #3b746b;\n  border-right-color: rgba(255, 255, 255, 0.15);\n}\n#navigation .navbar .nav li > a,\n#navigation .navbar .nav li > a.btn {\n  text-shadow: none;\n  font-size: 14.5px;\n}\n#navigation .navbar .nav li > .btn {\n  padding-top: 5px;\n  padding-bottom: 5px;\n  margin: 0 0 0 5px;\n  color: #333333;\n  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);\n  background-color: #f5f5f5;\n  background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));\n  background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);\n  border-color: #e6e6e6 #e6e6e6 #bfbfbf;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #e6e6e6;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  outline: 0;\n}\n#navigation .navbar .nav li > .btn:hover,\n#navigation .navbar .nav li > .btn:active,\n#navigation .navbar .nav li > .btn.active,\n#navigation .navbar .nav li > .btn.disabled,\n#navigation .navbar .nav li > .btn[disabled] {\n  color: #333333;\n  background-color: #e6e6e6;\n  *background-color: #d9d9d9;\n}\n#navigation .navbar .nav li > .btn:active,\n#navigation .navbar .nav li > .btn.active {\n  background-color: #cccccc \\9;\n}\n#navigation .navbar .nav li > .btn.signup,\n#navigation .navbar .nav li > .btn.login {\n  margin: 0;\n  -webkit-border-radius: 2px 0 0 2px;\n  -moz-border-radius: 2px 0 0 2px;\n  border-radius: 2px 0 0 2px;\n  font-size: 12px;\n  text-transform: uppercase;\n}\n#navigation .navbar .nav li > .btn.login {\n  -webkit-border-radius: 0 2px 2px 0;\n  -moz-border-radius: 0 2px 2px 0;\n  border-radius: 0 2px 2px 0;\n}\n#navigation .navbar .nav li > .btn:active {\n  outline: 0;\n}\n#navigation .navbar .nav li > .btn.btn-primary,\n#navigation .navbar .nav li > .btn.btn-navbar {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #4e998e;\n  background-image: -moz-linear-gradient(top, #55a79a, #44857b);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#55a79a), to(#44857b));\n  background-image: -webkit-linear-gradient(top, #55a79a, #44857b);\n  background-image: -o-linear-gradient(top, #55a79a, #44857b);\n  background-image: linear-gradient(to bottom, #55a79a, #44857b);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff55a79a', endColorstr='#ff44857b', GradientType=0);\n  border-color: #44857b #44857b #2a534c;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #44857b;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n#navigation .navbar .nav li > .btn.btn-primary:hover,\n#navigation .navbar .nav li > .btn.btn-navbar:hover,\n#navigation .navbar .nav li > .btn.btn-primary:active,\n#navigation .navbar .nav li > .btn.btn-navbar:active,\n#navigation .navbar .nav li > .btn.btn-primary.active,\n#navigation .navbar .nav li > .btn.btn-navbar.active,\n#navigation .navbar .nav li > .btn.btn-primary.disabled,\n#navigation .navbar .nav li > .btn.btn-navbar.disabled,\n#navigation .navbar .nav li > .btn.btn-primary[disabled],\n#navigation .navbar .nav li > .btn.btn-navbar[disabled] {\n  color: #ffffff;\n  background-color: #44857b;\n  *background-color: #3b746b;\n}\n#navigation .navbar .nav li > .btn.btn-primary:active,\n#navigation .navbar .nav li > .btn.btn-navbar:active,\n#navigation .navbar .nav li > .btn.btn-primary.active,\n#navigation .navbar .nav li > .btn.btn-navbar.active {\n  background-color: #33635c \\9;\n}\n#navigation .navbar .nav li > .btn.btn-warning {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #faa732;\n  background-image: -moz-linear-gradient(top, #fbb450, #f89406);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));\n  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);\n  background-image: -o-linear-gradient(top, #fbb450, #f89406);\n  background-image: linear-gradient(to bottom, #fbb450, #f89406);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);\n  border-color: #f89406 #f89406 #ad6704;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #f89406;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n#navigation .navbar .nav li > .btn.btn-warning:hover,\n#navigation .navbar .nav li > .btn.btn-warning:active,\n#navigation .navbar .nav li > .btn.btn-warning.active,\n#navigation .navbar .nav li > .btn.btn-warning.disabled,\n#navigation .navbar .nav li > .btn.btn-warning[disabled] {\n  color: #ffffff;\n  background-color: #f89406;\n  *background-color: #df8505;\n}\n#navigation .navbar .nav li > .btn.btn-warning:active,\n#navigation .navbar .nav li > .btn.btn-warning.active {\n  background-color: #c67605 \\9;\n}\n#navigation .navbar .nav li > .btn.btn-danger {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #da4f49;\n  background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));\n  background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f);\n  background-image: -o-linear-gradient(top, #ee5f5b, #bd362f);\n  background-image: linear-gradient(to bottom, #ee5f5b, #bd362f);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);\n  border-color: #bd362f #bd362f #802420;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #bd362f;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n#navigation .navbar .nav li > .btn.btn-danger:hover,\n#navigation .navbar .nav li > .btn.btn-danger:active,\n#navigation .navbar .nav li > .btn.btn-danger.active,\n#navigation .navbar .nav li > .btn.btn-danger.disabled,\n#navigation .navbar .nav li > .btn.btn-danger[disabled] {\n  color: #ffffff;\n  background-color: #bd362f;\n  *background-color: #a9302a;\n}\n#navigation .navbar .nav li > .btn.btn-danger:active,\n#navigation .navbar .nav li > .btn.btn-danger.active {\n  background-color: #942a25 \\9;\n}\n#navigation .navbar .nav li > .btn.btn-success {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #318b20;\n  background-image: -moz-linear-gradient(top, #1b7b00, #51a351);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#1b7b00), to(#51a351));\n  background-image: -webkit-linear-gradient(top, #1b7b00, #51a351);\n  background-image: -o-linear-gradient(top, #1b7b00, #51a351);\n  background-image: linear-gradient(to bottom, #1b7b00, #51a351);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff1b7b00', endColorstr='#ff51a351', GradientType=0);\n  border-color: #51a351 #51a351 #387038;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #51a351;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n#navigation .navbar .nav li > .btn.btn-success:hover,\n#navigation .navbar .nav li > .btn.btn-success:active,\n#navigation .navbar .nav li > .btn.btn-success.active,\n#navigation .navbar .nav li > .btn.btn-success.disabled,\n#navigation .navbar .nav li > .btn.btn-success[disabled] {\n  color: #ffffff;\n  background-color: #51a351;\n  *background-color: #499249;\n}\n#navigation .navbar .nav li > .btn.btn-success:active,\n#navigation .navbar .nav li > .btn.btn-success.active {\n  background-color: #408140 \\9;\n}\n#navigation .navbar .nav li > .btn.btn-info {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #49afcd;\n  background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));\n  background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4);\n  background-image: -o-linear-gradient(top, #5bc0de, #2f96b4);\n  background-image: linear-gradient(to bottom, #5bc0de, #2f96b4);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);\n  border-color: #2f96b4 #2f96b4 #1f6377;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #2f96b4;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n#navigation .navbar .nav li > .btn.btn-info:hover,\n#navigation .navbar .nav li > .btn.btn-info:active,\n#navigation .navbar .nav li > .btn.btn-info.active,\n#navigation .navbar .nav li > .btn.btn-info.disabled,\n#navigation .navbar .nav li > .btn.btn-info[disabled] {\n  color: #ffffff;\n  background-color: #2f96b4;\n  *background-color: #2a85a0;\n}\n#navigation .navbar .nav li > .btn.btn-info:active,\n#navigation .navbar .nav li > .btn.btn-info.active {\n  background-color: #24748c \\9;\n}\n#navigation .navbar .nav li > .btn.btn-inverse {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #161616;\n  background-image: -moz-linear-gradient(top, #242424, #000000);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#242424), to(#000000));\n  background-image: -webkit-linear-gradient(top, #242424, #000000);\n  background-image: -o-linear-gradient(top, #242424, #000000);\n  background-image: linear-gradient(to bottom, #242424, #000000);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff242424', endColorstr='#ff000000', GradientType=0);\n  border-color: #000000 #000000 #000000;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #000000;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n#navigation .navbar .nav li > .btn.btn-inverse:hover,\n#navigation .navbar .nav li > .btn.btn-inverse:active,\n#navigation .navbar .nav li > .btn.btn-inverse.active,\n#navigation .navbar .nav li > .btn.btn-inverse.disabled,\n#navigation .navbar .nav li > .btn.btn-inverse[disabled] {\n  color: #ffffff;\n  background-color: #000000;\n  *background-color: #000000;\n}\n#navigation .navbar .nav li > .btn.btn-inverse:active,\n#navigation .navbar .nav li > .btn.btn-inverse.active {\n  background-color: #000000 \\9;\n}\n#navigation .navbar .nav.user-menu {\n  padding: 12px 6px;\n}\n#navigation .navbar .nav#main-menu li.home-link a {\n  margin: 0;\n  display: block;\n  text-align: center;\n  color: #55a79a;\n  font-size: 20px;\n  padding: 16px 20px;\n}\n#navigation .navbar .nav#main-menu li.home-link a:hover {\n  color: #ffffff;\n  background: transparent;\n}\n#navigation .navbar .nav#main-menu li:first-child {\n  border-left: none;\n}\n#navigation .navbar .nav#main-menu li:last-child {\n  border-right: none;\n}\n#navigation .navbar .nav#main-menu li a {\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n  -webkit-box-shadow: none;\n  -moz-box-shadow: none;\n  box-shadow: none;\n  -webkit-transition: all 0.4s ease-out;\n  -moz-transition: all 0.4s ease-out;\n  -o-transition: all 0.4s ease-out;\n  transition: all 0.4s ease-out;\n  padding: 18px 20px;\n  margin: 0;\n  font-size: 12px;\n  font-weight: bold;\n  text-transform: uppercase;\n}\n#navigation .navbar .nav#main-menu li a:focus {\n  color: #ffffff;\n}\n#navigation .navbar .nav#main-menu li a:hover,\n#navigation .navbar .nav#main-menu li.active a.menu-item,\n#navigation .navbar .nav#main-menu li.active .dropdown-toggle,\n#navigation .navbar .nav#main-menu li.open .dropdown-toggle,\n#navigation .navbar .nav#main-menu li.open.active .dropdown-toggle {\n  background-color: rgba(255, 255, 255, 0.044);\n  background-image: -moz-linear-gradient(top, rgba(255, 255, 255, 0.02), rgba(255, 255, 255, 0.08));\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(rgba(255, 255, 255, 0.02)), to(rgba(255, 255, 255, 0.08)));\n  background-image: -webkit-linear-gradient(top, rgba(255, 255, 255, 0.02), rgba(255, 255, 255, 0.08));\n  background-image: -o-linear-gradient(top, rgba(255, 255, 255, 0.02), rgba(255, 255, 255, 0.08));\n  background-image: linear-gradient(to bottom, rgba(255, 255, 255, 0.02), rgba(255, 255, 255, 0.08));\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#05ffffff', endColorstr='#14ffffff', GradientType=0);\n  color: #ffffff;\n}\n#navigation .navbar .nav#main-menu li a:hover .caret,\n#navigation .navbar .nav#main-menu li.active a.menu-item .caret,\n#navigation .navbar .nav#main-menu li.active .dropdown-toggle .caret,\n#navigation .navbar .nav#main-menu li.open .dropdown-toggle .caret,\n#navigation .navbar .nav#main-menu li.open.active .dropdown-toggle .caret {\n  border-top-color: #ffffff;\n}\n#navigation .navbar .nav#main-menu .dropdown-menu {\n  margin-top: 2px;\n  padding: 0;\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n  left: -1px;\n  border-bottom: 4px solid #55a79a;\n  min-width: 250px;\n  color: rgba(36, 36, 36, 0.8);\n}\n#navigation .navbar .nav#main-menu .dropdown-menu .divider {\n  height: 2px;\n  margin: 0;\n}\n#navigation .navbar .nav#main-menu .dropdown-menu.pull-center {\n  padding: 0;\n  left: 50%;\n  width: 220px;\n  margin-left: -110px;\n}\n#navigation .navbar .nav#main-menu .dropdown-menu.pull-center:before {\n  left: 50%;\n  top: -10px;\n  border-width: 10px;\n  margin-left: -10px;\n}\n#navigation .navbar .nav#main-menu .dropdown-menu.pull-center:after {\n  left: 49.5%;\n  top: -9px;\n  border-width: 9px;\n  margin-left: -8px;\n}\n#navigation .navbar .nav#main-menu .dropdown-menu li {\n  border-left: none;\n  border-right: none;\n}\n#navigation .navbar .nav#main-menu .dropdown-menu li a.menu-item {\n  margin: 0;\n  padding: 10px 15px;\n  font-size: 12px;\n  font-weight: normal;\n  text-transform: none;\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n  -webkit-box-shadow: 0;\n  -moz-box-shadow: 0;\n  box-shadow: 0;\n  background-color: #fafafa;\n  background-image: -moz-linear-gradient(top, #ffffff, #f3f3f3);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f3f3f3));\n  background-image: -webkit-linear-gradient(top, #ffffff, #f3f3f3);\n  background-image: -o-linear-gradient(top, #ffffff, #f3f3f3);\n  background-image: linear-gradient(to bottom, #ffffff, #f3f3f3);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff3f3f3', GradientType=0);\n  border-bottom: 1px solid #e6e6e6;\n  color: #242424;\n}\n#navigation .navbar .nav#main-menu .dropdown-menu li a.menu-item:before {\n  font-family: FontAwesome;\n  font-size: 10px;\n  color: rgba(36, 36, 36, 0.6);\n  width: 30px;\n  height: 30px;\n  content: \"\\f0da\";\n  padding-right: 10px;\n}\n#navigation .navbar .nav#main-menu .dropdown-menu li a.menu-item:hover {\n  color: rgba(36, 36, 36, 0.8);\n  border-bottom-color: #55a79a;\n  background-color: #f5f5f5;\n  background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));\n  background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);\n}\n#navigation .navbar .nav#main-menu .dropdown-menu.mega-menu {\n  padding: 10px;\n  min-width: 600px;\n}\n#navigation .navbar .nav#main-menu .dropdown-menu.mega-menu .menu-title {\n  font-weight: bold;\n  padding-bottom: 10px;\n  margin-bottom: 10px;\n  border-bottom: 2px solid #e6e6e6;\n  display: block;\n}\n#navigation .navbar .nav#main-menu .dropdown-menu.mega-menu ul {\n  margin: 0;\n  font-size: 10.5px;\n}\n#navigation .navbar .nav#main-menu .dropdown-menu.mega-menu ul span {\n  padding: 5px;\n  display: block;\n}\n#navigation .navbar .nav#main-menu .dropdown-menu.mega-menu ul a.menu-item {\n  padding: 5px;\n  font-weight: bold;\n  font-size: 11.5px;\n}\n#navigation .navbar .nav#main-menu .dropdown-menu.mega-menu ul a.menu-item:before {\n  font-size: 14px;\n}\n#navigation div.dropdown-menu,\n#navigation span.dropdown-menu {\n  padding: 10px;\n  min-width: 150px;\n  color: rgba(36, 36, 36, 0.8);\n}\n#navigation div.dropdown-menu form,\n#navigation span.dropdown-menu form {\n  margin: 0;\n}\n#navigation div.dropdown-menu form select,\n#navigation span.dropdown-menu form select,\n#navigation div.dropdown-menu form textarea,\n#navigation span.dropdown-menu form textarea,\n#navigation div.dropdown-menu form input[type=\"text\"],\n#navigation span.dropdown-menu form input[type=\"text\"],\n#navigation div.dropdown-menu form input[type=\"password\"],\n#navigation span.dropdown-menu form input[type=\"password\"],\n#navigation div.dropdown-menu form input[type=\"datetime\"],\n#navigation span.dropdown-menu form input[type=\"datetime\"],\n#navigation div.dropdown-menu form input[type=\"datetime-local\"],\n#navigation span.dropdown-menu form input[type=\"datetime-local\"],\n#navigation div.dropdown-menu form input[type=\"date\"],\n#navigation span.dropdown-menu form input[type=\"date\"],\n#navigation div.dropdown-menu form input[type=\"month\"],\n#navigation span.dropdown-menu form input[type=\"month\"],\n#navigation div.dropdown-menu form input[type=\"time\"],\n#navigation span.dropdown-menu form input[type=\"time\"],\n#navigation div.dropdown-menu form input[type=\"week\"],\n#navigation span.dropdown-menu form input[type=\"week\"],\n#navigation div.dropdown-menu form input[type=\"number\"],\n#navigation span.dropdown-menu form input[type=\"number\"],\n#navigation div.dropdown-menu form input[type=\"email\"],\n#navigation span.dropdown-menu form input[type=\"email\"],\n#navigation div.dropdown-menu form input[type=\"url\"],\n#navigation span.dropdown-menu form input[type=\"url\"],\n#navigation div.dropdown-menu form input[type=\"search\"],\n#navigation span.dropdown-menu form input[type=\"search\"],\n#navigation div.dropdown-menu form input[type=\"tel\"],\n#navigation span.dropdown-menu form input[type=\"tel\"],\n#navigation div.dropdown-menu form input[type=\"color\"],\n#navigation span.dropdown-menu form input[type=\"color\"],\n#navigation div.dropdown-menu form .uneditable-input,\n#navigation span.dropdown-menu form .uneditable-input {\n  margin-bottom: 2px;\n}\n#navigation div.dropdown-menu form select.email,\n#navigation span.dropdown-menu form select.email,\n#navigation div.dropdown-menu form textarea.email,\n#navigation span.dropdown-menu form textarea.email,\n#navigation div.dropdown-menu form input[type=\"text\"].email,\n#navigation span.dropdown-menu form input[type=\"text\"].email,\n#navigation div.dropdown-menu form input[type=\"password\"].email,\n#navigation span.dropdown-menu form input[type=\"password\"].email,\n#navigation div.dropdown-menu form input[type=\"datetime\"].email,\n#navigation span.dropdown-menu form input[type=\"datetime\"].email,\n#navigation div.dropdown-menu form input[type=\"datetime-local\"].email,\n#navigation span.dropdown-menu form input[type=\"datetime-local\"].email,\n#navigation div.dropdown-menu form input[type=\"date\"].email,\n#navigation span.dropdown-menu form input[type=\"date\"].email,\n#navigation div.dropdown-menu form input[type=\"month\"].email,\n#navigation span.dropdown-menu form input[type=\"month\"].email,\n#navigation div.dropdown-menu form input[type=\"time\"].email,\n#navigation span.dropdown-menu form input[type=\"time\"].email,\n#navigation div.dropdown-menu form input[type=\"week\"].email,\n#navigation span.dropdown-menu form input[type=\"week\"].email,\n#navigation div.dropdown-menu form input[type=\"number\"].email,\n#navigation span.dropdown-menu form input[type=\"number\"].email,\n#navigation div.dropdown-menu form input[type=\"email\"].email,\n#navigation span.dropdown-menu form input[type=\"email\"].email,\n#navigation div.dropdown-menu form input[type=\"url\"].email,\n#navigation span.dropdown-menu form input[type=\"url\"].email,\n#navigation div.dropdown-menu form input[type=\"search\"].email,\n#navigation span.dropdown-menu form input[type=\"search\"].email,\n#navigation div.dropdown-menu form input[type=\"tel\"].email,\n#navigation span.dropdown-menu form input[type=\"tel\"].email,\n#navigation div.dropdown-menu form input[type=\"color\"].email,\n#navigation span.dropdown-menu form input[type=\"color\"].email,\n#navigation div.dropdown-menu form .uneditable-input.email,\n#navigation span.dropdown-menu form .uneditable-input.email {\n  -webkit-border-radius: 2px 0 0 2px;\n  -moz-border-radius: 2px 0 0 2px;\n  border-radius: 2px 0 0 2px;\n  border-right: none;\n}\n#navigation div.dropdown-menu form select.password,\n#navigation span.dropdown-menu form select.password,\n#navigation div.dropdown-menu form textarea.password,\n#navigation span.dropdown-menu form textarea.password,\n#navigation div.dropdown-menu form input[type=\"text\"].password,\n#navigation span.dropdown-menu form input[type=\"text\"].password,\n#navigation div.dropdown-menu form input[type=\"password\"].password,\n#navigation span.dropdown-menu form input[type=\"password\"].password,\n#navigation div.dropdown-menu form input[type=\"datetime\"].password,\n#navigation span.dropdown-menu form input[type=\"datetime\"].password,\n#navigation div.dropdown-menu form input[type=\"datetime-local\"].password,\n#navigation span.dropdown-menu form input[type=\"datetime-local\"].password,\n#navigation div.dropdown-menu form input[type=\"date\"].password,\n#navigation span.dropdown-menu form input[type=\"date\"].password,\n#navigation div.dropdown-menu form input[type=\"month\"].password,\n#navigation span.dropdown-menu form input[type=\"month\"].password,\n#navigation div.dropdown-menu form input[type=\"time\"].password,\n#navigation span.dropdown-menu form input[type=\"time\"].password,\n#navigation div.dropdown-menu form input[type=\"week\"].password,\n#navigation span.dropdown-menu form input[type=\"week\"].password,\n#navigation div.dropdown-menu form input[type=\"number\"].password,\n#navigation span.dropdown-menu form input[type=\"number\"].password,\n#navigation div.dropdown-menu form input[type=\"email\"].password,\n#navigation span.dropdown-menu form input[type=\"email\"].password,\n#navigation div.dropdown-menu form input[type=\"url\"].password,\n#navigation span.dropdown-menu form input[type=\"url\"].password,\n#navigation div.dropdown-menu form input[type=\"search\"].password,\n#navigation span.dropdown-menu form input[type=\"search\"].password,\n#navigation div.dropdown-menu form input[type=\"tel\"].password,\n#navigation span.dropdown-menu form input[type=\"tel\"].password,\n#navigation div.dropdown-menu form input[type=\"color\"].password,\n#navigation span.dropdown-menu form input[type=\"color\"].password,\n#navigation div.dropdown-menu form .uneditable-input.password,\n#navigation span.dropdown-menu form .uneditable-input.password {\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n}\n#navigation div.dropdown-menu form .btn,\n#navigation span.dropdown-menu form .btn {\n  margin: 0;\n}\n#navigation div.dropdown-menu form .btn.login,\n#navigation span.dropdown-menu form .btn.login {\n  width: 60px;\n}\n#navigation div.dropdown-menu .divider,\n#navigation span.dropdown-menu .divider {\n  display: block;\n  margin-top: 5px;\n  margin-bottom: 5px;\n}\n#navigation div.dropdown-menu small,\n#navigation span.dropdown-menu small {\n  display: block;\n}\n#navigation div.dropdown-menu .signup,\n#navigation span.dropdown-menu .signup {\n  font-weight: bold;\n}\n#highlighted {\n  background-color: #f5f5f5;\n  background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));\n  background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);\n  border-bottom: 1px solid rgba(36, 36, 36, 0.2);\n  border-top: none;\n  -webkit-transition: all 0.4s ease-out;\n  -moz-transition: all 0.4s ease-out;\n  -o-transition: all 0.4s ease-out;\n  transition: all 0.4s ease-out;\n  color: #242424;\n}\n#highlighted .inner {\n  background: image('bg_diamond.png') left bottom repeat-x;\n}\n#highlighted ul.nav-pills {\n  margin: 0;\n}\n.has-navbar-fixed-top #highlighted {\n  margin-top: 150px;\n}\n#content {\n  padding: 20px 0;\n}\n#content-below {\n  padding: 10px 0;\n  border-top: 1px solid #cdcdcd;\n  background: #e6e6e6;\n}\n#footer {\n  background: #333333;\n  /*min-height: 200px;*/\n  /*padding: 20px 0;*/\n  color: rgba(255, 255, 255, 0.6);\n  border-top: 2px solid #55a79a;\n}\n#footer h3 {\n  font-size: 1.2em;\n  color: rgba(255, 255, 255, 0.8);\n  line-height: 1;\n}\n#footer a {\n  color: rgba(255, 255, 255, 0.8);\n}\n#footer .block {\n  margin-bottom: 2em;\n}\n#footer .inline {\n  display: inline-block;\n}\n#footer .contact-block p {\n  margin-bottom: 0.2em;\n}\n#footer .contact-block i {\n  padding-right: 0.5em;\n}\n#footer #toplink {\n  margin-bottom: -25px;\n  text-align: center;\n}\n#footer #toplink a:hover {\n  text-decoration: none;\n  color: #ffffff;\n}\n#footer #toplink i {\n  color: #55a79a;\n}\n#footer .subfooter {\n  border-top: 1px dotted rgba(255, 255, 255, 0.1);\n  margin-top: 1em;\n  padding-top: 1em;\n}\n#footer .container {\n  position: relative;\n}\n.social-media a {\n  text-decoration: none;\n  color: rgba(255, 255, 255, 0.8);\n  display: inline-block;\n  line-height: 36px;\n  width: 36px;\n  height: 36px;\n  background: rgba(36, 36, 36, 0.8);\n  -webkit-border-radius: 200px;\n  -moz-border-radius: 200px;\n  border-radius: 200px;\n}\n.social-media a i {\n  font-size: 20px;\n  color: #ffffff;\n  padding: 0;\n  line-height: 36px;\n  width: 36px;\n  height: 36px;\n  text-align: center;\n  margin-right: 0.2em;\n}\n.social-media a:hover {\n  text-decoration: none;\n  background: #55a79a;\n}\n.social-media a.last {\n  padding-bottom: 0;\n  border-bottom: 0;\n}\n.upsell {\n  text-align: center;\n}\n.upsell .title {\n  display: inline-block;\n  padding: 0 0.5em;\n  margin: 0;\n}\n.upsell .title small {\n  display: block;\n}\n.upsell p {\n  margin: 0;\n  padding: 0.5em 0 0 0;\n}\n.btn span {\n  display: block;\n  font-size: 12px;\n}\n.spacer {\n  font-weight: bold;\n  color: #55a79a;\n}\n.spacer.dark {\n  color: #44857b;\n}\n/* --------------------------------------------------\n * Common styles\n *-------------------------------------------------- */\na:hover img {\n  opacity: 0.8;\n  filter: alpha(opacity=80);\n}\n.block .title {\n  font-size: 18px;\n  text-transform: uppercase;\n  margin: 0 0 0.5em 0;\n  line-height: 1;\n}\n.sidebar.sidebar-right .inner {\n  border-left: 1px solid #e6e6e6;\n  padding: 20px 0 0 2em;\n}\n.sidebar.sidebar-left .inner {\n  border-right: 1px solid #e6e6e6;\n  padding: 20px 2em 0 0;\n}\n.sidebar .block {\n  margin-bottom: 2em;\n}\n.mdrs .btn-block,\n.mdrs .btn {\n  padding: 0.6em 1em;\n  font-size: 1.2em;\n}\n.intro p {\n  margin-bottom: 0;\n}\nul.inline > li:first-child {\n  padding-left: 0;\n}\n/* --------------------------------------------------\n * Homepage\n *-------------------------------------------------- */\n.flexslider-wrapper,\n.static-banner {\n  overflow: hidden;\n}\n.flexslider-wrapper .caption,\n.static-banner .caption {\n  padding: 5% 0;\n}\n.flexslider-wrapper .caption h1,\n.static-banner .caption h1,\n.flexslider-wrapper .caption h2,\n.static-banner .caption h2,\n.flexslider-wrapper .caption h3,\n.static-banner .caption h3,\n.flexslider-wrapper .caption h4,\n.static-banner .caption h4,\n.flexslider-wrapper .caption h5,\n.static-banner .caption h5,\n.flexslider-wrapper .caption p,\n.static-banner .caption p {\n  margin-top: 0;\n  font-weight: normal;\n}\n.flexslider-wrapper .caption .btn,\n.static-banner .caption .btn {\n  margin: 0;\n}\n.flexslider-wrapper .caption .inverse,\n.static-banner .caption .inverse {\n  background: #242424;\n  color: #ffffff;\n  padding: 5px;\n  display: inline-block;\n  -webkit-border-radius: 1px;\n  -moz-border-radius: 1px;\n  border-radius: 1px;\n}\n.flexslider-wrapper .caption .inverse a,\n.static-banner .caption .inverse a {\n  color: rgba(255, 255, 255, 0.9);\n}\n.flexslider-wrapper div.underlay-img,\n.static-banner div.underlay-img {\n  position: relative;\n}\n.flexslider-wrapper div.underlay-img img.underlay-img,\n.static-banner div.underlay-img img.underlay-img {\n  position: absolute;\n  top: 0;\n}\n.flexslider-wrapper div.underlay-img .caption,\n.static-banner div.underlay-img .caption {\n  z-index: 100001;\n  position: absolute;\n}\n.flexslider-wrapper .flexslider,\n.static-banner .flexslider {\n  margin: 0;\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n  border: none;\n  -webkit-box-shadow: none;\n  -moz-box-shadow: none;\n  box-shadow: none;\n  background: transparent;\n}\n.flexslider-wrapper .flex-direction-nav a,\n.static-banner .flex-direction-nav a {\n  text-indent: 0;\n  font-size: 0;\n  background: rgba(0, 0, 0, 0.4);\n  height: 40px;\n  line-height: 46px;\n  width: 40px;\n  color: #ffffff;\n  text-align: center;\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n}\n.flexslider-wrapper .flex-direction-nav a:before,\n.static-banner .flex-direction-nav a:before {\n  content: '\\f054';\n  font-family: 'FontAwesome';\n  font-size: 22px;\n}\n.flexslider-wrapper .flex-direction-nav a.flex-prev:before,\n.static-banner .flex-direction-nav a.flex-prev:before {\n  content: '\\f053';\n}\n.flexslider-wrapper .flex-direction-nav a:hover,\n.static-banner .flex-direction-nav a:hover {\n  text-decoration: none;\n}\n.flexslider-wrapper .flex-control-nav,\n.static-banner .flex-control-nav {\n  bottom: 0;\n  right: 20px;\n  width: auto;\n}\n.flexslider-wrapper .flex-control-nav li,\n.static-banner .flex-control-nav li {\n  margin: 0 3px;\n}\n.flexslider-wrapper .flex-control-nav li a,\n.static-banner .flex-control-nav li a {\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n  height: 14px;\n  width: 14px;\n  background: rgba(36, 36, 36, 0.3);\n}\n.flexslider-wrapper .flex-control-nav li a:hover,\n.static-banner .flex-control-nav li a:hover {\n  background: rgba(36, 36, 36, 0.8);\n}\n.flexslider-wrapper .flex-control-nav li a.flex-active,\n.static-banner .flex-control-nav li a.flex-active {\n  background: #55a79a;\n}\n.features .title {\n  margin-top: 10px;\n}\n.features .thumbnails li {\n  *zoom: 1;\n}\n.features .thumbnails li:before,\n.features .thumbnails li:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.features .thumbnails li:after {\n  clear: both;\n}\n.features .thumbnails li img {\n  background-color: #f4f4f4;\n  background-image: -moz-linear-gradient(top, #fafafa, #ebebeb);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fafafa), to(#ebebeb));\n  background-image: -webkit-linear-gradient(top, #fafafa, #ebebeb);\n  background-image: -o-linear-gradient(top, #fafafa, #ebebeb);\n  background-image: linear-gradient(to bottom, #fafafa, #ebebeb);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffafafa', endColorstr='#ffebebeb', GradientType=0);\n  border: 1px solid #e6e6e6;\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n}\n.features .thumbnails li img:hover {\n  background-color: #ededed;\n  background-image: -moz-linear-gradient(top, #f5f5f5, #e0e0e0);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#e0e0e0));\n  background-image: -webkit-linear-gradient(top, #f5f5f5, #e0e0e0);\n  background-image: -o-linear-gradient(top, #f5f5f5, #e0e0e0);\n  background-image: linear-gradient(to bottom, #f5f5f5, #e0e0e0);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe0e0e0', GradientType=0);\n}\n.features .thumbnails li i {\n  float: right;\n  margin: 0.5em;\n}\n.pricing-stack .well {\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n  border: 1px solid #cdcdcd;\n  padding: 10px;\n  background: #ffffff;\n  -webkit-box-shadow: 1px 1px 5px #cdcdcd;\n  -moz-box-shadow: 1px 1px 5px #cdcdcd;\n  box-shadow: 1px 1px 5px #cdcdcd;\n}\n.pricing-stack .well .title {\n  margin: 10px 0 0 0;\n  color: rgba(36, 36, 36, 0.8);\n  font-size: 22px;\n  text-shadow: 1px 1px 1px rgba(240, 240, 240, 0.8);\n  text-align: center;\n  font-weight: normal;\n  text-transform: none;\n}\n.pricing-stack .well .price {\n  margin: 1em -14px;\n  padding: 20px 0;\n  text-shadow: none;\n  color: #55a79a;\n  display: block;\n  border: 1px solid #cdcdcd;\n  background: #ffffff;\n  text-align: center;\n  font-size: 16px;\n}\n.pricing-stack .well .price .fancy {\n  font-size: 28px;\n}\n.pricing-stack .well .price .digits {\n  font-size: 32px;\n  font-weight: bold;\n}\n.pricing-stack .well ul.points li {\n  border-bottom: 1px dotted rgba(189, 189, 189, 0.8);\n  padding: 0.2em;\n}\n.pricing-stack .well .btn {\n  display: block;\n  width: 90%;\n  margin: 20px auto 0 auto;\n}\n.pricing-stack .well.active {\n  border-color: #55a79a;\n  border-width: 1px;\n  -webkit-box-shadow: 1px 2px 5px #cdcdcd;\n  -moz-box-shadow: 1px 2px 5px #cdcdcd;\n  box-shadow: 1px 2px 5px #cdcdcd;\n}\n.pricing-stack .well.active .title {\n  font-size: 28px;\n  text-transform: uppercase;\n}\n.pricing-stack .well.active .price {\n  background: #55a79a;\n  background-color: #5bab9e;\n  background-image: -moz-linear-gradient(top, #55a79a, #65b1a5);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#55a79a), to(#65b1a5));\n  background-image: -webkit-linear-gradient(top, #55a79a, #65b1a5);\n  background-image: -o-linear-gradient(top, #55a79a, #65b1a5);\n  background-image: linear-gradient(to bottom, #55a79a, #65b1a5);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff55a79a', endColorstr='#ff65b1a5', GradientType=0);\n  border-color: #55a79a;\n  color: #ffffff;\n}\n.pricing-stack .well.active .btn {\n  margin-top: 40px;\n}\n/* --------------------------------------------------\n * Features\n *-------------------------------------------------- */\n.tabbable > ul.nav-tabs li a,\nul.nav-tabs li a {\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n}\n.tabbable > ul.nav-tabs li.active a,\nul.nav-tabs li.active a,\n.tabbable > ul.nav-tabs li.active a:hover,\nul.nav-tabs li.active a:hover {\n  color: #55a79a;\n  border-top: 4px solid #55a79a;\n}\n.feature-tabs ul.nav-tabs {\n  margin-right: 0;\n}\n.feature-tabs ul.nav-tabs li a {\n  color: rgba(36, 36, 36, 0.8);\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n  font-weight: bold;\n  font-size: 18px;\n  border-left: 4px solid transparent;\n  position: relative;\n}\n.feature-tabs ul.nav-tabs li a i {\n  font-size: 22px;\n  position: absolute;\n  top: 20px;\n  right: 10px;\n  color: #e6e6e6;\n}\n.feature-tabs ul.nav-tabs li a small {\n  display: block;\n  font-weight: normal;\n}\n.feature-tabs ul.nav-tabs li a:hover i {\n  color: #55a79a;\n}\n.feature-tabs ul.nav-tabs li.active a,\n.feature-tabs ul.nav-tabs li.active a:hover {\n  border-top-width: 1px;\n  border-top-color: #e6e6e6;\n  border-left: 4px solid #55a79a;\n}\n.feature-tabs ul.nav-tabs li.active a i,\n.feature-tabs ul.nav-tabs li.active a:hover i {\n  color: #55a79a;\n}\n/* --------------------------------------------------\n * Customers\n *-------------------------------------------------- */\n.page-customers .tabbable > ul.nav-tabs li a,\n.page-customers ul.nav-tabs li a {\n  padding: 10px 30px;\n}\n.customers li a .inner-wrapper {\n  height: 140px;\n  padding: 1em;\n  border: 1px solid #d9d9d9;\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n  display: block;\n  position: relative;\n  background-color: #f7f7f7;\n  background-image: -moz-linear-gradient(top, #ffffff, #ebebeb);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#ebebeb));\n  background-image: -webkit-linear-gradient(top, #ffffff, #ebebeb);\n  background-image: -o-linear-gradient(top, #ffffff, #ebebeb);\n  background-image: linear-gradient(to bottom, #ffffff, #ebebeb);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffebebeb', GradientType=0);\n}\n.customers li a span {\n  display: block;\n}\n.customers li a .img-wrapper {\n  text-align: center;\n  height: 100px;\n  display: block;\n}\n.customers li a .img-wrapper img {\n  max-height: 80px;\n  margin: 1em auto;\n}\n.customers li a .title {\n  text-transform: none;\n  font-weight: bold;\n}\n.customers li a .description {\n  color: rgba(36, 36, 36, 0.8);\n}\n.customers li a:hover {\n  text-decoration: none;\n}\n.customers li a:hover .inner-wrapper {\n  border-color: #a6a6a6;\n}\n/* --------------------------------------------------\n * About\n *-------------------------------------------------- */\n.stats .stat {\n  font-size: 24px;\n  text-align: center;\n  color: #ffffff;\n  margin-bottom: 10px;\n}\n.stats .stat .well {\n  background-color: #44857b;\n  background-image: -webkit-gradient(radial, center center, 0, center center, 460, from(#55a79a), to(#44857b));\n  background-image: -webkit-radial-gradient(circle, #55a79a, #44857b);\n  background-image: -moz-radial-gradient(circle, #55a79a, #44857b);\n  background-image: -o-radial-gradient(circle, #55a79a, #44857b);\n  background-repeat: no-repeat;\n  padding: 20px;\n  -webkit-border-radius: 6px;\n  -moz-border-radius: 6px;\n  border-radius: 6px;\n  position: relative;\n  margin: 0 15px;\n  height: 40px;\n  line-height: 40px;\n}\n.stats .stat .well:after,\n.stats .stat .well:before {\n  top: 100%;\n  border: solid transparent;\n  content: \" \";\n  height: 0;\n  width: 0;\n  position: absolute;\n  pointer-events: none;\n}\n.stats .stat .well:after {\n  border-top-color: #55a79a;\n  border-width: 5px;\n  left: 50%;\n  margin-left: -5px;\n}\n.stats .stat .well:before {\n  border-top-color: rgba(0, 0, 0, 0.01);\n  border-width: 6px;\n  left: 50%;\n  margin-left: -6px;\n}\n.stats .stat small {\n  text-shadow: none;\n  font-size: 12px;\n  display: block;\n  color: rgba(36, 36, 36, 0.8);\n  margin: 10px 0 0 0;\n  text-transform: uppercase;\n}\n.team .media-heading {\n  margin-top: 0;\n  color: #000000;\n}\n.team p {\n  color: rgba(36, 36, 36, 0.8);\n}\n.team .role,\n.team p.role {\n  color: rgba(36, 36, 36, 0.8);\n  font-size: 16px;\n}\n.team .media-object {\n  max-width: 120px;\n}\n.section-menu ul.nav-list {\n  padding: 2em 0;\n  margin-left: 0;\n  border-right: 1px solid #e6e6e6;\n}\n.section-menu ul.nav-list li.nav-header {\n  padding-left: 5px;\n  margin: 0;\n}\n.section-menu ul.nav-list li a {\n  color: rgba(36, 36, 36, 0.7);\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n  font-weight: bold;\n  font-size: 18px;\n  border: 1px solid #e6e6e6;\n  border-top: none;\n  margin: 0 -1px 0 3px;\n  -webkit-box-shadow: 1px 1px 1px #ffffff;\n  -moz-box-shadow: 1px 1px 1px #ffffff;\n  box-shadow: 1px 1px 1px #ffffff;\n  background: #fafafa;\n  text-shadow: none;\n  padding: 8px 15px;\n  position: relative;\n}\n.section-menu ul.nav-list li a.first {\n  border-top: 1px solid #e6e6e6;\n}\n.section-menu ul.nav-list li a:hover {\n  background: #f0f0f0;\n}\n.section-menu ul.nav-list li a:hover i {\n  color: #55a79a;\n}\n.section-menu ul.nav-list li a i {\n  font-size: 22px;\n  position: absolute;\n  top: 20px;\n  right: 10px;\n  color: #e6e6e6;\n}\n.section-menu ul.nav-list li a small {\n  display: block;\n  font-weight: normal;\n  color: rgba(36, 36, 36, 0.5);\n}\n.section-menu ul.nav-list li.active > a,\n.section-menu ul.nav-list li.active > a:hover {\n  border-left: 4px solid #55a79a;\n  border-right-color: #ffffff;\n  margin: 0 -1px 0 0;\n  background: #ffffff;\n  color: rgba(36, 36, 36, 0.8);\n}\n.section-menu ul.nav-list li.active > a i,\n.section-menu ul.nav-list li.active > a:hover i {\n  color: #55a79a;\n}\n/* --------------------------------------------------\n * Blog\n *-------------------------------------------------- */\n.date-wrapper {\n  background-color: #f5f5f5;\n  background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));\n  background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);\n  border: 1px solid #c2c2c2;\n  color: #242424;\n  text-align: center;\n  margin: 0 0 1em 0;\n  padding: 2px;\n  -webkit-border-radius: 2px 2px 2px 2px;\n  -moz-border-radius: 2px 2px 2px 2px;\n  border-radius: 2px 2px 2px 2px;\n}\n.date-wrapper span {\n  font-size: 16px;\n  display: block;\n}\n.date-wrapper span.date-m {\n  padding: 2px 4px;\n  color: #ffffff;\n  background: #44857b;\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n  font-size: 12px;\n  text-transform: uppercase;\n}\n.date-wrapper span.date-d {\n  font-size: 22px;\n  line-height: 1;\n  padding: 5px 0 3px 0;\n  color: #242424;\n}\n.tags {\n  font-size: 12px;\n  text-transform: uppercase;\n}\n.tags .tag {\n  color: #55a79a;\n}\n.tags .type {\n  color: #242424;\n}\n.tag-cloud span {\n  -webkit-border-radius: 2px 2px 2px 2px;\n  -moz-border-radius: 2px 2px 2px 2px;\n  border-radius: 2px 2px 2px 2px;\n  background: #e6e6e6;\n  display: inline-block;\n  padding: 4px 8px;\n  margin: 2px 0;\n  font-size: 12px;\n  text-transform: uppercase;\n}\n.blog-roll .title,\n.blog-post .title {\n  margin: 0 0 5px 0;\n  line-height: 1;\n}\n.blog-roll .meta,\n.blog-post .meta {\n  font-size: 12px;\n  margin-bottom: 5px;\n}\n.blog-roll .hidden-phone,\n.blog-post .hidden-phone {\n  text-align: center;\n}\n.blog-roll .media,\n.blog-post .media {\n  padding-bottom: 15px;\n  border-bottom: 1px solid #e6e6e6;\n}\n.blog-roll.blog-list .media-object,\n.blog-post.blog-list .media-object {\n  float: right;\n  margin: 0 0 1em 1em;\n}\n.blog-roll.blog-list .media-object img,\n.blog-post.blog-list .media-object img {\n  max-width: 150px;\n}\n.blog-post .media-body .lead {\n  margin: 1em 0;\n  padding: 1em 0.5em;\n  border-top: 1px solid #b3b3b3;\n  border-bottom: 1px solid #b3b3b3;\n  background: #f0f0f0;\n}\n.blog-post .comments .media-body {\n  margin-top: 0;\n}\n.blog-post .comments .media-body .meta {\n  margin: 0;\n}\n/* --------------------------------------------------\n * Contact\n *-------------------------------------------------- */\n/* --------------------------------------------------\n * Misc Pages\n *-------------------------------------------------- */\n.form-wrapper {\n  margin: 0 auto;\n  border: 1px solid #e6e6e6;\n  padding: 20px;\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n  -webkit-box-shadow: 1px 1px 10px rgba(36, 36, 36, 0.2);\n  -moz-box-shadow: 1px 1px 10px rgba(36, 36, 36, 0.2);\n  box-shadow: 1px 1px 10px rgba(36, 36, 36, 0.2);\n}\n.form-wrapper.form-narrow {\n  min-width: 200px;\n  max-width: 300px;\n}\n.form-wrapper.form-medium {\n  min-width: 400px;\n  max-width: 500px;\n}\n.form-wrapper h2.title-divider,\n.form-wrapper h3.title-divider {\n  margin-top: 0;\n}\n.demos .title-divider {\n  margin-top: 2em;\n}\n.demos .demo-block,\n.demos [class*=\"span\"] {\n  background: #e6e6e6;\n  min-height: 300px;\n}\n.page-elements h3.title-divider {\n  margin-top: 2em;\n}\n.fancy {\n  font-family: 'Calligraffitti', cursive;\n  text-transform: lowercase;\n}\n.de-em {\n  font-weight: normal;\n  color: rgba(51, 51, 51, 0.8);\n}\na .de-em {\n  font-weight: normal;\n  color: rgba(85, 167, 154, 0.8);\n}\n.em {\n  font-weight: bold;\n}\n.pad-right {\n  padding-right: 0.5em;\n}\n.pad-left {\n  padding-left: 0.5em;\n}\n.pad-right-large {\n  padding-right: 1.5em;\n}\n.pad-left-large {\n  padding-left: 1.5em;\n}\n.pad-right-xlarge {\n  padding-right: 3em;\n}\n.pad-left-xlarge {\n  padding-left: 3em;\n}\nsmall img {\n  max-width: 50px;\n}\nblockquote {\n  border: none;\n  padding: 0;\n}\nblockquote p {\n  background: #e6e6e6;\n  padding: 20px;\n  -webkit-border-radius: 3px;\n  -moz-border-radius: 3px;\n  border-radius: 3px;\n  position: relative;\n}\nblockquote p:after,\nblockquote p:before {\n  top: 100%;\n  border: solid transparent;\n  content: \" \";\n  height: 0;\n  width: 0;\n  position: absolute;\n  pointer-events: none;\n}\nblockquote p:after {\n  border-top-color: #e6e6e6;\n  border-width: 10px;\n  left: 10%;\n  margin-left: -10px;\n}\nblockquote p:before {\n  border-top-color: rgba(0, 0, 0, 0.01);\n  border-width: 11px;\n  left: 10%;\n  margin-left: -11px;\n}\nblockquote small {\n  display: block;\n  padding: 12px 0 0 10px;\n}\nblockquote small:before {\n  content: '';\n}\nblockquote small img {\n  padding-right: 1em;\n}\n.inline-el {\n  display: inline-block;\n}\n.inline-el h1,\n.inline-el h2,\n.inline-el h3,\n.inline-el h4,\n.inline-el h5,\n.inline-el p {\n  margin: 0;\n}\n.well-small {\n  padding: 9px;\n}\n.well-mini {\n  padding: 5px;\n}\n.badge.badge-large,\n.label.badge-large,\n.badge.label-large,\n.label.label-large {\n  padding: 4px 8px;\n  font-size: 14px;\n}\n.badge.badge-xlarge,\n.label.badge-xlarge,\n.badge.label-xlarge,\n.label.label-xlarge {\n  padding: 8px 12px;\n  font-size: 18px;\n}\n.title-divider {\n  text-align: left;\n  margin-bottom: 1em;\n  background: #ffffff image('bg_divider.png') left center repeat-x;\n  padding: 0;\n}\n.title-divider span {\n  background: #ffffff;\n  padding-right: 0.5em;\n}\n.title-divider small {\n  display: block;\n  color: rgba(51, 51, 51, 0.6);\n}\n/* Utilities */\n.primary-colour {\n  color: #55a79a;\n}\n.primary-colour-bg {\n  background-color: #55a79a;\n}\n.primary-colour-bg-50 {\n  background-color: rgba(85, 167, 154, 0.5);\n}\n.primary-colour-bg-80 {\n  background-color: rgba(85, 167, 154, 0.8);\n}\n.white-80 {\n  color: rgba(255, 255, 255, 0.8);\n}\n.white-60 {\n  color: rgba(255, 255, 255, 0.6);\n}\n.white-40 {\n  color: rgba(255, 255, 255, 0.4);\n}\n.more-link:hover {\n  border-bottom: 3px solid #55a79a;\n  text-decoration: none;\n}\n.pull-center {\n  text-align: center;\n}\n.space-reset {\n  line-height: 1;\n  padding: 0;\n  margin: 0;\n}\n.margin-top-small {\n  margin-top: 0.5em;\n}\n.margin-top-medium {\n  margin-top: 1em;\n}\n.margin-top-large {\n  margin-top: 2em;\n}\n.bordered-top-small {\n  margin-top: 0.5em;\n  padding-top: 0.5em;\n  border-top: 1px solid rgba(204, 204, 204, 0.7);\n}\n.bordered-top-medium {\n  margin-top: 1em;\n  padding-top: 1em;\n  border-top: 1px solid rgba(204, 204, 204, 0.7);\n}\n.bordered-top-large {\n  margin-top: 2em;\n  padding-top: 2em;\n  border-top: 1px solid rgba(204, 204, 204, 0.7);\n}\n.margin-bottom-small {\n  margin-bottom: 0.5em;\n}\n.margin-bottom-medium {\n  margin-bottom: 1em;\n}\n.margin-bottom-large {\n  margin-bottom: 2em;\n}\n.bordered-bottom-small {\n  margin-bottom: 0.5em;\n  padding-bottom: 0.5em;\n  border-bottom: 1px solid rgba(204, 204, 204, 0.7);\n}\n.bordered-bottom-medium {\n  margin-bottom: 1em;\n  padding-bottom: 1em;\n  border-bottom: 1px solid rgba(204, 204, 204, 0.7);\n}\n.bordered-bottom-large {\n  margin-bottom: 2em;\n  padding-bottom: 2em;\n  border-bottom: 1px solid rgba(204, 204, 204, 0.7);\n}\nul.big-list {\n  font-size: 1.2em;\n  padding: 0;\n  margin: 0;\n}\nul.big-list li {\n  list-style: none;\n  margin: 0;\n  padding: 0.5em;\n  margin-bottom: 0.5em;\n  padding-bottom: 0.5em;\n  border-bottom: 1px solid rgba(204, 204, 204, 0.7);\n  border-color: rgba(204, 204, 204, 0.6);\n}\nul.big-list li:hover {\n  background: #ededed;\n}\n.sidebar ul.big-list {\n  font-size: 1em;\n}\n._icon-mini {\n  width: 20px;\n  height: 20px;\n  line-height: 20px;\n  font-size: 18px;\n}\n._icon-small {\n  width: 40px;\n  height: 40px;\n  line-height: 40px;\n  font-size: 24px;\n}\n._icon-medium {\n  width: 60px;\n  height: 60px;\n  line-height: 65px;\n  font-size: 40px;\n}\n._icon-large {\n  width: 80px;\n  height: 80px;\n  line-height: 85px;\n  font-size: 60px;\n}\n._icon-xlarge {\n  width: 100px;\n  height: 100px;\n  line-height: 90px;\n  font-size: 80px;\n}\n._icon-circle {\n  -webkit-border-radius: 500px;\n  -moz-border-radius: 500px;\n  border-radius: 500px;\n}\n._icon-circle-double {\n  -webkit-border-radius: 500px;\n  -moz-border-radius: 500px;\n  border-radius: 500px;\n  border: 3px solid #fdfefe;\n  box-shadow: 0 0 0 2px #55a79a;\n}\n._icon-rounded {\n  -webkit-border-radius: 6px;\n  -moz-border-radius: 6px;\n  border-radius: 6px;\n}\n._icon-primary {\n  background-color: #55a79a;\n  color: #ffffff;\n  text-align: center;\n}\n._icon-primary-50 {\n  background-color: rgba(85, 167, 154, 0.5);\n  color: #ffffff;\n  text-align: center;\n}\n._icon-primary-80 {\n  background-color: rgba(85, 167, 154, 0.8);\n  color: #ffffff;\n  text-align: center;\n}\n._icon-inverse {\n  background: #3e3e3e;\n  color: #ffffff;\n  text-align: center;\n}\n._icon-success {\n  background: #1b7b00;\n}\nbody .icon-mini,\nli .icon-mini {\n  width: 20px;\n  height: 20px;\n  line-height: 20px;\n  font-size: 18px;\n}\nbody .icon-small,\nli .icon-small {\n  width: 40px;\n  height: 40px;\n  line-height: 40px;\n  font-size: 24px;\n}\nbody .icon-medium,\nli .icon-medium {\n  width: 60px;\n  height: 60px;\n  line-height: 65px;\n  font-size: 40px;\n}\nbody .icon-large,\nli .icon-large {\n  width: 80px;\n  height: 80px;\n  line-height: 85px;\n  font-size: 60px;\n}\nbody .icon-xlarge,\nli .icon-xlarge {\n  width: 100px;\n  height: 100px;\n  line-height: 90px;\n  font-size: 80px;\n}\nbody .icon-circle,\nli .icon-circle {\n  -webkit-border-radius: 500px;\n  -moz-border-radius: 500px;\n  border-radius: 500px;\n}\nbody .icon-circle-double,\nli .icon-circle-double {\n  -webkit-border-radius: 500px;\n  -moz-border-radius: 500px;\n  border-radius: 500px;\n  border: 3px solid #fdfefe;\n  box-shadow: 0 0 0 2px #55a79a;\n}\nbody .icon-rounded,\nli .icon-rounded {\n  -webkit-border-radius: 6px;\n  -moz-border-radius: 6px;\n  border-radius: 6px;\n}\nbody .icon-primary,\nli .icon-primary {\n  background-color: #55a79a;\n  color: #ffffff;\n  text-align: center;\n}\nbody .icon-primary-50,\nli .icon-primary-50 {\n  background-color: rgba(85, 167, 154, 0.5);\n  color: #ffffff;\n  text-align: center;\n}\nbody .icon-primary-80,\nli .icon-primary-80 {\n  background-color: rgba(85, 167, 154, 0.8);\n  color: #ffffff;\n  text-align: center;\n}\nbody .icon-inverse,\nli .icon-inverse {\n  background: #3e3e3e;\n  color: #ffffff;\n  text-align: center;\n}\nbody .icon-success,\nli .icon-success {\n  background: #1b7b00;\n}\nbody .icon-mini:before,\nli .icon-mini:before,\nbody .icon-small:before,\nli .icon-small:before,\nbody .icon-medium:before,\nli .icon-medium:before,\nbody .icon-large:before,\nli .icon-large:before,\nbody .icon-xlarge:before,\nli .icon-xlarge:before,\nbody .icon-circle:before,\nli .icon-circle:before,\nbody .icon-circle-double:before,\nli .icon-circle-double:before,\nbody .icon-rounded:before,\nli .icon-rounded:before,\nbody .icon-inverse:before,\nli .icon-inverse:before,\nbody .icon-inverse-50:before,\nli .icon-inverse-50:before,\nbody .icon-inverse-80:before,\nli .icon-inverse-80:before,\nbody .icon-success:before,\nli .icon-success:before {\n  width: auto;\n  font-size: inherit;\n}\na:hover .icon-inverse,\na:hover .icon-inverse-50,\na:hover .icon-inverse-80 {\n  text-decoration: none;\n}\na:hover .icon-inverse {\n  background: #98cac2;\n}\na:hover .icon-inverse-50,\na:hover .icon-inverse-80 {\n  background: #55a79a;\n}\n.secondary-nav {\n  margin: 0;\n  padding: 0;\n}\n.secondary-nav li a {\n  margin: 0 0 1px 0;\n  padding: 8px 0.5em;\n  background: rgba(85, 167, 154, 0.05);\n  -webkit-border-radius: 3px;\n  -moz-border-radius: 3px;\n  border-radius: 3px;\n  border: 1px solid rgba(85, 167, 154, 0.1);\n}\n.secondary-nav li a i {\n  -webkit-transition: all 0.2s ease-in;\n  -moz-transition: all 0.2s ease-in;\n  -o-transition: all 0.2s ease-in;\n  transition: all 0.2s ease-in;\n  opacity: 0.6;\n  filter: alpha(opacity=60);\n}\n.secondary-nav li a:hover {\n  background: rgba(85, 167, 154, 0.1);\n}\n.secondary-nav li a:hover i {\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\n.secondary-nav li.active a {\n  background: #55a79a;\n}\n.secondary-nav li ul {\n  margin: 0 0 1px 0;\n  padding: 8px 1em;\n  border: 1px solid rgba(85, 167, 154, 0.3);\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n  background: rgba(85, 167, 154, 0.1);\n}\n.popover-title {\n  font-size: 16px;\n  font-weight: bold;\n}\n.popover-content {\n  font-size: 12px;\n  font-weight: normal;\n}\n.accordion-primary .accordion-group {\n  margin-bottom: 1px;\n  border: 1px solid rgba(85, 167, 154, 0.1);\n  -webkit-border-radius: 3px;\n  -moz-border-radius: 3px;\n  border-radius: 3px;\n  background: rgba(85, 167, 154, 0.05);\n}\n.accordion-primary .accordion-group:hover {\n  background: rgba(85, 167, 154, 0.1);\n}\n.accordion-primary .accordion-inner {\n  border-top: 1px solid rgba(85, 167, 154, 0.2);\n}\n.background-clip-fix {\n  -moz-background-clip: padding;\n  -webkit-background-clip: padding-box;\n  background-clip: padding-box;\n}\n.alert-inline {\n  display: inline-block;\n}\n@media (max-width: 979px) {\n  #navigation .header {\n    padding: 10px 0;\n  }\n  #navigation .header #header-hidden-link {\n    top: -10px;\n  }\n  #navigation .navbar .btn-navbar {\n    text-align: center;\n    display: block;\n    float: left;\n    margin: 8px;\n    color: #ffffff;\n    text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n    background-color: rgba(62, 62, 62, 0.8);\n    background-image: -moz-linear-gradient(top, rgba(62, 62, 62, 0.8), rgba(62, 62, 62, 0.8));\n    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(rgba(62, 62, 62, 0.8)), to(rgba(62, 62, 62, 0.8)));\n    background-image: -webkit-linear-gradient(top, rgba(62, 62, 62, 0.8), rgba(62, 62, 62, 0.8));\n    background-image: -o-linear-gradient(top, rgba(62, 62, 62, 0.8), rgba(62, 62, 62, 0.8));\n    background-image: linear-gradient(to bottom, rgba(62, 62, 62, 0.8), rgba(62, 62, 62, 0.8));\n    background-repeat: repeat-x;\n    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#cc3e3e3e', endColorstr='#cc3e3e3e', GradientType=0);\n    border-color: rgba(62, 62, 62, 0.8) rgba(62, 62, 62, 0.8) rgba(23, 23, 23, 0.8);\n    border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n    *background-color: rgba(62, 62, 62, 0.8);\n    /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n  \n    filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n    -webkit-border-radius: 1px;\n    -moz-border-radius: 1px;\n    border-radius: 1px;\n  }\n  #navigation .navbar .btn-navbar:hover,\n  #navigation .navbar .btn-navbar:active,\n  #navigation .navbar .btn-navbar.active,\n  #navigation .navbar .btn-navbar.disabled,\n  #navigation .navbar .btn-navbar[disabled] {\n    color: #ffffff;\n    background-color: rgba(62, 62, 62, 0.8);\n    *background-color: rgba(49, 49, 49, 0.8);\n  }\n  #navigation .navbar .btn-navbar:active,\n  #navigation .navbar .btn-navbar.active {\n    background-color: rgba(36, 36, 36, 0.8) \\9;\n  }\n  #navigation .nav-select {\n    display: block;\n  }\n  #navigation .navbar-inner {\n    padding: 0;\n    margin: 0 10px;\n    background-image: none;\n  }\n  #navigation .navbar .nav li.divider-vertical,\n  #navigation .navbar .nav li.home-link {\n    display: none;\n  }\n  #navigation .navbar .nav.user-menu {\n    margin: 0;\n    padding: 8px;\n  }\n  #navigation .navbar .nav#main-menu {\n    float: none;\n    margin: 0;\n    padding: 0;\n    -webkit-border-radius: 2px;\n    -moz-border-radius: 2px;\n    border-radius: 2px;\n  }\n  #navigation .navbar .nav#main-menu li {\n    float: none;\n    border-left: none;\n    border-right: none;\n    padding: 0;\n    margin: 0;\n    border-top: 1px solid rgba(255, 255, 255, 0.1);\n  }\n  #navigation .navbar .nav#main-menu li a,\n  #navigation .navbar .nav#main-menu li a:link,\n  #navigation .navbar .nav#main-menu li a:focus {\n    padding: 10px 20px;\n    margin: 0;\n    font-weight: normal;\n  }\n  #navigation .navbar .nav#main-menu li a .caret,\n  #navigation .navbar .nav#main-menu li a:link .caret,\n  #navigation .navbar .nav#main-menu li a:focus .caret {\n    font-family: FontAwesome;\n    float: right;\n    border: none;\n    margin: 0 -20px 0 0;\n    font-size: 16px;\n    color: #ffffff;\n    width: 30px;\n    height: 30px;\n  }\n  #navigation .navbar .nav#main-menu li a .caret:before,\n  #navigation .navbar .nav#main-menu li a:link .caret:before,\n  #navigation .navbar .nav#main-menu li a:focus .caret:before {\n    content: \"\\f054\";\n  }\n  #navigation .navbar .nav#main-menu li a:hover,\n  #navigation .navbar .nav#main-menu li.active a {\n    background: #4a4a4a;\n    color: #ffffff;\n  }\n  #navigation .navbar .nav#main-menu li.open .dropdown-toggle,\n  #navigation .navbar .nav#main-menu li.open.active .dropdown-toggle {\n    background: #434343;\n    color: #ffffff;\n  }\n  #navigation .navbar .nav#main-menu li.open .dropdown-toggle .caret:before,\n  #navigation .navbar .nav#main-menu li.open.active .dropdown-toggle .caret:before {\n    content: \"\\f078\";\n  }\n  #navigation .navbar .nav#main-menu .dropdown-menu {\n    background: none;\n    margin: 0;\n    padding: 0;\n    max-width: 100%;\n    border: none;\n    color: rgba(255, 255, 255, 0.6);\n  }\n  #navigation .navbar .nav#main-menu .dropdown-menu li {\n    margin: 0;\n    padding: 0;\n    border-top: none;\n    background: none;\n  }\n  #navigation .navbar .nav#main-menu .dropdown-menu li a,\n  #navigation .navbar .nav#main-menu .dropdown-menu li a:link,\n  #navigation .navbar .nav#main-menu .dropdown-menu li a:focus,\n  #navigation .navbar .nav#main-menu .dropdown-menu li a.menu-item {\n    padding: 5px 20px;\n    margin: 0;\n    background-color: #4d4d4d;\n    background: #525252;\n    border-bottom-color: rgba(255, 255, 255, 0.16);\n    text-transform: none;\n    color: rgba(255, 255, 255, 0.6);\n  }\n  #navigation .navbar .nav#main-menu .dropdown-menu li a:before,\n  #navigation .navbar .nav#main-menu .dropdown-menu li a:link:before,\n  #navigation .navbar .nav#main-menu .dropdown-menu li a:focus:before,\n  #navigation .navbar .nav#main-menu .dropdown-menu li a.menu-item:before {\n    font-family: FontAwesome;\n    font-size: 10px;\n    color: rgba(255, 255, 255, 0.6);\n    width: 30px;\n    height: 30px;\n    content: \"\\f0da\";\n    padding: 0 6px 0 0;\n  }\n  #navigation .navbar .nav#main-menu .dropdown-menu li a:hover,\n  #navigation .navbar .nav#main-menu .dropdown-menu li a:link:hover,\n  #navigation .navbar .nav#main-menu .dropdown-menu li a:focus:hover,\n  #navigation .navbar .nav#main-menu .dropdown-menu li a.menu-item:hover {\n    background-color: #4d4d4d;\n    background: #525252;\n    border-bottom-color: rgba(255, 255, 255, 0.16);\n    color: #ffffff;\n  }\n  #navigation .navbar .nav#main-menu .dropdown-menu.mega-menu {\n    padding: 0;\n    min-width: 100%;\n    max-width: 100%;\n  }\n  #navigation .navbar .nav#main-menu .dropdown-menu.mega-menu .menu-title {\n    display: none;\n  }\n  #navigation .navbar .nav#main-menu .dropdown-menu.mega-menu ul.row-fluid [class*=\"span\"] {\n    width: 100%;\n  }\n  #navigation .navbar .nav#main-menu .dropdown-menu.mega-menu ul span,\n  #navigation .navbar .nav#main-menu .dropdown-menu.mega-menu ul a {\n    display: none;\n  }\n  #navigation .navbar .nav#main-menu .dropdown-menu.mega-menu ul a.menu-item {\n    padding: 5px 20px;\n    font-weight: normal;\n    font-size: 11.5px;\n    display: block;\n  }\n  #navigation .navbar .nav#main-menu .dropdown-menu.mega-menu ul a.menu-item:before {\n    font-size: 14px;\n  }\n}\n@media (min-width: 980px) {\n  \n}\n@media (min-width: 1200px) {\n  \n}\n@media (max-width: 979px) {\n  #navigation {\n    margin-bottom: 1em;\n  }\n  #navigation .header #header-hidden-link {\n    right: 20px;\n  }\n  #navigation .header .social-media {\n    margin-top: 20px;\n  }\n  #navigation .header-hidden-inner,\n  #navigation .header-inner {\n    padding-left: 20px;\n    padding-right: 20px;\n  }\n  #navigation .navbar-inner {\n    -webkit-border-radius: 0;\n    -moz-border-radius: 0;\n    border-radius: 0;\n  }\n  .has-navbar-fixed-top #highlighted {\n    margin-top: auto;\n  }\n}\n@media (min-width: 768px) and (max-width: 979px) {\n  .customers li a .inner-wrapper {\n    height: 260px;\n  }\n}\n@media (max-width: 767px) {\n  body {\n    padding-left: 0;\n    padding-right: 0;\n  }\n  #navigation .header {\n    height: auto;\n  }\n  #navigation .header .slogan {\n    border: none;\n    padding: 0;\n    margin: 0;\n    float: none;\n    text-align: center;\n  }\n  #navigation .header #header-hidden-link {\n    right: 10px;\n  }\n  #navigation .header .brand,\n  #navigation .header .social-media {\n    width: auto;\n    text-align: center;\n    float: none;\n  }\n  #navigation .header .social-media {\n    margin-top: 1em;\n  }\n  #navigation div.dropdown-menu,\n  #navigation span.dropdown-menu {\n    max-width: 300px;\n  }\n  #navigation div.dropdown-menu .input-prepend input,\n  #navigation span.dropdown-menu .input-prepend input,\n  #navigation div.dropdown-menu .input-append input,\n  #navigation span.dropdown-menu .input-append input,\n  #navigation div.dropdown-menu .input-prepend input[class*=\"span\"],\n  #navigation span.dropdown-menu .input-prepend input[class*=\"span\"],\n  #navigation div.dropdown-menu .input-append input[class*=\"span\"],\n  #navigation span.dropdown-menu .input-append input[class*=\"span\"],\n  #navigation div.dropdown-menu form input[type=\"text\"].email,\n  #navigation span.dropdown-menu form input[type=\"text\"].email {\n    display: block;\n    border: 1px solid #e6e6e6;\n    -webkit-border-radius: 2px;\n    -moz-border-radius: 2px;\n    border-radius: 2px;\n  }\n  #navigation div.dropdown-menu form .btn.login,\n  #navigation span.dropdown-menu form .btn.login {\n    -webkit-border-radius: 3px;\n    -moz-border-radius: 3px;\n    border-radius: 3px;\n  }\n  #content,\n  #content-below,\n  #footer {\n    padding-left: 20px;\n    padding-right: 20px;\n  }\n  .flexslider-wrapper .caption,\n  .static-banner .caption {\n    padding: 5%;\n    text-align: center;\n  }\n  .flexslider-wrapper .flex-direction-nav,\n  .static-banner .flex-direction-nav {\n    display: none;\n  }\n  #footer .col {\n    margin-bottom: 2em;\n  }\n  #footer .pull-right {\n    float: none;\n  }\n  h1 small,\n  h2 small,\n  h3 small {\n    display: block;\n  }\n  .blog-list.blog-list-short .media-object,\n  .blog-post.blog-list-short .media-object {\n    display: none;\n  }\n  .blog-list .comments .media-object,\n  .blog-post .comments .media-object {\n    display: none;\n  }\n  .tab-content,\n  .pill-content {\n    overflow: visible;\n  }\n  .tab-content .tab-pane,\n  .pill-content .tab-pane,\n  .tab-content .pill-pane,\n  .pill-content .pill-pane {\n    display: block;\n    margin-bottom: 2em;\n  }\n  .customers li a .inner-wrapper {\n    height: auto;\n  }\n  .section-menu ul.nav-list {\n    border: none;\n    padding: 1em 0;\n  }\n  .sidebar.sidebar-right .inner,\n  .sidebar.sidebar-leftt .inner {\n    border: none;\n    padding: 20px 0 0 0;\n  }\n}\n@media (max-width: 480px) {\n  #navigation .navbar .user-menu {\n    float: right;\n  }\n  #navigation .navbar .user-menu li > a.btn {\n    padding: 4px 6px;\n  }\n  .blog-roll.blog-list .media-object,\n  .blog-post.blog-list .media-object {\n    float: none;\n    margin: 0.5em 0;\n  }\n  .blog-roll.blog-list .media-object img,\n  .blog-post.blog-list .media-object img {\n    max-width: 100%;\n  }\n  .sidebar.siderbar-right .inner,\n  .sidebar.sidebar-left .inner {\n    border: none;\n    padding-left: 0;\n    padding-right: 0;\n  }\n  .form-wrapper.form-narrow {\n    min-width: 200px;\n    max-width: 300px;\n  }\n  .form-wrapper.form-medium {\n    min-width: 200px;\n    max-width: 5300px;\n  }\n}\n"
  },
  {
    "path": "app/cells/web/admin/change_locale_link_cell.rb",
    "content": "# frozen_string_literal: true\n\nmodule Web\n  module Admin\n    # This is cell returns actual link for change current locale\n    class ChangeLocaleLinkCell < BaseCell\n      def render\n        content_tag :li, class: 'nav-item' do\n          link_to name_link, url, method: :put, class: 'nav-link'\n        end\n      end\n\n      private\n\n      def name_link\n        return :RU if locale_ru?\n\n        :EN\n      end\n\n      def locale_ru?\n        I18n.locale == :ru\n      end\n\n      def url\n        return admin_change_languages_path(locale: :en) if locale_ru?\n\n        admin_change_languages_path(locale: :ru)\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "app/cells/web/base_cell.rb",
    "content": "# frozen_string_literal: true\n\nmodule Web\n  # This base class includes view helpers\n  class BaseCell\n    include Rails.application.routes.url_helpers\n    include ActionView::Helpers::UrlHelper\n    include ActionView::Helpers::TagHelper\n    include ActionView::Context\n  end\nend\n"
  },
  {
    "path": "app/controllers/admin/base_controller.rb",
    "content": "# frozen_string_literal: true\n\nclass Admin\n  class BaseController < ApplicationController\n    before_action :allow_only_admin, :set_locale\n    layout 'admin'\n\n    private\n\n    def allow_only_admin\n      raise AdminAccessDeniedException unless admin_signed_in?\n    end\n\n    def set_locale\n      I18n.locale = current_locale\n    end\n\n    def current_locale\n      params[:locale] ||\n        session[:locale] ||\n        I18n.default_locale\n    end\n  end\nend\n"
  },
  {
    "path": "app/controllers/admin/change_languages_controller.rb",
    "content": "# frozen_string_literal: true\n\nclass Admin\n  class ChangeLanguagesController < Admin::BaseController\n    def update\n      set_session_and_redirect\n    end\n\n    private\n\n    def set_session_and_redirect\n      session[:locale] = I18n.locale\n      redirect_to :back\n    end\n  end\nend\n"
  },
  {
    "path": "app/controllers/admin/connections_controller.rb",
    "content": "# frozen_string_literal: true\n\nclass Admin::ConnectionsController < Admin::BaseController\n  def index\n    @connections = connections.order('id DESC').page params[:page]\n  end\n\n  def active\n    @connections = connections.active.order('id DESC').page params[:page]\n  end\n\n  def show\n    @connection = Connection.find(params[:id])\n  end\n\n  private\n\n  def connections\n    search.result\n  end\n\n  def search\n    Connection.search(params[:q])\n  end\n  helper_method :search\nend\n"
  },
  {
    "path": "app/controllers/admin/home_controller.rb",
    "content": "# frozen_string_literal: true\n\nclass Admin::HomeController < Admin::BaseController\n  def index\n    @dashboard = Dto::Admin::Dashboard.new\n  end\nend\n"
  },
  {
    "path": "app/controllers/admin/options_controller.rb",
    "content": "# frozen_string_literal: true\n\nclass Admin\n  class OptionsController < Admin::BaseController\n    before_action :find_option, only: %i[edit update]\n    def index\n      @options = Admin::OptionsDecorator.decorate_collection(Option.all)\n    end\n\n    def new\n      @option = Option.new\n    end\n\n    def create\n      @option = Option.new(resource_params)\n      if @option.save\n        redirect_to admin_options_path, notice: t('admin.options.notices.created')\n      else\n        render :new\n      end\n    end\n\n    def edit; end\n\n    def update\n      if @option.update(resource_params)\n        redirect_to admin_options_path, notice: t('admin.options.notices.updated')\n      else\n        render :edit\n      end\n    end\n\n    private\n\n    def find_option\n      @option = Option.find(params[:id])\n    end\n\n    def resource_params\n      params.require(:option).permit(:name, :code, :state, plan_ids: [])\n    end\n  end\nend\n"
  },
  {
    "path": "app/controllers/admin/pay_systems_controller.rb",
    "content": "# frozen_string_literal: true\n\nclass Admin::PaySystemsController < Admin::BaseController\n  before_action :load_resource, only: %i[show edit update destroy]\n\n  def index\n    @pay_systems = PaySystem.all.decorate\n  end\n\n  def show; end\n\n  def new\n    @pay_system = PaySystem.new\n  end\n\n  def create\n    @pay_system = PaySystem.new(resource_params)\n    if @pay_system.save\n      redirect_to admin_pay_systems_path, notice: 'Платежная система успешно добавлена'\n    else\n      render :new\n    end\n  end\n\n  def edit; end\n\n  def update\n    if @pay_system.update(resource_params)\n      redirect_to admin_pay_systems_path, notice: 'Платежная система успешно обновлена'\n    else\n      render :edit\n    end\n  end\n\n  private\n\n  def load_resource\n    @pay_system = PaySystem.find(params[:id])\n  end\n\n  def resource_params\n    params.require(:pay_system).permit(:name, :code, :description, :state, :currency)\n  end\nend\n"
  },
  {
    "path": "app/controllers/admin/plans_controller.rb",
    "content": "# frozen_string_literal: true\n\nclass Admin\n  class PlansController < Admin::BaseController\n    before_action :find_plan, only: %i[edit update destroy]\n    def index\n      @plans = Plan.all\n    end\n\n    def new\n      @plan = Plan.new\n    end\n\n    def create\n      @plan = Plan.new(resource_params)\n      if @plan.save\n        redirect_to admin_plans_path, notice: t('admin.plans.notices.created')\n      else\n        render :new\n      end\n    end\n\n    def edit; end\n\n    def update\n      if @plan.update(resource_params)\n        redirect_to admin_plans_path, notice: t('admin.plans.notices.updated')\n      else\n        render :edit\n      end\n    end\n\n    def destroy\n      @plan.destroy\n      redirect_to admin_plans_path, notice: t('admin.plans.notices.destroyed')\n    end\n\n    private\n\n    def find_plan\n      @plan = Plan.find(params[:id])\n    end\n\n    def resource_params\n      params.require(:plan).permit(:price, :name, :code, :description,\n                                   :enabled, :special, server_ids: [],\n                                                       option_ids: [], option_prices: option_prices_params)\n    end\n\n    def option_prices_params\n      @plan.present? ? @plan.options.active.map { |o| o.code.to_sym } : []\n    end\n  end\nend\n"
  },
  {
    "path": "app/controllers/admin/profiles_controller.rb",
    "content": "# frozen_string_literal: true\n\nclass Admin\n  class ProfilesController < Admin::BaseController\n    before_action :find_admin, only: %i[edit update]\n\n    def edit; end\n\n    def update\n      if @admin.update_with_password(admin_params)\n        bypass_sign_in(@admin)\n        redirect_to edit_admin_profile_path, notice: t('admin.profile.notices.updated')\n      else\n        render :edit\n      end\n    end\n\n    private\n\n    def find_admin\n      @admin = current_admin\n    end\n\n    def admin_params\n      params.require(:admin).permit(:password, :password_confirmation, :current_password)\n    end\n  end\nend\n"
  },
  {
    "path": "app/controllers/admin/promos_controller.rb",
    "content": "# frozen_string_literal: true\n\nclass Admin\n  class PromosController < Admin::BaseController\n    before_action :find_promo, only: %i[edit update create]\n\n    def index\n      @promos = Promo.all.page(params[:page]).decorate\n    end\n\n    def new\n      @promo = Promo.new\n    end\n\n    def create\n      @promo = Promo.new(resource_params)\n      if @promo.save\n        redirect_to edit_admin_promo_path(@promo), notice: t('admin.promos.notices.created')\n      else\n        render :new\n      end\n    end\n\n    def edit; end\n\n    def update\n      if @promo.update(resource_params)\n        redirect_to edit_admin_promo_path(@promo), notice: t('admin.promos.notices.updated')\n      else\n        render :edit\n      end\n    end\n\n    private\n\n    def find_promo\n      @promo = Promo.find(params[:id]) if params[:id]\n    end\n\n    def resource_params\n      params[:promo].permit(:name, :promo_code, :promoter_type, :type,\n                            :state, :date_from, :date_to, attrs: all_promoters_attributes)\n    end\n\n    def all_promoters_attributes\n      PromotersRepository.all.inject([]) do |attrs, promoter|\n        attrs + promoter.attributes\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "app/controllers/admin/referrers_controller.rb",
    "content": "# frozen_string_literal: true\n\nclass Admin::ReferrersController < Admin::BaseController\n  def index\n    @referrers = User.active_referrers\n  end\nend\n"
  },
  {
    "path": "app/controllers/admin/servers_controller.rb",
    "content": "# frozen_string_literal: true\n\nclass Admin\n  class ServersController < Admin::BaseController\n    before_action :load_resource, only: %i[show edit update destroy generate_config]\n\n    def index\n      @servers = Server.all\n    end\n\n    def show; end\n\n    def new\n      @server = Server.new\n    end\n\n    def create\n      @server = Server.new(resource_params)\n      if @server.save\n        redirect_to admin_servers_path, notice: t('admin.servers.notices.created')\n      else\n        render :new\n      end\n    end\n\n    def edit; end\n\n    def update\n      if @server.update(resource_params)\n        redirect_to admin_servers_path, notice: t('admin.servers.notices.updated')\n      else\n        render :edit\n      end\n    end\n\n    def destroy\n      @server.delete\n      redirect_to admin_servers_path, notice: t('admin.servers.notices.destroyed')\n    end\n\n    def generate_config\n      builder = ServerConfigBuilder.new(server: @server)\n      config_file = builder.to_text\n      send_data config_file, filename: \"#{@server.hostname}.ovpn\"\n    end\n\n    private\n\n    def load_resource\n      @server = Server.find(params[:id])\n    end\n\n    def resource_params\n      params.require(:server).permit(:hostname, :ip_address, :state,\n                                     :config, :protocol, :port, :country_code,\n                                     plan_ids: [])\n    end\n  end\nend\n"
  },
  {
    "path": "app/controllers/admin/traffic_reports_controller.rb",
    "content": "# frozen_string_literal: true\n\nclass Admin::TrafficReportsController < Admin::BaseController\n  def index; end\n\n  def users; end\n\n  def date; end\n\n  def servers; end\n\n  private\n\n  def traffic_reports\n    report.result\n  end\n  helper_method :traffic_reports\n\n  def report\n    \"#{action_name.singularize.capitalize}TrafficReport\".constantize.new(params[:traffic_report])\n  end\n  helper_method :report\nend\n"
  },
  {
    "path": "app/controllers/admin/transactions_controller.rb",
    "content": "# frozen_string_literal: true\n\nclass Admin::TransactionsController < Admin::BaseController\n  def index\n    @transactions = transactions.page(params[:page])\n  end\n\n  def payments\n    @payments = Payment.accepted.page params[:page]\n  end\n\n  def withdrawals\n    @withdrawals = Withdrawal.page params[:page]\n  end\n\n  private\n\n  def transactions\n    Kaminari.paginate_array(\n      TransactionDecorator.decorate_collection(\n        Transaction.all\n      )\n    )\n  end\nend\n"
  },
  {
    "path": "app/controllers/admin/users_controller.rb",
    "content": "# frozen_string_literal: true\n\nclass Admin\n  class UsersController < Admin::BaseController\n    before_action :find_user, only: %i[show edit update withdraw\n                                       prolongate payment enable_test_period\n                                       disable_test_period force_disconnect]\n    decorates_assigned :user\n\n    def index\n      @users = users.page params[:page]\n    end\n\n    def payers\n      @users = users.payers.page params[:page]\n    end\n\n    def this_month_payers\n      @users = users.this_month_payers.page params[:page]\n    end\n\n    def show; end\n\n    def new\n      @user = User.new\n    end\n\n    def create\n      result = ::Ops::Admin::User::Create.new(params: resource_params).call\n      if result[:success]\n        redirect_to admin_users_path, notice: t('admin.users.notices.created')\n      else\n        @user = result[:user]\n        render :new\n      end\n    end\n\n    def edit; end\n\n    def update\n      if @user.update(resource_params)\n        redirect_to admin_users_path, notice: t('admin.users.notices.updated')\n      else\n        render :edit\n      end\n    end\n\n    def withdraw\n      Withdrawer.single_withdraw(@user)\n      redirect_to admin_users_path, notice: t('admin.users.notices.write_off')\n    end\n\n    def prolongate\n      @user.withdrawals.last.withdrawal_prolongations.create!(days_number: days_number_prolongate)\n      redirect_to admin_user_path(@user), notice: t('admin.users.notices.prolongated')\n    end\n\n    def payment\n      payment = @user.payments.create!(payment_params)\n      payment.accept!\n      redirect_to admin_user_path(@user), notice: t('admin.users.notices.payment_created')\n    end\n\n    def emails_export\n      users = User.search(search_params).result\n      render text: Admin::UsersSerializer.new(users, :csv).emails\n    end\n\n    def enable_test_period\n      @user.test_period.enable!\n      UserMailer.test_period_enabled(@user).deliver_now\n      redirect_to admin_user_path(@user), notice: t('admin.users.notices.test_period_enabled')\n    end\n\n    def disable_test_period\n      @user.test_period.disable!\n      redirect_to admin_user_path(@user), notice: t('admin.users.notices.test_period_disabled')\n    end\n\n    def force_disconnect\n      ForcedDisconnect.new(@user).invoke\n      redirect_to admin_user_path(@user), notice: t('admin.users.notices.disconnected')\n    end\n\n    private\n\n    def find_user\n      @user = User.find(params[:id])\n    end\n\n    def users\n      search.result.order('id DESC')\n    end\n\n    def search\n      User.search(params[:q])\n    end\n    helper_method :search\n\n    def search_params\n      if params[:q]\n        params[:q].permit(:email_cont, :plan_id_eq, :never_paid_eq)\n      else\n        {}\n      end\n    end\n    helper_method :search_params\n\n    def payment_params\n      params.require(:payment).permit(:amount, :pay_system_id, :comment).merge!(manual_payment: true)\n    end\n\n    def resource_params\n      params\n        .require(:user)\n        .permit(:email, :plan_id, :state, :balance, :period_length, :password, :password_confirmation)\n    end\n\n    def days_number_prolongate\n      params[:withdrawal_prolongation][:days_number]\n    end\n  end\nend\n"
  },
  {
    "path": "app/controllers/admins/sessions_controller.rb",
    "content": "# frozen_string_literal: true\n\nclass Admins::SessionsController < Devise::SessionsController\n  layout 'blank'\n\n  def after_sign_out_path_for(_resource)\n    new_admin_session_path\n  end\n\n  def after_sign_in_path_for(_resource)\n    admin_root_path\n  end\n\n  def resource_params\n    params.require(:user).permit(:admin, :email, :password, :remember_me)\n  end\n\n  private :resource_params\nend\n"
  },
  {
    "path": "app/controllers/api/authentication_controller.rb",
    "content": "# frozen_string_literal: true\n\nmodule Api\n  # Provides endpoint for authentication API calls.\n  # Whenever server gets incoming connection request, it should ask\n  # billing whether it should allow client to connect.\n  #\n  # Billing checks multiple parameters, like server existence and status,\n  # if the plan allows to connect to this specific server and many more.\n  class AuthenticationController < Api::BaseController\n    before_action :valid_api_call?\n\n    def auth\n      authenticator = Authenticator.new(params[:login], params[:password], params[:hostname])\n      if authenticator.valid_credentials?\n        render status: 200, nothing: true\n      else\n        render status: 404, nothing: true\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "app/controllers/api/base_controller.rb",
    "content": "# frozen_string_literal: true\n\nmodule Api\n  class BaseController < ApplicationController\n    skip_before_action :verify_authenticity_token\n\n    private\n\n    def valid_api_call?\n      raise ApiException, 'Server not found' unless server\n      raise ApiException, 'Server not active' unless server.active?\n      raise ApiException, 'Invalid api call' unless valid_signature?\n    end\n\n    def server\n      Server.find_by(hostname: params[:hostname])\n    end\n\n    def request_ip\n      request.env['HTTP_X_FORWARDED_FOR'] || request.remote_ip\n    end\n\n    def valid_signature?\n      Server::Signature.new(server, params).valid?\n    end\n\n    def signature\n      params[:signature]\n    end\n  end\nend\n"
  },
  {
    "path": "app/controllers/api/connection_controller.rb",
    "content": "# frozen_string_literal: true\n\nmodule Api\n  # Provides an endpoint, that tracks all initiated connections to the server.\n  # The same as other for API controllers, it checks signature and server status.\n  class ConnectionController < Api::BaseController\n    before_action :valid_api_call?\n\n    def connect\n      connect_object = connector.invoke\n      # TODO: investigate if it is fixed\n      # am:serializers temporary don't work with rails 4.2\n      # render status: 200, json: connect_object, serializer: Api::ConnectSerializer\n      render status: 200, json: Api::ConnectSerializer.new(connect_object).to_json\n    end\n\n    def disconnect\n      disconnect_object = connector.invoke\n      # render status: 200, json: disconnect_object, serializer: Api::DisconnectSerializer\n      render status: 200, json: Api::DisconnectSerializer.new(disconnect_object).to_json\n    end\n\n    private\n\n    def connector\n      Connector.new(action_params)\n    end\n\n    def action_params\n      {\n        login: params[:login],\n        hostname: params[:hostname],\n        traffic_in: params[:traffic_in],\n        traffic_out: params[:traffic_out],\n        action: params[:action]\n      }\n    end\n  end\nend\n"
  },
  {
    "path": "app/controllers/api/servers_controller.rb",
    "content": "# frozen_string_literal: true\n\nmodule Api\n  # Provides an API endpoint for server activation.\n  # Whenever a new server wants to register in billing, it sends all information\n  # about itself to `activate` action.\n  # The request should be signed with billing's secret token.\n  class ServersController < Api::BaseController\n    # TODO: most probably it should be a separate service\n    def activate\n      raise ApiException, \"Server already exists: #{server}\" if server\n      raise ApiException, \"Server activation attempt with incorrect token: #{signature}\" unless valid_signature?\n\n      server = Server.create!(initialization_params)\n      server.activate!\n      render json: { auth_key: server.auth_key }.to_json\n    end\n\n    private\n\n    def initialization_params\n      # TODO: make a proper default for country code\n      params\n        .permit(\n          :server_crt, :client_crt, :client_key,\n          :port, :protocol\n        ).merge(ip_address: request_ip, country_code: :us, hostname: request_ip)\n    end\n  end\nend\n"
  },
  {
    "path": "app/controllers/application_controller.rb",
    "content": "# frozen_string_literal: true\n\nclass ApplicationController < ActionController::Base\n  # Prevent CSRF attacks by raising an exception.\n  # For APIs, you may want to use :null_session instead.\n  protect_from_forgery with: :exception\n\n  rescue_from CanCan::AccessDenied do |exception|\n    redirect_to billing_root_path, alert: exception.message\n  end\n\n  rescue_from UnauthorizedException do |exception|\n    redirect_to new_user_session_path, alert: exception.message\n  end\n\n  rescue_from AdminAccessDeniedException do |_exception|\n    redirect_to new_admin_session_path\n  end\nend\n"
  },
  {
    "path": "app/controllers/billing/base_controller.rb",
    "content": "# frozen_string_literal: true\n\nclass Billing::BaseController < ApplicationController\n  layout 'billing'\n\n  before_action :check_authorization\n\n  private\n\n  def check_authorization\n    raise UnauthorizedException, I18n.t('global.authorize_please') unless current_user\n  end\nend\n"
  },
  {
    "path": "app/controllers/billing/home_controller.rb",
    "content": "# frozen_string_literal: true\n\nclass Billing::HomeController < Billing::BaseController\n  def index\n    @transactions = transactions.page(params[:page])\n    @connected = current_user.connected?\n    @connection_server = current_user.connects.last.try(:server)\n  end\n\n  private\n\n  def transactions\n    Kaminari.paginate_array(\n      TransactionDecorator.decorate_collection(\n        Transaction.user_transactions(\n          current_user\n        )\n      )\n    )\n  end\nend\n"
  },
  {
    "path": "app/controllers/billing/merchant_controller.rb",
    "content": "# frozen_string_literal: true\n\nclass Billing::MerchantController < Billing::BaseController\n  skip_before_filter :check_authorization, :verify_authenticity_token\n  before_action :check_if_pay_system_is_enabled, only: [:result]\n\n  def success\n    redirect_to billing_root_path, notice: t('billing.payments.notices.success')\n  end\n\n  def fail\n    redirect_to billing_root_path, notice: t('billing.payments.notices.fail')\n  end\n\n  private\n\n  def check_if_pay_system_is_enabled\n    raise BillingException, 'pay system is not enabled' if payment_id.present? && payment.pay_system.disabled?\n  end\n\n  def payment\n    Payment.find(payment_id)\n  end\nend\n"
  },
  {
    "path": "app/controllers/billing/options_controller.rb",
    "content": "# frozen_string_literal: true\n\nclass Billing::OptionsController < Billing::BaseController\n  def index\n    @subscribed_user_options = current_user.user_options.order('id ASC').map(&:option)\n    @unsubscribed_user_options = current_user.plan.options.order('id ASC') - @subscribed_user_options\n  end\n\n  def create\n    if Option::Activator.run(current_user, params[:code])\n      redirect_to billing_options_path, notice: t('billing.options.notices.activated')\n    else\n      redirect_to billing_options_path, alert: t('billing.options.notices.not_activated')\n    end\n  end\n\n  def destroy\n    Option::Deactivator.run(current_user, params[:id])\n    redirect_to billing_options_path, notice: t('billing.options.notices.deactivated')\n  end\n\n  def update\n    option = current_user.user_options.find_by(option_id: params[:id])\n    option.update(attrs: params[:option_attributes])\n    render nothing: true\n  end\n\n  def toggle\n    option = current_user.user_options.find_by(option_id: params[:id])\n    option.toggle!\n    redirect_to billing_options_path, notice: t('billing.options.notices.updated')\n  end\nend\n"
  },
  {
    "path": "app/controllers/billing/payments_controller.rb",
    "content": "# frozen_string_literal: true\n\nclass Billing::PaymentsController < Billing::BaseController\n  def index\n    @pay_systems = PaySystem.enabled\n  end\n\n  def new\n    @pay_system = PaySystem.find_by_code(params[:code])\n    @payment = Payment.new(amount: default_price, pay_system_id: @pay_system.id)\n  end\n\n  def create\n    @payment = current_user.payments.create!(payment_params)\n    redirect_to merchant_billing_payment_path(@payment)\n  end\n\n  def merchant\n    @payment = current_user.payments.find(params[:id])\n    redirect_to billing_payments_path if @payment.accepted?\n  end\n\n  private\n\n  def default_price\n    Currencies::CourseConverter\n      .new(currency_from: 'usd', currency_to: @pay_system.currency, amount: current_user.plan.price)\n      .convert_amount\n      .round\n  end\n\n  def payment_params\n    params.require(:payment).permit(:amount, :pay_system_id)\n  end\nend\n"
  },
  {
    "path": "app/controllers/billing/paypal_controller.rb",
    "content": "# frozen_string_literal: true\n\nclass Billing::PaypalController < Billing::MerchantController\n  include ActiveMerchant::Billing::Integrations\n\n  def result\n    if notitication.acknowledge\n      if notification.complete? && (payment.amount == notification.amount)\n        payment.accept!\n      else\n        raise \"Failed to verify Paypal's notification, please investigate\"\n      end\n    end\n    render :nothing\n  end\n\n  private\n\n  def notitication\n    # TODO:\n    # remove this wrapper after activemerchant upgrade\n    ActiveSupport::Deprecation.silence do\n      @notification ||= Paypal::Notification.new(request.raw_post)\n    end\n  end\n\n  def payment_id\n    notitication.item_id\n  end\nend\n"
  },
  {
    "path": "app/controllers/billing/promotions_controller.rb",
    "content": "# frozen_string_literal: true\n\nclass Billing::PromotionsController < Billing::BaseController\n  def create\n    @promo = Promo.active.find_by(promo_code: params[:promotion][:promo_code])\n    if @promo\n      create_promotion\n    else\n      redirect_to edit_user_registration_path, alert: t('billing.promotions.notices.no_promos_found')\n    end\n  end\n\n  private\n\n  def create_promotion\n    promotion = current_user.promotions.new(promo_id: @promo.id)\n    if promotion.save\n      redirect_to edit_user_registration_path, notice: t('billing.promotions.notices.promotion_activated')\n    else\n      redirect_to edit_user_registration_path, alert: t('billing.promotions.notices.promotion_already_activated')\n    end\n  end\nend\n"
  },
  {
    "path": "app/controllers/billing/referrers_controller.rb",
    "content": "# frozen_string_literal: true\n\nclass Billing::ReferrersController < Billing::BaseController\n  def index\n    @referrals = current_user.referrals\n    @account = current_user.referrer_account\n    @operations = @account.operations\n  end\nend\n"
  },
  {
    "path": "app/controllers/billing/robokassa_controller.rb",
    "content": "# frozen_string_literal: true\n\n# This controller contains endpoints for Robokassa paysystem HTTP callbacks,\n# that notifies system about incoming payments.\nclass Billing::RobokassaController < Billing::MerchantController\n  include ActiveMerchant::Billing::Integrations\n\n  before_filter :create_notification\n\n  def result\n    if @notification.acknowledge\n      render text: 'Done'\n      payment.accept!\n    else\n      raise 'Invalid robokassa notification'\n    end\n  end\n\n  private\n\n  def create_notification\n    @notification = Robokassa::Notification.new(request.raw_post, secret: Settings.robokassa.secret2)\n  end\n\n  def payment_id\n    params['InvId']\n  end\nend\n"
  },
  {
    "path": "app/controllers/billing/servers_controller.rb",
    "content": "# frozen_string_literal: true\n\nmodule Billing\n  class ServersController < Billing::BaseController\n    def index\n      @servers = servers\n    end\n\n    def download_config\n      @server = servers.find(params[:id])\n      builder = ServerConfigBuilder.new(server: @server)\n      config_file = builder.to_text\n      send_data config_file, filename: \"#{@server.hostname}.ovpn\"\n    end\n\n    private\n\n    def servers\n      current_user.plan.servers.active\n    end\n  end\nend\n"
  },
  {
    "path": "app/controllers/billing/webmoney_controller.rb",
    "content": "# frozen_string_literal: true\n\n# This controller contains endpoints for Webmoney paysystem HTTP callbacks,\n# that notifies system about incoming payments.\nclass Billing::WebmoneyController < Billing::MerchantController\n  include ActiveMerchant::Billing::Integrations\n\n  before_filter :create_notification\n\n  def result\n    if @notification.key_present?\n      if @notification.recognizes?\n        if @notification.acknowledge\n          render text: 'Done'\n          payment.accept!\n        else\n          raise 'Invalid webmoney verification key'\n        end\n      else\n        raise 'Undefined transaction_item_id'\n      end\n    else\n      render text: 'YES'\n    end\n  end\n\n  def create_notification\n    @notification = Webmoney::Notification.new(request.raw_post, secret: Settings.webmoney.secret)\n  end\n\n  def payment_id\n    params['LMI_PAYMENT_NO']\n  end\nend\n"
  },
  {
    "path": "app/controllers/concerns/.keep",
    "content": ""
  },
  {
    "path": "app/controllers/main_controller.rb",
    "content": "# frozen_string_literal: true\n\nclass MainController < ApplicationController\n  def index\n    if signed_in? && current_user\n      redirect_to billing_root_path\n    else\n      redirect_to new_user_session_path\n    end\n  end\nend\n"
  },
  {
    "path": "app/controllers/referrers_controller.rb",
    "content": "# frozen_string_literal: true\n\nclass ReferrersController < ApplicationController\n  def set_referrer\n    cookies[:reflink] = reflink\n    redirect_to root_path\n  end\n\n  private\n\n  def reflink\n    params[:code]\n  end\nend\n"
  },
  {
    "path": "app/controllers/users/passwords_controller.rb",
    "content": "# frozen_string_literal: true\n\nclass Users::PasswordsController < Devise::PasswordsController\n  layout 'blank'\n\n  def after_sign_in_path_for(_resource)\n    billing_root_path\n  end\n\n  def after_sending_reset_password_instructions_path_for(_resource_name)\n    new_user_session_path\n  end\nend\n"
  },
  {
    "path": "app/controllers/users/registrations_controller.rb",
    "content": "# frozen_string_literal: true\n\nclass Users::RegistrationsController < Devise::RegistrationsController\n  before_action :add_referrer_id_to_params, only: [:create]\n  before_action :set_additional_permitted_params, only: [:create]\n  layout :resolve_layout\n\n  def after_sign_up_path_for(_resource)\n    new_user_session_path\n  end\n\n  def after_sign_out_path_for(_resource)\n    new_user_session_path\n  end\n\n  def after_inactive_sign_up_path_for(_resource)\n    new_user_session_path\n  end\n\n  private\n\n  def set_additional_permitted_params\n    devise_parameter_sanitizer.permit(:sign_up) do |u|\n      u.permit(:plan_id, :accept_agreement, :email, :password,\n               :password_confirmation, :referrer_id)\n    end\n  end\n\n  def resolve_layout\n    if %w[edit update].include?(action_name)\n      'billing'\n    else\n      'blank'\n    end\n  end\n\n  def current_referrer\n    User.where(reflink: cookies[:reflink]).last\n  end\n\n  def add_referrer_id_to_params\n    params[:user].merge!(referrer_id: current_referrer.id) if current_referrer\n  end\nend\n"
  },
  {
    "path": "app/controllers/users/sessions_controller.rb",
    "content": "# frozen_string_literal: true\n\nclass Users::SessionsController < Devise::SessionsController\n  layout 'blank'\n\n  def after_sign_out_path_for(_resource)\n    new_user_session_path\n  end\n\n  def after_sign_in_path_for(_resource)\n    flash[:alert] = nil if flash[:alert] == I18n.t('devise.failure.already_authenticated')\n    billing_root_path\n  end\n\n  def resource_params\n    params.require(:user).permit(:user, :email, :password, :remember_me)\n  end\n\n  private :resource_params\nend\n"
  },
  {
    "path": "app/decorators/admin/options_decorator.rb",
    "content": "# frozen_string_literal: true\n\nclass Admin::OptionsDecorator < Draper::Decorator\n  delegate_all\n\n  def state\n    h.content_tag :span, class: object_classes do\n      object.state\n    end\n  end\n\n  private\n\n  def object_classes\n    classes = ['state']\n    active = active? ? 'active' : 'disabled'\n    classes << active\n  end\n\n  def active?\n    object.active?\n  end\nend\n"
  },
  {
    "path": "app/decorators/option_attribute_decorator.rb",
    "content": "# frozen_string_literal: true\n\nclass OptionAttributeDecorator < Draper::Decorator\n  attr_accessor :name, :current_value\n\n  def initialize(name, values, current_value)\n    @name = name\n    @current_value = current_value\n    super(values)\n  end\n\n  def render\n    h.select_tag name, h.options_for_select(data_for_select, selected: current_value) if object[:type] == :select\n  end\n\n  private\n\n  def data_for_select\n    object[:value].map { |data| [data, data] }\n  end\nend\n"
  },
  {
    "path": "app/decorators/pay_system_decorator.rb",
    "content": "# frozen_string_literal: true\n\nclass PaySystemDecorator < Draper::Decorator\n  delegate_all\n\n  def title\n    h.link_to model.name, h.admin_pay_system_path(model)\n  end\n\n  def human_state\n    I18n.t(\"admin.pay_systems.states.#{pay_system.state}\")\n  end\nend\n"
  },
  {
    "path": "app/decorators/promo_decorator.rb",
    "content": "# frozen_string_literal: true\n\nclass PromoDecorator < Draper::Decorator\n  delegate_all\n\n  def period\n    \"#{h.human_date(model.date_from, time: false)} - #{h.human_date(model.date_to, time: false)}\"\n  end\n\n  def type\n    I18n.t(\"activerecord.attributes.promo.types.#{model.type}\")\n  end\n\n  def promoter_type\n    I18n.t(\"activerecord.attributes.promoter.types.#{model.promoter_type}\")\n  end\n\n  def state\n    h.content_tag :span, class: state_class do\n      I18n.t(\"activerecord.attributes.promo.states.#{model.state}\")\n    end\n  end\n\n  private\n\n  def state_class\n    model.active? ? 'green' : 'red'\n  end\nend\n"
  },
  {
    "path": "app/decorators/transaction_decorator.rb",
    "content": "# frozen_string_literal: true\n\nclass TransactionDecorator < Draper::Decorator\n  delegate :id\n\n  def amount\n    amount_with_sign\n  end\n\n  def date\n    h.human_date(model.created_at)\n  end\n\n  def description\n    if payment?\n      h.t('transaction.descriptions.payment', pay_system_name: model.object.pay_system.name)\n    elsif withdrawal?\n      h.t('transaction.descriptions.withdrawal', plan_name: model.object.plan.name)\n    end\n  end\n\n  def user\n    h.link_to transaction_user.email, h.admin_user_path(transaction_user.id)\n  end\n\n  private\n\n  def amount_with_sign\n    if payment?\n      positive_amount\n    elsif free_payment?\n      free_amount\n    elsif withdrawal?\n      negative_amount\n    end\n  end\n\n  def payment?\n    model.object.is_a? Payment\n  end\n\n  def withdrawal?\n    model.object.is_a? Withdrawal\n  end\n\n  def free_payment?\n    withdrawal? && model.amount.zero?\n  end\n\n  def positive_amount\n    h.content_tag :span, class: 'green bold' do\n      \"+#{amount_with_currency}\"\n    end\n  end\n\n  def negative_amount\n    h.content_tag :span, class: 'red bold' do\n      \"-#{amount_with_currency}\"\n    end\n  end\n\n  def amount_with_currency\n    (h.human_price model.amount).to_s\n  end\n\n  def free_amount\n    h.content_tag :span, class: 'orange bold' do\n      h.t('global.free')\n    end\n  end\n\n  def transaction_user\n    model.object.user\n  end\nend\n"
  },
  {
    "path": "app/decorators/user_decorator.rb",
    "content": "# frozen_string_literal: true\n\nclass UserDecorator < Draper::Decorator\n  delegate_all\n\n  def connection_status\n    if model.connected?\n      last_connect_details\n    else\n      h.t('admin.users.not_connected')\n    end\n  end\n\n  def current_interval_payment_status\n    if model.paid?\n      h.human_date(model.withdrawals.last.created_at)\n    else\n      h.t('admin.users.not_paid')\n    end\n  end\n\n  def options\n    model.options.map(&:name)\n  end\n\n  def promotions\n    model.promotions.map { |promotion| promotion.promo.name }\n  end\n\n  private\n\n  def last_connect_details\n    h.link_to h.admin_connection_path(model.last_connect) do\n      h.t('admin.users.connected_to_server_at',\n          server: model.last_connect.server.hostname,\n          date: h.human_date(model.last_connect.created_at))\n    end\n  end\nend\n"
  },
  {
    "path": "app/exceptions/api_exception.rb",
    "content": "# frozen_string_literal: true\n\nclass ApiException < RuntimeError; end\n"
  },
  {
    "path": "app/helpers/admin_helper.rb",
    "content": "# frozen_string_literal: true\n\nmodule AdminHelper\n  def menu_item(title, path, fa_icon)\n    content_tag :li, class: 'nav-item' do\n      link_to path, class: 'nav-link' do\n        content_tag(:i, '', class: \"fa fa-lg fa-fw fa-#{fa_icon}\") +\n          content_tag(:span, title, class: 'pl-3')\n      end\n    end\n  end\n\n  def menu_item_with_sub(title, path, fa_icon)\n    sub_menu = if block_given?\n                 content_tag :ul, id: path[1..-1], class: 'collapse list-unstyled ml-3' do\n                   yield\n                 end\n               end\n    content_tag :li, class: 'nav-item' do\n      link_to path, class: 'nav-link dropdown-toggle', 'data-toggle': 'collapse', 'aria-expanded': 'false' do\n        concat content_tag(:i, '', class: \"fa fa-lg fa-fw fa-#{fa_icon}\")\n        concat content_tag(:span, title, class: 'pl-3')\n      end.concat(sub_menu)\n    end\n  end\n\n  def sub_menu_item(title, path)\n    content_tag :li, class: 'nav-item pl-4' do\n      link_to title, path, class: 'nav-link'\n    end\n  end\n\n  def page_title(section, icon, path, &block)\n    sub_title = block_given? ? capture(&block) : ''\n    content_tag :h3 do\n      concat content_tag(:i, '', class: \"fa-fw fa fa-#{icon}\")\n      concat link_to(section, public_send(\"admin_#{path}_path\"), class: 'mx-2 text-dark')\n      concat sub_title\n    end\n  end\n\n  def sub_page_title(title)\n    content_tag(:span, \"> #{title}\")\n  end\n\n  def human_connection(type)\n    if type == 'Connect'\n      content_tag :span, class: 'green' do\n        'Подключение'\n      end\n    else\n      content_tag :span, class: 'red' do\n        'Отключение'\n      end\n    end\n  end\n\n  def human_traffic(traffic)\n    \"#{bytes_to_gigabytes traffic} GB\"\n  end\n\n  def bytes_to_gigabytes(traffic)\n    BytesConverter.prettify_float(BytesConverter.bytes_to_gigabytes(traffic))\n  end\n\n  def descrete_statistic_values(sequence)\n    sequence.to_s.delete('[').delete(']')\n  end\n\n  def human_course(course)\n    course.round(4)\n  end\n\n  def can_be_prolongated?(user)\n    user.paid?\n  end\n\n  def object_states_select_collection(class_name)\n    class_name.aasm.states.map do |s|\n      [s.name.capitalize, s.name]\n    end\n  end\n\n  def background_highlight(user)\n    user.confirmed? ? 'confirmed' : 'not-confirmed'\n  end\n\n  def check_box_search(name)\n    if params[:q] && params[:q][name]\n      check_box_tag 'q[never_paid_eq]', params[:q][:never_paid_eq], params[:q][:never_paid_eq] == '1'\n    else\n      check_box_tag 'q[never_paid_eq]'\n    end\n  end\n\n  def change_locale_link\n    Web::Admin::ChangeLocaleLinkCell.new.render\n  end\nend\n"
  },
  {
    "path": "app/helpers/application_helper.rb",
    "content": "# frozen_string_literal: true\n\nmodule ApplicationHelper\n  def human_date(date, options = { time: true })\n    format = options[:time] ? '%d.%m.%Y %H:%M' : '%d.%m.%Y'\n    date&.strftime(format)\n  end\n\n  def human_price(price)\n    human_usd_amount(price)\n  end\n\n  def human_usd_amount(price)\n    \"#{prettify_number(price)} USD\"\n  end\n\n  def prettify_number(number)\n    tokens = number.to_s.split('.')\n    if tokens[1] == '0'\n      tokens[0]\n    else\n      number&.round(2)\n    end\n  end\nend\n"
  },
  {
    "path": "app/helpers/main_helper.rb",
    "content": "# frozen_string_literal: true\n\nmodule MainHelper\n  def was_connected?\n    current_user.last_connect\n  end\n\n  def enabled_options\n    current_user.promotions.with_active_promos.map { |promotion| promotion.promo.name }.join(',')\n  end\nend\n"
  },
  {
    "path": "app/helpers/options_helper.rb",
    "content": "# frozen_string_literal: true\n\nmodule OptionsHelper\n  # TODO:\n  # refactor this helper to decorator\n\n  def plans_option_price(plan, option_code)\n    plan.option_prices[option_code].to_f if !plan.option_prices.nil? && plan.option_prices.any?\n  end\n\n  def subscribe_option_button(option)\n    option_button_to(option, billing_options_path(code: option.code), :post,\n                     title: t('billing.options.activate'),\n                     confirm: t('billing.options.confirms.activate'),\n                     class: 'btn-success')\n  end\n\n  def unsubscribe_option_button(option)\n    option_button_to(option, billing_option_path(option), :delete,\n                     title: t('billing.options.deactivate'),\n                     confirm: t('billing.options.confirms.deactivate'),\n                     class: 'btn-danger')\n  end\n\n  def option_toggle_button(option)\n    button_to toggle_state_title(option), toggle_billing_option_path(option), method: :put, class: 'btn primary'\n  end\n\n  def toggle_state_title(option)\n    enabled_option?(option) ? t('billing.options.states.enable') : t('billing.options.states.disable')\n  end\n\n  def enabled_option?(option)\n    current_user.user_options.find_by(option_id: option.id).try(:enabled?)\n  end\n\n  def option_attribute(name, attribute_hash, current_value)\n    OptionAttributeDecorator.new(name, attribute_hash, current_value).render\n  end\n\n  def option_button_to(_option, url, method, options = {})\n    form_tag url, method: method, html: { class: 'button_to' } do\n      concat submit_tag(options[:title], class: \"btn #{options[:class]}\", data: { confirm: options[:confirm] })\n    end\n  end\n\n  def option_settings(option)\n    form_tag billing_option_path(option), method: :put, remote: true do\n      option.tunable_attributes.each do |name, attribute|\n        concat option_attribute(\"option_attributes[#{name}]\", attribute, current_attribute_value(option, name))\n      end\n    end\n  end\n\n  def current_attribute_value(option, name)\n    user_option = option.user_options.where(user_id: current_user.id).last\n    user_option ? user_option.attrs[name.to_s] : nil\n  end\nend\n"
  },
  {
    "path": "app/helpers/promos_helper.rb",
    "content": "# frozen_string_literal: true\n\nmodule PromosHelper\n  def promo_types\n    select_options(Promo::TYPES.map do |type|\n      [t(\"activerecord.attributes.promo.types.#{type}\"), type]\n    end)\n  end\n\n  def promoter_types\n    select_options(PromotersRepository.types.map do |type|\n      [t(\"activerecord.attributes.promoter.types.#{type}\"), type]\n    end)\n  end\n\n  def select_options(options)\n    { as: :select, collection: options, include_blank: false }\n  end\nend\n"
  },
  {
    "path": "app/helpers/servers_helper.rb",
    "content": "# frozen_string_literal: true\n\nmodule ServersHelper\n  def server_country_name(server)\n    server.country_code\n  end\n\n  def countries_for_select\n    JSON.parse(File.read('config/countries.json'))['ru'].map do |code, name|\n      [code, name]\n    end\n  end\nend\n"
  },
  {
    "path": "app/inputs/datepicker_input.rb",
    "content": "# frozen_string_literal: true\n\nclass DatepickerInput < SimpleForm::Inputs::Base\n  def input\n    @builder.text_field(attribute_name, input_html_options) + \\\n      @builder.hidden_field(attribute_name, class: attribute_name.to_s + '-alt')\n  end\nend\n"
  },
  {
    "path": "app/mailers/user_connection_config_mailer.rb",
    "content": "# frozen_string_literal: true\n\nclass UserConnectionConfigMailer < ActionMailer::Base\n  default from: ENV['EMAIL_FROM']\n\n  def notify(user:)\n    @user = user\n    attachments[\"#{server.hostname}.ovpn\"] = server_config\n    mail(to: @user.email, subject: t('mailers.user_connection_config_mailer.subject'))\n  end\n\n  private\n\n  def server_config\n    @server_config ||= ServerConfigBuilder.new(server: server).to_text\n  end\n\n  def server\n    @server ||= @user.plan.servers.last\n  end\nend\n"
  },
  {
    "path": "app/mailers/user_mailer.rb",
    "content": "# frozen_string_literal: true\n\nclass UserMailer < ActionMailer::Base\n  add_template_helper(ApplicationHelper)\n  default from: ENV['EMAIL_FROM']\n\n  def funds_recieved(user, amount)\n    @user = user\n    @amount = amount\n    mail(to: user.email, subject: I18n.t('user_mailer.funds_recieved.subject'))\n  end\n\n  def balance_withdrawal(user, amount)\n    @user = user\n    @amount = amount\n    mail(to: user.email, subject: I18n.t('user_mailer.balance_withdrawal.subject'))\n  end\n\n  def could_not_withdraw_funds(user, amount)\n    @user = user\n    @amount = amount\n    mail(to: user.email, subject: I18n.t('user_mailer.could_not_withdraw_funds.subject'))\n  end\n\n  def test_period_enabled(user)\n    @user = user\n    mail(to: user.email, subject: I18n.t('user_mailer.test_period_enabled.subject'))\n  end\n\n  # Sent on 3rd unsuccessful withdrawal\n  # if user doesn't have previous successful withdrawals\n  def unpaid_user_notification(user)\n    mail(to: user.email, subject: I18n.t('user_mailer.unpaid_user_notification.subject'))\n  end\nend\n"
  },
  {
    "path": "app/models/ability.rb",
    "content": "# frozen_string_literal: true\n\nclass Ability\n  include CanCan::Ability\n\n  def initialize(user)\n    user ||= User.new\n\n    if user.is_a?(Admin)\n      can :manage, :all\n    elsif user.is_a?(User)\n      can :read, Post\n    end\n  end\nend\n"
  },
  {
    "path": "app/models/admin.rb",
    "content": "# frozen_string_literal: true\n\nclass Admin < ActiveRecord::Base\n  devise :database_authenticatable, :timeoutable, :validatable, timeout_in: 7.days\nend\n\n# == Schema Information\n#\n# Table name: admins\n#\n#  id                 :integer          not null, primary key\n#  email              :string(255)\n#  encrypted_password :string(255)\n#  created_at         :datetime\n#  updated_at         :datetime\n#\n"
  },
  {
    "path": "app/models/authenticator.rb",
    "content": "# frozen_string_literal: true\n\nclass Authenticator\n  def initialize(login, password, hostname)\n    @login = login\n    @password = password\n    @hostname = hostname\n    @server = Server.find_by(hostname: hostname)\n    @user = find_user\n  end\n\n  def valid_credentials?\n    user_active? && valid_password? && not_connected_yet? && vpn_enabled? && server_belongs_to_users_plan?\n  end\n\n  private\n\n  def find_user\n    User.find_by(vpn_login: @login) || User.find_by(email: @login)\n  end\n\n  def user_active?\n    @user.active?\n  end\n\n  def vpn_enabled?\n    @user.service_enabled? || test_period_active?\n  end\n\n  def test_period_active?\n    @user.test_period.enabled? && (Date.current <= @user.test_period.test_period_until)\n  end\n\n  def valid_password?\n    vpn_credentials_valid? || billing_credentials_valid?\n  end\n\n  def billing_credentials_valid?\n    @user.valid_password?(@password)\n  end\n\n  def vpn_credentials_valid?\n    @user.vpn_password == @password\n  end\n\n  def not_connected_yet?\n    !@user.connected?\n  end\n\n  def server_belongs_to_users_plan?\n    @user.plan.servers.map(&:hostname).include?(@hostname)\n  end\nend\n"
  },
  {
    "path": "app/models/concerns/.keep",
    "content": ""
  },
  {
    "path": "app/models/concerns/last_days_filterable.rb",
    "content": "# frozen_string_literal: true\n\nmodule LastDaysFilterable\n  extend ActiveSupport::Concern\n\n  included do\n    def self.in_days(number_of_days)\n      from_at = number_of_days.days.ago.beginning_of_day\n      to_at = Time.current.tomorrow.end_of_day\n\n      where(created_at: [from_at..to_at])\n    end\n  end\nend\n"
  },
  {
    "path": "app/models/connection.rb",
    "content": "# frozen_string_literal: true\n\nclass Connection < ActiveRecord::Base\n  belongs_to :user\n  belongs_to :server\n\n  delegate :hostname, to: :server\n\n  def self.active\n    ids = ActiveRecord::Base.connection.execute(\"\n      SELECT id\n      FROM connections AS c\n      WHERE type='Connect'\n        AND NOT EXISTS (\n          SELECT 1\n          FROM connections AS d\n          WHERE\n            type='Disconnect'\n            AND c.user_id=d.user_id\n            AND c.created_at < d.created_at\n        );\n    \").values.flatten\n    where(id: ids)\n  end\nend\n\n# == Schema Information\n#\n# Table name: connections\n#\n#  id          :integer          not null, primary key\n#  user_id     :integer\n#  server_id   :integer\n#  traffic_in  :float\n#  traffic_out :float\n#  type        :string(255)\n#  created_at  :datetime\n#  updated_at  :datetime\n#\n"
  },
  {
    "path": "app/models/connections/connect.rb",
    "content": "# frozen_string_literal: true\n\nclass Connect < Connection\nend\n\n# == Schema Information\n#\n# Table name: connections\n#\n#  id          :integer          not null, primary key\n#  user_id     :integer\n#  server_id   :integer\n#  traffic_in  :float\n#  traffic_out :float\n#  type        :string(255)\n#  created_at  :datetime\n#  updated_at  :datetime\n#\n"
  },
  {
    "path": "app/models/connections/disconnect.rb",
    "content": "# frozen_string_literal: true\n\nclass Disconnect < Connection\n  include LastDaysFilterable\n\n  validates :traffic_in, :traffic_out, presence: true\nend\n\n# == Schema Information\n#\n# Table name: connections\n#\n#  id          :integer          not null, primary key\n#  user_id     :integer\n#  server_id   :integer\n#  traffic_in  :float\n#  traffic_out :float\n#  type        :string(255)\n#  created_at  :datetime\n#  updated_at  :datetime\n#\n"
  },
  {
    "path": "app/models/connector.rb",
    "content": "# frozen_string_literal: true\n\nclass Connector\n  attr_reader :user, :server\n\n  def self.connected?(user)\n    (has_previous_connects?(user) && connected_now?(user)) || first_time_connected?(user)\n  end\n\n  def self.first_time_connected?(user)\n    user.disconnects.last.nil? && user.connects.last\n  end\n\n  def self.has_previous_connects?(user)\n    user.connects.last && user.disconnects.last\n  end\n\n  def self.connected_now?(user)\n    user.connects.last.created_at > user.disconnects.last.created_at\n  end\n\n  def initialize(opts)\n    @options = opts\n    @user = find_user\n    @server = Server.find_by(hostname: opts[:hostname])\n    @action = opts[:action]\n    @traffic_in = opts[:traffic_in]\n    @traffic_out = opts[:traffic_out]\n  end\n\n  def invoke\n    if connect?\n      connect!\n    else\n      disconnect!\n    end\n  end\n\n  private\n\n  def find_user\n    User.find_by(vpn_login: @options[:login]) || User.find_by(email: @options[:login])\n  end\n\n  def connect?\n    @action == 'connect'\n  end\n\n  # TODO:\n  # refactor this, extract invoke_hook(:hook_name) method\n  def connect!\n    payload = {}\n    user.options.active.each do |option|\n      hook = option.hook(@user)\n      payload[option.code] = hook ? hook.connect : {}\n    end\n    user.connects.create!(server_id: server.id, option_attributes: payload)\n  end\n\n  def disconnect!\n    payload = {}\n    user.options.active.each do |option|\n      hook = option.hook(@user)\n      payload[option.code] = hook ? hook.disconnect : {}\n    end\n    user.disconnects\n        .create!(server_id: server.id,\n                 option_attributes: payload,\n                 traffic_in: @traffic_in,\n                 traffic_out: @traffic_out)\n  end\nend\n"
  },
  {
    "path": "app/models/option.rb",
    "content": "# frozen_string_literal: true\n\nclass Option < ActiveRecord::Base\n  include AASM\n\n  validates :name, :code, presence: true\n\n  has_and_belongs_to_many :plans\n  has_many :user_options\n  has_many :users, through: :user_options\n\n  scope :active, -> { where(state: 'active') }\n\n  aasm column: :state do\n    state :disabled, initial: true\n    state :active\n\n    event :activate do\n      transitions from: :disabled, to: :active\n    end\n\n    event :disable do\n      transitions from: :active, to: :disabled\n    end\n  end\n\n  def tunable_attributes\n    klass = \"Options::Attributes::#{code.capitalize}\".constantize\n    klass.new.attributes\n  rescue NameError\n    {}\n  end\n\n  def default_attributes\n    klass = \"Options::Attributes::#{code.capitalize}\".constantize\n    klass.new.default\n  rescue NameError\n    {}\n  end\n\n  def hook(user)\n    klass = \"Options::Hooks::#{code.capitalize}\".constantize\n    klass.new(user, self)\n  rescue NameError\n    nil\n  end\nend\n"
  },
  {
    "path": "app/models/options/attributes/proxy.rb",
    "content": "# frozen_string_literal: true\n\nmodule Options\n  module Attributes\n    class Proxy\n      def initialize\n        @countries = ::Proxy::Node.select(:country).distinct.map(&:country)\n      end\n\n      def attributes\n        {\n          country: { type: :select, value: @countries }\n        }\n      end\n\n      def default\n        {\n          country: @countries.first\n        }\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "app/models/options/hooks/proxy.rb",
    "content": "# frozen_string_literal: true\n\nmodule Options\n  module Hooks\n    class Proxy\n      attr_accessor :user, :option\n\n      def initialize(user, option)\n        @user = user\n        @option = option\n      end\n\n      def connect\n        proxy = ::Proxy::Rater.new(user, option).find_best\n        proxy.connects.create!(user: user)\n        { host: proxy.host, port: proxy.port }\n      end\n\n      def disconnect\n        proxy_connect = ::Proxy::Connect.find_by(user_id: user.id)\n        proxy = proxy_connect.proxy\n        proxy_connect.delete\n        { host: proxy.host, port: proxy.port }\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "app/models/pay_system.rb",
    "content": "# frozen_string_literal: true\n\nclass PaySystem < ActiveRecord::Base\n  include AASM\n\n  CURRENCIES = %w[usd rub eur].freeze\n\n  has_many :payments\n  validates :name, :code, presence: true\n  scope :enabled, -> { where(state: :enabled) }\n\n  aasm column: :state do\n    state :disabled, initial: true\n    state :enabled\n\n    event :enable do\n      transitions from: :disabled, to: :enabled\n    end\n\n    event :disable do\n      transitions from: :enabled, to: :disabled\n    end\n  end\nend\n\n# == Schema Information\n#\n# Table name: pay_systems\n#\n#  id          :integer          not null, primary key\n#  name        :string(255)\n#  code        :string(255)\n#  created_at  :datetime\n#  updated_at  :datetime\n#  description :text\n#  state       :string(255)\n#  currency    :string(255)      default(\"usd\")\n#\n"
  },
  {
    "path": "app/models/payment.rb",
    "content": "# frozen_string_literal: true\n\nclass Payment < ActiveRecord::Base\n  include AASM\n  include LastDaysFilterable\n\n  belongs_to :user\n  belongs_to :pay_system\n\n  validates :user_id, :amount, presence: true\n\n  before_create :convert_and_save_usd_amount\n\n  scope :accepted, -> { where(state: 'accepted') }\n  scope :in_current_month, -> { where(created_at: [Time.current.beginning_of_month..Time.current.end_of_month]) }\n\n  aasm column: :state do\n    state :pending, initial: true\n    state :accepted\n\n    event :accept do\n      transitions from: :pending, to: :accepted, after: %i[increase_balance try_to_withdraw_funds]\n    end\n  end\n\n  private\n\n  def convert_and_save_usd_amount\n    return self.usd_amount = amount if pay_system.currency == 'usd'\n\n    converter = Currencies::CourseConverter.new(currency_from: pay_system.currency, currency_to: 'usd', amount: amount)\n    self.usd_amount = converter.convert_amount\n  end\n\n  def increase_balance\n    user.increase_balance usd_amount\n  end\n\n  def try_to_withdraw_funds\n    Withdrawer.single_withdraw(user)\n  end\nend\n\n# == Schema Information\n#\n# Table name: payments\n#\n#  id            :integer          not null, primary key\n#  user_id       :integer\n#  amount        :decimal(, )\n#  pay_system_id :integer\n#  state         :string(255)\n#  created_at    :datetime\n#  updated_at    :datetime\n#  usd_amount    :decimal(12, 2)\n#\n"
  },
  {
    "path": "app/models/plan.rb",
    "content": "# frozen_string_literal: true\n\nclass Plan < ActiveRecord::Base\n  validates :price, :name, :code, :description, presence: true\n  has_many :users\n\n  has_many :included_servers, class_name: 'PlanHasServer'\n  has_many :servers, through: :included_servers\n  has_and_belongs_to_many :options\n\n  scope :regular, -> { where.not(special: true) }\n  scope :enabled, -> { where(enabled: true) }\n\n  def regular?\n    !special\n  end\n\n  def to_s\n    name\n  end\n\n  def option_price(option_code)\n    option_prices[option_code].to_i\n  end\nend\n\n# == Schema Information\n#\n# Table name: plans\n#\n#  id          :integer          not null, primary key\n#  name        :string(255)\n#  price       :decimal(, )\n#  description :text\n#  code        :string(255)\n#  created_at  :datetime\n#  updated_at  :datetime\n#  special     :boolean          default(FALSE)\n#  enabled     :boolean          default(FALSE)\n#\n"
  },
  {
    "path": "app/models/plan_has_server.rb",
    "content": "# frozen_string_literal: true\n\nclass PlanHasServer < ActiveRecord::Base\n  belongs_to :plan\n  belongs_to :server\nend\n\n# == Schema Information\n#\n# Table name: plan_has_servers\n#\n#  id         :integer          not null, primary key\n#  server_id  :integer\n#  plan_id    :integer\n#  created_at :datetime\n#  updated_at :datetime\n#\n"
  },
  {
    "path": "app/models/promo.rb",
    "content": "# frozen_string_literal: true\n\nclass Promo < ActiveRecord::Base\n  include AASM\n\n  TYPES = ['withdrawal'].freeze\n  self.inheritance_column = 'sti_type'\n\n  validates :name, :type, :promoter_type, presence: true\n\n  scope :withdrawal, -> { where(type: 'withdrawal') }\n  scope :active, lambda {\n    where(\"state='active' AND ? BETWEEN date_from AND date_to\", Date.current)\n  }\n\n  aasm column: :state do\n    state :pending, initial: true\n    state :active\n\n    event :start do\n      transitions from: :pending, to: :active\n    end\n\n    event :stop do\n      transitions from: :active, to: :pending\n    end\n  end\n\n  def promoter\n    PromotersRepository.find_by_type(promoter_type)\n  end\nend\n\n# == Schema Information\n#\n# Table name: promos\n#\n#  id            :integer          not null, primary key\n#  name          :string(255)\n#  type          :string(255)\n#  date_from     :date\n#  date_to       :date\n#  promoter_type :string(255)\n#  promo_code    :string(255)\n#  created_at    :datetime\n#  updated_at    :datetime\n#  attrs         :hstore           default({})\n#  state         :string(255)\n#\n"
  },
  {
    "path": "app/models/promoter.rb",
    "content": "# frozen_string_literal: true\n\nclass Promoter\n  class << self\n    def type\n      raise 'Implement it in child class'\n    end\n\n    def apply(_promo, _base_value)\n      raise 'Implement it in child class'\n    end\n\n    def attributes\n      []\n    end\n  end\nend\n"
  },
  {
    "path": "app/models/promoters/discount_promoter.rb",
    "content": "# frozen_string_literal: true\n\nclass DiscountPromoter < Promoter\n  class << self\n    def type\n      'discount'\n    end\n\n    def apply(promo, base_value)\n      # TODO:\n      # сделать аналог attributable на серверисте\n      # то есть декларативно делаем в промоутере attribute :percent, Integer\n      # это определяет геттеры для него\n      # и автоматическое приведение типа\n      # геттеры уже проксируют в promo запрос\n      percent = promo.attrs['discount_percent'].to_i\n      base_value * (1 - (percent / 100.0))\n    end\n\n    def attributes\n      [:discount_percent]\n    end\n  end\nend\n"
  },
  {
    "path": "app/models/promoters_repository.rb",
    "content": "# frozen_string_literal: true\n\nclass PromotersRepository\n  class << self\n    def clean\n      @index = nil\n    end\n\n    def all\n      index.values\n    end\n\n    def types\n      index.keys\n    end\n\n    def persist(promoter)\n      index[promoter.type] = promoter\n    end\n\n    def find_by_type(type_name)\n      index[type_name.to_s]\n    end\n\n    private\n\n    def index\n      @index ||= {\n        'discount' => DiscountPromoter\n      }\n    end\n  end\nend\n"
  },
  {
    "path": "app/models/promotion.rb",
    "content": "# frozen_string_literal: true\n\nclass Promotion < ActiveRecord::Base\n  attr_accessor :promo_code\n\n  belongs_to :user\n  belongs_to :promo\n\n  validates :user_id, uniqueness: { scope: :promo_id }\n\n  scope :with_active_promos, -> { where(promo_id: Promo.active.select(:id)) }\n\n  def apply(amount)\n    promo.promoter.apply(promo, amount)\n  end\nend\n\n# == Schema Information\n#\n# Table name: promotions\n#\n#  id         :integer          not null, primary key\n#  user_id    :integer\n#  promo_id   :integer\n#  created_at :datetime\n#  updated_at :datetime\n#\n"
  },
  {
    "path": "app/models/proxy/connect.rb",
    "content": "# frozen_string_literal: true\n\nclass Proxy::Connect < ActiveRecord::Base\n  include AASM\n\n  belongs_to :proxy, class_name: 'Proxy::Node', foreign_key: 'proxy_id'\n  belongs_to :user\n\n  aasm column: :state do\n    state :active, initial: true\n    state :inactive\n\n    event :remove do\n      transitions from: :active, to: :inactive\n    end\n  end\nend\n"
  },
  {
    "path": "app/models/proxy/node.rb",
    "content": "# frozen_string_literal: true\n\nclass Proxy::Node < ActiveRecord::Base\n  validates :host, :port, :country, presence: true\n  has_many :connects, class_name: 'Proxy::Connect', foreign_key: 'proxy_id'\nend\n"
  },
  {
    "path": "app/models/proxy.rb",
    "content": "# frozen_string_literal: true\n\nmodule Proxy\n  def self.table_name_prefix\n    'proxy_'\n  end\nend\n"
  },
  {
    "path": "app/models/referrer/account.rb",
    "content": "# frozen_string_literal: true\n\nmodule Referrer\n  class Account\n    def initialize(referrer_id)\n      @referrer_id = referrer_id\n      @referrer = User.find(referrer_id)\n    end\n\n    def balance\n      operations.sum(:amount)\n    end\n\n    def operations\n      Referrer::Reward.where(referrer_id: @referrer_id)\n    end\n\n    # Referrals payments sum\n    def referrals_total_amount\n      referral_ids = @referrer.referrals.map(&:id)\n      Withdrawal.where(user_id: referral_ids).sum(:amount)\n    end\n  end\nend\n"
  },
  {
    "path": "app/models/referrer/reward.rb",
    "content": "# frozen_string_literal: true\n\nclass Referrer::Reward < ActiveRecord::Base\n  validates :referrer_id, :operation_id, :amount, presence: true\n  belongs_to :operation, foreign_key: 'operation_id', class_name: 'Withdrawal'\nend\n"
  },
  {
    "path": "app/models/referrer.rb",
    "content": "# frozen_string_literal: true\n\nmodule Referrer\n  def self.table_name_prefix\n    'referrer_'\n  end\nend\n"
  },
  {
    "path": "app/models/server/signature.rb",
    "content": "# frozen_string_literal: true\n\n# Allows to check if the request from the server is valid.\n# Server may be nil, which means that it does not exist in billing yet.\n# In this case we check if the secret key is equal to the secret key of application.\n# This kind of check is used just once, when we initialize the server in bulling.\n#\n# All other requests from server to API should be signed by unique erver auth key, which\n# is generated on server initialization.\nclass Server\n  class Signature\n    IGNORED_PARAMS = %w[controller action signature].freeze\n\n    attr_reader :server, :request_params\n\n    def initialize(server, request_params)\n      @server         = server\n      @request_params = request_params.with_indifferent_access\n    end\n\n    def valid?\n      signature == if server\n                     Signer.sign_hash(clean_params, server.auth_key)\n                   else\n                     Settings.secret_token.to_s\n                   end\n    end\n\n    private\n\n    def signature\n      request_params[:signature]\n    end\n\n    def clean_params\n      IGNORED_PARAMS.each_with_object(request_params.dup) do |param, attrs|\n        attrs.delete(param)\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "app/models/server.rb",
    "content": "# frozen_string_literal: true\n\nclass Server < ActiveRecord::Base\n  include AASM\n\n  PROTOCOLS = %w[udp tcp].freeze\n\n  has_many :connects\n  has_many :disconnects\n\n  has_many :included_plans, class_name: 'PlanHasServer'\n  has_many :plans, through: :included_plans\n\n  validates :hostname, :port, :ip_address, :country_code, presence: true\n  validates :hostname, uniqueness: true\n  validates :protocol, presence: true, inclusion: { in: PROTOCOLS }\n\n  before_create :generate_auth_key\n\n  aasm column: :state do\n    state :pending, initial: true\n    state :disabled, :active\n\n    event :activate do\n      transitions from: :pending, to: :active\n    end\n\n    event :disable do\n      transitions from: :active, to: :disabled\n    end\n  end\n\n  def to_s\n    hostname\n  end\n\n  private\n\n  def generate_auth_key\n    self.auth_key = RandomString.generate\n  end\nend\n\n# == Schema Information\n#\n# Table name: servers\n#\n#  id         :integer          not null, primary key\n#  hostname   :string(255)\n#  ip_address :string(255)\n#  auth_key   :string(255)\n#  state      :string(255)\n#  created_at :datetime\n#  updated_at :datetime\n#  config     :string(255)\n#\n"
  },
  {
    "path": "app/models/server_config.rb",
    "content": "# frozen_string_literal: true\n\n# TODO: delete\n# This model for parse server config, storage array strings\nclass ServerConfig\n  attr_accessor :config_lines\n\n  def initialize\n    @config_lines = []\n  end\n\n  def append_line(line)\n    config_lines << line\n  end\n\n  def to_text\n    config_lines.join('')\n  end\nend\n"
  },
  {
    "path": "app/models/test_period.rb",
    "content": "# frozen_string_literal: true\n\nclass TestPeriod\n  def initialize(user)\n    @user = user\n  end\n\n  def enable!\n    @user.update(test_period_started_at: Date.current)\n  end\n\n  def disable!\n    @user.update(test_period_started_at: nil)\n  end\n\n  def enabled?\n    @user.test_period_started_at != nil\n  end\n\n  def test_period_until\n    @user.test_period_started_at.to_date + length.days\n  end\n\n  private\n\n  def length\n    @user.period_length || User::DEFAULT_TEST_PERIOD\n  end\nend\n"
  },
  {
    "path": "app/models/traffic_report.rb",
    "content": "# frozen_string_literal: true\n\nclass TrafficReport\n  include ActiveModel::Validations\n  include ActiveModel::Conversion\n  extend ActiveModel::Naming\n\n  attr_accessor :result, :date_from, :date_to\n\n  def initialize(attributes = {})\n    attributes&.each do |name, value|\n      send(\"#{name}=\", value)\n    end\n  end\n\n  def result\n    @result = build_report.where(created_at: [date_from..date_to])\n  end\n\n  def date_from\n    (@date_from.try(:to_time) || Time.current).beginning_of_month\n  end\n\n  def date_to\n    (@date_to.try(:to_time) || Time.current).end_of_month\n  end\n\n  # To behave as active model\n  def persisted?\n    false\n  end\nend\n"
  },
  {
    "path": "app/models/traffic_reports/date_traffic_report.rb",
    "content": "# frozen_string_literal: true\n\nclass DateTrafficReport < TrafficReport\n  private\n\n  def build_report\n    # TODO:\n    # It is grouped only by date, in one cell are grouped,\n    # for example, all connections for September 15 and\n    # also for October 15, November and etc.\n    # group by unique date.\n    Disconnect.group(\"DATE_TRUNC('day', created_at)\")\n              .select(\"\n                DATE_TRUNC('day', created_at) AS date,\n                SUM(traffic_in) AS traffic_in,\n                SUM(traffic_out) AS traffic_out\")\n              .order('date DESC')\n  end\nend\n"
  },
  {
    "path": "app/models/traffic_reports/server_traffic_report.rb",
    "content": "# frozen_string_literal: true\n\nclass ServerTrafficReport < TrafficReport\n  private\n\n  def build_report\n    Disconnect.group('server_id')\n              .select('\n                server_id,\n                SUM(traffic_in) AS traffic_in,\n                SUM(traffic_out) AS traffic_out')\n              .order('server_id ASC')\n  end\nend\n"
  },
  {
    "path": "app/models/traffic_reports/user_traffic_report.rb",
    "content": "# frozen_string_literal: true\n\nclass UserTrafficReport < TrafficReport\n  private\n\n  def build_report\n    Disconnect.group('user_id')\n              .select('\n                user_id,\n                SUM(traffic_in) AS traffic_in,\n                SUM(traffic_out) AS traffic_out')\n              .order('user_id ASC')\n  end\nend\n"
  },
  {
    "path": "app/models/transaction.rb",
    "content": "# frozen_string_literal: true\n\nclass Transaction\n  attr_accessor :object, :id\n  delegate :created_at, to: :object\n\n  class << self\n    def all\n      cast_collection_to_transactions(Payment.accepted, Withdrawal.all)\n    end\n\n    def user_transactions(user)\n      payments = user.payments.accepted\n      withdrawals = user.withdrawals\n      cast_collection_to_transactions(payments, withdrawals)\n    end\n\n    def cast_collection_to_transactions(payments, withdrawals)\n      (payments.to_a + withdrawals.to_a)\n        .sort_by(&:created_at)\n        .each_with_index\n        .map { |t, id| Transaction.new(id + 1, t) }\n        .reverse!\n    end\n  end\n\n  def initialize(id, object)\n    @object = object\n    @id = id\n  end\n\n  def amount\n    # If this is a Deposit, we will get usd_amount\n    # otherwise, it is a write-off, and then take amount\n    object.try(:usd_amount) || object.amount\n  end\nend\n"
  },
  {
    "path": "app/models/user.rb",
    "content": "# frozen_string_literal: true\n\nclass User < ActiveRecord::Base\n  include AASM\n  include LastDaysFilterable\n\n  BILLING_INTERVAL    = 30\n  DEFAULT_TEST_PERIOD = 3\n\n  devise :database_authenticatable, :registerable,\n         :recoverable, :rememberable, :trackable, :validatable, :confirmable, :lockable\n  attr_accessor :accept_agreement\n\n  belongs_to :plan\n  belongs_to :referrer, class_name: 'User'\n  has_many :referrals, foreign_key: 'referrer_id', class_name: 'User'\n\n  has_many :payments\n  has_many :withdrawals\n\n  has_many :connects\n  has_many :disconnects\n\n  has_many :promotions\n\n  # TODO:\n  # strange pool of relations.\n  # needs to be refactored\n  has_many :user_options\n  has_many :enabled_user_options, -> { enabled }, foreign_key: 'user_id', class_name: 'UserOption'\n  has_many :options, -> { active }, through: :enabled_user_options\n  has_many :subscribed_options, -> { active }, through: :user_options, class_name: 'Option'\n\n  validates :plan_id, presence: true\n  validates :accept_agreement, acceptance: true, on: :create\n  validate :selected_plan_is_regular, on: :create\n\n  before_create :generate_vpn_credentials, :generate_reflink\n  after_create :add_to_newsletter\n\n  scope :active_referrers, -> { joins(:referrals).distinct }\n  scope :payers, -> { where(id: Payment.select(:user_id)) }\n  scope :this_month_payers, -> { where(id: Payment.select(:user_id).in_current_month) }\n  scope :non_paid_users, -> { where.not(id: Withdrawal.select(:user_id).by_interval(BILLING_INTERVAL)).order(id: :asc) }\n  scope :never_paid, -> { where.not(id: Withdrawal.select(:user_id)) }\n\n  ransacker :never_paid, callable: NeverPaidUsersRansacker\n\n  aasm column: :state do\n    state :active, initial: true\n    state :disabled\n\n    event :disable do\n      transitions from: :active, to: :disabled\n    end\n\n    event :activate do\n      transitions from: :disabled, to: :active\n    end\n  end\n\n  def to_s\n    email\n  end\n\n  def referrer_account\n    Referrer::Account.new(id)\n  end\n\n  def test_period\n    TestPeriod.new(self)\n  end\n\n  def connected?\n    Connector.connected? self\n  end\n\n  def paid?\n    last_withdrawal && (((Time.current - last_withdrawal_date).to_i / 1.day) < current_billing_interval_length)\n  end\n\n  def current_billing_interval_length\n    BILLING_INTERVAL + interval_prolongation\n  end\n\n  def last_connect\n    connects.last\n  end\n\n  def last_connect_date\n    last_connect.try :created_at\n  end\n\n  def last_withdrawal\n    withdrawals.last\n  end\n\n  def last_withdrawal_date\n    last_withdrawal.try :created_at\n  end\n\n  def next_withdrawal_date\n    last_withdrawal_date + current_billing_interval_length.days if last_withdrawal\n  end\n\n  def increase_balance(amount)\n    self.class.where(id: id).update_all(['balance = balance + ?', amount])\n    IncreaseBalanceMailWorker.perform_async(amount, id)\n  end\n\n  def decrease_balance(amount)\n    self.class.where(id: id).update_all(['balance = balance - ?', amount])\n    DecreaseBalanceMailWorker.perform_async(amount, id)\n  end\n\n  def service_enabled?\n    paid? || false\n  end\n\n  def total_amount\n    payments.accepted.sum(:usd_amount)\n  end\n\n  private\n\n  def interval_prolongation\n    last_withdrawal ? last_withdrawal.prolongation_days : 0\n  end\n\n  def selected_plan_is_regular\n    errors.add(:plan_id, I18n.t('activerecord.validations.user.regular_plan')) unless plan&.regular?\n  end\n\n  def generate_reflink\n    self.reflink = Signer.hashify_string(email)\n  end\n\n  def generate_vpn_credentials\n    self.vpn_login = Signer.hashify_string(email)\n    self.vpn_password = RandomString.generate(12)\n  end\n\n  def add_to_newsletter\n    AddUserToNewsletterWorker.perform_async(email, :all)\n  end\nend\n\n# == Schema Information\n#\n# Table name: users\n#\n#  id                       :integer          not null, primary key\n#  email                    :string(255)      default(\"\"), not null\n#  encrypted_password       :string(255)      default(\"\"), not null\n#  reset_password_token     :string(255)\n#  reset_password_sent_at   :datetime\n#  remember_created_at      :datetime\n#  sign_in_count            :integer          default(0)\n#  current_sign_in_at       :datetime\n#  last_sign_in_at          :datetime\n#  current_sign_in_ip       :string(255)\n#  last_sign_in_ip          :string(255)\n#  confirmation_token       :string(255)\n#  confirmed_at             :datetime\n#  confirmation_sent_at     :datetime\n#  unconfirmed_email        :string(255)\n#  failed_attempts          :integer          default(0)\n#  unlock_token             :string(255)\n#  locked_at                :datetime\n#  created_at               :datetime\n#  updated_at               :datetime\n#  balance                  :decimal(, )      default(0.0)\n#  plan_id                  :integer\n#  vpn_login                :string(255)\n#  vpn_password             :string(255)\n#  state                    :string(255)\n#  can_not_withdraw_counter :integer          default(0)\n#\n"
  },
  {
    "path": "app/models/user_option.rb",
    "content": "# frozen_string_literal: true\n\nclass UserOption < ActiveRecord::Base\n  # NOTICE:\n  # bad name - UserOption.\n  # better variant - OptionSubscription\n  include AASM\n\n  belongs_to :user\n  belongs_to :option\n\n  validates :user_id, :option_id, presence: true\n\n  aasm column: :state do\n    state :enabled, initial: true\n    state :disabled\n\n    event :enable do\n      transitions from: :disabled, to: :enabled\n    end\n\n    event :disable do\n      transitions from: :enabled, to: :disabled\n    end\n  end\n\n  def toggle!\n    enabled? ? disable! : enable!\n  end\nend\n"
  },
  {
    "path": "app/models/withdrawal.rb",
    "content": "# frozen_string_literal: true\n\nclass Withdrawal < ActiveRecord::Base\n  belongs_to :user\n  belongs_to :plan\n\n  has_many :withdrawal_prolongations\n\n  validates :amount, :user_id, :plan_id, presence: true\n  validate :balance_greater_than_amount, on: :create, if: 'user.present? && amount.present?'\n\n  after_create :decrease_user_balance\n\n  scope :by_interval, ->(interval) { where('(DATE(?) - DATE(withdrawals.created_at)) < ?', Time.current, interval) }\n\n  def prolongation_days\n    withdrawal_prolongations.map(&:days_number).inject { |sum, n| sum + n } || 0\n  end\n\n  private\n\n  def decrease_user_balance\n    user.decrease_balance(amount)\n  end\n\n  def balance_greater_than_amount\n    errors.add(:amount, I18n.t('activerecord.validations.withdrawal.not_enough_funds')) if user.balance < amount\n  end\nend\n\n# == Schema Information\n#\n# Table name: withdrawals\n#\n#  id         :integer          not null, primary key\n#  amount     :decimal(, )\n#  user_id    :integer\n#  plan_id    :integer\n#  created_at :datetime\n#  updated_at :datetime\n#\n"
  },
  {
    "path": "app/models/withdrawal_prolongation.rb",
    "content": "# frozen_string_literal: true\n\nclass WithdrawalProlongation < ActiveRecord::Base\n  belongs_to :withdrawal\n\n  validates :withdrawal_id, :days_number, presence: true\nend\n"
  },
  {
    "path": "app/operations/ops/admin/user/base.rb",
    "content": "# frozen_string_literal: true\n\n# This base class for user operations\nmodule Ops\n  module Admin\n    module User\n      class Base\n        attr_reader :params\n\n        def initialize(params:)\n          @params = params\n        end\n\n        def call\n          raise NotImplementedError\n        end\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "app/operations/ops/admin/user/create.rb",
    "content": "# frozen_string_literal: true\n\nmodule Ops\n  module Admin\n    module User\n      # This class create new user and send email with connection config, user password\n      class Create < Base\n        def call\n          user.skip_confirmation_notification!\n          return error_result unless user.save\n\n          build_created_user!\n          success_result\n        end\n\n        private\n\n        def build_created_user!\n          user.confirm\n          CreateUserMailWorker.perform_async(user.id)\n        end\n\n        def user\n          @user ||= ::User.new(params)\n        end\n\n        def error_result\n          { success: false, user: user }\n        end\n\n        def success_result\n          { success: true, user: user }\n        end\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "app/ransackers/base_ransacker.rb",
    "content": "# frozen_string_literal: true\n\nclass BaseRansacker\n  attr_reader :table\n\n  # @param [Arel::Table] table\n  def initialize(table)\n    @table = table\n  end\n\n  def self.call(parent)\n    new(parent.table)\n  end\nend\n"
  },
  {
    "path": "app/ransackers/never_paid_users_ransacker.rb",
    "content": "# frozen_string_literal: true\n\nclass NeverPaidUsersRansacker < BaseRansacker\n  TRUE_VALUES = ['1', 1].freeze\n\n  def eq(value)\n    table[:id].in(unpaid_user_ids) if apply_ransacker?(value)\n  end\n\n  def unpaid_user_ids\n    User.never_paid.map(&:id)\n  end\n\n  def apply_ransacker?(value)\n    TRUE_VALUES.include?(value)\n  end\nend\n"
  },
  {
    "path": "app/serializers/admin/users_serializer.rb",
    "content": "# frozen_string_literal: true\n\nclass Admin::UsersSerializer\n  attr_accessor :collection, :format\n\n  def initialize(collection, format)\n    @collection = collection\n    @format     = format\n  end\n\n  def emails\n    collection.map(&:email).join(',') if csv?\n  end\n\n  private\n\n  def csv?\n    format == :csv\n  end\nend\n"
  },
  {
    "path": "app/serializers/api/connect_serializer.rb",
    "content": "# frozen_string_literal: true\n\nclass Api::ConnectSerializer < Api::ConnectionSerializer\nend\n"
  },
  {
    "path": "app/serializers/api/connection_serializer.rb",
    "content": "# frozen_string_literal: true\n\nclass Api::ConnectionSerializer < ActiveModel::Serializer\n  self.root = false\n  attributes :id, :options, :common_name, :option_attributes\n\n  def options\n    option_attributes.keys\n  end\n\n  def option_attributes\n    object.option_attributes || {}\n  end\n\n  def common_name\n    object.user.vpn_login\n  end\nend\n"
  },
  {
    "path": "app/serializers/api/disconnect_serializer.rb",
    "content": "# frozen_string_literal: true\n\nclass Api::DisconnectSerializer < Api::ConnectionSerializer\nend\n"
  },
  {
    "path": "app/services/dto/admin/dashboard.rb",
    "content": "# frozen_string_literal: true\n\nmodule Dto\n  module Admin\n    # Collects statistic about traffic, income and customers.\n    # This data is present in dashboard widgets for admin.\n    class Dashboard < Dto::Base\n      DISCRETE_DAYS_NUMBER = 12\n      attr_reader :income, :customers, :traffic, :courses\n\n      private\n\n      def collect_data\n        @courses = fetch_courses\n        @income = fetch_income\n        @customers = fetch_customers\n        @traffic = fetch_traffic\n      end\n\n      def fetch_courses\n        {\n          rub_usd: fetch_course(:rub, :usd),\n          eur_usd: fetch_course(:eur, :usd),\n          updated_at: courses_updated_at\n        }\n      end\n\n      def fetch_income\n        {\n          total: Payment.sum(:usd_amount),\n          discrete: discrete_payments.amounts.sort\n        }\n      end\n\n      def fetch_customers\n        {\n          total: User.count,\n          discrete: discrete_customers.amounts.sort.map\n        }\n      end\n\n      def fetch_traffic\n        {\n          total: Disconnect.sum(:traffic_out),\n          discrete: converted_discrete_traffic\n        }\n      end\n\n      def fetch_course(from_currency, for_currency)\n        Currencies::Course.new(from_currency, for_currency).get.to_f\n      end\n\n      def courses_updated_at\n        Currencies::Course.updated_at.try(:to_datetime)\n      end\n\n      def converted_discrete_traffic\n        discrete_traffic\n          .amounts\n          .sort\n          .map { |date| [date[0], bytes_converter(date[1])] }\n      end\n\n      def bytes_converter(value)\n        BytesConverter.prettify_float(BytesConverter.bytes_to_gigabytes(value))\n      end\n\n      def discrete_payments\n        @discrete_payments ||= Dto::Admin::DiscretePayments.new(number_of_days: DISCRETE_DAYS_NUMBER)\n      end\n\n      def discrete_traffic\n        @discrete_traffic ||= Dto::Admin::DiscreteTraffic.new(number_of_days: DISCRETE_DAYS_NUMBER)\n      end\n\n      def discrete_customers\n        @discrete_customers ||= Dto::Admin::DiscreteCustomersRegistrations.new(number_of_days: DISCRETE_DAYS_NUMBER)\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "app/services/dto/admin/discrete_base.rb",
    "content": "# frozen_string_literal: true\n\nmodule Dto\n  module Admin\n    # This class replace nil value to zero for each dates and return statistics\n    class DiscreteBase < Dto::Base\n      def initialize(number_of_days:)\n        @number_of_days = number_of_days\n      end\n\n      def amounts\n        add_zero_amounts_for_dates\n        values_by_days\n      end\n\n      private\n\n      def add_zero_amounts_for_dates\n        1.upto(@number_of_days) do |number|\n          date = date_by_number_days_ago(number)\n          values_by_days[date] = 0 if values_by_days[date].nil?\n        end\n      end\n\n      def date_by_number_days_ago(number)\n        number.day.ago.to_date\n      end\n\n      def values_by_days\n        raise DtoException, 'Implement in a subclass'\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "app/services/dto/admin/discrete_customers_registrations.rb",
    "content": "# frozen_string_literal: true\n\nmodule Dto\n  module Admin\n    # Returns statistics by customers\n    class DiscreteCustomersRegistrations < Dto::Admin::DiscreteBase\n      private\n\n      def values_by_days\n        @values_by_days ||= User\n                            .in_days(@number_of_days)\n                            .group('created_at::date')\n                            .count\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "app/services/dto/admin/discrete_payments.rb",
    "content": "# frozen_string_literal: true\n\nmodule Dto\n  module Admin\n    # Returns statistics by payments\n    class DiscretePayments < Dto::Admin::DiscreteBase\n      private\n\n      def values_by_days\n        @values_by_days ||= Payment\n                            .in_days(@number_of_days)\n                            .group('created_at::date')\n                            .sum(:amount)\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "app/services/dto/admin/discrete_traffic.rb",
    "content": "# frozen_string_literal: true\n\nmodule Dto\n  module Admin\n    # Returns statistics by traffic\n    class DiscreteTraffic < Dto::Admin::DiscreteBase\n      private\n\n      def values_by_days\n        @values_by_days ||= Disconnect\n                            .in_days(@number_of_days)\n                            .group('created_at::date')\n                            .sum(:traffic_in)\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "app/services/dto/base.rb",
    "content": "# frozen_string_literal: true\n\nmodule Dto\n  # This base class for Dto Admin dashboard\n  class Base\n    def initialize\n      collect_data\n    end\n\n    private\n\n    def collect_data\n      raise DtoException, 'Implement in a subclass'\n    end\n  end\nend\n"
  },
  {
    "path": "app/services/forced_disconnect.rb",
    "content": "# frozen_string_literal: true\n\nclass ForcedDisconnect\n  def initialize(user)\n    @user = user\n  end\n\n  def invoke\n    disconnect! if connected?\n  end\n\n  private\n\n  def disconnect!\n    @user.disconnects.create!(server_id: server.id, traffic_in: 0, traffic_out: 0)\n  end\n\n  def connected?\n    @user.connected?\n  end\n\n  def server\n    @user.connects.last.server\n  end\nend\n"
  },
  {
    "path": "app/services/newsletter_manager.rb",
    "content": "# frozen_string_literal: true\n\nclass NewsletterManager\n  attr_reader :api\n\n  def initialize\n    @api = ::Gibbon::API.new(Settings.mailchimp.api_key)\n  end\n\n  def add_to_list(email, list_name)\n    @api.lists.subscribe(id: list_id(list_name), email: { email: email })\n  end\n\n  private\n\n  def list_id(list_name)\n    list_ids_mapping[list_name.to_sym] || raise(SmartvpnException, 'Email list not defined')\n  end\n\n  def list_ids_mapping\n    {\n      all: all_clients_list_id\n    }\n  end\n\n  def all_clients_list_id\n    Settings.mailchimp.all_clients_list_id\n  end\nend\n"
  },
  {
    "path": "app/services/option/activation_price_calc.rb",
    "content": "# frozen_string_literal: true\n\nclass Option::ActivationPriceCalc\n  class << self\n    def activation_price(user, option)\n      user.plan.option_price(option.code) * billing_interval_percent_left(user)\n    end\n\n    def billing_interval_percent_left(user)\n      days_passed = (Time.current.to_date - user.last_withdrawal_date.to_date).to_i\n      days_left = days_left_to_withdrawal(days_passed)\n      (days_left.to_f / User::BILLING_INTERVAL.to_f)\n    end\n\n    def days_left_to_withdrawal(days_passed)\n      if days_passed != User::BILLING_INTERVAL\n        User::BILLING_INTERVAL - days_passed\n      else\n        30\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "app/services/option/activator.rb",
    "content": "# frozen_string_literal: true\n\nclass Option::Activator\n  attr_accessor :user, :option\n\n  def self.run(user, option_code)\n    activator = new(user, option_code)\n    activator.activate_option\n  end\n\n  def initialize(user, option_code)\n    @option = user.plan.options.active.find_by(code: option_code)\n    @user = user\n  end\n\n  def activate_option\n    ActiveRecord::Base.transaction do\n      withdraw_funds_for_option\n      enable_option\n      return true\n    end\n  rescue StandardError\n    false\n  end\n\n  private\n\n  def activation_price\n    Option::ActivationPriceCalc.activation_price(user, option)\n  end\n\n  def enable_option\n    raise 'Option not found' unless option\n\n    user.user_options.create!(option: option, attrs: option.default_attributes)\n  end\n\n  def withdraw_funds_for_option\n    user.withdrawals.create!(plan: user.plan, amount: activation_price)\n  end\nend\n"
  },
  {
    "path": "app/services/option/deactivator.rb",
    "content": "# frozen_string_literal: true\n\nclass Option::Deactivator\n  def self.run(user, option_id)\n    option = Option.active.find(option_id)\n    user.options.delete(option)\n  end\nend\n"
  },
  {
    "path": "app/services/proxy/fetchers/base.rb",
    "content": "# frozen_string_literal: true\n\nmodule Proxy\n  module Fetchers\n    class Base\n      def self.fetch\n        fetcher = new\n        fetcher.fetch_proxy_list\n      end\n\n      def fetch_proxy_list\n        raise NotImplementedException, 'Implement method in child class'\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "app/services/proxy/fetchers/free_proxy_list_net/row_parser.rb",
    "content": "# frozen_string_literal: true\n\nmodule Proxy\n  module Fetchers\n    module FreeProxyListNet\n      class RowParser\n        def initialize(row)\n          @row = row\n        end\n\n        def to_proxy\n          ::Proxy::ProxyDto.new(host, port, country, protocol, bandwidth, ping)\n        end\n\n        private\n\n        def host\n          @row[0].text\n        end\n\n        def port\n          @row[1].text\n        end\n\n        def country\n          @row[3].text\n        end\n\n        def protocol\n          @row[6].text == 'yes' ? 'https' : 'http'\n        end\n\n        def anonymity\n          @row[4].text\n        end\n\n        def location; end\n\n        def bandwidth; end\n\n        def ping; end\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "app/services/proxy/fetchers/free_proxy_list_net/web_parser.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'mechanize'\n\n# Implements parser for http://www.freeproxylists.net/ website\nmodule Proxy\n  module Fetchers\n    module FreeProxyListNet\n      class WebParser < ::Proxy::Fetchers::Base\n        URL = 'http://free-proxy-list.net/'\n        COLUMNS_IN_PROXY_ROW = 8\n\n        def initialize\n          @agent = Mechanize.new\n          @proxies = []\n        end\n\n        def fetch_proxy_list\n          fetch_proxies\n        end\n\n        private\n\n        def fetch_proxies\n          @agent.get(URL) do |page|\n            parse_proxies_from page\n          end\n          @proxies\n        end\n\n        def parse_proxies_from(page)\n          table = page.search('#proxylisttable')\n          rows = table.search('tbody tr')\n          rows.each do |row|\n            parse(row)\n          end\n        end\n\n        def parse(row)\n          if row.children.size == COLUMNS_IN_PROXY_ROW\n            parser = Proxy::Fetchers::FreeProxyListNet::RowParser.new(row.children)\n            @proxies << parser.to_proxy\n          end\n        end\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "app/services/proxy/fetchers/free_proxy_lists/row_parser.rb",
    "content": "# frozen_string_literal: true\n\nmodule Proxy\n  module Fetchers\n    module FreeProxyLists\n      class RowParser\n        def initialize(row)\n          @row = row\n        end\n\n        def to_proxy\n          ::Proxy::ProxyDto.new(host, port, country, protocol, bandwidth, ping)\n        end\n\n        private\n\n        def host\n          URI.unescape(\n            @row[0]\n            .children[0]\n            .children[0]\n            .text\n            .gsub!('IPDecode(\"', '')\n            .gsub!('\")', '')\n          )\n        end\n\n        def port\n          @row[1].text\n        end\n\n        def country\n          @row[4].text.strip\n        end\n\n        def protocol\n          @row[2].text\n        end\n\n        def anonymity\n          @row[3].text\n        end\n\n        def location\n          @row[5].text\n        end\n\n        def bandwidth\n          @row[8].children[0].children[0].attributes['style'].value.split('%')[0].split(':')[1]\n        end\n\n        def ping\n          @row[9].children[0].children[0].attributes['style'].value.split('%')[0].split(':')[1]\n        end\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "app/services/proxy/fetchers/free_proxy_lists/web_parser.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'mechanize'\n\n# Implements parser for http://www.freeproxylists.net/ website\nmodule Proxy\n  module Fetchers\n    module FreeProxyLists\n      class WebParser < ::Proxy::Fetchers::Base\n        URL = 'http://www.freeproxylists.net/?c=&pt=&pr=HTTP&a%5B%5D=0&a%5B%5D=1&a%5B%5D=2&u=0'\n        COLUMNS_IN_PROXY_ROW = 10\n\n        def initialize\n          @agent = Mechanize.new\n          @proxies = []\n        end\n\n        def fetch_proxy_list\n          fetch_proxies\n        end\n\n        private\n\n        def fetch_proxies\n          @agent.get('http://www.freeproxylists.net/') do |page|\n            parse_proxies_from page\n          end\n          @proxies\n        end\n\n        def parse_proxies_from(page)\n          table = page.search('.DataGrid')\n          rows = table.search('tr.Odd, tr.Even')\n          rows.each do |row|\n            parse(row, @proxies)\n          end\n        end\n\n        def parse(row, _proxies)\n          if row.children.size == COLUMNS_IN_PROXY_ROW\n            parser = Proxy::Fetchers::FreeProxyLists::RowParser.new(row.children)\n            @proxies << parser.to_proxy\n          end\n        end\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "app/services/proxy/proxy_dto.rb",
    "content": "# frozen_string_literal: true\n\nmodule Proxy\n  class ProxyDto\n    attr_accessor :host, :port, :country, :protocol, :bandwidth, :ping\n\n    def initialize(host, port, country, protocol = nil, bandwidth = nil, ping = nil)\n      @host      = host\n      @port      = port\n      @country   = country\n      @protocol  = protocol\n      @bandwidth = bandwidth\n      @ping      = ping\n    end\n\n    def to_hash\n      {\n        host: host,\n        port: port,\n        country: country,\n        protocol: protocol,\n        bandwidth: bandwidth,\n        ping: ping\n      }\n    end\n  end\nend\n"
  },
  {
    "path": "app/services/proxy/rater.rb",
    "content": "# frozen_string_literal: true\n\nmodule Proxy\n  class Rater\n    attr_accessor :user, :option\n\n    def initialize(user, option)\n      @user = user\n      @option = option\n    end\n\n    def find_best\n      activated_option = option.user_options.where(user_id: user.id).first\n      country = activated_option.attrs['country']\n      # TODO:\n      # Strange situation, when proxy for selected country is not found\n      Proxy::Node.where(country: country).order('ping ASC').first || Proxy::Node.first\n    end\n  end\nend\n"
  },
  {
    "path": "app/services/proxy/repository.rb",
    "content": "# frozen_string_literal: true\n\nmodule Proxy\n  class Repository\n    def self.persist(proxies)\n      Proxy::Node.transaction do\n        clear_nodes\n        proxies.each do |proxy|\n          build_node(proxy)\n        end\n      end\n    end\n\n    def self.build_node(proxy)\n      raise ActiveRecord::Rollback unless Proxy::Node.create(proxy.to_hash)\n    end\n\n    def self.clear_nodes\n      Proxy::Node.delete_all\n    end\n  end\nend\n"
  },
  {
    "path": "app/services/proxy/updater.rb",
    "content": "# frozen_string_literal: true\n\nclass Proxy::Updater\n  def self.update(fetcher_class)\n    proxies = fetcher_class.fetch\n    Proxy::Repository.persist proxies\n  end\nend\n"
  },
  {
    "path": "app/services/referrer/reward_calculator.rb",
    "content": "# frozen_string_literal: true\n\nmodule Referrer\n  class RewardCalculator\n    def initialize(payment)\n      @payment = payment\n    end\n\n    def amount\n      @payment.amount * percent / 100\n    end\n\n    private\n\n    def percent\n      Settings.partners.referrer_percent\n    end\n  end\nend\n"
  },
  {
    "path": "app/services/referrer/rewarder.rb",
    "content": "# frozen_string_literal: true\n\nmodule Referrer\n  class Rewarder\n    def self.add_funds(withdrawal, amount)\n      rewarder = new(withdrawal, amount)\n      rewarder.create_reward\n    end\n\n    def initialize(withdrawal, amount)\n      @withdrawal = withdrawal\n      @amount = amount\n    end\n\n    def create_reward\n      if referrer? && @withdrawal.valid?\n        Referrer::Reward.create!(\n          referrer_id: referrer.id,\n          amount: @amount,\n          operation_id: @withdrawal.id\n        )\n      end\n    end\n\n    private\n\n    def referrer\n      @withdrawal.user.referrer\n    end\n\n    def referrer?\n      referrer || nil\n    end\n  end\nend\n"
  },
  {
    "path": "app/services/server_config_builder.rb",
    "content": "# frozen_string_literal: true\n\n# This class created connection vpn config file by server from template\nclass ServerConfigBuilder\n  attr_accessor :server\n\n  def initialize(server:)\n    @server = server\n  end\n\n  def to_text\n    erb_render_sample_config\n  end\n\n  private\n\n  def client_crt\n    crt = server.client_crt.split('-----BEGIN CERTIFICATE-----').last\n    \"-----BEGIN CERTIFICATE-----#{crt}\".strip\n  end\n\n  def server_crt\n    server.server_crt.strip\n  end\n\n  def client_key\n    server.client_key.strip\n  end\n\n  def erb_render_sample_config\n    ERB.new(sample_config).result(binding)\n  end\n\n  def sample_config\n    @sample_config ||= File.read(sample_config_path)\n  end\n\n  def sample_config_path\n    Settings.servers.sample_config_path\n  end\nend\n"
  },
  {
    "path": "app/services/unpaid_users_notificator.rb",
    "content": "# frozen_string_literal: true\n\nclass UnpaidUsersNotificator\n  FAILED_WITHDRAWS = 3\n\n  def notify_all\n    users_to_notify.each do |user|\n      notify(user)\n    end\n  end\n\n  private\n\n  def users_to_notify\n    User.never_paid.where(can_not_withdraw_counter: FAILED_WITHDRAWS)\n  end\n\n  def notify(user)\n    UnpaidUserNotificationWorker.perform_async(user.id)\n  end\nend\n"
  },
  {
    "path": "app/services/withdrawal_amount_calculator.rb",
    "content": "# frozen_string_literal: true\n\nclass WithdrawalAmountCalculator\n  attr_accessor :user\n\n  def initialize(user)\n    @user = user\n  end\n\n  def amount_to_withdraw\n    user.promotions.with_active_promos.inject(total_amount) do |amount, promotion|\n      promotion.apply(amount)\n    end\n  end\n\n  private\n\n  def total_amount\n    base_amount + options_amount\n  end\n\n  def base_amount\n    user.plan.price\n  end\n\n  def options_amount\n    user.options.active.reduce(0) do |sum, option|\n      sum + user.plan.option_price(option.code)\n    end\n  end\nend\n"
  },
  {
    "path": "app/services/withdrawer.rb",
    "content": "# frozen_string_literal: true\n\nclass Withdrawer\n  attr_accessor :withdrawal, :user\n\n  class << self\n    def mass_withdrawal\n      withdrawer = new\n      User.non_paid_users.each do |user|\n        withdrawer.user = user\n        withdrawer.try_to_withdraw\n      end\n    end\n\n    def single_withdraw(user)\n      withdrawer = new\n      unless user.paid?\n        # TODO: maybe move it to constructor?\n        # self.new(user)\n        withdrawer.user = user\n        withdrawer.try_to_withdraw\n      end\n    end\n  end\n\n  def try_to_withdraw\n    raise WithdrawerException, 'user not defined' if user.nil?\n\n    withdraw_funds\n    add_funds_to_referrer\n    notify_user_if_needed\n    increment_or_reset_counter\n  end\n\n  private\n\n  def withdraw_funds\n    calc = WithdrawalAmountCalculator.new(user)\n    @withdrawal = user.reload.withdrawals.create(\n      plan: user.plan,\n      amount: calc.amount_to_withdraw\n    )\n  end\n\n  def add_funds_to_referrer\n    reward_amount = Referrer::RewardCalculator.new(@withdrawal).amount\n    Referrer::Rewarder.add_funds(@withdrawal, reward_amount)\n  end\n\n  def increment_or_reset_counter\n    if can_not_withdraw\n      user.class.where(id: user.id).update_all(['can_not_withdraw_counter = can_not_withdraw_counter + ?', 1])\n    else\n      user.update(can_not_withdraw_counter: 0)\n    end\n  end\n\n  def notify_user_if_needed\n    CanNotWithdrawNotificationWorker.perform_async(user.id, user.plan.price) if can_not_withdraw && first_notification?\n  end\n\n  def can_not_withdraw\n    !@withdrawal.valid?\n  end\n\n  def successful_withdrawal?\n    @withdrawal.valid?\n  end\n\n  def first_notification?\n    user.can_not_withdraw_counter.zero?\n  end\nend\n"
  },
  {
    "path": "app/uploaders/config_uploader.rb",
    "content": "# frozen_string_literal: true\n\nclass ConfigUploader < CarrierWave::Uploader::Base\n  # Include RMagick or MiniMagick support:\n  # include CarrierWave::RMagick\n  # include CarrierWave::MiniMagick\n\n  # Include the Sprockets helpers for Rails 3.1+ asset pipeline compatibility:\n  # include Sprockets::Helpers::RailsHelper\n  # include Sprockets::Helpers::IsolatedHelper\n\n  # Choose what kind of storage to use for this uploader:\n  storage :file\n  # storage :fog\n\n  # Override the directory where uploaded files will be stored.\n  # This is a sensible default for uploaders that are meant to be mounted:\n  def store_dir\n    \"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}\"\n  end\n\n  # Provide a default URL as a default if there hasn't been a file uploaded:\n  # def default_url\n  #   # For Rails 3.1+ asset pipeline compatibility:\n  #   # asset_path(\"fallback/\" + [version_name, \"default.png\"].compact.join('_'))\n  #\n  #   \"/images/fallback/\" + [version_name, \"default.png\"].compact.join('_')\n  # end\n\n  # Process files as they are uploaded:\n  # process :scale => [200, 300]\n  #\n  # def scale(width, height)\n  #   # do something\n  # end\n\n  # Create different versions of your uploaded files:\n  # version :thumb do\n  #   process :scale => [50, 50]\n  # end\n\n  # Add a white list of extensions which are allowed to be uploaded.\n  # For images you might use something like this:\n  # def extension_white_list\n  #   %w(jpg jpeg gif png)\n  # end\n\n  # Override the filename of the uploaded files:\n  # Avoid using model.id or version_name here, see uploader/store.rb for details.\n  # def filename\n  #   \"something.jpg\" if original_filename\n  # end\nend\n"
  },
  {
    "path": "app/views/admin/connections/_filter.html.slim",
    "content": ".col-md-12.d-flex.justify-content-end\n  = search_form_for [:admin, search], class: 'form-inline my-3' do |f|\n    .form-group.mr-3\n      = f.label t('admin.labels.user'), class: 'mr-3'\n      = f.select :user_id_eq, options_for_select(User.all.map { |u| [u.email, u.id] }), { include_blank: true }, { class: 'form-control' }\n    .form-group.mr-3\n      = f.label t('admin.labels.server'), class: 'mr-3'\n      = f.select :server_id_eq, options_for_select(Server.all.map { |s| [s.hostname, s.id] }), { include_blank: true }, { class: 'form-control' }\n    = f.submit t('admin.buttons.filter'), class: 'btn btn-primary'\n"
  },
  {
    "path": "app/views/admin/connections/active.html.slim",
    "content": "= page_title(t('admin.connections.title'), 'bolt', 'connections') do\n  = sub_page_title(t('admin.connections.active'))\n\n.row\n  = render 'filter'\n\ntable.table\n  thead\n    tr\n      th= t('admin.tables.id')\n      th= t('admin.tables.user')\n      th= t('admin.tables.server')\n      th= t('admin.tables.date')\n      -# TODO:\n      /This will make columns with traffic by connections\n\n  - @connections.each do |connection|\n    tr\n      td= connection.id\n      td= link_to connection.user.email, admin_user_path(connection.user)\n      td= link_to connection.hostname, admin_server_path(connection.server)\n      td= human_date(connection.created_at)\n\n= render partial: 'admin/shared/paginate', locals: {collection: @connections}\n"
  },
  {
    "path": "app/views/admin/connections/index.html.slim",
    "content": "= page_title(t('admin.connections.title'), 'bolt', 'connections')\n\n.row\n  = render 'filter'\n  .col.my-3\n    = link_to t('admin.links.active'), active_admin_connections_path\n\ntable.table\n  thead\n    tr\n      th= t('admin.tables.id')\n      th= t('admin.tables.user')\n      th= t('admin.tables.server')\n      th= t('admin.tables.event')\n      th= t('admin.tables.traffic')\n      th= t('admin.tables.date')\n\n  - @connections.each do |connection|\n    tr\n      td= connection.id\n      td= link_to connection.user.email, admin_user_path(connection.user)\n      td= link_to connection.hostname, admin_server_path(connection.server)\n      td= human_connection(connection.type)\n      td= human_traffic(connection.traffic_in + connection.traffic_out) if connection.is_a? Disconnect\n      td= human_date(connection.created_at)\n\n= render partial: 'admin/shared/paginate', locals: { collection: @connections }\n"
  },
  {
    "path": "app/views/admin/connections/show.html.slim",
    "content": "| Тут отобразить текущий траффик по коннекту и график по траффику, можно статический\n"
  },
  {
    "path": "app/views/admin/home/index.html.slim",
    "content": "= page_title(t('admin.dashboard.title'), 'home', 'root')\n\n.row.mt-5\n  .col-md-10.offset-md-1\n    ul.list-unstyled.text-center\n      li.mb-5\n        h5\n          = t('admin.dashboard.total_income')\n          i.fa.fa-money-bill.mx-3\n          | $\n          = @dashboard.income[:total]\n        .mt-3\n          = column_chart @dashboard.income[:discrete]\n      li.mb-5\n        h5\n          = t('admin.dashboard.total_traffic')\n          i.fa.fa-arrow-circle-up.mx-3\n          = human_traffic @dashboard.traffic[:total]\n        .mt-3\n          = column_chart @dashboard.traffic[:discrete]\n      li\n        h5\n          = t('admin.dashboard.customers')\n          i.fa.fa-users.mx-3\n          = @dashboard.customers[:total]\n        .mt-3\n          = column_chart @dashboard.customers[:discrete]\n"
  },
  {
    "path": "app/views/admin/options/_form.html.slim",
    "content": ".row.my-5\n  .col\n    = simple_form_for [:admin, @option], html: { class: 'form-horizontal' },wrapper: :horizontal_form do |f|\n      = f.input :name\n      = f.input :code, input_html: { enabled: @option.new_record? }\n      = f.input :state, as: :select, collection: object_states_select_collection(Option)\n\n      legend= t('admin.legends.plans')\n      = f.association :plans, as: :select\n\n      = f.submit t('admin.buttons.apply'), class: 'btn btn-primary'\n"
  },
  {
    "path": "app/views/admin/options/edit.html.slim",
    "content": "= page_title(t('admin.options.title'), 'cogs', 'options') do\n  = sub_page_title(\"#{t('admin.options.edit')} #{@option.name}\")\n\n= render partial: 'form'\n"
  },
  {
    "path": "app/views/admin/options/index.html.slim",
    "content": "= page_title(t('admin.options.title'), 'cogs', 'options')\n\n.row.my-4\n  .col\n    = link_to t('admin.links.create'), new_admin_option_path, class: 'btn btn-primary'\n\ntable.table\n  thead\n    tr\n      th= t('admin.tables.id')\n      th= t('admin.tables.name')\n      th= t('admin.tables.code')\n      th= t('admin.tables.state')\n      th= t('admin.tables.actions')\n\n  tbody\n    - @options.each do |option|\n      tr\n        td= option.id\n        td= option.name\n        td= option.code\n        td= option.state\n        th\n          = link_to t('admin.links.edit'), edit_admin_option_path(option), class: 'btn btn-sm btn-info'\n"
  },
  {
    "path": "app/views/admin/options/new.html.slim",
    "content": "= page_title(t('admin.options.title'), 'cogs', 'options') do\n  = sub_page_title(t('admin.options.new'))\n\n= render partial: 'form'\n"
  },
  {
    "path": "app/views/admin/pay_systems/_form.html.slim",
    "content": ".row\n  .col.mt-5\n    = simple_form_for [:admin, @pay_system], html: { class: 'form-horizontal' },wrapper: :horizontal_form do |f|\n      = f.input :name\n      = f.input :code\n      = f.input :description\n      = f.input :state,\n        as: :select,\n        collection: PaySystem.aasm.states.map { |s| [t(\"admin.pay_systems.states.#{s.name}\"), s.name] },\n        include_blank: false\n      = f.input :currency, as: :select, collection: PaySystem::CURRENCIES.map { |c| [c, c] }\n      br\n      = f.submit t('admin.buttons.apply'), class: 'btn btn-primary'\n"
  },
  {
    "path": "app/views/admin/pay_systems/edit.html.slim",
    "content": "= page_title(t('admin.pay_systems.title'), 'server', 'pay_systems') do\n  = sub_page_title(\"#{t('admin.pay_systems.edit')} #{@pay_system.name}\")\n\n= render partial: 'form'\n"
  },
  {
    "path": "app/views/admin/pay_systems/index.html.slim",
    "content": "= page_title(t('admin.pay_systems.title'), 'server', 'pay_systems')\n\n.row.my-4\n  .col\n    = link_to t('admin.links.create'), new_admin_pay_system_path, class: 'btn btn-primary'\n\ntable.table\n  thead\n    tr\n      th= t('admin.tables.id')\n      th= t('admin.tables.name')\n      th= t('admin.tables.code')\n      th= t('admin.tables.state')\n      th= t('admin.tables.actions')\n\n  tbody\n    - @pay_systems.each do |pay_system|\n      tr\n        td= pay_system.id\n        td= pay_system.title\n        td= pay_system.code\n        td= pay_system.human_state\n        th\n          = link_to t('admin.links.edit'), edit_admin_pay_system_path(pay_system), class: 'btn btn-sm btn-info'\n"
  },
  {
    "path": "app/views/admin/pay_systems/new.html.slim",
    "content": "= page_title(t('admin.pay_systems.title'), 'server', 'pay_systems') do\n  = sub_page_title(t('admin.pay_systems.new'))\n\n= render partial: 'form'\n"
  },
  {
    "path": "app/views/admin/pay_systems/show.html.slim",
    "content": "= page_title(t('admin.pay_systems.title'), 'user', 'pay_systems') do\n  = sub_page_title(\"#{t('admin.pay_systems.show')} #{@pay_system.name}\")\n\n.my-3\n  = link_to t('admin.links.edit'), edit_admin_pay_system_path(@pay_system), class: 'btn btn-sm btn-info'\n\n= show_for @pay_system do |pay_system|\n  = pay_system.attribute :id\n  = pay_system.attribute :name\n  = pay_system.attribute :code\n  = pay_system.attribute :description\n  = pay_system.attribute :state\n"
  },
  {
    "path": "app/views/admin/plans/_form.html.slim",
    "content": ".row.mt-5\n  .col\n    = simple_form_for [:admin, @plan], html: { class: 'form-horizontal' },wrapper: :horizontal_form do |f|\n      = f.input :name\n      = f.input :description\n      = f.input :code, input_html: { enabled: false }\n      = f.input :enabled, as: :select, include_blank: false\n      = f.input :special, as: :select, include_blank: false\n\n      legend= t('admin.legends.servers')\n      .ml-3\n        = f.association :servers, as: :select\n\n      legend= t('admin.legends.options')\n      .ml-3\n        = f.association :options, as: :select, collection: Option.all.active\n\n      legend= t('admin.legends.prices')\n      .ml-3\n        = f.input :price\n\n        - @plan.options.active.each do |option|\n          .form-group.row\n            label.col-sm-3.col-form-label.required\n              = \"#{option.name} #{t('activerecord.attributes.option.price')}\"\n            .col-sm-9\n              = text_field_tag \"plan[option_prices][#{option.code}]\",\n                               prettify_number(plans_option_price(@plan, option.code)),\n                               class: 'form-control'\n\n      = f.submit t('admin.buttons.apply'), class: 'btn btn-primary'\n"
  },
  {
    "path": "app/views/admin/plans/edit.html.slim",
    "content": "= page_title(t('admin.plans.title'), 'shopping-cart', 'plans') do\n  = sub_page_title(\"#{t('admin.plans.edit')} #{@plan.name}\")\n\n= render partial: 'form'\n"
  },
  {
    "path": "app/views/admin/plans/index.html.slim",
    "content": "= page_title(t('admin.plans.title'), 'shopping-cart', 'plans')\n\n.row.my-4\n  .col\n    = link_to t('admin.links.create'), new_admin_plan_path, class: 'btn btn-primary'\n\ntable.table\n  thead\n    tr\n      th= t('admin.tables.id')\n      th= t('admin.tables.name')\n      th= t('admin.tables.description')\n      th= t('admin.tables.code')\n      th= t('admin.tables.price')\n      th\n\n  tbody\n    - @plans.each do |plan|\n      tr\n        td= plan.id\n        td= plan.name\n        td= plan.description\n        td= plan.code\n        td= plan.price\n        th\n          = link_to t('admin.links.edit'), edit_admin_plan_path(plan), class: 'btn btn-sm btn-info'\n          /TODO:\n          / при удалении надо архивировать тариф, и переводить всех юзеров на другой\n          /= button_to 'Удалить', admin_plan_path(plan), method: :delete, data: { confirm: 'Вы уверены?' }, class: 'btn btn-danger'\n"
  },
  {
    "path": "app/views/admin/plans/new.html.slim",
    "content": "= page_title(t('admin.plans.title'), 'shopping-cart', 'plans') do\n  = sub_page_title(t('admin.plans.new'))\n\n= render partial: 'form'\n"
  },
  {
    "path": "app/views/admin/profiles/edit.html.slim",
    "content": ".row.mt-5.text-center\n  .col-md-4.offset-md-4\n    h4= t('admin.profile.change_password')\n.row.mt-5\n  .col-md-4.offset-md-4\n    = simple_form_for @admin, url: admin_profile_path do |f|\n      = f.input :current_password\n      = f.input :password\n      = f.input :password_confirmation\n      = f.submit t('admin.buttons.apply'), class: 'btn btn-primary btn-block'\n"
  },
  {
    "path": "app/views/admin/promos/_form.html.slim",
    "content": ".my-5\n  = simple_form_for [:admin, @promo], html: { class: 'form-horizontal' },wrapper: :horizontal_form do |f|\n    = f.input :name\n    = f.input :type, promo_types\n    = f.input :promoter_type, promoter_types\n    .row\n      .col-md-6\n        = f.input :date_from, as: :date, html5: true\n      .col-md-6\n        = f.input :date_to, as: :date, html5: true\n    = f.input :promo_code\n    = f.input :state, as: :select, collection: Promo.aasm.states.map { |s| [t(\"activerecord.attributes.promo.states.#{s.name}\"), s.name] }, include_blank: false\n\n    = f.simple_fields_for :attrs do |a|\n      - if @promo.promoter\n        legend= t('admin.legends.attributes')\n        br\n        - @promo.promoter&.attributes&.each do |attribute_name|\n          = a.input attribute_name, input_html: { value: @promo.attrs&.fetch(attribute_name.to_s, nil) }, label: t(\"activerecord.attributes.promoter.attributes.#{attribute_name}\")\n\n    br\n    = f.submit t('admin.buttons.apply'), class: 'btn btn-primary'\n"
  },
  {
    "path": "app/views/admin/promos/edit.html.slim",
    "content": "= page_title(t('admin.promos.title'), 'tags', 'promos') do\n  = sub_page_title(\"#{t('admin.promos.edit')} #{@promo.name}\")\n\n= render 'form'\n"
  },
  {
    "path": "app/views/admin/promos/index.html.slim",
    "content": "= page_title(t('admin.promos.title'), 'tags', 'promos')\n\n.row.my-4\n  .col\n    = link_to t('admin.links.create'), new_admin_promo_path, class: 'btn btn-primary'\n\ntable.table\n  thead\n    tr\n      th= t('admin.tables.id')\n      th= t('admin.tables.name')\n      th= t('admin.tables.type')\n      th= t('admin.tables.promoter_type')\n      th= t('admin.tables.state')\n      th= t('admin.tables.period')\n      th\n\n  tbody\n    - @promos.each do |promo|\n      tr\n        td= promo.id\n        td= promo.name\n        td= promo.type\n        td= promo.promoter_type\n        td= promo.state\n        td= promo.period\n        td= link_to t('admin.links.edit'), edit_admin_promo_path(promo), class: 'btn btn-sm btn-info'\n"
  },
  {
    "path": "app/views/admin/promos/new.html.slim",
    "content": "= page_title(t('admin.promos.title'), 'tags', 'promos') do\n  = sub_page_title(t('admin.promos.new'))\n\n= render 'form'\n"
  },
  {
    "path": "app/views/admin/referrers/_referrals.html.slim",
    "content": "- referrer.referrals.each do |referral|\n  tr\n    td\n    td= link_to referral.email, admin_user_path(referral)\n    td= referral.withdrawals.sum(:amount)\n    td colspan=3\n\n"
  },
  {
    "path": "app/views/admin/referrers/index.html.slim",
    "content": "= page_title(t('admin.referrers.title'), 'share', 'referrers')\n\ntable.table.mt-5\n  thead\n    tr\n      th= t('admin.tables.id')\n      th= t('admin.tables.email')\n      th= t('admin.tables.turnover')\n      th= t('admin.tables.profit')\n      th= t('admin.tables.balance')\n      th= t('admin.tables.referrals')\n\n    - @referrers.each do |referrer|\n      tbody\n        tr\n          td= referrer.id\n          td.email= link_to referrer.email, \"#reffer-#{referrer.id}\", 'data-toggle': 'collapse', 'aria-expanded': 'false'\n          td= referrer.referrer_account.referrals_total_amount\n          td= referrer.referrer_account.operations.sum(:amount)\n          td= referrer.referrer_account.balance\n          td= referrer.referrals.count\n      tbody.collapse id=\"reffer-#{referrer.id}\"\n        = render partial: 'referrals', locals: { referrer: referrer }\n\n"
  },
  {
    "path": "app/views/admin/servers/_form.html.slim",
    "content": ".mt-5\n  = simple_form_for [:admin, @server], html: { class: 'form-horizontal' },wrapper: :horizontal_form do |f|\n    = f.input :hostname\n    = f.input :ip_address\n    = f.input :protocol, as: :select, collection: Server::PROTOCOLS.map { |p| [p, p] }, include_blank: false\n    = f.input :port\n    = f.input :country_code, as: :select, collection: countries_for_select, include_blank: false\n\n    - unless @server.new_record?\n      = f.input :state, as: :select, collection: object_states_select_collection(Server), include_blank: false\n\n    legend= t('admin.legends.plans')\n    .ml-3\n      = f.association :plans, as: :select\n\n    = f.submit t('admin.buttons.apply'), class: 'btn btn-primary'\n"
  },
  {
    "path": "app/views/admin/servers/edit.html.slim",
    "content": "= page_title(t('admin.servers.title'), 'server', 'servers') do\n  = sub_page_title(\"#{t('admin.servers.edit')} #{@server.hostname}\")\n\n= render partial: 'form'\n"
  },
  {
    "path": "app/views/admin/servers/index.html.slim",
    "content": "= page_title(t('admin.servers.title'), 'server', 'servers')\n\n.row.my-4\n  .col\n    = link_to t('admin.links.create'), new_admin_server_path, class: 'btn btn-primary'\n\ntable.table\n  thead\n    tr\n      th= t('admin.tables.id')\n      th= t('admin.tables.hostname')\n      th= t('admin.tables.ip_address')\n      th= t('admin.tables.plans')\n      th= t('admin.tables.state')\n      th= t('admin.tables.actions')\n\n  tbody\n    - @servers.each do |server|\n      tr\n        td= server.id\n        td= link_to server.hostname, admin_server_path(server)\n        td= server.ip_address\n        td\n          - server.plans.each do |plan|\n            ul.list-unstyled\n              li= link_to plan.name, edit_admin_plan_path(plan)\n\n        td= server.state\n        th\n          = link_to t('admin.links.edit'), edit_admin_server_path(server), class: 'btn btn-sm btn-info'\n"
  },
  {
    "path": "app/views/admin/servers/new.html.slim",
    "content": "= page_title(t('admin.servers.title'), 'server', 'servers') do\n  = sub_page_title(t('admin.servers.new'))\n\n= render partial: 'form'\n"
  },
  {
    "path": "app/views/admin/servers/show.html.slim",
    "content": "= page_title(t('admin.servers.title'), 'server', 'servers') do\n  = sub_page_title(\"#{t('admin.servers.show')} #{@server.hostname}\")\n\n= show_for @server do |s|\n  = s.attribute :id\n  = s.attribute :hostname\n  = s.attribute :ip_address\n  = s.attribute :port\n  = s.attribute :protocol\n  = s.attribute :auth_key\n  = s.attribute :state\n  = s.attribute :config_file do\n    = link_to @server.hostname, generate_config_admin_server_path(@server)\n\n  = s.attribute :plans do\n    - @server.plans.each do |plan|\n      ul.list-unstyled\n        li= link_to plan.name, edit_admin_plan_path(plan)\n"
  },
  {
    "path": "app/views/admin/shared/_menu.html.slim",
    "content": "ul.flex-md-column.flex-row.navbar-nav.w-100.justify-content-between\n  = menu_item t('admin.links.dashboard'), admin_root_path, 'home'\n  = menu_item_with_sub t('admin.links.users'), '#users', 'user' do\n    = sub_menu_item t('admin.links.all'), admin_users_path\n    = sub_menu_item t('admin.links.paid'), payers_admin_users_path\n    = sub_menu_item t('admin.links.this_month_paid'), this_month_payers_admin_users_path\n  = menu_item t('admin.links.servers'), admin_servers_path, 'server'\n  = menu_item t('admin.links.payment_systems'), admin_pay_systems_path, 'money-bill'\n  = menu_item t('admin.links.plans'), admin_plans_path, 'shopping-cart'\n  = menu_item t('admin.links.connections'), admin_connections_path, 'bolt'\n  = menu_item_with_sub t('admin.links.traffic'), '#cloud-download', 'cloud-download-alt' do\n    = sub_menu_item t('admin.links.by_users'), users_admin_traffic_reports_path\n    = sub_menu_item t('admin.links.by_date'), date_admin_traffic_reports_path\n    = sub_menu_item t('admin.links.by_servers'), servers_admin_traffic_reports_path\n  = menu_item t('admin.links.transactions'), admin_transactions_path, 'file-invoice-dollar'\n  = menu_item t('admin.links.promos'), admin_promos_path, 'tags'\n  = menu_item t('admin.links.options'), admin_options_path, 'cogs'\n  = menu_item t('admin.links.referrers'), admin_referrers_path, 'share'\n\n"
  },
  {
    "path": "app/views/admin/shared/_paginate.html.slim",
    "content": ".row\n  .col-md-12.d-flex.justify-content-center\n    = paginate collection\n"
  },
  {
    "path": "app/views/admin/traffic_reports/_filter.html.slim",
    "content": ".col-md-12.d-flex.justify-content-end\n  = simple_form_for TrafficReport.new(params[:traffic_report]),\n          url: request.fullpath,\n          method: :get,\n          html: { class: 'form-inline' } do |f|\n    .form-group.mr-3\n      = f.input :date_from, as: :date, html5: true, label: t('admin.labels.date_from')\n    .form-group.mr-3\n      = f.input :date_to, as: :date, html5: true, label: t('admin.labels.date_to')\n    = f.submit t('admin.buttons.filter'), class: 'btn btn-primary'\n"
  },
  {
    "path": "app/views/admin/traffic_reports/_submenu.html.slim",
    "content": "ul.list-unstyled\n  li= link_to t('admin.links.by_users'), users_admin_traffic_reports_path\n  li= link_to t('admin.links.by_date'), date_admin_traffic_reports_path\n  li= link_to t('admin.links.by_servers'), servers_admin_traffic_reports_path\n"
  },
  {
    "path": "app/views/admin/traffic_reports/date.html.slim",
    "content": "= page_title(t('admin.traffic_reports.title'), 'cloud-download-alt', 'traffic_reports') do\n  = sub_page_title(t('admin.traffic_reports.date_reports'))\n\n.row\n  = render partial: 'filter'\n= render partial: 'submenu'\n\ntable.table\n  tr\n    th= t('admin.tables.date')\n    th= t('admin.tables.incoming_traffic')\n    th= t('admin.tables.outbound_traffic')\n    th= t('admin.tables.total')\n\n  - traffic_reports.each do |report|\n    tr\n      td= human_date(report.date)\n      td= human_traffic report.traffic_in\n      td= human_traffic report.traffic_out\n      td= human_traffic report.traffic_in + report.traffic_out\n"
  },
  {
    "path": "app/views/admin/traffic_reports/index.html.slim",
    "content": "= page_title(t('admin.traffic_reports.title'), 'cloud-download-alt', 'traffic_reports')\n\n= render partial: 'submenu'\n"
  },
  {
    "path": "app/views/admin/traffic_reports/servers.html.slim",
    "content": "= page_title(t('admin.traffic_reports.title'), 'cloud-download-alt', 'traffic_reports') do\n  = sub_page_title(t('admin.traffic_reports.servers_reports'))\n\n.row\n  = render partial: 'filter'\n= render partial: 'submenu'\n\ntable.table\n  tr\n    th= t('admin.tables.server')\n    th= t('admin.tables.incoming_traffic')\n    th= t('admin.tables.outbound_traffic')\n    th= t('admin.tables.total')\n\n  - traffic_reports.each do |report|\n    tr\n      td= report.server.hostname\n      td= human_traffic report.traffic_in\n      td= human_traffic report.traffic_out\n      td= human_traffic report.traffic_in + report.traffic_out\n"
  },
  {
    "path": "app/views/admin/traffic_reports/users.html.slim",
    "content": "= page_title(t('admin.traffic_reports.title'), 'cloud-download-alt', 'traffic_reports') do\n  = sub_page_title(t('admin.traffic_reports.users_reports'))\n\n.row\n  = render partial: 'filter'\n= render partial: 'submenu'\n\ntable.table\n  tr\n    th= t('admin.tables.user')\n    th= t('admin.tables.incoming_traffic')\n    th= t('admin.tables.outbound_traffic')\n    th= t('admin.tables.total')\n\n  - traffic_reports.each do |report|\n    tr\n      td= report.user.email\n      td= human_traffic report.traffic_in\n      td= human_traffic report.traffic_out\n      td= human_traffic report.traffic_in + report.traffic_out\n"
  },
  {
    "path": "app/views/admin/transactions/index.html.slim",
    "content": "= page_title(t('admin.transactions.title'), 'file-invoice-dollar', 'transactions')\n\n.my-5\n  table.table\n    thead\n      tr\n        th= t('admin.tables.id')\n        th= t('admin.tables.amount')\n        th= t('admin.tables.user')\n        th= t('admin.tables.date')\n        th= t('admin.tables.description')\n    tbody\n      - @transactions.each do |transaction|\n        tr\n          td= transaction.id\n          td= transaction.amount\n          td= transaction.user\n          td= transaction.date\n          td= transaction.description\n\n= render partial: 'admin/shared/paginate', locals: { collection: @transactions }\n"
  },
  {
    "path": "app/views/admin/transactions/payments.html.slim",
    "content": ""
  },
  {
    "path": "app/views/admin/transactions/withdrawals.html.slim",
    "content": ""
  },
  {
    "path": "app/views/admin/users/_filter.html.slim",
    "content": ".col-md-12.d-flex.justify-content-end\n  = search_form_for [:admin, search], class: 'form-inline mb-5' do |f|\n    .form-group.mr-3\n      = f.label t('admin.labels.email_cont'), class: 'mr-3'\n      = f.text_field :email_cont, class: 'form-control'\n    .form-group.mr-3\n      = f.label t('admin.labels.plan'), class: 'mr-3'\n      = f.select :plan_id_eq, options_for_select(Plan.all.map { |p| [p.name, p.id] }, search_params[:plan_id_cont]), { include_blank: true }, { class: 'form-control' }\n    .form-group.mr-3\n      = f.label t('admin.users.filter.never_paid_users'), class: 'mr-3'\n      = check_box_search(:never_paid_eq)\n    = f.submit t('admin.buttons.filter'), class: 'btn btn-primary'\n\n\n"
  },
  {
    "path": "app/views/admin/users/_payment.html.slim",
    "content": "legend= t('admin.users.new_payment')\n.ml-3.mb-3\n  .row\n    .col-md-4\n      = simple_form_for [:admin, Payment.new], url: payment_admin_user_path(@user), method: :put do |f|\n        = f.input :pay_system_id, collection: PaySystem.all.map { |p| [p.name, p.id] }, include_blank: false\n        = f.input :amount\n        = f.input :comment, as: :string\n        = f.submit t('admin.buttons.apply'), class: 'btn btn-primary'\n\n"
  },
  {
    "path": "app/views/admin/users/_prolongation.html.slim",
    "content": "legend= t('admin.users.prolongation')\n- if can_be_prolongated? @user\n  .ml-3.mb-3\n    .row\n      .col-md-4\n        = simple_form_for [:admin, WithdrawalProlongation.new], url: prolongate_admin_user_path(@user), method: :put do |f|\n          = f.input :days_number\n          = f.submit t('global.apply'), class: 'btn btn-primary'\n- else\n  .mb-3\n    = t('admin.users.prolongation_not_possible')\n\n"
  },
  {
    "path": "app/views/admin/users/_submenu.html.slim",
    "content": "ul.list-unstyled\n  li= link_to t('admin.users.payers'), payers_admin_users_path\n  li= link_to t('admin.users.this_month_payers'), this_month_payers_admin_users_path\n"
  },
  {
    "path": "app/views/admin/users/_table.html.slim",
    "content": "table.table\n  thead\n    tr\n      th= t('admin.tables.id')\n      th= t('admin.tables.email')\n      th= t('admin.tables.plan')\n      th= t('admin.tables.registration_date')\n      th= t('admin.tables.balance')\n      th= t('admin.tables.number_connections')\n      th= t('admin.tables.logged_in_billing')\n      th= t('admin.tables.turnover')\n      th= t('admin.tables.unsuccessful_charges')\n      th= t('admin.tables.state')\n      th= t('admin.tables.actions')\n\n  - @users.each do |user|\n    tr class=\"#{background_highlight(user)}\"\n      td= user.id\n      td= link_to user.email, admin_user_path(user)\n      td= user.plan.name\n      td= human_date(user.created_at)\n      td= user.balance\n      td= user.connects.count\n      td= human_date(user.last_sign_in_at)\n      td= user.total_amount\n      td= user.can_not_withdraw_counter\n      td= user.state\n      td\n        ul.list-unstyled\n          li.pb-1\n            = link_to t('admin.links.edit'), edit_admin_user_path(user), class: 'btn btn-sm btn-info'\n          li\n            = link_to t('admin.links.withdraw'), withdraw_admin_user_path(user), method: :put, class: 'btn btn-sm btn-warning'\n\n= render partial: 'admin/shared/paginate', locals: {collection: @users}\n\n"
  },
  {
    "path": "app/views/admin/users/_test_period.html.slim",
    "content": "legend= t('admin.users.test_period')\n.ml-3\n  - if @user.test_period.enabled?\n    .my-2\n      = t('admin.users.test_period_until', start: @user.test_period_started_at.to_date, finish: @user.test_period.test_period_until)\n    = button_to t('admin.buttons.disable'), disable_test_period_admin_user_path(@user), method: :put, class: 'btn btn-danger'\n  - else\n    = button_to t('admin.buttons.enable'), enable_test_period_admin_user_path(@user), method: :put, class: 'btn btn-success'\n"
  },
  {
    "path": "app/views/admin/users/edit.html.slim",
    "content": "= page_title(t('admin.users.title'), 'user', 'users') do\n  = sub_page_title(\"#{t('admin.users.edit')} #{@user.email}\")\n\n.mt-5\n  .row\n    .col\n      = simple_form_for [:admin, @user], html: { class: 'form-horizontal' },wrapper: :horizontal_form do |f|\n        = f.input :email\n        = f.input :balance\n        = f.input :plan_id, as: :select, collection: Plan.all.map { |p| [p.name, p.id] }, include_blank: false\n        = f.input :state, as: :select, collection: User.aasm.states.map { |s| [s.name, s.name] }\n        = f.input :period_length, input_html: { value: f.object.period_length || User::DEFAULT_TEST_PERIOD }\n        = f.submit t('admin.buttons.apply'), class: 'btn btn-primary'\n"
  },
  {
    "path": "app/views/admin/users/index.html.slim",
    "content": "= page_title(t('admin.users.title'), 'user', 'users')\n\n.row.mt-3\n  .col.col-md-6\n    = link_to t('admin.links.email_list'), emails_export_admin_users_path(q: params[:q]), target: '_blank', class: 'btn btn-primary'\n  = render partial: 'filter'\n\n.row.mb-3\n  .col-md-6\n    = render partial: 'submenu'\n  .col-md-6.text-right\n    = link_to t('admin.links.create'), new_admin_user_path, class: 'btn btn-info'\n= render partial: 'table'\n"
  },
  {
    "path": "app/views/admin/users/new.html.slim",
    "content": "= page_title(t('admin.users.title'), 'user', 'users') do\n  = sub_page_title(t('admin.users.new'))\n\n.mt-5\n  .row\n    .col\n      = simple_form_for [:admin, @user], html: { class: 'form-horizontal' },wrapper: :horizontal_form do |f|\n        = f.input :email\n        = f.input :password\n        = f.input :password_confirmation\n        = f.input :balance\n        = f.input :plan_id, as: :select, collection: Plan.all.map { |p| [p.name, p.id] }, include_blank: false\n        = f.input :period_length, input_html: { value: f.object.period_length || User::DEFAULT_TEST_PERIOD }\n        = f.submit t('admin.buttons.apply'), class: 'btn btn-primary'\n"
  },
  {
    "path": "app/views/admin/users/payers.html.slim",
    "content": "= page_title(t('admin.users.title'), 'user', 'users') do\n  = sub_page_title(t('admin.users.payers'))\n\n.row.mt-3\n  = render partial: 'filter'\n\n.row.mb-3\n  .col-md-6\n    = render partial: 'submenu'\n  .col-md-6.text-right\n    = link_to t('admin.links.create'), new_admin_user_path, class: 'btn btn-info'\n= render partial: 'table'\n"
  },
  {
    "path": "app/views/admin/users/show.html.slim",
    "content": "= page_title(t('admin.users.title'), 'user', 'users') do\n  = sub_page_title(\"#{t('admin.users.show')} #{@user.email}\")\n\n= show_for user do |u|\n\n  legend= t('admin.legends.common')\n  .ml-3\n    = u.attribute :email\n    = u.attribute :balance\n    = u.attribute :sign_in_count\n    = u.attribute :last_sign_in_at\n    = u.attribute :last_sign_in_ip\n    = u.attribute :created_at\n    = u.attribute :plan\n\n  legend= t('admin.legends.referrer_program')\n  .ml-3\n    = u.attribute :referrer\n    = u.attribute :referrals do\n      ul\n        - user.referrals.each do |referral|\n          li= referral\n\n  legend= t('admin.legends.options')\n  .ml-3\n    = u.attribute :options do\n      = user.options.join(', ')\n    = u.attribute :promos do\n      = user.promotions.join(', ')\n\n  legend= t('admin.legends.connection_data')\n  .ml-3\n    = u.attribute :vpn_login\n    = u.attribute :vpn_password\n\n  legend= t('admin.legends.connections')\n  .ml-3\n    = u.attribute :current_connection, label: t('admin.users.current_connection') do\n      = user.connection_status\n    = u.attribute :current_interval_payment_status do\n      = user.current_interval_payment_status\n    = u.attribute :last_connect_date do\n      = human_date user.last_connect_date\n    = u.attribute :last_withdrawal_date do\n      = human_date user.last_withdrawal_date\n    = u.attribute :next_withdrawal_date do\n      = human_date user.next_withdrawal_date\n\n= render partial: 'prolongation'\n= render partial: 'payment'\n= render partial: 'test_period'\n\n- if @user.connected?\n  = button_to 'Force disconnect', force_disconnect_admin_user_path(@user), method: :put, class: 'btn btn-danger'\n"
  },
  {
    "path": "app/views/admin/users/this_month_payers.html.slim",
    "content": "= page_title(t('admin.users.title'), 'user', 'users') do\n  = sub_page_title(t('admin.users.this_month_payers'))\n\n.row.mt-3\n  = render partial: 'filter'\n\n.row.mb-3\n  .col-md-6\n    = render partial: 'submenu'\n  .col-md-6.text-right\n    = link_to t('admin.links.create'), new_admin_user_path, class: 'btn btn-info'\n= render partial: 'table'\n"
  },
  {
    "path": "app/views/admins/confirmations/new.html.erb",
    "content": "<h2>Resend confirmation instructions</h2>\n\n<%= form_for(resource, :as => resource_name, :url => confirmation_path(resource_name), :html => { :method => :post }) do |f| %>\n  <%= devise_error_messages! %>\n\n  <div><%= f.label :email %><br />\n  <%= f.email_field :email %></div>\n\n  <div><%= f.submit \"Resend confirmation instructions\" %></div>\n<% end %>\n\n<%= render :partial => \"devise/shared/links\" %>"
  },
  {
    "path": "app/views/admins/mailer/confirmation_instructions.html.erb",
    "content": "<p>Welcome <%= @resource.email %>!</p>\n\n<p>You can confirm your account through the link below:</p>\n\n<p><%= link_to 'Confirm my account', confirmation_url(@resource, :confirmation_token => @resource.confirmation_token) %></p>\n"
  },
  {
    "path": "app/views/admins/mailer/reset_password_instructions.html.erb",
    "content": "<p>Hello <%= @resource.email %>!</p>\n\n<p>Someone has requested a link to change your password, and you can do this through the link below.</p>\n\n<p><%= link_to 'Change my password', edit_password_url(@resource, :reset_password_token => @resource.reset_password_token) %></p>\n\n<p>If you didn't request this, please ignore this email.</p>\n<p>Your password won't change until you access the link above and create a new one.</p>\n"
  },
  {
    "path": "app/views/admins/mailer/unlock_instructions.html.erb",
    "content": "<p>Hello <%= @resource.email %>!</p>\n\n<p>Your account has been locked due to an excessive amount of unsuccessful sign in attempts.</p>\n\n<p>Click the link below to unlock your account:</p>\n\n<p><%= link_to 'Unlock my account', unlock_url(@resource, :unlock_token => @resource.unlock_token) %></p>\n"
  },
  {
    "path": "app/views/admins/passwords/edit.html.erb",
    "content": "<h2>Change your password</h2>\n\n<%= form_for(resource, :as => resource_name, :url => password_path(resource_name), :html => { :method => :put }) do |f| %>\n  <%= devise_error_messages! %>\n  <%= f.hidden_field :reset_password_token %>\n\n  <div><%= f.label :password, \"New password\" %><br />\n  <%= f.password_field :password %></div>\n\n  <div><%= f.label :password_confirmation, \"Confirm new password\" %><br />\n  <%= f.password_field :password_confirmation %></div>\n\n  <div><%= f.submit \"Change my password\" %></div>\n<% end %>\n\n<%= render :partial => \"devise/shared/links\" %>"
  },
  {
    "path": "app/views/admins/passwords/new.html.erb",
    "content": "<h2>Forgot your password?</h2>\n\n<%= form_for(resource, :as => resource_name, :url => password_path(resource_name), :html => { :method => :post }) do |f| %>\n  <%= devise_error_messages! %>\n\n  <div><%= f.label :email %><br />\n  <%= f.email_field :email %></div>\n\n  <div><%= f.submit \"Send me reset password instructions\" %></div>\n<% end %>\n\n<%= render :partial => \"devise/shared/links\" %>"
  },
  {
    "path": "app/views/admins/registrations/edit.html.erb",
    "content": "<h2>Edit <%= resource_name.to_s.humanize %></h2>\n\n<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put }) do |f| %>\n  <%= devise_error_messages! %>\n\n  <div><%= f.label :email %><br />\n  <%= f.email_field :email %></div>\n\n  <div><%= f.label :password %> <i>(leave blank if you don't want to change it)</i><br />\n  <%= f.password_field :password %></div>\n\n  <div><%= f.label :password_confirmation %><br />\n  <%= f.password_field :password_confirmation %></div>\n\n  <div><%= f.label :current_password %> <i>(we need your current password to confirm your changes)</i><br />\n  <%= f.password_field :current_password %></div>\n\n  <div><%= f.submit \"Update\" %></div>\n<% end %>\n\n<h3>Cancel my account</h3>\n\n<p>Unhappy? <%= link_to \"Cancel my account\", registration_path(resource_name), :confirm => \"Are you sure?\", :method => :delete %>.</p>\n\n<%= link_to \"Back\", :back %>\n"
  },
  {
    "path": "app/views/admins/registrations/new.html.erb",
    "content": "<h2>Sign up</h2>\n\n<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>\n  <%= devise_error_messages! %>\n\n  <div><%= f.label :email %><br />\n  <%= f.email_field :email %></div>\n\n  <div><%= f.label :password %><br />\n  <%= f.password_field :password %></div>\n\n  <div><%= f.label :password_confirmation %><br />\n  <%= f.password_field :password_confirmation %></div>\n\n  <div><%= f.submit \"Sign up\" %></div>\n<% end %>\n\n<%= render :partial => \"devise/shared/links\" %>\n"
  },
  {
    "path": "app/views/admins/sessions/new.html.slim",
    "content": "= form_for resource, as: resource_name, url: session_path(resource_name), html: { class: \"form-login form-wrapper form-narrow\" } do |f|\n  h3.title-divider\n    span= t('admins.sessions.new.staff_entrance')\n\n  = f.email_field :email, class: \"input-block-level\", placeholder: t('admins.sessions.new.email')\n  = f.password_field :password, class: \"input-block-level\", placeholder: t('admins.sessions.new.password')\n\n  = f.submit t('admins.sessions.new.sign_in'), class: \"btn btn-primary\"\n"
  },
  {
    "path": "app/views/admins/shared/_links.erb",
    "content": "<%- if controller_name != 'sessions' %>\n  <%= link_to \"Sign in\", new_session_path(resource_name) %><br />\n<% end -%>\n\n<%- if devise_mapping.registerable? && controller_name != 'registrations' %>\n  <%= link_to \"Sign up\", new_registration_path(resource_name) %><br />\n<% end -%>\n\n<%- if devise_mapping.recoverable? && controller_name != 'passwords' %>\n  <%= link_to \"Forgot your password?\", new_password_path(resource_name) %><br />\n<% end -%>\n\n<%- if devise_mapping.confirmable? && controller_name != 'confirmations' %>\n  <%= link_to \"Didn't receive confirmation instructions?\", new_confirmation_path(resource_name) %><br />\n<% end -%>\n\n<%- if devise_mapping.lockable? && resource_class.unlock_strategy_enabled?(:email) && controller_name != 'unlocks' %>\n  <%= link_to \"Didn't receive unlock instructions?\", new_unlock_path(resource_name) %><br />\n<% end -%>\n\n<%- if devise_mapping.omniauthable? %>\n  <%- resource_class.omniauth_providers.each do |provider| %>\n    <%= link_to \"Sign in with #{provider.to_s.titleize}\", omniauth_authorize_path(resource_name, provider) %><br />\n  <% end -%>\n<% end -%>"
  },
  {
    "path": "app/views/admins/unlocks/new.html.erb",
    "content": "<h2>Resend unlock instructions</h2>\n\n<%= form_for(resource, :as => resource_name, :url => unlock_path(resource_name), :html => { :method => :post }) do |f| %>\n  <%= devise_error_messages! %>\n\n  <div><%= f.label :email %><br />\n  <%= f.email_field :email %></div>\n\n  <div><%= f.submit \"Resend unlock instructions\" %></div>\n<% end %>\n\n<%= render :partial => \"devise/shared/links\" %>"
  },
  {
    "path": "app/views/application/_notifications.html.slim",
    "content": ".notifications\n  - if notice\n    .alert.alert-success\n      button type=\"button\" class=\"close\" data-dismiss=\"alert\"\n        = \"×\"\n      = notice\n  - if alert\n    .alert.alert-error= alert if alert\n"
  },
  {
    "path": "app/views/billing/home/_account_info.html.slim",
    "content": "- # TODO: move all this complex logic to decorator\nh2.title-divider\n  span.de-em= t('billing.home.account_info.account_info')\n.info\n  p= \"Email: #{current_user.email}\"\n  p= \"#{t('billing.home.account_info.balance')}: #{human_usd_amount current_user.balance}\"\n  p= \"#{t('billing.home.account_info.plan')}: #{current_user.plan.name}\"\n  p\n    = \"#{t('billing.home.account_info.vpn_state')}: \"\n    = t(\"billing.home.account_info.states.#{current_user.service_enabled?}\")\n  p= \"#{t('billing.home.account_info.promotions')}: #{enabled_options}\" if current_user.promotions.with_active_promos.any?\n\n  - if current_user.test_period.enabled?\n    p\n      = t('billing.home.account_info.test_period')\n      = t('billing.home.account_info.test_period_range', from: human_date(current_user.test_period_started_at.to_date, time: false), to: human_date(current_user.test_period.test_period_until, time: false))\n\n  .hero-unit.collapsable-credentials\n    .toggler= link_to t('billing.home.account_info.vpn_credentials'), \"#\"\n    .vpn-credential= \"#{t('billing.home.account_info.login')}: #{current_user.vpn_login}\"\n    .vpn-credential= \"#{t('billing.home.account_info.password')}: #{current_user.vpn_password}\"\n"
  },
  {
    "path": "app/views/billing/home/_current_connection.html.slim",
    "content": "h2.title-divider\n  span.de-em= t('billing.home.current_connection.connection_info')\n.info\n  p\n    = \"#{t('billing.home.current_connection.connection_exists')}: \"\n    = t(\"billing.home.current_connection.connection_status.#{@connected.present?}\")\n  - if @connected\n    p= \"#{t('billing.home.current_connection.connection_server')}: #{@connection_server.hostname}\"\n  p\n    - if was_connected?\n      = \"#{t('billing.home.current_connection.last_connect')}: \"\n      = \"#{human_date(current_user.last_connect.created_at)}\"\n      - unless @connected\n        = \"#{t('billing.home.current_connection.server')} #{current_user.last_connect.server.hostname}\"\n\n\n"
  },
  {
    "path": "app/views/billing/home/_last_transactions.html.slim",
    "content": "h2.title-divider\n  span.de-em= t('billing.home.last_transactions.payments_stat')\n.info\n  table.table.table-bordered\n    thead\n      tr\n        th= t('transaction.id')\n        th= t('transaction.amount')\n        th= t('transaction.date')\n        th= t('transaction.description')\n    tbody\n      - @transactions.each do |transaction|\n        tr\n          td= transaction.id\n          td= transaction.amount\n          td= transaction.date\n          td= transaction.description\n\n= paginate @transactions\n"
  },
  {
    "path": "app/views/billing/home/index.html.slim",
    "content": ".container\n  = render \"account_info\"\n  = render \"current_connection\"\n  br\n  = render \"last_transactions\"\n"
  },
  {
    "path": "app/views/billing/options/_subscribed_options.html.slim",
    "content": "- if options.any?\n  legend=t('billing.options.enabled')\n  table.table.table-bordered\n    thead\n      tr\n        th= t('billing.options.name')\n        th= t('billing.options.settings')\n        th= t('billing.options.subscription_status')\n    tbody\n      - options.each do |option|\n        tr.option\n          td= option.name\n          td\n            - if !current_user.connected?\n              = option_settings(option)\n              = option_toggle_button(option)\n            - else\n              = t('billing.options.disconnect_to_tune_options')\n          td= unsubscribe_option_button(option)\n\n"
  },
  {
    "path": "app/views/billing/options/_unsubscribed_options.html.slim",
    "content": "- if options.any?\n  legend=t('billing.options.available')\n  table.table.table-bordered\n    thead\n      tr\n        th= t('billing.options.name')\n        th= t('billing.options.price')\n        th= t('billing.options.subscription_status')\n    tbody\n      - options.each do |option|\n        tr.option\n          td= option.name\n          td= human_price plans_option_price(current_user.plan, option.code)\n          td= subscribe_option_button(option)\n\n"
  },
  {
    "path": "app/views/billing/options/index.html.slim",
    "content": "- if current_user.paid?\n  = render partial: 'subscribed_options', locals: { options: @subscribed_user_options }\n  = render partial: 'unsubscribed_options', locals: { options: @unsubscribed_user_options }\n- else\n  .alert.alert-warning= t('billing.options.notices.activate_subscription_first')\n\n"
  },
  {
    "path": "app/views/billing/payments/forms/_cc.html.slim",
    "content": "- require 'active_merchant/billing/integrations/action_view_helper'\n- ActionView::Base.send(:include, ActiveMerchant::Billing::Integrations::ActionViewHelper)\n\n= payment_service_for @payment.id, Settings.robokassa.login,\n                        :amount => @payment.amount,\n                        :service => :robokassa,\n                        :secret => Settings.robokassa.secret1 do |s|\n  = submit_tag t('billing.payments.merchant.submit'), class: \"btn btn-large btn-primary\"\n"
  },
  {
    "path": "app/views/billing/payments/forms/_paypal.html.erb",
    "content": "<form action=\"https://www.paypal.com/cgi-bin/webscr\" method=\"post\" target=\"_top\">\n  <input type=\"hidden\" name=\"cmd\" value=\"_s-xclick\">\n  <input type=\"hidden\" name=\"hosted_button_id\" value=\"TKBXKM24TBHLW\">\n  <input type=\"hidden\" name=\"item_number\" value=\"<%= @payment.id %>\">\n  <input type=\"hidden\" name=\"amount\" value=\"<%= @payment.amount %>\">\n  <input type=\"image\" src=\"https://www.paypalobjects.com/ru_RU/RU/i/btn/btn_buynowCC_LG.gif\" border=\"0\" name=\"submit\" alt=\"PayPal — более безопасный и легкий способ оплаты через Интернет!\">\n  <img alt=\"\" border=\"0\" src=\"https://www.paypalobjects.com/ru_RU/i/scr/pixel.gif\" width=\"1\" height=\"1\">\n</form>\n"
  },
  {
    "path": "app/views/billing/payments/forms/_wmr.html.slim",
    "content": "- require 'active_merchant/billing/integrations/action_view_helper'\n- ActionView::Base.send(:include, ActiveMerchant::Billing::Integrations::ActionViewHelper)\n\n= payment_service_for @payment.id, Settings.webmoney.wallet.wmr,\n                        :amount => @payment.amount,\n                        :description => \"##{@payment.id}\",\n                        :fail_url => billing_webmoney_fail_url,\n                        :success_url => billing_webmoney_success_url,\n                        :result_url => billing_webmoney_result_url,\n                        :service => :webmoney do |s|\n  = submit_tag t('billing.payments.merchant.submit'), class: \"btn btn-large btn-primary\"\n"
  },
  {
    "path": "app/views/billing/payments/forms/_wmz.html.slim",
    "content": "- require 'active_merchant/billing/integrations/action_view_helper'\n- ActionView::Base.send(:include, ActiveMerchant::Billing::Integrations::ActionViewHelper)\n\n= payment_service_for @payment.id, Settings.webmoney.wallet.wmz,\n                        :amount => @payment.amount,\n                        :description => \"##{@payment.id}\",\n                        :fail_url => billing_webmoney_fail_url,\n                        :success_url => billing_webmoney_success_url,\n                        :result_url => billing_webmoney_result_url,\n                        :service => :webmoney do |s|\n  = submit_tag t('billing.payments.merchant.submit'), class: \"btn btn-large btn-primary\"\n"
  },
  {
    "path": "app/views/billing/payments/forms/_yandex.html.slim",
    "content": "- require 'active_merchant/billing/integrations/action_view_helper'\n- ActionView::Base.send(:include, ActiveMerchant::Billing::Integrations::ActionViewHelper)\n\n= payment_service_for @payment.id, Settings.robokassa.login,\n                        :amount => @payment.amount,\n                        :service => :robokassa,\n                        :secret => Settings.robokassa.secret1 do |s|\n  = submit_tag t('billing.payments.merchant.submit'), class: \"btn btn-large btn-primary\"\n"
  },
  {
    "path": "app/views/billing/payments/index.html.slim",
    "content": "h2.title-divider\n  span\n    span.de-em\n      = \"#{t('billing.payments.index.accepted')} \"\n      = t('billing.payments.index.pay_systems')\n  small= t('billing.payments.index.all')\n\nul.thumbnails.block.customers\n  - @pay_systems.each do |pay_system|\n    li.span4.type-web\n      = link_to new_billing_payment_path(code: pay_system.code) do\n        span.inner-wrapper\n          span.img-wrapper\n            = image_tag \"pay_system_logos/#{pay_system.code}_logo.png\"\n          span.title= pay_system.name\n          span.description= pay_system.description\n"
  },
  {
    "path": "app/views/billing/payments/merchant.html.slim",
    "content": "h2.title-divider\n  span\n    span.de-em\n      = t('billing.payments.merchant.payment_finalization')\n\n.hero-unit\n  = image_tag \"pay_system_logos/#{@payment.pay_system.code}_logo.png\"\n  p= raw t('billing.payments.merchant.payment_finalization_text')\n  p= render partial: \"billing/payments/forms/#{@payment.pay_system.code}\"\n"
  },
  {
    "path": "app/views/billing/payments/new.html.slim",
    "content": "h2.title-divider\n  span\n    span.de-em\n      = t('billing.payments.new.balance_fullfillment')\n\n= image_tag \"pay_system_logos/#{@pay_system.code}_logo.png\"\n= simple_form_for [:billing, @payment] do |f|\n  = f.input :amount\n  = f.input :pay_system_id, as: :hidden\n  p\n    = label_tag :pay_system, t('activerecord.attributes.payment.pay_system')\n    = text_field_tag :pay_system, @pay_system.name, readonly: true\n  = f.submit t('billing.payments.new.submit'), class: 'big btn btn-primary'\n\n"
  },
  {
    "path": "app/views/billing/referrers/_operations.html.slim",
    "content": "legend=t('billing.referrals.operations')\n- if @operations.any?\n  table.table.table-bordered\n      thead\n        tr\n          th= t('billing.referrals.email')\n          th= t('billing.referrals.amount')\n          th= t('billing.referrals.date')\n      tbody\n        - @operations.each do |reward|\n          tr\n            td= reward.operation.user.email\n            td= reward.amount\n            td= human_date reward.created_at, time: true\n- else\n  p= t('billing.referrals.no_operations')\n\n\n"
  },
  {
    "path": "app/views/billing/referrers/_referrals.html.slim",
    "content": "legend=t('billing.referrals.referrals')\n\n- if @referrals.any?\n  table.table.table-bordered\n    thead\n      tr\n        th= t('billing.referrals.email')\n        th= t('billing.referrals.registration_date')\n    tbody\n      - @referrals.each do |referral|\n        tr\n          td= referral.email\n          td= human_date referral.created_at, time: true\n- else\n  p= t('billing.referrals.no_referrals')\n\n"
  },
  {
    "path": "app/views/billing/referrers/index.html.slim",
    "content": "legend=t('billing.referrals.title')\np= raw t('billing.referrals.disclaimer')\n\nh4= t('billing.referrals.account_balance', balance: @account.balance)\n= text_field_tag :reflink, referrer_url(code: current_user.reflink), disabled: true, class: 'reflink-input'\n\n= render partial: 'referrals'\n= render partial: 'operations'\n"
  },
  {
    "path": "app/views/billing/servers/index.html.slim",
    "content": "legend=t('billing.servers.title')\n\ntable.table.table-bordered\n  thead\n    tr\n      th= t('billing.servers.country')\n      th= t('billing.servers.hostname')\n      th= t('billing.servers.port')\n      th= t('billing.servers.protocol')\n      th= t('billing.servers.config')\n  tbody\n    - @servers.each do |server|\n      tr\n        td= server_country_name(server)\n        td= server.hostname\n        td= server.port\n        td= server.protocol.upcase\n        td= button_to t('billing.servers.download_config'), download_config_billing_server_path(server), method: :get, class: 'btn btn-primary'\n\n"
  },
  {
    "path": "app/views/kaminari/_first_page.html.erb",
    "content": "<li class=\"page-item\">\n  <%= link_to_unless current_page.first?, raw(t 'views.pagination.first'), url, remote: remote, class: 'page-link' %>\n</li>\n"
  },
  {
    "path": "app/views/kaminari/_gap.html.erb",
    "content": "<li class='page-item disabled'>\n  <%= link_to raw(t 'views.pagination.truncate'), '#', class: 'page-link' %>\n</li>\n"
  },
  {
    "path": "app/views/kaminari/_last_page.html.erb",
    "content": "<li class=\"page-item\">\n  <%= link_to_unless current_page.last?, raw(t 'views.pagination.last'), url, remote: remote, class: 'page-link' %>\n</li>\n"
  },
  {
    "path": "app/views/kaminari/_next_page.html.erb",
    "content": "<li class=\"page-item\">\n  <%= link_to_unless current_page.last?, raw(t 'views.pagination.next'), url, rel: 'next', remote: remote, class: 'page-link' %>\n</li>\n"
  },
  {
    "path": "app/views/kaminari/_page.html.erb",
    "content": "<% if page.current? %>\n  <li class=\"page-item active\">\n    <%= content_tag :a, page, data: { remote: remote }, rel: (page.next? ? 'next' : (page.prev? ? 'prev' : nil)), class: 'page-link' %>\n  </li>\n<% else %>\n  <li class=\"page-item\">\n    <%= link_to page, url, remote: remote, rel: (page.next? ? 'next' : (page.prev? ? 'prev' : nil)), class: 'page-link' %>\n  </li>\n<% end %>\n"
  },
  {
    "path": "app/views/kaminari/_paginator.html.erb",
    "content": "<%= paginator.render do %>\n  <nav>\n    <ul class=\"pagination\">\n      <%= first_page_tag unless current_page.first? %>\n      <%= prev_page_tag unless current_page.first? %>\n      <% each_page do |page| %>\n        <% if page.left_outer? || page.right_outer? || page.inside_window? %>\n          <%= page_tag page %>\n        <% elsif !page.was_truncated? -%>\n          <%= gap_tag %>\n        <% end %>\n      <% end %>\n      <%= next_page_tag unless current_page.last? %>\n      <%= last_page_tag unless current_page.last? %>\n    </ul>\n  </nav>\n<% end %>\n"
  },
  {
    "path": "app/views/kaminari/_prev_page.html.erb",
    "content": "<li class=\"page-item\">\n  <%= link_to_unless current_page.first?, raw(t 'views.pagination.previous'), url, rel: 'prev', remote: remote, class: 'page-link' %>\n</li>\n"
  },
  {
    "path": "app/views/layouts/admin.html.slim",
    "content": "doctype html\r\nhtml lang='en-us'\r\n  head\r\n    meta content='text/html; charset=UTF-8' http-equiv='Content-Type'\r\n    meta charset='utf-8'\r\n    title= t('admin.layout.title', brand: ENV['BRAND_NAME'])\r\n    meta content='width=device-width, initial-scale=1.0' name='viewport'\r\n    meta content='' name='description'\r\n    meta content='' name='author'\r\n    = javascript_include_tag :admin\r\n    = stylesheet_link_tag :admin\r\n    = csrf_meta_tags\r\n    link rel='shortcut icon' href='img/favicon/favicon.ico' type='image/x-icon'\r\n    link rel='icon' href='img/favicon/favicon.ico' type='image/x-icon'\r\n\r\n  body\r\n    header\r\n      nav.navbar.navbar-expand-md.navbar-dark.bg-dark\r\n        = link_to ENV['BRAND_NAME'], admin_root_path, class: 'navbar-brand'\r\n        ul.navbar-nav.ml-auto.mr-3\r\n          = change_locale_link\r\n          li.nav-item.dropdown\r\n            = link_to '#', id: 'navbarDropdown',\r\n                                   class: 'nav-link dropdown-toggle',\r\n                                   role: 'button',\r\n                                   'data-toggle': 'dropdown' do\r\n              i.navbar-toggler-icon\r\n            .dropdown-menu.dropdown-menu-right\r\n              = link_to t('admin.layout.change_password'), edit_admin_profile_path, class: 'dropdown-item'\r\n              hr\r\n              = link_to t('admin.layout.sign_out'), destroy_admin_session_path, method: :delete, class: 'dropdown-item'\r\n\r\n    .container-fluid.h-100\r\n      .row.d-flex.h-100\r\n        aside.col-md-2.p-0.bg-dark\r\n          nav.navbar.navbar-expand.navbar-dark.bg-dark.flex-md-column.flex-row.align-items-start.py-2\r\n            = render partial: 'admin/shared/menu'\r\n\r\n        main.col-md-9.ml-sm-auto.col-lg-10.pt-3.px-4 role='main'\r\n          = render partial: 'application/notifications'\r\n          = yield\r\n"
  },
  {
    "path": "app/views/layouts/application.html.slim",
    "content": "doctype html\nhtml lang=\"ru\"\n  head\n    meta content=\"text/html; charset=UTF-8\" http-equiv=\"Content-Type\"\n    meta charset=\"utf-8\"\n    title SmartVPN\n    meta content=\"width=device-width, initial-scale=1.0\" name=\"viewport\"\n    meta content=\"\" name=\"description\"\n    meta content=\"Themelize.me\" name=\"author\"\n    = javascript_include_tag :application\n    = stylesheet_link_tag :application\n    link href=\"https://fonts.googleapis.com/css?family=Open+Sans:400,700,300|Rambla|Calligraffitti\" rel=\"stylesheet\" type=\"text/css\"\n\n  body.page.page-index-static\n    #navigation.wrapper\n      .navbar.navbar-static-top\n        /! Header & Branding region\n        .header\n          .header-inner.container\n            .row-fluid\n              .span6\n                /! branding/logo\n                = link_to root_path, class: \"brand\", title: \"Home\" do\n                  h1\n                    span Smart\n                    | VPN\n                    span .\n                .slogan\n                  = \"Opensource solution for custom VPN service\"\n\n              /! header rightside\n              .span6\n                /! social media icons\n                .social-media.pull-right\n                  a href=\"#\"\n                    i.icon-twitter\n                  | &nbsp;\n                  a href=\"#\"\n                    i.icon-facebook\n                  | &nbsp;\n                  a href=\"#\"\n                    i.icon-linkedin\n                  | &nbsp;\n                  a href=\"#\"\n                    i.icon-google-plus\n\n        .container\n          .navbar-inner\n            /! mobile collapse menu button\n            a.btn.btn-navbar.pull-left data-target=\".nav-collapse\" data-toggle=\"collapse\"\n              span.icon-bar\n              span.icon-bar\n              span.icon-bar\n              span.icon-bar\n\n            /! user menu\n            ul.nav.user-menu.pull-right\n              - if current_user\n                li= link_to t('main.billing'), \"#\", class: \"btn btn-primary signup\"\n                li= button_to t('main.auth.sign_out'), destroy_user_session_path, method: :delete, class: \"btn btn-primary login\"\n              - else\n                li= link_to t('main.auth.sign_up'), new_user_registration_path, class: \"btn btn-primary signup\"\n                li.dropdown= link_to t('main.auth.sign_in'), new_user_session_path, class: \"btn btn-primary login\", id: \"login-drop\"\n\n            /! everything within this div is collapsed on mobile\n            .nav-collapse.collapse\n              /! main navigation\n              ul#main-menu.nav\n                li.home-link\n                  = link_to root_path do\n                    i.icon-home.hidden-phone\n                    span.visible-phone Home\n                li\n                  a#about-drop\n                    = \"О компании\"\n                li.dropdown\n                  a#features-drop.dropdown-toggle.menu-item data-toggle=\"dropdown\" href=\"features.htm\"\n                    = \"Услуги\"\n                li\n                  a.menu-item href=\"#\"\n                    = \"Тарифы\"\n                li\n                  = link_to \"Блог\", \"#\", id: \"blog-drop\"\n                li\n                  a.menu-item href=\"#\"\n                    = \"Помощь\"\n                li\n                  a#pages-drop\n                    = \"Контакты\"\n\n          = render partial: \"notifications\"\n          = yield\n\n    /! FOOTER\n    footer#footer\n      .container\n        .row\n          .span3.col\n            .block.contact-block\n              h3 Контакты\n              address\n                p\n                  abbr title=\"Email\"\n                    i.icon-envelope= \" admin@smartvpn.biz\"\n          .span5.col\n            .block\n              h3 О компании\n              p Наша компания предоставляет полный спектр услуг VPN. От базовых для домашнего использования до профессиональных тарифных планов.\n          .span4.col\n            .block.newsletter\n              h3 Рассылка\n              p Подпишитесь на нашу рассылку и будьте в курсе всех последних новостей и специальных предложений сервиса\n              form.form-inline\n                .input-append\n                  input.input-medium placeholder=\"Email\" type=\"text\"\n                  button.btn.btn-primary type=\"button\" Подписаться\n\n        .row-fluid\n          .subfooter\n            .span6\n              p\n                a href=\"#\"\n                | Copyright © SmartVPN.\n            .span6\n              ul.inline.pull-right\n                li\n                  a href=\"#\"\n                li\n                  a href=\"#\"\n                li\n                  a href=\"#\"\n\n"
  },
  {
    "path": "app/views/layouts/billing.html.slim",
    "content": "doctype html\nhtml lang=\"ru\"\n  head\n    meta content=\"text/html; charset=UTF-8\" http-equiv=\"Content-Type\"\n    meta charset=\"utf-8\"\n    title SmartVPN | Billing\n    meta content=\"width=device-width, initial-scale=1.0\" name=\"viewport\"\n    meta content=\"\" name=\"description\"\n    meta content=\"Themelize.me\" name=\"author\"\n    = render partial: \"shared/rollbar_js\"\n    = javascript_include_tag :application\n    = stylesheet_link_tag :application\n    = csrf_meta_tags\n    link href=\"https://fonts.googleapis.com/css?family=Open+Sans:400,700,300|Rambla|Calligraffitti\" rel=\"stylesheet\" type=\"text/css\"\n\n  body.page.page-index-static\n    #navigation.wrapper\n      .navbar.navbar-static-top\n        .header\n          .header-inner.container\n            .row-fluid\n              .span6\n                = link_to root_path, class: \"brand\", title: \"Home\" do\n                  h1\n                    span Smart\n                    | VPN\n                    span .\n                .slogan\n                  = t('layouts.billing.billing')\n\n        .container\n          .navbar-inner\n            /! mobile collapse menu button\n            a.btn.btn-navbar.pull-left data-target=\".nav-collapse\" data-toggle=\"collapse\"\n              span.icon-bar\n              span.icon-bar\n              span.icon-bar\n              span.icon-bar\n\n            /! user menu\n            ul.nav.user-menu.pull-right\n              li= button_to t('main.auth.sign_out'), destroy_user_session_path, method: :delete, class: \"btn btn-primary login\"\n\n            /! everything within this div is collapsed on mobile\n            .nav-collapse.collapse\n              /! main navigation\n              ul#main-menu.nav\n                li.home-link\n                  = link_to billing_root_path do\n                    i.icon-home.hidden-phone\n                    span.visible-phone Home\n                li= link_to t('layouts.billing.menu.servers'), billing_servers_path\n                li= link_to t('layouts.billing.menu.payment'), billing_payments_path\n                li= link_to t('layouts.billing.menu.options'), billing_options_path\n                li= link_to t('layouts.billing.menu.referrers'), billing_referrers_path\n                li= link_to t('layouts.billing.menu.profile'), edit_user_registration_path\n\n          = render partial: 'application/notifications'\n          = yield\n          = render partial: \"shared/zendesk\"\n\n\n  - if Rails.env.production?\n    = render partial: \"shared/yandex_metrika\"\n"
  },
  {
    "path": "app/views/layouts/blank.html.slim",
    "content": "doctype 5\nhtml lang=\"ru\"\n  head\n    meta content=\"text/html; charset=UTF-8\" http-equiv=\"Content-Type\"\n    meta charset=\"utf-8\"\n    title SmartVPN\n    meta content=\"width=device-width, initial-scale=1.0\" name=\"viewport\"\n    meta content=\"\" name=\"description\"\n    meta content=\"Themelize.me\" name=\"author\"\n    = javascript_include_tag :application\n    = stylesheet_link_tag :application\n    link href=\"https://fonts.googleapis.com/css?family=Open+Sans:400,700,300|Rambla|Calligraffitti\" rel=\"stylesheet\" type=\"text/css\"\n\n  body.page.page-index-static\n    #navigation.wrapper\n      .navbar.navbar-static-top\n        .header\n          .header-inner.container\n            .row-fluid\n              .span6\n                = link_to root_path, class: \"brand\", title: \"Home\" do\n                  h1\n                    span Smart\n                    | VPN\n                    span .\n                .slogan\n                  = \"Opensource solution for custom VPN service\"\n\n    .content\n      .container\n        = render partial: 'application/notifications'\n        = yield\n\n\n"
  },
  {
    "path": "app/views/mailers/_signature.html.slim",
    "content": "hr\n\n' #{t('user_mailer.signature.with_great_honor')}, #{t('user_mailer.signature.support')}\n=> link_to ENV['BRAND_NAME'], root_url\n"
  },
  {
    "path": "app/views/mailers/user_connection_config_mailer/notify.html.slim",
    "content": "p= \"Hello #{@user.email}!\"\np= 'An account has been created for you'\np= \"Login: #{@user.vpn_login}, password: #{@user.vpn_password}\"\n\n= render partial: 'mailers/signature'\n"
  },
  {
    "path": "app/views/mailers/user_mailer/balance_withdrawal.html.slim",
    "content": "p\n  = \"#{t('mailers.user_mailer.balance_withdrawal.hello')}, #{@user.email}\"\n\np\n  = t('mailers.user_mailer.balance_withdrawal.we_have_withdrawed', amount: @amount)\n\n= render partial: 'mailers/signature'\n"
  },
  {
    "path": "app/views/mailers/user_mailer/could_not_withdraw_funds.html.slim",
    "content": "p\n  = \"#{t('user_mailer.could_not_withdraw_funds.hello')}, #{@user.email}\"\n\np\n  = t('user_mailer.could_not_withdraw_funds.could_not_withdraw', amount: @amount)\n\n= render partial: 'mailers/signature'\n"
  },
  {
    "path": "app/views/mailers/user_mailer/funds_recieved.html.slim",
    "content": "p\n  = \"#{t('mailers.user_mailer.funds_recieved.hello')}, #{@user.email}\"\n\np\n  ' #{t('mailers.user_mailer.funds_recieved.your_balance_was_fulfilled_on')}\n    #{@amount} USD\n\n= render partial: 'mailers/signature'\n"
  },
  {
    "path": "app/views/mailers/user_mailer/test_period_enabled.html.slim",
    "content": "p\n  = \"#{t('user_mailer.test_period_enabled.hello')}, #{@user.email}\"\n\np\n  = t('user_mailer.test_period_enabled.test_period_is_activated')\n  br\n  = t('user_mailer.test_period_enabled.test_period_range', from: human_date(@user.test_period_started_at, time: false), to: human_date(@user.test_period.test_period_until, time: false))\n  br\n  = t('user_mailer.test_period_enabled.instructions')\n\n= render partial: 'mailers/signature'\n"
  },
  {
    "path": "app/views/mailers/user_mailer/unpaid_user_notification.html.slim",
    "content": "p= raw t('mailers.user_mailer.unpaid_user_notification.message')\n\n= render partial: 'mailers/signature'\n"
  },
  {
    "path": "app/views/main/auth.html.slim",
    "content": ""
  },
  {
    "path": "app/views/main/index.html.slim",
    "content": "#highlighted.hero\n  .inner\n    /! Static Banner\n    section.static-banner.container\n      .row-fluid\n        .span7\n          = image_tag(\"/assets/openvpn.jpg\")\n        .span5.caption\n          h2 Подпишитесь\n          p и мы сообщим, когда нас сервис откроется\n          a.btn.btn-large.btn-primary href=\"#\"\n            = \"Подписаться\"\n#content\n  .container\n    /! Services\n    .block.features\n      h2.title-divider\n        span\n          | \n          span.de-em Отличительные особенности\n        small То, то отличает нас от других провайдеров VPN\n      ul.thumbnails\n        li.span3\n          a href=\"features.htm\"\n            img alt=\"Feature 1\" src=\"/assets/img/features/feature-1.png\"\n          h3.title\n            a href=\"features.htm\"\n              | Защита и \n              span.de-em Анонимность\n          p Ваша активность в интернете под надежной защитой\n        li.span3\n          a href=\"features.htm\"\n            img alt=\"Feature 2\" src=\"/assets/img/features/feature-2.png\"\n          h3.title\n            a href=\"features.htm\"\n              | 24/7 \n              span.de-em Техническая поддержка\n          p Наши технические специалисты помогут вам решить любую проблему\n        li.span3\n          a href=\"features.htm\"\n            img alt=\"Feature 3\" src=\"/assets/img/features/feature-3.png\"\n          h3.title\n            a href=\"features.htm\"\n              | Гибкая настройка\n              span.de-em\n          p Выберите сами пакет дополнительных опций\n        li.span3\n          a href=\"features.htm\"\n            img alt=\"Feature 4\" src=\"/assets/img/features/feature-4.png\"\n          h3.title\n            a href=\"features.htm\"\n              | 99.9% \n              span.de-em Максимальная доступность\n          p В любую секунду наш сервис доступен вам на максимальной скорости\n\n\n    /! Pricing Table\n    .block\n      h2.title-divider\n        span\n          | Тарифные \n          span.de-em планы\n        small От бюджетных до премиум предложений\n      .row.pricing-stack\n        .offset1.span3\n          .well\n            h3.title Эконом\n            p.price\n              span.fancy 1$!\n            ul.unstyled.points\n              li Неограниченный траффик\n              li Статический IP\n              li Логи хранятся 20 дней\n              li Скорость делится между клиентами\n            a.btn.btn-primary Купить подписку\n        .span4\n          .well.active\n            h3.title\n              span.em Премиум\n              span.fancy\n            p.price\n              span.currency $\n              span.digits\n                | 30\n                span .0\n              span.term /MO\n            ul.unstyled.points\n              li Double chained VPN\n              li Автоматическое подключение Socks\n              li Возможность использования Tor\n              li Гарантия отсутствия логов\n            a.btn.btn-primary Купить подписку\n        .span3\n          .well\n            h3.title\n              | Стандарт\n              span.fancy\n            p.price\n              span.currency $\n              span.digits\n                | 10\n                span .0\n              span.term /MO\n            ul.unstyled.points\n              li Гарантированая скорость\n              li Неограниченный траффик\n              li Возможность использования Tor\n              li Гарантия отсутствия логов\n            a.btn.btn-primary Купить подписку\n\n      .row-fluid\n        /! Plan features\n        .well.well-mini.pull-center\n          h4.inline-el.pad-right\n            span\n              | Все тарифы \n              span.de-em включают\n              = \":\"\n          p.inline-el.pad-left.muted\n            | неограниченный траффик, \n            span.spacer\n            | 24/7 техническую поддержку, \n            span.spacer\n            | выбор расположения сервера, \n\n#content-below.wrapper\n  .container\n    .row-fluid\n      .upsell\n        small.muted\n          | 99.9% доступность, \n          span.spacer\n          | неограниченная скорость, \n          span.spacer\n          | 24/7 техническая поддержка, \n          span.spacer\n          | тарифы от 1$ в месяц \n        a.btn.btn-primary href=\"pricing.htm\"\n          | Стать клиентом!\n          i.icon-arrow-right\n"
  },
  {
    "path": "app/views/shared/_footer.html.slim",
    "content": "footer#footer\n  - if Rails.env.production?\n    = render partial: \"shared/yandex_metrika\"\n  .container\n    .row\n      .span3.col\n        .block.contact-block\n          h3 Контакты\n          address\n            p\n              abbr title=\"Email\"\n                i.icon-envelope= \" admin@smartvpn.biz\"\n"
  },
  {
    "path": "app/views/shared/_rollbar_js.html.erb",
    "content": "<script>\nvar _rollbarParams = {\"server.environment\": \"production\"};\n_rollbarParams[\"notifier.snippet_version\"] = \"2\"; var _rollbar=[\"31b37cd660fd4b449ffcc1422f56739a\", _rollbarParams]; var _ratchet=_rollbar;\n(function(w,d){w.onerror=function(e,u,l,c,err){_rollbar.push({_t:'uncaught',e:e,u:u,l:l,c:c,err:err});};var i=function(){var s=d.createElement(\"script\");var \n f=d.getElementsByTagName(\"script\")[0];s.src=\"//d37gvrvc0wt4s1.cloudfront.net/js/1/rollbar.min.js\";s.async=!0;\n f.parentNode.insertBefore(s,f);};if(w.addEventListener){w.addEventListener(\"load\",i,!1);}else{w.attachEvent(\"onload\",i);}})(window,document);\n</script>\n\n"
  },
  {
    "path": "app/views/shared/_yandex_metrika.html.erb",
    "content": "<!-- Yandex.Metrika counter -->\n<script type=\"text/javascript\">\n(function (d, w, c) {\n    (w[c] = w[c] || []).push(function() {\n        try {\n            w.yaCounter23551255 = new Ya.Metrika({id:23551255,\n                    webvisor:true,\n                    clickmap:true,\n                    trackLinks:true,\n                    accurateTrackBounce:true});\n        } catch(e) { }\n    });\n\n    var n = d.getElementsByTagName(\"script\")[0],\n        s = d.createElement(\"script\"),\n        f = function () { n.parentNode.insertBefore(s, n); };\n    s.type = \"text/javascript\";\n    s.async = true;\n    s.src = (d.location.protocol == \"https:\" ? \"https:\" : \"http:\") + \"//mc.yandex.ru/metrika/watch.js\";\n\n    if (w.opera == \"[object Opera]\") {\n        d.addEventListener(\"DOMContentLoaded\", f, false);\n    } else { f(); }\n})(document, window, \"yandex_metrika_callbacks\");\n</script>\n<noscript><div><img src=\"//mc.yandex.ru/watch/23551255\" style=\"position:absolute; left:-9999px;\" alt=\"\" /></div></noscript>\n<!-- /Yandex.Metrika counter -->\n"
  },
  {
    "path": "app/views/shared/_zendesk.html.erb",
    "content": "<script type=\"text/javascript\" src=\"//assets.zendesk.com/external/zenbox/v2.6/zenbox.js\"></script>\n<style type=\"text/css\" media=\"screen, projection\">\n  @import url(//assets.zendesk.com/external/zenbox/v2.6/zenbox.css);\n</style>\n<script type=\"text/javascript\">\n  if (typeof(Zenbox) !== \"undefined\") {\n        Zenbox.init({\n                  dropboxID:   \"20263883\",\n                        url:         \"https://smartvpn.zendesk.com\",\n                              tabTooltip:  \"Поддержка\",\n                                    tabImageURL: \"https://assets.zendesk.com/external/zenbox/images/tab_ru_support.png\",\n                                          tabColor:    \"#333333\",\n                                                tabPosition: \"Left\"\n                                                    });\n          }\n</script>\n"
  },
  {
    "path": "app/views/users/confirmations/new.html.erb",
    "content": "<h2>Resend confirmation instructions</h2>\n\n<%= form_for(resource, :as => resource_name, :url => confirmation_path(resource_name), :html => { :method => :post }) do |f| %>\n  <%= devise_error_messages! %>\n\n  <div><%= f.label :email %><br />\n  <%= f.email_field :email %></div>\n\n  <div><%= f.submit \"Resend confirmation instructions\" %></div>\n<% end %>\n\n<%= render :partial => \"devise/shared/links\" %>"
  },
  {
    "path": "app/views/users/mailer/confirmation_instructions.html.erb",
    "content": "<p>Welcome <%= @resource.email %>!</p>\n\n<p>You can confirm your account through the link below:</p>\n\n<p><%= link_to 'Confirm my account', confirmation_url(@resource, :confirmation_token => @token) %></p>\n"
  },
  {
    "path": "app/views/users/mailer/reset_password_instructions.html.erb",
    "content": "<p>Hello <%= @resource.email %>!</p>\n\n<p>Someone has requested a link to change your password, and you can do this through the link below.</p>\n\n<p><%= link_to 'Change my password', edit_password_url(@resource, :reset_password_token => @token) %></p>\n\n<p>If you didn't request this, please ignore this email.</p>\n<p>Your password won't change until you access the link above and create a new one.</p>\n"
  },
  {
    "path": "app/views/users/mailer/unlock_instructions.html.erb",
    "content": "<p>Hello <%= @resource.email %>!</p>\n\n<p>Your account has been locked due to an excessive amount of unsuccessful sign in attempts.</p>\n\n<p>Click the link below to unlock your account:</p>\n\n<p><%= link_to 'Unlock my account', unlock_url(@resource, :unlock_token => @resource.unlock_token) %></p>\n"
  },
  {
    "path": "app/views/users/passwords/edit.html.slim",
    "content": "= form_for resource, as: resource_name, url: password_path(resource_name), html: { class: 'form-login reset-password form-wrapper form-narrow', method: :put } do |f|\n  = devise_error_messages!\n\n  h3.title-divider\n    span= t('users.passwords.edit.enter_new_password')\n\n  = f.hidden_field :reset_password_token\n  = f.password_field :password, placeholder: t('users.passwords.edit.new_password')\n  = f.password_field :password_confirmation, placeholder: t('users.passwords.edit.password_confirmation')\n  = f.submit t('users.passwords.edit.save'), class: \"btn btn-primary\"\n"
  },
  {
    "path": "app/views/users/passwords/new.html.slim",
    "content": "= form_for resource, as: resource_name, url: password_path(resource_name), html: { class: 'form-login reset-password form-wrapper form-medium', method: :post } do |f|\n  = devise_error_messages!\n\n  h3.title-divider\n    span= t('users.passwords.new.reset_password')\n    small\n      = link_to t('users.passwords.new.sign_in_here'), new_user_session_path\n\n  = f.email_field :email, class: \"input-block-level\", placeholder: t('users.passwords.new.email')\n  = f.submit t('users.passwords.new.send'), class: \"btn btn-primary\"\n"
  },
  {
    "path": "app/views/users/registrations/_promo.html.slim",
    "content": "legend= t('users.registrations.promo.promo_code')\n\n= simple_form_for [:billing, Promotion.new] do |f|\n  = f.input :promo_code\n  = f.submit t('global.apply'), class: 'btn btn-primary'\n"
  },
  {
    "path": "app/views/users/registrations/edit.html.slim",
    "content": "= render partial: \"promo\"\nbr\nbr\n\n\nlegend= t('users.registrations.edit.edit_profile')\n= simple_form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f|\n  = f.input :email\n  = f.input :password\n  = f.input :password_confirmation\n  = f.input :current_password\n  /TODO:\n  /here select to change plan\n  = f.submit t('users.registrations.edit.update'), class: 'btn btn-primary'\n\nbr\nbr\n\nlegend= t('users.registrations.edit.cancel_registration')\n.cancel-account\n  p.alert.alert-error= t('users.registrations.edit.canceling_attention')\n  = button_to t('users.registrations.edit.cancel_registration'), registration_path(resource_name), data: { confirm: t('users.registrations.edit.confirm.cancel_registration') }, method: :delete, class: 'btn btn-large btn-danger'\n"
  },
  {
    "path": "app/views/users/registrations/new.html.slim",
    "content": "= form_for resource, as: resource_name, url: registration_path(resource_name), html: { class: \"form-login form-wrapper form-medium\" } do |f|\n  = devise_error_messages!\n\n  h3.title-divider\n    span= t('users.registrations.new.registration')\n    small\n      = t('users.registrations.new.already_signed_up')\n      = \" \"\n      = link_to t('users.registrations.new.sign_in_here'), new_user_session_path\n  h5= t('users.registrations.new.price_plan')\n  - selected_plan = Plan.find_by(code: params[:plan])\n  - selected_id = selected_plan ? selected_plan.id : nil\n  = f.select :plan_id, options_for_select(Plan.regular.enabled.map { |p| [p.name, p.id] }, selected_id)\n\n\n  h5= t('users.registrations.new.account_information')\n  = f.email_field :email, class: \"input-block-level\", placeholder: t('users.registrations.new.email')\n  = f.password_field :password, class: \"input-block-level\", placeholder: t('users.registrations.new.password')\n  = f.password_field :password_confirmation, class: \"input-block-level\", placeholder: t('users.registrations.new.password_confirmation')\n\n  = f.label :accept_agreement, class: \"checkbox\" do\n    = \"#{t('users.registrations.new.accept')} \"\n    = link_to t('users.registrations.new.agreement'), '/EULA.pdf', target: '_blank'\n    = f.check_box :accept_agreement\n\n  = f.submit t('users.registrations.new.sign_up'), class: \"btn btn-primary\"\n"
  },
  {
    "path": "app/views/users/sessions/new.html.slim",
    "content": "= form_for resource, as: resource_name, url: session_path(resource_name), html: { class: \"form-login form-wrapper form-narrow\" } do |f|\n  h3.title-divider\n    span= t('users.sessions.new.client_entrance')\n    small\n      = t('users.sessions.new.not_signed_up')\n      = link_to t('users.sessions.new.sign_up_here'), new_user_registration_path\n\n  = f.email_field :email, class: \"input-block-level\", placeholder: t('users.sessions.new.email')\n  = f.password_field :password, class: \"input-block-level\", placeholder: t('users.sessions.new.password')\n\n  = f.label :remember_me, class: \"checkbox\" do\n    = t('users.sessions.new.remember_me')\n    = f.check_box :remember_me\n\n  = f.submit t('users.sessions.new.sign_in'), class: \"btn btn-primary\"\n  = \" | \"\n  = link_to \"#{t('users.sessions.new.forgotten_password')}\", new_password_path(resource_name)\n"
  },
  {
    "path": "app/views/users/shared/_links.erb",
    "content": "<%- if controller_name != 'sessions' %>\n  <%= link_to \"Sign in\", new_session_path(resource_name) %><br />\n<% end -%>\n\n<%- if devise_mapping.registerable? && controller_name != 'registrations' %>\n  <%= link_to \"Sign up\", new_registration_path(resource_name) %><br />\n<% end -%>\n\n<%- if devise_mapping.recoverable? && controller_name != 'passwords' %>\n  <%= link_to \"Forgot your password?\", new_password_path(resource_name) %><br />\n<% end -%>\n\n<%- if devise_mapping.confirmable? && controller_name != 'confirmations' %>\n  <%= link_to \"Didn't receive confirmation instructions?\", new_confirmation_path(resource_name) %><br />\n<% end -%>\n\n<%- if devise_mapping.lockable? && resource_class.unlock_strategy_enabled?(:email) && controller_name != 'unlocks' %>\n  <%= link_to \"Didn't receive unlock instructions?\", new_unlock_path(resource_name) %><br />\n<% end -%>\n\n<%- if devise_mapping.omniauthable? %>\n  <%- resource_class.omniauth_providers.each do |provider| %>\n    <%= link_to \"Sign in with #{provider.to_s.titleize}\", omniauth_authorize_path(resource_name, provider) %><br />\n  <% end -%>\n<% end -%>"
  },
  {
    "path": "app/views/users/unlocks/new.html.erb",
    "content": "<h2>Resend unlock instructions</h2>\n\n<%= form_for(resource, :as => resource_name, :url => unlock_path(resource_name), :html => { :method => :post }) do |f| %>\n  <%= devise_error_messages! %>\n\n  <div><%= f.label :email %><br />\n  <%= f.email_field :email %></div>\n\n  <div><%= f.submit \"Resend unlock instructions\" %></div>\n<% end %>\n\n<%= render :partial => \"devise/shared/links\" %>"
  },
  {
    "path": "app/workers/add_user_to_newsletter_worker.rb",
    "content": "# frozen_string_literal: true\n\nclass AddUserToNewsletterWorker\n  include Sidekiq::Worker\n  sidekiq_options queue: 'high'\n\n  def perform(email, list_name)\n    api = NewsletterManager.new\n    api.add_to_list(email, list_name)\n  end\nend\n"
  },
  {
    "path": "app/workers/can_not_withdraw_notification_worker.rb",
    "content": "# frozen_string_literal: true\n\nclass CanNotWithdrawNotificationWorker\n  include Sidekiq::Worker\n  sidekiq_options queue: 'high'\n\n  def perform(user_id, amount)\n    user = User.find(user_id)\n    UserMailer.could_not_withdraw_funds(user, amount).deliver_now\n  end\nend\n"
  },
  {
    "path": "app/workers/create_user_mail_worker.rb",
    "content": "# frozen_string_literal: true\n\nclass CreateUserMailWorker\n  include Sidekiq::Worker\n  sidekiq_options queue: :mailers\n\n  def perform(user_id)\n    user = User.find(user_id)\n    UserConnectionConfigMailer.notify(user: user).deliver_now\n  end\nend\n"
  },
  {
    "path": "app/workers/decrease_balance_mail_worker.rb",
    "content": "# frozen_string_literal: true\n\nclass DecreaseBalanceMailWorker\n  include Sidekiq::Worker\n  sidekiq_options queue: 'high'\n\n  def perform(amount, user_id)\n    user = User.find(user_id)\n    UserMailer.balance_withdrawal(user, amount).deliver_now\n  end\nend\n"
  },
  {
    "path": "app/workers/increase_balance_mail_worker.rb",
    "content": "# frozen_string_literal: true\n\nclass IncreaseBalanceMailWorker\n  include Sidekiq::Worker\n  sidekiq_options queue: 'high'\n\n  def perform(amount, user_id)\n    user = User.find(user_id)\n    UserMailer.funds_recieved(user, amount).deliver_now\n  end\nend\n"
  },
  {
    "path": "app/workers/refresh_proxy_list_worker.rb",
    "content": "# frozen_string_literal: true\n\nclass RefreshProxyListWorker\n  include Sidekiq::Worker\n\n  def perform\n    adapter = Proxy::Fetchers::FreeProxyListNet::WebParser\n    Proxy::Updater.update(adapter)\n  end\nend\n"
  },
  {
    "path": "app/workers/unpaid_user_notification_worker.rb",
    "content": "# frozen_string_literal: true\n\nclass UnpaidUserNotificationWorker\n  include Sidekiq::Worker\n  sidekiq_options queue: 'high'\n\n  def perform(user_id)\n    user = User.find(user_id)\n    UserMailer.unpaid_user_notification(user).deliver_now\n  end\nend\n"
  },
  {
    "path": "app/workers/update_courses_worker.rb",
    "content": "# frozen_string_literal: true\n\nclass UpdateCoursesWorker\n  include Sidekiq::Worker\n\n  def perform\n    Currencies::Course.update_courses\n  end\nend\n"
  },
  {
    "path": "app/workers/withdrawals_worker.rb",
    "content": "# frozen_string_literal: true\n\nclass WithdrawalsWorker\n  include Sidekiq::Worker\n\n  def perform\n    Withdrawer.mass_withdrawal\n    UnpaidUsersNotificator.new.notify_all\n  end\nend\n"
  },
  {
    "path": "bin/build-image",
    "content": "#!/bin/bash\n\ndocker login -u \"$DOCKER_HUB_USERNAME\" -p \"$DOCKER_HUB_PASSWORD\"\ndocker build --build-arg secret_token=secret -t mexx/smartvpn-billing .\ndocker push mexx/smartvpn-billing\n"
  },
  {
    "path": "bin/bundle",
    "content": "#!/usr/bin/env ruby\n# frozen_string_literal: true\n\nENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__)\nload Gem.bin_path('bundler', 'bundle')\n"
  },
  {
    "path": "bin/cop",
    "content": "#!/usr/bin/env bash\n#\n# Run RuboCop check on added, modified and untracked Ruby files\n# diverging from master branch.\n\n# Set cwd to app root to allow calling the script from anywhere.\nself=\"${BASH_SOURCE[0]}\"\nbin=\"$(cd \"$(dirname \"$self\")\" && pwd)\"\ncd \"$(dirname \"$bin\")\"\n\nchanged_files=`git diff --name-only $(git merge-base origin/master HEAD) --diff-filter=AMCR -- '*.rb' '*.rake' | grep -v 'db/schema.rb'`\nuntracked_files=`git ls-files --others --exclude-standard -- '*.rb' '*.rake'`\n\nfiles=\"$changed_files $untracked_files\"\n\nif [[ -n \"${files// }\" ]]; then\n echo \"$files\" | xargs bundle exec rubocop -c .rubocop.yml \"$@\"\nfi\n"
  },
  {
    "path": "bin/rails",
    "content": "#!/usr/bin/env ruby\n# frozen_string_literal: true\n\nAPP_PATH = File.expand_path('../config/application', __dir__)\nrequire_relative '../config/boot'\nrequire 'rails/commands'\n"
  },
  {
    "path": "bin/rake",
    "content": "#!/usr/bin/env ruby\n# frozen_string_literal: true\n\nrequire_relative '../config/boot'\nrequire 'rake'\nRake.application.run\n"
  },
  {
    "path": "bin/setup",
    "content": "#!/usr/bin/env ruby\n# frozen_string_literal: true\n\nrequire 'pathname'\n\n# path to your application root.\nAPP_ROOT = Pathname.new File.expand_path('..', __dir__)\n\nDir.chdir APP_ROOT do\n  # This script is a starting point to setup your application.\n  # Add necessary setup steps to this file:\n\n  puts '== Installing dependencies =='\n  system 'gem install bundler --conservative'\n  system 'bundle check || bundle install'\n\n  # puts \"\\n== Copying sample files ==\"\n  # unless File.exist?(\"config/database.yml\")\n  #   system \"cp config/database.yml.sample config/database.yml\"\n  # end\n\n  puts \"\\n== Preparing database ==\"\n  system 'bin/rake db:setup'\n\n  puts \"\\n== Removing old logs and tempfiles ==\"\n  system 'rm -f log/*'\n  system 'rm -rf tmp/cache'\n\n  puts \"\\n== Restarting application server ==\"\n  system 'touch tmp/restart.txt'\nend\n"
  },
  {
    "path": "config/application.rb",
    "content": "# frozen_string_literal: true\n\nrequire File.expand_path('boot', __dir__)\n\nrequire 'rails/all'\n\n# Assets should be precompiled for production (so we don't need the gems loaded then)\nBundler.require(*Rails.groups(assets: %w[development test]))\n\nmodule Smartvpn\n  class Application < Rails::Application\n    # Settings in config/environments/* take precedence over those specified here.\n    # Application configuration should go into files in config/initializers\n    # -- all .rb files in that directory are automatically loaded.\n\n    # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.\n    # Run \"rake -D time\" for a list of tasks for finding time zone names. Default is UTC.\n    # config.time_zone = 'Central Time (US & Canada)'\n    config.autoload_paths += %W[#{config.root}/app/models/connections]\n    config.autoload_paths += %W[#{config.root}/app/models/traffic_reports]\n    config.autoload_paths += %W[#{config.root}/app/models/dto]\n    config.autoload_paths += %W[#{config.root}/app/models/promoters]\n    config.autoload_paths += %W[#{config.root}/lib]\n    config.autoload_paths += %W[#{config.root}/lib/exceptions]\n\n    config.paths['app/views'].unshift(Rails.root.join('app/views/mailers'))\n\n    # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.\n    config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}')]\n    config.i18n.default_locale = :en\n    I18n.enforce_available_locales = true\n\n    config.assets.precompile += %w[admin.js admin.scss]\n    config.active_record.raise_in_transactional_callbacks = true\n  end\nend\n"
  },
  {
    "path": "config/boot.rb",
    "content": "# frozen_string_literal: true\n\n# Set up gems listed in the Gemfile.\nENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__)\n\nrequire 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])\n"
  },
  {
    "path": "config/clock.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'clockwork'\nrequire 'active_support/time'\nrequire './config/boot'\nrequire './config/environment'\n\n# TODO\n# Instead of loading whole application, we can use this approach of sending tasks to Sidekiq\n# https://github.com/mperham/sidekiq/wiki/FAQ#how-do-i-push-a-job-to-sidekiq-without-ruby\n\nmodule Clockwork\n  every(1.hour, 'Withdrawals') { WithdrawalsWorker.perform_async }\n  every(1.hour, 'UpdateCourses') { UpdateCoursesWorker.perform_async }\n  every(1.hour, 'RefreshProxyList') { RefreshProxyListWorker.perform_async }\nend\n"
  },
  {
    "path": "config/countries.json",
    "content": "{\n\t\"ru\":\t{\n\t  \"ad\": \"Andorra\",\n\t  \"ae\": \"United Arab Emirates\",\n\t  \"af\": \"Afghanistan\",\n\t  \"ag\": \"Antigua and Barbuda\",\n\t  \"ai\": \"French Territory of the Afars and the Issas\",\n\t  \"al\": \"Albania\",\n\t  \"am\": \"Armenia\",\n\t  \"ao\": \"Angola\",\n\t  \"aq\": \"Antarctica\",\n\t  \"ar\": \"Argentina\",\n\t  \"as\": \"American Samoa\",\n\t  \"at\": \"Austria\",\n\t  \"au\": \"Australia\",\n\t  \"aw\": \"Ashmore and Cartier Islands\",\n\t  \"ax\": \"Coral Sea Islands\",\n\t  \"az\": \"Aruba\",\n\t  \"ba\": \"Azerbaijan\",\n\t  \"bb\": \"Bosnia and Herzegovina\",\n\t  \"bd\": \"Barbados\",\n\t  \"be\": \"Bangladesh\",\n\t  \"bf\": \"Belgium\",\n\t  \"bg\": \"Burkina Faso\",\n\t  \"bh\": \"Bulgaria\",\n\t  \"bi\": \"Bahrain\",\n\t  \"bj\": \"Burundi\",\n\t  \"bl\": \"Benin\",\n\t  \"bm\": \"Bermuda\",\n\t  \"bn\": \"Brunei\",\n\t  \"bo\": \"Bolivia\",\n\t  \"bq\": \"Caribbean Netherlands\",\n\t  \"br\": \"Brazil\",\n\t  \"bs\": \"The Bahamas\",\n\t  \"bt\": \"Bhutan\",\n\t  \"bv\": \"Bouvet Island\",\n\t  \"bw\": \"Botswana\",\n\t  \"by\": \"Belarus\",\n\t  \"bz\": \"Belize\",\n\t  \"ca\": \"Canada\",\n\t  \"cc\": \"Cocos Islands\",\n\t  \"cd\": \"Democratic Republic of the Congo\",\n\t  \"cf\": \"Central African Republic\",\n\t  \"cg\": \"Republic of the Congo\",\n\t  \"ch\": \"Switzerland\",\n\t  \"ci\": \"Cote d'Ivoire\",\n\t  \"ck\": \"Cook Islands\",\n\t  \"cl\": \"Chile\",\n\t  \"cm\": \"Cameroon\",\n\t  \"cn\": \"China\",\n\t  \"co\": \"Colombia\",\n\t  \"cr\": \"Costa Rica\",\n\t  \"cu\": \"Cuba\",\n\t  \"cv\": \"Cape Verde\",\n\t  \"cw\": \"Curacao\",\n\t  \"cx\": \"Christmas Island\",\n\t  \"cy\": \"Cyprus\",\n\t  \"cz\": \"Czech Republic\",\n\t  \"de\": \"Germany\",\n\t  \"dj\": \"Djibouti\",\n\t  \"dk\": \"Denmark\",\n\t  \"dm\": \"Dominica\",\n\t  \"do\": \"Dominican Republic\",\n\t  \"dz\": \"Algeria\",\n\t  \"ec\": \"Ecuador\",\n\t  \"ee\": \"Estonia\",\n\t  \"eg\": \"Egypt\",\n\t  \"eh\": \"Western Sahara\",\n\t  \"er\": \"Eritrea\",\n\t  \"es\": \"Spain\",\n\t  \"et\": \"Ethiopia\",\n\t  \"fi\": \"Finland\",\n\t  \"fj\": \"Fiji\",\n\t  \"fk\": \"Falkland Islands\",\n\t  \"fm\": \"Federated States of Micronesia\",\n\t  \"fo\": \"Faroe Islands\",\n\t  \"fr\": \"France\",\n\t  \"ga\": \"Gabon\",\n\t  \"gb\": \"United Kingdom\",\n\t  \"gd\": \"Grenada\",\n\t  \"ge\": \"Georgia\",\n\t  \"gf\": \"French Guiana\",\n\t  \"gg\": \"Guernsey\",\n\t  \"gh\": \"Ghana\",\n\t  \"gi\": \"Gibraltar\",\n\t  \"gl\": \"Greenland\",\n\t  \"gm\": \"The Gambia\",\n\t  \"gn\": \"Guinea\",\n\t  \"gp\": \"Guadeloupe\",\n\t  \"gq\": \"Equatorial Guinea\",\n\t  \"gr\": \"Greece\",\n\t  \"gs\": \"South Georgia and the South Sandwich Islands\",\n\t  \"gt\": \"Guatemala\",\n\t  \"gu\": \"Guam\",\n\t  \"gw\": \"Guinea-Bissau\",\n\t  \"gy\": \"Guyana\",\n\t  \"hk\": \"Hong Kong\",\n\t  \"hm\": \"Heard Island and McDonald Islands\",\n\t  \"hn\": \"Honduras\",\n\t  \"hr\": \"Croatia\",\n\t  \"ht\": \"Haiti\",\n\t  \"hu\": \"Hungary\",\n\t  \"id\": \"Indonesia\",\n\t  \"ie\": \"Republic of Ireland\",\n\t  \"il\": \"Israel\",\n\t  \"im\": \"Isle of Man\",\n\t  \"in\": \"India\",\n\t  \"io\": \"British Indian Ocean Territory\",\n\t  \"iq\": \"Iraq\",\n\t  \"ir\": \"Iran\",\n\t  \"is\": \"Iceland\",\n\t  \"it\": \"Italy\",\n\t  \"je\": \"Jersey\",\n\t  \"jm\": \"Jamaica\",\n\t  \"jo\": \"Jordan\",\n\t  \"jp\": \"Japan\",\n\t  \"ke\": \"Kenya\",\n\t  \"kg\": \"Kyrgyzstan\",\n\t  \"kh\": \"Cambodia\",\n\t  \"ki\": \"Kiribati\",\n\t  \"km\": \"Comoros\",\n\t  \"kn\": \"Saint Kitts and Nevis\",\n\t  \"kp\": \"North Korea\",\n\t  \"kr\": \"South Korea\",\n\t  \"kw\": \"Kuwait\",\n\t  \"ky\": \"Cayman Islands\",\n\t  \"kz\": \"Kazakhstan\",\n\t  \"la\": \"Laos\",\n\t  \"lb\": \"Lebanon\",\n\t  \"lc\": \"Saint Lucia\",\n\t  \"li\": \"Liechtenstein\",\n\t  \"lk\": \"Sri Lanka\",\n\t  \"lr\": \"Liberia\",\n\t  \"ls\": \"Lesotho\",\n\t  \"lt\": \"Lithuania\",\n\t  \"lu\": \"Luxembourg\",\n\t  \"lv\": \"Latvia\",\n\t  \"ly\": \"Libya\",\n\t  \"ma\": \"Morocco\",\n\t  \"mc\": \"Monaco\",\n\t  \"md\": \"Moldova\",\n\t  \"me\": \"Montenegro\",\n\t  \"mf\": \"Collectivity of Saint Martin\",\n\t  \"mg\": \"Madagascar\",\n\t  \"mh\": \"Marshall Islands\",\n\t  \"mk\": \"Republic of Macedonia\",\n\t  \"ml\": \"Mali\",\n\t  \"mm\": \"Myanmar\",\n\t  \"mn\": \"Mongolia\",\n\t  \"mo\": \"Macau\",\n\t  \"mp\": \"Northern Mariana Islands\",\n\t  \"mq\": \"Martinique\",\n\t  \"mr\": \"Mauritania\",\n\t  \"ms\": \"Montserrat\",\n\t  \"mt\": \"Malta\",\n\t  \"mu\": \"Mauritius\",\n\t  \"mv\": \"Maldives\",\n\t  \"mw\": \"Malawi\",\n\t  \"mx\": \"Mexico\",\n\t  \"my\": \"Malaysia\",\n\t  \"mz\": \"Mozambique\",\n\t  \"na\": \"Namibia\",\n\t  \"nc\": \"New Caledonia\",\n\t  \"ne\": \"Niger\",\n\t  \"nf\": \"Norfolk Island\",\n\t  \"ng\": \"Nigeria\",\n\t  \"ni\": \"Nicaragua\",\n\t  \"nl\": \"Netherlands\",\n\t  \"no\": \"Norway\",\n\t  \"np\": \"Nepal\",\n\t  \"nr\": \"Nauru\",\n\t  \"nu\": \"Niue\",\n\t  \"nz\": \"New Zealand\",\n\t  \"om\": \"Oman\",\n\t  \"pa\": \"Panama\",\n\t  \"pe\": \"Peru\",\n\t  \"pf\": \"French Polynesia\",\n\t  \"pg\": \"Papua New Guinea\",\n\t  \"ph\": \"Philippines\",\n\t  \"pk\": \"Pakistan\",\n\t  \"pl\": \"Poland\",\n\t  \"pm\": \"Saint Pierre and Miquelon\",\n\t  \"pn\": \"Pitcairn Islands\",\n\t  \"pr\": \"Puerto Rico\",\n\t  \"ps\": \"Palestinian territories\",\n\t  \"pt\": \"Portugal\",\n\t  \"pw\": \"Palau\",\n\t  \"py\": \"Paraguay\",\n\t  \"qa\": \"Qatar\",\n\t  \"re\": \"Reunion\",\n\t  \"ro\": \"Romania\",\n\t  \"rs\": \"Serbia\",\n\t  \"ru\": \"Russia\",\n\t  \"rw\": \"Rwanda\",\n\t  \"sa\": \"Saudi Arabia\",\n\t  \"sb\": \"Solomon Islands\",\n\t  \"sc\": \"Seychelles\",\n\t  \"sd\": \"Sudan\",\n\t  \"se\": \"Sweden\",\n\t  \"sg\": \"Singapore\",\n\t  \"sh\": \"Saint Helena, Ascension and Tristan da Cunha\",\n\t  \"si\": \"Slovenia\",\n\t  \"sj\": \"Svalbard and Jan Mayen\",\n\t  \"sk\": \"Slovakia\",\n\t  \"sl\": \"Sierra Leone\",\n\t  \"sm\": \"San Marino\",\n\t  \"sn\": \"Senegal\",\n\t  \"so\": \"Somalia\",\n\t  \"sr\": \"Suriname\",\n\t  \"ss\": \"South Sudan\",\n\t  \"st\": \"Sao Tome and Principe\",\n\t  \"sv\": \"El Salvador\",\n\t  \"sx\": \"Sint Maarten\",\n\t  \"sy\": \"Syria\",\n\t  \"sz\": \"Swaziland\",\n\t  \"tc\": \"Turks and Caicos Islands\",\n\t  \"td\": \"Chad\",\n\t  \"tf\": \"French Southern and Antarctic Lands\",\n\t  \"tg\": \"Togo\",\n\t  \"th\": \"Thailand\",\n\t  \"tj\": \"Tajikistan\",\n\t  \"tk\": \"Tokelau\",\n\t  \"tl\": \"East Timor\",\n\t  \"tm\": \"Turkmenistan\",\n\t  \"tn\": \"Tunisia\",\n\t  \"to\": \"Tonga\",\n\t  \"tr\": \"Turkey\",\n\t  \"tt\": \"Trinidad and Tobago\",\n\t  \"tv\": \"Tuvalu\",\n\t  \"tw\": \"Taiwan\",\n\t  \"tz\": \"Tanzania\",\n\t  \"ua\": \"Ukraine\",\n\t  \"ug\": \"Uganda\",\n\t  \"um\": \"United States Minor Outlying Islands\",\n\t  \"us\": \"United States\",\n\t  \"uy\": \"Uruguay\",\n\t  \"uz\": \"Uzbekistan\",\n\t  \"va\": \"Vatican City\",\n\t  \"vc\": \"Saint Vincent and the Grenadines\",\n\t  \"ve\": \"Venezuela\",\n\t  \"vg\": \"British Virgin Islands\",\n\t  \"vi\": \"United States Virgin Islands\",\n\t  \"vn\": \"Vietnam\",\n\t  \"vu\": \"Vanuatu\",\n\t  \"wf\": \"Wallis and Futuna\",\n\t  \"ws\": \"Samoa\",\n\t  \"ye\": \"Yemen\",\n\t  \"yt\": \"Mayotte\",\n\t  \"za\": \"South Africa\",\n\t  \"zm\": \"Zambia\",\n\t  \"zw\": \"Zimbabwe\"\n\t}\n}\n"
  },
  {
    "path": "config/database.yml.sample",
    "content": "default: &default\n  adapter: postgresql\n  pool: <%= ENV.fetch(\"RAILS_MAX_THREADS\") { 5 } %>\n  host: <%= ENV.fetch('PGHOST') { 'localhost ' } %>\n  user: <%= ENV.fetch('PGUSER') { 'postgres' } %>\n  password: <%= ENV.fetch('PGPASS') { 'root' } %>\n  timeout: 5000\n\ndevelopment:\n  <<: *default\n  database: <%= ENV.fetch('PGDATABASE') { 'smartvpn_development' } %>\n\ntest:\n  <<: *default\n  database: <%= ENV.fetch('PGDATABASE') { 'smartvpn_test' } %>\n\nproduction:\n  adapter: postgresql\n  encoding: unicode\n  database: smartvpn_production\n  username: postgres\n  password: root\n  host: postgres\n\n\n"
  },
  {
    "path": "config/environment.rb",
    "content": "# frozen_string_literal: true\n\n# Load the rails application.\nrequire File.expand_path('application', __dir__)\n\n# Initialize the rails application.\nSmartvpn::Application.initialize!\n"
  },
  {
    "path": "config/environments/development.rb",
    "content": "# frozen_string_literal: true\n\nSmartvpn::Application.configure do\n  # Settings specified here will take precedence over those in config/application.rb.\n\n  # In the development environment your application's code is reloaded on\n  # every request. This slows down response time but is perfect for development\n  # since you don't have to restart the web server when you make code changes.\n  config.cache_classes = false\n\n  # Do not eager load code on boot.\n  config.eager_load = false\n\n  # Show full error reports and disable caching.\n  config.consider_all_requests_local       = true\n  config.action_controller.perform_caching = false\n\n  # Don't care if the mailer can't send.\n  config.action_mailer.raise_delivery_errors = false\n\n  # Print deprecation notices to the Rails logger.\n  config.active_support.deprecation = :log\n\n  # Raise an error on page load if there are pending migrations\n  config.active_record.migration_error = :page_load\n\n  # Debug mode disables concatenation and preprocessing of assets.\n  config.assets.debug = true\n\n  config.action_mailer.delivery_method = :letter_opener\n  config.action_mailer.default_url_options = { host: 'localhost:3000' }\nend\n"
  },
  {
    "path": "config/environments/production.rb",
    "content": "# frozen_string_literal: true\n\nSmartvpn::Application.configure do\n  # Settings specified here will take precedence over those in config/application.rb.\n\n  # Code is not reloaded between requests.\n  config.cache_classes = true\n\n  # Eager load code on boot. This eager loads most of Rails and\n  # your application in memory, allowing both thread web servers\n  # and those relying on copy on write to perform better.\n  # Rake tasks automatically ignore this option for performance.\n  config.eager_load = true\n\n  # Full error reports are disabled and caching is turned on.\n  config.consider_all_requests_local       = false\n  config.action_controller.perform_caching = true\n\n  # Enable Rack::Cache to put a simple HTTP cache in front of your application\n  # Add `rack-cache` to your Gemfile before enabling this.\n  # For large-scale production use, consider using a caching reverse proxy like nginx, varnish or squid.\n  # config.action_dispatch.rack_cache = true\n\n  # Disable Rails's static asset server (Apache or nginx will already do this).\n  config.serve_static_files = true\n\n  # Compress JavaScripts and CSS.\n  config.assets.js_compressor = :uglifier\n  # config.assets.css_compressor = :sass\n\n  # Whether to fallback to assets pipeline if a precompiled asset is missed.\n  config.assets.compile = false\n\n  # Generate digests for assets URLs.\n  config.assets.digest = true\n\n  # Version of your assets, change this if you want to expire all your assets.\n  config.assets.version = '1.0'\n\n  # Specifies the header that your server uses for sending files.\n  # config.action_dispatch.x_sendfile_header = \"X-Sendfile\" # for apache\n  # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx\n\n  # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.\n  # config.force_ssl = true\n\n  # Set to :debug to see everything in the log.\n  config.log_level = :debug\n\n  # Prepend all log lines with the following tags.\n  # config.log_tags = [ :subdomain, :uuid ]\n\n  # Use a different logger for distributed setups.\n  # config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new)\n\n  # Use a different cache store in production.\n  # config.cache_store = :mem_cache_store\n\n  # Enable serving of images, stylesheets, and JavaScripts from an asset server.\n  # config.action_controller.asset_host = \"http://assets.example.com\"\n\n  # Precompile additional assets.\n  # application.js, application.css, and all non-JS/CSS in app/assets folder are already added.\n  # config.assets.precompile += %w( search.js )\n\n  # Ignore bad email addresses and do not raise email delivery errors.\n  # Set this to true and configure the email server for immediate delivery to raise delivery errors.\n  # config.action_mailer.raise_delivery_errors = false\n\n  # Enable locale fallbacks for I18n (makes lookups for any locale fall back to\n  # the I18n.default_locale when a translation can not be found).\n  config.i18n.fallbacks = true\n\n  # Send deprecation notices to registered listeners.\n  config.active_support.deprecation = :notify\n\n  # Disable automatic flushing of the log to improve performance.\n  # config.autoflush_log = false\n\n  # Use default logging formatter so that PID and timestamp are not suppressed.\n  config.log_formatter = ::Logger::Formatter.new\n  config.action_mailer.default_url_options = { host: ENV['DEFAULT_HOST'] }\n\n  config.action_mailer.delivery_method = :smtp\n\n  smtp_setting_params = {\n    address: ENV['EMAIL_ADDRESS'],\n    port: ENV['EMAIL_PORT'],\n    domain: ENV['EMAIL_DOMAIN'],\n    user_name: ENV['EMAIL_USER'],\n    password: ENV['EMAIL_PASS'],\n    authentication: 'plain',\n    enable_starttls_auto: true\n  }\n  config.action_mailer.smtp_settings = if ENV['EMAIL_TLS'] == 'true'\n                                         smtp_setting_params.merge(tls: true)\n                                       else\n                                         smtp_setting_params\n                                       end\nend\n"
  },
  {
    "path": "config/environments/test.rb",
    "content": "# frozen_string_literal: true\n\nSmartvpn::Application.configure do\n  # Settings specified here will take precedence over those in config/application.rb.\n\n  config.active_job.queue_adapter = :sidekiq\n\n  # The test environment is used exclusively to run your application's\n  # test suite. You never need to work with it otherwise. Remember that\n  # your test database is \"scratch space\" for the test suite and is wiped\n  # and recreated between test runs. Don't rely on the data there!\n  config.cache_classes = true\n\n  # Do not eager load code on boot. This avoids loading your whole application\n  # just for the purpose of running a single test. If you are using a tool that\n  # preloads Rails for running tests, you may have to set it to true.\n  config.eager_load = false\n\n  # Configure static asset server for tests with Cache-Control for performance.\n  config.serve_static_files = true\n  config.static_cache_control = 'public, max-age=3600'\n\n  # Show full error reports and disable caching.\n  config.consider_all_requests_local       = true\n  config.action_controller.perform_caching = false\n\n  # Raise exceptions instead of rendering exception templates.\n  config.action_dispatch.show_exceptions = false\n\n  # Disable request forgery protection in test environment.\n  config.action_controller.allow_forgery_protection = false\n\n  # Tell Action Mailer not to deliver emails to the real world.\n  # The :test delivery method accumulates sent emails in the\n  # ActionMailer::Base.deliveries array.\n  config.action_mailer.delivery_method = :test\n\n  # Print deprecation notices to the stderr.\n  config.active_support.deprecation = :stderr\n  config.action_mailer.default_url_options = { host: ENV['DEFAULT_HOST'] }\nend\n"
  },
  {
    "path": "config/i18n-tasks.yml",
    "content": "# i18n-tasks finds and manages missing and unused translations: https://github.com/glebm/i18n-tasks\n\n# The \"main\" locale.\nbase_locale: en\n## All available locales are inferred from the data by default. Alternatively, specify them explicitly:\n# locales: [es, fr]\n## Reporting locale, default: en. Available: en, ru.\n# internal_locale: en\n\n# Read and write translations.\ndata:\n  ## Translations are read from the file system. Supported format: YAML, JSON.\n  ## Provide a custom adapter:\n  # adapter: I18n::Tasks::Data::FileSystem\n\n  # Locale files or `File.find` patterns where translations are read from:\n  read:\n    ## Default:\n    - config/locales/%{locale}.yml\n    ## More files:\n    - config/locales/**/%{locale}.yml\n    - config/locales/*.%{locale}.yml\n\n  # Locale files to write new keys to, based on a list of key pattern => file rules. Matched from top to bottom:\n  # `i18n-tasks normalize -p` will force move the keys according to these rules\n  write:\n    ## For example, write devise and simple form keys to their respective files:\n    - ['{devise, simple_form}.*', 'config/locales/\\1.%{locale}.yml']\n    ## Catch-all default:\n    - config/locales/%{locale}.yml\n\n  # External locale data (e.g. gems).\n  # This data is not considered unused and is never written to.\n  external:\n  ## Example (replace %#= with %=):\n  # - \"<%#= %x[bundle show vagrant].chomp %>/templates/locales/%{locale}.yml\"\n\n  ## Specify the router (see Readme for details). Valid values: conservative_router, pattern_router, or a custom class.\n  # router: conservative_router\n\n  yaml:\n    write:\n      # do not wrap lines at 80 characters\n      line_width: -1\n\n  ## Pretty-print JSON:\n  # json:\n  #   write:\n  #     indent: '  '\n  #     space: ' '\n  #     object_nl: \"\\n\"\n  #     array_nl: \"\\n\"\n\n# Find translate calls\nsearch:\n  ## Paths or `File.find` patterns to search in:\n  paths:\n    - app/\n\n  ## Root directories for relative keys resolution.\n  #relative_roots:\n  #  - app/controllers\n  #  - app/helpers\n  #  - app/mailers\n  #  - app/presenters\n  #  - app/views\n\n  ## Files or `File.fnmatch` patterns to exclude from search. Some files are always excluded regardless of this setting:\n  ##   %w(*.jpg *.png *.gif *.svg *.ico *.eot *.otf *.ttf *.woff *.woff2 *.pdf *.css *.sass *.scss *.less *.yml *.json)\n  exclude:\n    - app/assets/images\n    - app/assets/fonts\n    - app/assets/videos\n\n  ## Alternatively, the only files or `File.fnmatch patterns` to search in `paths`:\n  ## If specified, this settings takes priority over `exclude`, but `exclude` still applies.\n  # only: [\"*.rb\", \"*.html.slim\"]\n\n  ## If `strict` is `false`, guess usages such as t(\"categories.#{category}.title\"). The default is `true`.\n  # strict: true\n\n  ## Multiple scanners can be used. Their results are merged.\n  ## The options specified above are passed down to each scanner. Per-scanner options can be specified as well.\n  ## See this example of a custom scanner: https://github.com/glebm/i18n-tasks/wiki/A-custom-scanner-example\n\n## Translation Services\n# translation:\n#   # Google Translate\n#   # Get an API key and set billing info at https://code.google.com/apis/console to use Google Translate\n#   google_translate_api_key: \"AbC-dEf5\"\n#   # DeepL Pro Translate\n#   # Get an API key and subscription at https://www.deepl.com/pro to use DeepL Pro\n#   deepl_api_key: \"48E92789-57A3-466A-9959-1A1A1A1A1A1A\"\n\n## Do not consider these keys missing:\n# ignore_missing:\n# - 'errors.messages.{accepted,blank,invalid,too_short,too_long}'\n# - '{devise,simple_form}.*'\n\n## Consider these keys used:\nignore_unused:\n  - 'activerecord.attributes.*'\n  - 'activerecord.models.*'\n  - 'activerecord.validations.*'\n  - '{devise,kaminari,will_paginate}.*'\n  - 'simple_form.{yes,no}'\n  - 'show_for.*'\n  - 'simple_form.{placeholders,hints,labels}.*'\n  - 'simple_form.{error_notification,required}.:'\n  - 'errors.messages.*'\n  - 'transaction.*'\n  - 'user_mailer.*'\n  - 'mailers.user_mailer.*'\n  - 'admin.users.*'\n\n## Exclude these keys from the `i18n-tasks eq-base' report:\n# ignore_eq_base:\n#   all:\n#     - common.ok\n#   fr,es:\n#     - common.brand\n\n## Exclude these keys from the `i18n-tasks check-consistent-interpolations` report:\n# ignore_inconsistent_interpolations:\n# - 'activerecord.attributes.*'\n\n## Ignore these keys completely:\n# ignore:\n#  - kaminari.*\n\n## Sometimes, it isn't possible for i18n-tasks to match the key correctly,\n## e.g. in case of a relative key defined in a helper method.\n## In these cases you can use the built-in PatternMapper to map patterns to keys, e.g.:\n#\n# <%# I18n::Tasks.add_scanner 'I18n::Tasks::Scanners::PatternMapper',\n#       only: %w(*.html.haml *.html.slim),\n#       patterns: [['= title\\b', '.page_title']] %>\n#\n# The PatternMapper can also match key literals via a special %{key} interpolation, e.g.:\n#\n# <%# I18n::Tasks.add_scanner 'I18n::Tasks::Scanners::PatternMapper',\n#       patterns: [['\\bSpree\\.t[( ]\\s*%{key}', 'spree.%{key}']] %>\n"
  },
  {
    "path": "config/initializers/active_merchant.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'active_merchant'\nrequire 'active_merchant/billing/integrations/action_view_helper'\n\nActionView::Base.send(:include, ActiveMerchant::Billing::Integrations::ActionViewHelper)\n\nActiveMerchant::Billing::Base.integration_mode = :production\n"
  },
  {
    "path": "config/initializers/backtrace_silencers.rb",
    "content": "# frozen_string_literal: true\n\n# Be sure to restart your server when you modify this file.\n\n# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces.\n# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ }\n\n# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code.\n# Rails.backtrace_cleaner.remove_silencers!\n"
  },
  {
    "path": "config/initializers/devise.rb",
    "content": "# frozen_string_literal: true\n\n# Use this hook to configure devise mailer, warden hooks and so forth.\n# Many of these configuration options can be set straight in your model.\nDevise.setup do |config|\n  # ==> Mailer Configuration\n  # Configure the e-mail address which will be shown in Devise::Mailer,\n  # note that it will be overwritten if you use your own mailer class with default \"from\" parameter.\n  config.mailer_sender = ENV['EMAIL_FROM']\n  config.secret_key = ENV['SECRET_TOKEN']\n\n  # Configure the class responsible to send e-mails.\n  # config.mailer = \"Devise::Mailer\"\n\n  # ==> ORM configuration\n  # Load and configure the ORM. Supports :active_record (default) and\n  # :mongoid (bson_ext recommended) by default. Other ORMs may be\n  # available as additional gems.\n  require 'devise/orm/active_record'\n\n  # ==> Configuration for any authentication mechanism\n  # Configure which keys are used when authenticating a user. The default is\n  # just :email. You can configure it to use [:username, :subdomain], so for\n  # authenticating a user, both parameters are required. Remember that those\n  # parameters are used only when authenticating and not when retrieving from\n  # session. If you need permissions, you should implement that in a before filter.\n  # You can also supply a hash where the value is a boolean determining whether\n  # or not authentication should be aborted when the value is not present.\n  # config.authentication_keys = [ :email ]\n\n  # Configure parameters from the request object used for authentication. Each entry\n  # given should be a request method and it will automatically be passed to the\n  # find_for_authentication method and considered in your model lookup. For instance,\n  # if you set :request_keys to [:subdomain], :subdomain will be used on authentication.\n  # The same considerations mentioned for authentication_keys also apply to request_keys.\n  # config.request_keys = []\n\n  # Configure which authentication keys should be case-insensitive.\n  # These keys will be downcased upon creating or modifying a user and when used\n  # to authenticate or find a user. Default is :email.\n  config.case_insensitive_keys = [:email]\n\n  # Configure which authentication keys should have whitespace stripped.\n  # These keys will have whitespace before and after removed upon creating or\n  # modifying a user and when used to authenticate or find a user. Default is :email.\n  config.strip_whitespace_keys = [:email]\n\n  # Tell if authentication through request.params is enabled. True by default.\n  # config.params_authenticatable = true\n\n  # Tell if authentication through HTTP Basic Auth is enabled. False by default.\n  # config.http_authenticatable = false\n\n  # If http headers should be returned for AJAX requests. True by default.\n  # config.http_authenticatable_on_xhr = true\n\n  # The realm used in Http Basic Authentication. \"Application\" by default.\n  # config.http_authentication_realm = \"Application\"\n\n  # It will change confirmation, password recovery and other workflows\n  # to behave the same regardless if the e-mail provided was right or wrong.\n  # Does not affect registerable.\n  # config.paranoid = true\n\n  # ==> Configuration for :database_authenticatable\n  # For bcrypt, this is the cost for hashing the password and defaults to 10. If\n  # using other encryptors, it sets how many times you want the password re-encrypted.\n  #\n  # Limiting the stretches to just one in testing will increase the performance of\n  # your test suite dramatically. However, it is STRONGLY RECOMMENDED to not use\n  # a value less than 10 in other environments.\n  config.stretches = Rails.env.test? ? 1 : 10\n\n  # Setup a pepper to generate the encrypted password.\n  # config.pepper = \"d02565c0d6ad09945f846a941a07e5d65e68c9318c6c6fd42059b6bc1d17cfd135548165f5ffdc8bf1dc2e7427208bf434e5bb2ffef3d4ec9c9ff42a9fa65558\"\n\n  # ==> Configuration for :confirmable\n  # A period that the user is allowed to access the website even without\n  # confirming his account. For instance, if set to 2.days, the user will be\n  # able to access the website for two days without confirming his account,\n  # access will be blocked just in the third day. Default is 0.days, meaning\n  # the user cannot access the website without confirming his account.\n  # config.confirm_within = 2.days\n\n  # Defines which key will be used when confirming an account\n  # config.confirmation_keys = [ :email ]\n\n  # ==> Configuration for :rememberable\n  # The time the user will be remembered without asking for credentials again.\n  config.remember_for = 2.weeks\n\n  # If true, a valid remember token can be re-used between multiple browsers.\n  # config.remember_across_browsers = true\n\n  # If true, extends the user's remember period when remembered via cookie.\n  # config.extend_remember_period = false\n\n  # Options to be passed to the created cookie. For instance, you can set\n  # :secure => true in order to force SSL only cookies.\n  # config.cookie_options = {}\n\n  # ==> Configuration for :validatable\n  # Range for password length. Default is 6..128.\n  # config.password_length = 6..128\n\n  # Email regex used to validate email formats. It simply asserts that\n  # an one (and only one) @ exists in the given string. This is mainly\n  # to give user feedback and not to assert the e-mail validity.\n  # config.email_regexp = /\\A[^@]+@[^@]+\\z/\n\n  # ==> Configuration for :timeoutable\n  # The time you want to timeout the user session without activity. After this\n  # time the user will be asked for credentials again. Default is 30 minutes.\n  # config.timeout_in = 30.minutes\n\n  # ==> Configuration for :lockable\n  # Defines which strategy will be used to lock an account.\n  # :failed_attempts = Locks an account after a number of failed attempts to sign in.\n  # :none            = No lock strategy. You should handle locking by yourself.\n  # config.lock_strategy = :failed_attempts\n\n  # Defines which key will be used when locking and unlocking an account\n  # config.unlock_keys = [ :email ]\n\n  # Defines which strategy will be used to unlock an account.\n  # :email = Sends an unlock link to the user email\n  # :time  = Re-enables login after a certain amount of time (see :unlock_in below)\n  # :both  = Enables both strategies\n  # :none  = No unlock strategy. You should handle unlocking by yourself.\n  # config.unlock_strategy = :both\n\n  # Number of authentication tries before locking an account if lock_strategy\n  # is failed attempts.\n  # config.maximum_attempts = 20\n\n  # Time interval to unlock the account if :time is enabled as unlock_strategy.\n  # config.unlock_in = 1.hour\n\n  # ==> Configuration for :recoverable\n  #\n  # Defines which key will be used when recovering the password for an account\n  # config.reset_password_keys = [ :email ]\n\n  # Time interval you can reset your password with a reset password key.\n  # Don't put a too small interval or your users won't have the time to\n  # change their passwords.\n  config.reset_password_within = 2.hours\n\n  # ==> Configuration for :encryptable\n  # Allow you to use another encryption algorithm besides bcrypt (default). You can use\n  # :sha1, :sha512 or encryptors from others authentication tools as :clearance_sha1,\n  # :authlogic_sha512 (then you should set stretches above to 20 for default behavior)\n  # and :restful_authentication_sha1 (then you should set stretches to 10, and copy\n  # REST_AUTH_SITE_KEY to pepper)\n  # config.encryptor = :sha512\n\n  # ==> Configuration for :token_authenticatable\n  # Defines name of the authentication token params key\n  # config.token_authentication_key = :auth_token\n\n  # If true, authentication through token does not store user in session and needs\n  # to be supplied on each request. Useful if you are using the token as API token.\n  # config.stateless_token = false\n\n  # ==> Scopes configuration\n  # Turn scoped views on. Before rendering \"sessions/new\", it will first check for\n  # \"users/sessions/new\". It's turned off by default because it's slower if you\n  # are using only default views.\n  config.scoped_views = true\n\n  # Configure the default scope given to Warden. By default it's the first\n  # devise role declared in your routes (usually :user).\n  # config.default_scope = :user\n\n  # Configure sign_out behavior.\n  # Sign_out action can be scoped (i.e. /users/sign_out affects only :user scope).\n  # The default is true, which means any logout action will sign out all active scopes.\n  # config.sign_out_all_scopes = true\n\n  # ==> Navigation configuration\n  # Lists the formats that should be treated as navigational. Formats like\n  # :html, should redirect to the sign in page when the user does not have\n  # access, but formats like :xml or :json, should return 401.\n  #\n  # If you have any extra navigational formats, like :iphone or :mobile, you\n  # should add them to the navigational formats lists.\n  #\n  # The :\"*/*\" and \"*/*\" formats below is required to match Internet\n  # Explorer requests.\n  # config.navigational_formats = [:\"*/*\", \"*/*\", :html]\n\n  # The default HTTP method used to sign out a resource. Default is :delete.\n  config.sign_out_via = :delete\n\n  # ==> OmniAuth\n  # Add a new OmniAuth provider. Check the wiki for more information on setting\n  # up on your models and hooks.\n  # config.omniauth :github, 'APP_ID', 'APP_SECRET', :scope => 'user,public_repo'\n\n  # ==> Warden configuration\n  # If you want to use other strategies, that are not supported by Devise, or\n  # change the failure app, you can configure them inside the config.warden block.\n  #\n  # config.warden do |manager|\n  #   manager.intercept_401 = false\n  #   manager.default_strategies(:scope => :user).unshift :some_external_strategy\n  # end\nend\n"
  },
  {
    "path": "config/initializers/filter_parameter_logging.rb",
    "content": "# frozen_string_literal: true\n\n# Be sure to restart your server when you modify this file.\n\n# Configure sensitive parameters which will be filtered from the log file.\nRails.application.config.filter_parameters += [:password]\n"
  },
  {
    "path": "config/initializers/inflections.rb",
    "content": "# frozen_string_literal: true\n\n# Be sure to restart your server when you modify this file.\n\n# Add new inflection rules using the following format. Inflections\n# are locale specific, and you may define rules for as many different\n# locales as you wish. All of these examples are active by default:\n# ActiveSupport::Inflector.inflections(:en) do |inflect|\n#   inflect.plural /^(ox)$/i, '\\1en'\n#   inflect.singular /^(ox)en/i, '\\1'\n#   inflect.irregular 'person', 'people'\n#   inflect.uncountable %w( fish sheep )\n# end\n\n# These inflection rules are supported but not enabled by default:\n# ActiveSupport::Inflector.inflections(:en) do |inflect|\n#   inflect.acronym 'RESTful'\n# end\n"
  },
  {
    "path": "config/initializers/kaminari_config.rb",
    "content": "# frozen_string_literal: true\n\nKaminari.configure do |config|\n  config.default_per_page = 15\n  # config.window = 4\n  # config.outer_window = 0\n  # config.left = 0\n  # config.right = 0\n  # config.page_method_name = :page\n  # config.param_name = :page\nend\n"
  },
  {
    "path": "config/initializers/mime_types.rb",
    "content": "# frozen_string_literal: true\n\n# Be sure to restart your server when you modify this file.\n\n# Add new mime types for use in respond_to blocks:\n# Mime::Type.register \"text/richtext\", :rtf\n# Mime::Type.register_alias \"text/html\", :iphone\n"
  },
  {
    "path": "config/initializers/rails_config.rb",
    "content": "# frozen_string_literal: true\n\nRailsConfig.setup do |config|\n  config.const_name = 'Settings'\nend\n"
  },
  {
    "path": "config/initializers/rollbar.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'rollbar/rails'\n\nRollbar.configure do |config|\n  config.access_token = ENV['ROLLBAR_ACCESS_TOKEN']\n\n  # Without configuration, Rollbar is enabled by in all environments.\n  # To disable in specific environments, set config.enabled=false.\n  # Here we'll disable in 'test':\n  config.enabled = false if Rails.env.test? || Rails.env.development? || ENV['ROLLBAR_ACCESS_TOKEN'].nil?\n\n  # By default, Rollbar will try to call the `current_user` controller method\n  # to fetch the logged-in user object, and then call that object's `id`,\n  # `username`, and `email` methods to fetch those properties. To customize:\n  # config.person_method = \"my_current_user\"\n  # config.person_id_method = \"my_id\"\n  # config.person_username_method = \"my_username\"\n  # config.person_email_method = \"my_email\"\n\n  # If you want to attach custom data to all exception and message reports,\n  # provide a lambda like the following. It should return a hash.\n  # config.custom_data_method = lambda { {:some_key => \"some_value\" } }\n\n  # Add exception class names to the exception_level_filters hash to\n  # change the level that exception is reported at. Note that if an exception\n  # has already been reported and logged the level will need to be changed\n  # via the rollbar interface.\n  # Valid levels: 'critical', 'error', 'warning', 'info', 'debug', 'ignore'\n  # 'ignore' will cause the exception to not be reported at all.\n  config.exception_level_filters['AbstractController::ActionNotFound'] = 'ignore'\n  config.exception_level_filters.merge!('ActionController::RoutingError' => 'ignore')\n\n  # You can also specify a callable, which will be called with the exception instance.\n  # config.exception_level_filters.merge!('MyCriticalException' => lambda { |e| 'critical' })\n\n  # Enable asynchronous reporting (uses girl_friday or Threading if girl_friday\n  # is not installed)\n  # config.use_async = true\n  # Supply your own async handler:\n  # config.async_handler = Proc.new { |payload|\n  #  Thread.new { Rollbar.process_payload(payload) }\n  # }\n\n  # Enable asynchronous reporting (using sucker_punch)\n  # config.use_sucker_punch\n\n  # Enable delayed reporting (using Sidekiq)\n  # config.use_sidekiq\n  # You can supply custom Sidekiq options:\n  # config.use_sidekiq 'queue' => 'my_queue'\nend\n"
  },
  {
    "path": "config/initializers/secret_token.rb",
    "content": "# frozen_string_literal: true\n\n# Be sure to restart your server when you modify this file.\n\n# Your secret key for verifying the integrity of signed cookies.\n# If you change this key, all old signed cookies will become invalid!\n\n# Make sure the secret is at least 30 characters and all random,\n# no regular words or you'll be exposed to dictionary attacks.\n# You can use `rake secret` to generate a secure secret key.\n\n# Make sure your secret_key_base is kept private\n# if you're sharing your code publicly.\nSmartvpn::Application.config.secret_key_base = ENV['SECRET_TOKEN']\n"
  },
  {
    "path": "config/initializers/session_store.rb",
    "content": "# frozen_string_literal: true\n\n# Be sure to restart your server when you modify this file.\n\nSmartvpn::Application.config.session_store :cookie_store, key: '_smartvpn_session'\n"
  },
  {
    "path": "config/initializers/show_for.rb",
    "content": "# frozen_string_literal: true\n\n# Use this setup block to configure all options available in ShowFor.\nShowFor.setup do |config|\n  # The tag which wraps show_for calls.\n  # config.show_for_tag = :div\n\n  # The tag which wraps each attribute/association call. Default is :p.\n  # config.wrapper_tag = :dl\n\n  # The tag used to wrap each label. Default is :strong.\n  # config.label_tag = :dt\n\n  # The tag used to wrap each content (value). Default is nil.\n  # config.content_tag = :dd\n\n  # The DOM class set for blank content tags. Default is \"blank\".\n  # config.blank_content_class = 'no_content'\n\n  # The separator between label and content. Default is \"<br />\".\n  # config.separator = \"<br />\"\n\n  # The tag used to wrap collections. Default is :ul.\n  # config.collection_tag = :ul\n\n  # The default iterator to be used when invoking a collection/association.\n  # config.default_collection_proc = lambda { |value| \"<li>#{value}</li>\" }\n\n  # The default format to be used in I18n when localizing a Date/Time.\n  # config.i18n_format = :default\n\n  # Whenever a association is given, the first method in association_methods\n  # in which the association responds to is used to retrieve the association labels.\n  # config.association_methods = [ :name, :title, :to_s ]\n\n  # If you want to wrap the text inside a label (e.g. to append a semicolon),\n  # specify label_proc - it will be automatically called, passing in the label text.\n  # config.label_proc = lambda { |l| \"#{l}\"  }\n  config.label_class = 'label label-primary'\nend\n"
  },
  {
    "path": "config/initializers/simple_form.rb",
    "content": "# frozen_string_literal: true\n\n#\n# Uncomment this and change the path if necessary to include your own\n# components.\n# See https://github.com/plataformatec/simple_form#custom-components to know\n# more about custom components.\n# Dir[Rails.root.join('lib/components/**/*.rb')].each { |f| require f }\n#\n# Use this setup block to configure all options available in SimpleForm.\nSimpleForm.setup do |config|\n  # Wrappers are used by the form builder to generate a\n  # complete input. You can remove any component from the\n  # wrapper, change the order or even add your own to the\n  # stack. The options given below are used to wrap the\n  # whole input.\n  config.wrappers :default, class: :input,\n                            hint_class: :field_with_hint, error_class: :field_with_errors, valid_class: :field_without_errors do |b|\n    ## Extensions enabled by default\n    # Any of these extensions can be disabled for a\n    # given input by passing: `f.input EXTENSION_NAME => false`.\n    # You can make any of these extensions optional by\n    # renaming `b.use` to `b.optional`.\n\n    # Determines whether to use HTML5 (:email, :url, ...)\n    # and required attributes\n    b.use :html5\n\n    # Calculates placeholders automatically from I18n\n    # You can also pass a string as f.input placeholder: \"Placeholder\"\n    b.use :placeholder\n\n    ## Optional extensions\n    # They are disabled unless you pass `f.input EXTENSION_NAME => true`\n    # to the input. If so, they will retrieve the values from the model\n    # if any exists. If you want to enable any of those\n    # extensions by default, you can change `b.optional` to `b.use`.\n\n    # Calculates maxlength from length validations for string inputs\n    # and/or database column lengths\n    b.optional :maxlength\n\n    # Calculate minlength from length validations for string inputs\n    b.optional :minlength\n\n    # Calculates pattern from format validations for string inputs\n    b.optional :pattern\n\n    # Calculates min and max from length validations for numeric inputs\n    b.optional :min_max\n\n    # Calculates readonly automatically from readonly attributes\n    b.optional :readonly\n\n    ## Inputs\n    # b.use :input, class: 'input', error_class: 'is-invalid', valid_class: 'is-valid'\n    b.use :label_input\n    b.use :hint,  wrap_with: { tag: :span, class: :hint }\n    b.use :error, wrap_with: { tag: :span, class: :error }\n\n    ## full_messages_for\n    # If you want to display the full error message for the attribute, you can\n    # use the component :full_error, like:\n    #\n    # b.use :full_error, wrap_with: { tag: :span, class: :error }\n  end\n\n  # The default wrapper to be used by the FormBuilder.\n  config.default_wrapper = :default\n\n  # Define the way to render check boxes / radio buttons with labels.\n  # Defaults to :nested for bootstrap config.\n  #   inline: input + label\n  #   nested: label > input\n  config.boolean_style = :nested\n\n  # Default class for buttons\n  config.button_class = 'btn'\n\n  # Method used to tidy up errors. Specify any Rails Array method.\n  # :first lists the first message for each field.\n  # Use :to_sentence to list all errors for each field.\n  # config.error_method = :first\n\n  # Default tag used for error notification helper.\n  config.error_notification_tag = :div\n\n  # CSS class to add for error notification helper.\n  config.error_notification_class = 'error_notification'\n\n  # ID to add for error notification helper.\n  # config.error_notification_id = nil\n\n  # Series of attempts to detect a default label method for collection.\n  # config.collection_label_methods = [ :to_label, :name, :title, :to_s ]\n\n  # Series of attempts to detect a default value method for collection.\n  # config.collection_value_methods = [ :id, :to_s ]\n\n  # You can wrap a collection of radio/check boxes in a pre-defined tag, defaulting to none.\n  # config.collection_wrapper_tag = nil\n\n  # You can define the class to use on all collection wrappers. Defaulting to none.\n  # config.collection_wrapper_class = nil\n\n  # You can wrap each item in a collection of radio/check boxes with a tag,\n  # defaulting to :span.\n  # config.item_wrapper_tag = :span\n\n  # You can define a class to use in all item wrappers. Defaulting to none.\n  # config.item_wrapper_class = nil\n\n  # How the label text should be generated altogether with the required text.\n  # config.label_text = lambda { |label, required, explicit_label| \"#{required} #{label}\" }\n\n  # You can define the class to use on all labels. Default is nil.\n  # config.label_class = nil\n\n  # You can define the default class to be used on forms. Can be overriden\n  # with `html: { :class }`. Defaulting to none.\n  # config.default_form_class = nil\n\n  # You can define which elements should obtain additional classes\n  # config.generate_additional_classes_for = [:wrapper, :label, :input]\n\n  # Whether attributes are required by default (or not). Default is true.\n  # config.required_by_default = true\n\n  # Tell browsers whether to use the native HTML5 validations (novalidate form option).\n  # These validations are enabled in SimpleForm's internal config but disabled by default\n  # in this configuration, which is recommended due to some quirks from different browsers.\n  # To stop SimpleForm from generating the novalidate option, enabling the HTML5 validations,\n  # change this configuration to true.\n  config.browser_validations = false\n\n  # Collection of methods to detect if a file type was given.\n  # config.file_methods = [ :mounted_as, :file?, :public_filename :attached? ]\n\n  # Custom mappings for input types. This should be a hash containing a regexp\n  # to match as key, and the input type that will be used when the field name\n  # matches the regexp as value.\n  # config.input_mappings = { /count/ => :integer }\n\n  # Custom wrappers for input types. This should be a hash containing an input\n  # type as key and the wrapper that will be used for all inputs with specified type.\n  # config.wrapper_mappings = { string: :prepend }\n\n  # Namespaces where SimpleForm should look for custom input classes that\n  # override default inputs.\n  # config.custom_inputs_namespaces << \"CustomInputs\"\n\n  # Default priority for time_zone inputs.\n  # config.time_zone_priority = nil\n\n  # Default priority for country inputs.\n  # config.country_priority = nil\n\n  # When false, do not use translations for labels.\n  # config.translate_labels = true\n\n  # Automatically discover new inputs in Rails' autoload path.\n  # config.inputs_discovery = true\n\n  # Cache SimpleForm inputs discovery\n  # config.cache_discovery = !Rails.env.development?\n\n  # Default class for inputs\n  # config.input_class = nil\n\n  # Define the default class of the input wrapper of the boolean input.\n  config.boolean_label_class = 'checkbox'\n\n  # Defines if the default input wrapper class should be included in radio\n  # collection wrappers.\n  # config.include_default_input_wrapper_class = true\n\n  # Defines which i18n scope will be used in Simple Form.\n  # config.i18n_scope = 'simple_form'\n\n  # Defines validation classes to the input_field. By default it's nil.\n  # config.input_field_valid_class = 'is-valid'\n  # config.input_field_error_class = 'is-invalid'\nend\n"
  },
  {
    "path": "config/initializers/simple_form_bootstrap.rb",
    "content": "# frozen_string_literal: true\n\n# Please do not make direct changes to this file!\n# This generator is maintained by the community around simple_form-bootstrap:\n# https://github.com/rafaelfranca/simple_form-bootstrap\n# All future development, tests, and organization should happen there.\n# Background history: https://github.com/plataformatec/simple_form/issues/1561\n\n# Uncomment this and change the path if necessary to include your own\n# components.\n# See https://github.com/plataformatec/simple_form#custom-components\n# to know more about custom components.\n# Dir[Rails.root.join('lib/components/**/*.rb')].each { |f| require f }\n\n# Use this setup block to configure all options available in SimpleForm.\nSimpleForm.setup do |config|\n  # Default class for buttons\n  config.button_class = 'btn'\n\n  # Define the default class of the input wrapper of the boolean input.\n  config.boolean_label_class = 'form-check-label'\n\n  # How the label text should be generated altogether with the required text.\n  config.label_text = ->(label, required, _explicit_label) { \"#{label} #{required}\" }\n\n  # Define the way to render check boxes / radio buttons with labels.\n  config.boolean_style = :inline\n\n  # You can wrap each item in a collection of radio/check boxes with a tag\n  config.item_wrapper_tag = :div\n\n  # Defines if the default input wrapper class should be included in radio\n  # collection wrappers.\n  config.include_default_input_wrapper_class = false\n\n  # CSS class to add for error notification helper.\n  config.error_notification_class = 'alert alert-danger'\n\n  # Method used to tidy up errors. Specify any Rails Array method.\n  # :first lists the first message for each field.\n  # :to_sentence to list all errors for each field.\n  config.error_method = :to_sentence\n\n  # add validation classes to `input_field`\n  config.input_field_error_class = 'is-invalid'\n  config.input_field_valid_class = 'is-valid'\n\n  # vertical forms\n  #\n  # vertical default_wrapper\n  config.wrappers :vertical_form, tag: 'div', class: 'form-group', error_class: 'form-group-invalid', valid_class: 'form-group-valid' do |b|\n    b.use :html5\n    b.use :placeholder\n    b.optional :maxlength\n    b.optional :minlength\n    b.optional :pattern\n    b.optional :min_max\n    b.optional :readonly\n    b.use :label, class: 'form-control-label'\n    b.use :input, class: 'form-control', error_class: 'is-invalid', valid_class: 'is-valid'\n    b.use :full_error, wrap_with: { tag: 'div', class: 'invalid-feedback' }\n    b.use :hint, wrap_with: { tag: 'small', class: 'form-text text-muted' }\n  end\n\n  # vertical input for boolean\n  config.wrappers :vertical_boolean, tag: 'fieldset', class: 'form-group', error_class: 'form-group-invalid', valid_class: 'form-group-valid' do |b|\n    b.use :html5\n    b.optional :readonly\n    b.wrapper :form_check_wrapper, tag: 'div', class: 'form-check' do |bb|\n      bb.use :input, class: 'form-check-input', error_class: 'is-invalid', valid_class: 'is-valid'\n      bb.use :label, class: 'form-check-label'\n      bb.use :full_error, wrap_with: { tag: 'div', class: 'invalid-feedback' }\n      bb.use :hint, wrap_with: { tag: 'small', class: 'form-text text-muted' }\n    end\n  end\n\n  # vertical input for radio buttons and check boxes\n  config.wrappers :vertical_collection, item_wrapper_class: 'form-check', tag: 'fieldset', class: 'form-group', error_class: 'form-group-invalid', valid_class: 'form-group-valid' do |b|\n    b.use :html5\n    b.optional :readonly\n    b.wrapper :legend_tag, tag: 'legend', class: 'col-form-label pt-0' do |ba|\n      ba.use :label_text\n    end\n    b.use :input, class: 'form-check-input', error_class: 'is-invalid', valid_class: 'is-valid'\n    b.use :full_error, wrap_with: { tag: 'div', class: 'invalid-feedback d-block' }\n    b.use :hint, wrap_with: { tag: 'small', class: 'form-text text-muted' }\n  end\n\n  # vertical input for inline radio buttons and check boxes\n  config.wrappers :vertical_collection_inline, item_wrapper_class: 'form-check form-check-inline', tag: 'fieldset', class: 'form-group', error_class: 'form-group-invalid', valid_class: 'form-group-valid' do |b|\n    b.use :html5\n    b.optional :readonly\n    b.wrapper :legend_tag, tag: 'legend', class: 'col-form-label pt-0' do |ba|\n      ba.use :label_text\n    end\n    b.use :input, class: 'form-check-input', error_class: 'is-invalid', valid_class: 'is-valid'\n    b.use :full_error, wrap_with: { tag: 'div', class: 'invalid-feedback d-block' }\n    b.use :hint, wrap_with: { tag: 'small', class: 'form-text text-muted' }\n  end\n\n  # vertical file input\n  config.wrappers :vertical_file, tag: 'div', class: 'form-group', error_class: 'form-group-invalid', valid_class: 'form-group-valid' do |b|\n    b.use :html5\n    b.use :placeholder\n    b.optional :maxlength\n    b.optional :minlength\n    b.optional :readonly\n    b.use :label\n    b.use :input, class: 'form-control-file', error_class: 'is-invalid', valid_class: 'is-valid'\n    b.use :full_error, wrap_with: { tag: 'div', class: 'invalid-feedback d-block' }\n    b.use :hint, wrap_with: { tag: 'small', class: 'form-text text-muted' }\n  end\n\n  # vertical multi select\n  config.wrappers :vertical_multi_select, tag: 'div', class: 'form-group', error_class: 'form-group-invalid', valid_class: 'form-group-valid' do |b|\n    b.use :html5\n    b.optional :readonly\n    b.use :label, class: 'form-control-label'\n    b.wrapper tag: 'div', class: 'd-flex flex-row justify-content-between align-items-center' do |ba|\n      ba.use :input, class: 'form-control mx-1', error_class: 'is-invalid', valid_class: 'is-valid'\n    end\n    b.use :full_error, wrap_with: { tag: 'div', class: 'invalid-feedback d-block' }\n    b.use :hint, wrap_with: { tag: 'small', class: 'form-text text-muted' }\n  end\n\n  # vertical range input\n  config.wrappers :vertical_range, tag: 'div', class: 'form-group', error_class: 'form-group-invalid', valid_class: 'form-group-valid' do |b|\n    b.use :html5\n    b.use :placeholder\n    b.optional :readonly\n    b.optional :step\n    b.use :label\n    b.use :input, class: 'form-control-range', error_class: 'is-invalid', valid_class: 'is-valid'\n    b.use :full_error, wrap_with: { tag: 'div', class: 'invalid-feedback d-block' }\n    b.use :hint, wrap_with: { tag: 'small', class: 'form-text text-muted' }\n  end\n\n  # horizontal forms\n  #\n  # horizontal default_wrapper\n  config.wrappers :horizontal_form, tag: 'div', class: 'form-group row', error_class: 'form-group-invalid', valid_class: 'form-group-valid' do |b|\n    b.use :html5\n    b.use :placeholder\n    b.optional :maxlength\n    b.optional :minlength\n    b.optional :pattern\n    b.optional :min_max\n    b.optional :readonly\n    b.use :label, class: 'col-sm-3 col-form-label'\n    b.wrapper :grid_wrapper, tag: 'div', class: 'col-sm-9' do |ba|\n      ba.use :input, class: 'form-control', error_class: 'is-invalid', valid_class: 'is-valid'\n      ba.use :full_error, wrap_with: { tag: 'div', class: 'invalid-feedback' }\n      ba.use :hint, wrap_with: { tag: 'small', class: 'form-text text-muted' }\n    end\n  end\n\n  # horizontal input for boolean\n  config.wrappers :horizontal_boolean, tag: 'div', class: 'form-group row', error_class: 'form-group-invalid', valid_class: 'form-group-valid' do |b|\n    b.use :html5\n    b.optional :readonly\n    b.wrapper tag: 'label', class: 'col-sm-3' do |ba|\n      ba.use :label_text\n    end\n    b.wrapper :grid_wrapper, tag: 'div', class: 'col-sm-9' do |wr|\n      wr.wrapper :form_check_wrapper, tag: 'div', class: 'form-check' do |bb|\n        bb.use :input, class: 'form-check-input', error_class: 'is-invalid', valid_class: 'is-valid'\n        bb.use :label, class: 'form-check-label'\n        bb.use :full_error, wrap_with: { tag: 'div', class: 'invalid-feedback d-block' }\n        bb.use :hint, wrap_with: { tag: 'small', class: 'form-text text-muted' }\n      end\n    end\n  end\n\n  # horizontal input for radio buttons and check boxes\n  config.wrappers :horizontal_collection, item_wrapper_class: 'form-check', tag: 'div', class: 'form-group row', error_class: 'form-group-invalid', valid_class: 'form-group-valid' do |b|\n    b.use :html5\n    b.optional :readonly\n    b.use :label, class: 'col-sm-3 form-control-label'\n    b.wrapper :grid_wrapper, tag: 'div', class: 'col-sm-9' do |ba|\n      ba.use :input, class: 'form-check-input', error_class: 'is-invalid', valid_class: 'is-valid'\n      ba.use :full_error, wrap_with: { tag: 'div', class: 'invalid-feedback d-block' }\n      ba.use :hint, wrap_with: { tag: 'small', class: 'form-text text-muted' }\n    end\n  end\n\n  # horizontal input for inline radio buttons and check boxes\n  config.wrappers :horizontal_collection_inline, item_wrapper_class: 'form-check form-check-inline', tag: 'div', class: 'form-group row', error_class: 'form-group-invalid', valid_class: 'form-group-valid' do |b|\n    b.use :html5\n    b.optional :readonly\n    b.use :label, class: 'col-sm-3 form-control-label'\n    b.wrapper :grid_wrapper, tag: 'div', class: 'col-sm-9' do |ba|\n      ba.use :input, class: 'form-check-input', error_class: 'is-invalid', valid_class: 'is-valid'\n      ba.use :full_error, wrap_with: { tag: 'div', class: 'invalid-feedback d-block' }\n      ba.use :hint, wrap_with: { tag: 'small', class: 'form-text text-muted' }\n    end\n  end\n\n  # horizontal file input\n  config.wrappers :horizontal_file, tag: 'div', class: 'form-group row', error_class: 'form-group-invalid', valid_class: 'form-group-valid' do |b|\n    b.use :html5\n    b.use :placeholder\n    b.optional :maxlength\n    b.optional :minlength\n    b.optional :readonly\n    b.use :label, class: 'col-sm-3 form-control-label'\n    b.wrapper :grid_wrapper, tag: 'div', class: 'col-sm-9' do |ba|\n      ba.use :input, error_class: 'is-invalid', valid_class: 'is-valid'\n      ba.use :full_error, wrap_with: { tag: 'div', class: 'invalid-feedback d-block' }\n      ba.use :hint, wrap_with: { tag: 'small', class: 'form-text text-muted' }\n    end\n  end\n\n  # horizontal multi select\n  config.wrappers :horizontal_multi_select, tag: 'div', class: 'form-group row', error_class: 'form-group-invalid', valid_class: 'form-group-valid' do |b|\n    b.use :html5\n    b.optional :readonly\n    b.use :label, class: 'col-sm-3 control-label'\n    b.wrapper :grid_wrapper, tag: 'div', class: 'col-sm-9' do |ba|\n      ba.wrapper tag: 'div', class: 'd-flex flex-row justify-content-between align-items-center' do |bb|\n        bb.use :input, class: 'form-control mx-1', error_class: 'is-invalid', valid_class: 'is-valid'\n      end\n      ba.use :full_error, wrap_with: { tag: 'div', class: 'invalid-feedback d-block' }\n      ba.use :hint, wrap_with: { tag: 'small', class: 'form-text text-muted' }\n    end\n  end\n\n  # horizontal range input\n  config.wrappers :horizontal_range, tag: 'div', class: 'form-group row', error_class: 'form-group-invalid', valid_class: 'form-group-valid' do |b|\n    b.use :html5\n    b.use :placeholder\n    b.optional :readonly\n    b.optional :step\n    b.use :label, class: 'col-sm-3 form-control-label'\n    b.wrapper :grid_wrapper, tag: 'div', class: 'col-sm-9' do |ba|\n      ba.use :input, class: 'form-control-range', error_class: 'is-invalid', valid_class: 'is-valid'\n      ba.use :full_error, wrap_with: { tag: 'div', class: 'invalid-feedback d-block' }\n      ba.use :hint, wrap_with: { tag: 'small', class: 'form-text text-muted' }\n    end\n  end\n\n  # inline forms\n  #\n  # inline default_wrapper\n  config.wrappers :inline_form, tag: 'span', error_class: 'form-group-invalid', valid_class: 'form-group-valid' do |b|\n    b.use :html5\n    b.use :placeholder\n    b.optional :maxlength\n    b.optional :minlength\n    b.optional :pattern\n    b.optional :min_max\n    b.optional :readonly\n    b.use :label, class: 'sr-only'\n\n    b.use :input, class: 'form-control', error_class: 'is-invalid', valid_class: 'is-valid'\n    b.use :error, wrap_with: { tag: 'div', class: 'invalid-feedback' }\n    b.optional :hint, wrap_with: { tag: 'small', class: 'form-text text-muted' }\n  end\n\n  # inline input for boolean\n  config.wrappers :inline_boolean, tag: 'span', class: 'form-check flex-wrap justify-content-start mr-sm-2', error_class: 'form-group-invalid', valid_class: 'form-group-valid' do |b|\n    b.use :html5\n    b.optional :readonly\n    b.use :input, class: 'form-check-input', error_class: 'is-invalid', valid_class: 'is-valid'\n    b.use :label, class: 'form-check-label'\n    b.use :error, wrap_with: { tag: 'div', class: 'invalid-feedback' }\n    b.optional :hint, wrap_with: { tag: 'small', class: 'form-text text-muted' }\n  end\n\n  # bootstrap custom forms\n  #\n  # custom input for boolean\n  config.wrappers :custom_boolean, tag: 'fieldset', class: 'form-group', error_class: 'form-group-invalid', valid_class: 'form-group-valid' do |b|\n    b.use :html5\n    b.optional :readonly\n    b.wrapper :form_check_wrapper, tag: 'div', class: 'custom-control custom-checkbox' do |bb|\n      bb.use :input, class: 'custom-control-input', error_class: 'is-invalid', valid_class: 'is-valid'\n      bb.use :label, class: 'custom-control-label'\n      bb.use :full_error, wrap_with: { tag: 'div', class: 'invalid-feedback' }\n      bb.use :hint, wrap_with: { tag: 'small', class: 'form-text text-muted' }\n    end\n  end\n\n  config.wrappers :custom_boolean_switch, tag: 'fieldset', class: 'form-group', error_class: 'form-group-invalid', valid_class: 'form-group-valid' do |b|\n    b.use :html5\n    b.optional :readonly\n    b.wrapper :form_check_wrapper, tag: 'div', class: 'custom-control custom-checkbox-switch' do |bb|\n      bb.use :input, class: 'custom-control-input', error_class: 'is-invalid', valid_class: 'is-valid'\n      bb.use :label, class: 'custom-control-label'\n      bb.use :full_error, wrap_with: { tag: 'div', class: 'invalid-feedback' }\n      bb.use :hint, wrap_with: { tag: 'small', class: 'form-text text-muted' }\n    end\n  end\n\n  # custom input for radio buttons and check boxes\n  config.wrappers :custom_collection, item_wrapper_class: 'custom-control', tag: 'fieldset', class: 'form-group', error_class: 'form-group-invalid', valid_class: 'form-group-valid' do |b|\n    b.use :html5\n    b.optional :readonly\n    b.wrapper :legend_tag, tag: 'legend', class: 'col-form-label pt-0' do |ba|\n      ba.use :label_text\n    end\n    b.use :input, class: 'custom-control-input', error_class: 'is-invalid', valid_class: 'is-valid'\n    b.use :full_error, wrap_with: { tag: 'div', class: 'invalid-feedback d-block' }\n    b.use :hint, wrap_with: { tag: 'small', class: 'form-text text-muted' }\n  end\n\n  # custom input for inline radio buttons and check boxes\n  config.wrappers :custom_collection_inline, item_wrapper_class: 'custom-control custom-control-inline', tag: 'fieldset', class: 'form-group', error_class: 'form-group-invalid', valid_class: 'form-group-valid' do |b|\n    b.use :html5\n    b.optional :readonly\n    b.wrapper :legend_tag, tag: 'legend', class: 'col-form-label pt-0' do |ba|\n      ba.use :label_text\n    end\n    b.use :input, class: 'custom-control-input', error_class: 'is-invalid', valid_class: 'is-valid'\n    b.use :full_error, wrap_with: { tag: 'div', class: 'invalid-feedback d-block' }\n    b.use :hint, wrap_with: { tag: 'small', class: 'form-text text-muted' }\n  end\n\n  # custom file input\n  config.wrappers :custom_file, tag: 'div', class: 'form-group', error_class: 'form-group-invalid', valid_class: 'form-group-valid' do |b|\n    b.use :html5\n    b.use :placeholder\n    b.optional :maxlength\n    b.optional :minlength\n    b.optional :readonly\n    b.use :label, class: 'form-control-label'\n    b.wrapper :custom_file_wrapper, tag: 'div', class: 'custom-file' do |ba|\n      ba.use :input, class: 'custom-file-input', error_class: 'is-invalid', valid_class: 'is-valid'\n      ba.use :label, class: 'custom-file-label'\n      ba.use :full_error, wrap_with: { tag: 'div', class: 'invalid-feedback' }\n    end\n    b.use :hint, wrap_with: { tag: 'small', class: 'form-text text-muted' }\n  end\n\n  # custom multi select\n  config.wrappers :custom_multi_select, tag: 'div', class: 'form-group', error_class: 'form-group-invalid', valid_class: 'form-group-valid' do |b|\n    b.use :html5\n    b.optional :readonly\n    b.use :label, class: 'form-control-label'\n    b.wrapper tag: 'div', class: 'd-flex flex-row justify-content-between align-items-center' do |ba|\n      ba.use :input, class: 'custom-select mx-1', error_class: 'is-invalid', valid_class: 'is-valid'\n    end\n    b.use :full_error, wrap_with: { tag: 'div', class: 'invalid-feedback d-block' }\n    b.use :hint, wrap_with: { tag: 'small', class: 'form-text text-muted' }\n  end\n\n  # custom range input\n  config.wrappers :custom_range, tag: 'div', class: 'form-group', error_class: 'form-group-invalid', valid_class: 'form-group-valid' do |b|\n    b.use :html5\n    b.use :placeholder\n    b.optional :readonly\n    b.optional :step\n    b.use :label, class: 'form-control-label'\n    b.use :input, class: 'custom-range', error_class: 'is-invalid', valid_class: 'is-valid'\n    b.use :full_error, wrap_with: { tag: 'div', class: 'invalid-feedback d-block' }\n    b.use :hint, wrap_with: { tag: 'small', class: 'form-text text-muted' }\n  end\n\n  # Input Group - custom component\n  # see example app and config at https://github.com/rafaelfranca/simple_form-bootstrap\n  # config.wrappers :input_group, tag: 'div', class: 'form-group', error_class: 'form-group-invalid', valid_class: 'form-group-valid' do |b|\n  #   b.use :html5\n  #   b.use :placeholder\n  #   b.optional :maxlength\n  #   b.optional :minlength\n  #   b.optional :pattern\n  #   b.optional :min_max\n  #   b.optional :readonly\n  #   b.use :label, class: 'form-control-label'\n  #   b.wrapper :input_group_tag, tag: 'div', class: 'input-group' do |ba|\n  #     ba.optional :prepend\n  #     ba.use :input, class: 'form-control', error_class: 'is-invalid', valid_class: 'is-valid'\n  #     ba.optional :append\n  #   end\n  #   b.use :full_error, wrap_with: { tag: 'div', class: 'invalid-feedback d-block' }\n  #   b.use :hint, wrap_with: { tag: 'small', class: 'form-text text-muted' }\n  # end\n\n  # Floating Labels form\n  #\n  # floating labels default_wrapper\n  config.wrappers :floating_labels_form, tag: 'div', class: 'form-label-group', error_class: 'form-group-invalid', valid_class: 'form-group-valid' do |b|\n    b.use :html5\n    b.use :placeholder\n    b.optional :maxlength\n    b.optional :minlength\n    b.optional :pattern\n    b.optional :min_max\n    b.optional :readonly\n    b.use :input, class: 'form-control', error_class: 'is-invalid', valid_class: 'is-valid'\n    b.use :label, class: 'form-control-label'\n    b.use :full_error, wrap_with: { tag: 'div', class: 'invalid-feedback' }\n    b.use :hint, wrap_with: { tag: 'small', class: 'form-text text-muted' }\n  end\n\n  # custom multi select\n  config.wrappers :floating_labels_select, tag: 'div', class: 'form-label-group', error_class: 'form-group-invalid', valid_class: 'form-group-valid' do |b|\n    b.use :html5\n    b.optional :readonly\n    b.use :input, class: 'custom-select custom-select-lg', error_class: 'is-invalid', valid_class: 'is-valid'\n    b.use :label, class: 'form-control-label'\n    b.use :full_error, wrap_with: { tag: 'div', class: 'invalid-feedback' }\n    b.use :hint, wrap_with: { tag: 'small', class: 'form-text text-muted' }\n  end\n\n  # The default wrapper to be used by the FormBuilder.\n  config.default_wrapper = :vertical_form\n\n  # Custom wrappers for input types. This should be a hash containing an input\n  # type as key and the wrapper that will be used for all inputs with specified type.\n  config.wrapper_mappings = {\n    boolean: :vertical_boolean,\n    check_boxes: :vertical_collection,\n    date: :vertical_multi_select,\n    datetime: :vertical_multi_select,\n    file: :vertical_file,\n    radio_buttons: :vertical_collection,\n    range: :vertical_range,\n    time: :vertical_multi_select\n  }\n\n  # enable custom form wrappers\n  # config.wrapper_mappings = {\n  #   boolean:       :custom_boolean,\n  #   check_boxes:   :custom_collection,\n  #   date:          :custom_multi_select,\n  #   datetime:      :custom_multi_select,\n  #   file:          :custom_file,\n  #   radio_buttons: :custom_collection,\n  #   range:         :custom_range,\n  #   time:          :custom_multi_select\n  # }\nend\n"
  },
  {
    "path": "config/initializers/wrap_parameters.rb",
    "content": "# frozen_string_literal: true\n\n# Be sure to restart your server when you modify this file.\n\n# This file contains settings for ActionController::ParamsWrapper which\n# is enabled by default.\n\n# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array.\nActiveSupport.on_load(:action_controller) do\n  wrap_parameters format: [:json] if respond_to?(:wrap_parameters)\nend\n\n# To enable root element in JSON for ActiveRecord objects.\n# ActiveSupport.on_load(:active_record) do\n#  self.include_root_in_json = true\n# end\n"
  },
  {
    "path": "config/locales/admin/en.yml",
    "content": "---\nen:\n  admin:\n    buttons:\n      apply: Apply\n      disable: Disable\n      enable: Enable\n      filter: Filter\n    connections:\n      active: Active\n      title: Connections\n    dashboard:\n      customers: Customers\n      title: Dashboard\n      total_income: Total income\n      total_traffic: Total traffic\n    labels:\n      date_from: Date from\n      date_to: Date to\n      email_cont: Email contains\n      plan: Plan\n      server: Server\n      user: User\n    layout:\n      change_password: Change password\n      sign_out: Sign out\n      title: \"%{brand} Admin panel\"\n    legends:\n      attributes: Attributes\n      common: Common\n      connection_data: Connection data\n      connections: Connections\n      options: Options\n      plans: Plans\n      prices: Prices\n      referrer_program: Referrer program\n      servers: Servers\n    links:\n      active: Active\n      all: All\n      by_date: By date\n      by_servers: By servers\n      by_users: By users\n      connections: Connections\n      create: Create\n      dashboard: Dashboard\n      edit: Edit\n      email_list: Email list\n      options: Options\n      paid: Paid\n      payment_systems: Payment systems\n      plans: Plans\n      promos: Promos\n      referrers: Referrers\n      servers: Servers\n      this_month_paid: Paid in the current month\n      traffic: Traffic\n      transactions: Transactions\n      users: Users\n      withdraw: Withdraw\n    options:\n      edit: 'Edit:'\n      new: Create new\n      notices:\n        created: Option successfully added\n        updated: Option successfully updated\n      title: Options\n    pay_systems:\n      edit: Edit\n      new: Create new\n      show: Show\n      states:\n        disabled: Deactivated\n        enabled: Activated\n      title: Payment systems\n    plans:\n      edit: 'Edit:'\n      new: Create new\n      notices:\n        created: Plan successfully added\n        destroyed: Plan deleted\n        updated: Plan successfully updated\n      title: Plans\n    profile:\n      change_password: Change password\n      notices:\n        updated: Password successfully updated\n    promos:\n      edit: 'Edit:'\n      new: Create new\n      notices:\n        created: Promo successfully added\n        updated: Promo successfully updated\n      title: Promos\n    referrers:\n      title: Referrers\n    servers:\n      edit: Edit\n      new: Create new\n      notices:\n        created: Server successfully added\n        destroyed: Server deleted\n        updated: Server successfully updated\n      show: Show\n      title: Servers\n    tables:\n      actions: Actions\n      amount: Amount\n      balance: Balance\n      code: Code\n      date: Date\n      description: Description\n      email: Email\n      event: Event\n      hostname: Hostname\n      id: ID\n      incoming_traffic: Incoming traffic\n      ip_address: IP address\n      logged_in_billing: Logged in billing\n      name: Name\n      number_connections: Number of connections\n      outbound_traffic: Outbound traffic\n      period: Period\n      plan: Plan\n      plans: Plans\n      price: Price\n      profit: Profit\n      promoter_type: Promoter type\n      referrals: Referrals\n      registration_date: Registration date\n      server: Server\n      state: State\n      total: Total\n      traffic: Traffic\n      turnover: Turnover\n      type: Type\n      unsuccessful_charges: Unsuccessful charges\n      user: User\n    traffic_reports:\n      date_reports: By date\n      servers_reports: By servers\n      title: Reports by traffic\n      users_reports: By users\n    transactions:\n      title: Transactions\n    users:\n      all: All\n      all_users: All users\n      connected_to_server_at: Connected to server %{server} at %{date}\n      current_connection: Current connection\n      edit: Edit\n      filter:\n        never_paid_users: Never paying users\n      new: Create new\n      new_payment: Top up balance\n      not_connected: No connection\n      not_paid: Unpaid\n      notices:\n        created: User created successfully\n        disconnected: User successfully disconnected\n        payment_created: User's account balance top-up successfully\n        prolongated: User subscription successfully renewed\n        test_period_disabled: Trial period deactivated\n        test_period_enabled: Trial period activated\n        updated: User updated successfully\n        write_off: Write off\n      payers: Paid subscription\n      prolongation: Subscription renewal\n      prolongation_not_possible: Impossible to prolong. User has no active payment\n      show: Show\n      test_period: Trial account\n      test_period_until: Active from %{start} to %{finish}\n      this_month_payers: Paid in the current month\n      title: Users\n  admins:\n    sessions:\n      new:\n        email: Email\n        password: Password\n        sign_in: Sign in\n        staff_entrance: Administration\n"
  },
  {
    "path": "config/locales/admin/ru.yml",
    "content": "---\nru:\n  admin:\n    buttons:\n      apply: Применить\n      disable: Отключить\n      enable: Включить\n      filter: Фильтр\n    connections:\n      active: Активные\n      title: Соединения\n    dashboard:\n      customers: Клиентов\n      title: Панель управления\n      total_income: Общий доход\n      total_traffic: Общий трафик\n    labels:\n      date_from: Дата от\n      date_to: Дата до\n      email_cont: Email содержит\n      plan: План\n      server: Сервер\n      user: Пользователь\n    layout:\n      change_password: Измененить пароль\n      sign_out: Выход\n      title: \"%{brand} Панель администрирования\"\n    legends:\n      attributes: Атрибуты\n      common: Общее\n      connection_data: Данные подключения\n      connections: Подключения\n      options: Опции\n      plans: Тарифы\n      prices: Цены\n      referrer_program: Партнерская программа\n      servers: Сервера\n    links:\n      active: Активные\n      all: Все\n      by_date: По дате\n      by_servers: По серверам\n      by_users: По пользователям\n      connections: Соединения\n      create: Создать\n      dashboard: Панель управления\n      edit: Редактировать\n      email_list: Список email\n      options: Опции\n      paid: Оплатившие\n      payment_systems: Платежные системы\n      plans: Тарифы\n      promos: Акции\n      referrers: Рефереры\n      servers: Серверы\n      this_month_paid: Оплатившие в текущем месяце\n      traffic: Трафик\n      transactions: Транзакции\n      users: Пользователи\n      withdraw: Списать\n    options:\n      edit: 'Редактировать:'\n      new: Создать новую\n      notices:\n        created: Опция успешно добавлена\n        updated: Опция успешно обновлена\n      title: Опции\n    pay_systems:\n      edit: Редактировать\n      new: Создать новую\n      show: Просмотр\n      states:\n        disabled: Выключена\n        enabled: Включена\n      title: Платежные системы\n    plans:\n      edit: 'Редактировать:'\n      new: Создать новый\n      notices:\n        created: Тариф успешно добавлен\n        destroyed: Тариф удален\n        updated: Тариф успешно обновлен\n      title: Тарифы\n    profile:\n      change_password: Изменение пароля\n      notices:\n        updated: Пароль успешно обновлен\n    promos:\n      edit: 'Редактировать:'\n      new: Создать новый\n      notices:\n        created: Акция успешно добавлена\n        updated: Акция успешно обновлена\n      title: Акции\n    referrers:\n      title: Рефереры\n    servers:\n      edit: Редактировать\n      new: Создать новый\n      notices:\n        created: Сервер успешно добавлен\n        destroyed: Сервер удален\n        updated: Сервер успешно обновлен\n      show: Просмотр\n      title: Сервера\n    tables:\n      actions: Действия\n      amount: Сумма\n      balance: Баланс\n      code: Код\n      date: Дата\n      description: Описание\n      email: Email\n      event: Событие\n      hostname: Имя хоста\n      id: ID\n      incoming_traffic: Входящий трафик\n      ip_address: IP адрес\n      logged_in_billing: Входил в биллинг\n      name: Имя\n      number_connections: Количество подключений\n      outbound_traffic: Исходящий трафик\n      period: Период\n      plan: Тариф\n      plans: Тарифы\n      price: Цена\n      profit: Прибыль\n      promoter_type: Тип промоутера\n      referrals: Рефералов\n      registration_date: Дата регистрации\n      server: Сервер\n      state: Состояние\n      total: Всего\n      traffic: Траффик\n      turnover: Оборот\n      type: Тип\n      unsuccessful_charges: Неудачных списаний\n      user: Пользователь\n    traffic_reports:\n      date_reports: По дате\n      servers_reports: По серверам\n      title: Отчеты по трафику\n      users_reports: По пользователям\n    transactions:\n      title: Транзакции\n    users:\n      all: Все\n      all_users: Все пользователи\n      connected_to_server_at: Подключен к серверу %{server} в %{date}\n      current_connection: Текущее подключение\n      edit: Редактировать\n      filter:\n        never_paid_users: С нулевым оборотом\n      new: Создать нового\n      new_payment: Пополнение баланса\n      not_connected: Нет подключения\n      not_paid: Не оплачен\n      notices:\n        created: Пользователь успешно создан\n        disconnected: Пользователь успешно отключен\n        payment_created: Баланс пользователя успешно пополнен\n        prolongated: Подписка пользователя успешно продлена\n        test_period_disabled: Тестовый период деактивирован\n        test_period_enabled: Тестовый период активирован\n        updated: Пользователь успешно обновлен\n        write_off: Списано\n      payers: Оплатившие подписку\n      prolongation: Продление подписки\n      prolongation_not_possible: Пролонгация невозможна, у пользователя нет активного платежа\n      show: Просмотр\n      test_period: Тестовый доступ\n      test_period_until: Активен c %{start} до %{finish}\n      this_month_payers: Оплатившие в текущем месяце\n      title: Пользователи\n  admins:\n    sessions:\n      new:\n        email: Email\n        password: Пароль\n        sign_in: Войти\n        staff_entrance: Служебный вход\n"
  },
  {
    "path": "config/locales/billing/en.yml",
    "content": "---\nen:\n  billing:\n    home:\n      account_info:\n        account_info: Account info\n        balance: Balance\n        login: Login\n        password: Password\n        plan: Price plan\n        promotions: Promos\n        states:\n          'false': Inactive\n          'true': Active\n        test_period: 'Trial access: '\n        test_period_range: from %{from} to %{to}\n        vpn_credentials: VPN credentials\n        vpn_state: VPN Status\n      current_connection:\n        connection_exists: Active connection\n        connection_info: Connection info\n        connection_server: Connected to server\n        connection_status:\n          'false': 'no'\n          'true': 'yes'\n        last_connect: Last connection\n        server: \" to server\"\n      last_transactions:\n        payments_stat: Transactions history\n    options:\n      activate: Activate\n      available: Available options\n      confirms:\n        activate: Are you sure want to activate paid service?\n        deactivate: Are you sure want to deactivate service?\n      deactivate: Deactivate\n      disconnect_to_tune_options: Please turn off VPN to adjust settings.\n      enabled: Activated options\n      name: Name\n      notices:\n        activate_subscription_first: Available only for users with activated VPN service\n        activated: Service successfully activated\n        deactivated: Service successfully deactivated\n        not_activated: Impossible to activate service\n        updated: Service settings saved\n      price: Price/month\n      settings: Settings\n      states:\n        disable: Activate\n        enable: Deactivate\n      subscription_status: Status\n    payments:\n      index:\n        accepted: Accepted\n        all: Please contact customer support if you want to use a currency which is not in the list\n        pay_systems: currencies\n      merchant:\n        payment_finalization: Payment complete\n        payment_finalization_text: To make a payment you need to push \"Pay\" button.<br /> You will be forwarded to the payment system webpage, where you can make a payment.\n        submit: Pay\n      new:\n        balance_fullfillment: Top-up account\n        submit: Top-up\n      notices:\n        fail: Something went wrong. Please contact customer support.\n        success: Your account has been successfully credited.\n    promotions:\n      notices:\n        no_promos_found: No promotions found\n        promotion_activated: Promo activates\n        promotion_already_activated: Promo is already activated\n    referrals:\n      account_balance: 'Balance: %{balance} $'\n      amount: Amount\n      date: Date\n      disclaimer: It does not matter whether you own resources with high traffic (popular sites, forums, blogs, etc.) or simply are our client, we invite you to make money with us. You have several options how to become a part of our affiliate program. <p /> The easiest is the referral link. Each our registered user has a unique referral link. Place this link on third-party resources, share your experience of working with us and talk about our service. Users used your provided link will automatically become your referrals and you receive a lifetime 10% income from the profit from all payments made by your referals. <p />You will have an access to statistics on all payments that your referrals did, as well as the full history of your affiliate earnings.\n      no_operations: You have no affiliate rewards yet.\n      no_referrals: You have no referrals yet\n      operations: Account transactions\n      referrals: Your referrals\n      registration_date: Registration date\n      title: Affiliate program\n    servers:\n      config: Config\n      country: Country\n      download_config: Download config\n      hostname: Host\n      port: Port\n      protocol: Protocol\n      title: Avaiable servers\n  global:\n    apply: Apply\n    authorize_please: Please sign in before proceed\n  layouts:\n    billing:\n      billing: Profile\n      menu:\n        options: Options\n        payment: Payment\n        profile: Settings\n        referrers: Partnership\n        servers: Servers\n  transaction:\n    amount: Amount\n    date: Date\n    description: Transaction\n    descriptions:\n      payment: Payment via %{pay_system_name}\n      withdrawal: Withdrawal by price plan %{plan_name}\n    id: Number\n    user: User\n  user_mailer:\n    balance_withdrawal:\n      hello: Hello\n      subject: Funds withdrawal\n      we_have_withdrawed: Montly payment of %{amount} USD has been debited from your account.\n    could_not_withdraw_funds:\n      could_not_withdraw: Not enough funds to charge monthly payment of %{amount} USD. Please note, that VPN service will stay unavailable until the debt is paid.\n      hello: Hello\n      subject: Unsufficient funds\n    funds_recieved:\n      hello: Hello\n      subject: Account top-up successfully\n      your_balance_was_fulfilled_on: 'Credited amount:'\n    signature:\n      support: techinical support\n      with_great_honor: Yours sincerely\n    test_period_enabled:\n      hello: Hello\n      instructions: To start using service, you need to setup VPN client and connect to the servers using instructions from your profile \"Help\" section.\n      subject: Trial access activated\n      test_period_is_activated: Trial access has been activated\n      test_period_range: From %{from} to %{to}\n    unpaid_user_notification:\n      message: Good afternoon!<br /> My name is Victor. I am your personal manager from SmartVPN.biz.<br /> <br /> You have been registered today, but not credited your account balance.<br /> Do you have a questions regarding services or price plans? Or you either have a problems with payment systems?<br /> <br /> Should you have any questions, please don't hesitate to contact us any time.\n      subject: Do you have questions?\n  users:\n    registrations:\n      promo:\n        promo_code: Enter promo code\n"
  },
  {
    "path": "config/locales/billing/ru.yml",
    "content": "---\nru:\n  billing:\n    home:\n      account_info:\n        account_info: Информация об аккаунте\n        balance: Баланс\n        login: Логин\n        password: Пароль\n        plan: Тарифный план\n        promotions: Акции\n        states:\n          'false': Выключен\n          'true': Включен\n        test_period: 'Тестовый период: '\n        test_period_range: c %{from} по %{to}\n        vpn_credentials: Реквизиты для подключения\n        vpn_state: Статус VPN\n      current_connection:\n        connection_exists: Наличие текущего подключения\n        connection_info: Информация о подключении\n        connection_server: Подключен к серверу\n        connection_status:\n          'false': нет\n          'true': да\n        last_connect: Последнее подключение\n        server: \" к серверу\"\n      last_transactions:\n        payments_stat: История операций\n    options:\n      activate: Подключить\n      available: Доступные опции\n      confirms:\n        activate: Вы уверены что хотите подключить платную услугу?\n        deactivate: Вы уверены что хотите отключить услугу?\n      deactivate: Отключить\n      disconnect_to_tune_options: Чтобы настроить опции - отключитесь от VPN\n      enabled: Активные опции\n      name: Название\n      notices:\n        activate_subscription_first: Перед подключением услуг необходимо активировать оплатить базовый VPN сервис\n        activated: Услуга успешно подключена\n        deactivated: Услуга успешно отключена\n        not_activated: Невозможно подключить услугу\n        updated: Настройки услуги сохранены\n      price: Цена/месяц\n      settings: Настройки\n      states:\n        disable: Включить\n        enable: Выключить\n      subscription_status: Статус\n    payments:\n      index:\n        accepted: Принимаемые\n        all: Если вы хотите заплатить валютой, которой нет в списке - обратитесь в поддержку сервиса\n        pay_systems: валюты\n      merchant:\n        payment_finalization: Завершение оплаты\n        payment_finalization_text: Для завершения оплаты вам необходимо нажать на кнопку 'Оплатить'. <br/> После этого вы будете перенаправлены на страницу выбранной платежной системы, и там сможете выполнить платеж.\n        submit: Оплатить\n      new:\n        balance_fullfillment: Пополнение баланса\n        submit: Пополнить\n      notices:\n        fail: Произошла ошибка при получении средств. Пожалуйста, свяжитесь с технической поддержкой.\n        success: Средства были получены и успешно зачислены на ваш счет в системе\n    promotions:\n      notices:\n        no_promos_found: По данному промо-коду не акций нет\n        promotion_activated: Акция активирована\n        promotion_already_activated: Акция уже активирована\n    referrals:\n      account_balance: 'Баланс: %{balance} $'\n      amount: Сумма\n      date: Дата\n      disclaimer: Не важно, владеете ли вы ресурсами с большим трафиком (раскрученные сайты, форумы, блоги и т.д.) или просто являетесь нашим клиентом, мы приглашаем вас зарабатывать вместе с нами. Вы можете использовать несколько способов работы нашей партнерской программы. <p /> Самый простой - это реферальная ссылка. У каждого нашего зарегистрированного пользователя имеется уникальная реферальная ссылка. Размещайте эту ссылку на сторонних ресурсах, делясь опытом сотрудничества с нами и рассказывая о схемах работы нашего сервиса. Пользователи, которые зарегистрируются по вашей реферальной ссылке автоматически становятся вашими рефералами и вы будете получать пожизненный доход в 10% с прибыли со всех платежей. <p /> Вам будет доступна статистика по всем платежам которые сделают ваши рефералы, а так же полная история ваших партнерских заработков.\n      no_operations: У вас пока нет партнерских вознаграждений\n      no_referrals: У вас пока нет реферралов\n      operations: Движение по счету\n      referrals: Ваши рефералы\n      registration_date: Дата регистрации\n      title: Партнерская программа\n    servers:\n      config: Конфиг\n      country: Страна\n      download_config: Скачать\n      hostname: Хост\n      port: Порт\n      protocol: Протокол\n      title: Доступные серверы\n  global:\n    apply: Применить\n    authorize_please: Войдите в систему, прежде чем продолжить\n  layouts:\n    billing:\n      billing: Личный кабинет\n      menu:\n        options: Услуги\n        payment: Оплата\n        profile: Настройки\n        referrers: Партнерская программа\n        servers: Серверы\n  transaction:\n    amount: Сумма\n    date: Дата\n    description: Операция\n    descriptions:\n      payment: Пополнение через платежную систему %{pay_system_name}\n      withdrawal: Списание по тарифу %{plan_name}\n    id: Номер\n    user: Пользователь\n  user_mailer:\n    balance_withdrawal:\n      hello: Здравствуйте\n      subject: Списание средств со счета\n      we_have_withdrawed: С вашего счета списан ежемесячный платеж в размере %{amount} USD.\n    could_not_withdraw_funds:\n      could_not_withdraw: Баланс вашего счета не позволяет списать ежемесячный платеж размере %{amount} USD. Обратите внимание, что сервис VPN будет недоступен, пока платеж не будет списан.\n      hello: Здравствуйте\n      subject: Недостаточно средств для списания со счета\n    funds_recieved:\n      hello: Здравствуйте\n      subject: Баланс вашего счета пополнен\n      your_balance_was_fulfilled_on: Баланс вашего счета пополнен на\n    signature:\n      support: служба технической поддержки\n      with_great_honor: С уважением\n    test_period_enabled:\n      hello: Здравствуйте\n      instructions: Для начала работы настройте клиент и подключитесь в соответствии с разделом \"Инструкции\" в личном кабинете.\n      subject: Тестовый период активирован\n      test_period_is_activated: Для вас активирован тестовый доступ\n      test_period_range: C %{from} по %{to}\n    unpaid_user_notification:\n      message: Добрый день!<br /> Меня зовут Виктор Иванов, я ваш менеджер в сервисе SmartVPN.biz.<br /> <br /> Сегодня вы зарегистрировались но не пополнили баланс в нашей системе.<br /> У вас есть вопросы по тарифам или услугам? Или у вас проблемы с пополнением счета?<br /> <br /> При возникновении любых вопросов мы готовы вам помочь :)\n      subject: Вопросы по тарифам SmartVPN.biz?\n  users:\n    registrations:\n      promo:\n        promo_code: Ввести промо-код\n"
  },
  {
    "path": "config/locales/devise.en.yml",
    "content": "---\nen:\n  activerecord:\n    attributes:\n      user:\n        confirmation_sent_at: Confirmation sent at\n        confirmation_token: Confirmation token\n        confirmed_at: Confirmed at\n        created_at: Created at\n        current_password: Current password\n        current_sign_in_at: Current sign in at\n        current_sign_in_ip: Current sign in IP\n        email: Email\n        encrypted_password: Encrypted password\n        failed_attempts: Failed attempts\n        last_sign_in_at: Last sign in at\n        last_sign_in_ip: Last sign in IP\n        locked_at: Locked at\n        password: Password\n        password_confirmation: Password confirmation\n        remember_created_at: Remember created at\n        remember_me: Remember me\n        reset_password_sent_at: Reset password sent at\n        reset_password_token: Reset password token\n        sign_in_count: Sign in count\n        unconfirmed_email: Unconfirmed email\n        unlock_token: Unlock token\n        updated_at: Updated at\n    models:\n      user:\n        one: User\n        other: Users\n  devise:\n    confirmations:\n      confirmed: Your email address has been successfully confirmed.\n      new:\n        resend_confirmation_instructions: Resend confirmation instructions\n      send_instructions: You will receive an email with instructions for how to confirm your email address in a few minutes.\n      send_paranoid_instructions: If your email address exists in our database, you will receive an email with instructions for how to confirm your email address in a few minutes.\n    failure:\n      already_authenticated: You are already signed in.\n      inactive: Your account is not activated yet.\n      invalid: Invalid %{authentication_keys} or password.\n      last_attempt: You have one more attempt before your account is locked.\n      locked: Your account is locked.\n      not_found_in_database: Invalid %{authentication_keys} or password.\n      timeout: Your session expired. Please sign in again to continue.\n      unauthenticated: You need to sign in or sign up before continuing.\n      unconfirmed: You have to confirm your email address before continuing.\n    mailer:\n      confirmation_instructions:\n        action: Confirm my account\n        greeting: Welcome %{recipient}!\n        instruction: 'You can confirm your account email through the link below:'\n        subject: Confirmation instructions\n      email_changed:\n        greeting: Hello %{recipient}!\n        message: We're contacting you to notify you that your email has been changed to %{email}.\n        subject: Email Changed\n      password_change:\n        greeting: Hello %{recipient}!\n        message: We're contacting you to notify you that your password has been changed.\n        subject: Password Changed\n      reset_password_instructions:\n        action: Change my password\n        greeting: Hello %{recipient}!\n        instruction: Someone has requested a link to change your password. You can do this through the link below.\n        instruction_2: If you didn't request this, please ignore this email.\n        instruction_3: Your password won't change until you access the link above and create a new one.\n        subject: Reset password instructions\n      unlock_instructions:\n        action: Unlock my account\n        greeting: Hello %{recipient}!\n        instruction: 'Click the link below to unlock your account:'\n        message: Your account has been locked due to an excessive number of unsuccessful sign in attempts.\n        subject: Unlock instructions\n    omniauth_callbacks:\n      failure: Could not authenticate you from %{kind} because \"%{reason}\".\n      success: Successfully authenticated from %{kind} account.\n    passwords:\n      edit:\n        change_my_password: Change my password\n        change_your_password: Change your password\n        confirm_new_password: Confirm new password\n        new_password: New password\n      new:\n        forgot_your_password: Forgot your password?\n        send_me_reset_password_instructions: Send me reset password instructions\n      no_token: You can't access this page without coming from a password reset email. If you do come from a password reset email, please make sure you used the full URL provided.\n      send_instructions: You will receive an email with instructions on how to reset your password in a few minutes.\n      send_paranoid_instructions: If your email address exists in our database, you will receive a password recovery link at your email address in a few minutes.\n      updated: Your password has been changed successfully. You are now signed in.\n      updated_not_active: Your password has been changed successfully.\n    registrations:\n      destroyed: Bye! Your account has been successfully cancelled. We hope to see you again soon.\n      edit:\n        are_you_sure: Are you sure?\n        cancel_my_account: Cancel my account\n        currently_waiting_confirmation_for_email: 'Currently waiting confirmation for: %{email}'\n        leave_blank_if_you_don_t_want_to_change_it: leave blank if you don't want to change it\n        title: Edit %{resource}\n        unhappy: Unhappy?\n        update: Update\n        we_need_your_current_password_to_confirm_your_changes: we need your current password to confirm your changes\n      new:\n        sign_up: Sign up\n      signed_up: Welcome! You have signed up successfully.\n      signed_up_but_inactive: You have signed up successfully. However, we could not sign you in because your account is not yet activated.\n      signed_up_but_locked: You have signed up successfully. However, we could not sign you in because your account is locked.\n      signed_up_but_unconfirmed: A message with a confirmation link has been sent to your email address. Please follow the link to activate your account.\n      update_needs_confirmation: You updated your account successfully, but we need to verify your new email address. Please check your email and follow the confirm link to confirm your new email address.\n      updated: Your account has been updated successfully.\n    sessions:\n      already_signed_out: Signed out successfully.\n      new:\n        sign_in: Log in\n      signed_in: Signed in successfully.\n      signed_out: Signed out successfully.\n    shared:\n      links:\n        back: Back\n        didn_t_receive_confirmation_instructions: Didn't receive confirmation instructions?\n        didn_t_receive_unlock_instructions: Didn't receive unlock instructions?\n        forgot_your_password: Forgot your password?\n        sign_in: Log in\n        sign_in_with_provider: Sign in with %{provider}\n        sign_up: Sign up\n      minimum_password_length:\n        one: \"(%{count} character minimum)\"\n        other: \"(%{count} characters minimum)\"\n    unlocks:\n      new:\n        resend_unlock_instructions: Resend unlock instructions\n      send_instructions: You will receive an email with instructions for how to unlock your account in a few minutes.\n      send_paranoid_instructions: If your account exists, you will receive an email with instructions for how to unlock it in a few minutes.\n      unlocked: Your account has been unlocked successfully. Please sign in to continue.\n  errors:\n    messages:\n      already_confirmed: was already confirmed, please try signing in\n      confirmation_period_expired: needs to be confirmed within %{period}, please request a new one\n      expired: has expired, please request a new one\n      not_found: not found\n      not_locked: was not locked\n      not_saved:\n        one: '1 error prohibited this %{resource} from being saved:'\n        other: \"%{count} errors prohibited this %{resource} from being saved:\"\n"
  },
  {
    "path": "config/locales/devise.ru.yml",
    "content": "---\nru:\n  activerecord:\n    attributes:\n      user:\n        confirmation_sent_at: Дата отправки подтверждения\n        confirmation_token: Токен подтверждения\n        confirmed_at: Дата подтверждения\n        created_at: Дата создания\n        current_password: Текущий пароль\n        current_sign_in_at: Дата текущего входа\n        current_sign_in_ip: IP текущего входа\n        email: Email\n        encrypted_password: Зашифрованный пароль\n        failed_attempts: Неудачные попытки\n        last_sign_in_at: Дата последнего входа\n        last_sign_in_ip: IP последнего входа\n        locked_at: Дата блокировки\n        password: Пароль\n        password_confirmation: Подтверждение пароля\n        remember_created_at: Дата создания запоминания\n        remember_me: Запомнить меня\n        reset_password_sent_at: Дата отправки сброса пароля\n        reset_password_token: Токен сброса пароля\n        sign_in_count: Количество входов\n        unconfirmed_email: Неподтвержденный email\n        unlock_token: Токен разблокировки\n        updated_at: Дата обновления\n    models:\n      user:\n        few: Пользователя\n        many: Пользователей\n        one: Пользователь\n        other: Пользователи\n  devise:\n    confirmations:\n      confirmed: Ваш адрес эл. почты успешно подтвержден.\n      new:\n        resend_confirmation_instructions: Выслать повторно письмо с активацией\n      send_instructions: В течение нескольких минут вы получите письмо с инструкциями по подтверждению адреса эл. почты.\n      send_paranoid_instructions: Если ваш адрес эл. почты есть в системе, то в течение нескольких минут вы получите письмо с инструкциями по его подтверждению.\n    failure:\n      already_authenticated: Вы уже вошли в систему.\n      inactive: Ваша учетная запись еще не активирована.\n      invalid: Неправильный %{authentication_keys} или пароль.\n      last_attempt: У вас осталась последняя попытка ввода пароля до блокировки учетной записи.\n      locked: Ваша учетная запись заблокирована.\n      not_found_in_database: Неправильный %{authentication_keys} или пароль.\n      timeout: Ваш сеанс закончился. Пожалуйста, войдите в систему снова.\n      unauthenticated: Вам необходимо войти в систему или зарегистрироваться.\n      unconfirmed: Вы должны подтвердить вашу учетную запись.\n    mailer:\n      confirmation_instructions:\n        action: Активировать\n        greeting: Здравствуйте, %{recipient} !\n        instruction: 'Вы можете активировать свою учетную запись, нажав ссылку снизу:'\n        subject: Инструкции по подтверждению учетной записи\n      email_changed:\n        greeting: Здравствуйте, %{recipient}!\n        message: Мы пытаемся связаться с вами, что бы сообщить, что ваш email был изменен на %{email}.\n        subject: Email изменен\n      password_change:\n        greeting: Приветствуем, %{recipient}!\n        message: Мы пытаемся связаться с вами, что бы сообщить, что ваш пароль был изменен.\n        subject: Пароль изменен\n      reset_password_instructions:\n        action: Изменить пароль\n        greeting: Здравствуйте, %{recipient}!\n        instruction: 'Вы (или кто-то еще) запросили изменение пароля. Для изменения пароля нажмите ссылку ниже:'\n        instruction_2: Если вы не запрашивали изменение пароля - проигнорируйте это сообщение\n        instruction_3: Ваш пароль не изменится пока вы не нажмете на ссылку и не введете новый.\n        subject: Инструкции по восстановлению пароля\n      unlock_instructions:\n        action: Разблокировать учетную запись\n        greeting: Здравствуйте, %{recipient}!\n        instruction: 'Нажмите ссылку для активации учетной записи:'\n        message: Ваша учетная запись была заблокирована в связи с превышением лимита неудачных попыток входа.\n        subject: Инструкции по разблокировке учетной записи\n    omniauth_callbacks:\n      failure: Вы не можете войти в систему с учетной записью из %{kind}, т.к. \"%{reason}\".\n      success: Вход в систему выполнен с учетной записью из %{kind}.\n    passwords:\n      edit:\n        change_my_password: Изменить мой пароль\n        change_your_password: Изменить пароль\n        confirm_new_password: Повторите новый пароль\n        new_password: Новый пароль\n      new:\n        forgot_your_password: Забыли пароль?\n        send_me_reset_password_instructions: Выслать новый пароль\n      no_token: Доступ к этой странице возможен только по ссылке из письма о восстановлении пароля. Если вы пришли по такой ссылке, пожалуйста, убедитесь, что Вы скопировали всю ссылку целиком.\n      send_instructions: В течение нескольких минут вы получите письмо с инструкциями по восстановлению пароля.\n      send_paranoid_instructions: Если ваш адрес эл. почты есть в системе, то в течение нескольких минут вы получите письмо с инструкциями по восстановлению пароля.\n      updated: Ваш пароль изменен. Теперь вы вошли в систему.\n      updated_not_active: Ваш пароль изменен.\n    registrations:\n      destroyed: До свидания! Ваша учетная запись удалена. Надеемся снова увидеть вас.\n      edit:\n        are_you_sure: Вы уверены?\n        cancel_my_account: Удалить учетную запись\n        currently_waiting_confirmation_for_email: 'Ожидается подтверждение адреса E-mail: %{email}'\n        leave_blank_if_you_don_t_want_to_change_it: оставьте поле пустым, если не хотите его менять\n        title: Редактировать %{resource}\n        unhappy: Разочарованы\n        update: Обновить\n        we_need_your_current_password_to_confirm_your_changes: введите текущий пароль для подтверждения изменений\n      new:\n        sign_up: Регистрация\n      signed_up: Добро пожаловать! Вы успешно зарегистрировались.\n      signed_up_but_inactive: Вы успешно зарегистрированы. Однако, вы не можете войти в систему, потому что ваша учетная запись не активирована.\n      signed_up_but_locked: Вы успешно зарегистрированы. Однако, вы не можете войти в систему, потому что ваша учетная запись заблокирована.\n      signed_up_but_unconfirmed: Письмо со ссылкой для подтверждения было отправлено на ваш адрес эл. почты. Пожалуйста, перейдите по ссылке, чтобы подтвердить учетную запись.\n      update_needs_confirmation: Вы успешно обновили данные учетной записи, но необходимо подтвердить новый адрес эл. почты. Пожалуйста, проверьте почтовый ящик и перейдите по ссылке, чтобы закончить процедуру проверки нового адреса эл. почты.\n      updated: Ваша учетная запись изменена.\n    sessions:\n      already_signed_out: Выход из системы уже выполнен.\n      new:\n        sign_in: Войти\n      signed_in: Вход в систему выполнен.\n      signed_out: Выход из системы выполнен.\n    shared:\n      links:\n        back: Назад\n        didn_t_receive_confirmation_instructions: Не получили подтверждение?\n        didn_t_receive_unlock_instructions: Не получили код разблокировки?\n        forgot_your_password: Забыли пароль?\n        sign_in: Войти\n        sign_in_with_provider: 'Войти с помощью: %{provider}'\n        sign_up: Регистрация\n      minimum_password_length:\n        few: \"(минимум %{count} знака)\"\n        many: \"(минимум %{count} знаков)\"\n        one: \"(минимум %{count} знак)\"\n        other: \"(минимум %{count} знаков)\"\n    unlocks:\n      new:\n        resend_unlock_instructions: Выслать подтверждение заново\n      send_instructions: В течение нескольких минут вы получите письмо с инструкциями по разблокировке учетной записи.\n      send_paranoid_instructions: Если ваша учетная запись существует, то в течение нескольких минут вы получите письмо с инструкциями по ее разблокировке.\n      unlocked: Ваша учетная запись разблокирована. Теперь вы можете войти в систему.\n  errors:\n    messages:\n      already_confirmed: уже подтверждён. Пожалуйста, попробуйте войти в систему\n      confirmation_period_expired: должен быть подтвержден в течение %{period}, пожалуйста, повторите запрос на подтверждение\n      expired: устарела. Пожалуйста, запросите новую\n      not_found: не найден\n      not_locked: не заблокирован\n      not_saved:\n        few: \"%{resource}: сохранение не удалось из-за %{count} ошибок:\"\n        many: \"%{resource}: сохранение не удалось из-за %{count} ошибок:\"\n        one: \"%{resource}: сохранение не удалось из-за %{count} ошибки:\"\n        other: \"%{resource}: сохранение не удалось из-за %{count} ошибки:\"\n"
  },
  {
    "path": "config/locales/en.yml",
    "content": "---\nen:\n  activerecord:\n    attributes:\n      admin:\n        current_password: Current password\n        password: Password\n        password_confirmation: Password confirmation\n      option:\n        code: Code\n        name: Name\n        plans: Plans\n        price: Price\n        state: State\n      pay_system:\n        code: Code\n        currency: Currency\n        description: Description\n        id: ID\n        name: Name\n        state: State\n      payment:\n        amount: Amount\n        comment: Comments\n        created_at: Transaction date\n        description: Description\n        pay_system: Payment system\n        pay_system_id: Payment system\n        submit: Pay\n      plan:\n        code: Code\n        description: Description\n        enabled: Enabled\n        name: Name\n        options: Options\n        price: Price\n        servers: Servers\n        special: Special\n      promo:\n        date_from: Start date\n        date_to: End date\n        name: Name\n        promo_code: Promo code\n        promoter_type: Action\n        state: Status\n        states:\n          active: Active\n          pending: Pending\n        type: Type\n        types:\n          withdrawal: Withdrawal\n      promoter:\n        attributes:\n          discount_percent: Discount %\n        types:\n          discount: Discount\n      promotion:\n        promo_code: By entering promo code you can get a discount or additional services for free\n      server:\n        auth_key: Authorisation key\n        config_file: Configuration file\n        country_code: Country code\n        hostname: Hostname\n        id: ID\n        ip_address: IP address\n        plans: Plans\n        port: Port\n        protocol: Protocol\n        state: State\n      user:\n        accept_agreement: Agreement acceptance\n        balance: Balance\n        current_interval_payment_status: Paid in current interval\n        id: ID\n        last_connect_date: Last connect date\n        last_withdrawal_date: Last withdrawal date\n        next_withdrawal_date: Next withdrawal date\n        options: Options\n        period_length: Trail access period\n        plan: Plan\n        plan_id: Plan\n        promos: Promos\n        referrals: Referrals\n        referrer: Referrer\n        state: State\n      withdrawal_prolongation:\n        days_number: Number of days\n    validations:\n      user:\n        accept_agreement: ''\n        regular_plan: Invalid price plan\n      withdrawal:\n        not_enough_funds: Not enough funds\n  billing:\n    referrals:\n      email: Email\n  mailers:\n    user_connection_config_mailer:\n      subject: An account has been created for you\n    user_mailer:\n      balance_withdrawal:\n        hello: Hello\n        we_have_withdrawed: We have withdrawed\n      could_not_withdraw_funds:\n        could_not_withdraw: Could not withdraw\n        hello: Hello\n      funds_recieved:\n        hello: Hello\n        your_balance_was_fulfilled_on: Your balance was fulfilled on\n      signature:\n        support: Support\n      test_period_enabled:\n        hello: Hello\n        instructions: Instructions\n        test_period_is_activated: Test period is activated\n        test_period_range: Test period range\n      unpaid_user_notification:\n        message: Message\n  users:\n    registrations:\n      edit:\n        cancel_registration: Cancel\n        canceling_attention: Please note, this operation is irreversible! Funds remaining on your account balance will not be returned!\n        confirm:\n          cancel_registration: Are you sure want to delete your profile? It's irreversible and funds remaining on your account balance will be completely lost.\n        edit_profile: Edit profile\n        update: Apply\n  views:\n    pagination:\n      truncate: Truncate\n"
  },
  {
    "path": "config/locales/kaminari.en.yml",
    "content": "---\nen:\n  views:\n    pagination:\n      first: !!str '<<'\n      last: \">>\"\n      next: Следующая\n      previous: Предыдущая\n"
  },
  {
    "path": "config/locales/kaminari.ru.yml",
    "content": "---\nru:\n  views:\n    pagination:\n      first: !!str '<<'\n      last: \">>\"\n      next: Следующая\n      previous: Предыдущая\n"
  },
  {
    "path": "config/locales/ru.yml",
    "content": "---\nru:\n  activerecord:\n    attributes:\n      admin:\n        current_password: Текущий пароль\n        password: Пароль\n        password_confirmation: Подтверждение пароля\n      option:\n        code: Код\n        name: Имя\n        plans: Тарифы\n        price: Цена\n        state: Состояние\n      pay_system:\n        code: Код\n        currency: Валюта\n        description: Описание\n        id: ID\n        name: Название\n        state: Состояние\n      payment:\n        amount: Сумма\n        comment: Комментарий оператора\n        created_at: Дата операции\n        description: Описание\n        pay_system: Платежная система\n        pay_system_id: Платежная система\n        submit: Пополнить\n      plan:\n        code: Код\n        description: Описание\n        enabled: Включен\n        name: Имя\n        options: Опции\n        price: Цена\n        servers: Сервера\n        special: Специальный\n      promo:\n        date_from: Дата начала\n        date_to: Дата конца\n        name: Название\n        promo_code: Промо-код\n        promoter_type: Действие\n        state: Статус\n        states:\n          active: Активна\n          pending: Неактивна\n        type: Тип\n        types:\n          withdrawal: Списание\n      promoter:\n        attributes:\n          discount_percent: Скидка в процентах\n        types:\n          discount: Скидка\n      promotion:\n        promo_code: Введя промо код вы можете получить скидку или дополнительные опции бесплатно\n      server:\n        auth_key: Ключ авторизации\n        config_file: Файл конфигурации\n        country_code: Код страны\n        hostname: Имя хоста\n        id: ID\n        ip_address: IP адрес\n        plans: Тарифы\n        port: Порт\n        protocol: Протокол\n        state: Состояние\n      user:\n        accept_agreement: Принятие соглашения\n        balance: Баланс\n        current_interval_payment_status: Оплачен в текущем интервале\n        id: ID\n        last_connect_date: Дата последнего подключения\n        last_withdrawal_date: Дата последнего списания\n        next_withdrawal_date: Дата следующего списания\n        options: Опции\n        period_length: Длительность тестового периода\n        plan: Тариф\n        plan_id: Тариф\n        promos: Акции\n        referrals: Рефералы\n        referrer: Реферер\n        state: Состояние\n      withdrawal_prolongation:\n        days_number: Количество дней\n    validations:\n      user:\n        accept_agreement: ''\n        regular_plan: Вы выбрали некорретный тарифный план\n      withdrawal:\n        not_enough_funds: Недостаточно средств для списания\n  billing:\n    referrals:\n      email: Email\n  mailers:\n    user_connection_config_mailer:\n      subject: Вам был создан аккаунт\n    user_mailer:\n      balance_withdrawal:\n        hello: Hello\n        we_have_withdrawed: We have withdrawed\n      could_not_withdraw_funds:\n        could_not_withdraw: Could not withdraw\n        hello: Hello\n      funds_recieved:\n        hello: Hello\n        your_balance_was_fulfilled_on: Your balance was fulfilled on\n      signature:\n        support: Support\n      test_period_enabled:\n        hello: Hello\n        instructions: Instructions\n        test_period_is_activated: Test period is activated\n        test_period_range: Test period range\n      unpaid_user_notification:\n        message: Message\n  users:\n    registrations:\n      edit:\n        cancel_registration: Отменить регистрацию\n        canceling_attention: Внимание, данная операция необратима! Средства оставшиеся на счету не возращаются!\n        confirm:\n          cancel_registration: Вы точно хотите удалить свой профиль? Это действие необратимо, все средства оставшиеся на счету будут безвозвратно потеряны.\n        edit_profile: Редактировать профиль\n        update: Применить\n  views:\n    pagination:\n      truncate: Truncate\n"
  },
  {
    "path": "config/locales/show_for.en.yml",
    "content": "---\nen:\n  show_for:\n    blank: Not specified\n    'no': 'No'\n    'yes': 'Yes'\n"
  },
  {
    "path": "config/locales/show_for.ru.yml",
    "content": "---\nru:\n  show_for:\n    blank: Not specified\n    'no': 'No'\n    'yes': 'Yes'\n"
  },
  {
    "path": "config/locales/simple_form.en.yml",
    "content": "---\nen:\n  simple_form:\n    error_notification:\n      default_message: 'Please review the problems below:'\n    'no': 'No'\n    required:\n      mark: \"*\"\n      text: required\n    'yes': 'Yes'\n"
  },
  {
    "path": "config/locales/simple_form.ru.yml",
    "content": "---\nru:\n  simple_form:\n    error_notification:\n      default_message: 'Please review the problems below:'\n    'no': 'No'\n    required:\n      mark: \"*\"\n      text: required\n    'yes': 'Yes'\n"
  },
  {
    "path": "config/locales/site/en.yml",
    "content": "---\nen:\n  main:\n    auth:\n      sign_in: Sign in\n      sign_out: Sign out\n      sign_up: Sign up\n    billing: Profile\n  users:\n    passwords:\n      edit:\n        enter_new_password: Enter new password\n        new_password: New password\n        password_confirmation: Confirm password\n        save: Save\n      new:\n        email: Your email\n        reset_password: Password restore\n        send: Restore\n        sign_in_here: Sign in\n    registrations:\n      new:\n        accept: I accept\n        account_information: Account info\n        agreement: end-user agreement\n        already_signed_up: Already registered?\n        email: Email\n        password: Password\n        password_confirmation: Password confirmation\n        price_plan: Price plan\n        registration: Sign up\n        sign_in_here: Sign in here\n        sign_up: Create account\n    sessions:\n      new:\n        client_entrance: Registered users\n        email: Email\n        forgotten_password: Forgot password?\n        not_signed_up: New user?\n        password: Password\n        remember_me: Remember me\n        sign_in: Sign in\n        sign_up_here: \" Sign up here\"\n"
  },
  {
    "path": "config/locales/site/ru.yml",
    "content": "---\nru:\n  main:\n    auth:\n      sign_in: Вход\n      sign_out: Выход\n      sign_up: Регистрация\n    billing: Личный кабинет\n  users:\n    passwords:\n      edit:\n        enter_new_password: Введите новый пароль\n        new_password: Новый пароль\n        password_confirmation: Подтвердите пароль\n        save: Сохранить\n      new:\n        email: Ваш email\n        reset_password: Восстановление пароля\n        send: Отправить\n        sign_in_here: Войти\n    registrations:\n      new:\n        accept: Я принимаю\n        account_information: Информация\n        agreement: пользовательское соглашение\n        already_signed_up: Уже зарегистрированы?\n        email: Email\n        password: Пароль\n        password_confirmation: Подтверждение пароля\n        price_plan: Тарифный план\n        registration: Регистрация\n        sign_in_here: Войдите\n        sign_up: Создать аккаунт\n    sessions:\n      new:\n        client_entrance: Вход для клиентов\n        email: Email\n        forgotten_password: Забыли пароль?\n        not_signed_up: Нет аккаунта?\n        password: Пароль\n        remember_me: Запомнить меня\n        sign_in: Вход\n        sign_up_here: \" Регистрация\"\n"
  },
  {
    "path": "config/newrelic.yml",
    "content": "#\n# This file configures the New Relic Agent.  New Relic monitors\n# Ruby, Java, .NET, PHP, and Python applications with deep visibility and low overhead.\n# For more information, visit www.newrelic.com.\n#\n# Generated January 18, 2014\n#\n# This configuration file is custom generated for SmatrVPN\n\n\n# Here are the settings that are common to all environments\ncommon: &default_settings\n  # ============================== LICENSE KEY ===============================\n\n  # You must specify the license key associated with your New Relic\n  # account.  This key binds your Agent's data to your account in the\n  # New Relic service.\n  license_key: <%= ENV['NEWRELIC_LICENSE_KEY'] %>\n\n  # Agent Enabled (Ruby/Rails Only)\n  # Use this setting to force the agent to run or not run.\n  # Default is 'auto' which means the agent will install and run only\n  # if a valid dispatcher such as Mongrel is running.  This prevents\n  # it from running with Rake or the console.  Set to false to\n  # completely turn the agent off regardless of the other settings.\n  # Valid values are true, false and auto.\n  #\n  # agent_enabled: auto\n\n  # Application Name Set this to be the name of your application as\n  # you'd like it show up in New Relic. The service will then auto-map\n  # instances of your application into an \"application\" on your\n  # dashboard page. If you want to map this instance into multiple\n  # apps, like \"AJAX Requests\" and \"All UI\" then specify a semicolon\n  # separated list of up to three distinct names, or a yaml list.\n  # Defaults to the capitalized RAILS_ENV or RACK_ENV (i.e.,\n  # Production, Staging, etc)\n  #\n  # Example:\n  #\n  #   app_name:\n  #       - Ajax Service\n  #       - All Services\n  #\n  app_name: My Application\n\n  # When \"true\", the agent collects performance data about your\n  # application and reports this data to the New Relic service at\n  # newrelic.com. This global switch is normally overridden for each\n  # environment below. (formerly called 'enabled')\n  monitor_mode: true\n\n  # Developer mode should be off in every environment but\n  # development as it has very high overhead in memory.\n  developer_mode: false\n\n  # The newrelic agent generates its own log file to keep its logging\n  # information separate from that of your application. Specify its\n  # log level here.\n  log_level: info\n\n  # Optionally set the path to the log file This is expanded from the\n  # root directory (may be relative or absolute, e.g. 'log/' or\n  # '/var/log/') The agent will attempt to create this directory if it\n  # does not exist.\n  # log_file_path: 'log'\n\n  # Optionally set the name of the log file, defaults to 'newrelic_agent.log'\n  # log_file_name: 'newrelic_agent.log'\n\n  # The newrelic agent communicates with the service via https by default.  This\n  # prevents eavesdropping on the performance metrics transmitted by the agent.\n  # The encryption required by SSL introduces a nominal amount of CPU overhead,\n  # which is performed asynchronously in a background thread.  If you'd prefer\n  # to send your metrics over http uncomment the following line.\n  # ssl: false\n\n  #============================== Browser Monitoring ===============================\n  # New Relic Real User Monitoring gives you insight into the performance real users are\n  # experiencing with your website. This is accomplished by measuring the time it takes for\n  # your users' browsers to download and render your web pages by injecting a small amount\n  # of JavaScript code into the header and footer of each page.\n  browser_monitoring:\n      # By default the agent automatically injects the monitoring JavaScript\n      # into web pages. Set this attribute to false to turn off this behavior.\n      auto_instrument: true\n\n  # Proxy settings for connecting to the New Relic server.\n  #\n  # If a proxy is used, the host setting is required.  Other settings\n  # are optional. Default port is 8080.\n  #\n  # proxy_host: hostname\n  # proxy_port: 8080\n  # proxy_user:\n  # proxy_pass:\n\n  # The agent can optionally log all data it sends to New Relic servers to a\n  # separate log file for human inspection and auditing purposes. To enable this\n  # feature, change 'enabled' below to true.\n  # See: https://newrelic.com/docs/ruby/audit-log\n  audit_log:\n    enabled: false\n\n  # Tells transaction tracer and error collector (when enabled)\n  # whether or not to capture HTTP params.  When true, frameworks can\n  # exclude HTTP parameters from being captured.\n  # Rails: the RoR filter_parameter_logging excludes parameters\n  # Java: create a config setting called \"ignored_params\" and set it to\n  #     a comma separated list of HTTP parameter names.\n  #     ex: ignored_params: credit_card, ssn, password\n  capture_params: false\n\n  # Transaction tracer captures deep information about slow\n  # transactions and sends this to the New Relic service once a\n  # minute. Included in the transaction is the exact call sequence of\n  # the transactions including any SQL statements issued.\n  transaction_tracer:\n\n    # Transaction tracer is enabled by default. Set this to false to\n    # turn it off. This feature is only available at the Professional\n    # and above product levels.\n    enabled: true\n\n    # Threshold in seconds for when to collect a transaction\n    # trace. When the response time of a controller action exceeds\n    # this threshold, a transaction trace will be recorded and sent to\n    # New Relic. Valid values are any float value, or (default) \"apdex_f\",\n    # which will use the threshold for an dissatisfying Apdex\n    # controller action - four times the Apdex T value.\n    transaction_threshold: apdex_f\n\n    # When transaction tracer is on, SQL statements can optionally be\n    # recorded. The recorder has three modes, \"off\" which sends no\n    # SQL, \"raw\" which sends the SQL statement in its original form,\n    # and \"obfuscated\", which strips out numeric and string literals.\n    record_sql: obfuscated\n\n    # Threshold in seconds for when to collect stack trace for a SQL\n    # call. In other words, when SQL statements exceed this threshold,\n    # then capture and send to New Relic the current stack trace. This is\n    # helpful for pinpointing where long SQL calls originate from.\n    stack_trace_threshold: 0.500\n\n    # Determines whether the agent will capture query plans for slow\n    # SQL queries.  Only supported in mysql and postgres.  Should be\n    # set to false when using other adapters.\n    # explain_enabled: true\n\n    # Threshold for query execution time below which query plans will\n    # not be captured.  Relevant only when `explain_enabled` is true.\n    # explain_threshold: 0.5\n\n  # Error collector captures information about uncaught exceptions and\n  # sends them to New Relic for viewing\n  error_collector:\n\n    # Error collector is enabled by default. Set this to false to turn\n    # it off. This feature is only available at the Professional and above\n    # product levels.\n    enabled: true\n\n    # Rails Only - tells error collector whether or not to capture a\n    # source snippet around the place of the error when errors are View\n    # related.\n    capture_source: true\n\n    # To stop specific errors from reporting to New Relic, set this property\n    # to comma-separated values.  Default is to ignore routing errors,\n    # which are how 404's get triggered.\n    ignore_errors: \"ActionController::RoutingError,Sinatra::NotFound\"\n\n  # If you're interested in capturing memcache keys as though they\n  # were SQL uncomment this flag. Note that this does increase\n  # overhead slightly on every memcached call, and can have security\n  # implications if your memcached keys are sensitive\n  # capture_memcache_keys: true\n\n# Application Environments\n# ------------------------------------------\n# Environment-specific settings are in this section.\n# For Rails applications, RAILS_ENV is used to determine the environment.\n# For Java applications, pass -Dnewrelic.environment <environment> to set\n# the environment.\n\n# NOTE if your application has other named environments, you should\n# provide newrelic configuration settings for these environments here.\n\ndevelopment:\n  <<: *default_settings\n  # Turn off communication to New Relic service in development mode (also\n  # 'enabled').\n  # NOTE: for initial evaluation purposes, you may want to temporarily\n  # turn the agent on in development mode.\n  monitor_mode: false\n\n  # Rails Only - when running in Developer Mode, the New Relic Agent will\n  # present performance information on the last 100 transactions you have\n  # executed since starting the mongrel.\n  # NOTE: There is substantial overhead when running in developer mode.\n  # Do not use for production or load testing.\n  developer_mode: true\n\n  # Enable textmate links\n  # textmate: true\n\ntest:\n  <<: *default_settings\n  # It almost never makes sense to turn on the agent when running\n  # unit, functional or integration tests or the like.\n  monitor_mode: false\n\n# Turn on the agent in production for 24x7 monitoring. NewRelic\n# testing shows an average performance impact of < 5 ms per\n# transaction, you can leave this on all the time without\n# incurring any user-visible performance degradation.\nproduction:\n  <<: *default_settings\n  monitor_mode: true\n\n# Many applications have a staging environment which behaves\n# identically to production. Support for that environment is provided\n# here.  By default, the staging environment has the agent turned on.\nstaging:\n  <<: *default_settings\n  monitor_mode: true\n  # app_name: My Application (Staging)\n"
  },
  {
    "path": "config/routes.rb",
    "content": "# frozen_string_literal: true\n\nSmartvpn::Application.routes.draw do\n  require 'sidekiq/web'\n\n  devise_for :users, controllers: {\n    registrations: 'users/registrations',\n    sessions: 'users/sessions',\n    passwords: 'users/passwords'\n  }\n  devise_for :admins, controllers: {\n    sessions: 'admins/sessions'\n  }\n\n  namespace :billing do\n    root to: 'home#index'\n\n    resources :payments, only: %i[index new create] do\n      member do\n        get :merchant\n      end\n    end\n    resources :promotions, only: [:create]\n    resources :options, only: %i[index create update destroy] do\n      put :toggle, on: :member\n    end\n    resources :referrers, only: [:index]\n    resources :servers, only: [:index] do\n      get :download_config, on: :member\n    end\n\n    scope '/webmoney' do\n      get 'fail', to: 'webmoney#fail', as: :webmoney_fail\n      get 'success', to: 'webmoney#success', as: :webmoney_success\n      match 'result', to: 'webmoney#result', as: :webmoney_result, via: %i[get post]\n    end\n\n    scope '/robokassa' do\n      get 'fail', to: 'robokassa#fail', as: :robokassa_fail\n      get 'success', to: 'robokassa#success', as: :robokassa_success\n      post 'result', to: 'robokassa#result', as: :robokassa_result\n    end\n\n    scope '/paypal' do\n      get 'fail', to: 'paypal#fail', as: :paypal_fail\n      get 'success', to: 'paypal#success', as: :paypal_success\n      match 'result', to: 'paypal#result', as: :paypal_result, via: %i[get post]\n    end\n  end\n\n  namespace :admin do\n    root to: 'home#index'\n    resources :servers do\n      get :generate_config, on: :member\n    end\n    resources :plans\n    resource :profile, only: %i[edit update]\n    resources :pay_systems, except: :destroy\n    resources :users, except: :destroy do\n      collection do\n        get :payers\n        get :this_month_payers\n        get :emails_export\n      end\n      member do\n        put :withdraw\n        put :prolongate\n        put :payment\n        put :enable_test_period\n        put :disable_test_period\n        put :force_disconnect\n      end\n    end\n    resources :connections, only: %i[index show] do\n      get :active, on: :collection\n    end\n    resources :traffic_reports, only: [:index] do\n      collection do\n        get :users\n        get :date\n        get :servers\n      end\n    end\n    resources :transactions, only: [:index] do\n      collection do\n        get :payments\n        get :withdrawals\n      end\n    end\n    resources :promos, only: %i[index new create edit update]\n    resources :options, only: %i[index new create edit update]\n    resources :referrers, only: [:index]\n    resource :change_languages, only: :update\n  end\n\n  namespace :api do\n    match '/activate', to: 'servers#activate', via: [:post]\n    match '/auth', to: 'authentication#auth', via: [:post]\n    match '/disconnect', to: 'connection#disconnect', via: [:post]\n    match '/connect', to: 'connection#connect', via: [:post]\n  end\n\n  match '/referrer', to: 'referrers#set_referrer', via: [:get]\n  root to: 'main#index'\n\n  authenticate :admin do\n    mount Sidekiq::Web, at: '/sidekiq'\n    mount PgHero::Engine, at: 'pghero'\n  end\nend\n"
  },
  {
    "path": "config/sample.server.ovpn.erb",
    "content": "client\n\ndev tun\n\nproto <%= server.protocol %>\n\nremote <%= server.hostname %> <%= server.port %>\n\nresolv-retry infinite\nnobind\npersist-key\npersist-tun\nreneg-sec 0\n\nauth-user-pass\ncomp-lzo\n\n<ca>\n<%= server_crt %>\n</ca>\n\n<cert>\n<%= client_crt %>\n</cert>\n\n<key>\n<%= client_key %>\n</key>\n"
  },
  {
    "path": "config/settings/development.yml",
    "content": ""
  },
  {
    "path": "config/settings/production.yml",
    "content": ""
  },
  {
    "path": "config/settings/test.yml",
    "content": ""
  },
  {
    "path": "config/settings.yml",
    "content": "secret_token: <%= ENV['SECRET_TOKEN'] %>\n\npartners:\n  referrer_percent: 20\n\nservers:\n  sample_config_path: 'config/sample.server.ovpn.erb'\n\nmailchimp:\n  api_key: <%= ENV['MAILCHIMP_API_KEY'] %>\n  all_clients_list_id: <%= ENV['MAILCHIMP_ALL_CLIENTS_LIST_ID'] %>\n\nrobokassa:\n  login: <%= ENV['ROBOKASSA_LOGIN'] %>\n  secret1: <%= ENV['ROBOKASSA_SECRET1'] %>\n  secret2: <%= ENV['ROBOKASSA_SECRET2'] %>\nwebmoney:\n  secret: <%= ENV['WEBMONEY_SECRET'] %>\n  wallet:\n    wmz: <%= ENV['WEBMONEY_WALLET_WMZ'] %>\n    wmr: <%= ENV['WEBMONEY_WALLET_WMR'] %>\n"
  },
  {
    "path": "config.ru",
    "content": "# frozen_string_literal: true\n\n# This file is used by Rack-based servers to start the application.\n\nrequire ::File.expand_path('../config/environment', __FILE__)\nrun Smartvpn::Application\n"
  },
  {
    "path": "db/migrate/20130409190444_create_posts.rb",
    "content": "class CreatePosts < ActiveRecord::Migration\n  def change\n    create_table :posts do |t|\n      t.string :title\n      t.text :body\n      t.string :tags\n      t.timestamps\n    end\n  end\nend\n"
  },
  {
    "path": "db/migrate/20130421110154_devise_create_users.rb",
    "content": "class DeviseCreateUsers < ActiveRecord::Migration\n  def self.up\n    create_table(:users) do |t|\n      ## Database authenticatable\n      t.string :email,              null: false, default: ''\n      t.string :encrypted_password, null: false, default: ''\n\n      ## Recoverable\n      t.string   :reset_password_token\n      t.datetime :reset_password_sent_at\n\n      ## Rememberable\n      t.datetime :remember_created_at\n\n      ## Trackable\n      t.integer  :sign_in_count, default: 0\n      t.datetime :current_sign_in_at\n      t.datetime :last_sign_in_at\n      t.string   :current_sign_in_ip\n      t.string   :last_sign_in_ip\n\n      ## Confirmable\n      t.string   :confirmation_token\n      t.datetime :confirmed_at\n      t.datetime :confirmation_sent_at\n      t.string   :unconfirmed_email # Only if using reconfirmable\n\n      ## Lockable\n      t.integer  :failed_attempts, default: 0 # Only if lock strategy is :failed_attempts\n      t.string   :unlock_token # Only if unlock strategy is :email or :both\n      t.datetime :locked_at\n\n      t.timestamps\n    end\n\n    add_index :users, :email,                unique: true\n    add_index :users, :reset_password_token, unique: true\n    add_index :users, :confirmation_token,   unique: true\n    add_index :users, :unlock_token,         unique: true\n  end\n\n  def self.down\n    drop_table :users\n  end\nend\n"
  },
  {
    "path": "db/migrate/20130421110911_create_admins.rb",
    "content": "class CreateAdmins < ActiveRecord::Migration\n  def change\n    create_table :admins do |t|\n      t.string :email\n      t.string :encrypted_password\n\n      t.timestamps\n    end\n  end\nend\n"
  },
  {
    "path": "db/migrate/20130501081828_add_fields_to_user.rb",
    "content": "class AddFieldsToUser < ActiveRecord::Migration\n  def change\n    add_column :users, :balance, :decimal, default: 0\n    add_column :users, :plan_id, :integer\n  end\nend\n"
  },
  {
    "path": "db/migrate/20130501083417_create_plans.rb",
    "content": "class CreatePlans < ActiveRecord::Migration\n  def change\n    create_table :plans do |t|\n      t.string :name\n      t.decimal :price\n      t.text :description\n      t.string :code\n\n      t.timestamps\n    end\n  end\nend\n"
  },
  {
    "path": "db/migrate/20130504105921_create_payments.rb",
    "content": "class CreatePayments < ActiveRecord::Migration\n  def change\n    create_table :payments do |t|\n      t.integer :user_id\n      t.decimal :amount\n      t.integer :pay_system_id\n      t.string :state\n\n      t.timestamps\n    end\n  end\nend\n"
  },
  {
    "path": "db/migrate/20130504144707_create_pay_systems.rb",
    "content": "class CreatePaySystems < ActiveRecord::Migration\n  def change\n    create_table :pay_systems do |t|\n      t.string :name\n      t.string :code\n\n      t.timestamps\n    end\n  end\nend\n"
  },
  {
    "path": "db/migrate/20130504150703_add_description_to_pay_system.rb",
    "content": "class AddDescriptionToPaySystem < ActiveRecord::Migration\n  def change\n    add_column :pay_systems, :description, :text\n  end\nend\n"
  },
  {
    "path": "db/migrate/20130505183444_create_withdrawals.rb",
    "content": "class CreateWithdrawals < ActiveRecord::Migration\n  def change\n    create_table :withdrawals do |t|\n      t.decimal :amount\n      t.integer :user_id\n      t.integer :plan_id\n\n      t.timestamps\n    end\n  end\nend\n"
  },
  {
    "path": "db/migrate/20130810125453_create_servers.rb",
    "content": "class CreateServers < ActiveRecord::Migration\n  def change\n    create_table :servers do |t|\n      t.string :hostname\n      t.string :ip_address\n      t.string :auth_key\n      t.string :state\n      t.integer :plan_id\n\n      t.timestamps\n    end\n    add_index 'servers', ['hostname'], name: 'index_servers_on_hostname', unique: true\n  end\nend\n"
  },
  {
    "path": "db/migrate/20130925101441_add_vpn_login_and_vpn_password_to_user.rb",
    "content": "class AddVpnLoginAndVpnPasswordToUser < ActiveRecord::Migration\n  def change\n    add_column :users, :vpn_login, :string\n    add_column :users, :vpn_password, :string\n  end\nend\n"
  },
  {
    "path": "db/migrate/20131005133458_create_connections.rb",
    "content": "class CreateConnections < ActiveRecord::Migration\n  def change\n    create_table :connections do |t|\n      t.integer :user_id\n      t.integer :server_id\n      t.float :traffic_in\n      t.float :traffic_out\n      t.string :type\n\n      t.timestamps\n    end\n  end\nend\n"
  },
  {
    "path": "db/migrate/20131013140201_add_state_to_user.rb",
    "content": "class AddStateToUser < ActiveRecord::Migration\n  def change\n    add_column :users, :state, :string\n  end\nend\n"
  },
  {
    "path": "db/migrate/20140105134117_add_special_and_disabled_to_plan.rb",
    "content": "class AddSpecialAndDisabledToPlan < ActiveRecord::Migration\n  def change\n    add_column :plans, :special, :boolean, default: false\n    add_column :plans, :enabled, :boolean, default: false\n  end\nend\n"
  },
  {
    "path": "db/migrate/20140112113325_create_plan_has_servers.rb",
    "content": "class CreatePlanHasServers < ActiveRecord::Migration\n  def change\n    create_table :plan_has_servers do |t|\n      t.integer :server_id\n      t.integer :plan_id\n\n      t.timestamps\n    end\n  end\nend\n"
  },
  {
    "path": "db/migrate/20140112123216_remove_plan_id_from_server.rb",
    "content": "class RemovePlanIdFromServer < ActiveRecord::Migration\n  def change\n    remove_column :servers, :plan_id\n  end\nend\n"
  },
  {
    "path": "db/migrate/20140112180259_add_tunnelblick_bundle_and_ios_bundle_and_linux_bundle_to_server.rb",
    "content": "class AddTunnelblickBundleAndIosBundleAndLinuxBundleToServer < ActiveRecord::Migration\n  def change\n    add_column :servers, :tunnelblick_bundle, :string\n    add_column :servers, :ios_bundle, :string\n    add_column :servers, :linux_bundle, :string\n  end\nend\n"
  },
  {
    "path": "db/migrate/20140116192804_add_cant_withdraw_counter_to_user.rb",
    "content": "class AddCantWithdrawCounterToUser < ActiveRecord::Migration\n  def change\n    add_column :users, :can_not_withdraw_counter, :integer, default: 0\n  end\nend\n"
  },
  {
    "path": "db/migrate/20140125084325_replace_configs_by_one_universal.rb",
    "content": "class ReplaceConfigsByOneUniversal < ActiveRecord::Migration\n  def change\n    remove_column :servers, :tunnelblick_bundle\n    remove_column :servers, :ios_bundle\n    remove_column :servers, :linux_bundle\n    add_column :servers, :config, :string\n  end\nend\n"
  },
  {
    "path": "db/migrate/20140202164317_create_promos.rb",
    "content": "class CreatePromos < ActiveRecord::Migration\n  def change\n    create_table :promos do |t|\n      t.string :name\n      t.string :type\n      t.date :date_from\n      t.date :date_to\n      t.string :promoter_type\n      t.string :promo_code\n\n      t.timestamps\n    end\n  end\nend\n"
  },
  {
    "path": "db/migrate/20140202164614_create_promotions.rb",
    "content": "class CreatePromotions < ActiveRecord::Migration\n  def change\n    create_table :promotions do |t|\n      t.integer :user_id\n      t.integer :promo_id\n\n      t.timestamps\n    end\n  end\nend\n"
  },
  {
    "path": "db/migrate/20140202175203_add_attributes_to_promo.rb",
    "content": "class AddAttributesToPromo < ActiveRecord::Migration\n  def up\n    execute 'CREATE EXTENSION hstore'\n    add_column :promos, :attrs, :hstore\n  end\n\n  def down\n    remove_column :promos, :attrs\n  end\nend\n"
  },
  {
    "path": "db/migrate/20140203184711_add_state_to_promo.rb",
    "content": "class AddStateToPromo < ActiveRecord::Migration\n  def change\n    add_column :promos, :state, :string\n  end\nend\n"
  },
  {
    "path": "db/migrate/20140207114415_add_promo_id_user_id_uniqueness_index_to_promo.rb",
    "content": "class AddPromoIdUserIdUniquenessIndexToPromo < ActiveRecord::Migration\n  def change\n    add_index 'promotions', %w[user_id promo_id], unique: true\n  end\nend\n"
  },
  {
    "path": "db/migrate/20140227113644_add_state_to_pay_system.rb",
    "content": "class AddStateToPaySystem < ActiveRecord::Migration\n  def change\n    add_column :pay_systems, :state, :string\n  end\nend\n"
  },
  {
    "path": "db/migrate/20140301125212_add_currency_to_pay_system.rb",
    "content": "class AddCurrencyToPaySystem < ActiveRecord::Migration\n  def change\n    add_column :pay_systems, :currency, :string, default: 'usd'\n  end\nend\n"
  },
  {
    "path": "db/migrate/20140301130258_add_usd_amount_to_payment.rb",
    "content": "class AddUsdAmountToPayment < ActiveRecord::Migration\n  def change\n    add_column :payments, :usd_amount, :decimal, precision: 12, scale: 2\n  end\nend\n"
  },
  {
    "path": "db/migrate/20140506135933_create_withdrawal_prolongations.rb",
    "content": "class CreateWithdrawalProlongations < ActiveRecord::Migration\n  def change\n    create_table :withdrawal_prolongations do |t|\n      t.integer :withdrawal_id\n      t.integer :days_number\n\n      t.timestamps\n    end\n  end\nend\n"
  },
  {
    "path": "db/migrate/20140507085918_add_manual_payment_to_payment.rb",
    "content": "class AddManualPaymentToPayment < ActiveRecord::Migration\n  def change\n    add_column :payments, :manual_payment, :boolean, default: false\n    add_column :payments, :comment, :text\n  end\nend\n"
  },
  {
    "path": "db/migrate/20140518132954_create_options.rb",
    "content": "class CreateOptions < ActiveRecord::Migration\n  def change\n    create_table :options do |t|\n      t.string :name\n      t.string :code\n\n      t.timestamps\n    end\n  end\nend\n"
  },
  {
    "path": "db/migrate/20140518133314_create_plan_option_table.rb",
    "content": "class CreatePlanOptionTable < ActiveRecord::Migration\n  def change\n    create_table :options_plans, id: false do |t|\n      t.belongs_to :plan\n      t.belongs_to :option\n    end\n  end\nend\n"
  },
  {
    "path": "db/migrate/20140518134712_add_state_to_option.rb",
    "content": "class AddStateToOption < ActiveRecord::Migration\n  def change\n    add_column :options, :state, :string\n  end\nend\n"
  },
  {
    "path": "db/migrate/20140525091015_add_option_prices_to_plan.rb",
    "content": "class AddOptionPricesToPlan < ActiveRecord::Migration\n  def change\n    add_column :plans, :option_prices, :hstore\n  end\nend\n"
  },
  {
    "path": "db/migrate/20140525103921_create_options_users.rb",
    "content": "class CreateOptionsUsers < ActiveRecord::Migration\n  def change\n    create_table :options_users, id: false do |t|\n      t.belongs_to :user\n      t.belongs_to :option\n    end\n  end\nend\n"
  },
  {
    "path": "db/migrate/20140727094748_add_reflink_to_user.rb",
    "content": "class AddReflinkToUser < ActiveRecord::Migration\n  def change\n    add_column :users, :reflink, :string\n  end\nend\n"
  },
  {
    "path": "db/migrate/20140728204118_add_referrer_id_to_user.rb",
    "content": "class AddReferrerIdToUser < ActiveRecord::Migration\n  def change\n    add_column :users, :referrer_id, :integer\n  end\nend\n"
  },
  {
    "path": "db/migrate/20140801123341_create_referrer_rewards.rb",
    "content": "class CreateReferrerRewards < ActiveRecord::Migration\n  def change\n    create_table :referrer_rewards do |t|\n      t.decimal :amount\n      t.integer :operation_id\n      t.integer :referrer_id\n\n      t.timestamps\n    end\n  end\nend\n"
  },
  {
    "path": "db/migrate/20140805112916_generate_reflink_to_old_users.rb",
    "content": "class GenerateReflinkToOldUsers < ActiveRecord::Migration\n  def change\n    User.all.each do |user|\n      if user.reflink.nil?\n        user.send(:generate_reflink)\n        user.save!\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "db/migrate/20140817131003_create_proxy_nodes.rb",
    "content": "class CreateProxyNodes < ActiveRecord::Migration\n  def change\n    create_table :proxy_nodes do |t|\n      t.string :host\n      t.integer :port\n      t.string :country\n      t.string :location\n      t.integer :ping\n      t.integer :bandwidth\n      t.string :protocol\n      t.string :anonymity\n\n      t.timestamps\n    end\n  end\nend\n"
  },
  {
    "path": "db/migrate/20140819160419_remove_options_users_table.rb",
    "content": "class RemoveOptionsUsersTable < ActiveRecord::Migration\n  def change\n    drop_table :options_users\n  end\nend\n"
  },
  {
    "path": "db/migrate/20140819160716_create_user_options.rb",
    "content": "class CreateUserOptions < ActiveRecord::Migration\n  def change\n    create_table :user_options do |t|\n      t.integer :user_id\n      t.integer :option_id\n      t.hstore :attrs\n\n      t.timestamps\n    end\n  end\nend\n"
  },
  {
    "path": "db/migrate/20140823162252_create_proxy_connects.rb",
    "content": "class CreateProxyConnects < ActiveRecord::Migration\n  def change\n    create_table :proxy_connects do |t|\n      t.integer :user_id\n      t.integer :proxy_id\n      t.string :state\n\n      t.timestamps\n    end\n  end\nend\n"
  },
  {
    "path": "db/migrate/20140823164144_add_option_attributes_to_connect.rb",
    "content": "class AddOptionAttributesToConnect < ActiveRecord::Migration\n  def change\n    add_column :connections, :option_attributes, :json\n  end\nend\n"
  },
  {
    "path": "db/migrate/20150104180714_add_state_to_user_option.rb",
    "content": "class AddStateToUserOption < ActiveRecord::Migration\n  def change\n    add_column :user_options, :state, :string, default: 'enabled'\n  end\nend\n"
  },
  {
    "path": "db/migrate/20150109161843_add_protocol_to_server.rb",
    "content": "class AddProtocolToServer < ActiveRecord::Migration\n  def change\n    add_column :servers, :protocol, :string, default: 'udp'\n  end\nend\n"
  },
  {
    "path": "db/migrate/20150109164839_add_port_to_server.rb",
    "content": "class AddPortToServer < ActiveRecord::Migration\n  def change\n    add_column :servers, :port, :integer, default: 443\n  end\nend\n"
  },
  {
    "path": "db/migrate/20150110141211_add_country_code_to_server.rb",
    "content": "class AddCountryCodeToServer < ActiveRecord::Migration\n  def change\n    add_column :servers, :country_code, :string, default: 'de'\n  end\nend\n"
  },
  {
    "path": "db/migrate/20150125133216_add_test_period_enabled_to_user.rb",
    "content": "class AddTestPeriodEnabledToUser < ActiveRecord::Migration\n  def change\n    add_column :users, :period_length, :integer\n  end\nend\n"
  },
  {
    "path": "db/migrate/20150125141501_add_test_period_started_at_to_user.rb",
    "content": "class AddTestPeriodStartedAtToUser < ActiveRecord::Migration\n  def change\n    add_column :users, :test_period_started_at, :datetime\n  end\nend\n"
  },
  {
    "path": "db/migrate/20181014150549_add_default_user.rb",
    "content": "class AddDefaultUser < ActiveRecord::Migration\n  def change\n    admin = Admin.find_by(email: 'admin@smartvpn.biz')\n    return if admin\n\n    Admin.create!(email: 'admin@smartvpn.biz', password: 'password')\n  end\nend\n"
  },
  {
    "path": "db/migrate/20190122184018_add_pki_to_server.rb",
    "content": "class AddPkiToServer < ActiveRecord::Migration\n  def change\n    add_column :servers, :server_crt, :text\n    add_column :servers, :client_crt, :text\n    add_column :servers, :client_key, :text\n  end\nend\n"
  },
  {
    "path": "db/schema.rb",
    "content": "# encoding: UTF-8\n# This file is auto-generated from the current state of the database. Instead\n# of editing this file, please use the migrations feature of Active Record to\n# incrementally modify your database, and then regenerate this schema definition.\n#\n# Note that this schema.rb definition is the authoritative source for your\n# database schema. If you need to create the application database on another\n# system, you should be using db:schema:load, not running all the migrations\n# from scratch. The latter is a flawed and unsustainable approach (the more migrations\n# you'll amass, the slower it'll run and the greater likelihood for issues).\n#\n# It's strongly recommended that you check this file into your version control system.\n\nActiveRecord::Schema.define(version: 20190122184018) do\n\n  # These are extensions that must be enabled in order to support this database\n  enable_extension \"plpgsql\"\n  enable_extension \"hstore\"\n\n  create_table \"admins\", force: :cascade do |t|\n    t.string   \"email\"\n    t.string   \"encrypted_password\"\n    t.datetime \"created_at\"\n    t.datetime \"updated_at\"\n  end\n\n  create_table \"connections\", force: :cascade do |t|\n    t.integer  \"user_id\"\n    t.integer  \"server_id\"\n    t.float    \"traffic_in\"\n    t.float    \"traffic_out\"\n    t.string   \"type\"\n    t.datetime \"created_at\"\n    t.datetime \"updated_at\"\n    t.json     \"option_attributes\"\n  end\n\n  create_table \"options\", force: :cascade do |t|\n    t.string   \"name\"\n    t.string   \"code\"\n    t.datetime \"created_at\"\n    t.datetime \"updated_at\"\n    t.string   \"state\"\n  end\n\n  create_table \"options_plans\", id: false, force: :cascade do |t|\n    t.integer \"plan_id\"\n    t.integer \"option_id\"\n  end\n\n  create_table \"pay_systems\", force: :cascade do |t|\n    t.string   \"name\"\n    t.string   \"code\"\n    t.datetime \"created_at\"\n    t.datetime \"updated_at\"\n    t.text     \"description\"\n    t.string   \"state\"\n    t.string   \"currency\",    default: \"usd\"\n  end\n\n  create_table \"payments\", force: :cascade do |t|\n    t.integer  \"user_id\"\n    t.decimal  \"amount\"\n    t.integer  \"pay_system_id\"\n    t.string   \"state\"\n    t.datetime \"created_at\"\n    t.datetime \"updated_at\"\n    t.decimal  \"usd_amount\",     precision: 12, scale: 2\n    t.boolean  \"manual_payment\",                          default: false\n    t.text     \"comment\"\n  end\n\n  create_table \"plan_has_servers\", force: :cascade do |t|\n    t.integer  \"server_id\"\n    t.integer  \"plan_id\"\n    t.datetime \"created_at\"\n    t.datetime \"updated_at\"\n  end\n\n  create_table \"plans\", force: :cascade do |t|\n    t.string   \"name\"\n    t.decimal  \"price\"\n    t.text     \"description\"\n    t.string   \"code\"\n    t.datetime \"created_at\"\n    t.datetime \"updated_at\"\n    t.boolean  \"special\",       default: false\n    t.boolean  \"enabled\",       default: false\n    t.hstore   \"option_prices\"\n  end\n\n  create_table \"posts\", force: :cascade do |t|\n    t.string   \"title\"\n    t.text     \"body\"\n    t.string   \"tags\"\n    t.datetime \"created_at\"\n    t.datetime \"updated_at\"\n  end\n\n  create_table \"promos\", force: :cascade do |t|\n    t.string   \"name\"\n    t.string   \"type\"\n    t.date     \"date_from\"\n    t.date     \"date_to\"\n    t.string   \"promoter_type\"\n    t.string   \"promo_code\"\n    t.datetime \"created_at\"\n    t.datetime \"updated_at\"\n    t.hstore   \"attrs\"\n    t.string   \"state\"\n  end\n\n  create_table \"promotions\", force: :cascade do |t|\n    t.integer  \"user_id\"\n    t.integer  \"promo_id\"\n    t.datetime \"created_at\"\n    t.datetime \"updated_at\"\n  end\n\n  add_index \"promotions\", [\"user_id\", \"promo_id\"], name: \"index_promotions_on_user_id_and_promo_id\", unique: true, using: :btree\n\n  create_table \"proxy_connects\", force: :cascade do |t|\n    t.integer  \"user_id\"\n    t.integer  \"proxy_id\"\n    t.string   \"state\"\n    t.datetime \"created_at\"\n    t.datetime \"updated_at\"\n  end\n\n  create_table \"proxy_nodes\", force: :cascade do |t|\n    t.string   \"host\"\n    t.integer  \"port\"\n    t.string   \"country\"\n    t.string   \"location\"\n    t.integer  \"ping\"\n    t.integer  \"bandwidth\"\n    t.string   \"protocol\"\n    t.string   \"anonymity\"\n    t.datetime \"created_at\"\n    t.datetime \"updated_at\"\n  end\n\n  create_table \"referrer_rewards\", force: :cascade do |t|\n    t.decimal  \"amount\"\n    t.integer  \"operation_id\"\n    t.integer  \"referrer_id\"\n    t.datetime \"created_at\"\n    t.datetime \"updated_at\"\n  end\n\n  create_table \"servers\", force: :cascade do |t|\n    t.string   \"hostname\"\n    t.string   \"ip_address\"\n    t.string   \"auth_key\"\n    t.string   \"state\"\n    t.datetime \"created_at\"\n    t.datetime \"updated_at\"\n    t.string   \"config\"\n    t.string   \"protocol\",     default: \"udp\"\n    t.integer  \"port\",         default: 443\n    t.string   \"country_code\", default: \"de\"\n    t.text     \"server_crt\"\n    t.text     \"client_crt\"\n    t.text     \"client_key\"\n  end\n\n  add_index \"servers\", [\"hostname\"], name: \"index_servers_on_hostname\", unique: true, using: :btree\n\n  create_table \"user_options\", force: :cascade do |t|\n    t.integer  \"user_id\"\n    t.integer  \"option_id\"\n    t.hstore   \"attrs\"\n    t.datetime \"created_at\"\n    t.datetime \"updated_at\"\n    t.string   \"state\",      default: \"enabled\"\n  end\n\n  create_table \"users\", force: :cascade do |t|\n    t.string   \"email\",                    default: \"\",  null: false\n    t.string   \"encrypted_password\",       default: \"\",  null: false\n    t.string   \"reset_password_token\"\n    t.datetime \"reset_password_sent_at\"\n    t.datetime \"remember_created_at\"\n    t.integer  \"sign_in_count\",            default: 0\n    t.datetime \"current_sign_in_at\"\n    t.datetime \"last_sign_in_at\"\n    t.string   \"current_sign_in_ip\"\n    t.string   \"last_sign_in_ip\"\n    t.string   \"confirmation_token\"\n    t.datetime \"confirmed_at\"\n    t.datetime \"confirmation_sent_at\"\n    t.string   \"unconfirmed_email\"\n    t.integer  \"failed_attempts\",          default: 0\n    t.string   \"unlock_token\"\n    t.datetime \"locked_at\"\n    t.datetime \"created_at\"\n    t.datetime \"updated_at\"\n    t.decimal  \"balance\",                  default: 0.0\n    t.integer  \"plan_id\"\n    t.string   \"vpn_login\"\n    t.string   \"vpn_password\"\n    t.string   \"state\"\n    t.integer  \"can_not_withdraw_counter\", default: 0\n    t.string   \"reflink\"\n    t.integer  \"referrer_id\"\n    t.integer  \"period_length\"\n    t.datetime \"test_period_started_at\"\n  end\n\n  add_index \"users\", [\"confirmation_token\"], name: \"index_users_on_confirmation_token\", unique: true, using: :btree\n  add_index \"users\", [\"email\"], name: \"index_users_on_email\", unique: true, using: :btree\n  add_index \"users\", [\"reset_password_token\"], name: \"index_users_on_reset_password_token\", unique: true, using: :btree\n  add_index \"users\", [\"unlock_token\"], name: \"index_users_on_unlock_token\", unique: true, using: :btree\n\n  create_table \"withdrawal_prolongations\", force: :cascade do |t|\n    t.integer  \"withdrawal_id\"\n    t.integer  \"days_number\"\n    t.datetime \"created_at\"\n    t.datetime \"updated_at\"\n  end\n\n  create_table \"withdrawals\", force: :cascade do |t|\n    t.decimal  \"amount\"\n    t.integer  \"user_id\"\n    t.integer  \"plan_id\"\n    t.datetime \"created_at\"\n    t.datetime \"updated_at\"\n  end\n\nend\n"
  },
  {
    "path": "db/seeds/01_options.rb",
    "content": "puts '##################################'\nputs 'Create options for plans'\nputs '----------------------------------'\n\ndef i2p\n  @i2p ||= Option.where(name: 'I2p').first_or_create!(code: 'i2p', state: 'active')\nend\n\ni2p\n\nputs \"Was find or created option #{i2p.name}\"\nputs '----------------------------------'\n\ndef proxy\n  @proxy ||= Option.where(name: 'Proxy').first_or_create!(code: 'proxy', state: 'active')\nend\n\nproxy\n\nputs \"Was find or created option #{proxy.name}\"\n"
  },
  {
    "path": "db/seeds/02_plans.rb",
    "content": "puts '##################################'\nputs 'Create default plans'\nputs '----------------------------------'\n\ndef plan_params(merge_params)\n  { price: 10, description: 'MyText', special: false, enabled: true }.merge(merge_params)\nend\n\ndef standard_plan\n  @standard_plan ||= Plan.where(name: 'Стандарт').first_or_create!(plan_params(code: 'basic'))\nend\n\nstandard_plan\n\nputs 'Was find or created standard plan'\nputs '----------------------------------'\n\nPlan.where(name: 'Стандарт Акция').first_or_create!(plan_params(code: 'basic_promo'))\n\nputs 'Was find or created standard stock plan'\n\nputs '##################################'\nputs 'Update standard plan options'\nputs '----------------------------------'\n\nstandard_plan.options << i2p unless standard_plan.options.include?(i2p)\n\nputs 'Added i2p option to standard plan if not exists'\nputs '----------------------------------'\n\nstandard_plan.options << proxy unless standard_plan.options.include?(proxy)\n\nputs 'Added proxy option to standard plan if not exists'\nputs '----------------------------------'\n\nstandard_plan.update(option_prices: { 'i2p' => 0, 'proxy' => 0 })\n\nputs 'Updated standard plan options price to 0'\n"
  },
  {
    "path": "db/seeds/03_pay_systems.rb",
    "content": "puts '##################################'\nputs 'Create default pay systems'\nputs '----------------------------------'\n\nDEFAULT_PAY_SYSTEMS = [\n  { name: 'Webmoney WMZ', code: 'wmz', description: '' },\n  { name: 'Webmoney WMR', code: 'wmr', description: '' },\n  { name: 'Яндекс.Деньги', code: 'yandex', description: '' },\n  { name: 'PayPal', code: 'paypal', description: '' },\n  { name: 'Visa/Mastercard', code: 'cc', description: '' }\n].freeze\n\nDEFAULT_PAY_SYSTEMS.each do |pay_system_params|\n  PaySystem.where(name: pay_system_params[:name]).first_or_create!(pay_system_params)\n  puts \"Was find or created pay system #{pay_system_params[:name]}\"\n  puts '----------------------------------' unless pay_system_params[:name] == 'Visa/Mastercard'\nend\n"
  },
  {
    "path": "db/seeds/04_default_user.rb",
    "content": "puts '##################################'\nputs 'Create default user'\nputs '----------------------------------'\n\ndef user\n  @user ||= User\n            .where(email: 'user@smartvpn.biz')\n            .first_or_create!(password: '1234567', plan: standard_plan, balance: 100)\nend\n\nuser.confirm unless user.confirmed?\n\nputs \"Was find or created default user - email: #{user.email}, password: 1234567 and activated\"\n\nif user.payments.count.zero?\n  puts '##################################'\n  puts 'Create default user payments'\n  puts '----------------------------------'\n  last_pay_system = PaySystem.last\n  PaySystem.all.each do |pay_system|\n    FactoryGirl.create(:payment, user: user, pay_system: pay_system).accept!\n    puts \"Was created default user payment for pay system #{pay_system.name}\"\n    puts '----------------------------------' unless pay_system.name == last_pay_system.name\n  end\nend\n\nif user.withdrawals.count.zero?\n  puts '##################################'\n  puts 'Create default user two tests withdrawals'\n  puts '----------------------------------'\n  2.times { FactoryGirl.create(:withdrawal, plan: standard_plan, user: user) }\nend\n"
  },
  {
    "path": "db/seeds/05_default_user_referrals.rb",
    "content": "puts '##################################'\nputs 'Create test default user referrals'\nputs '----------------------------------'\n\n5.times do |i|\n  referral = user.referrals.find_by(email: \"referral-#{i}@smartvpn.biz\")\n  if referral\n    puts \"Was found default user referral #{referral.email}\"\n    puts '----------------------------------' unless i == 4\n    next\n  end\n\n  referral_params = { email: \"referral-#{i}@smartvpn.biz\", password: '1234567', plan: standard_plan, balance: 100 }\n  referral = user.referrals.create!(referral_params)\n  operation = referral.withdrawals.create!(amount: 10, plan_id: standard_plan.id)\n  Referrer::Reward.create!(\n    referrer_id: referral.referrer_id,\n    amount: (10 + i),\n    operation_id: operation.id\n  )\n  puts \"Was created default user referral #{referral.email}\"\n  puts '----------------------------------' unless i == 4\nend\n"
  },
  {
    "path": "db/seeds/06_admin.rb",
    "content": "puts '##################################'\nputs 'Create admin user'\nputs '----------------------------------'\n\nAdmin.where(email: 'admin@smartvpn.biz').first_or_create!(password: '1234567')\n\nputs 'Was find or created admin user - email: useradmin@smartvpn.biz, password: 1234567'\n"
  },
  {
    "path": "db/seeds/07_servers.rb",
    "content": "if Server.count.zero?\n  puts '##################################'\n  puts 'Create tests servers'\n  puts '----------------------------------'\n  5.times do |i|\n    server = FactoryGirl.create(:server)\n    server.plans << standard_plan\n    puts \"Was created test server hostname: #{server.hostname} with standard plan\"\n    puts '----------------------------------' unless i == 4\n  end\nend\n\nputs '##################################'\nputs 'Create main server'\nputs '----------------------------------'\n\ndef main_server\n  @main_server ||= Server\n                   .where(hostname: 'test.smartvpn.biz')\n                   .first_or_create!(ip_address: '192.168.33.10', state: 'active')\nend\n\nputs \"Was found or created main server hostname: #{main_server.hostname}\"\nputs '----------------------------------'\n\nif main_server.plans.count.zero?\n  main_server.plans << standard_plan\n  puts \"Was added standard plan to main server hostname: #{main_server.hostname}\"\n  puts '----------------------------------'\nend\n\nmain_server.update(auth_key: 'VWHMTVRO')\nputs \"Was updated auth key on main server hostname: #{main_server.hostname} to VWHMTVRO\"\n"
  },
  {
    "path": "db/seeds/08_default_user_connects.rb",
    "content": "if user.connects.count.zero?\n  puts '##################################'\n  puts 'Create 20 test connections and disconnects to the main server for the default user'\n  puts '----------------------------------'\n  20.times do\n    FactoryGirl.create(:connect, user: user, server: main_server)\n    FactoryGirl.create(:disconnect, user: user, server: main_server)\n  end\nend\n\nputs '##################################'\n"
  },
  {
    "path": "db/seeds.rb",
    "content": "# To prevent popping up email notifications from seeds we off\nActionMailer::Base.perform_deliveries = false\n\nDir[File.join(Rails.root, 'db', 'seeds', '*.rb')].sort.each do |seed|\n  load seed\nend\n"
  },
  {
    "path": "docker-compose.development.yml",
    "content": "version: '3'\nservices:\n  postgres:\n    environment:\n      - POSTGRES_PASSWORD=root\n    image: postgres\n    volumes:\n      - postgres:/var/lib/postgresql/data\n    ports:\n      - 5432:5432\n\n  redis:\n    image: redis\n    ports:\n      - 6379:6379\n    volumes:\n      - redis:/data\n\n  app:\n    tty: true\n    stdin_open: true\n    build:\n      context: .\n      dockerfile: Dockerfile.dev\n    env_file: .env\n    ports:\n      - \"3000:3000\"\n    environment:\n      - RAILS_LOG_TO_STDOUT=true\n      - RAILS_ENV=development\n      - PGHOST=postgres\n      - REDIS_URL=redis://redis:6379\n    volumes:\n      - bundle_cache:/usr/local/bundle\n      - .:/app\n    depends_on:\n      - postgres\n      - redis\n    command: >\n      /bin/bash -c \"\n        cp config/database.yml.sample config/database.yml;\n        while ! nc -z postgres 5432;\n        do\n          echo Waiting for PG;\n          sleep 1;\n        done;\n        rake db:setup;\n        rm -f /app/tmp/pids/server.pid;\n        foreman start;\"\n\nvolumes:\n  bundle_cache:\n  postgres:\n  redis:\n"
  },
  {
    "path": "lib/assets/.keep",
    "content": ""
  },
  {
    "path": "lib/bytes_converter.rb",
    "content": "# frozen_string_literal: true\n\nclass BytesConverter\n  class << self\n    def bytes_to_kilobytes(bytes)\n      bytes / 1024\n    end\n\n    def kilobytes_to_megabytes(kbytes)\n      kbytes / 1024\n    end\n\n    def megabytes_to_gigabytes(mbytes)\n      mbytes / 1024\n    end\n\n    def bytes_to_gigabytes(bytes)\n      (megabytes_to_gigabytes(kilobytes_to_megabytes(bytes_to_kilobytes(bytes))) / 1.0)\n    end\n\n    def prettify_float(number)\n      left_side = number.to_s.split('.')[0].to_i\n      precision = if left_side == 0\n                    4\n                  elsif left_side.to_s.size == 1\n                    3\n                  elsif left_side.to_s.size == 2\n                    2\n                  else\n                    1\n                  end\n\n      number.round(precision)\n    end\n  end\nend\n"
  },
  {
    "path": "lib/currencies/course.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'net/http'\nrequire 'uri'\n\nmodule Currencies\n  class Course\n    COURSES = [\n      { from: 'eur', to: 'usd' },\n      { from: 'rub', to: 'usd' }\n    ].freeze\n\n    class << self\n      def update_courses\n        COURSES.each do |direction|\n          course = fetch_course_from_web direction[:from], direction[:to]\n          save_course(direction[:from], direction[:to], course)\n        end\n        persist_update_date\n      end\n\n      def fetch_course_from_web(from, to)\n        bank = Money::Bank::RussianCentralBank.new\n        bank.update_rates\n        bank.get_rate from, to\n      end\n\n      def save_course(from, to, course)\n        redis.set(\"smartvpn:#{from}_#{to}\", course)\n      end\n\n      def persist_update_date\n        redis.set('smartvpn:courses:updated_at', Time.current)\n      end\n\n      def updated_at\n        redis.get('smartvpn:courses:updated_at')\n      end\n\n      def redis\n        Redis.new\n      end\n    end\n\n    def initialize(from_currency, to_currency)\n      @from_currency = from_currency\n      @to_currency = to_currency\n    end\n\n    def get\n      if @from_currency == @to_currency\n        1\n      else\n        fetch_from_redis || parse_from_web\n      end\n    end\n\n    private\n\n    def fetch_from_redis\n      redis = Redis.new\n      redis.get(\"smartvpn:#{@from_currency}_#{@to_currency}\")\n    end\n\n    def parse_from_web\n      Course.fetch_course_from_web @from_currency, @to_currency\n    end\n  end\nend\n"
  },
  {
    "path": "lib/currencies/course_converter.rb",
    "content": "# frozen_string_literal: true\n\nmodule Currencies\n  class CourseConverter\n    def initialize(options)\n      @currency_from = options[:currency_from]\n      @currency_to = options[:currency_to]\n      @amount_in = options[:amount]\n    end\n\n    def convert_amount\n      @amount_in * course.to_f\n    end\n\n    def course\n      Course.new(@currency_from, @currency_to).get\n    end\n  end\nend\n"
  },
  {
    "path": "lib/exceptions/admin_access_denied_exception.rb",
    "content": "# frozen_string_literal: true\n\nclass AdminAccessDeniedException < SmartvpnException; end\n"
  },
  {
    "path": "lib/exceptions/api_exception.rb",
    "content": "# frozen_string_literal: true\n\nclass ApiException < SmartvpnException; end\n"
  },
  {
    "path": "lib/exceptions/billing_exception.rb",
    "content": "# frozen_string_literal: true\n\nclass BillingException < SmartvpnException; end\n"
  },
  {
    "path": "lib/exceptions/dto_exception.rb",
    "content": "# frozen_string_literal: true\n\nclass DtoException < SmartvpnException; end\n"
  },
  {
    "path": "lib/exceptions/not_implemented_exception.rb",
    "content": "# frozen_string_literal: true\n\nclass NotImplementedException < SmartvpnException; end\n"
  },
  {
    "path": "lib/exceptions/smartvpn_exception.rb",
    "content": "# frozen_string_literal: true\n\nclass SmartvpnException < StandardError; end\n"
  },
  {
    "path": "lib/exceptions/unauthorized_exception.rb",
    "content": "# frozen_string_literal: true\n\nclass UnauthorizedException < SmartvpnException; end\n"
  },
  {
    "path": "lib/exceptions/withdrawer_exception.rb",
    "content": "# frozen_string_literal: true\n\nclass WithdrawerException < SmartvpnException; end\n"
  },
  {
    "path": "lib/random_string.rb",
    "content": "# frozen_string_literal: true\n\nclass RandomString\n  DEFAULT_LENGTH = 8\n\n  def self.generate(length = DEFAULT_LENGTH)\n    (0...length).map { rand(65..90).chr }.join\n  end\nend\n"
  },
  {
    "path": "lib/signer.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'digest/md5'\n\nclass Signer\n  def self.sign_hash(hash, key)\n    Digest::MD5.hexdigest(\"#{hash.values.sort.join}#{key}\")\n  end\n\n  def self.hashify_string(string)\n    Digest::MD5.hexdigest(string)\n  end\nend\n"
  },
  {
    "path": "lib/tasks/.keep",
    "content": ""
  },
  {
    "path": "lib/tasks/assets.rake",
    "content": "# frozen_string_literal: true\n\nnamespace :assets do\n  desc 'Check that all assets have valid encoding'\n  task check: :environment do\n    paths = ['app/assets', 'lib/assets', 'vendor/assets']\n    extensions = %w[js coffee css scss]\n\n    paths.each do |path|\n      dir_path = Rails.root + path\n\n      next unless File.exist?(dir_path)\n\n      dir_files = File.join(dir_path, '**')\n\n      Dir.glob(dir_files + \"/**.{#{extensions.join(',')}}\").each do |file|\n        # make sure we're not trying to process a directory\n        next if File.directory?(file)\n\n        # read the file and check its encoding\n        data = File.read(file)\n        puts \"Invalid encoding: #{file}\" unless data.valid_encoding?\n      end # end Dir.glob\n\n      # end File.exists\n    end # end paths.each\n  end\nend\n"
  },
  {
    "path": "lib/tasks/seed_initial_data.rake",
    "content": "# frozen_string_literal: true\n\nnamespace :smartvpn do\n  namespace :initial_data do\n    desc 'Seed initial data if needed'\n    task seed: :environment do\n      Admin.create!(email: 'admin@smartvpn.biz', password: '') if Admin.all.empty?\n\n      basic_plan = Plan.where(code: 'basic').last\n      basic_plan ||= Plan.create!(name: 'Basic', price: 1.28, description: 'Basic plan', code: 'basic')\n\n      promo_plan = Plan.where(code: 'basic_promo').last\n      unless promo_plan\n        Plan.create!(name: 'Стандарт Акция', price: 3.84, description: 'Promo basic plan', code: 'basic_promo')\n      end\n\n      friends_plan = Plan.where(code: 'zero').last\n      unless friends_plan\n        Plan.create!(name: 'Zero', price: 0, special: true, description: 'Basic plan with zero price', code: 'zero')\n      end\n\n      basic_plan.update(price: 1.28, name: 'Стандарт')\n      promo_plan.update(price: 3.84)\n\n      Plan.update_all('enabled=true')\n\n      { 'yandex' => 'Яндекс.Деньги', 'wmz' => 'Webmoney WMZ', 'wmr' => 'Webmoney WMR',\n        'paypal' => 'PayPal', 'cc' => 'Visa/MasterCard' }.each do |code, name|\n        PaySystem.find_or_create_by!(code: code) do |ps|\n          ps.name = name\n        end\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "lib/templates/erb/scaffold/_form.html.erb",
    "content": "<%# frozen_string_literal: true %>\n<%%= simple_form_for(@<%= singular_table_name %>) do |f| %>\n  <%%= f.error_notification %>\n  <%%= f.error_notification message: f.object.errors[:base].to_sentence if f.object.errors[:base].present? %>\n\n  <div class=\"form-inputs\">\n  <%- attributes.each do |attribute| -%>\n    <%%= f.<%= attribute.reference? ? :association : :input %> :<%= attribute.name %> %>\n  <%- end -%>\n  </div>\n\n  <div class=\"form-actions\">\n    <%%= f.button :submit %>\n  </div>\n<%% end %>\n"
  },
  {
    "path": "lib/templates/erb/scaffold/show.html.erb",
    "content": "<%%= show_for @<%= singular_name %> do |s| %>\n<% attributes.each do |attribute| -%>\n  <%%= s.<%= attribute.reference? ? :association : :attribute %> :<%= attribute.name %> %>\n<% end -%>\n<%% end %>\n\n<%%= link_to 'Edit', edit_<%= singular_name %>_path(@<%= singular_name %>) %> |\n<%%= link_to 'Back', <%= plural_name %>_path %>\n"
  },
  {
    "path": "public/404.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n    <meta charset=\"utf-8\">\n    <title>SmartVPN | 404 page</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <!-- @todo: fill with your company info or remove -->\n    <meta name=\"description\" content=\"\">\n    <meta name=\"author\" content=\"Themelize.me\">\n    <!-- Bootstrap CSS -->\n    <link href=\"css/bootstrap.css\" rel=\"stylesheet\">\n    <link href=\"css/responsive.css\" rel=\"stylesheet\">\n    <!-- Flexslider -->\n    <link href=\"css/flexslider.css\" rel=\"stylesheet\">\n    <!-- Theme style -->\n    <link href=\"css/theme-style.css\" rel=\"stylesheet\">\n    <!--Your custom colour override-->\n    <link href=\"#\" id=\"colour-scheme\" rel=\"stylesheet\">\n    <!-- Your custom override -->\n    <link href=\"css/custom-style.css\" rel=\"stylesheet\">\n    <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->\n    <!--[if lt IE 9]>\n    <script src=\"js/html5.js\"></script>\n    <![endif]-->\n    <!-- Le fav and touch icons - @todo: fill with your icons or remove -->\n    <link rel=\"shortcut icon\" href=\"img/icons/favicon.png\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"114x114\" href=\"img/icons/114x114.png\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"72x72\" href=\"img/icons/72x72.png\">\n    <link rel=\"apple-touch-icon-precomposed\" href=\"img/icons/default.png\">\n    <link href='http://fonts.googleapis.com/css?family=Open+Sans:400,700,300|Rambla|Calligraffitti' rel='stylesheet' type='text/css'>\n  </head>\n  <body class=\"page page-index-static\">\n\n    <div class=\"wrapper\" id=\"navigation\">\n      <div class=\"navbar navbar-static-top\">\n        <div class=\"header\">\n          <div class=\"header-inner container\">\n            <div class=\"row-fluid\">\n              <div class=\"span6\">\n                <a class=\"brand\" href=\"/\" title=\"Home\">\n                  <h1>\n                    <span>\n                    Smart\n                    </span>\n                    VPN\n                    <span>\n                    .\n                    </span>\n                  </h1>\n                </a>\n                <div class=\"slogan\">\n                  Умный VPN провайдер\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n\n    <div class=\"content\">\n      <div class=\"container\">\n        <div class=\"notifications\"></div>\n        <div class='hero-unit'>\n          <h1>Ooops, 404...</h1>\n          <p>It looks like this page does not exist...</p>\n        </div>\n      </div>\n    </div>\n\n    <footer id=\"footer\">\n      <div class=\"container\">\n        <div class=\"row\">\n          <div class=\"span3 col\">\n            <div class=\"block contact-block\">\n              <h3>Контакты</h3>\n              <address>\n                <p><abbr title=\"Email\"><i class=\"icon-envelope\"> admin@smartvpn.biz</i></abbr></p>\n              </address>\n            </div>\n          </div>\n        </div>\n      </div>\n    </footer>\n  </body>\n</html>\n"
  },
  {
    "path": "public/500.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n    <meta charset=\"utf-8\">\n    <title>SmartVPN | 500 page</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <!-- @todo: fill with your company info or remove -->\n    <meta name=\"description\" content=\"\">\n    <meta name=\"author\" content=\"Themelize.me\">\n    <!-- Bootstrap CSS -->\n    <link href=\"css/bootstrap.css\" rel=\"stylesheet\">\n    <link href=\"css/responsive.css\" rel=\"stylesheet\">\n    <!-- Flexslider -->\n    <link href=\"css/flexslider.css\" rel=\"stylesheet\">\n    <!-- Theme style -->\n    <link href=\"css/theme-style.css\" rel=\"stylesheet\">\n    <!--Your custom colour override-->\n    <link href=\"#\" id=\"colour-scheme\" rel=\"stylesheet\">\n    <!-- Your custom override -->\n    <link href=\"css/custom-style.css\" rel=\"stylesheet\">\n    <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->\n    <!--[if lt IE 9]>\n    <script src=\"js/html5.js\"></script>\n    <![endif]-->\n    <!-- Le fav and touch icons - @todo: fill with your icons or remove -->\n    <link rel=\"shortcut icon\" href=\"img/icons/favicon.png\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"114x114\" href=\"img/icons/114x114.png\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"72x72\" href=\"img/icons/72x72.png\">\n    <link rel=\"apple-touch-icon-precomposed\" href=\"img/icons/default.png\">\n    <link href='http://fonts.googleapis.com/css?family=Open+Sans:400,700,300|Rambla|Calligraffitti' rel='stylesheet' type='text/css'>\n  </head>\n  <body class=\"page page-index-static\">\n\n    <div class=\"wrapper\" id=\"navigation\">\n      <div class=\"navbar navbar-static-top\">\n        <div class=\"header\">\n          <div class=\"header-inner container\">\n            <div class=\"row-fluid\">\n              <div class=\"span6\">\n                <a class=\"brand\" href=\"/\" title=\"Home\">\n                  <h1>\n                    <span>\n                    Smart\n                    </span>\n                    VPN\n                    <span>\n                    .\n                    </span>\n                  </h1>\n                </a>\n                <div class=\"slogan\">\n                  Умный VPN провайдер\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n\n    <div class=\"content\">\n      <div class=\"container\">\n        <div class=\"notifications\"></div>\n        <div class='hero-unit'>\n          <h1>Ooops, 500...</h1>\n          <p>Something went wrong!</p>\n          <p>But we are already notified, and we'll fix it ASAP.</p>\n        </div>\n      </div>\n    </div>\n\n    <footer id=\"footer\">\n      <div class=\"container\">\n        <div class=\"row\">\n          <div class=\"span3 col\">\n            <div class=\"block contact-block\">\n              <h3>Контакты</h3>\n              <address>\n                <p><abbr title=\"Email\"><i class=\"icon-envelope\"> admin@smartvpn.biz</i></abbr></p>\n              </address>\n            </div>\n          </div>\n        </div>\n      </div>\n    </footer>\n  </body>\n</html>\n"
  },
  {
    "path": "public/css/bootstrap.css",
    "content": "/*!\n * Bootstrap v2.2.2\n *\n * Copyright 2012 Twitter, Inc\n * Licensed under the Apache License v2.0\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Designed and built with all the love in the world @twitter by @mdo and @fat.\n */\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nnav,\nsection {\n  display: block;\n}\naudio,\ncanvas,\nvideo {\n  display: inline-block;\n  *display: inline;\n  *zoom: 1;\n}\naudio:not([controls]) {\n  display: none;\n}\nhtml {\n  font-size: 100%;\n  -webkit-text-size-adjust: 100%;\n  -ms-text-size-adjust: 100%;\n}\na:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\na:hover,\na:active {\n  outline: 0;\n}\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\nsup {\n  top: -0.5em;\n}\nsub {\n  bottom: -0.25em;\n}\nimg {\n  /* Responsive images (ensure images don't scale beyond their parents) */\n\n  max-width: 100%;\n  /* Part 1: Set a maxium relative to the parent */\n\n  width: auto\\9;\n  /* IE7-8 need help adjusting responsive images */\n\n  height: auto;\n  /* Part 2: Scale the height according to the width, otherwise you get stretching */\n\n  vertical-align: middle;\n  border: 0;\n  -ms-interpolation-mode: bicubic;\n}\n#map_canvas img,\n.google-maps img {\n  max-width: none;\n}\nbutton,\ninput,\nselect,\ntextarea {\n  margin: 0;\n  font-size: 100%;\n  vertical-align: middle;\n}\nbutton,\ninput {\n  *overflow: visible;\n  line-height: normal;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  padding: 0;\n  border: 0;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  -webkit-appearance: button;\n  cursor: pointer;\n}\nlabel,\nselect,\nbutton,\ninput[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"],\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  cursor: pointer;\n}\ninput[type=\"search\"] {\n  -webkit-box-sizing: content-box;\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n  -webkit-appearance: textfield;\n}\ninput[type=\"search\"]::-webkit-search-decoration,\ninput[type=\"search\"]::-webkit-search-cancel-button {\n  -webkit-appearance: none;\n}\ntextarea {\n  overflow: auto;\n  vertical-align: top;\n}\n@media print {\n  * {\n    text-shadow: none !important;\n    color: #000 !important;\n    background: transparent !important;\n    box-shadow: none !important;\n  }\n  a,\n  a:visited {\n    text-decoration: underline;\n  }\n  a[href]:after {\n    content: \" (\" attr(href) \")\";\n  }\n  abbr[title]:after {\n    content: \" (\" attr(title) \")\";\n  }\n  .ir a:after,\n  a[href^=\"javascript:\"]:after,\n  a[href^=\"#\"]:after {\n    content: \"\";\n  }\n  pre,\n  blockquote {\n    border: 1px solid #999;\n    page-break-inside: avoid;\n  }\n  thead {\n    display: table-header-group;\n  }\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n  img {\n    max-width: 100% !important;\n  }\n  @page  {\n    margin: 0.5cm;\n  }\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n}\n.clearfix {\n  *zoom: 1;\n}\n.clearfix:before,\n.clearfix:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.clearfix:after {\n  clear: both;\n}\n.hide-text {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n.input-block-level {\n  display: block;\n  width: 100%;\n  min-height: 30px;\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\nbody {\n  margin: 0;\n  font-family: \"Rambla\", Helvetica Neue, Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  line-height: 20px;\n  color: #333333;\n  background-color: #fcfcfc;\n}\na {\n  color: #55a79a;\n  text-decoration: none;\n}\na:hover {\n  color: #44857b;\n  text-decoration: underline;\n}\n.img-rounded {\n  -webkit-border-radius: 6px;\n  -moz-border-radius: 6px;\n  border-radius: 6px;\n}\n.img-polaroid {\n  padding: 4px;\n  background-color: #fff;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n  -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n.img-circle {\n  -webkit-border-radius: 500px;\n  -moz-border-radius: 500px;\n  border-radius: 500px;\n}\n.row {\n  margin-left: -20px;\n  *zoom: 1;\n}\n.row:before,\n.row:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.row:after {\n  clear: both;\n}\n[class*=\"span\"] {\n  float: left;\n  min-height: 1px;\n  margin-left: 20px;\n}\n.container,\n.navbar-static-top .container,\n.navbar-fixed-top .container,\n.navbar-fixed-bottom .container {\n  width: 940px;\n}\n.span12 {\n  width: 940px;\n}\n.span11 {\n  width: 860px;\n}\n.span10 {\n  width: 780px;\n}\n.span9 {\n  width: 700px;\n}\n.span8 {\n  width: 620px;\n}\n.span7 {\n  width: 540px;\n}\n.span6 {\n  width: 460px;\n}\n.span5 {\n  width: 380px;\n}\n.span4 {\n  width: 300px;\n}\n.span3 {\n  width: 220px;\n}\n.span2 {\n  width: 140px;\n}\n.span1 {\n  width: 60px;\n}\n.offset12 {\n  margin-left: 980px;\n}\n.offset11 {\n  margin-left: 900px;\n}\n.offset10 {\n  margin-left: 820px;\n}\n.offset9 {\n  margin-left: 740px;\n}\n.offset8 {\n  margin-left: 660px;\n}\n.offset7 {\n  margin-left: 580px;\n}\n.offset6 {\n  margin-left: 500px;\n}\n.offset5 {\n  margin-left: 420px;\n}\n.offset4 {\n  margin-left: 340px;\n}\n.offset3 {\n  margin-left: 260px;\n}\n.offset2 {\n  margin-left: 180px;\n}\n.offset1 {\n  margin-left: 100px;\n}\n.row-fluid {\n  width: 100%;\n  *zoom: 1;\n}\n.row-fluid:before,\n.row-fluid:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.row-fluid:after {\n  clear: both;\n}\n.row-fluid [class*=\"span\"] {\n  display: block;\n  width: 100%;\n  min-height: 30px;\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  float: left;\n  margin-left: 2.127659574468085%;\n  *margin-left: 2.074468085106383%;\n}\n.row-fluid [class*=\"span\"]:first-child {\n  margin-left: 0;\n}\n.row-fluid .controls-row [class*=\"span\"] + [class*=\"span\"] {\n  margin-left: 2.127659574468085%;\n}\n.row-fluid .span12 {\n  width: 100%;\n  *width: 99.94680851063829%;\n}\n.row-fluid .span11 {\n  width: 91.48936170212765%;\n  *width: 91.43617021276594%;\n}\n.row-fluid .span10 {\n  width: 82.97872340425532%;\n  *width: 82.92553191489361%;\n}\n.row-fluid .span9 {\n  width: 74.46808510638297%;\n  *width: 74.41489361702126%;\n}\n.row-fluid .span8 {\n  width: 65.95744680851064%;\n  *width: 65.90425531914893%;\n}\n.row-fluid .span7 {\n  width: 57.44680851063829%;\n  *width: 57.39361702127659%;\n}\n.row-fluid .span6 {\n  width: 48.93617021276595%;\n  *width: 48.88297872340425%;\n}\n.row-fluid .span5 {\n  width: 40.42553191489362%;\n  *width: 40.37234042553192%;\n}\n.row-fluid .span4 {\n  width: 31.914893617021278%;\n  *width: 31.861702127659576%;\n}\n.row-fluid .span3 {\n  width: 23.404255319148934%;\n  *width: 23.351063829787233%;\n}\n.row-fluid .span2 {\n  width: 14.893617021276595%;\n  *width: 14.840425531914894%;\n}\n.row-fluid .span1 {\n  width: 6.382978723404255%;\n  *width: 6.329787234042553%;\n}\n.row-fluid .offset12 {\n  margin-left: 104.25531914893617%;\n  *margin-left: 104.14893617021275%;\n}\n.row-fluid .offset12:first-child {\n  margin-left: 102.12765957446808%;\n  *margin-left: 102.02127659574467%;\n}\n.row-fluid .offset11 {\n  margin-left: 95.74468085106382%;\n  *margin-left: 95.6382978723404%;\n}\n.row-fluid .offset11:first-child {\n  margin-left: 93.61702127659574%;\n  *margin-left: 93.51063829787232%;\n}\n.row-fluid .offset10 {\n  margin-left: 87.23404255319149%;\n  *margin-left: 87.12765957446807%;\n}\n.row-fluid .offset10:first-child {\n  margin-left: 85.1063829787234%;\n  *margin-left: 84.99999999999999%;\n}\n.row-fluid .offset9 {\n  margin-left: 78.72340425531914%;\n  *margin-left: 78.61702127659572%;\n}\n.row-fluid .offset9:first-child {\n  margin-left: 76.59574468085106%;\n  *margin-left: 76.48936170212764%;\n}\n.row-fluid .offset8 {\n  margin-left: 70.2127659574468%;\n  *margin-left: 70.10638297872339%;\n}\n.row-fluid .offset8:first-child {\n  margin-left: 68.08510638297872%;\n  *margin-left: 67.9787234042553%;\n}\n.row-fluid .offset7 {\n  margin-left: 61.70212765957446%;\n  *margin-left: 61.59574468085106%;\n}\n.row-fluid .offset7:first-child {\n  margin-left: 59.574468085106375%;\n  *margin-left: 59.46808510638297%;\n}\n.row-fluid .offset6 {\n  margin-left: 53.191489361702125%;\n  *margin-left: 53.085106382978715%;\n}\n.row-fluid .offset6:first-child {\n  margin-left: 51.063829787234035%;\n  *margin-left: 50.95744680851063%;\n}\n.row-fluid .offset5 {\n  margin-left: 44.68085106382979%;\n  *margin-left: 44.57446808510638%;\n}\n.row-fluid .offset5:first-child {\n  margin-left: 42.5531914893617%;\n  *margin-left: 42.4468085106383%;\n}\n.row-fluid .offset4 {\n  margin-left: 36.170212765957444%;\n  *margin-left: 36.06382978723405%;\n}\n.row-fluid .offset4:first-child {\n  margin-left: 34.04255319148936%;\n  *margin-left: 33.93617021276596%;\n}\n.row-fluid .offset3 {\n  margin-left: 27.659574468085104%;\n  *margin-left: 27.5531914893617%;\n}\n.row-fluid .offset3:first-child {\n  margin-left: 25.53191489361702%;\n  *margin-left: 25.425531914893618%;\n}\n.row-fluid .offset2 {\n  margin-left: 19.148936170212764%;\n  *margin-left: 19.04255319148936%;\n}\n.row-fluid .offset2:first-child {\n  margin-left: 17.02127659574468%;\n  *margin-left: 16.914893617021278%;\n}\n.row-fluid .offset1 {\n  margin-left: 10.638297872340425%;\n  *margin-left: 10.53191489361702%;\n}\n.row-fluid .offset1:first-child {\n  margin-left: 8.51063829787234%;\n  *margin-left: 8.404255319148938%;\n}\n[class*=\"span\"].hide,\n.row-fluid [class*=\"span\"].hide {\n  display: none;\n}\n[class*=\"span\"].pull-right,\n.row-fluid [class*=\"span\"].pull-right {\n  float: right;\n}\n.container {\n  margin-right: auto;\n  margin-left: auto;\n  *zoom: 1;\n}\n.container:before,\n.container:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.container:after {\n  clear: both;\n}\n.container-fluid {\n  padding-right: 20px;\n  padding-left: 20px;\n  *zoom: 1;\n}\n.container-fluid:before,\n.container-fluid:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.container-fluid:after {\n  clear: both;\n}\np {\n  margin: 0 0 10px;\n}\n.lead {\n  margin-bottom: 20px;\n  font-size: 21px;\n  font-weight: 200;\n  line-height: 30px;\n}\nsmall {\n  font-size: 85%;\n}\nstrong {\n  font-weight: bold;\n}\nem {\n  font-style: italic;\n}\ncite {\n  font-style: normal;\n}\n.muted {\n  color: rgba(36, 36, 36, 0.8);\n}\na.muted:hover {\n  color: rgba(10, 10, 10, 0.8);\n}\n.text-warning {\n  color: #c09853;\n}\na.text-warning:hover {\n  color: #a47e3c;\n}\n.text-error {\n  color: #b94a48;\n}\na.text-error:hover {\n  color: #953b39;\n}\n.text-info {\n  color: #3a87ad;\n}\na.text-info:hover {\n  color: #2d6987;\n}\n.text-success {\n  color: #468847;\n}\na.text-success:hover {\n  color: #356635;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n  margin: 10px 0;\n  font-family: inherit;\n  font-weight: bold;\n  line-height: 20px;\n  color: inherit;\n  text-rendering: optimizelegibility;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small {\n  font-weight: normal;\n  line-height: 1;\n  color: rgba(36, 36, 36, 0.8);\n}\nh1,\nh2,\nh3 {\n  line-height: 40px;\n}\nh1 {\n  font-size: 38.5px;\n}\nh2 {\n  font-size: 31.5px;\n}\nh3 {\n  font-size: 24.5px;\n}\nh4 {\n  font-size: 17.5px;\n}\nh5 {\n  font-size: 14px;\n}\nh6 {\n  font-size: 11.9px;\n}\nh1 small {\n  font-size: 24.5px;\n}\nh2 small {\n  font-size: 17.5px;\n}\nh3 small {\n  font-size: 14px;\n}\nh4 small {\n  font-size: 14px;\n}\n.page-header {\n  padding-bottom: 9px;\n  margin: 20px 0 30px;\n  border-bottom: 1px solid #e6e6e6;\n}\nul,\nol {\n  padding: 0;\n  margin: 0 0 10px 25px;\n}\nul ul,\nul ol,\nol ol,\nol ul {\n  margin-bottom: 0;\n}\nli {\n  line-height: 20px;\n}\nul.unstyled,\nol.unstyled {\n  margin-left: 0;\n  list-style: none;\n}\nul.inline,\nol.inline {\n  margin-left: 0;\n  list-style: none;\n}\nul.inline > li,\nol.inline > li {\n  display: inline-block;\n  padding-left: 5px;\n  padding-right: 5px;\n}\ndl {\n  margin-bottom: 20px;\n}\ndt,\ndd {\n  line-height: 20px;\n}\ndt {\n  font-weight: bold;\n}\ndd {\n  margin-left: 10px;\n}\n.dl-horizontal {\n  *zoom: 1;\n}\n.dl-horizontal:before,\n.dl-horizontal:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.dl-horizontal:after {\n  clear: both;\n}\n.dl-horizontal dt {\n  float: left;\n  width: 160px;\n  clear: left;\n  text-align: right;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n.dl-horizontal dd {\n  margin-left: 180px;\n}\nhr {\n  margin: 20px 0;\n  border: 0;\n  border-top: 1px solid #e6e6e6;\n  border-bottom: 1px solid #ffffff;\n}\nabbr[title],\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted rgba(36, 36, 36, 0.8);\n}\nabbr.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\nblockquote {\n  padding: 0 0 0 15px;\n  margin: 0 0 20px;\n  border-left: 5px solid #e6e6e6;\n}\nblockquote p {\n  margin-bottom: 0;\n  font-size: 16px;\n  font-weight: 300;\n  line-height: 25px;\n}\nblockquote small {\n  display: block;\n  line-height: 20px;\n  color: rgba(36, 36, 36, 0.8);\n}\nblockquote small:before {\n  content: '\\2014 \\00A0';\n}\nblockquote.pull-right {\n  float: right;\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid #e6e6e6;\n  border-left: 0;\n}\nblockquote.pull-right p,\nblockquote.pull-right small {\n  text-align: right;\n}\nblockquote.pull-right small:before {\n  content: '';\n}\nblockquote.pull-right small:after {\n  content: '\\00A0 \\2014';\n}\nq:before,\nq:after,\nblockquote:before,\nblockquote:after {\n  content: \"\";\n}\naddress {\n  display: block;\n  margin-bottom: 20px;\n  font-style: normal;\n  line-height: 20px;\n}\ncode,\npre {\n  padding: 0 3px 2px;\n  font-family: Monaco, Menlo, Consolas, \"Courier New\", monospace;\n  font-size: 12px;\n  color: #333333;\n  -webkit-border-radius: 3px;\n  -moz-border-radius: 3px;\n  border-radius: 3px;\n}\ncode {\n  padding: 2px 4px;\n  color: #d14;\n  background-color: #f7f7f9;\n  border: 1px solid #e1e1e8;\n  white-space: nowrap;\n}\npre {\n  display: block;\n  padding: 9.5px;\n  margin: 0 0 10px;\n  font-size: 13px;\n  line-height: 20px;\n  word-break: break-all;\n  word-wrap: break-word;\n  white-space: pre;\n  white-space: pre-wrap;\n  background-color: #f5f5f5;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n}\npre.prettyprint {\n  margin-bottom: 20px;\n}\npre code {\n  padding: 0;\n  color: inherit;\n  white-space: pre;\n  white-space: pre-wrap;\n  background-color: transparent;\n  border: 0;\n}\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\nform {\n  margin: 0 0 20px;\n}\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 20px;\n  font-size: 21px;\n  line-height: 40px;\n  color: #333333;\n  border: 0;\n  border-bottom: 1px solid #e5e5e5;\n}\nlegend small {\n  font-size: 15px;\n  color: rgba(36, 36, 36, 0.8);\n}\nlabel,\ninput,\nbutton,\nselect,\ntextarea {\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 20px;\n}\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: \"Rambla\", Helvetica Neue, Helvetica, Arial, sans-serif;\n}\nlabel {\n  display: block;\n  margin-bottom: 5px;\n}\nselect,\ntextarea,\ninput[type=\"text\"],\ninput[type=\"password\"],\ninput[type=\"datetime\"],\ninput[type=\"datetime-local\"],\ninput[type=\"date\"],\ninput[type=\"month\"],\ninput[type=\"time\"],\ninput[type=\"week\"],\ninput[type=\"number\"],\ninput[type=\"email\"],\ninput[type=\"url\"],\ninput[type=\"search\"],\ninput[type=\"tel\"],\ninput[type=\"color\"],\n.uneditable-input {\n  display: inline-block;\n  height: 20px;\n  padding: 4px 6px;\n  margin-bottom: 10px;\n  font-size: 14px;\n  line-height: 20px;\n  color: #242424;\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n  vertical-align: middle;\n}\ninput,\ntextarea,\n.uneditable-input {\n  width: 206px;\n}\ntextarea {\n  height: auto;\n}\ntextarea,\ninput[type=\"text\"],\ninput[type=\"password\"],\ninput[type=\"datetime\"],\ninput[type=\"datetime-local\"],\ninput[type=\"date\"],\ninput[type=\"month\"],\ninput[type=\"time\"],\ninput[type=\"week\"],\ninput[type=\"number\"],\ninput[type=\"email\"],\ninput[type=\"url\"],\ninput[type=\"search\"],\ninput[type=\"tel\"],\ninput[type=\"color\"],\n.uneditable-input {\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -webkit-transition: border linear .2s, box-shadow linear .2s;\n  -moz-transition: border linear .2s, box-shadow linear .2s;\n  -o-transition: border linear .2s, box-shadow linear .2s;\n  transition: border linear .2s, box-shadow linear .2s;\n}\ntextarea:focus,\ninput[type=\"text\"]:focus,\ninput[type=\"password\"]:focus,\ninput[type=\"datetime\"]:focus,\ninput[type=\"datetime-local\"]:focus,\ninput[type=\"date\"]:focus,\ninput[type=\"month\"]:focus,\ninput[type=\"time\"]:focus,\ninput[type=\"week\"]:focus,\ninput[type=\"number\"]:focus,\ninput[type=\"email\"]:focus,\ninput[type=\"url\"]:focus,\ninput[type=\"search\"]:focus,\ninput[type=\"tel\"]:focus,\ninput[type=\"color\"]:focus,\n.uneditable-input:focus {\n  border-color: rgba(82, 168, 236, 0.8);\n  outline: 0;\n  outline: thin dotted \\9;\n  /* IE6-9 */\n\n  -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);\n  -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);\n  box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  *margin-top: 0;\n  /* IE7 */\n\n  margin-top: 1px \\9;\n  /* IE8-9 */\n\n  line-height: normal;\n}\ninput[type=\"file\"],\ninput[type=\"image\"],\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"],\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  width: auto;\n}\nselect,\ninput[type=\"file\"] {\n  height: 30px;\n  /* In IE7, the height of the select element cannot be changed by height, only font-size */\n\n  *margin-top: 4px;\n  /* For IE7, add top margin to align select with labels */\n\n  line-height: 30px;\n}\nselect {\n  width: 220px;\n  border: 1px solid #cccccc;\n  background-color: #ffffff;\n}\nselect[multiple],\nselect[size] {\n  height: auto;\n}\nselect:focus,\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n.uneditable-input,\n.uneditable-textarea {\n  color: rgba(36, 36, 36, 0.8);\n  background-color: #fcfcfc;\n  border-color: #cccccc;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);\n  -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);\n  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);\n  cursor: not-allowed;\n}\n.uneditable-input {\n  overflow: hidden;\n  white-space: nowrap;\n}\n.uneditable-textarea {\n  width: auto;\n  height: auto;\n}\ninput:-moz-placeholder,\ntextarea:-moz-placeholder {\n  color: rgba(36, 36, 36, 0.8);\n}\ninput:-ms-input-placeholder,\ntextarea:-ms-input-placeholder {\n  color: rgba(36, 36, 36, 0.8);\n}\ninput::-webkit-input-placeholder,\ntextarea::-webkit-input-placeholder {\n  color: rgba(36, 36, 36, 0.8);\n}\n.radio,\n.checkbox {\n  min-height: 20px;\n  padding-left: 20px;\n}\n.radio input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"] {\n  float: left;\n  margin-left: -20px;\n}\n.controls > .radio:first-child,\n.controls > .checkbox:first-child {\n  padding-top: 5px;\n}\n.radio.inline,\n.checkbox.inline {\n  display: inline-block;\n  padding-top: 5px;\n  margin-bottom: 0;\n  vertical-align: middle;\n}\n.radio.inline + .radio.inline,\n.checkbox.inline + .checkbox.inline {\n  margin-left: 10px;\n}\n.input-mini {\n  width: 60px;\n}\n.input-small {\n  width: 90px;\n}\n.input-medium {\n  width: 150px;\n}\n.input-large {\n  width: 210px;\n}\n.input-xlarge {\n  width: 270px;\n}\n.input-xxlarge {\n  width: 530px;\n}\ninput[class*=\"span\"],\nselect[class*=\"span\"],\ntextarea[class*=\"span\"],\n.uneditable-input[class*=\"span\"],\n.row-fluid input[class*=\"span\"],\n.row-fluid select[class*=\"span\"],\n.row-fluid textarea[class*=\"span\"],\n.row-fluid .uneditable-input[class*=\"span\"] {\n  float: none;\n  margin-left: 0;\n}\n.input-append input[class*=\"span\"],\n.input-append .uneditable-input[class*=\"span\"],\n.input-prepend input[class*=\"span\"],\n.input-prepend .uneditable-input[class*=\"span\"],\n.row-fluid input[class*=\"span\"],\n.row-fluid select[class*=\"span\"],\n.row-fluid textarea[class*=\"span\"],\n.row-fluid .uneditable-input[class*=\"span\"],\n.row-fluid .input-prepend [class*=\"span\"],\n.row-fluid .input-append [class*=\"span\"] {\n  display: inline-block;\n}\ninput,\ntextarea,\n.uneditable-input {\n  margin-left: 0;\n}\n.controls-row [class*=\"span\"] + [class*=\"span\"] {\n  margin-left: 20px;\n}\ninput.span12, textarea.span12, .uneditable-input.span12 {\n  width: 926px;\n}\ninput.span11, textarea.span11, .uneditable-input.span11 {\n  width: 846px;\n}\ninput.span10, textarea.span10, .uneditable-input.span10 {\n  width: 766px;\n}\ninput.span9, textarea.span9, .uneditable-input.span9 {\n  width: 686px;\n}\ninput.span8, textarea.span8, .uneditable-input.span8 {\n  width: 606px;\n}\ninput.span7, textarea.span7, .uneditable-input.span7 {\n  width: 526px;\n}\ninput.span6, textarea.span6, .uneditable-input.span6 {\n  width: 446px;\n}\ninput.span5, textarea.span5, .uneditable-input.span5 {\n  width: 366px;\n}\ninput.span4, textarea.span4, .uneditable-input.span4 {\n  width: 286px;\n}\ninput.span3, textarea.span3, .uneditable-input.span3 {\n  width: 206px;\n}\ninput.span2, textarea.span2, .uneditable-input.span2 {\n  width: 126px;\n}\ninput.span1, textarea.span1, .uneditable-input.span1 {\n  width: 46px;\n}\n.controls-row {\n  *zoom: 1;\n}\n.controls-row:before,\n.controls-row:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.controls-row:after {\n  clear: both;\n}\n.controls-row [class*=\"span\"],\n.row-fluid .controls-row [class*=\"span\"] {\n  float: left;\n}\n.controls-row .checkbox[class*=\"span\"],\n.controls-row .radio[class*=\"span\"] {\n  padding-top: 5px;\n}\ninput[disabled],\nselect[disabled],\ntextarea[disabled],\ninput[readonly],\nselect[readonly],\ntextarea[readonly] {\n  cursor: not-allowed;\n  background-color: #e6e6e6;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"][readonly],\ninput[type=\"checkbox\"][readonly] {\n  background-color: transparent;\n}\n.control-group.warning .control-label,\n.control-group.warning .help-block,\n.control-group.warning .help-inline {\n  color: #c09853;\n}\n.control-group.warning .checkbox,\n.control-group.warning .radio,\n.control-group.warning input,\n.control-group.warning select,\n.control-group.warning textarea {\n  color: #c09853;\n}\n.control-group.warning input,\n.control-group.warning select,\n.control-group.warning textarea {\n  border-color: #c09853;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.control-group.warning input:focus,\n.control-group.warning select:focus,\n.control-group.warning textarea:focus {\n  border-color: #a47e3c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;\n  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;\n}\n.control-group.warning .input-prepend .add-on,\n.control-group.warning .input-append .add-on {\n  color: #c09853;\n  background-color: #fcf8e3;\n  border-color: #c09853;\n}\n.control-group.error .control-label,\n.control-group.error .help-block,\n.control-group.error .help-inline {\n  color: #b94a48;\n}\n.control-group.error .checkbox,\n.control-group.error .radio,\n.control-group.error input,\n.control-group.error select,\n.control-group.error textarea {\n  color: #b94a48;\n}\n.control-group.error input,\n.control-group.error select,\n.control-group.error textarea {\n  border-color: #b94a48;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.control-group.error input:focus,\n.control-group.error select:focus,\n.control-group.error textarea:focus {\n  border-color: #953b39;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;\n  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;\n}\n.control-group.error .input-prepend .add-on,\n.control-group.error .input-append .add-on {\n  color: #b94a48;\n  background-color: #f2dede;\n  border-color: #b94a48;\n}\n.control-group.success .control-label,\n.control-group.success .help-block,\n.control-group.success .help-inline {\n  color: #468847;\n}\n.control-group.success .checkbox,\n.control-group.success .radio,\n.control-group.success input,\n.control-group.success select,\n.control-group.success textarea {\n  color: #468847;\n}\n.control-group.success input,\n.control-group.success select,\n.control-group.success textarea {\n  border-color: #468847;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.control-group.success input:focus,\n.control-group.success select:focus,\n.control-group.success textarea:focus {\n  border-color: #356635;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;\n  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;\n}\n.control-group.success .input-prepend .add-on,\n.control-group.success .input-append .add-on {\n  color: #468847;\n  background-color: #dff0d8;\n  border-color: #468847;\n}\n.control-group.info .control-label,\n.control-group.info .help-block,\n.control-group.info .help-inline {\n  color: #3a87ad;\n}\n.control-group.info .checkbox,\n.control-group.info .radio,\n.control-group.info input,\n.control-group.info select,\n.control-group.info textarea {\n  color: #3a87ad;\n}\n.control-group.info input,\n.control-group.info select,\n.control-group.info textarea {\n  border-color: #3a87ad;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.control-group.info input:focus,\n.control-group.info select:focus,\n.control-group.info textarea:focus {\n  border-color: #2d6987;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;\n  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;\n}\n.control-group.info .input-prepend .add-on,\n.control-group.info .input-append .add-on {\n  color: #3a87ad;\n  background-color: #d9edf7;\n  border-color: #3a87ad;\n}\ninput:focus:invalid,\ntextarea:focus:invalid,\nselect:focus:invalid {\n  color: #b94a48;\n  border-color: #ee5f5b;\n}\ninput:focus:invalid:focus,\ntextarea:focus:invalid:focus,\nselect:focus:invalid:focus {\n  border-color: #e9322d;\n  -webkit-box-shadow: 0 0 6px #f8b9b7;\n  -moz-box-shadow: 0 0 6px #f8b9b7;\n  box-shadow: 0 0 6px #f8b9b7;\n}\n.form-actions {\n  padding: 19px 20px 20px;\n  margin-top: 20px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border-top: 1px solid #e5e5e5;\n  *zoom: 1;\n}\n.form-actions:before,\n.form-actions:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.form-actions:after {\n  clear: both;\n}\n.help-block,\n.help-inline {\n  color: #595959;\n}\n.help-block {\n  display: block;\n  margin-bottom: 10px;\n}\n.help-inline {\n  display: inline-block;\n  *display: inline;\n  /* IE7 inline-block hack */\n\n  *zoom: 1;\n  vertical-align: middle;\n  padding-left: 5px;\n}\n.input-append,\n.input-prepend {\n  margin-bottom: 5px;\n  font-size: 0;\n  white-space: nowrap;\n}\n.input-append input,\n.input-prepend input,\n.input-append select,\n.input-prepend select,\n.input-append .uneditable-input,\n.input-prepend .uneditable-input,\n.input-append .dropdown-menu,\n.input-prepend .dropdown-menu {\n  font-size: 14px;\n}\n.input-append input,\n.input-prepend input,\n.input-append select,\n.input-prepend select,\n.input-append .uneditable-input,\n.input-prepend .uneditable-input {\n  position: relative;\n  margin-bottom: 0;\n  *margin-left: 0;\n  vertical-align: top;\n  -webkit-border-radius: 0 2px 2px 0;\n  -moz-border-radius: 0 2px 2px 0;\n  border-radius: 0 2px 2px 0;\n}\n.input-append input:focus,\n.input-prepend input:focus,\n.input-append select:focus,\n.input-prepend select:focus,\n.input-append .uneditable-input:focus,\n.input-prepend .uneditable-input:focus {\n  z-index: 2;\n}\n.input-append .add-on,\n.input-prepend .add-on {\n  display: inline-block;\n  width: auto;\n  height: 20px;\n  min-width: 16px;\n  padding: 4px 5px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 20px;\n  text-align: center;\n  text-shadow: 0 1px 0 #ffffff;\n  background-color: #e6e6e6;\n  border: 1px solid #ccc;\n}\n.input-append .add-on,\n.input-prepend .add-on,\n.input-append .btn,\n.input-prepend .btn,\n.input-append .btn-group > .dropdown-toggle,\n.input-prepend .btn-group > .dropdown-toggle {\n  vertical-align: top;\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n}\n.input-append .active,\n.input-prepend .active {\n  background-color: #a9dba9;\n  border-color: #46a546;\n}\n.input-prepend .add-on,\n.input-prepend .btn {\n  margin-right: -1px;\n}\n.input-prepend .add-on:first-child,\n.input-prepend .btn:first-child {\n  -webkit-border-radius: 2px 0 0 2px;\n  -moz-border-radius: 2px 0 0 2px;\n  border-radius: 2px 0 0 2px;\n}\n.input-append input,\n.input-append select,\n.input-append .uneditable-input {\n  -webkit-border-radius: 2px 0 0 2px;\n  -moz-border-radius: 2px 0 0 2px;\n  border-radius: 2px 0 0 2px;\n}\n.input-append input + .btn-group .btn:last-child,\n.input-append select + .btn-group .btn:last-child,\n.input-append .uneditable-input + .btn-group .btn:last-child {\n  -webkit-border-radius: 0 2px 2px 0;\n  -moz-border-radius: 0 2px 2px 0;\n  border-radius: 0 2px 2px 0;\n}\n.input-append .add-on,\n.input-append .btn,\n.input-append .btn-group {\n  margin-left: -1px;\n}\n.input-append .add-on:last-child,\n.input-append .btn:last-child,\n.input-append .btn-group:last-child > .dropdown-toggle {\n  -webkit-border-radius: 0 2px 2px 0;\n  -moz-border-radius: 0 2px 2px 0;\n  border-radius: 0 2px 2px 0;\n}\n.input-prepend.input-append input,\n.input-prepend.input-append select,\n.input-prepend.input-append .uneditable-input {\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n}\n.input-prepend.input-append input + .btn-group .btn,\n.input-prepend.input-append select + .btn-group .btn,\n.input-prepend.input-append .uneditable-input + .btn-group .btn {\n  -webkit-border-radius: 0 2px 2px 0;\n  -moz-border-radius: 0 2px 2px 0;\n  border-radius: 0 2px 2px 0;\n}\n.input-prepend.input-append .add-on:first-child,\n.input-prepend.input-append .btn:first-child {\n  margin-right: -1px;\n  -webkit-border-radius: 2px 0 0 2px;\n  -moz-border-radius: 2px 0 0 2px;\n  border-radius: 2px 0 0 2px;\n}\n.input-prepend.input-append .add-on:last-child,\n.input-prepend.input-append .btn:last-child {\n  margin-left: -1px;\n  -webkit-border-radius: 0 2px 2px 0;\n  -moz-border-radius: 0 2px 2px 0;\n  border-radius: 0 2px 2px 0;\n}\n.input-prepend.input-append .btn-group:first-child {\n  margin-left: 0;\n}\ninput.search-query {\n  padding-right: 14px;\n  padding-right: 4px \\9;\n  padding-left: 14px;\n  padding-left: 4px \\9;\n  /* IE7-8 doesn't have border-radius, so don't indent the padding */\n\n  margin-bottom: 0;\n  -webkit-border-radius: 15px;\n  -moz-border-radius: 15px;\n  border-radius: 15px;\n}\n/* Allow for input prepend/append in search forms */\n.form-search .input-append .search-query,\n.form-search .input-prepend .search-query {\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n}\n.form-search .input-append .search-query {\n  -webkit-border-radius: 14px 0 0 14px;\n  -moz-border-radius: 14px 0 0 14px;\n  border-radius: 14px 0 0 14px;\n}\n.form-search .input-append .btn {\n  -webkit-border-radius: 0 14px 14px 0;\n  -moz-border-radius: 0 14px 14px 0;\n  border-radius: 0 14px 14px 0;\n}\n.form-search .input-prepend .search-query {\n  -webkit-border-radius: 0 14px 14px 0;\n  -moz-border-radius: 0 14px 14px 0;\n  border-radius: 0 14px 14px 0;\n}\n.form-search .input-prepend .btn {\n  -webkit-border-radius: 14px 0 0 14px;\n  -moz-border-radius: 14px 0 0 14px;\n  border-radius: 14px 0 0 14px;\n}\n.form-search input,\n.form-inline input,\n.form-horizontal input,\n.form-search textarea,\n.form-inline textarea,\n.form-horizontal textarea,\n.form-search select,\n.form-inline select,\n.form-horizontal select,\n.form-search .help-inline,\n.form-inline .help-inline,\n.form-horizontal .help-inline,\n.form-search .uneditable-input,\n.form-inline .uneditable-input,\n.form-horizontal .uneditable-input,\n.form-search .input-prepend,\n.form-inline .input-prepend,\n.form-horizontal .input-prepend,\n.form-search .input-append,\n.form-inline .input-append,\n.form-horizontal .input-append {\n  display: inline-block;\n  *display: inline;\n  /* IE7 inline-block hack */\n\n  *zoom: 1;\n  margin-bottom: 0;\n  vertical-align: middle;\n}\n.form-search .hide,\n.form-inline .hide,\n.form-horizontal .hide {\n  display: none;\n}\n.form-search label,\n.form-inline label,\n.form-search .btn-group,\n.form-inline .btn-group {\n  display: inline-block;\n}\n.form-search .input-append,\n.form-inline .input-append,\n.form-search .input-prepend,\n.form-inline .input-prepend {\n  margin-bottom: 0;\n}\n.form-search .radio,\n.form-search .checkbox,\n.form-inline .radio,\n.form-inline .checkbox {\n  padding-left: 0;\n  margin-bottom: 0;\n  vertical-align: middle;\n}\n.form-search .radio input[type=\"radio\"],\n.form-search .checkbox input[type=\"checkbox\"],\n.form-inline .radio input[type=\"radio\"],\n.form-inline .checkbox input[type=\"checkbox\"] {\n  float: left;\n  margin-right: 3px;\n  margin-left: 0;\n}\n.control-group {\n  margin-bottom: 10px;\n}\nlegend + .control-group {\n  margin-top: 20px;\n  -webkit-margin-top-collapse: separate;\n}\n.form-horizontal .control-group {\n  margin-bottom: 20px;\n  *zoom: 1;\n}\n.form-horizontal .control-group:before,\n.form-horizontal .control-group:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.form-horizontal .control-group:after {\n  clear: both;\n}\n.form-horizontal .control-label {\n  float: left;\n  width: 160px;\n  padding-top: 5px;\n  text-align: right;\n}\n.form-horizontal .controls {\n  *display: inline-block;\n  *padding-left: 20px;\n  margin-left: 180px;\n  *margin-left: 0;\n}\n.form-horizontal .controls:first-child {\n  *padding-left: 180px;\n}\n.form-horizontal .help-block {\n  margin-bottom: 0;\n}\n.form-horizontal input + .help-block,\n.form-horizontal select + .help-block,\n.form-horizontal textarea + .help-block,\n.form-horizontal .uneditable-input + .help-block,\n.form-horizontal .input-prepend + .help-block,\n.form-horizontal .input-append + .help-block {\n  margin-top: 10px;\n}\n.form-horizontal .form-actions {\n  padding-left: 180px;\n}\ntable {\n  max-width: 100%;\n  background-color: transparent;\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n.table {\n  width: 100%;\n  margin-bottom: 20px;\n}\n.table th,\n.table td {\n  padding: 8px;\n  line-height: 20px;\n  text-align: left;\n  vertical-align: top;\n  border-top: 1px solid #dddddd;\n}\n.table th {\n  font-weight: bold;\n}\n.table thead th {\n  vertical-align: bottom;\n}\n.table caption + thead tr:first-child th,\n.table caption + thead tr:first-child td,\n.table colgroup + thead tr:first-child th,\n.table colgroup + thead tr:first-child td,\n.table thead:first-child tr:first-child th,\n.table thead:first-child tr:first-child td {\n  border-top: 0;\n}\n.table tbody + tbody {\n  border-top: 2px solid #dddddd;\n}\n.table .table {\n  background-color: #fcfcfc;\n}\n.table-condensed th,\n.table-condensed td {\n  padding: 4px 5px;\n}\n.table-bordered {\n  border: 1px solid #dddddd;\n  border-collapse: separate;\n  *border-collapse: collapse;\n  border-left: 0;\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n}\n.table-bordered th,\n.table-bordered td {\n  border-left: 1px solid #dddddd;\n}\n.table-bordered caption + thead tr:first-child th,\n.table-bordered caption + tbody tr:first-child th,\n.table-bordered caption + tbody tr:first-child td,\n.table-bordered colgroup + thead tr:first-child th,\n.table-bordered colgroup + tbody tr:first-child th,\n.table-bordered colgroup + tbody tr:first-child td,\n.table-bordered thead:first-child tr:first-child th,\n.table-bordered tbody:first-child tr:first-child th,\n.table-bordered tbody:first-child tr:first-child td {\n  border-top: 0;\n}\n.table-bordered thead:first-child tr:first-child > th:first-child,\n.table-bordered tbody:first-child tr:first-child > td:first-child {\n  -webkit-border-top-left-radius: 2px;\n  -moz-border-radius-topleft: 2px;\n  border-top-left-radius: 2px;\n}\n.table-bordered thead:first-child tr:first-child > th:last-child,\n.table-bordered tbody:first-child tr:first-child > td:last-child {\n  -webkit-border-top-right-radius: 2px;\n  -moz-border-radius-topright: 2px;\n  border-top-right-radius: 2px;\n}\n.table-bordered thead:last-child tr:last-child > th:first-child,\n.table-bordered tbody:last-child tr:last-child > td:first-child,\n.table-bordered tfoot:last-child tr:last-child > td:first-child {\n  -webkit-border-bottom-left-radius: 2px;\n  -moz-border-radius-bottomleft: 2px;\n  border-bottom-left-radius: 2px;\n}\n.table-bordered thead:last-child tr:last-child > th:last-child,\n.table-bordered tbody:last-child tr:last-child > td:last-child,\n.table-bordered tfoot:last-child tr:last-child > td:last-child {\n  -webkit-border-bottom-right-radius: 2px;\n  -moz-border-radius-bottomright: 2px;\n  border-bottom-right-radius: 2px;\n}\n.table-bordered tfoot + tbody:last-child tr:last-child td:first-child {\n  -webkit-border-bottom-left-radius: 0;\n  -moz-border-radius-bottomleft: 0;\n  border-bottom-left-radius: 0;\n}\n.table-bordered tfoot + tbody:last-child tr:last-child td:last-child {\n  -webkit-border-bottom-right-radius: 0;\n  -moz-border-radius-bottomright: 0;\n  border-bottom-right-radius: 0;\n}\n.table-bordered caption + thead tr:first-child th:first-child,\n.table-bordered caption + tbody tr:first-child td:first-child,\n.table-bordered colgroup + thead tr:first-child th:first-child,\n.table-bordered colgroup + tbody tr:first-child td:first-child {\n  -webkit-border-top-left-radius: 2px;\n  -moz-border-radius-topleft: 2px;\n  border-top-left-radius: 2px;\n}\n.table-bordered caption + thead tr:first-child th:last-child,\n.table-bordered caption + tbody tr:first-child td:last-child,\n.table-bordered colgroup + thead tr:first-child th:last-child,\n.table-bordered colgroup + tbody tr:first-child td:last-child {\n  -webkit-border-top-right-radius: 2px;\n  -moz-border-radius-topright: 2px;\n  border-top-right-radius: 2px;\n}\n.table-striped tbody > tr:nth-child(odd) > td,\n.table-striped tbody > tr:nth-child(odd) > th {\n  background-color: #f9f9f9;\n}\n.table-hover tbody tr:hover td,\n.table-hover tbody tr:hover th {\n  background-color: #f5f5f5;\n}\ntable td[class*=\"span\"],\ntable th[class*=\"span\"],\n.row-fluid table td[class*=\"span\"],\n.row-fluid table th[class*=\"span\"] {\n  display: table-cell;\n  float: none;\n  margin-left: 0;\n}\n.table td.span1,\n.table th.span1 {\n  float: none;\n  width: 44px;\n  margin-left: 0;\n}\n.table td.span2,\n.table th.span2 {\n  float: none;\n  width: 124px;\n  margin-left: 0;\n}\n.table td.span3,\n.table th.span3 {\n  float: none;\n  width: 204px;\n  margin-left: 0;\n}\n.table td.span4,\n.table th.span4 {\n  float: none;\n  width: 284px;\n  margin-left: 0;\n}\n.table td.span5,\n.table th.span5 {\n  float: none;\n  width: 364px;\n  margin-left: 0;\n}\n.table td.span6,\n.table th.span6 {\n  float: none;\n  width: 444px;\n  margin-left: 0;\n}\n.table td.span7,\n.table th.span7 {\n  float: none;\n  width: 524px;\n  margin-left: 0;\n}\n.table td.span8,\n.table th.span8 {\n  float: none;\n  width: 604px;\n  margin-left: 0;\n}\n.table td.span9,\n.table th.span9 {\n  float: none;\n  width: 684px;\n  margin-left: 0;\n}\n.table td.span10,\n.table th.span10 {\n  float: none;\n  width: 764px;\n  margin-left: 0;\n}\n.table td.span11,\n.table th.span11 {\n  float: none;\n  width: 844px;\n  margin-left: 0;\n}\n.table td.span12,\n.table th.span12 {\n  float: none;\n  width: 924px;\n  margin-left: 0;\n}\n.table tbody tr.success td {\n  background-color: #dff0d8;\n}\n.table tbody tr.error td {\n  background-color: #f2dede;\n}\n.table tbody tr.warning td {\n  background-color: #fcf8e3;\n}\n.table tbody tr.info td {\n  background-color: #d9edf7;\n}\n.table-hover tbody tr.success:hover td {\n  background-color: #d0e9c6;\n}\n.table-hover tbody tr.error:hover td {\n  background-color: #ebcccc;\n}\n.table-hover tbody tr.warning:hover td {\n  background-color: #faf2cc;\n}\n.table-hover tbody tr.info:hover td {\n  background-color: #c4e3f3;\n}\n/*  Font Awesome 3.0\n    the iconic font designed for use with Twitter Bootstrap\n    -------------------------------------------------------\n    The full suite of pictographic icons, examples, and documentation\n    can be found at: http://fortawesome.github.com/Font-Awesome/\n\n    License\n    -------------------------------------------------------\n    • The Font Awesome font is licensed under the SIL Open Font License - http://scripts.sil.org/OFL\n    • Font Awesome CSS, LESS, and SASS files are licensed under the MIT License -\n      http://opensource.org/licenses/mit-license.html\n    • The Font Awesome pictograms are licensed under the CC BY 3.0 License - http://creativecommons.org/licenses/by/3.0/\n    • Attribution is no longer required in Font Awesome 3.0, but much appreciated:\n      \"Font Awesome by Dave Gandy - http://fortawesome.github.com/Font-Awesome\"\n\n    Contact\n    -------------------------------------------------------\n    Email: dave@davegandy.com\n    Twitter: http://twitter.com/fortaweso_me\n    Work: Lead Product Designer @ http://kyruus.com\n\n    */\n@font-face {\n  font-family: 'FontAwesome';\n  src: url('font/fontawesome-webfont.eot');\n  src: url('font/fontawesome-webfont.eot?#iefix') format('embedded-opentype'), url('font/fontawesome-webfont.woff') format('woff'), url('font/fontawesome-webfont.ttf') format('truetype');\n  font-weight: normal;\n  font-style: normal;\n}\n/*  Font Awesome styles\n    ------------------------------------------------------- */\n/* includes sprites.less reset */\n[class^=\"icon-\"],\n[class*=\" icon-\"] {\n  font-family: FontAwesome;\n  font-weight: normal;\n  font-style: normal;\n  text-decoration: inherit;\n  display: inline;\n  width: auto;\n  height: auto;\n  line-height: normal;\n  vertical-align: baseline;\n  background-image: none !important;\n  background-position: 0% 0%;\n  background-repeat: repeat;\n}\n[class^=\"icon-\"]:before,\n[class*=\" icon-\"]:before {\n  text-decoration: inherit;\n  display: inline-block;\n  speak: none;\n}\n/* makes sure icons active on rollover in links */\na [class^=\"icon-\"],\na [class*=\" icon-\"] {\n  display: inline-block;\n}\n/* makes the font 33% larger relative to the icon container */\n.icon-large:before {\n  vertical-align: -10%;\n  font-size: 1.3333333333333333em;\n}\n.btn [class^=\"icon-\"],\n.nav [class^=\"icon-\"],\n.btn [class*=\" icon-\"],\n.nav [class*=\" icon-\"] {\n  display: inline;\n  /* keeps button heights with and without icons the same */\n\n  line-height: .6em;\n}\n.btn [class^=\"icon-\"].icon-spin,\n.nav [class^=\"icon-\"].icon-spin,\n.btn [class*=\" icon-\"].icon-spin,\n.nav [class*=\" icon-\"].icon-spin {\n  display: inline-block;\n}\nli [class^=\"icon-\"],\nli [class*=\" icon-\"] {\n  display: inline-block;\n  width: 1.25em;\n  text-align: center;\n}\nli [class^=\"icon-\"].icon-large,\nli [class*=\" icon-\"].icon-large {\n  /* increased font size for icon-large */\n\n  width: 1.5625em;\n}\nul.icons {\n  list-style-type: none;\n  text-indent: -0.75em;\n}\nul.icons li [class^=\"icon-\"],\nul.icons li [class*=\" icon-\"] {\n  width: .75em;\n}\n.icon-muted {\n  color: #eeeeee;\n}\n.icon-border {\n  border: solid 1px #eeeeee;\n  padding: .2em .25em .15em;\n  -webkit-border-radius: 3px;\n  -moz-border-radius: 3px;\n  border-radius: 3px;\n}\n.icon-2x {\n  font-size: 2em;\n}\n.icon-2x.icon-border {\n  border-width: 2px;\n  -webkit-border-radius: 4px;\n  -moz-border-radius: 4px;\n  border-radius: 4px;\n}\n.icon-3x {\n  font-size: 3em;\n}\n.icon-3x.icon-border {\n  border-width: 3px;\n  -webkit-border-radius: 5px;\n  -moz-border-radius: 5px;\n  border-radius: 5px;\n}\n.icon-4x {\n  font-size: 4em;\n}\n.icon-4x.icon-border {\n  border-width: 4px;\n  -webkit-border-radius: 6px;\n  -moz-border-radius: 6px;\n  border-radius: 6px;\n}\n.pull-right {\n  float: right;\n}\n.pull-left {\n  float: left;\n}\n[class^=\"icon-\"].pull-left,\n[class*=\" icon-\"].pull-left {\n  margin-right: .35em;\n}\n[class^=\"icon-\"].pull-right,\n[class*=\" icon-\"].pull-right {\n  margin-left: .35em;\n}\n.btn [class^=\"icon-\"].pull-left.icon-2x,\n.btn [class*=\" icon-\"].pull-left.icon-2x,\n.btn [class^=\"icon-\"].pull-right.icon-2x,\n.btn [class*=\" icon-\"].pull-right.icon-2x {\n  margin-top: .35em;\n}\n.btn [class^=\"icon-\"].icon-spin.icon-large,\n.btn [class*=\" icon-\"].icon-spin.icon-large {\n  height: .75em;\n}\n.btn.btn-small [class^=\"icon-\"].pull-left.icon-2x,\n.btn.btn-small [class*=\" icon-\"].pull-left.icon-2x,\n.btn.btn-small [class^=\"icon-\"].pull-right.icon-2x,\n.btn.btn-small [class*=\" icon-\"].pull-right.icon-2x {\n  margin-top: .45em;\n}\n.btn.btn-large [class^=\"icon-\"].pull-left.icon-2x,\n.btn.btn-large [class*=\" icon-\"].pull-left.icon-2x,\n.btn.btn-large [class^=\"icon-\"].pull-right.icon-2x,\n.btn.btn-large [class*=\" icon-\"].pull-right.icon-2x {\n  margin-top: .2em;\n}\n.icon-spin {\n  display: inline-block;\n  -moz-animation: spin 2s infinite linear;\n  -o-animation: spin 2s infinite linear;\n  -webkit-animation: spin 2s infinite linear;\n  animation: spin 2s infinite linear;\n}\n@-moz-keyframes spin {\n  0% {\n    -moz-transform: rotate(0deg);\n  }\n  100% {\n    -moz-transform: rotate(359deg);\n  }\n}\n@-webkit-keyframes spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n  }\n}\n@-o-keyframes spin {\n  0% {\n    -o-transform: rotate(0deg);\n  }\n  100% {\n    -o-transform: rotate(359deg);\n  }\n}\n@-ms-keyframes spin {\n  0% {\n    -ms-transform: rotate(0deg);\n  }\n  100% {\n    -ms-transform: rotate(359deg);\n  }\n}\n@keyframes spin {\n  0% {\n    transform: rotate(0deg);\n  }\n  100% {\n    transform: rotate(359deg);\n  }\n}\n/*  Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\n    readers do not read off random characters that represent icons */\n.icon-glass:before {\n  content: \"\\f000\";\n}\n.icon-music:before {\n  content: \"\\f001\";\n}\n.icon-search:before {\n  content: \"\\f002\";\n}\n.icon-envelope:before {\n  content: \"\\f003\";\n}\n.icon-heart:before {\n  content: \"\\f004\";\n}\n.icon-star:before {\n  content: \"\\f005\";\n}\n.icon-star-empty:before {\n  content: \"\\f006\";\n}\n.icon-user:before {\n  content: \"\\f007\";\n}\n.icon-film:before {\n  content: \"\\f008\";\n}\n.icon-th-large:before {\n  content: \"\\f009\";\n}\n.icon-th:before {\n  content: \"\\f00a\";\n}\n.icon-th-list:before {\n  content: \"\\f00b\";\n}\n.icon-ok:before {\n  content: \"\\f00c\";\n}\n.icon-remove:before {\n  content: \"\\f00d\";\n}\n.icon-zoom-in:before {\n  content: \"\\f00e\";\n}\n.icon-zoom-out:before {\n  content: \"\\f010\";\n}\n.icon-off:before {\n  content: \"\\f011\";\n}\n.icon-signal:before {\n  content: \"\\f012\";\n}\n.icon-cog:before {\n  content: \"\\f013\";\n}\n.icon-trash:before {\n  content: \"\\f014\";\n}\n.icon-home:before {\n  content: \"\\f015\";\n}\n.icon-file:before {\n  content: \"\\f016\";\n}\n.icon-time:before {\n  content: \"\\f017\";\n}\n.icon-road:before {\n  content: \"\\f018\";\n}\n.icon-download-alt:before {\n  content: \"\\f019\";\n}\n.icon-download:before {\n  content: \"\\f01a\";\n}\n.icon-upload:before {\n  content: \"\\f01b\";\n}\n.icon-inbox:before {\n  content: \"\\f01c\";\n}\n.icon-play-circle:before {\n  content: \"\\f01d\";\n}\n.icon-repeat:before {\n  content: \"\\f01e\";\n}\n/* \\f020 doesn't work in Safari. all shifted one down */\n.icon-refresh:before {\n  content: \"\\f021\";\n}\n.icon-list-alt:before {\n  content: \"\\f022\";\n}\n.icon-lock:before {\n  content: \"\\f023\";\n}\n.icon-flag:before {\n  content: \"\\f024\";\n}\n.icon-headphones:before {\n  content: \"\\f025\";\n}\n.icon-volume-off:before {\n  content: \"\\f026\";\n}\n.icon-volume-down:before {\n  content: \"\\f027\";\n}\n.icon-volume-up:before {\n  content: \"\\f028\";\n}\n.icon-qrcode:before {\n  content: \"\\f029\";\n}\n.icon-barcode:before {\n  content: \"\\f02a\";\n}\n.icon-tag:before {\n  content: \"\\f02b\";\n}\n.icon-tags:before {\n  content: \"\\f02c\";\n}\n.icon-book:before {\n  content: \"\\f02d\";\n}\n.icon-bookmark:before {\n  content: \"\\f02e\";\n}\n.icon-print:before {\n  content: \"\\f02f\";\n}\n.icon-camera:before {\n  content: \"\\f030\";\n}\n.icon-font:before {\n  content: \"\\f031\";\n}\n.icon-bold:before {\n  content: \"\\f032\";\n}\n.icon-italic:before {\n  content: \"\\f033\";\n}\n.icon-text-height:before {\n  content: \"\\f034\";\n}\n.icon-text-width:before {\n  content: \"\\f035\";\n}\n.icon-align-left:before {\n  content: \"\\f036\";\n}\n.icon-align-center:before {\n  content: \"\\f037\";\n}\n.icon-align-right:before {\n  content: \"\\f038\";\n}\n.icon-align-justify:before {\n  content: \"\\f039\";\n}\n.icon-list:before {\n  content: \"\\f03a\";\n}\n.icon-indent-left:before {\n  content: \"\\f03b\";\n}\n.icon-indent-right:before {\n  content: \"\\f03c\";\n}\n.icon-facetime-video:before {\n  content: \"\\f03d\";\n}\n.icon-picture:before {\n  content: \"\\f03e\";\n}\n.icon-pencil:before {\n  content: \"\\f040\";\n}\n.icon-map-marker:before {\n  content: \"\\f041\";\n}\n.icon-adjust:before {\n  content: \"\\f042\";\n}\n.icon-tint:before {\n  content: \"\\f043\";\n}\n.icon-edit:before {\n  content: \"\\f044\";\n}\n.icon-share:before {\n  content: \"\\f045\";\n}\n.icon-check:before {\n  content: \"\\f046\";\n}\n.icon-move:before {\n  content: \"\\f047\";\n}\n.icon-step-backward:before {\n  content: \"\\f048\";\n}\n.icon-fast-backward:before {\n  content: \"\\f049\";\n}\n.icon-backward:before {\n  content: \"\\f04a\";\n}\n.icon-play:before {\n  content: \"\\f04b\";\n}\n.icon-pause:before {\n  content: \"\\f04c\";\n}\n.icon-stop:before {\n  content: \"\\f04d\";\n}\n.icon-forward:before {\n  content: \"\\f04e\";\n}\n.icon-fast-forward:before {\n  content: \"\\f050\";\n}\n.icon-step-forward:before {\n  content: \"\\f051\";\n}\n.icon-eject:before {\n  content: \"\\f052\";\n}\n.icon-chevron-left:before {\n  content: \"\\f053\";\n}\n.icon-chevron-right:before {\n  content: \"\\f054\";\n}\n.icon-plus-sign:before {\n  content: \"\\f055\";\n}\n.icon-minus-sign:before {\n  content: \"\\f056\";\n}\n.icon-remove-sign:before {\n  content: \"\\f057\";\n}\n.icon-ok-sign:before {\n  content: \"\\f058\";\n}\n.icon-question-sign:before {\n  content: \"\\f059\";\n}\n.icon-info-sign:before {\n  content: \"\\f05a\";\n}\n.icon-screenshot:before {\n  content: \"\\f05b\";\n}\n.icon-remove-circle:before {\n  content: \"\\f05c\";\n}\n.icon-ok-circle:before {\n  content: \"\\f05d\";\n}\n.icon-ban-circle:before {\n  content: \"\\f05e\";\n}\n.icon-arrow-left:before {\n  content: \"\\f060\";\n}\n.icon-arrow-right:before {\n  content: \"\\f061\";\n}\n.icon-arrow-up:before {\n  content: \"\\f062\";\n}\n.icon-arrow-down:before {\n  content: \"\\f063\";\n}\n.icon-share-alt:before {\n  content: \"\\f064\";\n}\n.icon-resize-full:before {\n  content: \"\\f065\";\n}\n.icon-resize-small:before {\n  content: \"\\f066\";\n}\n.icon-plus:before {\n  content: \"\\f067\";\n}\n.icon-minus:before {\n  content: \"\\f068\";\n}\n.icon-asterisk:before {\n  content: \"\\f069\";\n}\n.icon-exclamation-sign:before {\n  content: \"\\f06a\";\n}\n.icon-gift:before {\n  content: \"\\f06b\";\n}\n.icon-leaf:before {\n  content: \"\\f06c\";\n}\n.icon-fire:before {\n  content: \"\\f06d\";\n}\n.icon-eye-open:before {\n  content: \"\\f06e\";\n}\n.icon-eye-close:before {\n  content: \"\\f070\";\n}\n.icon-warning-sign:before {\n  content: \"\\f071\";\n}\n.icon-plane:before {\n  content: \"\\f072\";\n}\n.icon-calendar:before {\n  content: \"\\f073\";\n}\n.icon-random:before {\n  content: \"\\f074\";\n}\n.icon-comment:before {\n  content: \"\\f075\";\n}\n.icon-magnet:before {\n  content: \"\\f076\";\n}\n.icon-chevron-up:before {\n  content: \"\\f077\";\n}\n.icon-chevron-down:before {\n  content: \"\\f078\";\n}\n.icon-retweet:before {\n  content: \"\\f079\";\n}\n.icon-shopping-cart:before {\n  content: \"\\f07a\";\n}\n.icon-folder-close:before {\n  content: \"\\f07b\";\n}\n.icon-folder-open:before {\n  content: \"\\f07c\";\n}\n.icon-resize-vertical:before {\n  content: \"\\f07d\";\n}\n.icon-resize-horizontal:before {\n  content: \"\\f07e\";\n}\n.icon-bar-chart:before {\n  content: \"\\f080\";\n}\n.icon-twitter-sign:before {\n  content: \"\\f081\";\n}\n.icon-facebook-sign:before {\n  content: \"\\f082\";\n}\n.icon-camera-retro:before {\n  content: \"\\f083\";\n}\n.icon-key:before {\n  content: \"\\f084\";\n}\n.icon-cogs:before {\n  content: \"\\f085\";\n}\n.icon-comments:before {\n  content: \"\\f086\";\n}\n.icon-thumbs-up:before {\n  content: \"\\f087\";\n}\n.icon-thumbs-down:before {\n  content: \"\\f088\";\n}\n.icon-star-half:before {\n  content: \"\\f089\";\n}\n.icon-heart-empty:before {\n  content: \"\\f08a\";\n}\n.icon-signout:before {\n  content: \"\\f08b\";\n}\n.icon-linkedin-sign:before {\n  content: \"\\f08c\";\n}\n.icon-pushpin:before {\n  content: \"\\f08d\";\n}\n.icon-external-link:before {\n  content: \"\\f08e\";\n}\n.icon-signin:before {\n  content: \"\\f090\";\n}\n.icon-trophy:before {\n  content: \"\\f091\";\n}\n.icon-github-sign:before {\n  content: \"\\f092\";\n}\n.icon-upload-alt:before {\n  content: \"\\f093\";\n}\n.icon-lemon:before {\n  content: \"\\f094\";\n}\n.icon-phone:before {\n  content: \"\\f095\";\n}\n.icon-check-empty:before {\n  content: \"\\f096\";\n}\n.icon-bookmark-empty:before {\n  content: \"\\f097\";\n}\n.icon-phone-sign:before {\n  content: \"\\f098\";\n}\n.icon-twitter:before {\n  content: \"\\f099\";\n}\n.icon-facebook:before {\n  content: \"\\f09a\";\n}\n.icon-github:before {\n  content: \"\\f09b\";\n}\n.icon-unlock:before {\n  content: \"\\f09c\";\n}\n.icon-credit-card:before {\n  content: \"\\f09d\";\n}\n.icon-rss:before {\n  content: \"\\f09e\";\n}\n.icon-hdd:before {\n  content: \"\\f0a0\";\n}\n.icon-bullhorn:before {\n  content: \"\\f0a1\";\n}\n.icon-bell:before {\n  content: \"\\f0a2\";\n}\n.icon-certificate:before {\n  content: \"\\f0a3\";\n}\n.icon-hand-right:before {\n  content: \"\\f0a4\";\n}\n.icon-hand-left:before {\n  content: \"\\f0a5\";\n}\n.icon-hand-up:before {\n  content: \"\\f0a6\";\n}\n.icon-hand-down:before {\n  content: \"\\f0a7\";\n}\n.icon-circle-arrow-left:before {\n  content: \"\\f0a8\";\n}\n.icon-circle-arrow-right:before {\n  content: \"\\f0a9\";\n}\n.icon-circle-arrow-up:before {\n  content: \"\\f0aa\";\n}\n.icon-circle-arrow-down:before {\n  content: \"\\f0ab\";\n}\n.icon-globe:before {\n  content: \"\\f0ac\";\n}\n.icon-wrench:before {\n  content: \"\\f0ad\";\n}\n.icon-tasks:before {\n  content: \"\\f0ae\";\n}\n.icon-filter:before {\n  content: \"\\f0b0\";\n}\n.icon-briefcase:before {\n  content: \"\\f0b1\";\n}\n.icon-fullscreen:before {\n  content: \"\\f0b2\";\n}\n.icon-group:before {\n  content: \"\\f0c0\";\n}\n.icon-link:before {\n  content: \"\\f0c1\";\n}\n.icon-cloud:before {\n  content: \"\\f0c2\";\n}\n.icon-beaker:before {\n  content: \"\\f0c3\";\n}\n.icon-cut:before {\n  content: \"\\f0c4\";\n}\n.icon-copy:before {\n  content: \"\\f0c5\";\n}\n.icon-paper-clip:before {\n  content: \"\\f0c6\";\n}\n.icon-save:before {\n  content: \"\\f0c7\";\n}\n.icon-sign-blank:before {\n  content: \"\\f0c8\";\n}\n.icon-reorder:before {\n  content: \"\\f0c9\";\n}\n.icon-list-ul:before {\n  content: \"\\f0ca\";\n}\n.icon-list-ol:before {\n  content: \"\\f0cb\";\n}\n.icon-strikethrough:before {\n  content: \"\\f0cc\";\n}\n.icon-underline:before {\n  content: \"\\f0cd\";\n}\n.icon-table:before {\n  content: \"\\f0ce\";\n}\n.icon-magic:before {\n  content: \"\\f0d0\";\n}\n.icon-truck:before {\n  content: \"\\f0d1\";\n}\n.icon-pinterest:before {\n  content: \"\\f0d2\";\n}\n.icon-pinterest-sign:before {\n  content: \"\\f0d3\";\n}\n.icon-google-plus-sign:before {\n  content: \"\\f0d4\";\n}\n.icon-google-plus:before {\n  content: \"\\f0d5\";\n}\n.icon-money:before {\n  content: \"\\f0d6\";\n}\n.icon-caret-down:before {\n  content: \"\\f0d7\";\n}\n.icon-caret-up:before {\n  content: \"\\f0d8\";\n}\n.icon-caret-left:before {\n  content: \"\\f0d9\";\n}\n.icon-caret-right:before {\n  content: \"\\f0da\";\n}\n.icon-columns:before {\n  content: \"\\f0db\";\n}\n.icon-sort:before {\n  content: \"\\f0dc\";\n}\n.icon-sort-down:before {\n  content: \"\\f0dd\";\n}\n.icon-sort-up:before {\n  content: \"\\f0de\";\n}\n.icon-envelope-alt:before {\n  content: \"\\f0e0\";\n}\n.icon-linkedin:before {\n  content: \"\\f0e1\";\n}\n.icon-undo:before {\n  content: \"\\f0e2\";\n}\n.icon-legal:before {\n  content: \"\\f0e3\";\n}\n.icon-dashboard:before {\n  content: \"\\f0e4\";\n}\n.icon-comment-alt:before {\n  content: \"\\f0e5\";\n}\n.icon-comments-alt:before {\n  content: \"\\f0e6\";\n}\n.icon-bolt:before {\n  content: \"\\f0e7\";\n}\n.icon-sitemap:before {\n  content: \"\\f0e8\";\n}\n.icon-umbrella:before {\n  content: \"\\f0e9\";\n}\n.icon-paste:before {\n  content: \"\\f0ea\";\n}\n.icon-lightbulb:before {\n  content: \"\\f0eb\";\n}\n.icon-exchange:before {\n  content: \"\\f0ec\";\n}\n.icon-cloud-download:before {\n  content: \"\\f0ed\";\n}\n.icon-cloud-upload:before {\n  content: \"\\f0ee\";\n}\n.icon-user-md:before {\n  content: \"\\f0f0\";\n}\n.icon-stethoscope:before {\n  content: \"\\f0f1\";\n}\n.icon-suitcase:before {\n  content: \"\\f0f2\";\n}\n.icon-bell-alt:before {\n  content: \"\\f0f3\";\n}\n.icon-coffee:before {\n  content: \"\\f0f4\";\n}\n.icon-food:before {\n  content: \"\\f0f5\";\n}\n.icon-file-alt:before {\n  content: \"\\f0f6\";\n}\n.icon-building:before {\n  content: \"\\f0f7\";\n}\n.icon-hospital:before {\n  content: \"\\f0f8\";\n}\n.icon-ambulance:before {\n  content: \"\\f0f9\";\n}\n.icon-medkit:before {\n  content: \"\\f0fa\";\n}\n.icon-fighter-jet:before {\n  content: \"\\f0fb\";\n}\n.icon-beer:before {\n  content: \"\\f0fc\";\n}\n.icon-h-sign:before {\n  content: \"\\f0fd\";\n}\n.icon-plus-sign-alt:before {\n  content: \"\\f0fe\";\n}\n.icon-double-angle-left:before {\n  content: \"\\f100\";\n}\n.icon-double-angle-right:before {\n  content: \"\\f101\";\n}\n.icon-double-angle-up:before {\n  content: \"\\f102\";\n}\n.icon-double-angle-down:before {\n  content: \"\\f103\";\n}\n.icon-angle-left:before {\n  content: \"\\f104\";\n}\n.icon-angle-right:before {\n  content: \"\\f105\";\n}\n.icon-angle-up:before {\n  content: \"\\f106\";\n}\n.icon-angle-down:before {\n  content: \"\\f107\";\n}\n.icon-desktop:before {\n  content: \"\\f108\";\n}\n.icon-laptop:before {\n  content: \"\\f109\";\n}\n.icon-tablet:before {\n  content: \"\\f10a\";\n}\n.icon-mobile-phone:before {\n  content: \"\\f10b\";\n}\n.icon-circle-blank:before {\n  content: \"\\f10c\";\n}\n.icon-quote-left:before {\n  content: \"\\f10d\";\n}\n.icon-quote-right:before {\n  content: \"\\f10e\";\n}\n.icon-spinner:before {\n  content: \"\\f110\";\n}\n.icon-circle:before {\n  content: \"\\f111\";\n}\n.icon-reply:before {\n  content: \"\\f112\";\n}\n.icon-github-alt:before {\n  content: \"\\f113\";\n}\n.icon-folder-close-alt:before {\n  content: \"\\f114\";\n}\n.icon-folder-open-alt:before {\n  content: \"\\f115\";\n}\n.dropup,\n.dropdown {\n  position: relative;\n}\n.dropdown-toggle {\n  *margin-bottom: -3px;\n}\n.dropdown-toggle:active,\n.open .dropdown-toggle {\n  outline: 0;\n}\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  vertical-align: top;\n  border-top: 4px solid #000000;\n  border-right: 4px solid transparent;\n  border-left: 4px solid transparent;\n  content: \"\";\n}\n.dropdown .caret {\n  margin-top: 8px;\n  margin-left: 2px;\n}\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0;\n  list-style: none;\n  background-color: #ffffff;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  *border-right-width: 2px;\n  *border-bottom-width: 2px;\n  -webkit-border-radius: 6px;\n  -moz-border-radius: 6px;\n  border-radius: 6px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  -webkit-background-clip: padding-box;\n  -moz-background-clip: padding;\n  background-clip: padding-box;\n}\n.dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n.dropdown-menu .divider {\n  *width: 100%;\n  height: 1px;\n  margin: 9px 1px;\n  *margin: -5px 0 5px;\n  overflow: hidden;\n  background-color: #e5e5e5;\n  border-bottom: 1px solid #ffffff;\n}\n.dropdown-menu li > a {\n  display: block;\n  padding: 3px 20px;\n  clear: both;\n  font-weight: normal;\n  line-height: 20px;\n  color: #242424;\n  white-space: nowrap;\n}\n.dropdown-menu li > a:hover,\n.dropdown-menu li > a:focus,\n.dropdown-submenu:hover > a {\n  text-decoration: none;\n  color: #ffffff;\n  background-color: rgba(31, 31, 31, 0.8);\n  background-image: -moz-linear-gradient(top, rgba(36, 36, 36, 0.8), rgba(23, 23, 23, 0.8));\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(rgba(36, 36, 36, 0.8)), to(rgba(23, 23, 23, 0.8)));\n  background-image: -webkit-linear-gradient(top, rgba(36, 36, 36, 0.8), rgba(23, 23, 23, 0.8));\n  background-image: -o-linear-gradient(top, rgba(36, 36, 36, 0.8), rgba(23, 23, 23, 0.8));\n  background-image: linear-gradient(to bottom, rgba(36, 36, 36, 0.8), rgba(23, 23, 23, 0.8));\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#cc242424', endColorstr='#cc171717', GradientType=0);\n}\n.dropdown-menu .active > a,\n.dropdown-menu .active > a:hover {\n  color: #242424;\n  text-decoration: none;\n  outline: 0;\n  background-color: rgba(31, 31, 31, 0.8);\n  background-image: -moz-linear-gradient(top, rgba(36, 36, 36, 0.8), rgba(23, 23, 23, 0.8));\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(rgba(36, 36, 36, 0.8)), to(rgba(23, 23, 23, 0.8)));\n  background-image: -webkit-linear-gradient(top, rgba(36, 36, 36, 0.8), rgba(23, 23, 23, 0.8));\n  background-image: -o-linear-gradient(top, rgba(36, 36, 36, 0.8), rgba(23, 23, 23, 0.8));\n  background-image: linear-gradient(to bottom, rgba(36, 36, 36, 0.8), rgba(23, 23, 23, 0.8));\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#cc242424', endColorstr='#cc171717', GradientType=0);\n}\n.dropdown-menu .disabled > a,\n.dropdown-menu .disabled > a:hover {\n  color: rgba(36, 36, 36, 0.8);\n}\n.dropdown-menu .disabled > a:hover {\n  text-decoration: none;\n  background-color: transparent;\n  background-image: none;\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  cursor: default;\n}\n.open {\n  *z-index: 1000;\n}\n.open > .dropdown-menu {\n  display: block;\n}\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n  border-top: 0;\n  border-bottom: 4px solid #000000;\n  content: \"\";\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-bottom: 1px;\n}\n.dropdown-submenu {\n  position: relative;\n}\n.dropdown-submenu > .dropdown-menu {\n  top: 0;\n  left: 100%;\n  margin-top: -6px;\n  margin-left: -1px;\n  -webkit-border-radius: 0 6px 6px 6px;\n  -moz-border-radius: 0 6px 6px 6px;\n  border-radius: 0 6px 6px 6px;\n}\n.dropdown-submenu:hover > .dropdown-menu {\n  display: block;\n}\n.dropup .dropdown-submenu > .dropdown-menu {\n  top: auto;\n  bottom: 0;\n  margin-top: 0;\n  margin-bottom: -2px;\n  -webkit-border-radius: 5px 5px 5px 0;\n  -moz-border-radius: 5px 5px 5px 0;\n  border-radius: 5px 5px 5px 0;\n}\n.dropdown-submenu > a:after {\n  display: block;\n  content: \" \";\n  float: right;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n  border-width: 5px 0 5px 5px;\n  border-left-color: #cccccc;\n  margin-top: 5px;\n  margin-right: -10px;\n}\n.dropdown-submenu:hover > a:after {\n  border-left-color: #ffffff;\n}\n.dropdown-submenu.pull-left {\n  float: none;\n}\n.dropdown-submenu.pull-left > .dropdown-menu {\n  left: -100%;\n  margin-left: 10px;\n  -webkit-border-radius: 6px 0 6px 6px;\n  -moz-border-radius: 6px 0 6px 6px;\n  border-radius: 6px 0 6px 6px;\n}\n.dropdown .dropdown-menu .nav-header {\n  padding-left: 20px;\n  padding-right: 20px;\n}\n.typeahead {\n  z-index: 1051;\n  margin-top: 2px;\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n}\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: #eeeeee;\n  border: 1px solid #dcdcdc;\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n  border-color: #ddd;\n  border-color: rgba(0, 0, 0, 0.15);\n}\n.well-large {\n  padding: 24px;\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n}\n.well-small {\n  padding: 9px;\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n}\n.fade {\n  opacity: 0;\n  -webkit-transition: opacity 0.15s linear;\n  -moz-transition: opacity 0.15s linear;\n  -o-transition: opacity 0.15s linear;\n  transition: opacity 0.15s linear;\n}\n.fade.in {\n  opacity: 1;\n}\n.collapse {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  -webkit-transition: height 0.35s ease;\n  -moz-transition: height 0.35s ease;\n  -o-transition: height 0.35s ease;\n  transition: height 0.35s ease;\n}\n.collapse.in {\n  height: auto;\n}\n.close {\n  float: right;\n  font-size: 20px;\n  font-weight: bold;\n  line-height: 20px;\n  color: #000000;\n  text-shadow: 0 1px 0 #ffffff;\n  opacity: 0.2;\n  filter: alpha(opacity=20);\n}\n.close:hover {\n  color: #000000;\n  text-decoration: none;\n  cursor: pointer;\n  opacity: 0.4;\n  filter: alpha(opacity=40);\n}\nbutton.close {\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n  -webkit-appearance: none;\n}\n.btn {\n  display: inline-block;\n  *display: inline;\n  /* IE7 inline-block hack */\n\n  *zoom: 1;\n  padding: 4px 12px;\n  margin-bottom: 0;\n  font-size: 14px;\n  line-height: 20px;\n  text-align: center;\n  vertical-align: middle;\n  cursor: pointer;\n  color: #333333;\n  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);\n  background-color: #f5f5f5;\n  background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));\n  background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);\n  border-color: #e6e6e6 #e6e6e6 #bfbfbf;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #e6e6e6;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  border: 1px solid #bbbbbb;\n  *border: 0;\n  border-bottom-color: #a2a2a2;\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n  *margin-left: .3em;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);\n  -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);\n  box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);\n}\n.btn:hover,\n.btn:active,\n.btn.active,\n.btn.disabled,\n.btn[disabled] {\n  color: #333333;\n  background-color: #e6e6e6;\n  *background-color: #d9d9d9;\n}\n.btn:active,\n.btn.active {\n  background-color: #cccccc \\9;\n}\n.btn:first-child {\n  *margin-left: 0;\n}\n.btn:hover {\n  color: #333333;\n  text-decoration: none;\n  background-position: 0 -15px;\n  -webkit-transition: background-position 0.1s linear;\n  -moz-transition: background-position 0.1s linear;\n  -o-transition: background-position 0.1s linear;\n  transition: background-position 0.1s linear;\n}\n.btn:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n.btn.active,\n.btn:active {\n  background-image: none;\n  outline: 0;\n  -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);\n  -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);\n  box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);\n}\n.btn.disabled,\n.btn[disabled] {\n  cursor: default;\n  background-image: none;\n  opacity: 0.65;\n  filter: alpha(opacity=65);\n  -webkit-box-shadow: none;\n  -moz-box-shadow: none;\n  box-shadow: none;\n}\n.btn-large {\n  padding: 11px 19px;\n  font-size: 17.5px;\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n}\n.btn-large [class^=\"icon-\"],\n.btn-large [class*=\" icon-\"] {\n  margin-top: 4px;\n}\n.btn-small {\n  padding: 2px 10px;\n  font-size: 11.9px;\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n}\n.btn-small [class^=\"icon-\"],\n.btn-small [class*=\" icon-\"] {\n  margin-top: 0;\n}\n.btn-mini [class^=\"icon-\"],\n.btn-mini [class*=\" icon-\"] {\n  margin-top: -1px;\n}\n.btn-mini {\n  padding: 1px 6px;\n  font-size: 10.5px;\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n}\n.btn-block {\n  display: block;\n  width: 100%;\n  padding-left: 0;\n  padding-right: 0;\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n.btn-primary.active,\n.btn-warning.active,\n.btn-danger.active,\n.btn-success.active,\n.btn-info.active,\n.btn-inverse.active {\n  color: rgba(255, 255, 255, 0.75);\n}\n.btn {\n  border-color: #c5c5c5;\n  border-color: rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25);\n}\n.btn-primary {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #4e998e;\n  background-image: -moz-linear-gradient(top, #55a79a, #44857b);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#55a79a), to(#44857b));\n  background-image: -webkit-linear-gradient(top, #55a79a, #44857b);\n  background-image: -o-linear-gradient(top, #55a79a, #44857b);\n  background-image: linear-gradient(to bottom, #55a79a, #44857b);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff55a79a', endColorstr='#ff44857b', GradientType=0);\n  border-color: #44857b #44857b #2a534c;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #44857b;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.btn-primary:hover,\n.btn-primary:active,\n.btn-primary.active,\n.btn-primary.disabled,\n.btn-primary[disabled] {\n  color: #ffffff;\n  background-color: #44857b;\n  *background-color: #3b746b;\n}\n.btn-primary:active,\n.btn-primary.active {\n  background-color: #33635c \\9;\n}\n.btn-warning {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #faa732;\n  background-image: -moz-linear-gradient(top, #fbb450, #f89406);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));\n  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);\n  background-image: -o-linear-gradient(top, #fbb450, #f89406);\n  background-image: linear-gradient(to bottom, #fbb450, #f89406);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);\n  border-color: #f89406 #f89406 #ad6704;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #f89406;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.btn-warning:hover,\n.btn-warning:active,\n.btn-warning.active,\n.btn-warning.disabled,\n.btn-warning[disabled] {\n  color: #ffffff;\n  background-color: #f89406;\n  *background-color: #df8505;\n}\n.btn-warning:active,\n.btn-warning.active {\n  background-color: #c67605 \\9;\n}\n.btn-danger {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #da4f49;\n  background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));\n  background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f);\n  background-image: -o-linear-gradient(top, #ee5f5b, #bd362f);\n  background-image: linear-gradient(to bottom, #ee5f5b, #bd362f);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);\n  border-color: #bd362f #bd362f #802420;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #bd362f;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.btn-danger:hover,\n.btn-danger:active,\n.btn-danger.active,\n.btn-danger.disabled,\n.btn-danger[disabled] {\n  color: #ffffff;\n  background-color: #bd362f;\n  *background-color: #a9302a;\n}\n.btn-danger:active,\n.btn-danger.active {\n  background-color: #942a25 \\9;\n}\n.btn-success {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #318b20;\n  background-image: -moz-linear-gradient(top, #1b7b00, #51a351);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#1b7b00), to(#51a351));\n  background-image: -webkit-linear-gradient(top, #1b7b00, #51a351);\n  background-image: -o-linear-gradient(top, #1b7b00, #51a351);\n  background-image: linear-gradient(to bottom, #1b7b00, #51a351);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff1b7b00', endColorstr='#ff51a351', GradientType=0);\n  border-color: #51a351 #51a351 #387038;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #51a351;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.btn-success:hover,\n.btn-success:active,\n.btn-success.active,\n.btn-success.disabled,\n.btn-success[disabled] {\n  color: #ffffff;\n  background-color: #51a351;\n  *background-color: #499249;\n}\n.btn-success:active,\n.btn-success.active {\n  background-color: #408140 \\9;\n}\n.btn-info {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #49afcd;\n  background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));\n  background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4);\n  background-image: -o-linear-gradient(top, #5bc0de, #2f96b4);\n  background-image: linear-gradient(to bottom, #5bc0de, #2f96b4);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);\n  border-color: #2f96b4 #2f96b4 #1f6377;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #2f96b4;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.btn-info:hover,\n.btn-info:active,\n.btn-info.active,\n.btn-info.disabled,\n.btn-info[disabled] {\n  color: #ffffff;\n  background-color: #2f96b4;\n  *background-color: #2a85a0;\n}\n.btn-info:active,\n.btn-info.active {\n  background-color: #24748c \\9;\n}\n.btn-inverse {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #161616;\n  background-image: -moz-linear-gradient(top, #242424, #000000);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#242424), to(#000000));\n  background-image: -webkit-linear-gradient(top, #242424, #000000);\n  background-image: -o-linear-gradient(top, #242424, #000000);\n  background-image: linear-gradient(to bottom, #242424, #000000);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff242424', endColorstr='#ff000000', GradientType=0);\n  border-color: #000000 #000000 #000000;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #000000;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.btn-inverse:hover,\n.btn-inverse:active,\n.btn-inverse.active,\n.btn-inverse.disabled,\n.btn-inverse[disabled] {\n  color: #ffffff;\n  background-color: #000000;\n  *background-color: #000000;\n}\n.btn-inverse:active,\n.btn-inverse.active {\n  background-color: #000000 \\9;\n}\nbutton.btn,\ninput[type=\"submit\"].btn {\n  *padding-top: 3px;\n  *padding-bottom: 3px;\n}\nbutton.btn::-moz-focus-inner,\ninput[type=\"submit\"].btn::-moz-focus-inner {\n  padding: 0;\n  border: 0;\n}\nbutton.btn.btn-large,\ninput[type=\"submit\"].btn.btn-large {\n  *padding-top: 7px;\n  *padding-bottom: 7px;\n}\nbutton.btn.btn-small,\ninput[type=\"submit\"].btn.btn-small {\n  *padding-top: 3px;\n  *padding-bottom: 3px;\n}\nbutton.btn.btn-mini,\ninput[type=\"submit\"].btn.btn-mini {\n  *padding-top: 1px;\n  *padding-bottom: 1px;\n}\n.btn-link,\n.btn-link:active,\n.btn-link[disabled] {\n  background-color: transparent;\n  background-image: none;\n  -webkit-box-shadow: none;\n  -moz-box-shadow: none;\n  box-shadow: none;\n}\n.btn-link {\n  border-color: transparent;\n  cursor: pointer;\n  color: #55a79a;\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n}\n.btn-link:hover {\n  color: #44857b;\n  text-decoration: underline;\n  background-color: transparent;\n}\n.btn-link[disabled]:hover {\n  color: #333333;\n  text-decoration: none;\n}\n.btn-group {\n  position: relative;\n  display: inline-block;\n  *display: inline;\n  /* IE7 inline-block hack */\n\n  *zoom: 1;\n  font-size: 0;\n  vertical-align: middle;\n  white-space: nowrap;\n  *margin-left: .3em;\n}\n.btn-group:first-child {\n  *margin-left: 0;\n}\n.btn-group + .btn-group {\n  margin-left: 5px;\n}\n.btn-toolbar {\n  font-size: 0;\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.btn-toolbar > .btn + .btn,\n.btn-toolbar > .btn-group + .btn,\n.btn-toolbar > .btn + .btn-group {\n  margin-left: 5px;\n}\n.btn-group > .btn {\n  position: relative;\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n}\n.btn-group > .btn + .btn {\n  margin-left: -1px;\n}\n.btn-group > .btn,\n.btn-group > .dropdown-menu,\n.btn-group > .popover {\n  font-size: 14px;\n}\n.btn-group > .btn-mini {\n  font-size: 10.5px;\n}\n.btn-group > .btn-small {\n  font-size: 11.9px;\n}\n.btn-group > .btn-large {\n  font-size: 17.5px;\n}\n.btn-group > .btn:first-child {\n  margin-left: 0;\n  -webkit-border-top-left-radius: 2px;\n  -moz-border-radius-topleft: 2px;\n  border-top-left-radius: 2px;\n  -webkit-border-bottom-left-radius: 2px;\n  -moz-border-radius-bottomleft: 2px;\n  border-bottom-left-radius: 2px;\n}\n.btn-group > .btn:last-child,\n.btn-group > .dropdown-toggle {\n  -webkit-border-top-right-radius: 2px;\n  -moz-border-radius-topright: 2px;\n  border-top-right-radius: 2px;\n  -webkit-border-bottom-right-radius: 2px;\n  -moz-border-radius-bottomright: 2px;\n  border-bottom-right-radius: 2px;\n}\n.btn-group > .btn.large:first-child {\n  margin-left: 0;\n  -webkit-border-top-left-radius: 2px;\n  -moz-border-radius-topleft: 2px;\n  border-top-left-radius: 2px;\n  -webkit-border-bottom-left-radius: 2px;\n  -moz-border-radius-bottomleft: 2px;\n  border-bottom-left-radius: 2px;\n}\n.btn-group > .btn.large:last-child,\n.btn-group > .large.dropdown-toggle {\n  -webkit-border-top-right-radius: 2px;\n  -moz-border-radius-topright: 2px;\n  border-top-right-radius: 2px;\n  -webkit-border-bottom-right-radius: 2px;\n  -moz-border-radius-bottomright: 2px;\n  border-bottom-right-radius: 2px;\n}\n.btn-group > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group > .btn:active,\n.btn-group > .btn.active {\n  z-index: 2;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n  padding-left: 8px;\n  padding-right: 8px;\n  -webkit-box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);\n  -moz-box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);\n  box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);\n  *padding-top: 5px;\n  *padding-bottom: 5px;\n}\n.btn-group > .btn-mini + .dropdown-toggle {\n  padding-left: 5px;\n  padding-right: 5px;\n  *padding-top: 2px;\n  *padding-bottom: 2px;\n}\n.btn-group > .btn-small + .dropdown-toggle {\n  *padding-top: 5px;\n  *padding-bottom: 4px;\n}\n.btn-group > .btn-large + .dropdown-toggle {\n  padding-left: 12px;\n  padding-right: 12px;\n  *padding-top: 7px;\n  *padding-bottom: 7px;\n}\n.btn-group.open .dropdown-toggle {\n  background-image: none;\n  -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);\n  -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);\n  box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);\n}\n.btn-group.open .btn.dropdown-toggle {\n  background-color: #e6e6e6;\n}\n.btn-group.open .btn-primary.dropdown-toggle {\n  background-color: #44857b;\n}\n.btn-group.open .btn-warning.dropdown-toggle {\n  background-color: #f89406;\n}\n.btn-group.open .btn-danger.dropdown-toggle {\n  background-color: #bd362f;\n}\n.btn-group.open .btn-success.dropdown-toggle {\n  background-color: #51a351;\n}\n.btn-group.open .btn-info.dropdown-toggle {\n  background-color: #2f96b4;\n}\n.btn-group.open .btn-inverse.dropdown-toggle {\n  background-color: #000000;\n}\n.btn .caret {\n  margin-top: 8px;\n  margin-left: 0;\n}\n.btn-mini .caret,\n.btn-small .caret,\n.btn-large .caret {\n  margin-top: 6px;\n}\n.btn-large .caret {\n  border-left-width: 5px;\n  border-right-width: 5px;\n  border-top-width: 5px;\n}\n.dropup .btn-large .caret {\n  border-bottom-width: 5px;\n}\n.btn-primary .caret,\n.btn-warning .caret,\n.btn-danger .caret,\n.btn-info .caret,\n.btn-success .caret,\n.btn-inverse .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\n.btn-group-vertical {\n  display: inline-block;\n  *display: inline;\n  /* IE7 inline-block hack */\n\n  *zoom: 1;\n}\n.btn-group-vertical > .btn {\n  display: block;\n  float: none;\n  max-width: 100%;\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n}\n.btn-group-vertical > .btn + .btn {\n  margin-left: 0;\n  margin-top: -1px;\n}\n.btn-group-vertical > .btn:first-child {\n  -webkit-border-radius: 2px 2px 0 0;\n  -moz-border-radius: 2px 2px 0 0;\n  border-radius: 2px 2px 0 0;\n}\n.btn-group-vertical > .btn:last-child {\n  -webkit-border-radius: 0 0 2px 2px;\n  -moz-border-radius: 0 0 2px 2px;\n  border-radius: 0 0 2px 2px;\n}\n.btn-group-vertical > .btn-large:first-child {\n  -webkit-border-radius: 2px 2px 0 0;\n  -moz-border-radius: 2px 2px 0 0;\n  border-radius: 2px 2px 0 0;\n}\n.btn-group-vertical > .btn-large:last-child {\n  -webkit-border-radius: 0 0 2px 2px;\n  -moz-border-radius: 0 0 2px 2px;\n  border-radius: 0 0 2px 2px;\n}\n.alert {\n  padding: 8px 35px 8px 14px;\n  margin-bottom: 20px;\n  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);\n  background-color: #fcf8e3;\n  border: 1px solid #fbeed5;\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n}\n.alert,\n.alert h4 {\n  color: #c09853;\n}\n.alert h4 {\n  margin: 0;\n}\n.alert .close {\n  position: relative;\n  top: -2px;\n  right: -21px;\n  line-height: 20px;\n}\n.alert-success {\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n  color: #468847;\n}\n.alert-success h4 {\n  color: #468847;\n}\n.alert-danger,\n.alert-error {\n  background-color: #f2dede;\n  border-color: #eed3d7;\n  color: #b94a48;\n}\n.alert-danger h4,\n.alert-error h4 {\n  color: #b94a48;\n}\n.alert-info {\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n  color: #3a87ad;\n}\n.alert-info h4 {\n  color: #3a87ad;\n}\n.alert-block {\n  padding-top: 14px;\n  padding-bottom: 14px;\n}\n.alert-block > p,\n.alert-block > ul {\n  margin-bottom: 0;\n}\n.alert-block p + p {\n  margin-top: 5px;\n}\n.nav {\n  margin-left: 0;\n  margin-bottom: 20px;\n  list-style: none;\n}\n.nav > li > a {\n  display: block;\n}\n.nav > li > a:hover {\n  text-decoration: none;\n  background-color: #e6e6e6;\n}\n.nav > li > a > img {\n  max-width: none;\n}\n.nav > .pull-right {\n  float: right;\n}\n.nav-header {\n  display: block;\n  padding: 3px 15px;\n  font-size: 11px;\n  font-weight: bold;\n  line-height: 20px;\n  color: rgba(36, 36, 36, 0.8);\n  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);\n  text-transform: uppercase;\n}\n.nav li + .nav-header {\n  margin-top: 9px;\n}\n.nav-list {\n  padding-left: 15px;\n  padding-right: 15px;\n  margin-bottom: 0;\n}\n.nav-list > li > a,\n.nav-list .nav-header {\n  margin-left: -15px;\n  margin-right: -15px;\n  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);\n}\n.nav-list > li > a {\n  padding: 3px 15px;\n}\n.nav-list > .active > a,\n.nav-list > .active > a:hover {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n  background-color: #55a79a;\n}\n.nav-list [class^=\"icon-\"],\n.nav-list [class*=\" icon-\"] {\n  margin-right: 2px;\n}\n.nav-list .divider {\n  *width: 100%;\n  height: 1px;\n  margin: 9px 1px;\n  *margin: -5px 0 5px;\n  overflow: hidden;\n  background-color: #e5e5e5;\n  border-bottom: 1px solid #ffffff;\n}\n.nav-tabs,\n.nav-pills {\n  *zoom: 1;\n}\n.nav-tabs:before,\n.nav-pills:before,\n.nav-tabs:after,\n.nav-pills:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.nav-tabs:after,\n.nav-pills:after {\n  clear: both;\n}\n.nav-tabs > li,\n.nav-pills > li {\n  float: left;\n}\n.nav-tabs > li > a,\n.nav-pills > li > a {\n  padding-right: 12px;\n  padding-left: 12px;\n  margin-right: 2px;\n  line-height: 14px;\n}\n.nav-tabs {\n  border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n  margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n  padding-top: 8px;\n  padding-bottom: 8px;\n  line-height: 20px;\n  border: 1px solid transparent;\n  -webkit-border-radius: 4px 4px 0 0;\n  -moz-border-radius: 4px 4px 0 0;\n  border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n  border-color: #e6e6e6 #e6e6e6 #dddddd;\n}\n.nav-tabs > .active > a,\n.nav-tabs > .active > a:hover {\n  color: #242424;\n  background-color: #fcfcfc;\n  border: 1px solid #ddd;\n  border-bottom-color: transparent;\n  cursor: default;\n}\n.nav-pills > li > a {\n  padding-top: 8px;\n  padding-bottom: 8px;\n  margin-top: 2px;\n  margin-bottom: 2px;\n  -webkit-border-radius: 5px;\n  -moz-border-radius: 5px;\n  border-radius: 5px;\n}\n.nav-pills > .active > a,\n.nav-pills > .active > a:hover {\n  color: #ffffff;\n  background-color: #55a79a;\n}\n.nav-stacked > li {\n  float: none;\n}\n.nav-stacked > li > a {\n  margin-right: 0;\n}\n.nav-tabs.nav-stacked {\n  border-bottom: 0;\n}\n.nav-tabs.nav-stacked > li > a {\n  border: 1px solid #ddd;\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n}\n.nav-tabs.nav-stacked > li:first-child > a {\n  -webkit-border-top-right-radius: 4px;\n  -moz-border-radius-topright: 4px;\n  border-top-right-radius: 4px;\n  -webkit-border-top-left-radius: 4px;\n  -moz-border-radius-topleft: 4px;\n  border-top-left-radius: 4px;\n}\n.nav-tabs.nav-stacked > li:last-child > a {\n  -webkit-border-bottom-right-radius: 4px;\n  -moz-border-radius-bottomright: 4px;\n  border-bottom-right-radius: 4px;\n  -webkit-border-bottom-left-radius: 4px;\n  -moz-border-radius-bottomleft: 4px;\n  border-bottom-left-radius: 4px;\n}\n.nav-tabs.nav-stacked > li > a:hover {\n  border-color: #ddd;\n  z-index: 2;\n}\n.nav-pills.nav-stacked > li > a {\n  margin-bottom: 3px;\n}\n.nav-pills.nav-stacked > li:last-child > a {\n  margin-bottom: 1px;\n}\n.nav-tabs .dropdown-menu {\n  -webkit-border-radius: 0 0 6px 6px;\n  -moz-border-radius: 0 0 6px 6px;\n  border-radius: 0 0 6px 6px;\n}\n.nav-pills .dropdown-menu {\n  -webkit-border-radius: 6px;\n  -moz-border-radius: 6px;\n  border-radius: 6px;\n}\n.nav .dropdown-toggle .caret {\n  border-top-color: #55a79a;\n  border-bottom-color: #55a79a;\n  margin-top: 6px;\n}\n.nav .dropdown-toggle:hover .caret {\n  border-top-color: #44857b;\n  border-bottom-color: #44857b;\n}\n/* move down carets for tabs */\n.nav-tabs .dropdown-toggle .caret {\n  margin-top: 8px;\n}\n.nav .active .dropdown-toggle .caret {\n  border-top-color: #fff;\n  border-bottom-color: #fff;\n}\n.nav-tabs .active .dropdown-toggle .caret {\n  border-top-color: #242424;\n  border-bottom-color: #242424;\n}\n.nav > .dropdown.active > a:hover {\n  cursor: pointer;\n}\n.nav-tabs .open .dropdown-toggle,\n.nav-pills .open .dropdown-toggle,\n.nav > li.dropdown.open.active > a:hover {\n  color: #ffffff;\n  background-color: rgba(36, 36, 36, 0.8);\n  border-color: rgba(36, 36, 36, 0.8);\n}\n.nav li.dropdown.open .caret,\n.nav li.dropdown.open.active .caret,\n.nav li.dropdown.open a:hover .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n  opacity: 1;\n  filter: alpha(opacity=100);\n}\n.tabs-stacked .open > a:hover {\n  border-color: rgba(36, 36, 36, 0.8);\n}\n.tabbable {\n  *zoom: 1;\n}\n.tabbable:before,\n.tabbable:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.tabbable:after {\n  clear: both;\n}\n.tab-content {\n  overflow: auto;\n}\n.tabs-below > .nav-tabs,\n.tabs-right > .nav-tabs,\n.tabs-left > .nav-tabs {\n  border-bottom: 0;\n}\n.tab-content > .tab-pane,\n.pill-content > .pill-pane {\n  display: none;\n}\n.tab-content > .active,\n.pill-content > .active {\n  display: block;\n}\n.tabs-below > .nav-tabs {\n  border-top: 1px solid #ddd;\n}\n.tabs-below > .nav-tabs > li {\n  margin-top: -1px;\n  margin-bottom: 0;\n}\n.tabs-below > .nav-tabs > li > a {\n  -webkit-border-radius: 0 0 4px 4px;\n  -moz-border-radius: 0 0 4px 4px;\n  border-radius: 0 0 4px 4px;\n}\n.tabs-below > .nav-tabs > li > a:hover {\n  border-bottom-color: transparent;\n  border-top-color: #ddd;\n}\n.tabs-below > .nav-tabs > .active > a,\n.tabs-below > .nav-tabs > .active > a:hover {\n  border-color: transparent #ddd #ddd #ddd;\n}\n.tabs-left > .nav-tabs > li,\n.tabs-right > .nav-tabs > li {\n  float: none;\n}\n.tabs-left > .nav-tabs > li > a,\n.tabs-right > .nav-tabs > li > a {\n  min-width: 74px;\n  margin-right: 0;\n  margin-bottom: 3px;\n}\n.tabs-left > .nav-tabs {\n  float: left;\n  margin-right: 19px;\n  border-right: 1px solid #ddd;\n}\n.tabs-left > .nav-tabs > li > a {\n  margin-right: -1px;\n  -webkit-border-radius: 4px 0 0 4px;\n  -moz-border-radius: 4px 0 0 4px;\n  border-radius: 4px 0 0 4px;\n}\n.tabs-left > .nav-tabs > li > a:hover {\n  border-color: #e6e6e6 #dddddd #e6e6e6 #e6e6e6;\n}\n.tabs-left > .nav-tabs .active > a,\n.tabs-left > .nav-tabs .active > a:hover {\n  border-color: #ddd transparent #ddd #ddd;\n  *border-right-color: #ffffff;\n}\n.tabs-right > .nav-tabs {\n  float: right;\n  margin-left: 19px;\n  border-left: 1px solid #ddd;\n}\n.tabs-right > .nav-tabs > li > a {\n  margin-left: -1px;\n  -webkit-border-radius: 0 4px 4px 0;\n  -moz-border-radius: 0 4px 4px 0;\n  border-radius: 0 4px 4px 0;\n}\n.tabs-right > .nav-tabs > li > a:hover {\n  border-color: #e6e6e6 #e6e6e6 #e6e6e6 #dddddd;\n}\n.tabs-right > .nav-tabs .active > a,\n.tabs-right > .nav-tabs .active > a:hover {\n  border-color: #ddd #ddd #ddd transparent;\n  *border-left-color: #ffffff;\n}\n.nav > .disabled > a {\n  color: rgba(36, 36, 36, 0.8);\n}\n.nav > .disabled > a:hover {\n  text-decoration: none;\n  background-color: transparent;\n  cursor: default;\n}\n.navbar {\n  overflow: visible;\n  margin-bottom: 20px;\n  *position: relative;\n  *z-index: 2;\n}\n.navbar-inner {\n  min-height: 30px;\n  padding-left: 20px;\n  padding-right: 20px;\n  background-color: rgba(36, 36, 36, 0.88);\n  background-image: -moz-linear-gradient(top, rgba(36, 36, 36, 0.8), #242424);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(rgba(36, 36, 36, 0.8)), to(#242424));\n  background-image: -webkit-linear-gradient(top, rgba(36, 36, 36, 0.8), #242424);\n  background-image: -o-linear-gradient(top, rgba(36, 36, 36, 0.8), #242424);\n  background-image: linear-gradient(to bottom, rgba(36, 36, 36, 0.8), #242424);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#cc242424', endColorstr='#ff242424', GradientType=0);\n  border: 1px solid #000000;\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n  -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);\n  -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);\n  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);\n  *zoom: 1;\n}\n.navbar-inner:before,\n.navbar-inner:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.navbar-inner:after {\n  clear: both;\n}\n.navbar .container {\n  width: auto;\n}\n.nav-collapse.collapse {\n  height: auto;\n  overflow: visible;\n}\n.navbar .brand {\n  float: left;\n  display: block;\n  padding: 5px 20px 5px;\n  margin-left: -20px;\n  font-size: 20px;\n  font-weight: 200;\n  color: rgba(255, 255, 255, 0.8);\n  text-shadow: 0 1px 0 rgba(36, 36, 36, 0.8);\n}\n.navbar .brand:hover {\n  text-decoration: none;\n}\n.navbar-text {\n  margin-bottom: 0;\n  line-height: 30px;\n  color: rgba(255, 255, 255, 0.7);\n}\n.navbar-link {\n  color: rgba(255, 255, 255, 0.7);\n}\n.navbar-link:hover {\n  color: #242424;\n}\n.navbar .divider-vertical {\n  height: 30px;\n  margin: 0 9px;\n  border-left: 1px solid #242424;\n  border-right: 1px solid rgba(36, 36, 36, 0.8);\n}\n.navbar .btn,\n.navbar .btn-group {\n  margin-top: 0px;\n}\n.navbar .btn-group .btn,\n.navbar .input-prepend .btn,\n.navbar .input-append .btn {\n  margin-top: 0;\n}\n.navbar-form {\n  margin-bottom: 0;\n  *zoom: 1;\n}\n.navbar-form:before,\n.navbar-form:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.navbar-form:after {\n  clear: both;\n}\n.navbar-form input,\n.navbar-form select,\n.navbar-form .radio,\n.navbar-form .checkbox {\n  margin-top: 0px;\n}\n.navbar-form input,\n.navbar-form select,\n.navbar-form .btn {\n  display: inline-block;\n  margin-bottom: 0;\n}\n.navbar-form input[type=\"image\"],\n.navbar-form input[type=\"checkbox\"],\n.navbar-form input[type=\"radio\"] {\n  margin-top: 3px;\n}\n.navbar-form .input-append,\n.navbar-form .input-prepend {\n  margin-top: 5px;\n  white-space: nowrap;\n}\n.navbar-form .input-append input,\n.navbar-form .input-prepend input {\n  margin-top: 0;\n}\n.navbar-search {\n  position: relative;\n  float: left;\n  margin-top: 0px;\n  margin-bottom: 0;\n}\n.navbar-search .search-query {\n  margin-bottom: 0;\n  padding: 4px 14px;\n  font-family: \"Rambla\", Helvetica Neue, Helvetica, Arial, sans-serif;\n  font-size: 13px;\n  font-weight: normal;\n  line-height: 1;\n  -webkit-border-radius: 15px;\n  -moz-border-radius: 15px;\n  border-radius: 15px;\n}\n.navbar-static-top {\n  position: static;\n  margin-bottom: 0;\n}\n.navbar-static-top .navbar-inner {\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: 1030;\n  margin-bottom: 0;\n}\n.navbar-fixed-top .navbar-inner,\n.navbar-static-top .navbar-inner {\n  border-width: 0 0 1px;\n}\n.navbar-fixed-bottom .navbar-inner {\n  border-width: 1px 0 0;\n}\n.navbar-fixed-top .navbar-inner,\n.navbar-fixed-bottom .navbar-inner {\n  padding-left: 0;\n  padding-right: 0;\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n}\n.navbar-static-top .container,\n.navbar-fixed-top .container,\n.navbar-fixed-bottom .container {\n  width: 940px;\n}\n.navbar-fixed-top {\n  top: 0;\n}\n.navbar-fixed-top .navbar-inner,\n.navbar-static-top .navbar-inner {\n  -webkit-box-shadow: 0 1px 10px rgba(0,0,0,.1);\n  -moz-box-shadow: 0 1px 10px rgba(0,0,0,.1);\n  box-shadow: 0 1px 10px rgba(0,0,0,.1);\n}\n.navbar-fixed-bottom {\n  bottom: 0;\n}\n.navbar-fixed-bottom .navbar-inner {\n  -webkit-box-shadow: 0 -1px 10px rgba(0,0,0,.1);\n  -moz-box-shadow: 0 -1px 10px rgba(0,0,0,.1);\n  box-shadow: 0 -1px 10px rgba(0,0,0,.1);\n}\n.navbar .nav {\n  position: relative;\n  left: 0;\n  display: block;\n  float: left;\n  margin: 0 10px 0 0;\n}\n.navbar .nav.pull-right {\n  float: right;\n  margin-right: 0;\n}\n.navbar .nav > li {\n  float: left;\n}\n.navbar .nav > li > a {\n  float: none;\n  padding: 5px 15px 5px;\n  color: rgba(255, 255, 255, 0.7);\n  text-decoration: none;\n  text-shadow: 0 1px 0 rgba(36, 36, 36, 0.8);\n}\n.navbar .nav .dropdown-toggle .caret {\n  margin-top: 8px;\n}\n.navbar .nav > li > a:focus,\n.navbar .nav > li > a:hover {\n  background-color: transparent;\n  color: #242424;\n  text-decoration: none;\n}\n.navbar .nav > .active > a,\n.navbar .nav > .active > a:hover,\n.navbar .nav > .active > a:focus {\n  color: #242424;\n  text-decoration: none;\n  background-color: transparent;\n  -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);\n  -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);\n  box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);\n}\n.navbar .btn-navbar {\n  display: none;\n  float: right;\n  padding: 7px 10px;\n  margin-left: 5px;\n  margin-right: 5px;\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: rgba(23, 23, 23, 0.88);\n  background-image: -moz-linear-gradient(top, rgba(23, 23, 23, 0.8), #171717);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(rgba(23, 23, 23, 0.8)), to(#171717));\n  background-image: -webkit-linear-gradient(top, rgba(23, 23, 23, 0.8), #171717);\n  background-image: -o-linear-gradient(top, rgba(23, 23, 23, 0.8), #171717);\n  background-image: linear-gradient(to bottom, rgba(23, 23, 23, 0.8), #171717);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#cc171717', endColorstr='#ff171717', GradientType=0);\n  border-color: #171717 #171717 #000000;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #171717;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);\n  -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);\n  box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);\n}\n.navbar .btn-navbar:hover,\n.navbar .btn-navbar:active,\n.navbar .btn-navbar.active,\n.navbar .btn-navbar.disabled,\n.navbar .btn-navbar[disabled] {\n  color: #ffffff;\n  background-color: #171717;\n  *background-color: #0a0a0a;\n}\n.navbar .btn-navbar:active,\n.navbar .btn-navbar.active {\n  background-color: #000000 \\9;\n}\n.navbar .btn-navbar .icon-bar {\n  display: block;\n  width: 18px;\n  height: 2px;\n  background-color: #f5f5f5;\n  -webkit-border-radius: 1px;\n  -moz-border-radius: 1px;\n  border-radius: 1px;\n  -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);\n  -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);\n  box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);\n}\n.btn-navbar .icon-bar + .icon-bar {\n  margin-top: 3px;\n}\n.navbar .nav > li > .dropdown-menu:before {\n  content: '';\n  display: inline-block;\n  border-left: 7px solid transparent;\n  border-right: 7px solid transparent;\n  border-bottom: 7px solid #ccc;\n  border-bottom-color: rgba(0, 0, 0, 0.2);\n  position: absolute;\n  top: -7px;\n  left: 9px;\n}\n.navbar .nav > li > .dropdown-menu:after {\n  content: '';\n  display: inline-block;\n  border-left: 6px solid transparent;\n  border-right: 6px solid transparent;\n  border-bottom: 6px solid #ffffff;\n  position: absolute;\n  top: -6px;\n  left: 10px;\n}\n.navbar-fixed-bottom .nav > li > .dropdown-menu:before {\n  border-top: 7px solid #ccc;\n  border-top-color: rgba(0, 0, 0, 0.2);\n  border-bottom: 0;\n  bottom: -7px;\n  top: auto;\n}\n.navbar-fixed-bottom .nav > li > .dropdown-menu:after {\n  border-top: 6px solid #ffffff;\n  border-bottom: 0;\n  bottom: -6px;\n  top: auto;\n}\n.navbar .nav li.dropdown > a:hover .caret {\n  border-top-color: #242424;\n  border-bottom-color: #242424;\n}\n.navbar .nav li.dropdown.open > .dropdown-toggle,\n.navbar .nav li.dropdown.active > .dropdown-toggle,\n.navbar .nav li.dropdown.open.active > .dropdown-toggle {\n  background-color: transparent;\n  color: #242424;\n}\n.navbar .nav li.dropdown > .dropdown-toggle .caret {\n  border-top-color: rgba(255, 255, 255, 0.7);\n  border-bottom-color: rgba(255, 255, 255, 0.7);\n}\n.navbar .nav li.dropdown.open > .dropdown-toggle .caret,\n.navbar .nav li.dropdown.active > .dropdown-toggle .caret,\n.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {\n  border-top-color: #242424;\n  border-bottom-color: #242424;\n}\n.navbar .pull-right > li > .dropdown-menu,\n.navbar .nav > li > .dropdown-menu.pull-right {\n  left: auto;\n  right: 0;\n}\n.navbar .pull-right > li > .dropdown-menu:before,\n.navbar .nav > li > .dropdown-menu.pull-right:before {\n  left: auto;\n  right: 12px;\n}\n.navbar .pull-right > li > .dropdown-menu:after,\n.navbar .nav > li > .dropdown-menu.pull-right:after {\n  left: auto;\n  right: 13px;\n}\n.navbar .pull-right > li > .dropdown-menu .dropdown-menu,\n.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu {\n  left: auto;\n  right: 100%;\n  margin-left: 0;\n  margin-right: -1px;\n  -webkit-border-radius: 6px 0 6px 6px;\n  -moz-border-radius: 6px 0 6px 6px;\n  border-radius: 6px 0 6px 6px;\n}\n.navbar-inverse .navbar-inner {\n  background-color: rgba(161, 207, 199, 0.9400000000000001);\n  background-image: -moz-linear-gradient(top, rgba(85, 167, 154, 0.9), #ffffff);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(rgba(85, 167, 154, 0.9)), to(#ffffff));\n  background-image: -webkit-linear-gradient(top, rgba(85, 167, 154, 0.9), #ffffff);\n  background-image: -o-linear-gradient(top, rgba(85, 167, 154, 0.9), #ffffff);\n  background-image: linear-gradient(to bottom, rgba(85, 167, 154, 0.9), #ffffff);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e655a79a', endColorstr='#ffffffff', GradientType=0);\n  border-color: #44857b;\n}\n.navbar-inverse .brand,\n.navbar-inverse .nav > li > a {\n  color: #55a79a;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.navbar-inverse .brand:hover,\n.navbar-inverse .nav > li > a:hover {\n  color: #ffffff;\n}\n.navbar-inverse .brand {\n  color: #55a79a;\n}\n.navbar-inverse .navbar-text {\n  color: #55a79a;\n}\n.navbar-inverse .nav > li > a:focus,\n.navbar-inverse .nav > li > a:hover {\n  background-color: #55a79a;\n  color: #ffffff;\n}\n.navbar-inverse .nav .active > a,\n.navbar-inverse .nav .active > a:hover,\n.navbar-inverse .nav .active > a:focus {\n  color: #ffffff;\n  background-color: #55a79a;\n}\n.navbar-inverse .navbar-link {\n  color: #55a79a;\n}\n.navbar-inverse .navbar-link:hover {\n  color: #ffffff;\n}\n.navbar-inverse .divider-vertical {\n  border-left-color: #ffffff;\n  border-right-color: rgba(85, 167, 154, 0.9);\n}\n.navbar-inverse .nav li.dropdown.open > .dropdown-toggle,\n.navbar-inverse .nav li.dropdown.active > .dropdown-toggle,\n.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle {\n  background-color: #55a79a;\n  color: #ffffff;\n}\n.navbar-inverse .nav li.dropdown > a:hover .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\n.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret {\n  border-top-color: #55a79a;\n  border-bottom-color: #55a79a;\n}\n.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret,\n.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret,\n.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\n.navbar-inverse .navbar-search .search-query {\n  color: #ffffff;\n  background-color: #ffffff;\n  border-color: #ffffff;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);\n  -moz-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);\n  box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);\n  -webkit-transition: none;\n  -moz-transition: none;\n  -o-transition: none;\n  transition: none;\n}\n.navbar-inverse .navbar-search .search-query:-moz-placeholder {\n  color: #55a79a;\n}\n.navbar-inverse .navbar-search .search-query:-ms-input-placeholder {\n  color: #55a79a;\n}\n.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder {\n  color: #55a79a;\n}\n.navbar-inverse .navbar-search .search-query:focus,\n.navbar-inverse .navbar-search .search-query.focused {\n  padding: 5px 15px;\n  color: #333333;\n  text-shadow: 0 1px 0 #ffffff;\n  background-color: #ffffff;\n  border: 0;\n  -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);\n  -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);\n  box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);\n  outline: 0;\n}\n.navbar-inverse .btn-navbar {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: rgba(151, 191, 185, 0.9400000000000001);\n  background-image: -moz-linear-gradient(top, rgba(76, 150, 138, 0.9), #f2f2f2);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(rgba(76, 150, 138, 0.9)), to(#f2f2f2));\n  background-image: -webkit-linear-gradient(top, rgba(76, 150, 138, 0.9), #f2f2f2);\n  background-image: -o-linear-gradient(top, rgba(76, 150, 138, 0.9), #f2f2f2);\n  background-image: linear-gradient(to bottom, rgba(76, 150, 138, 0.9), #f2f2f2);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e64c968a', endColorstr='#fff2f2f2', GradientType=0);\n  border-color: #f2f2f2 #f2f2f2 #cccccc;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #f2f2f2;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.navbar-inverse .btn-navbar:hover,\n.navbar-inverse .btn-navbar:active,\n.navbar-inverse .btn-navbar.active,\n.navbar-inverse .btn-navbar.disabled,\n.navbar-inverse .btn-navbar[disabled] {\n  color: #ffffff;\n  background-color: #f2f2f2;\n  *background-color: #e5e5e5;\n}\n.navbar-inverse .btn-navbar:active,\n.navbar-inverse .btn-navbar.active {\n  background-color: #d9d9d9 \\9;\n}\n.breadcrumb {\n  padding: 8px 15px;\n  margin: 0 0 20px;\n  list-style: none;\n  background-color: #f5f5f5;\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n}\n.breadcrumb > li {\n  display: inline-block;\n  *display: inline;\n  /* IE7 inline-block hack */\n\n  *zoom: 1;\n  text-shadow: 0 1px 0 #ffffff;\n}\n.breadcrumb > li > .divider {\n  padding: 0 5px;\n  color: #ccc;\n}\n.breadcrumb > .active {\n  color: rgba(36, 36, 36, 0.8);\n}\n.pagination {\n  margin: 20px 0;\n}\n.pagination ul {\n  display: inline-block;\n  *display: inline;\n  /* IE7 inline-block hack */\n\n  *zoom: 1;\n  margin-left: 0;\n  margin-bottom: 0;\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n  -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.pagination ul > li {\n  display: inline;\n}\n.pagination ul > li > a,\n.pagination ul > li > span {\n  float: left;\n  padding: 4px 12px;\n  line-height: 20px;\n  text-decoration: none;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-left-width: 0;\n}\n.pagination ul > li > a:hover,\n.pagination ul > .active > a,\n.pagination ul > .active > span {\n  background-color: #f5f5f5;\n}\n.pagination ul > .active > a,\n.pagination ul > .active > span {\n  color: rgba(36, 36, 36, 0.8);\n  cursor: default;\n}\n.pagination ul > .disabled > span,\n.pagination ul > .disabled > a,\n.pagination ul > .disabled > a:hover {\n  color: rgba(36, 36, 36, 0.8);\n  background-color: transparent;\n  cursor: default;\n}\n.pagination ul > li:first-child > a,\n.pagination ul > li:first-child > span {\n  border-left-width: 1px;\n  -webkit-border-top-left-radius: 2px;\n  -moz-border-radius-topleft: 2px;\n  border-top-left-radius: 2px;\n  -webkit-border-bottom-left-radius: 2px;\n  -moz-border-radius-bottomleft: 2px;\n  border-bottom-left-radius: 2px;\n}\n.pagination ul > li:last-child > a,\n.pagination ul > li:last-child > span {\n  -webkit-border-top-right-radius: 2px;\n  -moz-border-radius-topright: 2px;\n  border-top-right-radius: 2px;\n  -webkit-border-bottom-right-radius: 2px;\n  -moz-border-radius-bottomright: 2px;\n  border-bottom-right-radius: 2px;\n}\n.pagination-centered {\n  text-align: center;\n}\n.pagination-right {\n  text-align: right;\n}\n.pagination-large ul > li > a,\n.pagination-large ul > li > span {\n  padding: 11px 19px;\n  font-size: 17.5px;\n}\n.pagination-large ul > li:first-child > a,\n.pagination-large ul > li:first-child > span {\n  -webkit-border-top-left-radius: 2px;\n  -moz-border-radius-topleft: 2px;\n  border-top-left-radius: 2px;\n  -webkit-border-bottom-left-radius: 2px;\n  -moz-border-radius-bottomleft: 2px;\n  border-bottom-left-radius: 2px;\n}\n.pagination-large ul > li:last-child > a,\n.pagination-large ul > li:last-child > span {\n  -webkit-border-top-right-radius: 2px;\n  -moz-border-radius-topright: 2px;\n  border-top-right-radius: 2px;\n  -webkit-border-bottom-right-radius: 2px;\n  -moz-border-radius-bottomright: 2px;\n  border-bottom-right-radius: 2px;\n}\n.pagination-mini ul > li:first-child > a,\n.pagination-small ul > li:first-child > a,\n.pagination-mini ul > li:first-child > span,\n.pagination-small ul > li:first-child > span {\n  -webkit-border-top-left-radius: 2px;\n  -moz-border-radius-topleft: 2px;\n  border-top-left-radius: 2px;\n  -webkit-border-bottom-left-radius: 2px;\n  -moz-border-radius-bottomleft: 2px;\n  border-bottom-left-radius: 2px;\n}\n.pagination-mini ul > li:last-child > a,\n.pagination-small ul > li:last-child > a,\n.pagination-mini ul > li:last-child > span,\n.pagination-small ul > li:last-child > span {\n  -webkit-border-top-right-radius: 2px;\n  -moz-border-radius-topright: 2px;\n  border-top-right-radius: 2px;\n  -webkit-border-bottom-right-radius: 2px;\n  -moz-border-radius-bottomright: 2px;\n  border-bottom-right-radius: 2px;\n}\n.pagination-small ul > li > a,\n.pagination-small ul > li > span {\n  padding: 2px 10px;\n  font-size: 11.9px;\n}\n.pagination-mini ul > li > a,\n.pagination-mini ul > li > span {\n  padding: 1px 6px;\n  font-size: 10.5px;\n}\n.pager {\n  margin: 20px 0;\n  list-style: none;\n  text-align: center;\n  *zoom: 1;\n}\n.pager:before,\n.pager:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.pager:after {\n  clear: both;\n}\n.pager li {\n  display: inline;\n}\n.pager li > a,\n.pager li > span {\n  display: inline-block;\n  padding: 5px 14px;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  -webkit-border-radius: 15px;\n  -moz-border-radius: 15px;\n  border-radius: 15px;\n}\n.pager li > a:hover {\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\n.pager .next > a,\n.pager .next > span {\n  float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n  float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > span {\n  color: rgba(36, 36, 36, 0.8);\n  background-color: #fff;\n  cursor: default;\n}\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  background-color: #000000;\n}\n.modal-backdrop.fade {\n  opacity: 0;\n}\n.modal-backdrop,\n.modal-backdrop.fade.in {\n  opacity: 0.8;\n  filter: alpha(opacity=80);\n}\n.modal {\n  position: fixed;\n  top: 10%;\n  left: 50%;\n  z-index: 1050;\n  width: 560px;\n  margin-left: -280px;\n  background-color: #ffffff;\n  border: 1px solid #999;\n  border: 1px solid rgba(0, 0, 0, 0.3);\n  *border: 1px solid #999;\n  /* IE6-7 */\n\n  -webkit-border-radius: 6px;\n  -moz-border-radius: 6px;\n  border-radius: 6px;\n  -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);\n  -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);\n  box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);\n  -webkit-background-clip: padding-box;\n  -moz-background-clip: padding-box;\n  background-clip: padding-box;\n  outline: none;\n}\n.modal.fade {\n  -webkit-transition: opacity .3s linear, top .3s ease-out;\n  -moz-transition: opacity .3s linear, top .3s ease-out;\n  -o-transition: opacity .3s linear, top .3s ease-out;\n  transition: opacity .3s linear, top .3s ease-out;\n  top: -25%;\n}\n.modal.fade.in {\n  top: 10%;\n}\n.modal-header {\n  padding: 9px 15px;\n  border-bottom: 1px solid #eee;\n}\n.modal-header .close {\n  margin-top: 2px;\n}\n.modal-header h3 {\n  margin: 0;\n  line-height: 30px;\n}\n.modal-body {\n  position: relative;\n  overflow-y: auto;\n  max-height: 400px;\n  padding: 15px;\n}\n.modal-form {\n  margin-bottom: 0;\n}\n.modal-footer {\n  padding: 14px 15px 15px;\n  margin-bottom: 0;\n  text-align: right;\n  background-color: #f5f5f5;\n  border-top: 1px solid #ddd;\n  -webkit-border-radius: 0 0 6px 6px;\n  -moz-border-radius: 0 0 6px 6px;\n  border-radius: 0 0 6px 6px;\n  -webkit-box-shadow: inset 0 1px 0 #ffffff;\n  -moz-box-shadow: inset 0 1px 0 #ffffff;\n  box-shadow: inset 0 1px 0 #ffffff;\n  *zoom: 1;\n}\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.modal-footer:after {\n  clear: both;\n}\n.modal-footer .btn + .btn {\n  margin-left: 5px;\n  margin-bottom: 0;\n}\n.modal-footer .btn-group .btn + .btn {\n  margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n  margin-left: 0;\n}\n.tooltip {\n  position: absolute;\n  z-index: 1030;\n  display: block;\n  visibility: visible;\n  padding: 5px;\n  font-size: 11px;\n  opacity: 0;\n  filter: alpha(opacity=0);\n}\n.tooltip.in {\n  opacity: 0.8;\n  filter: alpha(opacity=80);\n}\n.tooltip.top {\n  margin-top: -3px;\n}\n.tooltip.right {\n  margin-left: 3px;\n}\n.tooltip.bottom {\n  margin-top: 3px;\n}\n.tooltip.left {\n  margin-left: -3px;\n}\n.tooltip-inner {\n  max-width: 200px;\n  padding: 3px 8px;\n  color: #ffffff;\n  text-align: center;\n  text-decoration: none;\n  background-color: #000000;\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n}\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n  bottom: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000000;\n}\n.tooltip.right .tooltip-arrow {\n  top: 50%;\n  left: 0;\n  margin-top: -5px;\n  border-width: 5px 5px 5px 0;\n  border-right-color: #000000;\n}\n.tooltip.left .tooltip-arrow {\n  top: 50%;\n  right: 0;\n  margin-top: -5px;\n  border-width: 5px 0 5px 5px;\n  border-left-color: #000000;\n}\n.tooltip.bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000000;\n}\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1010;\n  display: none;\n  width: 236px;\n  padding: 1px;\n  text-align: left;\n  background-color: #ffffff;\n  -webkit-background-clip: padding-box;\n  -moz-background-clip: padding;\n  background-clip: padding-box;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  -webkit-border-radius: 6px;\n  -moz-border-radius: 6px;\n  border-radius: 6px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  white-space: normal;\n}\n.popover.top {\n  margin-top: -10px;\n}\n.popover.right {\n  margin-left: 10px;\n}\n.popover.bottom {\n  margin-top: 10px;\n}\n.popover.left {\n  margin-left: -10px;\n}\n.popover-title {\n  margin: 0;\n  padding: 8px 14px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 18px;\n  background-color: #f7f7f7;\n  border-bottom: 1px solid #ebebeb;\n  -webkit-border-radius: 5px 5px 0 0;\n  -moz-border-radius: 5px 5px 0 0;\n  border-radius: 5px 5px 0 0;\n}\n.popover-content {\n  padding: 9px 14px;\n}\n.popover .arrow,\n.popover .arrow:after {\n  position: absolute;\n  display: block;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.popover .arrow {\n  border-width: 11px;\n}\n.popover .arrow:after {\n  border-width: 10px;\n  content: \"\";\n}\n.popover.top .arrow {\n  left: 50%;\n  margin-left: -11px;\n  border-bottom-width: 0;\n  border-top-color: #999;\n  border-top-color: rgba(0, 0, 0, 0.25);\n  bottom: -11px;\n}\n.popover.top .arrow:after {\n  bottom: 1px;\n  margin-left: -10px;\n  border-bottom-width: 0;\n  border-top-color: #ffffff;\n}\n.popover.right .arrow {\n  top: 50%;\n  left: -11px;\n  margin-top: -11px;\n  border-left-width: 0;\n  border-right-color: #999;\n  border-right-color: rgba(0, 0, 0, 0.25);\n}\n.popover.right .arrow:after {\n  left: 1px;\n  bottom: -10px;\n  border-left-width: 0;\n  border-right-color: #ffffff;\n}\n.popover.bottom .arrow {\n  left: 50%;\n  margin-left: -11px;\n  border-top-width: 0;\n  border-bottom-color: #999;\n  border-bottom-color: rgba(0, 0, 0, 0.25);\n  top: -11px;\n}\n.popover.bottom .arrow:after {\n  top: 1px;\n  margin-left: -10px;\n  border-top-width: 0;\n  border-bottom-color: #ffffff;\n}\n.popover.left .arrow {\n  top: 50%;\n  right: -11px;\n  margin-top: -11px;\n  border-right-width: 0;\n  border-left-color: #999;\n  border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left .arrow:after {\n  right: 1px;\n  border-right-width: 0;\n  border-left-color: #ffffff;\n  bottom: -10px;\n}\n.thumbnails {\n  margin-left: -20px;\n  list-style: none;\n  *zoom: 1;\n}\n.thumbnails:before,\n.thumbnails:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.thumbnails:after {\n  clear: both;\n}\n.row-fluid .thumbnails {\n  margin-left: 0;\n}\n.thumbnails > li {\n  float: left;\n  margin-bottom: 20px;\n  margin-left: 20px;\n}\n.thumbnail {\n  display: block;\n  padding: 4px;\n  line-height: 20px;\n  border: 1px solid #ddd;\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);\n  -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);\n  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);\n  -webkit-transition: all 0.2s ease-in-out;\n  -moz-transition: all 0.2s ease-in-out;\n  -o-transition: all 0.2s ease-in-out;\n  transition: all 0.2s ease-in-out;\n}\na.thumbnail:hover {\n  border-color: #55a79a;\n  -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);\n  -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);\n  box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);\n}\n.thumbnail > img {\n  display: block;\n  max-width: 100%;\n  margin-left: auto;\n  margin-right: auto;\n}\n.thumbnail .caption {\n  padding: 9px;\n  color: #242424;\n}\n.media,\n.media-body {\n  overflow: hidden;\n  *overflow: visible;\n  zoom: 1;\n}\n.media,\n.media .media {\n  margin-top: 15px;\n}\n.media:first-child {\n  margin-top: 0;\n}\n.media-object {\n  display: block;\n}\n.media-heading {\n  margin: 0 0 5px;\n}\n.media .pull-left {\n  margin-right: 10px;\n}\n.media .pull-right {\n  margin-left: 10px;\n}\n.media-list {\n  margin-left: 0;\n  list-style: none;\n}\n.label,\n.badge {\n  display: inline-block;\n  padding: 2px 4px;\n  font-size: 11.844px;\n  font-weight: bold;\n  line-height: 14px;\n  color: #ffffff;\n  vertical-align: baseline;\n  white-space: nowrap;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: rgba(36, 36, 36, 0.8);\n}\n.label {\n  -webkit-border-radius: 3px;\n  -moz-border-radius: 3px;\n  border-radius: 3px;\n}\n.badge {\n  padding-left: 9px;\n  padding-right: 9px;\n  -webkit-border-radius: 9px;\n  -moz-border-radius: 9px;\n  border-radius: 9px;\n}\n.label:empty,\n.badge:empty {\n  display: none;\n}\na.label:hover,\na.badge:hover {\n  color: #ffffff;\n  text-decoration: none;\n  cursor: pointer;\n}\n.label-important,\n.badge-important {\n  background-color: #b94a48;\n}\n.label-important[href],\n.badge-important[href] {\n  background-color: #953b39;\n}\n.label-warning,\n.badge-warning {\n  background-color: #f89406;\n}\n.label-warning[href],\n.badge-warning[href] {\n  background-color: #c67605;\n}\n.label-success,\n.badge-success {\n  background-color: #468847;\n}\n.label-success[href],\n.badge-success[href] {\n  background-color: #356635;\n}\n.label-info,\n.badge-info {\n  background-color: #3a87ad;\n}\n.label-info[href],\n.badge-info[href] {\n  background-color: #2d6987;\n}\n.label-inverse,\n.badge-inverse {\n  background-color: #333333;\n}\n.label-inverse[href],\n.badge-inverse[href] {\n  background-color: #1a1a1a;\n}\n.btn .label,\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n.btn-mini .label,\n.btn-mini .badge {\n  top: 0;\n}\n@-webkit-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n@-moz-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n@-ms-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n@-o-keyframes progress-bar-stripes {\n  from {\n    background-position: 0 0;\n  }\n  to {\n    background-position: 40px 0;\n  }\n}\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n.progress {\n  overflow: hidden;\n  height: 20px;\n  margin-bottom: 20px;\n  background-color: #f7f7f7;\n  background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));\n  background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9);\n  background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9);\n  background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n  -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n}\n.progress .bar {\n  width: 0%;\n  height: 100%;\n  color: #ffffff;\n  float: left;\n  font-size: 12px;\n  text-align: center;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #0e90d2;\n  background-image: -moz-linear-gradient(top, #149bdf, #0480be);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));\n  background-image: -webkit-linear-gradient(top, #149bdf, #0480be);\n  background-image: -o-linear-gradient(top, #149bdf, #0480be);\n  background-image: linear-gradient(to bottom, #149bdf, #0480be);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  -webkit-transition: width 0.6s ease;\n  -moz-transition: width 0.6s ease;\n  -o-transition: width 0.6s ease;\n  transition: width 0.6s ease;\n}\n.progress .bar + .bar {\n  -webkit-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);\n  -moz-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);\n  box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);\n}\n.progress-striped .bar {\n  background-color: #149bdf;\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  -webkit-background-size: 40px 40px;\n  -moz-background-size: 40px 40px;\n  -o-background-size: 40px 40px;\n  background-size: 40px 40px;\n}\n.progress.active .bar {\n  -webkit-animation: progress-bar-stripes 2s linear infinite;\n  -moz-animation: progress-bar-stripes 2s linear infinite;\n  -ms-animation: progress-bar-stripes 2s linear infinite;\n  -o-animation: progress-bar-stripes 2s linear infinite;\n  animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-danger .bar,\n.progress .bar-danger {\n  background-color: #dd514c;\n  background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));\n  background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);\n  background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);\n  background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0);\n}\n.progress-danger.progress-striped .bar,\n.progress-striped .bar-danger {\n  background-color: #ee5f5b;\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-success .bar,\n.progress .bar-success {\n  background-color: #5eb95e;\n  background-image: -moz-linear-gradient(top, #62c462, #57a957);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));\n  background-image: -webkit-linear-gradient(top, #62c462, #57a957);\n  background-image: -o-linear-gradient(top, #62c462, #57a957);\n  background-image: linear-gradient(to bottom, #62c462, #57a957);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0);\n}\n.progress-success.progress-striped .bar,\n.progress-striped .bar-success {\n  background-color: #62c462;\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-info .bar,\n.progress .bar-info {\n  background-color: #4bb1cf;\n  background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));\n  background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);\n  background-image: -o-linear-gradient(top, #5bc0de, #339bb9);\n  background-image: linear-gradient(to bottom, #5bc0de, #339bb9);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0);\n}\n.progress-info.progress-striped .bar,\n.progress-striped .bar-info {\n  background-color: #5bc0de;\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-warning .bar,\n.progress .bar-warning {\n  background-color: #faa732;\n  background-image: -moz-linear-gradient(top, #fbb450, #f89406);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));\n  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);\n  background-image: -o-linear-gradient(top, #fbb450, #f89406);\n  background-image: linear-gradient(to bottom, #fbb450, #f89406);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);\n}\n.progress-warning.progress-striped .bar,\n.progress-striped .bar-warning {\n  background-color: #fbb450;\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.accordion {\n  margin-bottom: 20px;\n}\n.accordion-group {\n  margin-bottom: 2px;\n  border: 1px solid #e5e5e5;\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n}\n.accordion-heading {\n  border-bottom: 0;\n}\n.accordion-heading .accordion-toggle {\n  display: block;\n  padding: 8px 15px;\n}\n.accordion-toggle {\n  cursor: pointer;\n}\n.accordion-inner {\n  padding: 9px 15px;\n  border-top: 1px solid #e5e5e5;\n}\n.carousel {\n  position: relative;\n  margin-bottom: 20px;\n  line-height: 1;\n}\n.carousel-inner {\n  overflow: hidden;\n  width: 100%;\n  position: relative;\n}\n.carousel-inner > .item {\n  display: none;\n  position: relative;\n  -webkit-transition: 0.6s ease-in-out left;\n  -moz-transition: 0.6s ease-in-out left;\n  -o-transition: 0.6s ease-in-out left;\n  transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img {\n  display: block;\n  line-height: 1;\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  display: block;\n}\n.carousel-inner > .active {\n  left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n.carousel-inner > .next {\n  left: 100%;\n}\n.carousel-inner > .prev {\n  left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n  left: 0;\n}\n.carousel-inner > .active.left {\n  left: -100%;\n}\n.carousel-inner > .active.right {\n  left: 100%;\n}\n.carousel-control {\n  position: absolute;\n  top: 40%;\n  left: 15px;\n  width: 40px;\n  height: 40px;\n  margin-top: -20px;\n  font-size: 60px;\n  font-weight: 100;\n  line-height: 30px;\n  color: #ffffff;\n  text-align: center;\n  background: #080808;\n  border: 3px solid #ffffff;\n  -webkit-border-radius: 23px;\n  -moz-border-radius: 23px;\n  border-radius: 23px;\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n.carousel-control.right {\n  left: auto;\n  right: 15px;\n}\n.carousel-control:hover {\n  color: #ffffff;\n  text-decoration: none;\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\n.carousel-caption {\n  position: absolute;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  padding: 15px;\n  background: #333333;\n  background: rgba(0, 0, 0, 0.75);\n}\n.carousel-caption h4,\n.carousel-caption p {\n  color: #ffffff;\n  line-height: 20px;\n}\n.carousel-caption h4 {\n  margin: 0 0 5px;\n}\n.carousel-caption p {\n  margin-bottom: 0;\n}\n.hero-unit {\n  padding: 60px;\n  margin-bottom: 30px;\n  font-size: 18px;\n  font-weight: 200;\n  line-height: 30px;\n  color: inherit;\n  background-color: #e6e6e6;\n  -webkit-border-radius: 6px;\n  -moz-border-radius: 6px;\n  border-radius: 6px;\n}\n.hero-unit h1 {\n  margin-bottom: 0;\n  font-size: 60px;\n  line-height: 1;\n  color: inherit;\n  letter-spacing: -1px;\n}\n.hero-unit li {\n  line-height: 30px;\n}\n.pull-right {\n  float: right;\n}\n.pull-left {\n  float: left;\n}\n.hide {\n  display: none;\n}\n.show {\n  display: block;\n}\n.invisible {\n  visibility: hidden;\n}\n.affix {\n  position: fixed;\n}\n"
  },
  {
    "path": "public/css/colour-blue.css",
    "content": "/*/////////////////////////////////////////////////////////////////////\n // \n // Custom theme code styles\n // Written by Themelize.me (http://themelize.me)\n // \n // This is an empty starter template for overriding styles\n // set by Bootstrap & the theme\n // \n // ----------------------------------------------------\n // \n // Remove unused code for better performances\n // \n // ----------------------------------------------------\n // \n // @see - Usefuls tools online for editing\n // 1. http://charliepark.org/bootstrap_buttons/ - Button style generator\n // 2. http://www.colorzilla.com/gradient-editor/ - CSS3 gradient maker\n // \n // @note\n // To ensure custom styles are picked up\n // wrap definitions in body tag\n // ie.\n // body .navbar-inner {\n //   background: #ff0000;\n // }\n // \n /////////////////////////////////////////////////////////////////////*/\n.clearfix {\n  *zoom: 1;\n}\n.clearfix:before,\n.clearfix:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.clearfix:after {\n  clear: both;\n}\n.hide-text {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n.input-block-level {\n  display: block;\n  width: 100%;\n  min-height: 30px;\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\n/* primary colour */\n/* primary colour */\n/* primary colour */\n/* primary colour */\n/* primary colour */\n/* primary colour */\n/* primary colour */\n/*\n * --------------------------------------------------\n * 1. Common Elements\n *--------------------------------------------------\n */\nbody a {\n  color: #00adbb;\n  text-decoration: none;\n}\nbody a:hover {\n  color: #007e88;\n  text-decoration: underline;\n}\nbody .btn.btn-primary,\nbody .btn.btn-navbar {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #009aa7;\n  background-image: -moz-linear-gradient(top, #00adbb, #007e88);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#00adbb), to(#007e88));\n  background-image: -webkit-linear-gradient(top, #00adbb, #007e88);\n  background-image: -o-linear-gradient(top, #00adbb, #007e88);\n  background-image: linear-gradient(to bottom, #00adbb, #007e88);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff00adbb', endColorstr='#ff007e88', GradientType=0);\n  border-color: #007e88 #007e88 #00373b;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #007e88;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\nbody .btn.btn-primary:hover,\nbody .btn.btn-navbar:hover,\nbody .btn.btn-primary:active,\nbody .btn.btn-navbar:active,\nbody .btn.btn-primary.active,\nbody .btn.btn-navbar.active,\nbody .btn.btn-primary.disabled,\nbody .btn.btn-navbar.disabled,\nbody .btn.btn-primary[disabled],\nbody .btn.btn-navbar[disabled] {\n  color: #ffffff;\n  background-color: #007e88;\n  *background-color: #00666e;\n}\nbody .btn.btn-primary:active,\nbody .btn.btn-navbar:active,\nbody .btn.btn-primary.active,\nbody .btn.btn-navbar.active {\n  background-color: #004f55 \\9;\n}\nbody #footer {\n  border-top: 2px solid #00adbb;\n  /* primary colour */\n\n}\nbody #footer #toplink i {\n  color: #00adbb;\n  /* primary colour */\n\n}\nbody #header-hidden-link a.show-hide,\nbody .flexslider-wrapper .flex-control-nav li a.flex-active,\nbody .static-banner .flex-control-nav li a.flex-active {\n  background: #00adbb;\n  /* primary colour */\n\n}\n/*\n * --------------------------------------------------\n * 2. Header & Navigation \n *--------------------------------------------------\n */\nbody #navigation .header-hidden {\n  background: #00adbb;\n  /* primary colour */\n\n}\nbody #navigation .header {\n  border-top-color: #00adbb;\n  /* primary colour */\n\n}\nbody #navigation .brand {\n  color: #00adbb;\n  /* primary colour */\n\n}\nbody #navigation .btn-primary {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #009aa7;\n  background-image: -moz-linear-gradient(top, #00adbb, #007e88);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#00adbb), to(#007e88));\n  background-image: -webkit-linear-gradient(top, #00adbb, #007e88);\n  background-image: -o-linear-gradient(top, #00adbb, #007e88);\n  background-image: linear-gradient(to bottom, #00adbb, #007e88);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff00adbb', endColorstr='#ff007e88', GradientType=0);\n  border-color: #007e88 #007e88 #00373b;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #007e88;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  /* @see: Button maker: http://charliepark.org/bootstrap_buttons/ */\n\n}\nbody #navigation .btn-primary:hover,\nbody #navigation .btn-primary:active,\nbody #navigation .btn-primary.active,\nbody #navigation .btn-primary.disabled,\nbody #navigation .btn-primary[disabled] {\n  color: #ffffff;\n  background-color: #007e88;\n  *background-color: #00666e;\n}\nbody #navigation .btn-primary:active,\nbody #navigation .btn-primary.active {\n  background-color: #004f55 \\9;\n}\nbody #navigation .navbar-inner {\n  border-bottom-color: #00adbb;\n  /* primary colour */\n\n}\nbody #navigation .navbar-inverse .navbar-inner {\n  background-color: rgba(0, 173, 187, 0.22);\n  background-image: -moz-linear-gradient(top, rgba(0, 173, 187, 0.3), rgba(0, 173, 187, 0.1));\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(rgba(0, 173, 187, 0.3)), to(rgba(0, 173, 187, 0.1)));\n  background-image: -webkit-linear-gradient(top, rgba(0, 173, 187, 0.3), rgba(0, 173, 187, 0.1));\n  background-image: -o-linear-gradient(top, rgba(0, 173, 187, 0.3), rgba(0, 173, 187, 0.1));\n  background-image: linear-gradient(to bottom, rgba(0, 173, 187, 0.3), rgba(0, 173, 187, 0.1));\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#4d00adbb', endColorstr='#1a00adbb', GradientType=0);\n  /* @see: Gradient maker: http://www.colorzilla.com/gradient-editor/ */\n\n}\nbody #navigation .navbar .nav .divider-vertical {\n  border-left-color: #00666e;\n  border-right-color: rgba(255, 255, 255, 0.15);\n}\nbody #navigation .navbar .nav#main-menu li {\n  border-left-color: #00666e;\n  border-right-color: rgba(255, 255, 255, 0.15);\n}\nbody #navigation .navbar .nav#main-menu li.home-link a {\n  color: #00adbb;\n  /* primary colour */\n\n}\nbody #navigation .navbar .nav#main-menu .dropdown-menu {\n  border-bottom-color: #00adbb;\n  /* primary colour */\n\n}\nbody #navigation .navbar .nav#main-menu .dropdown-menu li a.menu-item:hover {\n  border-bottom-color: #00adbb;\n  /* primary colour */\n\n}\nbody #navigation .navbar .nav > li > a:focus,\nbody #navigation .navbar .nav > li > a:hover {\n  color: #ffffff;\n}\nbody #navigation .navbar .nav > .active > a,\nbody #navigation .navbar .nav > .active > a:hover,\nbody #navigation .navbar .nav > .active > a:focus {\n  color: #ffffff;\n}\nbody #navigation .navbar .nav > li > .btn,\nbody #navigation .navbar .nav > li > .btn-navbar {\n  color: #333333;\n  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);\n  background-color: #f5f5f5;\n  background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));\n  background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);\n  border-color: #e6e6e6 #e6e6e6 #bfbfbf;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #e6e6e6;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\nbody #navigation .navbar .nav > li > .btn:hover,\nbody #navigation .navbar .nav > li > .btn-navbar:hover,\nbody #navigation .navbar .nav > li > .btn:active,\nbody #navigation .navbar .nav > li > .btn-navbar:active,\nbody #navigation .navbar .nav > li > .btn.active,\nbody #navigation .navbar .nav > li > .btn-navbar.active,\nbody #navigation .navbar .nav > li > .btn.disabled,\nbody #navigation .navbar .nav > li > .btn-navbar.disabled,\nbody #navigation .navbar .nav > li > .btn[disabled],\nbody #navigation .navbar .nav > li > .btn-navbar[disabled] {\n  color: #333333;\n  background-color: #e6e6e6;\n  *background-color: #d9d9d9;\n}\nbody #navigation .navbar .nav > li > .btn:active,\nbody #navigation .navbar .nav > li > .btn-navbar:active,\nbody #navigation .navbar .nav > li > .btn.active,\nbody #navigation .navbar .nav > li > .btn-navbar.active {\n  background-color: #cccccc \\9;\n}\nbody #navigation .navbar .nav > li > .btn.btn-primary,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-primary,\nbody #navigation .navbar .nav > li > .btn.btn-navbar,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-navbar,\nbody #navigation .navbar .nav > li > .btn:focus,\nbody #navigation .navbar .nav > li > .btn-navbar:focus {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #009aa7;\n  background-image: -moz-linear-gradient(top, #00adbb, #007e88);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#00adbb), to(#007e88));\n  background-image: -webkit-linear-gradient(top, #00adbb, #007e88);\n  background-image: -o-linear-gradient(top, #00adbb, #007e88);\n  background-image: linear-gradient(to bottom, #00adbb, #007e88);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff00adbb', endColorstr='#ff007e88', GradientType=0);\n  border-color: #007e88 #007e88 #00373b;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #007e88;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\nbody #navigation .navbar .nav > li > .btn.btn-primary:hover,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-primary:hover,\nbody #navigation .navbar .nav > li > .btn.btn-navbar:hover,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-navbar:hover,\nbody #navigation .navbar .nav > li > .btn:focus:hover,\nbody #navigation .navbar .nav > li > .btn-navbar:focus:hover,\nbody #navigation .navbar .nav > li > .btn.btn-primary:active,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-primary:active,\nbody #navigation .navbar .nav > li > .btn.btn-navbar:active,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-navbar:active,\nbody #navigation .navbar .nav > li > .btn:focus:active,\nbody #navigation .navbar .nav > li > .btn-navbar:focus:active,\nbody #navigation .navbar .nav > li > .btn.btn-primary.active,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-primary.active,\nbody #navigation .navbar .nav > li > .btn.btn-navbar.active,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-navbar.active,\nbody #navigation .navbar .nav > li > .btn:focus.active,\nbody #navigation .navbar .nav > li > .btn-navbar:focus.active,\nbody #navigation .navbar .nav > li > .btn.btn-primary.disabled,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-primary.disabled,\nbody #navigation .navbar .nav > li > .btn.btn-navbar.disabled,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-navbar.disabled,\nbody #navigation .navbar .nav > li > .btn:focus.disabled,\nbody #navigation .navbar .nav > li > .btn-navbar:focus.disabled,\nbody #navigation .navbar .nav > li > .btn.btn-primary[disabled],\nbody #navigation .navbar .nav > li > .btn-navbar.btn-primary[disabled],\nbody #navigation .navbar .nav > li > .btn.btn-navbar[disabled],\nbody #navigation .navbar .nav > li > .btn-navbar.btn-navbar[disabled],\nbody #navigation .navbar .nav > li > .btn:focus[disabled],\nbody #navigation .navbar .nav > li > .btn-navbar:focus[disabled] {\n  color: #ffffff;\n  background-color: #007e88;\n  *background-color: #00666e;\n}\nbody #navigation .navbar .nav > li > .btn.btn-primary:active,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-primary:active,\nbody #navigation .navbar .nav > li > .btn.btn-navbar:active,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-navbar:active,\nbody #navigation .navbar .nav > li > .btn:focus:active,\nbody #navigation .navbar .nav > li > .btn-navbar:focus:active,\nbody #navigation .navbar .nav > li > .btn.btn-primary.active,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-primary.active,\nbody #navigation .navbar .nav > li > .btn.btn-navbar.active,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-navbar.active,\nbody #navigation .navbar .nav > li > .btn:focus.active,\nbody #navigation .navbar .nav > li > .btn-navbar:focus.active {\n  background-color: #004f55 \\9;\n}\nbody #navigation .navbar .nav > li > .dropdown-menu:before {\n  border-bottom-color: rgba(0, 0, 0, 0.2);\n}\nbody #navigation .navbar .nav > li > .dropdown-menu:after {\n  border-bottom: 6px solid #ffffff;\n}\nbody #navigation .navbar-fixed-bottom .nav > li > .dropdown-menu:before {\n  border-top-color: rgba(0, 0, 0, 0.2);\n}\nbody #navigation .navbar-fixed-bottom .nav > li > .dropdown-menu:after {\n  border-top: 6px solid #ffffff;\n}\nbody #navigation .navbar .nav li.dropdown > a:hover .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\nbody #navigation .navbar .nav li.dropdown.open > .dropdown-toggle,\nbody #navigation .navbar .nav li.dropdown.active > .dropdown-toggle,\nbody #navigation .navbar .nav li.dropdown.open.active > .dropdown-toggle {\n  color: #ffffff;\n}\nbody #navigation .navbar .nav li.dropdown > .dropdown-toggle .caret {\n  border-top-color: rgba(255, 255, 255, 0.8);\n  border-bottom-color: rgba(255, 255, 255, 0.8);\n}\nbody #navigation .navbar .nav li.dropdown.open > .dropdown-toggle .caret,\nbody #navigation .navbar .nav li.dropdown.active > .dropdown-toggle .caret,\nbody #navigation .navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\nbody #navigation .dropdown-menu .divider {\n  *width: 100%;\n  height: 1px;\n  margin: 9px 1px;\n  *margin: -5px 0 5px;\n  overflow: hidden;\n  background-color: #e5e5e5;\n  border-bottom: 1px solid #ffffff;\n}\nbody #navigation .dropdown-menu li > a {\n  color: #242424;\n}\nbody #navigation .dropdown-menu li > a:hover,\nbody #navigation .dropdown-menu li > a:focus,\nbody #navigation .dropdown-submenu:hover > a {\n  color: #ffffff;\n  background-color: rgba(31, 31, 31, 0.8);\n  background-image: -moz-linear-gradient(top, rgba(36, 36, 36, 0.8), rgba(23, 23, 23, 0.8));\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(rgba(36, 36, 36, 0.8)), to(rgba(23, 23, 23, 0.8)));\n  background-image: -webkit-linear-gradient(top, rgba(36, 36, 36, 0.8), rgba(23, 23, 23, 0.8));\n  background-image: -o-linear-gradient(top, rgba(36, 36, 36, 0.8), rgba(23, 23, 23, 0.8));\n  background-image: linear-gradient(to bottom, rgba(36, 36, 36, 0.8), rgba(23, 23, 23, 0.8));\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#cc242424', endColorstr='#cc171717', GradientType=0);\n  /* @see: Gradient maker: http://www.colorzilla.com/gradient-editor/ */\n\n}\nbody #navigation .dropdown-menu .active > a,\nbody #navigation .dropdown-menu .active > a:hover {\n  color: #242424;\n  background-color: rgba(31, 31, 31, 0.8);\n  background-image: -moz-linear-gradient(top, rgba(36, 36, 36, 0.8), rgba(23, 23, 23, 0.8));\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(rgba(36, 36, 36, 0.8)), to(rgba(23, 23, 23, 0.8)));\n  background-image: -webkit-linear-gradient(top, rgba(36, 36, 36, 0.8), rgba(23, 23, 23, 0.8));\n  background-image: -o-linear-gradient(top, rgba(36, 36, 36, 0.8), rgba(23, 23, 23, 0.8));\n  background-image: linear-gradient(to bottom, rgba(36, 36, 36, 0.8), rgba(23, 23, 23, 0.8));\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#cc242424', endColorstr='#cc171717', GradientType=0);\n  /* @see: Gradient maker: http://www.colorzilla.com/gradient-editor/ */\n\n}\n/*\n * --------------------------------------------------\n * 3. Content Area\n *-------------------------------------------------- \n */\nbody .pricing-stack .well .price {\n  color: #00adbb;\n  /* primary colour */\n\n}\nbody .pricing-stack .well.active {\n  border-color: #00adbb;\n  /* primary colour */\n\n}\nbody .pricing-stack .well.active .price {\n  background: #00adbb;\n  /* primary colour */\n\n  border-color: #00adbb;\n}\nbody .tabbable > ul.nav-tabs li.active a,\nbody ul.nav-tabs li.active a,\nbody .tabbable > ul.nav-tabs li.active a:hover,\nbody ul.nav-tabs li.active a:hover {\n  color: #00adbb;\n  border-top-color: #00adbb;\n  /* primary colour */\n\n}\nbody .section-menu ul.nav-list li.active > a,\nbody .section-menu ul.nav-list li.active > a:hover {\n  color: #00adbb;\n  border-left-color: #00adbb;\n  /* primary colour */\n\n}\nbody .stats .stat .well {\n  background-color: #007e88;\n  background-image: -webkit-gradient(radial, center center, 0, center center, 460, from(#00adbb), to(#007e88));\n  background-image: -webkit-radial-gradient(circle, #00adbb, #007e88);\n  background-image: -moz-radial-gradient(circle, #00adbb, #007e88);\n  background-image: -o-radial-gradient(circle, #00adbb, #007e88);\n  background-repeat: no-repeat;\n}\nbody .stats .stat .well:after {\n  border-top-color: #00adbb;\n  /* primary colour */\n\n}\nbody .date-wrapper span.date-m {\n  background: #00adbb;\n  /* primary colour */\n\n}\nbody .tags .tag {\n  color: #00adbb;\n  /* primary colour */\n\n}\n/*\n * --------------------------------------------------\n * 3. Misc\n * Other stuff\n *--------------------------------------------------\n */body .icon-inverse,\nli .icon-inverse {\n  background: #00adbb;\n  /* primary colour */\n\n}\nbody .icon-inverse-50,\nli .icon-inverse-50 {\n  background: rgba(0, 173, 187, 0.5);\n}\nbody .primary-colour {\n  color: #00adbb;\n  /* primary colour */\n\n}\nbody .primary-colour-bg {\n  background: #00adbb;\n  /* primary colour */\n\n}\nbody .primary-colour-bg-50 {\n  background: rgba(0, 173, 187, 0.5);\n}\nbody .spacer {\n  color: #00adbb;\n  /* primary colour */\n\n}\nbody .spacer.dark {\n  color: #007e88;\n}\nbody .social-media a:hover {\n  background: #00adbb;\n  /* primary colour */\n\n}\nbody a .de-em {\n  color: rgba(0, 173, 187, 0.8);\n}\n"
  },
  {
    "path": "public/css/colour-red.css",
    "content": "/*/////////////////////////////////////////////////////////////////////\n // \n // Custom theme code styles\n // Written by Themelize.me (http://themelize.me)\n // \n // This is an empty starter template for overriding styles\n // set by Bootstrap & the theme\n // \n // ----------------------------------------------------\n // \n // Remove unused code for better performances\n // \n // ----------------------------------------------------\n // \n // @see - Usefuls tools online for editing\n // 1. http://charliepark.org/bootstrap_buttons/ - Button style generator\n // 2. http://www.colorzilla.com/gradient-editor/ - CSS3 gradient maker\n // \n // @note\n // To ensure custom styles are picked up\n // wrap definitions in body tag\n // ie.\n // body .navbar-inner {\n //   background: #ff0000;\n // }\n // \n /////////////////////////////////////////////////////////////////////*/\n.clearfix {\n  *zoom: 1;\n}\n.clearfix:before,\n.clearfix:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.clearfix:after {\n  clear: both;\n}\n.hide-text {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n.input-block-level {\n  display: block;\n  width: 100%;\n  min-height: 30px;\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\n/* primary colour */\n/* primary colour */\n/* primary colour */\n/* primary colour */\n/* primary colour */\n/* primary colour */\n/* primary colour */\n/*\n * --------------------------------------------------\n * 1. Common Elements\n *--------------------------------------------------\n */\nbody a {\n  color: #be3e1d;\n  text-decoration: none;\n}\nbody a:hover {\n  color: #923016;\n  text-decoration: underline;\n}\nbody .btn.btn-primary,\nbody .btn.btn-navbar {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #ac381a;\n  background-image: -moz-linear-gradient(top, #be3e1d, #923016);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#be3e1d), to(#923016));\n  background-image: -webkit-linear-gradient(top, #be3e1d, #923016);\n  background-image: -o-linear-gradient(top, #be3e1d, #923016);\n  background-image: linear-gradient(to bottom, #be3e1d, #923016);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffbe3e1d', endColorstr='#ff923016', GradientType=0);\n  border-color: #923016 #923016 #4f1a0c;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #923016;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\nbody .btn.btn-primary:hover,\nbody .btn.btn-navbar:hover,\nbody .btn.btn-primary:active,\nbody .btn.btn-navbar:active,\nbody .btn.btn-primary.active,\nbody .btn.btn-navbar.active,\nbody .btn.btn-primary.disabled,\nbody .btn.btn-navbar.disabled,\nbody .btn.btn-primary[disabled],\nbody .btn.btn-navbar[disabled] {\n  color: #ffffff;\n  background-color: #923016;\n  *background-color: #7c2813;\n}\nbody .btn.btn-primary:active,\nbody .btn.btn-navbar:active,\nbody .btn.btn-primary.active,\nbody .btn.btn-navbar.active {\n  background-color: #66210f \\9;\n}\nbody #footer {\n  border-top: 2px solid #be3e1d;\n  /* primary colour */\n\n}\nbody #footer #toplink i {\n  color: #be3e1d;\n  /* primary colour */\n\n}\nbody #header-hidden-link a.show-hide,\nbody .flexslider-wrapper .flex-control-nav li a.flex-active,\nbody .static-banner .flex-control-nav li a.flex-active {\n  background: #be3e1d;\n  /* primary colour */\n\n}\n/*\n * --------------------------------------------------\n * 2. Header & Navigation \n *--------------------------------------------------\n */\nbody #navigation .header-hidden {\n  background: #be3e1d;\n  /* primary colour */\n\n}\nbody #navigation .header {\n  border-top-color: #be3e1d;\n  /* primary colour */\n\n}\nbody #navigation .brand {\n  color: #be3e1d;\n  /* primary colour */\n\n}\nbody #navigation .btn-primary {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #ac381a;\n  background-image: -moz-linear-gradient(top, #be3e1d, #923016);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#be3e1d), to(#923016));\n  background-image: -webkit-linear-gradient(top, #be3e1d, #923016);\n  background-image: -o-linear-gradient(top, #be3e1d, #923016);\n  background-image: linear-gradient(to bottom, #be3e1d, #923016);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffbe3e1d', endColorstr='#ff923016', GradientType=0);\n  border-color: #923016 #923016 #4f1a0c;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #923016;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  /* @see: Button maker: http://charliepark.org/bootstrap_buttons/ */\n\n}\nbody #navigation .btn-primary:hover,\nbody #navigation .btn-primary:active,\nbody #navigation .btn-primary.active,\nbody #navigation .btn-primary.disabled,\nbody #navigation .btn-primary[disabled] {\n  color: #ffffff;\n  background-color: #923016;\n  *background-color: #7c2813;\n}\nbody #navigation .btn-primary:active,\nbody #navigation .btn-primary.active {\n  background-color: #66210f \\9;\n}\nbody #navigation .navbar-inner {\n  border-bottom-color: #be3e1d;\n  /* primary colour */\n\n}\nbody #navigation .navbar-inverse .navbar-inner {\n  background-color: rgba(190, 62, 29, 0.22);\n  background-image: -moz-linear-gradient(top, rgba(190, 62, 29, 0.3), rgba(190, 62, 29, 0.1));\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(rgba(190, 62, 29, 0.3)), to(rgba(190, 62, 29, 0.1)));\n  background-image: -webkit-linear-gradient(top, rgba(190, 62, 29, 0.3), rgba(190, 62, 29, 0.1));\n  background-image: -o-linear-gradient(top, rgba(190, 62, 29, 0.3), rgba(190, 62, 29, 0.1));\n  background-image: linear-gradient(to bottom, rgba(190, 62, 29, 0.3), rgba(190, 62, 29, 0.1));\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#4dbe3e1d', endColorstr='#1abe3e1d', GradientType=0);\n  /* @see: Gradient maker: http://www.colorzilla.com/gradient-editor/ */\n\n}\nbody #navigation .navbar .nav .divider-vertical {\n  border-left-color: #7c2813;\n  border-right-color: rgba(255, 255, 255, 0.15);\n}\nbody #navigation .navbar .nav#main-menu li {\n  border-left-color: #7c2813;\n  border-right-color: rgba(255, 255, 255, 0.15);\n}\nbody #navigation .navbar .nav#main-menu li.home-link a {\n  color: #be3e1d;\n  /* primary colour */\n\n}\nbody #navigation .navbar .nav#main-menu .dropdown-menu {\n  border-bottom-color: #be3e1d;\n  /* primary colour */\n\n}\nbody #navigation .navbar .nav#main-menu .dropdown-menu li a.menu-item:hover {\n  border-bottom-color: #be3e1d;\n  /* primary colour */\n\n}\nbody #navigation .navbar .nav > li > a:focus,\nbody #navigation .navbar .nav > li > a:hover {\n  color: #ffffff;\n}\nbody #navigation .navbar .nav > .active > a,\nbody #navigation .navbar .nav > .active > a:hover,\nbody #navigation .navbar .nav > .active > a:focus {\n  color: #ffffff;\n}\nbody #navigation .navbar .nav > li > .btn,\nbody #navigation .navbar .nav > li > .btn-navbar {\n  color: #333333;\n  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);\n  background-color: #f5f5f5;\n  background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));\n  background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);\n  border-color: #e6e6e6 #e6e6e6 #bfbfbf;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #e6e6e6;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\nbody #navigation .navbar .nav > li > .btn:hover,\nbody #navigation .navbar .nav > li > .btn-navbar:hover,\nbody #navigation .navbar .nav > li > .btn:active,\nbody #navigation .navbar .nav > li > .btn-navbar:active,\nbody #navigation .navbar .nav > li > .btn.active,\nbody #navigation .navbar .nav > li > .btn-navbar.active,\nbody #navigation .navbar .nav > li > .btn.disabled,\nbody #navigation .navbar .nav > li > .btn-navbar.disabled,\nbody #navigation .navbar .nav > li > .btn[disabled],\nbody #navigation .navbar .nav > li > .btn-navbar[disabled] {\n  color: #333333;\n  background-color: #e6e6e6;\n  *background-color: #d9d9d9;\n}\nbody #navigation .navbar .nav > li > .btn:active,\nbody #navigation .navbar .nav > li > .btn-navbar:active,\nbody #navigation .navbar .nav > li > .btn.active,\nbody #navigation .navbar .nav > li > .btn-navbar.active {\n  background-color: #cccccc \\9;\n}\nbody #navigation .navbar .nav > li > .btn.btn-primary,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-primary,\nbody #navigation .navbar .nav > li > .btn.btn-navbar,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-navbar,\nbody #navigation .navbar .nav > li > .btn:focus,\nbody #navigation .navbar .nav > li > .btn-navbar:focus {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #ac381a;\n  background-image: -moz-linear-gradient(top, #be3e1d, #923016);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#be3e1d), to(#923016));\n  background-image: -webkit-linear-gradient(top, #be3e1d, #923016);\n  background-image: -o-linear-gradient(top, #be3e1d, #923016);\n  background-image: linear-gradient(to bottom, #be3e1d, #923016);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffbe3e1d', endColorstr='#ff923016', GradientType=0);\n  border-color: #923016 #923016 #4f1a0c;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #923016;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\nbody #navigation .navbar .nav > li > .btn.btn-primary:hover,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-primary:hover,\nbody #navigation .navbar .nav > li > .btn.btn-navbar:hover,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-navbar:hover,\nbody #navigation .navbar .nav > li > .btn:focus:hover,\nbody #navigation .navbar .nav > li > .btn-navbar:focus:hover,\nbody #navigation .navbar .nav > li > .btn.btn-primary:active,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-primary:active,\nbody #navigation .navbar .nav > li > .btn.btn-navbar:active,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-navbar:active,\nbody #navigation .navbar .nav > li > .btn:focus:active,\nbody #navigation .navbar .nav > li > .btn-navbar:focus:active,\nbody #navigation .navbar .nav > li > .btn.btn-primary.active,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-primary.active,\nbody #navigation .navbar .nav > li > .btn.btn-navbar.active,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-navbar.active,\nbody #navigation .navbar .nav > li > .btn:focus.active,\nbody #navigation .navbar .nav > li > .btn-navbar:focus.active,\nbody #navigation .navbar .nav > li > .btn.btn-primary.disabled,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-primary.disabled,\nbody #navigation .navbar .nav > li > .btn.btn-navbar.disabled,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-navbar.disabled,\nbody #navigation .navbar .nav > li > .btn:focus.disabled,\nbody #navigation .navbar .nav > li > .btn-navbar:focus.disabled,\nbody #navigation .navbar .nav > li > .btn.btn-primary[disabled],\nbody #navigation .navbar .nav > li > .btn-navbar.btn-primary[disabled],\nbody #navigation .navbar .nav > li > .btn.btn-navbar[disabled],\nbody #navigation .navbar .nav > li > .btn-navbar.btn-navbar[disabled],\nbody #navigation .navbar .nav > li > .btn:focus[disabled],\nbody #navigation .navbar .nav > li > .btn-navbar:focus[disabled] {\n  color: #ffffff;\n  background-color: #923016;\n  *background-color: #7c2813;\n}\nbody #navigation .navbar .nav > li > .btn.btn-primary:active,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-primary:active,\nbody #navigation .navbar .nav > li > .btn.btn-navbar:active,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-navbar:active,\nbody #navigation .navbar .nav > li > .btn:focus:active,\nbody #navigation .navbar .nav > li > .btn-navbar:focus:active,\nbody #navigation .navbar .nav > li > .btn.btn-primary.active,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-primary.active,\nbody #navigation .navbar .nav > li > .btn.btn-navbar.active,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-navbar.active,\nbody #navigation .navbar .nav > li > .btn:focus.active,\nbody #navigation .navbar .nav > li > .btn-navbar:focus.active {\n  background-color: #66210f \\9;\n}\nbody #navigation .navbar .nav > li > .dropdown-menu:before {\n  border-bottom-color: rgba(0, 0, 0, 0.2);\n}\nbody #navigation .navbar .nav > li > .dropdown-menu:after {\n  border-bottom: 6px solid #ffffff;\n}\nbody #navigation .navbar-fixed-bottom .nav > li > .dropdown-menu:before {\n  border-top-color: rgba(0, 0, 0, 0.2);\n}\nbody #navigation .navbar-fixed-bottom .nav > li > .dropdown-menu:after {\n  border-top: 6px solid #ffffff;\n}\nbody #navigation .navbar .nav li.dropdown > a:hover .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\nbody #navigation .navbar .nav li.dropdown.open > .dropdown-toggle,\nbody #navigation .navbar .nav li.dropdown.active > .dropdown-toggle,\nbody #navigation .navbar .nav li.dropdown.open.active > .dropdown-toggle {\n  color: #ffffff;\n}\nbody #navigation .navbar .nav li.dropdown > .dropdown-toggle .caret {\n  border-top-color: rgba(255, 255, 255, 0.8);\n  border-bottom-color: rgba(255, 255, 255, 0.8);\n}\nbody #navigation .navbar .nav li.dropdown.open > .dropdown-toggle .caret,\nbody #navigation .navbar .nav li.dropdown.active > .dropdown-toggle .caret,\nbody #navigation .navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\nbody #navigation .dropdown-menu .divider {\n  *width: 100%;\n  height: 1px;\n  margin: 9px 1px;\n  *margin: -5px 0 5px;\n  overflow: hidden;\n  background-color: #e5e5e5;\n  border-bottom: 1px solid #ffffff;\n}\nbody #navigation .dropdown-menu li > a {\n  color: #242424;\n}\nbody #navigation .dropdown-menu li > a:hover,\nbody #navigation .dropdown-menu li > a:focus,\nbody #navigation .dropdown-submenu:hover > a {\n  color: #ffffff;\n  background-color: rgba(31, 31, 31, 0.8);\n  background-image: -moz-linear-gradient(top, rgba(36, 36, 36, 0.8), rgba(23, 23, 23, 0.8));\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(rgba(36, 36, 36, 0.8)), to(rgba(23, 23, 23, 0.8)));\n  background-image: -webkit-linear-gradient(top, rgba(36, 36, 36, 0.8), rgba(23, 23, 23, 0.8));\n  background-image: -o-linear-gradient(top, rgba(36, 36, 36, 0.8), rgba(23, 23, 23, 0.8));\n  background-image: linear-gradient(to bottom, rgba(36, 36, 36, 0.8), rgba(23, 23, 23, 0.8));\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#cc242424', endColorstr='#cc171717', GradientType=0);\n  /* @see: Gradient maker: http://www.colorzilla.com/gradient-editor/ */\n\n}\nbody #navigation .dropdown-menu .active > a,\nbody #navigation .dropdown-menu .active > a:hover {\n  color: #242424;\n  background-color: rgba(31, 31, 31, 0.8);\n  background-image: -moz-linear-gradient(top, rgba(36, 36, 36, 0.8), rgba(23, 23, 23, 0.8));\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(rgba(36, 36, 36, 0.8)), to(rgba(23, 23, 23, 0.8)));\n  background-image: -webkit-linear-gradient(top, rgba(36, 36, 36, 0.8), rgba(23, 23, 23, 0.8));\n  background-image: -o-linear-gradient(top, rgba(36, 36, 36, 0.8), rgba(23, 23, 23, 0.8));\n  background-image: linear-gradient(to bottom, rgba(36, 36, 36, 0.8), rgba(23, 23, 23, 0.8));\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#cc242424', endColorstr='#cc171717', GradientType=0);\n  /* @see: Gradient maker: http://www.colorzilla.com/gradient-editor/ */\n\n}\n/*\n * --------------------------------------------------\n * 3. Content Area\n *-------------------------------------------------- \n */\nbody .pricing-stack .well .price {\n  color: #be3e1d;\n  /* primary colour */\n\n}\nbody .pricing-stack .well.active {\n  border-color: #be3e1d;\n  /* primary colour */\n\n}\nbody .pricing-stack .well.active .price {\n  background: #be3e1d;\n  /* primary colour */\n\n  border-color: #be3e1d;\n}\nbody .tabbable > ul.nav-tabs li.active a,\nbody ul.nav-tabs li.active a,\nbody .tabbable > ul.nav-tabs li.active a:hover,\nbody ul.nav-tabs li.active a:hover {\n  color: #be3e1d;\n  border-top-color: #be3e1d;\n  /* primary colour */\n\n}\nbody .section-menu ul.nav-list li.active > a,\nbody .section-menu ul.nav-list li.active > a:hover {\n  color: #be3e1d;\n  border-left-color: #be3e1d;\n  /* primary colour */\n\n}\nbody .stats .stat .well {\n  background-color: #923016;\n  background-image: -webkit-gradient(radial, center center, 0, center center, 460, from(#be3e1d), to(#923016));\n  background-image: -webkit-radial-gradient(circle, #be3e1d, #923016);\n  background-image: -moz-radial-gradient(circle, #be3e1d, #923016);\n  background-image: -o-radial-gradient(circle, #be3e1d, #923016);\n  background-repeat: no-repeat;\n}\nbody .stats .stat .well:after {\n  border-top-color: #be3e1d;\n  /* primary colour */\n\n}\nbody .date-wrapper span.date-m {\n  background: #be3e1d;\n  /* primary colour */\n\n}\nbody .tags .tag {\n  color: #be3e1d;\n  /* primary colour */\n\n}\n/*\n * --------------------------------------------------\n * 3. Misc\n * Other stuff\n *--------------------------------------------------\n */body .icon-inverse,\nli .icon-inverse {\n  background: #be3e1d;\n  /* primary colour */\n\n}\nbody .icon-inverse-50,\nli .icon-inverse-50 {\n  background: rgba(190, 62, 29, 0.5);\n}\nbody .primary-colour {\n  color: #be3e1d;\n  /* primary colour */\n\n}\nbody .primary-colour-bg {\n  background: #be3e1d;\n  /* primary colour */\n\n}\nbody .primary-colour-bg-50 {\n  background: rgba(190, 62, 29, 0.5);\n}\nbody .spacer {\n  color: #be3e1d;\n  /* primary colour */\n\n}\nbody .spacer.dark {\n  color: #923016;\n}\nbody .social-media a:hover {\n  background: #be3e1d;\n  /* primary colour */\n\n}\nbody a .de-em {\n  color: rgba(190, 62, 29, 0.8);\n}\n"
  },
  {
    "path": "public/css/custom-colour.css",
    "content": "/*/////////////////////////////////////////////////////////////////////\n // \n // Custom theme code styles\n // Written by Themelize.me (http://themelize.me)\n // \n // This is an empty starter template for overriding styles\n // set by Bootstrap & the theme\n // \n // ----------------------------------------------------\n // \n // Remove unused code for better performances\n // \n // ----------------------------------------------------\n // \n // @see - Usefuls tools online for editing\n // 1. http://charliepark.org/bootstrap_buttons/ - Button style generator\n // 2. http://www.colorzilla.com/gradient-editor/ - CSS3 gradient maker\n // \n // @note\n // To ensure custom styles are picked up\n // wrap definitions in body tag\n // ie.\n // body .navbar-inner {\n //   background: #ff0000;\n // }\n // \n /////////////////////////////////////////////////////////////////////*/\n.clearfix {\n  *zoom: 1;\n}\n.clearfix:before,\n.clearfix:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.clearfix:after {\n  clear: both;\n}\n.hide-text {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n.input-block-level {\n  display: block;\n  width: 100%;\n  min-height: 30px;\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\n/* primary colour */\n/* primary colour */\n/* primary colour */\n/* primary colour */\n/* primary colour */\n/* primary colour */\n/* primary colour */\n/*\n * --------------------------------------------------\n * 1. Common Elements\n *--------------------------------------------------\n */\nbody a {\n  color: #00adbb;\n  text-decoration: none;\n}\nbody a:hover {\n  color: #007e88;\n  text-decoration: underline;\n}\nbody .btn.btn-primary,\nbody .btn.btn-navbar {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #009aa7;\n  background-image: -moz-linear-gradient(top, #00adbb, #007e88);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#00adbb), to(#007e88));\n  background-image: -webkit-linear-gradient(top, #00adbb, #007e88);\n  background-image: -o-linear-gradient(top, #00adbb, #007e88);\n  background-image: linear-gradient(to bottom, #00adbb, #007e88);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff00adbb', endColorstr='#ff007e88', GradientType=0);\n  border-color: #007e88 #007e88 #00373b;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #007e88;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\nbody .btn.btn-primary:hover,\nbody .btn.btn-navbar:hover,\nbody .btn.btn-primary:active,\nbody .btn.btn-navbar:active,\nbody .btn.btn-primary.active,\nbody .btn.btn-navbar.active,\nbody .btn.btn-primary.disabled,\nbody .btn.btn-navbar.disabled,\nbody .btn.btn-primary[disabled],\nbody .btn.btn-navbar[disabled] {\n  color: #ffffff;\n  background-color: #007e88;\n  *background-color: #00666e;\n}\nbody .btn.btn-primary:active,\nbody .btn.btn-navbar:active,\nbody .btn.btn-primary.active,\nbody .btn.btn-navbar.active {\n  background-color: #004f55 \\9;\n}\nbody #footer {\n  border-top: 2px solid #00adbb;\n  /* primary colour */\n\n}\nbody #footer #toplink i {\n  color: #00adbb;\n  /* primary colour */\n\n}\nbody #header-hidden-link a.show-hide,\nbody .flexslider-wrapper .flex-control-nav li a.flex-active,\nbody .static-banner .flex-control-nav li a.flex-active {\n  background: #00adbb;\n  /* primary colour */\n\n}\n/*\n * --------------------------------------------------\n * 2. Header & Navigation \n *--------------------------------------------------\n */\nbody #navigation .header-hidden {\n  background: #00adbb;\n  /* primary colour */\n\n}\nbody #navigation .header {\n  border-top-color: #00adbb;\n  /* primary colour */\n\n}\nbody #navigation .brand {\n  color: #00adbb;\n  /* primary colour */\n\n}\nbody #navigation .btn-primary {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #009aa7;\n  background-image: -moz-linear-gradient(top, #00adbb, #007e88);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#00adbb), to(#007e88));\n  background-image: -webkit-linear-gradient(top, #00adbb, #007e88);\n  background-image: -o-linear-gradient(top, #00adbb, #007e88);\n  background-image: linear-gradient(to bottom, #00adbb, #007e88);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff00adbb', endColorstr='#ff007e88', GradientType=0);\n  border-color: #007e88 #007e88 #00373b;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #007e88;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  /* @see: Button maker: http://charliepark.org/bootstrap_buttons/ */\n\n}\nbody #navigation .btn-primary:hover,\nbody #navigation .btn-primary:active,\nbody #navigation .btn-primary.active,\nbody #navigation .btn-primary.disabled,\nbody #navigation .btn-primary[disabled] {\n  color: #ffffff;\n  background-color: #007e88;\n  *background-color: #00666e;\n}\nbody #navigation .btn-primary:active,\nbody #navigation .btn-primary.active {\n  background-color: #004f55 \\9;\n}\nbody #navigation .navbar-inner {\n  border-bottom-color: #00adbb;\n  /* primary colour */\n\n}\nbody #navigation .navbar-inverse .navbar-inner {\n  background-color: rgba(0, 173, 187, 0.22);\n  background-image: -moz-linear-gradient(top, rgba(0, 173, 187, 0.3), rgba(0, 173, 187, 0.1));\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(rgba(0, 173, 187, 0.3)), to(rgba(0, 173, 187, 0.1)));\n  background-image: -webkit-linear-gradient(top, rgba(0, 173, 187, 0.3), rgba(0, 173, 187, 0.1));\n  background-image: -o-linear-gradient(top, rgba(0, 173, 187, 0.3), rgba(0, 173, 187, 0.1));\n  background-image: linear-gradient(to bottom, rgba(0, 173, 187, 0.3), rgba(0, 173, 187, 0.1));\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#4d00adbb', endColorstr='#1a00adbb', GradientType=0);\n  /* @see: Gradient maker: http://www.colorzilla.com/gradient-editor/ */\n\n}\nbody #navigation .navbar .nav .divider-vertical {\n  border-left-color: #00666e;\n  border-right-color: rgba(255, 255, 255, 0.15);\n}\nbody #navigation .navbar .nav#main-menu li {\n  border-left-color: #00666e;\n  border-right-color: rgba(255, 255, 255, 0.15);\n}\nbody #navigation .navbar .nav#main-menu li.home-link a {\n  color: #00adbb;\n  /* primary colour */\n\n}\nbody #navigation .navbar .nav#main-menu .dropdown-menu {\n  border-bottom-color: #00adbb;\n  /* primary colour */\n\n}\nbody #navigation .navbar .nav#main-menu .dropdown-menu li a.menu-item:hover {\n  border-bottom-color: #00adbb;\n  /* primary colour */\n\n}\nbody #navigation .navbar .nav > li > a:focus,\nbody #navigation .navbar .nav > li > a:hover {\n  color: #ffffff;\n}\nbody #navigation .navbar .nav > .active > a,\nbody #navigation .navbar .nav > .active > a:hover,\nbody #navigation .navbar .nav > .active > a:focus {\n  color: #ffffff;\n}\nbody #navigation .navbar .nav > li > .btn,\nbody #navigation .navbar .nav > li > .btn-navbar {\n  color: #333333;\n  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);\n  background-color: #f5f5f5;\n  background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));\n  background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);\n  border-color: #e6e6e6 #e6e6e6 #bfbfbf;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #e6e6e6;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\nbody #navigation .navbar .nav > li > .btn:hover,\nbody #navigation .navbar .nav > li > .btn-navbar:hover,\nbody #navigation .navbar .nav > li > .btn:active,\nbody #navigation .navbar .nav > li > .btn-navbar:active,\nbody #navigation .navbar .nav > li > .btn.active,\nbody #navigation .navbar .nav > li > .btn-navbar.active,\nbody #navigation .navbar .nav > li > .btn.disabled,\nbody #navigation .navbar .nav > li > .btn-navbar.disabled,\nbody #navigation .navbar .nav > li > .btn[disabled],\nbody #navigation .navbar .nav > li > .btn-navbar[disabled] {\n  color: #333333;\n  background-color: #e6e6e6;\n  *background-color: #d9d9d9;\n}\nbody #navigation .navbar .nav > li > .btn:active,\nbody #navigation .navbar .nav > li > .btn-navbar:active,\nbody #navigation .navbar .nav > li > .btn.active,\nbody #navigation .navbar .nav > li > .btn-navbar.active {\n  background-color: #cccccc \\9;\n}\nbody #navigation .navbar .nav > li > .btn.btn-primary,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-primary,\nbody #navigation .navbar .nav > li > .btn.btn-navbar,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-navbar,\nbody #navigation .navbar .nav > li > .btn:focus,\nbody #navigation .navbar .nav > li > .btn-navbar:focus {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #009aa7;\n  background-image: -moz-linear-gradient(top, #00adbb, #007e88);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#00adbb), to(#007e88));\n  background-image: -webkit-linear-gradient(top, #00adbb, #007e88);\n  background-image: -o-linear-gradient(top, #00adbb, #007e88);\n  background-image: linear-gradient(to bottom, #00adbb, #007e88);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff00adbb', endColorstr='#ff007e88', GradientType=0);\n  border-color: #007e88 #007e88 #00373b;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #007e88;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\nbody #navigation .navbar .nav > li > .btn.btn-primary:hover,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-primary:hover,\nbody #navigation .navbar .nav > li > .btn.btn-navbar:hover,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-navbar:hover,\nbody #navigation .navbar .nav > li > .btn:focus:hover,\nbody #navigation .navbar .nav > li > .btn-navbar:focus:hover,\nbody #navigation .navbar .nav > li > .btn.btn-primary:active,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-primary:active,\nbody #navigation .navbar .nav > li > .btn.btn-navbar:active,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-navbar:active,\nbody #navigation .navbar .nav > li > .btn:focus:active,\nbody #navigation .navbar .nav > li > .btn-navbar:focus:active,\nbody #navigation .navbar .nav > li > .btn.btn-primary.active,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-primary.active,\nbody #navigation .navbar .nav > li > .btn.btn-navbar.active,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-navbar.active,\nbody #navigation .navbar .nav > li > .btn:focus.active,\nbody #navigation .navbar .nav > li > .btn-navbar:focus.active,\nbody #navigation .navbar .nav > li > .btn.btn-primary.disabled,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-primary.disabled,\nbody #navigation .navbar .nav > li > .btn.btn-navbar.disabled,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-navbar.disabled,\nbody #navigation .navbar .nav > li > .btn:focus.disabled,\nbody #navigation .navbar .nav > li > .btn-navbar:focus.disabled,\nbody #navigation .navbar .nav > li > .btn.btn-primary[disabled],\nbody #navigation .navbar .nav > li > .btn-navbar.btn-primary[disabled],\nbody #navigation .navbar .nav > li > .btn.btn-navbar[disabled],\nbody #navigation .navbar .nav > li > .btn-navbar.btn-navbar[disabled],\nbody #navigation .navbar .nav > li > .btn:focus[disabled],\nbody #navigation .navbar .nav > li > .btn-navbar:focus[disabled] {\n  color: #ffffff;\n  background-color: #007e88;\n  *background-color: #00666e;\n}\nbody #navigation .navbar .nav > li > .btn.btn-primary:active,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-primary:active,\nbody #navigation .navbar .nav > li > .btn.btn-navbar:active,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-navbar:active,\nbody #navigation .navbar .nav > li > .btn:focus:active,\nbody #navigation .navbar .nav > li > .btn-navbar:focus:active,\nbody #navigation .navbar .nav > li > .btn.btn-primary.active,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-primary.active,\nbody #navigation .navbar .nav > li > .btn.btn-navbar.active,\nbody #navigation .navbar .nav > li > .btn-navbar.btn-navbar.active,\nbody #navigation .navbar .nav > li > .btn:focus.active,\nbody #navigation .navbar .nav > li > .btn-navbar:focus.active {\n  background-color: #004f55 \\9;\n}\nbody #navigation .navbar .nav > li > .dropdown-menu:before {\n  border-bottom-color: rgba(0, 0, 0, 0.2);\n}\nbody #navigation .navbar .nav > li > .dropdown-menu:after {\n  border-bottom: 6px solid #ffffff;\n}\nbody #navigation .navbar-fixed-bottom .nav > li > .dropdown-menu:before {\n  border-top-color: rgba(0, 0, 0, 0.2);\n}\nbody #navigation .navbar-fixed-bottom .nav > li > .dropdown-menu:after {\n  border-top: 6px solid #ffffff;\n}\nbody #navigation .navbar .nav li.dropdown > a:hover .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\nbody #navigation .navbar .nav li.dropdown.open > .dropdown-toggle,\nbody #navigation .navbar .nav li.dropdown.active > .dropdown-toggle,\nbody #navigation .navbar .nav li.dropdown.open.active > .dropdown-toggle {\n  color: #ffffff;\n}\nbody #navigation .navbar .nav li.dropdown > .dropdown-toggle .caret {\n  border-top-color: rgba(255, 255, 255, 0.8);\n  border-bottom-color: rgba(255, 255, 255, 0.8);\n}\nbody #navigation .navbar .nav li.dropdown.open > .dropdown-toggle .caret,\nbody #navigation .navbar .nav li.dropdown.active > .dropdown-toggle .caret,\nbody #navigation .navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\nbody #navigation .dropdown-menu .divider {\n  *width: 100%;\n  height: 1px;\n  margin: 9px 1px;\n  *margin: -5px 0 5px;\n  overflow: hidden;\n  background-color: #e5e5e5;\n  border-bottom: 1px solid #ffffff;\n}\nbody #navigation .dropdown-menu li > a {\n  color: #242424;\n}\nbody #navigation .dropdown-menu li > a:hover,\nbody #navigation .dropdown-menu li > a:focus,\nbody #navigation .dropdown-submenu:hover > a {\n  color: #ffffff;\n  background-color: rgba(31, 31, 31, 0.8);\n  background-image: -moz-linear-gradient(top, rgba(36, 36, 36, 0.8), rgba(23, 23, 23, 0.8));\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(rgba(36, 36, 36, 0.8)), to(rgba(23, 23, 23, 0.8)));\n  background-image: -webkit-linear-gradient(top, rgba(36, 36, 36, 0.8), rgba(23, 23, 23, 0.8));\n  background-image: -o-linear-gradient(top, rgba(36, 36, 36, 0.8), rgba(23, 23, 23, 0.8));\n  background-image: linear-gradient(to bottom, rgba(36, 36, 36, 0.8), rgba(23, 23, 23, 0.8));\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#cc242424', endColorstr='#cc171717', GradientType=0);\n  /* @see: Gradient maker: http://www.colorzilla.com/gradient-editor/ */\n\n}\nbody #navigation .dropdown-menu .active > a,\nbody #navigation .dropdown-menu .active > a:hover {\n  color: #242424;\n  background-color: rgba(31, 31, 31, 0.8);\n  background-image: -moz-linear-gradient(top, rgba(36, 36, 36, 0.8), rgba(23, 23, 23, 0.8));\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(rgba(36, 36, 36, 0.8)), to(rgba(23, 23, 23, 0.8)));\n  background-image: -webkit-linear-gradient(top, rgba(36, 36, 36, 0.8), rgba(23, 23, 23, 0.8));\n  background-image: -o-linear-gradient(top, rgba(36, 36, 36, 0.8), rgba(23, 23, 23, 0.8));\n  background-image: linear-gradient(to bottom, rgba(36, 36, 36, 0.8), rgba(23, 23, 23, 0.8));\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#cc242424', endColorstr='#cc171717', GradientType=0);\n  /* @see: Gradient maker: http://www.colorzilla.com/gradient-editor/ */\n\n}\n/*\n * --------------------------------------------------\n * 3. Content Area\n *-------------------------------------------------- \n */\nbody .pricing-stack .well .price {\n  color: #00adbb;\n  /* primary colour */\n\n}\nbody .pricing-stack .well.active {\n  border-color: #00adbb;\n  /* primary colour */\n\n}\nbody .pricing-stack .well.active .price {\n  background: #00adbb;\n  /* primary colour */\n\n  border-color: #00adbb;\n}\nbody .tabbable > ul.nav-tabs li.active a,\nbody ul.nav-tabs li.active a,\nbody .tabbable > ul.nav-tabs li.active a:hover,\nbody ul.nav-tabs li.active a:hover {\n  color: #00adbb;\n  border-top-color: #00adbb;\n  /* primary colour */\n\n}\nbody .section-menu ul.nav-list li.active > a,\nbody .section-menu ul.nav-list li.active > a:hover {\n  color: #00adbb;\n  border-left-color: #00adbb;\n  /* primary colour */\n\n}\nbody .stats .stat .well {\n  background-color: #007e88;\n  background-image: -webkit-gradient(radial, center center, 0, center center, 460, from(#00adbb), to(#007e88));\n  background-image: -webkit-radial-gradient(circle, #00adbb, #007e88);\n  background-image: -moz-radial-gradient(circle, #00adbb, #007e88);\n  background-image: -o-radial-gradient(circle, #00adbb, #007e88);\n  background-repeat: no-repeat;\n}\nbody .stats .stat .well:after {\n  border-top-color: #00adbb;\n  /* primary colour */\n\n}\nbody .date-wrapper span.date-m {\n  background: #00adbb;\n  /* primary colour */\n\n}\nbody .tags .tag {\n  color: #00adbb;\n  /* primary colour */\n\n}\n/*\n * --------------------------------------------------\n * 3. Misc\n * Other stuff\n *--------------------------------------------------\n */body .icon-inverse,\nli .icon-inverse {\n  background: #00adbb;\n  /* primary colour */\n\n}\nbody .icon-inverse-50,\nli .icon-inverse-50 {\n  background: rgba(0, 173, 187, 0.5);\n}\nbody .primary-colour {\n  color: #00adbb;\n  /* primary colour */\n\n}\nbody .primary-colour-bg {\n  background: #00adbb;\n  /* primary colour */\n\n}\nbody .primary-colour-bg-50 {\n  background: rgba(0, 173, 187, 0.5);\n}\nbody .spacer {\n  color: #00adbb;\n  /* primary colour */\n\n}\nbody .spacer.dark {\n  color: #007e88;\n}\nbody .social-media a:hover {\n  background: #00adbb;\n  /* primary colour */\n\n}\nbody a .de-em {\n  color: rgba(0, 173, 187, 0.8);\n}\n"
  },
  {
    "path": "public/css/custom-style.css",
    "content": "/*/////////////////////////////////////////////////////////////////////\n // \n // Custom theme code styles\n // Written by Themelize.me (http://themelize.me)\n // \n // This is an empty starter template for overriding styles\n // set by Bootstrap & the theme\n // \n // ----------------------------------------------------\n // \n // Remove unused code for better performances\n // \n // ----------------------------------------------------\n // \n // @see - Usefuls tools online for editing\n // 1. http://charliepark.org/bootstrap_buttons/ - Button style generator\n // 2. http://www.colorzilla.com/gradient-editor/ - CSS3 gradient maker\n // \n // @note\n // To ensure custom styles are picked up\n // wrap definitions in body tag\n // ie.\n // body .navbar-inner {\n //   background: #ff0000;\n // }\n // \n /////////////////////////////////////////////////////////////////////*/\n/*\n * --------------------------------------------------\n * 1. General Elements\n *--------------------------------------------------\n */\n#navigation {\n  /* 1. Navigation wrapper */\n}\n#highlighted {\n  /* 2. Highlighted (below header) wrapper */\n}\n#content {\n  /* 3. Content wrapper */\n}\n#content-below {\n  /* 4. Content Below wrapper */\n}\n#footer {\n  /* 5. Footer wrapper */\n}\n/*\n * --------------------------------------------------\n * 2. Colours\n *-------------------------------------------------- \n */\n/*\n * --------------------------------------------------\n * 3. Responsiveness/media queries\n *--------------------------------------------------\n */\n@media (max-width: 979px) {\n  /* Navbar Collapsed (mobile) */\n}\n@media (min-width: 980px) {\n  /* Navbar Expanded (desktop) */\n}\n@media (min-width: 1200px) {\n  /* Responsive: Large desktop and up (wide) */\n}\n@media (max-width: 979px) {\n  /* Responsive: Mobile to desktop (common for all narrow devices) */\n}\n@media (min-width: 768px) and (max-width: 979px) {\n  /* Responsive: Tablet to desktop (normal) */\n}\n@media (max-width: 767px) {\n  /* Responsive: Landscape phone to desktop/tablet (narrow) */\n}\n@media (max-width: 480px) {\n  /* Responsive: Up to Landscape phone (mobile) */\n}\n/*\n * --------------------------------------------------\n * 4. Misc\n * Other stuff\n *--------------------------------------------------\n */\n\n"
  },
  {
    "path": "public/css/flexslider.css",
    "content": "/*\n * jQuery FlexSlider v2.0\n * http://www.woothemes.com/flexslider/\n *\n * Copyright 2012 WooThemes\n * Free to use under the GPLv2 license.\n * http://www.gnu.org/licenses/gpl-2.0.html\n *\n * Contributing author: Tyler Smith (@mbmufffin)\n */\n\n \n/* Browser Resets */\n.flex-container a:active,\n.flexslider a:active,\n.flex-container a:focus,\n.flexslider a:focus  {outline: none;}\n.slides,\n.flex-control-nav,\n.flex-direction-nav {margin: 0; padding: 0; list-style: none;} \n\n/* FlexSlider Necessary Styles\n*********************************/ \n.flexslider {margin: 0; padding: 0;}\n.flexslider .slides > li {display: none; -webkit-backface-visibility: hidden;} /* Hide the slides before the JS is loaded. Avoids image jumping */\n.flexslider .slides img {width: 100%; display: block;}\n.flex-pauseplay span {text-transform: capitalize;}\n\n/* Clearfix for the .slides element */\n.slides:after {content: \".\"; display: block; clear: both; visibility: hidden; line-height: 0; height: 0;} \nhtml[xmlns] .slides {display: block;} \n* html .slides {height: 1%;}\n\n/* No JavaScript Fallback */\n/* If you are not using another script, such as Modernizr, make sure you\n * include js that eliminates this class on page load */\n.no-js .slides > li:first-child {display: block;}\n\n\n/* FlexSlider Default Theme\n*********************************/\n.flexslider {margin: 0 0 60px; background: #fff; border: 4px solid #fff; position: relative; -webkit-border-radius: 4px; -moz-border-radius: 4px; -o-border-radius: 4px; border-radius: 4px; box-shadow: 0 1px 4px rgba(0,0,0,.2); -webkit-box-shadow: 0 1px 4px rgba(0,0,0,.2); -moz-box-shadow: 0 1px 4px rgba(0,0,0,.2); -o-box-shadow: 0 1px 4px rgba(0,0,0,.2); zoom: 1;}\n.flex-viewport {max-height: 2000px; -webkit-transition: all 1s ease; -moz-transition: all 1s ease; transition: all 1s ease;}\n.loading .flex-viewport {max-height: 300px;}\n.flexslider .slides {zoom: 1;}\n\n.carousel li {margin-right: 5px}\n\n\n/* Direction Nav */\n.flex-direction-nav {*height: 0;}\n.flex-direction-nav a {width: 30px; height: 30px; margin: -20px 0 0; display: block; background: url(../img/bg_direction_nav.png) no-repeat 0 0; position: absolute; top: 50%; z-index: 10; cursor: pointer; text-indent: -9999px; opacity: 0; -webkit-transition: all .3s ease;}\n.flex-direction-nav .flex-next {background-position: 100% 0; right: -36px; }\n.flex-direction-nav .flex-prev {left: -36px;}\n.flexslider:hover .flex-next {opacity: 0.8; right: 5px;}\n.flexslider:hover .flex-prev {opacity: 0.8; left: 5px;}\n.flexslider:hover .flex-next:hover, .flexslider:hover .flex-prev:hover {opacity: 1;}\n.flex-direction-nav .flex-disabled {opacity: .3!important; filter:alpha(opacity=30); cursor: default;}\n\n/* Control Nav */\n.flex-control-nav {width: 100%; position: absolute; bottom: -40px; text-align: center;}\n.flex-control-nav li {margin: 0 6px; display: inline-block; zoom: 1; *display: inline;}\n.flex-control-paging li a {width: 11px; height: 11px; display: block; background: #666; background: rgba(0,0,0,0.5); cursor: pointer; text-indent: -9999px; -webkit-border-radius: 20px; -moz-border-radius: 20px; -o-border-radius: 20px; border-radius: 20px; box-shadow: inset 0 0 3px rgba(0,0,0,0.3);}\n.flex-control-paging li a:hover { background: #333; background: rgba(0,0,0,0.7); }\n.flex-control-paging li a.flex-active { background: #000; background: rgba(0,0,0,0.9); cursor: default; }\n\n.flex-control-thumbs {margin: 5px 0 0; position: static; overflow: hidden;}\n.flex-control-thumbs li {width: 25%; float: left; margin: 0;}\n.flex-control-thumbs img {width: 100%; display: block; opacity: .7; cursor: pointer;}\n.flex-control-thumbs img:hover {opacity: 1;}\n.flex-control-thumbs .flex-active {opacity: 1; cursor: default;}\n\n@media screen and (max-width: 860px) {\n  .flex-direction-nav .flex-prev {opacity: 1; left: 0;}\n  .flex-direction-nav .flex-next {opacity: 1; right: 0;}\n}\n\n.slade-container {height: 250px;}\n.slade-container .text {padding-top: 10px; font-size: 35px; line-height: 39px; width: 80%; text-align: center; margin: 0 auto;}\n.slade-container a {display: block; width: 210px; margin: 15px auto;}\n\n\n"
  },
  {
    "path": "public/css/responsive.css",
    "content": "/*!\n * Bootstrap Responsive v2.2.2\n *\n * Copyright 2012 Twitter, Inc\n * Licensed under the Apache License v2.0\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Designed and built with all the love in the world @twitter by @mdo and @fat.\n */\n@-ms-viewport {\n  width: device-width;\n}\n.clearfix {\n  *zoom: 1;\n}\n.clearfix:before,\n.clearfix:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.clearfix:after {\n  clear: both;\n}\n.hide-text {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n.input-block-level {\n  display: block;\n  width: 100%;\n  min-height: 30px;\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\n.hidden {\n  display: none;\n  visibility: hidden;\n}\n.visible-phone {\n  display: none !important;\n}\n.visible-tablet {\n  display: none !important;\n}\n.hidden-desktop {\n  display: none !important;\n}\n.visible-desktop {\n  display: inherit !important;\n}\n@media (min-width: 768px) and (max-width: 979px) {\n  .hidden-desktop {\n    display: inherit !important;\n  }\n  .visible-desktop {\n    display: none !important ;\n  }\n  .visible-tablet {\n    display: inherit !important;\n  }\n  .hidden-tablet {\n    display: none !important;\n  }\n}\n@media (max-width: 767px) {\n  .hidden-desktop {\n    display: inherit !important;\n  }\n  .visible-desktop {\n    display: none !important;\n  }\n  .visible-phone {\n    display: inherit !important;\n  }\n  .hidden-phone {\n    display: none !important;\n  }\n}\n@media (min-width: 1200px) {\n  .row {\n    margin-left: -30px;\n    *zoom: 1;\n  }\n  .row:before,\n  .row:after {\n    display: table;\n    content: \"\";\n    line-height: 0;\n  }\n  .row:after {\n    clear: both;\n  }\n  [class*=\"span\"] {\n    float: left;\n    min-height: 1px;\n    margin-left: 30px;\n  }\n  .container,\n  .navbar-static-top .container,\n  .navbar-fixed-top .container,\n  .navbar-fixed-bottom .container {\n    width: 1170px;\n  }\n  .span12 {\n    width: 1170px;\n  }\n  .span11 {\n    width: 1070px;\n  }\n  .span10 {\n    width: 970px;\n  }\n  .span9 {\n    width: 870px;\n  }\n  .span8 {\n    width: 770px;\n  }\n  .span7 {\n    width: 670px;\n  }\n  .span6 {\n    width: 570px;\n  }\n  .span5 {\n    width: 470px;\n  }\n  .span4 {\n    width: 370px;\n  }\n  .span3 {\n    width: 270px;\n  }\n  .span2 {\n    width: 170px;\n  }\n  .span1 {\n    width: 70px;\n  }\n  .offset12 {\n    margin-left: 1230px;\n  }\n  .offset11 {\n    margin-left: 1130px;\n  }\n  .offset10 {\n    margin-left: 1030px;\n  }\n  .offset9 {\n    margin-left: 930px;\n  }\n  .offset8 {\n    margin-left: 830px;\n  }\n  .offset7 {\n    margin-left: 730px;\n  }\n  .offset6 {\n    margin-left: 630px;\n  }\n  .offset5 {\n    margin-left: 530px;\n  }\n  .offset4 {\n    margin-left: 430px;\n  }\n  .offset3 {\n    margin-left: 330px;\n  }\n  .offset2 {\n    margin-left: 230px;\n  }\n  .offset1 {\n    margin-left: 130px;\n  }\n  .row-fluid {\n    width: 100%;\n    *zoom: 1;\n  }\n  .row-fluid:before,\n  .row-fluid:after {\n    display: table;\n    content: \"\";\n    line-height: 0;\n  }\n  .row-fluid:after {\n    clear: both;\n  }\n  .row-fluid [class*=\"span\"] {\n    display: block;\n    width: 100%;\n    min-height: 30px;\n    -webkit-box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    box-sizing: border-box;\n    float: left;\n    margin-left: 2.564102564102564%;\n    *margin-left: 2.5109110747408616%;\n  }\n  .row-fluid [class*=\"span\"]:first-child {\n    margin-left: 0;\n  }\n  .row-fluid .controls-row [class*=\"span\"] + [class*=\"span\"] {\n    margin-left: 2.564102564102564%;\n  }\n  .row-fluid .span12 {\n    width: 100%;\n    *width: 99.94680851063829%;\n  }\n  .row-fluid .span11 {\n    width: 91.45299145299145%;\n    *width: 91.39979996362975%;\n  }\n  .row-fluid .span10 {\n    width: 82.90598290598291%;\n    *width: 82.8527914166212%;\n  }\n  .row-fluid .span9 {\n    width: 74.35897435897436%;\n    *width: 74.30578286961266%;\n  }\n  .row-fluid .span8 {\n    width: 65.81196581196582%;\n    *width: 65.75877432260411%;\n  }\n  .row-fluid .span7 {\n    width: 57.26495726495726%;\n    *width: 57.21176577559556%;\n  }\n  .row-fluid .span6 {\n    width: 48.717948717948715%;\n    *width: 48.664757228587014%;\n  }\n  .row-fluid .span5 {\n    width: 40.17094017094017%;\n    *width: 40.11774868157847%;\n  }\n  .row-fluid .span4 {\n    width: 31.623931623931625%;\n    *width: 31.570740134569924%;\n  }\n  .row-fluid .span3 {\n    width: 23.076923076923077%;\n    *width: 23.023731587561375%;\n  }\n  .row-fluid .span2 {\n    width: 14.52991452991453%;\n    *width: 14.476723040552828%;\n  }\n  .row-fluid .span1 {\n    width: 5.982905982905983%;\n    *width: 5.929714493544281%;\n  }\n  .row-fluid .offset12 {\n    margin-left: 105.12820512820512%;\n    *margin-left: 105.02182214948171%;\n  }\n  .row-fluid .offset12:first-child {\n    margin-left: 102.56410256410257%;\n    *margin-left: 102.45771958537915%;\n  }\n  .row-fluid .offset11 {\n    margin-left: 96.58119658119658%;\n    *margin-left: 96.47481360247316%;\n  }\n  .row-fluid .offset11:first-child {\n    margin-left: 94.01709401709402%;\n    *margin-left: 93.91071103837061%;\n  }\n  .row-fluid .offset10 {\n    margin-left: 88.03418803418803%;\n    *margin-left: 87.92780505546462%;\n  }\n  .row-fluid .offset10:first-child {\n    margin-left: 85.47008547008548%;\n    *margin-left: 85.36370249136206%;\n  }\n  .row-fluid .offset9 {\n    margin-left: 79.48717948717949%;\n    *margin-left: 79.38079650845607%;\n  }\n  .row-fluid .offset9:first-child {\n    margin-left: 76.92307692307693%;\n    *margin-left: 76.81669394435352%;\n  }\n  .row-fluid .offset8 {\n    margin-left: 70.94017094017094%;\n    *margin-left: 70.83378796144753%;\n  }\n  .row-fluid .offset8:first-child {\n    margin-left: 68.37606837606839%;\n    *margin-left: 68.26968539734497%;\n  }\n  .row-fluid .offset7 {\n    margin-left: 62.393162393162385%;\n    *margin-left: 62.28677941443899%;\n  }\n  .row-fluid .offset7:first-child {\n    margin-left: 59.82905982905982%;\n    *margin-left: 59.72267685033642%;\n  }\n  .row-fluid .offset6 {\n    margin-left: 53.84615384615384%;\n    *margin-left: 53.739770867430444%;\n  }\n  .row-fluid .offset6:first-child {\n    margin-left: 51.28205128205128%;\n    *margin-left: 51.175668303327875%;\n  }\n  .row-fluid .offset5 {\n    margin-left: 45.299145299145295%;\n    *margin-left: 45.1927623204219%;\n  }\n  .row-fluid .offset5:first-child {\n    margin-left: 42.73504273504273%;\n    *margin-left: 42.62865975631933%;\n  }\n  .row-fluid .offset4 {\n    margin-left: 36.75213675213675%;\n    *margin-left: 36.645753773413354%;\n  }\n  .row-fluid .offset4:first-child {\n    margin-left: 34.18803418803419%;\n    *margin-left: 34.081651209310785%;\n  }\n  .row-fluid .offset3 {\n    margin-left: 28.205128205128204%;\n    *margin-left: 28.0987452264048%;\n  }\n  .row-fluid .offset3:first-child {\n    margin-left: 25.641025641025642%;\n    *margin-left: 25.53464266230224%;\n  }\n  .row-fluid .offset2 {\n    margin-left: 19.65811965811966%;\n    *margin-left: 19.551736679396257%;\n  }\n  .row-fluid .offset2:first-child {\n    margin-left: 17.094017094017094%;\n    *margin-left: 16.98763411529369%;\n  }\n  .row-fluid .offset1 {\n    margin-left: 11.11111111111111%;\n    *margin-left: 11.004728132387708%;\n  }\n  .row-fluid .offset1:first-child {\n    margin-left: 8.547008547008547%;\n    *margin-left: 8.440625568285142%;\n  }\n  input,\n  textarea,\n  .uneditable-input {\n    margin-left: 0;\n  }\n  .controls-row [class*=\"span\"] + [class*=\"span\"] {\n    margin-left: 30px;\n  }\n  input.span12, textarea.span12, .uneditable-input.span12 {\n    width: 1156px;\n  }\n  input.span11, textarea.span11, .uneditable-input.span11 {\n    width: 1056px;\n  }\n  input.span10, textarea.span10, .uneditable-input.span10 {\n    width: 956px;\n  }\n  input.span9, textarea.span9, .uneditable-input.span9 {\n    width: 856px;\n  }\n  input.span8, textarea.span8, .uneditable-input.span8 {\n    width: 756px;\n  }\n  input.span7, textarea.span7, .uneditable-input.span7 {\n    width: 656px;\n  }\n  input.span6, textarea.span6, .uneditable-input.span6 {\n    width: 556px;\n  }\n  input.span5, textarea.span5, .uneditable-input.span5 {\n    width: 456px;\n  }\n  input.span4, textarea.span4, .uneditable-input.span4 {\n    width: 356px;\n  }\n  input.span3, textarea.span3, .uneditable-input.span3 {\n    width: 256px;\n  }\n  input.span2, textarea.span2, .uneditable-input.span2 {\n    width: 156px;\n  }\n  input.span1, textarea.span1, .uneditable-input.span1 {\n    width: 56px;\n  }\n  .thumbnails {\n    margin-left: -30px;\n  }\n  .thumbnails > li {\n    margin-left: 30px;\n  }\n  .row-fluid .thumbnails {\n    margin-left: 0;\n  }\n}\n@media (min-width: 768px) and (max-width: 979px) {\n  .row {\n    margin-left: -20px;\n    *zoom: 1;\n  }\n  .row:before,\n  .row:after {\n    display: table;\n    content: \"\";\n    line-height: 0;\n  }\n  .row:after {\n    clear: both;\n  }\n  [class*=\"span\"] {\n    float: left;\n    min-height: 1px;\n    margin-left: 20px;\n  }\n  .container,\n  .navbar-static-top .container,\n  .navbar-fixed-top .container,\n  .navbar-fixed-bottom .container {\n    width: 724px;\n  }\n  .span12 {\n    width: 724px;\n  }\n  .span11 {\n    width: 662px;\n  }\n  .span10 {\n    width: 600px;\n  }\n  .span9 {\n    width: 538px;\n  }\n  .span8 {\n    width: 476px;\n  }\n  .span7 {\n    width: 414px;\n  }\n  .span6 {\n    width: 352px;\n  }\n  .span5 {\n    width: 290px;\n  }\n  .span4 {\n    width: 228px;\n  }\n  .span3 {\n    width: 166px;\n  }\n  .span2 {\n    width: 104px;\n  }\n  .span1 {\n    width: 42px;\n  }\n  .offset12 {\n    margin-left: 764px;\n  }\n  .offset11 {\n    margin-left: 702px;\n  }\n  .offset10 {\n    margin-left: 640px;\n  }\n  .offset9 {\n    margin-left: 578px;\n  }\n  .offset8 {\n    margin-left: 516px;\n  }\n  .offset7 {\n    margin-left: 454px;\n  }\n  .offset6 {\n    margin-left: 392px;\n  }\n  .offset5 {\n    margin-left: 330px;\n  }\n  .offset4 {\n    margin-left: 268px;\n  }\n  .offset3 {\n    margin-left: 206px;\n  }\n  .offset2 {\n    margin-left: 144px;\n  }\n  .offset1 {\n    margin-left: 82px;\n  }\n  .row-fluid {\n    width: 100%;\n    *zoom: 1;\n  }\n  .row-fluid:before,\n  .row-fluid:after {\n    display: table;\n    content: \"\";\n    line-height: 0;\n  }\n  .row-fluid:after {\n    clear: both;\n  }\n  .row-fluid [class*=\"span\"] {\n    display: block;\n    width: 100%;\n    min-height: 30px;\n    -webkit-box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    box-sizing: border-box;\n    float: left;\n    margin-left: 2.7624309392265194%;\n    *margin-left: 2.709239449864817%;\n  }\n  .row-fluid [class*=\"span\"]:first-child {\n    margin-left: 0;\n  }\n  .row-fluid .controls-row [class*=\"span\"] + [class*=\"span\"] {\n    margin-left: 2.7624309392265194%;\n  }\n  .row-fluid .span12 {\n    width: 100%;\n    *width: 99.94680851063829%;\n  }\n  .row-fluid .span11 {\n    width: 91.43646408839778%;\n    *width: 91.38327259903608%;\n  }\n  .row-fluid .span10 {\n    width: 82.87292817679558%;\n    *width: 82.81973668743387%;\n  }\n  .row-fluid .span9 {\n    width: 74.30939226519337%;\n    *width: 74.25620077583166%;\n  }\n  .row-fluid .span8 {\n    width: 65.74585635359117%;\n    *width: 65.69266486422946%;\n  }\n  .row-fluid .span7 {\n    width: 57.18232044198895%;\n    *width: 57.12912895262725%;\n  }\n  .row-fluid .span6 {\n    width: 48.61878453038674%;\n    *width: 48.56559304102504%;\n  }\n  .row-fluid .span5 {\n    width: 40.05524861878453%;\n    *width: 40.00205712942283%;\n  }\n  .row-fluid .span4 {\n    width: 31.491712707182323%;\n    *width: 31.43852121782062%;\n  }\n  .row-fluid .span3 {\n    width: 22.92817679558011%;\n    *width: 22.87498530621841%;\n  }\n  .row-fluid .span2 {\n    width: 14.3646408839779%;\n    *width: 14.311449394616199%;\n  }\n  .row-fluid .span1 {\n    width: 5.801104972375691%;\n    *width: 5.747913483013988%;\n  }\n  .row-fluid .offset12 {\n    margin-left: 105.52486187845304%;\n    *margin-left: 105.41847889972962%;\n  }\n  .row-fluid .offset12:first-child {\n    margin-left: 102.76243093922652%;\n    *margin-left: 102.6560479605031%;\n  }\n  .row-fluid .offset11 {\n    margin-left: 96.96132596685082%;\n    *margin-left: 96.8549429881274%;\n  }\n  .row-fluid .offset11:first-child {\n    margin-left: 94.1988950276243%;\n    *margin-left: 94.09251204890089%;\n  }\n  .row-fluid .offset10 {\n    margin-left: 88.39779005524862%;\n    *margin-left: 88.2914070765252%;\n  }\n  .row-fluid .offset10:first-child {\n    margin-left: 85.6353591160221%;\n    *margin-left: 85.52897613729868%;\n  }\n  .row-fluid .offset9 {\n    margin-left: 79.8342541436464%;\n    *margin-left: 79.72787116492299%;\n  }\n  .row-fluid .offset9:first-child {\n    margin-left: 77.07182320441989%;\n    *margin-left: 76.96544022569647%;\n  }\n  .row-fluid .offset8 {\n    margin-left: 71.2707182320442%;\n    *margin-left: 71.16433525332079%;\n  }\n  .row-fluid .offset8:first-child {\n    margin-left: 68.50828729281768%;\n    *margin-left: 68.40190431409427%;\n  }\n  .row-fluid .offset7 {\n    margin-left: 62.70718232044199%;\n    *margin-left: 62.600799341718584%;\n  }\n  .row-fluid .offset7:first-child {\n    margin-left: 59.94475138121547%;\n    *margin-left: 59.838368402492065%;\n  }\n  .row-fluid .offset6 {\n    margin-left: 54.14364640883978%;\n    *margin-left: 54.037263430116376%;\n  }\n  .row-fluid .offset6:first-child {\n    margin-left: 51.38121546961326%;\n    *margin-left: 51.27483249088986%;\n  }\n  .row-fluid .offset5 {\n    margin-left: 45.58011049723757%;\n    *margin-left: 45.47372751851417%;\n  }\n  .row-fluid .offset5:first-child {\n    margin-left: 42.81767955801105%;\n    *margin-left: 42.71129657928765%;\n  }\n  .row-fluid .offset4 {\n    margin-left: 37.01657458563536%;\n    *margin-left: 36.91019160691196%;\n  }\n  .row-fluid .offset4:first-child {\n    margin-left: 34.25414364640884%;\n    *margin-left: 34.14776066768544%;\n  }\n  .row-fluid .offset3 {\n    margin-left: 28.45303867403315%;\n    *margin-left: 28.346655695309746%;\n  }\n  .row-fluid .offset3:first-child {\n    margin-left: 25.69060773480663%;\n    *margin-left: 25.584224756083227%;\n  }\n  .row-fluid .offset2 {\n    margin-left: 19.88950276243094%;\n    *margin-left: 19.783119783707537%;\n  }\n  .row-fluid .offset2:first-child {\n    margin-left: 17.12707182320442%;\n    *margin-left: 17.02068884448102%;\n  }\n  .row-fluid .offset1 {\n    margin-left: 11.32596685082873%;\n    *margin-left: 11.219583872105325%;\n  }\n  .row-fluid .offset1:first-child {\n    margin-left: 8.56353591160221%;\n    *margin-left: 8.457152932878806%;\n  }\n  input,\n  textarea,\n  .uneditable-input {\n    margin-left: 0;\n  }\n  .controls-row [class*=\"span\"] + [class*=\"span\"] {\n    margin-left: 20px;\n  }\n  input.span12, textarea.span12, .uneditable-input.span12 {\n    width: 710px;\n  }\n  input.span11, textarea.span11, .uneditable-input.span11 {\n    width: 648px;\n  }\n  input.span10, textarea.span10, .uneditable-input.span10 {\n    width: 586px;\n  }\n  input.span9, textarea.span9, .uneditable-input.span9 {\n    width: 524px;\n  }\n  input.span8, textarea.span8, .uneditable-input.span8 {\n    width: 462px;\n  }\n  input.span7, textarea.span7, .uneditable-input.span7 {\n    width: 400px;\n  }\n  input.span6, textarea.span6, .uneditable-input.span6 {\n    width: 338px;\n  }\n  input.span5, textarea.span5, .uneditable-input.span5 {\n    width: 276px;\n  }\n  input.span4, textarea.span4, .uneditable-input.span4 {\n    width: 214px;\n  }\n  input.span3, textarea.span3, .uneditable-input.span3 {\n    width: 152px;\n  }\n  input.span2, textarea.span2, .uneditable-input.span2 {\n    width: 90px;\n  }\n  input.span1, textarea.span1, .uneditable-input.span1 {\n    width: 28px;\n  }\n}\n@media (max-width: 767px) {\n  body {\n    padding-left: 20px;\n    padding-right: 20px;\n  }\n  .navbar-fixed-top,\n  .navbar-fixed-bottom,\n  .navbar-static-top {\n    margin-left: -20px;\n    margin-right: -20px;\n  }\n  .container-fluid {\n    padding: 0;\n  }\n  .dl-horizontal dt {\n    float: none;\n    clear: none;\n    width: auto;\n    text-align: left;\n  }\n  .dl-horizontal dd {\n    margin-left: 0;\n  }\n  .container {\n    width: auto;\n  }\n  .row-fluid {\n    width: 100%;\n  }\n  .row,\n  .thumbnails {\n    margin-left: 0;\n  }\n  .thumbnails > li {\n    float: none;\n    margin-left: 0;\n  }\n  [class*=\"span\"],\n  .uneditable-input[class*=\"span\"],\n  .row-fluid [class*=\"span\"] {\n    float: none;\n    display: block;\n    width: 100%;\n    margin-left: 0;\n    -webkit-box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    box-sizing: border-box;\n  }\n  .span12,\n  .row-fluid .span12 {\n    width: 100%;\n    -webkit-box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    box-sizing: border-box;\n  }\n  .row-fluid [class*=\"offset\"]:first-child {\n    margin-left: 0;\n  }\n  .input-large,\n  .input-xlarge,\n  .input-xxlarge,\n  input[class*=\"span\"],\n  select[class*=\"span\"],\n  textarea[class*=\"span\"],\n  .uneditable-input {\n    display: block;\n    width: 100%;\n    min-height: 30px;\n    -webkit-box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    box-sizing: border-box;\n  }\n  .input-prepend input,\n  .input-append input,\n  .input-prepend input[class*=\"span\"],\n  .input-append input[class*=\"span\"] {\n    display: inline-block;\n    width: auto;\n  }\n  .controls-row [class*=\"span\"] + [class*=\"span\"] {\n    margin-left: 0;\n  }\n  .modal {\n    position: fixed;\n    top: 20px;\n    left: 20px;\n    right: 20px;\n    width: auto;\n    margin: 0;\n  }\n  .modal.fade {\n    top: -100px;\n  }\n  .modal.fade.in {\n    top: 20px;\n  }\n}\n@media (max-width: 480px) {\n  .nav-collapse {\n    -webkit-transform: translate3d(0, 0, 0);\n  }\n  .page-header h1 small {\n    display: block;\n    line-height: 20px;\n  }\n  input[type=\"checkbox\"],\n  input[type=\"radio\"] {\n    border: 1px solid #ccc;\n  }\n  .form-horizontal .control-label {\n    float: none;\n    width: auto;\n    padding-top: 0;\n    text-align: left;\n  }\n  .form-horizontal .controls {\n    margin-left: 0;\n  }\n  .form-horizontal .control-list {\n    padding-top: 0;\n  }\n  .form-horizontal .form-actions {\n    padding-left: 10px;\n    padding-right: 10px;\n  }\n  .media .pull-left,\n  .media .pull-right {\n    float: none;\n    display: block;\n    margin-bottom: 10px;\n  }\n  .media-object {\n    margin-right: 0;\n    margin-left: 0;\n  }\n  .modal {\n    top: 10px;\n    left: 10px;\n    right: 10px;\n  }\n  .modal-header .close {\n    padding: 10px;\n    margin: -10px;\n  }\n  .carousel-caption {\n    position: static;\n  }\n}\n@media (max-width: 979px) {\n  body {\n    padding-top: 0;\n  }\n  .navbar-fixed-top,\n  .navbar-fixed-bottom {\n    position: static;\n  }\n  .navbar-fixed-top {\n    margin-bottom: 20px;\n  }\n  .navbar-fixed-bottom {\n    margin-top: 20px;\n  }\n  .navbar-fixed-top .navbar-inner,\n  .navbar-fixed-bottom .navbar-inner {\n    padding: 5px;\n  }\n  .navbar .container {\n    width: auto;\n    padding: 0;\n  }\n  .navbar .brand {\n    padding-left: 10px;\n    padding-right: 10px;\n    margin: 0 0 0 -5px;\n  }\n  .nav-collapse {\n    clear: both;\n  }\n  .nav-collapse .nav {\n    float: none;\n    margin: 0 0 10px;\n  }\n  .nav-collapse .nav > li {\n    float: none;\n  }\n  .nav-collapse .nav > li > a {\n    margin-bottom: 2px;\n  }\n  .nav-collapse .nav > .divider-vertical {\n    display: none;\n  }\n  .nav-collapse .nav .nav-header {\n    color: rgba(255, 255, 255, 0.7);\n    text-shadow: none;\n  }\n  .nav-collapse .nav > li > a,\n  .nav-collapse .dropdown-menu a {\n    padding: 9px 15px;\n    font-weight: bold;\n    color: rgba(255, 255, 255, 0.7);\n    -webkit-border-radius: 3px;\n    -moz-border-radius: 3px;\n    border-radius: 3px;\n  }\n  .nav-collapse .btn {\n    padding: 4px 10px 4px;\n    font-weight: normal;\n    -webkit-border-radius: 2px;\n    -moz-border-radius: 2px;\n    border-radius: 2px;\n  }\n  .nav-collapse .dropdown-menu li + li a {\n    margin-bottom: 2px;\n  }\n  .nav-collapse .nav > li > a:hover,\n  .nav-collapse .dropdown-menu a:hover {\n    background-color: #242424;\n  }\n  .navbar-inverse .nav-collapse .nav > li > a,\n  .navbar-inverse .nav-collapse .dropdown-menu a {\n    color: #55a79a;\n  }\n  .navbar-inverse .nav-collapse .nav > li > a:hover,\n  .navbar-inverse .nav-collapse .dropdown-menu a:hover {\n    background-color: #ffffff;\n  }\n  .nav-collapse.in .btn-group {\n    margin-top: 5px;\n    padding: 0;\n  }\n  .nav-collapse .dropdown-menu {\n    position: static;\n    top: auto;\n    left: auto;\n    float: none;\n    display: none;\n    max-width: none;\n    margin: 0 15px;\n    padding: 0;\n    background-color: transparent;\n    border: none;\n    -webkit-border-radius: 0;\n    -moz-border-radius: 0;\n    border-radius: 0;\n    -webkit-box-shadow: none;\n    -moz-box-shadow: none;\n    box-shadow: none;\n  }\n  .nav-collapse .open > .dropdown-menu {\n    display: block;\n  }\n  .nav-collapse .dropdown-menu:before,\n  .nav-collapse .dropdown-menu:after {\n    display: none;\n  }\n  .nav-collapse .dropdown-menu .divider {\n    display: none;\n  }\n  .nav-collapse .nav > li > .dropdown-menu:before,\n  .nav-collapse .nav > li > .dropdown-menu:after {\n    display: none;\n  }\n  .nav-collapse .navbar-form,\n  .nav-collapse .navbar-search {\n    float: none;\n    padding: 10px 15px;\n    margin: 10px 0;\n    border-top: 1px solid #242424;\n    border-bottom: 1px solid #242424;\n    -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n    -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n    box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n  }\n  .navbar-inverse .nav-collapse .navbar-form,\n  .navbar-inverse .nav-collapse .navbar-search {\n    border-top-color: #ffffff;\n    border-bottom-color: #ffffff;\n  }\n  .navbar .nav-collapse .nav.pull-right {\n    float: none;\n    margin-left: 0;\n  }\n  .nav-collapse,\n  .nav-collapse.collapse {\n    overflow: hidden;\n    height: 0;\n  }\n  .navbar .btn-navbar {\n    display: block;\n  }\n  .navbar-static .navbar-inner {\n    padding-left: 10px;\n    padding-right: 10px;\n  }\n}\n@media (min-width: 980px) {\n  .nav-collapse.collapse {\n    height: auto !important;\n    overflow: visible !important;\n  }\n}\n"
  },
  {
    "path": "public/css/theme-style.css",
    "content": "/*******************************************************\n *\n * Custom theme code styles\n * Written by Themelize.me (http://themelize.me)\n *\n *******************************************************/\n.clearfix {\n  *zoom: 1;\n}\n.clearfix:before,\n.clearfix:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.clearfix:after {\n  clear: both;\n}\n.hide-text {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n.input-block-level {\n  display: block;\n  width: 100%;\n  min-height: 30px;\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\nbody,\nhtml {\n  font-family: \"Open Sans\", Arial, serif;\n  background: #ffffff;\n}\nh1 {\n  font-size: 31.5px;\n}\nh2 {\n  font-size: 27.3px;\n}\nh3 {\n  font-size: 24.5px;\n}\nh4 {\n  font-size: 17.5px;\n}\nh5 {\n  font-size: 14px;\n}\nh6 {\n  font-size: 11.9px;\n}\nh1 small {\n  font-size: 21.7px;\n}\nh2 small {\n  font-size: 14.700000000000001px;\n}\nh3 small {\n  font-size: 14px;\n}\nh4 small {\n  font-size: 14px;\n}\n.page-title {\n  margin: 0;\n}\n.page-title small {\n  color: rgba(51, 51, 51, 0.5);\n}\na:focus {\n  outline: none;\n}\n.colour-switcher a {\n  text-indent: -10000px;\n  display: inline-block;\n  width: 40px;\n  height: 40px;\n  border: 3px solid rgba(255, 255, 255, 0.5);\n}\n.colour-switcher a:hover,\n.colour-switcher a.active {\n  border: 3px solid #ffffff;\n}\n.colour-switcher p {\n  margin-top: 1em;\n}\n.colour-switcher .green {\n  background: #55a79a;\n}\n.colour-switcher .red {\n  background: #be3e1d;\n}\n.colour-switcher .blue {\n  background: #00adbb;\n}\n.colour-switcher.page a {\n  width: 200px;\n  height: 200px;\n  border: 3px solid rgba(36, 36, 36, 0.2);\n}\n.colour-switcher.page a:hover,\n.colour-switcher.page a.active {\n  border: 3px solid rgba(36, 36, 36, 0.6);\n}\n#header-hidden-link {\n  position: absolute;\n  right: 0;\n  top: -10px;\n}\n#header-hidden-link a.show-hide,\n#header-hidden-link a.top-link {\n  font-size: 0;\n  line-height: 1;\n  background: #55a79a;\n  padding: 0 10px;\n  -webkit-border-radius: 0 0 3px 3px;\n  -moz-border-radius: 0 0 3px 3px;\n  border-radius: 0 0 3px 3px;\n  height: 20px;\n  display: block;\n  text-align: center;\n  color: rgba(255, 255, 255, 0.8);\n}\n#header-hidden-link a.show-hide i,\n#header-hidden-link a.top-link i {\n  font-size: 16px;\n  line-height: 1;\n}\n#header-hidden-link a.show-hide:hover,\n#header-hidden-link a.top-link:hover {\n  text-decoration: none;\n  color: #ffffff;\n}\n#header-hidden-link a.show-hide > i:before {\n  content: \"\\f078\";\n  font-family: 'FontAwesome';\n  font-size: 16px;\n  font-style: normal;\n}\n#header-hidden-link a.show-hide.open > i:before {\n  content: \"\\f077\";\n}\n.show-hide-open {\n  height: auto !important;\n  min-height: 40px;\n  max-height: 40000px;\n}\n.show-hide-close {\n  height: 0;\n  overflow: hidden;\n}\n/* --------------------------------------------------\n * Zones & Regions\n *-------------------------------------------------- */\n#navigation {\n  *zoom: 1;\n}\n#navigation:before,\n#navigation:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n#navigation:after {\n  clear: both;\n}\n#navigation .header-hidden {\n  background: #55a79a;\n  -webkit-transition: all 0.4s ease-out;\n  -moz-transition: all 0.4s ease-out;\n  -o-transition: all 0.4s ease-out;\n  transition: all 0.4s ease-out;\n  height: 0;\n  overflow: hidden;\n}\n#navigation .header-hidden.show-hide-open {\n  padding: 10px 0;\n}\n#navigation .header-hidden a {\n  color: #ffffff;\n}\n#navigation .header {\n  padding: 10px 0 10px 0;\n  background: rgba(255, 255, 255, 0.9);\n  border-top: 1px solid #55a79a;\n  color: #242424;\n  height: 60px;\n}\n#navigation .header .header-inner {\n  position: relative;\n}\n#navigation .header .social-media {\n  margin: 20px 0 0 0;\n}\n#navigation .navbar {\n  color: rgba(255, 255, 255, 0.7);\n  margin: 0;\n}\n#navigation .navbar-inner {\n  margin: 0;\n  padding: 0 8px;\n  -webkit-border-radius: 3px;\n  -moz-border-radius: 3px;\n  border-radius: 3px;\n  border: 0;\n  border-bottom: 3px solid #55a79a;\n  background-image: url(../img/bg_noise-2.png);\n  background-position: left top;\n  background-repeat: repeat;\n  -webkit-box-shadow: 1px 1px 10px rgba(36, 36, 36, 0.6);\n  -moz-box-shadow: 1px 1px 10px rgba(36, 36, 36, 0.6);\n  box-shadow: 1px 1px 10px rgba(36, 36, 36, 0.6);\n}\n#navigation .brand {\n  font-weight: 400;\n  font-family: \"Rambla\", Arial, serif;\n  padding: 0;\n  margin: 8px 0 0 0;\n  display: block;\n  border: none;\n  text-shadow: none;\n  line-height: 1;\n  color: #55a79a;\n}\n#navigation .brand h1 {\n  font-size: 39.5px;\n  font-weight: bold;\n  margin: 0;\n  padding: 0;\n  line-height: 1;\n}\n#navigation .brand h1 span {\n  color: rgba(36, 36, 36, 0.8);\n  font-weight: 700;\n}\n#navigation .brand:hover {\n  text-decoration: none;\n  cursor: pointer;\n}\n#navigation .slogan {\n  color: #888;\n  font-size: 13.9px;\n  margin: 8px 0 0 1em;\n  padding: 12px 0 8px 1em;\n  border-left: 1px solid #e6e6e6;\n  float: left;\n}\n#navigation .navbar .btn-navbar {\n  padding: 8px;\n  margin: 0;\n}\n#navigation .nav-select {\n  display: none;\n  float: left;\n}\n#navigation .navbar .nav li.divider-vertical {\n  margin: 0 20px;\n  border-left-color: #3b746b;\n  border-right-color: rgba(255, 255, 255, 0.15);\n}\n#navigation .navbar .nav li > a,\n#navigation .navbar .nav li > a.btn {\n  text-shadow: none;\n  font-size: 14.5px;\n}\n#navigation .navbar .nav li > .btn {\n  padding-top: 5px;\n  padding-bottom: 5px;\n  margin: 0 0 0 5px;\n  color: #333333;\n  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);\n  background-color: #f5f5f5;\n  background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));\n  background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);\n  border-color: #e6e6e6 #e6e6e6 #bfbfbf;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #e6e6e6;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  outline: 0;\n}\n#navigation .navbar .nav li > .btn:hover,\n#navigation .navbar .nav li > .btn:active,\n#navigation .navbar .nav li > .btn.active,\n#navigation .navbar .nav li > .btn.disabled,\n#navigation .navbar .nav li > .btn[disabled] {\n  color: #333333;\n  background-color: #e6e6e6;\n  *background-color: #d9d9d9;\n}\n#navigation .navbar .nav li > .btn:active,\n#navigation .navbar .nav li > .btn.active {\n  background-color: #cccccc \\9;\n}\n#navigation .navbar .nav li > .btn.signup,\n#navigation .navbar .nav li > .btn.login {\n  margin: 0;\n  -webkit-border-radius: 2px 0 0 2px;\n  -moz-border-radius: 2px 0 0 2px;\n  border-radius: 2px 0 0 2px;\n  font-size: 12px;\n  text-transform: uppercase;\n}\n#navigation .navbar .nav li > .btn.login {\n  -webkit-border-radius: 0 2px 2px 0;\n  -moz-border-radius: 0 2px 2px 0;\n  border-radius: 0 2px 2px 0;\n}\n#navigation .navbar .nav li > .btn:active {\n  outline: 0;\n}\n#navigation .navbar .nav li > .btn.btn-primary,\n#navigation .navbar .nav li > .btn.btn-navbar {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #4e998e;\n  background-image: -moz-linear-gradient(top, #55a79a, #44857b);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#55a79a), to(#44857b));\n  background-image: -webkit-linear-gradient(top, #55a79a, #44857b);\n  background-image: -o-linear-gradient(top, #55a79a, #44857b);\n  background-image: linear-gradient(to bottom, #55a79a, #44857b);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff55a79a', endColorstr='#ff44857b', GradientType=0);\n  border-color: #44857b #44857b #2a534c;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #44857b;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n#navigation .navbar .nav li > .btn.btn-primary:hover,\n#navigation .navbar .nav li > .btn.btn-navbar:hover,\n#navigation .navbar .nav li > .btn.btn-primary:active,\n#navigation .navbar .nav li > .btn.btn-navbar:active,\n#navigation .navbar .nav li > .btn.btn-primary.active,\n#navigation .navbar .nav li > .btn.btn-navbar.active,\n#navigation .navbar .nav li > .btn.btn-primary.disabled,\n#navigation .navbar .nav li > .btn.btn-navbar.disabled,\n#navigation .navbar .nav li > .btn.btn-primary[disabled],\n#navigation .navbar .nav li > .btn.btn-navbar[disabled] {\n  color: #ffffff;\n  background-color: #44857b;\n  *background-color: #3b746b;\n}\n#navigation .navbar .nav li > .btn.btn-primary:active,\n#navigation .navbar .nav li > .btn.btn-navbar:active,\n#navigation .navbar .nav li > .btn.btn-primary.active,\n#navigation .navbar .nav li > .btn.btn-navbar.active {\n  background-color: #33635c \\9;\n}\n#navigation .navbar .nav li > .btn.btn-warning {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #faa732;\n  background-image: -moz-linear-gradient(top, #fbb450, #f89406);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));\n  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);\n  background-image: -o-linear-gradient(top, #fbb450, #f89406);\n  background-image: linear-gradient(to bottom, #fbb450, #f89406);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);\n  border-color: #f89406 #f89406 #ad6704;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #f89406;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n#navigation .navbar .nav li > .btn.btn-warning:hover,\n#navigation .navbar .nav li > .btn.btn-warning:active,\n#navigation .navbar .nav li > .btn.btn-warning.active,\n#navigation .navbar .nav li > .btn.btn-warning.disabled,\n#navigation .navbar .nav li > .btn.btn-warning[disabled] {\n  color: #ffffff;\n  background-color: #f89406;\n  *background-color: #df8505;\n}\n#navigation .navbar .nav li > .btn.btn-warning:active,\n#navigation .navbar .nav li > .btn.btn-warning.active {\n  background-color: #c67605 \\9;\n}\n#navigation .navbar .nav li > .btn.btn-danger {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #da4f49;\n  background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));\n  background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f);\n  background-image: -o-linear-gradient(top, #ee5f5b, #bd362f);\n  background-image: linear-gradient(to bottom, #ee5f5b, #bd362f);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);\n  border-color: #bd362f #bd362f #802420;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #bd362f;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n#navigation .navbar .nav li > .btn.btn-danger:hover,\n#navigation .navbar .nav li > .btn.btn-danger:active,\n#navigation .navbar .nav li > .btn.btn-danger.active,\n#navigation .navbar .nav li > .btn.btn-danger.disabled,\n#navigation .navbar .nav li > .btn.btn-danger[disabled] {\n  color: #ffffff;\n  background-color: #bd362f;\n  *background-color: #a9302a;\n}\n#navigation .navbar .nav li > .btn.btn-danger:active,\n#navigation .navbar .nav li > .btn.btn-danger.active {\n  background-color: #942a25 \\9;\n}\n#navigation .navbar .nav li > .btn.btn-success {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #318b20;\n  background-image: -moz-linear-gradient(top, #1b7b00, #51a351);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#1b7b00), to(#51a351));\n  background-image: -webkit-linear-gradient(top, #1b7b00, #51a351);\n  background-image: -o-linear-gradient(top, #1b7b00, #51a351);\n  background-image: linear-gradient(to bottom, #1b7b00, #51a351);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff1b7b00', endColorstr='#ff51a351', GradientType=0);\n  border-color: #51a351 #51a351 #387038;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #51a351;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n#navigation .navbar .nav li > .btn.btn-success:hover,\n#navigation .navbar .nav li > .btn.btn-success:active,\n#navigation .navbar .nav li > .btn.btn-success.active,\n#navigation .navbar .nav li > .btn.btn-success.disabled,\n#navigation .navbar .nav li > .btn.btn-success[disabled] {\n  color: #ffffff;\n  background-color: #51a351;\n  *background-color: #499249;\n}\n#navigation .navbar .nav li > .btn.btn-success:active,\n#navigation .navbar .nav li > .btn.btn-success.active {\n  background-color: #408140 \\9;\n}\n#navigation .navbar .nav li > .btn.btn-info {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #49afcd;\n  background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));\n  background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4);\n  background-image: -o-linear-gradient(top, #5bc0de, #2f96b4);\n  background-image: linear-gradient(to bottom, #5bc0de, #2f96b4);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);\n  border-color: #2f96b4 #2f96b4 #1f6377;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #2f96b4;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n#navigation .navbar .nav li > .btn.btn-info:hover,\n#navigation .navbar .nav li > .btn.btn-info:active,\n#navigation .navbar .nav li > .btn.btn-info.active,\n#navigation .navbar .nav li > .btn.btn-info.disabled,\n#navigation .navbar .nav li > .btn.btn-info[disabled] {\n  color: #ffffff;\n  background-color: #2f96b4;\n  *background-color: #2a85a0;\n}\n#navigation .navbar .nav li > .btn.btn-info:active,\n#navigation .navbar .nav li > .btn.btn-info.active {\n  background-color: #24748c \\9;\n}\n#navigation .navbar .nav li > .btn.btn-inverse {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #161616;\n  background-image: -moz-linear-gradient(top, #242424, #000000);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#242424), to(#000000));\n  background-image: -webkit-linear-gradient(top, #242424, #000000);\n  background-image: -o-linear-gradient(top, #242424, #000000);\n  background-image: linear-gradient(to bottom, #242424, #000000);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff242424', endColorstr='#ff000000', GradientType=0);\n  border-color: #000000 #000000 #000000;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #000000;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n#navigation .navbar .nav li > .btn.btn-inverse:hover,\n#navigation .navbar .nav li > .btn.btn-inverse:active,\n#navigation .navbar .nav li > .btn.btn-inverse.active,\n#navigation .navbar .nav li > .btn.btn-inverse.disabled,\n#navigation .navbar .nav li > .btn.btn-inverse[disabled] {\n  color: #ffffff;\n  background-color: #000000;\n  *background-color: #000000;\n}\n#navigation .navbar .nav li > .btn.btn-inverse:active,\n#navigation .navbar .nav li > .btn.btn-inverse.active {\n  background-color: #000000 \\9;\n}\n#navigation .navbar .nav.user-menu {\n  padding: 12px 6px;\n}\n#navigation .navbar .nav#main-menu li.home-link a {\n  margin: 0;\n  display: block;\n  text-align: center;\n  color: #55a79a;\n  font-size: 20px;\n  padding: 16px 20px;\n}\n#navigation .navbar .nav#main-menu li.home-link a:hover {\n  color: #ffffff;\n  background: transparent;\n}\n#navigation .navbar .nav#main-menu li:first-child {\n  border-left: none;\n}\n#navigation .navbar .nav#main-menu li:last-child {\n  border-right: none;\n}\n#navigation .navbar .nav#main-menu li a {\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n  -webkit-box-shadow: none;\n  -moz-box-shadow: none;\n  box-shadow: none;\n  -webkit-transition: all 0.4s ease-out;\n  -moz-transition: all 0.4s ease-out;\n  -o-transition: all 0.4s ease-out;\n  transition: all 0.4s ease-out;\n  padding: 18px 20px;\n  margin: 0;\n  font-size: 12px;\n  font-weight: bold;\n  text-transform: uppercase;\n}\n#navigation .navbar .nav#main-menu li a:focus {\n  color: #ffffff;\n}\n#navigation .navbar .nav#main-menu li a:hover,\n#navigation .navbar .nav#main-menu li.active a.menu-item,\n#navigation .navbar .nav#main-menu li.active .dropdown-toggle,\n#navigation .navbar .nav#main-menu li.open .dropdown-toggle,\n#navigation .navbar .nav#main-menu li.open.active .dropdown-toggle {\n  background-color: rgba(255, 255, 255, 0.044);\n  background-image: -moz-linear-gradient(top, rgba(255, 255, 255, 0.02), rgba(255, 255, 255, 0.08));\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(rgba(255, 255, 255, 0.02)), to(rgba(255, 255, 255, 0.08)));\n  background-image: -webkit-linear-gradient(top, rgba(255, 255, 255, 0.02), rgba(255, 255, 255, 0.08));\n  background-image: -o-linear-gradient(top, rgba(255, 255, 255, 0.02), rgba(255, 255, 255, 0.08));\n  background-image: linear-gradient(to bottom, rgba(255, 255, 255, 0.02), rgba(255, 255, 255, 0.08));\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#05ffffff', endColorstr='#14ffffff', GradientType=0);\n  color: #ffffff;\n}\n#navigation .navbar .nav#main-menu li a:hover .caret,\n#navigation .navbar .nav#main-menu li.active a.menu-item .caret,\n#navigation .navbar .nav#main-menu li.active .dropdown-toggle .caret,\n#navigation .navbar .nav#main-menu li.open .dropdown-toggle .caret,\n#navigation .navbar .nav#main-menu li.open.active .dropdown-toggle .caret {\n  border-top-color: #ffffff;\n}\n#navigation .navbar .nav#main-menu .dropdown-menu {\n  margin-top: 2px;\n  padding: 0;\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n  left: -1px;\n  border-bottom: 4px solid #55a79a;\n  min-width: 250px;\n  color: rgba(36, 36, 36, 0.8);\n}\n#navigation .navbar .nav#main-menu .dropdown-menu .divider {\n  height: 2px;\n  margin: 0;\n}\n#navigation .navbar .nav#main-menu .dropdown-menu.pull-center {\n  padding: 0;\n  left: 50%;\n  width: 220px;\n  margin-left: -110px;\n}\n#navigation .navbar .nav#main-menu .dropdown-menu.pull-center:before {\n  left: 50%;\n  top: -10px;\n  border-width: 10px;\n  margin-left: -10px;\n}\n#navigation .navbar .nav#main-menu .dropdown-menu.pull-center:after {\n  left: 49.5%;\n  top: -9px;\n  border-width: 9px;\n  margin-left: -8px;\n}\n#navigation .navbar .nav#main-menu .dropdown-menu li {\n  border-left: none;\n  border-right: none;\n}\n#navigation .navbar .nav#main-menu .dropdown-menu li a.menu-item {\n  margin: 0;\n  padding: 10px 15px;\n  font-size: 12px;\n  font-weight: normal;\n  text-transform: none;\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n  -webkit-box-shadow: 0;\n  -moz-box-shadow: 0;\n  box-shadow: 0;\n  background-color: #fafafa;\n  background-image: -moz-linear-gradient(top, #ffffff, #f3f3f3);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f3f3f3));\n  background-image: -webkit-linear-gradient(top, #ffffff, #f3f3f3);\n  background-image: -o-linear-gradient(top, #ffffff, #f3f3f3);\n  background-image: linear-gradient(to bottom, #ffffff, #f3f3f3);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff3f3f3', GradientType=0);\n  border-bottom: 1px solid #e6e6e6;\n  color: #242424;\n}\n#navigation .navbar .nav#main-menu .dropdown-menu li a.menu-item:before {\n  font-family: FontAwesome;\n  font-size: 10px;\n  color: rgba(36, 36, 36, 0.6);\n  width: 30px;\n  height: 30px;\n  content: \"\\f0da\";\n  padding-right: 10px;\n}\n#navigation .navbar .nav#main-menu .dropdown-menu li a.menu-item:hover {\n  color: rgba(36, 36, 36, 0.8);\n  border-bottom-color: #55a79a;\n  background-color: #f5f5f5;\n  background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));\n  background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);\n}\n#navigation .navbar .nav#main-menu .dropdown-menu.mega-menu {\n  padding: 10px;\n  min-width: 600px;\n}\n#navigation .navbar .nav#main-menu .dropdown-menu.mega-menu .menu-title {\n  font-weight: bold;\n  padding-bottom: 10px;\n  margin-bottom: 10px;\n  border-bottom: 2px solid #e6e6e6;\n  display: block;\n}\n#navigation .navbar .nav#main-menu .dropdown-menu.mega-menu ul {\n  margin: 0;\n  font-size: 10.5px;\n}\n#navigation .navbar .nav#main-menu .dropdown-menu.mega-menu ul span {\n  padding: 5px;\n  display: block;\n}\n#navigation .navbar .nav#main-menu .dropdown-menu.mega-menu ul a.menu-item {\n  padding: 5px;\n  font-weight: bold;\n  font-size: 11.5px;\n}\n#navigation .navbar .nav#main-menu .dropdown-menu.mega-menu ul a.menu-item:before {\n  font-size: 14px;\n}\n#navigation div.dropdown-menu,\n#navigation span.dropdown-menu {\n  padding: 10px;\n  min-width: 150px;\n  color: rgba(36, 36, 36, 0.8);\n}\n#navigation div.dropdown-menu form,\n#navigation span.dropdown-menu form {\n  margin: 0;\n}\n#navigation div.dropdown-menu form select,\n#navigation span.dropdown-menu form select,\n#navigation div.dropdown-menu form textarea,\n#navigation span.dropdown-menu form textarea,\n#navigation div.dropdown-menu form input[type=\"text\"],\n#navigation span.dropdown-menu form input[type=\"text\"],\n#navigation div.dropdown-menu form input[type=\"password\"],\n#navigation span.dropdown-menu form input[type=\"password\"],\n#navigation div.dropdown-menu form input[type=\"datetime\"],\n#navigation span.dropdown-menu form input[type=\"datetime\"],\n#navigation div.dropdown-menu form input[type=\"datetime-local\"],\n#navigation span.dropdown-menu form input[type=\"datetime-local\"],\n#navigation div.dropdown-menu form input[type=\"date\"],\n#navigation span.dropdown-menu form input[type=\"date\"],\n#navigation div.dropdown-menu form input[type=\"month\"],\n#navigation span.dropdown-menu form input[type=\"month\"],\n#navigation div.dropdown-menu form input[type=\"time\"],\n#navigation span.dropdown-menu form input[type=\"time\"],\n#navigation div.dropdown-menu form input[type=\"week\"],\n#navigation span.dropdown-menu form input[type=\"week\"],\n#navigation div.dropdown-menu form input[type=\"number\"],\n#navigation span.dropdown-menu form input[type=\"number\"],\n#navigation div.dropdown-menu form input[type=\"email\"],\n#navigation span.dropdown-menu form input[type=\"email\"],\n#navigation div.dropdown-menu form input[type=\"url\"],\n#navigation span.dropdown-menu form input[type=\"url\"],\n#navigation div.dropdown-menu form input[type=\"search\"],\n#navigation span.dropdown-menu form input[type=\"search\"],\n#navigation div.dropdown-menu form input[type=\"tel\"],\n#navigation span.dropdown-menu form input[type=\"tel\"],\n#navigation div.dropdown-menu form input[type=\"color\"],\n#navigation span.dropdown-menu form input[type=\"color\"],\n#navigation div.dropdown-menu form .uneditable-input,\n#navigation span.dropdown-menu form .uneditable-input {\n  margin-bottom: 2px;\n}\n#navigation div.dropdown-menu form select.email,\n#navigation span.dropdown-menu form select.email,\n#navigation div.dropdown-menu form textarea.email,\n#navigation span.dropdown-menu form textarea.email,\n#navigation div.dropdown-menu form input[type=\"text\"].email,\n#navigation span.dropdown-menu form input[type=\"text\"].email,\n#navigation div.dropdown-menu form input[type=\"password\"].email,\n#navigation span.dropdown-menu form input[type=\"password\"].email,\n#navigation div.dropdown-menu form input[type=\"datetime\"].email,\n#navigation span.dropdown-menu form input[type=\"datetime\"].email,\n#navigation div.dropdown-menu form input[type=\"datetime-local\"].email,\n#navigation span.dropdown-menu form input[type=\"datetime-local\"].email,\n#navigation div.dropdown-menu form input[type=\"date\"].email,\n#navigation span.dropdown-menu form input[type=\"date\"].email,\n#navigation div.dropdown-menu form input[type=\"month\"].email,\n#navigation span.dropdown-menu form input[type=\"month\"].email,\n#navigation div.dropdown-menu form input[type=\"time\"].email,\n#navigation span.dropdown-menu form input[type=\"time\"].email,\n#navigation div.dropdown-menu form input[type=\"week\"].email,\n#navigation span.dropdown-menu form input[type=\"week\"].email,\n#navigation div.dropdown-menu form input[type=\"number\"].email,\n#navigation span.dropdown-menu form input[type=\"number\"].email,\n#navigation div.dropdown-menu form input[type=\"email\"].email,\n#navigation span.dropdown-menu form input[type=\"email\"].email,\n#navigation div.dropdown-menu form input[type=\"url\"].email,\n#navigation span.dropdown-menu form input[type=\"url\"].email,\n#navigation div.dropdown-menu form input[type=\"search\"].email,\n#navigation span.dropdown-menu form input[type=\"search\"].email,\n#navigation div.dropdown-menu form input[type=\"tel\"].email,\n#navigation span.dropdown-menu form input[type=\"tel\"].email,\n#navigation div.dropdown-menu form input[type=\"color\"].email,\n#navigation span.dropdown-menu form input[type=\"color\"].email,\n#navigation div.dropdown-menu form .uneditable-input.email,\n#navigation span.dropdown-menu form .uneditable-input.email {\n  -webkit-border-radius: 2px 0 0 2px;\n  -moz-border-radius: 2px 0 0 2px;\n  border-radius: 2px 0 0 2px;\n  border-right: none;\n}\n#navigation div.dropdown-menu form select.password,\n#navigation span.dropdown-menu form select.password,\n#navigation div.dropdown-menu form textarea.password,\n#navigation span.dropdown-menu form textarea.password,\n#navigation div.dropdown-menu form input[type=\"text\"].password,\n#navigation span.dropdown-menu form input[type=\"text\"].password,\n#navigation div.dropdown-menu form input[type=\"password\"].password,\n#navigation span.dropdown-menu form input[type=\"password\"].password,\n#navigation div.dropdown-menu form input[type=\"datetime\"].password,\n#navigation span.dropdown-menu form input[type=\"datetime\"].password,\n#navigation div.dropdown-menu form input[type=\"datetime-local\"].password,\n#navigation span.dropdown-menu form input[type=\"datetime-local\"].password,\n#navigation div.dropdown-menu form input[type=\"date\"].password,\n#navigation span.dropdown-menu form input[type=\"date\"].password,\n#navigation div.dropdown-menu form input[type=\"month\"].password,\n#navigation span.dropdown-menu form input[type=\"month\"].password,\n#navigation div.dropdown-menu form input[type=\"time\"].password,\n#navigation span.dropdown-menu form input[type=\"time\"].password,\n#navigation div.dropdown-menu form input[type=\"week\"].password,\n#navigation span.dropdown-menu form input[type=\"week\"].password,\n#navigation div.dropdown-menu form input[type=\"number\"].password,\n#navigation span.dropdown-menu form input[type=\"number\"].password,\n#navigation div.dropdown-menu form input[type=\"email\"].password,\n#navigation span.dropdown-menu form input[type=\"email\"].password,\n#navigation div.dropdown-menu form input[type=\"url\"].password,\n#navigation span.dropdown-menu form input[type=\"url\"].password,\n#navigation div.dropdown-menu form input[type=\"search\"].password,\n#navigation span.dropdown-menu form input[type=\"search\"].password,\n#navigation div.dropdown-menu form input[type=\"tel\"].password,\n#navigation span.dropdown-menu form input[type=\"tel\"].password,\n#navigation div.dropdown-menu form input[type=\"color\"].password,\n#navigation span.dropdown-menu form input[type=\"color\"].password,\n#navigation div.dropdown-menu form .uneditable-input.password,\n#navigation span.dropdown-menu form .uneditable-input.password {\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n}\n#navigation div.dropdown-menu form .btn,\n#navigation span.dropdown-menu form .btn {\n  margin: 0;\n}\n#navigation div.dropdown-menu form .btn.login,\n#navigation span.dropdown-menu form .btn.login {\n  width: 60px;\n}\n#navigation div.dropdown-menu .divider,\n#navigation span.dropdown-menu .divider {\n  display: block;\n  margin-top: 5px;\n  margin-bottom: 5px;\n}\n#navigation div.dropdown-menu small,\n#navigation span.dropdown-menu small {\n  display: block;\n}\n#navigation div.dropdown-menu .signup,\n#navigation span.dropdown-menu .signup {\n  font-weight: bold;\n}\n#highlighted {\n  background-color: #f5f5f5;\n  background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));\n  background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);\n  border-bottom: 1px solid rgba(36, 36, 36, 0.2);\n  border-top: none;\n  -webkit-transition: all 0.4s ease-out;\n  -moz-transition: all 0.4s ease-out;\n  -o-transition: all 0.4s ease-out;\n  transition: all 0.4s ease-out;\n  color: #242424;\n}\n#highlighted .inner {\n  background: url(../img/bg_diamond.png) left bottom repeat-x;\n}\n#highlighted ul.nav-pills {\n  margin: 0;\n}\n.has-navbar-fixed-top #highlighted {\n  margin-top: 150px;\n}\n#content {\n  padding: 20px 0;\n}\n#content-below {\n  padding: 10px 0;\n  border-top: 1px solid #cdcdcd;\n  background: #e6e6e6;\n}\n#footer {\n  background: #333333;\n  min-height: 200px;\n  padding: 20px 0;\n  color: rgba(255, 255, 255, 0.6);\n  border-top: 2px solid #55a79a;\n}\n#footer h3 {\n  font-size: 1.2em;\n  color: rgba(255, 255, 255, 0.8);\n  line-height: 1;\n}\n#footer a {\n  color: rgba(255, 255, 255, 0.8);\n}\n#footer .block {\n  margin-bottom: 2em;\n}\n#footer .inline {\n  display: inline-block;\n}\n#footer .contact-block p {\n  margin-bottom: 0.2em;\n}\n#footer .contact-block i {\n  padding-right: 0.5em;\n}\n#footer #toplink {\n  margin-bottom: -25px;\n  text-align: center;\n}\n#footer #toplink a:hover {\n  text-decoration: none;\n  color: #ffffff;\n}\n#footer #toplink i {\n  color: #55a79a;\n}\n#footer .subfooter {\n  border-top: 1px dotted rgba(255, 255, 255, 0.1);\n  margin-top: 1em;\n  padding-top: 1em;\n}\n#footer .container {\n  position: relative;\n}\n.social-media a {\n  text-decoration: none;\n  color: rgba(255, 255, 255, 0.8);\n  display: inline-block;\n  line-height: 36px;\n  width: 36px;\n  height: 36px;\n  background: rgba(36, 36, 36, 0.8);\n  -webkit-border-radius: 200px;\n  -moz-border-radius: 200px;\n  border-radius: 200px;\n}\n.social-media a i {\n  font-size: 20px;\n  color: #ffffff;\n  padding: 0;\n  line-height: 36px;\n  width: 36px;\n  height: 36px;\n  text-align: center;\n  margin-right: 0.2em;\n}\n.social-media a:hover {\n  text-decoration: none;\n  background: #55a79a;\n}\n.social-media a.last {\n  padding-bottom: 0;\n  border-bottom: 0;\n}\n.upsell {\n  text-align: center;\n}\n.upsell .title {\n  display: inline-block;\n  padding: 0 0.5em;\n  margin: 0;\n}\n.upsell .title small {\n  display: block;\n}\n.upsell p {\n  margin: 0;\n  padding: 0.5em 0 0 0;\n}\n.btn span {\n  display: block;\n  font-size: 12px;\n}\n.spacer {\n  font-weight: bold;\n  color: #55a79a;\n}\n.spacer.dark {\n  color: #44857b;\n}\n/* --------------------------------------------------\n * Common styles\n *-------------------------------------------------- */\na:hover img {\n  opacity: 0.8;\n  filter: alpha(opacity=80);\n}\n.block .title {\n  font-size: 18px;\n  text-transform: uppercase;\n  margin: 0 0 0.5em 0;\n  line-height: 1;\n}\n.sidebar.sidebar-right .inner {\n  border-left: 1px solid #e6e6e6;\n  padding: 20px 0 0 2em;\n}\n.sidebar.sidebar-left .inner {\n  border-right: 1px solid #e6e6e6;\n  padding: 20px 2em 0 0;\n}\n.sidebar .block {\n  margin-bottom: 2em;\n}\n.mdrs .btn-block,\n.mdrs .btn {\n  padding: 0.6em 1em;\n  font-size: 1.2em;\n}\n.intro p {\n  margin-bottom: 0;\n}\nul.inline > li:first-child {\n  padding-left: 0;\n}\n/* --------------------------------------------------\n * Homepage\n *-------------------------------------------------- */\n.flexslider-wrapper,\n.static-banner {\n  overflow: hidden;\n}\n.flexslider-wrapper .caption,\n.static-banner .caption {\n  padding: 5% 0;\n}\n.flexslider-wrapper .caption h1,\n.static-banner .caption h1,\n.flexslider-wrapper .caption h2,\n.static-banner .caption h2,\n.flexslider-wrapper .caption h3,\n.static-banner .caption h3,\n.flexslider-wrapper .caption h4,\n.static-banner .caption h4,\n.flexslider-wrapper .caption h5,\n.static-banner .caption h5,\n.flexslider-wrapper .caption p,\n.static-banner .caption p {\n  margin-top: 0;\n  font-weight: normal;\n}\n.flexslider-wrapper .caption .btn,\n.static-banner .caption .btn {\n  margin: 0;\n}\n.flexslider-wrapper .caption .inverse,\n.static-banner .caption .inverse {\n  background: #242424;\n  color: #ffffff;\n  padding: 5px;\n  display: inline-block;\n  -webkit-border-radius: 1px;\n  -moz-border-radius: 1px;\n  border-radius: 1px;\n}\n.flexslider-wrapper .caption .inverse a,\n.static-banner .caption .inverse a {\n  color: rgba(255, 255, 255, 0.9);\n}\n.flexslider-wrapper div.underlay-img,\n.static-banner div.underlay-img {\n  position: relative;\n}\n.flexslider-wrapper div.underlay-img img.underlay-img,\n.static-banner div.underlay-img img.underlay-img {\n  position: absolute;\n  top: 0;\n}\n.flexslider-wrapper div.underlay-img .caption,\n.static-banner div.underlay-img .caption {\n  z-index: 100001;\n  position: absolute;\n}\n.flexslider-wrapper .flexslider,\n.static-banner .flexslider {\n  margin: 0;\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n  border: none;\n  -webkit-box-shadow: none;\n  -moz-box-shadow: none;\n  box-shadow: none;\n  background: transparent;\n}\n.flexslider-wrapper .flex-direction-nav a,\n.static-banner .flex-direction-nav a {\n  text-indent: 0;\n  font-size: 0;\n  background: rgba(0, 0, 0, 0.4);\n  height: 40px;\n  line-height: 46px;\n  width: 40px;\n  color: #ffffff;\n  text-align: center;\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n}\n.flexslider-wrapper .flex-direction-nav a:before,\n.static-banner .flex-direction-nav a:before {\n  content: '\\f054';\n  font-family: 'FontAwesome';\n  font-size: 22px;\n}\n.flexslider-wrapper .flex-direction-nav a.flex-prev:before,\n.static-banner .flex-direction-nav a.flex-prev:before {\n  content: '\\f053';\n}\n.flexslider-wrapper .flex-direction-nav a:hover,\n.static-banner .flex-direction-nav a:hover {\n  text-decoration: none;\n}\n.flexslider-wrapper .flex-control-nav,\n.static-banner .flex-control-nav {\n  bottom: 0;\n  right: 20px;\n  width: auto;\n}\n.flexslider-wrapper .flex-control-nav li,\n.static-banner .flex-control-nav li {\n  margin: 0 3px;\n}\n.flexslider-wrapper .flex-control-nav li a,\n.static-banner .flex-control-nav li a {\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n  height: 14px;\n  width: 14px;\n  background: rgba(36, 36, 36, 0.3);\n}\n.flexslider-wrapper .flex-control-nav li a:hover,\n.static-banner .flex-control-nav li a:hover {\n  background: rgba(36, 36, 36, 0.8);\n}\n.flexslider-wrapper .flex-control-nav li a.flex-active,\n.static-banner .flex-control-nav li a.flex-active {\n  background: #55a79a;\n}\n.features .title {\n  margin-top: 10px;\n}\n.features .thumbnails li {\n  *zoom: 1;\n}\n.features .thumbnails li:before,\n.features .thumbnails li:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.features .thumbnails li:after {\n  clear: both;\n}\n.features .thumbnails li img {\n  background-color: #f4f4f4;\n  background-image: -moz-linear-gradient(top, #fafafa, #ebebeb);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fafafa), to(#ebebeb));\n  background-image: -webkit-linear-gradient(top, #fafafa, #ebebeb);\n  background-image: -o-linear-gradient(top, #fafafa, #ebebeb);\n  background-image: linear-gradient(to bottom, #fafafa, #ebebeb);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffafafa', endColorstr='#ffebebeb', GradientType=0);\n  border: 1px solid #e6e6e6;\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n}\n.features .thumbnails li img:hover {\n  background-color: #ededed;\n  background-image: -moz-linear-gradient(top, #f5f5f5, #e0e0e0);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#e0e0e0));\n  background-image: -webkit-linear-gradient(top, #f5f5f5, #e0e0e0);\n  background-image: -o-linear-gradient(top, #f5f5f5, #e0e0e0);\n  background-image: linear-gradient(to bottom, #f5f5f5, #e0e0e0);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe0e0e0', GradientType=0);\n}\n.features .thumbnails li i {\n  float: right;\n  margin: 0.5em;\n}\n.pricing-stack .well {\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n  border: 1px solid #cdcdcd;\n  padding: 10px;\n  background: #ffffff;\n  -webkit-box-shadow: 1px 1px 5px #cdcdcd;\n  -moz-box-shadow: 1px 1px 5px #cdcdcd;\n  box-shadow: 1px 1px 5px #cdcdcd;\n}\n.pricing-stack .well .title {\n  margin: 10px 0 0 0;\n  color: rgba(36, 36, 36, 0.8);\n  font-size: 22px;\n  text-shadow: 1px 1px 1px rgba(240, 240, 240, 0.8);\n  text-align: center;\n  font-weight: normal;\n  text-transform: none;\n}\n.pricing-stack .well .price {\n  margin: 1em -14px;\n  padding: 20px 0;\n  text-shadow: none;\n  color: #55a79a;\n  display: block;\n  border: 1px solid #cdcdcd;\n  background: #ffffff;\n  text-align: center;\n  font-size: 16px;\n}\n.pricing-stack .well .price .fancy {\n  font-size: 28px;\n}\n.pricing-stack .well .price .digits {\n  font-size: 32px;\n  font-weight: bold;\n}\n.pricing-stack .well ul.points li {\n  border-bottom: 1px dotted rgba(189, 189, 189, 0.8);\n  padding: 0.2em;\n}\n.pricing-stack .well .btn {\n  display: block;\n  width: 90%;\n  margin: 20px auto 0 auto;\n}\n.pricing-stack .well.active {\n  border-color: #55a79a;\n  border-width: 1px;\n  -webkit-box-shadow: 1px 2px 5px #cdcdcd;\n  -moz-box-shadow: 1px 2px 5px #cdcdcd;\n  box-shadow: 1px 2px 5px #cdcdcd;\n}\n.pricing-stack .well.active .title {\n  font-size: 28px;\n  text-transform: uppercase;\n}\n.pricing-stack .well.active .price {\n  background: #55a79a;\n  background-color: #5bab9e;\n  background-image: -moz-linear-gradient(top, #55a79a, #65b1a5);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#55a79a), to(#65b1a5));\n  background-image: -webkit-linear-gradient(top, #55a79a, #65b1a5);\n  background-image: -o-linear-gradient(top, #55a79a, #65b1a5);\n  background-image: linear-gradient(to bottom, #55a79a, #65b1a5);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff55a79a', endColorstr='#ff65b1a5', GradientType=0);\n  border-color: #55a79a;\n  color: #ffffff;\n}\n.pricing-stack .well.active .btn {\n  margin-top: 40px;\n}\n/* --------------------------------------------------\n * Features\n *-------------------------------------------------- */\n.tabbable > ul.nav-tabs li a,\nul.nav-tabs li a {\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n}\n.tabbable > ul.nav-tabs li.active a,\nul.nav-tabs li.active a,\n.tabbable > ul.nav-tabs li.active a:hover,\nul.nav-tabs li.active a:hover {\n  color: #55a79a;\n  border-top: 4px solid #55a79a;\n}\n.feature-tabs ul.nav-tabs {\n  margin-right: 0;\n}\n.feature-tabs ul.nav-tabs li a {\n  color: rgba(36, 36, 36, 0.8);\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n  font-weight: bold;\n  font-size: 18px;\n  border-left: 4px solid transparent;\n  position: relative;\n}\n.feature-tabs ul.nav-tabs li a i {\n  font-size: 22px;\n  position: absolute;\n  top: 20px;\n  right: 10px;\n  color: #e6e6e6;\n}\n.feature-tabs ul.nav-tabs li a small {\n  display: block;\n  font-weight: normal;\n}\n.feature-tabs ul.nav-tabs li a:hover i {\n  color: #55a79a;\n}\n.feature-tabs ul.nav-tabs li.active a,\n.feature-tabs ul.nav-tabs li.active a:hover {\n  border-top-width: 1px;\n  border-top-color: #e6e6e6;\n  border-left: 4px solid #55a79a;\n}\n.feature-tabs ul.nav-tabs li.active a i,\n.feature-tabs ul.nav-tabs li.active a:hover i {\n  color: #55a79a;\n}\n/* --------------------------------------------------\n * Customers\n *-------------------------------------------------- */\n.page-customers .tabbable > ul.nav-tabs li a,\n.page-customers ul.nav-tabs li a {\n  padding: 10px 30px;\n}\n.customers li a .inner-wrapper {\n  height: 240px;\n  padding: 1em;\n  border: 1px solid #d9d9d9;\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n  display: block;\n  position: relative;\n  background-color: #f7f7f7;\n  background-image: -moz-linear-gradient(top, #ffffff, #ebebeb);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#ebebeb));\n  background-image: -webkit-linear-gradient(top, #ffffff, #ebebeb);\n  background-image: -o-linear-gradient(top, #ffffff, #ebebeb);\n  background-image: linear-gradient(to bottom, #ffffff, #ebebeb);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffebebeb', GradientType=0);\n}\n.customers li a span {\n  display: block;\n}\n.customers li a .img-wrapper {\n  text-align: center;\n  height: 100px;\n  display: block;\n}\n.customers li a .img-wrapper img {\n  max-height: 80px;\n  margin: 1em auto;\n}\n.customers li a .title {\n  text-transform: none;\n  font-weight: bold;\n}\n.customers li a .description {\n  color: rgba(36, 36, 36, 0.8);\n}\n.customers li a:hover {\n  text-decoration: none;\n}\n.customers li a:hover .inner-wrapper {\n  border-color: #a6a6a6;\n}\n/* --------------------------------------------------\n * About\n *-------------------------------------------------- */\n.stats .stat {\n  font-size: 24px;\n  text-align: center;\n  color: #ffffff;\n  margin-bottom: 10px;\n}\n.stats .stat .well {\n  background-color: #44857b;\n  background-image: -webkit-gradient(radial, center center, 0, center center, 460, from(#55a79a), to(#44857b));\n  background-image: -webkit-radial-gradient(circle, #55a79a, #44857b);\n  background-image: -moz-radial-gradient(circle, #55a79a, #44857b);\n  background-image: -o-radial-gradient(circle, #55a79a, #44857b);\n  background-repeat: no-repeat;\n  padding: 20px;\n  -webkit-border-radius: 6px;\n  -moz-border-radius: 6px;\n  border-radius: 6px;\n  position: relative;\n  margin: 0 15px;\n  height: 40px;\n  line-height: 40px;\n}\n.stats .stat .well:after,\n.stats .stat .well:before {\n  top: 100%;\n  border: solid transparent;\n  content: \" \";\n  height: 0;\n  width: 0;\n  position: absolute;\n  pointer-events: none;\n}\n.stats .stat .well:after {\n  border-top-color: #55a79a;\n  border-width: 5px;\n  left: 50%;\n  margin-left: -5px;\n}\n.stats .stat .well:before {\n  border-top-color: rgba(0, 0, 0, 0.01);\n  border-width: 6px;\n  left: 50%;\n  margin-left: -6px;\n}\n.stats .stat small {\n  text-shadow: none;\n  font-size: 12px;\n  display: block;\n  color: rgba(36, 36, 36, 0.8);\n  margin: 10px 0 0 0;\n  text-transform: uppercase;\n}\n.team .media-heading {\n  margin-top: 0;\n  color: #000000;\n}\n.team p {\n  color: rgba(36, 36, 36, 0.8);\n}\n.team .role,\n.team p.role {\n  color: rgba(36, 36, 36, 0.8);\n  font-size: 16px;\n}\n.team .media-object {\n  max-width: 120px;\n}\n.section-menu ul.nav-list {\n  padding: 2em 0;\n  margin-left: 0;\n  border-right: 1px solid #e6e6e6;\n}\n.section-menu ul.nav-list li.nav-header {\n  padding-left: 5px;\n  margin: 0;\n}\n.section-menu ul.nav-list li a {\n  color: rgba(36, 36, 36, 0.7);\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n  font-weight: bold;\n  font-size: 18px;\n  border: 1px solid #e6e6e6;\n  border-top: none;\n  margin: 0 -1px 0 3px;\n  -webkit-box-shadow: 1px 1px 1px #ffffff;\n  -moz-box-shadow: 1px 1px 1px #ffffff;\n  box-shadow: 1px 1px 1px #ffffff;\n  background: #fafafa;\n  text-shadow: none;\n  padding: 8px 15px;\n  position: relative;\n}\n.section-menu ul.nav-list li a.first {\n  border-top: 1px solid #e6e6e6;\n}\n.section-menu ul.nav-list li a:hover {\n  background: #f0f0f0;\n}\n.section-menu ul.nav-list li a:hover i {\n  color: #55a79a;\n}\n.section-menu ul.nav-list li a i {\n  font-size: 22px;\n  position: absolute;\n  top: 20px;\n  right: 10px;\n  color: #e6e6e6;\n}\n.section-menu ul.nav-list li a small {\n  display: block;\n  font-weight: normal;\n  color: rgba(36, 36, 36, 0.5);\n}\n.section-menu ul.nav-list li.active > a,\n.section-menu ul.nav-list li.active > a:hover {\n  border-left: 4px solid #55a79a;\n  border-right-color: #ffffff;\n  margin: 0 -1px 0 0;\n  background: #ffffff;\n  color: rgba(36, 36, 36, 0.8);\n}\n.section-menu ul.nav-list li.active > a i,\n.section-menu ul.nav-list li.active > a:hover i {\n  color: #55a79a;\n}\n/* --------------------------------------------------\n * Blog\n *-------------------------------------------------- */\n.date-wrapper {\n  background-color: #f5f5f5;\n  background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));\n  background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);\n  border: 1px solid #c2c2c2;\n  color: #242424;\n  text-align: center;\n  margin: 0 0 1em 0;\n  padding: 2px;\n  -webkit-border-radius: 2px 2px 2px 2px;\n  -moz-border-radius: 2px 2px 2px 2px;\n  border-radius: 2px 2px 2px 2px;\n}\n.date-wrapper span {\n  font-size: 16px;\n  display: block;\n}\n.date-wrapper span.date-m {\n  padding: 2px 4px;\n  color: #ffffff;\n  background: #44857b;\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n  font-size: 12px;\n  text-transform: uppercase;\n}\n.date-wrapper span.date-d {\n  font-size: 22px;\n  line-height: 1;\n  padding: 5px 0 3px 0;\n  color: #242424;\n}\n.tags {\n  font-size: 12px;\n  text-transform: uppercase;\n}\n.tags .tag {\n  color: #55a79a;\n}\n.tags .type {\n  color: #242424;\n}\n.tag-cloud span {\n  -webkit-border-radius: 2px 2px 2px 2px;\n  -moz-border-radius: 2px 2px 2px 2px;\n  border-radius: 2px 2px 2px 2px;\n  background: #e6e6e6;\n  display: inline-block;\n  padding: 4px 8px;\n  margin: 2px 0;\n  font-size: 12px;\n  text-transform: uppercase;\n}\n.blog-roll .title,\n.blog-post .title {\n  margin: 0 0 5px 0;\n  line-height: 1;\n}\n.blog-roll .meta,\n.blog-post .meta {\n  font-size: 12px;\n  margin-bottom: 5px;\n}\n.blog-roll .hidden-phone,\n.blog-post .hidden-phone {\n  text-align: center;\n}\n.blog-roll .media,\n.blog-post .media {\n  padding-bottom: 15px;\n  border-bottom: 1px solid #e6e6e6;\n}\n.blog-roll.blog-list .media-object,\n.blog-post.blog-list .media-object {\n  float: right;\n  margin: 0 0 1em 1em;\n}\n.blog-roll.blog-list .media-object img,\n.blog-post.blog-list .media-object img {\n  max-width: 150px;\n}\n.blog-post .media-body .lead {\n  margin: 1em 0;\n  padding: 1em 0.5em;\n  border-top: 1px solid #b3b3b3;\n  border-bottom: 1px solid #b3b3b3;\n  background: #f0f0f0;\n}\n.blog-post .comments .media-body {\n  margin-top: 0;\n}\n.blog-post .comments .media-body .meta {\n  margin: 0;\n}\n/* --------------------------------------------------\n * Contact\n *-------------------------------------------------- */\n/* --------------------------------------------------\n * Misc Pages\n *-------------------------------------------------- */\n.form-wrapper {\n  margin: 0 auto;\n  border: 1px solid #e6e6e6;\n  padding: 20px;\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n  -webkit-box-shadow: 1px 1px 10px rgba(36, 36, 36, 0.2);\n  -moz-box-shadow: 1px 1px 10px rgba(36, 36, 36, 0.2);\n  box-shadow: 1px 1px 10px rgba(36, 36, 36, 0.2);\n}\n.form-wrapper.form-narrow {\n  min-width: 200px;\n  max-width: 300px;\n}\n.form-wrapper.form-medium {\n  min-width: 400px;\n  max-width: 500px;\n}\n.form-wrapper h2.title-divider,\n.form-wrapper h3.title-divider {\n  margin-top: 0;\n}\n.demos .title-divider {\n  margin-top: 2em;\n}\n.demos .demo-block,\n.demos [class*=\"span\"] {\n  background: #e6e6e6;\n  min-height: 300px;\n}\n.page-elements h3.title-divider {\n  margin-top: 2em;\n}\n.fancy {\n  font-family: 'Calligraffitti', cursive;\n  text-transform: lowercase;\n}\n.de-em {\n  font-weight: normal;\n  color: rgba(51, 51, 51, 0.8);\n}\na .de-em {\n  font-weight: normal;\n  color: rgba(85, 167, 154, 0.8);\n}\n.em {\n  font-weight: bold;\n}\n.pad-right {\n  padding-right: 0.5em;\n}\n.pad-left {\n  padding-left: 0.5em;\n}\n.pad-right-large {\n  padding-right: 1.5em;\n}\n.pad-left-large {\n  padding-left: 1.5em;\n}\n.pad-right-xlarge {\n  padding-right: 3em;\n}\n.pad-left-xlarge {\n  padding-left: 3em;\n}\nsmall img {\n  max-width: 50px;\n}\nblockquote {\n  border: none;\n  padding: 0;\n}\nblockquote p {\n  background: #e6e6e6;\n  padding: 20px;\n  -webkit-border-radius: 3px;\n  -moz-border-radius: 3px;\n  border-radius: 3px;\n  position: relative;\n}\nblockquote p:after,\nblockquote p:before {\n  top: 100%;\n  border: solid transparent;\n  content: \" \";\n  height: 0;\n  width: 0;\n  position: absolute;\n  pointer-events: none;\n}\nblockquote p:after {\n  border-top-color: #e6e6e6;\n  border-width: 10px;\n  left: 10%;\n  margin-left: -10px;\n}\nblockquote p:before {\n  border-top-color: rgba(0, 0, 0, 0.01);\n  border-width: 11px;\n  left: 10%;\n  margin-left: -11px;\n}\nblockquote small {\n  display: block;\n  padding: 12px 0 0 10px;\n}\nblockquote small:before {\n  content: '';\n}\nblockquote small img {\n  padding-right: 1em;\n}\n.inline-el {\n  display: inline-block;\n}\n.inline-el h1,\n.inline-el h2,\n.inline-el h3,\n.inline-el h4,\n.inline-el h5,\n.inline-el p {\n  margin: 0;\n}\n.well-small {\n  padding: 9px;\n}\n.well-mini {\n  padding: 5px;\n}\n.badge.badge-large,\n.label.badge-large,\n.badge.label-large,\n.label.label-large {\n  padding: 4px 8px;\n  font-size: 14px;\n}\n.badge.badge-xlarge,\n.label.badge-xlarge,\n.badge.label-xlarge,\n.label.label-xlarge {\n  padding: 8px 12px;\n  font-size: 18px;\n}\n.title-divider {\n  text-align: left;\n  margin-bottom: 1em;\n  background: #ffffff url(../img/bg_divider.png) left center repeat-x;\n  padding: 0;\n}\n.title-divider span {\n  background: #ffffff;\n  padding-right: 0.5em;\n}\n.title-divider small {\n  display: block;\n  color: rgba(51, 51, 51, 0.6);\n}\n/* Utilities */\n.primary-colour {\n  color: #55a79a;\n}\n.primary-colour-bg {\n  background-color: #55a79a;\n}\n.primary-colour-bg-50 {\n  background-color: rgba(85, 167, 154, 0.5);\n}\n.primary-colour-bg-80 {\n  background-color: rgba(85, 167, 154, 0.8);\n}\n.white-80 {\n  color: rgba(255, 255, 255, 0.8);\n}\n.white-60 {\n  color: rgba(255, 255, 255, 0.6);\n}\n.white-40 {\n  color: rgba(255, 255, 255, 0.4);\n}\n.more-link:hover {\n  border-bottom: 3px solid #55a79a;\n  text-decoration: none;\n}\n.pull-center {\n  text-align: center;\n}\n.space-reset {\n  line-height: 1;\n  padding: 0;\n  margin: 0;\n}\n.margin-top-small {\n  margin-top: 0.5em;\n}\n.margin-top-medium {\n  margin-top: 1em;\n}\n.margin-top-large {\n  margin-top: 2em;\n}\n.bordered-top-small {\n  margin-top: 0.5em;\n  padding-top: 0.5em;\n  border-top: 1px solid rgba(204, 204, 204, 0.7);\n}\n.bordered-top-medium {\n  margin-top: 1em;\n  padding-top: 1em;\n  border-top: 1px solid rgba(204, 204, 204, 0.7);\n}\n.bordered-top-large {\n  margin-top: 2em;\n  padding-top: 2em;\n  border-top: 1px solid rgba(204, 204, 204, 0.7);\n}\n.margin-bottom-small {\n  margin-bottom: 0.5em;\n}\n.margin-bottom-medium {\n  margin-bottom: 1em;\n}\n.margin-bottom-large {\n  margin-bottom: 2em;\n}\n.bordered-bottom-small {\n  margin-bottom: 0.5em;\n  padding-bottom: 0.5em;\n  border-bottom: 1px solid rgba(204, 204, 204, 0.7);\n}\n.bordered-bottom-medium {\n  margin-bottom: 1em;\n  padding-bottom: 1em;\n  border-bottom: 1px solid rgba(204, 204, 204, 0.7);\n}\n.bordered-bottom-large {\n  margin-bottom: 2em;\n  padding-bottom: 2em;\n  border-bottom: 1px solid rgba(204, 204, 204, 0.7);\n}\nul.big-list {\n  font-size: 1.2em;\n  padding: 0;\n  margin: 0;\n}\nul.big-list li {\n  list-style: none;\n  margin: 0;\n  padding: 0.5em;\n  margin-bottom: 0.5em;\n  padding-bottom: 0.5em;\n  border-bottom: 1px solid rgba(204, 204, 204, 0.7);\n  border-color: rgba(204, 204, 204, 0.6);\n}\nul.big-list li:hover {\n  background: #ededed;\n}\n.sidebar ul.big-list {\n  font-size: 1em;\n}\n._icon-mini {\n  width: 20px;\n  height: 20px;\n  line-height: 20px;\n  font-size: 18px;\n}\n._icon-small {\n  width: 40px;\n  height: 40px;\n  line-height: 40px;\n  font-size: 24px;\n}\n._icon-medium {\n  width: 60px;\n  height: 60px;\n  line-height: 65px;\n  font-size: 40px;\n}\n._icon-large {\n  width: 80px;\n  height: 80px;\n  line-height: 85px;\n  font-size: 60px;\n}\n._icon-xlarge {\n  width: 100px;\n  height: 100px;\n  line-height: 90px;\n  font-size: 80px;\n}\n._icon-circle {\n  -webkit-border-radius: 500px;\n  -moz-border-radius: 500px;\n  border-radius: 500px;\n}\n._icon-circle-double {\n  -webkit-border-radius: 500px;\n  -moz-border-radius: 500px;\n  border-radius: 500px;\n  border: 3px solid #fdfefe;\n  box-shadow: 0 0 0 2px #55a79a;\n}\n._icon-rounded {\n  -webkit-border-radius: 6px;\n  -moz-border-radius: 6px;\n  border-radius: 6px;\n}\n._icon-primary {\n  background-color: #55a79a;\n  color: #ffffff;\n  text-align: center;\n}\n._icon-primary-50 {\n  background-color: rgba(85, 167, 154, 0.5);\n  color: #ffffff;\n  text-align: center;\n}\n._icon-primary-80 {\n  background-color: rgba(85, 167, 154, 0.8);\n  color: #ffffff;\n  text-align: center;\n}\n._icon-inverse {\n  background: #3e3e3e;\n  color: #ffffff;\n  text-align: center;\n}\n._icon-success {\n  background: #1b7b00;\n}\nbody .icon-mini,\nli .icon-mini {\n  width: 20px;\n  height: 20px;\n  line-height: 20px;\n  font-size: 18px;\n}\nbody .icon-small,\nli .icon-small {\n  width: 40px;\n  height: 40px;\n  line-height: 40px;\n  font-size: 24px;\n}\nbody .icon-medium,\nli .icon-medium {\n  width: 60px;\n  height: 60px;\n  line-height: 65px;\n  font-size: 40px;\n}\nbody .icon-large,\nli .icon-large {\n  width: 80px;\n  height: 80px;\n  line-height: 85px;\n  font-size: 60px;\n}\nbody .icon-xlarge,\nli .icon-xlarge {\n  width: 100px;\n  height: 100px;\n  line-height: 90px;\n  font-size: 80px;\n}\nbody .icon-circle,\nli .icon-circle {\n  -webkit-border-radius: 500px;\n  -moz-border-radius: 500px;\n  border-radius: 500px;\n}\nbody .icon-circle-double,\nli .icon-circle-double {\n  -webkit-border-radius: 500px;\n  -moz-border-radius: 500px;\n  border-radius: 500px;\n  border: 3px solid #fdfefe;\n  box-shadow: 0 0 0 2px #55a79a;\n}\nbody .icon-rounded,\nli .icon-rounded {\n  -webkit-border-radius: 6px;\n  -moz-border-radius: 6px;\n  border-radius: 6px;\n}\nbody .icon-primary,\nli .icon-primary {\n  background-color: #55a79a;\n  color: #ffffff;\n  text-align: center;\n}\nbody .icon-primary-50,\nli .icon-primary-50 {\n  background-color: rgba(85, 167, 154, 0.5);\n  color: #ffffff;\n  text-align: center;\n}\nbody .icon-primary-80,\nli .icon-primary-80 {\n  background-color: rgba(85, 167, 154, 0.8);\n  color: #ffffff;\n  text-align: center;\n}\nbody .icon-inverse,\nli .icon-inverse {\n  background: #3e3e3e;\n  color: #ffffff;\n  text-align: center;\n}\nbody .icon-success,\nli .icon-success {\n  background: #1b7b00;\n}\nbody .icon-mini:before,\nli .icon-mini:before,\nbody .icon-small:before,\nli .icon-small:before,\nbody .icon-medium:before,\nli .icon-medium:before,\nbody .icon-large:before,\nli .icon-large:before,\nbody .icon-xlarge:before,\nli .icon-xlarge:before,\nbody .icon-circle:before,\nli .icon-circle:before,\nbody .icon-circle-double:before,\nli .icon-circle-double:before,\nbody .icon-rounded:before,\nli .icon-rounded:before,\nbody .icon-inverse:before,\nli .icon-inverse:before,\nbody .icon-inverse-50:before,\nli .icon-inverse-50:before,\nbody .icon-inverse-80:before,\nli .icon-inverse-80:before,\nbody .icon-success:before,\nli .icon-success:before {\n  width: auto;\n  font-size: inherit;\n}\na:hover .icon-inverse,\na:hover .icon-inverse-50,\na:hover .icon-inverse-80 {\n  text-decoration: none;\n}\na:hover .icon-inverse {\n  background: #98cac2;\n}\na:hover .icon-inverse-50,\na:hover .icon-inverse-80 {\n  background: #55a79a;\n}\n.secondary-nav {\n  margin: 0;\n  padding: 0;\n}\n.secondary-nav li a {\n  margin: 0 0 1px 0;\n  padding: 8px 0.5em;\n  background: rgba(85, 167, 154, 0.05);\n  -webkit-border-radius: 3px;\n  -moz-border-radius: 3px;\n  border-radius: 3px;\n  border: 1px solid rgba(85, 167, 154, 0.1);\n}\n.secondary-nav li a i {\n  -webkit-transition: all 0.2s ease-in;\n  -moz-transition: all 0.2s ease-in;\n  -o-transition: all 0.2s ease-in;\n  transition: all 0.2s ease-in;\n  opacity: 0.6;\n  filter: alpha(opacity=60);\n}\n.secondary-nav li a:hover {\n  background: rgba(85, 167, 154, 0.1);\n}\n.secondary-nav li a:hover i {\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\n.secondary-nav li.active a {\n  background: #55a79a;\n}\n.secondary-nav li ul {\n  margin: 0 0 1px 0;\n  padding: 8px 1em;\n  border: 1px solid rgba(85, 167, 154, 0.3);\n  -webkit-border-radius: 2px;\n  -moz-border-radius: 2px;\n  border-radius: 2px;\n  background: rgba(85, 167, 154, 0.1);\n}\n.popover-title {\n  font-size: 16px;\n  font-weight: bold;\n}\n.popover-content {\n  font-size: 12px;\n  font-weight: normal;\n}\n.accordion-primary .accordion-group {\n  margin-bottom: 1px;\n  border: 1px solid rgba(85, 167, 154, 0.1);\n  -webkit-border-radius: 3px;\n  -moz-border-radius: 3px;\n  border-radius: 3px;\n  background: rgba(85, 167, 154, 0.05);\n}\n.accordion-primary .accordion-group:hover {\n  background: rgba(85, 167, 154, 0.1);\n}\n.accordion-primary .accordion-inner {\n  border-top: 1px solid rgba(85, 167, 154, 0.2);\n}\n.background-clip-fix {\n  -moz-background-clip: padding;\n  -webkit-background-clip: padding-box;\n  background-clip: padding-box;\n}\n.alert-inline {\n  display: inline-block;\n}\n@media (max-width: 979px) {\n  #navigation .header {\n    padding: 10px 0;\n  }\n  #navigation .header #header-hidden-link {\n    top: -10px;\n  }\n  #navigation .navbar .btn-navbar {\n    text-align: center;\n    display: block;\n    float: left;\n    margin: 8px;\n    color: #ffffff;\n    text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n    background-color: rgba(62, 62, 62, 0.8);\n    background-image: -moz-linear-gradient(top, rgba(62, 62, 62, 0.8), rgba(62, 62, 62, 0.8));\n    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(rgba(62, 62, 62, 0.8)), to(rgba(62, 62, 62, 0.8)));\n    background-image: -webkit-linear-gradient(top, rgba(62, 62, 62, 0.8), rgba(62, 62, 62, 0.8));\n    background-image: -o-linear-gradient(top, rgba(62, 62, 62, 0.8), rgba(62, 62, 62, 0.8));\n    background-image: linear-gradient(to bottom, rgba(62, 62, 62, 0.8), rgba(62, 62, 62, 0.8));\n    background-repeat: repeat-x;\n    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#cc3e3e3e', endColorstr='#cc3e3e3e', GradientType=0);\n    border-color: rgba(62, 62, 62, 0.8) rgba(62, 62, 62, 0.8) rgba(23, 23, 23, 0.8);\n    border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n    *background-color: rgba(62, 62, 62, 0.8);\n    /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n  \n    filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n    -webkit-border-radius: 1px;\n    -moz-border-radius: 1px;\n    border-radius: 1px;\n  }\n  #navigation .navbar .btn-navbar:hover,\n  #navigation .navbar .btn-navbar:active,\n  #navigation .navbar .btn-navbar.active,\n  #navigation .navbar .btn-navbar.disabled,\n  #navigation .navbar .btn-navbar[disabled] {\n    color: #ffffff;\n    background-color: rgba(62, 62, 62, 0.8);\n    *background-color: rgba(49, 49, 49, 0.8);\n  }\n  #navigation .navbar .btn-navbar:active,\n  #navigation .navbar .btn-navbar.active {\n    background-color: rgba(36, 36, 36, 0.8) \\9;\n  }\n  #navigation .nav-select {\n    display: block;\n  }\n  #navigation .navbar-inner {\n    padding: 0;\n    margin: 0 10px;\n    background-image: none;\n  }\n  #navigation .navbar .nav li.divider-vertical,\n  #navigation .navbar .nav li.home-link {\n    display: none;\n  }\n  #navigation .navbar .nav.user-menu {\n    margin: 0;\n    padding: 8px;\n  }\n  #navigation .navbar .nav#main-menu {\n    float: none;\n    margin: 0;\n    padding: 0;\n    -webkit-border-radius: 2px;\n    -moz-border-radius: 2px;\n    border-radius: 2px;\n  }\n  #navigation .navbar .nav#main-menu li {\n    float: none;\n    border-left: none;\n    border-right: none;\n    padding: 0;\n    margin: 0;\n    border-top: 1px solid rgba(255, 255, 255, 0.1);\n  }\n  #navigation .navbar .nav#main-menu li a,\n  #navigation .navbar .nav#main-menu li a:link,\n  #navigation .navbar .nav#main-menu li a:focus {\n    padding: 10px 20px;\n    margin: 0;\n    font-weight: normal;\n  }\n  #navigation .navbar .nav#main-menu li a .caret,\n  #navigation .navbar .nav#main-menu li a:link .caret,\n  #navigation .navbar .nav#main-menu li a:focus .caret {\n    font-family: FontAwesome;\n    float: right;\n    border: none;\n    margin: 0 -20px 0 0;\n    font-size: 16px;\n    color: #ffffff;\n    width: 30px;\n    height: 30px;\n  }\n  #navigation .navbar .nav#main-menu li a .caret:before,\n  #navigation .navbar .nav#main-menu li a:link .caret:before,\n  #navigation .navbar .nav#main-menu li a:focus .caret:before {\n    content: \"\\f054\";\n  }\n  #navigation .navbar .nav#main-menu li a:hover,\n  #navigation .navbar .nav#main-menu li.active a {\n    background: #4a4a4a;\n    color: #ffffff;\n  }\n  #navigation .navbar .nav#main-menu li.open .dropdown-toggle,\n  #navigation .navbar .nav#main-menu li.open.active .dropdown-toggle {\n    background: #434343;\n    color: #ffffff;\n  }\n  #navigation .navbar .nav#main-menu li.open .dropdown-toggle .caret:before,\n  #navigation .navbar .nav#main-menu li.open.active .dropdown-toggle .caret:before {\n    content: \"\\f078\";\n  }\n  #navigation .navbar .nav#main-menu .dropdown-menu {\n    background: none;\n    margin: 0;\n    padding: 0;\n    max-width: 100%;\n    border: none;\n    color: rgba(255, 255, 255, 0.6);\n  }\n  #navigation .navbar .nav#main-menu .dropdown-menu li {\n    margin: 0;\n    padding: 0;\n    border-top: none;\n    background: none;\n  }\n  #navigation .navbar .nav#main-menu .dropdown-menu li a,\n  #navigation .navbar .nav#main-menu .dropdown-menu li a:link,\n  #navigation .navbar .nav#main-menu .dropdown-menu li a:focus,\n  #navigation .navbar .nav#main-menu .dropdown-menu li a.menu-item {\n    padding: 5px 20px;\n    margin: 0;\n    background-color: #4d4d4d;\n    background: #525252;\n    border-bottom-color: rgba(255, 255, 255, 0.16);\n    text-transform: none;\n    color: rgba(255, 255, 255, 0.6);\n  }\n  #navigation .navbar .nav#main-menu .dropdown-menu li a:before,\n  #navigation .navbar .nav#main-menu .dropdown-menu li a:link:before,\n  #navigation .navbar .nav#main-menu .dropdown-menu li a:focus:before,\n  #navigation .navbar .nav#main-menu .dropdown-menu li a.menu-item:before {\n    font-family: FontAwesome;\n    font-size: 10px;\n    color: rgba(255, 255, 255, 0.6);\n    width: 30px;\n    height: 30px;\n    content: \"\\f0da\";\n    padding: 0 6px 0 0;\n  }\n  #navigation .navbar .nav#main-menu .dropdown-menu li a:hover,\n  #navigation .navbar .nav#main-menu .dropdown-menu li a:link:hover,\n  #navigation .navbar .nav#main-menu .dropdown-menu li a:focus:hover,\n  #navigation .navbar .nav#main-menu .dropdown-menu li a.menu-item:hover {\n    background-color: #4d4d4d;\n    background: #525252;\n    border-bottom-color: rgba(255, 255, 255, 0.16);\n    color: #ffffff;\n  }\n  #navigation .navbar .nav#main-menu .dropdown-menu.mega-menu {\n    padding: 0;\n    min-width: 100%;\n    max-width: 100%;\n  }\n  #navigation .navbar .nav#main-menu .dropdown-menu.mega-menu .menu-title {\n    display: none;\n  }\n  #navigation .navbar .nav#main-menu .dropdown-menu.mega-menu ul.row-fluid [class*=\"span\"] {\n    width: 100%;\n  }\n  #navigation .navbar .nav#main-menu .dropdown-menu.mega-menu ul span,\n  #navigation .navbar .nav#main-menu .dropdown-menu.mega-menu ul a {\n    display: none;\n  }\n  #navigation .navbar .nav#main-menu .dropdown-menu.mega-menu ul a.menu-item {\n    padding: 5px 20px;\n    font-weight: normal;\n    font-size: 11.5px;\n    display: block;\n  }\n  #navigation .navbar .nav#main-menu .dropdown-menu.mega-menu ul a.menu-item:before {\n    font-size: 14px;\n  }\n}\n@media (min-width: 980px) {\n  \n}\n@media (min-width: 1200px) {\n  \n}\n@media (max-width: 979px) {\n  #navigation {\n    margin-bottom: 1em;\n  }\n  #navigation .header #header-hidden-link {\n    right: 20px;\n  }\n  #navigation .header .social-media {\n    margin-top: 20px;\n  }\n  #navigation .header-hidden-inner,\n  #navigation .header-inner {\n    padding-left: 20px;\n    padding-right: 20px;\n  }\n  #navigation .navbar-inner {\n    -webkit-border-radius: 0;\n    -moz-border-radius: 0;\n    border-radius: 0;\n  }\n  .has-navbar-fixed-top #highlighted {\n    margin-top: auto;\n  }\n}\n@media (min-width: 768px) and (max-width: 979px) {\n  .customers li a .inner-wrapper {\n    height: 260px;\n  }\n}\n@media (max-width: 767px) {\n  body {\n    padding-left: 0;\n    padding-right: 0;\n  }\n  #navigation .header {\n    height: auto;\n  }\n  #navigation .header .slogan {\n    border: none;\n    padding: 0;\n    margin: 0;\n    float: none;\n    text-align: center;\n  }\n  #navigation .header #header-hidden-link {\n    right: 10px;\n  }\n  #navigation .header .brand,\n  #navigation .header .social-media {\n    width: auto;\n    text-align: center;\n    float: none;\n  }\n  #navigation .header .social-media {\n    margin-top: 1em;\n  }\n  #navigation div.dropdown-menu,\n  #navigation span.dropdown-menu {\n    max-width: 300px;\n  }\n  #navigation div.dropdown-menu .input-prepend input,\n  #navigation span.dropdown-menu .input-prepend input,\n  #navigation div.dropdown-menu .input-append input,\n  #navigation span.dropdown-menu .input-append input,\n  #navigation div.dropdown-menu .input-prepend input[class*=\"span\"],\n  #navigation span.dropdown-menu .input-prepend input[class*=\"span\"],\n  #navigation div.dropdown-menu .input-append input[class*=\"span\"],\n  #navigation span.dropdown-menu .input-append input[class*=\"span\"],\n  #navigation div.dropdown-menu form input[type=\"text\"].email,\n  #navigation span.dropdown-menu form input[type=\"text\"].email {\n    display: block;\n    border: 1px solid #e6e6e6;\n    -webkit-border-radius: 2px;\n    -moz-border-radius: 2px;\n    border-radius: 2px;\n  }\n  #navigation div.dropdown-menu form .btn.login,\n  #navigation span.dropdown-menu form .btn.login {\n    -webkit-border-radius: 3px;\n    -moz-border-radius: 3px;\n    border-radius: 3px;\n  }\n  #content,\n  #content-below,\n  #footer {\n    padding-left: 20px;\n    padding-right: 20px;\n  }\n  .flexslider-wrapper .caption,\n  .static-banner .caption {\n    padding: 5%;\n    text-align: center;\n  }\n  .flexslider-wrapper .flex-direction-nav,\n  .static-banner .flex-direction-nav {\n    display: none;\n  }\n  #footer .col {\n    margin-bottom: 2em;\n  }\n  #footer .pull-right {\n    float: none;\n  }\n  h1 small,\n  h2 small,\n  h3 small {\n    display: block;\n  }\n  .blog-list.blog-list-short .media-object,\n  .blog-post.blog-list-short .media-object {\n    display: none;\n  }\n  .blog-list .comments .media-object,\n  .blog-post .comments .media-object {\n    display: none;\n  }\n  .tab-content,\n  .pill-content {\n    overflow: visible;\n  }\n  .tab-content .tab-pane,\n  .pill-content .tab-pane,\n  .tab-content .pill-pane,\n  .pill-content .pill-pane {\n    display: block;\n    margin-bottom: 2em;\n  }\n  .customers li a .inner-wrapper {\n    height: auto;\n  }\n  .section-menu ul.nav-list {\n    border: none;\n    padding: 1em 0;\n  }\n  .sidebar.sidebar-right .inner,\n  .sidebar.sidebar-leftt .inner {\n    border: none;\n    padding: 20px 0 0 0;\n  }\n}\n@media (max-width: 480px) {\n  #navigation .navbar .user-menu {\n    float: right;\n  }\n  #navigation .navbar .user-menu li > a.btn {\n    padding: 4px 6px;\n  }\n  .blog-roll.blog-list .media-object,\n  .blog-post.blog-list .media-object {\n    float: none;\n    margin: 0.5em 0;\n  }\n  .blog-roll.blog-list .media-object img,\n  .blog-post.blog-list .media-object img {\n    max-width: 100%;\n  }\n  .sidebar.siderbar-right .inner,\n  .sidebar.sidebar-left .inner {\n    border: none;\n    padding-left: 0;\n    padding-right: 0;\n  }\n  .form-wrapper.form-narrow {\n    min-width: 200px;\n    max-width: 300px;\n  }\n  .form-wrapper.form-medium {\n    min-width: 200px;\n    max-width: 5300px;\n  }\n}\n\n.main-info {\n  margin-bottom: 30px;\n}\n\n.discount {\n    color: red;\n    font-size: 20px;\n    line-height: 24px;\n    margin: 0 0 30px;\n}\ndiv.in-middle {\n  margin: auto;\n  width: 50%;\n  border: 3px solid green;\n  padding: 10px;\n}\n"
  },
  {
    "path": "public/img/README.txt",
    "content": "----------------------------\nIMAGE DIRECTORY (/img)\n----------------------------\n\nThis directory should contain all images used throughout the site.\nImages within the root are used by css as background images.\n\n----------------------------\nSUB DIRECTORIES\n----------------------------\n\nAll other images to within sub-directories related to the section of the site they appear in. Maintaining this structure is optionally but recommended.\n\n/blog - all blog related photos\n/customers - customer/client logos\n/features - app feature screenshots\n/slides - slide images used on homepage banner\n/team - team member photos used in the about section\n/misc - random images\n\n\n----------------------------\nIMAGE & PHOTO CREDITS\n----------------------------\n* Slideshow graphics: http://medialoot.com & http://www.premiumpixels.com/\n* Team photos: http://www.flickr.com/photos/vectorportal/sets/72157622868867274/\n* Blog photos: http://www.flickr.com/photos/xjrlokix/ (Ben Fredericson)\n* Patterns: http://subtlepatterns.com/"
  },
  {
    "path": "public/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n    <meta charset=\"utf-8\">\n    <title>SmartVPN | Opensource solution for custom VPN service</title>\n    <meta name='yandex-verification' content='4fc9aeffcea87db7' />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n    <!-- Bootstrap CSS -->\n    <link href=\"/css/bootstrap.css\" rel=\"stylesheet\">\n    <link href=\"/css/responsive.css\" rel=\"stylesheet\">\n\n    <!-- Flexslider -->\n    <link href=\"/css/flexslider.css\" rel=\"stylesheet\">\n\n    <!-- Theme style -->\n    <link href=\"/css/theme-style.css\" rel=\"stylesheet\">\n\n    <!--Your custom colour override-->\n    <link href=\"/css/colour-blue.css\" id=\"colour-scheme\" rel=\"stylesheet\">\n\n    <!-- Your custom override -->\n    <link href=\"/css/custom-style.css\" rel=\"stylesheet\">\n\n    <!-- Le fav and touch icons - @todo: fill with your icons or remove -->\n    <link rel=\"shortcut icon\" href=\"/favicon.ico\">\n    <link href='https://fonts.googleapis.com/css?family=Open+Sans:400,700,300|Rambla|Calligraffitti' rel='stylesheet' type='text/css'>\n  </head>\n\n  <body class=\"page page-index-static\">\n    <div id=\"navigation\" class=\"wrapper\">\n      <div class=\"navbar  navbar-static-top\">\n        <div class=\"header\">\n          <div class=\"header-inner container\">\n            <div class=\"row-fluid\">\n              <div class=\"span6\">\n                <!--branding/logo-->\n                <a class=\"brand\" href=\"/\" title=\"SmartVPN\">\n                  <h1>\n                    <span>Smart</span>VPN<span>.</span>\n                  </h1>\n                </a>\n                <div class=\"slogan\">Opensource solution for custom VPN service</div>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n\n    <div id=\"content\">\n      <div class=\"container\">\n        <div class=\"inner\">\n          <div class=\"container\">\n            <div class=\"in-middle\">\n              <a href=\"/users/sign_up\" class=\"btn btn-large btn-primary signup\">Sign Up</a>\n              <a href=\"/users/sign_in\" class=\"btn btn-large btn-primary login\" id=\"login-drop\">Sign In</a>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "spec/cells/web/admin/change_locale_link_cell_spec.rb",
    "content": "# frozen_string-literal: true\n\nrequire 'rails_helper'\n\ndescribe Web::Admin::ChangeLocaleLinkCell do\n  subject { described_class.new }\n\n  context 'current locale is EN' do\n    it 'returns alink to chane the locale to RU' do\n      expect(subject.render).to eq '<li class=\"nav-item\"><a class=\"nav-link\" rel=\"nofollow\" data-method=\"put\" href=\"/admin/change_languages?locale=ru\">EN</a></li>'\n    end\n  end\n\n  context 'current locale is RU' do\n    before { I18n.locale = :ru }\n    after { I18n.locale = :en }\n\n    it 'returns alink to chane the locale to EN' do\n      expect(subject.render).to eq '<li class=\"nav-item\"><a class=\"nav-link\" rel=\"nofollow\" data-method=\"put\" href=\"/admin/change_languages?locale=en\">RU</a></li>'\n    end\n  end\nend\n"
  },
  {
    "path": "spec/config/clock_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'rails_helper'\nrequire 'clockwork/test'\n\ndescribe Clockwork do\n  before do\n    allow(WithdrawalsWorker).to receive(:perform_async).and_return('WithdrawalsID')\n    allow(UpdateCoursesWorker).to receive(:perform_async).and_return('UpdateCoursesID')\n    allow(RefreshProxyListWorker).to receive(:perform_async).and_return('RefreshProxyListID')\n  end\n\n  after(:each) { Clockwork::Test.clear! }\n\n  %w[Withdrawals UpdateCourses RefreshProxyList].each do |job|\n    it \"runs the job #{job} once\" do\n      Clockwork::Test.run(max_ticks: 1)\n\n      expect(Clockwork::Test.ran_job?(job)).to be_truthy\n      expect(Clockwork::Test.times_run(job)).to eq 1\n      expect(Clockwork::Test.block_for(job).call).to eq(\"#{job}ID\")\n    end\n\n    it \"runs the job #{job} every hour\" do\n      start_time = Time.new(2018, 1, 2, 1, 0, 0)\n      end_time = Time.new(2018, 1, 3, 1, 0, 0)\n\n      Clockwork::Test.run(start_time: start_time, end_time: end_time, tick_speed: 1.hour)\n\n      expect(Clockwork::Test.times_run(job)).to eq(24)\n    end\n  end\n\n  it 'executes correct Sidekiq worker for Withdrawals task' do\n    Clockwork::Test.run(max_ticks: 1)\n    Clockwork::Test.block_for('Withdrawals').call\n    expect(WithdrawalsWorker).to have_received(:perform_async).once\n  end\n\n  it 'executes correct Sidekiq worker for UpdateCourses task' do\n    Clockwork::Test.run(max_ticks: 1)\n    Clockwork::Test.block_for('UpdateCourses').call\n    expect(UpdateCoursesWorker).to have_received(:perform_async).once\n  end\n\n  it 'executes correct Sidekiq worker for RefreshProxyList task' do\n    Clockwork::Test.run(max_ticks: 1)\n    Clockwork::Test.block_for('RefreshProxyList').call\n    expect(RefreshProxyListWorker).to have_received(:perform_async).once\n  end\nend\n"
  },
  {
    "path": "spec/controllers/admin/change_languages_controller_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'rails_helper'\n\ndescribe Admin::ChangeLanguagesController do\n  login_admin\n\n  describe 'PUT #update' do\n    before do\n      request.env['HTTP_REFERER'] = 'where_i_came_from'\n      put :update, locale: :ru\n    end\n\n    it 'session locale will be set to RU' do\n      expect(session[:locale]).to eq :ru\n    end\n\n    it 'current locale will be set to RU' do\n      expect(I18n.locale).to eq :ru\n    end\n\n    it 'will be redirect to back' do\n      expect(response).to redirect_to 'where_i_came_from'\n    end\n  end\nend\n"
  },
  {
    "path": "spec/controllers/admin/connections_controller_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'rails_helper'\n\ndescribe Admin::ConnectionsController do\n  subject { response }\n  login_admin\n\n  describe 'GET #index' do\n    before { get :index }\n\n    it { is_expected.to render_template :index }\n\n    it 'returns success status' do\n      expect(subject.status).to eq 200\n    end\n  end\n\n  describe 'GET #active' do\n    before { get :active }\n\n    it { is_expected.to render_template :active }\n\n    it 'returns success status' do\n      expect(subject.status).to eq 200\n    end\n\n    it 'loads active connections' do\n      expect(assigns(:connections)).to eq Connection.active.to_a\n    end\n  end\n\n  describe 'GET #show' do\n    let(:connection) { create(:connect) }\n\n    before { get :show, id: connection.id }\n\n    it { is_expected.to be_success }\n    it { is_expected.to render_template :show }\n    it { expect(response.status).to eq 200 }\n  end\nend\n"
  },
  {
    "path": "spec/controllers/admin/options_controller_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Admin::OptionsController do\n  subject { response }\n  login_admin\n\n  describe 'GET #index' do\n    before { get :index }\n\n    it { is_expected.to be_success }\n    it { is_expected.to render_template :index }\n  end\n\n  describe 'GET #new' do\n    before { get :new }\n\n    it { is_expected.to be_success }\n    it { is_expected.to render_template :new }\n  end\n\n  describe 'POST #create' do\n    context 'valid attrs' do\n      let(:attrs) { attributes_for(:option) }\n\n      it 'creates new option' do\n        expect do\n          post :create, option: attrs\n        end.to change(Option.all, :count).by(1)\n      end\n\n      it 'redirects to options path' do\n        post :create, option: attrs\n        expect(response).to redirect_to admin_options_path\n      end\n    end\n\n    context 'invalid attrs' do\n      let(:attrs) { Hash[name: nil, code: nil] }\n\n      it 'renders new form' do\n        post :create, option: attrs\n        expect(response).to render_template :new\n      end\n    end\n  end\n\n  describe 'GET #edit' do\n    let(:option) { create(:option) }\n    before { get :edit, id: option.id }\n\n    it { is_expected.to be_success }\n    it { is_expected.to render_template :edit }\n  end\n\n  describe 'PUT #update' do\n    let!(:option) { create(:option) }\n\n    context 'valid attrs' do\n      let(:attrs) { Hash[name: 'new_name', code: 'new_code'] }\n\n      it 'updates option' do\n        put :update, id: option.id, option: attrs\n        expect(option.reload.name).to eq attrs[:name]\n      end\n\n      it 'redirects to options path' do\n        put :update, id: option.id, option: attrs\n        expect(subject).to redirect_to admin_options_path\n      end\n    end\n\n    context 'invalid attrs' do\n      let(:attrs) { Hash[code: nil] }\n\n      it 'renders edit form' do\n        put :update, id: option.id, option: attrs\n        expect(subject).to render_template :edit\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "spec/controllers/admin/pay_systems_controller_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Admin::PaySystemsController do\n  context 'logged in as user' do\n    login_user\n\n    it 'does not allow to be accessed by user' do\n      get :index\n      expect(response).to redirect_to new_admin_session_path\n    end\n  end\n\n  context 'not logged in' do\n    it 'does not allow to be accessed by guest' do\n      get :index\n      expect(response).to redirect_to new_admin_session_path\n    end\n  end\n\n  context 'logged in as admin' do\n    login_admin\n\n    describe 'GET #index' do\n      before { get :index }\n\n      it 'renders pay_system list' do\n        expect(response).to render_template :index\n      end\n\n      it 'returns success status' do\n        expect(response.status).to eq 200\n      end\n    end\n\n    describe 'GET #show' do\n      let!(:pay_system) { create :pay_system }\n      before { get :show, id: pay_system.id }\n\n      it 'renders template' do\n        expect(response).to render_template :show\n      end\n\n      it 'returns success status' do\n        expect(response.status).to eq 200\n      end\n    end\n\n    describe 'GET #new' do\n      before { get :new }\n\n      it 'renders form' do\n        expect(response).to render_template :new\n      end\n\n      it 'returns success status' do\n        expect(response.status).to eq 200\n      end\n    end\n\n    describe 'POST #create' do\n      context 'valid attributes' do\n        let(:attrs) { attributes_for(:pay_system) }\n\n        it 'creates new pay_system' do\n          expect do\n            post :create, pay_system: attrs\n          end.to change(PaySystem, :count).by(1)\n        end\n\n        it 'redirects to pay_systems list' do\n          post :create, pay_system: attrs\n          expect(response).to redirect_to admin_pay_systems_path\n        end\n      end\n\n      context 'invalid attributes' do\n        let(:attrs) { Hash[name: nil, code: nil] }\n\n        it 'renders pay_system form' do\n          post :create, pay_system: attrs\n          expect(response).to render_template :new\n        end\n      end\n    end\n\n    describe 'GET #edit' do\n      let!(:pay_system) { create(:pay_system) }\n\n      it 'renders edit pay_system page' do\n        get :edit, id: pay_system.id\n        expect(response).to render_template :edit\n      end\n    end\n\n    describe 'PUT #update' do\n      let!(:pay_system) { create(:pay_system) }\n\n      context 'valid attrs' do\n        let(:attrs) { Hash[name: 'new_name'] }\n\n        it 'updates pay_system' do\n          new_pay_system = create(:pay_system)\n          put :update, id: new_pay_system.id, pay_system: attrs\n          expect(new_pay_system.reload.name).to eq attrs[:name]\n        end\n\n        it 'redirects to pay_systems list' do\n          put :update, id: pay_system.id, pay_system: attrs\n          expect(response).to redirect_to admin_pay_systems_path\n        end\n      end\n\n      context 'invalid attrs' do\n        let(:attrs) { Hash[name: nil] }\n\n        it 'renders edit form' do\n          put :update, id: pay_system.id, pay_system: attrs\n          expect(response).to render_template :edit\n        end\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "spec/controllers/admin/plans_controller_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Admin::PlansController do\n  context 'logged in as user' do\n    login_user\n\n    it 'does not allow to be accessed by user' do\n      get :index\n      expect(response).to redirect_to new_admin_session_path\n    end\n  end\n\n  context 'not logged in' do\n    it 'does not allow to be accessed by guest' do\n      get :index\n      expect(response).to redirect_to new_admin_session_path\n    end\n  end\n\n  context 'logged in as admin' do\n    login_admin\n\n    describe 'GET #index' do\n      before { get :index }\n\n      it 'renders plan list' do\n        expect(response).to render_template :index\n      end\n\n      it 'returns success status' do\n        expect(response.status).to eq 200\n      end\n    end\n\n    describe 'GET #new' do\n      before { get :new }\n\n      it 'renders form' do\n        expect(response).to render_template :new\n      end\n\n      it 'returns success status' do\n        expect(response.status).to eq 200\n      end\n    end\n\n    describe 'POST #create' do\n      context 'valid attributes' do\n        let(:attrs) { attributes_for(:plan) }\n\n        it 'creates new plan' do\n          expect do\n            post :create, plan: attrs\n          end.to change(Plan, :count).by(1)\n        end\n\n        it 'redirects to plans list' do\n          post :create, plan: attrs\n          expect(response).to redirect_to admin_plans_path\n        end\n      end\n\n      context 'invalid attributes' do\n        let(:attrs) { Hash[name: nil, price: nil] }\n\n        it 'renders plan form' do\n          post :create, plan: attrs\n          expect(response).to render_template :new\n        end\n      end\n    end\n\n    describe 'GET #edit' do\n      let!(:plan) { create(:plan) }\n\n      it 'renders edit plan page' do\n        get :edit, id: plan.id\n        expect(response).to render_template :edit\n      end\n    end\n\n    describe 'PUT #update' do\n      let!(:plan) { create(:plan) }\n\n      context 'valid attrs' do\n        let(:attrs) { Hash[name: 'new_name'] }\n\n        it 'updates plan' do\n          new_plan = create(:plan)\n          put :update, id: new_plan.id, plan: attrs\n          expect(new_plan.reload.name).to eq attrs[:name]\n        end\n\n        it 'redirects to plans list' do\n          put :update, id: plan.id, plan: attrs\n          expect(response).to redirect_to admin_plans_path\n        end\n      end\n\n      context 'invalid attrs' do\n        let(:attrs) { Hash[name: nil] }\n\n        it 'renders edit form' do\n          put :update, id: plan.id, plan: attrs\n          expect(response).to render_template :edit\n        end\n      end\n    end\n\n    describe 'DELETE #destroy' do\n      let!(:plan) { create(:plan) }\n\n      it 'removes plan' do\n        expect do\n          delete :destroy, id: plan.id\n        end.to change(Plan, :count).by(-1)\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "spec/controllers/admin/profiles_controller_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Admin::ProfilesController do\n  context 'logged in as user' do\n    login_user\n\n    it 'does not allow to be accessed by user' do\n      get :edit\n      expect(response).to redirect_to new_admin_session_path\n    end\n  end\n\n  context 'not logged in' do\n    it 'does not allow to be accessed by guest' do\n      get :edit\n      expect(response).to redirect_to new_admin_session_path\n    end\n  end\n\n  context 'logged in as admin' do\n    let!(:admin) { create(:admin, password: '1234567') }\n    before do\n      @request.env['devise.mapping'] = Devise.mappings[:admin]\n      sign_in admin\n    end\n\n    describe 'GET #edit' do\n      before { get :edit }\n\n      it 'renders edit profile page' do\n        expect(response).to render_template :edit\n      end\n\n      it 'returns success result' do\n        expect(response.status).to eq 200\n      end\n    end\n\n    describe 'PUT #update' do\n      let!(:old_password) { admin.encrypted_password }\n      before { put :update, admin: params }\n\n      context 'valid params' do\n        let(:params) do\n          Hash[\n            current_password: '1234567',\n            password: '12345678',\n            password_confirmation: '12345678'\n          ]\n        end\n\n        it 'updates password' do\n          expect(admin.reload.encrypted_password).not_to eq old_password\n        end\n\n        it 'redirects to edit' do\n          expect(response).to redirect_to edit_admin_profile_path\n        end\n      end\n\n      context 'invalid params' do\n        let(:params) { Hash[current_password: nil] }\n\n        it 'renders edit form' do\n          expect(response).to render_template :edit\n        end\n\n        it 'not updates password' do\n          expect(admin.reload.encrypted_password).to eq old_password\n        end\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "spec/controllers/admin/promos_controller_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Admin::PromosController do\n  subject { response }\n\n  context 'logged in as user' do\n    login_user\n\n    it 'does not allow to be accessed by user' do\n      get :index\n      expect(response).to redirect_to new_admin_session_path\n    end\n  end\n\n  context 'logged in as admin' do\n    login_admin\n\n    describe 'GET #index' do\n      before { get :index }\n\n      it { is_expected.to render_template :index }\n      it { expect(subject.status).to eq 200 }\n    end\n\n    describe 'GET #new' do\n      before { get :new }\n\n      it { is_expected.to render_template :new }\n      it { expect(subject.status).to eq 200 }\n    end\n\n    describe 'POST #create' do\n      context 'valid params' do\n        let(:attrs) { Hash[name: 'new name', type: 'withdrawal', promoter_type: 'discount'] }\n\n        it 'redirects to promos path' do\n          post :create, promo: attrs\n          expect(subject).to redirect_to edit_admin_promo_path(Promo.last)\n        end\n\n        it 'creates new promo' do\n          expect do\n            post :create, promo: attrs\n          end.to change(Promo, :count).by(1)\n        end\n      end\n\n      context 'invalid params' do\n        let(:attrs) { Hash[name: nil] }\n\n        it 'renders new template' do\n          post :create, promo: attrs\n          expect(subject).to render_template :new\n        end\n\n        it 'does not create promo' do\n          expect do\n            post :create, promo: attrs\n          end.not_to change(Promo, :count)\n        end\n      end\n    end\n\n    describe 'GET #edit' do\n      let(:promo) { create(:promo) }\n      before { get :edit, id: promo.id }\n\n      it { is_expected.to render_template :edit }\n      it { expect(subject.status).to eq 200 }\n    end\n\n    describe 'PUT #update' do\n      let!(:promo) { create(:promo) }\n\n      context 'valid params' do\n        let(:attrs) { Hash[name: 'new name', type: 'withdrawal', promoter_type: 'discount'] }\n\n        it 'redirects to edit page' do\n          put :update, promo: attrs, id: promo.id\n          expect(subject).to redirect_to edit_admin_promo_path(promo)\n        end\n\n        it 'updates promo' do\n          put :update, promo: attrs, id: promo.id\n          expect(promo.reload.name).to eq attrs[:name]\n        end\n      end\n\n      context 'invalid params' do\n        let(:attrs) { Hash[name: 'new name', type: nil, promoter_type: 'discount'] }\n\n        it 'renders edit form' do\n          put :update, promo: attrs, id: promo.id\n          expect(subject).to render_template :edit\n        end\n\n        it 'does not update promo' do\n          put :update, promo: attrs, id: promo.id\n          expect(promo.reload.name).not_to eq attrs[:name]\n        end\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "spec/controllers/admin/referrers_controller_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Admin::ReferrersController do\n  subject { response }\n\n  it_behaves_like 'requires admin access', :get, :index\n\n  context 'is admin' do\n    login_admin\n\n    describe 'GET #index' do\n      before { get :index }\n\n      it { is_expected.to be_success }\n      it { is_expected.to render_template :index }\n    end\n  end\nend\n"
  },
  {
    "path": "spec/controllers/admin/servers_controller_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Admin::ServersController do\n  context 'logged in as user' do\n    login_user\n\n    it 'does not allow to be accessed by user' do\n      get :index\n      expect(response).to redirect_to new_admin_session_path\n    end\n  end\n\n  context 'not logged in' do\n    it 'does not allow to be accessed by guest' do\n      get :index\n      expect(response).to redirect_to new_admin_session_path\n    end\n  end\n\n  context 'logged in as admin' do\n    login_admin\n\n    describe 'GET #index' do\n      before { get :index }\n\n      it 'renders server list' do\n        expect(response).to render_template :index\n      end\n\n      it 'returns success status' do\n        expect(response.status).to eq 200\n      end\n    end\n\n    describe 'GET #show' do\n      let!(:server) { create :server }\n      before { get :show, id: server.id }\n\n      it 'renders template' do\n        expect(response).to render_template :show\n      end\n\n      it 'returns success status' do\n        expect(response.status).to eq 200\n      end\n    end\n\n    describe 'GET #new' do\n      before { get :new }\n\n      it 'renders form' do\n        expect(response).to render_template :new\n      end\n\n      it 'returns success status' do\n        expect(response.status).to eq 200\n      end\n    end\n\n    describe 'POST #create' do\n      context 'valid attributes' do\n        let(:attrs) { attributes_for(:server) }\n\n        it 'creates new server' do\n          expect do\n            post :create, server: attrs\n          end.to change(Server, :count).by(1)\n        end\n\n        it 'redirects to servers list' do\n          post :create, server: attrs\n          expect(response).to redirect_to admin_servers_path\n        end\n      end\n\n      context 'invalid attributes' do\n        let(:attrs) { Hash[hostname: nil, ip_address: nil] }\n\n        it 'renders server form' do\n          post :create, server: attrs\n          expect(response).to render_template :new\n        end\n      end\n    end\n\n    describe 'GET #edit' do\n      let!(:server) { create(:server) }\n\n      it 'renders edit server page' do\n        get :edit, id: server.id\n        expect(response).to render_template :edit\n      end\n    end\n\n    describe 'PUT #update' do\n      let!(:server) { create(:server) }\n\n      context 'valid attrs' do\n        let(:attrs) { Hash[hostname: 'new_hostname.smartvpn.biz'] }\n\n        it 'updates server' do\n          new_server = create(:server)\n          put :update, id: new_server.id, server: attrs\n          expect(new_server.reload.hostname).to eq attrs[:hostname]\n        end\n\n        it 'redirects to servers list' do\n          put :update, id: server.id, server: attrs\n          expect(response).to redirect_to admin_servers_path\n        end\n      end\n\n      context 'invalid attrs' do\n        let(:attrs) { Hash[hostname: nil] }\n\n        it 'renders edit form' do\n          put :update, id: server.id, server: attrs\n          expect(response).to render_template :edit\n        end\n      end\n    end\n\n    describe 'DELETE #destroy' do\n      let!(:server) { create(:server) }\n\n      it 'removes server' do\n        expect do\n          delete :destroy, id: server.id\n        end.to change(Server, :count).by(-1)\n      end\n    end\n\n    describe 'GET #generate_config' do\n      let!(:server) { create(:server) }\n      let!(:config) { ServerConfigBuilder.new(server: server).to_text }\n\n      it 'calls config builder' do\n        allow_any_instance_of(ServerConfigBuilder).to receive(:to_text).and_return(config)\n        get :generate_config, id: server.id\n      end\n\n      it 'sends config to download' do\n        get :generate_config, id: server.id\n        expect(response.header['Content-Type']).to eq 'application/octet-stream'\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "spec/controllers/admin/traffic_reports_controller_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Admin::TrafficReportsController do\n  login_admin\n  subject { response }\n\n  describe 'GET #index' do\n    before { get :index }\n\n    it { is_expected.to be_success }\n    it { is_expected.to render_template :index }\n  end\n\n  describe 'GET #users' do\n    before { get :users }\n\n    it { is_expected.to be_success }\n    it { is_expected.to render_template :users }\n  end\n\n  describe 'GET #date' do\n    before { get :date }\n\n    it { is_expected.to be_success }\n    it { is_expected.to render_template :date }\n  end\n\n  describe 'GET #servers' do\n    before { get :servers }\n\n    it { is_expected.to be_success }\n    it { is_expected.to render_template :servers }\n  end\nend\n"
  },
  {
    "path": "spec/controllers/admin/transactions_controller_spec.rb",
    "content": ""
  },
  {
    "path": "spec/controllers/admin/users_controller_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Admin::UsersController do\n  render_views\n  login_admin\n  subject { response }\n\n  describe 'GET #index' do\n    before { get :index }\n\n    it { is_expected.to be_success }\n    it { is_expected.to render_template :index }\n  end\n\n  describe 'GET #payers' do\n    before { get :payers }\n\n    it { is_expected.to be_success }\n    it { is_expected.to render_template :payers }\n  end\n\n  describe 'GET #this_month_payers' do\n    before { get :this_month_payers }\n\n    it { is_expected.to be_success }\n    it { is_expected.to render_template :this_month_payers }\n  end\n\n  describe 'GET #show' do\n    let(:user) { create(:user) }\n    before { get :show, id: user.id }\n\n    it { is_expected.to be_success }\n    it { is_expected.to render_template :show }\n  end\n\n  describe 'GET #edit' do\n    let(:user) { create(:user) }\n    before { get :edit, id: user.id }\n\n    it { is_expected.to be_success }\n    it { is_expected.to render_template :edit }\n  end\n\n  describe 'GET #new' do\n    before { get :new }\n\n    it { is_expected.to be_success }\n    it { is_expected.to render_template :new }\n  end\n\n  describe 'POST #create' do\n    let!(:user) { create(:user) }\n    let!(:plan) { create(:plan) }\n    let!(:operation) { double('Ops::Admin::User::Create') }\n    before { allow(Ops::Admin::User::Create).to receive(:new).with(params: params).and_return(operation) }\n\n    context 'params correct' do\n      let(:params) do\n        {\n          email: 'user@gmail.com',\n          password: '123456',\n          password_confirmation: '123456',\n          plan_id: plan.id.to_s\n        }.as_json\n      end\n\n      it 'run operation' do\n        expect(operation).to receive(:call).and_return(success: true, user: user)\n        post :create, user: params\n      end\n\n      it 'redirects to users path' do\n        allow(operation).to receive(:call).and_return(success: true, user: user)\n        post :create, user: params\n        expect(subject).to redirect_to admin_users_path\n      end\n    end\n\n    context 'params invalid' do\n      let(:params) do\n        {\n          email: 'user@gmail.com',\n          password: '123456',\n          password_confirmation: '12345678',\n          plan_id: plan.id.to_s\n        }.as_json\n      end\n\n      it 'run operation' do\n        expect(operation).to receive(:call).and_return(success: false, user: user)\n        post :create, user: params\n      end\n\n      it 'redirects to users path' do\n        allow(operation).to receive(:call).and_return(success: false, user: user)\n        post :create, user: params\n        expect(subject).to render_template :new\n      end\n    end\n  end\n\n  describe 'PUT #update' do\n    let(:user) { create(:user) }\n\n    before { put :update, id: user.id, user: attrs }\n\n    context 'params correct' do\n      let(:attrs) { Hash[email: 'new@mail.ru'] }\n\n      it 'redirects to users path' do\n        expect(subject).to redirect_to admin_users_path\n      end\n    end\n\n    context 'params invalid' do\n      let(:attrs) { Hash[plan_id: nil] }\n\n      it 'renders edit form' do\n        expect(subject).to render_template :edit\n      end\n    end\n  end\n\n  describe 'PUT #withdraw' do\n    let(:user) { create(:user_with_balance) }\n\n    it 'creates new withdrawal' do\n      expect do\n        put :withdraw, id: user.id\n      end.to change(Withdrawal, :count).by(1)\n    end\n  end\n\n  describe 'PUT #prolongate' do\n    let!(:user) { create(:user_with_balance) }\n    let!(:withdrawal) { create(:withdrawal, user: user) }\n    let(:attrs) { Hash[days_number: 10] }\n\n    it 'creates new withdrawal prolongation' do\n      expect do\n        put :prolongate, id: user.id, withdrawal_prolongation: attrs\n      end.to change(WithdrawalProlongation, :count).by(1)\n    end\n\n    it 'prolongation is created for last withdrawal' do\n      expect do\n        put :prolongate, id: user.id, withdrawal_prolongation: attrs\n      end.to change(user.withdrawals.last.withdrawal_prolongations, :count).by(1)\n    end\n\n    it 'prolongation days number equals form data' do\n      put :prolongate, id: user.id, withdrawal_prolongation: attrs\n      expect(user.withdrawals.last.withdrawal_prolongations.last.days_number).to eq attrs[:days_number]\n    end\n  end\n\n  describe 'PUT #payment' do\n    let!(:user) { create(:user) }\n    let!(:pay_system) { create(:pay_system) }\n    let(:attrs) { Hash[amount: 100, pay_system_id: pay_system.id, comment: 'some comment'] }\n\n    it 'creates new payment' do\n      expect do\n        put :payment, id: user.id, payment: attrs\n      end.to change(Payment, :count).by(1)\n    end\n\n    context 'after request' do\n      before { put :payment, id: user.id, payment: attrs }\n\n      it 'payment is accepted' do\n        expect(Payment.last.accepted?).to be true\n      end\n\n      it 'payment has comment from attrs' do\n        expect(Payment.last.comment).to eq attrs[:comment]\n      end\n\n      it 'payment is marked as manual' do\n        expect(Payment.last.manual_payment).to be true\n      end\n    end\n  end\n\n  describe 'GET #emails_export' do\n    before do\n      create_list(:user, 2)\n      get :emails_export\n    end\n\n    it { is_expected.to be_success }\n\n    it 'contains emails of all users' do\n      emails = User.all.map(&:email).join(',')\n      expect(response.body).to include emails\n    end\n  end\n\n  describe 'PUT #enable_test_period' do\n    let(:user) { create(:user) }\n\n    it 'calles enable action' do\n      put :enable_test_period, id: user.id\n      expect(user.reload.test_period.enabled?).to be true\n    end\n\n    it 'send email' do\n      allow_any_instance_of(User).to receive(:test_period_started_at).and_return(Date.current)\n      expect do\n        put :enable_test_period, id: user.id\n      end.to change(ActionMailer::Base.deliveries, :size).by(1)\n    end\n\n    it 'redirects to user path' do\n      put :enable_test_period, id: user.id\n      expect(response).to redirect_to admin_user_path(user)\n    end\n  end\n\n  describe 'PUT #disable_test_period' do\n    let(:user) { create(:user) }\n\n    it 'calles disable action' do\n      allow_any_instance_of(TestPeriod).to receive(:disable!)\n      put :disable_test_period, id: user.id\n    end\n\n    it 'redirects to user path' do\n      put :disable_test_period, id: user.id\n      expect(response).to redirect_to admin_user_path(user)\n    end\n  end\n\n  describe 'PUT #force_disconnect' do\n    let(:user) { create(:user) }\n\n    it 'calls disconnector' do\n      allow_any_instance_of(ForcedDisconnect).to receive(:invoke)\n      put :force_disconnect, id: user.id\n    end\n\n    it 'redirects to user path' do\n      put :force_disconnect, id: user.id\n      expect(response).to redirect_to admin_user_path(user)\n    end\n  end\nend\n"
  },
  {
    "path": "spec/controllers/api/authentication_controller_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Api::AuthenticationController do\n  it_behaves_like 'validating signature', :auth\n\n  describe 'POST #auth' do\n    let(:user) { create(:user_with_balance) }\n    let(:server) { create(:server) }\n\n    before do\n      user.plan.servers << server\n      allow_any_instance_of(Api::AuthenticationController).to receive(:valid_api_call?).and_return(true)\n    end\n\n    context 'valid credentials' do\n      let(:params) { Hash[login: user.vpn_login, password: user.vpn_password, hostname: server.hostname] }\n      before { create(:withdrawal, user: user) }\n\n      it 'returns 200 status' do\n        post :auth, params\n        expect(response.status).to eq 200\n      end\n    end\n\n    context 'invalid credentials' do\n      let(:params) { Hash[login: user.vpn_login, password: 'asd', hostname: server.hostname] }\n\n      it 'returns 404 status' do\n        post :auth, params\n        expect(response.status).to eq 404\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "spec/controllers/api/connection_controller_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Api::ConnectionController do\n  let(:user) { create(:user) }\n  let(:server) { create(:server) }\n  let(:attrs) { { login: user.vpn_login, hostname: server.hostname, traffic_in: '10', traffic_out: '15' } }\n  subject { response }\n\n  it_behaves_like 'validating signature', :connect\n  it_behaves_like 'validating signature', :disconnect\n\n  describe 'api calls' do\n    before do\n      allow_any_instance_of(Api::ConnectionController).to receive(:valid_api_call?).and_return(true)\n    end\n\n    describe 'POST #connect' do\n      it 'calls connector' do\n        allow_any_instance_of(Connector).to receive(:invoke).once\n        post :connect, attrs\n      end\n\n      it 'passed connect action to connector' do\n        connector = Connector.new(attrs.merge!(action: 'connect'))\n        expect(Connector).to receive(:new).with(attrs).and_return(connector)\n        post :connect, attrs\n      end\n\n      context 'user has options' do\n        let(:params) { attrs.merge!(action: 'connect') }\n\n        before do\n          option = create(:active_option)\n          user.plan.options << option\n          user.options << option\n          post :connect, params\n        end\n\n        it { is_expected.to be_json }\n\n        it 'response includes options list' do\n          expect(json).to have_key('options')\n        end\n      end\n    end\n\n    describe 'POST #disconnect' do\n      it 'calls connector' do\n        allow_any_instance_of(Connector).to receive(:invoke).once\n        post :disconnect, attrs\n      end\n\n      it 'passed disconnect action to connector' do\n        connector = Connector.new(attrs.merge!(action: 'disconnect'))\n        expect(Connector).to receive(:new).with(attrs).and_return(connector)\n        post :disconnect, attrs\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "spec/controllers/api/servers_controller_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Api::ServersController do\n  let(:hostname) { 'valid_hostname' }\n  let(:signature) { Settings.secret_token }\n\n  describe 'POST #activate' do\n    let(:params) do\n      attributes_for(:server).merge(\n        signature: signature,\n        hostname: hostname,\n        server_crt: 'server crt',\n        client_crt: 'client crt',\n        client_key: 'client key'\n      )\n    end\n\n    context 'when server exists' do\n      let!(:server) { create(:server) }\n      let(:hostname) { server.hostname }\n\n      it 'raises error' do\n        expect do\n          post :activate, params\n        end.to raise_error ApiException, \"Server already exists: #{server}\"\n      end\n    end\n\n    context 'server does not exist' do\n      context 'correct token' do\n        let(:server) { Server.last }\n\n        it 'renders json with auth key' do\n          post :activate, params\n          expect(response.body).to eq Hash[auth_key: server.auth_key].to_json\n        end\n\n        it 'returns success status' do\n          post :activate, params\n          expect(response.status).to eq 200\n        end\n\n        it 'updates server pki fields' do\n          expect { post :activate, params }\n            .to change { Server.count }.by(1)\n        end\n\n        it 'assigns certificate data to server' do\n          post :activate, params\n          expect(server.server_crt).to eq('server crt')\n          expect(server.client_crt).to eq('client crt')\n          expect(server.client_key).to eq('client key')\n        end\n      end\n\n      context 'incorrect token' do\n        let(:hostname) { 'some_hostname' }\n        let(:signature) { 'invalid_token' }\n\n        it 'raises error' do\n          expect do\n            post :activate, params\n          end.to raise_error ApiException, \"Server activation attempt with incorrect token: #{signature}\"\n        end\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "spec/controllers/application_controller_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe ApplicationController do\n  controller do\n    def index\n      raise CanCan::AccessDenied, 'Unauthorized'\n    end\n  end\n\n  describe 'not signed in as user' do\n    it 'raises error' do\n      get :index\n      expect(response).to redirect_to billing_root_path\n    end\n  end\nend\n"
  },
  {
    "path": "spec/controllers/billing/options_controller_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Billing::OptionsController do\n  login_user\n  subject { response }\n\n  describe 'GET #index' do\n    before { get :index }\n    it { is_expected.to be_success }\n    it { is_expected.to render_template :index }\n  end\n\n  describe 'POST #create' do\n    let!(:option) { create(:active_option) }\n    let(:option_code) { option.code }\n\n    before do\n      allow(Option::Activator).to receive(:run).with(@user, option_code).and_return(activation_result)\n      post :create, code: option_code\n    end\n\n    context 'success' do\n      let(:activation_result) { true }\n\n      it 'redirests to options list' do\n        expect(response).to redirect_to billing_options_path\n      end\n\n      it 'displays success message' do\n        expect(flash[:notice]).to include I18n.t('billing.options.notices.activated')\n      end\n    end\n\n    context 'failure' do\n      let(:activation_result) { false }\n\n      it 'redirests to options list' do\n        expect(response).to redirect_to billing_options_path\n      end\n\n      it 'displays failure message' do\n        expect(flash[:alert]).to include I18n.t('billing.options.notices.not_activated')\n      end\n    end\n  end\n\n  describe 'PUT #update' do\n    let(:option) { create(:proxy_option) }\n    let(:old_attrs) { Hash[country: 'China'] }\n    let(:new_attrs) { Hash[country: 'Russia'] }\n    let!(:user_option) { create(:user_option, state: 'enabled', attrs: old_attrs, user: @user, option: option) }\n\n    before { put :update, id: option.id, option_attributes: new_attrs }\n\n    it 'changes attributes' do\n      expect(user_option.reload.attrs['country']).to eq 'Russia'\n    end\n  end\n\n  describe 'PUT #toggle' do\n    let(:option) { create(:proxy_option) }\n    let!(:user_option) { create(:user_option, state: 'enabled', user: @user, option: option) }\n\n    it 'calles toggle! on option' do\n      allow_any_instance_of(UserOption).to receive(:toggle!)\n      put :toggle, id: option.id\n    end\n  end\nend\n"
  },
  {
    "path": "spec/controllers/billing/payments_controller_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Billing::PaymentsController do\n  context 'when not authorized' do\n    it 'does not respond' do\n      get :index\n      expect(response).to redirect_to new_user_session_path\n    end\n  end\n\n  context 'when regular user' do\n    let(:pay_system) { create(:pay_system) }\n    login_user\n\n    it 'displays pay systems list' do\n      get :index\n      expect(response).to render_template :index\n    end\n\n    it 'displays new payment form' do\n      get :new, code: pay_system.code\n      expect(response).to render_template :new\n    end\n\n    it 'redirects to merchant form page on payment create' do\n      post :create, payment: attributes_for(:payment).merge!(pay_system_id: pay_system.id)\n      expect(response).to redirect_to merchant_billing_payment_path(Payment.last)\n    end\n\n    context 'when payment is already accepted' do\n      before do\n        @payment = create(:payment, user: @user)\n        @payment.accept!\n      end\n\n      it 'redirects to pay systems list' do\n        get :merchant, id: @payment.id\n        expect(response).to redirect_to billing_payments_path\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "spec/controllers/billing/paypal_controller_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Billing::PaypalController do\n  it_behaves_like 'validating pay_system state', :result, 'item_number'\n  it_behaves_like 'has success and fail responders'\n\n  describe '#result' do\n  end\nend\n"
  },
  {
    "path": "spec/controllers/billing/promotions_controller_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Billing::PromotionsController do\n  let(:promo_code) { 'promo' }\n  let(:settings_path) { edit_user_registration_path }\n  subject { response }\n\n  describe 'POST #create' do\n    context 'when not authorized' do\n      it 'does not respond' do\n        post :create, promo: { code: promo_code }\n        expect(subject).to redirect_to new_user_session_path\n      end\n    end\n\n    context 'logged in' do\n      login_user\n\n      context 'promo with such code does not exist' do\n        before do\n          post :create, promotion: { promo_code: promo_code }\n        end\n\n        it 'redirects to settings page' do\n          expect(subject).to redirect_to settings_path\n        end\n\n        it 'renders info, that promo not found' do\n          expect(flash[:alert]).to include I18n.t('billing.promotions.notices.no_promos_found')\n        end\n      end\n\n      context 'promotion already exists' do\n        let!(:promo) { create(:active_promo, date_from: 1.week.ago, date_to: 1.week.from_now, promo_code: promo_code) }\n        let!(:promotion) { create(:promotion, user: User.last, promo: promo) }\n\n        before do\n          post :create, promotion: { promo_code: promo_code }\n        end\n\n        it 'redirects to settings page' do\n          expect(subject).to redirect_to settings_path\n        end\n\n        it 'renders info, that promo already activated' do\n          expect(flash[:alert]).to include I18n.t('billing.promotions.notices.promotion_already_activated')\n        end\n      end\n\n      context 'promo exists, promotion not' do\n        let!(:promo) { create(:active_promo, date_from: 1.week.ago, date_to: 1.week.from_now, promo_code: promo_code) }\n        before { post :create, promotion: { promo_code: promo_code } }\n\n        it 'redirects to settings page' do\n          expect(subject).to redirect_to settings_path\n        end\n\n        it 'renders info, that promo activated' do\n          expect(flash[:notice]).to include I18n.t('billing.promotions.notices.promotion_activated')\n        end\n\n        it 'creates promotion' do\n          expect(Promotion.count).to eq 1\n        end\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "spec/controllers/billing/referrers_controller_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Billing::ReferrersController do\n  login_user\n  subject { response }\n\n  describe 'GET #index' do\n    before { get :index }\n    it { is_expected.to be_success }\n    it { is_expected.to render_template :index }\n  end\nend\n"
  },
  {
    "path": "spec/controllers/billing/robokassa_controller_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Billing::RobokassaController do\n  render_views\n  subject { response }\n\n  it_behaves_like 'validating pay_system state', :result, 'InvId'\n  it_behaves_like 'has success and fail responders'\n\n  describe 'POST #result' do\n    context 'notification signature is not valid' do\n      let(:attrs) { Hash[] }\n\n      it 'raises error' do\n        expect do\n          post :result, attrs\n        end.to raise_error 'Invalid robokassa notification'\n      end\n    end\n\n    context 'valid notification' do\n      let!(:payment) { create :payment }\n      let(:attrs) { Hash['OutSum' => '9.99', 'InvId' => '10', 'SignatureValue' => 'D25F8F107E3482EF3CCAFC620CC8BA3E'] }\n\n      before do\n        allow_any_instance_of(ActiveMerchant::Billing::Integrations::Robokassa::Notification)\n          .to receive(:acknowledge)\n          .and_return(true)\n        allow(Payment).to receive(:find).and_return(payment)\n        post :result, attrs\n      end\n\n      it 'returns 200 state' do\n        expect(subject.status).to eq 200\n      end\n\n      it 'renders text' do\n        expect(subject.body).to include 'Done'\n      end\n\n      it 'changes payment state to accepted' do\n        expect(payment.reload.accepted?).to be true\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "spec/controllers/billing/servers_controller_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'rails_helper'\n\ndescribe Billing::ServersController do\n  subject { response }\n\n  login_user\n\n  describe 'GET #index' do\n    before { get :index }\n\n    it { is_expected.to be_success }\n    it { is_expected.to render_template :index }\n  end\n\n  describe 'GET #download_config' do\n    let!(:server) { create(:active_server, plans: [@user.plan]) }\n    let!(:config) { ServerConfigBuilder.new(server: server).to_text }\n\n    before { server.plans << @user.plan }\n\n    it 'calls config builder' do\n      allow_any_instance_of(ServerConfigBuilder).to receive(:to_text).and_return(config)\n      get :download_config, id: server.id\n    end\n\n    it 'sends config to download' do\n      get :download_config, id: server.id\n      expect(response.header['Content-Type']).to eq 'application/octet-stream'\n    end\n  end\nend\n"
  },
  {
    "path": "spec/controllers/billing/webmoney_controller_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Billing::WebmoneyController do\n  render_views\n  subject { response }\n\n  it_behaves_like 'validating pay_system state', :result, 'LMI_PAYMENT_NO'\n  it_behaves_like 'has success and fail responders'\n\n  describe 'POST #result' do\n    describe 'test request' do\n      context 'key param is not present' do\n        let(:attrs) { Hash[] }\n\n        before { post :result, attrs }\n\n        it 'renders YES text' do\n          expect(subject.body).to include 'YES'\n        end\n      end\n    end\n\n    describe 'final request' do\n      context 'transaction_key_id is not defined' do\n        let(:attrs) { { 'LMI_HASH' => 'test_hash' } }\n\n        it 'raises error' do\n          expect do\n            post :result, attrs\n          end.to raise_error 'Undefined transaction_item_id'\n        end\n      end\n\n      context 'notification signature is not valid' do\n        let!(:payment) { create :payment }\n        let(:attrs) { { 'LMI_HASH' => 'test_hash', 'LMI_PAYMENT_NO' => payment.id, 'LMI_PAYMENT_AMOUNT' => '123' } }\n\n        it 'raises error' do\n          expect do\n            post :result, attrs\n          end.to raise_error 'Invalid webmoney verification key'\n        end\n      end\n\n      context 'valid notification' do\n        let!(:payment) { create :payment }\n        let(:attrs) do\n          {\n            'LMI_MODE' => '1',\n            'LMI_PAYMENT_AMOUNT' => '9.99',\n            'LMI_PAYEE_PURSE' => 'Z164234536204',\n            'LMI_PAYMENT_NO' => '15',\n            'LMI_PAYER_WM' => '273350110703',\n            'LMI_PAYER_PURSE' => 'Z133417776395',\n            'LMI_SYS_INVS_NO' => '407',\n            'LMI_SYS_TRANS_NO' => '601',\n            'LMI_SYS_TRANS_DATE' => '20131129 16:39:38',\n            'LMI_HASH' => 'EDB5707A4FFC27225E59BFBB1CFB5CEA',\n            'LMI_PAYMENT_DESC' => '#15',\n            'LMI_LANG' => 'ru-RU'\n          }\n        end\n\n        before do\n          allow_any_instance_of(ActiveMerchant::Billing::Integrations::Webmoney::Notification)\n            .to receive(:recognizes?)\n            .and_return(true)\n          allow_any_instance_of(ActiveMerchant::Billing::Integrations::Webmoney::Notification)\n            .to receive(:acknowledge)\n            .and_return(true)\n          allow(Payment).to receive(:find).and_return(payment)\n          post :result, attrs\n        end\n\n        it 'returns 200 state' do\n          expect(subject.status).to eq 200\n        end\n\n        it 'renders text' do\n          expect(subject.body).to include 'Done'\n        end\n\n        it 'changes payment state to accepted' do\n          expect(payment.reload.accepted?).to be true\n        end\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "spec/controllers/referrers_controller_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe ReferrersController do\n  describe 'GET #set_referrer' do\n    let(:user) { create(:user) }\n    before { get :set_referrer, code: user.reflink }\n\n    it 'sets reflink to cookie' do\n      expect(response.cookies['reflink']).to eq user.reflink\n    end\n\n    it 'redirects to index page' do\n      expect(response).to redirect_to root_path\n    end\n  end\nend\n"
  },
  {
    "path": "spec/controllers/users/registrations_controller_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Users::RegistrationsController do\n  describe 'POST #create' do\n    let!(:referrer) { create(:user) }\n    let(:plan) { create(:plan) }\n    let(:attrs) { Hash[email: 'user@email.com', password: '123456789', plan_id: plan.id, accept_agreement: '1'] }\n\n    before { @request.env['devise.mapping'] = Devise.mappings[:user] }\n\n    context 'reflink set in params' do\n      before do\n        request.cookies['reflink'] = referrer.reflink\n        post :create, user: attrs\n      end\n\n      it 'creates user' do\n        expect(User.count).to eq 2\n      end\n\n      it 'user has referrer' do\n        expect(User.last.referrer).not_to be_nil\n      end\n\n      it 'user is linked to referrer' do\n        expect(User.last.referrer_id).to eq referrer.id\n      end\n    end\n\n    context 'no reflink in params' do\n      before do\n        post :create, user: attrs\n      end\n\n      it 'creates user' do\n        expect(User.count).to eq 2\n      end\n\n      it 'does not have referrer' do\n        expect(User.last.referrer).to be_nil\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "spec/decorators/admin/options_decorator_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Admin::OptionsDecorator do\n  let(:object) { create(:option) }\n  subject { described_class.new(object) }\n\n  describe 'state' do\n    it 'has state class' do\n      expect(subject.state).to include 'state'\n    end\n\n    it 'wrapped by span' do\n      expect(subject.state).to include 'span'\n    end\n\n    context 'active' do\n      before { object.activate! }\n\n      it '.state' do\n        expect(subject.state).to include 'active'\n      end\n    end\n\n    context 'disabled' do\n      it '.state' do\n        expect(subject.state).to include 'disabled'\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "spec/decorators/option_attribute_decorator_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe OptionAttributeDecorator do\n  let(:name) { 'country' }\n  let(:current_value) { 'Russia' }\n  subject { described_class.new(name, values, current_value) }\n\n  describe '.render' do\n    context 'select' do\n      let(:values) do\n        {\n          type: :select, value: ['Russia']\n        }\n      end\n\n      it 'renders select tag' do\n        expect(subject.render).to include 'select'\n      end\n\n      it 'includes values' do\n        expect(subject.render).to include values[:value].first\n      end\n\n      it 'input has according name' do\n        expect(subject.render).to include \"name=\\\"#{name}\\\"\"\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "spec/decorators/pay_system_decorator_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe PaySystemDecorator do\n  let(:pay_system) { create(:pay_system) }\n  subject { described_class.new(pay_system) }\n\n  describe '.title' do\n    it 'creates link' do\n      expect(subject.title).to include 'href'\n    end\n\n    it 'uses pay system name as link anchor' do\n      expect(subject.title).to include pay_system.name\n    end\n  end\n\n  describe '.human_state' do\n    it 'localizes state' do\n      expect(subject.human_state).to eq I18n.t(\"admin.pay_systems.states.#{pay_system.state}\")\n    end\n  end\nend\n"
  },
  {
    "path": "spec/decorators/promo_decorator_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe PromoDecorator do\n  let(:promo) { create(:promo) }\n  subject { PromoDecorator.new(promo) }\n\n  describe 'period' do\n    it 'returns string with start date' do\n      expect(subject.period).to include described_class.h.human_date(promo.date_from, time: false)\n    end\n\n    it 'returns string with end date' do\n      expect(subject.period).to include described_class.h.human_date(promo.date_to, time: false)\n    end\n  end\n\n  describe 'type' do\n    it 'returns translation of field' do\n      expect(subject.type).to eq I18n.t(\"activerecord.attributes.promo.types.#{promo.type}\")\n    end\n  end\n\n  describe 'promoter type' do\n    it 'returns translation of field' do\n      expect(subject.promoter_type).to eq I18n.t(\"activerecord.attributes.promoter.types.#{promo.promoter_type}\")\n    end\n  end\n\n  describe 'state' do\n    it 'translates state name' do\n      expect(subject.state).to include I18n.t(\"activerecord.attributes.promo.states.#{promo.state}\")\n    end\n\n    it 'wraps in span' do\n      expect(subject.state).to include '<span'\n    end\n\n    context 'active' do\n      before { promo.start! }\n      it 'adds green color to span' do\n        expect(subject.state).to include 'green'\n      end\n    end\n\n    context 'pending' do\n      it 'adds red color to span' do\n        expect(subject.state).to include 'red'\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "spec/decorators/transaction_decorator_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe TransactionDecorator do\n  let(:model) { create(:payment) }\n  let(:transaction) { Transaction.new(model.id, model) }\n  subject { described_class.new(transaction) }\n\n  it 'delegates id to model' do\n    expect(subject.id).to eq transaction.id\n  end\n\n  it 'returns amount with currency code' do\n    expect(subject.amount).to include 'USD'\n  end\n\n  describe '#user' do\n    it 'returns link' do\n      expect(subject.user).to include 'href'\n    end\n\n    it 'user email is link anchor' do\n      expect(subject.user).to include model.user.email\n    end\n  end\n\n  context 'model is payment' do\n    it 'returns amount with positive sign' do\n      expect(subject.amount).to include '+'\n    end\n\n    it 'returns description with pay system name' do\n      expect(subject.description).to include model.pay_system.name\n    end\n  end\n\n  context 'model is withdrawal' do\n    let(:model) { create(:withdrawal) }\n\n    it 'returns amount with negative sign' do\n      expect(subject.amount).to include '-'\n    end\n\n    it 'returns description with plan name' do\n      expect(subject.description).to include model.plan.name\n    end\n  end\nend\n"
  },
  {
    "path": "spec/decorators/user_decorator_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe UserDecorator do\n  let!(:user) { create(:user_with_balance) }\n  let(:decorator) { user.decorate }\n\n  describe '.connection_status' do\n    subject { decorator.connection_status }\n\n    context 'connected' do\n      before { create(:connect, user: user) }\n      it 'returns link to connection' do\n        expect(subject).to include 'href='\n      end\n    end\n\n    context 'disconnected' do\n      it 'returns not connected text' do\n        expect(subject).to eq I18n.t('admin.users.not_connected')\n      end\n    end\n  end\n\n  describe '.current_interval_payment_status' do\n    subject { decorator.current_interval_payment_status }\n\n    context 'paid' do\n      let!(:withdrawal) { create(:withdrawal, user: user) }\n      it 'returns last withdrawal date' do\n        expect(subject).to eq described_class.h.human_date(withdrawal.created_at)\n      end\n    end\n\n    context 'unpaid' do\n      it 'returns unpaid text' do\n        expect(subject).to eq I18n.t('admin.users.not_paid')\n      end\n    end\n  end\n\n  describe '.options' do\n    let(:option) { create(:active_option) }\n    subject { decorator.options }\n\n    before { user.options << option }\n\n    it 'includes option name' do\n      expect(subject).to include option.name\n    end\n  end\nend\n"
  },
  {
    "path": "spec/factories.rb",
    "content": "# frozen_string_literal: true\n\n# TODO:\n# devide factories by subsystems\n# e.g.:\n# spec/factories/proxy\n# spec/factories/payments\n# spec/factories/users\n# spec/factories/partner_program\n\nFactoryGirl.define do\n  factory :admin do\n    sequence(:email)               { |n| \"admin#{n}@example.com\" }\n    sequence(:password)            { |n| \"password#{n}\" }\n  end\n\n  factory :user do\n    sequence(:email)               { |n| \"person#{n}@example.com\" }\n    sequence(:password)            { |_n| 'password' }\n    plan\n    accept_agreement '1'\n    confirmed_at Time.current\n\n    factory :user_with_balance do\n      balance 100\n    end\n  end\n\n  factory :plan do\n    name 'Tariff plan plus'\n    price 10\n    description 'MyText'\n    code 'plus'\n    special false\n    enabled true\n  end\n\n  factory :payment do\n    user\n    amount 10\n    association :pay_system, factory: :enabled_pay_system\n  end\n\n  factory :pay_system do\n    sequence(:name) { |n| \"PaySystem#{n}\" }\n    sequence(:code) { |n| \"code#{n}\" }\n\n    factory :enabled_pay_system do\n      state :enabled\n    end\n\n    factory :rub_pay_system do\n      state :enabled\n      currency 'rub'\n    end\n  end\n\n  factory :withdrawal do\n    plan\n    association :user, factory: :user_with_balance\n    amount 1\n  end\n\n  factory :withdrawal_prolongation do\n    withdrawal\n    days_number 1\n  end\n\n  factory :server do\n    sequence(:hostname) { |n| \"#{Faker::Lorem.word}#{n}\" }\n    ip_address '192.168.1.1'\n    protocol 'udp'\n    port 443\n    server_crt 'some server crt'\n    client_crt 'some client crt'\n    client_key 'some client key'\n\n    factory :disabled_server do\n      state :disabled\n    end\n\n    factory :active_server do\n      state :active\n    end\n  end\n\n  factory :connect do\n    user\n    server\n    option_attributes Hash[]\n  end\n\n  factory :disconnect do\n    user\n    server\n    traffic_in 1.5\n    traffic_out 1.5\n    option_attributes Hash[]\n  end\n\n  factory :plan_has_server do\n    server\n    plan\n  end\n\n  factory :promo do\n    name 'Promo name'\n    type 'withdrawal'\n    date_from 2.day.ago\n    date_to 2.day.from_now\n    promoter_type 'discount'\n    promo_code 'MyString'\n\n    factory :active_promo do\n      state 'active'\n    end\n\n    factory :option_promo do\n      type 'option'\n    end\n  end\n\n  factory :promotion do\n    user_id 1\n    promo_id 1\n  end\n\n  factory :option do\n    name 'I2P'\n    sequence(:code) { |n| \"option#{n}\" }\n\n    factory :active_option do\n      state 'active'\n    end\n\n    factory :proxy_option do\n      state 'active'\n      code 'proxy'\n      name 'Proxy'\n    end\n\n    factory :i2p_option do\n      state 'active'\n      code 'i2p'\n      name 'I2p'\n    end\n  end\n\n  factory :referrer_reward, class: 'Referrer::Reward' do\n    amount '9.99'\n    operation_id 1\n    referrer_id 1\n  end\n\n  factory :proxy_connect, class: 'Proxy::Connect' do\n    user_id 1\n    proxy_id 1\n  end\n\n  factory :proxy_node, class: 'Proxy::Node' do\n    host 'MyString'\n    port 1\n    country 'MyString'\n    location 'MyString'\n    ping 1\n    bandwidth 1\n    protocol 'MyString'\n    anonymity 'MyString'\n  end\n\n  factory :user_option do\n    user_id 1\n    option_id 1\n    attrs ''\n\n    trait :disabled do\n      state 'disabled'\n    end\n  end\nend\n"
  },
  {
    "path": "spec/features/admin/plans/plans_option_prices_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe 'Plans option prices' do\n  let!(:plan) { create(:plan) }\n  let!(:option) { create(:option) }\n  let!(:option_price) { '777' }\n\n  before { I18n.locale = :ru }\n\n  context 'option inactive' do\n    it 'does now display option at select' do\n      sign_in_admin\n      visit edit_admin_plan_path(plan)\n      expect(page).not_to have_content option.name\n    end\n  end\n\n  context 'option is active' do\n    it 'displays option price select and updates it' do\n      option.activate!\n      sign_in_admin\n      visit edit_admin_plan_path(plan)\n\n      expect(page).not_to have_content \"#{option.name} #{I18n.t('activerecord.attributes.option.price')}\"\n\n      select(option.name, from: 'Options')\n      click_button(I18n.t('global.apply'))\n      visit edit_admin_plan_path(plan)\n      expect(page).to have_content \"#{option.name} #{I18n.t('activerecord.attributes.option.price')}\"\n\n      within(\"form#edit_plan_#{plan.id}\") do\n        fill_in \"plan_option_prices_#{option.code}\", with: option_price\n        click_button I18n.t('global.apply')\n      end\n\n      visit edit_admin_plan_path(plan)\n      expect(find(\"#plan_option_prices_#{option.code}\").value).to eq option_price\n    end\n  end\nend\n"
  },
  {
    "path": "spec/features/admin/plans/update_plan_servers_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe 'plan servers' do\n  let!(:plan) { create(:plan) }\n  let!(:server1) { create(:server) }\n  let!(:server2) { create(:server) }\n\n  before { I18n.locale = :ru }\n\n  it 'displays multiple servers select and updates plan' do\n    sign_in_admin\n    visit edit_admin_plan_path(plan)\n\n    [server1.hostname, server2.hostname].each do |server_name|\n      select(server_name, from: 'Servers')\n    end\n\n    click_button(I18n.t('global.apply'))\n    visit admin_plans_path\n\n    expect(plan.reload.servers).to eq [server1, server2]\n  end\nend\n"
  },
  {
    "path": "spec/features/admin/referrers/referrals_list_toggle_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe 'referrers page', js: true do\n  let(:referrer1) { create(:user) }\n  let(:referrer2) { create(:user) }\n  let(:referral1_email) { referrer1.referrals.first.email }\n  let(:referral2_email) { referrer2.referrals.first.email }\n\n  before do\n    2.times { create(:user, referrer: referrer1) }\n    3.times { create(:user, referrer: referrer2) }\n    I18n.locale = :en\n  end\n\n  it 'toggles referrals on click on table line', disable_transaction: true do\n    sign_in_admin\n    visit admin_referrers_path\n\n    # First referrer\n    expect(page).not_to have_content referral1_email\n\n    click_link referrer1.email\n    find('.collapse.show')\n    expect(page).to have_content referral1_email\n\n    click_link referrer1.email\n    find(:xpath, \"//a[@href='#reffer-#{referrer1.id}']\")\n    expect(page).to have_no_text referral1_email\n\n    # Second referrer\n    expect(page).not_to have_content referral2_email\n\n    click_link referrer2.email\n    find('.collapse.show')\n    expect(page).to have_content referral2_email\n\n    click_link referrer2.email\n    find(:xpath, \"//a[@href='#reffer-#{referrer2.id}']\")\n    expect(page).not_to have_content referral2_email\n  end\nend\n"
  },
  {
    "path": "spec/features/admin/servers/update_server_plans_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe 'server plans' do\n  let!(:plan1) { create(:plan, name: 'plan1') }\n  let!(:plan2) { create(:plan, name: 'plan2') }\n  let!(:server) { create(:server) }\n\n  before { I18n.locale = :ru }\n\n  it 'displays multiple plan select and updates server' do\n    sign_in_admin\n    visit edit_admin_server_path(server)\n\n    [plan1.name, plan2.name].each do |plan_name|\n      select(plan_name, from: 'Plans')\n    end\n\n    click_button(I18n.t('global.apply'))\n    visit admin_servers_path\n\n    expect(page).to have_content \"#{plan1.name}\\n#{plan2.name}\"\n  end\nend\n"
  },
  {
    "path": "spec/features/admin/users/manual_payment_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe 'manual user balance increase' do\n  let!(:pay_system) { create(:pay_system) }\n  let!(:user) { create(:user) }\n  let(:amount) { 100 }\n  let(:comment) { 'some comment' }\n\n  it 'displays new payment form and increases balance' do\n    sign_in_admin\n    visit admin_user_path(user)\n\n    expect(page).to have_content I18n.t('admin.users.new_payment')\n    expect(page).to have_selector('form#new_payment')\n\n    within('#new_payment') do\n      fill_in 'payment_amount', with: amount\n      fill_in 'payment_comment', with: comment\n      click_button I18n.t('global.apply')\n    end\n\n    expect(page.find('p.user_balance')).to have_content (amount - user.plan.price)\n    expect(page).to have_content I18n.t('admin.users.notices.payment_created')\n  end\nend\n"
  },
  {
    "path": "spec/features/admin/users/user_profile_page_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe 'user profile' do\n  let!(:user) { create(:user) }\n  let!(:disconnect) { create(:disconnect, user: user) }\n\n  context 'user disconnected' do\n    it 'displays user connection status' do\n      sign_in_admin\n      visit admin_user_path(user)\n\n      expect(page).to have_content I18n.t('admin.users.current_connection')\n\n      expect(\n        find('.user_current_connection')\n      ).to have_content I18n.t('admin.users.not_connected')\n    end\n  end\nend\n"
  },
  {
    "path": "spec/features/admin/users/withdrawal_prolongation_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe 'withdrawal prolongation' do\n  let!(:user) { create(:user_with_balance) }\n\n  context 'user has withdrawal' do\n    let!(:withdrawal) { create(:withdrawal, user: user) }\n    let(:days_number) { 10 }\n\n    it 'displays form and changes next withdrawal date' do\n      sign_in_admin\n      visit admin_user_path(user)\n\n      expect(page).to have_selector('form#new_withdrawal_prolongation')\n      expect(page).to have_content(human_date(DateTime.current))\n\n      within('#new_withdrawal_prolongation') do\n        fill_in 'withdrawal_prolongation_days_number', with: days_number\n        click_button I18n.t('global.apply')\n      end\n\n      expect(page).to have_content(\n        human_date(\n          DateTime.current + (User::BILLING_INTERVAL + days_number).days\n        )\n      )\n    end\n  end\n\n  context 'users withdrawal has expired' do\n    let(:days_number) { 10 }\n    let!(:withdrawal) { create(:withdrawal, user: user, created_at: DateTime.new(2014, 0o3, 0o1)) }\n    let!(:prolongation) { create(:withdrawal_prolongation, withdrawal: withdrawal, days_number: days_number) }\n\n    it 'displays as next withdrawal date billing interval + prolongation' do\n      sign_in_admin\n      visit admin_user_path(user)\n\n      expect(page).not_to have_selector('form#new_withdrawal_prolongation')\n      expect(page).to have_content I18n.t('admin.users.prolongation_not_possible')\n\n      expect(page).to have_content(\n        human_date(\n          withdrawal.created_at + (User::BILLING_INTERVAL + days_number).days\n        )\n      )\n    end\n  end\n\n  context 'user does not have withdrawals' do\n    it 'does not show prolongation form' do\n      sign_in_admin\n      visit admin_user_path(user)\n\n      expect(page).to have_content I18n.t('admin.users.prolongation_not_possible')\n    end\n  end\nend\n"
  },
  {
    "path": "spec/features/billing/discount_promotion_applying_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe '30% discount applying' do\n  let(:promo_code) { 'super-code' }\n  let(:pay_system) { create(:pay_system) }\n  let(:user) { User.last }\n  let!(:plan) { create(:plan, price: 100) }\n  let!(:promo) do\n    create(:promo, promo_code: promo_code,\n                   date_from: 1.week.ago, date_to: 1.week.from_now,\n                   attrs: { discount_percent: 30 },\n                   state: 'active')\n  end\n\n  before do\n    sign_in\n    visit('/users/edit')\n  end\n\n  it 'enters promo-code and has 30% discount' do\n    user.update(plan_id: plan.id)\n\n    within('#new_promotion') do\n      fill_in 'promotion_promo_code', with: promo_code\n      click_button I18n.t('global.apply')\n    end\n    expect(page).to have_content I18n.t('billing.promotions.notices.promotion_activated')\n\n    payment = user.payments.create!(amount: 300, pay_system: pay_system)\n    payment.accept!\n\n    visit('/billing')\n    expect(page).to have_content '-70 USD'\n    expect(page).to have_content '230 USD'\n  end\nend\n"
  },
  {
    "path": "spec/features/billing/options_page_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe 'enabling options' do\n  let!(:option) { create(:active_option) }\n  let(:option_price) { 1 }\n  let(:user) { User.last }\n  let(:user_balance) { 100 }\n  let(:pay_system) { create(:pay_system) }\n\n  before do\n    sign_in\n    user.plan.options << option\n    user.plan.update(option_prices: { option.code => option_price })\n    I18n.locale = :ru\n  end\n\n  context 'user has withdrawal' do\n    before do\n      payment = user.payments.create(amount: user_balance, pay_system_id: pay_system.id)\n      payment.accept!\n    end\n\n    it 'enables and disables option' do\n      visit('/billing/options')\n      expect(page).to have_content option.name\n\n      click_button I18n.t('billing.options.activate')\n      expect(page).to have_button I18n.t('billing.options.deactivate')\n\n      visit('/billing')\n      expect(page).to have_content \"#{(user_balance - user.plan.price - option_price).to_i} USD\"\n\n      visit('/billing/options')\n      click_button I18n.t('billing.options.deactivate')\n      expect(page).to have_button I18n.t('billing.options.activate')\n    end\n  end\n\n  context 'user does not have withdrawals' do\n    it 'displays message on options page' do\n      visit('/billing/options')\n      expect(page).to have_content I18n.t('billing.options.notices.activate_subscription_first')\n    end\n  end\nend\n"
  },
  {
    "path": "spec/features/billing/payments_page_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe 'Payments page' do\n  it_behaves_like 'creates payment for pay system', 'wmz'\n  it_behaves_like 'creates payment for pay system', 'wmr'\n  it_behaves_like 'creates payment for pay system', 'yandex'\n\n  describe 'pay systems list' do\n    let!(:disabled_pay_system) { create(:pay_system) }\n    let!(:enabled_pay_system) { create(:enabled_pay_system) }\n\n    before do\n      sign_in\n      visit('/billing/payments')\n    end\n\n    it 'has pay systems list' do\n      expect(page).to have_link enabled_pay_system.name\n    end\n\n    it 'does not display link to disabled pay system' do\n      expect(page).not_to have_link disabled_pay_system.name\n    end\n  end\n\n  describe 'payment amount page' do\n    let(:code) { pay_system.code }\n    let(:new_payment_page_path) { \"/billing/payments/new?code=#{code}\" }\n\n    before { sign_in }\n\n    context 'usd pay system' do\n      let(:pay_system) { create(:enabled_pay_system) }\n\n      it 'contains plan price in dollars' do\n        visit(new_payment_page_path)\n        expect(page).to have_selector(\"input[value='#{@user.plan.price.to_i}']\")\n      end\n    end\n\n    context 'rub paysystem' do\n      let(:pay_system) { create(:rub_pay_system) }\n      let(:amount)     { 650 }\n\n      it 'contains price in rubles' do\n        allow_any_instance_of(Currencies::CourseConverter).to receive(:convert_amount).and_return(amount)\n        visit(new_payment_page_path)\n        expect(page).to have_selector(\"input[value='#{amount}']\")\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "spec/features/billing/referrers_page_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe 'Partner programm' do\n  let(:password) { '12345678' }\n  let!(:referrer) { create(:user, password: password) }\n\n  describe 'referrers statistics' do\n    before do\n      sign_in referrer, password\n    end\n\n    context 'has no referrers and rewards' do\n      it 'displays message' do\n        visit('/billing/referrers')\n        expect(page).to have_content I18n.t('billing.referrals.no_referrals')\n        expect(page).to have_content I18n.t('billing.referrals.no_operations')\n        expect(page).to have_content '0.0 $'\n      end\n    end\n\n    context 'referrer exists' do\n      let(:referral) { create(:user_with_balance) }\n\n      before do\n        referrer.referrals << referral\n        operation = Withdrawal.create!(amount: 10, plan: Plan.first, user: referral)\n        Referrer::Reward.create!(amount: 1, operation_id: operation.id, referrer_id: referrer.id)\n      end\n\n      it 'has statistics data' do\n        visit('/billing/referrers')\n        expect(page).to have_content referral.email\n        expect(page).to have_content '1.0 $'\n      end\n    end\n  end\n\n  describe 'referral registration process' do\n    let(:email) { 'user@email.com' }\n    let(:reflink) { referrer.reflink }\n\n    before do\n      create(:plan)\n    end\n\n    it 'successful scenary' do\n      visit(\"/referrer?code=#{reflink}\")\n\n      visit('/users/sign_up')\n      within('#new_user') do\n        fill_in 'user_email', with: email\n        fill_in 'user_password', with: password\n        fill_in 'user_password_confirmation', with: password\n        check 'user_accept_agreement'\n      end\n      click_button I18n.t('users.registrations.new.sign_up')\n\n      sign_in referrer, password\n      visit('/billing/referrers')\n      expect(page).to have_content email\n    end\n  end\nend\n"
  },
  {
    "path": "spec/features/billing/servers_page_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe 'Servers page' do\n  let!(:plan) { create(:plan) }\n  let!(:server) { create(:active_server) }\n  let(:password) { 'password' }\n  let!(:user) { create(:user, password: password, plan: plan) }\n  let!(:not_available_server) { create(:active_server) }\n\n  before do\n    plan.servers << server\n    sign_in(user, 'password')\n  end\n\n  it 'has servers list' do\n    visit('/billing/servers')\n    expect(page).to have_content server.hostname\n    expect(page).to have_content server.protocol.upcase\n    expect(page).to have_content server.port\n\n    expect(page).not_to have_content not_available_server.hostname\n  end\nend\n"
  },
  {
    "path": "spec/features/billing/settings_page_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe 'Settings page' do\n  let!(:plan) { create(:plan) }\n  let!(:server) { create(:active_server) }\n  let(:password) { 'password' }\n  let!(:user) { create(:user, password: password, plan: plan) }\n\n  before do\n    plan.servers << server\n    sign_in(user, 'password')\n    visit('/users/edit')\n  end\n\n  it 'has servers list, edit profile form, remove profile link' do\n    expect(page).to have_content I18n.t('users.registrations.edit.edit_profile')\n  end\n\n  it 'removing registration' do\n    expect(page).to have_content I18n.t('users.registrations.edit.cancel_registration')\n    click_button I18n.t('users.registrations.edit.cancel_registration')\n    expect(page).to have_content I18n.t('devise.registrations.destroyed')\n  end\nend\n"
  },
  {
    "path": "spec/features/billing/test_period_at_user_dashboard_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe 'test period applying' do\n  let(:user) { User.last }\n\n  before do\n    sign_in\n    visit('/billing')\n  end\n\n  it 'test period in user dashboard' do\n    expect(page).not_to have_content I18n.t('billing.home.account_info.test_period')\n\n    user.test_period.enable!\n\n    visit('/billing')\n    expect(page).to have_content I18n.t('billing.home.account_info.test_period')\n    expect(page).to have_content I18n.t('billing.home.account_info.test_period_range', from: human_date(user.test_period_started_at.to_date, time: false), to: human_date(user.test_period.test_period_until, time: false))\n  end\nend\n"
  },
  {
    "path": "spec/features/billing/user_password_reset_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe 'Password reset' do\n  let!(:user) { create(:user) }\n  subject { page }\n\n  it 'successful scenary' do\n    ## Sign in page\n    visit_sign_in_page\n    expect(subject).to have_content I18n.t('users.sessions.new.forgotten_password')\n    click_link I18n.t('users.sessions.new.forgotten_password')\n\n    ## Reset page\n    expect(subject).to have_selector 'form.reset-password'\n    within('form') do\n      fill_in 'user_email', with: user.email\n    end\n    click_button I18n.t('users.passwords.new.send')\n\n    ## Final page\n    expect(subject).to have_content I18n.t('devise.passwords.send_instructions')\n    expect(last_email.body).to include user.email\n\n    ## Follow email link\n    token_name = 'reset_password_token'\n    token_value = extract_token_from_email(token_name, last_email)\n    visit(\"/users/password/edit?#{token_name}=#{token_value}\")\n\n    ## Edit password page\n    expect(subject).to have_content I18n.t('users.passwords.edit.enter_new_password')\n\n    within('form') do\n      fill_in 'user_password', with: '1234567'\n      fill_in 'user_password_confirmation', with: '1234567'\n    end\n    click_button I18n.t('users.passwords.edit.save')\n\n    expect(subject).to have_content I18n.t('devise.passwords.updated')\n  end\nend\n"
  },
  {
    "path": "spec/features/billing/user_sign_in_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe 'User sign in' do\n  before do\n    sign_in\n  end\n\n  it 'displays user dashboard' do\n    expect(page).to have_content I18n.t('billing.home.account_info.account_info')\n  end\nend\n"
  },
  {
    "path": "spec/features/billing/user_sign_up_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe 'User sign up:' do\n  before do\n    create(:plan)\n  end\n\n  describe 'sign_in page' do\n    it 'has sign_up link' do\n      visit('/users/sign_in')\n      expect(page).to have_content I18n.t('main.auth.sign_up')\n    end\n  end\n\n  it 'successful scenary' do\n    email_address = 'user@email.com'\n    ## Sign up page form filling\n    visit('/users/sign_up')\n    within('#new_user') do\n      fill_in 'user_email', with: email_address\n      fill_in 'user_password', with: 'password'\n      fill_in 'user_password_confirmation', with: 'password'\n      check 'user_accept_agreement'\n    end\n    click_button I18n.t('users.registrations.new.sign_up')\n    expect(page).to have_content I18n.t('devise.registrations.signed_up_but_unconfirmed')\n\n    ## Registration email confirmation\n    # TODO: hack, for some reason in test env thee confirmation email was not sent\n    User.last.send_confirmation_instructions\n    open_email(email_address)\n    token_name = 'confirmation_token'\n    token_value = extract_token_from_email(token_name, current_email)\n    visit(\"/users/confirmation?#{token_name}=#{token_value}\")\n    expect(page).to have_content I18n.t('devise.confirmations.confirmed')\n  end\nend\n"
  },
  {
    "path": "spec/helpers/admin_helper_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'rails_helper'\n\ndescribe AdminHelper do\n  describe '#menu_item_with_sub' do\n    context 'without block' do\n      let(:result) { '<li class=\"nav-item\"><a class=\"nav-link dropdown-toggle\" data-toggle=\"collapse\" aria-expanded=\"false\" href=\"path\"><i class=\"fa fa-lg fa-fw fa-user\"></i><span class=\"pl-3\">title</span></a></li>' }\n\n      it 'returns one link' do\n        expect(menu_item_with_sub('title', 'path', 'user')).to eq result\n      end\n    end\n\n    context 'with block' do\n      let(:result) { '<li class=\"nav-item\"><a class=\"nav-link dropdown-toggle\" data-toggle=\"collapse\" aria-expanded=\"false\" href=\"path\"><i class=\"fa fa-lg fa-fw fa-user\"></i><span class=\"pl-3\">title</span></a><ul id=\"ath\" class=\"collapse list-unstyled ml-3\">test</ul></li>' }\n\n      it 'returns one link' do\n        expect(menu_item_with_sub('title', 'path', 'user') { 'test' }).to eq result\n      end\n    end\n  end\n\n  describe '#menu_item' do\n    let(:result) { '<li class=\"nav-item\"><a class=\"nav-link\" href=\"path\"><i class=\"fa fa-lg fa-fw fa-user\"></i><span class=\"pl-3\">title</span></a></li>' }\n\n    it 'returns one link' do\n      expect(menu_item('title', 'path', 'user')).to eq result\n    end\n  end\n\n  describe '#sub_menu_item' do\n    let(:result) { '<li class=\"nav-item pl-4\"><a class=\"nav-link\" href=\"path\">title</a></li>' }\n\n    it 'returns one link' do\n      expect(sub_menu_item('title', 'path')).to eq result\n    end\n  end\n\n  describe '#change_locale_link' do\n    let(:cell) { double('Web::Admin::ChangeLocaleLinkCell') }\n    before { allow(Web::Admin::ChangeLocaleLinkCell).to receive(:new).and_return(cell) }\n\n    it 'runs Web::Admin::ChangeLocaleLinkCell' do\n      expect(cell).to receive(:render)\n      change_locale_link\n    end\n  end\n\n  describe '#page_title' do\n    context 'without block' do\n      let(:result) do\n        '<h3><i class=\"fa-fw fa fa-user\"></i><a class=\"mx-2 text-dark\" href=\"/admin/users\">title</a></h3>'\n      end\n\n      it 'returns one link' do\n        expect(page_title('title', 'user', 'users')).to eq result\n      end\n    end\n\n    context 'with block' do\n      let(:result) do\n        '<h3><i class=\"fa-fw fa fa-user\"></i><a class=\"mx-2 text-dark\" href=\"/admin/users\">title</a>test</h3>'\n      end\n\n      it 'returns one link' do\n        expect(page_title('title', 'user', 'users') { 'test' }).to eq result\n      end\n    end\n  end\n\n  describe '#sub_page_title' do\n    let(:result) { '<span>&gt; title</span>' }\n\n    it 'returns one link' do\n      expect(sub_page_title('title')).to eq result\n    end\n  end\nend\n"
  },
  {
    "path": "spec/helpers/application_helper_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe ApplicationHelper do\n  describe 'human_date' do\n    let(:date) { DateTime.new(2001, 2, 3, 4, 5, 6) }\n\n    context 'date is nil' do\n      subject { helper.human_date(nil) }\n\n      it 'returns nil' do\n        expect(subject).to eq nil\n      end\n    end\n\n    context 'default behaviour' do\n      subject { helper.human_date(date) }\n\n      it 'returns date with time' do\n        expect(subject).to include '04:05'\n      end\n    end\n\n    context 'time:false argument passed' do\n      subject { helper.human_date(date, time: false) }\n\n      it 'returns date without time' do\n        expect(subject).not_to include '04:05'\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "spec/i18n_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'i18n/tasks'\n\nRSpec.describe 'I18n' do\n  let(:i18n) { I18n::Tasks::BaseTask.new }\n  let(:missing_keys) { i18n.missing_keys }\n  let(:unused_keys) { i18n.unused_keys }\n\n  it 'does not have missing keys' do\n    expect(missing_keys).to be_empty,\n                            \"Missing #{missing_keys.leaves.count} i18n keys, run `i18n-tasks missing' to show them\"\n  end\n\n  it 'does not have unused keys' do\n    expect(unused_keys).to be_empty,\n                           \"#{unused_keys.leaves.count} unused i18n keys, run `i18n-tasks unused' to show them\"\n  end\n\n  it 'files are normalized' do\n    non_normalized = i18n.non_normalized_paths\n    error_message = \"The following files need to be normalized:\\n\" \\\n                    \"#{non_normalized.map { |path| \"  #{path}\" }.join(\"\\n\")}\\n\" \\\n                    'Please run `i18n-tasks normalize` to fix'\n    expect(non_normalized).to be_empty, error_message\n  end\nend\n"
  },
  {
    "path": "spec/lib/bytes_converter_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe BytesConverter do\n  describe '#bytes_to_gigabytes' do\n    let(:bytes) { 2_147_483_658 }\n    let(:gbytes) { 2 }\n    subject { described_class.bytes_to_gigabytes(bytes) }\n\n    it 'converts to gbytes' do\n      expect(subject).to eq gbytes\n    end\n  end\n\n  describe '#prettify_float' do\n    subject { described_class.prettify_float(float) }\n\n    context 'zero float' do\n      let(:float) { 0.123456 }\n\n      it 'prettifys' do\n        expect(subject).to eq 0.1235\n      end\n    end\n\n    context 'single float' do\n      let(:float) { 1.123456 }\n\n      it 'prettifys' do\n        expect(subject).to eq 1.123\n      end\n    end\n\n    context 'double float' do\n      let(:float) { 12.123456 }\n\n      it 'prettifys' do\n        expect(subject).to eq 12.12\n      end\n    end\n\n    context 'triple float' do\n      let(:float) { 123.123456 }\n\n      it 'prettifys' do\n        expect(subject).to eq 123.1\n      end\n    end\n\n    context 'five float' do\n      let(:float) { 12_345.123456 }\n\n      it 'prettifys' do\n        expect(subject).to eq 12_345.1\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "spec/lib/currencies/course_converter_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Currencies::CourseConverter do\n  subject { described_class.new(currency_from: 'eur', currency_to: 'usd', amount: 100) }\n\n  describe 'amount conversion' do\n    let(:course) { 2 }\n    before { allow_any_instance_of(Currencies::Course).to receive(:get).and_return(course) }\n\n    it 'devides currency by amount' do\n      expect(subject.convert_amount).to eq 200\n    end\n\n    context 'course is string' do\n      let(:course) { '2' }\n\n      it 'converts string to int' do\n        expect(subject.convert_amount).to eq 200\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "spec/lib/currencies/course_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Currencies::Course do\n  let(:online_course) { 1.5 }\n  let(:redis) { Redis.new }\n\n  before do\n    allow(described_class).to receive(:fetch_course_from_web).and_return(online_course)\n  end\n\n  describe 'updating all courses' do\n    subject { described_class }\n\n    before do\n      redis.flushall\n      subject.update_courses\n    end\n\n    it 'sets course for eur' do\n      expect(redis.get('smartvpn:eur_usd')).not_to be_nil\n    end\n\n    it 'sets course for usd' do\n      expect(redis.get('smartvpn:rub_usd')).not_to be_nil\n    end\n\n    it 'sets updated_at value' do\n      expect(redis.get('smartvpn:courses:updated_at')).not_to be_nil\n    end\n  end\n\n  describe 'fetching course' do\n    subject { described_class.new('eur', 'usd') }\n\n    before { redis.flushall }\n\n    context 'currency from equal to currency to' do\n      subject { described_class.new('usd', 'usd') }\n\n      it 'returns 1' do\n        expect(subject.get).to eq 1\n      end\n    end\n\n    context 'redis es empty' do\n      it 'fetching from web' do\n        expect(subject).to receive(:parse_from_web).once\n        subject.get\n      end\n\n      it 'returns real course' do\n        expect(subject.get).not_to be_nil\n      end\n    end\n\n    context 'record exists in redis' do\n      let(:cached_course) { '2' }\n      before do\n        redis.set('smartvpn:eur_usd', cached_course)\n        redis.set('smartvpn:courses:updated_at', Time.current)\n      end\n\n      it 'returns update date' do\n        expect(described_class.updated_at).not_to be_nil\n      end\n\n      it 'loading record from redis' do\n        expect(subject).to receive(:fetch_from_redis)\n        subject.get\n      end\n\n      it 'returns course from redis' do\n        expect(subject.get).to eq cached_course\n      end\n\n      it 'does not fetch web' do\n        expect(subject).not_to receive(:parse_from_web)\n        subject.get\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "spec/lib/random_string_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe RandomString do\n  describe '::generate' do\n    subject { RandomString }\n    let(:first_string) { RandomString.generate }\n    let(:second_string) { RandomString.generate }\n\n    it 'returns new string on each call' do\n      expect(first_string).not_to eq second_string\n    end\n\n    it 'has default length' do\n      expect(first_string.length).to eq RandomString::DEFAULT_LENGTH\n    end\n\n    it 'builds string with setted length' do\n      different_lenght_string = subject.generate(12)\n      expect(different_lenght_string.length).to eq 12\n    end\n  end\nend\n"
  },
  {
    "path": "spec/lib/signer_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Signer do\n  subject { described_class }\n\n  describe '::sign_hash' do\n    let(:hash) { Hash[a: 2, b: 1, c: 3] }\n    let(:key) { '456' }\n    subject { described_class.sign_hash(hash, key) }\n\n    it 'joins hash values without character' do\n      expect(subject).not_to eq Digest::MD5.hexdigest(\"#{hash.values.sort}#{key}\")\n    end\n\n    it 'sorts hash values' do\n      expect(subject).not_to eq Digest::MD5.hexdigest(\"#{hash.values.join}#{key}\")\n    end\n\n    it 'appends secret key to values' do\n      expect(subject).not_to eq Digest::MD5.hexdigest(hash.values.sort.join.to_s)\n    end\n\n    it 'counts md5 of ruby hash' do\n      expect(subject).to eq Digest::MD5.hexdigest(\"#{hash.values.sort.join}#{key}\")\n    end\n  end\n\n  describe '::hashify_string' do\n    it 'returns md5 hash of string' do\n      result = subject.hashify_string('mystring')\n      expect(result).to eq Digest::MD5.hexdigest('mystring')\n    end\n  end\nend\n"
  },
  {
    "path": "spec/mailers/user_connection_config_mailer_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'rails_helper'\n\ndescribe UserConnectionConfigMailer do\n  describe '#notify' do\n    subject { described_class.notify(user: user) }\n    let!(:user) { create(:user) }\n    let!(:server) { create(:server) }\n    let!(:plan) { create(:plan, users: [user], servers: [server]) }\n    let(:server_config) { ServerConfigBuilder.new(server: server).to_text }\n\n    its(:subject) { is_expected.to eq I18n.t('mailers.user_connection_config_mailer.subject') }\n    its(:to) { is_expected.to eq [user.email] }\n    its(:from) { is_expected.to eq [ENV['EMAIL_FROM']] }\n\n    it 'email have 1 attachment' do\n      expect(subject.attachments.count).to eq 1\n    end\n\n    it 'attachment name' do\n      expect(subject.attachments.first.filename).to eq \"#{server.hostname}.ovpn\"\n    end\n\n    it 'renders vpn username' do\n      expect(subject.body.encoded).to match(user.vpn_login)\n    end\n\n    it 'renders vpn password' do\n      expect(subject.body.encoded).to match(user.vpn_password)\n    end\n  end\nend\n"
  },
  {
    "path": "spec/models/authenticator_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Authenticator do\n  let(:user) { create(:user_with_balance) }\n  let(:server) { create(:server) }\n  let(:login) { user.vpn_login }\n  let(:password) { user.vpn_password }\n  let(:hostname) { server.hostname }\n  subject { Authenticator.new(login, password, hostname) }\n\n  before do\n    user.plan.servers << server\n  end\n\n  describe '#valid_password?' do\n    context 'vpn credentials' do\n      context 'with valid credentials' do\n        before { create(:withdrawal, user: user) }\n\n        it 'returns true' do\n          expect(subject.valid_credentials?).to be true\n        end\n      end\n\n      context 'with invalid credentials' do\n        let(:password) { \"#{user.vpn_password}RandomString\" }\n\n        it 'returns false' do\n          expect(subject.valid_credentials?).to be false\n        end\n      end\n    end\n\n    context 'billing credentials' do\n      let(:login) { user.email }\n      before { create(:withdrawal, user: user) }\n\n      context 'valid' do\n        let(:password) { 'password' }\n\n        it 'returns true' do\n          expect(subject.valid_credentials?).to be true\n        end\n      end\n\n      context 'invalid' do\n        let(:password) { 'invalid-password' }\n\n        it 'returns true' do\n          expect(subject.valid_credentials?).to be false\n        end\n      end\n    end\n\n    context 'when already connected' do\n      before do\n        user.connects.create!(server_id: server.id)\n      end\n\n      it 'returns false' do\n        expect(subject.valid_credentials?).to be false\n      end\n    end\n\n    context 'user is disabled' do\n      before do\n        user.disable!\n      end\n\n      it 'returns false' do\n        expect(subject.valid_credentials?).to be false\n      end\n    end\n\n    context 'didnt pay anything' do\n      it 'returns false' do\n        expect(subject.valid_credentials?).to be false\n      end\n    end\n\n    context 'server does not belong to plan' do\n      let!(:server) { create(:server) }\n\n      it 'returns false' do\n        expect(subject.valid_credentials?).to be false\n      end\n    end\n\n    describe 'test period' do\n      context 'not enabled' do\n        it 'returns false' do\n          expect(subject.valid_credentials?).to be false\n        end\n      end\n\n      context 'enabled and active' do\n        before { user.test_period.enable! }\n\n        it 'returns true' do\n          expect(subject.valid_credentials?).to be true\n        end\n      end\n\n      context 'enabled and expired' do\n        before do\n          user.update(test_period_started_at: 1.month.ago)\n        end\n\n        it 'returns false' do\n          expect(subject.valid_credentials?).to be false\n        end\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "spec/models/connect_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Connect do\n  subject { build(:connect) }\n\n  it { is_expected.to be_valid }\n  it { is_expected.to belong_to(:user) }\n  it { is_expected.to belong_to(:server) }\n\n  describe 'instance' do\n    subject { create(:connect) }\n\n    it 'returns server hostname' do\n      expect(subject.hostname).to eq subject.server.hostname\n    end\n  end\nend\n\n# == Schema Information\n#\n# Table name: connections\n#\n#  id          :integer          not null, primary key\n#  user_id     :integer\n#  server_id   :integer\n#  traffic_in  :float\n#  traffic_out :float\n#  type        :string(255)\n#  created_at  :datetime\n#  updated_at  :datetime\n#\n"
  },
  {
    "path": "spec/models/connection_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Connection do\n  describe '::active' do\n    let(:user) { create(:user) }\n    let(:server) { create(:server) }\n    let(:second_user) { create(:user) }\n    subject { described_class.active }\n\n    context 'one last connect exists' do\n      before do\n        2.times do\n          create(:connect, user: user)\n          create(:disconnect, user: user)\n        end\n        create(:connect, user: user)\n      end\n\n      it 'returns only active connections' do\n        expect(subject.count).to eq 1\n      end\n    end\n\n    context 'one connect and another disconnect exist' do\n      before do\n        create(:connect, user: user)\n        create(:disconnect, user: second_user)\n      end\n\n      it 'returns only active connections' do\n        expect(subject.count).to eq 1\n      end\n    end\n\n    context 'two connects exist' do\n      before do\n        create(:connect, user: user, server: server)\n        create(:disconnect, user: second_user, server: server)\n        create(:connect, server: server)\n      end\n\n      it 'returns only active connections' do\n        expect(subject.count).to eq 2\n      end\n    end\n\n    context 'no connects exist' do\n      it 'returns only active connections' do\n        expect(subject.count).to eq 0\n      end\n    end\n  end\nend\n\n# == Schema Information\n#\n# Table name: connections\n#\n#  id          :integer          not null, primary key\n#  user_id     :integer\n#  server_id   :integer\n#  traffic_in  :float\n#  traffic_out :float\n#  type        :string(255)\n#  created_at  :datetime\n#  updated_at  :datetime\n#\n"
  },
  {
    "path": "spec/models/connector_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Connector do\n  let(:user) { create(:user) }\n  let(:server) { create(:server) }\n  subject { described_class.new(params) }\n\n  describe 'connection test methods' do\n    let(:user) { create(:user) }\n    subject { Connector }\n\n    describe '#first_time_connected?' do\n      context 'only one connect exists' do\n        before { create(:connect, user: user) }\n\n        it 'returns true' do\n          expect(subject.first_time_connected?(user)).to be_truthy\n        end\n      end\n\n      context 'disconnects exist too' do\n        before do\n          create(:connect, user: user)\n          create(:disconnect, user: user)\n        end\n\n        it 'returns false' do\n          expect(subject.first_time_connected?(user)).to be_falsy\n        end\n      end\n    end\n\n    describe '#connected?' do\n      context 'only one connect exists' do\n        before { create(:connect, user: user) }\n\n        it 'returns true' do\n          expect(subject.connected?(user)).to be_truthy\n        end\n      end\n\n      context 'disconnects exist too' do\n        before do\n          create(:disconnect, user: user)\n          create(:disconnect, user: user)\n          create(:connect, user: user, server: server)\n        end\n\n        it 'returns true' do\n          expect(subject.connected?(user)).to be true\n        end\n      end\n\n      context 'disconnect exists after connect' do\n        before do\n          create(:disconnect, user: user)\n          create(:connect, user: user, server: server)\n          create(:disconnect, user: user)\n        end\n\n        it 'returns false' do\n          expect(subject.connected?(user)).to be false\n        end\n      end\n    end\n  end\n\n  context 'login is email' do\n    let(:params) { Hash[login: user.email, hostname: server.hostname, action: 'connect'] }\n\n    it 'creates connect record for user' do\n      expect do\n        subject.invoke\n      end.to change(user.connects, :count).by(1)\n    end\n  end\n\n  context 'action is connect' do\n    let(:params) { Hash[login: user.vpn_login, hostname: server.hostname, action: 'connect'] }\n\n    it 'creates connect record for user' do\n      expect do\n        subject.invoke\n      end.to change(user.connects, :count).by(1)\n    end\n\n    describe 'options hooks' do\n      let(:i2p_option) { create(:i2p_option) }\n      let(:proxy_option) { create(:proxy_option) }\n      let(:country) { 'China' }\n      let!(:node) { create(:proxy_node, country: country) }\n      before { user.user_options.create!(option: i2p_option) }\n\n      context 'user options are enabled' do\n        before do\n          user.user_options.create!(option: proxy_option, attrs: { country: country })\n        end\n\n        it 'assigns option parameters to connect' do\n          expect(subject.invoke.option_attributes.class).to eq Hash\n        end\n\n        it 'parameters exist for each option' do\n          expect(subject.invoke.option_attributes.size).to eq 2\n        end\n      end\n\n      context 'user option is disabled' do\n        before do\n          user.user_options.create!(option: proxy_option, state: 'disabled', attrs: { country: country })\n        end\n\n        it 'assigns option parameters to connect' do\n          expect(subject.invoke.option_attributes.class).to eq Hash\n        end\n\n        it 'parameters exist only for enabled user options' do\n          expect(subject.invoke.option_attributes.size).to eq 1\n        end\n      end\n    end\n\n    it 'record has server hostname' do\n      subject.invoke\n      expect(Connect.last.hostname).to eq server.hostname\n    end\n\n    it 'record belongs to user' do\n      subject.invoke\n      expect(Connect.last.user_id).to eq user.id\n    end\n  end\n\n  context 'action is disconnect' do\n    let(:params) do\n      Hash[\n      login: user.vpn_login,\n      hostname: server.hostname,\n      action: 'disconnect',\n      traffic_in: 100,\n      traffic_out: 1150\n    ]\n    end\n\n    it 'creates disconnect record' do\n      expect do\n        subject.invoke\n      end.to change(user.disconnects, :count).by(1)\n    end\n\n    describe 'disconnect record' do\n      before { subject.invoke }\n\n      it 'has server hostname' do\n        expect(Disconnect.last.hostname).to eq server.hostname\n      end\n\n      it 'belongs to user' do\n        expect(Disconnect.last.user_id).to eq user.id\n      end\n\n      it 'has traffic in' do\n        expect(Disconnect.last.traffic_in).to eq 100\n      end\n\n      it 'has traffic out' do\n        expect(Disconnect.last.traffic_out).to eq 1150\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "spec/models/disconnect_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Disconnect do\n  subject { build(:disconnect) }\n\n  it { is_expected.to be_valid }\n  it { is_expected.to belong_to(:user) }\n  it { is_expected.to belong_to(:server) }\n\n  it { is_expected.to validate_presence_of(:traffic_in) }\n  it { is_expected.to validate_presence_of(:traffic_out) }\n\n  it_behaves_like 'loads created by last days', :disconnect\n\n  describe 'instance' do\n    subject { create(:disconnect) }\n\n    it 'returns server hostname' do\n      expect(subject.hostname).to eq subject.server.hostname\n    end\n  end\nend\n\n# == Schema Information\n#\n# Table name: connections\n#\n#  id          :integer          not null, primary key\n#  user_id     :integer\n#  server_id   :integer\n#  traffic_in  :float\n#  traffic_out :float\n#  type        :string(255)\n#  created_at  :datetime\n#  updated_at  :datetime\n#\n"
  },
  {
    "path": "spec/models/option_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Option do\n  it { is_expected.to validate_presence_of :name }\n  it { is_expected.to validate_presence_of :code }\n  it { is_expected.to have_and_belong_to_many(:plans) }\n  it { is_expected.to have_many(:users) }\n  it { is_expected.to have_many(:user_options) }\n\n  describe '.state' do\n    subject { described_class.new }\n\n    context 'when new' do\n      it 'has disabled state' do\n        expect(subject.disabled?).to be true\n      end\n    end\n  end\n\n  describe '.default_attributes' do\n    subject { build(:option, code: code) }\n\n    context 'i2p' do\n      let(:code) { 'i2p' }\n\n      it 'returns empty hash' do\n        expect(subject.default_attributes).to eq Hash[]\n      end\n    end\n\n    context 'proxy' do\n      let(:code) { 'proxy' }\n      let(:country) { 'China' }\n      let!(:node) { create(:proxy_node, country: country) }\n\n      it 'returns empty hash' do\n        expect(subject.default_attributes).to eq Hash[country: country]\n      end\n    end\n  end\n\n  describe '.hook' do\n    let(:user) { nil }\n    let(:hook) { subject.hook(user) }\n    subject { build(:option, code: code) }\n\n    context 'with hooks' do\n      let(:code) { 'proxy' }\n\n      it 'builds hook instance' do\n        allow(Options::Hooks::Proxy).to receive(:new).with(user, subject)\n        hook\n      end\n\n      it 'returns instance of hook object' do\n        expect(hook.class).to eq Options::Hooks::Proxy\n      end\n    end\n\n    context 'without hooks' do\n      let(:code) { 'i2p' }\n\n      it 'returns nil' do\n        expect(hook).to eq nil\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "spec/models/options/hooks/proxy_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Options::Hooks::Proxy do\n  let(:user) { create(:user) }\n  let(:option) { create(:option, code: 'proxy') }\n  let(:proxy) { create(:proxy_node) }\n  subject { described_class.new(user, option) }\n\n  describe '.connect' do\n    before do\n      allow_any_instance_of(::Proxy::Rater).to receive(:find_best).and_return(proxy)\n    end\n\n    it 'calls proxy rater' do\n      subject.connect\n    end\n\n    it 'creates proxy connect record' do\n      expect do\n        subject.connect\n      end.to change(proxy.connects, :count).by(1)\n    end\n\n    it 'returns hash' do\n      expect(subject.connect.class).to eq Hash\n    end\n\n    it 'result contains proxy host' do\n      expect(subject.connect[:host]).to eq proxy.host\n    end\n\n    it 'result contains proxy host' do\n      expect(subject.connect[:port]).to eq proxy.port\n    end\n  end\nend\n"
  },
  {
    "path": "spec/models/pay_system_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe PaySystem do\n  subject { build(:pay_system) }\n\n  it { is_expected.to be_valid }\n  it { is_expected.to validate_presence_of(:name) }\n  it { is_expected.to validate_presence_of(:code) }\n  it { is_expected.to have_many(:payments) }\n\n  describe '.enabled scope' do\n    subject { described_class }\n\n    before do\n      create_list(:enabled_pay_system, 2)\n      create_list(:pay_system, 3)\n    end\n\n    it 'returns only enabled pay systems' do\n      expect(subject.enabled.size).to eq 2\n    end\n  end\n\n  describe 'states' do\n    subject { build(:pay_system) }\n\n    it 'initially in disabled state' do\n      expect(subject.disabled?).to be true\n    end\n\n    context 'enable! action' do\n      it 'changes state to enabled' do\n        expect do\n          subject.enable!\n        end.to change(subject, :state).to('enabled')\n      end\n    end\n\n    context 'disable! action' do\n      before { subject.enable! }\n\n      it 'changes state to disabled' do\n        expect do\n          subject.disable!\n        end.to change(subject, :state).to('disabled')\n      end\n    end\n  end\nend\n\n# == Schema Information\n#\n# Table name: pay_systems\n#\n#  id          :integer          not null, primary key\n#  name        :string(255)\n#  code        :string(255)\n#  created_at  :datetime\n#  updated_at  :datetime\n#  description :text\n#\n"
  },
  {
    "path": "spec/models/payment_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Payment do\n  subject { build(:payment) }\n\n  it { is_expected.to be_valid }\n  it { is_expected.to validate_presence_of(:user_id) }\n  it { is_expected.to validate_presence_of(:amount) }\n\n  it_behaves_like 'loads created by last days', :disconnect\n\n  context 'on creation' do\n    let(:pay_system) { create(:rub_pay_system) }\n    let(:payment) { create(:payment, pay_system: pay_system, amount: 100) }\n    let(:course) { 0.032 }\n\n    before do\n      allow_any_instance_of(Currencies::CourseConverter).to receive(:course).and_return(course)\n    end\n\n    it 'saves usd amount' do\n      expect(payment.usd_amount).not_to be_nil\n    end\n\n    it 'converts rub by course' do\n      expect(payment.usd_amount).to eq(payment.amount * course)\n    end\n  end\n\n  context 'when created' do\n    let(:user) { create(:user) }\n    let(:pay_system) { create(:pay_system) }\n\n    it 'is in peding state' do\n      payment = Payment.create!(user_id: user.id, pay_system_id: pay_system.id, amount: 10)\n      expect(payment.state).to eq 'pending'\n    end\n  end\n\n  context 'on accept event' do\n    before { allow_any_instance_of(Currencies::CourseConverter).to receive(:course).and_return(0.5) }\n\n    describe 'balance increase' do\n      let(:user) { create(:user_with_balance) }\n      let(:pay_system) { create(:pay_system) }\n      let!(:withdrawal) { create(:withdrawal, user: user) }\n      let!(:payment) { create(:payment, user: user, pay_system: pay_system) }\n\n      it 'changes user balance on amount' do\n        initial_balance = user.reload.balance\n        payment.accept!\n        expect(user.reload.balance).to eq(initial_balance + payment.amount)\n      end\n\n      context 'pay system in non-usd' do\n        let(:pay_system) { create(:rub_pay_system) }\n\n        it 'adds usd_amount' do\n          initial_balance = user.reload.balance\n          payment.accept!\n          expect(user.reload.balance).to eq(initial_balance + payment.usd_amount)\n        end\n\n        it 'does not add non-usd amount' do\n          initial_balance = user.reload.balance\n          payment.accept!\n          expect(user.reload.balance).not_to eq(initial_balance + payment.amount)\n        end\n      end\n    end\n\n    describe 'balance withdrawal' do\n      subject { create(:payment, user: user) }\n\n      context 'user is unpaid' do\n        let(:user) { create(:user_with_balance) }\n\n        it 'creates new withdrawal' do\n          expect { subject.accept! }.to change(Withdrawal, :count).by(1)\n        end\n      end\n\n      context 'user is paid' do\n        let(:user) { create(:user_with_balance) }\n        before { create :withdrawal, user: user }\n\n        it 'does not create withdrawal' do\n          expect { subject.accept! }.not_to change(Withdrawal, :count)\n        end\n      end\n\n      context 'user unpaid and has no balance,', focus: true do\n        let(:user) { create(:user) }\n        subject { create(:payment, amount: 5, user: user) }\n\n        it 'does not create withdrawal' do\n          expect { subject.accept! }.not_to change(Withdrawal, :count)\n        end\n\n        it 'sends notification' do\n          expect { subject.accept! }.to change(CanNotWithdrawNotificationWorker.jobs, :size).by(1)\n        end\n      end\n    end\n  end\nend\n\n# == Schema Information\n#\n# Table name: payments\n#\n#  id            :integer          not null, primary key\n#  user_id       :integer\n#  amount        :decimal(, )\n#  pay_system_id :integer\n#  state         :string(255)\n#  created_at    :datetime\n#  updated_at    :datetime\n#\n"
  },
  {
    "path": "spec/models/plan_has_server_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe PlanHasServer do\n  it { is_expected.to belong_to(:server) }\n  it { is_expected.to belong_to(:plan) }\nend\n\n# == Schema Information\n#\n# Table name: plan_has_servers\n#\n#  id         :integer          not null, primary key\n#  server_id  :integer\n#  plan_id    :integer\n#  created_at :datetime\n#  updated_at :datetime\n#\n"
  },
  {
    "path": "spec/models/plan_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Plan do\n  subject(:plan) { build(:plan) }\n\n  it { is_expected.to be_valid }\n  it { is_expected.to validate_presence_of(:name) }\n  it { is_expected.to validate_presence_of(:price) }\n  it { is_expected.to validate_presence_of(:code) }\n  it { is_expected.to validate_presence_of(:description) }\n\n  it { is_expected.to have_many(:users) }\n  it { is_expected.to have_many(:included_servers) }\n  it { is_expected.to have_many(:servers) }\n\n  it { is_expected.to have_and_belong_to_many(:options) }\n\n  describe 'regular plans scope' do\n    let!(:special_plan) { create(:plan, special: true) }\n    let!(:regular_plan1) { create(:plan) }\n    let!(:regular_plan2) { create(:plan) }\n    subject { Plan.regular }\n\n    it 'returns non-special plans' do\n      expect(subject).to eq [regular_plan1, regular_plan2]\n    end\n\n    it 'does not return special plans' do\n      expect(subject).not_to include special_plan\n    end\n  end\n\n  describe 'enabled' do\n    let(:enabled_plan1) { create(:plan) }\n    let(:enabled_plan2) { create(:plan) }\n    let(:disabled_plan) { create(:plan, enabled: false) }\n    subject { Plan.enabled }\n\n    it 'returns only enabled plans' do\n      expect(subject).to eq [enabled_plan1, enabled_plan2]\n    end\n\n    it 'does not return disabled plan' do\n      expect(subject).not_to include disabled_plan\n    end\n  end\n\n  describe '.to_s' do\n    it 'returns its name' do\n      expect(subject.to_s).to eq subject.name\n    end\n  end\n\n  describe '.option_price' do\n    let(:option) { create(:option) }\n    let(:option_price) { 100 }\n    before { plan.update(option_prices: { option.code => option_price }) }\n\n    it 'returns option price by its code' do\n      expect(plan.option_price(option.code)).to eq option_price\n    end\n  end\nend\n\n# == Schema Information\n#\n# Table name: plans\n#\n#  id          :integer          not null, primary key\n#  name        :string(255)\n#  price       :decimal(, )\n#  description :text\n#  code        :string(255)\n#  created_at  :datetime\n#  updated_at  :datetime\n#  special     :boolean          default(FALSE)\n#  enabled     :boolean          default(FALSE)\n#\n"
  },
  {
    "path": "spec/models/promo_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Promo do\n  let(:promo) { build(:promo, promoter_type: 'discount') }\n  subject { promo }\n\n  describe 'validations' do\n    it { is_expected.to validate_presence_of :name }\n    it { is_expected.to validate_presence_of :type }\n    it { is_expected.to validate_presence_of :promoter_type }\n  end\n\n  describe '.withdrawal scope' do\n    let!(:withdrawal1) { create(:promo) }\n    let!(:withdrawal2) { create(:promo) }\n    let!(:withdrawal3) { create(:option_promo) }\n    subject { described_class.withdrawal }\n\n    it 'returns only withdrawal promos' do\n      expect(subject).to eq [withdrawal1, withdrawal2]\n    end\n  end\n\n  describe '.active scope' do\n    let!(:active) { create(:active_promo, date_from: 1.week.ago, date_to: 1.week.from_now) }\n    let!(:inactive) { create(:promo) }\n    let!(:active_but_expired) { create(:promo, date_from: 1.month.ago, date_to: 1.week.ago) }\n\n    it 'returns promos with active state and that runs today' do\n      expect(described_class.active).to include active\n    end\n\n    it 'does not return promo with expired date' do\n      expect(described_class.active).not_to include active_but_expired\n    end\n\n    it 'does not returns promo with inactive state' do\n      expect(described_class.active).not_to include inactive\n    end\n  end\n\n  describe 'states' do\n    it 'initial state' do\n      expect(promo.state).to eq 'pending'\n    end\n\n    context 'start! event' do\n      before { subject.start! }\n\n      it 'turns to active' do\n        expect(subject.state).to eq 'active'\n      end\n    end\n\n    context 'stop!' do\n      before do\n        subject.start!\n        subject.stop!\n      end\n\n      it 'turns to pending' do\n        expect(subject.state).to eq 'pending'\n      end\n    end\n  end\n\n  describe '#promoter' do\n    it 'calls promoters repository' do\n      expect(PromotersRepository).to receive(:find_by_type).with(promo.promoter_type)\n      subject.promoter\n    end\n\n    it 'returns according promoter' do\n      expect(subject.promoter).to eq DiscountPromoter\n    end\n  end\nend\n\n# == Schema Information\n#\n# Table name: promos\n#\n#  id            :integer          not null, primary key\n#  name          :string(255)\n#  type          :string(255)\n#  date_from     :date\n#  date_to       :date\n#  promoter_type :string(255)\n#  promo_code    :string(255)\n#  created_at    :datetime\n#  updated_at    :datetime\n#  attrs         :hstore           default({})\n#\n"
  },
  {
    "path": "spec/models/promoters/discount_promoter_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe DiscountPromoter do\n  subject { described_class }\n\n  describe '.apply' do\n    let!(:promo) { create(:promo, attrs: { 'discount_percent' => 30 }) }\n\n    it 'makes discount from base amount' do\n      expect(subject.apply(promo, 100)).to eq 70\n    end\n  end\n\n  describe '.type' do\n    it 'returns type' do\n      expect(subject.type).to eq 'discount'\n    end\n  end\n\n  describe 'attributes' do\n    it 'returns array of attributes' do\n      expect(subject.attributes).to eq [:discount_percent]\n    end\n  end\nend\n"
  },
  {
    "path": "spec/models/promoters_repository_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe PromotersRepository do\n  subject { described_class }\n  let!(:custom_promoter) { OpenStruct.new(type: 'custom', attributes: []) }\n  before { subject.persist(custom_promoter) }\n\n  describe '.all' do\n    it 'returns all promoters classes' do\n      expect(subject.all).to eq [DiscountPromoter, custom_promoter]\n    end\n  end\n\n  describe '.types' do\n    it 'returns all types of promoters' do\n      expect(subject.types).to eq %w[discount custom]\n    end\n  end\n\n  describe '.clean' do\n    it 'resets promoters list' do\n      subject.persist(custom_promoter)\n      subject.clean\n      expect(subject.all).to eq [DiscountPromoter]\n    end\n  end\n\n  describe '.persist' do\n    before { subject.clean }\n\n    it 'adds promoter to repo' do\n      before_size = subject.all.size\n      subject.persist(custom_promoter)\n      expect(subject.all.size).to eq before_size + 1\n    end\n  end\n\n  describe '.find_by_type' do\n    it '.find_by_type' do\n      expect(subject.find_by_type(:discount)).to eq DiscountPromoter\n    end\n  end\nend\n"
  },
  {
    "path": "spec/models/promotion_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Promotion do\n  it { is_expected.to belong_to :user }\n  it { is_expected.to belong_to :promo }\n\n  describe 'uniqueness validation' do\n    let(:promo1) { create(:promo) }\n    let(:promo2) { create(:promo) }\n    let(:user) { create(:user) }\n\n    before do\n      create(:promotion, user: user, promo: promo1)\n    end\n\n    it 'does not allow to create second promotion with same promo for user' do\n      second_promotion = build(:promotion, user: user, promo: promo1)\n      expect(second_promotion).not_to be_valid\n    end\n\n    it 'allows user to have multiple promotions with different promos' do\n      second_promotion = build(:promotion, user: user, promo: promo2)\n      expect(second_promotion).to be_valid\n    end\n  end\n\n  describe 'with_active_promos scope' do\n    subject { described_class }\n\n    before do\n      create(:promotion, promo: create(:promo))\n      create(:promotion, promo: create(:active_promo, date_from: 1.week.ago, date_to: 1.week.from_now))\n      create(:promotion, promo: create(:promo))\n      create(:promotion, promo: create(:active_promo, date_from: 1.week.ago, date_to: 1.week.from_now))\n    end\n\n    it 'returns promotions with active promos' do\n      expect(subject.with_active_promos.size).to eq 2\n    end\n\n    it 'promo are active' do\n      expect(subject.with_active_promos.last.promo.active?).to be true\n    end\n  end\n\n  describe '#apply method' do\n    let(:promo) { create(:promo) }\n    let(:promotion) { create(:promotion, promo: promo) }\n    let(:amount) { 100 }\n\n    it 'calls apply method on promo promoter' do\n      expect(promo.promoter).to receive(:apply).with(promo, amount)\n      promotion.apply(amount)\n    end\n  end\nend\n\n# == Schema Information\n#\n# Table name: promotions\n#\n#  id         :integer          not null, primary key\n#  user_id    :integer\n#  promo_id   :integer\n#  created_at :datetime\n#  updated_at :datetime\n#\n"
  },
  {
    "path": "spec/models/proxy/connect_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Proxy::Connect do\n  subject { build :proxy_connect }\n\n  it { is_expected.to belong_to :proxy }\n  it { is_expected.to belong_to :user }\n\n  it 'has initial state' do\n    expect(subject.state).to eq 'active'\n  end\nend\n"
  },
  {
    "path": "spec/models/proxy/node_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Proxy::Node do\n  subject { build(:proxy_node) }\n\n  it { is_expected.to validate_presence_of :host }\n  it { is_expected.to validate_presence_of :port }\n  it { is_expected.to validate_presence_of :country }\n  it { is_expected.to have_many :connects }\nend\n"
  },
  {
    "path": "spec/models/referrer/account_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Referrer::Account do\n  let(:referrer) { create(:user) }\n  let(:amounts) { [10, 20, 30] }\n  subject { described_class.new(referrer.id) }\n\n  before do\n    amounts.each do |amount|\n      create(:referrer_reward, referrer_id: referrer.id, amount: amount)\n    end\n  end\n\n  describe '#balance' do\n    it 'returns sum of all account operations' do\n      expect(subject.balance).to eq amounts.inject(0) { |sum, a| sum + a }\n    end\n  end\n\n  describe '#operations' do\n    it 'returns all operations with referrer' do\n      expect(subject.operations.count).to eq amounts.size\n    end\n  end\n\n  describe '#referrals_total_amount' do\n    let!(:referral) { create(:user_with_balance, referrer: referrer) }\n\n    before do\n      3.times { create(:withdrawal, user: referral, amount: 3) }\n    end\n\n    it 'returns sum of referrals withdrawals' do\n      expect(subject.referrals_total_amount.to_f).to eq 9.0\n    end\n  end\nend\n"
  },
  {
    "path": "spec/models/referrer/reward_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Referrer::Reward do\n  subject { build(:referrer_reward) }\n\n  it { is_expected.to validate_presence_of :referrer_id }\n  it { is_expected.to validate_presence_of :operation_id }\n  it { is_expected.to validate_presence_of :amount }\nend\n"
  },
  {
    "path": "spec/models/server/signature_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'rails_helper'\n\ndescribe Server::Signature do\n  subject { described_class.new(server, request_params) }\n\n  describe '#valid?' do\n    let(:request_params) do\n      {\n        hostname: 'some_host_name',\n        ip_address: 'ip_address',\n        some_key: 'some_key',\n        signature: signature\n      }\n    end\n\n    context 'when server does not exist' do\n      let(:server) { nil }\n\n      context 'with valid signature' do\n        let(:signature) { Settings.secret_token.to_s }\n        its(:valid?) { is_expected.to be true }\n      end\n\n      context 'with invalid signature' do\n        let(:signature) { 'invalid_signature' }\n        its(:valid?) { is_expected.to be false }\n      end\n    end\n\n    context 'when server exists' do\n      let!(:server) { create(:server) }\n\n      before { server.update!(auth_key: 'QFEJYWWU') }\n\n      context 'with valid signature' do\n        let(:signature) { '4db645f94cd9af74ba4d8fb21b952f20' }\n\n        its(:valid?) { is_expected.to be true }\n\n        it 'calls Signer with cleaned params' do\n          clean_params = request_params.reject { |(k, _v)| k == :signature }\n          expect(Signer).to receive(:sign_hash).with(clean_params, server.auth_key)\n          subject.valid?\n        end\n      end\n\n      context 'with invalid signature' do\n        let(:signature) { '123' }\n        its(:valid?) { is_expected.to be false }\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "spec/models/server_config_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe ServerConfig do\n  subject { described_class.new }\n\n  it 'addes line to buffer' do\n    subject.append_line 'new_line'\n    expect(subject.config_lines).to include 'new_line'\n  end\n\n  it 'converts to text' do\n    subject.append_line 'first'\n    subject.append_line 'second'\n    expect(subject.to_text).to include 'first', 'second'\n  end\nend\n"
  },
  {
    "path": "spec/models/server_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Server do\n  subject { build(:server) }\n\n  it { is_expected.to be_valid }\n  it { is_expected.to have_many(:connects) }\n  it { is_expected.to have_many(:disconnects) }\n  it { is_expected.to have_many(:included_plans) }\n  it { is_expected.to have_many(:plans) }\n\n  it { validate_presence_of(:hostname) }\n  it { validate_presence_of(:ip_address) }\n  it { validate_presence_of(:protocol) }\n  it { validate_presence_of(:port) }\n  it { validate_presence_of(:country_code) }\n\n  it 'does not allow unknown protocol' do\n    subject.protocol = 'unknown'\n    expect(subject).not_to be_valid\n  end\n\n  context 'after creation' do\n    it 'generates auth key' do\n      expect(subject.save).not_to be_nil\n    end\n\n    it 'auth key is random' do\n      expect(subject.save).not_to eq create(:server).auth_key\n    end\n\n    it 'is in pending state' do\n      expect(subject.pending?).to be true\n    end\n  end\n\n  describe '.to_s' do\n    it 'returns hostname' do\n      expect(subject.to_s).to eq subject.hostname\n    end\n  end\nend\n\n# == Schema Information\n#\n# Table name: servers\n#\n#  id         :integer          not null, primary key\n#  hostname   :string(255)\n#  ip_address :string(255)\n#  auth_key   :string(255)\n#  state      :string(255)\n#  created_at :datetime\n#  updated_at :datetime\n#  config     :string(255)\n#\n"
  },
  {
    "path": "spec/models/test_period_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe TestPeriod do\n  let(:user) { create(:user) }\n  subject { described_class.new(user) }\n\n  it 'test period is false by default' do\n    expect(subject.enabled?).to be false\n  end\n\n  describe '#enable!' do\n    it 'persists period start date' do\n      expect do\n        subject.enable!\n      end.to change {\n        user.test_period_started_at.try(:to_date)\n      }.to Date.current\n    end\n  end\n\n  describe '#disable!' do\n    before { user.update(test_period_started_at: Date.current) }\n\n    it 'removes period start date' do\n      expect do\n        subject.disable!\n      end.to change {\n        user.reload.test_period_started_at\n      }.to nil\n    end\n  end\n\n  context 'test period custom length' do\n    before { user.update(test_period_started_at: Date.current, period_length: 5) }\n\n    it 'returns custom value' do\n      expect(subject.test_period_until.to_date).to eq (Date.current + 5.days)\n    end\n  end\n\n  context 'default test period' do\n    before { user.update(test_period_started_at: Date.current) }\n\n    it 'returns custom value' do\n      expect(subject.test_period_until.to_date).to eq (Date.current + User::DEFAULT_TEST_PERIOD)\n    end\n  end\nend\n"
  },
  {
    "path": "spec/models/traffic_report_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe TrafficReport do\n  let(:params) { Hash[] }\n  subject { described_class.new(params) }\n\n  describe 'report building' do\n    let(:report_ar_relation) { double('TrafficReport') }\n    before do\n      allow_any_instance_of(TrafficReport).to receive(:build_report).and_return(report_ar_relation)\n      allow(report_ar_relation).to receive(:where).and_return([])\n    end\n\n    it 'builds report on result call' do\n      expect(subject.result).not_to be_nil\n    end\n  end\n\n  context 'params on initialization passed' do\n    let(:date_from) { '01-10-2013' }\n    let(:date_to) { '31-10-2013' }\n    let(:params) do\n      {\n        date_from: date_from,\n        date_to: date_to\n      }\n    end\n\n    it 'date_from returns date from params' do\n      expect(subject.date_from).to eq date_from.to_time.beginning_of_month\n    end\n\n    it 'date_to returns date from params' do\n      expect(subject.date_to).to eq date_to.to_time.end_of_month\n    end\n  end\n\n  context 'no params passed' do\n    it 'date from equals beginning of month' do\n      expect(subject.date_from).to eq Time.current.beginning_of_month\n    end\n\n    it 'date to equals end of month' do\n      expect(subject.date_to).to eq Time.current.end_of_month\n    end\n  end\nend\n"
  },
  {
    "path": "spec/models/traffic_reports/date_traffic_report_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe DateTrafficReport do\n  let(:current_date) { DateTime.parse('13-06-2013') }\n  let(:date_from) { current_date - 3.month }\n  let(:date_to) { current_date.end_of_month }\n  subject { described_class.new(date_from: date_from, date_to: date_to) }\n\n  before do\n    create(:disconnect, created_at: current_date)\n    create(:disconnect, created_at: current_date)\n\n    yesterday = create(:disconnect)\n    yesterday.update(created_at: current_date - 1.day)\n\n    month_ago = create(:disconnect)\n    month_ago.update(created_at: current_date - 1.month + 3.days)\n  end\n\n  it 'returns report grouped by dates' do\n    expect(subject.result.to_a.size).to eq 3\n  end\n\n  it 'sums traffic in' do\n    todays_traffic_in = subject.result.to_a.first.traffic_in\n    expect(todays_traffic_in).to eq attributes_for(:disconnect)[:traffic_in] * 2\n  end\n\n  it 'sums traffic out' do\n    todays_traffic_out = subject.result.to_a.first.traffic_out\n    expect(todays_traffic_out).to eq attributes_for(:disconnect)[:traffic_in] * 2\n  end\n\n  it 'casts created_at time to zero' do\n    date_hour = subject.result.to_a.first.date.hour\n    expect(date_hour).to be_zero\n  end\nend\n"
  },
  {
    "path": "spec/models/traffic_reports/server_traffic_report_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe ServerTrafficReport do\n  let(:current_date) { DateTime.parse('13-06-2013') }\n  let(:date_from) { current_date - 3.month }\n  let(:date_to) { current_date.end_of_month }\n\n  let(:first_server) { create(:server) }\n  let(:second_server) { create(:server) }\n  let(:third_server) { create(:server) }\n\n  subject { described_class.new(date_from: date_from, date_to: date_to) }\n\n  before do\n    create(:disconnect, server: first_server, created_at: current_date)\n    create(:disconnect, server: first_server, created_at: current_date)\n\n    create(:disconnect, server: second_server, created_at: current_date)\n    create(:disconnect, server: third_server, created_at: current_date)\n  end\n\n  it 'returns report grouped by servers' do\n    expect(subject.result.to_a.size).to eq 3\n  end\n\n  it 'sums traffic in' do\n    first_server_traffic_in = subject.result.to_a.first.traffic_in\n    expect(first_server_traffic_in).to eq attributes_for(:disconnect)[:traffic_in] * 2\n  end\n\n  it 'sums traffic out' do\n    first_server_traffic_out = subject.result.to_a.first.traffic_out\n    expect(first_server_traffic_out).to eq attributes_for(:disconnect)[:traffic_out] * 2\n  end\n\n  it 'second server has only its own traffic' do\n    expect(subject.result.to_a[1].traffic_in).to eq attributes_for(:disconnect)[:traffic_in]\n    expect(subject.result.to_a[1].traffic_out).to eq attributes_for(:disconnect)[:traffic_out]\n  end\n\n  it 'third server has only its own traffic' do\n    expect(subject.result.to_a[2].traffic_in).to eq attributes_for(:disconnect)[:traffic_in]\n    expect(subject.result.to_a[2].traffic_out).to eq attributes_for(:disconnect)[:traffic_out]\n  end\nend\n"
  },
  {
    "path": "spec/models/traffic_reports/user_traffic_report_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe UserTrafficReport do\n  let(:current_date) { DateTime.parse('13-06-2013') }\n  let(:date_from) { current_date - 3.month }\n  let(:date_to) { current_date.end_of_month }\n\n  let(:first_user) { create(:user) }\n  let(:second_user) { create(:user) }\n  let(:third_user) { create(:user) }\n\n  subject { described_class.new(date_from: date_from, date_to: date_to) }\n\n  before do\n    create(:disconnect, user: first_user, created_at: current_date)\n    create(:disconnect, user: first_user, created_at: current_date)\n\n    create(:disconnect, user: second_user, created_at: current_date)\n    create(:disconnect, user: third_user, created_at: current_date)\n  end\n\n  it 'returns report grouped by users' do\n    expect(subject.result.to_a.size).to eq 3\n  end\n\n  it 'sums traffic in' do\n    first_user_traffic_in = subject.result.to_a.first.traffic_in\n    expect(first_user_traffic_in).to eq attributes_for(:disconnect)[:traffic_in] * 2\n  end\n\n  it 'sums traffic out' do\n    first_user_traffic_out = subject.result.to_a.first.traffic_out\n    expect(first_user_traffic_out).to eq attributes_for(:disconnect)[:traffic_out] * 2\n  end\n\n  it 'second user has only its own traffic' do\n    expect(subject.result.to_a[1].traffic_in).to eq attributes_for(:disconnect)[:traffic_in]\n    expect(subject.result.to_a[1].traffic_out).to eq attributes_for(:disconnect)[:traffic_out]\n  end\n\n  it 'third user has only its own traffic' do\n    expect(subject.result.to_a[2].traffic_in).to eq attributes_for(:disconnect)[:traffic_in]\n    expect(subject.result.to_a[2].traffic_out).to eq attributes_for(:disconnect)[:traffic_out]\n  end\nend\n"
  },
  {
    "path": "spec/models/transaction_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Transaction do\n  subject { Transaction }\n  let(:user) { create(:user, balance: 100) }\n\n  describe '.user_transactions' do\n    let(:payment) { create(:payment, created_at: 1.day.ago, user: user) }\n    let(:withdrawal) { create(:withdrawal, created_at: 2.day.ago, user: user) }\n\n    before do\n      allow_any_instance_of(Payment).to receive(:try_to_withdraw_funds)\n      payment.accept!\n      withdrawal\n      create(:withdrawal)\n      create(:payment)\n    end\n\n    it 'returns user transactions list' do\n      expect(subject.user_transactions(user).size).to eq 2\n    end\n\n    it 'returns only users transactions' do\n      expect(subject.user_transactions(user).first.object).to eq payment\n      expect(subject.user_transactions(user).last.object).to eq withdrawal\n    end\n  end\n\n  describe '.all' do\n    subject { described_class.all }\n    let!(:transaction1) { create(:payment, created_at: 1.day.ago, state: 'accepted') }\n    let!(:transaction2) { create(:payment, created_at: 3.day.ago, state: 'accepted') }\n    let!(:transaction3) { create(:withdrawal, created_at: 4.day.ago) }\n    let!(:transaction4) { create(:withdrawal, created_at: 2.day.ago) }\n\n    it 'returns array' do\n      expect(subject.class).to eq Array\n    end\n\n    it 'returns collection of payments and withdrawals' do\n      expect(subject.count).to eq 4\n    end\n\n    it 'orders transactions on created_at value' do\n      expect(subject.map { |t| t.created_at.to_i })\n        .to eq [\n          transaction1.created_at.to_i,\n          transaction4.created_at.to_i,\n          transaction2.created_at.to_i,\n          transaction3.created_at.to_i\n        ]\n    end\n  end\n\n  describe 'numerates transactions' do\n    let!(:other_transaction1) { create(:withdrawal) }\n    let!(:other_transaction2) { create(:withdrawal) }\n    let!(:user_transaction1) { create(:withdrawal, user: user) }\n    let!(:user_transaction2) { create(:withdrawal, user: user) }\n    subject { described_class.user_transactions(user) }\n\n    it 'numerates transactions from 1 to N' do\n      expect(subject.first.id).to eq 2\n      expect(subject.last.id).to eq 1\n    end\n  end\n\n  describe '#amount' do\n    subject { Transaction.new(1, object) }\n\n    context 'payment transaction' do\n      let(:object) { create(:payment) }\n\n      it 'returns usd_amount of payment' do\n        object.update(usd_amount: 123)\n        expect(subject.amount).to eq 123\n      end\n    end\n\n    context 'withdrawal transaction' do\n      let(:object) { create(:withdrawal) }\n\n      it 'returns amount of withdrawal' do\n        expect(subject.amount).to eq object.amount\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "spec/models/user_option_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'rails_helper'\n\ndescribe UserOption do\n  subject { build(:user_option) }\n\n  it { is_expected.to validate_presence_of(:user_id) }\n  it { is_expected.to validate_presence_of(:option_id) }\n  it { is_expected.to belong_to :user }\n  it { is_expected.to belong_to :option }\n\n  it 'is enabled' do\n    expect(subject.enabled?).to be true\n  end\n\n  describe 'enabled scope' do\n    before do\n      create_list(:user_option, 3)\n      create(:user_option, :disabled)\n    end\n\n    it 'returns only enabled options' do\n      expect(described_class.enabled.size).to eq 3\n    end\n  end\n\n  describe 'toggle!' do\n    before { option.toggle! }\n\n    context 'enabled' do\n      let(:option) { create(:user_option) }\n\n      it 'makes disabled' do\n        expect(option.disabled?).to be true\n      end\n    end\n\n    context 'disabled' do\n      let(:option) { create(:user_option, :disabled) }\n\n      it 'makes enabled' do\n        expect(option.enabled?).to be true\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "spec/models/user_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe User do\n  let(:user) { build(:user) }\n  subject { user }\n\n  it { is_expected.to be_valid }\n\n  it { is_expected.to belong_to :referrer }\n  it { is_expected.to have_many :referrals }\n\n  it { is_expected.to validate_presence_of(:plan_id) }\n  it { is_expected.to validate_acceptance_of(:accept_agreement) }\n\n  it { is_expected.to have_many(:connects) }\n  it { is_expected.to have_many(:disconnects) }\n  it { is_expected.to have_many(:promotions) }\n  it { is_expected.to have_many(:options) }\n  it { is_expected.to have_many(:user_options) }\n\n  it 'returns only active options' do\n    user = create(:user)\n    2.times do\n      user.options << create(:option)\n      user.options << create(:active_option)\n    end\n\n    expect(user.options.size).to eq 2\n  end\n\n  it_behaves_like 'loads created by last days', :user\nend\n\ndescribe User, 'custom validations' do\n  subject { build(:user, plan_id: plan.id) }\n\n  context 'user with regular plan' do\n    let(:plan) { create(:plan) }\n\n    it { is_expected.to be_valid }\n  end\n\n  context 'user with special plan created' do\n    let(:plan) { create(:plan, special: true) }\n\n    it { is_expected.not_to be_valid }\n  end\n\n  context 'user changed plan from regular to special' do\n    let(:plan) { create(:plan) }\n    let(:new_plan) { create(:plan, special: true) }\n    subject { create(:user, plan_id: plan.id) }\n\n    it 'allowes user to change plan' do\n      subject.plan_id = new_plan.id\n      expect(subject).to be_valid\n    end\n  end\nend\n\ndescribe User, 'public methods' do\n  subject { create(:user_with_balance) }\n\n  describe '#test period' do\n    it 'returns TestPeriod instance' do\n      expect(subject.test_period.class).to eq TestPeriod\n    end\n  end\n\n  it 'returns email' do\n    expect(subject.to_s).to eq subject.email\n  end\n\n  describe '#referrer_account' do\n    it 'returns account instance' do\n      expect(subject.referrer_account.class).to eq Referrer::Account\n    end\n  end\n\n  describe '#total_amount' do\n    before do\n      accepted_payment = create(:payment, user: subject)\n      create(:payment, user: subject)\n      accepted_payment.accept!\n    end\n\n    it 'returns total amount of user' do\n      expect(subject.total_amount).to eq attributes_for(:payment)[:amount]\n    end\n  end\n\n  describe User, 'balance increase' do\n    before { IncreaseBalanceMailWorker.jobs.clear }\n\n    it 'allowes to increase balance' do\n      subject.increase_balance(100)\n      expect(subject.reload.balance).to eq 200\n    end\n\n    it 'adds email task to queue' do\n      expect { subject.increase_balance(100) }.to change(IncreaseBalanceMailWorker.jobs, :size).by(1)\n    end\n\n    it 'notifies user by email' do\n      expect do\n        subject.increase_balance(100)\n        IncreaseBalanceMailWorker.drain\n      end.to change(ActionMailer::Base.deliveries, :count).by(1)\n    end\n  end\n\n  describe User, 'balance decrease' do\n    before { DecreaseBalanceMailWorker.jobs.clear }\n\n    it 'allowes to decrease balance' do\n      subject.decrease_balance(100)\n      expect(subject.reload.balance).to eq 0\n    end\n\n    it 'adds email task to queue' do\n      expect { subject.decrease_balance(100) }.to change(DecreaseBalanceMailWorker.jobs, :size).by(1)\n    end\n\n    it 'notifies user by email' do\n      expect do\n        subject.decrease_balance(100)\n        DecreaseBalanceMailWorker.drain\n      end.to change(ActionMailer::Base.deliveries, :count).by(1)\n    end\n  end\n\n  describe '.last_connect' do\n    before do\n      create(:connect, user: subject)\n    end\n\n    it 'returns last connect' do\n      last_connect = create(:connect, user: subject)\n      expect(subject.last_connect).to eq last_connect\n    end\n  end\n\n  describe '.last_connect_date' do\n    let!(:connect) { create(:connect, user: subject) }\n\n    it 'returns date of last connect' do\n      expect(subject.last_connect_date.to_i).to eq connect.created_at.to_i\n    end\n  end\n\n  describe '.last_withdrawal_date' do\n    let!(:withdrawal) { create(:withdrawal, user: subject) }\n\n    it 'returns date of last withdrawal' do\n      expect(subject.last_withdrawal_date.to_i).to eq withdrawal.created_at.to_i\n    end\n  end\n\n  describe '.service_enabled?' do\n    let(:user) { create(:user_with_balance) }\n    subject { user.service_enabled? }\n\n    context 'user has paid in current billing interval' do\n      before { create(:withdrawal, user: user) }\n\n      it 'service is enabled' do\n        is_expected.to be true\n      end\n    end\n\n    context \"user hasn't paid\" do\n      it 'service is disabled' do\n        is_expected.to be false\n      end\n    end\n  end\n\n  describe '.paid?' do\n    let(:user) { create(:user_with_balance) }\n\n    context 'user is paid' do\n      let!(:withdrawal) { create(:withdrawal, user: subject) }\n\n      it 'returns true' do\n        expect(subject.paid?).to be true\n      end\n\n      context 'user is prolongated' do\n        before { create(:withdrawal_prolongation, withdrawal: withdrawal) }\n\n        it 'returns true' do\n          expect(subject.paid?).to be true\n        end\n      end\n    end\n\n    context 'user payment expired, but prolongated' do\n      let!(:withdrawal) { create(:withdrawal, user: subject, created_at: 2.month.ago) }\n      let!(:prolongation) { create(:withdrawal_prolongation, withdrawal: withdrawal, days_number: 100) }\n\n      it 'returns true' do\n        expect(subject.paid?).to be true\n      end\n    end\n\n    context 'user payment expired, prolongation expired too' do\n      let!(:withdrawal) { create(:withdrawal, user: subject, created_at: 2.month.ago) }\n      let!(:prolongation) { create(:withdrawal_prolongation, withdrawal: withdrawal, days_number: 10) }\n\n      it 'returns false' do\n        expect(subject.paid?).to be false\n      end\n    end\n\n    context 'user is unpaid' do\n      it 'returns false' do\n        expect(subject.paid?).not_to be true\n      end\n    end\n  end\nend\n\ndescribe User, 'callbacks on create' do\n  subject { create(:user) }\n\n  describe 'vpn credentials creation' do\n    it 'generates login' do\n      expect(subject.vpn_login).not_to be_nil\n    end\n\n    it 'generates password' do\n      expect(subject.vpn_password).not_to be_nil\n    end\n\n    it 'vpn password is 12 digits long' do\n      expect(subject.vpn_password.length).to eq 12\n    end\n  end\n\n  describe 'generate reflink' do\n    it 'creates reflink' do\n      expect(subject.reflink).not_to be_nil\n    end\n  end\n\n  describe 'newsletter subscription' do\n    it 'adds to newsletter' do\n      expect do\n        create(:user)\n      end.to change(AddUserToNewsletterWorker.jobs, :size).by(1)\n    end\n  end\nend\n\ndescribe User, 'scopes' do\n  describe 'by payments' do\n    let!(:paid_user) { create(:user) }\n    let!(:earliar_paid_user) { create(:user) }\n    let!(:not_paid_user) { create(:user) }\n\n    before do\n      create(:payment, user: paid_user)\n      old_payment = create(:payment, user: earliar_paid_user)\n      old_payment.update(created_at: 2.month.ago)\n    end\n\n    describe '.payers' do\n      subject(:payers) { described_class.payers }\n\n      it 'returns this month payers' do\n        expect(payers).to include paid_user\n      end\n\n      it 'returns old payers' do\n        expect(payers).to include earliar_paid_user\n      end\n    end\n\n    describe '.this_month_payers' do\n      subject(:payers) { described_class.this_month_payers }\n\n      it 'returns obly who paid at this month' do\n        expect(payers).to include paid_user\n        expect(payers).not_to include earliar_paid_user\n      end\n    end\n  end\n\n  describe '#non_paid_clients' do\n    before do\n      t = Time.local(2014, 9, 15, 12, 0, 0)\n      Timecop.travel(t)\n    end\n\n    context 'time sensetive scope' do\n      let!(:paid_client) { create :user_with_balance, email: 'paid@mail.ru' }\n      let!(:new_client) { create :user_with_balance, email: 'new@mail.ru' }\n      let!(:non_paid_client) { create :user_with_balance, email: 'not@mail.ru' }\n      let!(:non_paid_client2) { create :user_with_balance, email: 'not2@mail.ru' }\n\n      let(:result) { described_class.non_paid_users }\n\n      before do\n        create(:withdrawal, user: paid_client, created_at: 2.day.ago)\n\n        old_withdrawal = create(:withdrawal, user: non_paid_client)\n        old_withdrawal.update(created_at: 2.month.ago)\n\n        old_withdrawal2 = create(:withdrawal, user: non_paid_client2)\n        old_withdrawal2.update(created_at: 5.month.ago)\n      end\n\n      it 'returns 3 clients' do\n        expect(result.size).to eq 3\n      end\n\n      it 'sorts by client registration' do\n        expect(result).to eq [new_client, non_paid_client, non_paid_client2]\n      end\n\n      it 'contains new client' do\n        expect(result).to include new_client\n      end\n\n      it 'contains non paid client' do\n        expect(result).to include non_paid_client\n      end\n\n      it 'contains non paid client2' do\n        expect(result).to include non_paid_client2\n      end\n    end\n  end\n\n  describe '.never_paid' do\n    let!(:paid_client) { create :user_with_balance, email: 'paid@mail.ru' }\n    let!(:new_client) { create :user_with_balance, email: 'new@mail.ru' }\n    let!(:paid_long_ago_client) { create :user_with_balance, email: 'not@mail.ru' }\n\n    let(:result) { described_class.never_paid }\n\n    before do\n      create(:withdrawal, user: paid_client, created_at: 2.day.ago)\n\n      old_withdrawal = create(:withdrawal, user: paid_long_ago_client)\n      old_withdrawal.update(created_at: 2.month.ago)\n    end\n\n    it 'returns 1 client' do\n      expect(result.size).to eq 1\n    end\n\n    it 'contains new client' do\n      expect(result).to include new_client\n    end\n\n    it 'does not contain long ago client' do\n      expect(result).not_to include paid_long_ago_client\n    end\n\n    it 'does not contain paid client' do\n      expect(result).not_to include paid_client\n    end\n  end\n\n  describe '.active_referrers' do\n    subject { described_class.active_referrers }\n    let!(:referrer1) { create(:user) }\n    let!(:referrer2) { create(:user) }\n    let!(:referrer3) { create(:user) }\n\n    before do\n      2.times { create(:user, referrer: referrer1) }\n      1.times { create(:user, referrer: referrer2) }\n    end\n\n    it 'returns referrers with referrals' do\n      expect(subject.map(&:email)).to include referrer1.email\n      expect(subject.map(&:email)).to include referrer2.email\n    end\n\n    it 'returns two users' do\n      expect(subject.size).to eq 2\n    end\n\n    it 'does not return referrer without referrals' do\n      expect(subject.map(&:email)).not_to include referrer3.email\n    end\n  end\nend\n\ndescribe User, 'states' do\n  subject { build(:user) }\n\n  context 'new' do\n    it 'has active status' do\n      expect(subject.active?).to be true\n    end\n  end\n\n  context '.disable! called' do\n    it 'changes state to disabled' do\n      expect do\n        subject.disable!\n      end.to change(subject, :state).to('disabled')\n    end\n  end\n\n  context '.activate! called' do\n    before { subject.disable! }\n\n    it 'changes state to active' do\n      expect do\n        subject.activate!\n      end.to change(subject, :state).to('active')\n    end\n  end\nend\n\n# == Schema Information\n#\n# Table name: users\n#\n#  id                       :integer          not null, primary key\n#  email                    :string(255)      default(\"\"), not null\n#  encrypted_password       :string(128)      default(\"\"), not null\n#  reset_password_token     :string(255)\n#  reset_password_sent_at   :datetime\n#  remember_created_at      :datetime\n#  sign_in_count            :integer          default(0)\n#  current_sign_in_at       :datetime\n#  last_sign_in_at          :datetime\n#  current_sign_in_ip       :string(255)\n#  last_sign_in_ip          :string(255)\n#  confirmation_token       :string(255)\n#  confirmed_at             :datetime\n#  confirmation_sent_at     :datetime\n#  failed_attempts          :integer          default(0)\n#  unlock_token             :string(255)\n#  locked_at                :datetime\n#  created_at               :datetime\n#  updated_at               :datetime\n#  balance                  :decimal(, )      default(0.0)\n#  plan_id                  :integer\n#  vpn_login                :string(255)\n#  vpn_password             :string(255)\n#  state                    :string(255)\n#  can_not_withdraw_counter :integer          default(0)\n#\n"
  },
  {
    "path": "spec/models/withdrawal_prolongation_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe WithdrawalProlongation do\n  it { is_expected.to belong_to :withdrawal }\n\n  it { is_expected.to validate_presence_of :withdrawal_id }\n  it { is_expected.to validate_presence_of :days_number }\nend\n"
  },
  {
    "path": "spec/models/withdrawal_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Withdrawal do\n  subject { build(:withdrawal) }\n\n  it { is_expected.to be_valid }\n  it { is_expected.to validate_presence_of(:plan_id) }\n  it { is_expected.to validate_presence_of(:user_id) }\n  it { is_expected.to validate_presence_of(:amount) }\nend\n\ndescribe Withdrawal, 'prolongation' do\n  it { is_expected.to have_many :withdrawal_prolongations }\n\n  describe '#prolongation_days' do\n    subject { create(:withdrawal) }\n\n    context 'prolongated' do\n      before { create_list(:withdrawal_prolongation, 2, days_number: 1, withdrawal: subject) }\n\n      it 'returns sum of prolongation days' do\n        expect(subject.prolongation_days).to eq 2\n      end\n    end\n\n    context 'no prolongation' do\n      it 'returns zero' do\n        expect(subject.prolongation_days).to eq 0\n      end\n    end\n  end\nend\n\ndescribe Withdrawal, 'user balance decreases' do\n  let(:user) { create(:user_with_balance) }\n  let(:plan) { create(:plan) }\n  let(:amount) { 1 }\n\n  it 'decreases users balance on create' do\n    balance_before = user.balance\n    create(:withdrawal, user: user, plan: plan, amount: 1)\n    expect(user.reload.balance).to eq(balance_before - amount)\n  end\n\n  context 'user has not enough funds' do\n    let(:user) { create(:user) }\n\n    it 'does not decrease balance' do\n      expect { create(:withdrawal, user: user, plan: plan) }.to raise_error ActiveRecord::RecordInvalid\n    end\n  end\nend\n\n# == Schema Information\n#\n# Table name: withdrawals\n#\n#  id         :integer          not null, primary key\n#  amount     :decimal(, )\n#  user_id    :integer\n#  plan_id    :integer\n#  created_at :datetime\n#  updated_at :datetime\n#\n"
  },
  {
    "path": "spec/operations/ops/admin/user/base_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'rails_helper'\n\ndescribe Ops::Admin::User::Base do\n  subject { described_class.new(params: params) }\n  let(:plan) { create(:plan) }\n  let(:params) do\n    {\n      email: 'user@gmail.com',\n      password: '123456',\n      password_confirmation: '123456',\n      plan_id: plan.id\n    }\n  end\n\n  it 'returns raise' do\n    expect { subject.call }.to raise_error NotImplementedError\n  end\nend\n"
  },
  {
    "path": "spec/operations/ops/admin/user/create_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'rails_helper'\n\ndescribe Ops::Admin::User::Create do\n  subject { described_class.new(params: params) }\n  let!(:plan) { create(:plan) }\n\n  context 'valid params' do\n    let(:params) do\n      {\n        email: 'user@gmail.com',\n        password: '123456',\n        password_confirmation: '123456',\n        plan_id: plan.id\n      }\n    end\n\n    it 'returns success result' do\n      expect(subject.call).to eq(success: true, user: User.last)\n    end\n\n    it 'will be created user' do\n      expect { subject.call }.to change(User, :count).by(1)\n    end\n\n    it 'returns success result' do\n      expect(CreateUserMailWorker).to receive(:perform_async).with(any_args)\n      subject.call\n    end\n\n    it 'adds email task to queue' do\n      expect { subject.call }.to change(CreateUserMailWorker.jobs, :size).by(1)\n    end\n  end\n\n  context 'invalid params' do\n    let(:params) do\n      {\n        email: 'user@gmail.com',\n        password: '123456',\n        password_confirmation: '12345678',\n        plan_id: plan.id\n      }\n    end\n\n    it 'returns failed result' do\n      expect(subject.call[:success]).to eq false\n    end\n\n    it 'will be created user' do\n      expect { subject.call }.to change(User, :count).by(0)\n    end\n\n    it 'returns success result' do\n      expect(CreateUserMailWorker).not_to receive(:perform_async).with(any_args)\n      subject.call\n    end\n\n    it 'adds email task to queue' do\n      expect { subject.call }.not_to(change(CreateUserMailWorker.jobs, :size))\n    end\n  end\nend\n"
  },
  {
    "path": "spec/rails_helper.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n"
  },
  {
    "path": "spec/serializers/admin/users_serializer_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Admin::UsersSerializer do\n  describe '#emails' do\n    let(:users) { User.all }\n    let(:serializer) { described_class.new(users, :csv) }\n\n    before do\n      create_list(:user, 2)\n    end\n\n    it 'returns emails' do\n      expect(serializer.emails).to eq users.map(&:email).join(',')\n    end\n  end\nend\n"
  },
  {
    "path": "spec/serializers/api/connection_serializer_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Api::ConnectionSerializer do\n  let(:option) { create(:option) }\n  let(:option_attributes) do\n    {\n      option.code => { 'attr1' => 'attr1_value' }\n    }\n  end\n  let(:object) { create(:connect, option_attributes: option_attributes) }\n  let(:user) { object.user }\n  subject { described_class.new(object) }\n\n  it 'includes option code' do\n    expect(subject.to_json).to include option.code\n  end\n\n  it 'includes options block' do\n    expect(subject.to_json).to include 'options'\n  end\n\n  it 'includes options attributes block' do\n    expect(subject.to_json).to include 'option_attributes'\n  end\n\n  it 'includes common_name key' do\n    expect(subject.to_json).to include 'common_name'\n  end\n\n  it 'includes user vpn_login' do\n    expect(subject.to_json).to include user.vpn_login\n  end\n\n  describe 'option_attributes block' do\n    let(:json) { subject.to_json }\n\n    it 'includes option code' do\n      expect(json).to include option.code\n    end\n\n    it 'includes option attr name' do\n      expect(json).to include option_attributes[option.code].keys.first\n    end\n\n    it 'includes option attr value' do\n      expect(json).to include option_attributes[option.code].values.first\n    end\n  end\nend\n"
  },
  {
    "path": "spec/services/dto/admin/dashboard_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'rails_helper'\n\ndescribe Dto::Admin::Dashboard do\n  subject(:dashboard) { described_class.new }\n\n  before do\n    redis = Redis.new\n    redis.set('smartvpn:eur_usd', 10)\n    redis.set('smartvpn:rub_usd', 10)\n    redis.set('smartvpn:courses:updated_at', Time.current)\n\n    Timecop.travel(Time.local(2014, 9, 15, 12, 0, 0))\n  end\n\n  describe 'courses' do\n    subject { dashboard.courses }\n\n    it 'returns date of last course update' do\n      expect(subject[:updated_at]).not_to be_nil\n    end\n\n    context 'courses exist' do\n      it 'loads rub course' do\n        expect(subject[:rub_usd]).not_to be_nil\n      end\n\n      it 'loads eur course' do\n        expect(subject[:eur_usd]).not_to be_nil\n      end\n    end\n  end\n\n  describe 'incomes' do\n    subject { dashboard.income }\n    before do\n      2.times { create(:payment, amount: 100) }\n    end\n\n    it_behaves_like 'total statistics result', 200\n    it_behaves_like 'total statistics discrete result', Dto::Admin::Dashboard\n  end\n\n  describe 'traffic' do\n    subject { dashboard.traffic }\n    before do\n      2.times { create(:disconnect, traffic_in: 100, traffic_out: 100) }\n    end\n\n    it_behaves_like 'total statistics result', 200\n    it_behaves_like 'total statistics discrete result', Dto::Admin::Dashboard\n  end\nend\n"
  },
  {
    "path": "spec/services/dto/admin/discrete_base_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'rails_helper'\n\ndescribe Dto::Admin::DiscreteBase do\n  let(:days_number) { 3 }\n  subject { described_class.new(number_of_days: days_number) }\n\n  describe '#amounts' do\n    before do\n      allow_any_instance_of(described_class).to receive(:values_by_days).and_return({})\n    end\n\n    it 'calls values_by_days method' do\n      subject.amounts\n    end\n\n    it 'adds records for all absent days in result' do\n      expect(subject.amounts.size).to eq days_number\n    end\n  end\nend\n"
  },
  {
    "path": "spec/services/forced_disconnect_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe ForcedDisconnect do\n  let(:user)   { create(:user) }\n  let(:server) { create(:server) }\n  subject      { described_class.new(user) }\n\n  describe '#invoke' do\n    context 'connected' do\n      let!(:connect) { create(:connect, user: user, server: server) }\n\n      it 'creates disconnect' do\n        expect do\n          subject.invoke\n        end.to change(Disconnect, :count).by(1)\n      end\n    end\n\n    context 'not connected' do\n      it 'does not create disconnect' do\n        expect do\n          subject.invoke\n        end.not_to change(Disconnect, :count)\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "spec/services/newsletter_manager_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe NewsletterManager do\n  subject { described_class.new }\n\n  describe '#add_to_list' do\n    let(:email) { 'test@email.com' }\n\n    context 'list is all' do\n      let(:list_name) { :all }\n\n      it 'calls Mailchimp api' do\n        ::FakeWeb.register_uri(:post, 'https://key.api.mailchimp.com/2.0/lists/subscribe', body: '{}')\n        subject.add_to_list(email, list_name)\n      end\n    end\n\n    context 'non-existing list' do\n      let(:list_name) { :non_existing }\n\n      it 'raises error' do\n        expect do\n          subject.add_to_list(email, list_name)\n        end.to raise_error SmartvpnException, 'Email list not defined'\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "spec/services/option/activation_price_calc_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Option::ActivationPriceCalc do\n  let!(:user) { create(:user_with_balance) }\n  let!(:option) { create(:active_option) }\n  let(:option_price) { 30 }\n  subject { described_class.activation_price(user, option) }\n\n  before do\n    user.plan.options << option\n    user.plan.update(option_prices: { option.code => option_price })\n    create(:withdrawal,\n           plan: user.plan,\n           user: user,\n           amount: user.plan.price,\n           created_at: last_withdrawal_days_ago.days.ago)\n  end\n\n  context 'last withdrawal was 15 days ago' do\n    let(:last_withdrawal_days_ago) { 15 }\n\n    describe '.activation_price' do\n      it 'price is for 15 days' do\n        expect(subject).to eq (option_price / 2)\n      end\n    end\n  end\n\n  context 'last withdrawal was 20 days ago' do\n    let(:last_withdrawal_days_ago) { 20 }\n\n    describe '.activation_price' do\n      it 'price is for 15 days' do\n        expect(subject).to eq (option_price / 3)\n      end\n    end\n  end\n\n  context 'last withdrawal was 0 days ago' do\n    let(:last_withdrawal_days_ago) { 0 }\n\n    describe '.activation_price' do\n      it 'price is for 10 days' do\n        expect(subject).to eq option_price\n      end\n    end\n  end\n\n  context 'last withdrawal was 30 days ago' do\n    let(:last_withdrawal_days_ago) { 30 }\n\n    describe '.activation_price' do\n      it 'price is for 30 days' do\n        expect(subject).to eq option_price\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "spec/services/option/activator_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Option::Activator do\n  subject { described_class }\n  let!(:option) { create(:active_option) }\n  before { allow_any_instance_of(subject).to receive(:activation_price).and_return(1) }\n\n  describe '.run' do\n    let!(:user) { create(:user_with_balance) }\n\n    context 'option permitted for users plan' do\n      before { user.plan.options << option }\n\n      context 'user has enough funds' do\n        it 'activates option for user' do\n          expect do\n            subject.run(user, option.code)\n          end.to change(user.options, :count).by(1)\n        end\n\n        it 'returns true' do\n          expect(subject.run(user, option.code)).to eq true\n        end\n      end\n\n      context 'user does not have enough funds' do\n        let(:user) { create(:user, balance: 0) }\n\n        it 'does not activate option for user' do\n          expect do\n            subject.run(user, option.code)\n          end.to change(user.options.reload, :count).by(0)\n        end\n\n        it 'returns false' do\n          expect(subject.run(user, option.code)).to eq false\n        end\n      end\n    end\n\n    context 'option is not permitted for users plan' do\n      it 'does not activate option' do\n        expect do\n          subject.run(user, option.code)\n        end.to change(user.options, :count).by(0)\n      end\n\n      it 'returns false' do\n        expect(subject.run(user, option.code)).to eq false\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "spec/services/option/deactivator_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Option::Deactivator do\n  let(:option) { create(:active_option) }\n  let(:user) { create(:user) }\n\n  before do\n    user.options << option\n  end\n\n  describe '.run' do\n    it 'deactivates option for user' do\n      expect do\n        described_class.run(user, option.id)\n      end.to change(user.options, :count).by(-1)\n    end\n  end\nend\n"
  },
  {
    "path": "spec/services/proxy/fetchers/base_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Proxy::Fetchers::Base do\n  subject { described_class }\n\n  describe '.fetch' do\n    context 'child class' do\n      it 'calls #fetch_proxy_list' do\n        allow_any_instance_of(subject).to receive(:fetch_proxy_list)\n        subject.fetch\n      end\n    end\n\n    context 'parent class' do\n      it 'raises error' do\n        expect { subject.fetch }.to raise_error NotImplementedException\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "spec/services/proxy/rater_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Proxy::Rater do\n  subject { described_class }\n\n  describe '.find_best' do\n    let(:country) { 'China' }\n    let(:user) { create(:user) }\n    let(:option) { create(:proxy_option) }\n    let!(:activated_option) { create(:user_option, user: user, option: option, attrs: { country: country }) }\n    let(:result) { subject.new(user, option).find_best }\n\n    before do\n      create(:proxy_node, country: 'Russia', ping: 20)\n      create(:proxy_node, country: 'China', ping: 100)\n      create(:proxy_node, country: 'China', ping: 125)\n      create(:proxy_node, country: 'Usa', ping: 150)\n    end\n\n    it 'returns proxy object' do\n      expect(result.class).to eq Proxy::Node\n    end\n\n    it 'returns proxy with smallest ping' do\n      expect(result.ping).to eq 100\n    end\n\n    it 'returns proxy for requested country' do\n      expect(result.country).to eq country\n    end\n\n    context 'no proxy for selected country' do\n      let(:country) { 'Uk' }\n\n      it 'returns proxy for other country' do\n        expect(result.country).not_to be_nil\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "spec/services/proxy/repository_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Proxy::Repository do\n  subject { described_class }\n\n  describe '.persist' do\n    let!(:persisted_proxy) { create(:proxy_node) }\n\n    context 'valid collection' do\n      let(:proxies) do\n        [\n          { host: '127.0.0.1', port: 3000, country: 'Russia' },\n          { host: '127.0.0.2', port: 3000, country: 'Russia' }\n        ]\n      end\n\n      it 'persists collection' do\n        expect do\n          subject.persist(proxies)\n        end.to change(Proxy::Node, :count).by(1)\n      end\n\n      it 'contains only new proxies' do\n        subject.persist(proxies)\n        expect(Proxy::Node.count).to eq 2\n      end\n\n      it 'does not contain old proxy' do\n        subject.persist(proxies)\n        expect(Proxy::Node.first.id).not_to eq persisted_proxy.id\n      end\n    end\n\n    context 'invalid collection' do\n      let(:proxies) do\n        [\n          { host: '127.0.0.1', port: 3000, country: 'Russia' },\n          { host: nil, port: 3000, country: 'Russia' }\n        ]\n      end\n\n      it 'does not persist collection' do\n        expect do\n          subject.persist(proxies)\n        end.not_to change(Proxy::Node, :count)\n      end\n\n      it 'contains old proxy', disable_transaction: true, pending: 'Find out why transaction does not work' do\n        subject.persist(proxies)\n        expect(Proxy::Node.first.host).to eq persisted_proxy.host\n      end\n\n      it 'contains only old proxy' do\n        subject.persist(proxies)\n        expect(Proxy::Node.count).to eq 1\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "spec/services/proxy/updater_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Proxy::Updater do\n  describe '.update' do\n    let(:fetcher_class) { double('fetcher_class') }\n    let(:proxies) { [] }\n    subject { described_class }\n\n    before do\n      expect(fetcher_class).to receive(:fetch).and_return(proxies)\n    end\n\n    it 'gets proxies from fetcher' do\n      subject.update(fetcher_class)\n    end\n\n    it 'persists proxies collection' do\n      expect(Proxy::Repository).to receive(:persist).with(proxies)\n      subject.update(fetcher_class)\n    end\n  end\nend\n"
  },
  {
    "path": "spec/services/referrer/reward_calculator_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Referrer::RewardCalculator do\n  let(:payment) { create(:payment, amount: 100) }\n  subject { described_class.new(payment) }\n\n  describe '#amount' do\n    before do\n      allow_any_instance_of(described_class).to receive(:percent).and_return(10)\n    end\n\n    it 'returns 10% of payment' do\n      expect(subject.amount).to eq 10\n    end\n  end\nend\n"
  },
  {
    "path": "spec/services/referrer/rewarder_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Referrer::Rewarder do\n  let(:amount) { 10 }\n  let(:referrer) { create(:user) }\n\n  before do\n    withdrawal.user.update(referrer_id: referrer.id)\n  end\n\n  context 'withdrawal present' do\n    let(:withdrawal) { create(:withdrawal) }\n\n    it 'creates new reward' do\n      expect do\n        described_class.add_funds(withdrawal, amount)\n      end.to change(Referrer::Reward, :count).by(1)\n    end\n\n    describe 'fields' do\n      before do\n        @reward = described_class.add_funds(withdrawal, amount)\n      end\n\n      it 'assigns amount to reward' do\n        expect(@reward.amount).to eq amount\n      end\n\n      it 'assigns referrer_id' do\n        expect(@reward.referrer_id).to eq referrer.id\n      end\n\n      it 'assigns operation_id' do\n        expect(@reward.operation_id).to eq withdrawal.id\n      end\n    end\n  end\n\n  context 'withdrawal invalid' do\n    let(:user) { create(:user) }\n    let(:withdrawal) { Withdrawal.create(user: user) }\n\n    it 'does not create reward' do\n      expect do\n        described_class.add_funds(withdrawal, amount)\n      end.not_to change(Referrer::Reward, :count)\n    end\n  end\nend\n"
  },
  {
    "path": "spec/services/server_config_builder_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'rails_helper'\n\ndescribe ServerConfigBuilder do\n  let(:client_crt) do\n    <<~TEXT\n      Certificate:\n          Data:\n              Version: 3 (0x2)\n              Serial Number: 2 (0x2)\n          Signature Algorithm: sha256WithRSAEncryption\n              Issuer: C=US, ST=CA, L=SanFrancisco, O=Fort-Funston, OU=MyOrganizationalUnit, CN=Fort-Funston CA/name=EasyRSA/emailAddress=me@myhost.mydomain\n              Validity\n                  Not Before: Jan 26 22:04:28 2019 GMT\n                  Not After : Jan 23 22:04:28 2029 GMT\n              Subject: C=US, ST=CA, L=SanFrancisco, O=Fort-Funston, OU=MyOrganizationalUnit, CN=generic_client/name=EasyRSA/emailAddress=me@myhost.mydomain\n              Subject Public Key Info:\n                  Public Key Algorithm: rsaEncryption\n                      Public-Key: (2048 bit)\n                      Modulus:\n                          00:99:0a:dc:67:1e:be:44:4d:e4:8b:81:d1:8d:79:\n                          78:b2:ac:40:33:a0:c3:7d:58:15:b6:4a:79:4c:2e:\n                          49:51:59:93:a8:62:25:4a:3c:a1:6b:41:dd:a6:50:\n                          42:48:e4:81:8f:ad:69:1a:e0:cc:19:c3:48:57:8f:\n                          78:81:c4:b9:62:aa:16:41:81:a0:b4:b3:b1:32:ea:\n                          ed:63:ae:f1:36:bc:1c:1f:f1:7e:d6:91:4c:8d:ce:\n                          44:28:ce:2f:28:47:39:d3:18:af:a3:06:43:9c:5a:\n                          9c:2d:72:74:63:e8:0b:5d:e6:f4:69:e1:35:44:35:\n                          11:c3:9b:12:5e:6f:bf:ff:61:fe:e9:25:36:23:e4:\n                          07:8a:36:f2:5b:89:ad:ff:68:5d:8c:64:64:3a:a0:\n                          8f:b3:00:68:6f:2e:0f:33:97:dd:5a:bb:db:e4:1b:\n                          da:c8:a1:92:1b:63:ad:ef:d5:0a:d6:03:b1:e9:47:\n                          6b:1a:a7:66:8a:dc:5c:ec:34:13:26:23:a2:53:0b:\n                          b7:ab:81:0e:33:01:05:a1:ba:7a:f5:ac:40:e2:6f:\n                          71:03:e1:15:78:c1:fa:38:63:9a:9b:31:17:ba:ae:\n                          cd:8d:48:c0:c2:c2:4f:be:9c:a0:e9:da:a1:3c:58:\n                          fb:41:3b:5b:56:2b:d3:df:3b:17:f6:e0:8b:30:3d:\n                          5d:43\n                      Exponent: 65537 (0x10001)\n              X509v3 extensions:\n                  X509v3 Basic Constraints:\n                      CA:FALSE\n                  Netscape Comment:\n                      Easy-RSA Generated Certificate\n                  X509v3 Subject Key Identifier:\n                      17:22:D1:25:1E:43:17:EB:C1:BC:15:8B:71:FD:3F:D7:1D:C5:51:6A\n                  X509v3 Authority Key Identifier:\n                      keyid:D2:E4:5E:A6:C1:BF:3C:B6:08:9F:F6:D4:03:01:65:DA:15:15:BB:05\n                      DirName:/C=US/ST=CA/L=SanFrancisco/O=Fort-Funston/OU=MyOrganizationalUnit/CN=Fort-Funston CA/name=EasyRSA/emailAddress=me@myhost.mydomain\n                      serial:DD:35:58:BD:F0:5D:98:97\n\n                  X509v3 Extended Key Usage:\n                      TLS Web Client Authentication\n                  X509v3 Key Usage:\n                      Digital Signature\n                  X509v3 Subject Alternative Name:\n                      DNS:generic_client\n          Signature Algorithm: sha256WithRSAEncryption\n               32:26:9c:f4:43:cf:24:1f:e0:0f:4b:e0:d8:cf:c9:90:63:db:\n               c6:ab:cb:b5:43:d3:ed:f0:09:66:1b:15:9f:1f:ac:45:32:b3:\n               5e:7b:fa:94:e0:cb:49:49:d3:31:c6:5a:c2:00:17:dd:46:0e:\n               79:4a:bf:51:5f:e6:76:58:b6:20:8c:8e:fa:f2:58:57:b5:43:\n               07:87:97:f2:38:3c:12:e7:32:74:db:41:fb:d4:42:d8:3b:31:\n               a1:84:ca:72:dd:57:91:db:10:77:e3:c3:cd:e8:3d:30:d2:f5:\n               a1:21:74:e1:26:5b:bc:ee:d9:29:8d:f7:51:98:e2:40:16:14:\n               e1:d9:1f:c0:aa:18:09:83:c7:79:91:34:5c:79:c3:e3:b2:c4:\n               48:62:70:01:f9:3f:af:f9:f7:4c:2c:0d:11:87:e5:fa:4e:15:\n               36:c2:b8:c7:16:80:c7:fb:ea:21:1b:a2:43:ac:01:3a:81:ae:\n               fe:85:c3:44:8c:74:ce:96:37:d6:33:97:55:ca:9b:8c:9b:9c:\n               82:1a:ff:f7:6e:da:a7:a2:af:af:2c:fc:55:1c:47:65:99:95:\n               1a:30:70:27:8d:cc:da:b0:cd:57:3e:0e:b4:70:85:19:dd:1b:\n               83:e4:3d:5e:49:21:8c:b5:86:a4:bb:23:92:31:cb:e8:ac:05:\n               b7:0b:37:fb\n      -----BEGIN CERTIFICATE-----\n      MIIFcjCCBFqgAwIBAgIBAjANBgkqhkiG9w0BAQsFADCBtjELMAkGA1UEBhMCVVMx\n      CzAJBgNVBAgTAkNBMRUwEwYDVQQHEwxTYW5GcmFuY2lzY28xFTATBgNVBAoTDEZv\n      cnQtRnVuc3RvbjEdMBsGA1UECxMUTXlPcmdhbml6YXRpb25hbFVuaXQxGDAWBgNV\n      BAMTD0ZvcnQtRnVuc3RvbiBDQTEQMA4GA1UEKRMHRWFzeVJTQTEhMB8GCSqGSIb3\n      DQEJARYSbWVAbXlob3N0Lm15ZG9tYWluMB4XDTE5MDEyNjIyMDQyOFoXDTI5MDEy\n      MzIyMDQyOFowgbUxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTEVMBMGA1UEBxMM\n      U2FuRnJhbmNpc2NvMRUwEwYDVQQKEwxGb3J0LUZ1bnN0b24xHTAbBgNVBAsTFE15\n      T3JnYW5pemF0aW9uYWxVbml0MRcwFQYDVQQDFA5nZW5lcmljX2NsaWVudDEQMA4G\n      A1UEKRMHRWFzeVJTQTEhMB8GCSqGSIb3DQEJARYSbWVAbXlob3N0Lm15ZG9tYWlu\n      MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmQrcZx6+RE3ki4HRjXl4\n      sqxAM6DDfVgVtkp5TC5JUVmTqGIlSjyha0HdplBCSOSBj61pGuDMGcNIV494gcS5\n      YqoWQYGgtLOxMurtY67xNrwcH/F+1pFMjc5EKM4vKEc50xivowZDnFqcLXJ0Y+gL\n      Xeb0aeE1RDURw5sSXm+//2H+6SU2I+QHijbyW4mt/2hdjGRkOqCPswBoby4PM5fd\n      Wrvb5BvayKGSG2Ot79UK1gOx6UdrGqdmitxc7DQTJiOiUwu3q4EOMwEFobp69axA\n      4m9xA+EVeMH6OGOamzEXuq7NjUjAwsJPvpyg6dqhPFj7QTtbVivT3zsX9uCLMD1d\n      QwIDAQABo4IBiDCCAYQwCQYDVR0TBAIwADAtBglghkgBhvhCAQ0EIBYeRWFzeS1S\n      U0EgR2VuZXJhdGVkIENlcnRpZmljYXRlMB0GA1UdDgQWBBQXItElHkMX68G8FYtx\n      /T/XHcVRajCB6wYDVR0jBIHjMIHggBTS5F6mwb88tgif9tQDAWXaFRW7BaGBvKSB\n      uTCBtjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRUwEwYDVQQHEwxTYW5GcmFu\n      Y2lzY28xFTATBgNVBAoTDEZvcnQtRnVuc3RvbjEdMBsGA1UECxMUTXlPcmdhbml6\n      YXRpb25hbFVuaXQxGDAWBgNVBAMTD0ZvcnQtRnVuc3RvbiBDQTEQMA4GA1UEKRMH\n      RWFzeVJTQTEhMB8GCSqGSIb3DQEJARYSbWVAbXlob3N0Lm15ZG9tYWluggkA3TVY\n      vfBdmJcwEwYDVR0lBAwwCgYIKwYBBQUHAwIwCwYDVR0PBAQDAgeAMBkGA1UdEQQS\n      MBCCDmdlbmVyaWNfY2xpZW50MA0GCSqGSIb3DQEBCwUAA4IBAQAyJpz0Q88kH+AP\n      S+DYz8mQY9vGq8u1Q9Pt8AlmGxWfH6xFMrNee/qU4MtJSdMxxlrCABfdRg55Sr9R\n      X+Z2WLYgjI768lhXtUMHh5fyODwS5zJ020H71ELYOzGhhMpy3VeR2xB348PN6D0w\n      0vWhIXThJlu87tkpjfdRmOJAFhTh2R/AqhgJg8d5kTRcecPjssRIYnAB+T+v+fdM\n      LA0Rh+X6ThU2wrjHFoDH++ohG6JDrAE6ga7+hcNEjHTOljfWM5dVypuMm5yCGv/3\n      btqnoq+vLPxVHEdlmZUaMHAnjczasM1XPg60cIUZ3RuD5D1eSSGMtYakuyOSMcvo\n      rAW3Czf7\n      -----END CERTIFICATE-----\n\n    TEXT\n  end\n  let(:result_config) do\n    <<~TEXT\n      client\n\n      dev tun\n\n      proto udp\n\n      remote localhost 443\n\n      resolv-retry infinite\n      nobind\n      persist-key\n      persist-tun\n      reneg-sec 0\n\n      auth-user-pass\n      comp-lzo\n\n      <ca>\n      Some super CA key\n      </ca>\n\n      <cert>\n      -----BEGIN CERTIFICATE-----\n      MIIFcjCCBFqgAwIBAgIBAjANBgkqhkiG9w0BAQsFADCBtjELMAkGA1UEBhMCVVMx\n      CzAJBgNVBAgTAkNBMRUwEwYDVQQHEwxTYW5GcmFuY2lzY28xFTATBgNVBAoTDEZv\n      cnQtRnVuc3RvbjEdMBsGA1UECxMUTXlPcmdhbml6YXRpb25hbFVuaXQxGDAWBgNV\n      BAMTD0ZvcnQtRnVuc3RvbiBDQTEQMA4GA1UEKRMHRWFzeVJTQTEhMB8GCSqGSIb3\n      DQEJARYSbWVAbXlob3N0Lm15ZG9tYWluMB4XDTE5MDEyNjIyMDQyOFoXDTI5MDEy\n      MzIyMDQyOFowgbUxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTEVMBMGA1UEBxMM\n      U2FuRnJhbmNpc2NvMRUwEwYDVQQKEwxGb3J0LUZ1bnN0b24xHTAbBgNVBAsTFE15\n      T3JnYW5pemF0aW9uYWxVbml0MRcwFQYDVQQDFA5nZW5lcmljX2NsaWVudDEQMA4G\n      A1UEKRMHRWFzeVJTQTEhMB8GCSqGSIb3DQEJARYSbWVAbXlob3N0Lm15ZG9tYWlu\n      MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmQrcZx6+RE3ki4HRjXl4\n      sqxAM6DDfVgVtkp5TC5JUVmTqGIlSjyha0HdplBCSOSBj61pGuDMGcNIV494gcS5\n      YqoWQYGgtLOxMurtY67xNrwcH/F+1pFMjc5EKM4vKEc50xivowZDnFqcLXJ0Y+gL\n      Xeb0aeE1RDURw5sSXm+//2H+6SU2I+QHijbyW4mt/2hdjGRkOqCPswBoby4PM5fd\n      Wrvb5BvayKGSG2Ot79UK1gOx6UdrGqdmitxc7DQTJiOiUwu3q4EOMwEFobp69axA\n      4m9xA+EVeMH6OGOamzEXuq7NjUjAwsJPvpyg6dqhPFj7QTtbVivT3zsX9uCLMD1d\n      QwIDAQABo4IBiDCCAYQwCQYDVR0TBAIwADAtBglghkgBhvhCAQ0EIBYeRWFzeS1S\n      U0EgR2VuZXJhdGVkIENlcnRpZmljYXRlMB0GA1UdDgQWBBQXItElHkMX68G8FYtx\n      /T/XHcVRajCB6wYDVR0jBIHjMIHggBTS5F6mwb88tgif9tQDAWXaFRW7BaGBvKSB\n      uTCBtjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRUwEwYDVQQHEwxTYW5GcmFu\n      Y2lzY28xFTATBgNVBAoTDEZvcnQtRnVuc3RvbjEdMBsGA1UECxMUTXlPcmdhbml6\n      YXRpb25hbFVuaXQxGDAWBgNVBAMTD0ZvcnQtRnVuc3RvbiBDQTEQMA4GA1UEKRMH\n      RWFzeVJTQTEhMB8GCSqGSIb3DQEJARYSbWVAbXlob3N0Lm15ZG9tYWluggkA3TVY\n      vfBdmJcwEwYDVR0lBAwwCgYIKwYBBQUHAwIwCwYDVR0PBAQDAgeAMBkGA1UdEQQS\n      MBCCDmdlbmVyaWNfY2xpZW50MA0GCSqGSIb3DQEBCwUAA4IBAQAyJpz0Q88kH+AP\n      S+DYz8mQY9vGq8u1Q9Pt8AlmGxWfH6xFMrNee/qU4MtJSdMxxlrCABfdRg55Sr9R\n      X+Z2WLYgjI768lhXtUMHh5fyODwS5zJ020H71ELYOzGhhMpy3VeR2xB348PN6D0w\n      0vWhIXThJlu87tkpjfdRmOJAFhTh2R/AqhgJg8d5kTRcecPjssRIYnAB+T+v+fdM\n      LA0Rh+X6ThU2wrjHFoDH++ohG6JDrAE6ga7+hcNEjHTOljfWM5dVypuMm5yCGv/3\n      btqnoq+vLPxVHEdlmZUaMHAnjczasM1XPg60cIUZ3RuD5D1eSSGMtYakuyOSMcvo\n      rAW3Czf7\n      -----END CERTIFICATE-----\n      </cert>\n\n      <key>\n      The best client key ever\n      </key>\n    TEXT\n  end\n  let(:ca_crt) { 'Some super CA key' }\n  let(:client_key) { 'The best client key ever' }\n  let(:server) do\n    create(:server,\n           hostname: 'localhost',\n           client_crt: client_crt,\n           server_crt: ca_crt,\n           client_key: client_key)\n  end\n  subject { described_class.new(server: server) }\n\n  describe '#to_text' do\n    it 'returns expected config' do\n      expect(subject.to_text).to eq result_config\n    end\n\n    it 'returns ServerConfig text' do\n      expect(subject.to_text.class).to eq String\n    end\n\n    describe 'protocol' do\n      it 'contains protocol' do\n        expect(subject.to_text).to include server.protocol\n      end\n\n      it 'replaces old protocol' do\n        expect(subject.to_text).not_to include 'unknown_proto'\n      end\n    end\n\n    describe 'host' do\n      it 'contains host' do\n        expect(subject.to_text).to include server.hostname\n      end\n\n      it 'replaces old host' do\n        expect(subject.to_text).not_to include 'unknown_host'\n      end\n    end\n\n    describe 'port' do\n      it 'contains port' do\n        expect(subject.to_text).to include server.port.to_s\n      end\n\n      it 'replaces old port' do\n        expect(subject.to_text).not_to include 'unknown_port'\n      end\n    end\n\n    describe 'client_crt' do\n      it 'does not contain certificate information' do\n        expect(subject.to_text).not_to include 'Signature Algorithm: sha256WithRSAEncryption'\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "spec/services/unpaid_users_notificator_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe UnpaidUsersNotificator do\n  subject { described_class.new }\n\n  describe '#notify_all' do\n    before do\n      3.times do\n        create(:user, can_not_withdraw_counter: described_class::FAILED_WITHDRAWS)\n      end\n      create(:user, can_not_withdraw_counter: described_class::FAILED_WITHDRAWS + 1)\n      create(:user, can_not_withdraw_counter: described_class::FAILED_WITHDRAWS - 1)\n      create(:user)\n      user = create(:user_with_balance, can_not_withdraw_counter: described_class::FAILED_WITHDRAWS)\n      create(:withdrawal, user: user)\n    end\n\n    it 'creates notification job for each unpaid user' do\n      expect do\n        subject.notify_all\n      end.to change(UnpaidUserNotificationWorker.jobs, :count).by(3)\n    end\n  end\nend\n"
  },
  {
    "path": "spec/services/withdrawal_amount_calculator_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe WithdrawalAmountCalculator do\n  let(:user) { create(:user) }\n  let(:calculator) { described_class.new(user) }\n\n  describe 'intialization' do\n    subject { calculator }\n\n    it 'assigns user accessor' do\n      expect(subject.user).to eq user\n    end\n  end\n\n  describe '#amount_to_withdraw' do\n    subject { calculator.amount_to_withdraw }\n\n    it 'returns base plan price' do\n      expect(subject).to eq user.plan.price\n    end\n\n    context 'promo exists' do\n      let(:discount_promo) { create(:active_promo, date_from: 1.week.ago, date_to: 1.week.from_now, attrs: { discount_percent: 30 }) }\n\n      before do\n        create(:promotion, user: user, promo: discount_promo)\n        user.plan.update(price: 100)\n      end\n\n      it 'applyes promo to base amount' do\n        expect(subject.to_f).to eq 70\n      end\n\n      context 'options exist' do\n        let!(:option_one) { create(:active_option) }\n        let!(:option_two) { create(:active_option) }\n\n        before do\n          prices = { option_one.code => 70, option_two.code => 30 }\n          user.plan.update(option_prices: prices)\n\n          user.plan.options << option_one\n          user.plan.options << option_two\n\n          user.options << option_one\n          user.options << option_two\n        end\n\n        it 'applyes promo to total amount' do\n          expect(subject).to eq 140\n        end\n      end\n\n      context 'multiple promotions' do\n        let(:second_discount_promo) { create(:active_promo, date_from: 1.week.ago, date_to: 1.week.from_now, attrs: { discount_percent: 10 }) }\n        before do\n          create(:promotion, user: user, promo: second_discount_promo)\n        end\n\n        it 'applyes all promotions' do\n          expect(subject.to_f).to eq 63\n        end\n      end\n    end\n\n    context 'no promos' do\n      context 'options exist' do\n        let(:user) { create(:user_with_balance) }\n        let!(:option_one) { create(:active_option) }\n        let!(:option_two) { create(:active_option) }\n\n        before do\n          prices = { option_one.code => 10, option_two.code => 15 }\n          user.plan.update(option_prices: prices)\n\n          user.plan.options << option_one\n          user.plan.options << option_two\n\n          user.options << option_one\n          user.options << option_two\n        end\n\n        it 'adds option price to base plan price' do\n          plan = user.plan\n          expect(subject).to eq (plan.price + 25)\n        end\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "spec/services/withdrawer_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'spec_helper'\n\ndescribe Withdrawer do\n  subject { described_class }\n  let!(:paid_client) { create :user_with_balance }\n  let!(:new_client) { create :user_with_balance }\n  let!(:non_paid_client) { create :user_with_balance }\n\n  before do\n    create :withdrawal, user: paid_client\n\n    old_withdrawal = create :withdrawal, user: non_paid_client\n    old_withdrawal.update(created_at: 2.month.ago)\n  end\n\n  describe '.mass_withdrawal' do\n    let!(:non_paid_clients_number) { User.non_paid_users.size }\n\n    it 'creates withdrawal for each non paid client' do\n      expect do\n        subject.mass_withdrawal\n      end.to change(Withdrawal, :count).by(non_paid_clients_number)\n    end\n  end\n\n  describe '.single_withdraw' do\n    context 'user is unpaid' do\n      context 'user has enough funds' do\n        let!(:user) { create :user_with_balance }\n\n        it 'creates withdraw' do\n          expect do\n            subject.single_withdraw(user)\n          end.to change(Withdrawal, :count).by(1)\n        end\n\n        it 'gets withdrawal sum from calculator' do\n          allow_any_instance_of(WithdrawalAmountCalculator).to receive(:amount_to_withdraw).and_return(10)\n          subject.single_withdraw(user)\n        end\n\n        it 'tries to create withdrawal' do\n          allow_any_instance_of(WithdrawalAmountCalculator).to receive(:add_funds_to_referrer)\n          subject.single_withdraw(user)\n        end\n\n        context 'user has unsuccessfult attempts to withdraw funds' do\n          before { user.update(can_not_withdraw_counter: 1) }\n\n          it 'resets the counter' do\n            expect do\n              subject.single_withdraw(user)\n            end.to change(user.reload, :can_not_withdraw_counter).to(0)\n          end\n        end\n      end\n\n      context 'user has not funds' do\n        context 'first attempt to withdraw funds' do\n          let(:user) { create :user }\n\n          it 'notifies user by email' do\n            expect do\n              subject.single_withdraw(user)\n            end.to change(CanNotWithdrawNotificationWorker.jobs, :size).by(1)\n          end\n        end\n\n        context 'following attempt to withdraw' do\n          let(:user) { create :user, can_not_withdraw_counter: 1 }\n\n          it 'increments counter', disable_transaction: true do\n            subject.single_withdraw(user)\n            expect(user.reload.can_not_withdraw_counter).to eq 2\n          end\n\n          it 'does not send mail' do\n            expect do\n              subject.single_withdraw(user)\n            end.not_to change(CanNotWithdrawNotificationWorker.jobs, :size)\n          end\n        end\n      end\n    end\n\n    context 'user is paid' do\n      let(:user) { create :user_with_balance }\n      before { create(:withdrawal, user: user, plan: user.plan) }\n\n      it 'does not create withdrawal' do\n        expect do\n          subject.single_withdraw(user)\n        end.not_to change(Withdrawal, :count)\n      end\n\n      it 'does not notify user' do\n        expect do\n          subject.single_withdraw(user)\n        end.not_to change(CanNotWithdrawNotificationWorker.jobs, :size)\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "spec/shared_examples/admin_controller_access_spec_shared.rb",
    "content": "# frozen_string_literal: true\n\nshared_examples 'requires admin access' do |method, action, params|\n  context 'is admin' do\n    login_user\n\n    it 'does not allow to be accessed by user' do\n      send(method, action, params)\n      expect(response).to redirect_to new_admin_session_path\n    end\n  end\nend\n"
  },
  {
    "path": "spec/shared_examples/api_call_controller_validation_shared.rb",
    "content": "# frozen_string_literal: true\n\nshared_examples 'validating signature' do |action| # rubocop:disable Metrics/BlockLength\n  describe 'request validation' do # rubocop:disable Metrics/BlockLength\n    let(:server) { create(:server) }\n    let(:hostname) { server.hostname }\n    let(:attrs) { Hash[hostname: hostname] }\n\n    describe 'server hostname' do\n      context 'when does not exist' do\n        let(:hostname) { 'non_existing_hostname' }\n\n        it 'raises error' do\n          expect do\n            post action, attrs\n          end.to raise_error ApiException, 'Server not found'\n        end\n      end\n    end\n\n    describe 'server status' do\n      context 'when pending' do\n        it 'raises error' do\n          expect do\n            post action, attrs\n          end.to raise_error ApiException, 'Server not active'\n        end\n      end\n\n      context 'when disabled' do\n        let(:server) { create(:disabled_server) }\n\n        it 'raises error' do\n          expect do\n            post action, attrs\n          end.to raise_error ApiException, 'Server not active'\n        end\n      end\n    end\n\n    describe 'signature' do\n      let(:server) { create(:active_server) }\n\n      context 'when incorrect' do\n        let(:attrs) do\n          {\n            hostname: server.hostname,\n            signature: 'incorrect_auth_key'\n          }\n        end\n\n        it 'raises error' do\n          expect do\n            post action, attrs\n          end.to raise_error ApiException, 'Invalid api call'\n        end\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "spec/shared_examples/dashboard_total_statistics_shared.rb",
    "content": "# frozen_string_literal: true\n\nshared_examples 'total statistics result' do |amount|\n  it 'is a hash' do\n    expect(subject.class).to eq Hash\n  end\n\n  it 'not empty' do\n    expect(subject.size).not_to eq 0\n  end\n\n  describe 'total amount' do\n    it 'is not zero' do\n      expect(subject[:total]).to eq amount\n    end\n  end\nend\n\nshared_examples 'total statistics discrete result' do |class_name|\n  describe 'discrete values' do\n    it 'is an array' do\n      expect(subject[:discrete].class).to eq Array\n    end\n\n    it 'size equals discrete days number plus today' do\n      expect(subject[:discrete].size).to eq(class_name::DISCRETE_DAYS_NUMBER + 1)\n    end\n  end\nend\n"
  },
  {
    "path": "spec/shared_examples/has_success_and_fail_responders_shared.rb",
    "content": "# frozen_string_literal: true\n\nshared_examples 'has success and fail responders' do\n  describe 'GET #success' do\n    before { get :success }\n\n    it 'redirects to root billing path' do\n      expect(subject).to redirect_to billing_root_path\n    end\n  end\n\n  describe 'GET #fail' do\n    before { get :fail }\n\n    it 'redirects to root billing path' do\n      expect(subject).to redirect_to billing_root_path\n    end\n  end\nend\n"
  },
  {
    "path": "spec/shared_examples/last_days_filterable_shared.rb",
    "content": "# frozen_string_literal: true\n\nshared_examples 'loads created by last days' do |model_name|\n  let!(:record1) { create(model_name) }\n  let!(:record2) { create(model_name) }\n  let!(:record3) { create(model_name, created_at: 12.days.ago) }\n\n  describe 'loads all records created in selected range' do\n    subject { model_name.to_s.classify.constantize.in_days(days_number) }\n\n    context 'range is one week' do\n      let(:days_number) { 7 }\n\n      it 'returns first record' do\n        expect(subject).to include record1\n      end\n\n      it 'returns second record' do\n        expect(subject).to include record2\n      end\n\n      it 'contains two records' do\n        expect(subject.size).to eq 2\n      end\n    end\n\n    context 'range is 20 days' do\n      let(:days_number) { 20 }\n\n      it 'returns first record' do\n        expect(subject).to include record1\n      end\n\n      it 'returns second record' do\n        expect(subject).to include record2\n      end\n\n      it 'returns third record' do\n        expect(subject).to include record3\n      end\n\n      it 'contains three records' do\n        expect(subject.size).to eq 3\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "spec/shared_examples/payment_submit_spec_shared.rb",
    "content": "# frozen_string_literal: true\n\nshared_examples 'creates payment for pay system' do |pay_system_code|\n  describe 'new payment' do\n    let!(:pay_system) { create(:enabled_pay_system, code: pay_system_code) }\n\n    before do\n      sign_in\n      visit('/billing/payments')\n      click_link pay_system.name\n    end\n\n    it 'has payment form' do\n      expect(page).to have_selector 'form#new_payment'\n    end\n\n    context 'payment submitted' do\n      before do\n        click_button I18n.t('billing.payments.new.submit')\n      end\n\n      it 'finish payment page' do\n        expect(page).to have_content I18n.t('billing.payments.merchant.payment_finalization')\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "spec/shared_examples/validates_paysystem_enabled_shared.rb",
    "content": "# frozen_string_literal: true\n\nshared_examples 'validating pay_system state' do |action, payment_id_key|\n  describe 'pay_system state validation' do\n    context 'if pay system is disabled' do\n      let(:pay_system) { create(:pay_system) }\n      let(:payment) { create(:payment, pay_system: pay_system) }\n\n      it 'raises error' do\n        expect do\n          post action, payment_id_key => payment.id\n        end.to raise_error BillingException\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "spec/spec_helper.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'simplecov'\nSimpleCov.start\n\nENV['RAILS_ENV'] ||= 'test'\nrequire File.expand_path('../config/environment', __dir__)\nrequire 'rspec/rails'\nrequire 'capybara/rails'\nrequire 'capybara/rspec'\nrequire 'capybara/email/rspec'\nrequire 'shoulda-matchers'\nrequire 'sidekiq/testing'\nrequire 'aasm/rspec'\nSidekiq::Testing.fake!\n\nDir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }\nDir[Rails.root.join('app/helpers/**/*.rb')].each { |f| require f }\nDir[Rails.root.join('spec/shared_examples/*.rb')].each { |f| require f }\n\nCapybara.server = :webrick, { Silent: true }\nCapybara.register_driver :chrome_headless do |app|\n  options = ::Selenium::WebDriver::Chrome::Options.new\n\n  options.add_argument('--headless')\n  options.add_argument('--no-sandbox')\n  options.add_argument('--disable-gpu')\n\n  Capybara::Selenium::Driver.new(app, browser: :chrome, options: options)\nend\n\nCapybara.javascript_driver = :chrome_headless\n\nI18n.available_locales = %i[ru en]\n\nZonebie.set_random_timezone\nFakeWeb.allow_net_connect = false\nActiveRecord::Migration.check_pending! if defined?(ActiveRecord::Migration)\n\nRSpec.configure do |config|\n  Shoulda::Matchers.configure do |shoulda_config|\n    shoulda_config.integrate do |with|\n      with.test_framework :rspec\n\n      with.library :active_record\n      with.library :active_model\n      with.library :action_controller\n    end\n  end\n\n  config.fixture_path = \"#{::Rails.root}/spec/fixtures\"\n  config.use_transactional_fixtures = false\n  config.infer_base_class_for_anonymous_controllers = false\n  config.order = 'random'\n  config.infer_spec_type_from_file_location!\n\n  config.include ApplicationHelper, type: :feature\n  config.include Devise::Test::ControllerHelpers, type: :controller\n  config.include FactoryGirl::Syntax::Methods\n  config.include Requests::JsonHelpers, type: :controller\n  config.extend  Requests::ControllerMacros, type: :controller\n\n  config.before(:suite) do\n    DatabaseCleaner.strategy = :transaction\n  end\n\n  config.before(:each) do |example|\n    DatabaseCleaner.strategy = if example.metadata[:disable_transaction]\n                                 :truncation\n                               else\n                                 :transaction\n                               end\n    DatabaseCleaner.start\n\n    # freeze locale for each test\n    I18n.locale = :en\n  end\n\n  config.before(:each, type: :feature) do\n    # For capybara tests fill redis courses, so as not to try to pull them from an internet\n    redis = Redis.new\n    redis.set('smartvpn:eur_usd', 10)\n    redis.set('smartvpn:rub_usd', 10)\n\n    FakeWeb.allow_net_connect = true\n  end\n\n  config.after(:each) do\n    DatabaseCleaner.clean\n  end\nend\n"
  },
  {
    "path": "spec/support/capybara_helper.rb",
    "content": "# frozen_string_literal: true\n\ndef visit_sign_in_page\n  visit('/users/sign_in')\nend\n\ndef sign_in(user = nil, password = nil)\n  password ||= 'password'\n  @user = user || create(:user, password: password)\n\n  visit_sign_in_page\n  within('form#new_user') do\n    fill_in 'user_email', with: @user.email\n    fill_in 'user_password', with: password\n  end\n  click_button I18n.t('main.auth.sign_in')\nend\n\ndef last_email\n  ActionMailer::Base.deliveries.last\nend\n\ndef extract_token_from_email(token_name, current_email)\n  mail_body = current_email.body.to_s\n  mail_body[/#{token_name.to_s}=([^\"]+)/, 1]\nend\n\ndef sign_in_admin\n  admin = create(:admin, email: 'admin@smartvpn.biz', password: '1234567')\n  visit('/admins/sign_in')\n  within('form#new_admin') do\n    fill_in 'admin_email', with: admin.email\n    fill_in 'admin_password', with: '1234567'\n  end\n  click_button I18n.t('admins.sessions.new.sign_in')\nend\n"
  },
  {
    "path": "spec/support/controller_macros.rb",
    "content": "# frozen_string_literal: true\n\nmodule Requests\n  module ControllerMacros\n    def login_admin\n      before(:each) do\n        @request.env['devise.mapping'] = Devise.mappings[:admin]\n        sign_in FactoryGirl.create(:admin)\n      end\n    end\n\n    def login_user\n      before(:each) do\n        @request.env['devise.mapping'] = Devise.mappings[:user]\n        @user = FactoryGirl.create(:user)\n        sign_in @user\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "spec/support/json_helpers.rb",
    "content": "# frozen_string_literal: true\n\nmodule Requests\n  module JsonHelpers\n    def json\n      @json ||= JSON.parse(response.body)\n    end\n  end\nend\n"
  },
  {
    "path": "spec/support/matchers/json_matchers.rb",
    "content": "# frozen_string_literal: true\n\nRSpec::Matchers.define :be_json do |_expected|\n  match do |actual|\n    actual.headers['Content-Type'].include?('application/json')\n  end\nend\n"
  },
  {
    "path": "spec/workers/create_user_mail_worker_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'rails_helper'\n\ndescribe CreateUserMailWorker do\n  subject { described_class.new }\n\n  context '#perform' do\n    let(:user) { create(:user) }\n    let(:server) { create(:server) }\n    let!(:plan) { create(:plan, users: [user], servers: [server]) }\n    let(:mailer) { double }\n\n    it 'notifies user by email' do\n      expect { subject.perform(user.id) }.to change(ActionMailer::Base.deliveries, :count).by(1)\n    end\n\n    it 'will be run mail to user' do\n      expect(UserConnectionConfigMailer)\n        .to receive(:notify)\n        .with(user: user).and_return(mailer)\n      allow(mailer).to receive(:deliver_now)\n      subject.perform(user.id)\n    end\n  end\nend\n"
  },
  {
    "path": "spec/workers/refresh_proxy_list_worker_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'rails_helper'\n\ndescribe RefreshProxyListWorker do\n  subject { described_class.new }\n\n  context '#perform' do\n    let(:adapter) { Proxy::Fetchers::FreeProxyListNet::WebParser }\n\n    before { allow(Proxy::Updater).to receive(:update) }\n\n    it 'executes Proxy::Updater.update once with correct params' do\n      subject.perform\n      expect(Proxy::Updater).to have_received(:update).once.with(adapter)\n    end\n  end\nend\n"
  },
  {
    "path": "spec/workers/update_cources_worker_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'rails_helper'\n\ndescribe UpdateCoursesWorker do\n  subject { described_class.new }\n\n  context '#perform' do\n    before { allow(Currencies::Course).to receive(:update_courses) }\n\n    it 'executes Currencies::Course.update_courses once with correct params' do\n      subject.perform\n      expect(Currencies::Course).to have_received(:update_courses).once\n    end\n  end\nend\n"
  },
  {
    "path": "spec/workers/withdrawals_worker_spec.rb",
    "content": "# frozen_string_literal: true\n\nrequire 'rails_helper'\n\ndescribe WithdrawalsWorker do\n  subject { described_class.new }\n\n  context '#perform' do\n    let(:adapter) { Proxy::Fetchers::FreeProxyListNet::WebParser }\n\n    before do\n      allow(Withdrawer).to receive(:mass_withdrawal)\n    end\n\n    it 'executes correct methods with correct params' do\n      expect_any_instance_of(UnpaidUsersNotificator).to receive(:notify_all).once\n      subject.perform\n      expect(Withdrawer).to have_received(:mass_withdrawal).once\n    end\n  end\nend\n"
  },
  {
    "path": "vendor/assets/javascripts/.keep",
    "content": ""
  },
  {
    "path": "vendor/assets/stylesheets/.keep",
    "content": ""
  }
]