diff --git a/TotalRegistration1/nbactions.xml b/Kickoff/nbactions.xml similarity index 100% rename from TotalRegistration1/nbactions.xml rename to Kickoff/nbactions.xml diff --git a/TotalRegistration1/pom.xml b/Kickoff/pom.xml similarity index 89% rename from TotalRegistration1/pom.xml rename to Kickoff/pom.xml index a2e5046..31f0341 100644 --- a/TotalRegistration1/pom.xml +++ b/Kickoff/pom.xml @@ -1,127 +1,134 @@ - - - 4.0.0 - org.totaldev.com - TotalRegistration1 - 1.0 - jar - TotalRegistration1 - Complete SpringBoot registration application - - org.springframework.boot - spring-boot-starter-parent - 1.4.2.RELEASE - - - - - -Dfile.encoding=UTF-8 - UTF-8 - UTF-8 - 1.7 - - - - org.springframework.boot - spring-boot-starter - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-data-jpa - - - org.springframework.boot - spring-boot-starter-security - - - org.springframework.boot - spring-boot-starter-thymeleaf - - - org.springframework.boot - spring-boot-starter-mail - - - org.springframework.boot - spring-boot-starter-test - test - - - org.springframework.boot - spring-boot-configuration-processor - true - - - ch.qos.logback - logback-classic - - - org.hibernate - hibernate-validator - - - org.thymeleaf.extras - thymeleaf-extras-springsecurity4 - - - org.thymeleaf.extras - thymeleaf-extras-java8time - - - org.springframework.boot - spring-boot-starter-activemq - - - com.zaxxer - HikariCP - - - mysql - mysql-connector-java - runtime - - - org.apache.activemq - activemq-broker - - - com.fasterxml.jackson.core - jackson-databind - - - org.passay - passay - 1.2.0 - - - - - - org.springframework.boot - spring-boot-maven-plugin - - true - - - - org.hibernate.orm.tooling - hibernate-enhance-maven-plugin - ${hibernate.version} - - - - true - - - enhance - - - - - - - + + + 4.0.0 + org.totaldev.com + Kickoff + 1.0 + jar + Kickoff + Complete SpringBoot registration application + + org.springframework.boot + spring-boot-starter-parent + 1.4.3.RELEASE + + + + + -Dfile.encoding=UTF-8 + UTF-8 + UTF-8 + 1.7 + 1.8 + 1.8 + + + + org.springframework.boot + spring-boot-starter + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + org.springframework.boot + spring-boot-starter-mail + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.boot + spring-boot-configuration-processor + true + + + ch.qos.logback + logback-classic + + + org.hibernate + hibernate-validator + + + org.thymeleaf.extras + thymeleaf-extras-springsecurity4 + + + org.thymeleaf.extras + thymeleaf-extras-java8time + + + org.springframework.boot + spring-boot-starter-activemq + + + com.zaxxer + HikariCP + + + mysql + mysql-connector-java + runtime + + + org.apache.activemq + activemq-broker + + + com.fasterxml.jackson.core + jackson-databind + + + org.passay + passay + 1.2.0 + + + com.github.mkopylec + recaptcha-spring-boot-starter + 1.3.7 + + + + + + org.springframework.boot + spring-boot-maven-plugin + + true + + + + org.hibernate.orm.tooling + hibernate-enhance-maven-plugin + ${hibernate.version} + + + + true + + + enhance + + + + + + + diff --git a/Kickoff/src/main/java/org/security/admin/AdminAccount.java b/Kickoff/src/main/java/org/security/admin/AdminAccount.java new file mode 100644 index 0000000..a2577e2 --- /dev/null +++ b/Kickoff/src/main/java/org/security/admin/AdminAccount.java @@ -0,0 +1,45 @@ +package org.security.admin; + +/** + * + * @author newlife + */ +public class AdminAccount { + + private String firstName; + private String lastName; + private String email; + private String password; + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } +} diff --git a/Kickoff/src/main/java/org/security/admin/AdminAccountRepository.java b/Kickoff/src/main/java/org/security/admin/AdminAccountRepository.java new file mode 100644 index 0000000..a81a05e --- /dev/null +++ b/Kickoff/src/main/java/org/security/admin/AdminAccountRepository.java @@ -0,0 +1,10 @@ +package org.security.admin; + +/** + * + * @author newlife + */ +public interface AdminAccountRepository { + + AdminAccount findByEmail(final String email); +} diff --git a/Kickoff/src/main/java/org/security/admin/AdminController.java b/Kickoff/src/main/java/org/security/admin/AdminController.java new file mode 100644 index 0000000..8769b31 --- /dev/null +++ b/Kickoff/src/main/java/org/security/admin/AdminController.java @@ -0,0 +1,19 @@ +package org.security.admin; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +/** + * + * @author newlife + */ +@Controller +@RequestMapping("/admin") +public class AdminController { + + @RequestMapping(method = RequestMethod.GET) + public String showAuth() { + return "admin/admin"; + } +} diff --git a/Kickoff/src/main/java/org/security/admin/AdminDetailsAdapter.java b/Kickoff/src/main/java/org/security/admin/AdminDetailsAdapter.java new file mode 100644 index 0000000..fed0f3c --- /dev/null +++ b/Kickoff/src/main/java/org/security/admin/AdminDetailsAdapter.java @@ -0,0 +1,62 @@ +package org.security.admin; + +import java.util.Collection; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.AuthorityUtils; +import org.springframework.security.core.userdetails.UserDetails; + +/** + * + * @author newlife + */ +public class AdminDetailsAdapter implements UserDetails { + + private final AdminAccount account; + + public AdminDetailsAdapter(AdminAccount account) { + this.account = account; + } + + public String getFirstName() { + return account.getFirstName(); + } + + public String getLastName() { + return account.getLastName(); + } + + @Override + public Collection getAuthorities() { + return AuthorityUtils.createAuthorityList("ROLE_MEMBER", "ROLE_ADMIN"); + } + + @Override + public String getUsername() { + return account.getEmail(); + } + + @Override + public String getPassword() { + return account.getPassword(); + } + + @Override + public boolean isAccountNonExpired() { + return true; + } + + @Override + public boolean isAccountNonLocked() { + return true; + } + + @Override + public boolean isCredentialsNonExpired() { + return true; + } + + @Override + public boolean isEnabled() { + return true; + } +} diff --git a/Kickoff/src/main/java/org/security/admin/AdminDetailsServiceAdapter.java b/Kickoff/src/main/java/org/security/admin/AdminDetailsServiceAdapter.java new file mode 100644 index 0000000..cdea01a --- /dev/null +++ b/Kickoff/src/main/java/org/security/admin/AdminDetailsServiceAdapter.java @@ -0,0 +1,31 @@ +package org.security.admin; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Component; + +/** + * + * @author newlife + */ +@Component +public class AdminDetailsServiceAdapter implements UserDetailsService { + + @Autowired + private AdminAccountRepository adminAccountRepository; + + @Override + public UserDetails loadUserByUsername(final String username) throws UsernameNotFoundException { + + AdminAccount account = adminAccountRepository.findByEmail(username); + + if (account == null) { + throw new UsernameNotFoundException(username); + } + + return new AdminDetailsAdapter(account); + } + +} diff --git a/Kickoff/src/main/java/org/security/admin/InMemoryAccountRepository.java b/Kickoff/src/main/java/org/security/admin/InMemoryAccountRepository.java new file mode 100644 index 0000000..02664c1 --- /dev/null +++ b/Kickoff/src/main/java/org/security/admin/InMemoryAccountRepository.java @@ -0,0 +1,49 @@ +package org.security.admin; + +import java.util.ArrayList; +import java.util.List; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Repository; + +/** + * + * @author newlife + */ +@Repository +public class InMemoryAccountRepository implements AdminAccountRepository { + + private final String user; + private final String password; + + private final List accounts; + + public InMemoryAccountRepository(final @Value("${admin.email}") String user, final @Value("${admin.password}") String password) { + this.user = user; + this.password = password; + + accounts = new ArrayList<>(); + init(); + } + + private void init() { + AdminAccount account = new AdminAccount(); + account.setFirstName("-"); + account.setLastName("-"); + + account.setEmail(user); + account.setPassword(password); + accounts.add(account); + } + + @Override + public AdminAccount findByEmail(String email) { + AdminAccount result = null; + for (AdminAccount account : accounts) { + if (account.getEmail().equals(email)) { + result = account; + break; + } + } + return result; + } +} diff --git a/TotalRegistration1/src/main/java/org/security/config/JmsConfig.java b/Kickoff/src/main/java/org/security/config/JmsConfig.java similarity index 100% rename from TotalRegistration1/src/main/java/org/security/config/JmsConfig.java rename to Kickoff/src/main/java/org/security/config/JmsConfig.java diff --git a/TotalRegistration1/src/main/java/org/security/config/MainApplicationConfig.java b/Kickoff/src/main/java/org/security/config/MainApplicationConfig.java similarity index 82% rename from TotalRegistration1/src/main/java/org/security/config/MainApplicationConfig.java rename to Kickoff/src/main/java/org/security/config/MainApplicationConfig.java index 00e26ef..56b12f0 100644 --- a/TotalRegistration1/src/main/java/org/security/config/MainApplicationConfig.java +++ b/Kickoff/src/main/java/org/security/config/MainApplicationConfig.java @@ -1,20 +1,20 @@ -package org.security.config; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.autoconfigure.domain.EntityScan; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.data.jpa.repository.config.EnableJpaRepositories; -import org.springframework.transaction.annotation.EnableTransactionManagement; - -@SpringBootApplication -@ComponentScan({"org.security.*"}) -@EnableJpaRepositories("org.security.dao") -@EntityScan("org.security.model") -@EnableTransactionManagement -public class MainApplicationConfig { - - public static void main(String[] args) { - SpringApplication.run(MainApplicationConfig.class, args); - } -} +package org.security.config; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +@SpringBootApplication +@ComponentScan({"org.security.*"}) +@EnableJpaRepositories({"org.security.dao", "org.security.admin"}) +@EntityScan({"org.security.model", "org.security.admin"}) +@EnableTransactionManagement +public class MainApplicationConfig { + + public static void main(String[] args) { + SpringApplication.run(MainApplicationConfig.class, args); + } +} diff --git a/Kickoff/src/main/java/org/security/config/MultiHttpSecurityConfig.java b/Kickoff/src/main/java/org/security/config/MultiHttpSecurityConfig.java new file mode 100644 index 0000000..4bca442 --- /dev/null +++ b/Kickoff/src/main/java/org/security/config/MultiHttpSecurityConfig.java @@ -0,0 +1,130 @@ +package org.security.config; + +import javax.sql.DataSource; +import org.security.admin.AdminDetailsServiceAdapter; +import org.security.service.CurrentUserDetailsService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.annotation.Order; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.web.authentication.rememberme.JdbcTokenRepositoryImpl; +import org.springframework.security.web.authentication.rememberme.PersistentTokenRepository; + +/** + * + * @author newlife + */ +@EnableWebSecurity +@EnableGlobalMethodSecurity(prePostEnabled = true) +public class MultiHttpSecurityConfig { + + @Configuration + public static class WebSecurityConfig extends WebSecurityConfigurerAdapter { + + @Value("${number.rememberme.seconds}") + private int seconds; + + @Autowired + private DataSource dataSource; + + @Autowired + private CurrentUserDetailsService userDetailsService; + + @Override + protected void configure(HttpSecurity http) throws Exception { + + // @formatter:off + http + .formLogin().loginPage("/login").successForwardUrl("/").defaultSuccessUrl("/") + .failureUrl("/login?error").usernameParameter("email").passwordParameter("password").permitAll() + .and() + .authorizeRequests() + .antMatchers("/", "/login/**", "/pending/**", "/activate/**", + "/register/**", "/reset/**", "/newpassword/**", + "/css/**", "/js/**", "/images/**", "/fonts/**", + "/favicon.ico").permitAll() + .antMatchers("/member/**").hasAuthority("ROLE_MEMBER") + .anyRequest().fullyAuthenticated() + .and() + .logout().logoutUrl("/logout").logoutSuccessUrl("/login?logout") + .invalidateHttpSession(true).deleteCookies("JSESSIONID").permitAll() + .and() + .exceptionHandling() + .and() + .sessionManagement().maximumSessions(1).maxSessionsPreventsLogin(false) + .and() + .sessionFixation().none() + .and() + .rememberMe().tokenRepository(persistentTokenRepository()) + .userDetailsService(userDetailsService).tokenValiditySeconds(seconds) // 2 minutes + .rememberMeParameter("remember-me") + .and() + .csrf(); + // @formatter:on + } + + @Autowired + public void configureAuthentication(AuthenticationManagerBuilder auth) throws Exception { + auth + .userDetailsService(userDetailsService) + .passwordEncoder(passwordEncoder()); + } + + @Bean + public PersistentTokenRepository persistentTokenRepository() { + JdbcTokenRepositoryImpl jdbcTokenRepositoryImpl = new JdbcTokenRepositoryImpl(); + jdbcTokenRepositoryImpl.setDataSource(dataSource); + return jdbcTokenRepositoryImpl; + } + + @Bean + public BCryptPasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } + } + + @Configuration + @Order(1) + public static class AdminSecurityConfig extends WebSecurityConfigurerAdapter { + + @Autowired + private AdminDetailsServiceAdapter userDetailsService; + + @Override + protected void configure(HttpSecurity http) throws Exception { + + // @formatter:off + http + .antMatcher("/admin") + .antMatcher("/admin/**") + .formLogin().loginPage("/admin").successForwardUrl("/admin/panel").defaultSuccessUrl("/admin/panel") + .failureUrl("/admin?error").usernameParameter("email").passwordParameter("password").permitAll() + .and() + .authorizeRequests() + .antMatchers("/admin/**").hasAuthority("ROLE_ADMIN") + .anyRequest().permitAll() + .and() + .logout().logoutUrl("/admin/logout").logoutSuccessUrl("/admin?logout") + .invalidateHttpSession(true).deleteCookies("JSESSIONID").permitAll() + .and() + .exceptionHandling() + .and() + .sessionManagement().maximumSessions(1).maxSessionsPreventsLogin(true) + .and() + .sessionFixation().none(); + // @formatter:on + } + + @Autowired + public void configureAuthentication(AuthenticationManagerBuilder auth) throws Exception { + auth.userDetailsService(userDetailsService); + } + } +} diff --git a/TotalRegistration1/src/main/java/org/security/config/MvcConfig.java b/Kickoff/src/main/java/org/security/config/MvcConfig.java similarity index 63% rename from TotalRegistration1/src/main/java/org/security/config/MvcConfig.java rename to Kickoff/src/main/java/org/security/config/MvcConfig.java index 96497cf..ca439c8 100644 --- a/TotalRegistration1/src/main/java/org/security/config/MvcConfig.java +++ b/Kickoff/src/main/java/org/security/config/MvcConfig.java @@ -14,12 +14,13 @@ public class MvcConfig extends WebMvcConfigurerAdapter { @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/").setViewName("index"); - registry.addViewController("/home").setViewName("home"); - registry.addViewController("/login").setViewName("/credentials/login"); registry.addViewController("/pending").setViewName("/credentials/pending"); + registry.addViewController("/activate").setViewName("/credentials/activate"); + + // user page registry.addViewController("/member").setViewName("/pages/member"); - registry.addViewController("/admin").setViewName("/pages/admin"); - registry.addViewController("/invalid").setViewName("/error/invalid"); - registry.addViewController("/403").setViewName("/error/403"); + + // admin page + registry.addViewController("/admin/panel").setViewName("/pages/panel"); } } diff --git a/Kickoff/src/main/java/org/security/config/PingExternalResourcesConfig.java b/Kickoff/src/main/java/org/security/config/PingExternalResourcesConfig.java new file mode 100644 index 0000000..a71e7ec --- /dev/null +++ b/Kickoff/src/main/java/org/security/config/PingExternalResourcesConfig.java @@ -0,0 +1,29 @@ +package org.security.config; + +import javax.annotation.PostConstruct; +import org.security.util.Utils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; + +/** + * + * @author newlife + */ +@Configuration +public class PingExternalResourcesConfig { + + @Value("${spring.mail.host}") + private String host; + + @Value("${spring.mail.port}") + private int port; + + @PostConstruct + public void init() { + boolean pingSMTP = Utils.pingSMTPHost(host, port, port); + + if (!pingSMTP) { + throw new RuntimeException("The SMTP server is not running ..."); + } + } +} diff --git a/Kickoff/src/main/java/org/security/config/SecurityWebApplicationInitializer.java b/Kickoff/src/main/java/org/security/config/SecurityWebApplicationInitializer.java new file mode 100644 index 0000000..f06ff23 --- /dev/null +++ b/Kickoff/src/main/java/org/security/config/SecurityWebApplicationInitializer.java @@ -0,0 +1,7 @@ +package org.security.config; + +import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer; + +public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer { + +} diff --git a/TotalRegistration1/src/main/java/org/security/controller/ErrorController.java b/Kickoff/src/main/java/org/security/controller/ErrorController.java similarity index 70% rename from TotalRegistration1/src/main/java/org/security/controller/ErrorController.java rename to Kickoff/src/main/java/org/security/controller/ErrorController.java index ba0596f..3a7b95c 100644 --- a/TotalRegistration1/src/main/java/org/security/controller/ErrorController.java +++ b/Kickoff/src/main/java/org/security/controller/ErrorController.java @@ -2,6 +2,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpStatus; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ControllerAdvice; @@ -17,6 +18,9 @@ public class ErrorController { private final static Logger LOGGER = LoggerFactory.getLogger(ErrorController.class); + @Value("${org.error.code}") + private String code; + @ExceptionHandler(Throwable.class) @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) public String exception(final Throwable throwable, final Model model) { @@ -25,7 +29,9 @@ public String exception(final Throwable throwable, final Model model) { LOGGER.error("Exception during execution of application:", throwable); LOGGER.error("++++++++++++++++++++++++++++++++++++++++++"); - String errorMessage = (throwable != null ? throwable.getMessage() : "Unknown error"); + String errorMessage = (throwable != null + ? (throwable.getMessage().startsWith(code) + ? throwable.getMessage().substring(code.length() + 1) : "Unknown error. Please, tell us what just happened at org@fashion.com") : "Unknown error"); model.addAttribute("errorMessage", errorMessage); return "/error/error"; } diff --git a/Kickoff/src/main/java/org/security/controller/RegistrationController.java b/Kickoff/src/main/java/org/security/controller/RegistrationController.java new file mode 100644 index 0000000..2ae01f2 --- /dev/null +++ b/Kickoff/src/main/java/org/security/controller/RegistrationController.java @@ -0,0 +1,131 @@ +package org.security.controller; + +import com.github.mkopylec.recaptcha.validation.RecaptchaValidator; +import com.github.mkopylec.recaptcha.validation.ValidationResult; +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; +import org.security.exceptions.EmailNotFoundException; +import org.security.exceptions.TokenInvalidException; +import org.security.exceptions.UserAlreadyExistException; +import org.security.model.User; +import org.security.pojo.Email; +import org.security.pojo.NewPassword; +import org.security.service.IUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.validation.BindingResult; +import org.springframework.validation.FieldError; +import org.springframework.validation.ObjectError; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; + +/** + * + * @author newlife + */ +@Controller +public class RegistrationController { + + @Autowired + IUserService userService; + + @Autowired + private RecaptchaValidator recaptchaValidator; + + @GetMapping("/login") + public String login() { + return "credentials/login"; + } + + @GetMapping("/register") + public String registrationShow(final User user) { + return "/credentials/register"; + } + + @PostMapping("/register") + public String registrationPerform(HttpServletRequest request, + @Valid final User user, BindingResult bindingResult) { + + if (bindingResult.hasErrors()) { + return "/credentials/register"; + } + + ValidationResult result = recaptchaValidator.validate(request); + if (!result.isSuccess()) { + bindingResult.addError(new ObjectError(bindingResult.getObjectName(), + "Please check the 'I am not a robot' verification")); + return "/credentials/register"; + } + + try { + userService.registerNewUser(user); + } catch (UserAlreadyExistException e) { + bindingResult.addError(new FieldError(bindingResult.getObjectName(), + "email", "This e-mail already exist. Please use another e-mail address.")); + return "/credentials/register"; + } + + return "redirect:/pending"; + } + + @GetMapping("/activate/{token}") + public String activateUser(final @PathVariable("token") String token) { + + userService.activateNewUser(token); + + return "redirect:/activate"; + } + + @GetMapping("/reset") + public String resetShow(final Email email) { + return "/credentials/reset"; + } + + @PostMapping("/reset") + public String resetPrerequisites(HttpServletRequest request, + @Valid final Email email, BindingResult bindingResult) { + + if (bindingResult.hasErrors()) { + return "/credentials/reset"; + } + + try { + userService.resetPasswordUser(email.getEmail()); + } catch (EmailNotFoundException e) { + bindingResult.addError(new ObjectError("email", + "Sorry, we cannot find your e-mail")); + return "/credentials/reset"; + } + + return "redirect:/pending"; + } + + @GetMapping("/newpassword/{token}") + public String newPasswordShow(final @PathVariable("token") String token, + final @ModelAttribute(name = "newpassword", binding = false) NewPassword newpassword) { + + newpassword.setToken(token); + return "/credentials/newpassword"; + } + + @PostMapping("/newpassword") + public String newPasswordPerform(final @Valid @ModelAttribute("newpassword") NewPassword newpassword, + BindingResult bindingResult) { + + if (bindingResult.hasErrors()) { + return "/credentials/newpassword"; + } + + try { + userService.newPasswordUser(newpassword); + } catch (TokenInvalidException e) { + bindingResult.addError(new FieldError(bindingResult.getObjectName(), + "reset", "Reset password doesn't match the password that we sent to you")); + return "/credentials/newpassword"; + } + + return "redirect:/activate"; + } +} diff --git a/TotalRegistration1/src/main/java/org/security/dao/UserRepository.java b/Kickoff/src/main/java/org/security/dao/UserRepository.java similarity index 62% rename from TotalRegistration1/src/main/java/org/security/dao/UserRepository.java rename to Kickoff/src/main/java/org/security/dao/UserRepository.java index 7ec95af..ba30826 100644 --- a/TotalRegistration1/src/main/java/org/security/dao/UserRepository.java +++ b/Kickoff/src/main/java/org/security/dao/UserRepository.java @@ -16,6 +16,16 @@ public interface UserRepository extends JpaRepository { @Query(value = "SELECT p.password, p.enabled, p.roles FROM User p WHERE p.email = ?1") String findUserCredentialsEmail(String email); + @Modifying + @Transactional + @Query("UPDATE User p SET p.password = ?1 WHERE p.email = ?2 AND p.enabled = TRUE") + int resetUserPassword(String password, String email); + + @Modifying + @Transactional + @Query("UPDATE User p SET p.password = ?1 WHERE p.email = ?2 AND p.password = ?3 AND p.enabled = TRUE") + int newUserPassword(String newpassword, String email, String resetpassword); + @Modifying @Transactional @Query("UPDATE User p SET p.enabled = TRUE WHERE p.email = ?1 AND p.enabled = FALSE") diff --git a/Kickoff/src/main/java/org/security/exceptions/EmailNotFoundException.java b/Kickoff/src/main/java/org/security/exceptions/EmailNotFoundException.java new file mode 100644 index 0000000..d46b77b --- /dev/null +++ b/Kickoff/src/main/java/org/security/exceptions/EmailNotFoundException.java @@ -0,0 +1,14 @@ +package org.security.exceptions; + +/** + * + * @author newlife + */ +public final class EmailNotFoundException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + public EmailNotFoundException() { + super(); + } +} diff --git a/Kickoff/src/main/java/org/security/exceptions/TokenInvalidException.java b/Kickoff/src/main/java/org/security/exceptions/TokenInvalidException.java new file mode 100644 index 0000000..f8239f0 --- /dev/null +++ b/Kickoff/src/main/java/org/security/exceptions/TokenInvalidException.java @@ -0,0 +1,14 @@ +package org.security.exceptions; + +/** + * + * @author newlife + */ +public final class TokenInvalidException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + public TokenInvalidException() { + super(); + } +} diff --git a/TotalRegistration1/src/main/java/org/security/exceptions/UserAlreadyExistException.java b/Kickoff/src/main/java/org/security/exceptions/UserAlreadyExistException.java similarity index 100% rename from TotalRegistration1/src/main/java/org/security/exceptions/UserAlreadyExistException.java rename to Kickoff/src/main/java/org/security/exceptions/UserAlreadyExistException.java diff --git a/TotalRegistration1/src/main/java/org/security/model/User.java b/Kickoff/src/main/java/org/security/model/User.java similarity index 82% rename from TotalRegistration1/src/main/java/org/security/model/User.java rename to Kickoff/src/main/java/org/security/model/User.java index 7838d98..e9dd7f8 100644 --- a/TotalRegistration1/src/main/java/org/security/model/User.java +++ b/Kickoff/src/main/java/org/security/model/User.java @@ -9,6 +9,7 @@ import javax.persistence.Table; import javax.persistence.Transient; import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; import org.security.validation.EmailConstraint; import org.security.validation.PasswordConstraint; import org.security.validation.PasswordsConstraint; @@ -30,6 +31,11 @@ public class User implements Serializable { @Column(length = 50, nullable = false) private String username; + @NotNull + @Size(min = 10, max = 10, message = "Phone number is not valid.") + @Column(length = 25, nullable = false) + private String phone; + @EmailConstraint @NotNull @Column(length = 50, nullable = false, unique = true) @@ -105,4 +111,12 @@ public String getEmail() { public void setEmail(String email) { this.email = email; } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } } diff --git a/Kickoff/src/main/java/org/security/pojo/Email.java b/Kickoff/src/main/java/org/security/pojo/Email.java new file mode 100644 index 0000000..066bb77 --- /dev/null +++ b/Kickoff/src/main/java/org/security/pojo/Email.java @@ -0,0 +1,23 @@ +package org.security.pojo; + +import javax.validation.constraints.NotNull; +import org.security.validation.EmailConstraint; + +/** + * + * @author newlife + */ +public class Email { + + @EmailConstraint + @NotNull + private String email; + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } +} diff --git a/Kickoff/src/main/java/org/security/pojo/GenericMessage.java b/Kickoff/src/main/java/org/security/pojo/GenericMessage.java new file mode 100644 index 0000000..aa2b460 --- /dev/null +++ b/Kickoff/src/main/java/org/security/pojo/GenericMessage.java @@ -0,0 +1,74 @@ +package org.security.pojo; + +import org.security.util.MessageType; + +/** + * + * @author newlife + */ +public class GenericMessage { + + private MessageType type; + private String sender; + private String receiver; + private String payload; + + public GenericMessage() { + } + + public GenericMessage(String receiver, MessageType type) { + this.receiver = receiver; + this.type = type; + } + + public GenericMessage(String receiver, String payload, MessageType type) { + this.receiver = receiver; + this.payload = payload; + this.type = type; + } + + public GenericMessage(MessageType type, String sender, String receiver, String payload) { + this.type = type; + this.sender = sender; + this.receiver = receiver; + this.payload = payload; + } + + public MessageType getType() { + return type; + } + + public void setType(MessageType type) { + this.type = type; + } + + public String getSender() { + return sender; + } + + public void setSender(String sender) { + this.sender = sender; + } + + public String getReceiver() { + return receiver; + } + + public void setReceiver(String receiver) { + this.receiver = receiver; + } + + public String getPayload() { + return payload; + } + + public void setPayload(String payload) { + this.payload = payload; + } + + @Override + public String toString() { + return "GenericMessage{" + "sender=" + sender + ", " + + "receiver=" + receiver + ", payload=" + payload + '}'; + } +} diff --git a/Kickoff/src/main/java/org/security/pojo/NewPassword.java b/Kickoff/src/main/java/org/security/pojo/NewPassword.java new file mode 100644 index 0000000..480386f --- /dev/null +++ b/Kickoff/src/main/java/org/security/pojo/NewPassword.java @@ -0,0 +1,62 @@ +package org.security.pojo; + +import org.security.validation.PasswordConstraint; +import org.security.validation.PasswordsConstraint; + +/** + * + * @author newlife + */ +@PasswordsConstraint +public class NewPassword { + + private String token; + + @PasswordConstraint + private String reset; + + @PasswordConstraint + private String password; + + @PasswordConstraint + private String confirm; + + public NewPassword() { + } + + public NewPassword(String token) { + this.token = token; + } + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } + + public String getReset() { + return reset; + } + + public void setReset(String reset) { + this.reset = reset; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getConfirm() { + return confirm; + } + + public void setConfirm(String confirm) { + this.confirm = confirm; + } +} diff --git a/TotalRegistration1/src/main/java/org/security/service/CurrentUserDetailsService.java b/Kickoff/src/main/java/org/security/service/CurrentUserDetailsService.java similarity index 100% rename from TotalRegistration1/src/main/java/org/security/service/CurrentUserDetailsService.java rename to Kickoff/src/main/java/org/security/service/CurrentUserDetailsService.java diff --git a/TotalRegistration1/src/main/java/org/security/service/EmailReceiverService.java b/Kickoff/src/main/java/org/security/service/EmailReceiverService.java similarity index 77% rename from TotalRegistration1/src/main/java/org/security/service/EmailReceiverService.java rename to Kickoff/src/main/java/org/security/service/EmailReceiverService.java index 9987051..621a2c0 100644 --- a/TotalRegistration1/src/main/java/org/security/service/EmailReceiverService.java +++ b/Kickoff/src/main/java/org/security/service/EmailReceiverService.java @@ -13,12 +13,11 @@ public class EmailReceiverService implements IMessageReceiverService { @Autowired - INotificationService notificationService; + INotificationServiceProxy notificationServiceProxy; @Override @JmsListener(destination = "mailbox", containerFactory = "totalDevFactory") public void receiveMessage(GenericMessage message) { - notificationService.sendUserPendingRegistrationEmail(message.getReceiver()); + notificationServiceProxy.sendEmail(message); } - } diff --git a/TotalRegistration1/src/main/java/org/security/service/IMessageReceiverService.java b/Kickoff/src/main/java/org/security/service/IMessageReceiverService.java similarity index 100% rename from TotalRegistration1/src/main/java/org/security/service/IMessageReceiverService.java rename to Kickoff/src/main/java/org/security/service/IMessageReceiverService.java diff --git a/TotalRegistration1/src/main/java/org/security/service/IMessageSenderService.java b/Kickoff/src/main/java/org/security/service/IMessageSenderService.java similarity index 100% rename from TotalRegistration1/src/main/java/org/security/service/IMessageSenderService.java rename to Kickoff/src/main/java/org/security/service/IMessageSenderService.java diff --git a/TotalRegistration1/src/main/java/org/security/service/INotificationService.java b/Kickoff/src/main/java/org/security/service/INotificationService.java similarity index 67% rename from TotalRegistration1/src/main/java/org/security/service/INotificationService.java rename to Kickoff/src/main/java/org/security/service/INotificationService.java index 90b7891..bfa5686 100644 --- a/TotalRegistration1/src/main/java/org/security/service/INotificationService.java +++ b/Kickoff/src/main/java/org/security/service/INotificationService.java @@ -10,4 +10,6 @@ public interface INotificationService { public void sendUserPendingRegistrationEmail(final String address); + + public void sendUserResetPasswordEmail(final String address, final String resetpassword); } diff --git a/Kickoff/src/main/java/org/security/service/INotificationServiceProxy.java b/Kickoff/src/main/java/org/security/service/INotificationServiceProxy.java new file mode 100644 index 0000000..ea0b03b --- /dev/null +++ b/Kickoff/src/main/java/org/security/service/INotificationServiceProxy.java @@ -0,0 +1,14 @@ +package org.security.service; + +import org.security.pojo.GenericMessage; +import org.springframework.stereotype.Service; + +/** + * + * @author newlife + */ +@Service +public interface INotificationServiceProxy { + + public void sendEmail(GenericMessage genericMessage); +} diff --git a/TotalRegistration1/src/main/java/org/security/service/IUserService.java b/Kickoff/src/main/java/org/security/service/IUserService.java similarity index 61% rename from TotalRegistration1/src/main/java/org/security/service/IUserService.java rename to Kickoff/src/main/java/org/security/service/IUserService.java index 31ada7f..8c51188 100644 --- a/TotalRegistration1/src/main/java/org/security/service/IUserService.java +++ b/Kickoff/src/main/java/org/security/service/IUserService.java @@ -1,6 +1,7 @@ package org.security.service; import org.security.model.User; +import org.security.pojo.NewPassword; import org.springframework.stereotype.Service; /** @@ -13,4 +14,8 @@ public interface IUserService { public void registerNewUser(final User user); public void activateNewUser(final String token); + + public void resetPasswordUser(final String address); + + public void newPasswordUser(final NewPassword newpassword); } diff --git a/TotalRegistration1/src/main/java/org/security/service/MessageSenderService.java b/Kickoff/src/main/java/org/security/service/MessageSenderService.java similarity index 100% rename from TotalRegistration1/src/main/java/org/security/service/MessageSenderService.java rename to Kickoff/src/main/java/org/security/service/MessageSenderService.java diff --git a/Kickoff/src/main/java/org/security/service/NotificationServiceImpl.java b/Kickoff/src/main/java/org/security/service/NotificationServiceImpl.java new file mode 100644 index 0000000..7079840 --- /dev/null +++ b/Kickoff/src/main/java/org/security/service/NotificationServiceImpl.java @@ -0,0 +1,113 @@ +package org.security.service; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import javax.mail.MessagingException; +import javax.mail.internet.MimeMessage; +import org.security.util.CryptUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.mail.MailSendException; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.mail.javamail.MimeMessageHelper; +import org.springframework.stereotype.Component; +import org.thymeleaf.TemplateEngine; +import org.thymeleaf.context.Context; + +/** + * + * @author newlife + */ +@Component +public class NotificationServiceImpl implements INotificationService { + + @Value("${org.error.code}") + private String code; + + @Value("${org.security.url.activate}") + private String activate; + + @Value("${org.security.url.newpassword}") + private String newpassword; + + @Value("${number.in.range}") + private int rnd; + + @Autowired + private JavaMailSender javaMailSender; + + @Autowired + private TemplateEngine templateEngine; + + private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MMM-yyyy-HH:mm"); + + @Override + public void sendUserPendingRegistrationEmail(final String address) { + + final String expiration = LocalDateTime.now().plusDays(1).format(formatter); + final String token = CryptUtils.encrypt(address + " " + expiration); + + if (token != null) { + final Context ctx = new Context(); + ctx.setVariable("name", address); + ctx.setVariable("expiration", expiration); + ctx.setVariable("activationlink", activate + token + "?rnd.=" + rnd); + + final MimeMessage mimeMessage = this.javaMailSender.createMimeMessage(); + final MimeMessageHelper message = new MimeMessageHelper(mimeMessage, "UTF-8"); + try { + message.setSubject("Total Registration e-mail"); + message.setFrom("totalregistration@domain.com"); + message.setTo(address); + + final String htmlContent = this.templateEngine.process("mail/html/pending-email", ctx); + message.setText(htmlContent, true); + } catch (MessagingException ex) { + throw new RuntimeException(code + ":Unable to build a message for: " + + address + " | " + ex.getMessage(), ex); + } + + try { + this.javaMailSender.send(mimeMessage); + } catch (MailSendException e) { + throw new RuntimeException(code + ":Cannot send e-mail to address: " + address, e); + } + } + } + + @Override + public void sendUserResetPasswordEmail(String address, String payload) { + + final String expiration = LocalDateTime.now().plusDays(1).format(formatter); + final String token = CryptUtils.encrypt(address + " " + + payload + " " + expiration); + + if (token != null) { + final Context ctx = new Context(); + ctx.setVariable("name", address); + ctx.setVariable("expiration", expiration); + ctx.setVariable("resetPassword", payload); + ctx.setVariable("resetLink", newpassword + token + "?rnd.=" + rnd); + + final MimeMessage mimeMessage = this.javaMailSender.createMimeMessage(); + final MimeMessageHelper message = new MimeMessageHelper(mimeMessage, "UTF-8"); + try { + message.setSubject("Total Registration e-mail"); + message.setFrom("totalregistration@domain.com"); + message.setTo(address); + + final String htmlContent = this.templateEngine.process("mail/html/reset-email", ctx); + message.setText(htmlContent, true); + } catch (MessagingException ex) { + throw new RuntimeException(code + ":Unable to build a message for: " + + address + " | " + ex.getMessage(), ex); + } + + try { + this.javaMailSender.send(mimeMessage); + } catch (MailSendException e) { + throw new RuntimeException(code + ":Cannot send e-mail to address: " + address, e); + } + } + } +} diff --git a/Kickoff/src/main/java/org/security/service/NotificationServiceProxy.java b/Kickoff/src/main/java/org/security/service/NotificationServiceProxy.java new file mode 100644 index 0000000..abf1e6f --- /dev/null +++ b/Kickoff/src/main/java/org/security/service/NotificationServiceProxy.java @@ -0,0 +1,36 @@ +package org.security.service; + +import org.security.pojo.GenericMessage; +import static org.security.util.MessageType.PENDING; +import static org.security.util.MessageType.RESET; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +/** + * + * @author newlife + */ +@Component +public class NotificationServiceProxy implements INotificationServiceProxy { + + @Value("${org.error.code}") + private String code; + + @Autowired + private INotificationService notificationService; + + @Override + public void sendEmail(GenericMessage genericMessage) { + switch (genericMessage.getType()) { + case PENDING: + notificationService.sendUserPendingRegistrationEmail(genericMessage.getReceiver()); + break; + case RESET: + notificationService.sendUserResetPasswordEmail(genericMessage.getReceiver(), genericMessage.getPayload()); + break; + default: + throw new RuntimeException(code + ":Invalid e-mail type ..."); + } + } +} diff --git a/Kickoff/src/main/java/org/security/service/UserService.java b/Kickoff/src/main/java/org/security/service/UserService.java new file mode 100644 index 0000000..12b7193 --- /dev/null +++ b/Kickoff/src/main/java/org/security/service/UserService.java @@ -0,0 +1,131 @@ +package org.security.service; + +import org.security.dao.UserRepository; +import org.security.exceptions.EmailNotFoundException; +import org.security.exceptions.TokenInvalidException; +import org.security.exceptions.UserAlreadyExistException; +import org.security.model.User; +import org.security.pojo.GenericMessage; +import org.security.pojo.NewPassword; +import org.security.util.CryptUtils; +import org.security.util.MessageType; +import org.security.util.Utils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Repository; + +/** + * + * @author newlife + */ +@Repository +public class UserService implements IUserService { + + @Value("${org.password.extralength}") + private byte pel; + + @Value("${org.error.code}") + private String code; + + @Autowired + private UserRepository userRepository; + + @Autowired + private PasswordEncoder passwordEncoder; + + @Autowired + private IMessageSenderService messageSenderService; + + @Override + public void registerNewUser(final User user) { + + user.setPassword(passwordEncoder.encode(user.getPassword())); + user.setEnabled(false); + user.setRoles("ROLE_MEMBER"); + + try { + userRepository.save(user); + } catch (DataIntegrityViolationException e) { + throw new UserAlreadyExistException("This email exist: " + user.getEmail(), e); + } + + sendUserPendingRegistrationMessage(user.getEmail()); + } + + @Override + public void activateNewUser(final String token) { + + final String decrypted = CryptUtils.decrypt(token); + + if (decrypted != null) { + final String then = decrypted.substring(decrypted.indexOf(" ") + 1); + + if (Utils.checkThenAgainstNow(then)) { + final int status = userRepository. + enableUserAccount(decrypted.substring(0, decrypted.indexOf(" "))); + if (status == 1) { + return; + } + } else { + sendUserPendingRegistrationMessage(decrypted.substring(0, decrypted.indexOf(" "))); + throw new RuntimeException(code + ":This activation link has expired. We have sent you a new link. Please use it in the next 24h."); + } + } + + throw new RuntimeException(code + ":We cannot activate the account: " + + (decrypted == null ? "null" : decrypted.substring(0, decrypted.indexOf(" ")))); + } + + @Override + public void resetPasswordUser(final String address) { + + final String resetpassword = Utils.randomPassword(pel); + final int status = userRepository.resetUserPassword(resetpassword, address); + + if (status == 1) { + sendUserResetPasswordMessage(address, resetpassword); + return; + } + + throw new EmailNotFoundException(); + } + + @Override + public void newPasswordUser(final NewPassword newpassword) { + + final String decrypted = CryptUtils.decrypt(newpassword.getToken()); + + if (decrypted != null) { + final String resetpassword = decrypted.substring(decrypted.indexOf(" ") + 1, decrypted.lastIndexOf(" ")); + if (resetpassword.equals(newpassword.getReset())) { + final String then = decrypted.substring(decrypted.lastIndexOf(" ") + 1); + if (Utils.checkThenAgainstNow(then)) { + final int status = userRepository. + newUserPassword(passwordEncoder.encode(newpassword.getPassword()), + decrypted.substring(0, decrypted.indexOf(" ")), newpassword.getReset()); + if (status == 1) { + return; + } + } else { + sendUserResetPasswordMessage(decrypted.substring(0, decrypted.indexOf(" ")), resetpassword); + throw new RuntimeException(code + ":This password reset link has expired. We have sent you a new link. Please use it in the next 24h."); + } + } else { + throw new TokenInvalidException(); + } + } + + throw new RuntimeException(code + ":We cannot reset password for account: " + + (decrypted == null ? "null" : decrypted.substring(0, decrypted.indexOf(" ")))); + } + + private void sendUserPendingRegistrationMessage(final String address) { + messageSenderService.sendMessage("mailbox", new GenericMessage(address, MessageType.PENDING)); + } + + private void sendUserResetPasswordMessage(final String address, final String resetpassword) { + messageSenderService.sendMessage("mailbox", new GenericMessage(address, resetpassword, MessageType.RESET)); + } +} diff --git a/TotalRegistration1/src/main/java/org/security/util/CryptUtils.java b/Kickoff/src/main/java/org/security/util/CryptUtils.java similarity index 100% rename from TotalRegistration1/src/main/java/org/security/util/CryptUtils.java rename to Kickoff/src/main/java/org/security/util/CryptUtils.java diff --git a/Kickoff/src/main/java/org/security/util/MessageType.java b/Kickoff/src/main/java/org/security/util/MessageType.java new file mode 100644 index 0000000..f9ce394 --- /dev/null +++ b/Kickoff/src/main/java/org/security/util/MessageType.java @@ -0,0 +1,9 @@ +package org.security.util; + +/** + * + * @author newlife + */ +public enum MessageType { + PENDING, RESET +} diff --git a/Kickoff/src/main/java/org/security/util/Utils.java b/Kickoff/src/main/java/org/security/util/Utils.java new file mode 100644 index 0000000..849f90c --- /dev/null +++ b/Kickoff/src/main/java/org/security/util/Utils.java @@ -0,0 +1,47 @@ +package org.security.util; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.security.SecureRandom; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +/** + * + * @author newlife + */ +public final class Utils { + + private Utils() { + } + + public static String randomPassword(final int maxLength) { + + final SecureRandom random = new SecureRandom(); + final int startChar = (int) '!'; + final int endChar = (int) '~'; + final int length = 6 + random.nextInt(maxLength + 1); + + return random.ints(length, startChar, endChar + 1) + .mapToObj((i) -> (char) i) + .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append) + .toString(); + } + + public static boolean checkThenAgainstNow(String then) { + final LocalDateTime now = LocalDateTime.now(); + final LocalDateTime expiration = LocalDateTime. + parse(then, DateTimeFormatter.ofPattern("dd-MMM-yyyy-HH:mm")); + return now.isBefore(expiration); + } + + public static boolean pingSMTPHost(String host, int port, int timeout) { + try (Socket socket = new Socket()) { + socket.connect(new InetSocketAddress(host, port), timeout); + return true; + } catch (IOException e) { + return false; // Either timeout or unreachable or failed DNS lookup. + } + } +} diff --git a/TotalRegistration1/src/main/java/org/security/validation/EmailConstraint.java b/Kickoff/src/main/java/org/security/validation/EmailConstraint.java similarity index 66% rename from TotalRegistration1/src/main/java/org/security/validation/EmailConstraint.java rename to Kickoff/src/main/java/org/security/validation/EmailConstraint.java index 8899b33..8a37956 100644 --- a/TotalRegistration1/src/main/java/org/security/validation/EmailConstraint.java +++ b/Kickoff/src/main/java/org/security/validation/EmailConstraint.java @@ -2,10 +2,12 @@ import static java.lang.annotation.ElementType.ANNOTATION_TYPE; import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.TYPE; import static java.lang.annotation.RetentionPolicy.RUNTIME; import java.lang.annotation.Documented; +import static java.lang.annotation.ElementType.CONSTRUCTOR; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.PARAMETER; import java.lang.annotation.Retention; import java.lang.annotation.Target; @@ -16,13 +18,13 @@ * * @author newlife */ -@Target({TYPE, FIELD, ANNOTATION_TYPE}) +@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER}) @Retention(RUNTIME) @Constraint(validatedBy = EmailValidator.class) @Documented public @interface EmailConstraint { - String message() default "Invalid e-mail ..."; + String message() default "Invalid e-mail."; Class[] groups() default {}; diff --git a/TotalRegistration1/src/main/java/org/security/validation/EmailValidator.java b/Kickoff/src/main/java/org/security/validation/EmailValidator.java similarity index 100% rename from TotalRegistration1/src/main/java/org/security/validation/EmailValidator.java rename to Kickoff/src/main/java/org/security/validation/EmailValidator.java diff --git a/TotalRegistration1/src/main/java/org/security/validation/JmsErrorHandler.java b/Kickoff/src/main/java/org/security/validation/JmsErrorHandler.java similarity index 100% rename from TotalRegistration1/src/main/java/org/security/validation/JmsErrorHandler.java rename to Kickoff/src/main/java/org/security/validation/JmsErrorHandler.java diff --git a/TotalRegistration1/src/main/java/org/security/validation/PasswordConstraint.java b/Kickoff/src/main/java/org/security/validation/PasswordConstraint.java similarity index 89% rename from TotalRegistration1/src/main/java/org/security/validation/PasswordConstraint.java rename to Kickoff/src/main/java/org/security/validation/PasswordConstraint.java index 629d82d..78035d7 100644 --- a/TotalRegistration1/src/main/java/org/security/validation/PasswordConstraint.java +++ b/Kickoff/src/main/java/org/security/validation/PasswordConstraint.java @@ -15,7 +15,7 @@ * @author newlife */ @Documented -@Constraint(validatedBy = SinglePasswordValidator.class) +@Constraint(validatedBy = PasswordValidator.class) @Target({TYPE, FIELD, ANNOTATION_TYPE}) @Retention(RUNTIME) public @interface PasswordConstraint { diff --git a/TotalRegistration1/src/main/java/org/security/validation/SinglePasswordValidator.java b/Kickoff/src/main/java/org/security/validation/PasswordValidator.java similarity index 69% rename from TotalRegistration1/src/main/java/org/security/validation/SinglePasswordValidator.java rename to Kickoff/src/main/java/org/security/validation/PasswordValidator.java index 487c7ff..7574ef2 100644 --- a/TotalRegistration1/src/main/java/org/security/validation/SinglePasswordValidator.java +++ b/Kickoff/src/main/java/org/security/validation/PasswordValidator.java @@ -5,7 +5,6 @@ import javax.validation.ConstraintValidatorContext; import org.passay.LengthRule; import org.passay.PasswordData; -import org.passay.PasswordValidator; import org.passay.RepeatCharacterRegexRule; import org.passay.RuleResult; import org.passay.WhitespaceRule; @@ -14,7 +13,7 @@ * * @author newlife */ -public class SinglePasswordValidator implements ConstraintValidator { +public class PasswordValidator implements ConstraintValidator { @Override public void initialize(final PasswordConstraint constraintAnnotation) { @@ -23,7 +22,7 @@ public void initialize(final PasswordConstraint constraintAnnotation) { @Override public boolean isValid(final String password, final ConstraintValidatorContext context) { - final PasswordValidator validator = new PasswordValidator(Arrays. + final org.passay.PasswordValidator validator = new org.passay.PasswordValidator(Arrays. asList(new LengthRule(6, 20), new RepeatCharacterRegexRule(), new WhitespaceRule() @@ -35,7 +34,11 @@ public boolean isValid(final String password, final ConstraintValidatorContext c } context.disableDefaultConstraintViolation(); - context.buildConstraintViolationWithTemplate(validator.getMessages(result).toString()).addConstraintViolation(); + + String errors = validator.getMessages(result).stream() + .reduce("", (c, e) -> c + e + " "); + + context.buildConstraintViolationWithTemplate(errors).addConstraintViolation(); return false; } diff --git a/TotalRegistration1/src/main/java/org/security/validation/PasswordsConstraint.java b/Kickoff/src/main/java/org/security/validation/PasswordsConstraint.java similarity index 88% rename from TotalRegistration1/src/main/java/org/security/validation/PasswordsConstraint.java rename to Kickoff/src/main/java/org/security/validation/PasswordsConstraint.java index b83ac5f..33995c2 100644 --- a/TotalRegistration1/src/main/java/org/security/validation/PasswordsConstraint.java +++ b/Kickoff/src/main/java/org/security/validation/PasswordsConstraint.java @@ -19,7 +19,7 @@ @Documented public @interface PasswordsConstraint { - String message() default "Passwords does not match ..."; + String message() default "Passwords does not match."; Class[] groups() default {}; diff --git a/TotalRegistration1/src/main/java/org/security/validation/PasswordsValidator.java b/Kickoff/src/main/java/org/security/validation/PasswordsValidator.java similarity index 53% rename from TotalRegistration1/src/main/java/org/security/validation/PasswordsValidator.java rename to Kickoff/src/main/java/org/security/validation/PasswordsValidator.java index bdd5df7..69f0969 100644 --- a/TotalRegistration1/src/main/java/org/security/validation/PasswordsValidator.java +++ b/Kickoff/src/main/java/org/security/validation/PasswordsValidator.java @@ -3,6 +3,7 @@ import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; import org.security.model.User; +import org.security.pojo.NewPassword; /** * @@ -17,7 +18,16 @@ public void initialize(final PasswordsConstraint constraintAnnotation) { @Override public boolean isValid(final Object obj, final ConstraintValidatorContext context) { - final User user = (User) obj; - return user.getPassword().equals(user.getConfirm()); + if (obj instanceof User) { + final User user = (User) obj; + return user.getPassword().equals(user.getConfirm()); + } + + if (obj instanceof NewPassword) { + final NewPassword newpassword = (NewPassword) obj; + return newpassword.getPassword().equals(newpassword.getConfirm()); + } + + return false; } } diff --git a/Kickoff/src/main/resources/application-development.yaml b/Kickoff/src/main/resources/application-development.yaml new file mode 100644 index 0000000..4ad3c30 --- /dev/null +++ b/Kickoff/src/main/resources/application-development.yaml @@ -0,0 +1,13 @@ +# Path to project +project: + base-dir: classpath:. + +# Templates reloading during development +# Static resources reloading during development +spring: + thymeleaf: + prefix: ${project.base-dir}/templates/ + cache: false + resources: + static-locations: ${project.base-dir}/static/ + cache-period: 0 \ No newline at end of file diff --git a/TotalRegistration1/src/main/resources/application.yaml b/Kickoff/src/main/resources/application.yaml similarity index 62% rename from TotalRegistration1/src/main/resources/application.yaml rename to Kickoff/src/main/resources/application.yaml index f4aa15c..7bcbfb0 100644 --- a/TotalRegistration1/src/main/resources/application.yaml +++ b/Kickoff/src/main/resources/application.yaml @@ -1,46 +1,69 @@ -spring: - datasource: - driver-class-name: com.mysql.jdbc.Driver - url: jdbc:mysql://localhost:3306/totaldev?createDatabaseIfNotExist=true - username: root - password: java797b - type: com.zaxxer.hikari.HikariDataSource - hikari: - connectionTimeout: 10000 - connectionTestQuery: SELECT 1 FROM DUAL - maxLifetime: 1800000 - minimumIdle: 10 - maximumPoolSize: 10 - idleTimeout: 0 - poolName: TotalRegistrationPool - jpa: - database-platform: org.hibernate.dialect.MySQL5Dialect - open-in-view: false - properties: - javax: - persistence: - validation: - mode: none - hibernate: - show_sql: true - format_sql: true - use_sql_comments: true - globally_quoted_identifiers: true - hibernate: - ddl-auto: none - connection.provider_class: org.hibernate.hikaricp.internal.HikariCPConnectionProvider - mail: - host: localhost - port: 25 - -server: - error: - whitelabel: - enabled: false - -# custom settings -org: - security: - url: - activate: http://localhost:8080/activate/ +spring: + datasource: + driver-class-name: com.mysql.jdbc.Driver + url: jdbc:mysql://localhost:3306/db?createDatabaseIfNotExist=true&useSSL=false + username: root + password: java797b + type: com.zaxxer.hikari.HikariDataSource + hikari: + connectionTimeout: 10000 + connectionTestQuery: SELECT 1 FROM DUAL + maxLifetime: 1800000 + minimumIdle: 10 + maximumPoolSize: 10 + idleTimeout: 0 + poolName: KickoffPool + jpa: + database-platform: org.hibernate.dialect.MySQL5Dialect + open-in-view: false + properties: + javax: + persistence: + validation: + mode: none + hibernate: + show_sql: true + format_sql: true + use_sql_comments: true + globally_quoted_identifiers: true + hibernate: + ddl-auto: none + connection.provider_class: org.hibernate.hikaricp.internal.HikariCPConnectionProvider + mail: + host: localhost + port: 25 + user: none + password: none + profiles: + active: development + +server: + error: + whitelabel: + enabled: false + +# custom settings +org: + security: + url: + activate: http://localhost:8080/activate/ + newpassword: http://localhost:8080/newpassword/ + error: + code: 1000 + password: + extralength: 2 + +recaptcha: + validation: + secretKey: 6LfSXw0UAAAAAHhqL0VfFsDo23-8Y8u6gD_PQrOk + +number: + in: + range: ${random.int[11111111,99999999]} + rememberme: + seconds: 120 +admin: + email: admin@kickoff.org + password: kickoff + \ No newline at end of file diff --git a/Kickoff/src/main/resources/data.sql b/Kickoff/src/main/resources/data.sql new file mode 100644 index 0000000..4c7b507 --- /dev/null +++ b/Kickoff/src/main/resources/data.sql @@ -0,0 +1,5 @@ +create table persistent_logins ( +username varchar(64) not null, +series varchar(64) primary key, +token varchar(64) not null, +last_used timestamp not null); diff --git a/TotalRegistration1/src/main/resources/logback-spring.xml b/Kickoff/src/main/resources/logback-spring.xml similarity index 100% rename from TotalRegistration1/src/main/resources/logback-spring.xml rename to Kickoff/src/main/resources/logback-spring.xml diff --git a/Kickoff/src/main/resources/static/css/bootstrap.css b/Kickoff/src/main/resources/static/css/bootstrap.css new file mode 100644 index 0000000..dd3d6dc --- /dev/null +++ b/Kickoff/src/main/resources/static/css/bootstrap.css @@ -0,0 +1,6583 @@ +/*! + * Bootstrap v3.3.4 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +/*! normalize.css v3.0.2 | MIT License | git.io/normalize */ +html { + font-family: sans-serif; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} +body { + margin: 0; +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline; +} +audio:not([controls]) { + display: none; + height: 0; +} +[hidden], +template { + display: none; +} +a { + background-color: transparent; +} +a:active, +a:hover { + outline: 0; +} +abbr[title] { + border-bottom: 1px dotted; +} +b, +strong { + font-weight: bold; +} +dfn { + font-style: italic; +} +h1 { + margin: .67em 0; + font-size: 2em; +} +mark { + color: #000; + background: #ff0; +} +small { + font-size: 80%; +} +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} +sup { + top: -.5em; +} +sub { + bottom: -.25em; +} +img { + border: 0; +} +svg:not(:root) { + overflow: hidden; +} +figure { + margin: 1em 40px; +} +hr { + height: 0; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} +pre { + overflow: auto; +} +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} +button, +input, +optgroup, +select, +textarea { + margin: 0; + font: inherit; + color: inherit; +} +button { + overflow: visible; +} +button, +select { + text-transform: none; +} +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} +button[disabled], +html input[disabled] { + cursor: default; +} +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} +input { + line-height: normal; +} +input[type="checkbox"], +input[type="radio"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 0; +} +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +fieldset { + padding: .35em .625em .75em; + margin: 0 2px; + border: 1px solid #c0c0c0; +} +legend { + padding: 0; + border: 0; +} +textarea { + overflow: auto; +} +optgroup { + font-weight: bold; +} +table { + border-spacing: 0; + border-collapse: collapse; +} +td, +th { + padding: 0; +} +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ +@media print { + *, + *:before, + *:after { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + a[href^="#"]:after, + a[href^="javascript:"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + select { + background: #fff !important; + } + .navbar { + display: none; + } + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: #000 !important; + } + .label { + border: 1px solid #000; + } + .table { + border-collapse: collapse !important; + } + .table td, + .table th { + background-color: #fff !important; + } + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; + } +} +@font-face { + font-family: 'Glyphicons Halflings'; + + src: url('../fonts/glyphicons-halflings-regular.eot'); + src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); +} +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; + + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.glyphicon-asterisk:before { + content: "\2a"; +} +.glyphicon-plus:before { + content: "\2b"; +} +.glyphicon-euro:before, +.glyphicon-eur:before { + content: "\20ac"; +} +.glyphicon-minus:before { + content: "\2212"; +} +.glyphicon-cloud:before { + content: "\2601"; +} +.glyphicon-envelope:before { + content: "\2709"; +} +.glyphicon-pencil:before { + content: "\270f"; +} +.glyphicon-glass:before { + content: "\e001"; +} +.glyphicon-music:before { + content: "\e002"; +} +.glyphicon-search:before { + content: "\e003"; +} +.glyphicon-heart:before { + content: "\e005"; +} +.glyphicon-star:before { + content: "\e006"; +} +.glyphicon-star-empty:before { + content: "\e007"; +} +.glyphicon-user:before { + content: "\e008"; +} +.glyphicon-film:before { + content: "\e009"; +} +.glyphicon-th-large:before { + content: "\e010"; +} +.glyphicon-th:before { + content: "\e011"; +} +.glyphicon-th-list:before { + content: "\e012"; +} +.glyphicon-ok:before { + content: "\e013"; +} +.glyphicon-remove:before { + content: "\e014"; +} +.glyphicon-zoom-in:before { + content: "\e015"; +} +.glyphicon-zoom-out:before { + content: "\e016"; +} +.glyphicon-off:before { + content: "\e017"; +} +.glyphicon-signal:before { + content: "\e018"; +} +.glyphicon-cog:before { + content: "\e019"; +} +.glyphicon-trash:before { + content: "\e020"; +} +.glyphicon-home:before { + content: "\e021"; +} +.glyphicon-file:before { + content: "\e022"; +} +.glyphicon-time:before { + content: "\e023"; +} +.glyphicon-road:before { + content: "\e024"; +} +.glyphicon-download-alt:before { + content: "\e025"; +} +.glyphicon-download:before { + content: "\e026"; +} +.glyphicon-upload:before { + content: "\e027"; +} +.glyphicon-inbox:before { + content: "\e028"; +} +.glyphicon-play-circle:before { + content: "\e029"; +} +.glyphicon-repeat:before { + content: "\e030"; +} +.glyphicon-refresh:before { + content: "\e031"; +} +.glyphicon-list-alt:before { + content: "\e032"; +} +.glyphicon-lock:before { + content: "\e033"; +} +.glyphicon-flag:before { + content: "\e034"; +} +.glyphicon-headphones:before { + content: "\e035"; +} +.glyphicon-volume-off:before { + content: "\e036"; +} +.glyphicon-volume-down:before { + content: "\e037"; +} +.glyphicon-volume-up:before { + content: "\e038"; +} +.glyphicon-qrcode:before { + content: "\e039"; +} +.glyphicon-barcode:before { + content: "\e040"; +} +.glyphicon-tag:before { + content: "\e041"; +} +.glyphicon-tags:before { + content: "\e042"; +} +.glyphicon-book:before { + content: "\e043"; +} +.glyphicon-bookmark:before { + content: "\e044"; +} +.glyphicon-print:before { + content: "\e045"; +} +.glyphicon-camera:before { + content: "\e046"; +} +.glyphicon-font:before { + content: "\e047"; +} +.glyphicon-bold:before { + content: "\e048"; +} +.glyphicon-italic:before { + content: "\e049"; +} +.glyphicon-text-height:before { + content: "\e050"; +} +.glyphicon-text-width:before { + content: "\e051"; +} +.glyphicon-align-left:before { + content: "\e052"; +} +.glyphicon-align-center:before { + content: "\e053"; +} +.glyphicon-align-right:before { + content: "\e054"; +} +.glyphicon-align-justify:before { + content: "\e055"; +} +.glyphicon-list:before { + content: "\e056"; +} +.glyphicon-indent-left:before { + content: "\e057"; +} +.glyphicon-indent-right:before { + content: "\e058"; +} +.glyphicon-facetime-video:before { + content: "\e059"; +} +.glyphicon-picture:before { + content: "\e060"; +} +.glyphicon-map-marker:before { + content: "\e062"; +} +.glyphicon-adjust:before { + content: "\e063"; +} +.glyphicon-tint:before { + content: "\e064"; +} +.glyphicon-edit:before { + content: "\e065"; +} +.glyphicon-share:before { + content: "\e066"; +} +.glyphicon-check:before { + content: "\e067"; +} +.glyphicon-move:before { + content: "\e068"; +} +.glyphicon-step-backward:before { + content: "\e069"; +} +.glyphicon-fast-backward:before { + content: "\e070"; +} +.glyphicon-backward:before { + content: "\e071"; +} +.glyphicon-play:before { + content: "\e072"; +} +.glyphicon-pause:before { + content: "\e073"; +} +.glyphicon-stop:before { + content: "\e074"; +} +.glyphicon-forward:before { + content: "\e075"; +} +.glyphicon-fast-forward:before { + content: "\e076"; +} +.glyphicon-step-forward:before { + content: "\e077"; +} +.glyphicon-eject:before { + content: "\e078"; +} +.glyphicon-chevron-left:before { + content: "\e079"; +} +.glyphicon-chevron-right:before { + content: "\e080"; +} +.glyphicon-plus-sign:before { + content: "\e081"; +} +.glyphicon-minus-sign:before { + content: "\e082"; +} +.glyphicon-remove-sign:before { + content: "\e083"; +} +.glyphicon-ok-sign:before { + content: "\e084"; +} +.glyphicon-question-sign:before { + content: "\e085"; +} +.glyphicon-info-sign:before { + content: "\e086"; +} +.glyphicon-screenshot:before { + content: "\e087"; +} +.glyphicon-remove-circle:before { + content: "\e088"; +} +.glyphicon-ok-circle:before { + content: "\e089"; +} +.glyphicon-ban-circle:before { + content: "\e090"; +} +.glyphicon-arrow-left:before { + content: "\e091"; +} +.glyphicon-arrow-right:before { + content: "\e092"; +} +.glyphicon-arrow-up:before { + content: "\e093"; +} +.glyphicon-arrow-down:before { + content: "\e094"; +} +.glyphicon-share-alt:before { + content: "\e095"; +} +.glyphicon-resize-full:before { + content: "\e096"; +} +.glyphicon-resize-small:before { + content: "\e097"; +} +.glyphicon-exclamation-sign:before { + content: "\e101"; +} +.glyphicon-gift:before { + content: "\e102"; +} +.glyphicon-leaf:before { + content: "\e103"; +} +.glyphicon-fire:before { + content: "\e104"; +} +.glyphicon-eye-open:before { + content: "\e105"; +} +.glyphicon-eye-close:before { + content: "\e106"; +} +.glyphicon-warning-sign:before { + content: "\e107"; +} +.glyphicon-plane:before { + content: "\e108"; +} +.glyphicon-calendar:before { + content: "\e109"; +} +.glyphicon-random:before { + content: "\e110"; +} +.glyphicon-comment:before { + content: "\e111"; +} +.glyphicon-magnet:before { + content: "\e112"; +} +.glyphicon-chevron-up:before { + content: "\e113"; +} +.glyphicon-chevron-down:before { + content: "\e114"; +} +.glyphicon-retweet:before { + content: "\e115"; +} +.glyphicon-shopping-cart:before { + content: "\e116"; +} +.glyphicon-folder-close:before { + content: "\e117"; +} +.glyphicon-folder-open:before { + content: "\e118"; +} +.glyphicon-resize-vertical:before { + content: "\e119"; +} +.glyphicon-resize-horizontal:before { + content: "\e120"; +} +.glyphicon-hdd:before { + content: "\e121"; +} +.glyphicon-bullhorn:before { + content: "\e122"; +} +.glyphicon-bell:before { + content: "\e123"; +} +.glyphicon-certificate:before { + content: "\e124"; +} +.glyphicon-thumbs-up:before { + content: "\e125"; +} +.glyphicon-thumbs-down:before { + content: "\e126"; +} +.glyphicon-hand-right:before { + content: "\e127"; +} +.glyphicon-hand-left:before { + content: "\e128"; +} +.glyphicon-hand-up:before { + content: "\e129"; +} +.glyphicon-hand-down:before { + content: "\e130"; +} +.glyphicon-circle-arrow-right:before { + content: "\e131"; +} +.glyphicon-circle-arrow-left:before { + content: "\e132"; +} +.glyphicon-circle-arrow-up:before { + content: "\e133"; +} +.glyphicon-circle-arrow-down:before { + content: "\e134"; +} +.glyphicon-globe:before { + content: "\e135"; +} +.glyphicon-wrench:before { + content: "\e136"; +} +.glyphicon-tasks:before { + content: "\e137"; +} +.glyphicon-filter:before { + content: "\e138"; +} +.glyphicon-briefcase:before { + content: "\e139"; +} +.glyphicon-fullscreen:before { + content: "\e140"; +} +.glyphicon-dashboard:before { + content: "\e141"; +} +.glyphicon-paperclip:before { + content: "\e142"; +} +.glyphicon-heart-empty:before { + content: "\e143"; +} +.glyphicon-link:before { + content: "\e144"; +} +.glyphicon-phone:before { + content: "\e145"; +} +.glyphicon-pushpin:before { + content: "\e146"; +} +.glyphicon-usd:before { + content: "\e148"; +} +.glyphicon-gbp:before { + content: "\e149"; +} +.glyphicon-sort:before { + content: "\e150"; +} +.glyphicon-sort-by-alphabet:before { + content: "\e151"; +} +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152"; +} +.glyphicon-sort-by-order:before { + content: "\e153"; +} +.glyphicon-sort-by-order-alt:before { + content: "\e154"; +} +.glyphicon-sort-by-attributes:before { + content: "\e155"; +} +.glyphicon-sort-by-attributes-alt:before { + content: "\e156"; +} +.glyphicon-unchecked:before { + content: "\e157"; +} +.glyphicon-expand:before { + content: "\e158"; +} +.glyphicon-collapse-down:before { + content: "\e159"; +} +.glyphicon-collapse-up:before { + content: "\e160"; +} +.glyphicon-log-in:before { + content: "\e161"; +} +.glyphicon-flash:before { + content: "\e162"; +} +.glyphicon-log-out:before { + content: "\e163"; +} +.glyphicon-new-window:before { + content: "\e164"; +} +.glyphicon-record:before { + content: "\e165"; +} +.glyphicon-save:before { + content: "\e166"; +} +.glyphicon-open:before { + content: "\e167"; +} +.glyphicon-saved:before { + content: "\e168"; +} +.glyphicon-import:before { + content: "\e169"; +} +.glyphicon-export:before { + content: "\e170"; +} +.glyphicon-send:before { + content: "\e171"; +} +.glyphicon-floppy-disk:before { + content: "\e172"; +} +.glyphicon-floppy-saved:before { + content: "\e173"; +} +.glyphicon-floppy-remove:before { + content: "\e174"; +} +.glyphicon-floppy-save:before { + content: "\e175"; +} +.glyphicon-floppy-open:before { + content: "\e176"; +} +.glyphicon-credit-card:before { + content: "\e177"; +} +.glyphicon-transfer:before { + content: "\e178"; +} +.glyphicon-cutlery:before { + content: "\e179"; +} +.glyphicon-header:before { + content: "\e180"; +} +.glyphicon-compressed:before { + content: "\e181"; +} +.glyphicon-earphone:before { + content: "\e182"; +} +.glyphicon-phone-alt:before { + content: "\e183"; +} +.glyphicon-tower:before { + content: "\e184"; +} +.glyphicon-stats:before { + content: "\e185"; +} +.glyphicon-sd-video:before { + content: "\e186"; +} +.glyphicon-hd-video:before { + content: "\e187"; +} +.glyphicon-subtitles:before { + content: "\e188"; +} +.glyphicon-sound-stereo:before { + content: "\e189"; +} +.glyphicon-sound-dolby:before { + content: "\e190"; +} +.glyphicon-sound-5-1:before { + content: "\e191"; +} +.glyphicon-sound-6-1:before { + content: "\e192"; +} +.glyphicon-sound-7-1:before { + content: "\e193"; +} +.glyphicon-copyright-mark:before { + content: "\e194"; +} +.glyphicon-registration-mark:before { + content: "\e195"; +} +.glyphicon-cloud-download:before { + content: "\e197"; +} +.glyphicon-cloud-upload:before { + content: "\e198"; +} +.glyphicon-tree-conifer:before { + content: "\e199"; +} +.glyphicon-tree-deciduous:before { + content: "\e200"; +} +.glyphicon-cd:before { + content: "\e201"; +} +.glyphicon-save-file:before { + content: "\e202"; +} +.glyphicon-open-file:before { + content: "\e203"; +} +.glyphicon-level-up:before { + content: "\e204"; +} +.glyphicon-copy:before { + content: "\e205"; +} +.glyphicon-paste:before { + content: "\e206"; +} +.glyphicon-alert:before { + content: "\e209"; +} +.glyphicon-equalizer:before { + content: "\e210"; +} +.glyphicon-king:before { + content: "\e211"; +} +.glyphicon-queen:before { + content: "\e212"; +} +.glyphicon-pawn:before { + content: "\e213"; +} +.glyphicon-bishop:before { + content: "\e214"; +} +.glyphicon-knight:before { + content: "\e215"; +} +.glyphicon-baby-formula:before { + content: "\e216"; +} +.glyphicon-tent:before { + content: "\26fa"; +} +.glyphicon-blackboard:before { + content: "\e218"; +} +.glyphicon-bed:before { + content: "\e219"; +} +.glyphicon-apple:before { + content: "\f8ff"; +} +.glyphicon-erase:before { + content: "\e221"; +} +.glyphicon-hourglass:before { + content: "\231b"; +} +.glyphicon-lamp:before { + content: "\e223"; +} +.glyphicon-duplicate:before { + content: "\e224"; +} +.glyphicon-piggy-bank:before { + content: "\e225"; +} +.glyphicon-scissors:before { + content: "\e226"; +} +.glyphicon-bitcoin:before { + content: "\e227"; +} +.glyphicon-btc:before { + content: "\e227"; +} +.glyphicon-xbt:before { + content: "\e227"; +} +.glyphicon-yen:before { + content: "\00a5"; +} +.glyphicon-jpy:before { + content: "\00a5"; +} +.glyphicon-ruble:before { + content: "\20bd"; +} +.glyphicon-rub:before { + content: "\20bd"; +} +.glyphicon-scale:before { + content: "\e230"; +} +.glyphicon-ice-lolly:before { + content: "\e231"; +} +.glyphicon-ice-lolly-tasted:before { + content: "\e232"; +} +.glyphicon-education:before { + content: "\e233"; +} +.glyphicon-option-horizontal:before { + content: "\e234"; +} +.glyphicon-option-vertical:before { + content: "\e235"; +} +.glyphicon-menu-hamburger:before { + content: "\e236"; +} +.glyphicon-modal-window:before { + content: "\e237"; +} +.glyphicon-oil:before { + content: "\e238"; +} +.glyphicon-grain:before { + content: "\e239"; +} +.glyphicon-sunglasses:before { + content: "\e240"; +} +.glyphicon-text-size:before { + content: "\e241"; +} +.glyphicon-text-color:before { + content: "\e242"; +} +.glyphicon-text-background:before { + content: "\e243"; +} +.glyphicon-object-align-top:before { + content: "\e244"; +} +.glyphicon-object-align-bottom:before { + content: "\e245"; +} +.glyphicon-object-align-horizontal:before { + content: "\e246"; +} +.glyphicon-object-align-left:before { + content: "\e247"; +} +.glyphicon-object-align-vertical:before { + content: "\e248"; +} +.glyphicon-object-align-right:before { + content: "\e249"; +} +.glyphicon-triangle-right:before { + content: "\e250"; +} +.glyphicon-triangle-left:before { + content: "\e251"; +} +.glyphicon-triangle-bottom:before { + content: "\e252"; +} +.glyphicon-triangle-top:before { + content: "\e253"; +} +.glyphicon-console:before { + content: "\e254"; +} +.glyphicon-superscript:before { + content: "\e255"; +} +.glyphicon-subscript:before { + content: "\e256"; +} +.glyphicon-menu-left:before { + content: "\e257"; +} +.glyphicon-menu-right:before { + content: "\e258"; +} +.glyphicon-menu-down:before { + content: "\e259"; +} +.glyphicon-menu-up:before { + content: "\e260"; +} +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +html { + font-size: 10px; + + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +body { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.42857143; + color: #333; + background-color: #fff; +} +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} +a { + color: #337ab7; + text-decoration: none; +} +a:hover, +a:focus { + color: #23527c; + text-decoration: underline; +} +a:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +figure { + margin: 0; +} +img { + vertical-align: middle; +} +.img-responsive, +.thumbnail > img, +.thumbnail a > img, +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + max-width: 100%; + height: auto; +} +.img-rounded { + border-radius: 6px; +} +.img-thumbnail { + display: inline-block; + max-width: 100%; + height: auto; + padding: 4px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: all .2s ease-in-out; + -o-transition: all .2s ease-in-out; + transition: all .2s ease-in-out; +} +.img-circle { + border-radius: 50%; +} +hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eee; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} +[role="button"] { + cursor: pointer; +} +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit; +} +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small, +.h1 small, +.h2 small, +.h3 small, +.h4 small, +.h5 small, +.h6 small, +h1 .small, +h2 .small, +h3 .small, +h4 .small, +h5 .small, +h6 .small, +.h1 .small, +.h2 .small, +.h3 .small, +.h4 .small, +.h5 .small, +.h6 .small { + font-weight: normal; + line-height: 1; + color: #777; +} +h1, +.h1, +h2, +.h2, +h3, +.h3 { + margin-top: 20px; + margin-bottom: 10px; +} +h1 small, +.h1 small, +h2 small, +.h2 small, +h3 small, +.h3 small, +h1 .small, +.h1 .small, +h2 .small, +.h2 .small, +h3 .small, +.h3 .small { + font-size: 65%; +} +h4, +.h4, +h5, +.h5, +h6, +.h6 { + margin-top: 10px; + margin-bottom: 10px; +} +h4 small, +.h4 small, +h5 small, +.h5 small, +h6 small, +.h6 small, +h4 .small, +.h4 .small, +h5 .small, +.h5 .small, +h6 .small, +.h6 .small { + font-size: 75%; +} +h1, +.h1 { + font-size: 36px; +} +h2, +.h2 { + font-size: 30px; +} +h3, +.h3 { + font-size: 24px; +} +h4, +.h4 { + font-size: 18px; +} +h5, +.h5 { + font-size: 14px; +} +h6, +.h6 { + font-size: 12px; +} +p { + margin: 0 0 10px; +} +.lead { + margin-bottom: 20px; + font-size: 16px; + font-weight: 300; + line-height: 1.4; +} +@media (min-width: 768px) { + .lead { + font-size: 21px; + } +} +small, +.small { + font-size: 85%; +} +mark, +.mark { + padding: .2em; + background-color: #fcf8e3; +} +.text-left { + text-align: left; +} +.text-right { + text-align: right; +} +.text-center { + text-align: center; +} +.text-justify { + text-align: justify; +} +.text-nowrap { + white-space: nowrap; +} +.text-lowercase { + text-transform: lowercase; +} +.text-uppercase { + text-transform: uppercase; +} +.text-capitalize { + text-transform: capitalize; +} +.text-muted { + color: #777; +} +.text-primary { + color: #337ab7; +} +a.text-primary:hover { + color: #286090; +} +.text-success { + color: #3c763d; +} +a.text-success:hover { + color: #2b542c; +} +.text-info { + color: #31708f; +} +a.text-info:hover { + color: #245269; +} +.text-warning { + color: #8a6d3b; +} +a.text-warning:hover { + color: #66512c; +} +.text-danger { + color: #a94442; +} +a.text-danger:hover { + color: #843534; +} +.bg-primary { + color: #fff; + background-color: #337ab7; +} +a.bg-primary:hover { + background-color: #286090; +} +.bg-success { + background-color: #dff0d8; +} +a.bg-success:hover { + background-color: #c1e2b3; +} +.bg-info { + background-color: #d9edf7; +} +a.bg-info:hover { + background-color: #afd9ee; +} +.bg-warning { + background-color: #fcf8e3; +} +a.bg-warning:hover { + background-color: #f7ecb5; +} +.bg-danger { + background-color: #f2dede; +} +a.bg-danger:hover { + background-color: #e4b9b9; +} +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eee; +} +ul, +ol { + margin-top: 0; + margin-bottom: 10px; +} +ul ul, +ol ul, +ul ol, +ol ol { + margin-bottom: 0; +} +.list-unstyled { + padding-left: 0; + list-style: none; +} +.list-inline { + padding-left: 0; + margin-left: -5px; + list-style: none; +} +.list-inline > li { + display: inline-block; + padding-right: 5px; + padding-left: 5px; +} +dl { + margin-top: 0; + margin-bottom: 20px; +} +dt, +dd { + line-height: 1.42857143; +} +dt { + font-weight: bold; +} +dd { + margin-left: 0; +} +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; + } + .dl-horizontal dd { + margin-left: 180px; + } +} +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #777; +} +.initialism { + font-size: 90%; + text-transform: uppercase; +} +blockquote { + padding: 10px 20px; + margin: 0 0 20px; + font-size: 17.5px; + border-left: 5px solid #eee; +} +blockquote p:last-child, +blockquote ul:last-child, +blockquote ol:last-child { + margin-bottom: 0; +} +blockquote footer, +blockquote small, +blockquote .small { + display: block; + font-size: 80%; + line-height: 1.42857143; + color: #777; +} +blockquote footer:before, +blockquote small:before, +blockquote .small:before { + content: '\2014 \00A0'; +} +.blockquote-reverse, +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + text-align: right; + border-right: 5px solid #eee; + border-left: 0; +} +.blockquote-reverse footer:before, +blockquote.pull-right footer:before, +.blockquote-reverse small:before, +blockquote.pull-right small:before, +.blockquote-reverse .small:before, +blockquote.pull-right .small:before { + content: ''; +} +.blockquote-reverse footer:after, +blockquote.pull-right footer:after, +.blockquote-reverse small:after, +blockquote.pull-right small:after, +.blockquote-reverse .small:after, +blockquote.pull-right .small:after { + content: '\00A0 \2014'; +} +address { + margin-bottom: 20px; + font-style: normal; + line-height: 1.42857143; +} +code, +kbd, +pre, +samp { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; +} +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + background-color: #f9f2f4; + border-radius: 4px; +} +kbd { + padding: 2px 4px; + font-size: 90%; + color: #fff; + background-color: #333; + border-radius: 3px; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); +} +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: bold; + -webkit-box-shadow: none; + box-shadow: none; +} +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.42857143; + color: #333; + word-break: break-all; + word-wrap: break-word; + background-color: #f5f5f5; + border: 1px solid #ccc; + border-radius: 4px; +} +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; +} +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} +.container { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +@media (min-width: 768px) { + .container { + width: 750px; + } +} +@media (min-width: 992px) { + .container { + width: 970px; + } +} +@media (min-width: 1200px) { + .container { + width: 1170px; + } +} +.container-fluid { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +.row { + margin-right: -15px; + margin-left: -15px; +} +.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; +} +.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { + float: left; +} +.col-xs-12 { + width: 100%; +} +.col-xs-11 { + width: 91.66666667%; +} +.col-xs-10 { + width: 83.33333333%; +} +.col-xs-9 { + width: 75%; +} +.col-xs-8 { + width: 66.66666667%; +} +.col-xs-7 { + width: 58.33333333%; +} +.col-xs-6 { + width: 50%; +} +.col-xs-5 { + width: 41.66666667%; +} +.col-xs-4 { + width: 33.33333333%; +} +.col-xs-3 { + width: 25%; +} +.col-xs-2 { + width: 16.66666667%; +} +.col-xs-1 { + width: 8.33333333%; +} +.col-xs-pull-12 { + right: 100%; +} +.col-xs-pull-11 { + right: 91.66666667%; +} +.col-xs-pull-10 { + right: 83.33333333%; +} +.col-xs-pull-9 { + right: 75%; +} +.col-xs-pull-8 { + right: 66.66666667%; +} +.col-xs-pull-7 { + right: 58.33333333%; +} +.col-xs-pull-6 { + right: 50%; +} +.col-xs-pull-5 { + right: 41.66666667%; +} +.col-xs-pull-4 { + right: 33.33333333%; +} +.col-xs-pull-3 { + right: 25%; +} +.col-xs-pull-2 { + right: 16.66666667%; +} +.col-xs-pull-1 { + right: 8.33333333%; +} +.col-xs-pull-0 { + right: auto; +} +.col-xs-push-12 { + left: 100%; +} +.col-xs-push-11 { + left: 91.66666667%; +} +.col-xs-push-10 { + left: 83.33333333%; +} +.col-xs-push-9 { + left: 75%; +} +.col-xs-push-8 { + left: 66.66666667%; +} +.col-xs-push-7 { + left: 58.33333333%; +} +.col-xs-push-6 { + left: 50%; +} +.col-xs-push-5 { + left: 41.66666667%; +} +.col-xs-push-4 { + left: 33.33333333%; +} +.col-xs-push-3 { + left: 25%; +} +.col-xs-push-2 { + left: 16.66666667%; +} +.col-xs-push-1 { + left: 8.33333333%; +} +.col-xs-push-0 { + left: auto; +} +.col-xs-offset-12 { + margin-left: 100%; +} +.col-xs-offset-11 { + margin-left: 91.66666667%; +} +.col-xs-offset-10 { + margin-left: 83.33333333%; +} +.col-xs-offset-9 { + margin-left: 75%; +} +.col-xs-offset-8 { + margin-left: 66.66666667%; +} +.col-xs-offset-7 { + margin-left: 58.33333333%; +} +.col-xs-offset-6 { + margin-left: 50%; +} +.col-xs-offset-5 { + margin-left: 41.66666667%; +} +.col-xs-offset-4 { + margin-left: 33.33333333%; +} +.col-xs-offset-3 { + margin-left: 25%; +} +.col-xs-offset-2 { + margin-left: 16.66666667%; +} +.col-xs-offset-1 { + margin-left: 8.33333333%; +} +.col-xs-offset-0 { + margin-left: 0; +} +@media (min-width: 768px) { + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: left; + } + .col-sm-12 { + width: 100%; + } + .col-sm-11 { + width: 91.66666667%; + } + .col-sm-10 { + width: 83.33333333%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-8 { + width: 66.66666667%; + } + .col-sm-7 { + width: 58.33333333%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-5 { + width: 41.66666667%; + } + .col-sm-4 { + width: 33.33333333%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-2 { + width: 16.66666667%; + } + .col-sm-1 { + width: 8.33333333%; + } + .col-sm-pull-12 { + right: 100%; + } + .col-sm-pull-11 { + right: 91.66666667%; + } + .col-sm-pull-10 { + right: 83.33333333%; + } + .col-sm-pull-9 { + right: 75%; + } + .col-sm-pull-8 { + right: 66.66666667%; + } + .col-sm-pull-7 { + right: 58.33333333%; + } + .col-sm-pull-6 { + right: 50%; + } + .col-sm-pull-5 { + right: 41.66666667%; + } + .col-sm-pull-4 { + right: 33.33333333%; + } + .col-sm-pull-3 { + right: 25%; + } + .col-sm-pull-2 { + right: 16.66666667%; + } + .col-sm-pull-1 { + right: 8.33333333%; + } + .col-sm-pull-0 { + right: auto; + } + .col-sm-push-12 { + left: 100%; + } + .col-sm-push-11 { + left: 91.66666667%; + } + .col-sm-push-10 { + left: 83.33333333%; + } + .col-sm-push-9 { + left: 75%; + } + .col-sm-push-8 { + left: 66.66666667%; + } + .col-sm-push-7 { + left: 58.33333333%; + } + .col-sm-push-6 { + left: 50%; + } + .col-sm-push-5 { + left: 41.66666667%; + } + .col-sm-push-4 { + left: 33.33333333%; + } + .col-sm-push-3 { + left: 25%; + } + .col-sm-push-2 { + left: 16.66666667%; + } + .col-sm-push-1 { + left: 8.33333333%; + } + .col-sm-push-0 { + left: auto; + } + .col-sm-offset-12 { + margin-left: 100%; + } + .col-sm-offset-11 { + margin-left: 91.66666667%; + } + .col-sm-offset-10 { + margin-left: 83.33333333%; + } + .col-sm-offset-9 { + margin-left: 75%; + } + .col-sm-offset-8 { + margin-left: 66.66666667%; + } + .col-sm-offset-7 { + margin-left: 58.33333333%; + } + .col-sm-offset-6 { + margin-left: 50%; + } + .col-sm-offset-5 { + margin-left: 41.66666667%; + } + .col-sm-offset-4 { + margin-left: 33.33333333%; + } + .col-sm-offset-3 { + margin-left: 25%; + } + .col-sm-offset-2 { + margin-left: 16.66666667%; + } + .col-sm-offset-1 { + margin-left: 8.33333333%; + } + .col-sm-offset-0 { + margin-left: 0; + } +} +@media (min-width: 992px) { + .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + float: left; + } + .col-md-12 { + width: 100%; + } + .col-md-11 { + width: 91.66666667%; + } + .col-md-10 { + width: 83.33333333%; + } + .col-md-9 { + width: 75%; + } + .col-md-8 { + width: 66.66666667%; + } + .col-md-7 { + width: 58.33333333%; + } + .col-md-6 { + width: 50%; + } + .col-md-5 { + width: 41.66666667%; + } + .col-md-4 { + width: 33.33333333%; + } + .col-md-3 { + width: 25%; + } + .col-md-2 { + width: 16.66666667%; + } + .col-md-1 { + width: 8.33333333%; + } + .col-md-pull-12 { + right: 100%; + } + .col-md-pull-11 { + right: 91.66666667%; + } + .col-md-pull-10 { + right: 83.33333333%; + } + .col-md-pull-9 { + right: 75%; + } + .col-md-pull-8 { + right: 66.66666667%; + } + .col-md-pull-7 { + right: 58.33333333%; + } + .col-md-pull-6 { + right: 50%; + } + .col-md-pull-5 { + right: 41.66666667%; + } + .col-md-pull-4 { + right: 33.33333333%; + } + .col-md-pull-3 { + right: 25%; + } + .col-md-pull-2 { + right: 16.66666667%; + } + .col-md-pull-1 { + right: 8.33333333%; + } + .col-md-pull-0 { + right: auto; + } + .col-md-push-12 { + left: 100%; + } + .col-md-push-11 { + left: 91.66666667%; + } + .col-md-push-10 { + left: 83.33333333%; + } + .col-md-push-9 { + left: 75%; + } + .col-md-push-8 { + left: 66.66666667%; + } + .col-md-push-7 { + left: 58.33333333%; + } + .col-md-push-6 { + left: 50%; + } + .col-md-push-5 { + left: 41.66666667%; + } + .col-md-push-4 { + left: 33.33333333%; + } + .col-md-push-3 { + left: 25%; + } + .col-md-push-2 { + left: 16.66666667%; + } + .col-md-push-1 { + left: 8.33333333%; + } + .col-md-push-0 { + left: auto; + } + .col-md-offset-12 { + margin-left: 100%; + } + .col-md-offset-11 { + margin-left: 91.66666667%; + } + .col-md-offset-10 { + margin-left: 83.33333333%; + } + .col-md-offset-9 { + margin-left: 75%; + } + .col-md-offset-8 { + margin-left: 66.66666667%; + } + .col-md-offset-7 { + margin-left: 58.33333333%; + } + .col-md-offset-6 { + margin-left: 50%; + } + .col-md-offset-5 { + margin-left: 41.66666667%; + } + .col-md-offset-4 { + margin-left: 33.33333333%; + } + .col-md-offset-3 { + margin-left: 25%; + } + .col-md-offset-2 { + margin-left: 16.66666667%; + } + .col-md-offset-1 { + margin-left: 8.33333333%; + } + .col-md-offset-0 { + margin-left: 0; + } +} +@media (min-width: 1200px) { + .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + float: left; + } + .col-lg-12 { + width: 100%; + } + .col-lg-11 { + width: 91.66666667%; + } + .col-lg-10 { + width: 83.33333333%; + } + .col-lg-9 { + width: 75%; + } + .col-lg-8 { + width: 66.66666667%; + } + .col-lg-7 { + width: 58.33333333%; + } + .col-lg-6 { + width: 50%; + } + .col-lg-5 { + width: 41.66666667%; + } + .col-lg-4 { + width: 33.33333333%; + } + .col-lg-3 { + width: 25%; + } + .col-lg-2 { + width: 16.66666667%; + } + .col-lg-1 { + width: 8.33333333%; + } + .col-lg-pull-12 { + right: 100%; + } + .col-lg-pull-11 { + right: 91.66666667%; + } + .col-lg-pull-10 { + right: 83.33333333%; + } + .col-lg-pull-9 { + right: 75%; + } + .col-lg-pull-8 { + right: 66.66666667%; + } + .col-lg-pull-7 { + right: 58.33333333%; + } + .col-lg-pull-6 { + right: 50%; + } + .col-lg-pull-5 { + right: 41.66666667%; + } + .col-lg-pull-4 { + right: 33.33333333%; + } + .col-lg-pull-3 { + right: 25%; + } + .col-lg-pull-2 { + right: 16.66666667%; + } + .col-lg-pull-1 { + right: 8.33333333%; + } + .col-lg-pull-0 { + right: auto; + } + .col-lg-push-12 { + left: 100%; + } + .col-lg-push-11 { + left: 91.66666667%; + } + .col-lg-push-10 { + left: 83.33333333%; + } + .col-lg-push-9 { + left: 75%; + } + .col-lg-push-8 { + left: 66.66666667%; + } + .col-lg-push-7 { + left: 58.33333333%; + } + .col-lg-push-6 { + left: 50%; + } + .col-lg-push-5 { + left: 41.66666667%; + } + .col-lg-push-4 { + left: 33.33333333%; + } + .col-lg-push-3 { + left: 25%; + } + .col-lg-push-2 { + left: 16.66666667%; + } + .col-lg-push-1 { + left: 8.33333333%; + } + .col-lg-push-0 { + left: auto; + } + .col-lg-offset-12 { + margin-left: 100%; + } + .col-lg-offset-11 { + margin-left: 91.66666667%; + } + .col-lg-offset-10 { + margin-left: 83.33333333%; + } + .col-lg-offset-9 { + margin-left: 75%; + } + .col-lg-offset-8 { + margin-left: 66.66666667%; + } + .col-lg-offset-7 { + margin-left: 58.33333333%; + } + .col-lg-offset-6 { + margin-left: 50%; + } + .col-lg-offset-5 { + margin-left: 41.66666667%; + } + .col-lg-offset-4 { + margin-left: 33.33333333%; + } + .col-lg-offset-3 { + margin-left: 25%; + } + .col-lg-offset-2 { + margin-left: 16.66666667%; + } + .col-lg-offset-1 { + margin-left: 8.33333333%; + } + .col-lg-offset-0 { + margin-left: 0; + } +} +table { + background-color: transparent; +} +caption { + padding-top: 8px; + padding-bottom: 8px; + color: #777; + text-align: left; +} +th { + text-align: left; +} +.table { + width: 100%; + max-width: 100%; + margin-bottom: 20px; +} +.table > thead > tr > th, +.table > tbody > tr > th, +.table > tfoot > tr > th, +.table > thead > tr > td, +.table > tbody > tr > td, +.table > tfoot > tr > td { + padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border-top: 1px solid #ddd; +} +.table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #ddd; +} +.table > caption + thead > tr:first-child > th, +.table > colgroup + thead > tr:first-child > th, +.table > thead:first-child > tr:first-child > th, +.table > caption + thead > tr:first-child > td, +.table > colgroup + thead > tr:first-child > td, +.table > thead:first-child > tr:first-child > td { + border-top: 0; +} +.table > tbody + tbody { + border-top: 2px solid #ddd; +} +.table .table { + background-color: #fff; +} +.table-condensed > thead > tr > th, +.table-condensed > tbody > tr > th, +.table-condensed > tfoot > tr > th, +.table-condensed > thead > tr > td, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > td { + padding: 5px; +} +.table-bordered { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} +.table-striped > tbody > tr:nth-of-type(odd) { + background-color: #f9f9f9; +} +.table-hover > tbody > tr:hover { + background-color: #f5f5f5; +} +table col[class*="col-"] { + position: static; + display: table-column; + float: none; +} +table td[class*="col-"], +table th[class*="col-"] { + position: static; + display: table-cell; + float: none; +} +.table > thead > tr > td.active, +.table > tbody > tr > td.active, +.table > tfoot > tr > td.active, +.table > thead > tr > th.active, +.table > tbody > tr > th.active, +.table > tfoot > tr > th.active, +.table > thead > tr.active > td, +.table > tbody > tr.active > td, +.table > tfoot > tr.active > td, +.table > thead > tr.active > th, +.table > tbody > tr.active > th, +.table > tfoot > tr.active > th { + background-color: #f5f5f5; +} +.table-hover > tbody > tr > td.active:hover, +.table-hover > tbody > tr > th.active:hover, +.table-hover > tbody > tr.active:hover > td, +.table-hover > tbody > tr:hover > .active, +.table-hover > tbody > tr.active:hover > th { + background-color: #e8e8e8; +} +.table > thead > tr > td.success, +.table > tbody > tr > td.success, +.table > tfoot > tr > td.success, +.table > thead > tr > th.success, +.table > tbody > tr > th.success, +.table > tfoot > tr > th.success, +.table > thead > tr.success > td, +.table > tbody > tr.success > td, +.table > tfoot > tr.success > td, +.table > thead > tr.success > th, +.table > tbody > tr.success > th, +.table > tfoot > tr.success > th { + background-color: #dff0d8; +} +.table-hover > tbody > tr > td.success:hover, +.table-hover > tbody > tr > th.success:hover, +.table-hover > tbody > tr.success:hover > td, +.table-hover > tbody > tr:hover > .success, +.table-hover > tbody > tr.success:hover > th { + background-color: #d0e9c6; +} +.table > thead > tr > td.info, +.table > tbody > tr > td.info, +.table > tfoot > tr > td.info, +.table > thead > tr > th.info, +.table > tbody > tr > th.info, +.table > tfoot > tr > th.info, +.table > thead > tr.info > td, +.table > tbody > tr.info > td, +.table > tfoot > tr.info > td, +.table > thead > tr.info > th, +.table > tbody > tr.info > th, +.table > tfoot > tr.info > th { + background-color: #d9edf7; +} +.table-hover > tbody > tr > td.info:hover, +.table-hover > tbody > tr > th.info:hover, +.table-hover > tbody > tr.info:hover > td, +.table-hover > tbody > tr:hover > .info, +.table-hover > tbody > tr.info:hover > th { + background-color: #c4e3f3; +} +.table > thead > tr > td.warning, +.table > tbody > tr > td.warning, +.table > tfoot > tr > td.warning, +.table > thead > tr > th.warning, +.table > tbody > tr > th.warning, +.table > tfoot > tr > th.warning, +.table > thead > tr.warning > td, +.table > tbody > tr.warning > td, +.table > tfoot > tr.warning > td, +.table > thead > tr.warning > th, +.table > tbody > tr.warning > th, +.table > tfoot > tr.warning > th { + background-color: #fcf8e3; +} +.table-hover > tbody > tr > td.warning:hover, +.table-hover > tbody > tr > th.warning:hover, +.table-hover > tbody > tr.warning:hover > td, +.table-hover > tbody > tr:hover > .warning, +.table-hover > tbody > tr.warning:hover > th { + background-color: #faf2cc; +} +.table > thead > tr > td.danger, +.table > tbody > tr > td.danger, +.table > tfoot > tr > td.danger, +.table > thead > tr > th.danger, +.table > tbody > tr > th.danger, +.table > tfoot > tr > th.danger, +.table > thead > tr.danger > td, +.table > tbody > tr.danger > td, +.table > tfoot > tr.danger > td, +.table > thead > tr.danger > th, +.table > tbody > tr.danger > th, +.table > tfoot > tr.danger > th { + background-color: #f2dede; +} +.table-hover > tbody > tr > td.danger:hover, +.table-hover > tbody > tr > th.danger:hover, +.table-hover > tbody > tr.danger:hover > td, +.table-hover > tbody > tr:hover > .danger, +.table-hover > tbody > tr.danger:hover > th { + background-color: #ebcccc; +} +.table-responsive { + min-height: .01%; + overflow-x: auto; +} +@media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #ddd; + } + .table-responsive > .table { + margin-bottom: 0; + } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; + } + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } +} +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} +label { + display: inline-block; + max-width: 100%; + margin-bottom: 5px; + font-weight: bold; +} +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + line-height: normal; +} +input[type="file"] { + display: block; +} +input[type="range"] { + display: block; + width: 100%; +} +select[multiple], +select[size] { + height: auto; +} +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +output { + display: block; + padding-top: 7px; + font-size: 14px; + line-height: 1.42857143; + color: #555; +} +.form-control { + display: block; + width: 100%; + height: 34px; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + color: #555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; + -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; +} +.form-control:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); +} +.form-control::-moz-placeholder { + color: #999; + opacity: 1; +} +.form-control:-ms-input-placeholder { + color: #999; +} +.form-control::-webkit-input-placeholder { + color: #999; +} +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + background-color: #eee; + opacity: 1; +} +.form-control[disabled], +fieldset[disabled] .form-control { + cursor: not-allowed; +} +textarea.form-control { + height: auto; +} +input[type="search"] { + -webkit-appearance: none; +} +@media screen and (-webkit-min-device-pixel-ratio: 0) { + input[type="date"], + input[type="time"], + input[type="datetime-local"], + input[type="month"] { + line-height: 34px; + } + input[type="date"].input-sm, + input[type="time"].input-sm, + input[type="datetime-local"].input-sm, + input[type="month"].input-sm, + .input-group-sm input[type="date"], + .input-group-sm input[type="time"], + .input-group-sm input[type="datetime-local"], + .input-group-sm input[type="month"] { + line-height: 30px; + } + input[type="date"].input-lg, + input[type="time"].input-lg, + input[type="datetime-local"].input-lg, + input[type="month"].input-lg, + .input-group-lg input[type="date"], + .input-group-lg input[type="time"], + .input-group-lg input[type="datetime-local"], + .input-group-lg input[type="month"] { + line-height: 46px; + } +} +.form-group { + margin-bottom: 15px; +} +.radio, +.checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; +} +.radio label, +.checkbox label { + min-height: 20px; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; +} +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + position: absolute; + margin-top: 4px \9; + margin-left: -20px; +} +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; +} +.radio-inline, +.checkbox-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + vertical-align: middle; + cursor: pointer; +} +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; +} +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"].disabled, +input[type="checkbox"].disabled, +fieldset[disabled] input[type="radio"], +fieldset[disabled] input[type="checkbox"] { + cursor: not-allowed; +} +.radio-inline.disabled, +.checkbox-inline.disabled, +fieldset[disabled] .radio-inline, +fieldset[disabled] .checkbox-inline { + cursor: not-allowed; +} +.radio.disabled label, +.checkbox.disabled label, +fieldset[disabled] .radio label, +fieldset[disabled] .checkbox label { + cursor: not-allowed; +} +.form-control-static { + min-height: 34px; + padding-top: 7px; + padding-bottom: 7px; + margin-bottom: 0; +} +.form-control-static.input-lg, +.form-control-static.input-sm { + padding-right: 0; + padding-left: 0; +} +.input-sm { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-sm { + height: 30px; + line-height: 30px; +} +textarea.input-sm, +select[multiple].input-sm { + height: auto; +} +.form-group-sm .form-control { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.form-group-sm .form-control { + height: 30px; + line-height: 30px; +} +textarea.form-group-sm .form-control, +select[multiple].form-group-sm .form-control { + height: auto; +} +.form-group-sm .form-control-static { + height: 30px; + min-height: 32px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; +} +.input-lg { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-lg { + height: 46px; + line-height: 46px; +} +textarea.input-lg, +select[multiple].input-lg { + height: auto; +} +.form-group-lg .form-control { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.form-group-lg .form-control { + height: 46px; + line-height: 46px; +} +textarea.form-group-lg .form-control, +select[multiple].form-group-lg .form-control { + height: auto; +} +.form-group-lg .form-control-static { + height: 46px; + min-height: 38px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; +} +.has-feedback { + position: relative; +} +.has-feedback .form-control { + padding-right: 42.5px; +} +.form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 34px; + height: 34px; + line-height: 34px; + text-align: center; + pointer-events: none; +} +.input-lg + .form-control-feedback { + width: 46px; + height: 46px; + line-height: 46px; +} +.input-sm + .form-control-feedback { + width: 30px; + height: 30px; + line-height: 30px; +} +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline, +.has-success.radio label, +.has-success.checkbox label, +.has-success.radio-inline label, +.has-success.checkbox-inline label { + color: #3c763d; +} +.has-success .form-control { + border-color: #3c763d; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-success .form-control:focus { + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; +} +.has-success .input-group-addon { + color: #3c763d; + background-color: #dff0d8; + border-color: #3c763d; +} +.has-success .form-control-feedback { + color: #3c763d; +} +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline, +.has-warning.radio label, +.has-warning.checkbox label, +.has-warning.radio-inline label, +.has-warning.checkbox-inline label { + color: #8a6d3b; +} +.has-warning .form-control { + border-color: #8a6d3b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-warning .form-control:focus { + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; +} +.has-warning .input-group-addon { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #8a6d3b; +} +.has-warning .form-control-feedback { + color: #8a6d3b; +} +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline, +.has-error.radio label, +.has-error.checkbox label, +.has-error.radio-inline label, +.has-error.checkbox-inline label { + color: #a94442; +} +.has-error .form-control { + border-color: #a94442; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-error .form-control:focus { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; +} +.has-error .input-group-addon { + color: #a94442; + background-color: #f2dede; + border-color: #a94442; +} +.has-error .form-control-feedback { + color: #a94442; +} +.has-feedback label ~ .form-control-feedback { + top: 25px; +} +.has-feedback label.sr-only ~ .form-control-feedback { + top: 0; +} +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #737373; +} +@media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-static { + display: inline-block; + } + .form-inline .input-group { + display: inline-table; + vertical-align: middle; + } + .form-inline .input-group .input-group-addon, + .form-inline .input-group .input-group-btn, + .form-inline .input-group .form-control { + width: auto; + } + .form-inline .input-group > .form-control { + width: 100%; + } + .form-inline .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio label, + .form-inline .checkbox label { + padding-left: 0; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .form-inline .has-feedback .form-control-feedback { + top: 0; + } +} +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + padding-top: 7px; + margin-top: 0; + margin-bottom: 0; +} +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 27px; +} +.form-horizontal .form-group { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .form-horizontal .control-label { + padding-top: 7px; + margin-bottom: 0; + text-align: right; + } +} +.form-horizontal .has-feedback .form-control-feedback { + right: 15px; +} +@media (min-width: 768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 14.333333px; + } +} +@media (min-width: 768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 6px; + } +} +.btn { + display: inline-block; + padding: 6px 12px; + margin-bottom: 0; + font-size: 14px; + font-weight: normal; + line-height: 1.42857143; + text-align: center; + white-space: nowrap; + vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.btn:focus, +.btn:active:focus, +.btn.active:focus, +.btn.focus, +.btn:active.focus, +.btn.active.focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn:hover, +.btn:focus, +.btn.focus { + color: #333; + text-decoration: none; +} +.btn:active, +.btn.active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + pointer-events: none; + cursor: not-allowed; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; + opacity: .65; +} +.btn-default { + color: #333; + background-color: #fff; + border-color: #ccc; +} +.btn-default:hover, +.btn-default:focus, +.btn-default.focus, +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + background-image: none; +} +.btn-default.disabled, +.btn-default[disabled], +fieldset[disabled] .btn-default, +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus, +.btn-default.disabled:active, +.btn-default[disabled]:active, +fieldset[disabled] .btn-default:active, +.btn-default.disabled.active, +.btn-default[disabled].active, +fieldset[disabled] .btn-default.active { + background-color: #fff; + border-color: #ccc; +} +.btn-default .badge { + color: #fff; + background-color: #333; +} +.btn-primary { + color: #fff; + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary:hover, +.btn-primary:focus, +.btn-primary.focus, +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + color: #fff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + background-image: none; +} +.btn-primary.disabled, +.btn-primary[disabled], +fieldset[disabled] .btn-primary, +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus, +.btn-primary.disabled:active, +.btn-primary[disabled]:active, +fieldset[disabled] .btn-primary:active, +.btn-primary.disabled.active, +.btn-primary[disabled].active, +fieldset[disabled] .btn-primary.active { + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary .badge { + color: #337ab7; + background-color: #fff; +} +.btn-success { + color: #fff; + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success:hover, +.btn-success:focus, +.btn-success.focus, +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + color: #fff; + background-color: #449d44; + border-color: #398439; +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + background-image: none; +} +.btn-success.disabled, +.btn-success[disabled], +fieldset[disabled] .btn-success, +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled.focus, +.btn-success[disabled].focus, +fieldset[disabled] .btn-success.focus, +.btn-success.disabled:active, +.btn-success[disabled]:active, +fieldset[disabled] .btn-success:active, +.btn-success.disabled.active, +.btn-success[disabled].active, +fieldset[disabled] .btn-success.active { + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success .badge { + color: #5cb85c; + background-color: #fff; +} +.btn-info { + color: #fff; + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info:hover, +.btn-info:focus, +.btn-info.focus, +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + background-image: none; +} +.btn-info.disabled, +.btn-info[disabled], +fieldset[disabled] .btn-info, +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled.focus, +.btn-info[disabled].focus, +fieldset[disabled] .btn-info.focus, +.btn-info.disabled:active, +.btn-info[disabled]:active, +fieldset[disabled] .btn-info:active, +.btn-info.disabled.active, +.btn-info[disabled].active, +fieldset[disabled] .btn-info.active { + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info .badge { + color: #5bc0de; + background-color: #fff; +} +.btn-warning { + color: #fff; + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning:hover, +.btn-warning:focus, +.btn-warning.focus, +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + color: #fff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + background-image: none; +} +.btn-warning.disabled, +.btn-warning[disabled], +fieldset[disabled] .btn-warning, +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled.focus, +.btn-warning[disabled].focus, +fieldset[disabled] .btn-warning.focus, +.btn-warning.disabled:active, +.btn-warning[disabled]:active, +fieldset[disabled] .btn-warning:active, +.btn-warning.disabled.active, +.btn-warning[disabled].active, +fieldset[disabled] .btn-warning.active { + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning .badge { + color: #f0ad4e; + background-color: #fff; +} +.btn-danger { + color: #fff; + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger:hover, +.btn-danger:focus, +.btn-danger.focus, +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + background-image: none; +} +.btn-danger.disabled, +.btn-danger[disabled], +fieldset[disabled] .btn-danger, +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled.focus, +.btn-danger[disabled].focus, +fieldset[disabled] .btn-danger.focus, +.btn-danger.disabled:active, +.btn-danger[disabled]:active, +fieldset[disabled] .btn-danger:active, +.btn-danger.disabled.active, +.btn-danger[disabled].active, +fieldset[disabled] .btn-danger.active { + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger .badge { + color: #d9534f; + background-color: #fff; +} +.btn-link { + font-weight: normal; + color: #337ab7; + border-radius: 0; +} +.btn-link, +.btn-link:active, +.btn-link.active, +.btn-link[disabled], +fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-link, +.btn-link:hover, +.btn-link:focus, +.btn-link:active { + border-color: transparent; +} +.btn-link:hover, +.btn-link:focus { + color: #23527c; + text-decoration: underline; + background-color: transparent; +} +.btn-link[disabled]:hover, +fieldset[disabled] .btn-link:hover, +.btn-link[disabled]:focus, +fieldset[disabled] .btn-link:focus { + color: #777; + text-decoration: none; +} +.btn-lg, +.btn-group-lg > .btn { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.btn-sm, +.btn-group-sm > .btn { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-xs, +.btn-group-xs > .btn { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-block { + display: block; + width: 100%; +} +.btn-block + .btn-block { + margin-top: 5px; +} +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} +.fade { + opacity: 0; + -webkit-transition: opacity .15s linear; + -o-transition: opacity .15s linear; + transition: opacity .15s linear; +} +.fade.in { + opacity: 1; +} +.collapse { + display: none; +} +.collapse.in { + display: block; +} +tr.collapse.in { + display: table-row; +} +tbody.collapse.in { + display: table-row-group; +} +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; + -webkit-transition-duration: .35s; + -o-transition-duration: .35s; + transition-duration: .35s; + -webkit-transition-property: height, visibility; + -o-transition-property: height, visibility; + transition-property: height, visibility; +} +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px dashed; + border-right: 4px solid transparent; + border-left: 4px solid transparent; +} +.dropup, +.dropdown { + position: relative; +} +.dropdown-toggle:focus { + outline: 0; +} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + font-size: 14px; + text-align: left; + list-style: none; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .15); + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); + box-shadow: 0 6px 12px rgba(0, 0, 0, .175); +} +.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.dropdown-menu .divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.42857143; + color: #333; + white-space: nowrap; +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + color: #262626; + text-decoration: none; + background-color: #f5f5f5; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #fff; + text-decoration: none; + background-color: #337ab7; + outline: 0; +} +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #777; +} +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + cursor: not-allowed; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.open > .dropdown-menu { + display: block; +} +.open > a { + outline: 0; +} +.dropdown-menu-right { + right: 0; + left: auto; +} +.dropdown-menu-left { + right: auto; + left: 0; +} +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.42857143; + color: #777; + white-space: nowrap; +} +.dropdown-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 990; +} +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + content: ""; + border-top: 0; + border-bottom: 4px solid; +} +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; +} +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + right: 0; + left: auto; + } + .navbar-right .dropdown-menu-left { + right: auto; + left: 0; + } +} +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + float: left; +} +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover, +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus, +.btn-group > .btn:active, +.btn-group-vertical > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn.active { + z-index: 2; +} +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group { + margin-left: -1px; +} +.btn-toolbar { + margin-left: -5px; +} +.btn-toolbar .btn-group, +.btn-toolbar .input-group { + float: left; +} +.btn-toolbar > .btn, +.btn-toolbar > .btn-group, +.btn-toolbar > .input-group { + margin-left: 5px; +} +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} +.btn-group > .btn:first-child { + margin-left: 0; +} +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group > .btn-group { + float: left; +} +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} +.btn-group > .btn + .dropdown-toggle { + padding-right: 8px; + padding-left: 8px; +} +.btn-group > .btn-lg + .dropdown-toggle { + padding-right: 12px; + padding-left: 12px; +} +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn .caret { + margin-left: 0; +} +.btn-lg .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; +} +.dropup .btn-lg .caret { + border-width: 0 5px 5px; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group, +.btn-group-vertical > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; +} +.btn-group-vertical > .btn-group > .btn { + float: none; +} +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; +} +.btn-group-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; +} +.btn-group-vertical > .btn:first-child:not(:last-child) { + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn:last-child:not(:first-child) { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-left-radius: 4px; +} +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; +} +.btn-group-justified > .btn, +.btn-group-justified > .btn-group { + display: table-cell; + float: none; + width: 1%; +} +.btn-group-justified > .btn-group .btn { + width: 100%; +} +.btn-group-justified > .btn-group .dropdown-menu { + left: auto; +} +[data-toggle="buttons"] > .btn input[type="radio"], +[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], +[data-toggle="buttons"] > .btn input[type="checkbox"], +[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} +.input-group { + position: relative; + display: table; + border-collapse: separate; +} +.input-group[class*="col-"] { + float: none; + padding-right: 0; + padding-left: 0; +} +.input-group .form-control { + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0; +} +.input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-group-lg > .form-control, +select.input-group-lg > .input-group-addon, +select.input-group-lg > .input-group-btn > .btn { + height: 46px; + line-height: 46px; +} +textarea.input-group-lg > .form-control, +textarea.input-group-lg > .input-group-addon, +textarea.input-group-lg > .input-group-btn > .btn, +select[multiple].input-group-lg > .form-control, +select[multiple].input-group-lg > .input-group-addon, +select[multiple].input-group-lg > .input-group-btn > .btn { + height: auto; +} +.input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-group-sm > .form-control, +select.input-group-sm > .input-group-addon, +select.input-group-sm > .input-group-btn > .btn { + height: 30px; + line-height: 30px; +} +textarea.input-group-sm > .form-control, +textarea.input-group-sm > .input-group-addon, +textarea.input-group-sm > .input-group-btn > .btn, +select[multiple].input-group-sm > .form-control, +select[multiple].input-group-sm > .input-group-addon, +select[multiple].input-group-sm > .input-group-btn > .btn { + height: auto; +} +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; +} +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; +} +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; +} +.input-group-addon { + padding: 6px 12px; + font-size: 14px; + font-weight: normal; + line-height: 1; + color: #555; + text-align: center; + background-color: #eee; + border: 1px solid #ccc; + border-radius: 4px; +} +.input-group-addon.input-sm { + padding: 5px 10px; + font-size: 12px; + border-radius: 3px; +} +.input-group-addon.input-lg { + padding: 10px 16px; + font-size: 18px; + border-radius: 6px; +} +.input-group-addon input[type="radio"], +.input-group-addon input[type="checkbox"] { + margin-top: 0; +} +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group-addon:first-child { + border-right: 0; +} +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child), +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.input-group-addon:last-child { + border-left: 0; +} +.input-group-btn { + position: relative; + font-size: 0; + white-space: nowrap; +} +.input-group-btn > .btn { + position: relative; +} +.input-group-btn > .btn + .btn { + margin-left: -1px; +} +.input-group-btn > .btn:hover, +.input-group-btn > .btn:focus, +.input-group-btn > .btn:active { + z-index: 2; +} +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group { + margin-right: -1px; +} +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group { + margin-left: -1px; +} +.nav { + padding-left: 0; + margin-bottom: 0; + list-style: none; +} +.nav > li { + position: relative; + display: block; +} +.nav > li > a { + position: relative; + display: block; + padding: 10px 15px; +} +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #eee; +} +.nav > li.disabled > a { + color: #777; +} +.nav > li.disabled > a:hover, +.nav > li.disabled > a:focus { + color: #777; + text-decoration: none; + cursor: not-allowed; + background-color: transparent; +} +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + background-color: #eee; + border-color: #337ab7; +} +.nav .nav-divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.nav > li > a > img { + max-width: none; +} +.nav-tabs { + border-bottom: 1px solid #ddd; +} +.nav-tabs > li { + float: left; + margin-bottom: -1px; +} +.nav-tabs > li > a { + margin-right: 2px; + line-height: 1.42857143; + border: 1px solid transparent; + border-radius: 4px 4px 0 0; +} +.nav-tabs > li > a:hover { + border-color: #eee #eee #ddd; +} +.nav-tabs > li.active > a, +.nav-tabs > li.active > a:hover, +.nav-tabs > li.active > a:focus { + color: #555; + cursor: default; + background-color: #fff; + border: 1px solid #ddd; + border-bottom-color: transparent; +} +.nav-tabs.nav-justified { + width: 100%; + border-bottom: 0; +} +.nav-tabs.nav-justified > li { + float: none; +} +.nav-tabs.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +.nav-tabs.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-tabs.nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs.nav-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs.nav-justified > .active > a, +.nav-tabs.nav-justified > .active > a:hover, +.nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs.nav-justified > .active > a, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:focus { + border-bottom-color: #fff; + } +} +.nav-pills > li { + float: left; +} +.nav-pills > li > a { + border-radius: 4px; +} +.nav-pills > li + li { + margin-left: 2px; +} +.nav-pills > li.active > a, +.nav-pills > li.active > a:hover, +.nav-pills > li.active > a:focus { + color: #fff; + background-color: #337ab7; +} +.nav-stacked > li { + float: none; +} +.nav-stacked > li + li { + margin-top: 2px; + margin-left: 0; +} +.nav-justified { + width: 100%; +} +.nav-justified > li { + float: none; +} +.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs-justified { + border-bottom: 0; +} +.nav-tabs-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs-justified > .active > a, +.nav-tabs-justified > .active > a:hover, +.nav-tabs-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus { + border-bottom-color: #fff; + } +} +.tab-content > .tab-pane { + display: none; +} +.tab-content > .active { + display: block; +} +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.navbar { + position: relative; + min-height: 50px; + margin-bottom: 20px; + border: 1px solid transparent; +} +@media (min-width: 768px) { + .navbar { + border-radius: 4px; + } +} +@media (min-width: 768px) { + .navbar-header { + float: left; + } +} +.navbar-collapse { + padding-right: 15px; + padding-left: 15px; + overflow-x: visible; + -webkit-overflow-scrolling: touch; + border-top: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); +} +.navbar-collapse.in { + overflow-y: auto; +} +@media (min-width: 768px) { + .navbar-collapse { + width: auto; + border-top: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; + } + .navbar-collapse.in { + overflow-y: visible; + } + .navbar-fixed-top .navbar-collapse, + .navbar-static-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + padding-right: 0; + padding-left: 0; + } +} +.navbar-fixed-top .navbar-collapse, +.navbar-fixed-bottom .navbar-collapse { + max-height: 340px; +} +@media (max-device-width: 480px) and (orientation: landscape) { + .navbar-fixed-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + max-height: 200px; + } +} +.container > .navbar-header, +.container-fluid > .navbar-header, +.container > .navbar-collapse, +.container-fluid > .navbar-collapse { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .container > .navbar-header, + .container-fluid > .navbar-header, + .container > .navbar-collapse, + .container-fluid > .navbar-collapse { + margin-right: 0; + margin-left: 0; + } +} +.navbar-static-top { + z-index: 1000; + border-width: 0 0 1px; +} +@media (min-width: 768px) { + .navbar-static-top { + border-radius: 0; + } +} +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; +} +@media (min-width: 768px) { + .navbar-fixed-top, + .navbar-fixed-bottom { + border-radius: 0; + } +} +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; +} +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0; +} +.navbar-brand { + float: left; + height: 50px; + padding: 15px 15px; + font-size: 18px; + line-height: 20px; +} +.navbar-brand:hover, +.navbar-brand:focus { + text-decoration: none; +} +.navbar-brand > img { + display: block; +} +@media (min-width: 768px) { + .navbar > .container .navbar-brand, + .navbar > .container-fluid .navbar-brand { + margin-left: -15px; + } +} +.navbar-toggle { + position: relative; + float: right; + padding: 9px 10px; + margin-top: 8px; + margin-right: 15px; + margin-bottom: 8px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.navbar-toggle:focus { + outline: 0; +} +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; +} +.navbar-toggle .icon-bar + .icon-bar { + margin-top: 4px; +} +@media (min-width: 768px) { + .navbar-toggle { + display: none; + } +} +.navbar-nav { + margin: 7.5px -15px; +} +.navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 20px; +} +@media (max-width: 767px) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; + } + .navbar-nav .open .dropdown-menu > li > a { + line-height: 20px; + } + .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-nav .open .dropdown-menu > li > a:focus { + background-image: none; + } +} +@media (min-width: 768px) { + .navbar-nav { + float: left; + margin: 0; + } + .navbar-nav > li { + float: left; + } + .navbar-nav > li > a { + padding-top: 15px; + padding-bottom: 15px; + } +} +.navbar-form { + padding: 10px 15px; + margin-top: 8px; + margin-right: -15px; + margin-bottom: 8px; + margin-left: -15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); +} +@media (min-width: 768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .navbar-form .form-control-static { + display: inline-block; + } + .navbar-form .input-group { + display: inline-table; + vertical-align: middle; + } + .navbar-form .input-group .input-group-addon, + .navbar-form .input-group .input-group-btn, + .navbar-form .input-group .form-control { + width: auto; + } + .navbar-form .input-group > .form-control { + width: 100%; + } + .navbar-form .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio, + .navbar-form .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio label, + .navbar-form .checkbox label { + padding-left: 0; + } + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .navbar-form .has-feedback .form-control-feedback { + top: 0; + } +} +@media (max-width: 767px) { + .navbar-form .form-group { + margin-bottom: 5px; + } + .navbar-form .form-group:last-child { + margin-bottom: 0; + } +} +@media (min-width: 768px) { + .navbar-form { + width: auto; + padding-top: 0; + padding-bottom: 0; + margin-right: 0; + margin-left: 0; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } +} +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + margin-bottom: 0; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.navbar-btn { + margin-top: 8px; + margin-bottom: 8px; +} +.navbar-btn.btn-sm { + margin-top: 10px; + margin-bottom: 10px; +} +.navbar-btn.btn-xs { + margin-top: 14px; + margin-bottom: 14px; +} +.navbar-text { + margin-top: 15px; + margin-bottom: 15px; +} +@media (min-width: 768px) { + .navbar-text { + float: left; + margin-right: 15px; + margin-left: 15px; + } +} +@media (min-width: 768px) { + .navbar-left { + float: left !important; + } + .navbar-right { + float: right !important; + margin-right: -15px; + } + .navbar-right ~ .navbar-right { + margin-right: 0; + } +} +.navbar-default { + background-color: #f8f8f8; + border-color: #e7e7e7; +} +.navbar-default .navbar-brand { + color: #777; +} +.navbar-default .navbar-brand:hover, +.navbar-default .navbar-brand:focus { + color: #5e5e5e; + background-color: transparent; +} +.navbar-default .navbar-text { + color: #777; +} +.navbar-default .navbar-nav > li > a { + color: #777; +} +.navbar-default .navbar-nav > li > a:hover, +.navbar-default .navbar-nav > li > a:focus { + color: #333; + background-color: transparent; +} +.navbar-default .navbar-nav > .active > a, +.navbar-default .navbar-nav > .active > a:hover, +.navbar-default .navbar-nav > .active > a:focus { + color: #555; + background-color: #e7e7e7; +} +.navbar-default .navbar-nav > .disabled > a, +.navbar-default .navbar-nav > .disabled > a:hover, +.navbar-default .navbar-nav > .disabled > a:focus { + color: #ccc; + background-color: transparent; +} +.navbar-default .navbar-toggle { + border-color: #ddd; +} +.navbar-default .navbar-toggle:hover, +.navbar-default .navbar-toggle:focus { + background-color: #ddd; +} +.navbar-default .navbar-toggle .icon-bar { + background-color: #888; +} +.navbar-default .navbar-collapse, +.navbar-default .navbar-form { + border-color: #e7e7e7; +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .open > a:hover, +.navbar-default .navbar-nav > .open > a:focus { + color: #555; + background-color: #e7e7e7; +} +@media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #777; + } + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #333; + background-color: transparent; + } + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #555; + background-color: #e7e7e7; + } + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #ccc; + background-color: transparent; + } +} +.navbar-default .navbar-link { + color: #777; +} +.navbar-default .navbar-link:hover { + color: #333; +} +.navbar-default .btn-link { + color: #777; +} +.navbar-default .btn-link:hover, +.navbar-default .btn-link:focus { + color: #333; +} +.navbar-default .btn-link[disabled]:hover, +fieldset[disabled] .navbar-default .btn-link:hover, +.navbar-default .btn-link[disabled]:focus, +fieldset[disabled] .navbar-default .btn-link:focus { + color: #ccc; +} +.navbar-inverse { + background-color: #222; + border-color: #080808; +} +.navbar-inverse .navbar-brand { + color: #9d9d9d; +} +.navbar-inverse .navbar-brand:hover, +.navbar-inverse .navbar-brand:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-text { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a:hover, +.navbar-inverse .navbar-nav > li > a:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-nav > .active > a, +.navbar-inverse .navbar-nav > .active > a:hover, +.navbar-inverse .navbar-nav > .active > a:focus { + color: #fff; + background-color: #080808; +} +.navbar-inverse .navbar-nav > .disabled > a, +.navbar-inverse .navbar-nav > .disabled > a:hover, +.navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444; + background-color: transparent; +} +.navbar-inverse .navbar-toggle { + border-color: #333; +} +.navbar-inverse .navbar-toggle:hover, +.navbar-inverse .navbar-toggle:focus { + background-color: #333; +} +.navbar-inverse .navbar-toggle .icon-bar { + background-color: #fff; +} +.navbar-inverse .navbar-collapse, +.navbar-inverse .navbar-form { + border-color: #101010; +} +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .open > a:hover, +.navbar-inverse .navbar-nav > .open > a:focus { + color: #fff; + background-color: #080808; +} +@media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #9d9d9d; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #fff; + background-color: transparent; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #fff; + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #444; + background-color: transparent; + } +} +.navbar-inverse .navbar-link { + color: #9d9d9d; +} +.navbar-inverse .navbar-link:hover { + color: #fff; +} +.navbar-inverse .btn-link { + color: #9d9d9d; +} +.navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link:focus { + color: #fff; +} +.navbar-inverse .btn-link[disabled]:hover, +fieldset[disabled] .navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link[disabled]:focus, +fieldset[disabled] .navbar-inverse .btn-link:focus { + color: #444; +} +.breadcrumb { + padding: 8px 15px; + margin-bottom: 20px; + list-style: none; + background-color: #f5f5f5; + border-radius: 4px; +} +.breadcrumb > li { + display: inline-block; +} +.breadcrumb > li + li:before { + padding: 0 5px; + color: #ccc; + content: "/\00a0"; +} +.breadcrumb > .active { + color: #777; +} +.pagination { + display: inline-block; + padding-left: 0; + margin: 20px 0; + border-radius: 4px; +} +.pagination > li { + display: inline; +} +.pagination > li > a, +.pagination > li > span { + position: relative; + float: left; + padding: 6px 12px; + margin-left: -1px; + line-height: 1.42857143; + color: #337ab7; + text-decoration: none; + background-color: #fff; + border: 1px solid #ddd; +} +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; +} +.pagination > li:last-child > a, +.pagination > li:last-child > span { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} +.pagination > li > a:hover, +.pagination > li > span:hover, +.pagination > li > a:focus, +.pagination > li > span:focus { + color: #23527c; + background-color: #eee; + border-color: #ddd; +} +.pagination > .active > a, +.pagination > .active > span, +.pagination > .active > a:hover, +.pagination > .active > span:hover, +.pagination > .active > a:focus, +.pagination > .active > span:focus { + z-index: 2; + color: #fff; + cursor: default; + background-color: #337ab7; + border-color: #337ab7; +} +.pagination > .disabled > span, +.pagination > .disabled > span:hover, +.pagination > .disabled > span:focus, +.pagination > .disabled > a, +.pagination > .disabled > a:hover, +.pagination > .disabled > a:focus { + color: #777; + cursor: not-allowed; + background-color: #fff; + border-color: #ddd; +} +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 10px 16px; + font-size: 18px; +} +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; +} +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; +} +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 5px 10px; + font-size: 12px; +} +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; +} +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} +.pager { + padding-left: 0; + margin: 20px 0; + text-align: center; + list-style: none; +} +.pager li { + display: inline; +} +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 15px; +} +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #eee; +} +.pager .next > a, +.pager .next > span { + float: right; +} +.pager .previous > a, +.pager .previous > span { + float: left; +} +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #777; + cursor: not-allowed; + background-color: #fff; +} +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} +a.label:hover, +a.label:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.label:empty { + display: none; +} +.btn .label { + position: relative; + top: -1px; +} +.label-default { + background-color: #777; +} +.label-default[href]:hover, +.label-default[href]:focus { + background-color: #5e5e5e; +} +.label-primary { + background-color: #337ab7; +} +.label-primary[href]:hover, +.label-primary[href]:focus { + background-color: #286090; +} +.label-success { + background-color: #5cb85c; +} +.label-success[href]:hover, +.label-success[href]:focus { + background-color: #449d44; +} +.label-info { + background-color: #5bc0de; +} +.label-info[href]:hover, +.label-info[href]:focus { + background-color: #31b0d5; +} +.label-warning { + background-color: #f0ad4e; +} +.label-warning[href]:hover, +.label-warning[href]:focus { + background-color: #ec971f; +} +.label-danger { + background-color: #d9534f; +} +.label-danger[href]:hover, +.label-danger[href]:focus { + background-color: #c9302c; +} +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + background-color: #777; + border-radius: 10px; +} +.badge:empty { + display: none; +} +.btn .badge { + position: relative; + top: -1px; +} +.btn-xs .badge, +.btn-group-xs > .btn .badge { + top: 0; + padding: 1px 5px; +} +a.badge:hover, +a.badge:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.list-group-item.active > .badge, +.nav-pills > .active > a > .badge { + color: #337ab7; + background-color: #fff; +} +.list-group-item > .badge { + float: right; +} +.list-group-item > .badge + .badge { + margin-right: 5px; +} +.nav-pills > li > a > .badge { + margin-left: 3px; +} +.jumbotron { + padding: 30px 15px; + margin-bottom: 30px; + color: inherit; + background-color: #eee; +} +.jumbotron h1, +.jumbotron .h1 { + color: inherit; +} +.jumbotron p { + margin-bottom: 15px; + font-size: 21px; + font-weight: 200; +} +.jumbotron > hr { + border-top-color: #d5d5d5; +} +.container .jumbotron, +.container-fluid .jumbotron { + border-radius: 6px; +} +.jumbotron .container { + max-width: 100%; +} +@media screen and (min-width: 768px) { + .jumbotron { + padding: 48px 0; + } + .container .jumbotron, + .container-fluid .jumbotron { + padding-right: 60px; + padding-left: 60px; + } + .jumbotron h1, + .jumbotron .h1 { + font-size: 63px; + } +} +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 20px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: border .2s ease-in-out; + -o-transition: border .2s ease-in-out; + transition: border .2s ease-in-out; +} +.thumbnail > img, +.thumbnail a > img { + margin-right: auto; + margin-left: auto; +} +a.thumbnail:hover, +a.thumbnail:focus, +a.thumbnail.active { + border-color: #337ab7; +} +.thumbnail .caption { + padding: 9px; + color: #333; +} +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; +} +.alert h4 { + margin-top: 0; + color: inherit; +} +.alert .alert-link { + font-weight: bold; +} +.alert > p, +.alert > ul { + margin-bottom: 0; +} +.alert > p + p { + margin-top: 5px; +} +.alert-dismissable, +.alert-dismissible { + padding-right: 35px; +} +.alert-dismissable .close, +.alert-dismissible .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; +} +.alert-success { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.alert-success hr { + border-top-color: #c9e2b3; +} +.alert-success .alert-link { + color: #2b542c; +} +.alert-info { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.alert-info hr { + border-top-color: #a6e1ec; +} +.alert-info .alert-link { + color: #245269; +} +.alert-warning { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.alert-warning hr { + border-top-color: #f7e1b5; +} +.alert-warning .alert-link { + color: #66512c; +} +.alert-danger { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.alert-danger hr { + border-top-color: #e4b9c0; +} +.alert-danger .alert-link { + color: #843534; +} +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-o-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f5f5f5; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); +} +.progress-bar { + float: left; + width: 0; + height: 100%; + font-size: 12px; + line-height: 20px; + color: #fff; + text-align: center; + background-color: #337ab7; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + -webkit-transition: width .6s ease; + -o-transition: width .6s ease; + transition: width .6s ease; +} +.progress-striped .progress-bar, +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + background-size: 40px 40px; +} +.progress.active .progress-bar, +.progress-bar.active { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} +.progress-bar-success { + background-color: #5cb85c; +} +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-info { + background-color: #5bc0de; +} +.progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-warning { + background-color: #f0ad4e; +} +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-danger { + background-color: #d9534f; +} +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.media { + margin-top: 15px; +} +.media:first-child { + margin-top: 0; +} +.media, +.media-body { + overflow: hidden; + zoom: 1; +} +.media-body { + width: 10000px; +} +.media-object { + display: block; +} +.media-right, +.media > .pull-right { + padding-left: 10px; +} +.media-left, +.media > .pull-left { + padding-right: 10px; +} +.media-left, +.media-right, +.media-body { + display: table-cell; + vertical-align: top; +} +.media-middle { + vertical-align: middle; +} +.media-bottom { + vertical-align: bottom; +} +.media-heading { + margin-top: 0; + margin-bottom: 5px; +} +.media-list { + padding-left: 0; + list-style: none; +} +.list-group { + padding-left: 0; + margin-bottom: 20px; +} +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #fff; + border: 1px solid #ddd; +} +.list-group-item:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +a.list-group-item { + color: #555; +} +a.list-group-item .list-group-item-heading { + color: #333; +} +a.list-group-item:hover, +a.list-group-item:focus { + color: #555; + text-decoration: none; + background-color: #f5f5f5; +} +.list-group-item.disabled, +.list-group-item.disabled:hover, +.list-group-item.disabled:focus { + color: #777; + cursor: not-allowed; + background-color: #eee; +} +.list-group-item.disabled .list-group-item-heading, +.list-group-item.disabled:hover .list-group-item-heading, +.list-group-item.disabled:focus .list-group-item-heading { + color: inherit; +} +.list-group-item.disabled .list-group-item-text, +.list-group-item.disabled:hover .list-group-item-text, +.list-group-item.disabled:focus .list-group-item-text { + color: #777; +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + z-index: 2; + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.list-group-item.active .list-group-item-heading, +.list-group-item.active:hover .list-group-item-heading, +.list-group-item.active:focus .list-group-item-heading, +.list-group-item.active .list-group-item-heading > small, +.list-group-item.active:hover .list-group-item-heading > small, +.list-group-item.active:focus .list-group-item-heading > small, +.list-group-item.active .list-group-item-heading > .small, +.list-group-item.active:hover .list-group-item-heading > .small, +.list-group-item.active:focus .list-group-item-heading > .small { + color: inherit; +} +.list-group-item.active .list-group-item-text, +.list-group-item.active:hover .list-group-item-text, +.list-group-item.active:focus .list-group-item-text { + color: #c7ddef; +} +.list-group-item-success { + color: #3c763d; + background-color: #dff0d8; +} +a.list-group-item-success { + color: #3c763d; +} +a.list-group-item-success .list-group-item-heading { + color: inherit; +} +a.list-group-item-success:hover, +a.list-group-item-success:focus { + color: #3c763d; + background-color: #d0e9c6; +} +a.list-group-item-success.active, +a.list-group-item-success.active:hover, +a.list-group-item-success.active:focus { + color: #fff; + background-color: #3c763d; + border-color: #3c763d; +} +.list-group-item-info { + color: #31708f; + background-color: #d9edf7; +} +a.list-group-item-info { + color: #31708f; +} +a.list-group-item-info .list-group-item-heading { + color: inherit; +} +a.list-group-item-info:hover, +a.list-group-item-info:focus { + color: #31708f; + background-color: #c4e3f3; +} +a.list-group-item-info.active, +a.list-group-item-info.active:hover, +a.list-group-item-info.active:focus { + color: #fff; + background-color: #31708f; + border-color: #31708f; +} +.list-group-item-warning { + color: #8a6d3b; + background-color: #fcf8e3; +} +a.list-group-item-warning { + color: #8a6d3b; +} +a.list-group-item-warning .list-group-item-heading { + color: inherit; +} +a.list-group-item-warning:hover, +a.list-group-item-warning:focus { + color: #8a6d3b; + background-color: #faf2cc; +} +a.list-group-item-warning.active, +a.list-group-item-warning.active:hover, +a.list-group-item-warning.active:focus { + color: #fff; + background-color: #8a6d3b; + border-color: #8a6d3b; +} +.list-group-item-danger { + color: #a94442; + background-color: #f2dede; +} +a.list-group-item-danger { + color: #a94442; +} +a.list-group-item-danger .list-group-item-heading { + color: inherit; +} +a.list-group-item-danger:hover, +a.list-group-item-danger:focus { + color: #a94442; + background-color: #ebcccc; +} +a.list-group-item-danger.active, +a.list-group-item-danger.active:hover, +a.list-group-item-danger.active:focus { + color: #fff; + background-color: #a94442; + border-color: #a94442; +} +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} +.panel { + margin-bottom: 20px; + background-color: #fff; + border: 1px solid transparent; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: 0 1px 1px rgba(0, 0, 0, .05); +} +.panel-body { + padding: 15px; +} +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel-heading > .dropdown .dropdown-toggle { + color: inherit; +} +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; +} +.panel-title > a, +.panel-title > small, +.panel-title > .small, +.panel-title > small > a, +.panel-title > .small > a { + color: inherit; +} +.panel-footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .list-group, +.panel > .panel-collapse > .list-group { + margin-bottom: 0; +} +.panel > .list-group .list-group-item, +.panel > .panel-collapse > .list-group .list-group-item { + border-width: 1px 0; + border-radius: 0; +} +.panel > .list-group:first-child .list-group-item:first-child, +.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { + border-top: 0; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .list-group:last-child .list-group-item:last-child, +.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { + border-bottom: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; +} +.list-group + .panel-footer { + border-top-width: 0; +} +.panel > .table, +.panel > .table-responsive > .table, +.panel > .panel-collapse > .table { + margin-bottom: 0; +} +.panel > .table caption, +.panel > .table-responsive > .table caption, +.panel > .panel-collapse > .table caption { + padding-right: 15px; + padding-left: 15px; +} +.panel > .table:first-child, +.panel > .table-responsive:first-child > .table:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { + border-top-left-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { + border-top-right-radius: 3px; +} +.panel > .table:last-child, +.panel > .table-responsive:last-child > .table:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { + border-bottom-right-radius: 3px; +} +.panel > .panel-body + .table, +.panel > .panel-body + .table-responsive, +.panel > .table + .panel-body, +.panel > .table-responsive + .panel-body { + border-top: 1px solid #ddd; +} +.panel > .table > tbody:first-child > tr:first-child th, +.panel > .table > tbody:first-child > tr:first-child td { + border-top: 0; +} +.panel > .table-bordered, +.panel > .table-responsive > .table-bordered { + border: 0; +} +.panel > .table-bordered > thead > tr > th:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +.panel > .table-bordered > tbody > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +.panel > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-bordered > thead > tr > td:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +.panel > .table-bordered > tbody > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +.panel > .table-bordered > tfoot > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; +} +.panel > .table-bordered > thead > tr > th:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +.panel > .table-bordered > tbody > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +.panel > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-bordered > thead > tr > td:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +.panel > .table-bordered > tbody > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +.panel > .table-bordered > tfoot > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; +} +.panel > .table-bordered > thead > tr:first-child > td, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, +.panel > .table-bordered > tbody > tr:first-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, +.panel > .table-bordered > thead > tr:first-child > th, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, +.panel > .table-bordered > tbody > tr:first-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { + border-bottom: 0; +} +.panel > .table-bordered > tbody > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, +.panel > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-bordered > tbody > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, +.panel > .table-bordered > tfoot > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { + border-bottom: 0; +} +.panel > .table-responsive { + margin-bottom: 0; + border: 0; +} +.panel-group { + margin-bottom: 20px; +} +.panel-group .panel { + margin-bottom: 0; + border-radius: 4px; +} +.panel-group .panel + .panel { + margin-top: 5px; +} +.panel-group .panel-heading { + border-bottom: 0; +} +.panel-group .panel-heading + .panel-collapse > .panel-body, +.panel-group .panel-heading + .panel-collapse > .list-group { + border-top: 1px solid #ddd; +} +.panel-group .panel-footer { + border-top: 0; +} +.panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #ddd; +} +.panel-default { + border-color: #ddd; +} +.panel-default > .panel-heading { + color: #333; + background-color: #f5f5f5; + border-color: #ddd; +} +.panel-default > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ddd; +} +.panel-default > .panel-heading .badge { + color: #f5f5f5; + background-color: #333; +} +.panel-default > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ddd; +} +.panel-primary { + border-color: #337ab7; +} +.panel-primary > .panel-heading { + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.panel-primary > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #337ab7; +} +.panel-primary > .panel-heading .badge { + color: #337ab7; + background-color: #fff; +} +.panel-primary > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #337ab7; +} +.panel-success { + border-color: #d6e9c6; +} +.panel-success > .panel-heading { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.panel-success > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #d6e9c6; +} +.panel-success > .panel-heading .badge { + color: #dff0d8; + background-color: #3c763d; +} +.panel-success > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #d6e9c6; +} +.panel-info { + border-color: #bce8f1; +} +.panel-info > .panel-heading { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.panel-info > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #bce8f1; +} +.panel-info > .panel-heading .badge { + color: #d9edf7; + background-color: #31708f; +} +.panel-info > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #bce8f1; +} +.panel-warning { + border-color: #faebcc; +} +.panel-warning > .panel-heading { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.panel-warning > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #faebcc; +} +.panel-warning > .panel-heading .badge { + color: #fcf8e3; + background-color: #8a6d3b; +} +.panel-warning > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #faebcc; +} +.panel-danger { + border-color: #ebccd1; +} +.panel-danger > .panel-heading { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.panel-danger > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ebccd1; +} +.panel-danger > .panel-heading .badge { + color: #f2dede; + background-color: #a94442; +} +.panel-danger > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ebccd1; +} +.embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden; +} +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0; +} +.embed-responsive-16by9 { + padding-bottom: 56.25%; +} +.embed-responsive-4by3 { + padding-bottom: 75%; +} +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); +} +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, .15); +} +.well-lg { + padding: 24px; + border-radius: 6px; +} +.well-sm { + padding: 9px; + border-radius: 3px; +} +.close { + float: right; + font-size: 21px; + font-weight: bold; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + filter: alpha(opacity=20); + opacity: .2; +} +.close:hover, +.close:focus { + color: #000; + text-decoration: none; + cursor: pointer; + filter: alpha(opacity=50); + opacity: .5; +} +button.close { + -webkit-appearance: none; + padding: 0; + cursor: pointer; + background: transparent; + border: 0; +} +.modal-open { + overflow: hidden; +} +.modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + display: none; + overflow: hidden; + -webkit-overflow-scrolling: touch; + outline: 0; +} +.modal.fade .modal-dialog { + -webkit-transition: -webkit-transform .3s ease-out; + -o-transition: -o-transform .3s ease-out; + transition: transform .3s ease-out; + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); +} +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} +.modal-dialog { + position: relative; + width: auto; + margin: 10px; +} +.modal-content { + position: relative; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + outline: 0; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5); + box-shadow: 0 3px 9px rgba(0, 0, 0, .5); +} +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000; +} +.modal-backdrop.fade { + filter: alpha(opacity=0); + opacity: 0; +} +.modal-backdrop.in { + filter: alpha(opacity=50); + opacity: .5; +} +.modal-header { + min-height: 16.42857143px; + padding: 15px; + border-bottom: 1px solid #e5e5e5; +} +.modal-header .close { + margin-top: -2px; +} +.modal-title { + margin: 0; + line-height: 1.42857143; +} +.modal-body { + position: relative; + padding: 15px; +} +.modal-footer { + padding: 15px; + text-align: right; + border-top: 1px solid #e5e5e5; +} +.modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; +} +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} +@media (min-width: 768px) { + .modal-dialog { + width: 600px; + margin: 30px auto; + } + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + } + .modal-sm { + width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg { + width: 900px; + } +} +.tooltip { + position: absolute; + z-index: 1070; + display: block; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 12px; + font-weight: normal; + line-height: 1.4; + filter: alpha(opacity=0); + opacity: 0; +} +.tooltip.in { + filter: alpha(opacity=90); + opacity: .9; +} +.tooltip.top { + padding: 5px 0; + margin-top: -3px; +} +.tooltip.right { + padding: 0 5px; + margin-left: 3px; +} +.tooltip.bottom { + padding: 5px 0; + margin-top: 3px; +} +.tooltip.left { + padding: 0 5px; + margin-left: -3px; +} +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #fff; + text-align: center; + text-decoration: none; + background-color: #000; + border-radius: 4px; +} +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-left .tooltip-arrow { + right: 5px; + bottom: 0; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-right .tooltip-arrow { + bottom: 0; + left: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #000; +} +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #000; +} +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-left .tooltip-arrow { + top: 0; + right: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-right .tooltip-arrow { + top: 0; + left: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: none; + max-width: 276px; + padding: 1px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + font-weight: normal; + line-height: 1.42857143; + text-align: left; + white-space: normal; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2); + box-shadow: 0 5px 10px rgba(0, 0, 0, .2); +} +.popover.top { + margin-top: -10px; +} +.popover.right { + margin-left: 10px; +} +.popover.bottom { + margin-top: 10px; +} +.popover.left { + margin-left: -10px; +} +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-radius: 5px 5px 0 0; +} +.popover-content { + padding: 9px 14px; +} +.popover > .arrow, +.popover > .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.popover > .arrow { + border-width: 11px; +} +.popover > .arrow:after { + content: ""; + border-width: 10px; +} +.popover.top > .arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999; + border-top-color: rgba(0, 0, 0, .25); + border-bottom-width: 0; +} +.popover.top > .arrow:after { + bottom: 1px; + margin-left: -10px; + content: " "; + border-top-color: #fff; + border-bottom-width: 0; +} +.popover.right > .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999; + border-right-color: rgba(0, 0, 0, .25); + border-left-width: 0; +} +.popover.right > .arrow:after { + bottom: -10px; + left: 1px; + content: " "; + border-right-color: #fff; + border-left-width: 0; +} +.popover.bottom > .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, .25); +} +.popover.bottom > .arrow:after { + top: 1px; + margin-left: -10px; + content: " "; + border-top-width: 0; + border-bottom-color: #fff; +} +.popover.left > .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #999; + border-left-color: rgba(0, 0, 0, .25); +} +.popover.left > .arrow:after { + right: 1px; + bottom: -10px; + content: " "; + border-right-width: 0; + border-left-color: #fff; +} +.carousel { + position: relative; +} +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} +.carousel-inner > .item { + position: relative; + display: none; + -webkit-transition: .6s ease-in-out left; + -o-transition: .6s ease-in-out left; + transition: .6s ease-in-out left; +} +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + line-height: 1; +} +@media all and (transform-3d), (-webkit-transform-3d) { + .carousel-inner > .item { + -webkit-transition: -webkit-transform .6s ease-in-out; + -o-transition: -o-transform .6s ease-in-out; + transition: transform .6s ease-in-out; + + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-perspective: 1000; + perspective: 1000; + } + .carousel-inner > .item.next, + .carousel-inner > .item.active.right { + left: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } + .carousel-inner > .item.prev, + .carousel-inner > .item.active.left { + left: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } + .carousel-inner > .item.next.left, + .carousel-inner > .item.prev.right, + .carousel-inner > .item.active { + left: 0; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} +.carousel-inner > .active { + left: 0; +} +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} +.carousel-inner > .next { + left: 100%; +} +.carousel-inner > .prev { + left: -100%; +} +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} +.carousel-inner > .active.left { + left: -100%; +} +.carousel-inner > .active.right { + left: 100%; +} +.carousel-control { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 15%; + font-size: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); + filter: alpha(opacity=50); + opacity: .5; +} +.carousel-control.left { + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); + background-repeat: repeat-x; +} +.carousel-control.right { + right: 0; + left: auto; + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); + background-repeat: repeat-x; +} +.carousel-control:hover, +.carousel-control:focus { + color: #fff; + text-decoration: none; + filter: alpha(opacity=90); + outline: 0; + opacity: .9; +} +.carousel-control .icon-prev, +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-left, +.carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; +} +.carousel-control .icon-prev, +.carousel-control .glyphicon-chevron-left { + left: 50%; + margin-left: -10px; +} +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-right { + right: 50%; + margin-right: -10px; +} +.carousel-control .icon-prev, +.carousel-control .icon-next { + width: 20px; + height: 20px; + margin-top: -10px; + font-family: serif; + line-height: 1; +} +.carousel-control .icon-prev:before { + content: '\2039'; +} +.carousel-control .icon-next:before { + content: '\203a'; +} +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + padding-left: 0; + margin-left: -30%; + text-align: center; + list-style: none; +} +.carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + cursor: pointer; + background-color: #000 \9; + background-color: rgba(0, 0, 0, 0); + border: 1px solid #fff; + border-radius: 10px; +} +.carousel-indicators .active { + width: 12px; + height: 12px; + margin: 0; + background-color: #fff; +} +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); +} +.carousel-caption .btn { + text-shadow: none; +} +@media screen and (min-width: 768px) { + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -15px; + font-size: 30px; + } + .carousel-control .glyphicon-chevron-left, + .carousel-control .icon-prev { + margin-left: -15px; + } + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-next { + margin-right: -15px; + } + .carousel-caption { + right: 20%; + left: 20%; + padding-bottom: 30px; + } + .carousel-indicators { + bottom: 20px; + } +} +.clearfix:before, +.clearfix:after, +.dl-horizontal dd:before, +.dl-horizontal dd:after, +.container:before, +.container:after, +.container-fluid:before, +.container-fluid:after, +.row:before, +.row:after, +.form-horizontal .form-group:before, +.form-horizontal .form-group:after, +.btn-toolbar:before, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after, +.nav:before, +.nav:after, +.navbar:before, +.navbar:after, +.navbar-header:before, +.navbar-header:after, +.navbar-collapse:before, +.navbar-collapse:after, +.pager:before, +.pager:after, +.panel-body:before, +.panel-body:after, +.modal-footer:before, +.modal-footer:after { + display: table; + content: " "; +} +.clearfix:after, +.dl-horizontal dd:after, +.container:after, +.container-fluid:after, +.row:after, +.form-horizontal .form-group:after, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:after, +.nav:after, +.navbar:after, +.navbar-header:after, +.navbar-collapse:after, +.pager:after, +.panel-body:after, +.modal-footer:after { + clear: both; +} +.center-block { + display: block; + margin-right: auto; + margin-left: auto; +} +.pull-right { + float: right !important; +} +.pull-left { + float: left !important; +} +.hide { + display: none !important; +} +.show { + display: block !important; +} +.invisible { + visibility: hidden; +} +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.hidden { + display: none !important; +} +.affix { + position: fixed; +} +@-ms-viewport { + width: device-width; +} +.visible-xs, +.visible-sm, +.visible-md, +.visible-lg { + display: none !important; +} +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { + display: none !important; +} +@media (max-width: 767px) { + .visible-xs { + display: block !important; + } + table.visible-xs { + display: table; + } + tr.visible-xs { + display: table-row !important; + } + th.visible-xs, + td.visible-xs { + display: table-cell !important; + } +} +@media (max-width: 767px) { + .visible-xs-block { + display: block !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline { + display: inline !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline-block { + display: inline-block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; + } + table.visible-sm { + display: table; + } + tr.visible-sm { + display: table-row !important; + } + th.visible-sm, + td.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-block { + display: block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline { + display: inline !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline-block { + display: inline-block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; + } + table.visible-md { + display: table; + } + tr.visible-md { + display: table-row !important; + } + th.visible-md, + td.visible-md { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-block { + display: block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline { + display: inline !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline-block { + display: inline-block !important; + } +} +@media (min-width: 1200px) { + .visible-lg { + display: block !important; + } + table.visible-lg { + display: table; + } + tr.visible-lg { + display: table-row !important; + } + th.visible-lg, + td.visible-lg { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-lg-block { + display: block !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline { + display: inline !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline-block { + display: inline-block !important; + } +} +@media (max-width: 767px) { + .hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-lg { + display: none !important; + } +} +.visible-print { + display: none !important; +} +@media print { + .visible-print { + display: block !important; + } + table.visible-print { + display: table; + } + tr.visible-print { + display: table-row !important; + } + th.visible-print, + td.visible-print { + display: table-cell !important; + } +} +.visible-print-block { + display: none !important; +} +@media print { + .visible-print-block { + display: block !important; + } +} +.visible-print-inline { + display: none !important; +} +@media print { + .visible-print-inline { + display: inline !important; + } +} +.visible-print-inline-block { + display: none !important; +} +@media print { + .visible-print-inline-block { + display: inline-block !important; + } +} +@media print { + .hidden-print { + display: none !important; + } +} diff --git a/TotalRegistration1/src/main/resources/static/css/style.css b/Kickoff/src/main/resources/static/css/meter.css similarity index 94% rename from TotalRegistration1/src/main/resources/static/css/style.css rename to Kickoff/src/main/resources/static/css/meter.css index faf3441..6731691 100644 --- a/TotalRegistration1/src/main/resources/static/css/style.css +++ b/Kickoff/src/main/resources/static/css/meter.css @@ -7,7 +7,7 @@ meter { meter::-webkit-meter-bar { background: none; - background-color: rgba(0,0,0,0.1); + background-color: rgba(0,0,0,0.1); } meter[value="1"]::-webkit-meter-optimum-value { background: red; } diff --git a/Kickoff/src/main/resources/static/css/style.css b/Kickoff/src/main/resources/static/css/style.css new file mode 100644 index 0000000..4adbb20 --- /dev/null +++ b/Kickoff/src/main/resources/static/css/style.css @@ -0,0 +1,2336 @@ +@font-face { + font-family: 'Oxygen-Bold'; + src:url(../fonts/Oxygen-Bold.ttf) format('truetype'); +} +@font-face { + font-family: 'Ubuntu-Regular'; + src:url(../fonts/Ubuntu-Regular.ttf) format('truetype'); +} +@font-face { + font-family: 'Ubuntu-Bold'; + src:url(../fonts/Ubuntu-Bold.ttf) format('truetype'); +} +@font-face{ + font-family:'Oxygen-Regular'; + src:url(../fonts/Oxygen-Regular.ttf) format('truetype'); +} +html,body{ + background:#fff; + font-size: 100%; + font-family:'Oxygen-Regular'; + +} +body a{ + transition: 0.5s all; + -webkit-transition: 0.5s all; + -o-transition: 0.5s all; + -moz-transition: 0.5s all; + -ms-transition: 0.5s all; +} +ul{ + padding: 0; + margin: 0; +} +h1,h2,h3,h4,h5,h6,label,p{ + margin:0; +} +/*--header--*/ +.head{ + position:relative; +} +.logo { + text-align: center; + position: absolute; + top: 0; +} +.header-social{ + text-align: right; +} +.header-login ul li,.header-social ul li{ + display:inline-block; +} +.header-login ul li a{ + display:inline-block; + text-decoration:none; + color:#fff; + font-size:0.8em; + margin: 0 0.5em; +} +.header-login ul li a:hover { + color: #F67777; +} +.header-top { + background-color: #2E2E2E; + padding: 0.3em 0; +} +.header-social ul li a i{ + width: 17px; + height: 17px; + display: block; + background: url(../images/img-sprite.png)no-repeat -14px -14px ; + margin:0 0.3em; +} +.header-social ul li a i.ic1{ + background-position: -55px -12px ; +} +.header-social ul li a i.ic2{ + background-position: -101px -12px ; +} +.header-social ul li a i.ic3{ + background-position:-150px -12px ; +} +.header-social ul li a i.ic4{ + background-position:-199px -13px ; +} +.header-social ul li a i:hover{ + background:url(../images/img-sprite.png)no-repeat -14px -52px ; +} +.header-social ul li a i.ic1:hover{ + background-position: -55px -50px ; +} +.header-social ul li a i.ic2:hover{ + background-position: -101px -50px ; +} +.header-social ul li a i.ic3:hover{ + background-position:-150px -50px ; +} +.header-social ul li a i.ic4:hover{ + background-position:-199px -52px ; +} +.header-social ul{ + margin-top: 4px; +} +ul.nav_1 li a { + font-size: 0.9em; + color: #3A3A3A; + padding: 1.6em; +} +ul.nav_1 li { + border-right:1px solid #EFEFEF; +} +.navbar { + margin-bottom: 0px; + border:none; + +} +div#bs-megadropdown-tabs { + padding: 0; +} +.h_menu4 { + margin-left: 13.6%; +} +.nav > li > a:hover, .nav > li > a:focus { + background-color: #f67777; + color: #fff; +} +.nav .open > a, .nav .open > a:hover, .nav .open > a:focus { + background-color: #f67777; + color: #fff; +} +.col1 { + float: left; + width: 20%; +} +.menu-top { + width: 850px; + padding: 1em; +} +.col1 ul li{ + list-style:none; + border-right: none; +} +.col1 ul li a{ + padding: 6px 0px; + display: block; +} +.col1 h4{ + font-size: 1.5em; + color: #000; + margin-bottom: 0.5em; + font-family: 'Ubuntu-Regular'; +} +/*--cart--*/ +.itemContainer{ + width:100%; + float:left; +} +.itemContainer div{ + float:left; + margin: 5px 20px 5px 20px ; +} +.itemContainer a{ + text-decoration:none; +} +.cartHeaders{ + width:100%; + float:left; +} +.cartHeaders div{ + float:left; + margin: 5px 20px 5px 20px ; +} +.item_add { + color: #000; + border:none; +} +a.item_add { + text-decoration: none; +} +.grid_1 img{ + margin-bottom:1em; +} +.box_1 h3{ + color: #000; + font-size: 1em; +} +.box_1 h3 img{ + margin-left: 5px; +} +.box_1 p a{ + color: #B5B3B3; + font-size: 0.77em; +} +.total { + display: inline-block; +} +.cart.box_1{ + float: right; + margin-top: 2px; +} + +.heart{ + float:left; + margin-top: 0.7em; +} +.heart li{ + display:inline-block; + border-right: 1px solid #EFEFEF; +} +.heart li a{ + font-size: 0.9em; + color: #3A3A3A; + margin:0 1em; + outline: none; +} +.heart li:last-child { + border-right: none; +} +.heart span{ + +} +.cart{ + float:right; +} +.search-right { + padding: 0.6em 0 0; +} +/*--//header--*/ +/*--banner--*/ +.banner{ + width: 100%; + height: 700px; + display: block; + background: url(../images/ba11.jpg)no-repeat right top; + overflow-x:hidden; +} +.no-cssanimations .rw-wrapper .rw-sentence span:first-child{ + opacity: 1; +} +/*--//banner--*/ +/*--content--*/ +.content-top { + padding: 5em 0; +} +.col-1 img{ +} +.col-2 { + padding-top: 1em; +} +.col-2 span{ + font-size: 1.4em; + color: #F67777; + line-height: 1.8em; + text-transform: uppercase; + letter-spacing: 5px; + font-family: 'Ubuntu-Bold'; +} +.col-2 h2{ + font-size: 2.5em; + line-height: 1.8em; + font-family: 'Oxygen-Bold'; +} +.col-2 h2 a{ + text-decoration:none; + color: #000000; +} +.col-2 h2 a:hover{ + color: #f67777; +} +.col-2 p{ + font-size: 0.9em; + color: #B3B3B3; + line-height:1.8em; + margin:0 0 1.5em; +} +a.buy-now{ + font-size: 0.9em; + color: #F67777; + text-decoration: none; + border-bottom: 2px solid #F67777; + padding: 0 0 0.5em; + display: inline-block; +} +a.buy-now:hover{ + color: #000; + border-bottom: 2px solid #000; +} +.col-3{ + position:relative; + margin-bottom:1.5em; +} +.col-3:last-child{ + margin-bottom:0em; +} +.col-pic{ + position:absolute; + top:0; + background:rgba(0, 0, 0, 0.59); + width:100%; + height:100%; + text-align:center; + padding-top: 6.5em; +} +.col-pic p{ + color:#fff; + font-size:1.1em; + text-transform:uppercase; + font-family: 'Oxygen-Bold'; +} +.col-pic h5{ + color:#F67777; + font-size:2em; + text-transform:uppercase; + font-family: 'Ubuntu-Bold'; +} +.col-pic label{ + width:100px; + height:2px; + display:block; + background:#fff; + border-radius:10px; + margin: 0.5em auto; +} +/*--content-middle--*/ +.content-mid h3{ + font-size: 2.5em; + color: #000000; + line-height: 1.8em; + font-family: 'Ubuntu-Regular'; + text-align:center; +} + +label.line{ + width:200px; + height:2px; + display:block; + background:#F67777; + border-radius:10px; + margin: 0.2em auto; +} +.block { + float: right; +} +.mid-1 span{ + font-size: 0.9em; + color: #F67777; + line-height: 1.8em; + font-family: 'Ubuntu-Bold'; +} +/*----*/ +/*-----------------------------------------------------------------------------------*/ +/* Stroke +/*-----------------------------------------------------------------------------------*/ +.b-link-stroke{ + position:relative; + display:inline-block; + vertical-align:top; + font-weight: 300; + overflow:hidden; + margin-bottom: 5px; +} +.b-link-stroke .b-wrapper{ + position:absolute; + width:100%; + height:100%; + top:0em; + left:0; + text-align:center; + color:#ffffff; + padding-top:10em; +} +.b-link-stroke .b-wrapper:hover{ + background:rgba(217, 84, 89, 0.58); +} +.b-link-stroke .b-wrapper1{ + position:absolute; + width:100%; + height:100%; + top:0em; + left:0; + text-align:center; + color:#ffffff; + padding-top: 7em; +} +.b-link-stroke .b-wrapper1:hover{ + background:rgba(8, 8, 8, 0.64); + +} +.b-link-stroke .b-wrapper2{ + position:absolute; + width:100%; + height:100%; + top:0em; + left:0; + text-align:center; + color:#ffffff; + padding-top:15em; +} +.b-wrapper1.long-img { + padding-top: 15em; +} +.b-link-stroke .b-top-line{ + position:absolute; + top:-100%; + left:0; + width:50%; + height:100%; + background:rgba(248, 69, 69, 0.59); +} +.b-link-stroke .b-bottom-line{ + position:absolute; + bottom:-100%; + right:0; + width:50%; + height:100%; + background:rgba(248, 69, 69, 0.59); +} +.b-link-stroke .b-top-line, .b-link-stroke .b-bottom-line{ + transition:all 0.5s; + -moz-transition:all 0.5s; + -ms-transition:all 0.5s; + -o-transition:all 0.5s; + -webkit-transition:all 0.5s; +} +.b-link-stroke:hover .b-top-line{ + top:0; +} +.b-link-stroke:hover .b-bottom-line{ + bottom:0; +} +/*-----------------------------------------------------------------------------------*/ +/* Animation effects +/*-----------------------------------------------------------------------------------*/ +.b-animate-go{ + text-decoration:none; +} +.b-animate{ + transition:all 0.5s; + -moz-transition:all 0.5s; + -ms-transition:all 0.5s; + -o-transition:all 0.5s; + -webkit-transition:all 0.5s; + visibility:hidden; /* lt-ie9 */ +} +/* lt-ie9 */ +.b-animate-go:hover .b-animate{ + visibility:visible; +} +.b-from-left{ + position:relative; + left:-100%; + color: #F67777; + font-size: 2em; + text-transform: uppercase; + font-family: 'Ubuntu-Bold'; +} +.b-animate-go:hover .b-from-left{ + left:0; +} +.b-from-right{ + position:relative; + right:-100%; + color: #fff; + font-size: 1.1em; + text-transform: uppercase; + font-family: 'Oxygen-Bold'; +} +.b-animate-go:hover .b-from-right{ + right:0; +} +label.b-from-right { + width: 100px; + height: 2px; + display: block; + background: #fff; + border-radius: 10px; + margin: 0.5em auto; +} + +.b-scale{ + position:relative; + transform:scale(0); + -moz-transform:scale(0); + -ms-transform:scale(0); + -o-transform:scale(0); + -webkit-transform:scale(0); +} +.b-animate-go:hover .b-scale, h1{ + transform:scale(1); + -moz-transform:scale(1); + -ms-transform:scale(1); + -o-transform:scale(1); + -webkit-transform:scale(1); +} +/*----*/ +.women-top { + float: left; +} +.img { + float: right; +} +/*----*/ +.mid-1 h6 { + font-size: 1.2em; + font-family: 'Ubuntu-Regular'; +} +.mid-1 h6 a { + color: #000000; + text-decoration:none; +} +.mid-1 h6 a:hover { + color: #F67777; +} +.mid-2 p{ + float:left; + font-size:0.9em; + color:#B4B4B4; +} +.mid-2 p em{ + font-style:normal; +} +.mid-2 p label{ + text-decoration: line-through; + font-weight:400; + margin-right:6px; +} +.mid-2 { + padding-top: 1em; +} +.mid-1 { + padding-top: 1em; +} +.mid-pop{ + position:relative; + border: 1px solid #EFECEC; + padding: 10px; +} +.zoom-icon { + position: absolute; + opacity: 0; + filter: alpha(opacity=0); + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(opacity=0)"; + display: block; + left: 0; + top: -152px; + width: 290px; + height: 219px; + text-align:center; + cursor: pointer; + transition: all .2s ease-in-out; + -webkit-transition: all .2s ease-in-out; + -moz-transition: all .2s ease-in-out; + -o-transition: all .2s ease-in-out; +} +.zoom-icon .icon{ + width: 50px; + height: 50px; + display: inline-block; + background: #f67777; + color:#fff; + font-size:1.3em; + margin: 0 0.3em; + line-height: 2.5em; +} +.zoom-icon .glyphicon-menu-right{ + background:#fff; + color: #f67777; +} +.mid-pop .zoom-icon { + top: 0px; + width: 100%; + height: 182px; +} +.mid-pop .pro-img:hover .zoom-icon { + top: 33%; + opacity: 1; + filter: alpha(opacity=99); + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(opacity=99)"; +} +.mid-popular { + padding-top: 2em; +} +.brand { + padding: 5em 0; +} +.banner-top{ + text-align:center; + width: 100%; + height: 250px; + display: block; + background: url(../images/back.jpg)no-repeat ; + padding:5em 0; +} +.banner-top h1{ + font-size:3em; + color:#fff; + font-family: 'Ubuntu-Regular'; +} +.banner-top h2{ + font-size:0.9em; + color:#fff; + margin-top:1em; +} +.banner-top h2 a{ + color:#f67777; +} +.banner-top h2 label{ + margin:0 0.4em; +} +.banner-top em { + width: 100px; + height: 2px; + display: block; + background: #fff; + border-radius: 10px; + margin: 0.5em auto; +} +/*--typo-single--*/ + +.thumb-image > img { width: 100%; } +/*--single--*/ +.single-para h1{ + font-size:1.5em; + color:#52D0C4; + line-height:1.5em; + font-family: 'OleoScript-Regular'; +} +label.add-to{ + display:block; + font-size: 2em; + color: #000; +} +.single-para p{ + font-size:0.9em; + color:#B2B2B2; + line-height:1.8em; +} +a.cart{ + padding: 0.3em 0.7em; + color: #FFF; + background: #52D0C4; + margin: 1.5em 0 0; + font-size: 1em; + display:inline-block; + line-height: 1.6em; + text-align: center; + text-decoration:none; +} +a.cart:hover{ + background: #000; +} +/*----*/ +.star-on { + padding: 1em 0; +} +.star-on ul { + float:left; +} + +.star-on ul li{ + display: inline-block; +} +.star-on ul li i{ + color:#000; +} +.review{ + float:left; + padding: 0 1em; +} +.star-on a{ + text-decoration:none; + font-size:1em; + color:#52D0C4; +} +.star-on a:hover{ + color:#000; +} +.single-bottom h4{ + color:#000; + font-size:1.5em; + padding:0.5em; + border-bottom:1px solid #fa7455 ; +} +.single { + padding: 5em 0 0; +} +.available h6{ + color:#52D0C4; + font-size:1.4em; + padding: 0 0 1em; +} +.available ul li{ + display:inline-block; + padding:0 0.5em 0 0; + color:#4c4c4c; + font-size:0.9em; +} +.available ul li select { + outline: none; + padding: 3px; +} +.available { + padding: 2em 0 1em; +} +/*--products--*/ +.product-bottom { + padding-top: 2em; +} +h4.cate { + font-family: 'Ubuntu-Regular'; + font-size: 1.7em; + color:#F67777; +} + +ul.kid-menu{ + display: block !important; +} +.menu-drop { + width: auto; + height: auto; + padding: 0; + list-style: none; + margin: 0.5em 0; +} +.menu-drop > li > a { + width: 100%; + margin: 0.3em 0; + display:inline-block; + position: relative; + color: #000; + font-size: 0.9em; + text-decoration:none; + font-family: 'Oxygen-Bold'; +} +.menu-drop > li > a:hover{ + color:#f67777; +} +.menu-drop ul li a { + width: 100%; + display: inline-block; + position: relative; + font-size:0.8em; + margin:0.3em 0; + color:#C7C7C7; + text-decoration:none; + text-indent: 1.2em; +} +.menu-drop ul li a:hover{ + color:#B2B2B2; +} +ul.kid-menu li,ul.cute li{ + list-style: none; +} +.product { + padding: 3em 0 0; +} +.item-grid1 { + padding-bottom: 2em; +} +.item-grid1:nth-child(7) ,.item-grid1:nth-child(8),.item-grid1:nth-child(9){ + padding-bottom: 0em; +} +/*--single--*/ +.span_2_of_a1 h3 { + color: #000; + text-transform: uppercase; + font-size: 1.8em; + font-family: 'Ubuntu-Bold'; +} +p.in-para{ + color: #B3B3B3; + font-size: 0.9em; + line-height: 2em; + margin: 1em 0 ; + border-bottom: 1px solid #f0f0f0; + border-top: 3px double #f0f0f0; + padding:1em 0; +} +.price_single { + border-bottom: 1px solid #f0f0f0; + padding-bottom: 1em; +} +span.reducedfrom { + color: #F67777; + font-size: 1.5em; + font-family: 'Ubuntu-Bold'; + float: left; +} +.price_single a { + color: #999; + font-size: 13px; + float:right; + margin-top: 0.7em; +} +h4.quick { + color: #000; + font-size:1.2em; + text-transform: uppercase; + font-family: 'Ubuntu-Regular'; + margin-top: 1em; +} +p.quick_desc { + color:#B3B3B3; + font-size:0.9em; + line-height: 2em; + margin: 1em 0 2em; +} +span.actual { + color:#F67777; + font-size: 1em; + margin-right: 5%; +} +.add-to{ + float:right; + margin-top: 1.6em; +} +/*--quantity-starts--*/ +.quantity{ + margin: 1.5em 0; + float:left; +} +.value-minus, +.value-plus{ + height: 40px; + line-height: 24px; + width: 40px; + margin-right: 3px; + display: inline-block; + cursor: pointer; + position: relative; + font-size: 18px; + color: #fff; + text-align: center; + -webkit-user-select: none; + -moz-user-select: none; + border:1px solid #b2b2b2; + vertical-align: bottom; +} +.quantity-select .entry.value-minus:before, +.quantity-select .entry.value-plus:before{ + content: ""; + width: 13px; + height: 2px; + background: #000; + left: 50%; + margin-left: -7px; + top: 50%; + margin-top: -0.5px; + position: absolute; +} +.quantity-select .entry.value-plus:after{ + content: ""; + height: 13px; + width: 2px; + background: #000; + left: 50%; + margin-left: -1.4px; + top: 50%; + margin-top: -6.2px; + position: absolute; +} +.value { + cursor: default; + width: 40px; + height:40px; + padding: 8px 0px; + color: #A9A9A9; + line-height: 24px; + border: 1px solid #E5E5E5; + background-color: #E5E5E5; + text-align: center; + display: inline-block; + margin-right: 3px; +} +.quantity-select .entry.value-minus:hover, +.quantity-select .entry.value-plus:hover{ + background: #E5E5E5; +} + +.quantity-select .entry.value-minus{ + margin-left: 0; +} +/*--quantity-end--*/ +/* Skew Backward */ +.hvr-skew-backward { + display: inline-block; + vertical-align: middle; + -webkit-transform: translateZ(0); + transform: translateZ(0); + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -moz-osx-font-smoothing: grayscale; + -webkit-transition-duration: 0.3s; + transition-duration: 0.3s; + -webkit-transition-property: transform; + transition-property: transform; + -webkit-transform-origin: 0 100%; + transform-origin: 0 100%; + background-color: #F67777; + color: #fff; + padding: 0.5em 1em; + font-size:1em; +} +.hvr-skew-backward:hover, .hvr-skew-backward:focus, .hvr-skew-backward:active { + -webkit-transform: skew(10deg); + transform: skew(10deg); + color:#fff; + background:#FF6C6C; + text-decoration:none; +} + +ul.product-qty { + padding: 0; + list-style: none; +} +.product-qty span { + color: #000; + font-size:1.2em; + padding-bottom: 0.5em; + display: block; + text-transform: uppercase; + font-family: 'Ubuntu-Regular'; +} +.product-qty select { + border: 1px solid #eee; + padding: 0.5em; + font-size: 1em; + outline: none; +} +.product-qty option { + border: 1px solid #EEE; +} +.wish-list { + padding: 15px 0; + border-bottom: 1px solid #f0f0f0; + border-top: 1px solid #f0f0f0; +} +.wish-list ul{ + padding:0; + list-style:none; +} +.wish-list li { + display: inline-block; + margin-right: 45px; +} + +.wish-list li a { + color:#F67777; + font-size: 0.85em; + text-decoration: underline; +} +.wish-list li a span { + padding-right:10px; +} +.wish-list li a:hover{ + text-decoration:none; +} +.quantity_box { + float: left; + margin-right: 3em; +} +.size-top { + margin: 2em 0; +} +/*----*/ +.tab-head { + padding: 3em 0 0; +} +.tabs li a { + padding: 1em; + font-size: 0.9em; + color: #B3B3B3; + border-bottom: 1px solid #EDEDED; +} +.tabs li a:hover,.tabs li.active a{ + background:#F67777 !important; + color:#fff; +} +.tab-content { + padding-left: 0px; +} +.facts p { + color: #B3B3B3; + font-size: 0.9em; + line-height: 2em; + padding: 0 0 1em; +} +.facts ul li { + list-style: none; + color: #B3B3B3; + font-size: 0.9em; + padding: 0.3em 0; +} +.facts ul li span{ + padding-right: 0.5em; +} +nav.nav-sidebar { + float: left; + width: 30%; + border-top: 1px solid #EDEDED; + border-left: 1px solid #EDEDED; +} +.one{ + float:right; + width: 70%; + border: 1px solid #EDEDED; + padding:1em; +} +.product-at{ + padding-top:0; +} +/*--login--*/ +.login{ + padding:5em 0 0; +} +.login-bottom h2{ + font-size: 1.4em; + color:#000; + padding: 0em 0.9em 1em; +} +.login-mail{ + border: 1px solid #E9E9E9; + margin-bottom: 2em; + padding: 0.5em 1em; +} +.login-mail i{ + color: #F67777; + font-size: 1em; +} +.login-mail input[type="text"],.login-mail input[type="password"]{ + border: none; + outline:none; + font-size: 0.9em; + color: #999; + width: 95%; +} +.login-do input[type="submit"]{ + border: none; + outline: none; + font-size: 1em; + -webkit-appearance: none; + cursor: pointer; + background: none; +} +.login-do label{ + font-weight:400; +} + +.checkbox1 { + margin-bottom: 4px; + padding-left: 27px; + font-size: 1.2em; + line-height: 27px; + cursor: pointer; + position: relative; + font-weight: 400; + color:#000; +} +.checkbox1:last-child { + margin-bottom: 0; +} +.news-letter { + color: #555; + font-size: 0.8em; + margin-bottom: 1em; + display: block; + transition: 0.5s all; + -webkit-transition: 0.5s all; + -moz-transition: 0.5s all; + -o-transition: 0.5s all; + clear: both; +} +.checkbox1 i { + position: absolute; + bottom: 5px; + left: 0; + display: block; + width:20px; + height:20px; + outline: none; + border: 2px solid #E1DFDF; +} +.checkbox1 input + i:after { + content: ''; + background: url("../images/tick1.png") no-repeat 1px 2px; + top: -1px; + left: -1px; + width: 15px; + height: 15px; + font: normal 12px/16px FontAwesome; + text-align: center; +} +.checkbox1 input + i:after { + position: absolute; + opacity: 0; + transition: opacity 0.1s; + -o-transition: opacity 0.1s; + -ms-transition: opacity 0.1s; + -moz-transition: opacity 0.1s; + -webkit-transition: opacity 0.1s; +} +.checkbox1 input { + position: absolute; + left: -9999px; +} +.checkbox1 input:checked + i:after { + opacity: 1; +} +.news-letter:hover { + color:#00BFF0; +} +.login-right h3{ + font-size: 1.5em; + color: #000000; + font-family: 'Ubuntu-Regular'; +} +.login-right p { + font-size: 0.9em; + color: #B3B3B3; + line-height: 1.8em; + margin: 1em 0 ; +} +.produced { + text-align: center; +} +/*--contact--*/ +.contact-form { + padding: 5em 0 ; +} +.contact-top h3{ + font-size: 1.5em; + color:#000; + line-height:1.4em; + font-family: 'Ubuntu-Regular'; +} +.contact-top div{ + padding:0.5em 0; +} +.contact-top div input[type="text"], .contact-top div textarea { + width: 100%; + padding: 0.7em; + margin:0.4em 0 0; + background: none; + outline: none; + border: 1px solid #F3EFEF; + -webkit-appearance: none; +} +.contact-top div textarea{ + height:160px; + resize:none; +} +.contact-top div span{ + color:#000; + font-size: 0.9em; +} +.contact-top label{ + font-weight:400; + cursor:pointer; +} +.contact-top input[type="submit"]{ + border:none; + outline:none; + background:none; +} +.contact-top-in p{ + font-size: 1em; + color: #494949; + line-height: 1.6em; + padding: 0.5em 0 1em; +} +.map iframe { + width: 100%; + min-height: 450px; + border: none; +} +.contact-left h3{ + font-size: 1.5em; + color:#000; + line-height:1.4em; + font-family: 'Ubuntu-Regular'; +} +.contact-left p { + font-size: 0.9em; + color: #B3B3B3; + line-height: 1.8em; + margin:1em 0 0; +} +.address-grid i{ + color:#F67777; + font-size:1em; + float: left; + margin: 0 5% 0 0; + display: inline-block; + line-height: 2em; +} +.address1{ + float: left; +} +.address-grid { + padding: 1em 0; +} +.address1 h3{ + font-size: 1.2em; + color:#000; + line-height:1.4em; + font-family: 'Ubuntu-Regular'; +} +.address1 p{ + margin: 0; +} +.address1 p a{ + text-decoration:none; + color: #7c7c7c; +} +.address1 p a:hover{ + color:#F67777; +} +.address-more h4{ + color:#000; + font-size:2em; + margin: 0 15px 0.7em; +} +.address { + padding: 2em 0 0; +} +/*--404--*/ +.four{ + padding:5em 0; + text-align:center; +} +.four h3{ + font-size: 7em; + color: #F67777; + font-family: 'Ubuntu-Regular'; +} +.four p{ + font-size: 0.9em; + color: #B3B3B3; + line-height: 1.8em; + margin: 0 0 1.5em; +} +/*--checkout--*/ +.check-out{ + padding:5em 0em 0; +} +table{ + width:100%; + margin: 0em 0 2em; +} +th{ + color: #000000; + font-size: 1.4em; + font-weight: 400; + font-family: 'Ubuntu-Regular'; +} +th, td { + padding: 10px; +} +td{ + color:#b2b2b2; + font-size: 1em; +} +a.at-in { + float: left; + width: 20%; +} +.sed { + float: right; + width: 74%; +} +.sed h5{ + font-size: 1.1em; + font-family: 'Ubuntu-Regular'; +} +.sed h5 a{ + color: #F67777; + text-decoration:none; +} +.sed h5 a:hover{ + color: #000; +} +.sed p{ + color:#b2b2b2; + font-size:0.8em; + line-height:1.8em; + padding:1em 0 0; +} +.table-responsive { + border: none; +} +.ring-in{ + width:45%; +} + +.ring-in{ + position: relative; +} +.close1, .close2, .close3 { + background: url('../images/close.png') no-repeat 0px 0px ; + cursor: pointer; + width: 28px; + height: 28px; + position: absolute; + right: 5px; + bottom: 10px; + -webkit-transition: color 0.2s ease-in-out; + -moz-transition: color 0.2s ease-in-out; + -o-transition: color 0.2s ease-in-out; + transition: color 0.2s ease-in-out; +} +/*--//checkout--*/ +/*--wish--*/ +.wishlist { + width: 31%; + margin: 5em auto 0; + border:1px solid #A6A5A5; + text-align:center; +} +.wishlist h6{ + font-size: 1em; + background: #F5F5F5; + border-bottom: 1px solid #A6A5A5; + padding: 0.8em; + font-family: 'Ubuntu-Regular'; +} +.wishlist h6 a{ + text-decoration:none; + color:#a7a49c; + padding: 0 0.5em 0 0; +} +.wishlist p{ + font-size:1.1em; + color:#F67777; + padding:0.8em 0 ; +} +/*--footer--*/ +.footer-middle{ + background:#1F1F1F; + padding:4em 0; +} +.footer-middle-in h6{ + font-size: 1.4em; + color: #fff; + font-family: 'Ubuntu-Bold'; + margin-bottom: 1em; + text-transform: uppercase; +} +.footer-middle-in p{ + font-size: 0.9em; + color: #B3B3B3; + line-height: 1.8em; + margin-top: 1em; +} +.footer-middle-in span{ + font-size: 0.9em; + color: #B3B3B3; + line-height: 1.8em; +} +.in{ + float:left; +} +.in1{ + float:right; +} +ul.in li{ + list-style:none; +} +ul.in li a{ + color:#B3B3B3; + font-size:0.9em; + text-decoration:none; + padding:0 0 0.5em ; + display:block; +} +ul.in li a:hover{ + color:#F67777; +} +ul.tag-in li{ + display:inline-block; +} +ul.tag-in li a{ + color:#B3B3B3; + font-size: 0.9em; + text-decoration: none; + padding: 0.3em 0.7em; + border: 1px solid #B3B3B3; + display: block; + margin-bottom: 0.6em; + border-radius: 15px; +} +ul.tag-in li a:hover{ + color:#F67777; + border: 1px solid #F67777; +} +.footer-class a:hover{ + color:#fff; +} +.footer-middle-in input[type="text"] { + width: 100%; + padding: 0.5em 1em; + margin: 0.7em 0; + background: none; + outline: none; + border: 1px solid #B3B3B3; + -webkit-appearance: none; + font-size: 0.9em; + color: #B3B3B3; +} +.footer-middle-in input[type="submit"] { + width: 100%; + font-size: 1em; + background: #F67777; + padding: 0.5em 1em; + text-align: center; + color: #fff; + border: none; + outline: none; + -webkit-appearance: none; + transition: 0.5s all; + -webkit-transition: 0.5s all; + -o-transition: 0.5s all; + -moz-transition: 0.5s all; + -ms-transition: 0.5s all; +} +.footer-middle-in input[type="submit"]:hover { + color: #F67777; + background: #fff; +} +.footer-bottom{ + background:#000; + padding:1em 0; +} +.footer-class{ + color:#fff; + font-size:1em; + float:right; +} +.footer-class a{ + color:#F67777; + text-decoration:none; +} +.footer-bottom-top{ + float:left; +} +.footer-bottom-top li{ + display:inline-block; +} +/*--//footer--*/ +/*--typo--*/ +.page-header h3{ + font-size: 3em; + color:#000; + font-family: 'Ubuntu-Regular'; +} +.table > thead > tr > th, .table > tbody > tr > th, .table > tfoot > tr > th, .table > thead > tr > td, .table > tbody > tr > td, .table > tfoot > tr > td { + padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border-top: none; +} +.grid1 { + margin: 1.5em 0 0; +} +ul.nav.nav-pills { + margin: 1.5em 0 0; +} +.grid2{ + margin: 1em 0 0; +} +.page { + padding: 4em 0 4em; +} +.bs-example { + padding: 2em 0 0; +} +.form-horizontal .control-label { + text-align: left; +} +/*--//typo--*/ +/*--responsive--*/ +@media(max-width:1366px){ +} +@media(max-width:1280px){ + .navbar-nav > li > .mega-dropdown-menu { + left: -130%; + } +} +@media(max-width:1220px){ + .h_menu4 { + margin-left: 16.6%; + } + ul.nav_1 li a { + padding: 1.6em 1.2em; + } + .col1 ul li a { + padding: 6px 0px; + } + .navbar-nav > li > .dropdown-menu { + left: -197%; + } + .navbar-nav > li > .mega-dropdown-menu { + left: -387%; + } + .banner { + height: 500px; + } + .col-pic { + padding-top: 5em; + } + .mid-1 h6 { + font-size: 1.05em; + } + .mid-2 p { + font-size: 0.75em; + } + .wishlist { + width: 42%; + } + .b-wrapper1.long-img { + padding-top: 14em; + } + .heart li a { + margin: 0 0.5em; + } +} +@media(max-width:1000px){ + .navbar-toggle { + background-color: #000 !important; + } + .navbar-toggle .icon-bar { + background-color: #fff; + } + .header-login { + margin-left: 24%; + width: 33%; + float:left; + } + ul.nav_1 li a { + padding: 1.2em 0.5em; + font-size: 0.8em; + } + .col1 ul li a { + padding: 6px 0px; + font-size: 0.85em; + } + .logo img{ + width:84%; + } + .h_menu4 { + margin-left: 21.8%; + width: 56%; + padding: 0; + float:left; + } + .search-right { + width: 21%; + float:left; + } + .heart span { + margin: 0.6em; + } + .right button { + left: 43px; + } + .box_1 h3 { + font-size: 0.8em; + } + .box_1 p a { + font-size: 0.7em; + } + .box_1 h3 img { + width: 25%; + } + .cart.box_1 { + margin-top: 0px; + } + .heart { + margin-top: 0em; + } +} +@media(max-width:991px){ + + .menu-top { + width: 660px; + padding: 1em; + } + .navbar-nav > li > .dropdown-menu { + left: -233%; + } + .col1 h4 { + font-size: 1.2em; + } + .navbar-nav > li > .mega-dropdown-menu { + left: -490%; + } + .col-md{ + width:83%; + margin:0 auto; + padding-bottom: 2em; + } + .col-md1{ + width:83%; + margin:0 auto; + } + .col-pic { + padding-top: 7em; + } + .item-grid,.item-grid1{ + width:50%; + float:left; + padding-top: 2em; + } + .item-grid1 { + padding-bottom: 0em; + } + .brand-grid{ + float:left; + width:25%; + } + .brand { + padding: 4em 0; + } + .mid-popular { + padding-top: 0em; + } + .footer-middle-in h6 { + margin-top: 1em; + } + .col-md-9 { + padding: 0; + } + .grid { + width: 50%; + } + .contact-form { + padding: 4em 0; + } + .login-do { + padding-bottom: 2em; + } + .wishlist { + width: 52%; + } + .b-wrapper1.long-img { + padding-top: 19em; + } + .span_2_of_a1 h3 { + font-size: 1.4em; + } + /*--typo--*/ + h1.grid2 { + font-size: 2.3em; + } + .page { + padding: 2em 0; + } + /*----*/ + td.add-check a{ + width: 119px; + } + .check-out { + padding: 3em 0em 0; + } + th { + font-size: 1.1em; + } + td { + font-size: 0.9em; + } +} +@media(max-width:768px){ + + .banner { + height: 450px; + background-position-x: -883px; + } +} +@media(max-width:767px){ + .header-login { + margin-left: 29%; + width: 36%; + } + .h_menu4 { + width: 53%; + } + .search-right { + width: 25%; + } + + .nav > li > a{ + padding: 1.2em 3em !important; + width: 171px; + } + .navbar-nav { + margin: 0; + width: 100%; + } + .col1 { + float: none; + width: 100%; + } + ul.nav_1 li { + border-right: none; + } + .navbar-nav > li > .dropdown-menu { + left: inherit; + } + .navbar-nav > li > .mega-dropdown-menu { + left: inherit; + } + .header-social { + float: right; + } + .menu-top { + width: 160px; + } + + .content-top { + padding: 4em 0; + } + .footer-bottom-top { + float: none; + text-align: center; + } + .footer-class { + float: none; + text-align: center; + margin-top: 0.6em; + } + .banner-top { + height: 196px; + padding: 3em 0; + } + .product { + padding: 2em 0 0; + } + .grid { + width: 60%; + } + .tabs li a { + padding: 1em !important; + } + .product-at { + padding: 2em 0 0; + } + .map iframe { + min-height: 300px; + } + .wishlist { + width: 60%; + } + th { + font-size: 1em; + } + .close1, .close2, .close3 { + bottom: 3px; + } + .check-out { + padding: 4em 0em 0; + } + .login { + padding: 4em 0 0; + } + /*--typo--*/ + button.btn.btn-lg { + font-size: 1.1em; + } + h1.grid2 { + font-size: 2em; + } + h2.grid2 { + font-size: 1.9em; + } + .single { + padding: 3.5em 0 0; + } + .b-wrapper1.long-img { + padding-top: 16em; + } + td.add-check a { + width: 106px; + } + .heart li a { + margin: 0 0.3em; + } +} +@media (max-width: 640px){ + .banner { + height: 390px; + background-position-x: -965px; + } +} +@media (max-width: 620px){ + .header-login { + width: 38%; + } +} +@media(max-width:568px){ + .header-login { + margin-left: 41%; + width: 60%; + text-align: right; + padding: 0; + } + .header-top { + padding: 0.7em 0; + } + .header-social { + margin-top: 1em; + padding:0; + } + .search-right { + width: 36%; + float: right; + } + .h_menu4 { + width: 30%; + margin: 0; + } + .navbar-toggle { + float: left; + } + .logo { + left: -3%; + } + .nav > li > a { + padding: 0.8em 2em !important; + } + .col-md,.col-md1 { + width: 100%; + } + .col-2 h2 { + font-size: 2em; + line-height: 1.5em; + } + .col-pic h5 { + font-size: 1.7em; + } + .col-pic p { + font-size: 1em; + } + .col-pic { + padding-top: 5em; + } + .content-top { + padding: 3em 0; + } + .content-mid h3 { + font-size: 2em; + } + .item-grid ,.item-grid1{ + padding: 2em 0.5em 0; + } + .mid-1 h6 { + font-size: 1em; + } + .mid-pop .pro-img:hover .zoom-icon { + top: 30%; + } + .brand-grid { + float: left; + width: 50%; + } + .brand { + padding: 2em 0; + } + .footer-middle { + padding: 3em 0; + } + .footer-class { + font-size: 0.9em; + } + + .product { + padding: 1em 0 0; + } + .grid { + width: 70%; + } + nav.nav-sidebar { + float: none; + width: 100%; + border-top: none; + } + + .one { + float: none; + width: 100%; + } + .tabs li a { + font-size: 0.8em; + padding: 1em !important; + border-right: 1px solid #EDEDED; + border-top: 1px solid #EDEDED; + border-bottom: none; + } + .tab-head { + padding: 2em 0 0; + } + .contact-form { + padding: 3em 0; + } + .map iframe { + min-height: 250px; + } + .four { + padding: 3em 0; + } + .four h3 { + font-size: 6em; + } + .wishlist { + width: 80%; + } + .check-out { + padding: 3em 0em 0; + } + + a.at-in { + width: 38%; + } + .banner-top h1 { + font-size: 2.2em; + } + .banner-top { + height: 178px; + padding: 3em 0; + background-size: 557px; + } + .sed h5 { + font-size: 0.9em; + } + .sed { + width: 58%; + } + td { + font-size: 0.9em; + } + .login-mail input[type="text"], .login-mail input[type="password"] { + width: 93%; + } + .login { + padding: 3em 0 0; + } + .search { + padding: 0.5em; + top: 1px; + } + .search input[type=submit] { + top: 7px; + } + .single { + padding: 3em 0 0; + } + .span_2_of_a1 h3 { + font-size: 1.4em; + } + .b-wrapper1.long-img { + padding-top: 12em; + } + th.table-grid { + padding: 1em 6em; + } + td.add-check a { + width: 107px; + } + .check-out { + padding: 2em 0em 0; + } + /*--typo--*/ + .page-header h3 { + font-size: 2em; + } + button.btn.btn-lg { + font-size: 1em; + padding: 7px; + } + button.btn.btn-1 { + font-size: 0.9em; + padding: 8px; + } + button.btn.btn-sm { + font-size: 0.8em; + padding: 9px; + } + h1#h1-bootstrap-heading { + font-size: 2.2em; + } + h2#h2-bootstrap-heading { + font-size: 2em; + } + h1.grid2 { + font-size: 1.45em; + } + h2.grid2 { + font-size: 1.35em; + } + h3.grid2 { + font-size: 1.3em; + } + h4.grid2 { + font-size: 1.2em; + } + +} +@media(max-width:480px){ + .banner { + height: 340px; + background-position-x: -238px; + background-size: 704px; + } +} +@media(max-width:390px){ + .logo { + left: -11%; + } + .logo img { + width: 66%; + } + .header-top { + padding: 0.53em 0; + } + .header-login ul li a { + font-size: 0.78em; + margin: 0 0.1em; + } + .header-social { + margin-top: 0.15em; + } + .h_menu4 { + width: 42%; + } + .nav > li > a { + padding: 0.8em 1em !important; + width: 160px; + } + .search-right { + width: 57%; + } + + .footer-middle-in img{ + width:60%; + } + .content-top { + padding: 2em 0; + } + .col-md, .col-md1 { + padding: 0; + } + .col-2 span { + font-size: 1.2em; + } + .col-2 h2 { + font-size: 1.5em; + } + .col-2 p { + font-size: 0.82em; + } + .col-2 { + padding: 1em 0; + } + .col-pic h5 { + font-size: 1.5em; + } + .col-pic p { + font-size: 0.9em; + } + .col-pic { + padding-top: 3em; + } + .content-mid h3 { + font-size: 1.5em; + } + label.line { + width: 107px; + } + .zoom-icon .icon { + width: 35px; + height: 35px; + font-size: 1em; + line-height: 2.3em; + } + .mid-pop .pro-img:hover .zoom-icon { + top: 20.5%; + } + .item-grid { + padding: 1em 0.3em 0; + } + .women-top { + float: none; + } + .mid-1 span { + font-size: 0.8em; + } + .mid-1 h6 { + font-size: 0.8em; + } + .img { + float: none; + text-align: center; + margin-top: 0.5em; + } + .img img{ + width:29%; + } + .item-grid,.item-grid1 { + padding: 1em 0.3em 0; + } + .block ,.mid-2 p{ + float: none; + text-align: center; + } + .mid-1 { + padding-top: 0.5em; + } + .mid-2 { + padding-top: 0.5em; + } + .footer-middle { + padding: 2em 0; + } + .footer-middle-in h6 { + font-size: 1.2em; + } + .footer-middle-in p,ul.in li a,ul.tag-in li a,.footer-class { + font-size: 0.83em; + } + .banner-top h1 { + font-size: 1.6em; + } + .banner-top h2 { + font-size: 0.8em; + } + .banner-top em { + width: 78px; + } + .banner-top { + height: 125px; + padding: 1.7em 0; + background-size: 434px; + } + .product { + padding: 0em 0 0; + } + h4.cate { + font-size: 1.4em; + } + .product-bottom { + padding:2em 0 0; + } + .menu-drop > li > a { + font-size: 0.83em; + } + .tabs li a { + padding: 1em !important; + } + .login-do { + padding: 0 0 2em; + } + .login-mail input[type="text"], .login-mail input[type="password"] { + width: 90%; + } + .login-mail { + margin-bottom: 1em; + } + .login-right { + padding: 0; + } + .login-right h3 { + font-size: 1.2em; + } + .login-right p { + font-size: 0.83em; + } + .login { + padding: 2em 0 0; + } + .hvr-skew-backward { + padding: 0.4em 1em; + font-size: 0.9em; + } + .wishlist { + width: 100%; + margin: 2em auto 0; + } + .wishlist h6 { + font-size: 0.85em; + } + .wishlist p { + font-size: 0.9em; + } + .check-out { + padding: 1em 0em 0; + } + .search { + width: 215px; + right: 3.6em; + } + .search input[type=submit] { + width: 27%; + font-size: 0.7em; + } + .search input[type=text] { + padding: 7px; + width: 70%; + font-size: 0.75em; + } + th.table-grid { + padding: 0 5em; + } + th{ + padding:0 3em; + } + td { + font-size: 0.8em; + } + .sed p { + font-size: 0.88em; + line-height: 1.6em; + } + .sed h5 { + font-size: 1em; + } + .single { + padding: 2em 0 0; + } + .single-top-in { + padding: 0; + } + .price_single { + font-size: 1em; + margin: 0.5em 0 1em; + } + h4.quick { + font-size: 1.1em; + } + p.quick_desc { + font-size: 0.8em; + margin: 0.7em 0 1em; + } + .product-qty span { + font-size: 1em; + } + .tabs li a { + padding: 0.6em 1em !important; + } + .facts p,.facts ul li { + font-size: 0.8em; + } + .four h3 { + font-size: 5em; + } + .four p { + font-size: 0.8em; + } + .b-from-left { + font-size: 1.5em; + } + .b-from-right { + font-size: 1em; + } + .b-wrapper1.long-img { + padding-top: 8em; + } + .grid { + padding: 0; + } + .span_2_of_a1 h3 { + font-size: 1.2em; + } + p.in-para { + font-size: 0.8em; + } + /*--typo--*/ + h1#h1-bootstrap-heading { + font-size: 1.6em; + } + h2#h2-bootstrap-heading { + font-size: 1.5em; + } + h3#h3-bootstrap-heading { + font-size: 1.4em; + } + button.btn.btn-lg { + font-size: 0.9em; + margin: 0 0 0.5em 0px; + padding: 9px; + } + .grid1 { + margin: 0.7em 0 0; + } + button.btn.btn-1 { + font-size: 0.8em; + margin: 0 0 0.5em; + } + button.btn.btn-sm { + font-size: 0.7em; + padding: 5px; + margin: 0 0 0.5em; + } + button.btn.btn-xs { + font-size: 0.7em; + } + ul.nav.nav-pills a{ + padding: 0.5em; + font-size: 0.9em; + } + span.label { + margin: 0 0 0.5em; + display: inline-block; + } + .page { + padding: 0 0 1em; + } + .page-header { + margin: 16px 0 9px; + } + .grid2 { + margin: 0.4em 0 0; + } + .bs-example { + padding: 1em 0 0; + } + .page-header h3 { + font-size: 1.6em; + } + td.add-check a { + width: 86px; + } +} +@media(max-width:320px){ + .banner { + height: 232px; + background-position-x: -225px; + background-size: 542px; + } +} \ No newline at end of file diff --git a/Kickoff/src/main/resources/static/fonts/Oxygen-Bold.ttf b/Kickoff/src/main/resources/static/fonts/Oxygen-Bold.ttf new file mode 100644 index 0000000..835ab05 Binary files /dev/null and b/Kickoff/src/main/resources/static/fonts/Oxygen-Bold.ttf differ diff --git a/Kickoff/src/main/resources/static/fonts/Oxygen-Regular.ttf b/Kickoff/src/main/resources/static/fonts/Oxygen-Regular.ttf new file mode 100644 index 0000000..a66ddf1 Binary files /dev/null and b/Kickoff/src/main/resources/static/fonts/Oxygen-Regular.ttf differ diff --git a/Kickoff/src/main/resources/static/fonts/Ubuntu-Bold.ttf b/Kickoff/src/main/resources/static/fonts/Ubuntu-Bold.ttf new file mode 100644 index 0000000..b173da2 Binary files /dev/null and b/Kickoff/src/main/resources/static/fonts/Ubuntu-Bold.ttf differ diff --git a/Kickoff/src/main/resources/static/fonts/Ubuntu-Regular.ttf b/Kickoff/src/main/resources/static/fonts/Ubuntu-Regular.ttf new file mode 100644 index 0000000..d748728 Binary files /dev/null and b/Kickoff/src/main/resources/static/fonts/Ubuntu-Regular.ttf differ diff --git a/Kickoff/src/main/resources/static/fonts/glyphicons-halflings-regular.eot b/Kickoff/src/main/resources/static/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000..b93a495 Binary files /dev/null and b/Kickoff/src/main/resources/static/fonts/glyphicons-halflings-regular.eot differ diff --git a/Kickoff/src/main/resources/static/fonts/glyphicons-halflings-regular.svg b/Kickoff/src/main/resources/static/fonts/glyphicons-halflings-regular.svg new file mode 100644 index 0000000..6f5a674 --- /dev/null +++ b/Kickoff/src/main/resources/static/fonts/glyphicons-halflings-regular.svg @@ -0,0 +1,289 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Kickoff/src/main/resources/static/fonts/glyphicons-halflings-regular.ttf b/Kickoff/src/main/resources/static/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000..1413fc6 Binary files /dev/null and b/Kickoff/src/main/resources/static/fonts/glyphicons-halflings-regular.ttf differ diff --git a/Kickoff/src/main/resources/static/fonts/glyphicons-halflings-regular.woff b/Kickoff/src/main/resources/static/fonts/glyphicons-halflings-regular.woff new file mode 100644 index 0000000..9e61285 Binary files /dev/null and b/Kickoff/src/main/resources/static/fonts/glyphicons-halflings-regular.woff differ diff --git a/Kickoff/src/main/resources/static/fonts/glyphicons-halflings-regular.woff2 b/Kickoff/src/main/resources/static/fonts/glyphicons-halflings-regular.woff2 new file mode 100644 index 0000000..64539b5 Binary files /dev/null and b/Kickoff/src/main/resources/static/fonts/glyphicons-halflings-regular.woff2 differ diff --git a/Kickoff/src/main/resources/static/images/logo.png b/Kickoff/src/main/resources/static/images/logo.png new file mode 100644 index 0000000..a8c4d7d Binary files /dev/null and b/Kickoff/src/main/resources/static/images/logo.png differ diff --git a/TotalRegistration1/src/main/resources/static/js/password.js b/Kickoff/src/main/resources/static/js/password.js similarity index 100% rename from TotalRegistration1/src/main/resources/static/js/password.js rename to Kickoff/src/main/resources/static/js/password.js diff --git a/Kickoff/src/main/resources/templates/admin/admin.html b/Kickoff/src/main/resources/templates/admin/admin.html new file mode 100644 index 0000000..68eac91 --- /dev/null +++ b/Kickoff/src/main/resources/templates/admin/admin.html @@ -0,0 +1,64 @@ + + + + Kickoff + + + + + + + + +
+
+
+ +
+
+
+
+ + +
+
+
+ + +
+ +
+ + \ No newline at end of file diff --git a/Kickoff/src/main/resources/templates/credentials/activate.html b/Kickoff/src/main/resources/templates/credentials/activate.html new file mode 100644 index 0000000..e21fc10 --- /dev/null +++ b/Kickoff/src/main/resources/templates/credentials/activate.html @@ -0,0 +1,30 @@ + + + + Kickoff + + + + + + + + + +
+
+
Your account is active
+

Now you can login and enjoy our website.

+ Home + Login +
+
+ + \ No newline at end of file diff --git a/Kickoff/src/main/resources/templates/credentials/login.html b/Kickoff/src/main/resources/templates/credentials/login.html new file mode 100644 index 0000000..1d90c92 --- /dev/null +++ b/Kickoff/src/main/resources/templates/credentials/login.html @@ -0,0 +1,98 @@ + + + + Kickoff + + + + + + + + +
+
+
+ +
+
+
+
+ + +
+
+
+
+ +
+ + \ No newline at end of file diff --git a/Kickoff/src/main/resources/templates/credentials/newpassword.html b/Kickoff/src/main/resources/templates/credentials/newpassword.html new file mode 100644 index 0000000..4636feb --- /dev/null +++ b/Kickoff/src/main/resources/templates/credentials/newpassword.html @@ -0,0 +1,55 @@ + + + + Kickoff + + + + + + + + + +
+
+ +
+
+ + + + \ No newline at end of file diff --git a/Kickoff/src/main/resources/templates/credentials/pending.html b/Kickoff/src/main/resources/templates/credentials/pending.html new file mode 100644 index 0000000..e0d85c5 --- /dev/null +++ b/Kickoff/src/main/resources/templates/credentials/pending.html @@ -0,0 +1,29 @@ + + + + Kickoff + + + + + + + + + +
+
+
Pending activity ...
+

We have send you an e-mail that it is active for 24h. Please follow up the instruction in order to go further. Thank you!

+ Back To Home +
+
+ + \ No newline at end of file diff --git a/Kickoff/src/main/resources/templates/credentials/register.html b/Kickoff/src/main/resources/templates/credentials/register.html new file mode 100644 index 0000000..85b97fb --- /dev/null +++ b/Kickoff/src/main/resources/templates/credentials/register.html @@ -0,0 +1,117 @@ + + + + Kickoff + + + + + + + + + + + +
+
+
+ +
+
+
+
+ +
+
+
+ +
+ +
+ + + + +
+
+ + diff --git a/Kickoff/src/main/resources/templates/credentials/reset.html b/Kickoff/src/main/resources/templates/credentials/reset.html new file mode 100644 index 0000000..4ff7859 --- /dev/null +++ b/Kickoff/src/main/resources/templates/credentials/reset.html @@ -0,0 +1,39 @@ + + + + Kickoff + + + + + + + + + +
+
+ +
+
+ + \ No newline at end of file diff --git a/Kickoff/src/main/resources/templates/error/403.html b/Kickoff/src/main/resources/templates/error/403.html new file mode 100644 index 0000000..6f975a6 --- /dev/null +++ b/Kickoff/src/main/resources/templates/error/403.html @@ -0,0 +1,28 @@ + + + + Kickoff + + + + + + + + + +
+
+

Access Forbidden


+ Home +
+
+ + \ No newline at end of file diff --git a/Kickoff/src/main/resources/templates/error/404.html b/Kickoff/src/main/resources/templates/error/404.html new file mode 100644 index 0000000..a4e90bb --- /dev/null +++ b/Kickoff/src/main/resources/templates/error/404.html @@ -0,0 +1,28 @@ + + + + Kickoff + + + + + + + + + +
+
+
Resource Not Found
+ Home +
+
+ + \ No newline at end of file diff --git a/Kickoff/src/main/resources/templates/error/5xx.html b/Kickoff/src/main/resources/templates/error/5xx.html new file mode 100644 index 0000000..2e73d66 --- /dev/null +++ b/Kickoff/src/main/resources/templates/error/5xx.html @@ -0,0 +1,28 @@ + + + + Kickoff + + + + + + + + + +
+
+
Ops :(

+ Home +
+
+ + \ No newline at end of file diff --git a/Kickoff/src/main/resources/templates/error/error.html b/Kickoff/src/main/resources/templates/error/error.html new file mode 100644 index 0000000..45981af --- /dev/null +++ b/Kickoff/src/main/resources/templates/error/error.html @@ -0,0 +1,29 @@ + + + + Kickoff + + + + + + + + + +
+
+
There is an error
+

Error

+ Home +
+
+ + \ No newline at end of file diff --git a/Kickoff/src/main/resources/templates/index.html b/Kickoff/src/main/resources/templates/index.html new file mode 100644 index 0000000..b418cbf --- /dev/null +++ b/Kickoff/src/main/resources/templates/index.html @@ -0,0 +1,75 @@ + + + + Kickoff + + + + + + + + + +
+
+
+ +
+
+
+
+ + +
+
+
+
+
+

Welcome

+

to Kickoff Security

+
+
+ + +
+
+ + \ No newline at end of file diff --git a/TotalRegistration1/src/main/resources/templates/mail/html/pending-email.html b/Kickoff/src/main/resources/templates/mail/html/pending-email.html similarity index 100% rename from TotalRegistration1/src/main/resources/templates/mail/html/pending-email.html rename to Kickoff/src/main/resources/templates/mail/html/pending-email.html diff --git a/Kickoff/src/main/resources/templates/mail/html/reset-email.html b/Kickoff/src/main/resources/templates/mail/html/reset-email.html new file mode 100644 index 0000000..3e3c8a8 --- /dev/null +++ b/Kickoff/src/main/resources/templates/mail/html/reset-email.html @@ -0,0 +1,42 @@ + + + + Total Registration + + + + Hello, +

+ Peter Static! +

+

+ Wow! You've got a long e-mail (more than 50 chars)! +

+

+ You required to reset your password on Total Registration on + today +

+

+ Please, follow this link:
+ + Reset link! + +

+ ...and use the temporal password from below: + +

+ password +

+
+
+ This link will be active until: +

+ tomorrow +

+
+

+ Regards,
+ The Total Registration Team +

+ + \ No newline at end of file diff --git a/TotalRegistration1/src/main/resources/templates/pages/member.html b/Kickoff/src/main/resources/templates/pages/member.html similarity index 53% rename from TotalRegistration1/src/main/resources/templates/pages/member.html rename to Kickoff/src/main/resources/templates/pages/member.html index 8d16336..6424948 100644 --- a/TotalRegistration1/src/main/resources/templates/pages/member.html +++ b/Kickoff/src/main/resources/templates/pages/member.html @@ -1,19 +1,26 @@ - - - - Member - - -

Member page

- - This content is only shown to authenticated users: - -
- Logged user: Me - Roles: [none] - -

Click Logout

-
- - + + + + Member + + +

Member page

+ + This content is only shown to authenticated users: + +
+ Logged user: Me + Roles: [none] + +

Logout

+

See ADMINISTRATOR PANEL

+
+
+ + + diff --git a/Kickoff/src/main/resources/templates/pages/panel.html b/Kickoff/src/main/resources/templates/pages/panel.html new file mode 100644 index 0000000..03164db --- /dev/null +++ b/Kickoff/src/main/resources/templates/pages/panel.html @@ -0,0 +1,26 @@ + + + + Admin + + +

Admin panel

+ + This content is only shown to the administrator of this website: + +
+ Logged admin: Me + Roles: [none] + +

Logout

+

See MEMBER PROTECTED PAGE

+
+ + + + diff --git a/README.md b/README.md index 6f18e78..dd95e3d 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,5 @@ -# SpringBootSecurity +# Spring Boot Security Kickoff Application -TotalRegistration1 Kickoff: - register - password strength (client side, JS) - password confirmation (Hibernate validation) @@ -8,13 +7,26 @@ TotalRegistration1 Kickoff: - email and password validation (Hibernate validation and Passay) - login (two roles) - logout + - persistent "remember me" + - forget(reset) password via 24h reset link (encrypted token, not stored in db, thymeleaf e-mail template) + - send a new link in case of expiration of current link + - reCAPTCHA for registration form (https://developers.google.com/recaptcha/docs/start) + - CSRF protection + - two forms login + - user login form with real database (ROLE_MEMBER) + - admin login form with in-memory credentials (ROLE_ADMIN); user: admin@kickoff.org, password: kickoff + - OAuth (WIP) -TotalRegistration2 (WIP): - - captcha - - ... +General facts: -Bonus: + - Spring Boot 1.4.2.RELEASE + - Hibernate 5 - Hibernate bytecode enhancement plugin activated - embedded JMS activated - HikariCP activated + - need a SMTP server (for testing Fake SMTP Server will do the job) - this must run in order to run the application + - Bootstrap kickoff +![alt text][logo] +[logo]: https://github.com/AnghelLeonard/SpringBootSecurity/blob/master/register.png "Register form" + diff --git a/TotalRegistration1/src/main/java/org/security/config/WebSecurityConfig.java b/TotalRegistration1/src/main/java/org/security/config/WebSecurityConfig.java deleted file mode 100644 index 53195d2..0000000 --- a/TotalRegistration1/src/main/java/org/security/config/WebSecurityConfig.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.security.config; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; -import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; - -/** - * - * @author newlife - */ -@Configuration -@EnableWebSecurity -public class WebSecurityConfig extends WebSecurityConfigurerAdapter { - - @Autowired - private UserDetailsService userDetailsService; - - @Override - protected void configure(HttpSecurity http) throws Exception { - http - .authorizeRequests() - .antMatchers("/", "/activate/**", "/home/**", "/login/**", "/pending/**", "/register/**", - "/css/**", "/js/**", "/images/**", "/favicon.ico").permitAll() - .antMatchers("/member/**").hasAuthority("ROLE_MEMBER") - .antMatchers("/admin/**").hasAuthority("ROLE_ADMIN") - .anyRequest().fullyAuthenticated() - .and() - .formLogin().loginPage("/login").defaultSuccessUrl("/home").failureUrl("/login?error").usernameParameter("email").passwordParameter("password").permitAll() - .and() - .logout().logoutUrl("/logout").logoutSuccessUrl("/login?logout").invalidateHttpSession(true).deleteCookies("JSESSIONID").permitAll() - .and() - .exceptionHandling().accessDeniedPage("/403") - .and() - .sessionManagement().invalidSessionUrl("/invalid").maximumSessions(1).maxSessionsPreventsLogin(false) - .and() - .sessionFixation().none() - .and() - .csrf().disable(); - } - - @Autowired - public void configureAuthentication(AuthenticationManagerBuilder auth) throws Exception { - auth - .userDetailsService(userDetailsService) - .passwordEncoder(passwordEncoder()); - } - - @Bean - public BCryptPasswordEncoder passwordEncoder() { - return new BCryptPasswordEncoder(); - } -} diff --git a/TotalRegistration1/src/main/java/org/security/controller/RegistrationController.java b/TotalRegistration1/src/main/java/org/security/controller/RegistrationController.java deleted file mode 100644 index 7054b9a..0000000 --- a/TotalRegistration1/src/main/java/org/security/controller/RegistrationController.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.security.controller; - -import javax.validation.Valid; -import org.security.model.User; -import org.security.service.IUserService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.validation.BindingResult; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.util.HtmlUtils; - -/** - * - * @author newlife - */ -@Controller -public class RegistrationController { - - @Autowired - IUserService userService; - - @GetMapping("/register") - public String registrationShow(final User user) { - return "/credentials/register"; - } - - @PostMapping("/register") - public String registrationPerform(@Valid final User user, BindingResult bindingResult) { - - if (bindingResult.hasErrors()) { - return "/credentials/register"; - } - - userService.registerNewUser(user); - - return "redirect:/pending?email=" + HtmlUtils.htmlEscape(user.getEmail()); - } - - @GetMapping("/activate/{token}") - public String activateUser(final @PathVariable("token") String token) { - - userService.activateNewUser(token); - - return "/credentials/activate"; - } -} diff --git a/TotalRegistration1/src/main/java/org/security/pojo/GenericMessage.java b/TotalRegistration1/src/main/java/org/security/pojo/GenericMessage.java deleted file mode 100644 index 4c05c92..0000000 --- a/TotalRegistration1/src/main/java/org/security/pojo/GenericMessage.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.security.pojo; - -/** - * - * @author newlife - */ -public class GenericMessage { - - private String sender; - private String receiver; - private String payload; - - public GenericMessage() { - } - - public GenericMessage(String sender, String receiver, String payload) { - this.sender = sender; - this.receiver = receiver; - this.payload = payload; - } - - public String getSender() { - return sender; - } - - public void setSender(String sender) { - this.sender = sender; - } - - public String getReceiver() { - return receiver; - } - - public void setReceiver(String receiver) { - this.receiver = receiver; - } - - public String getPayload() { - return payload; - } - - public void setPayload(String payload) { - this.payload = payload; - } - - @Override - public String toString() { - return "GenericMessage{" + "sender=" + sender + ", receiver=" + receiver + ", payload=" + payload + '}'; - } -} diff --git a/TotalRegistration1/src/main/java/org/security/service/NotificationServiceImpl.java b/TotalRegistration1/src/main/java/org/security/service/NotificationServiceImpl.java deleted file mode 100644 index 9baf0b8..0000000 --- a/TotalRegistration1/src/main/java/org/security/service/NotificationServiceImpl.java +++ /dev/null @@ -1,67 +0,0 @@ -package org.security.service; - -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import javax.mail.MessagingException; -import javax.mail.internet.MimeMessage; -import org.security.util.CryptUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.mail.MailSendException; -import org.springframework.mail.javamail.JavaMailSender; -import org.springframework.mail.javamail.MimeMessageHelper; -import org.springframework.stereotype.Component; -import org.thymeleaf.TemplateEngine; -import org.thymeleaf.context.Context; - -/** - * - * @author newlife - */ -@Component -public class NotificationServiceImpl implements INotificationService { - - @Value("${org.security.url.activate}") - private String activate; - - @Autowired - private JavaMailSender javaMailSender; - - @Autowired - private TemplateEngine templateEngine; - - @Override - public void sendUserPendingRegistrationEmail(final String address) { - - final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MMM-yyyy HH:mm"); - final String expiration = LocalDateTime.now().plusDays(1).format(formatter); - final String token = CryptUtils.encrypt(address + " " + expiration); - - if (token != null) { - final Context ctx = new Context(); - ctx.setVariable("name", address); - ctx.setVariable("expiration", expiration); - ctx.setVariable("activationlink", activate + token); - - final MimeMessage mimeMessage = this.javaMailSender.createMimeMessage(); - final MimeMessageHelper message = new MimeMessageHelper(mimeMessage, "UTF-8"); - try { - message.setSubject("Total Registration e-mail"); - message.setFrom("totalregistration@domain.com"); - message.setTo(address); - - final String htmlContent = this.templateEngine.process("mail/html/pending-email", ctx); - message.setText(htmlContent, true); - } catch (MessagingException ex) { - throw new RuntimeException("Unable to build a message for: " - + address + " | " + ex.getMessage(), ex); - } - - try { - this.javaMailSender.send(mimeMessage); - } catch (MailSendException e) { - throw new RuntimeException("Cannot send e-mail to address: " + address, e); - } - } - } -} diff --git a/TotalRegistration1/src/main/java/org/security/service/UserService.java b/TotalRegistration1/src/main/java/org/security/service/UserService.java deleted file mode 100644 index b3300de..0000000 --- a/TotalRegistration1/src/main/java/org/security/service/UserService.java +++ /dev/null @@ -1,73 +0,0 @@ -package org.security.service; - -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import org.security.dao.UserRepository; -import org.security.exceptions.UserAlreadyExistException; -import org.security.model.User; -import org.security.pojo.GenericMessage; -import org.security.util.CryptUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.dao.DataIntegrityViolationException; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.stereotype.Repository; - -/** - * - * @author newlife - */ -@Repository -public class UserService implements IUserService { - - @Autowired - private UserRepository userRepository; - - @Autowired - private PasswordEncoder passwordEncoder; - - @Autowired - private IMessageSenderService messageSenderService; - - @Override - public void registerNewUser(final User user) { - - user.setPassword(passwordEncoder.encode(user.getPassword())); - user.setEnabled(false); - user.setRoles("ROLE_MEMBER"); - - try { - userRepository.save(user); - } catch (DataIntegrityViolationException e) { - throw new UserAlreadyExistException("This email exist: " + user.getEmail(), e); - } - - sendUserPendingRegistrationMessage(user.getEmail()); - } - - @Override - public void activateNewUser(String token) { - - String decrypted = CryptUtils.decrypt(token); - - if (decrypted != null) { - final LocalDateTime now = LocalDateTime.now(); - LocalDateTime expiration = LocalDateTime. - parse(decrypted.substring(decrypted.indexOf(" ") + 1), - DateTimeFormatter.ofPattern("dd-MMM-yyyy HH:mm")); - - if (now.isBefore(expiration)) { - int status = userRepository.enableUserAccount(decrypted.substring(0, decrypted.indexOf(" "))); - if (status == 1) { - return; - } - } - } - - throw new RuntimeException("We cannot activate the account: " - + (decrypted == null ? "null" : decrypted.substring(0, decrypted.indexOf(" ")))); - } - - private void sendUserPendingRegistrationMessage(String address) { - messageSenderService.sendMessage("mailbox", new GenericMessage("", address, "")); - } -} diff --git a/TotalRegistration1/src/main/resources/templates/credentials/activate.html b/TotalRegistration1/src/main/resources/templates/credentials/activate.html deleted file mode 100644 index 6ad6c8d..0000000 --- a/TotalRegistration1/src/main/resources/templates/credentials/activate.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - Activate - - -

Your account have been activated ...

- - Login now: - Goooooooooo - - diff --git a/TotalRegistration1/src/main/resources/templates/credentials/login.html b/TotalRegistration1/src/main/resources/templates/credentials/login.html deleted file mode 100644 index 49bbb5e..0000000 --- a/TotalRegistration1/src/main/resources/templates/credentials/login.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - Login - - -

Bad credentials

- - - - - -
User *:
Password *:
-
- - diff --git a/TotalRegistration1/src/main/resources/templates/credentials/pending.html b/TotalRegistration1/src/main/resources/templates/credentials/pending.html deleted file mode 100644 index 823df2a..0000000 --- a/TotalRegistration1/src/main/resources/templates/credentials/pending.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - Pending - - -

Pending...

- Please, checkout your e-mail for the activation link ... - - diff --git a/TotalRegistration1/src/main/resources/templates/credentials/register.html b/TotalRegistration1/src/main/resources/templates/credentials/register.html deleted file mode 100644 index 9bb3ea8..0000000 --- a/TotalRegistration1/src/main/resources/templates/credentials/register.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - Register - - - -

Register page

-
...
-
-
-
-
- -

First Name Error

-
-
- -

E-mail Error

-
-
- -

Password Error

- -

-
-
- -

Confirm Password Error

-
-
- -
-
-
-
- - - diff --git a/TotalRegistration1/src/main/resources/templates/error/403.html b/TotalRegistration1/src/main/resources/templates/error/403.html deleted file mode 100644 index 3165ac8..0000000 --- a/TotalRegistration1/src/main/resources/templates/error/403.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - - 403 - - -

You don't have access to this resource ...

- - \ No newline at end of file diff --git a/TotalRegistration1/src/main/resources/templates/error/error.html b/TotalRegistration1/src/main/resources/templates/error/error.html deleted file mode 100644 index 0ebab47..0000000 --- a/TotalRegistration1/src/main/resources/templates/error/error.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - Error page - - - - ERROR !!! -

Error

- - diff --git a/TotalRegistration1/src/main/resources/templates/error/invalid.html b/TotalRegistration1/src/main/resources/templates/error/invalid.html deleted file mode 100644 index 4c6d8fc..0000000 --- a/TotalRegistration1/src/main/resources/templates/error/invalid.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - Error page - - - - Your session is not valid. Try logout and login again! - - diff --git a/TotalRegistration1/src/main/resources/templates/home.html b/TotalRegistration1/src/main/resources/templates/home.html deleted file mode 100644 index c238c28..0000000 --- a/TotalRegistration1/src/main/resources/templates/home.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - Total registration - Home page - - -

- Register - Login - Logout -

- - diff --git a/TotalRegistration1/src/main/resources/templates/index.html b/TotalRegistration1/src/main/resources/templates/index.html deleted file mode 100644 index faeb42a..0000000 --- a/TotalRegistration1/src/main/resources/templates/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - Total registration - index - - -

Welcome!

- -

Click here to start the registration process.

- - diff --git a/TotalRegistration1/src/main/resources/templates/pages/admin.html b/TotalRegistration1/src/main/resources/templates/pages/admin.html deleted file mode 100644 index 90f22e8..0000000 --- a/TotalRegistration1/src/main/resources/templates/pages/admin.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - Admin - - -

Admin page

- -
- Logged user: Me - Roles: [none] - -

Click Logout

-
- - diff --git a/register.png b/register.png new file mode 100644 index 0000000..75f373b Binary files /dev/null and b/register.png differ