[
  {
    "path": ".gitignore",
    "content": ".idea/\ntarget/\n*.iml\n\n"
  },
  {
    "path": "1.x/README.md",
    "content": "# Spring Boot Examples\n\nDemo website：http://www.ityouknow.com/\n\n[Spring Cloud学习示例代码](https://github.com/ityouknow/spring-cloud-examples)\n\n[Spring Boot 中文索引](https://github.com/ityouknow/awesome-spring-boot)\n\n[参与贡献](https://github.com/ityouknow/spring-boot-examples/issues)&nbsp;| &nbsp;[English](README_EN.md)\n\n**[github地址](https://github.com/ityouknow/spring-boot-examples)**\n\n**[码云地址](https://gitee.com/ityouknow/spring-boot-examples)**\n\nSpring boot使用的各种示例，以最简单、最实用为标准\n\n                           \n- [spring-boot-helloWorld](https://github.com/ityouknow/spring-boot-examples/tree/master/1.x/spring-boot-helloWorld)：spring-boot的helloWorld版本\n- [spring-boot-mybaits-annotation](https://github.com/ityouknow/spring-boot-examples/tree/master/1.x/spring-boot-mybatis-annotation)：注解版本\n- [spring-boot-mybaits-xml](https://github.com/ityouknow/spring-boot-examples/tree/master/1.x/spring-boot-mybatis-xml)：xml配置版本\n- [spring-boot-mybatis-mulidatasource](https://github.com/ityouknow/spring-boot-examples/tree/master/1.x/spring-boot-mybatis-mulidatasource)：springboot+mybatis多数据源最简解决方案\n- [spring-boot-mybatis-annotation-mulidatasource](https://github.com/ityouknow/spring-boot-examples/tree/master/1.x/spring-boot-mybatis-annotation-mulidatasource)：springboot+mybatis（注解版）多数据源最简解决方案\n- [spring-boot-thymeleaf](https://github.com/ityouknow/spring-boot-examples/tree/master/1.x/spring-boot-thymeleaf)：simple spring boot thymeleaf demo\n- [spring-boot-jpa-thymeleaf-curd](https://github.com/ityouknow/spring-boot-examples/tree/master/1.x/spring-boot-jpa-thymeleaf-curd)：spring boot + jpa + thymeleaf 增删改查示例\n- [spring-boot-rabbitmq](https://github.com/ityouknow/spring-boot-examples/tree/master/1.x/spring-boot-rabbitmq)：spring boot和rabbitmq各种消息应用案例\n- [spring-boot-scheduler](https://github.com/ityouknow/spring-boot-examples/tree/master/1.x/spring-boot-scheduler)：spring boot和定时任务案例\n- [spring-boot-web](https://github.com/ityouknow/spring-boot-examples/tree/master/1.x/spring-boot-web)：web开发综合使用案例\n- [spring-boot-mail](https://github.com/ityouknow/spring-boot-examples/tree/master/1.x/spring-boot-mail)：spring boot和邮件服务\n- [spring-boot-mongodb](https://github.com/ityouknow/spring-boot-examples/tree/master/1.x/spring-boot-mongodb)：spring boot和mongodb的使用\n- [spring-boot-multi-mongodb](https://github.com/ityouknow/spring-boot-examples/tree/master/1.x/spring-boot-multi-mongodb)：spring boot和mongodb多数据源的使用\n- [spring-boot-package-war](https://github.com/ityouknow/spring-boot-examples/tree/master/1.x/spring-boot-package-war)：spring-boot打包成war包示例\n- [spring-boot-shiro](https://github.com/ityouknow/spring-boot-examples/tree/master/1.x/spring-boot-shiro)：springboot 整合shiro rbac示例\n- [spring-boot-file-upload](https://github.com/ityouknow/spring-boot-examples/tree/master/1.x/spring-boot-file-upload)：使用Spring Boot 上传文件示例   \n- [spring-boot-fastDFS](https://github.com/ityouknow/spring-boot-examples/tree/master/1.x/spring-boot-fastDFS)：Spring Boot 整合FastDFS示例  \n- [spring-boot-actuator](https://github.com/ityouknow/spring-boot-examples/tree/master/1.x/spring-boot-actuator)：Spring Boot Actuator 使用示例\n- [spring-boot-admin-simple](https://github.com/ityouknow/spring-boot-examples/tree/master/1.x/spring-boot-admin-simple)：Spring Boot Admin 的使用示例  \n\n**[Favorites-web](https://github.com/cloudfavorites/favorites-web)：云收藏（springboot实战开源项目）**\n\n\n\n参考文章：\n\n- [springboot(一)：入门篇](http://www.ityouknow.com/springboot/2016/01/06/springboot(%E4%B8%80)-%E5%85%A5%E9%97%A8%E7%AF%87.html)\n- [springboot(二)：web综合开发](http://www.ityouknow.com/springboot/2016/02/03/springboot(%E4%BA%8C)-web%E7%BB%BC%E5%90%88%E5%BC%80%E5%8F%91.html)\n- [springboot(三)：Spring boot中Redis的使用](http://www.ityouknow.com/springboot/2016/03/06/springboot(%E4%B8%89)-Spring-Boot%E4%B8%ADRedis%E7%9A%84%E4%BD%BF%E7%94%A8.html)\n- [springboot(四)：thymeleaf使用详解](http://www.ityouknow.com/springboot/2016/05/01/springboot(%E5%9B%9B)-thymeleaf%E4%BD%BF%E7%94%A8%E8%AF%A6%E8%A7%A3.html)\n- [springboot(五)：spring data jpa的使用](http://www.ityouknow.com/springboot/2016/08/20/springboot(%E4%BA%94)-spring-data-jpa%E7%9A%84%E4%BD%BF%E7%94%A8.html)\n- [springboot(六)：如何优雅的使用mybatis](http://www.ityouknow.com/springboot/2016/11/06/springboot(%E5%85%AD)-%E5%A6%82%E4%BD%95%E4%BC%98%E9%9B%85%E7%9A%84%E4%BD%BF%E7%94%A8mybatis.html)\n- [springboot(七)：springboot+mybatis多数据源最简解决方案](http://www.ityouknow.com/springboot/2016/11/25/springboot(%E4%B8%83)-springboot+mybatis%E5%A4%9A%E6%95%B0%E6%8D%AE%E6%BA%90%E6%9C%80%E7%AE%80%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.html)\n- [springboot(八)：RabbitMQ详解](http://www.ityouknow.com/springboot/2016/11/30/springboot(%E5%85%AB)-RabbitMQ%E8%AF%A6%E8%A7%A3.html)\n- [springboot(九)：定时任务](http://www.ityouknow.com/springboot/2016/12/02/springboot(%E4%B9%9D)-%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1.html)\n- [springboot(十)：邮件服务](http://www.ityouknow.com/springboot/2017/05/06/springboot-mail.html)\n- [springboot(十一)：Spring boot中mongodb的使用](http://www.ityouknow.com/springboot/2017/05/08/springboot-mongodb.html)\n- [springboot(十二)：springboot如何测试打包部署](http://www.ityouknow.com/springboot/2017/05/09/springboot-deploy.html)\n- [springboot(十三)：springboot小技巧](http://www.ityouknow.com/springboot/2017/06/22/springboot-tips.html)\n- [springboot(十四)：springboot整合shiro-登录认证和权限管理](http://www.ityouknow.com/springboot/2017/06/26/springboot-shiro.html)\n- [springboot(十五)：springboot+jpa+thymeleaf增删改查示例](http://www.ityouknow.com/springboot/2017/09/23/spring-boot-jpa-thymeleaf-curd.html)  \n- [springboot(十六)：使用Jenkins部署Spring Boot](http://www.ityouknow.com/springboot/2017/11/11/springboot-jenkins.html)\n- [springboot(十七)：使用Spring Boot上传文件](http://www.ityouknow.com/springboot/2018/01/12/spring-boot-upload-file.html)   \n- [springboot(十八)：使用Spring Boot集成FastDFS](http://www.ityouknow.com/springboot/2018/01/16/spring-boot-fastdfs.html)   \n- [springboot(十九)：使用Spring Boot Actuator监控应用](http://www.ityouknow.com/springboot/2018/02/06/spring-boot-actuator.html)   \n- [springboot(二十)：使用spring-boot-admin对spring-boot服务进行监控](http://www.ityouknow.com/springboot/2018/02/11/spring-boot-admin.html)   \n\n**[springboot实战：我们的第一款开源项目](http://www.ityouknow.com/springboot/2016/09/26/springboot%E5%AE%9E%E6%88%98-%E6%88%91%E4%BB%AC%E7%9A%84%E7%AC%AC%E4%B8%80%E6%AC%BE%E5%BC%80%E6%BA%90%E8%BD%AF%E4%BB%B6.html)**\n\n> 如果大家想了解关于springboot的其它方面应用，也可以以[issues](https://github.com/ityouknow/spring-boot-examples/issues)的形式反馈给我，我后续来完善。\n\n\n关注公众号：纯洁的微笑，回复\"666\"进群交流\n\n![](http://www.ityouknow.com/assets/images/keeppuresmile.jpg)\n\n"
  },
  {
    "path": "1.x/README_EN.md",
    "content": "# Spring Boot Examples\n\nthis is ablout learn Spring Boot Examples\n\nDemo website：http://www.ityouknow.com/\n\n[Spring Cloud example code](https://github.com/ityouknow/spring-cloud-examples)\n\n[Contribution](https://github.com/ityouknow/spring-boot-examples/issues)&nbsp;| &nbsp;[中文](README.md)\n\nSpring Boot Examples, Use the simplest and most useful scene demo.\n\n- [spring-boot-helloWorld](https://github.com/ityouknow/spring-boot-examples/tree/master/1.x/spring-boot-helloWorld)：Spring Boot helloWorld\n- [spring-boot-mybaits-annotation](https://github.com/ityouknow/spring-boot-examples/tree/master/1.x/spring-boot-mybatis-annotation)：Spring Boot use mybatis annotation\n- [spring-boot-mybaits-xml](https://github.com/ityouknow/spring-boot-examples/tree/master/1.x/spring-boot-mybatis-xml)：Spring Boot use mybatis xml \n- [spring-boot-mybatis-mulidatasource](https://github.com/ityouknow/spring-boot-examples/tree/master/1.x/spring-boot-mybatis-mulidatasource)：Spring Boot+mybatis+mulidatasource\n- [spring-boot-mybatis-annotation-mulidatasource](https://github.com/ityouknow/spring-boot-examples/tree/master/1.x/spring-boot-mybatis-annotation-mulidatasource)：Spring Boot+ mybatis annotation + mulidatasource\n- [spring-boot-thymeleaf](https://github.com/ityouknow/spring-boot-examples/tree/master/1.x/spring-boot-thymeleaf)：simple spring boot thymeleaf demo\n- [spring-boot-jpa-thymeleaf-curd](https://github.com/ityouknow/spring-boot-examples/tree/master/1.x/spring-boot-jpa-thymeleaf-curd)：spring boot + jpa + thymeleaf curd demo\n- [spring-boot-rabbitmq](https://github.com/ityouknow/spring-boot-examples/tree/master/1.x/spring-boot-rabbitmq)： using AMQP and RabbitMQ\n- [spring-boot-scheduler](https://github.com/ityouknow/spring-boot-examples/tree/master/1.x/spring-boot-scheduler)：Timed tasks developed using Spring Boot \n- [spring-boot-web](https://github.com/ityouknow/spring-boot-examples/tree/master/1.x/spring-boot-web)：Web projects developed using Spring Boot \n- [spring-boot-mail](https://github.com/ityouknow/spring-boot-examples/tree/master/1.x/spring-boot-mail)：Mail system developed using Spring Boot \n- [spring-boot-mongodb](https://github.com/ityouknow/spring-boot-examples/tree/master/1.x/spring-boot-mongodb)：Spring Boot + Mongodb\n- [spring-boot-multi-mongodb](https://github.com/ityouknow/spring-boot-examples/tree/master/1.x/spring-boot-multi-mongodb)：Spring Boot + multiMongodb\n- [spring-boot-package-war](https://github.com/ityouknow/spring-boot-examples/tree/master/1.x/spring-boot-package-war)：Spring Boot package war\n- [spring-boot-shiro](https://github.com/ityouknow/spring-boot-examples/tree/master/1.x/spring-boot-shiro)：spring boot shiro rbac demo \n- [spring-boot-file-upload](https://github.com/ityouknow/spring-boot-examples/tree/master/1.x/spring-boot-file-upload)：Spring Boot upload file demo   \n- [spring-boot-fastDFS](https://github.com/ityouknow/spring-boot-examples/tree/master/1.x/spring-boot-fastDFS)：Spring Boot Integrate FastDFS  upload delete and so on \n- [spring-boot-actuator](https://github.com/ityouknow/spring-boot-examples/tree/master/1.x/spring-boot-actuator)：Spring Boot Actuator demo  \n- [spring-boot-admin-simple](https://github.com/ityouknow/spring-boot-examples/tree/master/1.x/spring-boot-admin-simple)：Spring Boot Admin demo    \n\n**[Favorites-web](https://github.com/cloudfavorites/favorites-web)：Open source projects developed using Spring Boot**\n"
  },
  {
    "path": "1.x/spring-boot-actuator/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-actuator</artifactId>\n\t<version>1.0.0-SNAPSHOT</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-actuator</name>\n\t<description>Demo project for Spring Boot</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>1.5.9.RELEASE</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-web</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-actuator</artifactId>\n        </dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t     <dependency>\n\t        <groupId>org.springframework.boot</groupId>\n\t        <artifactId>spring-boot-devtools</artifactId>\n\t        <optional>true</optional>\n\t\t</dependency>\n\t</dependencies>\n\t\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t\t<configuration>\n\t                <fork>true</fork>\n\t            </configuration>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\n</project>\n"
  },
  {
    "path": "1.x/spring-boot-actuator/src/main/java/com/neo/ActuatorApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class ActuatorApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(ActuatorApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "1.x/spring-boot-actuator/src/main/java/com/neo/controller/HelloController.java",
    "content": "package com.neo.controller;\n\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n@RestController\npublic class HelloController {\n\t\n    @RequestMapping(\"/hello\")\n    public String index() {\n        return \"Hello World\";\n    }\n}"
  },
  {
    "path": "1.x/spring-boot-actuator/src/main/resources/application.yml",
    "content": "server:\n  port: 8080\nmanagement:\n  security:\n    enabled: false #关掉安全认证\n  port: 8088 #管理端口调整成8088\n  context-path: /monitor #actuator的访问路径\nendpoints:\n  shutdown:\n    enabled: true\n\ninfo:\n   app:\n      name: spring-boot-actuator\n      version: 1.0.0"
  },
  {
    "path": "1.x/spring-boot-actuator/src/test/java/com/neo/ActuatorApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class ActuatorApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t\tSystem.out.println(\"hello word\");\n\t}\n\n}\n"
  },
  {
    "path": "1.x/spring-boot-actuator/src/test/java/com/neo/controller/HelloTests.java",
    "content": "package com.neo.controller;\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.http.MediaType;\nimport org.springframework.test.context.junit4.SpringRunner;\nimport org.springframework.test.web.servlet.MockMvc;\nimport org.springframework.test.web.servlet.request.MockMvcRequestBuilders;\nimport org.springframework.test.web.servlet.setup.MockMvcBuilders;\n\nimport static org.hamcrest.Matchers.equalTo;\nimport static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;\nimport static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class HelloTests {\n\n\t\n    private MockMvc mvc;\n\n    @Before\n    public void setUp() throws Exception {\n        mvc = MockMvcBuilders.standaloneSetup(new HelloController()).build();\n    }\n\n    @Test\n    public void getHello() throws Exception {\n        mvc.perform(MockMvcRequestBuilders.get(\"/hello\").accept(MediaType.APPLICATION_JSON))\n                .andExpect(status().isOk())\n                .andExpect(content().string(equalTo(\"Hello World\")));\n    }\n\n}"
  },
  {
    "path": "1.x/spring-boot-actuator/src/test/java/com/neo/controller/HelloWorldControlerTests.java",
    "content": "package com.neo.controller;\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.http.MediaType;\nimport org.springframework.test.context.junit4.SpringRunner;\nimport org.springframework.test.web.servlet.MockMvc;\nimport org.springframework.test.web.servlet.request.MockMvcRequestBuilders;\nimport org.springframework.test.web.servlet.result.MockMvcResultHandlers;\nimport org.springframework.test.web.servlet.result.MockMvcResultMatchers;\nimport org.springframework.test.web.servlet.setup.MockMvcBuilders;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class HelloWorldControlerTests {\n\n    private MockMvc mvc;\n\n    @Before\n    public void setUp() throws Exception {\n        mvc = MockMvcBuilders.standaloneSetup(new HelloController()).build();\n    }\n\n    @Test\n    public void getHello() throws Exception {\n        mvc.perform(MockMvcRequestBuilders.get(\"/hello\").accept(MediaType.APPLICATION_JSON))\n                .andExpect(MockMvcResultMatchers.status().isOk())\n                .andDo(MockMvcResultHandlers.print())\n                .andReturn();\n    }\n\n}"
  },
  {
    "path": "1.x/spring-boot-admin-simple/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-admin-simple</artifactId>\n\t<version>1.0.0.BUILD-SNAPSHOT</version>\n\n\t<modules>\n\t\t<module>spring-boot-admin-server</module>\n\t\t<module>spring-boot-admin-client</module>\n\t</modules>\n\n\t<packaging>pom</packaging>\n\t<name>Spring boot admin</name>\n\t<description>Demo project for Spring Boot</description>\n\n    <parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>1.5.9.RELEASE</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n\t\t<java.version>1.8</java.version>\n        <spring-cloud.version>Edgware.SR1</spring-cloud.version>\n\t</properties>\n\n    <dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n    </dependencies>\n\n    <dependencyManagement>\n        <dependencies>\n            <dependency>\n                <groupId>org.springframework.cloud</groupId>\n                <artifactId>spring-cloud-dependencies</artifactId>\n                <version>${spring-cloud.version}</version>\n                <type>pom</type>\n                <scope>import</scope>\n            </dependency>\n        </dependencies>\n    </dependencyManagement>\n\n</project>"
  },
  {
    "path": "1.x/spring-boot-admin-simple/spring-boot-admin-client/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\t<parent>\n\t\t<groupId>com.neo</groupId>\n\t\t<artifactId>spring-boot-admin-simple</artifactId>\n\t\t<version>1.0.0.BUILD-SNAPSHOT</version>\n\t</parent>\n\t<artifactId>spring-boot-admin-client</artifactId>\n\t<packaging>jar</packaging>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>de.codecentric</groupId>\n\t\t\t<artifactId>spring-boot-admin-starter-client</artifactId>\n\t\t\t<version>1.5.6</version>\n\t\t</dependency>\n\t</dependencies>\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\n</project>\n"
  },
  {
    "path": "1.x/spring-boot-admin-simple/spring-boot-admin-client/src/main/java/com/neo/AdminClientApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class AdminClientApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(AdminClientApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "1.x/spring-boot-admin-simple/spring-boot-admin-client/src/main/resources/application.properties",
    "content": "server.port=8001\n\nspring.boot.admin.url=http://localhost:8000  \nmanagement.security.enabled=false \n"
  },
  {
    "path": "1.x/spring-boot-admin-simple/spring-boot-admin-client/src/test/java/com/neo/AdminClientApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class AdminClientApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t}\n\n}\n"
  },
  {
    "path": "1.x/spring-boot-admin-simple/spring-boot-admin-server/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\t<parent>\n\t\t<groupId>com.neo</groupId>\n\t\t<artifactId>spring-boot-admin-simple</artifactId>\n\t\t<version>1.0.0.BUILD-SNAPSHOT</version>\n\t</parent>\n\t<artifactId>spring-boot-admin-server</artifactId>\n\t<packaging>jar</packaging>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>de.codecentric</groupId>\n\t\t\t<artifactId>spring-boot-admin-server</artifactId>\n\t\t\t<version>1.5.6</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>de.codecentric</groupId>\n\t\t\t<artifactId>spring-boot-admin-server-ui</artifactId>\n\t\t\t<version>1.5.6</version>\n\t\t</dependency>\n\t</dependencies>\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\n</project>\n"
  },
  {
    "path": "1.x/spring-boot-admin-simple/spring-boot-admin-server/src/main/java/com/neo/AdminServerApplication.java",
    "content": "package com.neo;\n\nimport de.codecentric.boot.admin.config.EnableAdminServer;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.EnableAutoConfiguration;\nimport org.springframework.context.annotation.Configuration;\n\n@Configuration\n@EnableAutoConfiguration\n@EnableAdminServer\npublic class AdminServerApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(AdminServerApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "1.x/spring-boot-admin-simple/spring-boot-admin-server/src/main/resources/application.properties",
    "content": "server.port=8000\n\n"
  },
  {
    "path": "1.x/spring-boot-admin-simple/spring-boot-admin-server/src/test/java/com/neo/AdminServerApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class AdminServerApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t}\n\n}\n"
  },
  {
    "path": "1.x/spring-boot-fastDFS/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0\n  http://maven.apache.org/maven-v4_0_0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <groupId>com.neo</groupId>\n    <artifactId>spring-boot-fastDFS</artifactId>\n    <packaging>jar</packaging>\n    <version>1.0</version>\n\n    <parent>\n        <groupId>org.springframework.boot</groupId>\n        <artifactId>spring-boot-starter-parent</artifactId>\n        <version>1.5.9.RELEASE</version>\n    </parent>\n\n    <properties>\n        <java.version>1.8</java.version>\n    </properties>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-web</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-thymeleaf</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-devtools</artifactId>\n            <optional>true</optional>\n        </dependency>\n        <dependency>\n            <groupId>org.csource</groupId>\n            <artifactId>fastdfs-client-java</artifactId>\n            <version>1.27-SNAPSHOT</version>\n        </dependency>\n    </dependencies>\n\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.springframework.boot</groupId>\n                <artifactId>spring-boot-maven-plugin</artifactId>\n            </plugin>\n        </plugins>\n    </build>\n\n</project>\n"
  },
  {
    "path": "1.x/spring-boot-fastDFS/src/main/java/com/neo/FastDFSApplication.java",
    "content": "package com.neo;\n\nimport org.apache.coyote.http11.AbstractHttp11Protocol;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.boot.context.embedded.tomcat.TomcatConnectorCustomizer;\nimport org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;\nimport org.springframework.context.annotation.Bean;\n\n@SpringBootApplication\npublic class FastDFSApplication {\n\n    public static void main(String[] args) throws Exception {\n        SpringApplication.run(FastDFSApplication.class, args);\n    }\n\n    //Tomcat large file upload connection reset\n    @Bean\n    public TomcatEmbeddedServletContainerFactory tomcatEmbedded() {\n        TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();\n        tomcat.addConnectorCustomizers((TomcatConnectorCustomizer) connector -> {\n            if ((connector.getProtocolHandler() instanceof AbstractHttp11Protocol<?>)) {\n                //-1 means unlimited\n                ((AbstractHttp11Protocol<?>) connector.getProtocolHandler()).setMaxSwallowSize(-1);\n            }\n        });\n        return tomcat;\n    }\n\n}"
  },
  {
    "path": "1.x/spring-boot-fastDFS/src/main/java/com/neo/controller/GlobalExceptionHandler.java",
    "content": "package com.neo.controller;\n\nimport org.springframework.web.bind.annotation.ControllerAdvice;\nimport org.springframework.web.bind.annotation.ExceptionHandler;\nimport org.springframework.web.multipart.MultipartException;\nimport org.springframework.web.servlet.mvc.support.RedirectAttributes;\n\n@ControllerAdvice\npublic class GlobalExceptionHandler {\n\n    //https://jira.spring.io/browse/SPR-14651\n    //4.3.5 supports RedirectAttributes redirectAttributes\n    @ExceptionHandler(MultipartException.class)\n    public String handleError1(MultipartException e, RedirectAttributes redirectAttributes) {\n\n        redirectAttributes.addFlashAttribute(\"message\", e.getCause().getMessage());\n        return \"redirect:/uploadStatus\";\n\n    }\n}\n"
  },
  {
    "path": "1.x/spring-boot-fastDFS/src/main/java/com/neo/controller/UploadController.java",
    "content": "package com.neo.controller;\n\nimport com.neo.fastdfs.FastDFSClient;\nimport com.neo.fastdfs.FastDFSFile;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.multipart.MultipartFile;\nimport org.springframework.web.servlet.mvc.support.RedirectAttributes;\n\nimport java.io.IOException;\nimport java.io.InputStream;\n\n@Controller\npublic class UploadController {\n    private static Logger logger = LoggerFactory.getLogger(UploadController.class);\n\n    @GetMapping(\"/\")\n    public String index() {\n        return \"upload\";\n    }\n\n    @PostMapping(\"/upload\") //new annotation since 4.3\n    public String singleFileUpload(@RequestParam(\"file\") MultipartFile file,\n                                   RedirectAttributes redirectAttributes) {\n        if (file.isEmpty()) {\n            redirectAttributes.addFlashAttribute(\"message\", \"Please select a file to upload\");\n            return \"redirect:uploadStatus\";\n        }\n        try {\n            // Get the file and save it somewhere\n            String path=saveFile(file);\n            redirectAttributes.addFlashAttribute(\"message\",\n                    \"You successfully uploaded '\" + file.getOriginalFilename() + \"'\");\n            redirectAttributes.addFlashAttribute(\"path\",\n                    \"file path url '\" + path + \"'\");\n        } catch (Exception e) {\n            logger.error(\"upload file failed\",e);\n        }\n        return \"redirect:/uploadStatus\";\n    }\n\n    @GetMapping(\"/uploadStatus\")\n    public String uploadStatus() {\n        return \"uploadStatus\";\n    }\n\n    /**\n     * @param multipartFile\n     * @return\n     * @throws IOException\n     */\n    public String saveFile(MultipartFile multipartFile) throws IOException {\n        String[] fileAbsolutePath={};\n        String fileName=multipartFile.getOriginalFilename();\n        String ext = fileName.substring(fileName.lastIndexOf(\".\") + 1);\n        byte[] file_buff = null;\n        InputStream inputStream=multipartFile.getInputStream();\n        if(inputStream!=null){\n            int len1 = inputStream.available();\n            file_buff = new byte[len1];\n            inputStream.read(file_buff);\n        }\n        inputStream.close();\n        FastDFSFile file = new FastDFSFile(fileName, file_buff, ext);\n        try {\n            fileAbsolutePath = FastDFSClient.upload(file);  //upload to fastdfs\n        } catch (Exception e) {\n            logger.error(\"upload file Exception!\",e);\n        }\n        if (fileAbsolutePath==null) {\n            logger.error(\"upload file failed,please upload again!\");\n        }\n        String path=FastDFSClient.getTrackerUrl()+fileAbsolutePath[0]+ \"/\"+fileAbsolutePath[1];\n        return path;\n    }\n}"
  },
  {
    "path": "1.x/spring-boot-fastDFS/src/main/java/com/neo/fastdfs/FastDFSClient.java",
    "content": "package com.neo.fastdfs;\n\nimport org.csource.common.NameValuePair;\nimport org.csource.fastdfs.*;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.core.io.ClassPathResource;\nimport org.springframework.core.io.Resource;\n\nimport java.io.*;\n\npublic class FastDFSClient {\n\tprivate static org.slf4j.Logger logger = LoggerFactory.getLogger(FastDFSClient.class);\n\tprivate static TrackerClient trackerClient;\n\tprivate static TrackerServer trackerServer;\n\tprivate static StorageClient storageClient;\n\tprivate static StorageServer storageServer;\n\n\tstatic {\n\t\ttry {\n\t\t\tString filePath = new ClassPathResource(\"fdfs_client.conf\").getFile().getAbsolutePath();;\n\t\t\tClientGlobal.init(filePath);\n\t\t\ttrackerClient = new TrackerClient();\n\t\t\ttrackerServer = trackerClient.getConnection();\n\t\t\tstorageServer = trackerClient.getStoreStorage(trackerServer);\n\t\t} catch (Exception e) {\n\t\t\tlogger.error(\"FastDFS Client Init Fail!\",e);\n\t\t}\n\t}\n\n\tpublic static String[] upload(FastDFSFile file) {\n\t\tlogger.info(\"File Name: \" + file.getName() + \"File Length:\" + file.getContent().length);\n\n\t\tNameValuePair[] meta_list = new NameValuePair[1];\n\t\tmeta_list[0] = new NameValuePair(\"author\", file.getAuthor());\n\n\t\tlong startTime = System.currentTimeMillis();\n\t\tString[] uploadResults = null;\n\t\ttry {\n\t\t\tstorageClient = new StorageClient(trackerServer, storageServer);\n\t\t\tuploadResults = storageClient.upload_file(file.getContent(), file.getExt(), meta_list);\n\t\t} catch (IOException e) {\n\t\t\tlogger.error(\"IO Exception when uploadind the file:\" + file.getName(), e);\n\t\t} catch (Exception e) {\n\t\t\tlogger.error(\"Non IO Exception when uploadind the file:\" + file.getName(), e);\n\t\t}\n\t\tlogger.info(\"upload_file time used:\" + (System.currentTimeMillis() - startTime) + \" ms\");\n\n\t\tif (uploadResults == null) {\n\t\t\tlogger.error(\"upload file fail, error code:\" + storageClient.getErrorCode());\n\t\t}\n\t\tString groupName = uploadResults[0];\n\t\tString remoteFileName = uploadResults[1];\n\n\t\tlogger.info(\"upload file successfully!!!\" + \"group_name:\" + groupName + \", remoteFileName:\" + \" \" + remoteFileName);\n\t\treturn uploadResults;\n\t}\n\n\tpublic static FileInfo getFile(String groupName, String remoteFileName) {\n\t\ttry {\n\t\t\tstorageClient = new StorageClient(trackerServer, storageServer);\n\t\t\treturn storageClient.get_file_info(groupName, remoteFileName);\n\t\t} catch (IOException e) {\n\t\t\tlogger.error(\"IO Exception: Get File from Fast DFS failed\", e);\n\t\t} catch (Exception e) {\n\t\t\tlogger.error(\"Non IO Exception: Get File from Fast DFS failed\", e);\n\t\t}\n\t\treturn null;\n\t}\n\n\tpublic static InputStream downFile(String groupName, String remoteFileName) {\n\t\ttry {\n\t\t\tstorageClient = new StorageClient(trackerServer, storageServer);\n\t\t\tbyte[] fileByte = storageClient.download_file(groupName, remoteFileName);\n\t\t\tInputStream ins = new ByteArrayInputStream(fileByte);\n\t\t\treturn ins;\n\t\t} catch (IOException e) {\n\t\t\tlogger.error(\"IO Exception: Get File from Fast DFS failed\", e);\n\t\t} catch (Exception e) {\n\t\t\tlogger.error(\"Non IO Exception: Get File from Fast DFS failed\", e);\n\t\t}\n\t\treturn null;\n\t}\n\n\tpublic static void deleteFile(String groupName, String remoteFileName)\n\t\t\tthrows Exception {\n\t\tstorageClient = new StorageClient(trackerServer, storageServer);\n\t\tint i = storageClient.delete_file(groupName, remoteFileName);\n\t\tlogger.info(\"delete file successfully!!!\" + i);\n\t}\n\n\tpublic static StorageServer[] getStoreStorages(String groupName)\n\t\t\tthrows IOException {\n\t\treturn trackerClient.getStoreStorages(trackerServer, groupName);\n\t}\n\n\tpublic static ServerInfo[] getFetchStorages(String groupName,\n\t\t\t\t\t\t\t\t\t\t\t\tString remoteFileName) throws IOException {\n\t\treturn trackerClient.getFetchStorages(trackerServer, groupName, remoteFileName);\n\t}\n\n\tpublic static String getTrackerUrl() {\n\t\treturn \"http://\"+trackerServer.getInetSocketAddress().getHostString()+\":\"+ClientGlobal.getG_tracker_http_port()+\"/\";\n\t}\n}"
  },
  {
    "path": "1.x/spring-boot-fastDFS/src/main/java/com/neo/fastdfs/FastDFSFile.java",
    "content": "package com.neo.fastdfs;\n\npublic class FastDFSFile {\n\tprivate String name;\n\n\tprivate byte[] content;\n\n\tprivate String ext;\n\n\tprivate String md5;\n\n\tprivate String author;\n\n\tpublic FastDFSFile(String name, byte[] content, String ext, String height,\n\t\t\t\t\t   String width, String author) {\n\t\tsuper();\n\t\tthis.name = name;\n\t\tthis.content = content;\n\t\tthis.ext = ext;\n\t\tthis.author = author;\n\t}\n\n\tpublic FastDFSFile(String name, byte[] content, String ext) {\n\t\tsuper();\n\t\tthis.name = name;\n\t\tthis.content = content;\n\t\tthis.ext = ext;\n\n\t}\n\n\tpublic String getName() {\n\t\treturn name;\n\t}\n\n\tpublic void setName(String name) {\n\t\tthis.name = name;\n\t}\n\n\tpublic byte[] getContent() {\n\t\treturn content;\n\t}\n\n\tpublic void setContent(byte[] content) {\n\t\tthis.content = content;\n\t}\n\n\tpublic String getExt() {\n\t\treturn ext;\n\t}\n\n\tpublic void setExt(String ext) {\n\t\tthis.ext = ext;\n\t}\n\n\tpublic String getMd5() {\n\t\treturn md5;\n\t}\n\n\tpublic void setMd5(String md5) {\n\t\tthis.md5 = md5;\n\t}\n\n\tpublic String getAuthor() {\n\t\treturn author;\n\t}\n\n\tpublic void setAuthor(String author) {\n\t\tthis.author = author;\n\t}\n}"
  },
  {
    "path": "1.x/spring-boot-fastDFS/src/main/resources/application.properties",
    "content": "#http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#common-application-properties\n#search multipart\nspring.http.multipart.max-file-size=10MB\nspring.http.multipart.max-request-size=10MB\n\n"
  },
  {
    "path": "1.x/spring-boot-fastDFS/src/main/resources/fdfs_client.conf",
    "content": "connect_timeout = 60\nnetwork_timeout = 60\ncharset = UTF-8\nhttp.tracker_http_port = 8080\nhttp.anti_steal_token = no\nhttp.secret_key = 123456\n\ntracker_server = 192.168.53.85:22122\ntracker_server = 192.168.53.86:22122\n"
  },
  {
    "path": "1.x/spring-boot-fastDFS/src/main/resources/logback.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration>\n\n    <appender name=\"STDOUT\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <layout class=\"ch.qos.logback.classic.PatternLayout\">\n            <Pattern>\n                %d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n\n            </Pattern>\n        </layout>\n    </appender>\n\n    <logger name=\"org.springframework.web\" level=\"error\" additivity=\"false\">\n        <appender-ref ref=\"STDOUT\"/>\n    </logger>\n\n    <logger name=\"com.neo\" level=\"debug\" additivity=\"false\">\n        <appender-ref ref=\"STDOUT\"/>\n    </logger>\n\n    <root level=\"error\">\n        <appender-ref ref=\"STDOUT\"/>\n    </root>\n\n</configuration>"
  },
  {
    "path": "1.x/spring-boot-fastDFS/src/main/resources/templates/upload.html",
    "content": "<!DOCTYPE html>\n<html xmlns:th=\"http://www.thymeleaf.org\">\n<body>\n\n<h1>Spring Boot file upload example</h1>\n\n<form method=\"POST\" action=\"/upload\" enctype=\"multipart/form-data\">\n    <input type=\"file\" name=\"file\" /><br/><br/>\n    <input type=\"submit\" value=\"Submit\" />\n</form>\n\n</body>\n</html>\n"
  },
  {
    "path": "1.x/spring-boot-fastDFS/src/main/resources/templates/uploadStatus.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<body>\n\n<h1>Spring Boot - Upload Status</h1>\n\n<div th:if=\"${message}\">\n    <h2 th:text=\"${message}\"/>\n</div>\n\n<div th:if=\"${path}\">\n    <h2 th:text=\"${path}\"/>\n</div>\n\n</body>\n</html>"
  },
  {
    "path": "1.x/spring-boot-file-upload/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0\n  http://maven.apache.org/maven-v4_0_0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <groupId>com.neo</groupId>\n    <artifactId>spring-boot-file-upload</artifactId>\n    <packaging>jar</packaging>\n    <version>1.0</version>\n\n    <parent>\n        <groupId>org.springframework.boot</groupId>\n        <artifactId>spring-boot-starter-parent</artifactId>\n        <version>1.5.9.RELEASE</version>\n    </parent>\n\n    <properties>\n        <java.version>1.8</java.version>\n    </properties>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-web</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-thymeleaf</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-devtools</artifactId>\n            <optional>true</optional>\n        </dependency>\n\n    </dependencies>\n\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.springframework.boot</groupId>\n                <artifactId>spring-boot-maven-plugin</artifactId>\n            </plugin>\n        </plugins>\n    </build>\n\n</project>\n"
  },
  {
    "path": "1.x/spring-boot-file-upload/src/main/java/com/neo/FileUploadWebApplication.java",
    "content": "package com.neo;\n\nimport org.apache.coyote.http11.AbstractHttp11Protocol;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.boot.context.embedded.tomcat.TomcatConnectorCustomizer;\nimport org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;\nimport org.springframework.context.annotation.Bean;\n\n@SpringBootApplication\npublic class FileUploadWebApplication {\n\n    public static void main(String[] args) throws Exception {\n        SpringApplication.run(FileUploadWebApplication.class, args);\n    }\n\n    //Tomcat large file upload connection reset\n    @Bean\n    public TomcatEmbeddedServletContainerFactory tomcatEmbedded() {\n        TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();\n        tomcat.addConnectorCustomizers((TomcatConnectorCustomizer) connector -> {\n            if ((connector.getProtocolHandler() instanceof AbstractHttp11Protocol<?>)) {\n                //-1 means unlimited\n                ((AbstractHttp11Protocol<?>) connector.getProtocolHandler()).setMaxSwallowSize(-1);\n            }\n        });\n        return tomcat;\n    }\n\n}"
  },
  {
    "path": "1.x/spring-boot-file-upload/src/main/java/com/neo/controller/GlobalExceptionHandler.java",
    "content": "package com.neo.controller;\n\nimport org.springframework.web.bind.annotation.ControllerAdvice;\nimport org.springframework.web.bind.annotation.ExceptionHandler;\nimport org.springframework.web.multipart.MultipartException;\nimport org.springframework.web.servlet.mvc.support.RedirectAttributes;\n\n@ControllerAdvice\npublic class GlobalExceptionHandler {\n\n    //https://jira.spring.io/browse/SPR-14651\n    //4.3.5 supports RedirectAttributes redirectAttributes\n    @ExceptionHandler(MultipartException.class)\n    public String handleError1(MultipartException e, RedirectAttributes redirectAttributes) {\n        redirectAttributes.addFlashAttribute(\"message\", e.getCause().getMessage());\n        return \"redirect:/uploadStatus\";\n    }\n}\n"
  },
  {
    "path": "1.x/spring-boot-file-upload/src/main/java/com/neo/controller/UploadController.java",
    "content": "package com.neo.controller;\n\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.multipart.MultipartFile;\nimport org.springframework.web.servlet.mvc.support.RedirectAttributes;\n\nimport java.io.IOException;\nimport java.nio.file.Files;\nimport java.nio.file.Path;\nimport java.nio.file.Paths;\n\n@Controller\npublic class UploadController {\n    //Save the uploaded file to this folder\n    private static String UPLOADED_FOLDER = \"E://temp//\";\n\n    @GetMapping(\"/\")\n    public String index() {\n        return \"upload\";\n    }\n\n    @PostMapping(\"/upload\") // //new annotation since 4.3\n    public String singleFileUpload(@RequestParam(\"file\") MultipartFile file,\n                                   RedirectAttributes redirectAttributes) {\n        if (file.isEmpty()) {\n            redirectAttributes.addFlashAttribute(\"message\", \"Please select a file to upload\");\n            return \"redirect:uploadStatus\";\n        }\n\n        try {\n            // Get the file and save it somewhere\n            byte[] bytes = file.getBytes();\n            Path path = Paths.get(UPLOADED_FOLDER + file.getOriginalFilename());\n            Files.write(path, bytes);\n\n            redirectAttributes.addFlashAttribute(\"message\",\n                    \"You successfully uploaded '\" + file.getOriginalFilename() + \"'\");\n\n        } catch (IOException e) {\n            e.printStackTrace();\n        }\n\n        return \"redirect:/uploadStatus\";\n    }\n\n    @GetMapping(\"/uploadStatus\")\n    public String uploadStatus() {\n        return \"uploadStatus\";\n    }\n\n}"
  },
  {
    "path": "1.x/spring-boot-file-upload/src/main/resources/application.properties",
    "content": "#http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#common-application-properties\n#search multipart\nspring.http.multipart.max-file-size=10MB\nspring.http.multipart.max-request-size=10MB\n\n#spring.http.multipart.enabled=true #\\u9ED8\\u8BA4\\u652F\\u6301\\u6587\\u4EF6\\u4E0A\\u4F20.\n#spring.http.multipart.file-size-threshold=0 #\\u652F\\u6301\\u6587\\u4EF6\\u5199\\u5165\\u78C1\\u76D8.\n#spring.http.multipart.location= # \\u4E0A\\u4F20\\u6587\\u4EF6\\u7684\\u4E34\\u65F6\\u76EE\\u5F55\n#spring.http.multipart.max-file-size=1Mb # \\u6700\\u5927\\u652F\\u6301\\u6587\\u4EF6\\u5927\\u5C0F\n#spring.http.multipart.max-request-size=10Mb # \\u6700\\u5927\\u652F\\u6301\\u8BF7\\u6C42\\u5927\\u5C0F\n\n"
  },
  {
    "path": "1.x/spring-boot-file-upload/src/main/resources/logback.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration>\n\n    <appender name=\"STDOUT\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <layout class=\"ch.qos.logback.classic.PatternLayout\">\n            <Pattern>\n                %d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n\n            </Pattern>\n        </layout>\n    </appender>\n\n    <logger name=\"org.springframework.web\" level=\"error\" additivity=\"false\">\n        <appender-ref ref=\"STDOUT\"/>\n    </logger>\n\n    <logger name=\"com.neo\" level=\"debug\" additivity=\"false\">\n        <appender-ref ref=\"STDOUT\"/>\n    </logger>\n\n    <root level=\"error\">\n        <appender-ref ref=\"STDOUT\"/>\n    </root>\n\n</configuration>"
  },
  {
    "path": "1.x/spring-boot-file-upload/src/main/resources/templates/from_file.html",
    "content": "<form id='myupload' action='http://localhost:8080/uploadSign' method='post' enctype='multipart/form-data'>\n  <div class=\"demo\">\n    <div class=\"btn\">\n      <span>Ӹ</span>\n      <input id=\"fileupload\" type=\"file\" name=\"file1\"></div>\n    <div class=\"progress\">\n      <span class=\"bar\"></span>\n      <span class=\"percent\">0%</span></div>\n    <!-- ʾϴļ -->\n    <div class=\"files\"></div>\n    <!-- ʾϴͼƬ-->\n    <div class=\"showimg\"></div>\n  </div>\n  <input type=\"submit\" onclick=\"gosubmit2()\" /></form>\n<script src=\"https://cdn.bootcss.com/jquery/1.6.4/jquery.js\"></script>\n<script type=\"text/javascript\" src=\"https://cdn.bootcss.com/jquery.form/4.1.0/jquery.form.min.js\"></script>\n<script type=\"text/javascript\">var bar = $('.bar'); //\n  var percent = $('.percent'); //ȡϴٷֱ\n  var showimg = $('.showimg'); //ʾͼƬdiv\n  var progress = $('.progress'); //ʾȵdiv\n  var files = $('.files'); //ļϴؼinputԪ\n  var btn = $('.btn span'); //ťı\n  function gosubmit2() {\n    $(\"#myupload\").ajaxSubmit({\n      dataType: 'json',\n      //\n      beforeSend: function() {\n        showimg.empty();\n        progress.show();\n        var percentVal = '0%';\n        bar.width(percentVal);\n        percent.html(percentVal);\n        btn.html('ϴ..');\n      },\n      //½¼\n      uploadProgress: function(event, position, total, percentComplete) {\n        var percentVal = percentComplete + '%';\n        bar.width(percentVal);\n        percent.html(percentVal);\n      },\n      success: function(data) { //ͼƬϴɹʱ\n        //ȡ˷صļ\n        alert(data.name + \",\" + data.pic + \",\" + data.size);\n      },\n      error: function(xhr) {\n        btn.html(ϴʧ);\n        bar.width('0');\n        files.html(xhr.responseText);\n      }\n    });\n  }</script>"
  },
  {
    "path": "1.x/spring-boot-file-upload/src/main/resources/templates/upload.html",
    "content": "<!DOCTYPE html>\n<html xmlns:th=\"http://www.thymeleaf.org\">\n<body>\n\n<h1>Spring Boot file upload example</h1>\n\n<form method=\"POST\" action=\"/upload\" enctype=\"multipart/form-data\">\n    <input type=\"file\" name=\"file\" /><br/><br/>\n    <input type=\"submit\" value=\"Submit\" />\n</form>\n\n</body>\n</html>\n"
  },
  {
    "path": "1.x/spring-boot-file-upload/src/main/resources/templates/uploadStatus.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<body>\n\n<h1>Spring Boot - Upload Status</h1>\n\n<div th:if=\"${message}\">\n    <h2 th:text=\"${message}\"/>\n</div>\n\n</body>\n</html>"
  },
  {
    "path": "1.x/spring-boot-helloWorld/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-helloworld</artifactId>\n\t<version>0.0.1-SNAPSHOT</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-helloworld</name>\n\t<description>Demo project for Spring Boot</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>1.5.6.RELEASE</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter</artifactId>\n\t\t</dependency>\n\t\t\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t\t\n\t\t<dependency>\n\t        <groupId>org.springframework.boot</groupId>\n\t        <artifactId>spring-boot-starter-web</artifactId>\n\t    </dependency>\n\t     <dependency>\n\t        <groupId>org.springframework.boot</groupId>\n\t        <artifactId>spring-boot-devtools</artifactId>\n\t        <optional>true</optional>\n\t\t</dependency>\n\t</dependencies>\n\t\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t\t<configuration>\n\t                <fork>true</fork>\n\t            </configuration>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\t\n\n</project>\n"
  },
  {
    "path": "1.x/spring-boot-helloWorld/src/main/java/com/neo/Application.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class Application {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(Application.class, args);\n\t}\n}\n"
  },
  {
    "path": "1.x/spring-boot-helloWorld/src/main/java/com/neo/controller/HelloWorldController.java",
    "content": "package com.neo.controller;\n\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n@RestController\npublic class HelloWorldController {\n\t\n    @RequestMapping(\"/hello\")\n    public String index() {\n        return \"Hello World\";\n    }\n}"
  },
  {
    "path": "1.x/spring-boot-helloWorld/src/main/resources/application.properties",
    "content": ""
  },
  {
    "path": "1.x/spring-boot-helloWorld/src/test/java/com/neo/ApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class ApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t\tSystem.out.println(\"hello word\");\n\t}\n\n}\n"
  },
  {
    "path": "1.x/spring-boot-helloWorld/src/test/java/com/neo/controller/HelloTests.java",
    "content": "package com.neo.controller;\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.http.MediaType;\nimport org.springframework.mock.web.MockServletContext;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\nimport org.springframework.test.context.junit4.SpringRunner;\nimport org.springframework.test.context.web.WebAppConfiguration;\nimport org.springframework.test.web.servlet.MockMvc;\nimport org.springframework.test.web.servlet.request.MockMvcRequestBuilders;\nimport org.springframework.test.web.servlet.setup.MockMvcBuilders;\n\nimport static org.hamcrest.Matchers.equalTo;\nimport static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;\nimport static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class HelloTests {\n\n\t\n    private MockMvc mvc;\n\n    @Before\n    public void setUp() throws Exception {\n        mvc = MockMvcBuilders.standaloneSetup(new HelloWorldController()).build();\n    }\n\n    @Test\n    public void getHello() throws Exception {\n        mvc.perform(MockMvcRequestBuilders.get(\"/hello\").accept(MediaType.APPLICATION_JSON))\n                .andExpect(status().isOk())\n                .andExpect(content().string(equalTo(\"Hello World\")));\n    }\n\n}"
  },
  {
    "path": "1.x/spring-boot-helloWorld/src/test/java/com/neo/controller/HelloWorldControlerTests.java",
    "content": "package com.neo.controller;\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.http.MediaType;\nimport org.springframework.mock.web.MockServletContext;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\nimport org.springframework.test.context.junit4.SpringRunner;\nimport org.springframework.test.context.web.WebAppConfiguration;\nimport org.springframework.test.web.servlet.MockMvc;\nimport org.springframework.test.web.servlet.request.MockMvcRequestBuilders;\nimport org.springframework.test.web.servlet.result.MockMvcResultHandlers;\nimport org.springframework.test.web.servlet.result.MockMvcResultMatchers;\nimport org.springframework.test.web.servlet.setup.MockMvcBuilders;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class HelloWorldControlerTests {\n\n    private MockMvc mvc;\n\n    @Before\n    public void setUp() throws Exception {\n        mvc = MockMvcBuilders.standaloneSetup(new HelloWorldController()).build();\n    }\n\n    @Test\n    public void getHello() throws Exception {\n        mvc.perform(MockMvcRequestBuilders.get(\"/hello\").accept(MediaType.APPLICATION_JSON))\n                .andExpect(MockMvcResultMatchers.status().isOk())\n                .andDo(MockMvcResultHandlers.print())\n                .andReturn();\n    }\n\n}"
  },
  {
    "path": "1.x/spring-boot-jpa-thymeleaf-curd/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <artifactId>spring-boot-jpa-thymeleaf-curd</artifactId>\n    <name>spring-boot-jpa-thymeleaf-curd</name>\n    <description>spring-boot-jpa-thymeleaf-curd</description>\n    <parent>\n        <groupId>org.springframework.boot</groupId>\n        <artifactId>spring-boot-starter-parent</artifactId>\n        <version>1.5.6.RELEASE</version>\n    </parent>\n\n    <properties>\n        <java.version>1.8</java.version>\n    </properties>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-web</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-thymeleaf</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-data-jpa</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>mysql</groupId>\n            <artifactId>mysql-connector-java</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-devtools</artifactId>\n            <optional>true</optional>\n        </dependency>\n    </dependencies>\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.springframework.boot</groupId>\n                <artifactId>spring-boot-maven-plugin</artifactId>\n                <configuration>\n                    <fork>true</fork>\n                </configuration>\n            </plugin>\n        </plugins>\n    </build>\n</project>"
  },
  {
    "path": "1.x/spring-boot-jpa-thymeleaf-curd/src/main/java/com/neo/JpaThymeleafApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.boot.builder.SpringApplicationBuilder;\nimport org.springframework.boot.web.support.SpringBootServletInitializer;\n\n\n@SpringBootApplication\npublic class JpaThymeleafApplication extends SpringBootServletInitializer {\n    @Override\n    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {\n        return application.sources(JpaThymeleafApplication.class);\n    }\n\n    public static void main(String[] args) throws Exception {\n        SpringApplication.run(JpaThymeleafApplication.class, args);\n    }\n}\n\n"
  },
  {
    "path": "1.x/spring-boot-jpa-thymeleaf-curd/src/main/java/com/neo/entity/User.java",
    "content": "package com.neo.entity;\n\nimport javax.persistence.Column;\nimport javax.persistence.Entity;\nimport javax.persistence.GeneratedValue;\nimport javax.persistence.Id;\n\n@Entity\npublic class User {\n    @Id\n    @GeneratedValue\n    private long id;\n    @Column(nullable = false, unique = true)\n    private String userName;\n    @Column(nullable = false)\n    private String password;\n    @Column(nullable = false)\n    private int age;\n\n    public long getId() {\n        return id;\n    }\n\n    public User setId(long id) {\n        this.id = id;\n        return this;\n    }\n\n    public String getUserName() {\n        return userName;\n    }\n\n    public User setUserName(String userName) {\n        this.userName = userName;\n        return this;\n    }\n\n    public String getPassword() {\n        return password;\n    }\n\n    public User setPassword(String password) {\n        this.password = password;\n        return this;\n    }\n\n    public int getAge() {\n        return age;\n    }\n\n    public User setAge(int age) {\n        this.age = age;\n        return this;\n    }\n}\n"
  },
  {
    "path": "1.x/spring-boot-jpa-thymeleaf-curd/src/main/java/com/neo/repository/UserRepository.java",
    "content": "package com.neo.repository;\n\nimport com.neo.entity.User;\nimport org.springframework.data.jpa.repository.JpaRepository;\n\npublic interface UserRepository extends JpaRepository<User, Long> {\n\n    User findById(long id);\n\n    Long deleteById(Long id);\n}"
  },
  {
    "path": "1.x/spring-boot-jpa-thymeleaf-curd/src/main/java/com/neo/service/UserService.java",
    "content": "package com.neo.service;\n\nimport com.neo.entity.User;\n\nimport java.util.List;\n\npublic interface UserService {\n\n    public List<User> getUserList();\n\n    public User findUserById(long id);\n\n    public void save(User user);\n\n    public void edit(User user);\n\n    public void delete(long id);\n\n\n}\n"
  },
  {
    "path": "1.x/spring-boot-jpa-thymeleaf-curd/src/main/java/com/neo/service/impl/UserServiceImpl.java",
    "content": "package com.neo.service.impl;\n\nimport com.neo.entity.User;\nimport com.neo.repository.UserRepository;\nimport com.neo.service.UserService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n@Service\npublic class UserServiceImpl implements UserService{\n\n    @Autowired\n    private UserRepository userRepository;\n\n    @Override\n    public List<User> getUserList() {\n        return userRepository.findAll();\n    }\n\n    @Override\n    public User findUserById(long id) {\n        return userRepository.findById(id);\n    }\n\n    @Override\n    public void save(User user) {\n        userRepository.save(user);\n    }\n\n    @Override\n    public void edit(User user) {\n        userRepository.save(user);\n    }\n\n    @Override\n    public void delete(long id) {\n        userRepository.delete(id);\n    }\n}\n\n\n"
  },
  {
    "path": "1.x/spring-boot-jpa-thymeleaf-curd/src/main/java/com/neo/web/HelloController.java",
    "content": "package com.neo.web;\n\nimport org.springframework.stereotype.Controller;\nimport org.springframework.ui.Model;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\n\n@Controller\npublic class HelloController {\n\n    @RequestMapping(\"/hello\")\n    public String hello(Model model, @RequestParam(value=\"name\", required=false, defaultValue=\"World\") String name) {\n        model.addAttribute(\"name\", name);\n        return \"hello\";\n    }\n}\n"
  },
  {
    "path": "1.x/spring-boot-jpa-thymeleaf-curd/src/main/java/com/neo/web/UserController.java",
    "content": "package com.neo.web;\n\nimport com.neo.entity.User;\nimport com.neo.service.UserService;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.stereotype.Service;\nimport org.springframework.ui.Model;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\n\nimport javax.annotation.Resource;\nimport java.util.List;\n\n@Controller\npublic class UserController {\n\n    @Resource\n    UserService userService;\n\n\n    @RequestMapping(\"/\")\n    public String index() {\n        return \"redirect:/list\";\n    }\n\n    @RequestMapping(\"/list\")\n    public String list(Model model) {\n        List<User> users=userService.getUserList();\n        model.addAttribute(\"users\", users);\n        return \"user/list\";\n    }\n\n    @RequestMapping(\"/toAdd\")\n    public String toAdd() {\n        return \"user/userAdd\";\n    }\n\n    @RequestMapping(\"/add\")\n    public String add(User user) {\n        userService.save(user);\n        return \"redirect:/list\";\n    }\n\n    @RequestMapping(\"/toEdit\")\n    public String toEdit(Model model,Long id) {\n        User user=userService.findUserById(id);\n        model.addAttribute(\"user\", user);\n        return \"user/userEdit\";\n    }\n\n    @RequestMapping(\"/edit\")\n    public String edit(User user) {\n        userService.edit(user);\n        return \"redirect:/list\";\n    }\n\n\n    @RequestMapping(\"/delete\")\n    public String delete(Long id) {\n        userService.delete(id);\n        return \"redirect:/list\";\n    }\n}\n"
  },
  {
    "path": "1.x/spring-boot-jpa-thymeleaf-curd/src/main/resources/application.properties",
    "content": "spring.datasource.url=jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=true\nspring.datasource.username=root\nspring.datasource.password=root\nspring.datasource.driver-class-name=com.mysql.jdbc.Driver\n\nspring.jpa.properties.hibernate.hbm2ddl.auto=update\nspring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect\nspring.jpa.show-sql= true\n\nspring.thymeleaf.cache=false"
  },
  {
    "path": "1.x/spring-boot-jpa-thymeleaf-curd/src/main/resources/static/css/bootstrap.css",
    "content": "/*!\n * Bootstrap v3.3.6 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n  font-family: sans-serif;\n  -webkit-text-size-adjust: 100%;\n      -ms-text-size-adjust: 100%;\n}\nbody {\n  margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n  display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n  display: inline-block;\n  vertical-align: baseline;\n}\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n[hidden],\ntemplate {\n  display: none;\n}\na {\n  background-color: transparent;\n}\na:active,\na:hover {\n  outline: 0;\n}\nabbr[title] {\n  border-bottom: 1px dotted;\n}\nb,\nstrong {\n  font-weight: bold;\n}\ndfn {\n  font-style: italic;\n}\nh1 {\n  margin: .67em 0;\n  font-size: 2em;\n}\nmark {\n  color: #000;\n  background: #ff0;\n}\nsmall {\n  font-size: 80%;\n}\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\nsup {\n  top: -.5em;\n}\nsub {\n  bottom: -.25em;\n}\nimg {\n  border: 0;\n}\nsvg:not(:root) {\n  overflow: hidden;\n}\nfigure {\n  margin: 1em 40px;\n}\nhr {\n  height: 0;\n  -webkit-box-sizing: content-box;\n     -moz-box-sizing: content-box;\n          box-sizing: content-box;\n}\npre {\n  overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  margin: 0;\n  font: inherit;\n  color: inherit;\n}\nbutton {\n  overflow: visible;\n}\nbutton,\nselect {\n  text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  -webkit-appearance: button;\n  cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  padding: 0;\n  border: 0;\n}\ninput {\n  line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n  padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\ninput[type=\"search\"] {\n  -webkit-box-sizing: content-box;\n     -moz-box-sizing: content-box;\n          box-sizing: content-box;\n  -webkit-appearance: textfield;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\nfieldset {\n  padding: .35em .625em .75em;\n  margin: 0 2px;\n  border: 1px solid #c0c0c0;\n}\nlegend {\n  padding: 0;\n  border: 0;\n}\ntextarea {\n  overflow: auto;\n}\noptgroup {\n  font-weight: bold;\n}\ntable {\n  border-spacing: 0;\n  border-collapse: collapse;\n}\ntd,\nth {\n  padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n  *,\n  *:before,\n  *:after {\n    color: #000 !important;\n    text-shadow: none !important;\n    background: transparent !important;\n    -webkit-box-shadow: none !important;\n            box-shadow: none !important;\n  }\n  a,\n  a:visited {\n    text-decoration: underline;\n  }\n  a[href]:after {\n    content: \" (\" attr(href) \")\";\n  }\n  abbr[title]:after {\n    content: \" (\" attr(title) \")\";\n  }\n  a[href^=\"#\"]:after,\n  a[href^=\"javascript:\"]:after {\n    content: \"\";\n  }\n  pre,\n  blockquote {\n    border: 1px solid #999;\n\n    page-break-inside: avoid;\n  }\n  thead {\n    display: table-header-group;\n  }\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n  img {\n    max-width: 100% !important;\n  }\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n  .navbar {\n    display: none;\n  }\n  .btn > .caret,\n  .dropup > .btn > .caret {\n    border-top-color: #000 !important;\n  }\n  .label {\n    border: 1px solid #000;\n  }\n  .table {\n    border-collapse: collapse !important;\n  }\n  .table td,\n  .table th {\n    background-color: #fff !important;\n  }\n  .table-bordered th,\n  .table-bordered td {\n    border: 1px solid #ddd !important;\n  }\n}\n@font-face {\n  font-family: 'Glyphicons Halflings';\n\n  src: url('../fonts/glyphicons-halflings-regular.eot');\n  src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.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');\n}\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n  content: \"\\002a\";\n}\n.glyphicon-plus:before {\n  content: \"\\002b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n  content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n  content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n  content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n  content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n  content: \"\\270f\";\n}\n.glyphicon-glass:before {\n  content: \"\\e001\";\n}\n.glyphicon-music:before {\n  content: \"\\e002\";\n}\n.glyphicon-search:before {\n  content: \"\\e003\";\n}\n.glyphicon-heart:before {\n  content: \"\\e005\";\n}\n.glyphicon-star:before {\n  content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n  content: \"\\e007\";\n}\n.glyphicon-user:before {\n  content: \"\\e008\";\n}\n.glyphicon-film:before {\n  content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n  content: \"\\e010\";\n}\n.glyphicon-th:before {\n  content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n  content: \"\\e012\";\n}\n.glyphicon-ok:before {\n  content: \"\\e013\";\n}\n.glyphicon-remove:before {\n  content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n  content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n  content: \"\\e016\";\n}\n.glyphicon-off:before {\n  content: \"\\e017\";\n}\n.glyphicon-signal:before {\n  content: \"\\e018\";\n}\n.glyphicon-cog:before {\n  content: \"\\e019\";\n}\n.glyphicon-trash:before {\n  content: \"\\e020\";\n}\n.glyphicon-home:before {\n  content: \"\\e021\";\n}\n.glyphicon-file:before {\n  content: \"\\e022\";\n}\n.glyphicon-time:before {\n  content: \"\\e023\";\n}\n.glyphicon-road:before {\n  content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n  content: \"\\e025\";\n}\n.glyphicon-download:before {\n  content: \"\\e026\";\n}\n.glyphicon-upload:before {\n  content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n  content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n  content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n  content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n  content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n  content: \"\\e032\";\n}\n.glyphicon-lock:before {\n  content: \"\\e033\";\n}\n.glyphicon-flag:before {\n  content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n  content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n  content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n  content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n  content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n  content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n  content: \"\\e040\";\n}\n.glyphicon-tag:before {\n  content: \"\\e041\";\n}\n.glyphicon-tags:before {\n  content: \"\\e042\";\n}\n.glyphicon-book:before {\n  content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n  content: \"\\e044\";\n}\n.glyphicon-print:before {\n  content: \"\\e045\";\n}\n.glyphicon-camera:before {\n  content: \"\\e046\";\n}\n.glyphicon-font:before {\n  content: \"\\e047\";\n}\n.glyphicon-bold:before {\n  content: \"\\e048\";\n}\n.glyphicon-italic:before {\n  content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n  content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n  content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n  content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n  content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n  content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n  content: \"\\e055\";\n}\n.glyphicon-list:before {\n  content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n  content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n  content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n  content: \"\\e059\";\n}\n.glyphicon-picture:before {\n  content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n  content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n  content: \"\\e063\";\n}\n.glyphicon-tint:before {\n  content: \"\\e064\";\n}\n.glyphicon-edit:before {\n  content: \"\\e065\";\n}\n.glyphicon-share:before {\n  content: \"\\e066\";\n}\n.glyphicon-check:before {\n  content: \"\\e067\";\n}\n.glyphicon-move:before {\n  content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n  content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n  content: \"\\e070\";\n}\n.glyphicon-backward:before {\n  content: \"\\e071\";\n}\n.glyphicon-play:before {\n  content: \"\\e072\";\n}\n.glyphicon-pause:before {\n  content: \"\\e073\";\n}\n.glyphicon-stop:before {\n  content: \"\\e074\";\n}\n.glyphicon-forward:before {\n  content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n  content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n  content: \"\\e077\";\n}\n.glyphicon-eject:before {\n  content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n  content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n  content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n  content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n  content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n  content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n  content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n  content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n  content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n  content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n  content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n  content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n  content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n  content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n  content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n  content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n  content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n  content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n  content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n  content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n  content: \"\\e101\";\n}\n.glyphicon-gift:before {\n  content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n  content: \"\\e103\";\n}\n.glyphicon-fire:before {\n  content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n  content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n  content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n  content: \"\\e107\";\n}\n.glyphicon-plane:before {\n  content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n  content: \"\\e109\";\n}\n.glyphicon-random:before {\n  content: \"\\e110\";\n}\n.glyphicon-comment:before {\n  content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n  content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n  content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n  content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n  content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n  content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n  content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n  content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n  content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n  content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n  content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n  content: \"\\e122\";\n}\n.glyphicon-bell:before {\n  content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n  content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n  content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n  content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n  content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n  content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n  content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n  content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n  content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n  content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n  content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n  content: \"\\e134\";\n}\n.glyphicon-globe:before {\n  content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n  content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n  content: \"\\e137\";\n}\n.glyphicon-filter:before {\n  content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n  content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n  content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n  content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n  content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n  content: \"\\e143\";\n}\n.glyphicon-link:before {\n  content: \"\\e144\";\n}\n.glyphicon-phone:before {\n  content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n  content: \"\\e146\";\n}\n.glyphicon-usd:before {\n  content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n  content: \"\\e149\";\n}\n.glyphicon-sort:before {\n  content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n  content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n  content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n  content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n  content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n  content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n  content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n  content: \"\\e157\";\n}\n.glyphicon-expand:before {\n  content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n  content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n  content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n  content: \"\\e161\";\n}\n.glyphicon-flash:before {\n  content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n  content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n  content: \"\\e164\";\n}\n.glyphicon-record:before {\n  content: \"\\e165\";\n}\n.glyphicon-save:before {\n  content: \"\\e166\";\n}\n.glyphicon-open:before {\n  content: \"\\e167\";\n}\n.glyphicon-saved:before {\n  content: \"\\e168\";\n}\n.glyphicon-import:before {\n  content: \"\\e169\";\n}\n.glyphicon-export:before {\n  content: \"\\e170\";\n}\n.glyphicon-send:before {\n  content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n  content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n  content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n  content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n  content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n  content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n  content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n  content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n  content: \"\\e179\";\n}\n.glyphicon-header:before {\n  content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n  content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n  content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n  content: \"\\e183\";\n}\n.glyphicon-tower:before {\n  content: \"\\e184\";\n}\n.glyphicon-stats:before {\n  content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n  content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n  content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n  content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n  content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n  content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n  content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n  content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n  content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n  content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n  content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n  content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n  content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n  content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n  content: \"\\e200\";\n}\n.glyphicon-cd:before {\n  content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n  content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n  content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n  content: \"\\e204\";\n}\n.glyphicon-copy:before {\n  content: \"\\e205\";\n}\n.glyphicon-paste:before {\n  content: \"\\e206\";\n}\n.glyphicon-alert:before {\n  content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n  content: \"\\e210\";\n}\n.glyphicon-king:before {\n  content: \"\\e211\";\n}\n.glyphicon-queen:before {\n  content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n  content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n  content: \"\\e214\";\n}\n.glyphicon-knight:before {\n  content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n  content: \"\\e216\";\n}\n.glyphicon-tent:before {\n  content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n  content: \"\\e218\";\n}\n.glyphicon-bed:before {\n  content: \"\\e219\";\n}\n.glyphicon-apple:before {\n  content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n  content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n  content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n  content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n  content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n  content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n  content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n  content: \"\\e227\";\n}\n.glyphicon-btc:before {\n  content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n  content: \"\\e227\";\n}\n.glyphicon-yen:before {\n  content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n  content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n  content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n  content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n  content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n  content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n  content: \"\\e232\";\n}\n.glyphicon-education:before {\n  content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n  content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n  content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n  content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n  content: \"\\e237\";\n}\n.glyphicon-oil:before {\n  content: \"\\e238\";\n}\n.glyphicon-grain:before {\n  content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n  content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n  content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n  content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n  content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n  content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n  content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n  content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n  content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n  content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n  content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n  content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n  content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n  content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n  content: \"\\e253\";\n}\n.glyphicon-console:before {\n  content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n  content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n  content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n  content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n  content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n  content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n  content: \"\\e260\";\n}\n* {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n*:before,\n*:after {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\nhtml {\n  font-size: 10px;\n\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #333;\n  background-color: #fff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\na {\n  color: #337ab7;\n  text-decoration: none;\n}\na:hover,\na:focus {\n  color: #23527c;\n  text-decoration: underline;\n}\na:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\nfigure {\n  margin: 0;\n}\nimg {\n  vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  display: block;\n  max-width: 100%;\n  height: auto;\n}\n.img-rounded {\n  border-radius: 6px;\n}\n.img-thumbnail {\n  display: inline-block;\n  max-width: 100%;\n  height: auto;\n  padding: 4px;\n  line-height: 1.42857143;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-radius: 4px;\n  -webkit-transition: all .2s ease-in-out;\n       -o-transition: all .2s ease-in-out;\n          transition: all .2s ease-in-out;\n}\n.img-circle {\n  border-radius: 50%;\n}\nhr {\n  margin-top: 20px;\n  margin-bottom: 20px;\n  border: 0;\n  border-top: 1px solid #eee;\n}\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n  position: static;\n  width: auto;\n  height: auto;\n  margin: 0;\n  overflow: visible;\n  clip: auto;\n}\n[role=\"button\"] {\n  cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n  font-family: inherit;\n  font-weight: 500;\n  line-height: 1.1;\n  color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n  font-weight: normal;\n  line-height: 1;\n  color: #777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n  margin-top: 20px;\n  margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n  font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n  font-size: 75%;\n}\nh1,\n.h1 {\n  font-size: 36px;\n}\nh2,\n.h2 {\n  font-size: 30px;\n}\nh3,\n.h3 {\n  font-size: 24px;\n}\nh4,\n.h4 {\n  font-size: 18px;\n}\nh5,\n.h5 {\n  font-size: 14px;\n}\nh6,\n.h6 {\n  font-size: 12px;\n}\np {\n  margin: 0 0 10px;\n}\n.lead {\n  margin-bottom: 20px;\n  font-size: 16px;\n  font-weight: 300;\n  line-height: 1.4;\n}\n@media (min-width: 768px) {\n  .lead {\n    font-size: 21px;\n  }\n}\nsmall,\n.small {\n  font-size: 85%;\n}\nmark,\n.mark {\n  padding: .2em;\n  background-color: #fcf8e3;\n}\n.text-left {\n  text-align: left;\n}\n.text-right {\n  text-align: right;\n}\n.text-center {\n  text-align: center;\n}\n.text-justify {\n  text-align: justify;\n}\n.text-nowrap {\n  white-space: nowrap;\n}\n.text-lowercase {\n  text-transform: lowercase;\n}\n.text-uppercase {\n  text-transform: uppercase;\n}\n.text-capitalize {\n  text-transform: capitalize;\n}\n.text-muted {\n  color: #777;\n}\n.text-primary {\n  color: #337ab7;\n}\na.text-primary:hover,\na.text-primary:focus {\n  color: #286090;\n}\n.text-success {\n  color: #3c763d;\n}\na.text-success:hover,\na.text-success:focus {\n  color: #2b542c;\n}\n.text-info {\n  color: #31708f;\n}\na.text-info:hover,\na.text-info:focus {\n  color: #245269;\n}\n.text-warning {\n  color: #8a6d3b;\n}\na.text-warning:hover,\na.text-warning:focus {\n  color: #66512c;\n}\n.text-danger {\n  color: #a94442;\n}\na.text-danger:hover,\na.text-danger:focus {\n  color: #843534;\n}\n.bg-primary {\n  color: #fff;\n  background-color: #337ab7;\n}\na.bg-primary:hover,\na.bg-primary:focus {\n  background-color: #286090;\n}\n.bg-success {\n  background-color: #dff0d8;\n}\na.bg-success:hover,\na.bg-success:focus {\n  background-color: #c1e2b3;\n}\n.bg-info {\n  background-color: #d9edf7;\n}\na.bg-info:hover,\na.bg-info:focus {\n  background-color: #afd9ee;\n}\n.bg-warning {\n  background-color: #fcf8e3;\n}\na.bg-warning:hover,\na.bg-warning:focus {\n  background-color: #f7ecb5;\n}\n.bg-danger {\n  background-color: #f2dede;\n}\na.bg-danger:hover,\na.bg-danger:focus {\n  background-color: #e4b9b9;\n}\n.page-header {\n  padding-bottom: 9px;\n  margin: 40px 0 20px;\n  border-bottom: 1px solid #eee;\n}\nul,\nol {\n  margin-top: 0;\n  margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n  margin-bottom: 0;\n}\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n.list-inline {\n  padding-left: 0;\n  margin-left: -5px;\n  list-style: none;\n}\n.list-inline > li {\n  display: inline-block;\n  padding-right: 5px;\n  padding-left: 5px;\n}\ndl {\n  margin-top: 0;\n  margin-bottom: 20px;\n}\ndt,\ndd {\n  line-height: 1.42857143;\n}\ndt {\n  font-weight: bold;\n}\ndd {\n  margin-left: 0;\n}\n@media (min-width: 768px) {\n  .dl-horizontal dt {\n    float: left;\n    width: 160px;\n    overflow: hidden;\n    clear: left;\n    text-align: right;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n  .dl-horizontal dd {\n    margin-left: 180px;\n  }\n}\nabbr[title],\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted #777;\n}\n.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\nblockquote {\n  padding: 10px 20px;\n  margin: 0 0 20px;\n  font-size: 17.5px;\n  border-left: 5px solid #eee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n  margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n  display: block;\n  font-size: 80%;\n  line-height: 1.42857143;\n  color: #777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n  content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  text-align: right;\n  border-right: 5px solid #eee;\n  border-left: 0;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n  content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n  content: '\\00A0 \\2014';\n}\naddress {\n  margin-bottom: 20px;\n  font-style: normal;\n  line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n  font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #c7254e;\n  background-color: #f9f2f4;\n  border-radius: 4px;\n}\nkbd {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #fff;\n  background-color: #333;\n  border-radius: 3px;\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);\n          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);\n}\nkbd kbd {\n  padding: 0;\n  font-size: 100%;\n  font-weight: bold;\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\npre {\n  display: block;\n  padding: 9.5px;\n  margin: 0 0 10px;\n  font-size: 13px;\n  line-height: 1.42857143;\n  color: #333;\n  word-break: break-all;\n  word-wrap: break-word;\n  background-color: #f5f5f5;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n}\npre code {\n  padding: 0;\n  font-size: inherit;\n  color: inherit;\n  white-space: pre-wrap;\n  background-color: transparent;\n  border-radius: 0;\n}\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\n.container {\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n@media (min-width: 768px) {\n  .container {\n    width: 750px;\n  }\n}\n@media (min-width: 992px) {\n  .container {\n    width: 970px;\n  }\n}\n@media (min-width: 1200px) {\n  .container {\n    width: 1170px;\n  }\n}\n.container-fluid {\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n.row {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n  position: relative;\n  min-height: 1px;\n  padding-right: 15px;\n  padding-left: 15px;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n  float: left;\n}\n.col-xs-12 {\n  width: 100%;\n}\n.col-xs-11 {\n  width: 91.66666667%;\n}\n.col-xs-10 {\n  width: 83.33333333%;\n}\n.col-xs-9 {\n  width: 75%;\n}\n.col-xs-8 {\n  width: 66.66666667%;\n}\n.col-xs-7 {\n  width: 58.33333333%;\n}\n.col-xs-6 {\n  width: 50%;\n}\n.col-xs-5 {\n  width: 41.66666667%;\n}\n.col-xs-4 {\n  width: 33.33333333%;\n}\n.col-xs-3 {\n  width: 25%;\n}\n.col-xs-2 {\n  width: 16.66666667%;\n}\n.col-xs-1 {\n  width: 8.33333333%;\n}\n.col-xs-pull-12 {\n  right: 100%;\n}\n.col-xs-pull-11 {\n  right: 91.66666667%;\n}\n.col-xs-pull-10 {\n  right: 83.33333333%;\n}\n.col-xs-pull-9 {\n  right: 75%;\n}\n.col-xs-pull-8 {\n  right: 66.66666667%;\n}\n.col-xs-pull-7 {\n  right: 58.33333333%;\n}\n.col-xs-pull-6 {\n  right: 50%;\n}\n.col-xs-pull-5 {\n  right: 41.66666667%;\n}\n.col-xs-pull-4 {\n  right: 33.33333333%;\n}\n.col-xs-pull-3 {\n  right: 25%;\n}\n.col-xs-pull-2 {\n  right: 16.66666667%;\n}\n.col-xs-pull-1 {\n  right: 8.33333333%;\n}\n.col-xs-pull-0 {\n  right: auto;\n}\n.col-xs-push-12 {\n  left: 100%;\n}\n.col-xs-push-11 {\n  left: 91.66666667%;\n}\n.col-xs-push-10 {\n  left: 83.33333333%;\n}\n.col-xs-push-9 {\n  left: 75%;\n}\n.col-xs-push-8 {\n  left: 66.66666667%;\n}\n.col-xs-push-7 {\n  left: 58.33333333%;\n}\n.col-xs-push-6 {\n  left: 50%;\n}\n.col-xs-push-5 {\n  left: 41.66666667%;\n}\n.col-xs-push-4 {\n  left: 33.33333333%;\n}\n.col-xs-push-3 {\n  left: 25%;\n}\n.col-xs-push-2 {\n  left: 16.66666667%;\n}\n.col-xs-push-1 {\n  left: 8.33333333%;\n}\n.col-xs-push-0 {\n  left: auto;\n}\n.col-xs-offset-12 {\n  margin-left: 100%;\n}\n.col-xs-offset-11 {\n  margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n  margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n  margin-left: 75%;\n}\n.col-xs-offset-8 {\n  margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n  margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n  margin-left: 50%;\n}\n.col-xs-offset-5 {\n  margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n  margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n  margin-left: 25%;\n}\n.col-xs-offset-2 {\n  margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n  margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n  margin-left: 0;\n}\n@media (min-width: 768px) {\n  .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n    float: left;\n  }\n  .col-sm-12 {\n    width: 100%;\n  }\n  .col-sm-11 {\n    width: 91.66666667%;\n  }\n  .col-sm-10 {\n    width: 83.33333333%;\n  }\n  .col-sm-9 {\n    width: 75%;\n  }\n  .col-sm-8 {\n    width: 66.66666667%;\n  }\n  .col-sm-7 {\n    width: 58.33333333%;\n  }\n  .col-sm-6 {\n    width: 50%;\n  }\n  .col-sm-5 {\n    width: 41.66666667%;\n  }\n  .col-sm-4 {\n    width: 33.33333333%;\n  }\n  .col-sm-3 {\n    width: 25%;\n  }\n  .col-sm-2 {\n    width: 16.66666667%;\n  }\n  .col-sm-1 {\n    width: 8.33333333%;\n  }\n  .col-sm-pull-12 {\n    right: 100%;\n  }\n  .col-sm-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-sm-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-sm-pull-9 {\n    right: 75%;\n  }\n  .col-sm-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-sm-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-sm-pull-6 {\n    right: 50%;\n  }\n  .col-sm-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-sm-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-sm-pull-3 {\n    right: 25%;\n  }\n  .col-sm-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-sm-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-sm-pull-0 {\n    right: auto;\n  }\n  .col-sm-push-12 {\n    left: 100%;\n  }\n  .col-sm-push-11 {\n    left: 91.66666667%;\n  }\n  .col-sm-push-10 {\n    left: 83.33333333%;\n  }\n  .col-sm-push-9 {\n    left: 75%;\n  }\n  .col-sm-push-8 {\n    left: 66.66666667%;\n  }\n  .col-sm-push-7 {\n    left: 58.33333333%;\n  }\n  .col-sm-push-6 {\n    left: 50%;\n  }\n  .col-sm-push-5 {\n    left: 41.66666667%;\n  }\n  .col-sm-push-4 {\n    left: 33.33333333%;\n  }\n  .col-sm-push-3 {\n    left: 25%;\n  }\n  .col-sm-push-2 {\n    left: 16.66666667%;\n  }\n  .col-sm-push-1 {\n    left: 8.33333333%;\n  }\n  .col-sm-push-0 {\n    left: auto;\n  }\n  .col-sm-offset-12 {\n    margin-left: 100%;\n  }\n  .col-sm-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-sm-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-sm-offset-9 {\n    margin-left: 75%;\n  }\n  .col-sm-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-sm-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-sm-offset-6 {\n    margin-left: 50%;\n  }\n  .col-sm-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-sm-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-sm-offset-3 {\n    margin-left: 25%;\n  }\n  .col-sm-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-sm-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-sm-offset-0 {\n    margin-left: 0;\n  }\n}\n@media (min-width: 992px) {\n  .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n    float: left;\n  }\n  .col-md-12 {\n    width: 100%;\n  }\n  .col-md-11 {\n    width: 91.66666667%;\n  }\n  .col-md-10 {\n    width: 83.33333333%;\n  }\n  .col-md-9 {\n    width: 75%;\n  }\n  .col-md-8 {\n    width: 66.66666667%;\n  }\n  .col-md-7 {\n    width: 58.33333333%;\n  }\n  .col-md-6 {\n    width: 50%;\n  }\n  .col-md-5 {\n    width: 41.66666667%;\n  }\n  .col-md-4 {\n    width: 33.33333333%;\n  }\n  .col-md-3 {\n    width: 25%;\n  }\n  .col-md-2 {\n    width: 16.66666667%;\n  }\n  .col-md-1 {\n    width: 8.33333333%;\n  }\n  .col-md-pull-12 {\n    right: 100%;\n  }\n  .col-md-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-md-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-md-pull-9 {\n    right: 75%;\n  }\n  .col-md-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-md-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-md-pull-6 {\n    right: 50%;\n  }\n  .col-md-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-md-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-md-pull-3 {\n    right: 25%;\n  }\n  .col-md-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-md-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-md-pull-0 {\n    right: auto;\n  }\n  .col-md-push-12 {\n    left: 100%;\n  }\n  .col-md-push-11 {\n    left: 91.66666667%;\n  }\n  .col-md-push-10 {\n    left: 83.33333333%;\n  }\n  .col-md-push-9 {\n    left: 75%;\n  }\n  .col-md-push-8 {\n    left: 66.66666667%;\n  }\n  .col-md-push-7 {\n    left: 58.33333333%;\n  }\n  .col-md-push-6 {\n    left: 50%;\n  }\n  .col-md-push-5 {\n    left: 41.66666667%;\n  }\n  .col-md-push-4 {\n    left: 33.33333333%;\n  }\n  .col-md-push-3 {\n    left: 25%;\n  }\n  .col-md-push-2 {\n    left: 16.66666667%;\n  }\n  .col-md-push-1 {\n    left: 8.33333333%;\n  }\n  .col-md-push-0 {\n    left: auto;\n  }\n  .col-md-offset-12 {\n    margin-left: 100%;\n  }\n  .col-md-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-md-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-md-offset-9 {\n    margin-left: 75%;\n  }\n  .col-md-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-md-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-md-offset-6 {\n    margin-left: 50%;\n  }\n  .col-md-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-md-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-md-offset-3 {\n    margin-left: 25%;\n  }\n  .col-md-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-md-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-md-offset-0 {\n    margin-left: 0;\n  }\n}\n@media (min-width: 1200px) {\n  .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n    float: left;\n  }\n  .col-lg-12 {\n    width: 100%;\n  }\n  .col-lg-11 {\n    width: 91.66666667%;\n  }\n  .col-lg-10 {\n    width: 83.33333333%;\n  }\n  .col-lg-9 {\n    width: 75%;\n  }\n  .col-lg-8 {\n    width: 66.66666667%;\n  }\n  .col-lg-7 {\n    width: 58.33333333%;\n  }\n  .col-lg-6 {\n    width: 50%;\n  }\n  .col-lg-5 {\n    width: 41.66666667%;\n  }\n  .col-lg-4 {\n    width: 33.33333333%;\n  }\n  .col-lg-3 {\n    width: 25%;\n  }\n  .col-lg-2 {\n    width: 16.66666667%;\n  }\n  .col-lg-1 {\n    width: 8.33333333%;\n  }\n  .col-lg-pull-12 {\n    right: 100%;\n  }\n  .col-lg-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-lg-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-lg-pull-9 {\n    right: 75%;\n  }\n  .col-lg-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-lg-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-lg-pull-6 {\n    right: 50%;\n  }\n  .col-lg-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-lg-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-lg-pull-3 {\n    right: 25%;\n  }\n  .col-lg-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-lg-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-lg-pull-0 {\n    right: auto;\n  }\n  .col-lg-push-12 {\n    left: 100%;\n  }\n  .col-lg-push-11 {\n    left: 91.66666667%;\n  }\n  .col-lg-push-10 {\n    left: 83.33333333%;\n  }\n  .col-lg-push-9 {\n    left: 75%;\n  }\n  .col-lg-push-8 {\n    left: 66.66666667%;\n  }\n  .col-lg-push-7 {\n    left: 58.33333333%;\n  }\n  .col-lg-push-6 {\n    left: 50%;\n  }\n  .col-lg-push-5 {\n    left: 41.66666667%;\n  }\n  .col-lg-push-4 {\n    left: 33.33333333%;\n  }\n  .col-lg-push-3 {\n    left: 25%;\n  }\n  .col-lg-push-2 {\n    left: 16.66666667%;\n  }\n  .col-lg-push-1 {\n    left: 8.33333333%;\n  }\n  .col-lg-push-0 {\n    left: auto;\n  }\n  .col-lg-offset-12 {\n    margin-left: 100%;\n  }\n  .col-lg-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-lg-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-lg-offset-9 {\n    margin-left: 75%;\n  }\n  .col-lg-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-lg-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-lg-offset-6 {\n    margin-left: 50%;\n  }\n  .col-lg-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-lg-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-lg-offset-3 {\n    margin-left: 25%;\n  }\n  .col-lg-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-lg-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-lg-offset-0 {\n    margin-left: 0;\n  }\n}\ntable {\n  background-color: transparent;\n}\ncaption {\n  padding-top: 8px;\n  padding-bottom: 8px;\n  color: #777;\n  text-align: left;\n}\nth {\n  text-align: left;\n}\n.table {\n  width: 100%;\n  max-width: 100%;\n  margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n  padding: 8px;\n  line-height: 1.42857143;\n  vertical-align: top;\n  border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n  vertical-align: bottom;\n  border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n  border-top: 0;\n}\n.table > tbody + tbody {\n  border-top: 2px solid #ddd;\n}\n.table .table {\n  background-color: #fff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n  padding: 5px;\n}\n.table-bordered {\n  border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n  border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n  border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n  background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n  background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n  position: static;\n  display: table-column;\n  float: none;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n  position: static;\n  display: table-cell;\n  float: none;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n  background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n  background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n  background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n  background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n  background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n  background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n  background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n  background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n  background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n  background-color: #ebcccc;\n}\n.table-responsive {\n  min-height: .01%;\n  overflow-x: auto;\n}\n@media screen and (max-width: 767px) {\n  .table-responsive {\n    width: 100%;\n    margin-bottom: 15px;\n    overflow-y: hidden;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    border: 1px solid #ddd;\n  }\n  .table-responsive > .table {\n    margin-bottom: 0;\n  }\n  .table-responsive > .table > thead > tr > th,\n  .table-responsive > .table > tbody > tr > th,\n  .table-responsive > .table > tfoot > tr > th,\n  .table-responsive > .table > thead > tr > td,\n  .table-responsive > .table > tbody > tr > td,\n  .table-responsive > .table > tfoot > tr > td {\n    white-space: nowrap;\n  }\n  .table-responsive > .table-bordered {\n    border: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:first-child,\n  .table-responsive > .table-bordered > tbody > tr > th:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n  .table-responsive > .table-bordered > thead > tr > td:first-child,\n  .table-responsive > .table-bordered > tbody > tr > td:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n    border-left: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:last-child,\n  .table-responsive > .table-bordered > tbody > tr > th:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n  .table-responsive > .table-bordered > thead > tr > td:last-child,\n  .table-responsive > .table-bordered > tbody > tr > td:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n    border-right: 0;\n  }\n  .table-responsive > .table-bordered > tbody > tr:last-child > th,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n  .table-responsive > .table-bordered > tbody > tr:last-child > td,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n    border-bottom: 0;\n  }\n}\nfieldset {\n  min-width: 0;\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 20px;\n  font-size: 21px;\n  line-height: inherit;\n  color: #333;\n  border: 0;\n  border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n  display: inline-block;\n  max-width: 100%;\n  margin-bottom: 5px;\n  font-weight: bold;\n}\ninput[type=\"search\"] {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9;\n  line-height: normal;\n}\ninput[type=\"file\"] {\n  display: block;\n}\ninput[type=\"range\"] {\n  display: block;\n  width: 100%;\n}\nselect[multiple],\nselect[size] {\n  height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\noutput {\n  display: block;\n  padding-top: 7px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #555;\n}\n.form-control {\n  display: block;\n  width: 100%;\n  height: 34px;\n  padding: 6px 12px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #555;\n  background-color: #fff;\n  background-image: none;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n  -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;\n       -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n          transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n  border-color: #66afe9;\n  outline: 0;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);\n          box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);\n}\n.form-control::-moz-placeholder {\n  color: #999;\n  opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n  color: #999;\n}\n.form-control::-webkit-input-placeholder {\n  color: #999;\n}\n.form-control::-ms-expand {\n  background-color: transparent;\n  border: 0;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n  background-color: #eee;\n  opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n  cursor: not-allowed;\n}\ntextarea.form-control {\n  height: auto;\n}\ninput[type=\"search\"] {\n  -webkit-appearance: none;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n  input[type=\"date\"].form-control,\n  input[type=\"time\"].form-control,\n  input[type=\"datetime-local\"].form-control,\n  input[type=\"month\"].form-control {\n    line-height: 34px;\n  }\n  input[type=\"date\"].input-sm,\n  input[type=\"time\"].input-sm,\n  input[type=\"datetime-local\"].input-sm,\n  input[type=\"month\"].input-sm,\n  .input-group-sm input[type=\"date\"],\n  .input-group-sm input[type=\"time\"],\n  .input-group-sm input[type=\"datetime-local\"],\n  .input-group-sm input[type=\"month\"] {\n    line-height: 30px;\n  }\n  input[type=\"date\"].input-lg,\n  input[type=\"time\"].input-lg,\n  input[type=\"datetime-local\"].input-lg,\n  input[type=\"month\"].input-lg,\n  .input-group-lg input[type=\"date\"],\n  .input-group-lg input[type=\"time\"],\n  .input-group-lg input[type=\"datetime-local\"],\n  .input-group-lg input[type=\"month\"] {\n    line-height: 46px;\n  }\n}\n.form-group {\n  margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n  position: relative;\n  display: block;\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n  min-height: 20px;\n  padding-left: 20px;\n  margin-bottom: 0;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  position: absolute;\n  margin-top: 4px \\9;\n  margin-left: -20px;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n  position: relative;\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  font-weight: normal;\n  vertical-align: middle;\n  cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n  cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n  cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n  cursor: not-allowed;\n}\n.form-control-static {\n  min-height: 34px;\n  padding-top: 7px;\n  padding-bottom: 7px;\n  margin-bottom: 0;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n  padding-right: 0;\n  padding-left: 0;\n}\n.input-sm {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\nselect.input-sm {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n  height: auto;\n}\n.form-group-sm .form-control {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.form-group-sm select.form-control {\n  height: 30px;\n  line-height: 30px;\n}\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n  height: auto;\n}\n.form-group-sm .form-control-static {\n  height: 30px;\n  min-height: 32px;\n  padding: 6px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n}\n.input-lg {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n  border-radius: 6px;\n}\nselect.input-lg {\n  height: 46px;\n  line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n  height: auto;\n}\n.form-group-lg .form-control {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n  border-radius: 6px;\n}\n.form-group-lg select.form-control {\n  height: 46px;\n  line-height: 46px;\n}\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n  height: auto;\n}\n.form-group-lg .form-control-static {\n  height: 46px;\n  min-height: 38px;\n  padding: 11px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n}\n.has-feedback {\n  position: relative;\n}\n.has-feedback .form-control {\n  padding-right: 42.5px;\n}\n.form-control-feedback {\n  position: absolute;\n  top: 0;\n  right: 0;\n  z-index: 2;\n  display: block;\n  width: 34px;\n  height: 34px;\n  line-height: 34px;\n  text-align: center;\n  pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n  width: 46px;\n  height: 46px;\n  line-height: 46px;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n  width: 30px;\n  height: 30px;\n  line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n  color: #3c763d;\n}\n.has-success .form-control {\n  border-color: #3c763d;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-success .form-control:focus {\n  border-color: #2b542c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #3c763d;\n}\n.has-success .form-control-feedback {\n  color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n  color: #8a6d3b;\n}\n.has-warning .form-control {\n  border-color: #8a6d3b;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-warning .form-control:focus {\n  border-color: #66512c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #8a6d3b;\n}\n.has-warning .form-control-feedback {\n  color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n  color: #a94442;\n}\n.has-error .form-control {\n  border-color: #a94442;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-error .form-control:focus {\n  border-color: #843534;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #a94442;\n}\n.has-error .form-control-feedback {\n  color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n  top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n  top: 0;\n}\n.help-block {\n  display: block;\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: #737373;\n}\n@media (min-width: 768px) {\n  .form-inline .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .form-inline .form-control-static {\n    display: inline-block;\n  }\n  .form-inline .input-group {\n    display: inline-table;\n    vertical-align: middle;\n  }\n  .form-inline .input-group .input-group-addon,\n  .form-inline .input-group .input-group-btn,\n  .form-inline .input-group .form-control {\n    width: auto;\n  }\n  .form-inline .input-group > .form-control {\n    width: 100%;\n  }\n  .form-inline .control-label {\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .radio,\n  .form-inline .checkbox {\n    display: inline-block;\n    margin-top: 0;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .radio label,\n  .form-inline .checkbox label {\n    padding-left: 0;\n  }\n  .form-inline .radio input[type=\"radio\"],\n  .form-inline .checkbox input[type=\"checkbox\"] {\n    position: relative;\n    margin-left: 0;\n  }\n  .form-inline .has-feedback .form-control-feedback {\n    top: 0;\n  }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n  padding-top: 7px;\n  margin-top: 0;\n  margin-bottom: 0;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n  min-height: 27px;\n}\n.form-horizontal .form-group {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n@media (min-width: 768px) {\n  .form-horizontal .control-label {\n    padding-top: 7px;\n    margin-bottom: 0;\n    text-align: right;\n  }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n  right: 15px;\n}\n@media (min-width: 768px) {\n  .form-horizontal .form-group-lg .control-label {\n    padding-top: 11px;\n    font-size: 18px;\n  }\n}\n@media (min-width: 768px) {\n  .form-horizontal .form-group-sm .control-label {\n    padding-top: 6px;\n    font-size: 12px;\n  }\n}\n.btn {\n  display: inline-block;\n  padding: 6px 12px;\n  margin-bottom: 0;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1.42857143;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: middle;\n  -ms-touch-action: manipulation;\n      touch-action: manipulation;\n  cursor: pointer;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n  color: #333;\n  text-decoration: none;\n}\n.btn:active,\n.btn.active {\n  background-image: none;\n  outline: 0;\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n  cursor: not-allowed;\n  filter: alpha(opacity=65);\n  -webkit-box-shadow: none;\n          box-shadow: none;\n  opacity: .65;\n}\na.btn.disabled,\nfieldset[disabled] a.btn {\n  pointer-events: none;\n}\n.btn-default {\n  color: #333;\n  background-color: #fff;\n  border-color: #ccc;\n}\n.btn-default:focus,\n.btn-default.focus {\n  color: #333;\n  background-color: #e6e6e6;\n  border-color: #8c8c8c;\n}\n.btn-default:hover {\n  color: #333;\n  background-color: #e6e6e6;\n  border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n  color: #333;\n  background-color: #e6e6e6;\n  border-color: #adadad;\n}\n.btn-default:active:hover,\n.btn-default.active:hover,\n.open > .dropdown-toggle.btn-default:hover,\n.btn-default:active:focus,\n.btn-default.active:focus,\n.open > .dropdown-toggle.btn-default:focus,\n.btn-default:active.focus,\n.btn-default.active.focus,\n.open > .dropdown-toggle.btn-default.focus {\n  color: #333;\n  background-color: #d4d4d4;\n  border-color: #8c8c8c;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n  background-image: none;\n}\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus {\n  background-color: #fff;\n  border-color: #ccc;\n}\n.btn-default .badge {\n  color: #fff;\n  background-color: #333;\n}\n.btn-primary {\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #2e6da4;\n}\n.btn-primary:focus,\n.btn-primary.focus {\n  color: #fff;\n  background-color: #286090;\n  border-color: #122b40;\n}\n.btn-primary:hover {\n  color: #fff;\n  background-color: #286090;\n  border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n  color: #fff;\n  background-color: #286090;\n  border-color: #204d74;\n}\n.btn-primary:active:hover,\n.btn-primary.active:hover,\n.open > .dropdown-toggle.btn-primary:hover,\n.btn-primary:active:focus,\n.btn-primary.active:focus,\n.open > .dropdown-toggle.btn-primary:focus,\n.btn-primary:active.focus,\n.btn-primary.active.focus,\n.open > .dropdown-toggle.btn-primary.focus {\n  color: #fff;\n  background-color: #204d74;\n  border-color: #122b40;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n  background-image: none;\n}\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus {\n  background-color: #337ab7;\n  border-color: #2e6da4;\n}\n.btn-primary .badge {\n  color: #337ab7;\n  background-color: #fff;\n}\n.btn-success {\n  color: #fff;\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n.btn-success:focus,\n.btn-success.focus {\n  color: #fff;\n  background-color: #449d44;\n  border-color: #255625;\n}\n.btn-success:hover {\n  color: #fff;\n  background-color: #449d44;\n  border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n  color: #fff;\n  background-color: #449d44;\n  border-color: #398439;\n}\n.btn-success:active:hover,\n.btn-success.active:hover,\n.open > .dropdown-toggle.btn-success:hover,\n.btn-success:active:focus,\n.btn-success.active:focus,\n.open > .dropdown-toggle.btn-success:focus,\n.btn-success:active.focus,\n.btn-success.active.focus,\n.open > .dropdown-toggle.btn-success.focus {\n  color: #fff;\n  background-color: #398439;\n  border-color: #255625;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n  background-image: none;\n}\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus {\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n.btn-success .badge {\n  color: #5cb85c;\n  background-color: #fff;\n}\n.btn-info {\n  color: #fff;\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n.btn-info:focus,\n.btn-info.focus {\n  color: #fff;\n  background-color: #31b0d5;\n  border-color: #1b6d85;\n}\n.btn-info:hover {\n  color: #fff;\n  background-color: #31b0d5;\n  border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n  color: #fff;\n  background-color: #31b0d5;\n  border-color: #269abc;\n}\n.btn-info:active:hover,\n.btn-info.active:hover,\n.open > .dropdown-toggle.btn-info:hover,\n.btn-info:active:focus,\n.btn-info.active:focus,\n.open > .dropdown-toggle.btn-info:focus,\n.btn-info:active.focus,\n.btn-info.active.focus,\n.open > .dropdown-toggle.btn-info.focus {\n  color: #fff;\n  background-color: #269abc;\n  border-color: #1b6d85;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n  background-image: none;\n}\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus {\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n.btn-info .badge {\n  color: #5bc0de;\n  background-color: #fff;\n}\n.btn-warning {\n  color: #fff;\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n.btn-warning:focus,\n.btn-warning.focus {\n  color: #fff;\n  background-color: #ec971f;\n  border-color: #985f0d;\n}\n.btn-warning:hover {\n  color: #fff;\n  background-color: #ec971f;\n  border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n  color: #fff;\n  background-color: #ec971f;\n  border-color: #d58512;\n}\n.btn-warning:active:hover,\n.btn-warning.active:hover,\n.open > .dropdown-toggle.btn-warning:hover,\n.btn-warning:active:focus,\n.btn-warning.active:focus,\n.open > .dropdown-toggle.btn-warning:focus,\n.btn-warning:active.focus,\n.btn-warning.active.focus,\n.open > .dropdown-toggle.btn-warning.focus {\n  color: #fff;\n  background-color: #d58512;\n  border-color: #985f0d;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n  background-image: none;\n}\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus {\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n.btn-warning .badge {\n  color: #f0ad4e;\n  background-color: #fff;\n}\n.btn-danger {\n  color: #fff;\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n.btn-danger:focus,\n.btn-danger.focus {\n  color: #fff;\n  background-color: #c9302c;\n  border-color: #761c19;\n}\n.btn-danger:hover {\n  color: #fff;\n  background-color: #c9302c;\n  border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n  color: #fff;\n  background-color: #c9302c;\n  border-color: #ac2925;\n}\n.btn-danger:active:hover,\n.btn-danger.active:hover,\n.open > .dropdown-toggle.btn-danger:hover,\n.btn-danger:active:focus,\n.btn-danger.active:focus,\n.open > .dropdown-toggle.btn-danger:focus,\n.btn-danger:active.focus,\n.btn-danger.active.focus,\n.open > .dropdown-toggle.btn-danger.focus {\n  color: #fff;\n  background-color: #ac2925;\n  border-color: #761c19;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n  background-image: none;\n}\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus {\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n.btn-danger .badge {\n  color: #d9534f;\n  background-color: #fff;\n}\n.btn-link {\n  font-weight: normal;\n  color: #337ab7;\n  border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n  background-color: transparent;\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n  border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n  color: #23527c;\n  text-decoration: underline;\n  background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n  color: #777;\n  text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n  border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n  padding: 1px 5px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.btn-block {\n  display: block;\n  width: 100%;\n}\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n.fade {\n  opacity: 0;\n  -webkit-transition: opacity .15s linear;\n       -o-transition: opacity .15s linear;\n          transition: opacity .15s linear;\n}\n.fade.in {\n  opacity: 1;\n}\n.collapse {\n  display: none;\n}\n.collapse.in {\n  display: block;\n}\ntr.collapse.in {\n  display: table-row;\n}\ntbody.collapse.in {\n  display: table-row-group;\n}\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  -webkit-transition-timing-function: ease;\n       -o-transition-timing-function: ease;\n          transition-timing-function: ease;\n  -webkit-transition-duration: .35s;\n       -o-transition-duration: .35s;\n          transition-duration: .35s;\n  -webkit-transition-property: height, visibility;\n       -o-transition-property: height, visibility;\n          transition-property: height, visibility;\n}\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top: 4px dashed;\n  border-top: 4px solid \\9;\n  border-right: 4px solid transparent;\n  border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n  position: relative;\n}\n.dropdown-toggle:focus {\n  outline: 0;\n}\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0;\n  font-size: 14px;\n  text-align: left;\n  list-style: none;\n  background-color: #fff;\n  -webkit-background-clip: padding-box;\n          background-clip: padding-box;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, .15);\n  border-radius: 4px;\n  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);\n          box-shadow: 0 6px 12px rgba(0, 0, 0, .175);\n}\n.dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n.dropdown-menu .divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n  display: block;\n  padding: 3px 20px;\n  clear: both;\n  font-weight: normal;\n  line-height: 1.42857143;\n  color: #333;\n  white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  color: #262626;\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  color: #fff;\n  text-decoration: none;\n  background-color: #337ab7;\n  outline: 0;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  color: #777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n  background-image: none;\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.open > .dropdown-menu {\n  display: block;\n}\n.open > a {\n  outline: 0;\n}\n.dropdown-menu-right {\n  right: 0;\n  left: auto;\n}\n.dropdown-menu-left {\n  right: auto;\n  left: 0;\n}\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: 12px;\n  line-height: 1.42857143;\n  color: #777;\n  white-space: nowrap;\n}\n.dropdown-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 990;\n}\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n  content: \"\";\n  border-top: 0;\n  border-bottom: 4px dashed;\n  border-bottom: 4px solid \\9;\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-bottom: 2px;\n}\n@media (min-width: 768px) {\n  .navbar-right .dropdown-menu {\n    right: 0;\n    left: auto;\n  }\n  .navbar-right .dropdown-menu-left {\n    right: auto;\n    left: 0;\n  }\n}\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n  position: relative;\n  float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n  z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n  margin-left: -1px;\n}\n.btn-toolbar {\n  margin-left: -5px;\n}\n.btn-toolbar .btn,\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n  float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n  margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n.btn-group > .btn:first-child {\n  margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group > .btn-group {\n  float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n  padding-right: 8px;\n  padding-left: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-right: 12px;\n  padding-left: 12px;\n}\n.btn-group.open .dropdown-toggle {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n.btn .caret {\n  margin-left: 0;\n}\n.btn-lg .caret {\n  border-width: 5px 5px 0;\n  border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n  border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n  display: block;\n  float: none;\n  width: 100%;\n  max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n  float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n  margin-top: -1px;\n  margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n  border-top-left-radius: 4px;\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  table-layout: fixed;\n  border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n  display: table-cell;\n  float: none;\n  width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n  width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n  left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n  position: absolute;\n  clip: rect(0, 0, 0, 0);\n  pointer-events: none;\n}\n.input-group {\n  position: relative;\n  display: table;\n  border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n  float: none;\n  padding-right: 0;\n  padding-left: 0;\n}\n.input-group .form-control {\n  position: relative;\n  z-index: 2;\n  float: left;\n  width: 100%;\n  margin-bottom: 0;\n}\n.input-group .form-control:focus {\n  z-index: 3;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n  border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n  height: 46px;\n  line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n  height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n  height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle;\n}\n.input-group-addon {\n  padding: 6px 12px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1;\n  color: #555;\n  text-align: center;\n  background-color: #eee;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n}\n.input-group-addon.input-sm {\n  padding: 5px 10px;\n  font-size: 12px;\n  border-radius: 3px;\n}\n.input-group-addon.input-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n  margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.input-group-addon:first-child {\n  border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.input-group-addon:last-child {\n  border-left: 0;\n}\n.input-group-btn {\n  position: relative;\n  font-size: 0;\n  white-space: nowrap;\n}\n.input-group-btn > .btn {\n  position: relative;\n}\n.input-group-btn > .btn + .btn {\n  margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n  z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n  margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n  z-index: 2;\n  margin-left: -1px;\n}\n.nav {\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n.nav > li {\n  position: relative;\n  display: block;\n}\n.nav > li > a {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n  text-decoration: none;\n  background-color: #eee;\n}\n.nav > li.disabled > a {\n  color: #777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n  color: #777;\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n  background-color: #eee;\n  border-color: #337ab7;\n}\n.nav .nav-divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n.nav > li > a > img {\n  max-width: none;\n}\n.nav-tabs {\n  border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n  float: left;\n  margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n  margin-right: 2px;\n  line-height: 1.42857143;\n  border: 1px solid transparent;\n  border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n  border-color: #eee #eee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n  color: #555;\n  cursor: default;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-bottom-color: transparent;\n}\n.nav-tabs.nav-justified {\n  width: 100%;\n  border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n  float: none;\n}\n.nav-tabs.nav-justified > li > a {\n  margin-bottom: 5px;\n  text-align: center;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n  .nav-tabs.nav-justified > li > a {\n    margin-bottom: 0;\n  }\n}\n.nav-tabs.nav-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n  border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li > a {\n    border-bottom: 1px solid #ddd;\n    border-radius: 4px 4px 0 0;\n  }\n  .nav-tabs.nav-justified > .active > a,\n  .nav-tabs.nav-justified > .active > a:hover,\n  .nav-tabs.nav-justified > .active > a:focus {\n    border-bottom-color: #fff;\n  }\n}\n.nav-pills > li {\n  float: left;\n}\n.nav-pills > li > a {\n  border-radius: 4px;\n}\n.nav-pills > li + li {\n  margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n  color: #fff;\n  background-color: #337ab7;\n}\n.nav-stacked > li {\n  float: none;\n}\n.nav-stacked > li + li {\n  margin-top: 2px;\n  margin-left: 0;\n}\n.nav-justified {\n  width: 100%;\n}\n.nav-justified > li {\n  float: none;\n}\n.nav-justified > li > a {\n  margin-bottom: 5px;\n  text-align: center;\n}\n.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\n@media (min-width: 768px) {\n  .nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n  .nav-justified > li > a {\n    margin-bottom: 0;\n  }\n}\n.nav-tabs-justified {\n  border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n  border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n  .nav-tabs-justified > li > a {\n    border-bottom: 1px solid #ddd;\n    border-radius: 4px 4px 0 0;\n  }\n  .nav-tabs-justified > .active > a,\n  .nav-tabs-justified > .active > a:hover,\n  .nav-tabs-justified > .active > a:focus {\n    border-bottom-color: #fff;\n  }\n}\n.tab-content > .tab-pane {\n  display: none;\n}\n.tab-content > .active {\n  display: block;\n}\n.nav-tabs .dropdown-menu {\n  margin-top: -1px;\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.navbar {\n  position: relative;\n  min-height: 50px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n  .navbar {\n    border-radius: 4px;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-header {\n    float: left;\n  }\n}\n.navbar-collapse {\n  padding-right: 15px;\n  padding-left: 15px;\n  overflow-x: visible;\n  -webkit-overflow-scrolling: touch;\n  border-top: 1px solid transparent;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);\n}\n.navbar-collapse.in {\n  overflow-y: auto;\n}\n@media (min-width: 768px) {\n  .navbar-collapse {\n    width: auto;\n    border-top: 0;\n    -webkit-box-shadow: none;\n            box-shadow: none;\n  }\n  .navbar-collapse.collapse {\n    display: block !important;\n    height: auto !important;\n    padding-bottom: 0;\n    overflow: visible !important;\n  }\n  .navbar-collapse.in {\n    overflow-y: visible;\n  }\n  .navbar-fixed-top .navbar-collapse,\n  .navbar-static-top .navbar-collapse,\n  .navbar-fixed-bottom .navbar-collapse {\n    padding-right: 0;\n    padding-left: 0;\n  }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n  max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n  .navbar-fixed-top .navbar-collapse,\n  .navbar-fixed-bottom .navbar-collapse {\n    max-height: 200px;\n  }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n@media (min-width: 768px) {\n  .container > .navbar-header,\n  .container-fluid > .navbar-header,\n  .container > .navbar-collapse,\n  .container-fluid > .navbar-collapse {\n    margin-right: 0;\n    margin-left: 0;\n  }\n}\n.navbar-static-top {\n  z-index: 1000;\n  border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n  .navbar-static-top {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: 1030;\n}\n@media (min-width: 768px) {\n  .navbar-fixed-top,\n  .navbar-fixed-bottom {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top {\n  top: 0;\n  border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0;\n  border-width: 1px 0 0;\n}\n.navbar-brand {\n  float: left;\n  height: 50px;\n  padding: 15px 15px;\n  font-size: 18px;\n  line-height: 20px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n  text-decoration: none;\n}\n.navbar-brand > img {\n  display: block;\n}\n@media (min-width: 768px) {\n  .navbar > .container .navbar-brand,\n  .navbar > .container-fluid .navbar-brand {\n    margin-left: -15px;\n  }\n}\n.navbar-toggle {\n  position: relative;\n  float: right;\n  padding: 9px 10px;\n  margin-top: 8px;\n  margin-right: 15px;\n  margin-bottom: 8px;\n  background-color: transparent;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.navbar-toggle:focus {\n  outline: 0;\n}\n.navbar-toggle .icon-bar {\n  display: block;\n  width: 22px;\n  height: 2px;\n  border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n  margin-top: 4px;\n}\n@media (min-width: 768px) {\n  .navbar-toggle {\n    display: none;\n  }\n}\n.navbar-nav {\n  margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n  padding-top: 10px;\n  padding-bottom: 10px;\n  line-height: 20px;\n}\n@media (max-width: 767px) {\n  .navbar-nav .open .dropdown-menu {\n    position: static;\n    float: none;\n    width: auto;\n    margin-top: 0;\n    background-color: transparent;\n    border: 0;\n    -webkit-box-shadow: none;\n            box-shadow: none;\n  }\n  .navbar-nav .open .dropdown-menu > li > a,\n  .navbar-nav .open .dropdown-menu .dropdown-header {\n    padding: 5px 15px 5px 25px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a {\n    line-height: 20px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-nav .open .dropdown-menu > li > a:focus {\n    background-image: none;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-nav {\n    float: left;\n    margin: 0;\n  }\n  .navbar-nav > li {\n    float: left;\n  }\n  .navbar-nav > li > a {\n    padding-top: 15px;\n    padding-bottom: 15px;\n  }\n}\n.navbar-form {\n  padding: 10px 15px;\n  margin-top: 8px;\n  margin-right: -15px;\n  margin-bottom: 8px;\n  margin-left: -15px;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);\n}\n@media (min-width: 768px) {\n  .navbar-form .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .navbar-form .form-control-static {\n    display: inline-block;\n  }\n  .navbar-form .input-group {\n    display: inline-table;\n    vertical-align: middle;\n  }\n  .navbar-form .input-group .input-group-addon,\n  .navbar-form .input-group .input-group-btn,\n  .navbar-form .input-group .form-control {\n    width: auto;\n  }\n  .navbar-form .input-group > .form-control {\n    width: 100%;\n  }\n  .navbar-form .control-label {\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .radio,\n  .navbar-form .checkbox {\n    display: inline-block;\n    margin-top: 0;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .radio label,\n  .navbar-form .checkbox label {\n    padding-left: 0;\n  }\n  .navbar-form .radio input[type=\"radio\"],\n  .navbar-form .checkbox input[type=\"checkbox\"] {\n    position: relative;\n    margin-left: 0;\n  }\n  .navbar-form .has-feedback .form-control-feedback {\n    top: 0;\n  }\n}\n@media (max-width: 767px) {\n  .navbar-form .form-group {\n    margin-bottom: 5px;\n  }\n  .navbar-form .form-group:last-child {\n    margin-bottom: 0;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-form {\n    width: auto;\n    padding-top: 0;\n    padding-bottom: 0;\n    margin-right: 0;\n    margin-left: 0;\n    border: 0;\n    -webkit-box-shadow: none;\n            box-shadow: none;\n  }\n}\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  margin-bottom: 0;\n  border-top-left-radius: 4px;\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.navbar-btn {\n  margin-top: 8px;\n  margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n  margin-top: 14px;\n  margin-bottom: 14px;\n}\n.navbar-text {\n  margin-top: 15px;\n  margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n  .navbar-text {\n    float: left;\n    margin-right: 15px;\n    margin-left: 15px;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-left {\n    float: left !important;\n  }\n  .navbar-right {\n    float: right !important;\n    margin-right: -15px;\n  }\n  .navbar-right ~ .navbar-right {\n    margin-right: 0;\n  }\n}\n.navbar-default {\n  background-color: #f8f8f8;\n  border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n  color: #777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n  color: #5e5e5e;\n  background-color: transparent;\n}\n.navbar-default .navbar-text {\n  color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n  color: #777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n  color: #333;\n  background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n  color: #555;\n  background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n  color: #ccc;\n  background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n  border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n  background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n  background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n  border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n  color: #555;\n  background-color: #e7e7e7;\n}\n@media (max-width: 767px) {\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n    color: #777;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #333;\n    background-color: transparent;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #555;\n    background-color: #e7e7e7;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #ccc;\n    background-color: transparent;\n  }\n}\n.navbar-default .navbar-link {\n  color: #777;\n}\n.navbar-default .navbar-link:hover {\n  color: #333;\n}\n.navbar-default .btn-link {\n  color: #777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n  color: #333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n  color: #ccc;\n}\n.navbar-inverse {\n  background-color: #222;\n  border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n  color: #fff;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n  color: #fff;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n  color: #fff;\n  background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n  color: #444;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n  border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n  background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n  background-color: #fff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n  border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n  color: #fff;\n  background-color: #080808;\n}\n@media (max-width: 767px) {\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n    border-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n    background-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n    color: #9d9d9d;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #fff;\n    background-color: transparent;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #fff;\n    background-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #444;\n    background-color: transparent;\n  }\n}\n.navbar-inverse .navbar-link {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n  color: #fff;\n}\n.navbar-inverse .btn-link {\n  color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n  color: #fff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n  color: #444;\n}\n.breadcrumb {\n  padding: 8px 15px;\n  margin-bottom: 20px;\n  list-style: none;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n}\n.breadcrumb > li {\n  display: inline-block;\n}\n.breadcrumb > li + li:before {\n  padding: 0 5px;\n  color: #ccc;\n  content: \"/\\00a0\";\n}\n.breadcrumb > .active {\n  color: #777;\n}\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: 20px 0;\n  border-radius: 4px;\n}\n.pagination > li {\n  display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n  position: relative;\n  float: left;\n  padding: 6px 12px;\n  margin-left: -1px;\n  line-height: 1.42857143;\n  color: #337ab7;\n  text-decoration: none;\n  background-color: #fff;\n  border: 1px solid #ddd;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n  margin-left: 0;\n  border-top-left-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n  z-index: 2;\n  color: #23527c;\n  background-color: #eee;\n  border-color: #ddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n  z-index: 3;\n  color: #fff;\n  cursor: default;\n  background-color: #337ab7;\n  border-color: #337ab7;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n  color: #777;\n  cursor: not-allowed;\n  background-color: #fff;\n  border-color: #ddd;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n  border-top-left-radius: 6px;\n  border-bottom-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n  border-top-right-radius: 6px;\n  border-bottom-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n  border-top-left-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n  border-top-right-radius: 3px;\n  border-bottom-right-radius: 3px;\n}\n.pager {\n  padding-left: 0;\n  margin: 20px 0;\n  text-align: center;\n  list-style: none;\n}\n.pager li {\n  display: inline;\n}\n.pager li > a,\n.pager li > span {\n  display: inline-block;\n  padding: 5px 14px;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n  text-decoration: none;\n  background-color: #eee;\n}\n.pager .next > a,\n.pager .next > span {\n  float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n  float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n  color: #777;\n  cursor: not-allowed;\n  background-color: #fff;\n}\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: #fff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n  color: #fff;\n  text-decoration: none;\n  cursor: pointer;\n}\n.label:empty {\n  display: none;\n}\n.btn .label {\n  position: relative;\n  top: -1px;\n}\n.label-default {\n  background-color: #777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n  background-color: #5e5e5e;\n}\n.label-primary {\n  background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n  background-color: #286090;\n}\n.label-success {\n  background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n  background-color: #449d44;\n}\n.label-info {\n  background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n  background-color: #31b0d5;\n}\n.label-warning {\n  background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n  background-color: #ec971f;\n}\n.label-danger {\n  background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n  background-color: #c9302c;\n}\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: 12px;\n  font-weight: bold;\n  line-height: 1;\n  color: #fff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: middle;\n  background-color: #777;\n  border-radius: 10px;\n}\n.badge:empty {\n  display: none;\n}\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n  top: 0;\n  padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n  color: #fff;\n  text-decoration: none;\n  cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n  color: #337ab7;\n  background-color: #fff;\n}\n.list-group-item > .badge {\n  float: right;\n}\n.list-group-item > .badge + .badge {\n  margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n  margin-left: 3px;\n}\n.jumbotron {\n  padding-top: 30px;\n  padding-bottom: 30px;\n  margin-bottom: 30px;\n  color: inherit;\n  background-color: #eee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n  color: inherit;\n}\n.jumbotron p {\n  margin-bottom: 15px;\n  font-size: 21px;\n  font-weight: 200;\n}\n.jumbotron > hr {\n  border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n  padding-right: 15px;\n  padding-left: 15px;\n  border-radius: 6px;\n}\n.jumbotron .container {\n  max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n  .jumbotron {\n    padding-top: 48px;\n    padding-bottom: 48px;\n  }\n  .container .jumbotron,\n  .container-fluid .jumbotron {\n    padding-right: 60px;\n    padding-left: 60px;\n  }\n  .jumbotron h1,\n  .jumbotron .h1 {\n    font-size: 63px;\n  }\n}\n.thumbnail {\n  display: block;\n  padding: 4px;\n  margin-bottom: 20px;\n  line-height: 1.42857143;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-radius: 4px;\n  -webkit-transition: border .2s ease-in-out;\n       -o-transition: border .2s ease-in-out;\n          transition: border .2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n  margin-right: auto;\n  margin-left: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n  border-color: #337ab7;\n}\n.thumbnail .caption {\n  padding: 9px;\n  color: #333;\n}\n.alert {\n  padding: 15px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.alert h4 {\n  margin-top: 0;\n  color: inherit;\n}\n.alert .alert-link {\n  font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n  margin-bottom: 0;\n}\n.alert > p + p {\n  margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n  padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n  position: relative;\n  top: -2px;\n  right: -21px;\n  color: inherit;\n}\n.alert-success {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n.alert-success hr {\n  border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n  color: #2b542c;\n}\n.alert-info {\n  color: #31708f;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n.alert-info hr {\n  border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n  color: #245269;\n}\n.alert-warning {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n}\n.alert-warning hr {\n  border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n  color: #66512c;\n}\n.alert-danger {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #ebccd1;\n}\n.alert-danger hr {\n  border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n  color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n@-o-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n.progress {\n  height: 20px;\n  margin-bottom: 20px;\n  overflow: hidden;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);\n          box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);\n}\n.progress-bar {\n  float: left;\n  width: 0;\n  height: 100%;\n  font-size: 12px;\n  line-height: 20px;\n  color: #fff;\n  text-align: center;\n  background-color: #337ab7;\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);\n          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);\n  -webkit-transition: width .6s ease;\n       -o-transition: width .6s ease;\n          transition: width .6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  -webkit-background-size: 40px 40px;\n          background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n  -webkit-animation: progress-bar-stripes 2s linear infinite;\n       -o-animation: progress-bar-stripes 2s linear infinite;\n          animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n  background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n  background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n  background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n  background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n}\n.media {\n  margin-top: 15px;\n}\n.media:first-child {\n  margin-top: 0;\n}\n.media,\n.media-body {\n  overflow: hidden;\n  zoom: 1;\n}\n.media-body {\n  width: 10000px;\n}\n.media-object {\n  display: block;\n}\n.media-object.img-thumbnail {\n  max-width: none;\n}\n.media-right,\n.media > .pull-right {\n  padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n  padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n  display: table-cell;\n  vertical-align: top;\n}\n.media-middle {\n  vertical-align: middle;\n}\n.media-bottom {\n  vertical-align: bottom;\n}\n.media-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n.list-group {\n  padding-left: 0;\n  margin-bottom: 20px;\n}\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n  margin-bottom: -1px;\n  background-color: #fff;\n  border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n  border-top-left-radius: 4px;\n  border-top-right-radius: 4px;\n}\n.list-group-item:last-child {\n  margin-bottom: 0;\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\na.list-group-item,\nbutton.list-group-item {\n  color: #555;\n}\na.list-group-item .list-group-item-heading,\nbutton.list-group-item .list-group-item-heading {\n  color: #333;\n}\na.list-group-item:hover,\nbutton.list-group-item:hover,\na.list-group-item:focus,\nbutton.list-group-item:focus {\n  color: #555;\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\nbutton.list-group-item {\n  width: 100%;\n  text-align: left;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n  color: #777;\n  cursor: not-allowed;\n  background-color: #eee;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n  color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n  color: #777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  z-index: 2;\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n  color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n  color: #c7ddef;\n}\n.list-group-item-success {\n  color: #3c763d;\n  background-color: #dff0d8;\n}\na.list-group-item-success,\nbutton.list-group-item-success {\n  color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading,\nbutton.list-group-item-success .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-success:hover,\nbutton.list-group-item-success:hover,\na.list-group-item-success:focus,\nbutton.list-group-item-success:focus {\n  color: #3c763d;\n  background-color: #d0e9c6;\n}\na.list-group-item-success.active,\nbutton.list-group-item-success.active,\na.list-group-item-success.active:hover,\nbutton.list-group-item-success.active:hover,\na.list-group-item-success.active:focus,\nbutton.list-group-item-success.active:focus {\n  color: #fff;\n  background-color: #3c763d;\n  border-color: #3c763d;\n}\n.list-group-item-info {\n  color: #31708f;\n  background-color: #d9edf7;\n}\na.list-group-item-info,\nbutton.list-group-item-info {\n  color: #31708f;\n}\na.list-group-item-info .list-group-item-heading,\nbutton.list-group-item-info .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-info:hover,\nbutton.list-group-item-info:hover,\na.list-group-item-info:focus,\nbutton.list-group-item-info:focus {\n  color: #31708f;\n  background-color: #c4e3f3;\n}\na.list-group-item-info.active,\nbutton.list-group-item-info.active,\na.list-group-item-info.active:hover,\nbutton.list-group-item-info.active:hover,\na.list-group-item-info.active:focus,\nbutton.list-group-item-info.active:focus {\n  color: #fff;\n  background-color: #31708f;\n  border-color: #31708f;\n}\n.list-group-item-warning {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n}\na.list-group-item-warning,\nbutton.list-group-item-warning {\n  color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading,\nbutton.list-group-item-warning .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-warning:hover,\nbutton.list-group-item-warning:hover,\na.list-group-item-warning:focus,\nbutton.list-group-item-warning:focus {\n  color: #8a6d3b;\n  background-color: #faf2cc;\n}\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\nbutton.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus,\nbutton.list-group-item-warning.active:focus {\n  color: #fff;\n  background-color: #8a6d3b;\n  border-color: #8a6d3b;\n}\n.list-group-item-danger {\n  color: #a94442;\n  background-color: #f2dede;\n}\na.list-group-item-danger,\nbutton.list-group-item-danger {\n  color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading,\nbutton.list-group-item-danger .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-danger:hover,\nbutton.list-group-item-danger:hover,\na.list-group-item-danger:focus,\nbutton.list-group-item-danger:focus {\n  color: #a94442;\n  background-color: #ebcccc;\n}\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\nbutton.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus,\nbutton.list-group-item-danger.active:focus {\n  color: #fff;\n  background-color: #a94442;\n  border-color: #a94442;\n}\n.list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3;\n}\n.panel {\n  margin-bottom: 20px;\n  background-color: #fff;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05);\n          box-shadow: 0 1px 1px rgba(0, 0, 0, .05);\n}\n.panel-body {\n  padding: 15px;\n}\n.panel-heading {\n  padding: 10px 15px;\n  border-bottom: 1px solid transparent;\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n  color: inherit;\n}\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: 16px;\n  color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n  color: inherit;\n}\n.panel-footer {\n  padding: 10px 15px;\n  background-color: #f5f5f5;\n  border-top: 1px solid #ddd;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n  margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n  border-width: 1px 0;\n  border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n  border-top: 0;\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n  border-bottom: 0;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n  border-top-width: 0;\n}\n.list-group + .panel-footer {\n  border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n  margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n  padding-right: 15px;\n  padding-left: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n  border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n  border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n  border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n  border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n  border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n  border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n  border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n  border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n  border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n  border-bottom: 0;\n}\n.panel > .table-responsive {\n  margin-bottom: 0;\n  border: 0;\n}\n.panel-group {\n  margin-bottom: 20px;\n}\n.panel-group .panel {\n  margin-bottom: 0;\n  border-radius: 4px;\n}\n.panel-group .panel + .panel {\n  margin-top: 5px;\n}\n.panel-group .panel-heading {\n  border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n  border-top: 1px solid #ddd;\n}\n.panel-group .panel-footer {\n  border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n  border-bottom: 1px solid #ddd;\n}\n.panel-default {\n  border-color: #ddd;\n}\n.panel-default > .panel-heading {\n  color: #333;\n  background-color: #f5f5f5;\n  border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n  color: #f5f5f5;\n  background-color: #333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #ddd;\n}\n.panel-primary {\n  border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n  color: #337ab7;\n  background-color: #fff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #337ab7;\n}\n.panel-success {\n  border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n  color: #dff0d8;\n  background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #d6e9c6;\n}\n.panel-info {\n  border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n  color: #31708f;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n  color: #d9edf7;\n  background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #bce8f1;\n}\n.panel-warning {\n  border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n  color: #fcf8e3;\n  background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #faebcc;\n}\n.panel-danger {\n  border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n  color: #f2dede;\n  background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n  position: relative;\n  display: block;\n  height: 0;\n  padding: 0;\n  overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  border: 0;\n}\n.embed-responsive-16by9 {\n  padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n  padding-bottom: 75%;\n}\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border: 1px solid #e3e3e3;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);\n}\n.well blockquote {\n  border-color: #ddd;\n  border-color: rgba(0, 0, 0, .15);\n}\n.well-lg {\n  padding: 24px;\n  border-radius: 6px;\n}\n.well-sm {\n  padding: 9px;\n  border-radius: 3px;\n}\n.close {\n  float: right;\n  font-size: 21px;\n  font-weight: bold;\n  line-height: 1;\n  color: #000;\n  text-shadow: 0 1px 0 #fff;\n  filter: alpha(opacity=20);\n  opacity: .2;\n}\n.close:hover,\n.close:focus {\n  color: #000;\n  text-decoration: none;\n  cursor: pointer;\n  filter: alpha(opacity=50);\n  opacity: .5;\n}\nbutton.close {\n  -webkit-appearance: none;\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n}\n.modal-open {\n  overflow: hidden;\n}\n.modal {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1050;\n  display: none;\n  overflow: hidden;\n  -webkit-overflow-scrolling: touch;\n  outline: 0;\n}\n.modal.fade .modal-dialog {\n  -webkit-transition: -webkit-transform .3s ease-out;\n       -o-transition:      -o-transform .3s ease-out;\n          transition:         transform .3s ease-out;\n  -webkit-transform: translate(0, -25%);\n      -ms-transform: translate(0, -25%);\n       -o-transform: translate(0, -25%);\n          transform: translate(0, -25%);\n}\n.modal.in .modal-dialog {\n  -webkit-transform: translate(0, 0);\n      -ms-transform: translate(0, 0);\n       -o-transform: translate(0, 0);\n          transform: translate(0, 0);\n}\n.modal-open .modal {\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: 10px;\n}\n.modal-content {\n  position: relative;\n  background-color: #fff;\n  -webkit-background-clip: padding-box;\n          background-clip: padding-box;\n  border: 1px solid #999;\n  border: 1px solid rgba(0, 0, 0, .2);\n  border-radius: 6px;\n  outline: 0;\n  -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5);\n          box-shadow: 0 3px 9px rgba(0, 0, 0, .5);\n}\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  background-color: #000;\n}\n.modal-backdrop.fade {\n  filter: alpha(opacity=0);\n  opacity: 0;\n}\n.modal-backdrop.in {\n  filter: alpha(opacity=50);\n  opacity: .5;\n}\n.modal-header {\n  padding: 15px;\n  border-bottom: 1px solid #e5e5e5;\n}\n.modal-header .close {\n  margin-top: -2px;\n}\n.modal-title {\n  margin: 0;\n  line-height: 1.42857143;\n}\n.modal-body {\n  position: relative;\n  padding: 15px;\n}\n.modal-footer {\n  padding: 15px;\n  text-align: right;\n  border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n  margin-bottom: 0;\n  margin-left: 5px;\n}\n.modal-footer .btn-group .btn + .btn {\n  margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n  margin-left: 0;\n}\n.modal-scrollbar-measure {\n  position: absolute;\n  top: -9999px;\n  width: 50px;\n  height: 50px;\n  overflow: scroll;\n}\n@media (min-width: 768px) {\n  .modal-dialog {\n    width: 600px;\n    margin: 30px auto;\n  }\n  .modal-content {\n    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5);\n            box-shadow: 0 5px 15px rgba(0, 0, 0, .5);\n  }\n  .modal-sm {\n    width: 300px;\n  }\n}\n@media (min-width: 992px) {\n  .modal-lg {\n    width: 900px;\n  }\n}\n.tooltip {\n  position: absolute;\n  z-index: 1070;\n  display: block;\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 12px;\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1.42857143;\n  text-align: left;\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  letter-spacing: normal;\n  word-break: normal;\n  word-spacing: normal;\n  word-wrap: normal;\n  white-space: normal;\n  filter: alpha(opacity=0);\n  opacity: 0;\n\n  line-break: auto;\n}\n.tooltip.in {\n  filter: alpha(opacity=90);\n  opacity: .9;\n}\n.tooltip.top {\n  padding: 5px 0;\n  margin-top: -3px;\n}\n.tooltip.right {\n  padding: 0 5px;\n  margin-left: 3px;\n}\n.tooltip.bottom {\n  padding: 5px 0;\n  margin-top: 3px;\n}\n.tooltip.left {\n  padding: 0 5px;\n  margin-left: -3px;\n}\n.tooltip-inner {\n  max-width: 200px;\n  padding: 3px 8px;\n  color: #fff;\n  text-align: center;\n  background-color: #000;\n  border-radius: 4px;\n}\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n  bottom: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n  right: 5px;\n  bottom: 0;\n  margin-bottom: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n  bottom: 0;\n  left: 5px;\n  margin-bottom: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.right .tooltip-arrow {\n  top: 50%;\n  left: 0;\n  margin-top: -5px;\n  border-width: 5px 5px 5px 0;\n  border-right-color: #000;\n}\n.tooltip.left .tooltip-arrow {\n  top: 50%;\n  right: 0;\n  margin-top: -5px;\n  border-width: 5px 0 5px 5px;\n  border-left-color: #000;\n}\n.tooltip.bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n  top: 0;\n  right: 5px;\n  margin-top: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n  top: 0;\n  left: 5px;\n  margin-top: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1060;\n  display: none;\n  max-width: 276px;\n  padding: 1px;\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1.42857143;\n  text-align: left;\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  letter-spacing: normal;\n  word-break: normal;\n  word-spacing: normal;\n  word-wrap: normal;\n  white-space: normal;\n  background-color: #fff;\n  -webkit-background-clip: padding-box;\n          background-clip: padding-box;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, .2);\n  border-radius: 6px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2);\n          box-shadow: 0 5px 10px rgba(0, 0, 0, .2);\n\n  line-break: auto;\n}\n.popover.top {\n  margin-top: -10px;\n}\n.popover.right {\n  margin-left: 10px;\n}\n.popover.bottom {\n  margin-top: 10px;\n}\n.popover.left {\n  margin-left: -10px;\n}\n.popover-title {\n  padding: 8px 14px;\n  margin: 0;\n  font-size: 14px;\n  background-color: #f7f7f7;\n  border-bottom: 1px solid #ebebeb;\n  border-radius: 5px 5px 0 0;\n}\n.popover-content {\n  padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n  position: absolute;\n  display: block;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.popover > .arrow {\n  border-width: 11px;\n}\n.popover > .arrow:after {\n  content: \"\";\n  border-width: 10px;\n}\n.popover.top > .arrow {\n  bottom: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-top-color: #999;\n  border-top-color: rgba(0, 0, 0, .25);\n  border-bottom-width: 0;\n}\n.popover.top > .arrow:after {\n  bottom: 1px;\n  margin-left: -10px;\n  content: \" \";\n  border-top-color: #fff;\n  border-bottom-width: 0;\n}\n.popover.right > .arrow {\n  top: 50%;\n  left: -11px;\n  margin-top: -11px;\n  border-right-color: #999;\n  border-right-color: rgba(0, 0, 0, .25);\n  border-left-width: 0;\n}\n.popover.right > .arrow:after {\n  bottom: -10px;\n  left: 1px;\n  content: \" \";\n  border-right-color: #fff;\n  border-left-width: 0;\n}\n.popover.bottom > .arrow {\n  top: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-top-width: 0;\n  border-bottom-color: #999;\n  border-bottom-color: rgba(0, 0, 0, .25);\n}\n.popover.bottom > .arrow:after {\n  top: 1px;\n  margin-left: -10px;\n  content: \" \";\n  border-top-width: 0;\n  border-bottom-color: #fff;\n}\n.popover.left > .arrow {\n  top: 50%;\n  right: -11px;\n  margin-top: -11px;\n  border-right-width: 0;\n  border-left-color: #999;\n  border-left-color: rgba(0, 0, 0, .25);\n}\n.popover.left > .arrow:after {\n  right: 1px;\n  bottom: -10px;\n  content: \" \";\n  border-right-width: 0;\n  border-left-color: #fff;\n}\n.carousel {\n  position: relative;\n}\n.carousel-inner {\n  position: relative;\n  width: 100%;\n  overflow: hidden;\n}\n.carousel-inner > .item {\n  position: relative;\n  display: none;\n  -webkit-transition: .6s ease-in-out left;\n       -o-transition: .6s ease-in-out left;\n          transition: .6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n  .carousel-inner > .item {\n    -webkit-transition: -webkit-transform .6s ease-in-out;\n         -o-transition:      -o-transform .6s ease-in-out;\n            transition:         transform .6s ease-in-out;\n\n    -webkit-backface-visibility: hidden;\n            backface-visibility: hidden;\n    -webkit-perspective: 1000px;\n            perspective: 1000px;\n  }\n  .carousel-inner > .item.next,\n  .carousel-inner > .item.active.right {\n    left: 0;\n    -webkit-transform: translate3d(100%, 0, 0);\n            transform: translate3d(100%, 0, 0);\n  }\n  .carousel-inner > .item.prev,\n  .carousel-inner > .item.active.left {\n    left: 0;\n    -webkit-transform: translate3d(-100%, 0, 0);\n            transform: translate3d(-100%, 0, 0);\n  }\n  .carousel-inner > .item.next.left,\n  .carousel-inner > .item.prev.right,\n  .carousel-inner > .item.active {\n    left: 0;\n    -webkit-transform: translate3d(0, 0, 0);\n            transform: translate3d(0, 0, 0);\n  }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  display: block;\n}\n.carousel-inner > .active {\n  left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n.carousel-inner > .next {\n  left: 100%;\n}\n.carousel-inner > .prev {\n  left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n  left: 0;\n}\n.carousel-inner > .active.left {\n  left: -100%;\n}\n.carousel-inner > .active.right {\n  left: 100%;\n}\n.carousel-control {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  width: 15%;\n  font-size: 20px;\n  color: #fff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, .6);\n  background-color: rgba(0, 0, 0, 0);\n  filter: alpha(opacity=50);\n  opacity: .5;\n}\n.carousel-control.left {\n  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);\n  background-image:      -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);\n  background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001)));\n  background-image:         linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n  background-repeat: repeat-x;\n}\n.carousel-control.right {\n  right: 0;\n  left: auto;\n  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);\n  background-image:      -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);\n  background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5)));\n  background-image:         linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n  background-repeat: repeat-x;\n}\n.carousel-control:hover,\n.carousel-control:focus {\n  color: #fff;\n  text-decoration: none;\n  filter: alpha(opacity=90);\n  outline: 0;\n  opacity: .9;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n  position: absolute;\n  top: 50%;\n  z-index: 5;\n  display: inline-block;\n  margin-top: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n  left: 50%;\n  margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n  right: 50%;\n  margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n  width: 20px;\n  height: 20px;\n  font-family: serif;\n  line-height: 1;\n}\n.carousel-control .icon-prev:before {\n  content: '\\2039';\n}\n.carousel-control .icon-next:before {\n  content: '\\203a';\n}\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  padding-left: 0;\n  margin-left: -30%;\n  text-align: center;\n  list-style: none;\n}\n.carousel-indicators li {\n  display: inline-block;\n  width: 10px;\n  height: 10px;\n  margin: 1px;\n  text-indent: -999px;\n  cursor: pointer;\n  background-color: #000 \\9;\n  background-color: rgba(0, 0, 0, 0);\n  border: 1px solid #fff;\n  border-radius: 10px;\n}\n.carousel-indicators .active {\n  width: 12px;\n  height: 12px;\n  margin: 0;\n  background-color: #fff;\n}\n.carousel-caption {\n  position: absolute;\n  right: 15%;\n  bottom: 20px;\n  left: 15%;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: #fff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, .6);\n}\n.carousel-caption .btn {\n  text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-prev,\n  .carousel-control .icon-next {\n    width: 30px;\n    height: 30px;\n    margin-top: -10px;\n    font-size: 30px;\n  }\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .icon-prev {\n    margin-left: -10px;\n  }\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-next {\n    margin-right: -10px;\n  }\n  .carousel-caption {\n    right: 20%;\n    left: 20%;\n    padding-bottom: 30px;\n  }\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-header:before,\n.modal-header:after,\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \" \";\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-header:after,\n.modal-footer:after {\n  clear: both;\n}\n.center-block {\n  display: block;\n  margin-right: auto;\n  margin-left: auto;\n}\n.pull-right {\n  float: right !important;\n}\n.pull-left {\n  float: left !important;\n}\n.hide {\n  display: none !important;\n}\n.show {\n  display: block !important;\n}\n.invisible {\n  visibility: hidden;\n}\n.text-hide {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n.hidden {\n  display: none !important;\n}\n.affix {\n  position: fixed;\n}\n@-ms-viewport {\n  width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n  display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n  display: none !important;\n}\n@media (max-width: 767px) {\n  .visible-xs {\n    display: block !important;\n  }\n  table.visible-xs {\n    display: table !important;\n  }\n  tr.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-xs,\n  td.visible-xs {\n    display: table-cell !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-block {\n    display: block !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-inline {\n    display: inline !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm {\n    display: block !important;\n  }\n  table.visible-sm {\n    display: table !important;\n  }\n  tr.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-sm,\n  td.visible-sm {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-block {\n    display: block !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md {\n    display: block !important;\n  }\n  table.visible-md {\n    display: table !important;\n  }\n  tr.visible-md {\n    display: table-row !important;\n  }\n  th.visible-md,\n  td.visible-md {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-block {\n    display: block !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg {\n    display: block !important;\n  }\n  table.visible-lg {\n    display: table !important;\n  }\n  tr.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-lg,\n  td.visible-lg {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-block {\n    display: block !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (max-width: 767px) {\n  .hidden-xs {\n    display: none !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-sm {\n    display: none !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-md {\n    display: none !important;\n  }\n}\n@media (min-width: 1200px) {\n  .hidden-lg {\n    display: none !important;\n  }\n}\n.visible-print {\n  display: none !important;\n}\n@media print {\n  .visible-print {\n    display: block !important;\n  }\n  table.visible-print {\n    display: table !important;\n  }\n  tr.visible-print {\n    display: table-row !important;\n  }\n  th.visible-print,\n  td.visible-print {\n    display: table-cell !important;\n  }\n}\n.visible-print-block {\n  display: none !important;\n}\n@media print {\n  .visible-print-block {\n    display: block !important;\n  }\n}\n.visible-print-inline {\n  display: none !important;\n}\n@media print {\n  .visible-print-inline {\n    display: inline !important;\n  }\n}\n.visible-print-inline-block {\n  display: none !important;\n}\n@media print {\n  .visible-print-inline-block {\n    display: inline-block !important;\n  }\n}\n@media print {\n  .hidden-print {\n    display: none !important;\n  }\n}\n/*# sourceMappingURL=bootstrap.css.map */\n"
  },
  {
    "path": "1.x/spring-boot-jpa-thymeleaf-curd/src/main/resources/templates/hello.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"UTF-8\"/>\n    <title>Hello Thymeleaf!</title>\n</head>\n<body>\n    <p th:text=\"'Hello, ' + ${name} + '!'\" />\n</body>\n</html>"
  },
  {
    "path": "1.x/spring-boot-jpa-thymeleaf-curd/src/main/resources/templates/user/list.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"UTF-8\"/>\n    <title>userList</title>\n    <link rel=\"stylesheet\" th:href=\"@{/css/bootstrap.css}\"></link>\n</head>\n<body class=\"container\">\n<br/>\n<h1>用户列表</h1>\n<br/><br/>\n<div class=\"with:80%\">\n    <table class=\"table table-hover\">\n        <thead>\n        <tr>\n            <th>#</th>\n            <th>User Name</th>\n            <th>Password</th>\n            <th>Age</th>\n            <th>Edit</th>\n            <th>Delete</th>\n        </tr>\n        </thead>\n        <tbody>\n        <tr  th:each=\"user : ${users}\">\n            <th scope=\"row\" th:text=\"${user.id}\">1</th>\n            <td th:text=\"${user.userName}\">neo</td>\n            <td th:text=\"${user.password}\">Otto</td>\n            <td th:text=\"${user.age}\">6</td>\n            <td><a th:href=\"@{/toEdit(id=${user.id})}\">edit</a></td>\n            <td><a th:href=\"@{/delete(id=${user.id})}\">delete</a></td>\n        </tr>\n        </tbody>\n    </table>\n</div>\n<div class=\"form-group\">\n    <div class=\"col-sm-2 control-label\">\n        <a href=\"/toAdd\" th:href=\"@{/toAdd}\" class=\"btn btn-info\">add</a>\n    </div>\n</div>\n\n</body>\n</html>"
  },
  {
    "path": "1.x/spring-boot-jpa-thymeleaf-curd/src/main/resources/templates/user/userAdd.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"UTF-8\"/>\n    <title>user</title>\n    <link rel=\"stylesheet\" th:href=\"@{/css/bootstrap.css}\"></link>\n</head>\n<body class=\"container\">\n<br/>\n<h1>添加用户</h1>\n<br/><br/>\n<div class=\"with:80%\">\n    <form class=\"form-horizontal\"   th:action=\"@{/add}\"  method=\"post\">\n        <div class=\"form-group\">\n            <label for=\"userName\" class=\"col-sm-2 control-label\">userName</label>\n            <div class=\"col-sm-10\">\n                <input type=\"text\" class=\"form-control\" name=\"userName\"  id=\"userName\" placeholder=\"userName\"/>\n            </div>\n        </div>\n        <div class=\"form-group\">\n            <label for=\"password\" class=\"col-sm-2 control-label\" >Password</label>\n            <div class=\"col-sm-10\">\n                <input type=\"password\" class=\"form-control\" name=\"password\" id=\"password\" placeholder=\"Password\"/>\n            </div>\n        </div>\n        <div class=\"form-group\">\n            <label for=\"age\" class=\"col-sm-2 control-label\">age</label>\n            <div class=\"col-sm-10\">\n                <input type=\"text\" class=\"form-control\" name=\"age\"  id=\"age\" placeholder=\"age\"/>\n            </div>\n        </div>\n        <div class=\"form-group\">\n            <div class=\"col-sm-offset-2 col-sm-10\">\n                <input type=\"submit\" value=\"Submit\" class=\"btn btn-info\" />\n                &nbsp; &nbsp; &nbsp;\n                <input type=\"reset\" value=\"Reset\" class=\"btn btn-info\" />\n            </div>\n\n        </div>\n    </form>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "1.x/spring-boot-jpa-thymeleaf-curd/src/main/resources/templates/user/userEdit.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"UTF-8\"/>\n    <title>user</title>\n    <link rel=\"stylesheet\" th:href=\"@{/css/bootstrap.css}\"></link>\n</head>\n<body class=\"container\">\n<br/>\n<h1>修改用户</h1>\n<br/><br/>\n<div class=\"with:80%\">\n    <form class=\"form-horizontal\"   th:action=\"@{/edit}\" th:object=\"${user}\"  method=\"post\">\n        <input type=\"hidden\" name=\"id\" th:value=\"*{id}\" />\n        <div class=\"form-group\">\n            <label for=\"userName\" class=\"col-sm-2 control-label\">userName</label>\n            <div class=\"col-sm-10\">\n                <input type=\"text\" class=\"form-control\" name=\"userName\"  id=\"userName\" th:value=\"*{userName}\" placeholder=\"userName\"/>\n            </div>\n        </div>\n        <div class=\"form-group\">\n            <label for=\"password\" class=\"col-sm-2 control-label\" >Password</label>\n            <div class=\"col-sm-10\">\n                <input type=\"password\" class=\"form-control\" name=\"password\" id=\"password\"  th:value=\"*{password}\" placeholder=\"Password\"/>\n            </div>\n        </div>\n        <div class=\"form-group\">\n            <label for=\"age\" class=\"col-sm-2 control-label\">age</label>\n            <div class=\"col-sm-10\">\n                <input type=\"text\" class=\"form-control\" name=\"age\"  id=\"age\" th:value=\"*{age}\" placeholder=\"age\"/>\n            </div>\n        </div>\n        <div class=\"form-group\">\n            <div class=\"col-sm-offset-2 col-sm-10\">\n                <input type=\"submit\" value=\"Submit\" class=\"btn btn-info\" />\n                &nbsp; &nbsp; &nbsp;\n                <a href=\"/toAdd\" th:href=\"@{/list}\" class=\"btn btn-info\">Back</a>\n            </div>\n\n        </div>\n    </form>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "1.x/spring-boot-mail/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-mail</artifactId>\n\t<version>1.0.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-mail</name>\n\t<description>Demo project for Spring Boot and mail</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>1.5.3.RELEASE</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-mail</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t     <dependency>\n\t        <groupId>org.springframework.boot</groupId>\n\t        <artifactId>spring-boot-devtools</artifactId>\n\t        <optional>true</optional>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-context-support</artifactId>\n\t\t\t<version>RELEASE</version>\n\t\t</dependency>\n        <dependency>\n            <groupId>com.sun.mail</groupId>\n            <artifactId>javax.mail</artifactId>\n            <version>RELEASE</version>\n        </dependency>\n\t\t<!-- 模板引擎 -->\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-thymeleaf</artifactId>\n\t\t</dependency>\n    </dependencies>\n\t\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t\t<configuration>\n\t                <fork>true</fork>\n\t            </configuration>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\t\n\n</project>\n"
  },
  {
    "path": "1.x/spring-boot-mail/src/main/java/com/neo/Application.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.scheduling.annotation.EnableScheduling;\n\n@SpringBootApplication\npublic class Application {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(Application.class, args);\n\t}\n}\n"
  },
  {
    "path": "1.x/spring-boot-mail/src/main/java/com/neo/service/MailService.java",
    "content": "package com.neo.service;\n\n/**\n * Created by summer on 2017/5/4.\n */\npublic interface MailService {\n\n    public void sendSimpleMail(String to, String subject, String content);\n\n    public void sendHtmlMail(String to, String subject, String content);\n\n    public void sendAttachmentsMail(String to, String subject, String content, String filePath);\n\n    public void sendInlineResourceMail(String to, String subject, String content, String rscPath, String rscId);\n\n}\n"
  },
  {
    "path": "1.x/spring-boot-mail/src/main/java/com/neo/service/impl/MailServiceImpl.java",
    "content": "package com.neo.service.impl;\n\nimport com.neo.service.MailService;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.core.io.FileSystemResource;\nimport org.springframework.mail.SimpleMailMessage;\nimport org.springframework.mail.javamail.JavaMailSender;\nimport org.springframework.mail.javamail.MimeMessageHelper;\nimport org.springframework.stereotype.Component;\n\nimport javax.mail.MessagingException;\nimport javax.mail.internet.MimeMessage;\nimport java.io.File;\n\n/**\n * Created by summer on 2017/5/4.\n */\n@Component\npublic class MailServiceImpl implements MailService{\n\n    private final Logger logger = LoggerFactory.getLogger(this.getClass());\n\n    @Autowired\n    private JavaMailSender mailSender;\n\n    @Value(\"${mail.fromMail.addr}\")\n    private String from;\n\n    /**\n     * 发送文本邮件\n     * @param to\n     * @param subject\n     * @param content\n     */\n    @Override\n    public void sendSimpleMail(String to, String subject, String content) {\n        SimpleMailMessage message = new SimpleMailMessage();\n        message.setFrom(from);\n        message.setTo(to);\n        message.setSubject(subject);\n        message.setText(content);\n\n        try {\n            mailSender.send(message);\n            logger.info(\"简单邮件已经发送。\");\n        } catch (Exception e) {\n            logger.error(\"发送简单邮件时发生异常！\", e);\n        }\n\n    }\n\n    /**\n     * 发送html邮件\n     * @param to\n     * @param subject\n     * @param content\n     */\n    @Override\n    public void sendHtmlMail(String to, String subject, String content) {\n        MimeMessage message = mailSender.createMimeMessage();\n\n        try {\n            //true表示需要创建一个multipart message\n            MimeMessageHelper helper = new MimeMessageHelper(message, true);\n            helper.setFrom(from);\n            helper.setTo(to);\n            helper.setSubject(subject);\n            helper.setText(content, true);\n\n            mailSender.send(message);\n            logger.info(\"html邮件发送成功\");\n        } catch (MessagingException e) {\n            logger.error(\"发送html邮件时发生异常！\", e);\n        }\n    }\n\n\n    /**\n     * 发送带附件的邮件\n     * @param to\n     * @param subject\n     * @param content\n     * @param filePath\n     */\n    public void sendAttachmentsMail(String to, String subject, String content, String filePath){\n        MimeMessage message = mailSender.createMimeMessage();\n\n        try {\n            MimeMessageHelper helper = new MimeMessageHelper(message, true);\n            helper.setFrom(from);\n            helper.setTo(to);\n            helper.setSubject(subject);\n            helper.setText(content, true);\n\n            FileSystemResource file = new FileSystemResource(new File(filePath));\n            String fileName = filePath.substring(filePath.lastIndexOf(File.separator));\n            helper.addAttachment(fileName, file);\n            //helper.addAttachment(\"test\"+fileName, file);\n\n            mailSender.send(message);\n            logger.info(\"带附件的邮件已经发送。\");\n        } catch (MessagingException e) {\n            logger.error(\"发送带附件的邮件时发生异常！\", e);\n        }\n    }\n\n\n    /**\n     * 发送正文中有静态资源（图片）的邮件\n     * @param to\n     * @param subject\n     * @param content\n     * @param rscPath\n     * @param rscId\n     */\n    public void sendInlineResourceMail(String to, String subject, String content, String rscPath, String rscId){\n        MimeMessage message = mailSender.createMimeMessage();\n\n        try {\n            MimeMessageHelper helper = new MimeMessageHelper(message, true);\n            helper.setFrom(from);\n            helper.setTo(to);\n            helper.setSubject(subject);\n            helper.setText(content, true);\n\n            FileSystemResource res = new FileSystemResource(new File(rscPath));\n            helper.addInline(rscId, res);\n\n            mailSender.send(message);\n            logger.info(\"嵌入静态资源的邮件已经发送。\");\n        } catch (MessagingException e) {\n            logger.error(\"发送嵌入静态资源的邮件时发生异常！\", e);\n        }\n    }\n}\n"
  },
  {
    "path": "1.x/spring-boot-mail/src/main/resources/application.properties",
    "content": "spring.application.name=spirng-boot-mail\n\nspring.mail.host=smtp.163.com\nspring.mail.username=xxoo@xxoo.com\nspring.mail.password=xxoo\nspring.mail.default-encoding=UTF-8\n\nmail.fromMail.addr=xxoo@xxoo.com\n\n"
  },
  {
    "path": "1.x/spring-boot-mail/src/main/resources/templates/emailTemplate.html",
    "content": "<!DOCTYPE html>\n<html lang=\"zh\" xmlns:th=\"http://www.thymeleaf.org\">\n    <head>\n        <meta charset=\"UTF-8\"/>\n        <title>Title</title>\n    </head>\n    <body>\n        您好,这是验证邮件,请点击下面的链接完成验证,<br/>\n        <a href=\"#\" th:href=\"@{ http://www.ityouknow.com/neo/{id}(id=${id}) }\">激活账号</a>\n    </body>\n</html>"
  },
  {
    "path": "1.x/spring-boot-mail/src/test/java/com/neo/ApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class ApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t\tSystem.out.println(\"hello world\");\n\t}\n\n}\n"
  },
  {
    "path": "1.x/spring-boot-mail/src/test/java/com/neo/service/MailServiceTest.java",
    "content": "package com.neo.service;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\nimport org.thymeleaf.TemplateEngine;\nimport org.thymeleaf.context.Context;\n\n/**\n * Created by summer on 2017/5/4.\n */\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class MailServiceTest {\n\n    @Autowired\n    private MailService mailService;\n\n    @Autowired\n    private TemplateEngine templateEngine;\n\n    @Test\n    public void testSimpleMail() throws Exception {\n        mailService.sendSimpleMail(\"ityouknow@126.com\",\"test simple mail\",\" hello this is simple mail\");\n    }\n\n    @Test\n    public void testHtmlMail() throws Exception {\n        String content=\"<html>\\n\" +\n                \"<body>\\n\" +\n                \"    <h3>hello world ! 这是一封html邮件!</h3>\\n\" +\n                \"</body>\\n\" +\n                \"</html>\";\n        mailService.sendHtmlMail(\"ityouknow@126.com\",\"test simple mail\",content);\n    }\n\n    @Test\n    public void sendAttachmentsMail() {\n        String filePath=\"e:\\\\tmp\\\\application.log\";\n        mailService.sendAttachmentsMail(\"ityouknow@126.com\", \"主题：带附件的邮件\", \"有附件，请查收！\", filePath);\n    }\n\n\n    @Test\n    public void sendInlineResourceMail() {\n        String rscId = \"neo006\";\n        String content=\"<html><body>这是有图片的邮件：<img src=\\'cid:\" + rscId + \"\\' ></body></html>\";\n        String imgPath = \"C:\\\\Users\\\\summer\\\\Pictures\\\\favicon.png\";\n\n        mailService.sendInlineResourceMail(\"ityouknow@126.com\", \"主题：这是有图片的邮件\", content, imgPath, rscId);\n    }\n\n\n    @Test\n    public void sendTemplateMail() {\n        //创建邮件正文\n        Context context = new Context();\n        context.setVariable(\"id\", \"006\");\n        String emailContent = templateEngine.process(\"emailTemplate\", context);\n\n        mailService.sendHtmlMail(\"ityouknow@126.com\",\"主题：这是模板邮件\",emailContent);\n    }\n}\n"
  },
  {
    "path": "1.x/spring-boot-mongodb/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-mongodb</artifactId>\n\t<version>1.0.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-mongodb</name>\n\t<description>Demo project for Spring Boot and mongodb</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>1.5.3.RELEASE</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t     <dependency>\n\t        <groupId>org.springframework.boot</groupId>\n\t        <artifactId>spring-boot-devtools</artifactId>\n\t        <optional>true</optional>\n\t\t</dependency>\n\t\t<dependency>\n\t\t   <groupId>org.springframework.boot</groupId>\n\t\t   <artifactId>spring-boot-starter-data-mongodb</artifactId>\n\t\t</dependency>\n    </dependencies>\n\t\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t\t<configuration>\n\t                <fork>true</fork>\n\t            </configuration>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\t\n\n</project>\n"
  },
  {
    "path": "1.x/spring-boot-mongodb/src/main/java/com/neo/Application.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.scheduling.annotation.EnableScheduling;\n\n@SpringBootApplication\npublic class Application {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(Application.class, args);\n\t}\n}\n"
  },
  {
    "path": "1.x/spring-boot-mongodb/src/main/java/com/neo/dao/UserDao.java",
    "content": "package com.neo.dao;\n\nimport com.neo.entity.UserEntity;\n\n/**\n * Created by summer on 2017/5/5.\n */\npublic interface UserDao  {\n\n    public void saveUser(UserEntity user);\n\n    public UserEntity findUserByUserName(String userName);\n\n    public int updateUser(UserEntity user);\n\n    public void deleteUserById(Long id);\n\n}\n"
  },
  {
    "path": "1.x/spring-boot-mongodb/src/main/java/com/neo/dao/impl/UserDaoImpl.java",
    "content": "package com.neo.dao.impl;\n\nimport com.mongodb.WriteResult;\nimport com.neo.dao.UserDao;\nimport com.neo.entity.UserEntity;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.autoconfigure.security.SecurityProperties;\nimport org.springframework.data.mongodb.core.MongoTemplate;\nimport org.springframework.data.mongodb.core.query.Criteria;\nimport org.springframework.data.mongodb.core.query.Query;\nimport org.springframework.data.mongodb.core.query.Update;\nimport org.springframework.stereotype.Component;\n\n/**\n * Created by summer on 2017/5/5.\n */\n@Component\npublic class UserDaoImpl implements UserDao {\n\n    @Autowired\n    private MongoTemplate mongoTemplate;\n\n    /**\n     * 创建对象\n     * @param user\n     */\n    @Override\n    public void saveUser(UserEntity user) {\n        mongoTemplate.save(user);\n    }\n\n    /**\n     * 根据用户名查询对象\n     * @param userName\n     * @return\n     */\n    @Override\n    public UserEntity findUserByUserName(String userName) {\n        Query query=new Query(Criteria.where(\"userName\").is(userName));\n        UserEntity user =  mongoTemplate.findOne(query , UserEntity.class);\n        return user;\n    }\n\n    /**\n     * 更新对象\n     * @param user\n     */\n    @Override\n    public int updateUser(UserEntity user) {\n        Query query=new Query(Criteria.where(\"id\").is(user.getId()));\n        Update update= new Update().set(\"userName\", user.getUserName()).set(\"passWord\", user.getPassWord());\n        //更新查询返回结果集的第一条\n        WriteResult result =mongoTemplate.updateFirst(query,update,UserEntity.class);\n        //更新查询返回结果集的所有\n        // mongoTemplate.updateMulti(query,update,UserEntity.class);\n        if(result!=null)\n            return result.getN();\n        else\n            return 0;\n    }\n\n    /**\n     * 删除对象\n     * @param id\n     */\n    @Override\n    public void deleteUserById(Long id) {\n        Query query=new Query(Criteria.where(\"id\").is(id));\n        mongoTemplate.remove(query,UserEntity.class);\n    }\n}\n"
  },
  {
    "path": "1.x/spring-boot-mongodb/src/main/java/com/neo/entity/UserEntity.java",
    "content": "package com.neo.entity;\n\nimport java.io.Serializable;\n\n/**\n * Created by summer on 2017/5/5.\n */\npublic class UserEntity implements Serializable {\n        private static final long serialVersionUID = -3258839839160856613L;\n        private Long id;\n        private String userName;\n        private String passWord;\n\n        public Long getId() {\n                return id;\n        }\n\n        public void setId(Long id) {\n                this.id = id;\n        }\n\n        public String getUserName() {\n                return userName;\n        }\n\n        public void setUserName(String userName) {\n                this.userName = userName;\n        }\n\n        public String getPassWord() {\n                return passWord;\n        }\n\n        public void setPassWord(String passWord) {\n                this.passWord = passWord;\n        }\n\n        @Override\n        public String toString() {\n                return \"UserEntity{\" +\n                        \"id=\" + id +\n                        \", userName='\" + userName + '\\'' +\n                        \", passWord='\" + passWord + '\\'' +\n                        '}';\n        }\n}\n"
  },
  {
    "path": "1.x/spring-boot-mongodb/src/main/resources/application.properties",
    "content": "spring.application.name=spirng-boot-mongodb\n\nspring.data.mongodb.uri=mongodb://192.168.9.61:20000/test\n\n\n"
  },
  {
    "path": "1.x/spring-boot-mongodb/src/test/java/com/neo/ApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class ApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t\tSystem.out.println(\"hello world\");\n\t}\n\n}\n"
  },
  {
    "path": "1.x/spring-boot-mongodb/src/test/java/com/neo/dao/UserDaoTest.java",
    "content": "package com.neo.dao;\n\nimport com.neo.entity.UserEntity;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n/**\n * Created by summer on 2017/5/5.\n */\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class UserDaoTest {\n\n    @Autowired\n    private UserDao userDao;\n\n    @Test\n    public void testSaveUser() throws Exception {\n        UserEntity user=new UserEntity();\n        user.setId(2l);\n        user.setUserName(\"小明\");\n        user.setPassWord(\"fffooo123\");\n        userDao.saveUser(user);\n    }\n\n    @Test\n    public void findUserByUserName(){\n       UserEntity user= userDao.findUserByUserName(\"小明\");\n       System.out.println(\"user is \"+user);\n    }\n\n    @Test\n    public void updateUser(){\n        UserEntity user=new UserEntity();\n        user.setId(2l);\n        user.setUserName(\"天空\");\n        user.setPassWord(\"fffxxxx\");\n        userDao.updateUser(user);\n    }\n\n    @Test\n    public void deleteUserById(){\n        userDao.deleteUserById(1l);\n    }\n\n}\n"
  },
  {
    "path": "1.x/spring-boot-multi-mongodb/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-multi-mongodb</artifactId>\n\t<version>1.0.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-multi-mongodb</name>\n\t<description>Demo project for Spring Boot and multi mongodb</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>1.5.3.RELEASE</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-data-mongodb</artifactId>\n        </dependency>\n\t\t<dependency>\n            <groupId>org.projectlombok</groupId>\n            <artifactId>lombok</artifactId>\n        </dependency>\n\t\t<dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-autoconfigure</artifactId>\n            <version>RELEASE</version>\n        </dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t</dependencies>\n\t\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t\t<configuration>\n\t                <fork>true</fork>\n\t            </configuration>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\t\n\n</project>\n"
  },
  {
    "path": "1.x/spring-boot-multi-mongodb/src/main/java/com/neo/Application.java",
    "content": "package com.neo;\n\nimport com.neo.config.props.MultipleMongoProperties;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.EnableAutoConfiguration;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;\nimport org.springframework.boot.context.properties.EnableConfigurationProperties;\nimport org.springframework.scheduling.annotation.EnableScheduling;\n\n@EnableConfigurationProperties(MultipleMongoProperties.class)\n@SpringBootApplication(exclude = MongoAutoConfiguration.class)\npublic class Application {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(Application.class, args);\n\t}\n}\n"
  },
  {
    "path": "1.x/spring-boot-multi-mongodb/src/main/java/com/neo/config/MultipleMongoConfig.java",
    "content": "package com.neo.config;\n\nimport com.mongodb.MongoClient;\nimport com.neo.config.props.MultipleMongoProperties;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.boot.autoconfigure.mongo.MongoProperties;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.context.annotation.Primary;\nimport org.springframework.data.mongodb.MongoDbFactory;\nimport org.springframework.data.mongodb.core.MongoTemplate;\nimport org.springframework.data.mongodb.core.SimpleMongoDbFactory;\n\n/**\n * @author neo\n */\n@Configuration\npublic class MultipleMongoConfig {\n\n\t@Autowired\n\tprivate MultipleMongoProperties mongoProperties;\n\n\t@Primary\n\t@Bean(name = PrimaryMongoConfig.MONGO_TEMPLATE)\n\tpublic MongoTemplate primaryMongoTemplate() throws Exception {\n\t\treturn new MongoTemplate(primaryFactory(this.mongoProperties.getPrimary()));\n\t}\n\n\t@Bean\n\t@Qualifier(SecondaryMongoConfig.MONGO_TEMPLATE)\n\tpublic MongoTemplate secondaryMongoTemplate() throws Exception {\n        return new MongoTemplate(secondaryFactory(this.mongoProperties.getSecondary()));\n\t}\n\n\t@Bean\n    @Primary\n\tpublic MongoDbFactory primaryFactory(MongoProperties mongo) throws Exception {\n\t\treturn new SimpleMongoDbFactory(new MongoClient(mongo.getHost(), mongo.getPort()),\n\t\t\t\tmongo.getDatabase());\n\t}\n\n\t@Bean\n\tpublic MongoDbFactory secondaryFactory(MongoProperties mongo) throws Exception {\n\t\treturn new SimpleMongoDbFactory(new MongoClient(mongo.getHost(), mongo.getPort()),\n\t\t\t\tmongo.getDatabase());\n\t}\n}\n"
  },
  {
    "path": "1.x/spring-boot-multi-mongodb/src/main/java/com/neo/config/PrimaryMongoConfig.java",
    "content": "package com.neo.config;\n\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.data.mongodb.repository.config.EnableMongoRepositories;\n\n/**\n * @author neo\n */\n@Configuration\n@EnableMongoRepositories(basePackages = \"com.neo.model.repository.primary\",\n\t\tmongoTemplateRef = PrimaryMongoConfig.MONGO_TEMPLATE)\npublic class PrimaryMongoConfig {\n\n\tprotected static final String MONGO_TEMPLATE = \"primaryMongoTemplate\";\n}\n"
  },
  {
    "path": "1.x/spring-boot-multi-mongodb/src/main/java/com/neo/config/SecondaryMongoConfig.java",
    "content": "package com.neo.config;\n\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.data.mongodb.repository.config.EnableMongoRepositories;\n\n/**\n * @author neo\n */\n@Configuration\n@EnableMongoRepositories(basePackages = \"com.neo.model.repository.secondary\",\n\t\tmongoTemplateRef = SecondaryMongoConfig.MONGO_TEMPLATE)\npublic class SecondaryMongoConfig {\n\n\tprotected static final String MONGO_TEMPLATE = \"secondaryMongoTemplate\";\n}\n"
  },
  {
    "path": "1.x/spring-boot-multi-mongodb/src/main/java/com/neo/config/props/MultipleMongoProperties.java",
    "content": "package com.neo.config.props;\n\nimport lombok.Data;\nimport org.springframework.boot.autoconfigure.mongo.MongoProperties;\nimport org.springframework.boot.context.properties.ConfigurationProperties;\n\n/**\n * @author neo\n */\n@Data\n@ConfigurationProperties(prefix = \"mongodb\")\npublic class MultipleMongoProperties {\n\n\tprivate MongoProperties primary = new MongoProperties();\n\tprivate MongoProperties secondary = new MongoProperties();\n}\n"
  },
  {
    "path": "1.x/spring-boot-multi-mongodb/src/main/java/com/neo/model/repository/primary/PrimaryMongoObject.java",
    "content": "package com.neo.model.repository.primary;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\nimport org.springframework.data.annotation.Id;\nimport org.springframework.data.mongodb.core.mapping.Document;\n\n/**\n * @author neo\n */\n@Data\n@AllArgsConstructor\n@NoArgsConstructor\n@Document(collection = \"first_mongo\")\npublic class PrimaryMongoObject {\n\n\t@Id\n\tprivate String id;\n\n\tprivate String value;\n\n\t@Override\n\tpublic String toString() {\n        return \"PrimaryMongoObject{\" + \"id='\" + id + '\\'' + \", value='\" + value + '\\''\n\t\t\t\t+ '}';\n\t}\n}\n"
  },
  {
    "path": "1.x/spring-boot-multi-mongodb/src/main/java/com/neo/model/repository/primary/PrimaryRepository.java",
    "content": "package com.neo.model.repository.primary;\n\nimport org.springframework.data.mongodb.repository.MongoRepository;\n\n/**\n * @author neo\n */\npublic interface PrimaryRepository extends MongoRepository<PrimaryMongoObject, String> {\n}\n"
  },
  {
    "path": "1.x/spring-boot-multi-mongodb/src/main/java/com/neo/model/repository/secondary/SecondaryMongoObject.java",
    "content": "package com.neo.model.repository.secondary;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\nimport org.springframework.data.annotation.Id;\nimport org.springframework.data.mongodb.core.mapping.Document;\n\n/**\n * @author neo\n */\n@Data\n@AllArgsConstructor\n@NoArgsConstructor\n@Document(collection = \"second_mongo\")\npublic class SecondaryMongoObject {\n\n\t@Id\n\tprivate String id;\n\n\tprivate String value;\n\n\n\t@Override\n\tpublic String toString() {\n        return \"SecondaryMongoObject{\" + \"id='\" + id + '\\'' + \", value='\" + value + '\\''\n\t\t\t\t+ '}';\n\t}\n}\n"
  },
  {
    "path": "1.x/spring-boot-multi-mongodb/src/main/java/com/neo/model/repository/secondary/SecondaryRepository.java",
    "content": "package com.neo.model.repository.secondary;\n\nimport org.springframework.data.mongodb.repository.MongoRepository;\n\n/**\n * @author neo\n */\npublic interface SecondaryRepository extends MongoRepository<SecondaryMongoObject, String> {\n}\n"
  },
  {
    "path": "1.x/spring-boot-multi-mongodb/src/main/resources/application.yml",
    "content": "mongodb:\n  primary:\n    host: 192.168.9.60\n    port: 20000\n    database: test\n  secondary:\n    host: 192.168.9.61\n    port: 20000\n    database: test1"
  },
  {
    "path": "1.x/spring-boot-multi-mongodb/src/test/java/com/neo/ApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class ApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t\tSystem.out.println(\"hello world\");\n\t}\n\n}\n"
  },
  {
    "path": "1.x/spring-boot-multi-mongodb/src/test/java/com/neo/model/repository/MuliDatabaseTest.java",
    "content": "package com.neo.model.repository;\n\nimport com.neo.model.repository.primary.PrimaryMongoObject;\nimport com.neo.model.repository.primary.PrimaryRepository;\nimport com.neo.model.repository.secondary.SecondaryMongoObject;\nimport com.neo.model.repository.secondary.SecondaryRepository;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport java.util.List;\n\n/**\n * Created by neo on 2017/5/6.\n */\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class MuliDatabaseTest {\n\n    @Autowired\n    private PrimaryRepository primaryRepository;\n\n    @Autowired\n    private SecondaryRepository secondaryRepository;\n\n    @Test\n    public void TestSave() {\n\n        System.out.println(\"************************************************************\");\n        System.out.println(\"测试开始\");\n        System.out.println(\"************************************************************\");\n\n        this.primaryRepository\n                .save(new PrimaryMongoObject(null, \"第一个库的对象\"));\n\n        this.secondaryRepository\n                .save(new SecondaryMongoObject(null, \"第二个库的对象\"));\n\n        List<PrimaryMongoObject> primaries = this.primaryRepository.findAll();\n        for (PrimaryMongoObject primary : primaries) {\n            System.out.println(primary.toString());\n        }\n\n        List<SecondaryMongoObject> secondaries = this.secondaryRepository.findAll();\n\n        for (SecondaryMongoObject secondary : secondaries) {\n            System.out.println(secondary.toString());\n        }\n\n        System.out.println(\"************************************************************\");\n        System.out.println(\"测试完成\");\n        System.out.println(\"************************************************************\");\n    }\n\n}\n"
  },
  {
    "path": "1.x/spring-boot-mybatis-annotation/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-mybatis-annotation</artifactId>\n\t<version>1.0.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-mybatis-annotation</name>\n\t<description>Demo project for Spring Boot and mybatis</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>1.4.1.RELEASE</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t\t<dependency>\n\t        <groupId>org.springframework.boot</groupId>\n\t        <artifactId>spring-boot-starter-web</artifactId>\n\t    </dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.mybatis.spring.boot</groupId>\n\t\t\t<artifactId>mybatis-spring-boot-starter</artifactId>\n\t\t\t<version>1.1.1</version>\n\t\t</dependency>\n\t     <dependency>\n\t        <groupId>mysql</groupId>\n\t        <artifactId>mysql-connector-java</artifactId>\n\t    </dependency>\n\t     <dependency>\n\t        <groupId>org.springframework.boot</groupId>\n\t        <artifactId>spring-boot-devtools</artifactId>\n\t        <optional>true</optional>\n\t\t</dependency>\n\t</dependencies>\n\t\n\t<build>\n\t  <resources>\n            <resource>\n                <directory>src/main/resources</directory>\n                <filtering>true</filtering>\n                <excludes>\n\t\t\t\t\t<exclude>bootstrap-test.properties</exclude>\n                    <exclude>bootstrap-dev.properties</exclude>\n                    <exclude>bootstrap-pro.properties</exclude>\n                    <exclude>bootstrap.properties</exclude>\n                </excludes>\n            </resource>\n            <resource>\n                <directory>src/main/resources</directory>\n                <filtering>true</filtering>\n                <includes>\n                    <include>bootstrap-${env}.properties</include>\n                    <include>bootstrap.properties</include>\n                </includes>\n            </resource>\n        </resources>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t\t<configuration>\n\t                <fork>true</fork>\n\t            </configuration>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\t\n\n</project>\n"
  },
  {
    "path": "1.x/spring-boot-mybatis-annotation/src/main/java/com/neo/Application.java",
    "content": "package com.neo;\n\nimport org.mybatis.spring.annotation.MapperScan;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\n@MapperScan(\"com.neo.mapper\")\npublic class Application {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(Application.class, args);\n\t}\n}\n"
  },
  {
    "path": "1.x/spring-boot-mybatis-annotation/src/main/java/com/neo/entity/UserEntity.java",
    "content": "package com.neo.entity;\n\nimport java.io.Serializable;\n\nimport com.neo.enums.UserSexEnum;\n\npublic class UserEntity implements Serializable {\n\n\tprivate static final long serialVersionUID = 1L;\n\tprivate Long id;\n\tprivate String userName;\n\tprivate String passWord;\n\tprivate UserSexEnum userSex;\n\tprivate String nickName;\n\n\tpublic UserEntity() {\n\t\tsuper();\n\t}\n\n\tpublic UserEntity(String userName, String passWord, UserSexEnum userSex) {\n\t\tsuper();\n\t\tthis.passWord = passWord;\n\t\tthis.userName = userName;\n\t\tthis.userSex = userSex;\n\t}\n\n\tpublic Long getId() {\n\t\treturn id;\n\t}\n\n\tpublic void setId(Long id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic String getUserName() {\n\t\treturn userName;\n\t}\n\n\tpublic void setUserName(String userName) {\n\t\tthis.userName = userName;\n\t}\n\n\tpublic String getPassWord() {\n\t\treturn passWord;\n\t}\n\n\tpublic void setPassWord(String passWord) {\n\t\tthis.passWord = passWord;\n\t}\n\n\tpublic UserSexEnum getUserSex() {\n\t\treturn userSex;\n\t}\n\n\tpublic void setUserSex(UserSexEnum userSex) {\n\t\tthis.userSex = userSex;\n\t}\n\n\tpublic String getNickName() {\n\t\treturn nickName;\n\t}\n\n\tpublic void setNickName(String nickName) {\n\t\tthis.nickName = nickName;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\t// TODO Auto-generated method stub\n\t\treturn \"userName \" + this.userName + \", pasword \" + this.passWord + \"sex \" + userSex.name();\n\t}\n\n}"
  },
  {
    "path": "1.x/spring-boot-mybatis-annotation/src/main/java/com/neo/enums/UserSexEnum.java",
    "content": "package com.neo.enums;\n\npublic enum UserSexEnum {\n\tMAN, WOMAN\n}\n"
  },
  {
    "path": "1.x/spring-boot-mybatis-annotation/src/main/java/com/neo/mapper/UserMapper.java",
    "content": "package com.neo.mapper;\n\nimport java.util.List;\n\nimport org.apache.ibatis.annotations.Delete;\nimport org.apache.ibatis.annotations.Insert;\nimport org.apache.ibatis.annotations.Result;\nimport org.apache.ibatis.annotations.Results;\nimport org.apache.ibatis.annotations.Select;\nimport org.apache.ibatis.annotations.Update;\n\nimport com.neo.entity.UserEntity;\nimport com.neo.enums.UserSexEnum;\n\npublic interface UserMapper {\n\t\n\t@Select(\"SELECT * FROM users\")\n\t@Results({\n\t\t@Result(property = \"userSex\",  column = \"user_sex\", javaType = UserSexEnum.class),\n\t\t@Result(property = \"nickName\", column = \"nick_name\")\n\t})\n\tList<UserEntity> getAll();\n\t\n\t@Select(\"SELECT * FROM users WHERE id = #{id}\")\n\t@Results({\n\t\t@Result(property = \"userSex\",  column = \"user_sex\", javaType = UserSexEnum.class),\n\t\t@Result(property = \"nickName\", column = \"nick_name\")\n\t})\n\tUserEntity getOne(Long id);\n\n\t@Insert(\"INSERT INTO users(userName,passWord,user_sex) VALUES(#{userName}, #{passWord}, #{userSex})\")\n\tvoid insert(UserEntity user);\n\n\t@Update(\"UPDATE users SET userName=#{userName},nick_name=#{nickName} WHERE id =#{id}\")\n\tvoid update(UserEntity user);\n\n\t@Delete(\"DELETE FROM users WHERE id =#{id}\")\n\tvoid delete(Long id);\n\n}"
  },
  {
    "path": "1.x/spring-boot-mybatis-annotation/src/main/java/com/neo/web/UserController.java",
    "content": "package com.neo.web;\n\nimport java.util.List;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport com.neo.entity.UserEntity;\nimport com.neo.mapper.UserMapper;\n\n@RestController\npublic class UserController {\n\t\n\t@Autowired\n\tprivate UserMapper userMapper;\n\t\n\t@RequestMapping(\"/getUsers\")\n\tpublic List<UserEntity> getUsers() {\n\t\tList<UserEntity> users=userMapper.getAll();\n\t\treturn users;\n\t}\n\t\n    @RequestMapping(\"/getUser\")\n    public UserEntity getUser(Long id) {\n    \tUserEntity user=userMapper.getOne(id);\n        return user;\n    }\n    \n    @RequestMapping(\"/add\")\n    public void save(UserEntity user) {\n    \tuserMapper.insert(user);\n    }\n    \n    @RequestMapping(value=\"update\")\n    public void update(UserEntity user) {\n    \tuserMapper.update(user);\n    }\n    \n    @RequestMapping(value=\"/delete/{id}\")\n    public void delete(@PathVariable(\"id\") Long id) {\n    \tuserMapper.delete(id);\n    }\n    \n    \n}"
  },
  {
    "path": "1.x/spring-boot-mybatis-annotation/src/main/resources/application.properties",
    "content": "mybatis.type-aliases-package=com.neo.entity\n\nspring.datasource.driverClassName = com.mysql.jdbc.Driver\nspring.datasource.url = jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf-8\nspring.datasource.username = root\nspring.datasource.password = root\n"
  },
  {
    "path": "1.x/spring-boot-mybatis-annotation/src/test/java/com/neo/ApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class ApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t\tSystem.out.println(\"hello world\");\n\t}\n\n}\n"
  },
  {
    "path": "1.x/spring-boot-mybatis-annotation/src/test/java/com/neo/mapper/UserMapperTest.java",
    "content": "package com.neo.mapper;\n\nimport java.util.List;\n\nimport org.junit.Assert;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport com.neo.entity.UserEntity;\nimport com.neo.enums.UserSexEnum;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class UserMapperTest {\n\n\t@Autowired\n\tprivate UserMapper UserMapper;\n\n\t@Test\n\tpublic void testInsert() throws Exception {\n\t\tUserMapper.insert(new UserEntity(\"aa\", \"a123456\", UserSexEnum.MAN));\n\t\tUserMapper.insert(new UserEntity(\"bb\", \"b123456\", UserSexEnum.WOMAN));\n\t\tUserMapper.insert(new UserEntity(\"cc\", \"b123456\", UserSexEnum.WOMAN));\n\n\t\tAssert.assertEquals(3, UserMapper.getAll().size());\n\t}\n\n\t@Test\n\tpublic void testQuery() throws Exception {\n\t\tList<UserEntity> users = UserMapper.getAll();\n\t\tSystem.out.println(users.toString());\n\t}\n\t\n\t\n\t@Test\n\tpublic void testUpdate() throws Exception {\n\t\tUserEntity user = UserMapper.getOne(3l);\n\t\tSystem.out.println(user.toString());\n\t\tuser.setNickName(\"neo\");\n\t\tUserMapper.update(user);\n\t\tAssert.assertTrue((\"neo\".equals(UserMapper.getOne(3l).getNickName())));\n\t}\n\n}"
  },
  {
    "path": "1.x/spring-boot-mybatis-annotation/users.sql",
    "content": "/*\nNavicat MySQL Data Transfer\n\nSource Server         : 本地\nSource Server Version : 50505\nSource Host           : localhost:3306\nSource Database       : test1\n\nTarget Server Type    : MYSQL\nTarget Server Version : 50505\nFile Encoding         : 65001\n\nDate: 2016-11-05 21:17:33\n*/\n\nSET FOREIGN_KEY_CHECKS=0;\n\n-- ----------------------------\n-- Table structure for `users`\n-- ----------------------------\nDROP TABLE IF EXISTS `users`;\nCREATE TABLE `users` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',\n  `userName` varchar(32) DEFAULT NULL COMMENT '用户名',\n  `passWord` varchar(32) DEFAULT NULL COMMENT '密码',\n  `user_sex` varchar(32) DEFAULT NULL,\n  `nick_name` varchar(32) DEFAULT NULL,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8;\n\n"
  },
  {
    "path": "1.x/spring-boot-mybatis-annotation-mulidatasource/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-mybatis-annotation-mulidatasource</artifactId>\n\t<version>1.0.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-mybatis-annotation-mulidatasource</name>\n\t<description>Demo project for Spring Boot and mybatis with annotation</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>1.4.2.RELEASE</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t\t<dependency>\n\t        <groupId>org.springframework.boot</groupId>\n\t        <artifactId>spring-boot-starter-web</artifactId>\n\t    </dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.mybatis.spring.boot</groupId>\n\t\t\t<artifactId>mybatis-spring-boot-starter</artifactId>\n\t\t\t<version>1.1.1</version>\n\t\t</dependency>\n\t     <dependency>\n\t        <groupId>mysql</groupId>\n\t        <artifactId>mysql-connector-java</artifactId>\n\t    </dependency>\n\t     <dependency>\n\t        <groupId>org.springframework.boot</groupId>\n\t        <artifactId>spring-boot-devtools</artifactId>\n\t        <optional>true</optional>\n\t\t</dependency>\n\t</dependencies>\n\t\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t\t<configuration>\n\t                <fork>true</fork>\n\t            </configuration>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\t\n\n</project>\n"
  },
  {
    "path": "1.x/spring-boot-mybatis-annotation-mulidatasource/src/main/java/com/neo/Application.java",
    "content": "package com.neo;\n\nimport org.mybatis.spring.annotation.MapperScan;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class Application {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(Application.class, args);\n\t}\n}\n"
  },
  {
    "path": "1.x/spring-boot-mybatis-annotation-mulidatasource/src/main/java/com/neo/datasource/DataSource1Config.java",
    "content": "package com.neo.datasource;\n\nimport org.apache.ibatis.session.SqlSessionFactory;\nimport org.mybatis.spring.SqlSessionFactoryBean;\nimport org.mybatis.spring.SqlSessionTemplate;\nimport org.mybatis.spring.annotation.MapperScan;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;\nimport org.springframework.boot.context.properties.ConfigurationProperties;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.context.annotation.Primary;\nimport org.springframework.core.io.support.PathMatchingResourcePatternResolver;\nimport org.springframework.jdbc.datasource.DataSourceTransactionManager;\n\nimport javax.sql.DataSource;\n\n/**\n * Created by summer on 2016/11/25.\n */\n@Configuration\n@MapperScan(basePackages = \"com.neo.mapper.test1\", sqlSessionTemplateRef  = \"test1SqlSessionTemplate\")\npublic class DataSource1Config {\n\n    @Bean(name = \"test1DataSource\")\n    @ConfigurationProperties(prefix = \"spring.datasource.test1\")\n    @Primary\n    public DataSource testDataSource() {\n        return DataSourceBuilder.create().build();\n    }\n\n    @Bean(name = \"test1SqlSessionFactory\")\n    @Primary\n    public SqlSessionFactory testSqlSessionFactory(@Qualifier(\"test1DataSource\") DataSource dataSource) throws Exception {\n        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();\n        bean.setDataSource(dataSource);\n        return bean.getObject();\n    }\n\n    @Bean(name = \"test1TransactionManager\")\n    @Primary\n    public DataSourceTransactionManager testTransactionManager(@Qualifier(\"test1DataSource\") DataSource dataSource) {\n        return new DataSourceTransactionManager(dataSource);\n    }\n\n    @Bean(name = \"test1SqlSessionTemplate\")\n    @Primary\n    public SqlSessionTemplate testSqlSessionTemplate(@Qualifier(\"test1SqlSessionFactory\") SqlSessionFactory sqlSessionFactory) throws Exception {\n        return new SqlSessionTemplate(sqlSessionFactory);\n    }\n\n}\n"
  },
  {
    "path": "1.x/spring-boot-mybatis-annotation-mulidatasource/src/main/java/com/neo/datasource/DataSource2Config.java",
    "content": "package com.neo.datasource;\n\nimport org.apache.ibatis.session.SqlSessionFactory;\nimport org.mybatis.spring.SqlSessionFactoryBean;\nimport org.mybatis.spring.SqlSessionTemplate;\nimport org.mybatis.spring.annotation.MapperScan;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;\nimport org.springframework.boot.context.properties.ConfigurationProperties;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.core.io.support.PathMatchingResourcePatternResolver;\nimport org.springframework.jdbc.datasource.DataSourceTransactionManager;\n\nimport javax.sql.DataSource;\n\n/**\n * Created by summer on 2016/11/25.\n */\n@Configuration\n@MapperScan(basePackages = \"com.neo.mapper.test2\", sqlSessionTemplateRef  = \"test2SqlSessionTemplate\")\npublic class DataSource2Config {\n\n    @Bean(name = \"test2DataSource\")\n    @ConfigurationProperties(prefix = \"spring.datasource.test2\")\n    public DataSource testDataSource() {\n        return DataSourceBuilder.create().build();\n    }\n\n    @Bean(name = \"test2SqlSessionFactory\")\n    public SqlSessionFactory testSqlSessionFactory(@Qualifier(\"test2DataSource\") DataSource dataSource) throws Exception {\n        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();\n        bean.setDataSource(dataSource);\n        return bean.getObject();\n    }\n\n    @Bean(name = \"test2TransactionManager\")\n    public DataSourceTransactionManager testTransactionManager(@Qualifier(\"test2DataSource\") DataSource dataSource) {\n        return new DataSourceTransactionManager(dataSource);\n    }\n\n    @Bean(name = \"test2SqlSessionTemplate\")\n    public SqlSessionTemplate testSqlSessionTemplate(@Qualifier(\"test2SqlSessionFactory\") SqlSessionFactory sqlSessionFactory) throws Exception {\n        return new SqlSessionTemplate(sqlSessionFactory);\n    }\n\n}\n"
  },
  {
    "path": "1.x/spring-boot-mybatis-annotation-mulidatasource/src/main/java/com/neo/entity/UserEntity.java",
    "content": "package com.neo.entity;\n\nimport java.io.Serializable;\n\nimport com.neo.enums.UserSexEnum;\n\npublic class UserEntity implements Serializable {\n\n\tprivate static final long serialVersionUID = 1L;\n\tprivate Long id;\n\tprivate String userName;\n\tprivate String passWord;\n\tprivate UserSexEnum userSex;\n\tprivate String nickName;\n\n\tpublic UserEntity() {\n\t\tsuper();\n\t}\n\n\tpublic UserEntity(String userName, String passWord, UserSexEnum userSex) {\n\t\tsuper();\n\t\tthis.passWord = passWord;\n\t\tthis.userName = userName;\n\t\tthis.userSex = userSex;\n\t}\n\n\tpublic Long getId() {\n\t\treturn id;\n\t}\n\n\tpublic void setId(Long id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic String getUserName() {\n\t\treturn userName;\n\t}\n\n\tpublic void setUserName(String userName) {\n\t\tthis.userName = userName;\n\t}\n\n\tpublic String getPassWord() {\n\t\treturn passWord;\n\t}\n\n\tpublic void setPassWord(String passWord) {\n\t\tthis.passWord = passWord;\n\t}\n\n\tpublic UserSexEnum getUserSex() {\n\t\treturn userSex;\n\t}\n\n\tpublic void setUserSex(UserSexEnum userSex) {\n\t\tthis.userSex = userSex;\n\t}\n\n\tpublic String getNickName() {\n\t\treturn nickName;\n\t}\n\n\tpublic void setNickName(String nickName) {\n\t\tthis.nickName = nickName;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\t// TODO Auto-generated method stub\n\t\treturn \"userName \" + this.userName + \", pasword \" + this.passWord + \"sex \" + userSex.name();\n\t}\n\n}"
  },
  {
    "path": "1.x/spring-boot-mybatis-annotation-mulidatasource/src/main/java/com/neo/enums/UserSexEnum.java",
    "content": "package com.neo.enums;\n\npublic enum UserSexEnum {\n\tMAN, WOMAN\n}\n"
  },
  {
    "path": "1.x/spring-boot-mybatis-annotation-mulidatasource/src/main/java/com/neo/mapper/test1/User1Mapper.java",
    "content": "package com.neo.mapper.test1;\n\nimport com.neo.entity.UserEntity;\nimport com.neo.enums.UserSexEnum;\nimport org.apache.ibatis.annotations.*;\n\nimport java.util.List;\n\npublic interface User1Mapper {\n\n\n\t@Select(\"SELECT * FROM users\")\n\t@Results({\n\t\t\t@Result(property = \"userSex\",  column = \"user_sex\", javaType = UserSexEnum.class),\n\t\t\t@Result(property = \"nickName\", column = \"nick_name\")\n\t})\n\tList<UserEntity> getAll();\n\n\t@Select(\"SELECT * FROM users WHERE id = #{id}\")\n\t@Results({\n\t\t\t@Result(property = \"userSex\",  column = \"user_sex\", javaType = UserSexEnum.class),\n\t\t\t@Result(property = \"nickName\", column = \"nick_name\")\n\t})\n\tUserEntity getOne(Long id);\n\n\t@Insert(\"INSERT INTO users(userName,passWord,user_sex) VALUES(#{userName}, #{passWord}, #{userSex})\")\n\tvoid insert(UserEntity user);\n\n\t@Update(\"UPDATE users SET userName=#{userName},nick_name=#{nickName} WHERE id =#{id}\")\n\tvoid update(UserEntity user);\n\n\t@Delete(\"DELETE FROM users WHERE id =#{id}\")\n\tvoid delete(Long id);\n\n}"
  },
  {
    "path": "1.x/spring-boot-mybatis-annotation-mulidatasource/src/main/java/com/neo/mapper/test2/User2Mapper.java",
    "content": "package com.neo.mapper.test2;\n\nimport java.util.List;\n\nimport com.neo.entity.UserEntity;\nimport com.neo.enums.UserSexEnum;\nimport org.apache.ibatis.annotations.*;\n\npublic interface User2Mapper {\n\n\n\t@Select(\"SELECT * FROM users\")\n\t@Results({\n\t\t\t@Result(property = \"userSex\",  column = \"user_sex\", javaType = UserSexEnum.class),\n\t\t\t@Result(property = \"nickName\", column = \"nick_name\")\n\t})\n\tList<UserEntity> getAll();\n\n\t@Select(\"SELECT * FROM users WHERE id = #{id}\")\n\t@Results({\n\t\t\t@Result(property = \"userSex\",  column = \"user_sex\", javaType = UserSexEnum.class),\n\t\t\t@Result(property = \"nickName\", column = \"nick_name\")\n\t})\n\tUserEntity getOne(Long id);\n\n\t@Insert(\"INSERT INTO users(userName,passWord,user_sex) VALUES(#{userName}, #{passWord}, #{userSex})\")\n\tvoid insert(UserEntity user);\n\n\t@Update(\"UPDATE users SET userName=#{userName},nick_name=#{nickName} WHERE id =#{id}\")\n\tvoid update(UserEntity user);\n\n\t@Delete(\"DELETE FROM users WHERE id =#{id}\")\n\tvoid delete(Long id);\n\n}"
  },
  {
    "path": "1.x/spring-boot-mybatis-annotation-mulidatasource/src/main/java/com/neo/web/UserController.java",
    "content": "package com.neo.web;\n\nimport java.util.List;\n\nimport com.neo.mapper.test1.User1Mapper;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport com.neo.entity.UserEntity;\nimport com.neo.mapper.test2.User2Mapper;\n\n@RestController\npublic class UserController {\n\n    @Autowired\n    private User1Mapper user1Mapper;\n\n\t@Autowired\n\tprivate User2Mapper user2Mapper;\n\t\n\t@RequestMapping(\"/getUsers\")\n\tpublic List<UserEntity> getUsers() {\n\t\tList<UserEntity> users=user1Mapper.getAll();\n\t\treturn users;\n\t}\n\t\n    @RequestMapping(\"/getUser\")\n    public UserEntity getUser(Long id) {\n    \tUserEntity user=user2Mapper.getOne(id);\n        return user;\n    }\n    \n    @RequestMapping(\"/add\")\n    public void save(UserEntity user) {\n        user2Mapper.insert(user);\n    }\n    \n    @RequestMapping(value=\"update\")\n    public void update(UserEntity user) {\n        user2Mapper.update(user);\n    }\n    \n    @RequestMapping(value=\"/delete/{id}\")\n    public void delete(@PathVariable(\"id\") Long id) {\n        user1Mapper.delete(id);\n    }\n    \n}"
  },
  {
    "path": "1.x/spring-boot-mybatis-annotation-mulidatasource/src/main/resources/application.properties",
    "content": "mybatis.type-aliases-package=com.neo.entity\n\nspring.datasource.test1.driverClassName = com.mysql.jdbc.Driver\nspring.datasource.test1.url = jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf-8\nspring.datasource.test1.username = root\nspring.datasource.test1.password = root\n\n\nspring.datasource.test2.driverClassName = com.mysql.jdbc.Driver\nspring.datasource.test2.url = jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=utf-8\nspring.datasource.test2.username = root\nspring.datasource.test2.password = root\n\n"
  },
  {
    "path": "1.x/spring-boot-mybatis-annotation-mulidatasource/src/test/java/com/neo/ApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class ApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t\tSystem.out.println(\"hello world\");\n\t}\n\n}\n"
  },
  {
    "path": "1.x/spring-boot-mybatis-annotation-mulidatasource/src/test/java/com/neo/mapper/User1MapperTest.java",
    "content": "package com.neo.mapper;\n\nimport java.util.List;\n\nimport com.neo.mapper.test1.User1Mapper;\nimport org.junit.Assert;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport com.neo.entity.UserEntity;\nimport com.neo.enums.UserSexEnum;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class User1MapperTest {\n\n\t@Autowired\n\tprivate User1Mapper userMapper;\n\n\t@Test\n\tpublic void testInsert() throws Exception {\n\t\tuserMapper.insert(new UserEntity(\"aa\", \"a123456\", UserSexEnum.MAN));\n\t\tuserMapper.insert(new UserEntity(\"bb\", \"b123456\", UserSexEnum.WOMAN));\n\t\tuserMapper.insert(new UserEntity(\"cc\", \"b123456\", UserSexEnum.WOMAN));\n\n\t\tAssert.assertEquals(3, userMapper.getAll().size());\n\t}\n\n\t@Test\n\tpublic void testQuery() throws Exception {\n\t\tList<UserEntity> users = userMapper.getAll();\n\t\tif(users==null || users.size()==0){\n\t\t\tSystem.out.println(\"is null\");\n\t\t}else{\n\t\t\tSystem.out.println(users.size());\n\t\t}\n\t}\n\t\n\t\n\t@Test\n\tpublic void testUpdate() throws Exception {\n\t\tUserEntity user = userMapper.getOne(6l);\n\t\tSystem.out.println(user.toString());\n\t\tuser.setNickName(\"neo\");\n\t\tuserMapper.update(user);\n\t\tAssert.assertTrue((\"neo\".equals(userMapper.getOne(6l).getNickName())));\n\t}\n\n}"
  },
  {
    "path": "1.x/spring-boot-mybatis-annotation-mulidatasource/src/test/java/com/neo/mapper/User2MapperTest.java",
    "content": "package com.neo.mapper;\n\nimport com.neo.entity.UserEntity;\nimport com.neo.enums.UserSexEnum;\nimport com.neo.mapper.test2.User2Mapper;\nimport org.junit.Assert;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport java.util.List;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class User2MapperTest {\n\n\t@Autowired\n\tprivate User2Mapper userMapper;\n\n\t@Test\n\tpublic void testInsert() throws Exception {\n\t\tuserMapper.insert(new UserEntity(\"aa\", \"a123456\", UserSexEnum.MAN));\n\t\tuserMapper.insert(new UserEntity(\"bb\", \"b123456\", UserSexEnum.WOMAN));\n\t\tuserMapper.insert(new UserEntity(\"cc\", \"b123456\", UserSexEnum.WOMAN));\n\n\t\tAssert.assertEquals(3, userMapper.getAll().size());\n\t}\n\n\t@Test\n\tpublic void testQuery() throws Exception {\n\t\tList<UserEntity> users = userMapper.getAll();\n\t\tif(users==null || users.size()==0){\n\t\t\tSystem.out.println(\"is null\");\n\t\t}else{\n\t\t\tSystem.out.println(users.toString());\n\t\t}\n\t}\n\t\n\t\n\t@Test\n\tpublic void testUpdate() throws Exception {\n\t\tUserEntity user = userMapper.getOne(6l);\n\t\tSystem.out.println(user.toString());\n\t\tuser.setNickName(\"neo\");\n\t\tuserMapper.update(user);\n\t\tAssert.assertTrue((\"neo\".equals(userMapper.getOne(6l).getNickName())));\n\t}\n\n}"
  },
  {
    "path": "1.x/spring-boot-mybatis-mulidatasource/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-mybatis-mulidatasource</artifactId>\n\t<version>1.0.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-mybatis-mulidatasource</name>\n\t<description>Demo project for Spring Boot and mybatis</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>1.4.2.RELEASE</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t\t<dependency>\n\t        <groupId>org.springframework.boot</groupId>\n\t        <artifactId>spring-boot-starter-web</artifactId>\n\t    </dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.mybatis.spring.boot</groupId>\n\t\t\t<artifactId>mybatis-spring-boot-starter</artifactId>\n\t\t\t<version>1.1.1</version>\n\t\t</dependency>\n\t     <dependency>\n\t        <groupId>mysql</groupId>\n\t        <artifactId>mysql-connector-java</artifactId>\n\t    </dependency>\n\t     <dependency>\n\t        <groupId>org.springframework.boot</groupId>\n\t        <artifactId>spring-boot-devtools</artifactId>\n\t        <optional>true</optional>\n\t\t</dependency>\n\t</dependencies>\n\t\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t\t<configuration>\n\t                <fork>true</fork>\n\t            </configuration>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\t\n\n</project>\n"
  },
  {
    "path": "1.x/spring-boot-mybatis-mulidatasource/src/main/java/com/neo/Application.java",
    "content": "package com.neo;\n\nimport org.mybatis.spring.annotation.MapperScan;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class Application {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(Application.class, args);\n\t}\n}\n"
  },
  {
    "path": "1.x/spring-boot-mybatis-mulidatasource/src/main/java/com/neo/datasource/DataSource1Config.java",
    "content": "package com.neo.datasource;\n\nimport org.apache.ibatis.session.SqlSessionFactory;\nimport org.mybatis.spring.SqlSessionFactoryBean;\nimport org.mybatis.spring.SqlSessionTemplate;\nimport org.mybatis.spring.annotation.MapperScan;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;\nimport org.springframework.boot.context.properties.ConfigurationProperties;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.context.annotation.Primary;\nimport org.springframework.core.io.support.PathMatchingResourcePatternResolver;\nimport org.springframework.jdbc.datasource.DataSourceTransactionManager;\n\nimport javax.sql.DataSource;\n\n/**\n * Created by summer on 2016/11/25.\n */\n@Configuration\n@MapperScan(basePackages = \"com.neo.mapper.test1\", sqlSessionTemplateRef  = \"test1SqlSessionTemplate\")\npublic class DataSource1Config {\n\n    @Bean(name = \"test1DataSource\")\n    @ConfigurationProperties(prefix = \"spring.datasource.test1\")\n    @Primary\n    public DataSource testDataSource() {\n        return DataSourceBuilder.create().build();\n    }\n\n    @Bean(name = \"test1SqlSessionFactory\")\n    @Primary\n    public SqlSessionFactory testSqlSessionFactory(@Qualifier(\"test1DataSource\") DataSource dataSource) throws Exception {\n        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();\n        bean.setDataSource(dataSource);\n        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(\"classpath:mybatis/mapper/test1/*.xml\"));\n        return bean.getObject();\n    }\n\n    @Bean(name = \"test1TransactionManager\")\n    @Primary\n    public DataSourceTransactionManager testTransactionManager(@Qualifier(\"test1DataSource\") DataSource dataSource) {\n        return new DataSourceTransactionManager(dataSource);\n    }\n\n    @Bean(name = \"test1SqlSessionTemplate\")\n    @Primary\n    public SqlSessionTemplate testSqlSessionTemplate(@Qualifier(\"test1SqlSessionFactory\") SqlSessionFactory sqlSessionFactory) throws Exception {\n        return new SqlSessionTemplate(sqlSessionFactory);\n    }\n\n}\n"
  },
  {
    "path": "1.x/spring-boot-mybatis-mulidatasource/src/main/java/com/neo/datasource/DataSource2Config.java",
    "content": "package com.neo.datasource;\n\nimport org.apache.ibatis.session.SqlSessionFactory;\nimport org.mybatis.spring.SqlSessionFactoryBean;\nimport org.mybatis.spring.SqlSessionTemplate;\nimport org.mybatis.spring.annotation.MapperScan;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;\nimport org.springframework.boot.context.properties.ConfigurationProperties;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.core.io.support.PathMatchingResourcePatternResolver;\nimport org.springframework.jdbc.datasource.DataSourceTransactionManager;\n\nimport javax.sql.DataSource;\n\n/**\n * Created by summer on 2016/11/25.\n */\n@Configuration\n@MapperScan(basePackages = \"com.neo.mapper.test2\", sqlSessionTemplateRef  = \"test2SqlSessionTemplate\")\npublic class DataSource2Config {\n\n    @Bean(name = \"test2DataSource\")\n    @ConfigurationProperties(prefix = \"spring.datasource.test2\")\n    public DataSource testDataSource() {\n        return DataSourceBuilder.create().build();\n    }\n\n    @Bean(name = \"test2SqlSessionFactory\")\n    public SqlSessionFactory testSqlSessionFactory(@Qualifier(\"test2DataSource\") DataSource dataSource) throws Exception {\n        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();\n        bean.setDataSource(dataSource);\n        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(\"classpath:mybatis/mapper/test2/*.xml\"));\n        return bean.getObject();\n    }\n\n    @Bean(name = \"test2TransactionManager\")\n    public DataSourceTransactionManager testTransactionManager(@Qualifier(\"test2DataSource\") DataSource dataSource) {\n        return new DataSourceTransactionManager(dataSource);\n    }\n\n    @Bean(name = \"test2SqlSessionTemplate\")\n    public SqlSessionTemplate testSqlSessionTemplate(@Qualifier(\"test2SqlSessionFactory\") SqlSessionFactory sqlSessionFactory) throws Exception {\n        return new SqlSessionTemplate(sqlSessionFactory);\n    }\n\n}\n"
  },
  {
    "path": "1.x/spring-boot-mybatis-mulidatasource/src/main/java/com/neo/entity/UserEntity.java",
    "content": "package com.neo.entity;\n\nimport java.io.Serializable;\n\nimport com.neo.enums.UserSexEnum;\n\npublic class UserEntity implements Serializable {\n\n\tprivate static final long serialVersionUID = 1L;\n\tprivate Long id;\n\tprivate String userName;\n\tprivate String passWord;\n\tprivate UserSexEnum userSex;\n\tprivate String nickName;\n\n\tpublic UserEntity() {\n\t\tsuper();\n\t}\n\n\tpublic UserEntity(String userName, String passWord, UserSexEnum userSex) {\n\t\tsuper();\n\t\tthis.passWord = passWord;\n\t\tthis.userName = userName;\n\t\tthis.userSex = userSex;\n\t}\n\n\tpublic Long getId() {\n\t\treturn id;\n\t}\n\n\tpublic void setId(Long id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic String getUserName() {\n\t\treturn userName;\n\t}\n\n\tpublic void setUserName(String userName) {\n\t\tthis.userName = userName;\n\t}\n\n\tpublic String getPassWord() {\n\t\treturn passWord;\n\t}\n\n\tpublic void setPassWord(String passWord) {\n\t\tthis.passWord = passWord;\n\t}\n\n\tpublic UserSexEnum getUserSex() {\n\t\treturn userSex;\n\t}\n\n\tpublic void setUserSex(UserSexEnum userSex) {\n\t\tthis.userSex = userSex;\n\t}\n\n\tpublic String getNickName() {\n\t\treturn nickName;\n\t}\n\n\tpublic void setNickName(String nickName) {\n\t\tthis.nickName = nickName;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\t// TODO Auto-generated method stub\n\t\treturn \"userName \" + this.userName + \", pasword \" + this.passWord + \"sex \" + userSex.name();\n\t}\n\n}"
  },
  {
    "path": "1.x/spring-boot-mybatis-mulidatasource/src/main/java/com/neo/enums/UserSexEnum.java",
    "content": "package com.neo.enums;\n\npublic enum UserSexEnum {\n\tMAN, WOMAN\n}\n"
  },
  {
    "path": "1.x/spring-boot-mybatis-mulidatasource/src/main/java/com/neo/mapper/test1/User1Mapper.java",
    "content": "package com.neo.mapper.test1;\n\nimport com.neo.entity.UserEntity;\n\nimport java.util.List;\n\npublic interface User1Mapper {\n\t\n\tList<UserEntity> getAll();\n\t\n\tUserEntity getOne(Long id);\n\n\tvoid insert(UserEntity user);\n\n\tvoid update(UserEntity user);\n\n\tvoid delete(Long id);\n\n}"
  },
  {
    "path": "1.x/spring-boot-mybatis-mulidatasource/src/main/java/com/neo/mapper/test2/User2Mapper.java",
    "content": "package com.neo.mapper.test2;\n\nimport java.util.List;\n\nimport com.neo.entity.UserEntity;\n\npublic interface User2Mapper {\n\t\n\tList<UserEntity> getAll();\n\t\n\tUserEntity getOne(Long id);\n\n\tvoid insert(UserEntity user);\n\n\tvoid update(UserEntity user);\n\n\tvoid delete(Long id);\n\n}"
  },
  {
    "path": "1.x/spring-boot-mybatis-mulidatasource/src/main/java/com/neo/web/UserController.java",
    "content": "package com.neo.web;\n\nimport java.util.List;\n\nimport com.neo.mapper.test1.User1Mapper;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport com.neo.entity.UserEntity;\nimport com.neo.mapper.test2.User2Mapper;\n\n@RestController\npublic class UserController {\n\n    @Autowired\n    private User1Mapper user1Mapper;\n\n\t@Autowired\n\tprivate User2Mapper user2Mapper;\n\t\n\t@RequestMapping(\"/getUsers\")\n\tpublic List<UserEntity> getUsers() {\n\t\tList<UserEntity> users=user1Mapper.getAll();\n\t\treturn users;\n\t}\n\t\n    @RequestMapping(\"/getUser\")\n    public UserEntity getUser(Long id) {\n    \tUserEntity user=user2Mapper.getOne(id);\n        return user;\n    }\n    \n    @RequestMapping(\"/add\")\n    public void save(UserEntity user) {\n        user2Mapper.insert(user);\n    }\n    \n    @RequestMapping(value=\"update\")\n    public void update(UserEntity user) {\n        user2Mapper.update(user);\n    }\n    \n    @RequestMapping(value=\"/delete/{id}\")\n    public void delete(@PathVariable(\"id\") Long id) {\n        user1Mapper.delete(id);\n    }\n    \n    \n}"
  },
  {
    "path": "1.x/spring-boot-mybatis-mulidatasource/src/main/resources/application.properties",
    "content": "mybatis.config-locations=classpath:mybatis/mybatis-config.xml\n\nspring.datasource.test1.driverClassName = com.mysql.jdbc.Driver\nspring.datasource.test1.url = jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf-8\nspring.datasource.test1.username = root\nspring.datasource.test1.password = root\n\n\nspring.datasource.test2.driverClassName = com.mysql.jdbc.Driver\nspring.datasource.test2.url = jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=utf-8\nspring.datasource.test2.username = root\nspring.datasource.test2.password = root\n\n"
  },
  {
    "path": "1.x/spring-boot-mybatis-mulidatasource/src/main/resources/mybatis/mapper/test1/UserMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >\n<mapper namespace=\"com.neo.mapper.test1.User1Mapper\" >\n    <resultMap id=\"BaseResultMap\" type=\"com.neo.entity.UserEntity\" >\n        <id column=\"id\" property=\"id\" jdbcType=\"BIGINT\" />\n        <result column=\"userName\" property=\"userName\" jdbcType=\"VARCHAR\" />\n        <result column=\"passWord\" property=\"passWord\" jdbcType=\"VARCHAR\" />\n        <result column=\"user_sex\" property=\"userSex\" javaType=\"com.neo.enums.UserSexEnum\"/>\n        <result column=\"nick_name\" property=\"nickName\" jdbcType=\"VARCHAR\" />\n    </resultMap>\n    \n    <sql id=\"Base_Column_List\" >\n        id, userName, passWord, user_sex, nick_name\n    </sql>\n\n    <select id=\"getAll\" resultMap=\"BaseResultMap\"  >\n       SELECT \n       <include refid=\"Base_Column_List\" />\n\t   FROM users\n    </select>\n\n    <select id=\"getOne\" parameterType=\"java.lang.Long\" resultMap=\"BaseResultMap\" >\n        SELECT \n       <include refid=\"Base_Column_List\" />\n\t   FROM users\n\t   WHERE id = #{id}\n    </select>\n\n    <insert id=\"insert\" parameterType=\"com.neo.entity.UserEntity\" >\n       INSERT INTO \n       \t\tusers\n       \t\t(userName,passWord,user_sex) \n       \tVALUES\n       \t\t(#{userName}, #{passWord}, #{userSex})\n    </insert>\n    \n    <update id=\"update\" parameterType=\"com.neo.entity.UserEntity\" >\n       UPDATE \n       \t\tusers \n       SET \n       \t<if test=\"userName != null\">userName = #{userName},</if>\n       \t<if test=\"passWord != null\">passWord = #{passWord},</if>\n       \tnick_name = #{nickName}\n       WHERE \n       \t\tid = #{id}\n    </update>\n    \n    <delete id=\"delete\" parameterType=\"java.lang.Long\" >\n       DELETE FROM\n       \t\t users \n       WHERE \n       \t\t id =#{id}\n    </delete>\n\n</mapper>"
  },
  {
    "path": "1.x/spring-boot-mybatis-mulidatasource/src/main/resources/mybatis/mapper/test2/UserMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >\n<mapper namespace=\"com.neo.mapper.test2.User2Mapper\" >\n    <resultMap id=\"BaseResultMap\" type=\"com.neo.entity.UserEntity\" >\n        <id column=\"id\" property=\"id\" jdbcType=\"BIGINT\" />\n        <result column=\"userName\" property=\"userName\" jdbcType=\"VARCHAR\" />\n        <result column=\"passWord\" property=\"passWord\" jdbcType=\"VARCHAR\" />\n        <result column=\"user_sex\" property=\"userSex\" javaType=\"com.neo.enums.UserSexEnum\"/>\n        <result column=\"nick_name\" property=\"nickName\" jdbcType=\"VARCHAR\" />\n    </resultMap>\n    \n    <sql id=\"Base_Column_List\" >\n        id, userName, passWord, user_sex, nick_name\n    </sql>\n\n    <select id=\"getAll\" resultMap=\"BaseResultMap\"  >\n       SELECT \n       <include refid=\"Base_Column_List\" />\n\t   FROM users\n    </select>\n\n    <select id=\"getOne\" parameterType=\"java.lang.Long\" resultMap=\"BaseResultMap\" >\n        SELECT \n       <include refid=\"Base_Column_List\" />\n\t   FROM users\n\t   WHERE id = #{id}\n    </select>\n\n    <insert id=\"insert\" parameterType=\"com.neo.entity.UserEntity\" >\n       INSERT INTO \n       \t\tusers\n       \t\t(userName,passWord,user_sex) \n       \tVALUES\n       \t\t(#{userName}, #{passWord}, #{userSex})\n    </insert>\n    \n    <update id=\"update\" parameterType=\"com.neo.entity.UserEntity\" >\n       UPDATE \n       \t\tusers \n       SET \n       \t<if test=\"userName != null\">userName = #{userName},</if>\n       \t<if test=\"passWord != null\">passWord = #{passWord},</if>\n       \tnick_name = #{nickName}\n       WHERE \n       \t\tid = #{id}\n    </update>\n    \n    <delete id=\"delete\" parameterType=\"java.lang.Long\" >\n       DELETE FROM\n       \t\t users \n       WHERE \n       \t\t id =#{id}\n    </delete>\n\n</mapper>"
  },
  {
    "path": "1.x/spring-boot-mybatis-mulidatasource/src/main/resources/mybatis/mybatis-config.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE configuration PUBLIC \"-//mybatis.org//DTD Config 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-config.dtd\">\n<configuration>\n\t<typeAliases>\n\t\t<typeAlias alias=\"Integer\" type=\"java.lang.Integer\" />\n\t\t<typeAlias alias=\"Long\" type=\"java.lang.Long\" />\n\t\t<typeAlias alias=\"HashMap\" type=\"java.util.HashMap\" />\n\t\t<typeAlias alias=\"LinkedHashMap\" type=\"java.util.LinkedHashMap\" />\n\t\t<typeAlias alias=\"ArrayList\" type=\"java.util.ArrayList\" />\n\t\t<typeAlias alias=\"LinkedList\" type=\"java.util.LinkedList\" />\n\t</typeAliases>\n</configuration>"
  },
  {
    "path": "1.x/spring-boot-mybatis-mulidatasource/src/test/java/com/neo/ApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class ApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t\tSystem.out.println(\"hello world\");\n\t}\n\n}\n"
  },
  {
    "path": "1.x/spring-boot-mybatis-mulidatasource/src/test/java/com/neo/mapper/User1MapperTest.java",
    "content": "package com.neo.mapper;\n\nimport java.util.List;\n\nimport com.neo.mapper.test1.User1Mapper;\nimport org.junit.Assert;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport com.neo.entity.UserEntity;\nimport com.neo.enums.UserSexEnum;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class User1MapperTest {\n\n\t@Autowired\n\tprivate User1Mapper userMapper;\n\n\t@Test\n\tpublic void testInsert() throws Exception {\n\t\tuserMapper.insert(new UserEntity(\"aa\", \"a123456\", UserSexEnum.MAN));\n\t\tuserMapper.insert(new UserEntity(\"bb\", \"b123456\", UserSexEnum.WOMAN));\n\t\tuserMapper.insert(new UserEntity(\"cc\", \"b123456\", UserSexEnum.WOMAN));\n\n\t\tAssert.assertEquals(3, userMapper.getAll().size());\n\t}\n\n\t@Test\n\tpublic void testQuery() throws Exception {\n\t\tList<UserEntity> users = userMapper.getAll();\n\t\tif(users==null || users.size()==0){\n\t\t\tSystem.out.println(\"is null\");\n\t\t}else{\n\t\t\tSystem.out.println(users.size());\n\t\t}\n\t}\n\t\n\t\n\t@Test\n\tpublic void testUpdate() throws Exception {\n\t\tUserEntity user = userMapper.getOne(6l);\n\t\tSystem.out.println(user.toString());\n\t\tuser.setNickName(\"neo\");\n\t\tuserMapper.update(user);\n\t\tAssert.assertTrue((\"neo\".equals(userMapper.getOne(6l).getNickName())));\n\t}\n\n}"
  },
  {
    "path": "1.x/spring-boot-mybatis-mulidatasource/src/test/java/com/neo/mapper/User2MapperTest.java",
    "content": "package com.neo.mapper;\n\nimport com.neo.entity.UserEntity;\nimport com.neo.enums.UserSexEnum;\nimport com.neo.mapper.test2.User2Mapper;\nimport org.junit.Assert;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport java.util.List;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class User2MapperTest {\n\n\t@Autowired\n\tprivate User2Mapper userMapper;\n\n\t@Test\n\tpublic void testInsert() throws Exception {\n\t\tuserMapper.insert(new UserEntity(\"aa\", \"a123456\", UserSexEnum.MAN));\n\t\tuserMapper.insert(new UserEntity(\"bb\", \"b123456\", UserSexEnum.WOMAN));\n\t\tuserMapper.insert(new UserEntity(\"cc\", \"b123456\", UserSexEnum.WOMAN));\n\n\t\tAssert.assertEquals(3, userMapper.getAll().size());\n\t}\n\n\t@Test\n\tpublic void testQuery() throws Exception {\n\t\tList<UserEntity> users = userMapper.getAll();\n\t\tif(users==null || users.size()==0){\n\t\t\tSystem.out.println(\"is null\");\n\t\t}else{\n\t\t\tSystem.out.println(users.toString());\n\t\t}\n\t}\n\t\n\t\n\t@Test\n\tpublic void testUpdate() throws Exception {\n\t\tUserEntity user = userMapper.getOne(6l);\n\t\tSystem.out.println(user.toString());\n\t\tuser.setNickName(\"neo\");\n\t\tuserMapper.update(user);\n\t\tAssert.assertTrue((\"neo\".equals(userMapper.getOne(6l).getNickName())));\n\t}\n\n}"
  },
  {
    "path": "1.x/spring-boot-mybatis-mulidatasource/users.sql",
    "content": "/*\nNavicat MySQL Data Transfer\n\nSource Server         : 本地\nSource Server Version : 50505\nSource Host           : localhost:3306\nSource Database       : test1\n\nTarget Server Type    : MYSQL\nTarget Server Version : 50505\nFile Encoding         : 65001\n\nDate: 2016-11-05 21:17:33\n*/\n\nSET FOREIGN_KEY_CHECKS=0;\n\n-- ----------------------------\n-- Table structure for `users`\n-- ----------------------------\nDROP TABLE IF EXISTS `users`;\nCREATE TABLE `users` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',\n  `userName` varchar(32) DEFAULT NULL COMMENT '用户名',\n  `passWord` varchar(32) DEFAULT NULL COMMENT '密码',\n  `user_sex` varchar(32) DEFAULT NULL,\n  `nick_name` varchar(32) DEFAULT NULL,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8;\n\n"
  },
  {
    "path": "1.x/spring-boot-mybatis-xml/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-mybatis-xml</artifactId>\n\t<version>1.0.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-mybatis-xml</name>\n\t<description>Demo project for Spring Boot and mybatis</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>1.5.9.RELEASE</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t\t<dependency>\n\t        <groupId>org.springframework.boot</groupId>\n\t        <artifactId>spring-boot-starter-web</artifactId>\n\t    </dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.mybatis.spring.boot</groupId>\n\t\t\t<artifactId>mybatis-spring-boot-starter</artifactId>\n\t\t\t<version>1.1.1</version>\n\t\t</dependency>\n\t     <dependency>\n\t        <groupId>mysql</groupId>\n\t        <artifactId>mysql-connector-java</artifactId>\n\t    </dependency>\n\t     <dependency>\n\t        <groupId>org.springframework.boot</groupId>\n\t        <artifactId>spring-boot-devtools</artifactId>\n\t        <optional>true</optional>\n\t\t</dependency>\n\t</dependencies>\n\t\n\t<build>\n\t  <resources>\n            <resource>\n                <directory>src/main/resources</directory>\n                <filtering>true</filtering>\n                <excludes>\n\t\t\t\t\t<exclude>bootstrap-test.properties</exclude>\n                    <exclude>bootstrap-dev.properties</exclude>\n                    <exclude>bootstrap-pro.properties</exclude>\n                    <exclude>bootstrap.properties</exclude>\n                </excludes>\n            </resource>\n            <resource>\n                <directory>src/main/resources</directory>\n                <filtering>true</filtering>\n                <includes>\n                    <include>bootstrap-${env}.properties</include>\n                    <include>bootstrap.properties</include>\n                </includes>\n            </resource>\n        </resources>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t\t<configuration>\n\t                <fork>true</fork>\n\t            </configuration>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\t\n\n</project>\n"
  },
  {
    "path": "1.x/spring-boot-mybatis-xml/src/main/java/com/neo/Application.java",
    "content": "package com.neo;\n\nimport org.mybatis.spring.annotation.MapperScan;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\n@MapperScan(\"com.neo.mapper\")\npublic class Application {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(Application.class, args);\n\t}\n}\n"
  },
  {
    "path": "1.x/spring-boot-mybatis-xml/src/main/java/com/neo/entity/UserEntity.java",
    "content": "package com.neo.entity;\n\nimport java.io.Serializable;\n\nimport com.neo.enums.UserSexEnum;\n\npublic class UserEntity implements Serializable {\n\n\tprivate static final long serialVersionUID = 1L;\n\tprivate Long id;\n\tprivate String userName;\n\tprivate String passWord;\n\tprivate UserSexEnum userSex;\n\tprivate String nickName;\n\n\tpublic UserEntity() {\n\t\tsuper();\n\t}\n\n\tpublic UserEntity(String userName, String passWord, UserSexEnum userSex) {\n\t\tsuper();\n\t\tthis.passWord = passWord;\n\t\tthis.userName = userName;\n\t\tthis.userSex = userSex;\n\t}\n\n\tpublic Long getId() {\n\t\treturn id;\n\t}\n\n\tpublic void setId(Long id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic String getUserName() {\n\t\treturn userName;\n\t}\n\n\tpublic void setUserName(String userName) {\n\t\tthis.userName = userName;\n\t}\n\n\tpublic String getPassWord() {\n\t\treturn passWord;\n\t}\n\n\tpublic void setPassWord(String passWord) {\n\t\tthis.passWord = passWord;\n\t}\n\n\tpublic UserSexEnum getUserSex() {\n\t\treturn userSex;\n\t}\n\n\tpublic void setUserSex(UserSexEnum userSex) {\n\t\tthis.userSex = userSex;\n\t}\n\n\tpublic String getNickName() {\n\t\treturn nickName;\n\t}\n\n\tpublic void setNickName(String nickName) {\n\t\tthis.nickName = nickName;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\t// TODO Auto-generated method stub\n\t\treturn \"userName \" + this.userName + \", pasword \" + this.passWord + \"sex \" + userSex.name();\n\t}\n\n}"
  },
  {
    "path": "1.x/spring-boot-mybatis-xml/src/main/java/com/neo/enums/UserSexEnum.java",
    "content": "package com.neo.enums;\n\npublic enum UserSexEnum {\n\tMAN, WOMAN\n}\n"
  },
  {
    "path": "1.x/spring-boot-mybatis-xml/src/main/java/com/neo/mapper/UserMapper.java",
    "content": "package com.neo.mapper;\n\nimport java.util.List;\n\nimport com.neo.entity.UserEntity;\n\npublic interface UserMapper {\n\t\n\tList<UserEntity> getAll();\n\t\n\tUserEntity getOne(Long id);\n\n\tvoid insert(UserEntity user);\n\n\tvoid update(UserEntity user);\n\n\tvoid delete(Long id);\n\n}"
  },
  {
    "path": "1.x/spring-boot-mybatis-xml/src/main/java/com/neo/web/UserController.java",
    "content": "package com.neo.web;\n\nimport java.util.List;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport com.neo.entity.UserEntity;\nimport com.neo.mapper.UserMapper;\n\n@RestController\npublic class UserController {\n\t\n\t@Autowired\n\tprivate UserMapper userMapper;\n\t\n\t@RequestMapping(\"/getUsers\")\n\tpublic List<UserEntity> getUsers() {\n\t\tList<UserEntity> users=userMapper.getAll();\n\t\treturn users;\n\t}\n\t\n    @RequestMapping(\"/getUser\")\n    public UserEntity getUser(Long id) {\n    \tUserEntity user=userMapper.getOne(id);\n        return user;\n    }\n    \n    @RequestMapping(\"/add\")\n    public void save(UserEntity user) {\n    \tuserMapper.insert(user);\n    }\n    \n    @RequestMapping(value=\"update\")\n    public void update(UserEntity user) {\n    \tuserMapper.update(user);\n    }\n    \n    @RequestMapping(value=\"/delete/{id}\")\n    public void delete(@PathVariable(\"id\") Long id) {\n    \tuserMapper.delete(id);\n    }\n    \n    \n}"
  },
  {
    "path": "1.x/spring-boot-mybatis-xml/src/main/resources/application.properties",
    "content": "mybatis.config-locations=classpath:mybatis/mybatis-config.xml\nmybatis.mapper-locations=classpath:mybatis/mapper/*.xml\nmybatis.type-aliases-package=com.neo.entity\n\nspring.datasource.driverClassName = com.mysql.jdbc.Driver\nspring.datasource.url = jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf-8\nspring.datasource.username = root\nspring.datasource.password = root\n"
  },
  {
    "path": "1.x/spring-boot-mybatis-xml/src/main/resources/mybatis/mapper/UserMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >\n<mapper namespace=\"com.neo.mapper.UserMapper\" >\n    <resultMap id=\"BaseResultMap\" type=\"com.neo.entity.UserEntity\" >\n        <id column=\"id\" property=\"id\" jdbcType=\"BIGINT\" />\n        <result column=\"userName\" property=\"userName\" jdbcType=\"VARCHAR\" />\n        <result column=\"passWord\" property=\"passWord\" jdbcType=\"VARCHAR\" />\n        <result column=\"user_sex\" property=\"userSex\" javaType=\"com.neo.enums.UserSexEnum\"/>\n        <result column=\"nick_name\" property=\"nickName\" jdbcType=\"VARCHAR\" />\n    </resultMap>\n    \n    <sql id=\"Base_Column_List\" >\n        id, userName, passWord, user_sex, nick_name\n    </sql>\n\n    <select id=\"getAll\" resultMap=\"BaseResultMap\"  >\n       SELECT \n       <include refid=\"Base_Column_List\" />\n\t   FROM users\n    </select>\n\n    <select id=\"getOne\" parameterType=\"java.lang.Long\" resultMap=\"BaseResultMap\" >\n        SELECT \n       <include refid=\"Base_Column_List\" />\n\t   FROM users\n\t   WHERE id = #{id}\n    </select>\n\n    <insert id=\"insert\" parameterType=\"com.neo.entity.UserEntity\" >\n       INSERT INTO \n       \t\tusers\n       \t\t(userName,passWord,user_sex) \n       \tVALUES\n       \t\t(#{userName}, #{passWord}, #{userSex})\n    </insert>\n    \n    <update id=\"update\" parameterType=\"com.neo.entity.UserEntity\" >\n       UPDATE \n       \t\tusers \n       SET \n       \t<if test=\"userName != null\">userName = #{userName},</if>\n       \t<if test=\"passWord != null\">passWord = #{passWord},</if>\n       \tnick_name = #{nickName}\n       WHERE \n       \t\tid = #{id}\n    </update>\n    \n    <delete id=\"delete\" parameterType=\"java.lang.Long\" >\n       DELETE FROM\n       \t\t users \n       WHERE \n       \t\t id =#{id}\n    </delete>\n\n</mapper>"
  },
  {
    "path": "1.x/spring-boot-mybatis-xml/src/main/resources/mybatis/mybatis-config.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE configuration PUBLIC \"-//mybatis.org//DTD Config 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-config.dtd\">\n<configuration>\n\t<typeAliases>\n\t\t<typeAlias alias=\"Integer\" type=\"java.lang.Integer\" />\n\t\t<typeAlias alias=\"Long\" type=\"java.lang.Long\" />\n\t\t<typeAlias alias=\"HashMap\" type=\"java.util.HashMap\" />\n\t\t<typeAlias alias=\"LinkedHashMap\" type=\"java.util.LinkedHashMap\" />\n\t\t<typeAlias alias=\"ArrayList\" type=\"java.util.ArrayList\" />\n\t\t<typeAlias alias=\"LinkedList\" type=\"java.util.LinkedList\" />\n\t</typeAliases>\n</configuration>"
  },
  {
    "path": "1.x/spring-boot-mybatis-xml/src/test/java/com/neo/ApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class ApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t\tSystem.out.println(\"hello world\");\n\t}\n\n}\n"
  },
  {
    "path": "1.x/spring-boot-mybatis-xml/src/test/java/com/neo/mapper/UserMapperTest.java",
    "content": "package com.neo.mapper;\n\nimport java.util.List;\n\nimport org.junit.Assert;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport com.neo.entity.UserEntity;\nimport com.neo.enums.UserSexEnum;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class UserMapperTest {\n\n\t@Autowired\n\tprivate UserMapper UserMapper;\n\n\t@Test\n\tpublic void testInsert() throws Exception {\n\t\tUserMapper.insert(new UserEntity(\"aa\", \"a123456\", UserSexEnum.MAN));\n\t\tUserMapper.insert(new UserEntity(\"bb\", \"b123456\", UserSexEnum.WOMAN));\n\t\tUserMapper.insert(new UserEntity(\"cc\", \"b123456\", UserSexEnum.WOMAN));\n\n\t\tAssert.assertEquals(3, UserMapper.getAll().size());\n\t}\n\n\t@Test\n\tpublic void testQuery() throws Exception {\n\t\tList<UserEntity> users = UserMapper.getAll();\n\t\tif(users==null || users.size()==0){\n\t\t\tSystem.out.println(\"is null\");\n\t\t}else{\n\t\t\tSystem.out.println(users.toString());\n\t\t}\n\t}\n\t\n\t\n\t@Test\n\tpublic void testUpdate() throws Exception {\n\t\tUserEntity user = UserMapper.getOne(6l);\n\t\tSystem.out.println(user.toString());\n\t\tuser.setNickName(\"neo\");\n\t\tUserMapper.update(user);\n\t\tAssert.assertTrue((\"neo\".equals(UserMapper.getOne(6l).getNickName())));\n\t}\n\n}"
  },
  {
    "path": "1.x/spring-boot-mybatis-xml/src/test/java/com/neo/web/UserControllerTest.java",
    "content": "package com.neo.web;\n\n\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.http.MediaType;\nimport org.springframework.test.context.junit4.SpringRunner;\nimport org.springframework.test.web.servlet.MockMvc;\nimport org.springframework.test.web.servlet.request.MockMvcRequestBuilders;\nimport org.springframework.test.web.servlet.setup.MockMvcBuilders;\nimport org.springframework.web.context.WebApplicationContext;\n\nimport static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class UserControllerTest {\n    @Autowired\n    private WebApplicationContext wac;\n    private MockMvc mockMvc;\n\n    @Before\n    public void setUp() throws Exception {\n        mockMvc = MockMvcBuilders.webAppContextSetup(wac).build(); //初始化MockMvc对象\n    }\n\n    @Test\n    public void getUsers() throws Exception {\n        mockMvc.perform(MockMvcRequestBuilders.post(\"/getUsers\")\n                .accept(MediaType.APPLICATION_JSON_UTF8)).andDo(print());\n    }\n\n}"
  },
  {
    "path": "1.x/spring-boot-mybatis-xml/users.sql",
    "content": "/*\nNavicat MySQL Data Transfer\n\nSource Server         : 本地\nSource Server Version : 50505\nSource Host           : localhost:3306\nSource Database       : test1\n\nTarget Server Type    : MYSQL\nTarget Server Version : 50505\nFile Encoding         : 65001\n\nDate: 2016-11-05 21:17:33\n*/\n\nSET FOREIGN_KEY_CHECKS=0;\n\n-- ----------------------------\n-- Table structure for `users`\n-- ----------------------------\nDROP TABLE IF EXISTS `users`;\nCREATE TABLE `users` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',\n  `userName` varchar(32) DEFAULT NULL COMMENT '用户名',\n  `passWord` varchar(32) DEFAULT NULL COMMENT '密码',\n  `user_sex` varchar(32) DEFAULT NULL,\n  `nick_name` varchar(32) DEFAULT NULL,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8;\n\n"
  },
  {
    "path": "1.x/spring-boot-package-war/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-package-war</artifactId>\n\t<version>0.0.1-SNAPSHOT</version>\n\t<packaging>war</packaging>\n\n\t<name>spring-boot-package-war</name>\n\t<description>Demo project for Spring Boot package war</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>1.3.6.RELEASE</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>1.7</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter</artifactId>\n\t\t</dependency>\n\t\t\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t\t\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-web</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-tomcat</artifactId>\n\t\t\t<scope>provided</scope>\n\t\t</dependency>\n\t     <dependency>\n\t        <groupId>org.springframework.boot</groupId>\n\t        <artifactId>spring-boot-devtools</artifactId>\n\t        <optional>true</optional>\n\t\t</dependency>\n\t</dependencies>\n\t\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t\t<configuration>\n\t                <fork>true</fork>\n\t            </configuration>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\t\n\n</project>\n"
  },
  {
    "path": "1.x/spring-boot-package-war/src/main/java/com/neo/Application.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class Application {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(Application.class, args);\n\t}\n}\n"
  },
  {
    "path": "1.x/spring-boot-package-war/src/main/java/com/neo/ServletInitializer.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.builder.SpringApplicationBuilder;\nimport org.springframework.boot.context.web.SpringBootServletInitializer;\n\n/**\n * Created by summer on 2017/5/8.\n */\npublic class ServletInitializer extends SpringBootServletInitializer {\n    @Override\n    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {\n        return application.sources(Application.class);\n    }\n}\n"
  },
  {
    "path": "1.x/spring-boot-package-war/src/main/java/com/neo/controller/HelloWorldController.java",
    "content": "package com.neo.controller;\n\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n@RestController\npublic class HelloWorldController {\n\t\n    @RequestMapping(\"/hello\")\n    public String index() {\n        return \"Hello World xx\";\n    }\n}"
  },
  {
    "path": "1.x/spring-boot-package-war/src/main/resources/application.properties",
    "content": ""
  },
  {
    "path": "1.x/spring-boot-package-war/src/test/java/com/neo/ApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.SpringApplicationConfiguration;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\n\n@RunWith(SpringJUnit4ClassRunner.class)\n@SpringApplicationConfiguration(classes = Application.class)\npublic class ApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t}\n\n}\n"
  },
  {
    "path": "1.x/spring-boot-package-war/src/test/java/com/neo/controller/HelloTests.java",
    "content": "package com.neo.controller;\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.SpringApplicationConfiguration;\nimport org.springframework.http.MediaType;\nimport org.springframework.mock.web.MockServletContext;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\nimport org.springframework.test.context.web.WebAppConfiguration;\nimport org.springframework.test.web.servlet.MockMvc;\nimport org.springframework.test.web.servlet.request.MockMvcRequestBuilders;\nimport org.springframework.test.web.servlet.setup.MockMvcBuilders;\n\nimport static org.hamcrest.Matchers.equalTo;\nimport static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;\nimport static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;\n\n@RunWith(SpringJUnit4ClassRunner.class)\n@SpringApplicationConfiguration(classes = MockServletContext.class)\n@WebAppConfiguration\npublic class HelloTests {\n\n\t\n    private MockMvc mvc;\n\n    @Before\n    public void setUp() throws Exception {\n        mvc = MockMvcBuilders.standaloneSetup(new HelloWorldController()).build();\n    }\n\n    @Test\n    public void getHello() throws Exception {\n        mvc.perform(MockMvcRequestBuilders.get(\"/hello\").accept(MediaType.APPLICATION_JSON))\n                .andExpect(status().isOk())\n                .andExpect(content().string(equalTo(\"Hello World\")));\n    }\n\n}"
  },
  {
    "path": "1.x/spring-boot-package-war/src/test/java/com/neo/controller/HelloWorldControlerTests.java",
    "content": "package com.neo.controller;\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.SpringApplicationConfiguration;\nimport org.springframework.http.MediaType;\nimport org.springframework.mock.web.MockServletContext;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\nimport org.springframework.test.context.web.WebAppConfiguration;\nimport org.springframework.test.web.servlet.MockMvc;\nimport org.springframework.test.web.servlet.request.MockMvcRequestBuilders;\nimport org.springframework.test.web.servlet.result.MockMvcResultHandlers;\nimport org.springframework.test.web.servlet.result.MockMvcResultMatchers;\nimport org.springframework.test.web.servlet.setup.MockMvcBuilders;\n\n@RunWith(SpringJUnit4ClassRunner.class)\n@SpringApplicationConfiguration(classes = MockServletContext.class)\n@WebAppConfiguration\npublic class HelloWorldControlerTests {\n\n    private MockMvc mvc;\n\n    @Before\n    public void setUp() throws Exception {\n        mvc = MockMvcBuilders.standaloneSetup(new HelloWorldController()).build();\n    }\n\n    @Test\n    public void getHello() throws Exception {\n        mvc.perform(MockMvcRequestBuilders.get(\"/hello\").accept(MediaType.APPLICATION_JSON))\n                .andExpect(MockMvcResultMatchers.status().isOk())\n                .andDo(MockMvcResultHandlers.print())\n                .andReturn();\n    }\n\n}"
  },
  {
    "path": "1.x/spring-boot-rabbitmq/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-rabbitmq</artifactId>\n\t<version>1.0.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-rabbitmq</name>\n\t<description>Demo project for Spring Boot and rabbitmq</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>1.4.2.RELEASE</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-amqp</artifactId>\n\t\t</dependency>\n\t     <dependency>\n\t        <groupId>org.springframework.boot</groupId>\n\t        <artifactId>spring-boot-devtools</artifactId>\n\t        <optional>true</optional>\n\t\t</dependency>\n\t</dependencies>\n\t\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t\t<configuration>\n\t                <fork>true</fork>\n\t            </configuration>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\t\n\n</project>\n"
  },
  {
    "path": "1.x/spring-boot-rabbitmq/src/main/java/com/neo/Application.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class Application {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(Application.class, args);\n\t}\n}\n"
  },
  {
    "path": "1.x/spring-boot-rabbitmq/src/main/java/com/neo/model/User.java",
    "content": "package com.neo.model;\n\nimport java.io.Serializable;\n\n/**\n * Created by summer on 2016/11/29.\n */\npublic class User implements Serializable{\n\n    private String name;\n\n    private String pass;\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public String getPass() {\n        return pass;\n    }\n\n    public void setPass(String pass) {\n        this.pass = pass;\n    }\n\n    @Override\n    public String toString() {\n        return \"User{\" +\n                \"name='\" + name + '\\'' +\n                \", pass='\" + pass + '\\'' +\n                '}';\n    }\n}\n"
  },
  {
    "path": "1.x/spring-boot-rabbitmq/src/main/java/com/neo/rabbit/FanoutRabbitConfig.java",
    "content": "package com.neo.rabbit;\n\nimport org.springframework.amqp.core.Binding;\nimport org.springframework.amqp.core.BindingBuilder;\nimport org.springframework.amqp.core.FanoutExchange;\nimport org.springframework.amqp.core.Queue;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n\n@Configuration\npublic class FanoutRabbitConfig {\n\n    @Bean\n    public Queue AMessage() {\n        return new Queue(\"fanout.A\");\n    }\n\n    @Bean\n    public Queue BMessage() {\n        return new Queue(\"fanout.B\");\n    }\n\n    @Bean\n    public Queue CMessage() {\n        return new Queue(\"fanout.C\");\n    }\n\n    @Bean\n    FanoutExchange fanoutExchange() {\n        return new FanoutExchange(\"fanoutExchange\");\n    }\n\n    @Bean\n    Binding bindingExchangeA(Queue AMessage,FanoutExchange fanoutExchange) {\n        return BindingBuilder.bind(AMessage).to(fanoutExchange);\n    }\n\n    @Bean\n    Binding bindingExchangeB(Queue BMessage, FanoutExchange fanoutExchange) {\n        return BindingBuilder.bind(BMessage).to(fanoutExchange);\n    }\n\n    @Bean\n    Binding bindingExchangeC(Queue CMessage, FanoutExchange fanoutExchange) {\n        return BindingBuilder.bind(CMessage).to(fanoutExchange);\n    }\n\n}\n"
  },
  {
    "path": "1.x/spring-boot-rabbitmq/src/main/java/com/neo/rabbit/RabbitConfig.java",
    "content": "package com.neo.rabbit;\n\nimport org.springframework.amqp.core.Queue;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n\n@Configuration\npublic class RabbitConfig {\n\n    @Bean\n    public Queue helloQueue() {\n        return new Queue(\"hello\");\n    }\n\n    @Bean\n    public Queue neoQueue() {\n        return new Queue(\"neo\");\n    }\n\n    @Bean\n    public Queue objectQueue() {\n        return new Queue(\"object\");\n    }\n\n\n}\n"
  },
  {
    "path": "1.x/spring-boot-rabbitmq/src/main/java/com/neo/rabbit/TopicRabbitConfig.java",
    "content": "package com.neo.rabbit;\n\nimport org.springframework.amqp.core.Binding;\nimport org.springframework.amqp.core.BindingBuilder;\nimport org.springframework.amqp.core.Queue;\nimport org.springframework.amqp.core.TopicExchange;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n\n@Configuration\npublic class TopicRabbitConfig {\n\n    final static String message = \"topic.message\";\n    final static String messages = \"topic.messages\";\n\n    @Bean\n    public Queue queueMessage() {\n        return new Queue(TopicRabbitConfig.message);\n    }\n\n    @Bean\n    public Queue queueMessages() {\n        return new Queue(TopicRabbitConfig.messages);\n    }\n\n    @Bean\n    TopicExchange exchange() {\n        return new TopicExchange(\"topicExchange\");\n    }\n\n    @Bean\n    Binding bindingExchangeMessage(Queue queueMessage, TopicExchange exchange) {\n        return BindingBuilder.bind(queueMessage).to(exchange).with(\"topic.message\");\n    }\n\n    @Bean\n    Binding bindingExchangeMessages(Queue queueMessages, TopicExchange exchange) {\n        return BindingBuilder.bind(queueMessages).to(exchange).with(\"topic.#\");\n    }\n}\n"
  },
  {
    "path": "1.x/spring-boot-rabbitmq/src/main/java/com/neo/rabbit/fanout/FanoutReceiverA.java",
    "content": "package com.neo.rabbit.fanout;\n\nimport org.springframework.amqp.rabbit.annotation.RabbitHandler;\nimport org.springframework.amqp.rabbit.annotation.RabbitListener;\nimport org.springframework.stereotype.Component;\n\n@Component\n@RabbitListener(queues = \"fanout.A\")\npublic class FanoutReceiverA {\n\n    @RabbitHandler\n    public void process(String message) {\n        System.out.println(\"fanout Receiver A  : \" + message);\n    }\n\n}\n"
  },
  {
    "path": "1.x/spring-boot-rabbitmq/src/main/java/com/neo/rabbit/fanout/FanoutReceiverB.java",
    "content": "package com.neo.rabbit.fanout;\n\nimport org.springframework.amqp.rabbit.annotation.RabbitHandler;\nimport org.springframework.amqp.rabbit.annotation.RabbitListener;\nimport org.springframework.stereotype.Component;\n\n@Component\n@RabbitListener(queues = \"fanout.B\")\npublic class FanoutReceiverB {\n\n    @RabbitHandler\n    public void process(String message) {\n        System.out.println(\"fanout Receiver B: \" + message);\n    }\n\n}\n"
  },
  {
    "path": "1.x/spring-boot-rabbitmq/src/main/java/com/neo/rabbit/fanout/FanoutReceiverC.java",
    "content": "package com.neo.rabbit.fanout;\n\nimport org.springframework.amqp.rabbit.annotation.RabbitHandler;\nimport org.springframework.amqp.rabbit.annotation.RabbitListener;\nimport org.springframework.stereotype.Component;\n\n@Component\n@RabbitListener(queues = \"fanout.C\")\npublic class FanoutReceiverC {\n\n    @RabbitHandler\n    public void process(String message) {\n        System.out.println(\"fanout Receiver C: \" + message);\n    }\n\n}\n"
  },
  {
    "path": "1.x/spring-boot-rabbitmq/src/main/java/com/neo/rabbit/fanout/FanoutSender.java",
    "content": "package com.neo.rabbit.fanout;\n\nimport org.springframework.amqp.core.AmqpTemplate;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class FanoutSender {\n\n\t@Autowired\n\tprivate AmqpTemplate rabbitTemplate;\n\n\tpublic void send() {\n\t\tString context = \"hi, fanout msg \";\n\t\tSystem.out.println(\"Sender : \" + context);\n\t\tthis.rabbitTemplate.convertAndSend(\"fanoutExchange\",\"\", context);\n\t}\n\n}"
  },
  {
    "path": "1.x/spring-boot-rabbitmq/src/main/java/com/neo/rabbit/hello/HelloReceiver.java",
    "content": "package com.neo.rabbit.hello;\n\nimport org.springframework.amqp.rabbit.annotation.RabbitHandler;\nimport org.springframework.amqp.rabbit.annotation.RabbitListener;\nimport org.springframework.cache.annotation.Cacheable;\nimport org.springframework.stereotype.Component;\n\nimport java.util.Date;\n\n@Component\n@RabbitListener(queues = \"hello\")\npublic class HelloReceiver {\n\n    @RabbitHandler\n    public void process(String hello) {\n        System.out.println(\"Receiver  : \" + hello);\n    }\n\n}\n"
  },
  {
    "path": "1.x/spring-boot-rabbitmq/src/main/java/com/neo/rabbit/hello/HelloSender.java",
    "content": "package com.neo.rabbit.hello;\n\nimport org.springframework.amqp.core.AmqpTemplate;\nimport org.springframework.amqp.rabbit.core.RabbitTemplate;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\nimport java.util.Date;\n\n@Component\npublic class HelloSender {\n\n\t@Autowired\n\tprivate AmqpTemplate rabbitTemplate;\n\n\tpublic void send() {\n\t\tString context = \"hello \" + new Date();\n\t\tSystem.out.println(\"Sender : \" + context);\n\t\tthis.rabbitTemplate.convertAndSend(\"hello\", context);\n\t}\n\n}"
  },
  {
    "path": "1.x/spring-boot-rabbitmq/src/main/java/com/neo/rabbit/many/NeoReceiver1.java",
    "content": "package com.neo.rabbit.many;\n\nimport org.springframework.amqp.rabbit.annotation.RabbitHandler;\nimport org.springframework.amqp.rabbit.annotation.RabbitListener;\nimport org.springframework.stereotype.Component;\n\n@Component\n@RabbitListener(queues = \"neo\")\npublic class NeoReceiver1 {\n\n    @RabbitHandler\n    public void process(String neo) {\n        System.out.println(\"Receiver 1: \" + neo);\n    }\n\n}\n"
  },
  {
    "path": "1.x/spring-boot-rabbitmq/src/main/java/com/neo/rabbit/many/NeoReceiver2.java",
    "content": "package com.neo.rabbit.many;\n\nimport org.springframework.amqp.rabbit.annotation.RabbitHandler;\nimport org.springframework.amqp.rabbit.annotation.RabbitListener;\nimport org.springframework.stereotype.Component;\n\n@Component\n@RabbitListener(queues = \"neo\")\npublic class NeoReceiver2 {\n\n    @RabbitHandler\n    public void process(String neo) {\n        System.out.println(\"Receiver 2: \" + neo);\n    }\n\n}\n"
  },
  {
    "path": "1.x/spring-boot-rabbitmq/src/main/java/com/neo/rabbit/many/NeoSender.java",
    "content": "package com.neo.rabbit.many;\n\nimport org.springframework.amqp.core.AmqpTemplate;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class NeoSender {\n\n\t@Autowired\n\tprivate AmqpTemplate rabbitTemplate;\n\n\tpublic void send(int i) {\n\t\tString context = \"spirng boot neo queue\"+\" ****** \"+i;\n\t\tSystem.out.println(\"Sender1 : \" + context);\n\t\tthis.rabbitTemplate.convertAndSend(\"neo\", context);\n\t}\n\n}"
  },
  {
    "path": "1.x/spring-boot-rabbitmq/src/main/java/com/neo/rabbit/many/NeoSender2.java",
    "content": "package com.neo.rabbit.many;\n\nimport org.springframework.amqp.core.AmqpTemplate;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class NeoSender2 {\n\n\t@Autowired\n\tprivate AmqpTemplate rabbitTemplate;\n\n\tpublic void send(int i) {\n\t\tString context = \"spirng boot neo queue\"+\" ****** \"+i;\n\t\tSystem.out.println(\"Sender2 : \" + context);\n\t\tthis.rabbitTemplate.convertAndSend(\"neo\", context);\n\t}\n\n}"
  },
  {
    "path": "1.x/spring-boot-rabbitmq/src/main/java/com/neo/rabbit/object/ObjectReceiver.java",
    "content": "package com.neo.rabbit.object;\n\nimport com.neo.model.User;\nimport org.springframework.amqp.rabbit.annotation.RabbitHandler;\nimport org.springframework.amqp.rabbit.annotation.RabbitListener;\nimport org.springframework.stereotype.Component;\n\n@Component\n@RabbitListener(queues = \"object\")\npublic class ObjectReceiver {\n\n    @RabbitHandler\n    public void process(User user) {\n        System.out.println(\"Receiver object : \" + user);\n    }\n\n}\n"
  },
  {
    "path": "1.x/spring-boot-rabbitmq/src/main/java/com/neo/rabbit/object/ObjectSender.java",
    "content": "package com.neo.rabbit.object;\n\nimport com.neo.model.User;\nimport org.springframework.amqp.core.AmqpTemplate;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\nimport java.util.Date;\n\n@Component\npublic class ObjectSender {\n\n\t@Autowired\n\tprivate AmqpTemplate rabbitTemplate;\n\n\tpublic void send(User user) {\n\t\tSystem.out.println(\"Sender object: \" + user.toString());\n\t\tthis.rabbitTemplate.convertAndSend(\"object\", user);\n\t}\n\n}"
  },
  {
    "path": "1.x/spring-boot-rabbitmq/src/main/java/com/neo/rabbit/topic/TopicReceiver.java",
    "content": "package com.neo.rabbit.topic;\n\nimport org.springframework.amqp.rabbit.annotation.RabbitHandler;\nimport org.springframework.amqp.rabbit.annotation.RabbitListener;\nimport org.springframework.stereotype.Component;\n\n@Component\n@RabbitListener(queues = \"topic.message\")\npublic class TopicReceiver {\n\n    @RabbitHandler\n    public void process(String message) {\n        System.out.println(\"Topic Receiver1  : \" + message);\n    }\n\n}\n"
  },
  {
    "path": "1.x/spring-boot-rabbitmq/src/main/java/com/neo/rabbit/topic/TopicReceiver2.java",
    "content": "package com.neo.rabbit.topic;\n\nimport org.springframework.amqp.rabbit.annotation.RabbitHandler;\nimport org.springframework.amqp.rabbit.annotation.RabbitListener;\nimport org.springframework.stereotype.Component;\n\n@Component\n@RabbitListener(queues = \"topic.messages\")\npublic class TopicReceiver2 {\n\n    @RabbitHandler\n    public void process(String message) {\n        System.out.println(\"Topic Receiver2  : \" + message);\n    }\n\n}\n"
  },
  {
    "path": "1.x/spring-boot-rabbitmq/src/main/java/com/neo/rabbit/topic/TopicSender.java",
    "content": "package com.neo.rabbit.topic;\n\nimport org.springframework.amqp.core.AmqpTemplate;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\nimport java.util.Date;\n\n@Component\npublic class TopicSender {\n\n\t@Autowired\n\tprivate AmqpTemplate rabbitTemplate;\n\n\tpublic void send() {\n\t\tString context = \"hi, i am message all\";\n\t\tSystem.out.println(\"Sender : \" + context);\n\t\tthis.rabbitTemplate.convertAndSend(\"topicExchange\", \"topic.1\", context);\n\t}\n\n\tpublic void send1() {\n\t\tString context = \"hi, i am message 1\";\n\t\tSystem.out.println(\"Sender : \" + context);\n\t\tthis.rabbitTemplate.convertAndSend(\"topicExchange\", \"topic.message\", context);\n\t}\n\n\tpublic void send2() {\n\t\tString context = \"hi, i am messages 2\";\n\t\tSystem.out.println(\"Sender : \" + context);\n\t\tthis.rabbitTemplate.convertAndSend(\"topicExchange\", \"topic.messages\", context);\n\t}\n\n}"
  },
  {
    "path": "1.x/spring-boot-rabbitmq/src/main/resources/application.properties",
    "content": "spring.application.name=spirng-boot-rabbitmq-example\n\nspring.rabbitmq.host=192.168.0.86\nspring.rabbitmq.port=5672\nspring.rabbitmq.username=admin\nspring.rabbitmq.password=123456\n"
  },
  {
    "path": "1.x/spring-boot-rabbitmq/src/test/java/com/neo/ApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class ApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t\tSystem.out.println(\"hello world\");\n\t}\n\n}\n"
  },
  {
    "path": "1.x/spring-boot-rabbitmq/src/test/java/com/neo/rabbitmq/FanoutTest.java",
    "content": "package com.neo.rabbitmq;\n\nimport com.neo.rabbit.fanout.FanoutSender;\nimport com.neo.rabbit.topic.TopicSender;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class FanoutTest {\n\n\t@Autowired\n\tprivate FanoutSender sender;\n\n\t@Test\n\tpublic void fanoutSender() throws Exception {\n\t\tsender.send();\n\t}\n\n\n}"
  },
  {
    "path": "1.x/spring-boot-rabbitmq/src/test/java/com/neo/rabbitmq/HelloTest.java",
    "content": "package com.neo.rabbitmq;\n\nimport com.neo.rabbit.hello.HelloSender;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class HelloTest {\n\n\t@Autowired\n\tprivate HelloSender helloSender;\n\n\t@Test\n\tpublic void hello() throws Exception {\n\t\thelloSender.send();\n\t}\n\n\n}"
  },
  {
    "path": "1.x/spring-boot-rabbitmq/src/test/java/com/neo/rabbitmq/ManyTest.java",
    "content": "package com.neo.rabbitmq;\n\nimport com.neo.rabbit.many.NeoSender;\nimport com.neo.rabbit.many.NeoSender2;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class ManyTest {\n\t@Autowired\n\tprivate NeoSender neoSender;\n\n\t@Autowired\n\tprivate NeoSender2 neoSender2;\n\n\t@Test\n\tpublic void oneToMany() throws Exception {\n\t\tfor (int i=0;i<100;i++){\n\t\t\tneoSender.send(i);\n\t\t}\n\t}\n\n\t@Test\n\tpublic void manyToMany() throws Exception {\n\t\tfor (int i=0;i<100;i++){\n\t\t\tneoSender.send(i);\n\t\t\tneoSender2.send(i);\n\t\t}\n\t}\n\n}"
  },
  {
    "path": "1.x/spring-boot-rabbitmq/src/test/java/com/neo/rabbitmq/ObjectTest.java",
    "content": "package com.neo.rabbitmq;\n\nimport com.neo.model.User;\nimport com.neo.rabbit.object.ObjectSender;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class ObjectTest {\n\n\t@Autowired\n\tprivate ObjectSender sender;\n\n\t@Test\n\tpublic void sendOject() throws Exception {\n\t\tUser user=new User();\n\t\tuser.setName(\"neo\");\n\t\tuser.setPass(\"123456\");\n\t\tsender.send(user);\n\t}\n\n}"
  },
  {
    "path": "1.x/spring-boot-rabbitmq/src/test/java/com/neo/rabbitmq/TopicTest.java",
    "content": "package com.neo.rabbitmq;\n\nimport com.neo.rabbit.topic.TopicSender;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class TopicTest {\n\n\t@Autowired\n\tprivate TopicSender sender;\n\n\t@Test\n\tpublic void topic() throws Exception {\n\t\tsender.send();\n\t}\n\n\t@Test\n\tpublic void topic1() throws Exception {\n\t\tsender.send1();\n\t}\n\n\t@Test\n\tpublic void topic2() throws Exception {\n\t\tsender.send2();\n\t}\n\n}"
  },
  {
    "path": "1.x/spring-boot-scheduler/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-scheduler</artifactId>\n\t<version>1.0.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-scheduler</name>\n\t<description>Demo project for Spring Boot and scheduler</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>1.4.2.RELEASE</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t     <dependency>\n\t        <groupId>org.springframework.boot</groupId>\n\t        <artifactId>spring-boot-devtools</artifactId>\n\t        <optional>true</optional>\n\t\t</dependency>\n\t</dependencies>\n\t\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t\t<configuration>\n\t                <fork>true</fork>\n\t            </configuration>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\t\n\n</project>\n"
  },
  {
    "path": "1.x/spring-boot-scheduler/src/main/java/com/neo/Application.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.scheduling.annotation.EnableScheduling;\n\n@SpringBootApplication\n@EnableScheduling\npublic class Application {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(Application.class, args);\n\t}\n}\n"
  },
  {
    "path": "1.x/spring-boot-scheduler/src/main/java/com/neo/task/Scheduler2Task.java",
    "content": "package com.neo.task;\n\nimport org.springframework.scheduling.annotation.Scheduled;\nimport org.springframework.stereotype.Component;\n\nimport java.text.SimpleDateFormat;\nimport java.util.Date;\n\n/**\n * Created by summer on 2016/12/1.\n */\n\n@Component\npublic class Scheduler2Task {\n\n    private static final SimpleDateFormat dateFormat = new SimpleDateFormat(\"HH:mm:ss\");\n\n    @Scheduled(fixedRate = 6000)\n    public void reportCurrentTime() {\n        System.out.println(\"现在时间：\" + dateFormat.format(new Date()));\n    }\n\n}\n"
  },
  {
    "path": "1.x/spring-boot-scheduler/src/main/java/com/neo/task/SchedulerTask.java",
    "content": "package com.neo.task;\n\nimport org.springframework.scheduling.annotation.Scheduled;\nimport org.springframework.stereotype.Component;\n\nimport java.util.Date;\n\n/**\n * Created by summer on 2016/12/1.\n */\n\n@Component\npublic class SchedulerTask {\n\n    private int count=0;\n\n    @Scheduled(cron=\"*/6 * * * * ?\")\n    private void process(){\n        System.out.println(\"this is scheduler task runing  \"+(count++));\n    }\n\n}\n"
  },
  {
    "path": "1.x/spring-boot-scheduler/src/main/resources/application.properties",
    "content": "spring.application.name=spirng-boot-scheduler\n\n"
  },
  {
    "path": "1.x/spring-boot-scheduler/src/test/java/com/neo/ApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class ApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t\tSystem.out.println(\"hello world\");\n\t}\n\n}\n"
  },
  {
    "path": "1.x/spring-boot-shiro/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-shiro</artifactId>\n\t<version>0.0.1-SNAPSHOT</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-shiro</name>\n\t<description>Demo project for Spring Boot</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>1.5.4.RELEASE</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-data-jpa</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-thymeleaf</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>net.sourceforge.nekohtml</groupId>\n\t\t\t<artifactId>nekohtml</artifactId>\n\t\t\t<version>1.9.22</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-web</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.apache.shiro</groupId>\n\t\t\t<artifactId>shiro-spring</artifactId>\n\t\t\t<version>1.7.2</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>mysql</groupId>\n\t\t\t<artifactId>mysql-connector-java</artifactId>\n\t\t\t<scope>runtime</scope>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-devtools</artifactId>\n\t\t\t<optional>true</optional>\n\t\t</dependency>\n\t</dependencies>\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t\t<configuration>\n\t\t\t\t\t<fork>true</fork>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\n</project>\n"
  },
  {
    "path": "1.x/spring-boot-shiro/src/main/java/com/neo/SpringBootShiroApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class SpringBootShiroApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(SpringBootShiroApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "1.x/spring-boot-shiro/src/main/java/com/neo/config/MyShiroRealm.java",
    "content": "package com.neo.config;\n\nimport com.neo.entity.SysPermission;\nimport com.neo.entity.SysRole;\nimport com.neo.entity.UserInfo;\nimport com.neo.sevice.UserInfoService;\nimport org.apache.shiro.authc.AuthenticationException;\nimport org.apache.shiro.authc.AuthenticationInfo;\nimport org.apache.shiro.authc.AuthenticationToken;\nimport org.apache.shiro.authc.SimpleAuthenticationInfo;\nimport org.apache.shiro.authz.AuthorizationInfo;\nimport org.apache.shiro.authz.SimpleAuthorizationInfo;\nimport org.apache.shiro.realm.AuthorizingRealm;\nimport org.apache.shiro.subject.PrincipalCollection;\nimport org.apache.shiro.util.ByteSource;\n\nimport javax.annotation.Resource;\n\npublic class MyShiroRealm extends AuthorizingRealm {\n    @Resource\n    private UserInfoService userInfoService;\n    @Override\n    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {\n        System.out.println(\"权限配置-->MyShiroRealm.doGetAuthorizationInfo()\");\n        SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();\n        UserInfo userInfo  = (UserInfo)principals.getPrimaryPrincipal();\n        for(SysRole role:userInfo.getRoleList()){\n            authorizationInfo.addRole(role.getRole());\n            for(SysPermission p:role.getPermissions()){\n                authorizationInfo.addStringPermission(p.getPermission());\n            }\n        }\n        return authorizationInfo;\n    }\n\n    /*主要是用来进行身份认证的，也就是说验证用户输入的账号和密码是否正确。*/\n    @Override\n    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token)\n            throws AuthenticationException {\n        System.out.println(\"MyShiroRealm.doGetAuthenticationInfo()\");\n        //获取用户的输入的账号.\n        String username = (String)token.getPrincipal();\n        System.out.println(token.getCredentials());\n        //通过username从数据库中查找 User对象，如果找到，没找到.\n        //实际项目中，这里可以根据实际情况做缓存，如果不做，Shiro自己也是有时间间隔机制，2分钟内不会重复执行该方法\n        UserInfo userInfo = userInfoService.findByUsername(username);\n        System.out.println(\"----->>userInfo=\"+userInfo);\n        if(userInfo == null){\n            return null;\n        }\n        SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(\n                userInfo, //用户名\n                userInfo.getPassword(), //密码\n                ByteSource.Util.bytes(userInfo.getCredentialsSalt()),//salt=username+salt\n                getName()  //realm name\n        );\n        return authenticationInfo;\n    }\n\n}"
  },
  {
    "path": "1.x/spring-boot-shiro/src/main/java/com/neo/config/ShiroConfig.java",
    "content": "package com.neo.config;\n\nimport org.apache.shiro.authc.credential.HashedCredentialsMatcher;\nimport org.apache.shiro.mgt.SecurityManager;\nimport org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;\nimport org.apache.shiro.spring.web.ShiroFilterFactoryBean;\nimport org.apache.shiro.web.mgt.DefaultWebSecurityManager;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.web.servlet.handler.SimpleMappingExceptionResolver;\n\nimport java.util.LinkedHashMap;\nimport java.util.Map;\nimport java.util.Properties;\n\n@Configuration\npublic class ShiroConfig {\n\t@Bean\n\tpublic ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) {\n\t\tSystem.out.println(\"ShiroConfiguration.shirFilter()\");\n\t\tShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();\n\t\tshiroFilterFactoryBean.setSecurityManager(securityManager);\n\t\t//拦截器.\n\t\tMap<String,String> filterChainDefinitionMap = new LinkedHashMap<String,String>();\n\t\t// 配置不会被拦截的链接 顺序判断\n\t\tfilterChainDefinitionMap.put(\"/static/**\", \"anon\");\n\t\t//配置退出 过滤器,其中的具体的退出代码Shiro已经替我们实现了\n\t\tfilterChainDefinitionMap.put(\"/logout\", \"logout\");\n\t\t//<!-- 过滤链定义，从上向下顺序执行，一般将/**放在最为下边 -->:这是一个坑呢，一不小心代码就不好使了;\n\t\t//<!-- authc:所有url都必须认证通过才可以访问; anon:所有url都都可以匿名访问-->\n\t\tfilterChainDefinitionMap.put(\"/**\", \"authc\");\n\t\t// 如果不设置默认会自动寻找Web工程根目录下的\"/login.jsp\"页面\n\t\tshiroFilterFactoryBean.setLoginUrl(\"/login\");\n\t\t// 登录成功后要跳转的链接\n\t\tshiroFilterFactoryBean.setSuccessUrl(\"/index\");\n\n\t\t//未授权界面;\n\t\tshiroFilterFactoryBean.setUnauthorizedUrl(\"/403\");\n\t\tshiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);\n\t\treturn shiroFilterFactoryBean;\n\t}\n\n\t/**\n\t * 凭证匹配器\n\t * （由于我们的密码校验交给Shiro的SimpleAuthenticationInfo进行处理了\n\t * ）\n\t * @return\n\t */\n\t@Bean\n\tpublic HashedCredentialsMatcher hashedCredentialsMatcher(){\n\t\tHashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();\n\t\thashedCredentialsMatcher.setHashAlgorithmName(\"md5\");//散列算法:这里使用MD5算法;\n\t\thashedCredentialsMatcher.setHashIterations(2);//散列的次数，比如散列两次，相当于 md5(md5(\"\"));\n\t\treturn hashedCredentialsMatcher;\n\t}\n\n\t@Bean\n\tpublic MyShiroRealm myShiroRealm(){\n\t\tMyShiroRealm myShiroRealm = new MyShiroRealm();\n\t\tmyShiroRealm.setCredentialsMatcher(hashedCredentialsMatcher());\n\t\treturn myShiroRealm;\n\t}\n\n\n\t@Bean\n\tpublic SecurityManager securityManager(){\n\t\tDefaultWebSecurityManager securityManager =  new DefaultWebSecurityManager();\n\t\tsecurityManager.setRealm(myShiroRealm());\n\t\treturn securityManager;\n\t}\n\n\t/**\n\t *  开启shiro aop注解支持.\n\t *  使用代理方式;所以需要开启代码支持;\n\t * @param securityManager\n\t * @return\n\t */\n\t@Bean\n\tpublic AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager){\n\t\tAuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();\n\t\tauthorizationAttributeSourceAdvisor.setSecurityManager(securityManager);\n\t\treturn authorizationAttributeSourceAdvisor;\n\t}\n\n\t@Bean(name=\"simpleMappingExceptionResolver\")\n\tpublic SimpleMappingExceptionResolver\n\tcreateSimpleMappingExceptionResolver() {\n\t\tSimpleMappingExceptionResolver r = new SimpleMappingExceptionResolver();\n\t\tProperties mappings = new Properties();\n\t\tmappings.setProperty(\"DatabaseException\", \"databaseError\");//数据库异常处理\n\t\tmappings.setProperty(\"UnauthorizedException\",\"403\");\n\t\tr.setExceptionMappings(mappings);  // None by default\n\t\tr.setDefaultErrorView(\"error\");    // No default\n\t\tr.setExceptionAttribute(\"ex\");     // Default is \"exception\"\n\t\t//r.setWarnLogCategory(\"example.MvcLogger\");     // No default\n\t\treturn r;\n\t}\n}"
  },
  {
    "path": "1.x/spring-boot-shiro/src/main/java/com/neo/dao/UserInfoDao.java",
    "content": "package com.neo.dao;\n\nimport com.neo.entity.UserInfo;\nimport org.springframework.data.repository.CrudRepository;\n\npublic interface UserInfoDao extends CrudRepository<UserInfo,Long> {\n    /**通过username查找用户信息;*/\n    public UserInfo findByUsername(String username);\n}"
  },
  {
    "path": "1.x/spring-boot-shiro/src/main/java/com/neo/entity/SysPermission.java",
    "content": "package com.neo.entity;\n\nimport javax.persistence.*;\nimport java.io.Serializable;\nimport java.util.List;\n\n@Entity\npublic class SysPermission implements Serializable {\n    @Id@GeneratedValue\n    private Integer id;//主键.\n    private String name;//名称.\n    @Column(columnDefinition=\"enum('menu','button')\")\n    private String resourceType;//资源类型，[menu|button]\n    private String url;//资源路径.\n    private String permission; //权限字符串,menu例子：role:*，button例子：role:create,role:update,role:delete,role:view\n    private Long parentId; //父编号\n    private String parentIds; //父编号列表\n    private Boolean available = Boolean.FALSE;\n    @ManyToMany\n    @JoinTable(name=\"SysRolePermission\",joinColumns={@JoinColumn(name=\"permissionId\")},inverseJoinColumns={@JoinColumn(name=\"roleId\")})\n    private List<SysRole> roles;\n\n    public Integer getId() {\n        return id;\n    }\n\n    public void setId(Integer id) {\n        this.id = id;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public String getResourceType() {\n        return resourceType;\n    }\n\n    public void setResourceType(String resourceType) {\n        this.resourceType = resourceType;\n    }\n\n    public String getUrl() {\n        return url;\n    }\n\n    public void setUrl(String url) {\n        this.url = url;\n    }\n\n    public String getPermission() {\n        return permission;\n    }\n\n    public void setPermission(String permission) {\n        this.permission = permission;\n    }\n\n    public Long getParentId() {\n        return parentId;\n    }\n\n    public void setParentId(Long parentId) {\n        this.parentId = parentId;\n    }\n\n    public String getParentIds() {\n        return parentIds;\n    }\n\n    public void setParentIds(String parentIds) {\n        this.parentIds = parentIds;\n    }\n\n    public Boolean getAvailable() {\n        return available;\n    }\n\n    public void setAvailable(Boolean available) {\n        this.available = available;\n    }\n\n    public List<SysRole> getRoles() {\n        return roles;\n    }\n\n    public void setRoles(List<SysRole> roles) {\n        this.roles = roles;\n    }\n}"
  },
  {
    "path": "1.x/spring-boot-shiro/src/main/java/com/neo/entity/SysRole.java",
    "content": "package com.neo.entity;\n\nimport javax.persistence.*;\nimport java.util.List;\n\n@Entity\npublic class SysRole {\n    @Id@GeneratedValue\n    private Integer id; // 编号\n    private String role; // 角色标识程序中判断使用,如\"admin\",这个是唯一的:\n    private String description; // 角色描述,UI界面显示使用\n    private Boolean available = Boolean.FALSE; // 是否可用,如果不可用将不会添加给用户\n\n    //角色 -- 权限关系：多对多关系;\n    @ManyToMany(fetch= FetchType.EAGER)\n    @JoinTable(name=\"SysRolePermission\",joinColumns={@JoinColumn(name=\"roleId\")},inverseJoinColumns={@JoinColumn(name=\"permissionId\")})\n    private List<SysPermission> permissions;\n\n    // 用户 - 角色关系定义;\n    @ManyToMany\n    @JoinTable(name=\"SysUserRole\",joinColumns={@JoinColumn(name=\"roleId\")},inverseJoinColumns={@JoinColumn(name=\"uid\")})\n    private List<UserInfo> userInfos;// 一个角色对应多个用户\n\n    public Integer getId() {\n        return id;\n    }\n\n    public void setId(Integer id) {\n        this.id = id;\n    }\n\n    public String getRole() {\n        return role;\n    }\n\n    public void setRole(String role) {\n        this.role = role;\n    }\n\n    public String getDescription() {\n        return description;\n    }\n\n    public void setDescription(String description) {\n        this.description = description;\n    }\n\n    public Boolean getAvailable() {\n        return available;\n    }\n\n    public void setAvailable(Boolean available) {\n        this.available = available;\n    }\n\n    public List<SysPermission> getPermissions() {\n        return permissions;\n    }\n\n    public void setPermissions(List<SysPermission> permissions) {\n        this.permissions = permissions;\n    }\n\n    public List<UserInfo> getUserInfos() {\n        return userInfos;\n    }\n\n    public void setUserInfos(List<UserInfo> userInfos) {\n        this.userInfos = userInfos;\n    }\n}"
  },
  {
    "path": "1.x/spring-boot-shiro/src/main/java/com/neo/entity/UserInfo.java",
    "content": "package com.neo.entity;\n\nimport javax.persistence.*;\nimport java.io.Serializable;\nimport java.util.List;\n\n@Entity\npublic class UserInfo implements Serializable {\n    @Id\n    @GeneratedValue\n    private Integer uid;\n    @Column(unique =true)\n    private String username;//帐号\n    private String name;//名称（昵称或者真实姓名，不同系统不同定义）\n    private String password; //密码;\n    private String salt;//加密密码的盐\n    private byte state;//用户状态,0:创建未认证（比如没有激活，没有输入验证码等等）--等待验证的用户 , 1:正常状态,2：用户被锁定.\n    @ManyToMany(fetch= FetchType.EAGER)//立即从数据库中进行加载数据;\n    @JoinTable(name = \"SysUserRole\", joinColumns = { @JoinColumn(name = \"uid\") }, inverseJoinColumns ={@JoinColumn(name = \"roleId\") })\n    private List<SysRole> roleList;// 一个用户具有多个角色\n\n    public Integer getUid() {\n        return uid;\n    }\n\n    public void setUid(Integer uid) {\n        this.uid = uid;\n    }\n\n    public String getUsername() {\n        return username;\n    }\n\n    public void setUsername(String username) {\n        this.username = username;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public String getPassword() {\n        return password;\n    }\n\n    public void setPassword(String password) {\n        this.password = password;\n    }\n\n    public String getSalt() {\n        return salt;\n    }\n\n    public void setSalt(String salt) {\n        this.salt = salt;\n    }\n\n    public byte getState() {\n        return state;\n    }\n\n    public void setState(byte state) {\n        this.state = state;\n    }\n\n    public List<SysRole> getRoleList() {\n        return roleList;\n    }\n\n    public void setRoleList(List<SysRole> roleList) {\n        this.roleList = roleList;\n    }\n\n    /**\n     * 密码盐.\n     * @return\n     */\n    public String getCredentialsSalt(){\n        return this.username+this.salt;\n    }\n    //重新对盐重新进行了定义，用户名+salt，这样就更加不容易被破解\n}"
  },
  {
    "path": "1.x/spring-boot-shiro/src/main/java/com/neo/sevice/UserInfoService.java",
    "content": "package com.neo.sevice;\n\nimport com.neo.entity.UserInfo;\n\npublic interface UserInfoService {\n    /**通过username查找用户信息;*/\n    public UserInfo findByUsername(String username);\n}"
  },
  {
    "path": "1.x/spring-boot-shiro/src/main/java/com/neo/sevice/impl/UserInfoServiceImpl.java",
    "content": "package com.neo.sevice.impl;\n\nimport com.neo.dao.UserInfoDao;\nimport com.neo.entity.UserInfo;\nimport com.neo.sevice.UserInfoService;\nimport org.springframework.stereotype.Service;\n\nimport javax.annotation.Resource;\n\n@Service\npublic class UserInfoServiceImpl implements UserInfoService {\n    @Resource\n    private UserInfoDao userInfoDao;\n    @Override\n    public UserInfo findByUsername(String username) {\n        System.out.println(\"UserInfoServiceImpl.findByUsername()\");\n        return userInfoDao.findByUsername(username);\n    }\n}"
  },
  {
    "path": "1.x/spring-boot-shiro/src/main/java/com/neo/web/HomeController.java",
    "content": "package com.neo.web;\n\nimport org.apache.shiro.authc.IncorrectCredentialsException;\nimport org.apache.shiro.authc.UnknownAccountException;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.RequestMapping;\n\nimport javax.servlet.http.HttpServletRequest;\nimport java.util.Map;\n\n@Controller\npublic class HomeController {\n    @RequestMapping({\"/\",\"/index\"})\n    public String index(){\n        return\"/index\";\n    }\n\n    @RequestMapping(\"/login\")\n    public String login(HttpServletRequest request, Map<String, Object> map) throws Exception{\n        System.out.println(\"HomeController.login()\");\n        // 登录失败从request中获取shiro处理的异常信息。\n        // shiroLoginFailure:就是shiro异常类的全类名.\n        String exception = (String) request.getAttribute(\"shiroLoginFailure\");\n        System.out.println(\"exception=\" + exception);\n        String msg = \"\";\n        if (exception != null) {\n            if (UnknownAccountException.class.getName().equals(exception)) {\n                System.out.println(\"UnknownAccountException -- > 账号不存在：\");\n                msg = \"UnknownAccountException -- > 账号不存在：\";\n            } else if (IncorrectCredentialsException.class.getName().equals(exception)) {\n                System.out.println(\"IncorrectCredentialsException -- > 密码不正确：\");\n                msg = \"IncorrectCredentialsException -- > 密码不正确：\";\n            } else if (\"kaptchaValidateFailed\".equals(exception)) {\n                System.out.println(\"kaptchaValidateFailed -- > 验证码错误\");\n                msg = \"kaptchaValidateFailed -- > 验证码错误\";\n            } else {\n                msg = \"else >> \"+exception;\n                System.out.println(\"else -- >\" + exception);\n            }\n        }\n        map.put(\"msg\", msg);\n        // 此方法不处理登录成功,由shiro进行处理\n        return \"/login\";\n    }\n\n    @RequestMapping(\"/403\")\n    public String unauthorizedRole(){\n        System.out.println(\"------没有权限-------\");\n        return \"403\";\n    }\n\n}"
  },
  {
    "path": "1.x/spring-boot-shiro/src/main/java/com/neo/web/UserInfoController.java",
    "content": "package com.neo.web;\n\nimport org.apache.shiro.authz.annotation.RequiresPermissions;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.RequestMapping;\n\n@Controller\n@RequestMapping(\"/userInfo\")\npublic class UserInfoController {\n\n    /**\n     * 用户查询.\n     * @return\n     */\n    @RequestMapping(\"/userList\")\n    @RequiresPermissions(\"userInfo:view\")//权限管理;\n    public String userInfo(){\n        return \"userInfo\";\n    }\n\n    /**\n     * 用户添加;\n     * @return\n     */\n    @RequestMapping(\"/userAdd\")\n    @RequiresPermissions(\"userInfo:add\")//权限管理;\n    public String userInfoAdd(){\n        return \"userInfoAdd\";\n    }\n\n    /**\n     * 用户删除;\n     * @return\n     */\n    @RequestMapping(\"/userDel\")\n    @RequiresPermissions(\"userInfo:del\")//权限管理;\n    public String userDel(){\n        return \"userInfoDel\";\n    }\n}"
  },
  {
    "path": "1.x/spring-boot-shiro/src/main/resources/application.yml",
    "content": "spring:\n    datasource:\n      url: jdbc:mysql://localhost:3306/test\n      username: root\n      password: root\n      #schema: database/import.sql\n      #sql-script-encoding: utf-8\n      driver-class-name: com.mysql.jdbc.Driver\n\n    jpa:\n      database: mysql\n      show-sql: true\n      hibernate:\n        ddl-auto: update\n        naming:\n          strategy: org.hibernate.cfg.DefaultComponentSafeNamingStrategy\n      properties:\n         hibernate:\n            dialect: org.hibernate.dialect.MySQL5Dialect\n\n    thymeleaf:\n       cache: false\n       mode: LEGACYHTML5"
  },
  {
    "path": "1.x/spring-boot-shiro/src/main/resources/database/import.sql",
    "content": "INSERT INTO `user_info` (`uid`,`username`,`name`,`password`,`salt`,`state`) VALUES ('1', 'admin', '管理员', 'd3c59d25033dbf980d29554025c23a75', '8d78869f470951332959580424d4bf4f', 0);\nINSERT INTO `sys_permission` (`id`,`available`,`name`,`parent_id`,`parent_ids`,`permission`,`resource_type`,`url`) VALUES (1,0,'用户管理',0,'0/','userInfo:view','menu','userInfo/userList');\nINSERT INTO `sys_permission` (`id`,`available`,`name`,`parent_id`,`parent_ids`,`permission`,`resource_type`,`url`) VALUES (2,0,'用户添加',1,'0/1','userInfo:add','button','userInfo/userAdd');\nINSERT INTO `sys_permission` (`id`,`available`,`name`,`parent_id`,`parent_ids`,`permission`,`resource_type`,`url`) VALUES (3,0,'用户删除',1,'0/1','userInfo:del','button','userInfo/userDel');\nINSERT INTO `sys_role` (`id`,`available`,`description`,`role`) VALUES (1,0,'管理员','admin');\nINSERT INTO `sys_role` (`id`,`available`,`description`,`role`) VALUES (2,0,'VIP会员','vip');\nINSERT INTO `sys_role` (`id`,`available`,`description`,`role`) VALUES (3,1,'test','test');\nINSERT INTO `sys_role_permission` VALUES ('1', '1');\nINSERT INTO `sys_role_permission` (`permission_id`,`role_id`) VALUES (1,1);\nINSERT INTO `sys_role_permission` (`permission_id`,`role_id`) VALUES (2,1);\nINSERT INTO `sys_role_permission` (`permission_id`,`role_id`) VALUES (3,2);\nINSERT INTO `sys_user_role` (`role_id`,`uid`) VALUES (1,1);"
  },
  {
    "path": "1.x/spring-boot-shiro/src/main/resources/templates/403.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>403</title>\n</head>\n<body>\n<h3>403没有权限</h3>\n</body>\n</html>"
  },
  {
    "path": "1.x/spring-boot-shiro/src/main/resources/templates/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>index</title>\n</head>\n<body>\n<h1>index</h1>\n</body>\n</html>"
  },
  {
    "path": "1.x/spring-boot-shiro/src/main/resources/templates/login.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>Login</title>\n</head>\n<body>\n错误信息：<h4 th:text=\"${msg}\"></h4>\n<form action=\"\" method=\"post\">\n    <p>账号：<input type=\"text\" name=\"username\" value=\"admin\"/></p>\n    <p>密码：<input type=\"text\" name=\"password\" value=\"123456\"/></p>\n    <p><input type=\"submit\" value=\"登录\"/></p>\n</form>\n</body>\n</html>"
  },
  {
    "path": "1.x/spring-boot-shiro/src/main/resources/templates/userInfo.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>UserInfo</title>\n</head>\n<body>\n<h3>用户查询界面</h3>\n</body>\n</html>"
  },
  {
    "path": "1.x/spring-boot-shiro/src/main/resources/templates/userInfoAdd.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>Add</title>\n</head>\n<body>\n<h3>用户添加界面</h3>\n</body>\n</html>"
  },
  {
    "path": "1.x/spring-boot-shiro/src/main/resources/templates/userInfoDel.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>Del</title>\n</head>\n<body>\n<h3>用户删除界面</h3>\n</body>\n</html>"
  },
  {
    "path": "1.x/spring-boot-shiro/src/test/java/com/neo/SpringBootShiroApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class SpringBootShiroApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t}\n\n}\n"
  },
  {
    "path": "1.x/spring-boot-thymeleaf/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <artifactId>spring-boot-thymeleaf</artifactId>\n    <name>spring-boot-thymeleaf</name>\n    <description>spring-boot-thymeleaf</description>\n    <parent>\n        <groupId>org.springframework.boot</groupId>\n        <artifactId>spring-boot-starter-parent</artifactId>\n        <version>1.5.6.RELEASE</version>\n    </parent>\n\n    <properties>\n        <java.version>1.8</java.version>\n    </properties>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-web</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-thymeleaf</artifactId>\n        </dependency>\n    </dependencies>\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.springframework.boot</groupId>\n                <artifactId>spring-boot-maven-plugin</artifactId>\n            </plugin>\n        </plugins>\n    </build>\n</project>"
  },
  {
    "path": "1.x/spring-boot-thymeleaf/src/main/java/com/neo/thymeleaf/HelloController.java",
    "content": "package com.neo.thymeleaf;\n\nimport org.springframework.stereotype.Controller;\nimport org.springframework.ui.Model;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\n\n@Controller\npublic class HelloController {\n    @RequestMapping(\"/hello\")\n    public String hello(Model model, @RequestParam(value=\"name\", required=false, defaultValue=\"World\") String name) {\n        model.addAttribute(\"name\", name);\n        return \"hello\";\n    }\n}\n"
  },
  {
    "path": "1.x/spring-boot-thymeleaf/src/main/java/com/neo/thymeleaf/ThymeleafApplication.java",
    "content": "package com.neo.thymeleaf;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.boot.builder.SpringApplicationBuilder;\nimport org.springframework.boot.web.support.SpringBootServletInitializer;\n\n\n@SpringBootApplication\npublic class ThymeleafApplication extends SpringBootServletInitializer {\n    @Override\n    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {\n        return application.sources(ThymeleafApplication.class);\n    }\n\n    public static void main(String[] args) throws Exception {\n        SpringApplication.run(ThymeleafApplication.class, args);\n    }\n}\n\n"
  },
  {
    "path": "1.x/spring-boot-thymeleaf/src/main/resources/application.properties",
    "content": "spring.thymeleaf.cache: false"
  },
  {
    "path": "1.x/spring-boot-thymeleaf/src/main/resources/templates/hello.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"UTF-8\"/>\n    <title>Hello Thymeleaf!</title>\n</head>\n<body>\n    <p th:text=\"'Hello, ' + ${name} + '!'\" />\n</body>\n</html>"
  },
  {
    "path": "1.x/spring-boot-web/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-web</artifactId>\n\t<version>0.0.1-SNAPSHOT</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-web</name>\n\t<description>Demo project for Spring Boot</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>1.5.6.RELEASE</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t\t<dependency>\n\t        <groupId>org.springframework.boot</groupId>\n\t        <artifactId>spring-boot-starter-web</artifactId>\n\t    </dependency>\n\t    <dependency>\n\t        <groupId>org.springframework.boot</groupId>\n\t        <artifactId>spring-boot-starter-data-jpa</artifactId>\n\t    </dependency>\n\t     <dependency>\n\t        <groupId>mysql</groupId>\n\t        <artifactId>mysql-connector-java</artifactId>\n\t    </dependency>\n\t     <dependency>\n\t        <groupId>org.springframework.boot</groupId>\n\t        <artifactId>spring-boot-devtools</artifactId>\n\t        <optional>true</optional>\n\t\t</dependency>\n\t\t<dependency>  \n\t\t    <groupId>org.springframework.boot</groupId>\n\t\t    <artifactId>spring-boot-starter-thymeleaf</artifactId>\n\t\t</dependency> \n\t\t<dependency>\n\t\t    <groupId>org.webjars.bower</groupId>\n\t\t    <artifactId>jquery</artifactId>\n\t\t    <version>2.0.3</version>\n\t\t</dependency> \n\t\t<dependency>\n\t\t    <groupId>org.webjars.bower</groupId>\n\t\t    <artifactId>bootstrap</artifactId>\n\t\t    <version>3.0.3</version>\n\t\t</dependency>\n\t\t<dependency>  \n\t\t    <groupId>org.springframework.boot</groupId>  \n\t\t    <artifactId>spring-boot-starter-redis</artifactId>  \n\t\t</dependency>  \n\t\t<dependency>\n\t\t    <groupId>org.springframework.session</groupId>\n\t\t    <artifactId>spring-session-data-redis</artifactId>\n\t\t</dependency>\n\t</dependencies>\n\t\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t\t<configuration>\n\t                <fork>true</fork>\n\t            </configuration>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\t\n\n</project>\n"
  },
  {
    "path": "1.x/spring-boot-web/src/main/java/com/neo/Application.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class Application {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(Application.class, args);\n\t}\n}\n"
  },
  {
    "path": "1.x/spring-boot-web/src/main/java/com/neo/WebConfiguration.java",
    "content": "package com.neo;\n\nimport java.io.IOException;\n\nimport javax.servlet.Filter;\nimport javax.servlet.FilterChain;\nimport javax.servlet.FilterConfig;\nimport javax.servlet.ServletException;\nimport javax.servlet.ServletRequest;\nimport javax.servlet.ServletResponse;\nimport javax.servlet.http.HttpServletRequest;\n\nimport org.apache.catalina.filters.RemoteIpFilter;\nimport org.springframework.boot.web.servlet.FilterRegistrationBean;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n@Configuration\npublic class WebConfiguration {\n    @Bean\n    public RemoteIpFilter remoteIpFilter() {\n        return new RemoteIpFilter();\n    }\n    \n    @Bean\n    public FilterRegistrationBean testFilterRegistration() {\n\n        FilterRegistrationBean registration = new FilterRegistrationBean();\n        registration.setFilter(new MyFilter());\n        registration.addUrlPatterns(\"/*\");\n        registration.addInitParameter(\"paramName\", \"paramValue\");\n        registration.setName(\"MyFilter\");\n        registration.setOrder(1);\n        return registration;\n    }\n    \n    public class MyFilter implements Filter {\n\t\t@Override\n\t\tpublic void destroy() {\n\t\t\t// TODO Auto-generated method stub\n\t\t}\n\n\t\t@Override\n\t\tpublic void doFilter(ServletRequest srequest, ServletResponse sresponse, FilterChain filterChain)\n\t\t\t\tthrows IOException, ServletException {\n\t\t\t// TODO Auto-generated method stub\n\t\t\tHttpServletRequest request = (HttpServletRequest) srequest;\n\t\t\tSystem.out.println(\"this is MyFilter,url :\"+request.getRequestURI());\n\t\t\tfilterChain.doFilter(srequest, sresponse);\n\t\t}\n\n\t\t@Override\n\t\tpublic void init(FilterConfig arg0) throws ServletException {\n\t\t\t// TODO Auto-generated method stub\n\t\t}\n    }\n}\n\n\n\n"
  },
  {
    "path": "1.x/spring-boot-web/src/main/java/com/neo/config/RedisConfig.java",
    "content": "package com.neo.config;\n\nimport java.lang.reflect.Method;\n\nimport org.springframework.cache.CacheManager;\nimport org.springframework.cache.annotation.CachingConfigurerSupport;\nimport org.springframework.cache.annotation.EnableCaching;\nimport org.springframework.cache.interceptor.KeyGenerator;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.data.redis.cache.RedisCacheManager;\nimport org.springframework.data.redis.connection.RedisConnectionFactory;\nimport org.springframework.data.redis.core.RedisTemplate;\nimport org.springframework.data.redis.core.StringRedisTemplate;\nimport org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;\n\nimport com.fasterxml.jackson.annotation.JsonAutoDetect;\nimport com.fasterxml.jackson.annotation.PropertyAccessor;\nimport com.fasterxml.jackson.databind.ObjectMapper;\n\n@Configuration\n@EnableCaching\npublic class RedisConfig extends CachingConfigurerSupport{\n\t\n\t@Bean\n\tpublic KeyGenerator keyGenerator() {\n        return new KeyGenerator() {\n            @Override\n            public Object generate(Object target, Method method, Object... params) {\n                StringBuilder sb = new StringBuilder();\n                sb.append(target.getClass().getName());\n                sb.append(method.getName());\n                for (Object obj : params) {\n                    sb.append(obj.toString());\n                }\n                return sb.toString();\n            }\n        };\n    }\n\n    @SuppressWarnings(\"rawtypes\")\n    @Bean\n    public CacheManager cacheManager(RedisTemplate redisTemplate) {\n        RedisCacheManager rcm = new RedisCacheManager(redisTemplate);\n        //设置缓存过期时间\n        //rcm.setDefaultExpiration(60);//秒\n        return rcm;\n    }\n    \n    @Bean\n    public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {\n        StringRedisTemplate template = new StringRedisTemplate(factory);\n        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);\n        ObjectMapper om = new ObjectMapper();\n        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);\n        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);\n        jackson2JsonRedisSerializer.setObjectMapper(om);\n        template.setValueSerializer(jackson2JsonRedisSerializer);\n        template.afterPropertiesSet();\n        return template;\n    }\n\n}"
  },
  {
    "path": "1.x/spring-boot-web/src/main/java/com/neo/config/SessionConfig.java",
    "content": "package com.neo.config;\n\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;\n\n@Configuration\n@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 86400*30)\npublic class SessionConfig {\n\t\n}"
  },
  {
    "path": "1.x/spring-boot-web/src/main/java/com/neo/domain/User.java",
    "content": "package com.neo.domain;\n\nimport java.io.Serializable;\n\nimport javax.persistence.Column;\nimport javax.persistence.Entity;\nimport javax.persistence.GeneratedValue;\nimport javax.persistence.Id;\n\n@Entity\npublic class User implements Serializable {\n\n\tprivate static final long serialVersionUID = 1L;\n\t@Id\n\t@GeneratedValue\n\tprivate Long id;\n\t@Column(nullable = false, unique = true)\n\tprivate String userName;\n\t@Column(nullable = false)\n\tprivate String passWord;\n\t@Column(nullable = false, unique = true)\n\tprivate String email;\n\t@Column(nullable = true, unique = true)\n\tprivate String nickName;\n\t@Column(nullable = false)\n\tprivate String regTime;\n\n\tpublic User() {\n\t\tsuper();\n\t}\n\tpublic User(String email, String nickName, String passWord, String userName, String regTime) {\n\t\tsuper();\n\t\tthis.email = email;\n\t\tthis.nickName = nickName;\n\t\tthis.passWord = passWord;\n\t\tthis.userName = userName;\n\t\tthis.regTime = regTime;\n\t}\n\tpublic Long getId() {\n\t\treturn id;\n\t}\n\tpublic void setId(Long id) {\n\t\tthis.id = id;\n\t}\n\tpublic String getUserName() {\n\t\treturn userName;\n\t}\n\tpublic void setUserName(String userName) {\n\t\tthis.userName = userName;\n\t}\n\tpublic String getPassWord() {\n\t\treturn passWord;\n\t}\n\tpublic void setPassWord(String passWord) {\n\t\tthis.passWord = passWord;\n\t}\n\tpublic String getEmail() {\n\t\treturn email;\n\t}\n\tpublic void setEmail(String email) {\n\t\tthis.email = email;\n\t}\n\tpublic String getNickName() {\n\t\treturn nickName;\n\t}\n\tpublic void setNickName(String nickName) {\n\t\tthis.nickName = nickName;\n\t}\n\tpublic String getRegTime() {\n\t\treturn regTime;\n\t}\n\tpublic void setRegTime(String regTime) {\n\t\tthis.regTime = regTime;\n\t}\n\n}"
  },
  {
    "path": "1.x/spring-boot-web/src/main/java/com/neo/domain/UserRepository.java",
    "content": "package com.neo.domain;\n\nimport org.springframework.data.jpa.repository.JpaRepository;\n\npublic interface UserRepository extends JpaRepository<User, Long> {\n\n    User findByUserName(String userName);\n\n    User findByUserNameOrEmail(String username, String email);\n    \n}"
  },
  {
    "path": "1.x/spring-boot-web/src/main/java/com/neo/util/NeoProperties.java",
    "content": "package com.neo.util;\n\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class NeoProperties {\n\t\n\t@Value(\"${com.neo.title}\")\n\tprivate String title;\n\t@Value(\"${com.neo.description}\")\n\tprivate String description;\n\tpublic String getTitle() {\n\t\treturn title;\n\t}\n\tpublic void setTitle(String title) {\n\t\tthis.title = title;\n\t}\n\tpublic String getDescription() {\n\t\treturn description;\n\t}\n\tpublic void setDescription(String description) {\n\t\tthis.description = description;\n\t}\n\n}\n"
  },
  {
    "path": "1.x/spring-boot-web/src/main/java/com/neo/web/HelloController.java",
    "content": "package com.neo.web;\n\nimport java.util.Locale;\nimport java.util.UUID;\n\nimport javax.servlet.http.HttpSession;\n\nimport org.springframework.ui.Model;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n@RestController\npublic class HelloController {\n\t\n    @RequestMapping(\"/hello\")\n\tpublic String hello(Locale locale, Model model) {\n\t\treturn \"hello world\";\n\t}\n    \n    @RequestMapping(\"/uid\")\n    String uid(HttpSession session) {\n        UUID uid = (UUID) session.getAttribute(\"uid\");\n        if (uid == null) {\n            uid = UUID.randomUUID();\n        }\n        session.setAttribute(\"uid\", uid);\n        return session.getId();\n    }\n\n}"
  },
  {
    "path": "1.x/spring-boot-web/src/main/java/com/neo/web/ThymeleafController.java",
    "content": "package com.neo.web;\n\nimport java.text.DateFormat;\nimport java.util.Date;\nimport java.util.Locale;\n\nimport org.springframework.stereotype.Controller;\nimport org.springframework.ui.Model;\nimport org.springframework.web.bind.annotation.RequestMapping;\n\n@Controller\npublic class ThymeleafController {\n\t\n    @RequestMapping(\"/hi\")\n\tpublic String hello(Locale locale, Model model) {\n\t\tmodel.addAttribute(\"greeting\", \"Hello!\");\n\n\t\tDate date = new Date();\n\t\tDateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);        \n\t\tString formattedDate = dateFormat.format(date);\n\t\tmodel.addAttribute(\"currentTime\", formattedDate);\n\n\t\treturn \"hello\";\n\t}\n\n}"
  },
  {
    "path": "1.x/spring-boot-web/src/main/java/com/neo/web/UserController.java",
    "content": "package com.neo.web;\n\nimport java.util.List;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.cache.annotation.Cacheable;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport com.neo.domain.User;\nimport com.neo.domain.UserRepository;\n\n@RestController\npublic class UserController {\n\t\n\t@Autowired\n\tprivate UserRepository userRepository;\n\t\n    @RequestMapping(\"/getUser\")\n    @Cacheable(value=\"user-key\")\n    public User getUser() {\n    \tUser user=userRepository.findByUserName(\"aa\");\n    \tSystem.out.println(\"若下面没出现“无缓存的时候调用”字样且能打印出数据表示测试成功\");  \n        return user;\n    }\n    \n    @RequestMapping(\"/getUsers\")\n    @Cacheable(value=\"key-Users\")\n    public List<User> getUsers() {\n    \tList<User> users=userRepository.findAll();\n    \tSystem.out.println(\"若下面没出现“无缓存的时候调用”字样且能打印出数据表示测试成功\");  \n        return users;\n    }\n}"
  },
  {
    "path": "1.x/spring-boot-web/src/main/resources/application.properties",
    "content": "spring.datasource.url=jdbc:mysql://localhost:3306/test\nspring.datasource.username=root\nspring.datasource.password=root\nspring.datasource.driver-class-name=com.mysql.jdbc.Driver\n\nspring.jpa.properties.hibernate.hbm2ddl.auto=update\nspring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect\nspring.jpa.show-sql= true\n\ncom.neo.title=\\u7eaf\\u6d01\\u7684\\u5fae\\u7b11\ncom.neo.description=\\u5206\\u4eab\\u751f\\u6d3b\\u548c\\u6280\\u672f\n\n# REDIS (RedisProperties)\n# Redis\\u6570\\u636e\\u5e93\\u7d22\\u5f15\\uff08\\u9ed8\\u8ba4\\u4e3a0\\uff09\nspring.redis.database=0  \n# Redis\\u670d\\u52a1\\u5668\\u5730\\u5740\nspring.redis.host=192.168.0.71\n# Redis\\u670d\\u52a1\\u5668\\u8fde\\u63a5\\u7aef\\u53e3\nspring.redis.port=6379  \n# Redis\\u670d\\u52a1\\u5668\\u8fde\\u63a5\\u5bc6\\u7801\\uff08\\u9ed8\\u8ba4\\u4e3a\\u7a7a\\uff09\nspring.redis.password=  \n# \\u8fde\\u63a5\\u6c60\\u6700\\u5927\\u8fde\\u63a5\\u6570\\uff08\\u4f7f\\u7528\\u8d1f\\u503c\\u8868\\u793a\\u6ca1\\u6709\\u9650\\u5236\\uff09\nspring.redis.pool.max-active=8  \n# \\u8fde\\u63a5\\u6c60\\u6700\\u5927\\u963b\\u585e\\u7b49\\u5f85\\u65f6\\u95f4\\uff08\\u4f7f\\u7528\\u8d1f\\u503c\\u8868\\u793a\\u6ca1\\u6709\\u9650\\u5236\\uff09\nspring.redis.pool.max-wait=-1  \n# \\u8fde\\u63a5\\u6c60\\u4e2d\\u7684\\u6700\\u5927\\u7a7a\\u95f2\\u8fde\\u63a5\nspring.redis.pool.max-idle=8  \n# \\u8fde\\u63a5\\u6c60\\u4e2d\\u7684\\u6700\\u5c0f\\u7a7a\\u95f2\\u8fde\\u63a5\nspring.redis.pool.min-idle=0  \n# \\u8fde\\u63a5\\u8d85\\u65f6\\u65f6\\u95f4\\uff08\\u6beb\\u79d2\\uff09\nspring.redis.timeout=0 \n\n"
  },
  {
    "path": "1.x/spring-boot-web/src/main/resources/static/css/starter.css",
    "content": "body {\n  padding-top: 50px;\n}\n\n.starter-template {\n  padding: 40px 15px;\n  text-align: center;\n}"
  },
  {
    "path": "1.x/spring-boot-web/src/main/resources/templates/hello.html",
    "content": "<html xmlns:th=\"http://www.thymeleaf.org\">\n  <head th:include=\"layout :: htmlhead\" th:with=\"title='Hello'\"></head>\n\n  <body>\n    <div th:replace=\"layout :: navbar\">(navbar)</div>\n\n    <div class=\"container\">\n      <div class=\"starter-template\">\n        <h1>Spring MVC / Thymeleaf / Bootstrap</h1>\n        <p class=\"lead\" th:text=\"${greeting}\">(greeting)</p>\n        <p>The current time is <span th:text=\"${currentTime}\">(time)</span></p>\n      </div>\n    </div>\n\n    <div th:include=\"layout :: footer\" id=\"footer\">(footer)</div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "1.x/spring-boot-web/src/main/resources/templates/layout.html",
    "content": "<html xmlns:th=\"http://www.thymeleaf.org\">\n  <head th:fragment=\"htmlhead\">\n    <meta charset=\"utf-8\"></meta>\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"></meta>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"></meta>\n    <meta name=\"description\" content=\"\"></meta>\n    <meta name=\"author\" content=\"\"></meta>\n    <link rel=\"shortcut icon\" type=\"image/png\" th:href=\"@{/images/favicon.png}\"></link>\n\n   \t<title th:text=\"${title}\">(title)</title>\n\n  \t<link th:href=\"@{/webjars/bootstrap/3.0.3/dist/css/bootstrap.css}\" rel=\"stylesheet\"></link>\n  \t<link th:href=\"@{/css/starter.css}\" rel=\"stylesheet\"></link>\n  </head>\n\n  <body>\n    <div th:fragment=\"navbar\" class=\"navbar navbar-inverse navbar-fixed-top\" role=\"navigation\">\n      <div class=\"container\">\n        <div class=\"navbar-header\">\n          <button type=\"button\" class=\"navbar-toggle\" data-toggle=\"collapse\" data-target=\".navbar-collapse\">\n            <span class=\"sr-only\">Toggle navigation</span>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n          </button>\n          <a class=\"navbar-brand\" href=\"#\">Project name</a>\n        </div>\n        <div class=\"collapse navbar-collapse\">\n          <ul class=\"nav navbar-nav\">\n            <li class=\"active\"><a href=\"#\">Home</a></li>\n            <li><a href=\"#about\">About</a></li>\n            <li><a href=\"#contact\">Contact</a></li>\n          </ul>\n        </div>\n      </div>\n    </div>\n\n    <div class=\"container\">\n      <div class=\"starter-template\">\n        <h1>Spring MVC/Thymeleaf/Bootstrap</h1>\n        <p class=\"lead\" th:text=\"${greeting}\">(greeting)</p>\n      </div>\n    </div>\n\n    <div th:fragment=\"footer\" id=\"footer\">\n      <div class=\"container\">\n        <p class=\"muted credit\">Spring MVC/Thymeleaf/Bootstrap Project Template</p>\n      </div>\n      <script th:src=\"@{/webjars/jquery/2.0.3/jquery.min.js}\"></script>\n      <script th:src=\"@{/webjars/bootstrap/3.0.3/js/bootstrap.min.js}\"></script>\n    </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "1.x/spring-boot-web/src/test/java/com/neo/ApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class ApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t\tSystem.out.println(\"hello web\");\n\t}\n\n}\n"
  },
  {
    "path": "1.x/spring-boot-web/src/test/java/com/neo/domain/UserRepositoryTests.java",
    "content": "package com.neo.domain;\n\nimport java.text.DateFormat;\nimport java.util.Date;\n\nimport org.junit.Assert;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\n\nimport com.neo.Application;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class UserRepositoryTests {\n\n\t@Autowired\n\tprivate UserRepository userRepository;\n\n\t@Test\n\tpublic void test() throws Exception {\n\t\tDate date = new Date();\n\t\tDateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);        \n\t\tString formattedDate = dateFormat.format(date);\n\t\t\n\t\tuserRepository.save(new User(\"aa1\", \"aa@126.com\", \"aa\", \"aa123456\",formattedDate));\n\t\tuserRepository.save(new User(\"bb2\", \"bb@126.com\", \"bb\", \"bb123456\",formattedDate));\n\t\tuserRepository.save(new User(\"cc3\", \"cc@126.com\", \"cc\", \"cc123456\",formattedDate));\n\n\t\tAssert.assertEquals(9, userRepository.findAll().size());\n\t\tAssert.assertEquals(\"bb\", userRepository.findByUserNameOrEmail(\"bb\", \"cc@126.com\").getNickName());\n\t\tuserRepository.delete(userRepository.findByUserName(\"aa1\"));\n\t}\n\n}"
  },
  {
    "path": "1.x/spring-boot-web/src/test/java/com/neo/util/TestRedis.java",
    "content": "package com.neo.util;\n\nimport java.util.concurrent.TimeUnit;\n\nimport org.junit.Assert;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.data.redis.core.RedisTemplate;\nimport org.springframework.data.redis.core.StringRedisTemplate;\nimport org.springframework.data.redis.core.ValueOperations;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\n\nimport com.neo.Application;\nimport com.neo.domain.User;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class TestRedis {\n\n    @Autowired\n    private StringRedisTemplate stringRedisTemplate;\n    \n\t@Autowired\n\tprivate RedisTemplate redisTemplate;\n\n    @Test\n    public void test() throws Exception {\n        stringRedisTemplate.opsForValue().set(\"aaa\", \"111\");\n        Assert.assertEquals(\"111\", stringRedisTemplate.opsForValue().get(\"aaa\"));\n    }\n    \n    @Test\n    public void testObj() throws Exception {\n        User user=new User(\"aa@126.com\", \"aa\", \"aa123456\", \"aa\",\"123\");\n        ValueOperations<String, User> operations=redisTemplate.opsForValue();\n        operations.set(\"com.neox\", user);\n        operations.set(\"com.neo.f\", user,1,TimeUnit.SECONDS);\n        Thread.sleep(1000);\n        //redisTemplate.delete(\"com.neo.f\");\n        boolean exists=redisTemplate.hasKey(\"com.neo.f\");\n        if(exists){\n        \tSystem.out.println(\"exists is true\");\n        }else{\n        \tSystem.out.println(\"exists is false\");\n        }\n       // Assert.assertEquals(\"aa\", operations.get(\"com.neo.f\").getUserName());\n    }\n\n\n}"
  },
  {
    "path": "1.x/spring-boot-web/src/test/java/com/neo/web/HelloControlerTests.java",
    "content": "package com.neo.web;\n\nimport static org.hamcrest.Matchers.equalTo;\nimport static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;\nimport static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.http.MediaType;\nimport org.springframework.mock.web.MockServletContext;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\nimport org.springframework.test.context.junit4.SpringRunner;\nimport org.springframework.test.context.web.WebAppConfiguration;\nimport org.springframework.test.web.servlet.MockMvc;\nimport org.springframework.test.web.servlet.request.MockMvcRequestBuilders;\nimport org.springframework.test.web.servlet.result.MockMvcResultHandlers;\nimport org.springframework.test.web.servlet.result.MockMvcResultMatchers;\nimport org.springframework.test.web.servlet.setup.MockMvcBuilders;\n\nimport static org.hamcrest.Matchers.equalTo;\nimport static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;\nimport static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;\n\nimport com.neo.web.HelloController;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class HelloControlerTests {\n\n    private MockMvc mvc;\n\n    @Before\n    public void setUp() throws Exception {\n        mvc = MockMvcBuilders.standaloneSetup(new HelloController()).build();\n    }\n\n    @Test\n    public void getHello() throws Exception {\n        mvc.perform(MockMvcRequestBuilders.get(\"/hello\").accept(MediaType.APPLICATION_JSON))\n                .andExpect(MockMvcResultMatchers.status().isOk())\n                .andDo(MockMvcResultHandlers.print())\n                .andReturn();\n    }\n    \n    \n\n    @Test\n    public void testHello() throws Exception {\n        mvc.perform(MockMvcRequestBuilders.get(\"/hello\").accept(MediaType.APPLICATION_JSON))\n                .andExpect(status().isOk())\n                .andExpect(content().string(equalTo(\"Hello World\")));\n    }\n\n\n}"
  },
  {
    "path": "1.x/spring-boot-web/src/test/java/com/neo/web/ProPertiesTest.java",
    "content": "package com.neo.web;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.junit.Assert;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\n\nimport com.neo.Application;\nimport com.neo.util.NeoProperties;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class ProPertiesTest {\n\n\t\n\t@Autowired\n    private NeoProperties neoProperties;\n\n\n    @Test\n    public void getHello() throws Exception {\n    \tSystem.out.println(neoProperties.getTitle());\n        Assert.assertEquals(neoProperties.getTitle(), \"纯洁的微笑\");\n        Assert.assertEquals(neoProperties.getDescription(), \"分享生活和技术\");\n    }\n\n    \n    @Test\n    public void testMap() throws Exception {\n    \tMap<String, Long> orderMinTime=new HashMap<String, Long>();\n    \tlong xx=orderMinTime.get(\"123\");\n    }\n\n}"
  },
  {
    "path": "2.x/README.md",
    "content": "Spring Boot 学习示例\n=========================\n\n![Spring Boot 2.0](https://img.shields.io/badge/Spring%20Boot-2.0-brightgreen.svg)\n![Mysql 5.6](https://img.shields.io/badge/Mysql-5.6-blue.svg)\n![JDK 1.8](https://img.shields.io/badge/JDK-1.8-brightgreen.svg)\n![Maven](https://img.shields.io/badge/Maven-3.5.0-yellowgreen.svg)\n![license](https://img.shields.io/badge/license-MPL--2.0-blue.svg)\n \nSpring Boot 使用的各种示例，以最简单、最实用为标准，此开源项目中的每个示例都以最小依赖，最简单为标准，帮助初学者快速掌握 Spring Boot 各组件的使用。\n\n[Spring Boot 中文索引](https://github.com/ityouknow/awesome-spring-boot) &nbsp;| &nbsp; [Spring Cloud学习示例代码](https://github.com/ityouknow/spring-cloud-examples) &nbsp;| &nbsp; [Spring Boot 精品课程](https://github.com/ityouknow/spring-boot-leaning) \n\n[English](README_EN.md) &nbsp;| &nbsp;  [Github地址](https://github.com/ityouknow/spring-boot-examples) &nbsp;| &nbsp; [码云地址](https://gitee.com/ityouknow/spring-boot-examples) &nbsp;| &nbsp;  [Spring Boot 1.0](https://github.com/ityouknow/spring-boot-examples/tree/Spring-Boot-1.0)\n\n---\n\n推荐程序员都关注的一个漫画公众号\n\n![](http://www.ityouknow.com/assets/images/cartoon.jpg)\n\n关注后，回复：**java** 获取超过 10万 人领取的 Java 知识体系/面试必看资料。\n\n\n\n## Spring Boot 2.0\n\n**[Spring Boot 2.0 最全使用教程](https://github.com/ityouknow/spring-boot-leaning)**\n\n**[Favorites-web](https://github.com/cloudfavorites/favorites-web)：云收藏（Spring Boot 2.0 实战开源项目）**\n\n**示例代码**\n\n- [spring-boot-hello](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-hello)：Spring Boot 2.0  Hello World 示例\n- [spring-boot-banner](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-banner)：Spring Boot 定制 Banner 示例\n- [spring-boot-docker](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-docker)：使用 Docker 部署 Spring Boot 示例\n- [dockercompose-springboot-mysql-nginx](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/dockercompose-springboot-mysql-nginx) ：Docker Compose + Spring Boot + Nginx + Mysql 示例  \n- [spring-boot-commandLineRunner](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-commandLineRunner) ：Spring Boot 使用 commandLineRunner 实现项目启动时资源初始化示例  \n- [spring-boot-web-thymeleaf](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-web-thymeleaf) ：Spring Boot 使用 thymeleaf 实现布局、验参、增删改查示例    \n- [spring-boot-memcache-spymemcached](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-memcache-spymemcached) ：Spring Boot 使用 spymemcached 集成  memcache 示例\n- [spring-boot-webflux](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-webflux) ：Spring Boot webflux 示例\n- [spring-boot-elasticsearch](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-elasticsearch) ：Spring Boot elasticsearch 示例\n- [spring-boot-swagger](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-swagger) ：Spring Boot swagger2 示例\n- [spring-boot-mybatis-plus](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-mybatis-plus) ：Spring Boot 集成 MyBatis Plus 示例\n\n**参考文章**\n\n- [Spring Boot 2(一)：【重磅】Spring Boot 2.0权威发布](http://www.ityouknow.com/springboot/2018/03/01/spring-boot-2.0.html)  \n- [Spring Boot 2(二)：Spring Boot 2.0尝鲜-动态 Banner](http://www.ityouknow.com/springboot/2018/03/03/spring-boot-banner.html)  \n- [Spring Boot 2(三)：Spring Boot 开源软件都有哪些？](http://www.ityouknow.com/springboot/2018/03/05/spring-boot-open-source.html)  \n- [Spring Boot 2(四)：使用 Docker 部署 Spring Boot](http://www.ityouknow.com/springboot/2018/03/19/spring-boot-docker.html)  \n- [Spring Boot 2(五)：Docker Compose + Spring Boot + Nginx + Mysql 实践](http://www.ityouknow.com/springboot/2018/03/28/dockercompose-springboot-mysql-nginx.html)  \n- [Spring Boot 2(六)：使用 Docker 部署 Spring Boot 开源软件云收藏](http://www.ityouknow.com/springboot/2018/04/02/docker-favorites.html) \n- [Spring Boot 2(七)：Spring Boot 如何解决项目启动时初始化资源](http://www.ityouknow.com/springboot/2018/05/03/spring-boot-commandLineRunner.html) \n- [Spring Boot 2(八)：Spring Boot 集成 Memcached](http://www.ityouknow.com/springboot/2018/09/01/spring-boot-memcached.html) \n- [Spring Boot 2 (九)：【重磅】Spring Boot 2.1.0 权威发布](http://www.ityouknow.com/springboot/2018/11/03/spring-boot-2.1.html) \n- [Spring Boot/Cloud 研发团队介绍](http://www.ityouknow.com/springboot/2019/01/03/spring-pivotal.html) \n- [Spring Boot 2 (十)：Spring Boot 中的响应式编程和 WebFlux 入门](http://www.ityouknow.com/springboot/2019/02/12/spring-boot-webflux.html) \n\n\n## 下方示例已经全部升级到 2.X\n\n**示例代码**\n\n- [spring-boot-helloWorld](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-helloWorld)：Spring Boot 的 hello World 版本\n- [spring-boot-web](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-web)：Spring Boot Web 开发综合示例\n- [spring-boot-redis](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-redis)：Spring Boot 集成 Redis 示例\n- [spring-boot-jpa](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-jpa)：Spring Boot 使用 Jpa 各种示例\n- [spring-boot-mybaits-annotation](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-mybatis/spring-boot-mybatis-annotation)：注解版本\n- [spring-boot-mybaits-xml](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-mybatis/spring-boot-mybatis-xml)：Xml 配置版本\n- [spring-boot-mybatis-xml-mulidatasource](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-mybatis/spring-boot-mybatis-xml-mulidatasource)：Spring Boot + Mybatis (Xml 版） 多数据源最简解决方案\n- [spring-boot-mybatis-annotation-mulidatasource](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-mybatis/spring-boot-mybatis-annotation-mulidatasource)：Spring Boot + Mybatis（注解版）多数据源最简解决方案\n- [spring-boot-thymeleaf](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-thymeleaf)：Spring Boot 使用 Thymeleaf 详细示例\n- [spring-boot-jpa-thymeleaf-curd](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-jpa-thymeleaf-curd)：Spring Boot  + Jpa + Thymeleaf 增删改查示例\n- [spring-boot-rabbitmq](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-rabbitmq)：Spring Boot 和 Rabbitmq 各种消息应用案例\n- [spring-boot-scheduler](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-scheduler)：Spring Boot 和定时任务案例\n- [spring-boot-mail](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-mail)：Spring Boot 和邮件服务\n- [spring-boot-mongodb](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-mongodb/spring-boot-mongodb)：Spring Boot 和 Mongodb 的使用\n- [spring-boot-multi-mongodb](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-mongodb/spring-boot-multi-mongodb)：Spring Boot 和 Mongodb 多数据源的使用\n- [spring-boot-package-war](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-package-war)： Spring Boot 打包成 War 包示例\n- [spring-boot-shiro](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-shiro)：Spring Boot  整合 Shiro Rbac 示例\n- [spring-boot-file-upload](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-file-upload)：使用 Spring Boot 上传文件示例   \n- [spring-boot-fastDFS](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-fastDFS)：Spring Boot 整合 FastDFS 示例  \n- [spring-boot-actuator](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-actuator)：Spring Boot Actuator 使用示例\n- [spring-boot-admin-simple](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-admin-simple)：Spring Boot Admin 的使用示例  \n\n**参考文章**\n\n- [Spring Boot(一)：入门篇](http://www.ityouknow.com/springboot/2016/01/06/spring-boot-quick-start.html)\n- [Spring Boot(二)：Web 综合开发](http://www.ityouknow.com/springboot/2016/02/03/spring-boot-web.html)\n- [Spring Boot(三)：Spring Boot 中 Redis 的使用](http://www.ityouknow.com/springboot/2016/03/06/spring-boot-redis.html)\n- [Spring Boot(四)：Thymeleaf 使用详解](http://www.ityouknow.com/springboot/2016/05/01/spring-boot-thymeleaf.html)\n- [Spring Boot(五)：Spring Data Jpa 的使用](http://www.ityouknow.com/springboot/2016/08/20/spring-boot-jpa.html)\n- [Spring Boot(六)：如何优雅的使用 Mybatis](http://www.ityouknow.com/springboot/2016/11/06/spring-boot-mybatis.html)\n- [Spring Boot(七)：Spring Boot + Mybatis 多数据源最简解决方案](http://www.ityouknow.com/springboot/2016/11/25/spring-boot-multi-mybatis.html)\n- [Spring Boot(八)：RabbitMQ 详解](http://www.ityouknow.com/springboot/2016/11/30/spring-boot-rabbitMQ.html)\n- [Spring Boot(九)：定时任务](http://www.ityouknow.com/springboot/2016/12/02/spring-boot-scheduler.html)\n- [Spring Boot(十)：邮件服务](http://www.ityouknow.com/springboot/2017/05/06/spring-boot-mail.html)\n- [Spring Boot(十一)：Spring Boot 中 Mongodb 的使用](http://www.ityouknow.com/springboot/2017/05/08/spring-boot-mongodb.html)\n- [Spring Boot(十二)：Spring Boot 如何测试打包部署](http://www.ityouknow.com/springboot/2017/05/09/spring-boot-deploy.html)\n- [Spring Boot(十三)：Spring Boot 小技巧](http://www.ityouknow.com/springboot/2017/06/22/spring-boot-tips.html)\n- [Spring Boot(十四)：Spring Boot 整合 Shiro-登录认证和权限管理](http://www.ityouknow.com/springboot/2017/06/26/spring-boot-shiro.html)\n- [Spring Boot(十五)：Spring Boot + Jpa + Thymeleaf 增删改查示例](http://www.ityouknow.com/springboot/2017/09/23/spring-boot-jpa-thymeleaf-curd.html)  \n- [Spring Boot(十六)：使用 Jenkins 部署 Spring Boot](http://www.ityouknow.com/springboot/2017/11/11/spring-boot-jenkins.html)\n- [Spring Boot(十七)：使用 Spring Boot 上传文件](http://www.ityouknow.com/springboot/2018/01/12/spring-boot-upload-file.html)   \n- [Spring Boot(十八)：使用 Spring Boot 集成 FastDFS](http://www.ityouknow.com/springboot/2018/01/16/spring-boot-fastdfs.html)   \n- [Spring Boot(十九)：使用 Spring Boot Actuator 监控应用](http://www.ityouknow.com/springboot/2018/02/06/spring-boot-actuator.html)   \n- [Spring Boot(二十)：使用 spring-boot-admin 对 Spring Boot 服务进行监控](http://www.ityouknow.com/springboot/2018/02/11/spring-boot-admin.html)   \n\n**[Spring Boot 实战：我们的第一款开源项目](http://www.ityouknow.com/springboot/2016/09/26/spring-boot-opensource-favorites.html)**\n\n---\n\n> 如果大家想了解关于 Spring Boot 的其它方面应用，也可以以[issues](https://github.com/ityouknow/spring-boot-examples/issues)的形式反馈给我，我后续来完善。\n\n关注公众号：纯洁的微笑，回复\"666\"进群交流 \n\n![](http://www.ityouknow.com/assets/images/keeppuresmile_430.jpg)"
  },
  {
    "path": "2.x/README_EN.md",
    "content": "# Spring Boot Examples\n\nThis tutorial is about learning Spring Boot via examples.\n\n[Spring Cloud Example Code](https://github.com/ityouknow/spring-cloud-examples)  &nbsp;| &nbsp; [中文](README.md)\n\nSpring Boot examples, using the simplest and the most useful scene demos.\n\n---\n\n## Spring Boot 2.X\n\n\n**[Favorites-web](https://github.com/cloudfavorites/favorites-web)：Open source projects developed using Spring Boot 2.X**\n\n- [spring-boot-hello](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-hello)：Spring Boot 2.0  Hello World Demo\n- [spring-boot-banner](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-banner)：Spring Boot Customized Banner \n- [spring-boot-docker](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-docker)：Spring Boot with Docker \n- [dockercompose-springboot-mysql-nginx](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/dockercompose-springboot-mysql-nginx) ：Docker Compose + Spring Boot + Nginx + Mysql example\n- [spring-boot-commandLineRunner](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-commandLineRunner) ：Example of resource initialization at project startup using Spring Boot and commandLineRunner  \n- [spring-boot-web-thymeleaf](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-web-thymeleaf) ：Spring Boot uses thymeleaf to implement layout, check parameters and CURD\n- [spring-boot-memcache-spymemcached](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-memcache-spymemcached) ：Spring Boot uses spymemcached to memcache\n- [spring-boot-webflux](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-webflux) ：Spring Boot webflux demo\n- [spring-boot-elasticsearch](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-elasticsearch) ：Spring Boot elasticsearch demo\n- [spring-boot-swagger](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-swagger) ：Spring Boot swagger2 demo\n- [spring-boot-mybatis-plus](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-mybatis-plus) ：Spring Boot MyBatis Plus demo\n\n\n---\n\n## Spring Boot （Already upgraded to 2.x）\n\n- [spring-boot-helloWorld](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-helloWorld)：Spring Boot helloWorld\n- [spring-boot-redis](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-redis)：Spring Boot Redis Demo\n- [spring-boot-jpa](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-jpa)：Spring Boot  Jpa Demo\n- [spring-boot-mybaits-annotation](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-mybatis/spring-boot-mybatis-annotation)：Spring Boot use mybatis annotation\n- [spring-boot-mybaits-xml](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-mybatis/spring-boot-mybatis-xml)：Spring Boot use mybatis xml \n- [spring-boot-mybatis-xml-mulidatasource](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-mybatis/spring-boot-mybatis-xml-mulidatasource)：Spring Boot+mybatis+mulidatasource\n- [spring-boot-mybatis-annotation-mulidatasource](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-mybatis/spring-boot-mybatis-annotation-mulidatasource)：Spring Boot+ mybatis annotation + mulidatasource\n- [spring-boot-thymeleaf](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-thymeleaf)：Spring Boot Thymeleaf Demo\n- [spring-boot-jpa-thymeleaf-curd](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-jpa-thymeleaf-curd)：spring boot + jpa + thymeleaf curd demo\n- [spring-boot-rabbitmq](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-rabbitmq)： using AMQP and RabbitMQ\n- [spring-boot-scheduler](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-scheduler)：Timed tasks developed using Spring Boot \n- [spring-boot-web](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-web)：Web projects developed using Spring Boot \n- [spring-boot-mail](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-mail)：Mail system developed using Spring Boot \n- [spring-boot-mongodb](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-mongodb/spring-boot-mongodb)：Spring Boot + Mongodb\n- [spring-boot-multi-mongodb](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-mongodb/spring-boot-multi-mongodb)：Spring Boot + multiMongodb\n- [spring-boot-package-war](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-package-war)：Spring Boot package war\n- [spring-boot-shiro](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-shiro)：spring boot shiro rbac demo \n- [spring-boot-file-upload](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-file-upload)：Spring Boot upload file demo   \n- [spring-boot-fastDFS](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-fastDFS)：Spring Boot Integrate FastDFS  upload delete and so on \n- [spring-boot-actuator](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-actuator)：Spring Boot Actuator demo  \n- [spring-boot-admin-simple](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-admin-simple)：Spring Boot Admin demo   \n- [spring-boot-banner](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x/spring-boot-banner)：Spring Boot Cumtom Banner \n"
  },
  {
    "path": "2.x/dockercompose-springboot-mysql-nginx/app/Dockerfile",
    "content": "FROM maven:3.5-jdk-8"
  },
  {
    "path": "2.x/dockercompose-springboot-mysql-nginx/app/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>dockercompose-springboot-mysql-nginx</artifactId>\n\t<version>1.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>dockercompose-springboot-mysql-nginx</name>\n\t<description>Demo project for Spring Boot</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>2.0.0.RELEASE</version>\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n\t<dependencies>\n\t     <dependency>\n\t        <groupId>org.springframework.boot</groupId>\n\t        <artifactId>spring-boot-starter-web</artifactId>\n\t    </dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-data-jpa</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>mysql</groupId>\n\t\t\t<artifactId>mysql-connector-java</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t</dependencies>\n\t\n\t<build>\n\t\t<defaultGoal>compile</defaultGoal>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\t\n\n</project>\n"
  },
  {
    "path": "2.x/dockercompose-springboot-mysql-nginx/app/src/main/java/com/neo/ComposeApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class ComposeApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(ComposeApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "2.x/dockercompose-springboot-mysql-nginx/app/src/main/java/com/neo/controller/VisitorController.java",
    "content": "package com.neo.controller;\n\nimport com.neo.entity.Visitor;\nimport com.neo.repository.VisitorRepository;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport javax.servlet.http.HttpServletRequest;\n\n@RestController\npublic class VisitorController {\n\n    @Autowired\n    private VisitorRepository repository;\n\t\n    @RequestMapping(\"/\")\n    public String index(HttpServletRequest request) {\n        String ip=request.getRemoteAddr();\n        Visitor visitor=repository.findByIp(ip);\n        if(visitor==null){\n            visitor=new Visitor();\n            visitor.setIp(ip);\n            visitor.setTimes(1);\n        }else {\n            visitor.setTimes(visitor.getTimes()+1);\n        }\n        repository.save(visitor);\n        return \"I have been seen ip \"+visitor.getIp()+\" \"+visitor.getTimes()+\" times.\";\n    }\n}"
  },
  {
    "path": "2.x/dockercompose-springboot-mysql-nginx/app/src/main/java/com/neo/entity/Visitor.java",
    "content": "package com.neo.entity;\n\nimport javax.persistence.Column;\nimport javax.persistence.Entity;\nimport javax.persistence.GeneratedValue;\nimport javax.persistence.Id;\n\n@Entity\npublic class Visitor {\n    @Id\n    @GeneratedValue\n    private long id;\n    @Column(nullable = false)\n    private  long  times;\n    @Column(nullable = false)\n    private  String  ip;\n\n    public long getId() {\n        return id;\n    }\n\n    public void setId(long id) {\n        this.id = id;\n    }\n\n    public long getTimes() {\n        return times;\n    }\n\n    public void setTimes(long times) {\n        this.times = times;\n    }\n\n    public String getIp() {\n        return ip;\n    }\n\n    public void setIp(String ip) {\n        this.ip = ip;\n    }\n}\n"
  },
  {
    "path": "2.x/dockercompose-springboot-mysql-nginx/app/src/main/java/com/neo/repository/VisitorRepository.java",
    "content": "package com.neo.repository;\n\nimport com.neo.entity.Visitor;\nimport org.springframework.data.jpa.repository.JpaRepository;\n\npublic interface  VisitorRepository extends JpaRepository<Visitor, Long> {\n    Visitor findByIp(String ip);\n}\n"
  },
  {
    "path": "2.x/dockercompose-springboot-mysql-nginx/app/src/main/resources/application-dev.properties",
    "content": "spring.datasource.url=jdbc:mysql://localhost:3306/test\nspring.datasource.username=root\nspring.datasource.password=root\nspring.datasource.driver-class-name=com.mysql.jdbc.Driver"
  },
  {
    "path": "2.x/dockercompose-springboot-mysql-nginx/app/src/main/resources/application-docker.properties",
    "content": "spring.datasource.url=jdbc:mysql://mysql:3306/test\nspring.datasource.username=root\nspring.datasource.password=root\nspring.datasource.driver-class-name=com.mysql.jdbc.Driver"
  },
  {
    "path": "2.x/dockercompose-springboot-mysql-nginx/app/src/main/resources/application.properties",
    "content": "spring.jpa.properties.hibernate.hbm2ddl.auto=update\nspring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect\nspring.jpa.show-sql=true\n\nspring.profiles.active=dev"
  },
  {
    "path": "2.x/dockercompose-springboot-mysql-nginx/app/src/test/java/com/neo/ComposeApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class ComposeApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t\tSystem.out.println(\"Hello Spring Boot Docker Compose!\");\n\t}\n\n}\n"
  },
  {
    "path": "2.x/dockercompose-springboot-mysql-nginx/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  nginx:\n   container_name: v-nginx\n   image: nginx:1.13\n   restart: always\n   ports:\n   - 80:80\n   - 443:443\n   volumes:\n   - ./nginx/conf.d:/etc/nginx/conf.d\n    \n  mysql:\n   container_name: v-mysql\n   image: mysql/mysql-server:5.7\n   environment:\n    MYSQL_DATABASE: test\n    MYSQL_ROOT_PASSWORD: root\n    MYSQL_ROOT_HOST: '%'\n   ports:\n   - \"3306:3306\"\n   restart: always\n    \n  app:\n    restart: always\n    build: ./app\n    working_dir: /app\n    volumes:\n      - ./app:/app\n      - ~/.m2:/root/.m2\n    expose:\n      - \"8080\"\n    depends_on:\n      - nginx\n      - mysql\n    command: mvn clean spring-boot:run -Dspring-boot.run.profiles=docker"
  },
  {
    "path": "2.x/dockercompose-springboot-mysql-nginx/nginx/conf.d/app.conf",
    "content": "server {\n    listen 80;\n    charset utf-8;\n    access_log off;\n\n    location / {\n        proxy_pass http://app:8080;\n        proxy_set_header Host $host:$server_port;\n        proxy_set_header X-Forwarded-Host $server_name;\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n    }\n\n    location /static {\n        access_log   off;\n        expires      30d;\n\n        alias /app/static;\n    }\n}\n"
  },
  {
    "path": "2.x/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <groupId>com.example</groupId>\n    <artifactId>spring-boot-examples</artifactId>\n    <packaging>pom</packaging>\n    <version>2.0.0</version>\n\n    <modules>\n        <module>dockercompose-springboot-mysql-nginx/app</module>\n        <module>spring-boot-actuator</module>\n        <module>spring-boot-admin-simple</module>\n        <module>spring-boot-banner</module>\n        <module>spring-boot-commandLineRunner</module>\n        <module>spring-boot-docker</module>\n        <module>spring-boot-elasticsearch</module>\n        <module>spring-boot-file-upload</module>\n        <module>spring-boot-hello</module>\n        <module>spring-boot-helloWorld</module>\n        <module>spring-boot-jpa/spring-boot-jpa</module>\n        <module>spring-boot-jpa/spring-boot-multi-Jpa</module>\n        <module>spring-boot-jpa-thymeleaf-curd</module>\n        <module>spring-boot-mail</module>\n        <module>spring-boot-memcache-spymemcached</module>\n        <module>spring-boot-mongodb/spring-boot-mongodb</module>\n        <module>spring-boot-mongodb/spring-boot-multi-mongodb</module>\n        <module>spring-boot-mybatis/spring-boot-mybatis-annotation</module>\n        <module>spring-boot-mybatis/spring-boot-mybatis-annotation-mulidatasource</module>\n        <module>spring-boot-mybatis/spring-boot-mybatis-xml</module>\n        <module>spring-boot-mybatis/spring-boot-mybatis-xml-mulidatasource</module>\n        <module>spring-boot-mybatis-plus</module>\n        <module>spring-boot-package</module>\n        <module>spring-boot-package-war</module>\n        <module>spring-boot-rabbitmq</module>\n        <module>spring-boot-redis</module>\n        <module>spring-boot-scheduler</module>\n        <module>spring-boot-shiro</module>\n        <module>spring-boot-swagger</module>\n        <module>spring-boot-thymeleaf/spring-boot-thymeleaf</module>\n        <module>spring-boot-thymeleaf/spring-boot-thymeleaf-layout</module>\n        <module>spring-boot-web</module>\n        <module>spring-boot-web-thymeleaf</module>\n        <module>spring-boot-webflux</module>\n    </modules>\n\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <version>3.1</version>\n                <configuration>\n                    <source>1.8</source>\n                    <target>1.8</target>\n                </configuration>\n            </plugin>\n        </plugins>\n    </build>\n</project>"
  },
  {
    "path": "2.x/spring-boot-actuator/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-actuator</artifactId>\n\t<version>1.0.0-SNAPSHOT</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-actuator</name>\n\t<description>Demo project for Spring Boot</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>2.1.0.RELEASE</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-web</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-actuator</artifactId>\n        </dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t     <dependency>\n\t        <groupId>org.springframework.boot</groupId>\n\t        <artifactId>spring-boot-devtools</artifactId>\n\t        <optional>true</optional>\n\t\t</dependency>\n\t</dependencies>\n\t\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t\t<configuration>\n\t                <fork>true</fork>\n\t            </configuration>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\n</project>\n"
  },
  {
    "path": "2.x/spring-boot-actuator/src/main/java/com/neo/ActuatorApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class ActuatorApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(ActuatorApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "2.x/spring-boot-actuator/src/main/java/com/neo/controller/HelloController.java",
    "content": "package com.neo.controller;\n\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n@RestController\npublic class HelloController {\n\t\n    @RequestMapping(\"/hello\")\n    public String index() {\n        return \"Hello World\";\n    }\n}"
  },
  {
    "path": "2.x/spring-boot-actuator/src/main/resources/application.properties",
    "content": "info.app.name=spring-boot-actuator\ninfo.app.version= 1.0.0\ninfo.app.test=test\n\nmanagement.endpoints.web.exposure.include=*\nmanagement.endpoint.health.show-details=always\n#management.endpoints.web.base-path=/manage\n\nmanagement.endpoint.shutdown.enabled=true\n"
  },
  {
    "path": "2.x/spring-boot-actuator/src/test/java/com/neo/ActuatorApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class ActuatorApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t\tSystem.out.println(\"hello word\");\n\t}\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-actuator/src/test/java/com/neo/controller/HelloTests.java",
    "content": "package com.neo.controller;\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.http.MediaType;\nimport org.springframework.test.context.junit4.SpringRunner;\nimport org.springframework.test.web.servlet.MockMvc;\nimport org.springframework.test.web.servlet.request.MockMvcRequestBuilders;\nimport org.springframework.test.web.servlet.setup.MockMvcBuilders;\n\nimport static org.hamcrest.Matchers.equalTo;\nimport static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;\nimport static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class HelloTests {\n\n\t\n    private MockMvc mvc;\n\n    @Before\n    public void setUp() throws Exception {\n        mvc = MockMvcBuilders.standaloneSetup(new HelloController()).build();\n    }\n\n    @Test\n    public void getHello() throws Exception {\n        mvc.perform(MockMvcRequestBuilders.get(\"/hello\").accept(MediaType.APPLICATION_JSON))\n                .andExpect(status().isOk())\n                .andExpect(content().string(equalTo(\"Hello World\")));\n    }\n\n}"
  },
  {
    "path": "2.x/spring-boot-actuator/src/test/java/com/neo/controller/HelloWorldControlerTests.java",
    "content": "package com.neo.controller;\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.http.MediaType;\nimport org.springframework.test.context.junit4.SpringRunner;\nimport org.springframework.test.web.servlet.MockMvc;\nimport org.springframework.test.web.servlet.request.MockMvcRequestBuilders;\nimport org.springframework.test.web.servlet.result.MockMvcResultHandlers;\nimport org.springframework.test.web.servlet.result.MockMvcResultMatchers;\nimport org.springframework.test.web.servlet.setup.MockMvcBuilders;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class HelloWorldControlerTests {\n\n    private MockMvc mvc;\n\n    @Before\n    public void setUp() throws Exception {\n        mvc = MockMvcBuilders.standaloneSetup(new HelloController()).build();\n    }\n\n    @Test\n    public void getHello() throws Exception {\n        mvc.perform(MockMvcRequestBuilders.get(\"/hello\").accept(MediaType.APPLICATION_JSON))\n                .andExpect(MockMvcResultMatchers.status().isOk())\n                .andDo(MockMvcResultHandlers.print())\n                .andReturn();\n    }\n\n}"
  },
  {
    "path": "2.x/spring-boot-admin-simple/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-admin-simple</artifactId>\n\t<version>1.0.0.BUILD-SNAPSHOT</version>\n\n\t<modules>\n\t\t<module>spring-boot-admin-server</module>\n\t\t<module>spring-boot-admin-client</module>\n\t</modules>\n\n\t<packaging>pom</packaging>\n\t<name>Spring boot admin</name>\n\t<description>Demo project for Spring Boot</description>\n\n    <parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>2.1.0.RELEASE</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n\t\t<java.version>1.8</java.version>\n        <spring-cloud.version>Edgware.SR1</spring-cloud.version>\n\t</properties>\n\n    <dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n    </dependencies>\n\n    <dependencyManagement>\n        <dependencies>\n            <dependency>\n                <groupId>org.springframework.cloud</groupId>\n                <artifactId>spring-cloud-dependencies</artifactId>\n                <version>${spring-cloud.version}</version>\n                <type>pom</type>\n                <scope>import</scope>\n            </dependency>\n        </dependencies>\n    </dependencyManagement>\n\n</project>"
  },
  {
    "path": "2.x/spring-boot-admin-simple/spring-boot-admin-client/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\t<parent>\n\t\t<groupId>com.neo</groupId>\n\t\t<artifactId>spring-boot-admin-simple</artifactId>\n\t\t<version>1.0.0.BUILD-SNAPSHOT</version>\n\t</parent>\n\t<artifactId>spring-boot-admin-client</artifactId>\n\t<packaging>jar</packaging>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>de.codecentric</groupId>\n\t\t\t<artifactId>spring-boot-admin-starter-client</artifactId>\n\t\t\t<version>2.1.0</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-web</artifactId>\n\t\t</dependency>\n\t</dependencies>\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\n</project>\n"
  },
  {
    "path": "2.x/spring-boot-admin-simple/spring-boot-admin-client/src/main/java/com/neo/AdminClientApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class AdminClientApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(AdminClientApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "2.x/spring-boot-admin-simple/spring-boot-admin-client/src/main/resources/application.properties",
    "content": "server.port=8001\n\nspring.application.name=Admin Client\nspring.boot.admin.client.url=http://localhost:8000  \nmanagement.endpoints.web.exposure.include=*"
  },
  {
    "path": "2.x/spring-boot-admin-simple/spring-boot-admin-client/src/test/java/com/neo/AdminClientApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class AdminClientApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t}\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-admin-simple/spring-boot-admin-server/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\t<parent>\n\t\t<groupId>com.neo</groupId>\n\t\t<artifactId>spring-boot-admin-simple</artifactId>\n\t\t<version>1.0.0.BUILD-SNAPSHOT</version>\n\t</parent>\n\t<artifactId>spring-boot-admin-server</artifactId>\n\t<packaging>jar</packaging>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>de.codecentric</groupId>\n\t\t\t<artifactId>spring-boot-admin-starter-server</artifactId>\n\t\t\t<version>2.1.0</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-web</artifactId>\n\t\t</dependency>\n\t</dependencies>\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\n</project>\n"
  },
  {
    "path": "2.x/spring-boot-admin-simple/spring-boot-admin-server/src/main/java/com/neo/AdminServerApplication.java",
    "content": "package com.neo;\n\nimport de.codecentric.boot.admin.server.config.EnableAdminServer;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.EnableAutoConfiguration;\nimport org.springframework.context.annotation.Configuration;\n\n@Configuration\n@EnableAutoConfiguration\n@EnableAdminServer\npublic class AdminServerApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(AdminServerApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "2.x/spring-boot-admin-simple/spring-boot-admin-server/src/main/resources/application.properties",
    "content": "server.port=8000\n\n"
  },
  {
    "path": "2.x/spring-boot-admin-simple/spring-boot-admin-server/src/test/java/com/neo/AdminServerApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class AdminServerApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t}\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-banner/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.example</groupId>\n\t<artifactId>spring-boot-banner</artifactId>\n\t<version>2.0.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>Spring Boot banner</name>\n\t<description>A very useful project to demonstrate animated gif support in Spring Boot 2</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>2.0.0.RELEASE</version>\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter</artifactId>\n\t\t</dependency>\n\t</dependencies>\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\n</project>\n"
  },
  {
    "path": "2.x/spring-boot-banner/src/main/java/com/neo/banner/BannerApplication.java",
    "content": "package com.neo.banner;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class BannerApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(BannerApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "2.x/spring-boot-banner/src/main/resources/application.properties",
    "content": ""
  },
  {
    "path": "2.x/spring-boot-banner/src/main/resources/banner.txt",
    "content": ".__           .__  .__                               .__       .___\n|  |__   ____ |  | |  |   ____   __  _  _____________|  |    __| _/\n|  |  \\_/ __ \\|  | |  |  /  _ \\  \\ \\/ \\/ /  _ \\_  __ \\  |   / __ | \n|   Y  \\  ___/|  |_|  |_(  <_> )  \\     (  <_> )  | \\/  |__/ /_/ | \n|___|  /\\___  >____/____/\\____/    \\/\\_/ \\____/|__|  |____/\\____ | \n     \\/     \\/                                                  \\/ "
  },
  {
    "path": "2.x/spring-boot-commandLineRunner/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.example</groupId>\n\t<artifactId>spring-boot-commandLineRunner</artifactId>\n\t<version>2.0.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>Spring Boot banner</name>\n\t<description>Spring Boot and commandLineRunner demo</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>2.0.0.RELEASE</version>\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-web</artifactId>\n\t\t</dependency>\n\t</dependencies>\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\n</project>\n"
  },
  {
    "path": "2.x/spring-boot-commandLineRunner/src/main/java/com/neo/CommandLineRunnerApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.CommandLineRunner;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class CommandLineRunnerApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSystem.out.println(\"The service to start.\");\n\t\tSpringApplication.run(CommandLineRunnerApplication.class, args);\n\t\tSystem.out.println(\"The service has started.\");\n\t}\n}\n"
  },
  {
    "path": "2.x/spring-boot-commandLineRunner/src/main/java/com/neo/runner/OrderRunner1.java",
    "content": "package com.neo.runner;\n\nimport org.springframework.boot.CommandLineRunner;\nimport org.springframework.core.annotation.Order;\nimport org.springframework.stereotype.Component;\n\n@Component\n@Order(1)\npublic class OrderRunner1 implements CommandLineRunner {\n\n    @Override\n    public void run(String... args) throws Exception {\n        System.out.println(\"The OrderRunner1 start to initialize ...\");\n    }\n}"
  },
  {
    "path": "2.x/spring-boot-commandLineRunner/src/main/java/com/neo/runner/OrderRunner2.java",
    "content": "package com.neo.runner;\n\nimport org.springframework.boot.CommandLineRunner;\nimport org.springframework.core.annotation.Order;\nimport org.springframework.stereotype.Component;\n\n@Component\n@Order(2)\npublic class OrderRunner2 implements CommandLineRunner {\n\n    @Override\n    public void run(String... args) throws Exception {\n        System.out.println(\"The OrderRunner2 start to initialize ...\");\n    }\n}"
  },
  {
    "path": "2.x/spring-boot-commandLineRunner/src/main/java/com/neo/runner/Runner.java",
    "content": "package com.neo.runner;\n\nimport org.springframework.boot.CommandLineRunner;\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class Runner implements CommandLineRunner {\n\n    @Override\n    public void run(String... args) throws Exception {\n        System.out.println(\"The Runner start to initialize ...\");\n    }\n}"
  },
  {
    "path": "2.x/spring-boot-commandLineRunner/src/main/resources/application.properties",
    "content": ""
  },
  {
    "path": "2.x/spring-boot-docker/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-docker</artifactId>\n\t<version>1.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-docker</name>\n\t<description>Demo project for Spring Boot</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>2.0.0.RELEASE</version>\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>1.8</java.version>\n\t\t<docker.image.prefix>springboot</docker.image.prefix>\n\t</properties>\n\n\t<dependencies>\n\t     <dependency>\n\t        <groupId>org.springframework.boot</groupId>\n\t        <artifactId>spring-boot-starter-web</artifactId>\n\t    </dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t</dependencies>\n\t\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t\t<!-- Docker maven plugin -->\n\t\t\t<plugin>\n\t\t\t\t<groupId>com.spotify</groupId>\n\t\t\t\t<artifactId>docker-maven-plugin</artifactId>\n\t\t\t\t<version>1.0.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<imageName>${docker.image.prefix}/${project.artifactId}</imageName>\n\t\t\t\t\t<dockerDirectory>src/main/docker</dockerDirectory>\n\t\t\t\t\t<resources>\n\t\t\t\t\t\t<resource>\n\t\t\t\t\t\t\t<targetPath>/</targetPath>\n\t\t\t\t\t\t\t<directory>${project.build.directory}</directory>\n\t\t\t\t\t\t\t<include>${project.build.finalName}.jar</include>\n\t\t\t\t\t\t</resource>\n\t\t\t\t\t</resources>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t<!-- Docker maven plugin -->\n\t\t</plugins>\n\t</build>\n\t\n\n</project>\n"
  },
  {
    "path": "2.x/spring-boot-docker/src/main/docker/Dockerfile",
    "content": "FROM openjdk:8-jdk-alpine\nVOLUME /tmp\nADD spring-boot-docker-1.0.jar app.jar\nENTRYPOINT [\"java\",\"-Djava.security.egd=file:/dev/./urandom\",\"-jar\",\"/app.jar\"]"
  },
  {
    "path": "2.x/spring-boot-docker/src/main/java/com/neo/DockerApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class DockerApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(DockerApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "2.x/spring-boot-docker/src/main/java/com/neo/controller/DockerController.java",
    "content": "package com.neo.controller;\n\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n@RestController\npublic class DockerController {\n\t\n    @RequestMapping(\"/\")\n    public String index() {\n        return \"Hello Docker!\";\n    }\n}"
  },
  {
    "path": "2.x/spring-boot-docker/src/main/resources/application.properties",
    "content": ""
  },
  {
    "path": "2.x/spring-boot-docker/src/test/java/com/neo/DockerApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class DockerApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t\tSystem.out.println(\"hello docker\");\n\t}\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-elasticsearch/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-elasticsearch</artifactId>\n\t<version>1.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-elasticsearch</name>\n\t<description>Demo project for Spring Boot</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>2.1.0.RELEASE</version>\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-data-elasticsearch</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n    </dependencies>\n\t\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\t\n\n</project>\n"
  },
  {
    "path": "2.x/spring-boot-elasticsearch/src/main/java/com/neo/ElasticsearchApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class ElasticsearchApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(ElasticsearchApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "2.x/spring-boot-elasticsearch/src/main/java/com/neo/model/Customer.java",
    "content": "\npackage com.neo.model;\n\nimport org.springframework.data.annotation.Id;\nimport org.springframework.data.elasticsearch.annotations.Document;\nimport org.springframework.data.elasticsearch.annotations.Field;\n\n@Document(indexName = \"customer\", type = \"customer\", shards = 1, replicas = 0, refreshInterval = \"-1\")\npublic class Customer {\n\n\t//Id注解加上后，在Elasticsearch里相应于该列就是主键了，在查询时就可以直接用主键查询\n\t@Id\n\tprivate String id;\n\n\tprivate String userName;\n\n\tprivate String address;\n\n\tprivate int age;\n\n\tpublic Customer() {\n\t}\n\n\tpublic Customer(String userName, String address, int age) {\n\t\tthis.userName = userName;\n\t\tthis.address = address;\n\t\tthis.age = age;\n\t}\n\n\tpublic String getId() {\n\t\treturn this.id;\n\t}\n\n\tpublic void setId(String id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic String getUserName() {\n\t\treturn userName;\n\t}\n\n\tpublic void setUserName(String userName) {\n\t\tthis.userName = userName;\n\t}\n\n\tpublic String getAddress() {\n\t\treturn address;\n\t}\n\n\tpublic int getAge() {\n\t\treturn age;\n\t}\n\n\tpublic void setAge(int age) {\n\t\tthis.age = age;\n\t}\n\n\tpublic void setAddress(String address) {\n\t\tthis.address = address;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\treturn \"Customer{\" +\n\t\t\t\t\"id='\" + id + '\\'' +\n\t\t\t\t\", userName='\" + userName + '\\'' +\n\t\t\t\t\", address='\" + address + '\\'' +\n\t\t\t\t\", age=\" + age +\n\t\t\t\t'}';\n\t}\n}\n"
  },
  {
    "path": "2.x/spring-boot-elasticsearch/src/main/java/com/neo/repository/CustomerRepository.java",
    "content": "\npackage com.neo.repository;\n\nimport com.neo.model.Customer;\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.Pageable;\nimport org.springframework.data.elasticsearch.repository.ElasticsearchRepository;\n\nimport java.util.List;\n\n\npublic interface CustomerRepository extends ElasticsearchRepository<Customer, String> {\n\tpublic List<Customer> findByAddress(String address);\n\tpublic Customer findByUserName(String userName);\n\tpublic int  deleteByUserName(String userName);\n\tpublic Page<Customer> findByAddress(String address, Pageable pageable);\n\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-elasticsearch/src/main/java/com/neo/service/CustomersInterface.java",
    "content": "package com.neo.service;\n\nimport com.neo.model.Customer;\n\nimport java.util.List;\n\npublic interface CustomersInterface {\n\n    public List<Customer> searchCity(Integer pageNumber, Integer pageSize, String searchContent);\n\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-elasticsearch/src/main/java/com/neo/service/impl/CustomersInterfaceImpl.java",
    "content": "package com.neo.service.impl;\n\nimport com.neo.model.Customer;\nimport com.neo.repository.CustomerRepository;\nimport com.neo.service.CustomersInterface;\nimport org.elasticsearch.index.query.QueryBuilders;\nimport org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder;\nimport org.elasticsearch.index.query.functionscore.ScoreFunctionBuilders;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageRequest;\nimport org.springframework.data.domain.Pageable;\nimport org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;\nimport org.springframework.data.elasticsearch.core.query.SearchQuery;\n\nimport java.util.List;\n\npublic class CustomersInterfaceImpl implements CustomersInterface {\n\n    Logger logger= LoggerFactory.getLogger(this.getClass());\n    @Autowired\n    private CustomerRepository customerRepository;\n\n   @Override\n    public List<Customer> searchCity(Integer pageNumber, Integer pageSize, String searchContent) {\n/*        // 分页参数\n        Pageable pageable = new PageRequest(pageNumber, pageSize);\n\n        // Function Score Query\n        FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery()\n                .add(QueryBuilders.boolQuery().should(QueryBuilders.matchQuery(\"cityname\", searchContent)),\n                        ScoreFunctionBuilders.weightFactorFunction(1000))\n                .add(QueryBuilders.boolQuery().should(QueryBuilders.matchQuery(\"description\", searchContent)),\n                        ScoreFunctionBuilders.weightFactorFunction(100));\n\n        // 创建搜索 DSL 查询\n        SearchQuery searchQuery = new NativeSearchQueryBuilder()\n                .withPageable(pageable)\n                .withQuery(functionScoreQueryBuilder).build();\n\n       logger.info(\"\\n searchCity(): searchContent [\" + searchContent + \"] \\n DSL  = \\n \" + searchQuery.getQuery().toString());\n\n        Page<Customer> searchPageResults = customerRepository.search(searchQuery);\n        return searchPageResults.getContent();\n        */\n        return null;\n    }\n}\n"
  },
  {
    "path": "2.x/spring-boot-elasticsearch/src/main/resources/application.properties",
    "content": "spring.data.elasticsearch.cluster-name=es-mongodb\nspring.data.elasticsearch.cluster-nodes=192.168.0.53:9300"
  },
  {
    "path": "2.x/spring-boot-elasticsearch/src/test/java/com/neo/ElasticsearchApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class ElasticsearchApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t\tSystem.out.println(\"Spring Boot Test\");\n\t}\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-elasticsearch/src/test/java/com/neo/repository/CustomerRepositoryTest.java",
    "content": "package com.neo.repository;\n\nimport com.neo.model.Customer;\nimport org.elasticsearch.action.search.SearchResponse;\nimport org.elasticsearch.index.query.QueryBuilder;\nimport org.elasticsearch.index.query.QueryBuilders;\nimport org.elasticsearch.search.aggregations.Aggregation;\nimport org.elasticsearch.search.aggregations.AggregationBuilders;\nimport org.elasticsearch.search.aggregations.Aggregations;\nimport org.elasticsearch.search.aggregations.metrics.sum.InternalSum;\nimport org.elasticsearch.search.aggregations.metrics.sum.SumAggregationBuilder;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageRequest;\nimport org.springframework.data.domain.Pageable;\nimport org.springframework.data.domain.Sort;\nimport org.springframework.data.elasticsearch.core.ElasticsearchTemplate;\nimport org.springframework.data.elasticsearch.core.ResultsExtractor;\nimport org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;\nimport org.springframework.data.elasticsearch.core.query.SearchQuery;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport java.util.List;\nimport java.util.Map;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class CustomerRepositoryTest {\n    @Autowired\n    private CustomerRepository repository;\n    @Autowired\n    private ElasticsearchTemplate elasticsearchTemplate;\n\n    @Test\n    public void saveCustomers() {\n        repository.save(new Customer(\"Alice\", \"北京\",13));\n        repository.save(new Customer(\"Bob\", \"北京\",23));\n        repository.save(new Customer(\"neo\", \"西安\",30));\n        repository.save(new Customer(\"summer\", \"烟台\",22));\n    }\n\n    @Test\n    public void fetchAllCustomers() {\n        System.out.println(\"Customers found with findAll():\");\n        System.out.println(\"-------------------------------\");\n        Iterable<Customer> iterable=repository.findAll();\n        for (Customer customer :iterable) {\n            System.out.println(customer);\n        }\n    }\n\n    @Test\n    public void deleteCustomers() {\n        repository.deleteAll();\n//        repository.deleteByUserName(\"neo\");\n    }\n\n    @Test\n    public void updateCustomers() {\n        Customer customer= repository.findByUserName(\"summer\");\n        System.out.println(customer);\n        customer.setAddress(\"北京市海淀区西直门\");\n        repository.save(customer);\n        Customer xcustomer=repository.findByUserName(\"summer\");\n        System.out.println(xcustomer);\n    }\n\n    @Test\n    public void fetchIndividualCustomers() {\n        System.out.println(\"Customer found with findByUserName('summer'):\");\n        System.out.println(\"--------------------------------\");\n        System.out.println(repository.findByUserName(\"summer\"));\n        System.out.println(\"--------------------------------\");\n        System.out.println(\"Customers found with findByAddress(\\\"北京\\\"):\");\n        String q=\"北京\";\n        for (Customer customer : repository.findByAddress(q)) {\n            System.out.println(customer);\n        }\n    }\n\n    @Test\n    public void fetchPageCustomers() {\n        System.out.println(\"Customers found with fetchPageCustomers:\");\n        System.out.println(\"-------------------------------\");\n        Sort sort = new Sort(Sort.Direction.DESC, \"address.keyword\");\n        Pageable pageable = PageRequest.of(0, 10, sort);\n        Page<Customer> customers=repository.findByAddress(\"北京\", pageable);\n        System.out.println(\"Page customers \"+customers.getContent().toString());\n    }\n\n    @Test\n    public void fetchPage2Customers() {\n        System.out.println(\"Customers found with fetchPageCustomers:\");\n        System.out.println(\"-------------------------------\");\n       QueryBuilder customerQuery = QueryBuilders.boolQuery()\n                .must(QueryBuilders.matchQuery(\"address\", \"北京\"));\n        Page<Customer> page = repository.search(customerQuery, PageRequest.of(0, 10));\n        System.out.println(\"Page customers \"+page.getContent().toString());\n        page = repository.search(customerQuery, PageRequest.of(1, 10));\n        System.out.println(\"Page customers \"+page.getContent().toString());\n    }\n\n    @Test\n    public void fetchAggregation() {\n        System.out.println(\"Customers found with fetchAggregation:\");\n        System.out.println(\"-------------------------------\");\n\n       QueryBuilder customerQuery = QueryBuilders.boolQuery()\n                .must(QueryBuilders.matchQuery(\"address\", \"北京\"));\n\n        SumAggregationBuilder sumBuilder = AggregationBuilders.sum(\"sumAge\").field(\"age\");\n\n        SearchQuery searchQuery = new NativeSearchQueryBuilder()\n                .withQuery(customerQuery)\n                .addAggregation(sumBuilder)\n                .build();\n\n        Aggregations aggregations = elasticsearchTemplate.query(searchQuery, new ResultsExtractor<Aggregations>() {\n            @Override\n            public Aggregations extract(SearchResponse response) {\n                return response.getAggregations();\n            }\n        });\n\n       //转换成map集合\n        Map<String, Aggregation> aggregationMap = aggregations.asMap();\n        //获得对应的聚合函数的聚合子类，该聚合子类也是个map集合,里面的value就是桶Bucket，我们要获得Bucket\n        InternalSum sumAge = (InternalSum) aggregationMap.get(\"sumAge\");\n        System.out.println(\"sum age is \"+sumAge.getValue());\n    }\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-fastDFS/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0\n  http://maven.apache.org/maven-v4_0_0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <groupId>com.neo</groupId>\n    <artifactId>spring-boot-fastDFS</artifactId>\n    <packaging>jar</packaging>\n    <version>1.0</version>\n\n    <parent>\n        <groupId>org.springframework.boot</groupId>\n        <artifactId>spring-boot-starter-parent</artifactId>\n        <version>2.1.0.RELEASE</version>\n    </parent>\n\n    <properties>\n        <java.version>1.8</java.version>\n    </properties>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-web</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-thymeleaf</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-devtools</artifactId>\n            <optional>true</optional>\n        </dependency>\n        <dependency>\n            <groupId>org.csource</groupId>\n            <artifactId>fastdfs-client-java</artifactId>\n            <version>1.27-SNAPSHOT</version>\n        </dependency>\n    </dependencies>\n\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.springframework.boot</groupId>\n                <artifactId>spring-boot-maven-plugin</artifactId>\n            </plugin>\n        </plugins>\n    </build>\n\n</project>\n"
  },
  {
    "path": "2.x/spring-boot-fastDFS/src/main/java/com/neo/FastDFSApplication.java",
    "content": "package com.neo;\n\nimport org.apache.coyote.http11.AbstractHttp11Protocol;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;\nimport org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;\nimport org.springframework.context.annotation.Bean;\n\n@SpringBootApplication\npublic class FastDFSApplication {\n\n    public static void main(String[] args) throws Exception {\n        SpringApplication.run(FastDFSApplication.class, args);\n    }\n\n    //Tomcat large file upload connection reset\n    @Bean\n    public TomcatServletWebServerFactory tomcatEmbedded() {\n        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();\n        tomcat.addConnectorCustomizers((TomcatConnectorCustomizer) connector -> {\n            if ((connector.getProtocolHandler() instanceof AbstractHttp11Protocol<?>)) {\n                //-1 means unlimited\n                ((AbstractHttp11Protocol<?>) connector.getProtocolHandler()).setMaxSwallowSize(-1);\n            }\n        });\n        return tomcat;\n    }\n\n}"
  },
  {
    "path": "2.x/spring-boot-fastDFS/src/main/java/com/neo/controller/GlobalExceptionHandler.java",
    "content": "package com.neo.controller;\n\nimport org.springframework.web.bind.annotation.ControllerAdvice;\nimport org.springframework.web.bind.annotation.ExceptionHandler;\nimport org.springframework.web.multipart.MultipartException;\nimport org.springframework.web.servlet.mvc.support.RedirectAttributes;\n\n@ControllerAdvice\npublic class GlobalExceptionHandler {\n\n    //https://jira.spring.io/browse/SPR-14651\n    //4.3.5 supports RedirectAttributes redirectAttributes\n    @ExceptionHandler(MultipartException.class)\n    public String handleError1(MultipartException e, RedirectAttributes redirectAttributes) {\n\n        redirectAttributes.addFlashAttribute(\"message\", e.getCause().getMessage());\n        return \"redirect:/uploadStatus\";\n\n    }\n}\n"
  },
  {
    "path": "2.x/spring-boot-fastDFS/src/main/java/com/neo/controller/UploadController.java",
    "content": "package com.neo.controller;\n\nimport com.neo.fastdfs.FastDFSClient;\nimport com.neo.fastdfs.FastDFSFile;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.multipart.MultipartFile;\nimport org.springframework.web.servlet.mvc.support.RedirectAttributes;\n\nimport java.io.IOException;\nimport java.io.InputStream;\n\n@Controller\npublic class UploadController {\n    private static Logger logger = LoggerFactory.getLogger(UploadController.class);\n\n    @GetMapping(\"/\")\n    public String index() {\n        return \"upload\";\n    }\n\n    @PostMapping(\"/upload\") //new annotation since 4.3\n    public String singleFileUpload(@RequestParam(\"file\") MultipartFile file,\n                                   RedirectAttributes redirectAttributes) {\n        if (file.isEmpty()) {\n            redirectAttributes.addFlashAttribute(\"message\", \"Please select a file to upload\");\n            return \"redirect:uploadStatus\";\n        }\n        try {\n            // Get the file and save it somewhere\n            String path=saveFile(file);\n            redirectAttributes.addFlashAttribute(\"message\",\n                    \"You successfully uploaded '\" + file.getOriginalFilename() + \"'\");\n            redirectAttributes.addFlashAttribute(\"path\",\n                    \"file path url '\" + path + \"'\");\n        } catch (Exception e) {\n            logger.error(\"upload file failed\",e);\n        }\n        return \"redirect:/uploadStatus\";\n    }\n\n    @GetMapping(\"/uploadStatus\")\n    public String uploadStatus() {\n        return \"uploadStatus\";\n    }\n\n    /**\n     * @param multipartFile\n     * @return\n     * @throws IOException\n     */\n    public String saveFile(MultipartFile multipartFile) throws IOException {\n        String[] fileAbsolutePath={};\n        String fileName=multipartFile.getOriginalFilename();\n        String ext = fileName.substring(fileName.lastIndexOf(\".\") + 1);\n        byte[] file_buff = null;\n        InputStream inputStream=multipartFile.getInputStream();\n        if(inputStream!=null){\n            int len1 = inputStream.available();\n            file_buff = new byte[len1];\n            inputStream.read(file_buff);\n        }\n        inputStream.close();\n        FastDFSFile file = new FastDFSFile(fileName, file_buff, ext);\n        try {\n            fileAbsolutePath = FastDFSClient.upload(file);  //upload to fastdfs\n        } catch (Exception e) {\n            logger.error(\"upload file Exception!\",e);\n        }\n        if (fileAbsolutePath==null) {\n            logger.error(\"upload file failed,please upload again!\");\n        }\n        String path=FastDFSClient.getTrackerUrl()+fileAbsolutePath[0]+ \"/\"+fileAbsolutePath[1];\n        return path;\n    }\n}"
  },
  {
    "path": "2.x/spring-boot-fastDFS/src/main/java/com/neo/fastdfs/FastDFSClient.java",
    "content": "package com.neo.fastdfs;\n\nimport org.csource.common.NameValuePair;\nimport org.csource.fastdfs.*;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.core.io.ClassPathResource;\nimport org.springframework.core.io.Resource;\n\nimport java.io.*;\n\npublic class FastDFSClient {\n\tprivate static org.slf4j.Logger logger = LoggerFactory.getLogger(FastDFSClient.class);\n\n\tstatic {\n\t\ttry {\n\t\t\tString filePath = new ClassPathResource(\"fdfs_client.conf\").getFile().getAbsolutePath();;\n\t\t\tClientGlobal.init(filePath);\n\t\t} catch (Exception e) {\n\t\t\tlogger.error(\"FastDFS Client Init Fail!\",e);\n\t\t}\n\t}\n\n\tpublic static String[] upload(FastDFSFile file) {\n\t\tlogger.info(\"File Name: \" + file.getName() + \"File Length:\" + file.getContent().length);\n\n\t\tNameValuePair[] meta_list = new NameValuePair[1];\n\t\tmeta_list[0] = new NameValuePair(\"author\", file.getAuthor());\n\n\t\tlong startTime = System.currentTimeMillis();\n\t\tString[] uploadResults = null;\n\t\tStorageClient storageClient=null;\n\t\ttry {\n\t\t\tstorageClient = getTrackerClient();\n\t\t\tuploadResults = storageClient.upload_file(file.getContent(), file.getExt(), meta_list);\n\t\t} catch (IOException e) {\n\t\t\tlogger.error(\"IO Exception when uploadind the file:\" + file.getName(), e);\n\t\t} catch (Exception e) {\n\t\t\tlogger.error(\"Non IO Exception when uploadind the file:\" + file.getName(), e);\n\t\t}\n\t\tlogger.info(\"upload_file time used:\" + (System.currentTimeMillis() - startTime) + \" ms\");\n\n\t\tif (uploadResults == null && storageClient!=null) {\n\t\t\tlogger.error(\"upload file fail, error code:\" + storageClient.getErrorCode());\n\t\t}\n\t\tString groupName = uploadResults[0];\n\t\tString remoteFileName = uploadResults[1];\n\n\t\tlogger.info(\"upload file successfully!!!\" + \"group_name:\" + groupName + \", remoteFileName:\" + \" \" + remoteFileName);\n\t\treturn uploadResults;\n\t}\n\n\tpublic static FileInfo getFile(String groupName, String remoteFileName) {\n\t\ttry {\n\t\t\tStorageClient storageClient = getTrackerClient();\n\t\t\treturn storageClient.get_file_info(groupName, remoteFileName);\n\t\t} catch (IOException e) {\n\t\t\tlogger.error(\"IO Exception: Get File from Fast DFS failed\", e);\n\t\t} catch (Exception e) {\n\t\t\tlogger.error(\"Non IO Exception: Get File from Fast DFS failed\", e);\n\t\t}\n\t\treturn null;\n\t}\n\n\tpublic static InputStream downFile(String groupName, String remoteFileName) {\n\t\ttry {\n\t\t\tStorageClient storageClient = getTrackerClient();\n\t\t\tbyte[] fileByte = storageClient.download_file(groupName, remoteFileName);\n\t\t\tInputStream ins = new ByteArrayInputStream(fileByte);\n\t\t\treturn ins;\n\t\t} catch (IOException e) {\n\t\t\tlogger.error(\"IO Exception: Get File from Fast DFS failed\", e);\n\t\t} catch (Exception e) {\n\t\t\tlogger.error(\"Non IO Exception: Get File from Fast DFS failed\", e);\n\t\t}\n\t\treturn null;\n\t}\n\n\tpublic static void deleteFile(String groupName, String remoteFileName)\n\t\t\tthrows Exception {\n\t\tStorageClient storageClient = getTrackerClient();\n\t\tint i = storageClient.delete_file(groupName, remoteFileName);\n\t\tlogger.info(\"delete file successfully!!!\" + i);\n\t}\n\n\tpublic static StorageServer[] getStoreStorages(String groupName)\n\t\t\tthrows IOException {\n\t\tTrackerClient trackerClient = new TrackerClient();\n\t\tTrackerServer trackerServer = trackerClient.getConnection();\n\t\treturn trackerClient.getStoreStorages(trackerServer, groupName);\n\t}\n\n\tpublic static ServerInfo[] getFetchStorages(String groupName,\n\t\t\t\t\t\t\t\t\t\t\t\tString remoteFileName) throws IOException {\n\t\tTrackerClient trackerClient = new TrackerClient();\n\t\tTrackerServer trackerServer = trackerClient.getConnection();\n\t\treturn trackerClient.getFetchStorages(trackerServer, groupName, remoteFileName);\n\t}\n\n\tpublic static String getTrackerUrl() throws IOException {\n\t\treturn \"http://\"+getTrackerServer().getInetSocketAddress().getHostString()+\":\"+ClientGlobal.getG_tracker_http_port()+\"/\";\n\t}\n\n\tprivate static StorageClient getTrackerClient() throws IOException {\n\t\tTrackerServer trackerServer = getTrackerServer();\n\t\tStorageClient storageClient = new StorageClient(trackerServer, null);\n\t\treturn  storageClient;\n\t}\n\n\tprivate static TrackerServer getTrackerServer() throws IOException {\n\t\tTrackerClient trackerClient = new TrackerClient();\n\t\tTrackerServer trackerServer = trackerClient.getConnection();\n\t\treturn  trackerServer;\n\t}\n}"
  },
  {
    "path": "2.x/spring-boot-fastDFS/src/main/java/com/neo/fastdfs/FastDFSFile.java",
    "content": "package com.neo.fastdfs;\n\npublic class FastDFSFile {\n\tprivate String name;\n\n\tprivate byte[] content;\n\n\tprivate String ext;\n\n\tprivate String md5;\n\n\tprivate String author;\n\n\tpublic FastDFSFile(String name, byte[] content, String ext, String height,\n\t\t\t\t\t   String width, String author) {\n\t\tsuper();\n\t\tthis.name = name;\n\t\tthis.content = content;\n\t\tthis.ext = ext;\n\t\tthis.author = author;\n\t}\n\n\tpublic FastDFSFile(String name, byte[] content, String ext) {\n\t\tsuper();\n\t\tthis.name = name;\n\t\tthis.content = content;\n\t\tthis.ext = ext;\n\n\t}\n\n\tpublic String getName() {\n\t\treturn name;\n\t}\n\n\tpublic void setName(String name) {\n\t\tthis.name = name;\n\t}\n\n\tpublic byte[] getContent() {\n\t\treturn content;\n\t}\n\n\tpublic void setContent(byte[] content) {\n\t\tthis.content = content;\n\t}\n\n\tpublic String getExt() {\n\t\treturn ext;\n\t}\n\n\tpublic void setExt(String ext) {\n\t\tthis.ext = ext;\n\t}\n\n\tpublic String getMd5() {\n\t\treturn md5;\n\t}\n\n\tpublic void setMd5(String md5) {\n\t\tthis.md5 = md5;\n\t}\n\n\tpublic String getAuthor() {\n\t\treturn author;\n\t}\n\n\tpublic void setAuthor(String author) {\n\t\tthis.author = author;\n\t}\n}"
  },
  {
    "path": "2.x/spring-boot-fastDFS/src/main/resources/application.properties",
    "content": "#http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#common-application-properties\n#search multipart\nspring.servlet.http.multipart.max-file-size=10MB\nspring.servlet.http.multipart.max-request-size=10MB\n\n"
  },
  {
    "path": "2.x/spring-boot-fastDFS/src/main/resources/fdfs_client.conf",
    "content": "connect_timeout = 60\nnetwork_timeout = 60\ncharset = UTF-8\nhttp.tracker_http_port = 8080\nhttp.anti_steal_token = no\nhttp.secret_key = 123456\n\ntracker_server = 192.168.53.85:22122\ntracker_server = 192.168.53.86:22122\n"
  },
  {
    "path": "2.x/spring-boot-fastDFS/src/main/resources/logback.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration>\n\n    <appender name=\"STDOUT\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <layout class=\"ch.qos.logback.classic.PatternLayout\">\n            <Pattern>\n                %d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n\n            </Pattern>\n        </layout>\n    </appender>\n\n    <logger name=\"org.springframework.web\" level=\"error\" additivity=\"false\">\n        <appender-ref ref=\"STDOUT\"/>\n    </logger>\n\n    <logger name=\"com.neo\" level=\"debug\" additivity=\"false\">\n        <appender-ref ref=\"STDOUT\"/>\n    </logger>\n\n    <root level=\"error\">\n        <appender-ref ref=\"STDOUT\"/>\n    </root>\n\n</configuration>"
  },
  {
    "path": "2.x/spring-boot-fastDFS/src/main/resources/templates/upload.html",
    "content": "<!DOCTYPE html>\n<html xmlns:th=\"http://www.thymeleaf.org\">\n<body>\n\n<h1>Spring Boot file upload example</h1>\n\n<form method=\"POST\" action=\"/upload\" enctype=\"multipart/form-data\">\n    <input type=\"file\" name=\"file\" /><br/><br/>\n    <input type=\"submit\" value=\"Submit\" />\n</form>\n\n</body>\n</html>\n"
  },
  {
    "path": "2.x/spring-boot-fastDFS/src/main/resources/templates/uploadStatus.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<body>\n\n<h1>Spring Boot - Upload Status</h1>\n\n<div th:if=\"${message}\">\n    <h2 th:text=\"${message}\"/>\n</div>\n\n<div th:if=\"${path}\">\n    <h2 th:text=\"${path}\"/>\n</div>\n\n</body>\n</html>"
  },
  {
    "path": "2.x/spring-boot-file-upload/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0\n  http://maven.apache.org/maven-v4_0_0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <groupId>com.neo</groupId>\n    <artifactId>spring-boot-file-upload</artifactId>\n    <packaging>jar</packaging>\n    <version>1.0</version>\n\n    <parent>\n        <groupId>org.springframework.boot</groupId>\n        <artifactId>spring-boot-starter-parent</artifactId>\n        <version>2.1.0.RELEASE</version>\n    </parent>\n\n    <properties>\n        <java.version>1.8</java.version>\n    </properties>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-web</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-thymeleaf</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-devtools</artifactId>\n            <optional>true</optional>\n        </dependency>\n\n    </dependencies>\n\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.springframework.boot</groupId>\n                <artifactId>spring-boot-maven-plugin</artifactId>\n            </plugin>\n        </plugins>\n    </build>\n\n</project>\n"
  },
  {
    "path": "2.x/spring-boot-file-upload/src/main/java/com/neo/FileUploadWebApplication.java",
    "content": "package com.neo;\n\nimport org.apache.coyote.http11.AbstractHttp11Protocol;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;\nimport org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;\nimport org.springframework.context.annotation.Bean;\n\n@SpringBootApplication\npublic class FileUploadWebApplication {\n\n    public static void main(String[] args) throws Exception {\n        SpringApplication.run(FileUploadWebApplication.class, args);\n    }\n\n    //Tomcat large file upload connection reset\n    @Bean\n    public TomcatServletWebServerFactory tomcatEmbedded() {\n        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();\n        tomcat.addConnectorCustomizers((TomcatConnectorCustomizer) connector -> {\n            if ((connector.getProtocolHandler() instanceof AbstractHttp11Protocol<?>)) {\n                //-1 means unlimited\n                ((AbstractHttp11Protocol<?>) connector.getProtocolHandler()).setMaxSwallowSize(-1);\n            }\n        });\n        return tomcat;\n    }\n\n}"
  },
  {
    "path": "2.x/spring-boot-file-upload/src/main/java/com/neo/controller/GlobalExceptionHandler.java",
    "content": "package com.neo.controller;\n\nimport org.springframework.web.bind.annotation.ControllerAdvice;\nimport org.springframework.web.bind.annotation.ExceptionHandler;\nimport org.springframework.web.multipart.MultipartException;\nimport org.springframework.web.servlet.mvc.support.RedirectAttributes;\n\n@ControllerAdvice\npublic class GlobalExceptionHandler {\n\n    //https://jira.spring.io/browse/SPR-14651\n    //4.3.5 supports RedirectAttributes redirectAttributes\n    @ExceptionHandler(MultipartException.class)\n    public String handleError1(MultipartException e, RedirectAttributes redirectAttributes) {\n        redirectAttributes.addFlashAttribute(\"message\", e.getCause().getMessage());\n        return \"redirect:/uploadStatus\";\n    }\n}\n"
  },
  {
    "path": "2.x/spring-boot-file-upload/src/main/java/com/neo/controller/UploadController.java",
    "content": "package com.neo.controller;\n\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.multipart.MultipartFile;\nimport org.springframework.web.servlet.mvc.support.RedirectAttributes;\n\nimport java.io.IOException;\nimport java.nio.file.Files;\nimport java.nio.file.Path;\nimport java.nio.file.Paths;\n\n@Controller\npublic class UploadController {\n    //Save the uploaded file to this folder\n    private static String UPLOADED_FOLDER = \"E://temp//\";\n\n    @GetMapping(\"/\")\n    public String index() {\n        return \"upload\";\n    }\n\n    @PostMapping(\"/upload\") // //new annotation since 4.3\n    public String singleFileUpload(@RequestParam(\"file\") MultipartFile file,\n        RedirectAttributes redirectAttributes) {\n        if (file.isEmpty()) {\n            redirectAttributes.addFlashAttribute(\"message\", \"Please select a file to upload\");\n            return \"redirect:uploadStatus\";\n        }\n\n        try {\n            // Get the file and save it somewhere\n            byte[] bytes = file.getBytes();\n            Path dir = Paths.get(UPLOADED_FOLDER);\n            Path path = Paths.get(UPLOADED_FOLDER + file.getOriginalFilename());\n            // Create parent dir if not exists\n            if(!Files.exists(dir)) {\n                Files.createDirectories(dir);\n            }\n            Files.write(path, bytes);\n            redirectAttributes.addFlashAttribute(\"message\",\n                \"You successfully uploaded '\" + file.getOriginalFilename() + \"'\");\n\n        } catch (IOException e) {\n            redirectAttributes.addFlashAttribute(\"message\", \"Server throw IOException\");\n            e.printStackTrace();\n        }\n        return \"redirect:/uploadStatus\";\n    }\n\n    @GetMapping(\"/uploadStatus\")\n    public String uploadStatus() {\n        return \"uploadStatus\";\n    }\n\n}"
  },
  {
    "path": "2.x/spring-boot-file-upload/src/main/resources/application.properties",
    "content": "#http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#common-application-properties\n#search multipart\nspring.servlet.multipart.max-file-size=10MB\nspring.servlet.multipart.max-request-size=10MB"
  },
  {
    "path": "2.x/spring-boot-file-upload/src/main/resources/logback.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration>\n\n    <appender name=\"STDOUT\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <layout class=\"ch.qos.logback.classic.PatternLayout\">\n            <Pattern>\n                %d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n\n            </Pattern>\n        </layout>\n    </appender>\n\n    <logger name=\"org.springframework.web\" level=\"error\" additivity=\"false\">\n        <appender-ref ref=\"STDOUT\"/>\n    </logger>\n\n    <logger name=\"com.neo\" level=\"debug\" additivity=\"false\">\n        <appender-ref ref=\"STDOUT\"/>\n    </logger>\n\n    <root level=\"error\">\n        <appender-ref ref=\"STDOUT\"/>\n    </root>\n\n</configuration>"
  },
  {
    "path": "2.x/spring-boot-file-upload/src/main/resources/templates/from_file.html",
    "content": "<form id='myupload' action='http://localhost:8080/uploadSign' method='post' enctype='multipart/form-data'>\n  <div class=\"demo\">\n    <div class=\"btn\">\n      <span>Ӹ</span>\n      <input id=\"fileupload\" type=\"file\" name=\"file1\"></div>\n    <div class=\"progress\">\n      <span class=\"bar\"></span>\n      <span class=\"percent\">0%</span></div>\n    <!-- ʾϴļ -->\n    <div class=\"files\"></div>\n    <!-- ʾϴͼƬ-->\n    <div class=\"showimg\"></div>\n  </div>\n  <input type=\"submit\" onclick=\"gosubmit2()\" /></form>\n<script src=\"https://cdn.bootcss.com/jquery/1.6.4/jquery.js\"></script>\n<script type=\"text/javascript\" src=\"https://cdn.bootcss.com/jquery.form/4.1.0/jquery.form.min.js\"></script>\n<script type=\"text/javascript\">var bar = $('.bar'); //\n  var percent = $('.percent'); //ȡϴٷֱ\n  var showimg = $('.showimg'); //ʾͼƬdiv\n  var progress = $('.progress'); //ʾȵdiv\n  var files = $('.files'); //ļϴؼinputԪ\n  var btn = $('.btn span'); //ťı\n  function gosubmit2() {\n    $(\"#myupload\").ajaxSubmit({\n      dataType: 'json',\n      //\n      beforeSend: function() {\n        showimg.empty();\n        progress.show();\n        var percentVal = '0%';\n        bar.width(percentVal);\n        percent.html(percentVal);\n        btn.html('ϴ..');\n      },\n      //½¼\n      uploadProgress: function(event, position, total, percentComplete) {\n        var percentVal = percentComplete + '%';\n        bar.width(percentVal);\n        percent.html(percentVal);\n      },\n      success: function(data) { //ͼƬϴɹʱ\n        //ȡ˷صļ\n        alert(data.name + \",\" + data.pic + \",\" + data.size);\n      },\n      error: function(xhr) {\n        btn.html(ϴʧ);\n        bar.width('0');\n        files.html(xhr.responseText);\n      }\n    });\n  }</script>"
  },
  {
    "path": "2.x/spring-boot-file-upload/src/main/resources/templates/upload.html",
    "content": "<!DOCTYPE html>\n<html xmlns:th=\"http://www.thymeleaf.org\">\n<body>\n\n<h1>Spring Boot file upload example</h1>\n\n<form method=\"POST\" action=\"/upload\" enctype=\"multipart/form-data\">\n    <input type=\"file\" name=\"file\" /><br/><br/>\n    <input type=\"submit\" value=\"Submit\" />\n</form>\n\n</body>\n</html>\n"
  },
  {
    "path": "2.x/spring-boot-file-upload/src/main/resources/templates/uploadStatus.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<body>\n\n<h1>Spring Boot - Upload Status</h1>\n\n<div th:if=\"${message}\">\n    <h2 th:text=\"${message}\"/>\n</div>\n\n</body>\n</html>"
  },
  {
    "path": "2.x/spring-boot-hello/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-hello</artifactId>\n\t<version>1.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-hello</name>\n\t<description>Demo project for Spring Boot</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>2.0.0.RELEASE</version>\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n\t<dependencies>\n\t     <dependency>\n\t        <groupId>org.springframework.boot</groupId>\n\t        <artifactId>spring-boot-starter-web</artifactId>\n\t    </dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t</dependencies>\n\t\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\t\n\n</project>\n"
  },
  {
    "path": "2.x/spring-boot-hello/src/main/java/com/neo/HelloApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class HelloApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(HelloApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "2.x/spring-boot-hello/src/main/java/com/neo/controller/HelloController.java",
    "content": "package com.neo.controller;\n\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n@RestController\npublic class HelloController {\n\t\n    @RequestMapping(\"/\")\n    public String index() {\n        return \"Hello Spring Boot 2.0!\";\n    }\n}"
  },
  {
    "path": "2.x/spring-boot-hello/src/main/resources/application.properties",
    "content": ""
  },
  {
    "path": "2.x/spring-boot-hello/src/test/java/com/neo/HelloApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class HelloApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t\tSystem.out.println(\"Hello Spring Boot 2.0!\");\n\t}\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-helloWorld/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-helloworld</artifactId>\n\t<version>1.0.0-SNAPSHOT</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-helloworld</name>\n\t<description>Demo project for Spring Boot</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>2.1.3.RELEASE</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-web</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t     <dependency>\n\t        <groupId>org.springframework.boot</groupId>\n\t        <artifactId>spring-boot-devtools</artifactId>\n\t        <optional>true</optional>\n\t\t</dependency>\n\t</dependencies>\n\t\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t\t<configuration>\n\t                <fork>true</fork>\n\t            </configuration>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\t\n\n</project>\n"
  },
  {
    "path": "2.x/spring-boot-helloWorld/src/main/java/com/neo/Application.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class Application {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(Application.class, args);\n\t}\n}\n"
  },
  {
    "path": "2.x/spring-boot-helloWorld/src/main/java/com/neo/controller/HelloWorldController.java",
    "content": "package com.neo.controller;\n\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n@RestController\npublic class HelloWorldController {\n\t\n    @RequestMapping(\"/hello\")\n    public String index() {\n        return \"Hello World\";\n    }\n}"
  },
  {
    "path": "2.x/spring-boot-helloWorld/src/main/resources/application.properties",
    "content": ""
  },
  {
    "path": "2.x/spring-boot-helloWorld/src/test/java/com/neo/ApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class ApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t\tSystem.out.println(\"hello word\");\n\t}\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-helloWorld/src/test/java/com/neo/controller/HelloTests.java",
    "content": "package com.neo.controller;\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.http.MediaType;\nimport org.springframework.mock.web.MockServletContext;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\nimport org.springframework.test.context.junit4.SpringRunner;\nimport org.springframework.test.context.web.WebAppConfiguration;\nimport org.springframework.test.web.servlet.MockMvc;\nimport org.springframework.test.web.servlet.request.MockMvcRequestBuilders;\nimport org.springframework.test.web.servlet.setup.MockMvcBuilders;\n\nimport static org.hamcrest.Matchers.equalTo;\nimport static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;\nimport static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class HelloTests {\n\n\t\n    private MockMvc mvc;\n\n    @Before\n    public void setUp() throws Exception {\n        mvc = MockMvcBuilders.standaloneSetup(new HelloWorldController()).build();\n    }\n\n    @Test\n    public void getHello() throws Exception {\n        mvc.perform(MockMvcRequestBuilders.get(\"/hello\").accept(MediaType.APPLICATION_JSON))\n                .andExpect(status().isOk())\n                .andExpect(content().string(equalTo(\"Hello World\")));\n    }\n\n}"
  },
  {
    "path": "2.x/spring-boot-helloWorld/src/test/java/com/neo/controller/HelloWorldControlerTests.java",
    "content": "package com.neo.controller;\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.http.MediaType;\nimport org.springframework.mock.web.MockServletContext;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\nimport org.springframework.test.context.junit4.SpringRunner;\nimport org.springframework.test.context.web.WebAppConfiguration;\nimport org.springframework.test.web.servlet.MockMvc;\nimport org.springframework.test.web.servlet.request.MockMvcRequestBuilders;\nimport org.springframework.test.web.servlet.result.MockMvcResultHandlers;\nimport org.springframework.test.web.servlet.result.MockMvcResultMatchers;\nimport org.springframework.test.web.servlet.setup.MockMvcBuilders;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class HelloWorldControlerTests {\n\n    private MockMvc mvc;\n\n    @Before\n    public void setUp() throws Exception {\n        mvc = MockMvcBuilders.standaloneSetup(new HelloWorldController()).build();\n    }\n\n    @Test\n    public void getHello() throws Exception {\n        mvc.perform(MockMvcRequestBuilders.get(\"/hello\").accept(MediaType.APPLICATION_JSON))\n                .andExpect(MockMvcResultMatchers.status().isOk())\n                .andDo(MockMvcResultHandlers.print())\n                .andReturn();\n    }\n\n}"
  },
  {
    "path": "2.x/spring-boot-jpa/spring-boot-jpa/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-Jpa</artifactId>\n\t<version>1.0.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-Jpa</name>\n\t<description>Demo project for Spring Boot</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>2.1.0.RELEASE</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-data-jpa</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>mysql</groupId>\n\t\t\t<artifactId>mysql-connector-java</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t</dependencies>\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\n</project>\n"
  },
  {
    "path": "2.x/spring-boot-jpa/spring-boot-jpa/src/main/java/com/neo/JpaApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.boot.autoconfigure.domain.EntityScan;\n\n@SpringBootApplication\npublic class JpaApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(JpaApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "2.x/spring-boot-jpa/spring-boot-jpa/src/main/java/com/neo/model/Address.java",
    "content": "package com.neo.model;\n\nimport javax.persistence.Column;\nimport javax.persistence.Entity;\nimport javax.persistence.GeneratedValue;\nimport javax.persistence.Id;\n\n@Entity\npublic class Address {\n\n    @Id\n    @GeneratedValue\n    private Long id;\n    @Column(nullable = false)\n    private Long userId;\n    private String province;\n    private String city;\n    private String street;\n\n    public Long getId() {\n        return id;\n    }\n\n    public void setId(Long id) {\n        this.id = id;\n    }\n\n    public Long getUserId() {\n        return userId;\n    }\n\n    public void setUserId(Long userId) {\n        this.userId = userId;\n    }\n\n    public String getProvince() {\n        return province;\n    }\n\n    public void setProvince(String province) {\n        this.province = province;\n    }\n\n    public String getCity() {\n        return city;\n    }\n\n    public void setCity(String city) {\n        this.city = city;\n    }\n\n    public String getStreet() {\n        return street;\n    }\n\n    public void setStreet(String street) {\n        this.street = street;\n    }\n}\n"
  },
  {
    "path": "2.x/spring-boot-jpa/spring-boot-jpa/src/main/java/com/neo/model/User.java",
    "content": "package com.neo.model;\n\n\n\nimport javax.persistence.Column;\nimport javax.persistence.Entity;\nimport javax.persistence.GeneratedValue;\nimport javax.persistence.Id;\n\nimport java.io.Serializable;\n\n@Entity\npublic class User  {\n\n    @Id\n    @GeneratedValue\n    private Long id;\n    @Column(nullable = false, unique = true)\n    private String userName;\n    @Column(nullable = false)\n    private String passWord;\n    @Column(nullable = false, unique = true)\n    private String email;\n    @Column(nullable = true, unique = true)\n    private String nickName;\n    @Column(nullable = false)\n    private String regTime;\n\n    public User() {\n    }\n\n    public User(String userName, String passWord, String email, String nickName, String regTime) {\n        this.userName = userName;\n        this.passWord = passWord;\n        this.email = email;\n        this.nickName = nickName;\n        this.regTime = regTime;\n    }\n\n    public Long getId() {\n        return id;\n    }\n\n    public void setId(Long id) {\n        this.id = id;\n    }\n\n    public String getUserName() {\n        return userName;\n    }\n\n    public void setUserName(String userName) {\n        this.userName = userName;\n    }\n\n    public String getPassWord() {\n        return passWord;\n    }\n\n    public void setPassWord(String passWord) {\n        this.passWord = passWord;\n    }\n\n    public String getEmail() {\n        return email;\n    }\n\n    public void setEmail(String email) {\n        this.email = email;\n    }\n\n    public String getNickName() {\n        return nickName;\n    }\n\n    public void setNickName(String nickName) {\n        this.nickName = nickName;\n    }\n\n    public String getRegTime() {\n        return regTime;\n    }\n\n    public void setRegTime(String regTime) {\n        this.regTime = regTime;\n    }\n}\n"
  },
  {
    "path": "2.x/spring-boot-jpa/spring-boot-jpa/src/main/java/com/neo/model/UserDetail.java",
    "content": "package com.neo.model;\n\n\nimport org.hibernate.annotations.Fetch;\nimport org.hibernate.annotations.FetchMode;\n\nimport javax.persistence.*;\nimport java.io.Serializable;\n\n@Entity\npublic class UserDetail {\n\n    @Id\n    @GeneratedValue\n    private Long id;\n    @Column(nullable = false, unique = true)\n    private Long userId;\n    private Integer age;\n    private String realName;\n    private String status;\n    private String hobby;\n    private String introduction;\n    private String lastLoginIp;\n\n    public Long getId() {\n        return id;\n    }\n\n    public void setId(Long id) {\n        this.id = id;\n    }\n\n    public Long getUserId() {\n        return userId;\n    }\n\n    public void setUserId(Long userId) {\n        this.userId = userId;\n    }\n\n    public Integer getAge() {\n        return age;\n    }\n\n    public void setAge(Integer age) {\n        this.age = age;\n    }\n\n    public String getRealName() {\n        return realName;\n    }\n\n    public void setRealName(String realName) {\n        this.realName = realName;\n    }\n\n    public String getStatus() {\n        return status;\n    }\n\n    public void setStatus(String status) {\n        this.status = status;\n    }\n\n    public String getHobby() {\n        return hobby;\n    }\n\n    public void setHobby(String hobby) {\n        this.hobby = hobby;\n    }\n\n    public String getIntroduction() {\n        return introduction;\n    }\n\n    public void setIntroduction(String introduction) {\n        this.introduction = introduction;\n    }\n\n    public String getLastLoginIp() {\n        return lastLoginIp;\n    }\n\n    public void setLastLoginIp(String lastLoginIp) {\n        this.lastLoginIp = lastLoginIp;\n    }\n\n    @Override\n    public String toString() {\n        return \"UserDetail{\" +\n                \"id=\" + id +\n                \", userId=\" + userId +\n                \", age=\" + age +\n                \", realName='\" + realName + '\\'' +\n                \", status='\" + status + '\\'' +\n                \", hobby='\" + hobby + '\\'' +\n                \", introduction='\" + introduction + '\\'' +\n                \", lastLoginIp='\" + lastLoginIp + '\\'' +\n                '}';\n    }\n}\n"
  },
  {
    "path": "2.x/spring-boot-jpa/spring-boot-jpa/src/main/java/com/neo/model/UserInfo.java",
    "content": "package com.neo.model;\n\npublic interface UserInfo {\n\tString getUserName();\n\tString getEmail();\n\tString getHobby();\n\tString getIntroduction();\n}"
  },
  {
    "path": "2.x/spring-boot-jpa/spring-boot-jpa/src/main/java/com/neo/param/UserDetailParam.java",
    "content": "package com.neo.param;\n\n\nimport com.neo.model.Address;\nimport org.hibernate.annotations.Fetch;\nimport org.hibernate.annotations.FetchMode;\n\nimport javax.persistence.*;\n\npublic class UserDetailParam {\n    private String userId;\n    private Integer minAge;\n    private Integer maxAge;\n    private String realName;\n    private String introduction;\n    private String city;\n\n    public String getUserId() {\n        return userId;\n    }\n\n    public void setUserId(String userId) {\n        this.userId = userId;\n    }\n\n    public Integer getMinAge() {\n        return minAge;\n    }\n\n    public void setMinAge(Integer minAge) {\n        this.minAge = minAge;\n    }\n\n    public Integer getMaxAge() {\n        return maxAge;\n    }\n\n    public void setMaxAge(Integer maxAge) {\n        this.maxAge = maxAge;\n    }\n\n    public String getRealName() {\n        return realName;\n    }\n\n    public void setRealName(String realName) {\n        this.realName = realName;\n    }\n\n    public String getIntroduction() {\n        return introduction;\n    }\n\n    public void setIntroduction(String introduction) {\n        this.introduction = introduction;\n    }\n\n    public String getCity() {\n        return city;\n    }\n\n    public void setCity(String city) {\n        this.city = city;\n    }\n}\n"
  },
  {
    "path": "2.x/spring-boot-jpa/spring-boot-jpa/src/main/java/com/neo/repository/AddressRepository.java",
    "content": "package com.neo.repository;\n\nimport com.neo.model.Address;\nimport org.springframework.data.jpa.repository.JpaRepository;\n\npublic interface AddressRepository extends JpaRepository<Address, Long> {\n}"
  },
  {
    "path": "2.x/spring-boot-jpa/spring-boot-jpa/src/main/java/com/neo/repository/UserDetailRepository.java",
    "content": "package com.neo.repository;\n\nimport com.neo.model.User;\nimport com.neo.model.UserDetail;\nimport com.neo.model.UserInfo;\nimport org.springframework.data.jpa.repository.JpaRepository;\nimport org.springframework.data.jpa.repository.JpaSpecificationExecutor;\nimport org.springframework.data.jpa.repository.Query;\n\nimport java.util.List;\n\n\npublic interface UserDetailRepository extends JpaSpecificationExecutor<UserDetail>,JpaRepository<UserDetail, Long>  {\n\n    UserDetail  findByHobby(String hobby);\n\n    @Query(\"select u.userName as userName, u.email as email, d.introduction as introduction , d.hobby as hobby from User u , UserDetail d \" +\n            \"where u.id=d.userId  and  d.hobby = ?1 \")\n    List<UserInfo> findUserInfo(String hobby);\n}"
  },
  {
    "path": "2.x/spring-boot-jpa/spring-boot-jpa/src/main/java/com/neo/repository/UserRepository.java",
    "content": "package com.neo.repository;\n\nimport com.neo.model.User;\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.Pageable;\nimport org.springframework.data.domain.Slice;\nimport org.springframework.data.jpa.repository.JpaRepository;\nimport org.springframework.data.jpa.repository.Modifying;\nimport org.springframework.data.jpa.repository.Query;\nimport org.springframework.transaction.annotation.Transactional;\n\n\npublic interface UserRepository extends JpaRepository<User, Long> {\n\n    User findByUserName(String userName);\n\n    User findByUserNameOrEmail(String username, String email);\n\n    @Transactional(timeout = 10)\n    @Modifying\n    @Query(\"update User set userName = ?1 where id = ?2\")\n    int modifyById(String  userName, Long id);\n\n    @Transactional\n    @Modifying\n    @Query(\"delete from User where id = ?1\")\n    void deleteById(Long id);\n\n    @Query(\"select u from User u where u.email = ?1\")\n    User findByEmail(String email);\n\n    @Query(\"select u from User u\")\n    Page<User> findALL(Pageable pageable);\n\n    Page<User> findByNickName(String nickName, Pageable pageable);\n\n    Slice<User> findByNickNameAndEmail(String nickName, String email,Pageable pageable);\n\n\n}"
  },
  {
    "path": "2.x/spring-boot-jpa/spring-boot-jpa/src/main/java/com/neo/service/UserDetailService.java",
    "content": "package com.neo.service;\n\nimport com.neo.model.UserDetail;\nimport com.neo.param.UserDetailParam;\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.Pageable;\n\npublic interface UserDetailService {\n    public Page<UserDetail> findByCondition(UserDetailParam detailParam, Pageable pageable);\n}\n"
  },
  {
    "path": "2.x/spring-boot-jpa/spring-boot-jpa/src/main/java/com/neo/service/UserDetailServiceImpl.java",
    "content": "package com.neo.service;\n\nimport com.mysql.cj.util.StringUtils;\nimport com.neo.model.UserDetail;\nimport com.neo.param.UserDetailParam;\nimport com.neo.repository.UserDetailRepository;\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.Pageable;\nimport org.springframework.stereotype.Service;\n\nimport javax.annotation.Resource;\nimport javax.persistence.criteria.Predicate;\nimport java.util.ArrayList;\nimport java.util.List;\n\n@Service\npublic class UserDetailServiceImpl implements  UserDetailService{\n\n    @Resource\n    private UserDetailRepository userDetailRepository;\n\n    @Override\n    public Page<UserDetail> findByCondition(UserDetailParam detailParam, Pageable pageable){\n\n        return userDetailRepository.findAll((root, query, cb) -> {\n            List<Predicate> predicates = new ArrayList<Predicate>();\n            //equal 示例\n            if (!StringUtils.isNullOrEmpty(detailParam.getIntroduction())){\n                predicates.add(cb.equal(root.get(\"introduction\"),detailParam.getIntroduction()));\n            }\n            //like 示例\n            if (!StringUtils.isNullOrEmpty(detailParam.getRealName())){\n                predicates.add(cb.like(root.get(\"realName\"),\"%\"+detailParam.getRealName()+\"%\"));\n            }\n            //between 示例\n            if (detailParam.getMinAge()!=null && detailParam.getMaxAge()!=null) {\n                Predicate agePredicate = cb.between(root.get(\"age\"), detailParam.getMinAge(), detailParam.getMaxAge());\n                predicates.add(agePredicate);\n            }\n            //greaterThan 大于等于示例\n            if (detailParam.getMinAge()!=null){\n                predicates.add(cb.greaterThan(root.get(\"age\"),detailParam.getMinAge()));\n            }\n            return query.where(predicates.toArray(new Predicate[predicates.size()])).getRestriction();\n        }, pageable);\n\n    }\n}\n"
  },
  {
    "path": "2.x/spring-boot-jpa/spring-boot-jpa/src/main/resources/application.properties",
    "content": "spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true\nspring.datasource.username=root\nspring.datasource.password=root\nspring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver\n\nspring.jpa.properties.hibernate.hbm2ddl.auto=create\nspring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect\n#sql\\u8F93\\u51FA\nspring.jpa.show-sql=true\n#format\\u4E00\\u4E0Bsql\\u8FDB\\u884C\\u8F93\\u51FA\nspring.jpa.properties.hibernate.format_sql=true"
  },
  {
    "path": "2.x/spring-boot-jpa/spring-boot-jpa/src/test/java/com/neo/JpaApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class JpaApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t}\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-jpa/spring-boot-jpa/src/test/java/com/neo/repository/JpaSpecificationTests.java",
    "content": "package com.neo.repository;\n\nimport com.neo.model.UserDetail;\nimport com.neo.param.UserDetailParam;\nimport com.neo.service.UserDetailService;\nimport com.neo.service.UserDetailServiceImpl;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageRequest;\nimport org.springframework.data.domain.Pageable;\nimport org.springframework.data.domain.Sort;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport javax.annotation.Resource;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class JpaSpecificationTests {\n\n\t@Resource\n\tprivate UserDetailService userDetailService;\n\n\t@Test\n\tpublic void testFindByCondition()  {\n\t\tint page=0,size=10;\n\t\tSort sort = new Sort(Sort.Direction.DESC, \"id\");\n\t\tPageable pageable = PageRequest.of(page, size, sort);\n\t\tUserDetailParam param=new UserDetailParam();\n\t\tparam.setIntroduction(\"程序员\");\n\t\tparam.setMinAge(10);\n\t\tparam.setMaxAge(30);\n\t\tPage<UserDetail> page1=userDetailService.findByCondition(param,pageable);\n\t\tfor (UserDetail userDetail:page1){\n\t\t\tSystem.out.println(\"userDetail: \"+userDetail.toString());\n\t\t}\n\t}\n\n}"
  },
  {
    "path": "2.x/spring-boot-jpa/spring-boot-jpa/src/test/java/com/neo/repository/UserDetailRepositoryTests.java",
    "content": "package com.neo.repository;\n\nimport com.neo.model.Address;\nimport com.neo.model.User;\nimport com.neo.model.UserDetail;\nimport com.neo.model.UserInfo;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.data.domain.PageRequest;\nimport org.springframework.data.domain.Pageable;\nimport org.springframework.data.domain.Sort;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport javax.annotation.Resource;\nimport java.text.DateFormat;\nimport java.util.Date;\nimport java.util.List;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class UserDetailRepositoryTests {\n\n\t@Resource\n\tprivate AddressRepository addressRepository;\n\t@Resource\n\tprivate UserDetailRepository userDetailRepository;\n\n\t@Test\n\tpublic void testSaveAddress() {\n\t\tAddress address=new Address();\n\t\taddress.setUserId(1L);\n\t\taddress.setCity(\"北京\");\n\t\taddress.setProvince(\"北京\");\n\t\taddress.setStreet(\"分钟寺\");\n\t\taddressRepository.save(address);\n\t}\n\n\t@Test\n\tpublic void testSaveUserDetail() {\n\t\tDate date = new Date();\n\t\tDateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);\n\t\tString formattedDate = dateFormat.format(date);\n\t\tUserDetail userDetail=new UserDetail();\n\t\tuserDetail.setUserId(3L);\n\t\tuserDetail.setHobby(\"吃鸡游戏\");\n\t\tuserDetail.setAge(28);\n\t\tuserDetail.setIntroduction(\"一个爱玩的人\");\n\t\tuserDetailRepository.save(userDetail);\n\t}\n\n\t@Test\n\tpublic void testUserInfo()  {\n\t\tList<UserInfo> userInfos=userDetailRepository.findUserInfo(\"钓鱼\");\n\t\tfor (UserInfo userInfo:userInfos){\n\t\t\tSystem.out.println(\"userInfo: \"+userInfo.getUserName()+\"-\"+userInfo.getEmail()+\"-\"+userInfo.getHobby()+\"-\"+userInfo.getIntroduction());\n\t\t}\n\t}\n}"
  },
  {
    "path": "2.x/spring-boot-jpa/spring-boot-jpa/src/test/java/com/neo/repository/UserRepositoryTests.java",
    "content": "package com.neo.repository;\n\nimport com.neo.model.User;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.data.domain.PageRequest;\nimport org.springframework.data.domain.Pageable;\nimport org.springframework.data.domain.Sort;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport javax.annotation.Resource;\nimport java.text.DateFormat;\nimport java.util.Date;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class UserRepositoryTests {\n\n\t@Resource\n    private UserRepository userRepository;\n\n\t@Test\n\tpublic void testSave() {\n\t\tDate date = new Date();\n\t\tDateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);\n\t\tString formattedDate = dateFormat.format(date);\n\t\t\n\t\tuserRepository.save(new User(\"aa\", \"aa123456\",\"aa@126.com\", \"aa\",  formattedDate));\n\t\tuserRepository.save(new User(\"bb\", \"bb123456\",\"bb@126.com\", \"bb\",  formattedDate));\n\t\tuserRepository.save(new User(\"cc\", \"cc123456\",\"cc@126.com\", \"cc\",  formattedDate));\n\n//\t\tAssert.assertEquals(3, userRepository.findAll().size());\n//\t\tAssert.assertEquals(\"bb\", userRepository.findByUserNameOrEmail(\"bb\", \"bb@126.com\").getNickName());\n//\t\tuserRepository.delete(userRepository.findByUserName(\"aa\"));\n\t}\n\n\n\t@Test\n\tpublic void testBaseQuery() {\n\t\tDate date = new Date();\n\t\tDateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);\n\t\tString formattedDate = dateFormat.format(date);\n\t\tUser user=new User(\"ff\", \"ff123456\",\"ff@126.com\", \"ff\",  formattedDate);\n\t\tuserRepository.findAll();\n\t\tuserRepository.findById(3L);\n\t\tuserRepository.save(user);\n\t\tuser.setId(2L);\n\t\tuserRepository.delete(user);\n\t\tuserRepository.count();\n\t\tuserRepository.existsById(3L);\n\t}\n\n\t@Test\n\tpublic void testCustomSql() {\n\t\tuserRepository.modifyById(\"neo\",3L);\n\t\tuserRepository.deleteById(3L);\n\t\tuserRepository.findByEmail(\"ff@126.com\");\n\t}\n\n\n\t@Test\n\tpublic void testPageQuery()  {\n\t\tint page=1,size=2;\n\t\tSort sort = new Sort(Sort.Direction.DESC, \"id\");\n\t\tPageable pageable = PageRequest.of(page, size, sort);\n\t\tuserRepository.findALL(pageable);\n\t\tuserRepository.findByNickName(\"aa\", pageable);\n\t}\n\n}"
  },
  {
    "path": "2.x/spring-boot-jpa/spring-boot-multi-Jpa/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-multi-Jpa</artifactId>\n\t<version>1.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-multi-Jpa</name>\n\t<description>Demo project for Spring Boot</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>2.1.0.RELEASE</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n\t<dependencies>\n\t    <dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-data-jpa</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>mysql</groupId>\n\t\t\t<artifactId>mysql-connector-java</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t</dependencies>\n\t\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\t\n\n</project>\n"
  },
  {
    "path": "2.x/spring-boot-jpa/spring-boot-multi-Jpa/src/main/java/com/neo/MultiJpaApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class MultiJpaApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(MultiJpaApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "2.x/spring-boot-jpa/spring-boot-multi-Jpa/src/main/java/com/neo/config/DataSourceConfig.java",
    "content": "package com.neo.config;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties;\nimport org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings;\nimport org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;\nimport org.springframework.boot.context.properties.ConfigurationProperties;\nimport org.springframework.boot.jdbc.DataSourceBuilder;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.context.annotation.Primary;\n\nimport javax.sql.DataSource;\nimport java.util.Map;\n\n@Configuration\npublic class DataSourceConfig {\n\n    @Autowired\n    private JpaProperties jpaProperties;\n    @Autowired\n    private HibernateProperties hibernateProperties;\n\n    @Bean(name = \"primaryDataSource\")\n    @Primary\n    @ConfigurationProperties(\"spring.datasource.primary\")\n    public DataSource firstDataSource() {\n        return DataSourceBuilder.create().build();\n    }\n\n    @Bean(name = \"secondaryDataSource\")\n    @ConfigurationProperties(\"spring.datasource.secondary\")\n    public DataSource secondDataSource() {\n        return DataSourceBuilder.create().build();\n    }\n\n    @Bean(name = \"vendorProperties\")\n    public Map<String, Object> getVendorProperties() {\n        return hibernateProperties.determineHibernateProperties(jpaProperties.getProperties(), new HibernateSettings());\n    }\n}\n"
  },
  {
    "path": "2.x/spring-boot-jpa/spring-boot-multi-Jpa/src/main/java/com/neo/config/PrimaryConfig.java",
    "content": "package com.neo.config;\n\nimport java.util.Map;\n\nimport javax.persistence.EntityManager;\nimport javax.sql.DataSource;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.context.annotation.Primary;\nimport org.springframework.data.jpa.repository.config.EnableJpaRepositories;\nimport org.springframework.orm.jpa.JpaTransactionManager;\nimport org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;\nimport org.springframework.transaction.PlatformTransactionManager;\nimport org.springframework.transaction.annotation.EnableTransactionManagement;\n\n@Configuration\n@EnableTransactionManagement\n@EnableJpaRepositories(\n\t\tentityManagerFactoryRef=\"entityManagerFactoryPrimary\",\n\t\ttransactionManagerRef=\"transactionManagerPrimary\",\n\t\tbasePackages= { \"com.neo.repository.test1\" })//设置dao（repo）所在位置\npublic class PrimaryConfig {\n\n    @Autowired\n    @Qualifier(\"primaryDataSource\")\n    private DataSource primaryDataSource;\n\n    @Autowired\n    @Qualifier(\"vendorProperties\")\n    private Map<String, Object> vendorProperties;\n\n    @Bean(name = \"entityManagerFactoryPrimary\")\n    @Primary\n    public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary (EntityManagerFactoryBuilder builder) {\n        return builder\n                .dataSource(primaryDataSource)\n                .properties(vendorProperties)\n                .packages(\"com.neo.model\") //设置实体类所在位置\n                .persistenceUnit(\"primaryPersistenceUnit\")\n                .build();\n    }\n\n    @Bean(name = \"entityManagerPrimary\")\n    @Primary\n    public EntityManager entityManager(EntityManagerFactoryBuilder builder) {\n        return entityManagerFactoryPrimary(builder).getObject().createEntityManager();\n    }\n\n    @Bean(name = \"transactionManagerPrimary\")\n    @Primary\n    PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {\n        return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject());\n    }\n\n}"
  },
  {
    "path": "2.x/spring-boot-jpa/spring-boot-multi-Jpa/src/main/java/com/neo/config/SecondaryConfig.java",
    "content": "package com.neo.config;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.data.jpa.repository.config.EnableJpaRepositories;\nimport org.springframework.orm.jpa.JpaTransactionManager;\nimport org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;\nimport org.springframework.transaction.PlatformTransactionManager;\nimport org.springframework.transaction.annotation.EnableTransactionManagement;\n\nimport javax.persistence.EntityManager;\nimport javax.sql.DataSource;\nimport java.util.Map;\n\n@Configuration\n@EnableTransactionManagement\n@EnableJpaRepositories(\n        entityManagerFactoryRef=\"entityManagerFactorySecondary\",\n        transactionManagerRef=\"transactionManagerSecondary\",\n        basePackages= { \"com.neo.repository.test2\" })\npublic class SecondaryConfig {\n\n    @Autowired\n    @Qualifier(\"secondaryDataSource\")\n    private DataSource secondaryDataSource;\n\n    @Autowired\n    @Qualifier(\"vendorProperties\")\n    private Map<String, Object> vendorProperties;\n\n    @Bean(name = \"entityManagerFactorySecondary\")\n    public LocalContainerEntityManagerFactoryBean entityManagerFactorySecondary (EntityManagerFactoryBuilder builder) {\n        return builder\n                .dataSource(secondaryDataSource)\n                .properties(vendorProperties)\n                .packages(\"com.neo.model\")\n                .persistenceUnit(\"secondaryPersistenceUnit\")\n                .build();\n    }\n\n    @Bean(name = \"entityManagerSecondary\")\n    public EntityManager entityManager(EntityManagerFactoryBuilder builder) {\n        return entityManagerFactorySecondary(builder).getObject().createEntityManager();\n    }\n\n    @Bean(name = \"transactionManagerSecondary\")\n    PlatformTransactionManager transactionManagerSecondary(EntityManagerFactoryBuilder builder) {\n        return new JpaTransactionManager(entityManagerFactorySecondary(builder).getObject());\n    }\n\n}"
  },
  {
    "path": "2.x/spring-boot-jpa/spring-boot-multi-Jpa/src/main/java/com/neo/model/User.java",
    "content": "package com.neo.model;\n\n\n\nimport javax.persistence.*;\n\nimport java.io.Serializable;\n\n@Entity\npublic class User implements Serializable {\n\n    private static final long serialVersionUID = 1L;\n    @Id\n    @GeneratedValue(strategy = GenerationType.IDENTITY)\n    @Column(name = \"id\")\n    private long id;\n    @Column(nullable = false, unique = true)\n    private String userName;\n    @Column(nullable = false)\n    private String passWord;\n    @Column(nullable = false, unique = true)\n    private String email;\n    @Column(nullable = true, unique = true)\n    private String nickName;\n    @Column(nullable = false)\n    private String regTime;\n\n    public User() {\n    }\n\n    public User(String userName, String passWord, String email, String nickName, String regTime) {\n        this.userName = userName;\n        this.passWord = passWord;\n        this.email = email;\n        this.nickName = nickName;\n        this.regTime = regTime;\n    }\n\n    public long getId() {\n        return id;\n    }\n\n    public void setId(long id) {\n        this.id = id;\n    }\n\n    public String getUserName() {\n        return userName;\n    }\n\n    public void setUserName(String userName) {\n        this.userName = userName;\n    }\n\n    public String getPassWord() {\n        return passWord;\n    }\n\n    public void setPassWord(String passWord) {\n        this.passWord = passWord;\n    }\n\n    public String getEmail() {\n        return email;\n    }\n\n    public void setEmail(String email) {\n        this.email = email;\n    }\n\n    public String getNickName() {\n        return nickName;\n    }\n\n    public void setNickName(String nickName) {\n        this.nickName = nickName;\n    }\n\n    public String getRegTime() {\n        return regTime;\n    }\n\n    public void setRegTime(String regTime) {\n        this.regTime = regTime;\n    }\n}\n"
  },
  {
    "path": "2.x/spring-boot-jpa/spring-boot-multi-Jpa/src/main/java/com/neo/repository/test1/UserTest1Repository.java",
    "content": "package com.neo.repository.test1;\n\nimport com.neo.model.User;\nimport org.springframework.data.jpa.repository.JpaRepository;\n\npublic interface UserTest1Repository extends JpaRepository<User, Long> {\n    User findById(long id);\n    User findByUserName(String userName);\n    User findByUserNameOrEmail(String username, String email);\n}"
  },
  {
    "path": "2.x/spring-boot-jpa/spring-boot-multi-Jpa/src/main/java/com/neo/repository/test2/UserTest2Repository.java",
    "content": "package com.neo.repository.test2;\n\nimport com.neo.model.User;\nimport org.springframework.data.jpa.repository.JpaRepository;\n\n\npublic interface UserTest2Repository extends JpaRepository<User, Long> {\n    User findById(long id);\n    User findByUserName(String userName);\n    User findByUserNameOrEmail(String username, String email);\n}"
  },
  {
    "path": "2.x/spring-boot-jpa/spring-boot-multi-Jpa/src/main/resources/application.properties",
    "content": "spring.datasource.primary.jdbc-url=jdbc:mysql://localhost:3306/test1?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true\nspring.datasource.primary.username=root\nspring.datasource.primary.password=root\nspring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver\n\nspring.datasource.secondary.jdbc-url=jdbc:mysql://localhost:3306/test2?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true\nspring.datasource.secondary.username=root\nspring.datasource.secondary.password=root\nspring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver\n\n#sql\\u8F93\\u51FA\nspring.jpa.show-sql=true\nspring.jpa.properties.hibernate.hbm2ddl.auto=create\nspring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect\n#format\\u4E00\\u4E0Bsql\\u8FDB\\u884C\\u8F93\\u51FA\nspring.jpa.properties.hibernate.format_sql=true\n"
  },
  {
    "path": "2.x/spring-boot-jpa/spring-boot-multi-Jpa/src/test/java/com/neo/MultiJpaApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class MultiJpaApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t\tSystem.out.println(\"Hello MultiJpa!\");\n\t}\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-jpa/spring-boot-multi-Jpa/src/test/java/com/neo/repository/UserRepositoryTests.java",
    "content": "package com.neo.repository;\n\nimport com.neo.model.User;\nimport com.neo.repository.test1.UserTest1Repository;\nimport com.neo.repository.test2.UserTest2Repository;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport javax.annotation.Resource;\nimport java.text.DateFormat;\nimport java.util.Date;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class UserRepositoryTests {\n\t@Resource\n\tprivate UserTest1Repository userTest1Repository;\n\t@Resource\n\tprivate UserTest2Repository userTest2Repository;\n\n\t@Test\n\tpublic void testSave() throws Exception {\n\t\tDate date = new Date();\n\t\tDateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);\n\t\tString formattedDate = dateFormat.format(date);\n\n\t\tuserTest1Repository.save(new User(\"aa\", \"aa123456\",\"aa@126.com\", \"aa\",  formattedDate));\n\t\tuserTest1Repository.save(new User(\"bb\", \"bb123456\",\"bb@126.com\", \"bb\",  formattedDate));\n\t\tuserTest2Repository.save(new User(\"cc\", \"cc123456\",\"cc@126.com\", \"cc\",  formattedDate));\n\t}\n\n\n\t@Test\n\tpublic void testDelete() throws Exception {\n\t\tuserTest1Repository.deleteAll();\n\t\tuserTest2Repository.deleteAll();\n\t}\n\n\t@Test\n\tpublic void testBaseQuery() {\n\t\tDate date = new Date();\n\t\tDateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);\n\t\tString formattedDate = dateFormat.format(date);\n\t\tUser user=new User(\"ff\", \"ff123456\",\"ff@126.com\", \"ff\",  formattedDate);\n\t\tuserTest1Repository.findAll();\n\t\tuserTest2Repository.findById(3l);\n\t\tuserTest2Repository.save(user);\n\t\tuser.setId(2l);\n\t\tuserTest1Repository.delete(user);\n\t\tuserTest1Repository.count();\n\t\tuserTest2Repository.findById(3l);\n\t}\n\n\n}"
  },
  {
    "path": "2.x/spring-boot-jpa-thymeleaf-curd/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <artifactId>spring-boot-jpa-thymeleaf-curd</artifactId>\n    <name>spring-boot-jpa-thymeleaf-curd</name>\n    <description>spring-boot-jpa-thymeleaf-curd</description>\n    <parent>\n        <groupId>org.springframework.boot</groupId>\n        <artifactId>spring-boot-starter-parent</artifactId>\n        <version>2.1.0.RELEASE</version>\n    </parent>\n\n    <properties>\n        <java.version>1.8</java.version>\n    </properties>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-web</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-thymeleaf</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-data-jpa</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>mysql</groupId>\n            <artifactId>mysql-connector-java</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-devtools</artifactId>\n            <optional>true</optional>\n        </dependency>\n    </dependencies>\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.springframework.boot</groupId>\n                <artifactId>spring-boot-maven-plugin</artifactId>\n                <configuration>\n                    <fork>true</fork>\n                </configuration>\n            </plugin>\n        </plugins>\n    </build>\n</project>"
  },
  {
    "path": "2.x/spring-boot-jpa-thymeleaf-curd/src/main/java/com/neo/JpaThymeleafApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.boot.builder.SpringApplicationBuilder;\nimport org.springframework.boot.web.servlet.support.SpringBootServletInitializer;\n\n\n@SpringBootApplication\npublic class JpaThymeleafApplication extends SpringBootServletInitializer {\n    @Override\n    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {\n        return application.sources(JpaThymeleafApplication.class);\n    }\n\n    public static void main(String[] args) throws Exception {\n        SpringApplication.run(JpaThymeleafApplication.class, args);\n    }\n}\n\n"
  },
  {
    "path": "2.x/spring-boot-jpa-thymeleaf-curd/src/main/java/com/neo/model/User.java",
    "content": "package com.neo.model;\n\nimport javax.persistence.Column;\nimport javax.persistence.Entity;\nimport javax.persistence.GeneratedValue;\nimport javax.persistence.Id;\n\n@Entity\npublic class User {\n    @Id\n    @GeneratedValue\n    private long id;\n    @Column(nullable = false, unique = true)\n    private String userName;\n    @Column(nullable = false)\n    private String password;\n    @Column(nullable = false)\n    private int age;\n\n    public long getId() {\n        return id;\n    }\n\n    public User setId(long id) {\n        this.id = id;\n        return this;\n    }\n\n    public String getUserName() {\n        return userName;\n    }\n\n    public User setUserName(String userName) {\n        this.userName = userName;\n        return this;\n    }\n\n    public String getPassword() {\n        return password;\n    }\n\n    public User setPassword(String password) {\n        this.password = password;\n        return this;\n    }\n\n    public int getAge() {\n        return age;\n    }\n\n    public User setAge(int age) {\n        this.age = age;\n        return this;\n    }\n}\n"
  },
  {
    "path": "2.x/spring-boot-jpa-thymeleaf-curd/src/main/java/com/neo/repository/UserRepository.java",
    "content": "package com.neo.repository;\n\nimport com.neo.model.User;\nimport org.springframework.data.jpa.repository.JpaRepository;\n\npublic interface UserRepository extends JpaRepository<User, Long> {\n\n    User findById(long id);\n\n    void deleteById(Long id);\n}"
  },
  {
    "path": "2.x/spring-boot-jpa-thymeleaf-curd/src/main/java/com/neo/service/UserService.java",
    "content": "package com.neo.service;\n\nimport com.neo.model.User;\n\nimport java.util.List;\n\npublic interface UserService {\n\n    public List<User> getUserList();\n\n    public User findUserById(long id);\n\n    public void save(User user);\n\n    public void edit(User user);\n\n    public void delete(long id);\n\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-jpa-thymeleaf-curd/src/main/java/com/neo/service/impl/UserServiceImpl.java",
    "content": "package com.neo.service.impl;\n\nimport com.neo.model.User;\nimport com.neo.repository.UserRepository;\nimport com.neo.service.UserService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.util.List;\n\n@Service\npublic class UserServiceImpl implements UserService{\n\n    @Autowired\n    private UserRepository userRepository;\n\n    @Override\n    public List<User> getUserList() {\n        return userRepository.findAll();\n    }\n\n    @Override\n    public User findUserById(long id) {\n        return userRepository.findById(id);\n    }\n\n    @Override\n    public void save(User user) {\n        userRepository.save(user);\n    }\n\n    @Override\n    public void edit(User user) {\n        userRepository.save(user);\n    }\n\n    @Override\n    public void delete(long id) {\n        userRepository.deleteById(id);\n    }\n}\n\n\n"
  },
  {
    "path": "2.x/spring-boot-jpa-thymeleaf-curd/src/main/java/com/neo/web/HelloController.java",
    "content": "package com.neo.web;\n\nimport org.springframework.stereotype.Controller;\nimport org.springframework.ui.Model;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\n\n@Controller\npublic class HelloController {\n\n    @RequestMapping(\"/hello\")\n    public String hello(Model model, @RequestParam(value=\"name\", required=false, defaultValue=\"World\") String name) {\n        model.addAttribute(\"name\", name);\n        return \"hello\";\n    }\n}\n"
  },
  {
    "path": "2.x/spring-boot-jpa-thymeleaf-curd/src/main/java/com/neo/web/UserController.java",
    "content": "package com.neo.web;\n\nimport com.neo.model.User;\nimport com.neo.service.UserService;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.ui.Model;\nimport org.springframework.web.bind.annotation.RequestMapping;\n\nimport javax.annotation.Resource;\nimport java.util.List;\n\n@Controller\npublic class UserController {\n\n    @Resource\n    UserService userService;\n\n\n    @RequestMapping(\"/\")\n    public String index() {\n        return \"redirect:/list\";\n    }\n\n    @RequestMapping(\"/list\")\n    public String list(Model model) {\n        List<User> users=userService.getUserList();\n        model.addAttribute(\"users\", users);\n        return \"user/list\";\n    }\n\n    @RequestMapping(\"/toAdd\")\n    public String toAdd() {\n        return \"user/userAdd\";\n    }\n\n    @RequestMapping(\"/add\")\n    public String add(User user) {\n        userService.save(user);\n        return \"redirect:/list\";\n    }\n\n    @RequestMapping(\"/toEdit\")\n    public String toEdit(Model model,Long id) {\n        User user=userService.findUserById(id);\n        model.addAttribute(\"user\", user);\n        return \"user/userEdit\";\n    }\n\n    @RequestMapping(\"/edit\")\n    public String edit(User user) {\n        userService.edit(user);\n        return \"redirect:/list\";\n    }\n\n\n    @RequestMapping(\"/delete\")\n    public String delete(Long id) {\n        userService.delete(id);\n        return \"redirect:/list\";\n    }\n}\n"
  },
  {
    "path": "2.x/spring-boot-jpa-thymeleaf-curd/src/main/resources/application.properties",
    "content": "spring.datasource.url=jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=true\nspring.datasource.username=root\nspring.datasource.password=root\nspring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver\n\nspring.jpa.properties.hibernate.hbm2ddl.auto=create\nspring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect\nspring.jpa.show-sql= true\n\nspring.thymeleaf.cache=false"
  },
  {
    "path": "2.x/spring-boot-jpa-thymeleaf-curd/src/main/resources/static/css/bootstrap.css",
    "content": "/*!\n * Bootstrap v3.3.6 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n  font-family: sans-serif;\n  -webkit-text-size-adjust: 100%;\n      -ms-text-size-adjust: 100%;\n}\nbody {\n  margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n  display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n  display: inline-block;\n  vertical-align: baseline;\n}\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n[hidden],\ntemplate {\n  display: none;\n}\na {\n  background-color: transparent;\n}\na:active,\na:hover {\n  outline: 0;\n}\nabbr[title] {\n  border-bottom: 1px dotted;\n}\nb,\nstrong {\n  font-weight: bold;\n}\ndfn {\n  font-style: italic;\n}\nh1 {\n  margin: .67em 0;\n  font-size: 2em;\n}\nmark {\n  color: #000;\n  background: #ff0;\n}\nsmall {\n  font-size: 80%;\n}\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\nsup {\n  top: -.5em;\n}\nsub {\n  bottom: -.25em;\n}\nimg {\n  border: 0;\n}\nsvg:not(:root) {\n  overflow: hidden;\n}\nfigure {\n  margin: 1em 40px;\n}\nhr {\n  height: 0;\n  -webkit-box-sizing: content-box;\n     -moz-box-sizing: content-box;\n          box-sizing: content-box;\n}\npre {\n  overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  margin: 0;\n  font: inherit;\n  color: inherit;\n}\nbutton {\n  overflow: visible;\n}\nbutton,\nselect {\n  text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  -webkit-appearance: button;\n  cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  padding: 0;\n  border: 0;\n}\ninput {\n  line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n  padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\ninput[type=\"search\"] {\n  -webkit-box-sizing: content-box;\n     -moz-box-sizing: content-box;\n          box-sizing: content-box;\n  -webkit-appearance: textfield;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\nfieldset {\n  padding: .35em .625em .75em;\n  margin: 0 2px;\n  border: 1px solid #c0c0c0;\n}\nlegend {\n  padding: 0;\n  border: 0;\n}\ntextarea {\n  overflow: auto;\n}\noptgroup {\n  font-weight: bold;\n}\ntable {\n  border-spacing: 0;\n  border-collapse: collapse;\n}\ntd,\nth {\n  padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n  *,\n  *:before,\n  *:after {\n    color: #000 !important;\n    text-shadow: none !important;\n    background: transparent !important;\n    -webkit-box-shadow: none !important;\n            box-shadow: none !important;\n  }\n  a,\n  a:visited {\n    text-decoration: underline;\n  }\n  a[href]:after {\n    content: \" (\" attr(href) \")\";\n  }\n  abbr[title]:after {\n    content: \" (\" attr(title) \")\";\n  }\n  a[href^=\"#\"]:after,\n  a[href^=\"javascript:\"]:after {\n    content: \"\";\n  }\n  pre,\n  blockquote {\n    border: 1px solid #999;\n\n    page-break-inside: avoid;\n  }\n  thead {\n    display: table-header-group;\n  }\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n  img {\n    max-width: 100% !important;\n  }\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n  .navbar {\n    display: none;\n  }\n  .btn > .caret,\n  .dropup > .btn > .caret {\n    border-top-color: #000 !important;\n  }\n  .label {\n    border: 1px solid #000;\n  }\n  .table {\n    border-collapse: collapse !important;\n  }\n  .table td,\n  .table th {\n    background-color: #fff !important;\n  }\n  .table-bordered th,\n  .table-bordered td {\n    border: 1px solid #ddd !important;\n  }\n}\n@font-face {\n  font-family: 'Glyphicons Halflings';\n\n  src: url('../fonts/glyphicons-halflings-regular.eot');\n  src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.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');\n}\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n  content: \"\\002a\";\n}\n.glyphicon-plus:before {\n  content: \"\\002b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n  content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n  content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n  content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n  content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n  content: \"\\270f\";\n}\n.glyphicon-glass:before {\n  content: \"\\e001\";\n}\n.glyphicon-music:before {\n  content: \"\\e002\";\n}\n.glyphicon-search:before {\n  content: \"\\e003\";\n}\n.glyphicon-heart:before {\n  content: \"\\e005\";\n}\n.glyphicon-star:before {\n  content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n  content: \"\\e007\";\n}\n.glyphicon-user:before {\n  content: \"\\e008\";\n}\n.glyphicon-film:before {\n  content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n  content: \"\\e010\";\n}\n.glyphicon-th:before {\n  content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n  content: \"\\e012\";\n}\n.glyphicon-ok:before {\n  content: \"\\e013\";\n}\n.glyphicon-remove:before {\n  content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n  content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n  content: \"\\e016\";\n}\n.glyphicon-off:before {\n  content: \"\\e017\";\n}\n.glyphicon-signal:before {\n  content: \"\\e018\";\n}\n.glyphicon-cog:before {\n  content: \"\\e019\";\n}\n.glyphicon-trash:before {\n  content: \"\\e020\";\n}\n.glyphicon-home:before {\n  content: \"\\e021\";\n}\n.glyphicon-file:before {\n  content: \"\\e022\";\n}\n.glyphicon-time:before {\n  content: \"\\e023\";\n}\n.glyphicon-road:before {\n  content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n  content: \"\\e025\";\n}\n.glyphicon-download:before {\n  content: \"\\e026\";\n}\n.glyphicon-upload:before {\n  content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n  content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n  content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n  content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n  content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n  content: \"\\e032\";\n}\n.glyphicon-lock:before {\n  content: \"\\e033\";\n}\n.glyphicon-flag:before {\n  content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n  content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n  content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n  content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n  content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n  content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n  content: \"\\e040\";\n}\n.glyphicon-tag:before {\n  content: \"\\e041\";\n}\n.glyphicon-tags:before {\n  content: \"\\e042\";\n}\n.glyphicon-book:before {\n  content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n  content: \"\\e044\";\n}\n.glyphicon-print:before {\n  content: \"\\e045\";\n}\n.glyphicon-camera:before {\n  content: \"\\e046\";\n}\n.glyphicon-font:before {\n  content: \"\\e047\";\n}\n.glyphicon-bold:before {\n  content: \"\\e048\";\n}\n.glyphicon-italic:before {\n  content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n  content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n  content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n  content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n  content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n  content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n  content: \"\\e055\";\n}\n.glyphicon-list:before {\n  content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n  content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n  content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n  content: \"\\e059\";\n}\n.glyphicon-picture:before {\n  content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n  content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n  content: \"\\e063\";\n}\n.glyphicon-tint:before {\n  content: \"\\e064\";\n}\n.glyphicon-edit:before {\n  content: \"\\e065\";\n}\n.glyphicon-share:before {\n  content: \"\\e066\";\n}\n.glyphicon-check:before {\n  content: \"\\e067\";\n}\n.glyphicon-move:before {\n  content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n  content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n  content: \"\\e070\";\n}\n.glyphicon-backward:before {\n  content: \"\\e071\";\n}\n.glyphicon-play:before {\n  content: \"\\e072\";\n}\n.glyphicon-pause:before {\n  content: \"\\e073\";\n}\n.glyphicon-stop:before {\n  content: \"\\e074\";\n}\n.glyphicon-forward:before {\n  content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n  content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n  content: \"\\e077\";\n}\n.glyphicon-eject:before {\n  content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n  content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n  content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n  content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n  content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n  content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n  content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n  content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n  content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n  content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n  content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n  content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n  content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n  content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n  content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n  content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n  content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n  content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n  content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n  content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n  content: \"\\e101\";\n}\n.glyphicon-gift:before {\n  content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n  content: \"\\e103\";\n}\n.glyphicon-fire:before {\n  content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n  content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n  content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n  content: \"\\e107\";\n}\n.glyphicon-plane:before {\n  content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n  content: \"\\e109\";\n}\n.glyphicon-random:before {\n  content: \"\\e110\";\n}\n.glyphicon-comment:before {\n  content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n  content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n  content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n  content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n  content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n  content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n  content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n  content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n  content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n  content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n  content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n  content: \"\\e122\";\n}\n.glyphicon-bell:before {\n  content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n  content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n  content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n  content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n  content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n  content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n  content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n  content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n  content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n  content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n  content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n  content: \"\\e134\";\n}\n.glyphicon-globe:before {\n  content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n  content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n  content: \"\\e137\";\n}\n.glyphicon-filter:before {\n  content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n  content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n  content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n  content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n  content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n  content: \"\\e143\";\n}\n.glyphicon-link:before {\n  content: \"\\e144\";\n}\n.glyphicon-phone:before {\n  content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n  content: \"\\e146\";\n}\n.glyphicon-usd:before {\n  content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n  content: \"\\e149\";\n}\n.glyphicon-sort:before {\n  content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n  content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n  content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n  content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n  content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n  content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n  content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n  content: \"\\e157\";\n}\n.glyphicon-expand:before {\n  content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n  content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n  content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n  content: \"\\e161\";\n}\n.glyphicon-flash:before {\n  content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n  content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n  content: \"\\e164\";\n}\n.glyphicon-record:before {\n  content: \"\\e165\";\n}\n.glyphicon-save:before {\n  content: \"\\e166\";\n}\n.glyphicon-open:before {\n  content: \"\\e167\";\n}\n.glyphicon-saved:before {\n  content: \"\\e168\";\n}\n.glyphicon-import:before {\n  content: \"\\e169\";\n}\n.glyphicon-export:before {\n  content: \"\\e170\";\n}\n.glyphicon-send:before {\n  content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n  content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n  content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n  content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n  content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n  content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n  content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n  content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n  content: \"\\e179\";\n}\n.glyphicon-header:before {\n  content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n  content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n  content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n  content: \"\\e183\";\n}\n.glyphicon-tower:before {\n  content: \"\\e184\";\n}\n.glyphicon-stats:before {\n  content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n  content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n  content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n  content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n  content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n  content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n  content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n  content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n  content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n  content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n  content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n  content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n  content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n  content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n  content: \"\\e200\";\n}\n.glyphicon-cd:before {\n  content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n  content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n  content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n  content: \"\\e204\";\n}\n.glyphicon-copy:before {\n  content: \"\\e205\";\n}\n.glyphicon-paste:before {\n  content: \"\\e206\";\n}\n.glyphicon-alert:before {\n  content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n  content: \"\\e210\";\n}\n.glyphicon-king:before {\n  content: \"\\e211\";\n}\n.glyphicon-queen:before {\n  content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n  content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n  content: \"\\e214\";\n}\n.glyphicon-knight:before {\n  content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n  content: \"\\e216\";\n}\n.glyphicon-tent:before {\n  content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n  content: \"\\e218\";\n}\n.glyphicon-bed:before {\n  content: \"\\e219\";\n}\n.glyphicon-apple:before {\n  content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n  content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n  content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n  content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n  content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n  content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n  content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n  content: \"\\e227\";\n}\n.glyphicon-btc:before {\n  content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n  content: \"\\e227\";\n}\n.glyphicon-yen:before {\n  content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n  content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n  content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n  content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n  content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n  content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n  content: \"\\e232\";\n}\n.glyphicon-education:before {\n  content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n  content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n  content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n  content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n  content: \"\\e237\";\n}\n.glyphicon-oil:before {\n  content: \"\\e238\";\n}\n.glyphicon-grain:before {\n  content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n  content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n  content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n  content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n  content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n  content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n  content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n  content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n  content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n  content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n  content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n  content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n  content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n  content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n  content: \"\\e253\";\n}\n.glyphicon-console:before {\n  content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n  content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n  content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n  content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n  content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n  content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n  content: \"\\e260\";\n}\n* {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n*:before,\n*:after {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\nhtml {\n  font-size: 10px;\n\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #333;\n  background-color: #fff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\na {\n  color: #337ab7;\n  text-decoration: none;\n}\na:hover,\na:focus {\n  color: #23527c;\n  text-decoration: underline;\n}\na:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\nfigure {\n  margin: 0;\n}\nimg {\n  vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  display: block;\n  max-width: 100%;\n  height: auto;\n}\n.img-rounded {\n  border-radius: 6px;\n}\n.img-thumbnail {\n  display: inline-block;\n  max-width: 100%;\n  height: auto;\n  padding: 4px;\n  line-height: 1.42857143;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-radius: 4px;\n  -webkit-transition: all .2s ease-in-out;\n       -o-transition: all .2s ease-in-out;\n          transition: all .2s ease-in-out;\n}\n.img-circle {\n  border-radius: 50%;\n}\nhr {\n  margin-top: 20px;\n  margin-bottom: 20px;\n  border: 0;\n  border-top: 1px solid #eee;\n}\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n  position: static;\n  width: auto;\n  height: auto;\n  margin: 0;\n  overflow: visible;\n  clip: auto;\n}\n[role=\"button\"] {\n  cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n  font-family: inherit;\n  font-weight: 500;\n  line-height: 1.1;\n  color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n  font-weight: normal;\n  line-height: 1;\n  color: #777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n  margin-top: 20px;\n  margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n  font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n  font-size: 75%;\n}\nh1,\n.h1 {\n  font-size: 36px;\n}\nh2,\n.h2 {\n  font-size: 30px;\n}\nh3,\n.h3 {\n  font-size: 24px;\n}\nh4,\n.h4 {\n  font-size: 18px;\n}\nh5,\n.h5 {\n  font-size: 14px;\n}\nh6,\n.h6 {\n  font-size: 12px;\n}\np {\n  margin: 0 0 10px;\n}\n.lead {\n  margin-bottom: 20px;\n  font-size: 16px;\n  font-weight: 300;\n  line-height: 1.4;\n}\n@media (min-width: 768px) {\n  .lead {\n    font-size: 21px;\n  }\n}\nsmall,\n.small {\n  font-size: 85%;\n}\nmark,\n.mark {\n  padding: .2em;\n  background-color: #fcf8e3;\n}\n.text-left {\n  text-align: left;\n}\n.text-right {\n  text-align: right;\n}\n.text-center {\n  text-align: center;\n}\n.text-justify {\n  text-align: justify;\n}\n.text-nowrap {\n  white-space: nowrap;\n}\n.text-lowercase {\n  text-transform: lowercase;\n}\n.text-uppercase {\n  text-transform: uppercase;\n}\n.text-capitalize {\n  text-transform: capitalize;\n}\n.text-muted {\n  color: #777;\n}\n.text-primary {\n  color: #337ab7;\n}\na.text-primary:hover,\na.text-primary:focus {\n  color: #286090;\n}\n.text-success {\n  color: #3c763d;\n}\na.text-success:hover,\na.text-success:focus {\n  color: #2b542c;\n}\n.text-info {\n  color: #31708f;\n}\na.text-info:hover,\na.text-info:focus {\n  color: #245269;\n}\n.text-warning {\n  color: #8a6d3b;\n}\na.text-warning:hover,\na.text-warning:focus {\n  color: #66512c;\n}\n.text-danger {\n  color: #a94442;\n}\na.text-danger:hover,\na.text-danger:focus {\n  color: #843534;\n}\n.bg-primary {\n  color: #fff;\n  background-color: #337ab7;\n}\na.bg-primary:hover,\na.bg-primary:focus {\n  background-color: #286090;\n}\n.bg-success {\n  background-color: #dff0d8;\n}\na.bg-success:hover,\na.bg-success:focus {\n  background-color: #c1e2b3;\n}\n.bg-info {\n  background-color: #d9edf7;\n}\na.bg-info:hover,\na.bg-info:focus {\n  background-color: #afd9ee;\n}\n.bg-warning {\n  background-color: #fcf8e3;\n}\na.bg-warning:hover,\na.bg-warning:focus {\n  background-color: #f7ecb5;\n}\n.bg-danger {\n  background-color: #f2dede;\n}\na.bg-danger:hover,\na.bg-danger:focus {\n  background-color: #e4b9b9;\n}\n.page-header {\n  padding-bottom: 9px;\n  margin: 40px 0 20px;\n  border-bottom: 1px solid #eee;\n}\nul,\nol {\n  margin-top: 0;\n  margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n  margin-bottom: 0;\n}\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n.list-inline {\n  padding-left: 0;\n  margin-left: -5px;\n  list-style: none;\n}\n.list-inline > li {\n  display: inline-block;\n  padding-right: 5px;\n  padding-left: 5px;\n}\ndl {\n  margin-top: 0;\n  margin-bottom: 20px;\n}\ndt,\ndd {\n  line-height: 1.42857143;\n}\ndt {\n  font-weight: bold;\n}\ndd {\n  margin-left: 0;\n}\n@media (min-width: 768px) {\n  .dl-horizontal dt {\n    float: left;\n    width: 160px;\n    overflow: hidden;\n    clear: left;\n    text-align: right;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n  .dl-horizontal dd {\n    margin-left: 180px;\n  }\n}\nabbr[title],\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted #777;\n}\n.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\nblockquote {\n  padding: 10px 20px;\n  margin: 0 0 20px;\n  font-size: 17.5px;\n  border-left: 5px solid #eee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n  margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n  display: block;\n  font-size: 80%;\n  line-height: 1.42857143;\n  color: #777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n  content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  text-align: right;\n  border-right: 5px solid #eee;\n  border-left: 0;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n  content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n  content: '\\00A0 \\2014';\n}\naddress {\n  margin-bottom: 20px;\n  font-style: normal;\n  line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n  font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #c7254e;\n  background-color: #f9f2f4;\n  border-radius: 4px;\n}\nkbd {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #fff;\n  background-color: #333;\n  border-radius: 3px;\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);\n          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);\n}\nkbd kbd {\n  padding: 0;\n  font-size: 100%;\n  font-weight: bold;\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\npre {\n  display: block;\n  padding: 9.5px;\n  margin: 0 0 10px;\n  font-size: 13px;\n  line-height: 1.42857143;\n  color: #333;\n  word-break: break-all;\n  word-wrap: break-word;\n  background-color: #f5f5f5;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n}\npre code {\n  padding: 0;\n  font-size: inherit;\n  color: inherit;\n  white-space: pre-wrap;\n  background-color: transparent;\n  border-radius: 0;\n}\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\n.container {\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n@media (min-width: 768px) {\n  .container {\n    width: 750px;\n  }\n}\n@media (min-width: 992px) {\n  .container {\n    width: 970px;\n  }\n}\n@media (min-width: 1200px) {\n  .container {\n    width: 1170px;\n  }\n}\n.container-fluid {\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n.row {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n  position: relative;\n  min-height: 1px;\n  padding-right: 15px;\n  padding-left: 15px;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n  float: left;\n}\n.col-xs-12 {\n  width: 100%;\n}\n.col-xs-11 {\n  width: 91.66666667%;\n}\n.col-xs-10 {\n  width: 83.33333333%;\n}\n.col-xs-9 {\n  width: 75%;\n}\n.col-xs-8 {\n  width: 66.66666667%;\n}\n.col-xs-7 {\n  width: 58.33333333%;\n}\n.col-xs-6 {\n  width: 50%;\n}\n.col-xs-5 {\n  width: 41.66666667%;\n}\n.col-xs-4 {\n  width: 33.33333333%;\n}\n.col-xs-3 {\n  width: 25%;\n}\n.col-xs-2 {\n  width: 16.66666667%;\n}\n.col-xs-1 {\n  width: 8.33333333%;\n}\n.col-xs-pull-12 {\n  right: 100%;\n}\n.col-xs-pull-11 {\n  right: 91.66666667%;\n}\n.col-xs-pull-10 {\n  right: 83.33333333%;\n}\n.col-xs-pull-9 {\n  right: 75%;\n}\n.col-xs-pull-8 {\n  right: 66.66666667%;\n}\n.col-xs-pull-7 {\n  right: 58.33333333%;\n}\n.col-xs-pull-6 {\n  right: 50%;\n}\n.col-xs-pull-5 {\n  right: 41.66666667%;\n}\n.col-xs-pull-4 {\n  right: 33.33333333%;\n}\n.col-xs-pull-3 {\n  right: 25%;\n}\n.col-xs-pull-2 {\n  right: 16.66666667%;\n}\n.col-xs-pull-1 {\n  right: 8.33333333%;\n}\n.col-xs-pull-0 {\n  right: auto;\n}\n.col-xs-push-12 {\n  left: 100%;\n}\n.col-xs-push-11 {\n  left: 91.66666667%;\n}\n.col-xs-push-10 {\n  left: 83.33333333%;\n}\n.col-xs-push-9 {\n  left: 75%;\n}\n.col-xs-push-8 {\n  left: 66.66666667%;\n}\n.col-xs-push-7 {\n  left: 58.33333333%;\n}\n.col-xs-push-6 {\n  left: 50%;\n}\n.col-xs-push-5 {\n  left: 41.66666667%;\n}\n.col-xs-push-4 {\n  left: 33.33333333%;\n}\n.col-xs-push-3 {\n  left: 25%;\n}\n.col-xs-push-2 {\n  left: 16.66666667%;\n}\n.col-xs-push-1 {\n  left: 8.33333333%;\n}\n.col-xs-push-0 {\n  left: auto;\n}\n.col-xs-offset-12 {\n  margin-left: 100%;\n}\n.col-xs-offset-11 {\n  margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n  margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n  margin-left: 75%;\n}\n.col-xs-offset-8 {\n  margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n  margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n  margin-left: 50%;\n}\n.col-xs-offset-5 {\n  margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n  margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n  margin-left: 25%;\n}\n.col-xs-offset-2 {\n  margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n  margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n  margin-left: 0;\n}\n@media (min-width: 768px) {\n  .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n    float: left;\n  }\n  .col-sm-12 {\n    width: 100%;\n  }\n  .col-sm-11 {\n    width: 91.66666667%;\n  }\n  .col-sm-10 {\n    width: 83.33333333%;\n  }\n  .col-sm-9 {\n    width: 75%;\n  }\n  .col-sm-8 {\n    width: 66.66666667%;\n  }\n  .col-sm-7 {\n    width: 58.33333333%;\n  }\n  .col-sm-6 {\n    width: 50%;\n  }\n  .col-sm-5 {\n    width: 41.66666667%;\n  }\n  .col-sm-4 {\n    width: 33.33333333%;\n  }\n  .col-sm-3 {\n    width: 25%;\n  }\n  .col-sm-2 {\n    width: 16.66666667%;\n  }\n  .col-sm-1 {\n    width: 8.33333333%;\n  }\n  .col-sm-pull-12 {\n    right: 100%;\n  }\n  .col-sm-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-sm-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-sm-pull-9 {\n    right: 75%;\n  }\n  .col-sm-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-sm-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-sm-pull-6 {\n    right: 50%;\n  }\n  .col-sm-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-sm-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-sm-pull-3 {\n    right: 25%;\n  }\n  .col-sm-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-sm-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-sm-pull-0 {\n    right: auto;\n  }\n  .col-sm-push-12 {\n    left: 100%;\n  }\n  .col-sm-push-11 {\n    left: 91.66666667%;\n  }\n  .col-sm-push-10 {\n    left: 83.33333333%;\n  }\n  .col-sm-push-9 {\n    left: 75%;\n  }\n  .col-sm-push-8 {\n    left: 66.66666667%;\n  }\n  .col-sm-push-7 {\n    left: 58.33333333%;\n  }\n  .col-sm-push-6 {\n    left: 50%;\n  }\n  .col-sm-push-5 {\n    left: 41.66666667%;\n  }\n  .col-sm-push-4 {\n    left: 33.33333333%;\n  }\n  .col-sm-push-3 {\n    left: 25%;\n  }\n  .col-sm-push-2 {\n    left: 16.66666667%;\n  }\n  .col-sm-push-1 {\n    left: 8.33333333%;\n  }\n  .col-sm-push-0 {\n    left: auto;\n  }\n  .col-sm-offset-12 {\n    margin-left: 100%;\n  }\n  .col-sm-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-sm-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-sm-offset-9 {\n    margin-left: 75%;\n  }\n  .col-sm-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-sm-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-sm-offset-6 {\n    margin-left: 50%;\n  }\n  .col-sm-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-sm-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-sm-offset-3 {\n    margin-left: 25%;\n  }\n  .col-sm-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-sm-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-sm-offset-0 {\n    margin-left: 0;\n  }\n}\n@media (min-width: 992px) {\n  .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n    float: left;\n  }\n  .col-md-12 {\n    width: 100%;\n  }\n  .col-md-11 {\n    width: 91.66666667%;\n  }\n  .col-md-10 {\n    width: 83.33333333%;\n  }\n  .col-md-9 {\n    width: 75%;\n  }\n  .col-md-8 {\n    width: 66.66666667%;\n  }\n  .col-md-7 {\n    width: 58.33333333%;\n  }\n  .col-md-6 {\n    width: 50%;\n  }\n  .col-md-5 {\n    width: 41.66666667%;\n  }\n  .col-md-4 {\n    width: 33.33333333%;\n  }\n  .col-md-3 {\n    width: 25%;\n  }\n  .col-md-2 {\n    width: 16.66666667%;\n  }\n  .col-md-1 {\n    width: 8.33333333%;\n  }\n  .col-md-pull-12 {\n    right: 100%;\n  }\n  .col-md-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-md-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-md-pull-9 {\n    right: 75%;\n  }\n  .col-md-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-md-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-md-pull-6 {\n    right: 50%;\n  }\n  .col-md-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-md-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-md-pull-3 {\n    right: 25%;\n  }\n  .col-md-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-md-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-md-pull-0 {\n    right: auto;\n  }\n  .col-md-push-12 {\n    left: 100%;\n  }\n  .col-md-push-11 {\n    left: 91.66666667%;\n  }\n  .col-md-push-10 {\n    left: 83.33333333%;\n  }\n  .col-md-push-9 {\n    left: 75%;\n  }\n  .col-md-push-8 {\n    left: 66.66666667%;\n  }\n  .col-md-push-7 {\n    left: 58.33333333%;\n  }\n  .col-md-push-6 {\n    left: 50%;\n  }\n  .col-md-push-5 {\n    left: 41.66666667%;\n  }\n  .col-md-push-4 {\n    left: 33.33333333%;\n  }\n  .col-md-push-3 {\n    left: 25%;\n  }\n  .col-md-push-2 {\n    left: 16.66666667%;\n  }\n  .col-md-push-1 {\n    left: 8.33333333%;\n  }\n  .col-md-push-0 {\n    left: auto;\n  }\n  .col-md-offset-12 {\n    margin-left: 100%;\n  }\n  .col-md-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-md-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-md-offset-9 {\n    margin-left: 75%;\n  }\n  .col-md-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-md-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-md-offset-6 {\n    margin-left: 50%;\n  }\n  .col-md-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-md-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-md-offset-3 {\n    margin-left: 25%;\n  }\n  .col-md-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-md-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-md-offset-0 {\n    margin-left: 0;\n  }\n}\n@media (min-width: 1200px) {\n  .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n    float: left;\n  }\n  .col-lg-12 {\n    width: 100%;\n  }\n  .col-lg-11 {\n    width: 91.66666667%;\n  }\n  .col-lg-10 {\n    width: 83.33333333%;\n  }\n  .col-lg-9 {\n    width: 75%;\n  }\n  .col-lg-8 {\n    width: 66.66666667%;\n  }\n  .col-lg-7 {\n    width: 58.33333333%;\n  }\n  .col-lg-6 {\n    width: 50%;\n  }\n  .col-lg-5 {\n    width: 41.66666667%;\n  }\n  .col-lg-4 {\n    width: 33.33333333%;\n  }\n  .col-lg-3 {\n    width: 25%;\n  }\n  .col-lg-2 {\n    width: 16.66666667%;\n  }\n  .col-lg-1 {\n    width: 8.33333333%;\n  }\n  .col-lg-pull-12 {\n    right: 100%;\n  }\n  .col-lg-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-lg-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-lg-pull-9 {\n    right: 75%;\n  }\n  .col-lg-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-lg-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-lg-pull-6 {\n    right: 50%;\n  }\n  .col-lg-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-lg-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-lg-pull-3 {\n    right: 25%;\n  }\n  .col-lg-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-lg-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-lg-pull-0 {\n    right: auto;\n  }\n  .col-lg-push-12 {\n    left: 100%;\n  }\n  .col-lg-push-11 {\n    left: 91.66666667%;\n  }\n  .col-lg-push-10 {\n    left: 83.33333333%;\n  }\n  .col-lg-push-9 {\n    left: 75%;\n  }\n  .col-lg-push-8 {\n    left: 66.66666667%;\n  }\n  .col-lg-push-7 {\n    left: 58.33333333%;\n  }\n  .col-lg-push-6 {\n    left: 50%;\n  }\n  .col-lg-push-5 {\n    left: 41.66666667%;\n  }\n  .col-lg-push-4 {\n    left: 33.33333333%;\n  }\n  .col-lg-push-3 {\n    left: 25%;\n  }\n  .col-lg-push-2 {\n    left: 16.66666667%;\n  }\n  .col-lg-push-1 {\n    left: 8.33333333%;\n  }\n  .col-lg-push-0 {\n    left: auto;\n  }\n  .col-lg-offset-12 {\n    margin-left: 100%;\n  }\n  .col-lg-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-lg-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-lg-offset-9 {\n    margin-left: 75%;\n  }\n  .col-lg-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-lg-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-lg-offset-6 {\n    margin-left: 50%;\n  }\n  .col-lg-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-lg-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-lg-offset-3 {\n    margin-left: 25%;\n  }\n  .col-lg-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-lg-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-lg-offset-0 {\n    margin-left: 0;\n  }\n}\ntable {\n  background-color: transparent;\n}\ncaption {\n  padding-top: 8px;\n  padding-bottom: 8px;\n  color: #777;\n  text-align: left;\n}\nth {\n  text-align: left;\n}\n.table {\n  width: 100%;\n  max-width: 100%;\n  margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n  padding: 8px;\n  line-height: 1.42857143;\n  vertical-align: top;\n  border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n  vertical-align: bottom;\n  border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n  border-top: 0;\n}\n.table > tbody + tbody {\n  border-top: 2px solid #ddd;\n}\n.table .table {\n  background-color: #fff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n  padding: 5px;\n}\n.table-bordered {\n  border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n  border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n  border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n  background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n  background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n  position: static;\n  display: table-column;\n  float: none;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n  position: static;\n  display: table-cell;\n  float: none;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n  background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n  background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n  background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n  background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n  background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n  background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n  background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n  background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n  background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n  background-color: #ebcccc;\n}\n.table-responsive {\n  min-height: .01%;\n  overflow-x: auto;\n}\n@media screen and (max-width: 767px) {\n  .table-responsive {\n    width: 100%;\n    margin-bottom: 15px;\n    overflow-y: hidden;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    border: 1px solid #ddd;\n  }\n  .table-responsive > .table {\n    margin-bottom: 0;\n  }\n  .table-responsive > .table > thead > tr > th,\n  .table-responsive > .table > tbody > tr > th,\n  .table-responsive > .table > tfoot > tr > th,\n  .table-responsive > .table > thead > tr > td,\n  .table-responsive > .table > tbody > tr > td,\n  .table-responsive > .table > tfoot > tr > td {\n    white-space: nowrap;\n  }\n  .table-responsive > .table-bordered {\n    border: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:first-child,\n  .table-responsive > .table-bordered > tbody > tr > th:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n  .table-responsive > .table-bordered > thead > tr > td:first-child,\n  .table-responsive > .table-bordered > tbody > tr > td:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n    border-left: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:last-child,\n  .table-responsive > .table-bordered > tbody > tr > th:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n  .table-responsive > .table-bordered > thead > tr > td:last-child,\n  .table-responsive > .table-bordered > tbody > tr > td:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n    border-right: 0;\n  }\n  .table-responsive > .table-bordered > tbody > tr:last-child > th,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n  .table-responsive > .table-bordered > tbody > tr:last-child > td,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n    border-bottom: 0;\n  }\n}\nfieldset {\n  min-width: 0;\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 20px;\n  font-size: 21px;\n  line-height: inherit;\n  color: #333;\n  border: 0;\n  border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n  display: inline-block;\n  max-width: 100%;\n  margin-bottom: 5px;\n  font-weight: bold;\n}\ninput[type=\"search\"] {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9;\n  line-height: normal;\n}\ninput[type=\"file\"] {\n  display: block;\n}\ninput[type=\"range\"] {\n  display: block;\n  width: 100%;\n}\nselect[multiple],\nselect[size] {\n  height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\noutput {\n  display: block;\n  padding-top: 7px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #555;\n}\n.form-control {\n  display: block;\n  width: 100%;\n  height: 34px;\n  padding: 6px 12px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #555;\n  background-color: #fff;\n  background-image: none;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n  -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;\n       -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n          transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n  border-color: #66afe9;\n  outline: 0;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);\n          box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);\n}\n.form-control::-moz-placeholder {\n  color: #999;\n  opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n  color: #999;\n}\n.form-control::-webkit-input-placeholder {\n  color: #999;\n}\n.form-control::-ms-expand {\n  background-color: transparent;\n  border: 0;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n  background-color: #eee;\n  opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n  cursor: not-allowed;\n}\ntextarea.form-control {\n  height: auto;\n}\ninput[type=\"search\"] {\n  -webkit-appearance: none;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n  input[type=\"date\"].form-control,\n  input[type=\"time\"].form-control,\n  input[type=\"datetime-local\"].form-control,\n  input[type=\"month\"].form-control {\n    line-height: 34px;\n  }\n  input[type=\"date\"].input-sm,\n  input[type=\"time\"].input-sm,\n  input[type=\"datetime-local\"].input-sm,\n  input[type=\"month\"].input-sm,\n  .input-group-sm input[type=\"date\"],\n  .input-group-sm input[type=\"time\"],\n  .input-group-sm input[type=\"datetime-local\"],\n  .input-group-sm input[type=\"month\"] {\n    line-height: 30px;\n  }\n  input[type=\"date\"].input-lg,\n  input[type=\"time\"].input-lg,\n  input[type=\"datetime-local\"].input-lg,\n  input[type=\"month\"].input-lg,\n  .input-group-lg input[type=\"date\"],\n  .input-group-lg input[type=\"time\"],\n  .input-group-lg input[type=\"datetime-local\"],\n  .input-group-lg input[type=\"month\"] {\n    line-height: 46px;\n  }\n}\n.form-group {\n  margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n  position: relative;\n  display: block;\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n  min-height: 20px;\n  padding-left: 20px;\n  margin-bottom: 0;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  position: absolute;\n  margin-top: 4px \\9;\n  margin-left: -20px;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n  position: relative;\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  font-weight: normal;\n  vertical-align: middle;\n  cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n  cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n  cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n  cursor: not-allowed;\n}\n.form-control-static {\n  min-height: 34px;\n  padding-top: 7px;\n  padding-bottom: 7px;\n  margin-bottom: 0;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n  padding-right: 0;\n  padding-left: 0;\n}\n.input-sm {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\nselect.input-sm {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n  height: auto;\n}\n.form-group-sm .form-control {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.form-group-sm select.form-control {\n  height: 30px;\n  line-height: 30px;\n}\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n  height: auto;\n}\n.form-group-sm .form-control-static {\n  height: 30px;\n  min-height: 32px;\n  padding: 6px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n}\n.input-lg {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n  border-radius: 6px;\n}\nselect.input-lg {\n  height: 46px;\n  line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n  height: auto;\n}\n.form-group-lg .form-control {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n  border-radius: 6px;\n}\n.form-group-lg select.form-control {\n  height: 46px;\n  line-height: 46px;\n}\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n  height: auto;\n}\n.form-group-lg .form-control-static {\n  height: 46px;\n  min-height: 38px;\n  padding: 11px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n}\n.has-feedback {\n  position: relative;\n}\n.has-feedback .form-control {\n  padding-right: 42.5px;\n}\n.form-control-feedback {\n  position: absolute;\n  top: 0;\n  right: 0;\n  z-index: 2;\n  display: block;\n  width: 34px;\n  height: 34px;\n  line-height: 34px;\n  text-align: center;\n  pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n  width: 46px;\n  height: 46px;\n  line-height: 46px;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n  width: 30px;\n  height: 30px;\n  line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n  color: #3c763d;\n}\n.has-success .form-control {\n  border-color: #3c763d;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-success .form-control:focus {\n  border-color: #2b542c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #3c763d;\n}\n.has-success .form-control-feedback {\n  color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n  color: #8a6d3b;\n}\n.has-warning .form-control {\n  border-color: #8a6d3b;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-warning .form-control:focus {\n  border-color: #66512c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #8a6d3b;\n}\n.has-warning .form-control-feedback {\n  color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n  color: #a94442;\n}\n.has-error .form-control {\n  border-color: #a94442;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-error .form-control:focus {\n  border-color: #843534;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #a94442;\n}\n.has-error .form-control-feedback {\n  color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n  top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n  top: 0;\n}\n.help-block {\n  display: block;\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: #737373;\n}\n@media (min-width: 768px) {\n  .form-inline .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .form-inline .form-control-static {\n    display: inline-block;\n  }\n  .form-inline .input-group {\n    display: inline-table;\n    vertical-align: middle;\n  }\n  .form-inline .input-group .input-group-addon,\n  .form-inline .input-group .input-group-btn,\n  .form-inline .input-group .form-control {\n    width: auto;\n  }\n  .form-inline .input-group > .form-control {\n    width: 100%;\n  }\n  .form-inline .control-label {\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .radio,\n  .form-inline .checkbox {\n    display: inline-block;\n    margin-top: 0;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .radio label,\n  .form-inline .checkbox label {\n    padding-left: 0;\n  }\n  .form-inline .radio input[type=\"radio\"],\n  .form-inline .checkbox input[type=\"checkbox\"] {\n    position: relative;\n    margin-left: 0;\n  }\n  .form-inline .has-feedback .form-control-feedback {\n    top: 0;\n  }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n  padding-top: 7px;\n  margin-top: 0;\n  margin-bottom: 0;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n  min-height: 27px;\n}\n.form-horizontal .form-group {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n@media (min-width: 768px) {\n  .form-horizontal .control-label {\n    padding-top: 7px;\n    margin-bottom: 0;\n    text-align: right;\n  }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n  right: 15px;\n}\n@media (min-width: 768px) {\n  .form-horizontal .form-group-lg .control-label {\n    padding-top: 11px;\n    font-size: 18px;\n  }\n}\n@media (min-width: 768px) {\n  .form-horizontal .form-group-sm .control-label {\n    padding-top: 6px;\n    font-size: 12px;\n  }\n}\n.btn {\n  display: inline-block;\n  padding: 6px 12px;\n  margin-bottom: 0;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1.42857143;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: middle;\n  -ms-touch-action: manipulation;\n      touch-action: manipulation;\n  cursor: pointer;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n  color: #333;\n  text-decoration: none;\n}\n.btn:active,\n.btn.active {\n  background-image: none;\n  outline: 0;\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n  cursor: not-allowed;\n  filter: alpha(opacity=65);\n  -webkit-box-shadow: none;\n          box-shadow: none;\n  opacity: .65;\n}\na.btn.disabled,\nfieldset[disabled] a.btn {\n  pointer-events: none;\n}\n.btn-default {\n  color: #333;\n  background-color: #fff;\n  border-color: #ccc;\n}\n.btn-default:focus,\n.btn-default.focus {\n  color: #333;\n  background-color: #e6e6e6;\n  border-color: #8c8c8c;\n}\n.btn-default:hover {\n  color: #333;\n  background-color: #e6e6e6;\n  border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n  color: #333;\n  background-color: #e6e6e6;\n  border-color: #adadad;\n}\n.btn-default:active:hover,\n.btn-default.active:hover,\n.open > .dropdown-toggle.btn-default:hover,\n.btn-default:active:focus,\n.btn-default.active:focus,\n.open > .dropdown-toggle.btn-default:focus,\n.btn-default:active.focus,\n.btn-default.active.focus,\n.open > .dropdown-toggle.btn-default.focus {\n  color: #333;\n  background-color: #d4d4d4;\n  border-color: #8c8c8c;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n  background-image: none;\n}\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus {\n  background-color: #fff;\n  border-color: #ccc;\n}\n.btn-default .badge {\n  color: #fff;\n  background-color: #333;\n}\n.btn-primary {\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #2e6da4;\n}\n.btn-primary:focus,\n.btn-primary.focus {\n  color: #fff;\n  background-color: #286090;\n  border-color: #122b40;\n}\n.btn-primary:hover {\n  color: #fff;\n  background-color: #286090;\n  border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n  color: #fff;\n  background-color: #286090;\n  border-color: #204d74;\n}\n.btn-primary:active:hover,\n.btn-primary.active:hover,\n.open > .dropdown-toggle.btn-primary:hover,\n.btn-primary:active:focus,\n.btn-primary.active:focus,\n.open > .dropdown-toggle.btn-primary:focus,\n.btn-primary:active.focus,\n.btn-primary.active.focus,\n.open > .dropdown-toggle.btn-primary.focus {\n  color: #fff;\n  background-color: #204d74;\n  border-color: #122b40;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n  background-image: none;\n}\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus {\n  background-color: #337ab7;\n  border-color: #2e6da4;\n}\n.btn-primary .badge {\n  color: #337ab7;\n  background-color: #fff;\n}\n.btn-success {\n  color: #fff;\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n.btn-success:focus,\n.btn-success.focus {\n  color: #fff;\n  background-color: #449d44;\n  border-color: #255625;\n}\n.btn-success:hover {\n  color: #fff;\n  background-color: #449d44;\n  border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n  color: #fff;\n  background-color: #449d44;\n  border-color: #398439;\n}\n.btn-success:active:hover,\n.btn-success.active:hover,\n.open > .dropdown-toggle.btn-success:hover,\n.btn-success:active:focus,\n.btn-success.active:focus,\n.open > .dropdown-toggle.btn-success:focus,\n.btn-success:active.focus,\n.btn-success.active.focus,\n.open > .dropdown-toggle.btn-success.focus {\n  color: #fff;\n  background-color: #398439;\n  border-color: #255625;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n  background-image: none;\n}\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus {\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n.btn-success .badge {\n  color: #5cb85c;\n  background-color: #fff;\n}\n.btn-info {\n  color: #fff;\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n.btn-info:focus,\n.btn-info.focus {\n  color: #fff;\n  background-color: #31b0d5;\n  border-color: #1b6d85;\n}\n.btn-info:hover {\n  color: #fff;\n  background-color: #31b0d5;\n  border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n  color: #fff;\n  background-color: #31b0d5;\n  border-color: #269abc;\n}\n.btn-info:active:hover,\n.btn-info.active:hover,\n.open > .dropdown-toggle.btn-info:hover,\n.btn-info:active:focus,\n.btn-info.active:focus,\n.open > .dropdown-toggle.btn-info:focus,\n.btn-info:active.focus,\n.btn-info.active.focus,\n.open > .dropdown-toggle.btn-info.focus {\n  color: #fff;\n  background-color: #269abc;\n  border-color: #1b6d85;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n  background-image: none;\n}\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus {\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n.btn-info .badge {\n  color: #5bc0de;\n  background-color: #fff;\n}\n.btn-warning {\n  color: #fff;\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n.btn-warning:focus,\n.btn-warning.focus {\n  color: #fff;\n  background-color: #ec971f;\n  border-color: #985f0d;\n}\n.btn-warning:hover {\n  color: #fff;\n  background-color: #ec971f;\n  border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n  color: #fff;\n  background-color: #ec971f;\n  border-color: #d58512;\n}\n.btn-warning:active:hover,\n.btn-warning.active:hover,\n.open > .dropdown-toggle.btn-warning:hover,\n.btn-warning:active:focus,\n.btn-warning.active:focus,\n.open > .dropdown-toggle.btn-warning:focus,\n.btn-warning:active.focus,\n.btn-warning.active.focus,\n.open > .dropdown-toggle.btn-warning.focus {\n  color: #fff;\n  background-color: #d58512;\n  border-color: #985f0d;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n  background-image: none;\n}\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus {\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n.btn-warning .badge {\n  color: #f0ad4e;\n  background-color: #fff;\n}\n.btn-danger {\n  color: #fff;\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n.btn-danger:focus,\n.btn-danger.focus {\n  color: #fff;\n  background-color: #c9302c;\n  border-color: #761c19;\n}\n.btn-danger:hover {\n  color: #fff;\n  background-color: #c9302c;\n  border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n  color: #fff;\n  background-color: #c9302c;\n  border-color: #ac2925;\n}\n.btn-danger:active:hover,\n.btn-danger.active:hover,\n.open > .dropdown-toggle.btn-danger:hover,\n.btn-danger:active:focus,\n.btn-danger.active:focus,\n.open > .dropdown-toggle.btn-danger:focus,\n.btn-danger:active.focus,\n.btn-danger.active.focus,\n.open > .dropdown-toggle.btn-danger.focus {\n  color: #fff;\n  background-color: #ac2925;\n  border-color: #761c19;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n  background-image: none;\n}\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus {\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n.btn-danger .badge {\n  color: #d9534f;\n  background-color: #fff;\n}\n.btn-link {\n  font-weight: normal;\n  color: #337ab7;\n  border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n  background-color: transparent;\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n  border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n  color: #23527c;\n  text-decoration: underline;\n  background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n  color: #777;\n  text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n  border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n  padding: 1px 5px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.btn-block {\n  display: block;\n  width: 100%;\n}\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n.fade {\n  opacity: 0;\n  -webkit-transition: opacity .15s linear;\n       -o-transition: opacity .15s linear;\n          transition: opacity .15s linear;\n}\n.fade.in {\n  opacity: 1;\n}\n.collapse {\n  display: none;\n}\n.collapse.in {\n  display: block;\n}\ntr.collapse.in {\n  display: table-row;\n}\ntbody.collapse.in {\n  display: table-row-group;\n}\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  -webkit-transition-timing-function: ease;\n       -o-transition-timing-function: ease;\n          transition-timing-function: ease;\n  -webkit-transition-duration: .35s;\n       -o-transition-duration: .35s;\n          transition-duration: .35s;\n  -webkit-transition-property: height, visibility;\n       -o-transition-property: height, visibility;\n          transition-property: height, visibility;\n}\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top: 4px dashed;\n  border-top: 4px solid \\9;\n  border-right: 4px solid transparent;\n  border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n  position: relative;\n}\n.dropdown-toggle:focus {\n  outline: 0;\n}\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0;\n  font-size: 14px;\n  text-align: left;\n  list-style: none;\n  background-color: #fff;\n  -webkit-background-clip: padding-box;\n          background-clip: padding-box;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, .15);\n  border-radius: 4px;\n  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);\n          box-shadow: 0 6px 12px rgba(0, 0, 0, .175);\n}\n.dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n.dropdown-menu .divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n  display: block;\n  padding: 3px 20px;\n  clear: both;\n  font-weight: normal;\n  line-height: 1.42857143;\n  color: #333;\n  white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  color: #262626;\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  color: #fff;\n  text-decoration: none;\n  background-color: #337ab7;\n  outline: 0;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  color: #777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n  background-image: none;\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.open > .dropdown-menu {\n  display: block;\n}\n.open > a {\n  outline: 0;\n}\n.dropdown-menu-right {\n  right: 0;\n  left: auto;\n}\n.dropdown-menu-left {\n  right: auto;\n  left: 0;\n}\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: 12px;\n  line-height: 1.42857143;\n  color: #777;\n  white-space: nowrap;\n}\n.dropdown-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 990;\n}\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n  content: \"\";\n  border-top: 0;\n  border-bottom: 4px dashed;\n  border-bottom: 4px solid \\9;\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-bottom: 2px;\n}\n@media (min-width: 768px) {\n  .navbar-right .dropdown-menu {\n    right: 0;\n    left: auto;\n  }\n  .navbar-right .dropdown-menu-left {\n    right: auto;\n    left: 0;\n  }\n}\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n  position: relative;\n  float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n  z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n  margin-left: -1px;\n}\n.btn-toolbar {\n  margin-left: -5px;\n}\n.btn-toolbar .btn,\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n  float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n  margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n.btn-group > .btn:first-child {\n  margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group > .btn-group {\n  float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n  padding-right: 8px;\n  padding-left: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-right: 12px;\n  padding-left: 12px;\n}\n.btn-group.open .dropdown-toggle {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n.btn .caret {\n  margin-left: 0;\n}\n.btn-lg .caret {\n  border-width: 5px 5px 0;\n  border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n  border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n  display: block;\n  float: none;\n  width: 100%;\n  max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n  float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n  margin-top: -1px;\n  margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n  border-top-left-radius: 4px;\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  table-layout: fixed;\n  border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n  display: table-cell;\n  float: none;\n  width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n  width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n  left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n  position: absolute;\n  clip: rect(0, 0, 0, 0);\n  pointer-events: none;\n}\n.input-group {\n  position: relative;\n  display: table;\n  border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n  float: none;\n  padding-right: 0;\n  padding-left: 0;\n}\n.input-group .form-control {\n  position: relative;\n  z-index: 2;\n  float: left;\n  width: 100%;\n  margin-bottom: 0;\n}\n.input-group .form-control:focus {\n  z-index: 3;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n  border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n  height: 46px;\n  line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n  height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n  height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle;\n}\n.input-group-addon {\n  padding: 6px 12px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1;\n  color: #555;\n  text-align: center;\n  background-color: #eee;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n}\n.input-group-addon.input-sm {\n  padding: 5px 10px;\n  font-size: 12px;\n  border-radius: 3px;\n}\n.input-group-addon.input-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n  margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.input-group-addon:first-child {\n  border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.input-group-addon:last-child {\n  border-left: 0;\n}\n.input-group-btn {\n  position: relative;\n  font-size: 0;\n  white-space: nowrap;\n}\n.input-group-btn > .btn {\n  position: relative;\n}\n.input-group-btn > .btn + .btn {\n  margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n  z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n  margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n  z-index: 2;\n  margin-left: -1px;\n}\n.nav {\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n.nav > li {\n  position: relative;\n  display: block;\n}\n.nav > li > a {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n  text-decoration: none;\n  background-color: #eee;\n}\n.nav > li.disabled > a {\n  color: #777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n  color: #777;\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n  background-color: #eee;\n  border-color: #337ab7;\n}\n.nav .nav-divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n.nav > li > a > img {\n  max-width: none;\n}\n.nav-tabs {\n  border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n  float: left;\n  margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n  margin-right: 2px;\n  line-height: 1.42857143;\n  border: 1px solid transparent;\n  border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n  border-color: #eee #eee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n  color: #555;\n  cursor: default;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-bottom-color: transparent;\n}\n.nav-tabs.nav-justified {\n  width: 100%;\n  border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n  float: none;\n}\n.nav-tabs.nav-justified > li > a {\n  margin-bottom: 5px;\n  text-align: center;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n  .nav-tabs.nav-justified > li > a {\n    margin-bottom: 0;\n  }\n}\n.nav-tabs.nav-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n  border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li > a {\n    border-bottom: 1px solid #ddd;\n    border-radius: 4px 4px 0 0;\n  }\n  .nav-tabs.nav-justified > .active > a,\n  .nav-tabs.nav-justified > .active > a:hover,\n  .nav-tabs.nav-justified > .active > a:focus {\n    border-bottom-color: #fff;\n  }\n}\n.nav-pills > li {\n  float: left;\n}\n.nav-pills > li > a {\n  border-radius: 4px;\n}\n.nav-pills > li + li {\n  margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n  color: #fff;\n  background-color: #337ab7;\n}\n.nav-stacked > li {\n  float: none;\n}\n.nav-stacked > li + li {\n  margin-top: 2px;\n  margin-left: 0;\n}\n.nav-justified {\n  width: 100%;\n}\n.nav-justified > li {\n  float: none;\n}\n.nav-justified > li > a {\n  margin-bottom: 5px;\n  text-align: center;\n}\n.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\n@media (min-width: 768px) {\n  .nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n  .nav-justified > li > a {\n    margin-bottom: 0;\n  }\n}\n.nav-tabs-justified {\n  border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n  border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n  .nav-tabs-justified > li > a {\n    border-bottom: 1px solid #ddd;\n    border-radius: 4px 4px 0 0;\n  }\n  .nav-tabs-justified > .active > a,\n  .nav-tabs-justified > .active > a:hover,\n  .nav-tabs-justified > .active > a:focus {\n    border-bottom-color: #fff;\n  }\n}\n.tab-content > .tab-pane {\n  display: none;\n}\n.tab-content > .active {\n  display: block;\n}\n.nav-tabs .dropdown-menu {\n  margin-top: -1px;\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.navbar {\n  position: relative;\n  min-height: 50px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n  .navbar {\n    border-radius: 4px;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-header {\n    float: left;\n  }\n}\n.navbar-collapse {\n  padding-right: 15px;\n  padding-left: 15px;\n  overflow-x: visible;\n  -webkit-overflow-scrolling: touch;\n  border-top: 1px solid transparent;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);\n}\n.navbar-collapse.in {\n  overflow-y: auto;\n}\n@media (min-width: 768px) {\n  .navbar-collapse {\n    width: auto;\n    border-top: 0;\n    -webkit-box-shadow: none;\n            box-shadow: none;\n  }\n  .navbar-collapse.collapse {\n    display: block !important;\n    height: auto !important;\n    padding-bottom: 0;\n    overflow: visible !important;\n  }\n  .navbar-collapse.in {\n    overflow-y: visible;\n  }\n  .navbar-fixed-top .navbar-collapse,\n  .navbar-static-top .navbar-collapse,\n  .navbar-fixed-bottom .navbar-collapse {\n    padding-right: 0;\n    padding-left: 0;\n  }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n  max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n  .navbar-fixed-top .navbar-collapse,\n  .navbar-fixed-bottom .navbar-collapse {\n    max-height: 200px;\n  }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n@media (min-width: 768px) {\n  .container > .navbar-header,\n  .container-fluid > .navbar-header,\n  .container > .navbar-collapse,\n  .container-fluid > .navbar-collapse {\n    margin-right: 0;\n    margin-left: 0;\n  }\n}\n.navbar-static-top {\n  z-index: 1000;\n  border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n  .navbar-static-top {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: 1030;\n}\n@media (min-width: 768px) {\n  .navbar-fixed-top,\n  .navbar-fixed-bottom {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top {\n  top: 0;\n  border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0;\n  border-width: 1px 0 0;\n}\n.navbar-brand {\n  float: left;\n  height: 50px;\n  padding: 15px 15px;\n  font-size: 18px;\n  line-height: 20px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n  text-decoration: none;\n}\n.navbar-brand > img {\n  display: block;\n}\n@media (min-width: 768px) {\n  .navbar > .container .navbar-brand,\n  .navbar > .container-fluid .navbar-brand {\n    margin-left: -15px;\n  }\n}\n.navbar-toggle {\n  position: relative;\n  float: right;\n  padding: 9px 10px;\n  margin-top: 8px;\n  margin-right: 15px;\n  margin-bottom: 8px;\n  background-color: transparent;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.navbar-toggle:focus {\n  outline: 0;\n}\n.navbar-toggle .icon-bar {\n  display: block;\n  width: 22px;\n  height: 2px;\n  border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n  margin-top: 4px;\n}\n@media (min-width: 768px) {\n  .navbar-toggle {\n    display: none;\n  }\n}\n.navbar-nav {\n  margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n  padding-top: 10px;\n  padding-bottom: 10px;\n  line-height: 20px;\n}\n@media (max-width: 767px) {\n  .navbar-nav .open .dropdown-menu {\n    position: static;\n    float: none;\n    width: auto;\n    margin-top: 0;\n    background-color: transparent;\n    border: 0;\n    -webkit-box-shadow: none;\n            box-shadow: none;\n  }\n  .navbar-nav .open .dropdown-menu > li > a,\n  .navbar-nav .open .dropdown-menu .dropdown-header {\n    padding: 5px 15px 5px 25px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a {\n    line-height: 20px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-nav .open .dropdown-menu > li > a:focus {\n    background-image: none;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-nav {\n    float: left;\n    margin: 0;\n  }\n  .navbar-nav > li {\n    float: left;\n  }\n  .navbar-nav > li > a {\n    padding-top: 15px;\n    padding-bottom: 15px;\n  }\n}\n.navbar-form {\n  padding: 10px 15px;\n  margin-top: 8px;\n  margin-right: -15px;\n  margin-bottom: 8px;\n  margin-left: -15px;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);\n}\n@media (min-width: 768px) {\n  .navbar-form .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .navbar-form .form-control-static {\n    display: inline-block;\n  }\n  .navbar-form .input-group {\n    display: inline-table;\n    vertical-align: middle;\n  }\n  .navbar-form .input-group .input-group-addon,\n  .navbar-form .input-group .input-group-btn,\n  .navbar-form .input-group .form-control {\n    width: auto;\n  }\n  .navbar-form .input-group > .form-control {\n    width: 100%;\n  }\n  .navbar-form .control-label {\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .radio,\n  .navbar-form .checkbox {\n    display: inline-block;\n    margin-top: 0;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .radio label,\n  .navbar-form .checkbox label {\n    padding-left: 0;\n  }\n  .navbar-form .radio input[type=\"radio\"],\n  .navbar-form .checkbox input[type=\"checkbox\"] {\n    position: relative;\n    margin-left: 0;\n  }\n  .navbar-form .has-feedback .form-control-feedback {\n    top: 0;\n  }\n}\n@media (max-width: 767px) {\n  .navbar-form .form-group {\n    margin-bottom: 5px;\n  }\n  .navbar-form .form-group:last-child {\n    margin-bottom: 0;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-form {\n    width: auto;\n    padding-top: 0;\n    padding-bottom: 0;\n    margin-right: 0;\n    margin-left: 0;\n    border: 0;\n    -webkit-box-shadow: none;\n            box-shadow: none;\n  }\n}\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  margin-bottom: 0;\n  border-top-left-radius: 4px;\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.navbar-btn {\n  margin-top: 8px;\n  margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n  margin-top: 14px;\n  margin-bottom: 14px;\n}\n.navbar-text {\n  margin-top: 15px;\n  margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n  .navbar-text {\n    float: left;\n    margin-right: 15px;\n    margin-left: 15px;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-left {\n    float: left !important;\n  }\n  .navbar-right {\n    float: right !important;\n    margin-right: -15px;\n  }\n  .navbar-right ~ .navbar-right {\n    margin-right: 0;\n  }\n}\n.navbar-default {\n  background-color: #f8f8f8;\n  border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n  color: #777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n  color: #5e5e5e;\n  background-color: transparent;\n}\n.navbar-default .navbar-text {\n  color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n  color: #777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n  color: #333;\n  background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n  color: #555;\n  background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n  color: #ccc;\n  background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n  border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n  background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n  background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n  border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n  color: #555;\n  background-color: #e7e7e7;\n}\n@media (max-width: 767px) {\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n    color: #777;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #333;\n    background-color: transparent;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #555;\n    background-color: #e7e7e7;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #ccc;\n    background-color: transparent;\n  }\n}\n.navbar-default .navbar-link {\n  color: #777;\n}\n.navbar-default .navbar-link:hover {\n  color: #333;\n}\n.navbar-default .btn-link {\n  color: #777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n  color: #333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n  color: #ccc;\n}\n.navbar-inverse {\n  background-color: #222;\n  border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n  color: #fff;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n  color: #fff;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n  color: #fff;\n  background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n  color: #444;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n  border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n  background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n  background-color: #fff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n  border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n  color: #fff;\n  background-color: #080808;\n}\n@media (max-width: 767px) {\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n    border-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n    background-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n    color: #9d9d9d;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #fff;\n    background-color: transparent;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #fff;\n    background-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #444;\n    background-color: transparent;\n  }\n}\n.navbar-inverse .navbar-link {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n  color: #fff;\n}\n.navbar-inverse .btn-link {\n  color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n  color: #fff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n  color: #444;\n}\n.breadcrumb {\n  padding: 8px 15px;\n  margin-bottom: 20px;\n  list-style: none;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n}\n.breadcrumb > li {\n  display: inline-block;\n}\n.breadcrumb > li + li:before {\n  padding: 0 5px;\n  color: #ccc;\n  content: \"/\\00a0\";\n}\n.breadcrumb > .active {\n  color: #777;\n}\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: 20px 0;\n  border-radius: 4px;\n}\n.pagination > li {\n  display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n  position: relative;\n  float: left;\n  padding: 6px 12px;\n  margin-left: -1px;\n  line-height: 1.42857143;\n  color: #337ab7;\n  text-decoration: none;\n  background-color: #fff;\n  border: 1px solid #ddd;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n  margin-left: 0;\n  border-top-left-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n  z-index: 2;\n  color: #23527c;\n  background-color: #eee;\n  border-color: #ddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n  z-index: 3;\n  color: #fff;\n  cursor: default;\n  background-color: #337ab7;\n  border-color: #337ab7;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n  color: #777;\n  cursor: not-allowed;\n  background-color: #fff;\n  border-color: #ddd;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n  border-top-left-radius: 6px;\n  border-bottom-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n  border-top-right-radius: 6px;\n  border-bottom-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n  border-top-left-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n  border-top-right-radius: 3px;\n  border-bottom-right-radius: 3px;\n}\n.pager {\n  padding-left: 0;\n  margin: 20px 0;\n  text-align: center;\n  list-style: none;\n}\n.pager li {\n  display: inline;\n}\n.pager li > a,\n.pager li > span {\n  display: inline-block;\n  padding: 5px 14px;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n  text-decoration: none;\n  background-color: #eee;\n}\n.pager .next > a,\n.pager .next > span {\n  float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n  float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n  color: #777;\n  cursor: not-allowed;\n  background-color: #fff;\n}\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: #fff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n  color: #fff;\n  text-decoration: none;\n  cursor: pointer;\n}\n.label:empty {\n  display: none;\n}\n.btn .label {\n  position: relative;\n  top: -1px;\n}\n.label-default {\n  background-color: #777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n  background-color: #5e5e5e;\n}\n.label-primary {\n  background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n  background-color: #286090;\n}\n.label-success {\n  background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n  background-color: #449d44;\n}\n.label-info {\n  background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n  background-color: #31b0d5;\n}\n.label-warning {\n  background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n  background-color: #ec971f;\n}\n.label-danger {\n  background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n  background-color: #c9302c;\n}\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: 12px;\n  font-weight: bold;\n  line-height: 1;\n  color: #fff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: middle;\n  background-color: #777;\n  border-radius: 10px;\n}\n.badge:empty {\n  display: none;\n}\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n  top: 0;\n  padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n  color: #fff;\n  text-decoration: none;\n  cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n  color: #337ab7;\n  background-color: #fff;\n}\n.list-group-item > .badge {\n  float: right;\n}\n.list-group-item > .badge + .badge {\n  margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n  margin-left: 3px;\n}\n.jumbotron {\n  padding-top: 30px;\n  padding-bottom: 30px;\n  margin-bottom: 30px;\n  color: inherit;\n  background-color: #eee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n  color: inherit;\n}\n.jumbotron p {\n  margin-bottom: 15px;\n  font-size: 21px;\n  font-weight: 200;\n}\n.jumbotron > hr {\n  border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n  padding-right: 15px;\n  padding-left: 15px;\n  border-radius: 6px;\n}\n.jumbotron .container {\n  max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n  .jumbotron {\n    padding-top: 48px;\n    padding-bottom: 48px;\n  }\n  .container .jumbotron,\n  .container-fluid .jumbotron {\n    padding-right: 60px;\n    padding-left: 60px;\n  }\n  .jumbotron h1,\n  .jumbotron .h1 {\n    font-size: 63px;\n  }\n}\n.thumbnail {\n  display: block;\n  padding: 4px;\n  margin-bottom: 20px;\n  line-height: 1.42857143;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-radius: 4px;\n  -webkit-transition: border .2s ease-in-out;\n       -o-transition: border .2s ease-in-out;\n          transition: border .2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n  margin-right: auto;\n  margin-left: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n  border-color: #337ab7;\n}\n.thumbnail .caption {\n  padding: 9px;\n  color: #333;\n}\n.alert {\n  padding: 15px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.alert h4 {\n  margin-top: 0;\n  color: inherit;\n}\n.alert .alert-link {\n  font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n  margin-bottom: 0;\n}\n.alert > p + p {\n  margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n  padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n  position: relative;\n  top: -2px;\n  right: -21px;\n  color: inherit;\n}\n.alert-success {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n.alert-success hr {\n  border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n  color: #2b542c;\n}\n.alert-info {\n  color: #31708f;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n.alert-info hr {\n  border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n  color: #245269;\n}\n.alert-warning {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n}\n.alert-warning hr {\n  border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n  color: #66512c;\n}\n.alert-danger {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #ebccd1;\n}\n.alert-danger hr {\n  border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n  color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n@-o-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n.progress {\n  height: 20px;\n  margin-bottom: 20px;\n  overflow: hidden;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);\n          box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);\n}\n.progress-bar {\n  float: left;\n  width: 0;\n  height: 100%;\n  font-size: 12px;\n  line-height: 20px;\n  color: #fff;\n  text-align: center;\n  background-color: #337ab7;\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);\n          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);\n  -webkit-transition: width .6s ease;\n       -o-transition: width .6s ease;\n          transition: width .6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  -webkit-background-size: 40px 40px;\n          background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n  -webkit-animation: progress-bar-stripes 2s linear infinite;\n       -o-animation: progress-bar-stripes 2s linear infinite;\n          animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n  background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n  background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n  background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n  background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n}\n.media {\n  margin-top: 15px;\n}\n.media:first-child {\n  margin-top: 0;\n}\n.media,\n.media-body {\n  overflow: hidden;\n  zoom: 1;\n}\n.media-body {\n  width: 10000px;\n}\n.media-object {\n  display: block;\n}\n.media-object.img-thumbnail {\n  max-width: none;\n}\n.media-right,\n.media > .pull-right {\n  padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n  padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n  display: table-cell;\n  vertical-align: top;\n}\n.media-middle {\n  vertical-align: middle;\n}\n.media-bottom {\n  vertical-align: bottom;\n}\n.media-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n.list-group {\n  padding-left: 0;\n  margin-bottom: 20px;\n}\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n  margin-bottom: -1px;\n  background-color: #fff;\n  border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n  border-top-left-radius: 4px;\n  border-top-right-radius: 4px;\n}\n.list-group-item:last-child {\n  margin-bottom: 0;\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\na.list-group-item,\nbutton.list-group-item {\n  color: #555;\n}\na.list-group-item .list-group-item-heading,\nbutton.list-group-item .list-group-item-heading {\n  color: #333;\n}\na.list-group-item:hover,\nbutton.list-group-item:hover,\na.list-group-item:focus,\nbutton.list-group-item:focus {\n  color: #555;\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\nbutton.list-group-item {\n  width: 100%;\n  text-align: left;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n  color: #777;\n  cursor: not-allowed;\n  background-color: #eee;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n  color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n  color: #777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  z-index: 2;\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n  color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n  color: #c7ddef;\n}\n.list-group-item-success {\n  color: #3c763d;\n  background-color: #dff0d8;\n}\na.list-group-item-success,\nbutton.list-group-item-success {\n  color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading,\nbutton.list-group-item-success .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-success:hover,\nbutton.list-group-item-success:hover,\na.list-group-item-success:focus,\nbutton.list-group-item-success:focus {\n  color: #3c763d;\n  background-color: #d0e9c6;\n}\na.list-group-item-success.active,\nbutton.list-group-item-success.active,\na.list-group-item-success.active:hover,\nbutton.list-group-item-success.active:hover,\na.list-group-item-success.active:focus,\nbutton.list-group-item-success.active:focus {\n  color: #fff;\n  background-color: #3c763d;\n  border-color: #3c763d;\n}\n.list-group-item-info {\n  color: #31708f;\n  background-color: #d9edf7;\n}\na.list-group-item-info,\nbutton.list-group-item-info {\n  color: #31708f;\n}\na.list-group-item-info .list-group-item-heading,\nbutton.list-group-item-info .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-info:hover,\nbutton.list-group-item-info:hover,\na.list-group-item-info:focus,\nbutton.list-group-item-info:focus {\n  color: #31708f;\n  background-color: #c4e3f3;\n}\na.list-group-item-info.active,\nbutton.list-group-item-info.active,\na.list-group-item-info.active:hover,\nbutton.list-group-item-info.active:hover,\na.list-group-item-info.active:focus,\nbutton.list-group-item-info.active:focus {\n  color: #fff;\n  background-color: #31708f;\n  border-color: #31708f;\n}\n.list-group-item-warning {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n}\na.list-group-item-warning,\nbutton.list-group-item-warning {\n  color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading,\nbutton.list-group-item-warning .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-warning:hover,\nbutton.list-group-item-warning:hover,\na.list-group-item-warning:focus,\nbutton.list-group-item-warning:focus {\n  color: #8a6d3b;\n  background-color: #faf2cc;\n}\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\nbutton.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus,\nbutton.list-group-item-warning.active:focus {\n  color: #fff;\n  background-color: #8a6d3b;\n  border-color: #8a6d3b;\n}\n.list-group-item-danger {\n  color: #a94442;\n  background-color: #f2dede;\n}\na.list-group-item-danger,\nbutton.list-group-item-danger {\n  color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading,\nbutton.list-group-item-danger .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-danger:hover,\nbutton.list-group-item-danger:hover,\na.list-group-item-danger:focus,\nbutton.list-group-item-danger:focus {\n  color: #a94442;\n  background-color: #ebcccc;\n}\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\nbutton.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus,\nbutton.list-group-item-danger.active:focus {\n  color: #fff;\n  background-color: #a94442;\n  border-color: #a94442;\n}\n.list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3;\n}\n.panel {\n  margin-bottom: 20px;\n  background-color: #fff;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05);\n          box-shadow: 0 1px 1px rgba(0, 0, 0, .05);\n}\n.panel-body {\n  padding: 15px;\n}\n.panel-heading {\n  padding: 10px 15px;\n  border-bottom: 1px solid transparent;\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n  color: inherit;\n}\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: 16px;\n  color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n  color: inherit;\n}\n.panel-footer {\n  padding: 10px 15px;\n  background-color: #f5f5f5;\n  border-top: 1px solid #ddd;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n  margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n  border-width: 1px 0;\n  border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n  border-top: 0;\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n  border-bottom: 0;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n  border-top-width: 0;\n}\n.list-group + .panel-footer {\n  border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n  margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n  padding-right: 15px;\n  padding-left: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n  border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n  border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n  border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n  border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n  border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n  border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n  border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n  border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n  border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n  border-bottom: 0;\n}\n.panel > .table-responsive {\n  margin-bottom: 0;\n  border: 0;\n}\n.panel-group {\n  margin-bottom: 20px;\n}\n.panel-group .panel {\n  margin-bottom: 0;\n  border-radius: 4px;\n}\n.panel-group .panel + .panel {\n  margin-top: 5px;\n}\n.panel-group .panel-heading {\n  border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n  border-top: 1px solid #ddd;\n}\n.panel-group .panel-footer {\n  border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n  border-bottom: 1px solid #ddd;\n}\n.panel-default {\n  border-color: #ddd;\n}\n.panel-default > .panel-heading {\n  color: #333;\n  background-color: #f5f5f5;\n  border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n  color: #f5f5f5;\n  background-color: #333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #ddd;\n}\n.panel-primary {\n  border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n  color: #337ab7;\n  background-color: #fff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #337ab7;\n}\n.panel-success {\n  border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n  color: #dff0d8;\n  background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #d6e9c6;\n}\n.panel-info {\n  border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n  color: #31708f;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n  color: #d9edf7;\n  background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #bce8f1;\n}\n.panel-warning {\n  border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n  color: #fcf8e3;\n  background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #faebcc;\n}\n.panel-danger {\n  border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n  color: #f2dede;\n  background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n  position: relative;\n  display: block;\n  height: 0;\n  padding: 0;\n  overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  border: 0;\n}\n.embed-responsive-16by9 {\n  padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n  padding-bottom: 75%;\n}\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border: 1px solid #e3e3e3;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);\n}\n.well blockquote {\n  border-color: #ddd;\n  border-color: rgba(0, 0, 0, .15);\n}\n.well-lg {\n  padding: 24px;\n  border-radius: 6px;\n}\n.well-sm {\n  padding: 9px;\n  border-radius: 3px;\n}\n.close {\n  float: right;\n  font-size: 21px;\n  font-weight: bold;\n  line-height: 1;\n  color: #000;\n  text-shadow: 0 1px 0 #fff;\n  filter: alpha(opacity=20);\n  opacity: .2;\n}\n.close:hover,\n.close:focus {\n  color: #000;\n  text-decoration: none;\n  cursor: pointer;\n  filter: alpha(opacity=50);\n  opacity: .5;\n}\nbutton.close {\n  -webkit-appearance: none;\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n}\n.modal-open {\n  overflow: hidden;\n}\n.modal {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1050;\n  display: none;\n  overflow: hidden;\n  -webkit-overflow-scrolling: touch;\n  outline: 0;\n}\n.modal.fade .modal-dialog {\n  -webkit-transition: -webkit-transform .3s ease-out;\n       -o-transition:      -o-transform .3s ease-out;\n          transition:         transform .3s ease-out;\n  -webkit-transform: translate(0, -25%);\n      -ms-transform: translate(0, -25%);\n       -o-transform: translate(0, -25%);\n          transform: translate(0, -25%);\n}\n.modal.in .modal-dialog {\n  -webkit-transform: translate(0, 0);\n      -ms-transform: translate(0, 0);\n       -o-transform: translate(0, 0);\n          transform: translate(0, 0);\n}\n.modal-open .modal {\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: 10px;\n}\n.modal-content {\n  position: relative;\n  background-color: #fff;\n  -webkit-background-clip: padding-box;\n          background-clip: padding-box;\n  border: 1px solid #999;\n  border: 1px solid rgba(0, 0, 0, .2);\n  border-radius: 6px;\n  outline: 0;\n  -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5);\n          box-shadow: 0 3px 9px rgba(0, 0, 0, .5);\n}\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  background-color: #000;\n}\n.modal-backdrop.fade {\n  filter: alpha(opacity=0);\n  opacity: 0;\n}\n.modal-backdrop.in {\n  filter: alpha(opacity=50);\n  opacity: .5;\n}\n.modal-header {\n  padding: 15px;\n  border-bottom: 1px solid #e5e5e5;\n}\n.modal-header .close {\n  margin-top: -2px;\n}\n.modal-title {\n  margin: 0;\n  line-height: 1.42857143;\n}\n.modal-body {\n  position: relative;\n  padding: 15px;\n}\n.modal-footer {\n  padding: 15px;\n  text-align: right;\n  border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n  margin-bottom: 0;\n  margin-left: 5px;\n}\n.modal-footer .btn-group .btn + .btn {\n  margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n  margin-left: 0;\n}\n.modal-scrollbar-measure {\n  position: absolute;\n  top: -9999px;\n  width: 50px;\n  height: 50px;\n  overflow: scroll;\n}\n@media (min-width: 768px) {\n  .modal-dialog {\n    width: 600px;\n    margin: 30px auto;\n  }\n  .modal-content {\n    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5);\n            box-shadow: 0 5px 15px rgba(0, 0, 0, .5);\n  }\n  .modal-sm {\n    width: 300px;\n  }\n}\n@media (min-width: 992px) {\n  .modal-lg {\n    width: 900px;\n  }\n}\n.tooltip {\n  position: absolute;\n  z-index: 1070;\n  display: block;\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 12px;\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1.42857143;\n  text-align: left;\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  letter-spacing: normal;\n  word-break: normal;\n  word-spacing: normal;\n  word-wrap: normal;\n  white-space: normal;\n  filter: alpha(opacity=0);\n  opacity: 0;\n\n  line-break: auto;\n}\n.tooltip.in {\n  filter: alpha(opacity=90);\n  opacity: .9;\n}\n.tooltip.top {\n  padding: 5px 0;\n  margin-top: -3px;\n}\n.tooltip.right {\n  padding: 0 5px;\n  margin-left: 3px;\n}\n.tooltip.bottom {\n  padding: 5px 0;\n  margin-top: 3px;\n}\n.tooltip.left {\n  padding: 0 5px;\n  margin-left: -3px;\n}\n.tooltip-inner {\n  max-width: 200px;\n  padding: 3px 8px;\n  color: #fff;\n  text-align: center;\n  background-color: #000;\n  border-radius: 4px;\n}\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n  bottom: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n  right: 5px;\n  bottom: 0;\n  margin-bottom: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n  bottom: 0;\n  left: 5px;\n  margin-bottom: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.right .tooltip-arrow {\n  top: 50%;\n  left: 0;\n  margin-top: -5px;\n  border-width: 5px 5px 5px 0;\n  border-right-color: #000;\n}\n.tooltip.left .tooltip-arrow {\n  top: 50%;\n  right: 0;\n  margin-top: -5px;\n  border-width: 5px 0 5px 5px;\n  border-left-color: #000;\n}\n.tooltip.bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n  top: 0;\n  right: 5px;\n  margin-top: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n  top: 0;\n  left: 5px;\n  margin-top: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1060;\n  display: none;\n  max-width: 276px;\n  padding: 1px;\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1.42857143;\n  text-align: left;\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  letter-spacing: normal;\n  word-break: normal;\n  word-spacing: normal;\n  word-wrap: normal;\n  white-space: normal;\n  background-color: #fff;\n  -webkit-background-clip: padding-box;\n          background-clip: padding-box;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, .2);\n  border-radius: 6px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2);\n          box-shadow: 0 5px 10px rgba(0, 0, 0, .2);\n\n  line-break: auto;\n}\n.popover.top {\n  margin-top: -10px;\n}\n.popover.right {\n  margin-left: 10px;\n}\n.popover.bottom {\n  margin-top: 10px;\n}\n.popover.left {\n  margin-left: -10px;\n}\n.popover-title {\n  padding: 8px 14px;\n  margin: 0;\n  font-size: 14px;\n  background-color: #f7f7f7;\n  border-bottom: 1px solid #ebebeb;\n  border-radius: 5px 5px 0 0;\n}\n.popover-content {\n  padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n  position: absolute;\n  display: block;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.popover > .arrow {\n  border-width: 11px;\n}\n.popover > .arrow:after {\n  content: \"\";\n  border-width: 10px;\n}\n.popover.top > .arrow {\n  bottom: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-top-color: #999;\n  border-top-color: rgba(0, 0, 0, .25);\n  border-bottom-width: 0;\n}\n.popover.top > .arrow:after {\n  bottom: 1px;\n  margin-left: -10px;\n  content: \" \";\n  border-top-color: #fff;\n  border-bottom-width: 0;\n}\n.popover.right > .arrow {\n  top: 50%;\n  left: -11px;\n  margin-top: -11px;\n  border-right-color: #999;\n  border-right-color: rgba(0, 0, 0, .25);\n  border-left-width: 0;\n}\n.popover.right > .arrow:after {\n  bottom: -10px;\n  left: 1px;\n  content: \" \";\n  border-right-color: #fff;\n  border-left-width: 0;\n}\n.popover.bottom > .arrow {\n  top: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-top-width: 0;\n  border-bottom-color: #999;\n  border-bottom-color: rgba(0, 0, 0, .25);\n}\n.popover.bottom > .arrow:after {\n  top: 1px;\n  margin-left: -10px;\n  content: \" \";\n  border-top-width: 0;\n  border-bottom-color: #fff;\n}\n.popover.left > .arrow {\n  top: 50%;\n  right: -11px;\n  margin-top: -11px;\n  border-right-width: 0;\n  border-left-color: #999;\n  border-left-color: rgba(0, 0, 0, .25);\n}\n.popover.left > .arrow:after {\n  right: 1px;\n  bottom: -10px;\n  content: \" \";\n  border-right-width: 0;\n  border-left-color: #fff;\n}\n.carousel {\n  position: relative;\n}\n.carousel-inner {\n  position: relative;\n  width: 100%;\n  overflow: hidden;\n}\n.carousel-inner > .item {\n  position: relative;\n  display: none;\n  -webkit-transition: .6s ease-in-out left;\n       -o-transition: .6s ease-in-out left;\n          transition: .6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n  .carousel-inner > .item {\n    -webkit-transition: -webkit-transform .6s ease-in-out;\n         -o-transition:      -o-transform .6s ease-in-out;\n            transition:         transform .6s ease-in-out;\n\n    -webkit-backface-visibility: hidden;\n            backface-visibility: hidden;\n    -webkit-perspective: 1000px;\n            perspective: 1000px;\n  }\n  .carousel-inner > .item.next,\n  .carousel-inner > .item.active.right {\n    left: 0;\n    -webkit-transform: translate3d(100%, 0, 0);\n            transform: translate3d(100%, 0, 0);\n  }\n  .carousel-inner > .item.prev,\n  .carousel-inner > .item.active.left {\n    left: 0;\n    -webkit-transform: translate3d(-100%, 0, 0);\n            transform: translate3d(-100%, 0, 0);\n  }\n  .carousel-inner > .item.next.left,\n  .carousel-inner > .item.prev.right,\n  .carousel-inner > .item.active {\n    left: 0;\n    -webkit-transform: translate3d(0, 0, 0);\n            transform: translate3d(0, 0, 0);\n  }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  display: block;\n}\n.carousel-inner > .active {\n  left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n.carousel-inner > .next {\n  left: 100%;\n}\n.carousel-inner > .prev {\n  left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n  left: 0;\n}\n.carousel-inner > .active.left {\n  left: -100%;\n}\n.carousel-inner > .active.right {\n  left: 100%;\n}\n.carousel-control {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  width: 15%;\n  font-size: 20px;\n  color: #fff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, .6);\n  background-color: rgba(0, 0, 0, 0);\n  filter: alpha(opacity=50);\n  opacity: .5;\n}\n.carousel-control.left {\n  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);\n  background-image:      -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);\n  background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001)));\n  background-image:         linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n  background-repeat: repeat-x;\n}\n.carousel-control.right {\n  right: 0;\n  left: auto;\n  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);\n  background-image:      -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);\n  background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5)));\n  background-image:         linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n  background-repeat: repeat-x;\n}\n.carousel-control:hover,\n.carousel-control:focus {\n  color: #fff;\n  text-decoration: none;\n  filter: alpha(opacity=90);\n  outline: 0;\n  opacity: .9;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n  position: absolute;\n  top: 50%;\n  z-index: 5;\n  display: inline-block;\n  margin-top: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n  left: 50%;\n  margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n  right: 50%;\n  margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n  width: 20px;\n  height: 20px;\n  font-family: serif;\n  line-height: 1;\n}\n.carousel-control .icon-prev:before {\n  content: '\\2039';\n}\n.carousel-control .icon-next:before {\n  content: '\\203a';\n}\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  padding-left: 0;\n  margin-left: -30%;\n  text-align: center;\n  list-style: none;\n}\n.carousel-indicators li {\n  display: inline-block;\n  width: 10px;\n  height: 10px;\n  margin: 1px;\n  text-indent: -999px;\n  cursor: pointer;\n  background-color: #000 \\9;\n  background-color: rgba(0, 0, 0, 0);\n  border: 1px solid #fff;\n  border-radius: 10px;\n}\n.carousel-indicators .active {\n  width: 12px;\n  height: 12px;\n  margin: 0;\n  background-color: #fff;\n}\n.carousel-caption {\n  position: absolute;\n  right: 15%;\n  bottom: 20px;\n  left: 15%;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: #fff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, .6);\n}\n.carousel-caption .btn {\n  text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-prev,\n  .carousel-control .icon-next {\n    width: 30px;\n    height: 30px;\n    margin-top: -10px;\n    font-size: 30px;\n  }\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .icon-prev {\n    margin-left: -10px;\n  }\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-next {\n    margin-right: -10px;\n  }\n  .carousel-caption {\n    right: 20%;\n    left: 20%;\n    padding-bottom: 30px;\n  }\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-header:before,\n.modal-header:after,\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \" \";\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-header:after,\n.modal-footer:after {\n  clear: both;\n}\n.center-block {\n  display: block;\n  margin-right: auto;\n  margin-left: auto;\n}\n.pull-right {\n  float: right !important;\n}\n.pull-left {\n  float: left !important;\n}\n.hide {\n  display: none !important;\n}\n.show {\n  display: block !important;\n}\n.invisible {\n  visibility: hidden;\n}\n.text-hide {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n.hidden {\n  display: none !important;\n}\n.affix {\n  position: fixed;\n}\n@-ms-viewport {\n  width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n  display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n  display: none !important;\n}\n@media (max-width: 767px) {\n  .visible-xs {\n    display: block !important;\n  }\n  table.visible-xs {\n    display: table !important;\n  }\n  tr.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-xs,\n  td.visible-xs {\n    display: table-cell !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-block {\n    display: block !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-inline {\n    display: inline !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm {\n    display: block !important;\n  }\n  table.visible-sm {\n    display: table !important;\n  }\n  tr.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-sm,\n  td.visible-sm {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-block {\n    display: block !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md {\n    display: block !important;\n  }\n  table.visible-md {\n    display: table !important;\n  }\n  tr.visible-md {\n    display: table-row !important;\n  }\n  th.visible-md,\n  td.visible-md {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-block {\n    display: block !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg {\n    display: block !important;\n  }\n  table.visible-lg {\n    display: table !important;\n  }\n  tr.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-lg,\n  td.visible-lg {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-block {\n    display: block !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (max-width: 767px) {\n  .hidden-xs {\n    display: none !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-sm {\n    display: none !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-md {\n    display: none !important;\n  }\n}\n@media (min-width: 1200px) {\n  .hidden-lg {\n    display: none !important;\n  }\n}\n.visible-print {\n  display: none !important;\n}\n@media print {\n  .visible-print {\n    display: block !important;\n  }\n  table.visible-print {\n    display: table !important;\n  }\n  tr.visible-print {\n    display: table-row !important;\n  }\n  th.visible-print,\n  td.visible-print {\n    display: table-cell !important;\n  }\n}\n.visible-print-block {\n  display: none !important;\n}\n@media print {\n  .visible-print-block {\n    display: block !important;\n  }\n}\n.visible-print-inline {\n  display: none !important;\n}\n@media print {\n  .visible-print-inline {\n    display: inline !important;\n  }\n}\n.visible-print-inline-block {\n  display: none !important;\n}\n@media print {\n  .visible-print-inline-block {\n    display: inline-block !important;\n  }\n}\n@media print {\n  .hidden-print {\n    display: none !important;\n  }\n}\n/*# sourceMappingURL=bootstrap.css.map */\n"
  },
  {
    "path": "2.x/spring-boot-jpa-thymeleaf-curd/src/main/resources/templates/hello.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"UTF-8\"/>\n    <title>Hello Thymeleaf!</title>\n</head>\n<body>\n    <p th:text=\"'Hello, ' + ${name} + '!'\" />\n</body>\n</html>"
  },
  {
    "path": "2.x/spring-boot-jpa-thymeleaf-curd/src/main/resources/templates/user/list.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"UTF-8\"/>\n    <title>userList</title>\n    <link rel=\"stylesheet\" th:href=\"@{/css/bootstrap.css}\"></link>\n</head>\n<body class=\"container\">\n<br/>\n<h1>用户列表</h1>\n<br/><br/>\n<div class=\"with:80%\">\n    <table class=\"table table-hover\">\n        <thead>\n        <tr>\n            <th>#</th>\n            <th>User Name</th>\n            <th>Password</th>\n            <th>Age</th>\n            <th>Edit</th>\n            <th>Delete</th>\n        </tr>\n        </thead>\n        <tbody>\n        <tr  th:each=\"user : ${users}\">\n            <th scope=\"row\" th:text=\"${user.id}\">1</th>\n            <td th:text=\"${user.userName}\">neo</td>\n            <td th:text=\"${user.password}\">Otto</td>\n            <td th:text=\"${user.age}\">6</td>\n            <td><a th:href=\"@{/toEdit(id=${user.id})}\">edit</a></td>\n            <td><a th:href=\"@{/delete(id=${user.id})}\">delete</a></td>\n        </tr>\n        </tbody>\n    </table>\n</div>\n<div class=\"form-group\">\n    <div class=\"col-sm-2 control-label\">\n        <a href=\"/toAdd\" th:href=\"@{/toAdd}\" class=\"btn btn-info\">add</a>\n    </div>\n</div>\n\n</body>\n</html>"
  },
  {
    "path": "2.x/spring-boot-jpa-thymeleaf-curd/src/main/resources/templates/user/userAdd.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"UTF-8\"/>\n    <title>user</title>\n    <link rel=\"stylesheet\" th:href=\"@{/css/bootstrap.css}\"></link>\n</head>\n<body class=\"container\">\n<br/>\n<h1>添加用户</h1>\n<br/><br/>\n<div class=\"with:80%\">\n    <form class=\"form-horizontal\"   th:action=\"@{/add}\"  method=\"post\">\n        <div class=\"form-group\">\n            <label for=\"userName\" class=\"col-sm-2 control-label\">userName</label>\n            <div class=\"col-sm-10\">\n                <input type=\"text\" class=\"form-control\" name=\"userName\"  id=\"userName\" placeholder=\"userName\"/>\n            </div>\n        </div>\n        <div class=\"form-group\">\n            <label for=\"password\" class=\"col-sm-2 control-label\" >Password</label>\n            <div class=\"col-sm-10\">\n                <input type=\"password\" class=\"form-control\" name=\"password\" id=\"password\" placeholder=\"Password\"/>\n            </div>\n        </div>\n        <div class=\"form-group\">\n            <label for=\"age\" class=\"col-sm-2 control-label\">age</label>\n            <div class=\"col-sm-10\">\n                <input type=\"text\" class=\"form-control\" name=\"age\"  id=\"age\" placeholder=\"age\"/>\n            </div>\n        </div>\n        <div class=\"form-group\">\n            <div class=\"col-sm-offset-2 col-sm-10\">\n                <input type=\"submit\" value=\"Submit\" class=\"btn btn-info\" />\n                &nbsp; &nbsp; &nbsp;\n                <input type=\"reset\" value=\"Reset\" class=\"btn btn-info\" />\n            </div>\n\n        </div>\n    </form>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "2.x/spring-boot-jpa-thymeleaf-curd/src/main/resources/templates/user/userEdit.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"UTF-8\"/>\n    <title>user</title>\n    <link rel=\"stylesheet\" th:href=\"@{/css/bootstrap.css}\"></link>\n</head>\n<body class=\"container\">\n<br/>\n<h1>修改用户</h1>\n<br/><br/>\n<div class=\"with:80%\">\n    <form class=\"form-horizontal\"   th:action=\"@{/edit}\" th:object=\"${user}\"  method=\"post\">\n        <input type=\"hidden\" name=\"id\" th:value=\"*{id}\" />\n        <div class=\"form-group\">\n            <label for=\"userName\" class=\"col-sm-2 control-label\">userName</label>\n            <div class=\"col-sm-10\">\n                <input type=\"text\" class=\"form-control\" name=\"userName\"  id=\"userName\" th:value=\"*{userName}\" placeholder=\"userName\"/>\n            </div>\n        </div>\n        <div class=\"form-group\">\n            <label for=\"password\" class=\"col-sm-2 control-label\" >Password</label>\n            <div class=\"col-sm-10\">\n                <input type=\"password\" class=\"form-control\" name=\"password\" id=\"password\"  th:value=\"*{password}\" placeholder=\"Password\"/>\n            </div>\n        </div>\n        <div class=\"form-group\">\n            <label for=\"age\" class=\"col-sm-2 control-label\">age</label>\n            <div class=\"col-sm-10\">\n                <input type=\"text\" class=\"form-control\" name=\"age\"  id=\"age\" th:value=\"*{age}\" placeholder=\"age\"/>\n            </div>\n        </div>\n        <div class=\"form-group\">\n            <div class=\"col-sm-offset-2 col-sm-10\">\n                <input type=\"submit\" value=\"Submit\" class=\"btn btn-info\" />\n                &nbsp; &nbsp; &nbsp;\n                <a href=\"/toAdd\" th:href=\"@{/list}\" class=\"btn btn-info\">Back</a>\n            </div>\n\n        </div>\n    </form>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "2.x/spring-boot-mail/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-mail</artifactId>\n\t<version>1.0.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-mail</name>\n\t<description>Demo project for Spring Boot and mail</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>2.1.0.RELEASE</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-mail</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-context-support</artifactId>\n\t\t\t<version>RELEASE</version>\n\t\t</dependency>\n        <dependency>\n            <groupId>com.sun.mail</groupId>\n            <artifactId>javax.mail</artifactId>\n            <version>RELEASE</version>\n        </dependency>\n\t\t<!-- 模板引擎 -->\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-thymeleaf</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n    </dependencies>\n\t\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t\t<configuration>\n\t                <fork>true</fork>\n\t            </configuration>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\t\n\n</project>\n"
  },
  {
    "path": "2.x/spring-boot-mail/src/main/java/com/neo/MailApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class MailApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(MailApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "2.x/spring-boot-mail/src/main/java/com/neo/service/MailService.java",
    "content": "package com.neo.service;\n\n/**\n * Created by summer on 2017/5/4.\n */\npublic interface MailService {\n\n    void sendSimpleMail(String to, String subject, String content);\n\n    void sendHtmlMail(String to, String subject, String content);\n\n    void sendAttachmentsMail(String to, String subject, String content, String filePath);\n\n    void sendInlineResourceMail(String to, String subject, String content, String rscPath, String rscId);\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-mail/src/main/java/com/neo/service/impl/MailServiceImpl.java",
    "content": "package com.neo.service.impl;\n\nimport com.neo.service.MailService;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.core.io.FileSystemResource;\nimport org.springframework.mail.SimpleMailMessage;\nimport org.springframework.mail.javamail.JavaMailSender;\nimport org.springframework.mail.javamail.MimeMessageHelper;\nimport org.springframework.stereotype.Component;\n\nimport javax.mail.MessagingException;\nimport javax.mail.internet.MimeMessage;\nimport java.io.File;\n\n/**\n * Created by summer on 2017/5/4.\n */\n@Component\npublic class MailServiceImpl implements MailService{\n\n    private final Logger logger = LoggerFactory.getLogger(this.getClass());\n\n    @Autowired\n    private JavaMailSender mailSender;\n\n    @Value(\"${mail.fromMail.addr}\")\n    private String from;\n\n    /**\n     * 发送文本邮件\n     * @param to\n     * @param subject\n     * @param content\n     */\n    @Override\n    public void sendSimpleMail(String to, String subject, String content) {\n        SimpleMailMessage message = new SimpleMailMessage();\n        message.setFrom(from);\n        message.setTo(to);\n        message.setSubject(subject);\n        message.setText(content);\n\n        try {\n            mailSender.send(message);\n            logger.info(\"简单邮件已经发送。\");\n        } catch (Exception e) {\n            logger.error(\"发送简单邮件时发生异常！\", e);\n        }\n\n    }\n\n    /**\n     * 发送html邮件\n     * @param to\n     * @param subject\n     * @param content\n     */\n    @Override\n    public void sendHtmlMail(String to, String subject, String content) {\n        MimeMessage message = mailSender.createMimeMessage();\n\n        try {\n            //true表示需要创建一个multipart message\n            MimeMessageHelper helper = new MimeMessageHelper(message, true);\n            helper.setFrom(from);\n            helper.setTo(to);\n            helper.setSubject(subject);\n            helper.setText(content, true);\n\n            mailSender.send(message);\n            logger.info(\"html邮件发送成功\");\n        } catch (MessagingException e) {\n            logger.error(\"发送html邮件时发生异常！\", e);\n        }\n    }\n\n\n    /**\n     * 发送带附件的邮件\n     * @param to\n     * @param subject\n     * @param content\n     * @param filePath\n     */\n    @Override\n    public void sendAttachmentsMail(String to, String subject, String content, String filePath){\n        MimeMessage message = mailSender.createMimeMessage();\n\n        try {\n            MimeMessageHelper helper = new MimeMessageHelper(message, true);\n            helper.setFrom(from);\n            helper.setTo(to);\n            helper.setSubject(subject);\n            helper.setText(content, true);\n\n            FileSystemResource file = new FileSystemResource(new File(filePath));\n            String fileName = filePath.substring(filePath.lastIndexOf(File.separator));\n            helper.addAttachment(fileName, file);\n            //helper.addAttachment(\"test\"+fileName, file);\n\n            mailSender.send(message);\n            logger.info(\"带附件的邮件已经发送。\");\n        } catch (MessagingException e) {\n            logger.error(\"发送带附件的邮件时发生异常！\", e);\n        }\n    }\n\n\n    /**\n     * 发送正文中有静态资源（图片）的邮件\n     * @param to\n     * @param subject\n     * @param content\n     * @param rscPath\n     * @param rscId\n     */\n    @Override\n    public void sendInlineResourceMail(String to, String subject, String content, String rscPath, String rscId){\n        MimeMessage message = mailSender.createMimeMessage();\n\n        try {\n            MimeMessageHelper helper = new MimeMessageHelper(message, true);\n            helper.setFrom(from);\n            helper.setTo(to);\n            helper.setSubject(subject);\n            helper.setText(content, true);\n\n            FileSystemResource res = new FileSystemResource(new File(rscPath));\n            helper.addInline(rscId, res);\n\n            mailSender.send(message);\n            logger.info(\"嵌入静态资源的邮件已经发送。\");\n        } catch (MessagingException e) {\n            logger.error(\"发送嵌入静态资源的邮件时发生异常！\", e);\n        }\n    }\n}\n"
  },
  {
    "path": "2.x/spring-boot-mail/src/main/resources/application.properties",
    "content": "spring.application.name=spirng-boot-mail\n\nspring.mail.host=smtp.163.com\nspring.mail.username=xxoo@xxoo.com\nspring.mail.password=xxoo\nspring.mail.default-encoding=UTF-8\n\nmail.fromMail.addr=xxoo@xxoo.com\n\n"
  },
  {
    "path": "2.x/spring-boot-mail/src/main/resources/templates/emailTemplate.html",
    "content": "<!DOCTYPE html>\n<html lang=\"zh\" xmlns:th=\"http://www.thymeleaf.org\">\n    <head>\n        <meta charset=\"UTF-8\"/>\n        <title>Title</title>\n    </head>\n    <body>\n        您好,这是验证邮件,请点击下面的链接完成验证,<br/>\n        <a href=\"#\" th:href=\"@{ http://www.ityouknow.com/neo/{id}(id=${id}) }\">激活账号</a>\n    </body>\n</html>"
  },
  {
    "path": "2.x/spring-boot-mail/src/test/java/com/neo/MailApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class MailApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t\tSystem.out.println(\"hello world\");\n\t}\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-mail/src/test/java/com/neo/service/MailServiceTest.java",
    "content": "package com.neo.service;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\nimport org.thymeleaf.TemplateEngine;\nimport org.thymeleaf.context.Context;\n\n/**\n * Created by summer on 2017/5/4.\n */\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class MailServiceTest {\n\n    @Autowired\n    private MailService mailService;\n\n    @Autowired\n    private TemplateEngine templateEngine;\n\n    @Test\n    public void testSimpleMail() throws Exception {\n        mailService.sendSimpleMail(\"ityouknow@126.com\",\"test simple mail\",\" hello this is simple mail\");\n    }\n\n    @Test\n    public void testHtmlMail() throws Exception {\n        String content=\"<html>\\n\" +\n                \"<body>\\n\" +\n                \"    <h3>hello world ! 这是一封html邮件!</h3>\\n\" +\n                \"</body>\\n\" +\n                \"</html>\";\n        mailService.sendHtmlMail(\"ityouknow@126.com\",\"test simple mail\",content);\n    }\n\n    @Test\n    public void sendAttachmentsMail() {\n        String filePath=\"e:\\\\tmp\\\\application.log\";\n        mailService.sendAttachmentsMail(\"ityouknow@126.com\", \"主题：带附件的邮件\", \"有附件，请查收！\", filePath);\n    }\n\n\n    @Test\n    public void sendInlineResourceMail() {\n        String rscId = \"neo006\";\n        String content=\"<html><body>这是有图片的邮件：<img src=\\'cid:\" + rscId + \"\\' ></body></html>\";\n        String imgPath = \"C:\\\\Users\\\\summer\\\\Pictures\\\\favicon.png\";\n\n        mailService.sendInlineResourceMail(\"ityouknow@126.com\", \"主题：这是有图片的邮件\", content, imgPath, rscId);\n    }\n\n\n    @Test\n    public void sendTemplateMail() {\n        //创建邮件正文\n        Context context = new Context();\n        context.setVariable(\"id\", \"006\");\n        String emailContent = templateEngine.process(\"emailTemplate\", context);\n\n        mailService.sendHtmlMail(\"ityouknow@126.com\",\"主题：这是模板邮件\",emailContent);\n    }\n}\n"
  },
  {
    "path": "2.x/spring-boot-memcache-spymemcached/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-memcache-spymemcached</artifactId>\n\t<version>1.0.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-memcache-spymemcached</name>\n\t<description>Demo project for Spring Boot</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>2.0.4.RELEASE</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>net.spy</groupId>\n\t\t\t<artifactId>spymemcached</artifactId>\n\t\t\t<version>2.12.2</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t</dependencies>\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\n\n</project>\n"
  },
  {
    "path": "2.x/spring-boot-memcache-spymemcached/src/main/java/com/neo/MemcacheApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class MemcacheApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(MemcacheApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "2.x/spring-boot-memcache-spymemcached/src/main/java/com/neo/config/MemcacheSource.java",
    "content": "package com.neo.config;\n\nimport org.springframework.boot.context.properties.ConfigurationProperties;\nimport org.springframework.stereotype.Component;\n\n@Component\n@ConfigurationProperties(prefix = \"memcache\")\npublic class MemcacheSource {\n\n    private String ip;\n\n    private int port;\n\n    public String getIp() {\n        return ip;\n    }\n\n    public void setIp(String ip) {\n        this.ip = ip;\n    }\n\n    public int getPort() {\n        return port;\n    }\n\n    public void setPort(int port) {\n        this.port = port;\n    }\n}\n"
  },
  {
    "path": "2.x/spring-boot-memcache-spymemcached/src/main/java/com/neo/config/MemcachedRunner.java",
    "content": "package com.neo.config;\n\nimport net.spy.memcached.MemcachedClient;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.boot.CommandLineRunner;\nimport org.springframework.stereotype.Component;\n\nimport javax.annotation.Resource;\nimport java.io.IOException;\nimport java.net.InetSocketAddress;\n\n@Component\npublic class MemcachedRunner implements CommandLineRunner {\n    protected Logger logger =  LoggerFactory.getLogger(this.getClass());\n\n    @Resource\n    private  MemcacheSource memcacheSource;\n\n    private MemcachedClient client = null;\n\n    @Override\n    public void run(String... args) throws Exception {\n        try {\n            client = new MemcachedClient(new InetSocketAddress(memcacheSource.getIp(),memcacheSource.getPort()));\n        } catch (IOException e) {\n            logger.error(\"inint MemcachedClient failed \",e);\n        }\n    }\n\n    public MemcachedClient getClient() {\n        return client;\n    }\n\n}"
  },
  {
    "path": "2.x/spring-boot-memcache-spymemcached/src/main/resources/application.properties",
    "content": "memcache.ip=192.168.0.161\nmemcache.port=11211"
  },
  {
    "path": "2.x/spring-boot-memcache-spymemcached/src/test/java/com/neo/MemcacheApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class MemcacheApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t}\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-memcache-spymemcached/src/test/java/com/neo/RepositoryTests.java",
    "content": "package com.neo;\n\nimport com.neo.config.MemcachedRunner;\nimport net.spy.memcached.MemcachedClient;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport javax.annotation.Resource;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class RepositoryTests {\n\n\t@Resource\n    private MemcachedRunner memcachedRunner;\n\n\t@Test\n\tpublic void testSetGet()  {\n\t\tMemcachedClient memcachedClient = memcachedRunner.getClient();\n\t\tmemcachedClient.set(\"testkey\",1000,\"666666\");\n\t\tSystem.out.println(\"***********  \"+memcachedClient.get(\"testkey\").toString());\n\t}\n\n}"
  },
  {
    "path": "2.x/spring-boot-mongodb/spring-boot-mongodb/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-mongodb</artifactId>\n\t<version>1.0.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-mongodb</name>\n\t<description>Demo project for Spring Boot and mongodb</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>2.1.0.RELEASE</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t   <groupId>org.springframework.boot</groupId>\n\t\t   <artifactId>spring-boot-starter-data-mongodb</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n    </dependencies>\n\t\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\t\n\n</project>\n"
  },
  {
    "path": "2.x/spring-boot-mongodb/spring-boot-mongodb/src/main/java/com/neo/MongoDBApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class MongoDBApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(MongoDBApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "2.x/spring-boot-mongodb/spring-boot-mongodb/src/main/java/com/neo/model/User.java",
    "content": "package com.neo.model;\n\nimport java.io.Serializable;\n\n/**\n * Created by summer on 2017/5/5.\n */\npublic class User implements Serializable {\n        private static final long serialVersionUID = -3258839839160856613L;\n        private Long id;\n        private String userName;\n        private String passWord;\n\n        public Long getId() {\n                return id;\n        }\n\n        public void setId(Long id) {\n                this.id = id;\n        }\n\n        public String getUserName() {\n                return userName;\n        }\n\n        public void setUserName(String userName) {\n                this.userName = userName;\n        }\n\n        public String getPassWord() {\n                return passWord;\n        }\n\n        public void setPassWord(String passWord) {\n                this.passWord = passWord;\n        }\n\n        @Override\n        public String toString() {\n                return \"UserEntity{\" +\n                        \"id=\" + id +\n                        \", userName='\" + userName + '\\'' +\n                        \", passWord='\" + passWord + '\\'' +\n                        '}';\n        }\n}\n"
  },
  {
    "path": "2.x/spring-boot-mongodb/spring-boot-mongodb/src/main/java/com/neo/repository/UserRepository.java",
    "content": "package com.neo.repository;\n\nimport com.neo.model.User;\n\n/**\n * Created by summer on 2017/5/5.\n */\npublic interface UserRepository {\n\n    public void saveUser(User user);\n\n    public User findUserByUserName(String userName);\n\n    public long updateUser(User user);\n\n    public void deleteUserById(Long id);\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-mongodb/spring-boot-mongodb/src/main/java/com/neo/repository/impl/UserRepositoryImpl.java",
    "content": "package com.neo.repository.impl;\n\nimport com.mongodb.client.result.UpdateResult;\nimport com.neo.repository.UserRepository;\nimport com.neo.model.User;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.data.mongodb.core.MongoTemplate;\nimport org.springframework.data.mongodb.core.query.Criteria;\nimport org.springframework.data.mongodb.core.query.Query;\nimport org.springframework.data.mongodb.core.query.Update;\nimport org.springframework.stereotype.Component;\n\n/**\n * Created by summer on 2017/5/5.\n */\n@Component\npublic class UserRepositoryImpl implements UserRepository {\n\n    @Autowired\n    private MongoTemplate mongoTemplate;\n\n    /**\n     * 创建对象\n     * @param user\n     */\n    @Override\n    public void saveUser(User user) {\n        mongoTemplate.save(user);\n    }\n\n    /**\n     * 根据用户名查询对象\n     * @param userName\n     * @return\n     */\n    @Override\n    public User findUserByUserName(String userName) {\n        Query query=new Query(Criteria.where(\"userName\").is(userName));\n        User user =  mongoTemplate.findOne(query , User.class);\n        return user;\n    }\n\n    /**\n     * 更新对象\n     * @param user\n     */\n    @Override\n    public long updateUser(User user) {\n        Query query=new Query(Criteria.where(\"id\").is(user.getId()));\n        Update update= new Update().set(\"userName\", user.getUserName()).set(\"passWord\", user.getPassWord());\n        //更新查询返回结果集的第一条\n        UpdateResult result =mongoTemplate.updateFirst(query,update,User.class);\n        //更新查询返回结果集的所有\n        // mongoTemplate.updateMulti(query,update,UserEntity.class);\n        if(result!=null)\n            return result.getMatchedCount();\n        else\n            return 0;\n    }\n\n    /**\n     * 删除对象\n     * @param id\n     */\n    @Override\n    public void deleteUserById(Long id) {\n        Query query=new Query(Criteria.where(\"id\").is(id));\n        mongoTemplate.remove(query,User.class);\n    }\n}\n"
  },
  {
    "path": "2.x/spring-boot-mongodb/spring-boot-mongodb/src/main/resources/application.properties",
    "content": "spring.application.name=spring-boot-mongodb\n\nspring.data.mongodb.uri=mongodb://192.168.0.75:20000/test\n\n\n"
  },
  {
    "path": "2.x/spring-boot-mongodb/spring-boot-mongodb/src/test/java/com/neo/MongoDBApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class MongoDBApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t\tSystem.out.println(\"hello world\");\n\t}\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-mongodb/spring-boot-mongodb/src/test/java/com/neo/repository/UserRepositoryTest.java",
    "content": "package com.neo.repository;\n\nimport com.neo.model.User;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n/**\n * Created by summer on 2017/5/5.\n */\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class UserRepositoryTest {\n\n    @Autowired\n    private UserRepository userDao;\n\n    @Test\n    public void testSaveUser() throws Exception {\n        User user=new User();\n        user.setId(2l);\n        user.setUserName(\"小明\");\n        user.setPassWord(\"fffooo123\");\n        userDao.saveUser(user);\n    }\n\n    @Test\n    public void findUserByUserName(){\n       User user= userDao.findUserByUserName(\"小明\");\n       System.out.println(\"user is \"+user);\n    }\n\n    @Test\n    public void updateUser(){\n        User user=new User();\n        user.setId(2l);\n        user.setUserName(\"天空\");\n        user.setPassWord(\"fffxxxx\");\n        userDao.updateUser(user);\n    }\n\n    @Test\n    public void deleteUserById(){\n        userDao.deleteUserById(1l);\n    }\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-mongodb/spring-boot-multi-mongodb/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-multi-mongodb</artifactId>\n\t<version>1.0.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-multi-mongodb</name>\n\t<description>Demo project for Spring Boot and multi mongodb</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>2.1.0.RELEASE</version>\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-data-mongodb</artifactId>\n        </dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t</dependency>\n\t</dependencies>\n\t\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\t\n\n</project>\n"
  },
  {
    "path": "2.x/spring-boot-mongodb/spring-boot-multi-mongodb/src/main/java/com/neo/MultiMongodbApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class MultiMongodbApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(MultiMongodbApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "2.x/spring-boot-mongodb/spring-boot-multi-mongodb/src/main/java/com/neo/config/MultipleMongoConfig.java",
    "content": "package com.neo.config;\n\nimport com.mongodb.MongoClient;\nimport com.mongodb.MongoClientURI;\nimport com.neo.config.props.MultipleMongoProperties;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.boot.autoconfigure.mongo.MongoProperties;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.context.annotation.Primary;\nimport org.springframework.data.mongodb.MongoDbFactory;\nimport org.springframework.data.mongodb.core.MongoTemplate;\nimport org.springframework.data.mongodb.core.SimpleMongoDbFactory;\n\n@Configuration\npublic class MultipleMongoConfig {\n\n\t@Autowired\n    private MultipleMongoProperties mongoProperties;\n\n\t@Primary\n\t@Bean(name = \"primaryMongoTemplate\")\n\tpublic MongoTemplate primaryMongoTemplate() throws Exception {\n\t\treturn new MongoTemplate(primaryFactory(this.mongoProperties.getPrimary()));\n\t}\n\n\t@Bean\n\t@Qualifier(\"secondaryMongoTemplate\")\n\tpublic MongoTemplate secondaryMongoTemplate() throws Exception {\n        return new MongoTemplate(secondaryFactory(this.mongoProperties.getSecondary()));\n\t}\n\n\t@Bean\n    @Primary\n\tpublic MongoDbFactory primaryFactory(MongoProperties mongo) throws Exception {\n\t\tMongoClient client = new MongoClient(new MongoClientURI(mongoProperties.getPrimary().getUri()));\n\t\treturn new SimpleMongoDbFactory(client, mongoProperties.getPrimary().getDatabase());\n\t}\n\n\t@Bean\n\tpublic MongoDbFactory secondaryFactory(MongoProperties mongo) throws Exception {\n\t\tMongoClient client = new MongoClient(new MongoClientURI(mongoProperties.getSecondary().getUri()));\n\t\treturn new SimpleMongoDbFactory(client, mongoProperties.getSecondary().getDatabase());\n\t}\n}"
  },
  {
    "path": "2.x/spring-boot-mongodb/spring-boot-multi-mongodb/src/main/java/com/neo/config/PrimaryMongoConfig.java",
    "content": "package com.neo.config;\n\nimport com.mongodb.MongoClient;\nimport com.mongodb.MongoClientURI;\nimport com.neo.config.props.MultipleMongoProperties;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.autoconfigure.mongo.MongoProperties;\nimport org.springframework.boot.context.properties.EnableConfigurationProperties;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.context.annotation.Primary;\nimport org.springframework.data.mongodb.MongoDbFactory;\nimport org.springframework.data.mongodb.core.MongoTemplate;\nimport org.springframework.data.mongodb.core.SimpleMongoDbFactory;\nimport org.springframework.data.mongodb.repository.config.EnableMongoRepositories;\n\n\n@Configuration\n@EnableConfigurationProperties(MultipleMongoProperties.class)\n@EnableMongoRepositories(basePackages = \"com.neo.repository.primary\",\n\t\tmongoTemplateRef = \"primaryMongoTemplate\")\npublic class PrimaryMongoConfig {\n}\n"
  },
  {
    "path": "2.x/spring-boot-mongodb/spring-boot-multi-mongodb/src/main/java/com/neo/config/SecondaryMongoConfig.java",
    "content": "package com.neo.config;\n\nimport com.mongodb.MongoClient;\nimport com.mongodb.MongoClientURI;\nimport com.neo.config.props.MultipleMongoProperties;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.boot.autoconfigure.mongo.MongoProperties;\nimport org.springframework.boot.context.properties.EnableConfigurationProperties;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.data.mongodb.MongoDbFactory;\nimport org.springframework.data.mongodb.core.MongoTemplate;\nimport org.springframework.data.mongodb.core.SimpleMongoDbFactory;\nimport org.springframework.data.mongodb.repository.config.EnableMongoRepositories;\n\n\n@Configuration\n@EnableConfigurationProperties(MultipleMongoProperties.class)\n@EnableMongoRepositories(basePackages = \"com.neo.repository.secondary\",\n\t\tmongoTemplateRef = \"secondaryMongoTemplate\")\npublic class SecondaryMongoConfig {\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-mongodb/spring-boot-multi-mongodb/src/main/java/com/neo/config/props/MultipleMongoProperties.java",
    "content": "package com.neo.config.props;\n\nimport org.springframework.boot.autoconfigure.mongo.MongoProperties;\nimport org.springframework.boot.context.properties.ConfigurationProperties;\n\n@ConfigurationProperties(prefix = \"mongodb\")\npublic class MultipleMongoProperties {\n\n\tprivate MongoProperties primary = new MongoProperties();\n\tprivate MongoProperties secondary = new MongoProperties();\n\n\tpublic MongoProperties getPrimary() {\n\t\treturn primary;\n\t}\n\n\tpublic void setPrimary(MongoProperties primary) {\n\t\tthis.primary = primary;\n\t}\n\n\tpublic MongoProperties getSecondary() {\n\t\treturn secondary;\n\t}\n\n\tpublic void setSecondary(MongoProperties secondary) {\n\t\tthis.secondary = secondary;\n\t}\n}\n"
  },
  {
    "path": "2.x/spring-boot-mongodb/spring-boot-multi-mongodb/src/main/java/com/neo/model/User.java",
    "content": "package com.neo.model;\n\nimport java.io.Serializable;\n\n\npublic class User implements Serializable {\n        private static final long serialVersionUID = -3258839839160856613L;\n        private String  id;\n        private String userName;\n        private String passWord;\n\n        public User(String userName, String passWord) {\n                this.userName = userName;\n                this.passWord = passWord;\n        }\n\n        public String getId() {\n                return id;\n        }\n\n        public void setId(String id) {\n                this.id = id;\n        }\n\n        public String getUserName() {\n                return userName;\n        }\n\n        public void setUserName(String userName) {\n                this.userName = userName;\n        }\n\n        public String getPassWord() {\n                return passWord;\n        }\n\n        public void setPassWord(String passWord) {\n                this.passWord = passWord;\n        }\n\n        @Override\n        public String toString() {\n                return \"User{\" +\n                        \"id='\" + id + '\\'' +\n                        \", userName='\" + userName + '\\'' +\n                        \", passWord='\" + passWord + '\\'' +\n                        '}';\n        }\n}\n"
  },
  {
    "path": "2.x/spring-boot-mongodb/spring-boot-multi-mongodb/src/main/java/com/neo/repository/primary/PrimaryRepository.java",
    "content": "package com.neo.repository.primary;\n\nimport com.neo.model.User;\nimport org.springframework.data.mongodb.repository.MongoRepository;\n\n/**\n * @author neo\n */\npublic interface PrimaryRepository extends MongoRepository<User, String> {\n}\n"
  },
  {
    "path": "2.x/spring-boot-mongodb/spring-boot-multi-mongodb/src/main/java/com/neo/repository/secondary/SecondaryRepository.java",
    "content": "package com.neo.repository.secondary;\n\nimport com.neo.model.User;\nimport org.springframework.data.mongodb.repository.MongoRepository;\n\n/**\n * @author neo\n */\npublic interface SecondaryRepository extends MongoRepository<User, String> {\n}\n"
  },
  {
    "path": "2.x/spring-boot-mongodb/spring-boot-multi-mongodb/src/main/resources/application.properties",
    "content": "spring.application.name=spring-boot-multi-mongodb\n\nmongodb.primary.uri=mongodb://192.168.0.75:20000\nmongodb.primary.database=primary\nmongodb.secondary.uri=mongodb://192.168.0.75:20000\nmongodb.secondary.database=secondary\n\n\n"
  },
  {
    "path": "2.x/spring-boot-mongodb/spring-boot-multi-mongodb/src/test/java/com/neo/MultiMongodbApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class MultiMongodbApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t\tSystem.out.println(\"hello world\");\n\t}\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-mongodb/spring-boot-multi-mongodb/src/test/java/com/neo/repository/MuliDatabaseTest.java",
    "content": "package com.neo.repository;\n\nimport com.neo.model.User;\nimport com.neo.repository.primary.PrimaryRepository;\nimport com.neo.repository.secondary.SecondaryRepository;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport java.util.List;\n\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class MuliDatabaseTest {\n\n    @Autowired\n    private PrimaryRepository primaryRepository;\n\n    @Autowired\n    private SecondaryRepository secondaryRepository;\n\n    @Test\n    public void TestSave() {\n        System.out.println(\"************************************************************\");\n        System.out.println(\"测试开始\");\n        System.out.println(\"************************************************************\");\n        this.primaryRepository.save(new User(\"小张\", \"123456\"));\n        this.secondaryRepository.save(new User(\"小王\", \"654321\"));\n        List<User> primaries = this.primaryRepository.findAll();\n        for (User primary : primaries) {\n            System.out.println(primary.toString());\n        }\n        List<User> secondaries = this.secondaryRepository.findAll();\n        for (User secondary : secondaries) {\n            System.out.println(secondary.toString());\n        }\n        System.out.println(\"************************************************************\");\n        System.out.println(\"测试完成\");\n        System.out.println(\"************************************************************\");\n    }\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-annotation/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-mybatis-annotation</artifactId>\n\t<version>1.0.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-mybatis-annotation</name>\n\t<description>Demo project for Spring Boot and mybatis</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>2.1.0.RELEASE</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t        <groupId>org.springframework.boot</groupId>\n\t        <artifactId>spring-boot-starter-web</artifactId>\n\t    </dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.mybatis.spring.boot</groupId>\n\t\t\t<artifactId>mybatis-spring-boot-starter</artifactId>\n\t\t\t<version>2.0.0</version>\n\t\t</dependency>\n\t     <dependency>\n\t        <groupId>mysql</groupId>\n\t        <artifactId>mysql-connector-java</artifactId>\n\t    </dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t</dependencies>\n\t\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\t\n\n</project>\n"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-annotation/src/main/java/com/neo/MybatisAnnotationApplication.java",
    "content": "package com.neo;\n\nimport org.mybatis.spring.annotation.MapperScan;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\n@MapperScan(\"com.neo.mapper\")\npublic class MybatisAnnotationApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(MybatisAnnotationApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-annotation/src/main/java/com/neo/enums/UserSexEnum.java",
    "content": "package com.neo.enums;\n\npublic enum UserSexEnum {\n\tMAN, WOMAN\n}\n"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-annotation/src/main/java/com/neo/mapper/UserMapper.java",
    "content": "package com.neo.mapper;\n\nimport java.util.List;\n\nimport com.neo.model.User;\nimport org.apache.ibatis.annotations.Delete;\nimport org.apache.ibatis.annotations.Insert;\nimport org.apache.ibatis.annotations.Result;\nimport org.apache.ibatis.annotations.Results;\nimport org.apache.ibatis.annotations.Select;\nimport org.apache.ibatis.annotations.Update;\n\nimport com.neo.enums.UserSexEnum;\n\npublic interface UserMapper {\n\t\n\t@Select(\"SELECT * FROM users\")\n\t@Results({\n\t\t@Result(property = \"userSex\",  column = \"user_sex\", javaType = UserSexEnum.class),\n\t\t@Result(property = \"nickName\", column = \"nick_name\")\n\t})\n\tList<User> getAll();\n\t\n\t@Select(\"SELECT * FROM users WHERE id = #{id}\")\n\t@Results({\n\t\t@Result(property = \"userSex\",  column = \"user_sex\", javaType = UserSexEnum.class),\n\t\t@Result(property = \"nickName\", column = \"nick_name\")\n\t})\n\tUser getOne(Long id);\n\n\t@Insert(\"INSERT INTO users(userName,passWord,user_sex) VALUES(#{userName}, #{passWord}, #{userSex})\")\n\tvoid insert(User user);\n\n\t@Update(\"UPDATE users SET userName=#{userName},nick_name=#{nickName} WHERE id =#{id}\")\n\tvoid update(User user);\n\n\t@Delete(\"DELETE FROM users WHERE id =#{id}\")\n\tvoid delete(Long id);\n\n}"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-annotation/src/main/java/com/neo/model/User.java",
    "content": "package com.neo.model;\n\nimport java.io.Serializable;\n\nimport com.neo.enums.UserSexEnum;\n\npublic class User implements Serializable {\n\n\tprivate static final long serialVersionUID = 1L;\n\tprivate Long id;\n\tprivate String userName;\n\tprivate String passWord;\n\tprivate UserSexEnum userSex;\n\tprivate String nickName;\n\n\tpublic User() {\n\t\tsuper();\n\t}\n\n\tpublic User(String userName, String passWord, UserSexEnum userSex) {\n\t\tsuper();\n\t\tthis.passWord = passWord;\n\t\tthis.userName = userName;\n\t\tthis.userSex = userSex;\n\t}\n\n\tpublic Long getId() {\n\t\treturn id;\n\t}\n\n\tpublic void setId(Long id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic String getUserName() {\n\t\treturn userName;\n\t}\n\n\tpublic void setUserName(String userName) {\n\t\tthis.userName = userName;\n\t}\n\n\tpublic String getPassWord() {\n\t\treturn passWord;\n\t}\n\n\tpublic void setPassWord(String passWord) {\n\t\tthis.passWord = passWord;\n\t}\n\n\tpublic UserSexEnum getUserSex() {\n\t\treturn userSex;\n\t}\n\n\tpublic void setUserSex(UserSexEnum userSex) {\n\t\tthis.userSex = userSex;\n\t}\n\n\tpublic String getNickName() {\n\t\treturn nickName;\n\t}\n\n\tpublic void setNickName(String nickName) {\n\t\tthis.nickName = nickName;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\t// TODO Auto-generated method stub\n\t\treturn \"userName \" + this.userName + \", pasword \" + this.passWord + \"sex \" + userSex.name();\n\t}\n\n}"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-annotation/src/main/java/com/neo/web/UserController.java",
    "content": "package com.neo.web;\n\nimport java.util.List;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport com.neo.model.User;\nimport com.neo.mapper.UserMapper;\n\n@RestController\npublic class UserController {\n\t\n\t@Autowired\n\tprivate UserMapper userMapper;\n\t\n\t@RequestMapping(\"/getUsers\")\n\tpublic List<User> getUsers() {\n\t\tList<User> users=userMapper.getAll();\n\t\treturn users;\n\t}\n\t\n    @RequestMapping(\"/getUser\")\n    public User getUser(Long id) {\n    \tUser user=userMapper.getOne(id);\n        return user;\n    }\n    \n    @RequestMapping(\"/add\")\n    public void save(User user) {\n    \tuserMapper.insert(user);\n    }\n    \n    @RequestMapping(value=\"update\")\n    public void update(User user) {\n    \tuserMapper.update(user);\n    }\n    \n    @RequestMapping(value=\"/delete/{id}\")\n    public void delete(@PathVariable(\"id\") Long id) {\n    \tuserMapper.delete(id);\n    }\n    \n    \n}"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-annotation/src/main/resources/application.properties",
    "content": "mybatis.type-aliases-package=com.neo.model\n\nspring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true\nspring.datasource.username=root\nspring.datasource.password=root\nspring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-annotation/src/test/java/com/neo/MybatisAnnotationApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class MybatisAnnotationApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t\tSystem.out.println(\"hello world\");\n\t}\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-annotation/src/test/java/com/neo/mapper/UserMapperTest.java",
    "content": "package com.neo.mapper;\n\nimport java.util.List;\n\nimport com.neo.model.User;\nimport org.junit.Assert;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport com.neo.enums.UserSexEnum;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class UserMapperTest {\n\n\t@Autowired\n\tprivate UserMapper userMapper;\n\n\t@Test\n\tpublic void testInsert() throws Exception {\n\t\tuserMapper.insert(new User(\"aa1\", \"a123456\", UserSexEnum.MAN));\n\t\tuserMapper.insert(new User(\"bb1\", \"b123456\", UserSexEnum.WOMAN));\n\t\tuserMapper.insert(new User(\"cc1\", \"b123456\", UserSexEnum.WOMAN));\n\n\t\tAssert.assertEquals(3, userMapper.getAll().size());\n\t}\n\n\t@Test\n\tpublic void testQuery() throws Exception {\n\t\tList<User> users = userMapper.getAll();\n\t\tSystem.out.println(users.toString());\n\t}\n\t\n\t\n\t@Test\n\tpublic void testUpdate() throws Exception {\n\t\tUser user = userMapper.getOne(30l);\n\t\tSystem.out.println(user.toString());\n\t\tuser.setNickName(\"neo\");\n\t\tuserMapper.update(user);\n\t\tAssert.assertTrue((\"neo\".equals(userMapper.getOne(30l).getNickName())));\n\t}\n\n}"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-annotation/users.sql",
    "content": "/*\nNavicat MySQL Data Transfer\n\nSource Server         : 本地\nSource Server Version : 50505\nSource Host           : localhost:3306\nSource Database       : test1\n\nTarget Server Type    : MYSQL\nTarget Server Version : 50505\nFile Encoding         : 65001\n\nDate: 2016-11-05 21:17:33\n*/\n\nSET FOREIGN_KEY_CHECKS=0;\n\n-- ----------------------------\n-- Table structure for `users`\n-- ----------------------------\nDROP TABLE IF EXISTS `users`;\nCREATE TABLE `users` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',\n  `userName` varchar(32) DEFAULT NULL COMMENT '用户名',\n  `passWord` varchar(32) DEFAULT NULL COMMENT '密码',\n  `user_sex` varchar(32) DEFAULT NULL,\n  `nick_name` varchar(32) DEFAULT NULL,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8;\n\n"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-annotation-mulidatasource/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-mybatis-annotation-mulidatasource</artifactId>\n\t<version>1.0.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-mybatis-annotation-mulidatasource</name>\n\t<description>Demo project for Spring Boot and mybatis with annotation</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>2.1.0.RELEASE</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t        <groupId>org.springframework.boot</groupId>\n\t        <artifactId>spring-boot-starter-web</artifactId>\n\t    </dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.mybatis.spring.boot</groupId>\n\t\t\t<artifactId>mybatis-spring-boot-starter</artifactId>\n\t\t\t<version>2.0.0</version>\n\t\t</dependency>\n\t     <dependency>\n\t        <groupId>mysql</groupId>\n\t        <artifactId>mysql-connector-java</artifactId>\n\t    </dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t</dependencies>\n\t\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\t\n\n</project>\n"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-annotation-mulidatasource/src/main/java/com/neo/MAMApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class MAMApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(MAMApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-annotation-mulidatasource/src/main/java/com/neo/datasource/DataSource1Config.java",
    "content": "package com.neo.datasource;\n\nimport org.apache.ibatis.session.SqlSessionFactory;\nimport org.mybatis.spring.SqlSessionFactoryBean;\nimport org.mybatis.spring.SqlSessionTemplate;\nimport org.mybatis.spring.annotation.MapperScan;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.boot.context.properties.ConfigurationProperties;\nimport org.springframework.boot.jdbc.DataSourceBuilder;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.context.annotation.Primary;\nimport org.springframework.jdbc.datasource.DataSourceTransactionManager;\n\nimport javax.sql.DataSource;\n\n/**\n * Created by summer on 2016/11/25.\n */\n@Configuration\n@MapperScan(basePackages = \"com.neo.mapper.test1\", sqlSessionTemplateRef  = \"test1SqlSessionTemplate\")\npublic class DataSource1Config {\n\n    @Bean(name = \"test1DataSource\")\n    @ConfigurationProperties(prefix = \"spring.datasource.test1\")\n    @Primary\n    public DataSource testDataSource() {\n        return DataSourceBuilder.create().build();\n    }\n\n    @Bean(name = \"test1SqlSessionFactory\")\n    @Primary\n    public SqlSessionFactory testSqlSessionFactory(@Qualifier(\"test1DataSource\") DataSource dataSource) throws Exception {\n        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();\n        bean.setDataSource(dataSource);\n        return bean.getObject();\n    }\n\n    @Bean(name = \"test1TransactionManager\")\n    @Primary\n    public DataSourceTransactionManager testTransactionManager(@Qualifier(\"test1DataSource\") DataSource dataSource) {\n        return new DataSourceTransactionManager(dataSource);\n    }\n\n    @Bean(name = \"test1SqlSessionTemplate\")\n    @Primary\n    public SqlSessionTemplate testSqlSessionTemplate(@Qualifier(\"test1SqlSessionFactory\") SqlSessionFactory sqlSessionFactory) throws Exception {\n        return new SqlSessionTemplate(sqlSessionFactory);\n    }\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-annotation-mulidatasource/src/main/java/com/neo/datasource/DataSource2Config.java",
    "content": "package com.neo.datasource;\n\nimport org.apache.ibatis.session.SqlSessionFactory;\nimport org.mybatis.spring.SqlSessionFactoryBean;\nimport org.mybatis.spring.SqlSessionTemplate;\nimport org.mybatis.spring.annotation.MapperScan;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.boot.context.properties.ConfigurationProperties;\nimport org.springframework.boot.jdbc.DataSourceBuilder;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.jdbc.datasource.DataSourceTransactionManager;\n\nimport javax.sql.DataSource;\n\n/**\n * Created by summer on 2016/11/25.\n */\n@Configuration\n@MapperScan(basePackages = \"com.neo.mapper.test2\", sqlSessionTemplateRef  = \"test2SqlSessionTemplate\")\npublic class DataSource2Config {\n\n    @Bean(name = \"test2DataSource\")\n    @ConfigurationProperties(prefix = \"spring.datasource.test2\")\n    public DataSource testDataSource() {\n        return DataSourceBuilder.create().build();\n    }\n\n    @Bean(name = \"test2SqlSessionFactory\")\n    public SqlSessionFactory testSqlSessionFactory(@Qualifier(\"test2DataSource\") DataSource dataSource) throws Exception {\n        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();\n        bean.setDataSource(dataSource);\n        return bean.getObject();\n    }\n\n    @Bean(name = \"test2TransactionManager\")\n    public DataSourceTransactionManager testTransactionManager(@Qualifier(\"test2DataSource\") DataSource dataSource) {\n        return new DataSourceTransactionManager(dataSource);\n    }\n\n    @Bean(name = \"test2SqlSessionTemplate\")\n    public SqlSessionTemplate testSqlSessionTemplate(@Qualifier(\"test2SqlSessionFactory\") SqlSessionFactory sqlSessionFactory) throws Exception {\n        return new SqlSessionTemplate(sqlSessionFactory);\n    }\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-annotation-mulidatasource/src/main/java/com/neo/enums/UserSexEnum.java",
    "content": "package com.neo.enums;\n\npublic enum UserSexEnum {\n\tMAN, WOMAN\n}\n"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-annotation-mulidatasource/src/main/java/com/neo/mapper/test1/User1Mapper.java",
    "content": "package com.neo.mapper.test1;\n\nimport com.neo.model.User;\nimport com.neo.enums.UserSexEnum;\nimport org.apache.ibatis.annotations.*;\n\nimport java.util.List;\n\npublic interface User1Mapper {\n\n\n\t@Select(\"SELECT * FROM users\")\n\t@Results({\n\t\t\t@Result(property = \"userSex\",  column = \"user_sex\", javaType = UserSexEnum.class),\n\t\t\t@Result(property = \"nickName\", column = \"nick_name\")\n\t})\n\tList<User> getAll();\n\n\t@Select(\"SELECT * FROM users WHERE id = #{id}\")\n\t@Results({\n\t\t\t@Result(property = \"userSex\",  column = \"user_sex\", javaType = UserSexEnum.class),\n\t\t\t@Result(property = \"nickName\", column = \"nick_name\")\n\t})\n\tUser getOne(Long id);\n\n\t@Insert(\"INSERT INTO users(userName,passWord,user_sex) VALUES(#{userName}, #{passWord}, #{userSex})\")\n\tvoid insert(User user);\n\n\t@Update(\"UPDATE users SET userName=#{userName},nick_name=#{nickName} WHERE id =#{id}\")\n\tvoid update(User user);\n\n\t@Delete(\"DELETE FROM users WHERE id =#{id}\")\n\tvoid delete(Long id);\n\n}"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-annotation-mulidatasource/src/main/java/com/neo/mapper/test2/User2Mapper.java",
    "content": "package com.neo.mapper.test2;\n\nimport java.util.List;\n\nimport com.neo.model.User;\nimport com.neo.enums.UserSexEnum;\nimport org.apache.ibatis.annotations.*;\n\npublic interface User2Mapper {\n\n\n\t@Select(\"SELECT * FROM users\")\n\t@Results({\n\t\t\t@Result(property = \"userSex\",  column = \"user_sex\", javaType = UserSexEnum.class),\n\t\t\t@Result(property = \"nickName\", column = \"nick_name\")\n\t})\n\tList<User> getAll();\n\n\t@Select(\"SELECT * FROM users WHERE id = #{id}\")\n\t@Results({\n\t\t\t@Result(property = \"userSex\",  column = \"user_sex\", javaType = UserSexEnum.class),\n\t\t\t@Result(property = \"nickName\", column = \"nick_name\")\n\t})\n\tUser getOne(Long id);\n\n\t@Insert(\"INSERT INTO users(userName,passWord,user_sex) VALUES(#{userName}, #{passWord}, #{userSex})\")\n\tvoid insert(User user);\n\n\t@Update(\"UPDATE users SET userName=#{userName},nick_name=#{nickName} WHERE id =#{id}\")\n\tvoid update(User user);\n\n\t@Delete(\"DELETE FROM users WHERE id =#{id}\")\n\tvoid delete(Long id);\n\n}"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-annotation-mulidatasource/src/main/java/com/neo/model/User.java",
    "content": "package com.neo.model;\n\nimport java.io.Serializable;\n\nimport com.neo.enums.UserSexEnum;\n\npublic class User implements Serializable {\n\n\tprivate static final long serialVersionUID = 1L;\n\tprivate Long id;\n\tprivate String userName;\n\tprivate String passWord;\n\tprivate UserSexEnum userSex;\n\tprivate String nickName;\n\n\tpublic User() {\n\t\tsuper();\n\t}\n\n\tpublic User(String userName, String passWord, UserSexEnum userSex) {\n\t\tsuper();\n\t\tthis.passWord = passWord;\n\t\tthis.userName = userName;\n\t\tthis.userSex = userSex;\n\t}\n\n\tpublic Long getId() {\n\t\treturn id;\n\t}\n\n\tpublic void setId(Long id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic String getUserName() {\n\t\treturn userName;\n\t}\n\n\tpublic void setUserName(String userName) {\n\t\tthis.userName = userName;\n\t}\n\n\tpublic String getPassWord() {\n\t\treturn passWord;\n\t}\n\n\tpublic void setPassWord(String passWord) {\n\t\tthis.passWord = passWord;\n\t}\n\n\tpublic UserSexEnum getUserSex() {\n\t\treturn userSex;\n\t}\n\n\tpublic void setUserSex(UserSexEnum userSex) {\n\t\tthis.userSex = userSex;\n\t}\n\n\tpublic String getNickName() {\n\t\treturn nickName;\n\t}\n\n\tpublic void setNickName(String nickName) {\n\t\tthis.nickName = nickName;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\t// TODO Auto-generated method stub\n\t\treturn \"userName \" + this.userName + \", pasword \" + this.passWord + \"sex \" + userSex.name();\n\t}\n\n}"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-annotation-mulidatasource/src/main/java/com/neo/web/UserController.java",
    "content": "package com.neo.web;\n\nimport java.util.List;\n\nimport com.neo.mapper.test1.User1Mapper;\nimport com.neo.model.User;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport com.neo.mapper.test2.User2Mapper;\n\n@RestController\npublic class UserController {\n\n    @Autowired\n    private User1Mapper user1Mapper;\n\n\t@Autowired\n\tprivate User2Mapper user2Mapper;\n\t\n\t@RequestMapping(\"/getUsers\")\n\tpublic List<User> getUsers() {\n\t\tList<User> users=user1Mapper.getAll();\n\t\treturn users;\n\t}\n\t\n    @RequestMapping(\"/getUser\")\n    public User getUser(Long id) {\n    \tUser user=user2Mapper.getOne(id);\n        return user;\n    }\n    \n    @RequestMapping(\"/add\")\n    public void save(User user) {\n        user2Mapper.insert(user);\n    }\n    \n    @RequestMapping(value=\"update\")\n    public void update(User user) {\n        user2Mapper.update(user);\n    }\n    \n    @RequestMapping(value=\"/delete/{id}\")\n    public void delete(@PathVariable(\"id\") Long id) {\n        user1Mapper.delete(id);\n    }\n    \n}"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-annotation-mulidatasource/src/main/resources/application.properties",
    "content": "mybatis.type-aliases-package=com.neo.model\n\nspring.datasource.test1.jdbc-url=jdbc:mysql://localhost:3306/test1?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true\nspring.datasource.test1.username=root\nspring.datasource.test1.password=root\nspring.datasource.test1.driver-class-name=com.mysql.cj.jdbc.Driver\n\nspring.datasource.test2.jdbc-url=jdbc:mysql://localhost:3306/test2?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true\nspring.datasource.test2.username=root\nspring.datasource.test2.password=root\nspring.datasource.test2.driver-class-name=com.mysql.cj.jdbc.Driver\n\n"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-annotation-mulidatasource/src/test/java/com/neo/MAMApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class MAMApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t\tSystem.out.println(\"hello world\");\n\t}\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-annotation-mulidatasource/src/test/java/com/neo/mapper/User1MapperTest.java",
    "content": "package com.neo.mapper;\n\nimport java.util.List;\n\nimport com.neo.mapper.test1.User1Mapper;\nimport com.neo.model.User;\nimport org.junit.Assert;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport com.neo.enums.UserSexEnum;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class User1MapperTest {\n\n\t@Autowired\n\tprivate User1Mapper userMapper;\n\n\t@Test\n\tpublic void testInsert() throws Exception {\n\t\tuserMapper.insert(new User(\"aa\", \"a123456\", UserSexEnum.MAN));\n\t\tuserMapper.insert(new User(\"bb\", \"b123456\", UserSexEnum.WOMAN));\n\t\tuserMapper.insert(new User(\"cc\", \"b123456\", UserSexEnum.WOMAN));\n\n\t\tAssert.assertEquals(3, userMapper.getAll().size());\n\t}\n\n\t@Test\n\tpublic void testQuery() throws Exception {\n\t\tList<User> users = userMapper.getAll();\n\t\tif(users==null || users.size()==0){\n\t\t\tSystem.out.println(\"is null\");\n\t\t}else{\n\t\t\tSystem.out.println(users.size());\n\t\t}\n\t}\n\t\n\t\n\t@Test\n\tpublic void testUpdate() throws Exception {\n\t\tUser user = userMapper.getOne(6l);\n\t\tSystem.out.println(user.toString());\n\t\tuser.setNickName(\"neo\");\n\t\tuserMapper.update(user);\n\t\tAssert.assertTrue((\"neo\".equals(userMapper.getOne(6l).getNickName())));\n\t}\n\n}"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-annotation-mulidatasource/src/test/java/com/neo/mapper/User2MapperTest.java",
    "content": "package com.neo.mapper;\n\nimport com.neo.model.User;\nimport com.neo.enums.UserSexEnum;\nimport com.neo.mapper.test2.User2Mapper;\nimport org.junit.Assert;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport java.util.List;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class User2MapperTest {\n\n\t@Autowired\n\tprivate User2Mapper userMapper;\n\n\t@Test\n\tpublic void testInsert() throws Exception {\n\t\tuserMapper.insert(new User(\"aa\", \"a123456\", UserSexEnum.MAN));\n\t\tuserMapper.insert(new User(\"bb\", \"b123456\", UserSexEnum.WOMAN));\n\t\tuserMapper.insert(new User(\"cc\", \"b123456\", UserSexEnum.WOMAN));\n\n\t\tAssert.assertEquals(3, userMapper.getAll().size());\n\t}\n\n\t@Test\n\tpublic void testQuery() throws Exception {\n\t\tList<User> users = userMapper.getAll();\n\t\tif(users==null || users.size()==0){\n\t\t\tSystem.out.println(\"is null\");\n\t\t}else{\n\t\t\tSystem.out.println(users.toString());\n\t\t}\n\t}\n\t\n\t\n\t@Test\n\tpublic void testUpdate() throws Exception {\n\t\tUser user = userMapper.getOne(6l);\n\t\tSystem.out.println(user.toString());\n\t\tuser.setNickName(\"neo\");\n\t\tuserMapper.update(user);\n\t\tAssert.assertTrue((\"neo\".equals(userMapper.getOne(6l).getNickName())));\n\t}\n\n}"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-annotation-mulidatasource/users.sql",
    "content": "/*\nNavicat MySQL Data Transfer\n\nSource Server         : 本地\nSource Server Version : 50505\nSource Host           : localhost:3306\nSource Database       : test1\n\nTarget Server Type    : MYSQL\nTarget Server Version : 50505\nFile Encoding         : 65001\n\nDate: 2016-11-05 21:17:33\n*/\n\nSET FOREIGN_KEY_CHECKS=0;\n\n-- ----------------------------\n-- Table structure for `users`\n-- ----------------------------\nDROP TABLE IF EXISTS `users`;\nCREATE TABLE `users` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',\n  `userName` varchar(32) DEFAULT NULL COMMENT '用户名',\n  `passWord` varchar(32) DEFAULT NULL COMMENT '密码',\n  `user_sex` varchar(32) DEFAULT NULL,\n  `nick_name` varchar(32) DEFAULT NULL,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8;\n\n"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-xml/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-mybatis-xml</artifactId>\n\t<version>1.0.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-mybatis-xml</name>\n\t<description>Demo project for Spring Boot and mybatis</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>2.1.0.RELEASE</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t        <groupId>org.springframework.boot</groupId>\n\t        <artifactId>spring-boot-starter-web</artifactId>\n\t    </dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.mybatis.spring.boot</groupId>\n\t\t\t<artifactId>mybatis-spring-boot-starter</artifactId>\n\t\t\t<version>2.0.0</version>\n\t\t</dependency>\n\t\t<dependency>\n\t        <groupId>mysql</groupId>\n\t        <artifactId>mysql-connector-java</artifactId>\n\t    </dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t</dependencies>\n\t\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\n</project>\n"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-xml/src/main/java/com/neo/MybatisXmlApplication.java",
    "content": "package com.neo;\n\nimport org.mybatis.spring.annotation.MapperScan;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\n@MapperScan(\"com.neo.mapper\")\npublic class MybatisXmlApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(MybatisXmlApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-xml/src/main/java/com/neo/enums/UserSexEnum.java",
    "content": "package com.neo.enums;\n\npublic enum UserSexEnum {\n\tMAN, WOMAN\n}\n"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-xml/src/main/java/com/neo/mapper/UserMapper.java",
    "content": "package com.neo.mapper;\n\nimport java.util.List;\n\nimport com.neo.model.User;\n\npublic interface UserMapper {\n\t\n\tList<User> getAll();\n\t\n\tUser getOne(Long id);\n\n\tvoid insert(User user);\n\n\tvoid update(User user);\n\n\tvoid delete(Long id);\n\n}"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-xml/src/main/java/com/neo/model/User.java",
    "content": "package com.neo.model;\n\nimport java.io.Serializable;\n\nimport com.neo.enums.UserSexEnum;\n\npublic class User implements Serializable {\n\n\tprivate static final long serialVersionUID = 1L;\n\tprivate Long id;\n\tprivate String userName;\n\tprivate String passWord;\n\tprivate UserSexEnum userSex;\n\tprivate String nickName;\n\n\tpublic User() {\n\t\tsuper();\n\t}\n\n\tpublic User(String userName, String passWord, UserSexEnum userSex) {\n\t\tsuper();\n\t\tthis.passWord = passWord;\n\t\tthis.userName = userName;\n\t\tthis.userSex = userSex;\n\t}\n\n\tpublic Long getId() {\n\t\treturn id;\n\t}\n\n\tpublic void setId(Long id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic String getUserName() {\n\t\treturn userName;\n\t}\n\n\tpublic void setUserName(String userName) {\n\t\tthis.userName = userName;\n\t}\n\n\tpublic String getPassWord() {\n\t\treturn passWord;\n\t}\n\n\tpublic void setPassWord(String passWord) {\n\t\tthis.passWord = passWord;\n\t}\n\n\tpublic UserSexEnum getUserSex() {\n\t\treturn userSex;\n\t}\n\n\tpublic void setUserSex(UserSexEnum userSex) {\n\t\tthis.userSex = userSex;\n\t}\n\n\tpublic String getNickName() {\n\t\treturn nickName;\n\t}\n\n\tpublic void setNickName(String nickName) {\n\t\tthis.nickName = nickName;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\t// TODO Auto-generated method stub\n\t\treturn \"userName \" + this.userName + \", pasword \" + this.passWord + \"sex \" + userSex.name();\n\t}\n\n}"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-xml/src/main/java/com/neo/web/UserController.java",
    "content": "package com.neo.web;\n\nimport java.util.List;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport com.neo.model.User;\nimport com.neo.mapper.UserMapper;\n\n@RestController\npublic class UserController {\n\t\n\t@Autowired\n\tprivate UserMapper userMapper;\n\t\n\t@RequestMapping(\"/getUsers\")\n\tpublic List<User> getUsers() {\n\t\tList<User> users=userMapper.getAll();\n\t\treturn users;\n\t}\n\t\n    @RequestMapping(\"/getUser\")\n    public User getUser(Long id) {\n    \tUser user=userMapper.getOne(id);\n        return user;\n    }\n    \n    @RequestMapping(\"/add\")\n    public void save(User user) {\n    \tuserMapper.insert(user);\n    }\n    \n    @RequestMapping(value=\"update\")\n    public void update(User user) {\n    \tuserMapper.update(user);\n    }\n    \n    @RequestMapping(value=\"/delete/{id}\")\n    public void delete(@PathVariable(\"id\") Long id) {\n    \tuserMapper.delete(id);\n    }\n    \n    \n}"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-xml/src/main/resources/application.properties",
    "content": "mybatis.config-location=classpath:mybatis/mybatis-config.xml\nmybatis.mapper-locations=classpath:mybatis/mapper/*.xml\nmybatis.type-aliases-package=com.neo.model\n\nspring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true\nspring.datasource.username=root\nspring.datasource.password=root\nspring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver\n"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-xml/src/main/resources/mybatis/mapper/UserMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >\n<mapper namespace=\"com.neo.mapper.UserMapper\" >\n    <resultMap id=\"BaseResultMap\" type=\"com.neo.model.User\" >\n        <id column=\"id\" property=\"id\" jdbcType=\"BIGINT\" />\n        <result column=\"userName\" property=\"userName\" jdbcType=\"VARCHAR\" />\n        <result column=\"passWord\" property=\"passWord\" jdbcType=\"VARCHAR\" />\n        <result column=\"user_sex\" property=\"userSex\" javaType=\"com.neo.enums.UserSexEnum\"/>\n        <result column=\"nick_name\" property=\"nickName\" jdbcType=\"VARCHAR\" />\n    </resultMap>\n    \n    <sql id=\"Base_Column_List\" >\n        id, userName, passWord, user_sex, nick_name\n    </sql>\n\n    <select id=\"getAll\" resultMap=\"BaseResultMap\"  >\n       SELECT \n       <include refid=\"Base_Column_List\" />\n\t   FROM users\n    </select>\n\n    <select id=\"getOne\" parameterType=\"java.lang.Long\" resultMap=\"BaseResultMap\" >\n        SELECT \n       <include refid=\"Base_Column_List\" />\n\t   FROM users\n\t   WHERE id = #{id}\n    </select>\n\n    <insert id=\"insert\" parameterType=\"com.neo.model.User\" >\n       INSERT INTO \n       \t\tusers\n       \t\t(userName,passWord,user_sex) \n       \tVALUES\n       \t\t(#{userName}, #{passWord}, #{userSex})\n    </insert>\n    \n    <update id=\"update\" parameterType=\"com.neo.model.User\" >\n       UPDATE \n       \t\tusers \n       SET \n       \t<if test=\"userName != null\">userName = #{userName},</if>\n       \t<if test=\"passWord != null\">passWord = #{passWord},</if>\n       \tnick_name = #{nickName}\n       WHERE \n       \t\tid = #{id}\n    </update>\n    \n    <delete id=\"delete\" parameterType=\"java.lang.Long\" >\n       DELETE FROM\n       \t\t users \n       WHERE \n       \t\t id =#{id}\n    </delete>\n\n</mapper>"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-xml/src/main/resources/mybatis/mybatis-config.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE configuration PUBLIC \"-//mybatis.org//DTD Config 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-config.dtd\">\n<configuration>\n\t<typeAliases>\n\t\t<typeAlias alias=\"Integer\" type=\"java.lang.Integer\" />\n\t\t<typeAlias alias=\"Long\" type=\"java.lang.Long\" />\n\t\t<typeAlias alias=\"HashMap\" type=\"java.util.HashMap\" />\n\t\t<typeAlias alias=\"LinkedHashMap\" type=\"java.util.LinkedHashMap\" />\n\t\t<typeAlias alias=\"ArrayList\" type=\"java.util.ArrayList\" />\n\t\t<typeAlias alias=\"LinkedList\" type=\"java.util.LinkedList\" />\n\t</typeAliases>\n</configuration>"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-xml/src/test/java/com/neo/MybatisXmlApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class MybatisXmlApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t\tSystem.out.println(\"hello world\");\n\t}\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-xml/src/test/java/com/neo/mapper/UserMapperTest.java",
    "content": "package com.neo.mapper;\n\nimport java.util.List;\n\nimport org.junit.Assert;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport com.neo.model.User;\nimport com.neo.enums.UserSexEnum;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class UserMapperTest {\n\n\t@Autowired\n\tprivate UserMapper userMapper;\n\n\t@Test\n\tpublic void testInsert() throws Exception {\n\t\tuserMapper.insert(new User(\"aa\", \"a123456\", UserSexEnum.MAN));\n\t\tuserMapper.insert(new User(\"bb\", \"b123456\", UserSexEnum.WOMAN));\n\t\tuserMapper.insert(new User(\"cc\", \"b123456\", UserSexEnum.WOMAN));\n\n\t\tAssert.assertEquals(3, userMapper.getAll().size());\n\t}\n\n\t@Test\n\tpublic void testQuery() throws Exception {\n\t\tList<User> users = userMapper.getAll();\n\t\tif(users==null || users.size()==0){\n\t\t\tSystem.out.println(\"is null\");\n\t\t}else{\n\t\t\tSystem.out.println(users.toString());\n\t\t}\n\t}\n\t\n\t\n\t@Test\n\tpublic void testUpdate() throws Exception {\n\t\tUser user = userMapper.getOne(6l);\n\t\tSystem.out.println(user.toString());\n\t\tuser.setNickName(\"neo\");\n\t\tuserMapper.update(user);\n\t\tAssert.assertTrue((\"neo\".equals(userMapper.getOne(6l).getNickName())));\n\t}\n\n}"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-xml/src/test/java/com/neo/web/UserControllerTest.java",
    "content": "package com.neo.web;\n\n\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.http.MediaType;\nimport org.springframework.test.context.junit4.SpringRunner;\nimport org.springframework.test.web.servlet.MockMvc;\nimport org.springframework.test.web.servlet.request.MockMvcRequestBuilders;\nimport org.springframework.test.web.servlet.setup.MockMvcBuilders;\nimport org.springframework.web.context.WebApplicationContext;\n\nimport static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class UserControllerTest {\n    @Autowired\n    private WebApplicationContext wac;\n    private MockMvc mockMvc;\n\n    @Before\n    public void setUp() throws Exception {\n        mockMvc = MockMvcBuilders.webAppContextSetup(wac).build(); //初始化MockMvc对象\n    }\n\n    @Test\n    public void getUsers() throws Exception {\n        mockMvc.perform(MockMvcRequestBuilders.post(\"/getUsers\")\n                .accept(MediaType.APPLICATION_JSON_UTF8)).andDo(print());\n    }\n\n}"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-xml/users.sql",
    "content": "/*\nNavicat MySQL Data Transfer\n\nSource Server         : 本地\nSource Server Version : 50505\nSource Host           : localhost:3306\nSource Database       : test1\n\nTarget Server Type    : MYSQL\nTarget Server Version : 50505\nFile Encoding         : 65001\n\nDate: 2016-11-05 21:17:33\n*/\n\nSET FOREIGN_KEY_CHECKS=0;\n\n-- ----------------------------\n-- Table structure for `users`\n-- ----------------------------\nDROP TABLE IF EXISTS `users`;\nCREATE TABLE `users` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',\n  `userName` varchar(32) DEFAULT NULL COMMENT '用户名',\n  `passWord` varchar(32) DEFAULT NULL COMMENT '密码',\n  `user_sex` varchar(32) DEFAULT NULL,\n  `nick_name` varchar(32) DEFAULT NULL,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8;\n\n"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-xml-mulidatasource/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-mybatis-xml-mulidatasource</artifactId>\n\t<version>1.0.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-mybatis-xml-mulidatasource</name>\n\t<description>Demo project for Spring Boot and mybatis</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>2.1.0.RELEASE</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t        <groupId>org.springframework.boot</groupId>\n\t        <artifactId>spring-boot-starter-web</artifactId>\n\t    </dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.mybatis.spring.boot</groupId>\n\t\t\t<artifactId>mybatis-spring-boot-starter</artifactId>\n\t\t\t<version>2.0.0</version>\n\t\t</dependency>\n\t     <dependency>\n\t        <groupId>mysql</groupId>\n\t        <artifactId>mysql-connector-java</artifactId>\n\t    </dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t</dependencies>\n\t\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\t\n</project>\n"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-xml-mulidatasource/src/main/java/com/neo/MXMApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class MXMApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(MXMApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-xml-mulidatasource/src/main/java/com/neo/datasource/DataSource1Config.java",
    "content": "package com.neo.datasource;\n\nimport org.apache.ibatis.session.SqlSessionFactory;\nimport org.mybatis.spring.SqlSessionFactoryBean;\nimport org.mybatis.spring.SqlSessionTemplate;\nimport org.mybatis.spring.annotation.MapperScan;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.boot.context.properties.ConfigurationProperties;\nimport org.springframework.boot.jdbc.DataSourceBuilder;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.context.annotation.Primary;\nimport org.springframework.core.io.support.PathMatchingResourcePatternResolver;\nimport org.springframework.jdbc.datasource.DataSourceTransactionManager;\n\nimport javax.sql.DataSource;\n\n/**\n * Created by summer on 2016/11/25.\n */\n@Configuration\n@MapperScan(basePackages = \"com.neo.mapper.test1\", sqlSessionTemplateRef  = \"test1SqlSessionTemplate\")\npublic class DataSource1Config {\n\n    @Bean(name = \"test1DataSource\")\n    @ConfigurationProperties(prefix = \"spring.datasource.test1\")\n    @Primary\n    public DataSource testDataSource() {\n        return DataSourceBuilder.create().build();\n    }\n\n    @Bean(name = \"test1SqlSessionFactory\")\n    @Primary\n    public SqlSessionFactory testSqlSessionFactory(@Qualifier(\"test1DataSource\") DataSource dataSource) throws Exception {\n        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();\n        bean.setDataSource(dataSource);\n        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(\"classpath:mybatis/mapper/test1/*.xml\"));\n        return bean.getObject();\n    }\n\n    @Bean(name = \"test1TransactionManager\")\n    @Primary\n    public DataSourceTransactionManager testTransactionManager(@Qualifier(\"test1DataSource\") DataSource dataSource) {\n        return new DataSourceTransactionManager(dataSource);\n    }\n\n    @Bean(name = \"test1SqlSessionTemplate\")\n    @Primary\n    public SqlSessionTemplate testSqlSessionTemplate(@Qualifier(\"test1SqlSessionFactory\") SqlSessionFactory sqlSessionFactory) throws Exception {\n        return new SqlSessionTemplate(sqlSessionFactory);\n    }\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-xml-mulidatasource/src/main/java/com/neo/datasource/DataSource2Config.java",
    "content": "package com.neo.datasource;\n\nimport org.apache.ibatis.session.SqlSessionFactory;\nimport org.mybatis.spring.SqlSessionFactoryBean;\nimport org.mybatis.spring.SqlSessionTemplate;\nimport org.mybatis.spring.annotation.MapperScan;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.boot.context.properties.ConfigurationProperties;\nimport org.springframework.boot.jdbc.DataSourceBuilder;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.core.io.support.PathMatchingResourcePatternResolver;\nimport org.springframework.jdbc.datasource.DataSourceTransactionManager;\n\nimport javax.sql.DataSource;\n\n/**\n * Created by summer on 2016/11/25.\n */\n@Configuration\n@MapperScan(basePackages = \"com.neo.mapper.test2\", sqlSessionTemplateRef  = \"test2SqlSessionTemplate\")\npublic class DataSource2Config {\n\n    @Bean(name = \"test2DataSource\")\n    @ConfigurationProperties(prefix = \"spring.datasource.test2\")\n    public DataSource testDataSource() {\n        return DataSourceBuilder.create().build();\n    }\n\n    @Bean(name = \"test2SqlSessionFactory\")\n    public SqlSessionFactory testSqlSessionFactory(@Qualifier(\"test2DataSource\") DataSource dataSource) throws Exception {\n        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();\n        bean.setDataSource(dataSource);\n        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(\"classpath:mybatis/mapper/test2/*.xml\"));\n        return bean.getObject();\n    }\n\n    @Bean(name = \"test2TransactionManager\")\n    public DataSourceTransactionManager testTransactionManager(@Qualifier(\"test2DataSource\") DataSource dataSource) {\n        return new DataSourceTransactionManager(dataSource);\n    }\n\n    @Bean(name = \"test2SqlSessionTemplate\")\n    public SqlSessionTemplate testSqlSessionTemplate(@Qualifier(\"test2SqlSessionFactory\") SqlSessionFactory sqlSessionFactory) throws Exception {\n        return new SqlSessionTemplate(sqlSessionFactory);\n    }\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-xml-mulidatasource/src/main/java/com/neo/enums/UserSexEnum.java",
    "content": "package com.neo.enums;\n\npublic enum UserSexEnum {\n\tMAN, WOMAN\n}\n"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-xml-mulidatasource/src/main/java/com/neo/mapper/test1/User1Mapper.java",
    "content": "package com.neo.mapper.test1;\n\nimport com.neo.model.User;\n\nimport java.util.List;\n\npublic interface User1Mapper {\n\t\n\tList<User> getAll();\n\t\n\tUser getOne(Long id);\n\n\tvoid insert(User user);\n\n\tvoid update(User user);\n\n\tvoid delete(Long id);\n\n}"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-xml-mulidatasource/src/main/java/com/neo/mapper/test2/User2Mapper.java",
    "content": "package com.neo.mapper.test2;\n\nimport java.util.List;\n\nimport com.neo.model.User;\n\npublic interface User2Mapper {\n\t\n\tList<User> getAll();\n\t\n\tUser getOne(Long id);\n\n\tvoid insert(User user);\n\n\tvoid update(User user);\n\n\tvoid delete(Long id);\n\n}"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-xml-mulidatasource/src/main/java/com/neo/model/User.java",
    "content": "package com.neo.model;\n\nimport java.io.Serializable;\n\nimport com.neo.enums.UserSexEnum;\n\npublic class User implements Serializable {\n\n\tprivate static final long serialVersionUID = 1L;\n\tprivate Long id;\n\tprivate String userName;\n\tprivate String passWord;\n\tprivate UserSexEnum userSex;\n\tprivate String nickName;\n\n\tpublic User() {\n\t\tsuper();\n\t}\n\n\tpublic User(String userName, String passWord, UserSexEnum userSex) {\n\t\tsuper();\n\t\tthis.passWord = passWord;\n\t\tthis.userName = userName;\n\t\tthis.userSex = userSex;\n\t}\n\n\tpublic Long getId() {\n\t\treturn id;\n\t}\n\n\tpublic void setId(Long id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic String getUserName() {\n\t\treturn userName;\n\t}\n\n\tpublic void setUserName(String userName) {\n\t\tthis.userName = userName;\n\t}\n\n\tpublic String getPassWord() {\n\t\treturn passWord;\n\t}\n\n\tpublic void setPassWord(String passWord) {\n\t\tthis.passWord = passWord;\n\t}\n\n\tpublic UserSexEnum getUserSex() {\n\t\treturn userSex;\n\t}\n\n\tpublic void setUserSex(UserSexEnum userSex) {\n\t\tthis.userSex = userSex;\n\t}\n\n\tpublic String getNickName() {\n\t\treturn nickName;\n\t}\n\n\tpublic void setNickName(String nickName) {\n\t\tthis.nickName = nickName;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\t// TODO Auto-generated method stub\n\t\treturn \"userName \" + this.userName + \", pasword \" + this.passWord + \"sex \" + userSex.name();\n\t}\n\n}"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-xml-mulidatasource/src/main/java/com/neo/web/UserController.java",
    "content": "package com.neo.web;\n\nimport java.util.List;\n\nimport com.neo.mapper.test1.User1Mapper;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport com.neo.model.User;\nimport com.neo.mapper.test2.User2Mapper;\n\n@RestController\npublic class UserController {\n\n    @Autowired\n    private User1Mapper user1Mapper;\n\n\t@Autowired\n\tprivate User2Mapper user2Mapper;\n\t\n\t@RequestMapping(\"/getUsers\")\n\tpublic List<User> getUsers() {\n\t\tList<User> users=user1Mapper.getAll();\n\t\treturn users;\n\t}\n\t\n    @RequestMapping(\"/getUser\")\n    public User getUser(Long id) {\n    \tUser user=user2Mapper.getOne(id);\n        return user;\n    }\n    \n    @RequestMapping(\"/add\")\n    public void save(User user) {\n        user2Mapper.insert(user);\n    }\n    \n    @RequestMapping(value=\"update\")\n    public void update(User user) {\n        user2Mapper.update(user);\n    }\n    \n    @RequestMapping(value=\"/delete/{id}\")\n    public void delete(@PathVariable(\"id\") Long id) {\n        user1Mapper.delete(id);\n    }\n    \n    \n}"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-xml-mulidatasource/src/main/resources/application.properties",
    "content": "mybatis.config-location=classpath:mybatis/mybatis-config.xml\n\nspring.datasource.test1.jdbc-url=jdbc:mysql://localhost:3306/test1?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true\nspring.datasource.test1.username=root\nspring.datasource.test1.password=root\nspring.datasource.test1.driver-class-name=com.mysql.cj.jdbc.Driver\n\nspring.datasource.test2.jdbc-url=jdbc:mysql://localhost:3306/test2?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true\nspring.datasource.test2.username=root\nspring.datasource.test2.password=root\nspring.datasource.test2.driver-class-name=com.mysql.cj.jdbc.Driver\n"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-xml-mulidatasource/src/main/resources/mybatis/mapper/test1/UserMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >\n<mapper namespace=\"com.neo.mapper.test1.User1Mapper\" >\n    <resultMap id=\"BaseResultMap\" type=\"com.neo.model.User\" >\n        <id column=\"id\" property=\"id\" jdbcType=\"BIGINT\" />\n        <result column=\"userName\" property=\"userName\" jdbcType=\"VARCHAR\" />\n        <result column=\"passWord\" property=\"passWord\" jdbcType=\"VARCHAR\" />\n        <result column=\"user_sex\" property=\"userSex\" javaType=\"com.neo.enums.UserSexEnum\"/>\n        <result column=\"nick_name\" property=\"nickName\" jdbcType=\"VARCHAR\" />\n    </resultMap>\n    \n    <sql id=\"Base_Column_List\" >\n        id, userName, passWord, user_sex, nick_name\n    </sql>\n\n    <select id=\"getAll\" resultMap=\"BaseResultMap\"  >\n       SELECT \n       <include refid=\"Base_Column_List\" />\n\t   FROM users\n    </select>\n\n    <select id=\"getOne\" parameterType=\"java.lang.Long\" resultMap=\"BaseResultMap\" >\n        SELECT \n       <include refid=\"Base_Column_List\" />\n\t   FROM users\n\t   WHERE id = #{id}\n    </select>\n\n    <insert id=\"insert\" parameterType=\"com.neo.model.User\" >\n       INSERT INTO \n       \t\tusers\n       \t\t(userName,passWord,user_sex) \n       \tVALUES\n       \t\t(#{userName}, #{passWord}, #{userSex})\n    </insert>\n    \n    <update id=\"update\" parameterType=\"com.neo.model.User\" >\n       UPDATE \n       \t\tusers \n       SET \n       \t<if test=\"userName != null\">userName = #{userName},</if>\n       \t<if test=\"passWord != null\">passWord = #{passWord},</if>\n       \tnick_name = #{nickName}\n       WHERE \n       \t\tid = #{id}\n    </update>\n    \n    <delete id=\"delete\" parameterType=\"java.lang.Long\" >\n       DELETE FROM\n       \t\t users \n       WHERE \n       \t\t id =#{id}\n    </delete>\n\n</mapper>"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-xml-mulidatasource/src/main/resources/mybatis/mapper/test2/UserMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >\n<mapper namespace=\"com.neo.mapper.test2.User2Mapper\" >\n    <resultMap id=\"BaseResultMap\" type=\"com.neo.model.User\" >\n        <id column=\"id\" property=\"id\" jdbcType=\"BIGINT\" />\n        <result column=\"userName\" property=\"userName\" jdbcType=\"VARCHAR\" />\n        <result column=\"passWord\" property=\"passWord\" jdbcType=\"VARCHAR\" />\n        <result column=\"user_sex\" property=\"userSex\" javaType=\"com.neo.enums.UserSexEnum\"/>\n        <result column=\"nick_name\" property=\"nickName\" jdbcType=\"VARCHAR\" />\n    </resultMap>\n    \n    <sql id=\"Base_Column_List\" >\n        id, userName, passWord, user_sex, nick_name\n    </sql>\n\n    <select id=\"getAll\" resultMap=\"BaseResultMap\"  >\n       SELECT \n       <include refid=\"Base_Column_List\" />\n\t   FROM users\n    </select>\n\n    <select id=\"getOne\" parameterType=\"java.lang.Long\" resultMap=\"BaseResultMap\" >\n        SELECT \n       <include refid=\"Base_Column_List\" />\n\t   FROM users\n\t   WHERE id = #{id}\n    </select>\n\n    <insert id=\"insert\" parameterType=\"com.neo.model.User\" >\n       INSERT INTO \n       \t\tusers\n       \t\t(userName,passWord,user_sex) \n       \tVALUES\n       \t\t(#{userName}, #{passWord}, #{userSex})\n    </insert>\n    \n    <update id=\"update\" parameterType=\"com.neo.model.User\" >\n       UPDATE \n       \t\tusers \n       SET \n       \t<if test=\"userName != null\">userName = #{userName},</if>\n       \t<if test=\"passWord != null\">passWord = #{passWord},</if>\n       \tnick_name = #{nickName}\n       WHERE \n       \t\tid = #{id}\n    </update>\n    \n    <delete id=\"delete\" parameterType=\"java.lang.Long\" >\n       DELETE FROM\n       \t\t users \n       WHERE \n       \t\t id =#{id}\n    </delete>\n\n</mapper>"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-xml-mulidatasource/src/main/resources/mybatis/mybatis-config.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE configuration PUBLIC \"-//mybatis.org//DTD Config 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-config.dtd\">\n<configuration>\n\t<typeAliases>\n\t\t<typeAlias alias=\"Integer\" type=\"java.lang.Integer\" />\n\t\t<typeAlias alias=\"Long\" type=\"java.lang.Long\" />\n\t\t<typeAlias alias=\"HashMap\" type=\"java.util.HashMap\" />\n\t\t<typeAlias alias=\"LinkedHashMap\" type=\"java.util.LinkedHashMap\" />\n\t\t<typeAlias alias=\"ArrayList\" type=\"java.util.ArrayList\" />\n\t\t<typeAlias alias=\"LinkedList\" type=\"java.util.LinkedList\" />\n\t</typeAliases>\n</configuration>"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-xml-mulidatasource/src/test/java/com/neo/MXMApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class MXMApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t\tSystem.out.println(\"hello world\");\n\t}\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-xml-mulidatasource/src/test/java/com/neo/mapper/User1MapperTest.java",
    "content": "package com.neo.mapper;\n\nimport java.util.List;\n\nimport com.neo.mapper.test1.User1Mapper;\nimport org.junit.Assert;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport com.neo.model.User;\nimport com.neo.enums.UserSexEnum;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class User1MapperTest {\n\n\t@Autowired\n\tprivate User1Mapper userMapper;\n\n\t@Test\n\tpublic void testInsert() throws Exception {\n\t\tuserMapper.insert(new User(\"aa\", \"a123456\", UserSexEnum.MAN));\n\t\tuserMapper.insert(new User(\"bb\", \"b123456\", UserSexEnum.WOMAN));\n\t\tuserMapper.insert(new User(\"cc\", \"b123456\", UserSexEnum.WOMAN));\n\n\t\tAssert.assertEquals(3, userMapper.getAll().size());\n\t}\n\n\t@Test\n\tpublic void testQuery() throws Exception {\n\t\tList<User> users = userMapper.getAll();\n\t\tif(users==null || users.size()==0){\n\t\t\tSystem.out.println(\"is null\");\n\t\t}else{\n\t\t\tSystem.out.println(users.size());\n\t\t}\n\t}\n\t\n\t\n\t@Test\n\tpublic void testUpdate() throws Exception {\n\t\tUser user = userMapper.getOne(6l);\n\t\tSystem.out.println(user.toString());\n\t\tuser.setNickName(\"neo\");\n\t\tuserMapper.update(user);\n\t\tAssert.assertTrue((\"neo\".equals(userMapper.getOne(6l).getNickName())));\n\t}\n\n}"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-xml-mulidatasource/src/test/java/com/neo/mapper/User2MapperTest.java",
    "content": "package com.neo.mapper;\n\nimport com.neo.model.User;\nimport com.neo.enums.UserSexEnum;\nimport com.neo.mapper.test2.User2Mapper;\nimport org.junit.Assert;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport java.util.List;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class User2MapperTest {\n\n\t@Autowired\n\tprivate User2Mapper userMapper;\n\n\t@Test\n\tpublic void testInsert() throws Exception {\n\t\tuserMapper.insert(new User(\"aa\", \"a123456\", UserSexEnum.MAN));\n\t\tuserMapper.insert(new User(\"bb\", \"b123456\", UserSexEnum.WOMAN));\n\t\tuserMapper.insert(new User(\"cc\", \"b123456\", UserSexEnum.WOMAN));\n\n\t\tAssert.assertEquals(3, userMapper.getAll().size());\n\t}\n\n\t@Test\n\tpublic void testQuery() throws Exception {\n\t\tList<User> users = userMapper.getAll();\n\t\tif(users==null || users.size()==0){\n\t\t\tSystem.out.println(\"is null\");\n\t\t}else{\n\t\t\tSystem.out.println(users.toString());\n\t\t}\n\t}\n\t\n\t\n\t@Test\n\tpublic void testUpdate() throws Exception {\n\t\tUser user = userMapper.getOne(6l);\n\t\tSystem.out.println(user.toString());\n\t\tuser.setNickName(\"neo\");\n\t\tuserMapper.update(user);\n\t\tAssert.assertTrue((\"neo\".equals(userMapper.getOne(6l).getNickName())));\n\t}\n\n}"
  },
  {
    "path": "2.x/spring-boot-mybatis/spring-boot-mybatis-xml-mulidatasource/users.sql",
    "content": "/*\nNavicat MySQL Data Transfer\n\nSource Server         : 本地\nSource Server Version : 50505\nSource Host           : localhost:3306\nSource Database       : test1\n\nTarget Server Type    : MYSQL\nTarget Server Version : 50505\nFile Encoding         : 65001\n\nDate: 2016-11-05 21:17:33\n*/\n\nSET FOREIGN_KEY_CHECKS=0;\n\n-- ----------------------------\n-- Table structure for `users`\n-- ----------------------------\nDROP TABLE IF EXISTS `users`;\nCREATE TABLE `users` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',\n  `userName` varchar(32) DEFAULT NULL COMMENT '用户名',\n  `passWord` varchar(32) DEFAULT NULL COMMENT '密码',\n  `user_sex` varchar(32) DEFAULT NULL,\n  `nick_name` varchar(32) DEFAULT NULL,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8;\n\n"
  },
  {
    "path": "2.x/spring-boot-mybatis-plus/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.example</groupId>\n\t<artifactId>spring-boot-mybatis-plus</artifactId>\n\t<version>1.0.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>Spring Boot MyBatis Plus</name>\n\t<description>Spring Boot 2 Demo</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>2.1.4.RELEASE</version>\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.projectlombok</groupId>\n\t\t\t<artifactId>lombok</artifactId>\n\t\t\t<optional>true</optional>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>com.baomidou</groupId>\n\t\t\t<artifactId>mybatis-plus-boot-starter</artifactId>\n\t\t\t<version>3.1.1</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>com.h2database</groupId>\n\t\t\t<artifactId>h2</artifactId>\n\t\t\t<scope>runtime</scope>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t</dependencies>\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\n</project>\n"
  },
  {
    "path": "2.x/spring-boot-mybatis-plus/src/main/java/com/neo/MyBatisPlusApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class MyBatisPlusApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(MyBatisPlusApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "2.x/spring-boot-mybatis-plus/src/main/java/com/neo/config/MybatisPlusConfig.java",
    "content": "package com.neo.config;\n\nimport com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;\nimport org.mybatis.spring.annotation.MapperScan;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n@Configuration\n@MapperScan(\"com.neo.mapper\")\npublic class MybatisPlusConfig {\n\n    /**\n     * 分页插件\n     */\n    @Bean\n    public PaginationInterceptor paginationInterceptor() {\n        return new PaginationInterceptor();\n    }\n}"
  },
  {
    "path": "2.x/spring-boot-mybatis-plus/src/main/java/com/neo/mapper/UserMapper.java",
    "content": "package com.neo.mapper;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport com.neo.model.User;\n\npublic interface UserMapper extends BaseMapper<User> {\n\n}"
  },
  {
    "path": "2.x/spring-boot-mybatis-plus/src/main/java/com/neo/model/User.java",
    "content": "package com.neo.model;\n\nimport lombok.Data;\n\n@Data\npublic class User {\n    private Long id;\n    private String name;\n    private Integer age;\n    private String email;\n}"
  },
  {
    "path": "2.x/spring-boot-mybatis-plus/src/main/resources/application.yml",
    "content": "# DataSource Config\nspring:\n    datasource:\n        driver-class-name: org.h2.Driver\n        schema: classpath:db/schema-h2.sql\n        data: classpath:db/data-h2.sql\n        url: jdbc:h2:mem:test\n        username: root\n        password: test\n\n# Logger Config\nlogging:\n    level:\n      com.neo: debug\n"
  },
  {
    "path": "2.x/spring-boot-mybatis-plus/src/main/resources/db/data-h2.sql",
    "content": "DELETE FROM user;\n\nINSERT INTO user (id, name, age, email) VALUES\n(1, 'neo', 18, 'smile1@ityouknow.com'),\n(2, 'keep', 36, 'smile@ityouknow.com'),\n(3, 'pure', 28, 'smile@ityouknow.com'),\n(4, 'smile', 21, 'smile@ityouknow.com'),\n(5, 'it', 24, 'smile@ityouknow.com');"
  },
  {
    "path": "2.x/spring-boot-mybatis-plus/src/main/resources/db/schema-h2.sql",
    "content": "DROP TABLE IF EXISTS user;\n\nCREATE TABLE user\n(\n\tid BIGINT(20) NOT NULL COMMENT '主键ID',\n\tname VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',\n\tage INT(11) NULL DEFAULT NULL COMMENT '年龄',\n\temail VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',\n\tPRIMARY KEY (id)\n);"
  },
  {
    "path": "2.x/spring-boot-mybatis-plus/src/test/java/com/neo/MyBatisPlusApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class MyBatisPlusApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t}\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-mybatis-plus/src/test/java/com/neo/MyBatisPlusTest.java",
    "content": "package com.neo;\n\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.core.toolkit.CollectionUtils;\nimport com.baomidou.mybatisplus.core.toolkit.Wrappers;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com.neo.mapper.UserMapper;\nimport com.neo.model.User;\nimport org.junit.Assert;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport java.util.List;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class MyBatisPlusTest {\n\n    @Autowired\n    private UserMapper userMapper;\n\n\n    @Test\n    public void testSelectOne() {\n        User user = userMapper.selectById(1L);\n        System.out.println(user);\n    }\n\n    @Test\n    public void testInsert() {\n        User user = new User();\n        user.setName(\"微笑\");\n        user.setAge(3);\n        user.setEmail(\"neo@tooool.org\");\n        assertThat(userMapper.insert(user)).isGreaterThan(0);\n        // 成功直接拿会写的 ID\n        assertThat(user.getId()).isNotNull();\n    }\n\n    @Test\n    public void testDelete() {\n        assertThat(userMapper.deleteById(3L)).isGreaterThan(0);\n        assertThat(userMapper.delete(new QueryWrapper<User>()\n                .lambda().eq(User::getName, \"smile\"))).isGreaterThan(0);\n    }\n\n    @Test\n    public void testUpdate() {\n        User user = userMapper.selectById(2);\n        assertThat(user.getAge()).isEqualTo(36);\n        assertThat(user.getName()).isEqualTo(\"keep\");\n\n        userMapper.update(\n                null,\n                Wrappers.<User>lambdaUpdate().set(User::getEmail, \"123@123\").eq(User::getId, 2)\n        );\n        assertThat(userMapper.selectById(2).getEmail()).isEqualTo(\"123@123\");\n    }\n\n    @Test\n    public void testSelect() {\n        List<User> userList = userMapper.selectList(null);\n        Assert.assertEquals(5, userList.size());\n        userList.forEach(System.out::println);\n    }\n\n    @Test\n    public void testSelectCondition() {\n        QueryWrapper<User> wrapper = new QueryWrapper<>();\n        wrapper.select(\"max(id) as id\");\n        List<User> userList = userMapper.selectList(wrapper);\n        userList.forEach(System.out::println);\n    }\n\n    @Test\n    public void testPage() {\n        System.out.println(\"----- baseMapper 自带分页 ------\");\n        Page<User> page = new Page<>(1, 2);\n        IPage<User> userIPage = userMapper.selectPage(page, new QueryWrapper<User>()\n                .gt(\"age\", 6));\n        assertThat(page).isSameAs(userIPage);\n        System.out.println(\"总条数 ------> \" + userIPage.getTotal());\n        System.out.println(\"当前页数 ------> \" + userIPage.getCurrent());\n        System.out.println(\"当前每页显示数 ------> \" + userIPage.getSize());\n        print(userIPage.getRecords());\n        System.out.println(\"----- baseMapper 自带分页 ------\");\n    }\n\n    private <T> void print(List<T> list) {\n        if (!CollectionUtils.isEmpty(list)) {\n            list.forEach(System.out::println);\n        }\n    }\n\n\n}"
  },
  {
    "path": "2.x/spring-boot-package/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-package</artifactId>\n\t<version>1.0.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-package</name>\n\t<description>Demo project for Spring Boot package war</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>2.1.0.RELEASE</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-web</artifactId>\n\t\t</dependency>\n<!--\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-tomcat</artifactId>\n\t\t\t<scope>provided</scope>\n\t\t</dependency>-->\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t</dependencies>\n\t\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\t\n\n</project>\n"
  },
  {
    "path": "2.x/spring-boot-package/src/main/java/com/neo/PackageApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.boot.builder.SpringApplicationBuilder;\nimport org.springframework.boot.web.servlet.support.SpringBootServletInitializer;\n\n@SpringBootApplication\npublic class PackageApplication extends SpringBootServletInitializer {\n\n\t@Override\n\tprotected SpringApplicationBuilder configure(SpringApplicationBuilder application) {\n\t\treturn application.sources(PackageApplication.class);\n\t}\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(PackageApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "2.x/spring-boot-package/src/main/java/com/neo/controller/HelloController.java",
    "content": "package com.neo.controller;\n\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n@RestController\npublic class HelloController {\n\t\n    @RequestMapping(\"/hello\")\n    public String index() {\n        return \"Hello World\";\n    }\n}"
  },
  {
    "path": "2.x/spring-boot-package/src/main/resources/application-dev.properties",
    "content": "info.app.name=spring-boot-test\ninfo.app.version= 1.0.0"
  },
  {
    "path": "2.x/spring-boot-package/src/main/resources/application-pro.properties",
    "content": "info.app.name=spring-boot-pro\ninfo.app.version= 1.0.0"
  },
  {
    "path": "2.x/spring-boot-package/src/main/resources/application-test.properties",
    "content": "info.app.name=spring-boot-uat\ninfo.app.version= 1.0.0"
  },
  {
    "path": "2.x/spring-boot-package/src/main/resources/application.properties",
    "content": "# \\u9879\\u76EEcontextPath\\uFF0C\\u4E00\\u822C\\u4E0D\\u914D\\u7F6E\n#server.servlet.context-path=/myspringboot\n# \\u9519\\u8BEF\\u9875\\uFF0C\\u6307\\u5B9A\\u53D1\\u751F\\u9519\\u8BEF\\u65F6\\uFF0C\\u8DF3\\u8F6C\\u7684URL\\u3002\nserver.error.path=/error\n# \\u670D\\u52A1\\u7AEF\\u53E3\nserver.port=8080\n# session\\u6700\\u5927\\u8D85\\u65F6\\u65F6\\u95F4(\\u5206\\u949F)\\uFF0C\\u9ED8\\u8BA4\\u4E3A30\nserver.session-timeout=60\n# \\u8BE5\\u670D\\u52A1\\u7ED1\\u5B9AIP\\u5730\\u5740\\uFF0C\\u542F\\u52A8\\u670D\\u52A1\\u5668\\u65F6\\u5982\\u672C\\u673A\\u4E0D\\u662F\\u8BE5IP\\u5730\\u5740\\u5219\\u629B\\u51FA\\u5F02\\u5E38\\u542F\\u52A8\\u5931\\u8D25\\uFF0C\\u53EA\\u6709\\u7279\\u6B8A\\u9700\\u6C42\\u7684\\u60C5\\u51B5\\u4E0B\\u624D\\u914D\\u7F6E\n#server.address=192.168.0.6\n\n# tomcat \\u6700\\u5927\\u7EBF\\u7A0B\\u6570\\uFF0C\\u9ED8\\u8BA4\\u4E3A200\nserver.tomcat.max-threads=600\n# tomcat\\u7684URI\\u7F16\\u7801\nserver.tomcat.uri-encoding=UTF-8\n# \\u5B58\\u653ETomcat\\u7684\\u65E5\\u5FD7\\u3001Dump\\u7B49\\u6587\\u4EF6\\u7684\\u4E34\\u65F6\\u6587\\u4EF6\\u5939\\uFF0C\\u9ED8\\u8BA4\\u4E3A\\u7CFB\\u7EDF\\u7684tmp\\u6587\\u4EF6\\u5939\nserver.tomcat.basedir=/tmp/log\n# \\u6253\\u5F00Tomcat\\u7684Access\\u65E5\\u5FD7\\uFF0C\\u5E76\\u53EF\\u4EE5\\u8BBE\\u7F6E\\u65E5\\u5FD7\\u683C\\u5F0F\n#server.tomcat.access-log-enabled=true\n#server.tomcat.access-log-pattern=\n# accesslog\\u76EE\\u5F55\\uFF0C\\u9ED8\\u8BA4\\u5728basedir/logs\n#server.tomcat.accesslog.directory=\n# \\u65E5\\u5FD7\\u6587\\u4EF6\\u76EE\\u5F55\nlogging.path=/tmp/log\n# \\u65E5\\u5FD7\\u6587\\u4EF6\\u540D\\u79F0\\uFF0C\\u9ED8\\u8BA4\\u4E3Aspring.log\nlogging.file=myapp.log"
  },
  {
    "path": "2.x/spring-boot-package/src/test/java/com/neo/PackageApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class PackageApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t}\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-package/src/test/java/com/neo/controller/HelloTests.java",
    "content": "package com.neo.controller;\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.http.MediaType;\nimport org.springframework.test.context.junit4.SpringRunner;\nimport org.springframework.test.web.servlet.MockMvc;\nimport org.springframework.test.web.servlet.request.MockMvcRequestBuilders;\nimport org.springframework.test.web.servlet.setup.MockMvcBuilders;\n\nimport static org.hamcrest.Matchers.equalTo;\nimport static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;\nimport static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class HelloTests {\n\n\t\n    private MockMvc mvc;\n\n    @Before\n    public void setUp() throws Exception {\n        mvc = MockMvcBuilders.standaloneSetup(new HelloController()).build();\n    }\n\n    @Test\n    public void getHello() throws Exception {\n        mvc.perform(MockMvcRequestBuilders.get(\"/hello\").accept(MediaType.APPLICATION_JSON))\n                .andExpect(status().isOk())\n                .andExpect(content().string(equalTo(\"Hello World\")));\n    }\n\n}"
  },
  {
    "path": "2.x/spring-boot-package/src/test/java/com/neo/controller/HelloWorldControlerTests.java",
    "content": "package com.neo.controller;\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.http.MediaType;\nimport org.springframework.test.context.junit4.SpringRunner;\nimport org.springframework.test.web.servlet.MockMvc;\nimport org.springframework.test.web.servlet.request.MockMvcRequestBuilders;\nimport org.springframework.test.web.servlet.result.MockMvcResultHandlers;\nimport org.springframework.test.web.servlet.result.MockMvcResultMatchers;\nimport org.springframework.test.web.servlet.setup.MockMvcBuilders;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class HelloWorldControlerTests {\n\n    private MockMvc mvc;\n\n    @Before\n    public void setUp() throws Exception {\n        mvc = MockMvcBuilders.standaloneSetup(new HelloController()).build();\n    }\n\n    @Test\n    public void getHello() throws Exception {\n        mvc.perform(MockMvcRequestBuilders.get(\"/hello\").accept(MediaType.APPLICATION_JSON))\n                .andExpect(MockMvcResultMatchers.status().isOk())\n                .andDo(MockMvcResultHandlers.print())\n                .andReturn();\n    }\n\n}"
  },
  {
    "path": "2.x/spring-boot-package-war/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-package-war</artifactId>\n\t<version>0.0.1-SNAPSHOT</version>\n\t<packaging>war</packaging>\n\n\t<name>spring-boot-package-war</name>\n\t<description>Demo project for Spring Boot package war</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>1.3.6.RELEASE</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>1.7</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter</artifactId>\n\t\t</dependency>\n\t\t\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t\t\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-web</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-tomcat</artifactId>\n\t\t\t<scope>provided</scope>\n\t\t</dependency>\n\t     <dependency>\n\t        <groupId>org.springframework.boot</groupId>\n\t        <artifactId>spring-boot-devtools</artifactId>\n\t        <optional>true</optional>\n\t\t</dependency>\n\t</dependencies>\n\t\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t\t<configuration>\n\t                <fork>true</fork>\n\t            </configuration>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\t\n\n</project>\n"
  },
  {
    "path": "2.x/spring-boot-package-war/src/main/java/com/neo/Application.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class Application {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(Application.class, args);\n\t}\n}\n"
  },
  {
    "path": "2.x/spring-boot-package-war/src/main/java/com/neo/ServletInitializer.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.builder.SpringApplicationBuilder;\nimport org.springframework.boot.context.web.SpringBootServletInitializer;\n\n/**\n * Created by summer on 2017/5/8.\n */\npublic class ServletInitializer extends SpringBootServletInitializer {\n    @Override\n    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {\n        return application.sources(Application.class);\n    }\n}\n"
  },
  {
    "path": "2.x/spring-boot-package-war/src/main/java/com/neo/controller/HelloWorldController.java",
    "content": "package com.neo.controller;\n\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n@RestController\npublic class HelloWorldController {\n\t\n    @RequestMapping(\"/hello\")\n    public String index() {\n        return \"Hello World xx\";\n    }\n}"
  },
  {
    "path": "2.x/spring-boot-package-war/src/main/resources/application.properties",
    "content": ""
  },
  {
    "path": "2.x/spring-boot-package-war/src/test/java/com/neo/ApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.SpringApplicationConfiguration;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\n\n@RunWith(SpringJUnit4ClassRunner.class)\n@SpringApplicationConfiguration(classes = Application.class)\npublic class ApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t}\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-package-war/src/test/java/com/neo/controller/HelloTests.java",
    "content": "package com.neo.controller;\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.SpringApplicationConfiguration;\nimport org.springframework.http.MediaType;\nimport org.springframework.mock.web.MockServletContext;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\nimport org.springframework.test.context.web.WebAppConfiguration;\nimport org.springframework.test.web.servlet.MockMvc;\nimport org.springframework.test.web.servlet.request.MockMvcRequestBuilders;\nimport org.springframework.test.web.servlet.setup.MockMvcBuilders;\n\nimport static org.hamcrest.Matchers.equalTo;\nimport static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;\nimport static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;\n\n@RunWith(SpringJUnit4ClassRunner.class)\n@SpringApplicationConfiguration(classes = MockServletContext.class)\n@WebAppConfiguration\npublic class HelloTests {\n\n\t\n    private MockMvc mvc;\n\n    @Before\n    public void setUp() throws Exception {\n        mvc = MockMvcBuilders.standaloneSetup(new HelloWorldController()).build();\n    }\n\n    @Test\n    public void getHello() throws Exception {\n        mvc.perform(MockMvcRequestBuilders.get(\"/hello\").accept(MediaType.APPLICATION_JSON))\n                .andExpect(status().isOk())\n                .andExpect(content().string(equalTo(\"Hello World\")));\n    }\n\n}"
  },
  {
    "path": "2.x/spring-boot-package-war/src/test/java/com/neo/controller/HelloWorldControlerTests.java",
    "content": "package com.neo.controller;\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.SpringApplicationConfiguration;\nimport org.springframework.http.MediaType;\nimport org.springframework.mock.web.MockServletContext;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\nimport org.springframework.test.context.web.WebAppConfiguration;\nimport org.springframework.test.web.servlet.MockMvc;\nimport org.springframework.test.web.servlet.request.MockMvcRequestBuilders;\nimport org.springframework.test.web.servlet.result.MockMvcResultHandlers;\nimport org.springframework.test.web.servlet.result.MockMvcResultMatchers;\nimport org.springframework.test.web.servlet.setup.MockMvcBuilders;\n\n@RunWith(SpringJUnit4ClassRunner.class)\n@SpringApplicationConfiguration(classes = MockServletContext.class)\n@WebAppConfiguration\npublic class HelloWorldControlerTests {\n\n    private MockMvc mvc;\n\n    @Before\n    public void setUp() throws Exception {\n        mvc = MockMvcBuilders.standaloneSetup(new HelloWorldController()).build();\n    }\n\n    @Test\n    public void getHello() throws Exception {\n        mvc.perform(MockMvcRequestBuilders.get(\"/hello\").accept(MediaType.APPLICATION_JSON))\n                .andExpect(MockMvcResultMatchers.status().isOk())\n                .andDo(MockMvcResultHandlers.print())\n                .andReturn();\n    }\n\n}"
  },
  {
    "path": "2.x/spring-boot-rabbitmq/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-rabbitmq</artifactId>\n\t<version>1.0.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-rabbitmq</name>\n\t<description>Demo project for Spring Boot and rabbitmq</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>2.1.0.RELEASE</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-amqp</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t</dependencies>\n\t\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\t\n\n</project>\n"
  },
  {
    "path": "2.x/spring-boot-rabbitmq/src/main/java/com/neo/RabbitMQApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class RabbitMQApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(RabbitMQApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "2.x/spring-boot-rabbitmq/src/main/java/com/neo/model/User.java",
    "content": "package com.neo.model;\n\nimport java.io.Serializable;\n\n/**\n * Created by summer on 2016/11/29.\n */\npublic class User implements Serializable{\n\n    private String name;\n\n    private String pass;\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public String getPass() {\n        return pass;\n    }\n\n    public void setPass(String pass) {\n        this.pass = pass;\n    }\n\n    @Override\n    public String toString() {\n        return \"User{\" +\n                \"name='\" + name + '\\'' +\n                \", pass='\" + pass + '\\'' +\n                '}';\n    }\n}\n"
  },
  {
    "path": "2.x/spring-boot-rabbitmq/src/main/java/com/neo/rabbit/FanoutRabbitConfig.java",
    "content": "package com.neo.rabbit;\n\nimport org.springframework.amqp.core.Binding;\nimport org.springframework.amqp.core.BindingBuilder;\nimport org.springframework.amqp.core.FanoutExchange;\nimport org.springframework.amqp.core.Queue;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n\n@Configuration\npublic class FanoutRabbitConfig {\n\n    @Bean\n    public Queue AMessage() {\n        return new Queue(\"fanout.A\");\n    }\n\n    @Bean\n    public Queue BMessage() {\n        return new Queue(\"fanout.B\");\n    }\n\n    @Bean\n    public Queue CMessage() {\n        return new Queue(\"fanout.C\");\n    }\n\n    @Bean\n    FanoutExchange fanoutExchange() {\n        return new FanoutExchange(\"fanoutExchange\");\n    }\n\n    @Bean\n    Binding bindingExchangeA(Queue AMessage,FanoutExchange fanoutExchange) {\n        return BindingBuilder.bind(AMessage).to(fanoutExchange);\n    }\n\n    @Bean\n    Binding bindingExchangeB(Queue BMessage, FanoutExchange fanoutExchange) {\n        return BindingBuilder.bind(BMessage).to(fanoutExchange);\n    }\n\n    @Bean\n    Binding bindingExchangeC(Queue CMessage, FanoutExchange fanoutExchange) {\n        return BindingBuilder.bind(CMessage).to(fanoutExchange);\n    }\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-rabbitmq/src/main/java/com/neo/rabbit/RabbitConfig.java",
    "content": "package com.neo.rabbit;\n\nimport org.springframework.amqp.core.Queue;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n\n@Configuration\npublic class RabbitConfig {\n\n    @Bean\n    public Queue helloQueue() {\n        return new Queue(\"hello\");\n    }\n\n    @Bean\n    public Queue neoQueue() {\n        return new Queue(\"neo\");\n    }\n\n    @Bean\n    public Queue objectQueue() {\n        return new Queue(\"object\");\n    }\n\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-rabbitmq/src/main/java/com/neo/rabbit/TopicRabbitConfig.java",
    "content": "package com.neo.rabbit;\n\nimport org.springframework.amqp.core.Binding;\nimport org.springframework.amqp.core.BindingBuilder;\nimport org.springframework.amqp.core.Queue;\nimport org.springframework.amqp.core.TopicExchange;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n\n@Configuration\npublic class TopicRabbitConfig {\n\n    final static String message = \"topic.message\";\n    final static String messages = \"topic.messages\";\n\n    @Bean\n    public Queue queueMessage() {\n        return new Queue(TopicRabbitConfig.message);\n    }\n\n    @Bean\n    public Queue queueMessages() {\n        return new Queue(TopicRabbitConfig.messages);\n    }\n\n    @Bean\n    TopicExchange exchange() {\n        return new TopicExchange(\"topicExchange\");\n    }\n\n    @Bean\n    Binding bindingExchangeMessage(Queue queueMessage, TopicExchange exchange) {\n        return BindingBuilder.bind(queueMessage).to(exchange).with(\"topic.message\");\n    }\n\n    @Bean\n    Binding bindingExchangeMessages(Queue queueMessages, TopicExchange exchange) {\n        return BindingBuilder.bind(queueMessages).to(exchange).with(\"topic.#\");\n    }\n}\n"
  },
  {
    "path": "2.x/spring-boot-rabbitmq/src/main/java/com/neo/rabbit/fanout/FanoutReceiverA.java",
    "content": "package com.neo.rabbit.fanout;\n\nimport org.springframework.amqp.rabbit.annotation.RabbitHandler;\nimport org.springframework.amqp.rabbit.annotation.RabbitListener;\nimport org.springframework.stereotype.Component;\n\n@Component\n@RabbitListener(queues = \"fanout.A\")\npublic class FanoutReceiverA {\n\n    @RabbitHandler\n    public void process(String message) {\n        System.out.println(\"fanout Receiver A  : \" + message);\n    }\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-rabbitmq/src/main/java/com/neo/rabbit/fanout/FanoutReceiverB.java",
    "content": "package com.neo.rabbit.fanout;\n\nimport org.springframework.amqp.rabbit.annotation.RabbitHandler;\nimport org.springframework.amqp.rabbit.annotation.RabbitListener;\nimport org.springframework.stereotype.Component;\n\n@Component\n@RabbitListener(queues = \"fanout.B\")\npublic class FanoutReceiverB {\n\n    @RabbitHandler\n    public void process(String message) {\n        System.out.println(\"fanout Receiver B: \" + message);\n    }\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-rabbitmq/src/main/java/com/neo/rabbit/fanout/FanoutReceiverC.java",
    "content": "package com.neo.rabbit.fanout;\n\nimport org.springframework.amqp.rabbit.annotation.RabbitHandler;\nimport org.springframework.amqp.rabbit.annotation.RabbitListener;\nimport org.springframework.stereotype.Component;\n\n@Component\n@RabbitListener(queues = \"fanout.C\")\npublic class FanoutReceiverC {\n\n    @RabbitHandler\n    public void process(String message) {\n        System.out.println(\"fanout Receiver C: \" + message);\n    }\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-rabbitmq/src/main/java/com/neo/rabbit/fanout/FanoutSender.java",
    "content": "package com.neo.rabbit.fanout;\n\nimport org.springframework.amqp.core.AmqpTemplate;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class FanoutSender {\n\n\t@Autowired\n\tprivate AmqpTemplate rabbitTemplate;\n\n\tpublic void send() {\n\t\tString context = \"hi, fanout msg \";\n\t\tSystem.out.println(\"Sender : \" + context);\n\t\tthis.rabbitTemplate.convertAndSend(\"fanoutExchange\",\"\", context);\n\t}\n\n}"
  },
  {
    "path": "2.x/spring-boot-rabbitmq/src/main/java/com/neo/rabbit/hello/HelloReceiver.java",
    "content": "package com.neo.rabbit.hello;\n\nimport org.springframework.amqp.rabbit.annotation.RabbitHandler;\nimport org.springframework.amqp.rabbit.annotation.RabbitListener;\nimport org.springframework.cache.annotation.Cacheable;\nimport org.springframework.stereotype.Component;\n\nimport java.util.Date;\n\n@Component\n@RabbitListener(queues = \"hello\")\npublic class HelloReceiver {\n\n    @RabbitHandler\n    public void process(String hello) {\n        System.out.println(\"Receiver  : \" + hello);\n    }\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-rabbitmq/src/main/java/com/neo/rabbit/hello/HelloSender.java",
    "content": "package com.neo.rabbit.hello;\n\nimport org.springframework.amqp.core.AmqpTemplate;\nimport org.springframework.amqp.rabbit.core.RabbitTemplate;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\nimport java.util.Date;\n\n@Component\npublic class HelloSender {\n\n\t@Autowired\n\tprivate AmqpTemplate rabbitTemplate;\n\n\tpublic void send() {\n\t\tString context = \"hello \" + new Date();\n\t\tSystem.out.println(\"Sender : \" + context);\n\t\tthis.rabbitTemplate.convertAndSend(\"hello\", context);\n\t}\n\n}"
  },
  {
    "path": "2.x/spring-boot-rabbitmq/src/main/java/com/neo/rabbit/many/NeoReceiver1.java",
    "content": "package com.neo.rabbit.many;\n\nimport org.springframework.amqp.rabbit.annotation.RabbitHandler;\nimport org.springframework.amqp.rabbit.annotation.RabbitListener;\nimport org.springframework.stereotype.Component;\n\n@Component\n@RabbitListener(queues = \"neo\")\npublic class NeoReceiver1 {\n\n    @RabbitHandler\n    public void process(String neo) {\n        System.out.println(\"Receiver 1: \" + neo);\n    }\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-rabbitmq/src/main/java/com/neo/rabbit/many/NeoReceiver2.java",
    "content": "package com.neo.rabbit.many;\n\nimport org.springframework.amqp.rabbit.annotation.RabbitHandler;\nimport org.springframework.amqp.rabbit.annotation.RabbitListener;\nimport org.springframework.stereotype.Component;\n\n@Component\n@RabbitListener(queues = \"neo\")\npublic class NeoReceiver2 {\n\n    @RabbitHandler\n    public void process(String neo) {\n        System.out.println(\"Receiver 2: \" + neo);\n    }\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-rabbitmq/src/main/java/com/neo/rabbit/many/NeoSender.java",
    "content": "package com.neo.rabbit.many;\n\nimport org.springframework.amqp.core.AmqpTemplate;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class NeoSender {\n\n\t@Autowired\n\tprivate AmqpTemplate rabbitTemplate;\n\n\tpublic void send(int i) {\n\t\tString context = \"spirng boot neo queue\"+\" ****** \"+i;\n\t\tSystem.out.println(\"Sender1 : \" + context);\n\t\tthis.rabbitTemplate.convertAndSend(\"neo\", context);\n\t}\n\n}"
  },
  {
    "path": "2.x/spring-boot-rabbitmq/src/main/java/com/neo/rabbit/many/NeoSender2.java",
    "content": "package com.neo.rabbit.many;\n\nimport org.springframework.amqp.core.AmqpTemplate;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class NeoSender2 {\n\n\t@Autowired\n\tprivate AmqpTemplate rabbitTemplate;\n\n\tpublic void send(int i) {\n\t\tString context = \"spirng boot neo queue\"+\" ****** \"+i;\n\t\tSystem.out.println(\"Sender2 : \" + context);\n\t\tthis.rabbitTemplate.convertAndSend(\"neo\", context);\n\t}\n\n}"
  },
  {
    "path": "2.x/spring-boot-rabbitmq/src/main/java/com/neo/rabbit/object/ObjectReceiver.java",
    "content": "package com.neo.rabbit.object;\n\nimport com.neo.model.User;\nimport org.springframework.amqp.rabbit.annotation.RabbitHandler;\nimport org.springframework.amqp.rabbit.annotation.RabbitListener;\nimport org.springframework.stereotype.Component;\n\n@Component\n@RabbitListener(queues = \"object\")\npublic class ObjectReceiver {\n\n    @RabbitHandler\n    public void process(User user) {\n        System.out.println(\"Receiver object : \" + user);\n    }\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-rabbitmq/src/main/java/com/neo/rabbit/object/ObjectSender.java",
    "content": "package com.neo.rabbit.object;\n\nimport com.neo.model.User;\nimport org.springframework.amqp.core.AmqpTemplate;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\nimport java.util.Date;\n\n@Component\npublic class ObjectSender {\n\n\t@Autowired\n\tprivate AmqpTemplate rabbitTemplate;\n\n\tpublic void send(User user) {\n\t\tSystem.out.println(\"Sender object: \" + user.toString());\n\t\tthis.rabbitTemplate.convertAndSend(\"object\", user);\n\t}\n\n}"
  },
  {
    "path": "2.x/spring-boot-rabbitmq/src/main/java/com/neo/rabbit/topic/TopicReceiver.java",
    "content": "package com.neo.rabbit.topic;\n\nimport org.springframework.amqp.rabbit.annotation.RabbitHandler;\nimport org.springframework.amqp.rabbit.annotation.RabbitListener;\nimport org.springframework.stereotype.Component;\n\n@Component\n@RabbitListener(queues = \"topic.message\")\npublic class TopicReceiver {\n\n    @RabbitHandler\n    public void process(String message) {\n        System.out.println(\"Topic Receiver1  : \" + message);\n    }\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-rabbitmq/src/main/java/com/neo/rabbit/topic/TopicReceiver2.java",
    "content": "package com.neo.rabbit.topic;\n\nimport org.springframework.amqp.rabbit.annotation.RabbitHandler;\nimport org.springframework.amqp.rabbit.annotation.RabbitListener;\nimport org.springframework.stereotype.Component;\n\n@Component\n@RabbitListener(queues = \"topic.messages\")\npublic class TopicReceiver2 {\n\n    @RabbitHandler\n    public void process(String message) {\n        System.out.println(\"Topic Receiver2  : \" + message);\n    }\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-rabbitmq/src/main/java/com/neo/rabbit/topic/TopicSender.java",
    "content": "package com.neo.rabbit.topic;\n\nimport org.springframework.amqp.core.AmqpTemplate;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\nimport java.util.Date;\n\n@Component\npublic class TopicSender {\n\n\t@Autowired\n\tprivate AmqpTemplate rabbitTemplate;\n\n\tpublic void send() {\n\t\tString context = \"hi, i am message all\";\n\t\tSystem.out.println(\"Sender : \" + context);\n\t\tthis.rabbitTemplate.convertAndSend(\"topicExchange\", \"topic.1\", context);\n\t}\n\n\tpublic void send1() {\n\t\tString context = \"hi, i am message 1\";\n\t\tSystem.out.println(\"Sender : \" + context);\n\t\tthis.rabbitTemplate.convertAndSend(\"topicExchange\", \"topic.message\", context);\n\t}\n\n\tpublic void send2() {\n\t\tString context = \"hi, i am messages 2\";\n\t\tSystem.out.println(\"Sender : \" + context);\n\t\tthis.rabbitTemplate.convertAndSend(\"topicExchange\", \"topic.messages\", context);\n\t}\n\n}"
  },
  {
    "path": "2.x/spring-boot-rabbitmq/src/main/resources/application.properties",
    "content": "spring.application.name=spring-boot-rabbitmq\n\nspring.rabbitmq.host=192.168.0.56\nspring.rabbitmq.port=5672\nspring.rabbitmq.username=zzq\nspring.rabbitmq.password=zzq\n"
  },
  {
    "path": "2.x/spring-boot-rabbitmq/src/test/java/com/neo/RabbitMQApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class RabbitMQApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t\tSystem.out.println(\"hello world\");\n\t}\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-rabbitmq/src/test/java/com/neo/rabbitmq/FanoutTest.java",
    "content": "package com.neo.rabbitmq;\n\nimport com.neo.rabbit.fanout.FanoutSender;\nimport com.neo.rabbit.topic.TopicSender;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class FanoutTest {\n\n\t@Autowired\n\tprivate FanoutSender sender;\n\n\t@Test\n\tpublic void fanoutSender() throws Exception {\n\t\tsender.send();\n\t}\n\n\n}"
  },
  {
    "path": "2.x/spring-boot-rabbitmq/src/test/java/com/neo/rabbitmq/HelloTest.java",
    "content": "package com.neo.rabbitmq;\n\nimport com.neo.rabbit.hello.HelloSender;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class HelloTest {\n\n\t@Autowired\n\tprivate HelloSender helloSender;\n\n\t@Test\n\tpublic void hello() throws Exception {\n\t\thelloSender.send();\n\t}\n\n\n}"
  },
  {
    "path": "2.x/spring-boot-rabbitmq/src/test/java/com/neo/rabbitmq/ManyTest.java",
    "content": "package com.neo.rabbitmq;\n\nimport com.neo.rabbit.many.NeoSender;\nimport com.neo.rabbit.many.NeoSender2;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class ManyTest {\n\t@Autowired\n\tprivate NeoSender neoSender;\n\n\t@Autowired\n\tprivate NeoSender2 neoSender2;\n\n\t@Test\n\tpublic void oneToMany() throws Exception {\n\t\tfor (int i=0;i<100;i++){\n\t\t\tneoSender.send(i);\n\t\t}\n\t}\n\n\t@Test\n\tpublic void manyToMany() throws Exception {\n\t\tfor (int i=0;i<100;i++){\n\t\t\tneoSender.send(i);\n\t\t\tneoSender2.send(i);\n\t\t}\n\t}\n\n}"
  },
  {
    "path": "2.x/spring-boot-rabbitmq/src/test/java/com/neo/rabbitmq/ObjectTest.java",
    "content": "package com.neo.rabbitmq;\n\nimport com.neo.model.User;\nimport com.neo.rabbit.object.ObjectSender;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class ObjectTest {\n\n\t@Autowired\n\tprivate ObjectSender sender;\n\n\t@Test\n\tpublic void sendOject() throws Exception {\n\t\tUser user=new User();\n\t\tuser.setName(\"neo\");\n\t\tuser.setPass(\"123456\");\n\t\tsender.send(user);\n\t}\n\n}"
  },
  {
    "path": "2.x/spring-boot-rabbitmq/src/test/java/com/neo/rabbitmq/TopicTest.java",
    "content": "package com.neo.rabbitmq;\n\nimport com.neo.rabbit.topic.TopicSender;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class TopicTest {\n\n\t@Autowired\n\tprivate TopicSender sender;\n\n\t@Test\n\tpublic void topic() throws Exception {\n\t\tsender.send();\n\t}\n\n\t@Test\n\tpublic void topic1() throws Exception {\n\t\tsender.send1();\n\t}\n\n\t@Test\n\tpublic void topic2() throws Exception {\n\t\tsender.send2();\n\t}\n\n}"
  },
  {
    "path": "2.x/spring-boot-redis/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-redis</artifactId>\n\t<version>1.0.0-SNAPSHOT</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-redis</name>\n\t<description>Demo project for Spring Boot</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>2.1.0.RELEASE</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-data-redis</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.apache.commons</groupId>\n\t\t\t<artifactId>commons-pool2</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-web</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.session</groupId>\n\t\t\t<artifactId>spring-session-data-redis</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t</dependencies>\n\t\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\t\n\n</project>\n"
  },
  {
    "path": "2.x/spring-boot-redis/src/main/java/com/neo/RedisApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class RedisApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(RedisApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "2.x/spring-boot-redis/src/main/java/com/neo/config/RedisConfig.java",
    "content": "package com.neo.config;\n\nimport java.lang.reflect.Method;\n\nimport org.springframework.cache.CacheManager;\nimport org.springframework.cache.annotation.CachingConfigurerSupport;\nimport org.springframework.cache.annotation.EnableCaching;\nimport org.springframework.cache.interceptor.KeyGenerator;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.data.redis.cache.RedisCacheManager;\nimport org.springframework.data.redis.core.RedisTemplate;\n\n\n@Configuration\n@EnableCaching\npublic class RedisConfig extends CachingConfigurerSupport{\n\t\n\t@Bean\n\tpublic KeyGenerator keyGenerator() {\n        return new KeyGenerator() {\n            @Override\n            public Object generate(Object target, Method method, Object... params) {\n                StringBuilder sb = new StringBuilder();\n                sb.append(target.getClass().getName());\n                sb.append(method.getName());\n                for (Object obj : params) {\n                    sb.append(obj.toString());\n                }\n                return sb.toString();\n            }\n        };\n    }\n}"
  },
  {
    "path": "2.x/spring-boot-redis/src/main/java/com/neo/config/SessionConfig.java",
    "content": "package com.neo.config;\n\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;\n\n@Configuration\n@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 86400*30)\npublic class SessionConfig {\n}"
  },
  {
    "path": "2.x/spring-boot-redis/src/main/java/com/neo/model/User.java",
    "content": "package com.neo.model;\n\nimport java.io.Serializable;\n\n\n\npublic class User implements Serializable {\n\n\tprivate static final long serialVersionUID = 1L;\n\tprivate Long id;\n\tprivate String userName;\n\tprivate String password;\n\tprivate String email;\n\tprivate String nickname;\n\tprivate String regTime;\n\n\tpublic User() {\n\t\tsuper();\n\t}\n\tpublic User(String email, String nickname, String password, String userName, String regTime) {\n\t\tsuper();\n\t\tthis.email = email;\n\t\tthis.nickname = nickname;\n\t\tthis.password = password;\n\t\tthis.userName = userName;\n\t\tthis.regTime = regTime;\n\t}\n\n\tpublic Long getId() {\n\t\treturn id;\n\t}\n\n\tpublic void setId(Long id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic String getUserName() {\n\t\treturn userName;\n\t}\n\n\tpublic void setUserName(String userName) {\n\t\tthis.userName = userName;\n\t}\n\n\tpublic String getPassword() {\n\t\treturn password;\n\t}\n\n\tpublic void setPassword(String password) {\n\t\tthis.password = password;\n\t}\n\n\tpublic String getEmail() {\n\t\treturn email;\n\t}\n\n\tpublic void setEmail(String email) {\n\t\tthis.email = email;\n\t}\n\n\tpublic String getNickname() {\n\t\treturn nickname;\n\t}\n\n\tpublic void setNickname(String nickname) {\n\t\tthis.nickname = nickname;\n\t}\n\n\tpublic String getRegTime() {\n\t\treturn regTime;\n\t}\n\n\tpublic void setRegTime(String regTime) {\n\t\tthis.regTime = regTime;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\treturn \"User{\" +\n\t\t\t\t\"id=\" + id +\n\t\t\t\t\", userName='\" + userName + '\\'' +\n\t\t\t\t\", password='\" + password + '\\'' +\n\t\t\t\t\", email='\" + email + '\\'' +\n\t\t\t\t\", nickname='\" + nickname + '\\'' +\n\t\t\t\t\", regTime='\" + regTime + '\\'' +\n\t\t\t\t'}';\n\t}\n}"
  },
  {
    "path": "2.x/spring-boot-redis/src/main/java/com/neo/web/UserController.java",
    "content": "package com.neo.web;\n\nimport org.springframework.cache.annotation.Cacheable;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport com.neo.model.User;\n\nimport javax.servlet.http.HttpSession;\nimport java.util.UUID;\n\n@RestController\npublic class UserController {\n\n    @RequestMapping(\"/getUser\")\n    @Cacheable(value=\"user-key\")\n    public User getUser() {\n        User user=new User(\"aa@126.com\", \"aa\", \"aa123456\", \"aa\",\"123\");\n        System.out.println(\"若下面没出现“无缓存的时候调用”字样且能打印出数据表示测试成功\");\n        return user;\n    }\n\n\n    @RequestMapping(\"/uid\")\n    String uid(HttpSession session) {\n        UUID uid = (UUID) session.getAttribute(\"uid\");\n        if (uid == null) {\n            uid = UUID.randomUUID();\n        }\n        session.setAttribute(\"uid\", uid);\n        return session.getId();\n    }\n}"
  },
  {
    "path": "2.x/spring-boot-redis/src/main/resources/application.properties",
    "content": "# REDIS\n# Redis\\u6570\\u636E\\u5E93\\u7D22\\u5F15\\uFF08\\u9ED8\\u8BA4\\u4E3A0\\uFF09\nspring.redis.database=0  \n# Redis\\u670D\\u52A1\\u5668\\u5730\\u5740\nspring.redis.host=localhost\n# Redis\\u670D\\u52A1\\u5668\\u8FDE\\u63A5\\u7AEF\\u53E3\nspring.redis.port=6379  \n# Redis\\u670D\\u52A1\\u5668\\u8FDE\\u63A5\\u5BC6\\u7801\\uFF08\\u9ED8\\u8BA4\\u4E3A\\u7A7A\\uFF09\nspring.redis.password=\n# \\u8FDE\\u63A5\\u6C60\\u6700\\u5927\\u8FDE\\u63A5\\u6570\\uFF08\\u4F7F\\u7528\\u8D1F\\u503C\\u8868\\u793A\\u6CA1\\u6709\\u9650\\u5236\\uFF09 \\u9ED8\\u8BA4 8\nspring.redis.lettuce.pool.max-active=8\n# \\u8FDE\\u63A5\\u6C60\\u6700\\u5927\\u963B\\u585E\\u7B49\\u5F85\\u65F6\\u95F4\\uFF08\\u4F7F\\u7528\\u8D1F\\u503C\\u8868\\u793A\\u6CA1\\u6709\\u9650\\u5236\\uFF09 \\u9ED8\\u8BA4 -1\nspring.redis.lettuce.pool.max-wait=-1\n# \\u8FDE\\u63A5\\u6C60\\u4E2D\\u7684\\u6700\\u5927\\u7A7A\\u95F2\\u8FDE\\u63A5 \\u9ED8\\u8BA4 8\nspring.redis.lettuce.pool.max-idle=8\n# \\u8FDE\\u63A5\\u6C60\\u4E2D\\u7684\\u6700\\u5C0F\\u7A7A\\u95F2\\u8FDE\\u63A5 \\u9ED8\\u8BA4 0\nspring.redis.lettuce.pool.min-idle=0\n"
  },
  {
    "path": "2.x/spring-boot-redis/src/test/java/com/neo/RedisApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class RedisApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t\tSystem.out.println(\"hello web\");\n\t}\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-redis/src/test/java/com/neo/TestRedis.java",
    "content": "package com.neo;\n\nimport com.neo.model.User;\nimport org.junit.Assert;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.data.redis.core.RedisTemplate;\nimport org.springframework.data.redis.core.StringRedisTemplate;\nimport org.springframework.data.redis.core.ValueOperations;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport java.util.concurrent.TimeUnit;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class TestRedis {\n\n    @Autowired\n    private StringRedisTemplate stringRedisTemplate;\n    \n\t@Autowired\n    private RedisTemplate redisTemplate;\n\n    @Test\n    public void test() throws Exception {\n        stringRedisTemplate.opsForValue().set(\"aaa\", \"111\");\n        Assert.assertEquals(\"111\", stringRedisTemplate.opsForValue().get(\"aaa\"));\n    }\n    \n    @Test\n    public void testObj() throws Exception {\n        User user=new User(\"aa@126.com\", \"aa\", \"aa123456\", \"aa\",\"123\");\n        ValueOperations<String, User> operations=redisTemplate.opsForValue();\n        operations.set(\"com.neox\", user);\n        operations.set(\"com.neo.f\", user,1, TimeUnit.SECONDS);\n        Thread.sleep(1000);\n        //redisTemplate.delete(\"com.neo.f\");\n        boolean exists=redisTemplate.hasKey(\"com.neo.f\");\n        if(exists){\n        \tSystem.out.println(\"exists is true\");\n        }else{\n        \tSystem.out.println(\"exists is false\");\n        }\n       // Assert.assertEquals(\"aa\", operations.get(\"com.neo.f\").getUserName());\n    }\n}"
  },
  {
    "path": "2.x/spring-boot-scheduler/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-scheduler</artifactId>\n\t<version>1.0.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-scheduler</name>\n\t<description>Demo project for Spring Boot and scheduler</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>2.1.0.RELEASE</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t</dependencies>\n\t\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\t\n\n</project>\n"
  },
  {
    "path": "2.x/spring-boot-scheduler/src/main/java/com/neo/SchedulerApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.scheduling.annotation.EnableScheduling;\n\n@SpringBootApplication\n@EnableScheduling\npublic class SchedulerApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(SchedulerApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "2.x/spring-boot-scheduler/src/main/java/com/neo/task/Scheduler2Task.java",
    "content": "package com.neo.task;\n\nimport org.springframework.scheduling.annotation.Scheduled;\nimport org.springframework.stereotype.Component;\n\nimport java.text.SimpleDateFormat;\nimport java.util.Date;\n\n/**\n * Created by summer on 2016/12/1.\n */\n\n@Component\npublic class Scheduler2Task {\n\n    private static final SimpleDateFormat dateFormat = new SimpleDateFormat(\"HH:mm:ss\");\n\n    @Scheduled(fixedRate = 6000)\n    public void reportCurrentTime() {\n        System.out.println(\"现在时间：\" + dateFormat.format(new Date()));\n    }\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-scheduler/src/main/java/com/neo/task/SchedulerTask.java",
    "content": "package com.neo.task;\n\nimport org.springframework.scheduling.annotation.Scheduled;\nimport org.springframework.stereotype.Component;\n\nimport java.util.Date;\n\n/**\n * Created by summer on 2016/12/1.\n */\n\n@Component\npublic class SchedulerTask {\n\n    private int count=0;\n\n    @Scheduled(cron=\"*/6 * * * * ?\")\n    private void process(){\n        System.out.println(\"this is scheduler task runing  \"+(count++));\n    }\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-scheduler/src/main/resources/application.properties",
    "content": "spring.application.name=spirng-boot-scheduler\n\n"
  },
  {
    "path": "2.x/spring-boot-scheduler/src/test/java/com/neo/SchedulerApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class SchedulerApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t\tSystem.out.println(\"hello world\");\n\t}\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-shiro/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-shiro</artifactId>\n\t<version>0.0.1-SNAPSHOT</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-shiro</name>\n\t<description>Demo project for Spring Boot</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>2.1.0.RELEASE</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-data-jpa</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-thymeleaf</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>net.sourceforge.nekohtml</groupId>\n\t\t\t<artifactId>nekohtml</artifactId>\n\t\t\t<version>1.9.22</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-web</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.apache.shiro</groupId>\n\t\t\t<artifactId>shiro-spring</artifactId>\n\t\t\t<version>1.7.2</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>mysql</groupId>\n\t\t\t<artifactId>mysql-connector-java</artifactId>\n\t\t\t<scope>runtime</scope>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-devtools</artifactId>\n\t\t\t<optional>true</optional>\n\t\t</dependency>\n\t</dependencies>\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t\t<configuration>\n\t\t\t\t\t<fork>true</fork>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\n</project>\n"
  },
  {
    "path": "2.x/spring-boot-shiro/src/main/java/com/neo/ShiroApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class ShiroApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(ShiroApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "2.x/spring-boot-shiro/src/main/java/com/neo/config/MyShiroRealm.java",
    "content": "package com.neo.config;\n\nimport com.neo.model.SysPermission;\nimport com.neo.model.SysRole;\nimport com.neo.model.UserInfo;\nimport com.neo.sevice.UserInfoService;\nimport org.apache.shiro.authc.AuthenticationException;\nimport org.apache.shiro.authc.AuthenticationInfo;\nimport org.apache.shiro.authc.AuthenticationToken;\nimport org.apache.shiro.authc.SimpleAuthenticationInfo;\nimport org.apache.shiro.authz.AuthorizationInfo;\nimport org.apache.shiro.authz.SimpleAuthorizationInfo;\nimport org.apache.shiro.realm.AuthorizingRealm;\nimport org.apache.shiro.subject.PrincipalCollection;\nimport org.apache.shiro.util.ByteSource;\n\nimport javax.annotation.Resource;\n\npublic class MyShiroRealm extends AuthorizingRealm {\n    @Resource\n    private UserInfoService userInfoService;\n    @Override\n    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {\n        System.out.println(\"权限配置-->MyShiroRealm.doGetAuthorizationInfo()\");\n        SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();\n        UserInfo userInfo  = (UserInfo)principals.getPrimaryPrincipal();\n        for(SysRole role:userInfo.getRoleList()){\n            authorizationInfo.addRole(role.getRole());\n            for(SysPermission p:role.getPermissions()){\n                authorizationInfo.addStringPermission(p.getPermission());\n            }\n        }\n        return authorizationInfo;\n    }\n\n    /*主要是用来进行身份认证的，也就是说验证用户输入的账号和密码是否正确。*/\n    @Override\n    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token)\n            throws AuthenticationException {\n        System.out.println(\"MyShiroRealm.doGetAuthenticationInfo()\");\n        //获取用户的输入的账号.\n        String username = (String)token.getPrincipal();\n        System.out.println(token.getCredentials());\n        //通过username从数据库中查找 User对象，如果找到，没找到.\n        //实际项目中，这里可以根据实际情况做缓存，如果不做，Shiro自己也是有时间间隔机制，2分钟内不会重复执行该方法\n        UserInfo userInfo = userInfoService.findByUsername(username);\n        System.out.println(\"----->>userInfo=\"+userInfo);\n        if(userInfo == null){\n            return null;\n        }\n        SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(\n                userInfo, //用户名\n                userInfo.getPassword(), //密码\n                ByteSource.Util.bytes(userInfo.getCredentialsSalt()),//salt=username+salt\n                getName()  //realm name\n        );\n        return authenticationInfo;\n    }\n\n}"
  },
  {
    "path": "2.x/spring-boot-shiro/src/main/java/com/neo/config/ShiroConfig.java",
    "content": "package com.neo.config;\n\nimport org.apache.shiro.authc.credential.HashedCredentialsMatcher;\nimport org.apache.shiro.mgt.SecurityManager;\nimport org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;\nimport org.apache.shiro.spring.web.ShiroFilterFactoryBean;\nimport org.apache.shiro.web.mgt.DefaultWebSecurityManager;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.web.servlet.handler.SimpleMappingExceptionResolver;\n\nimport java.util.LinkedHashMap;\nimport java.util.Map;\nimport java.util.Properties;\n\n@Configuration\npublic class ShiroConfig {\n\t@Bean\n\tpublic ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) {\n\t\tSystem.out.println(\"ShiroConfiguration.shirFilter()\");\n\t\tShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();\n\t\tshiroFilterFactoryBean.setSecurityManager(securityManager);\n\t\t//拦截器.\n\t\tMap<String,String> filterChainDefinitionMap = new LinkedHashMap<String,String>();\n\t\t// 配置不会被拦截的链接 顺序判断\n\t\tfilterChainDefinitionMap.put(\"/static/**\", \"anon\");\n\t\t//配置退出 过滤器,其中的具体的退出代码Shiro已经替我们实现了\n\t\tfilterChainDefinitionMap.put(\"/logout\", \"logout\");\n\t\t//<!-- 过滤链定义，从上向下顺序执行，一般将/**放在最为下边 -->:这是一个坑呢，一不小心代码就不好使了;\n\t\t//<!-- authc:所有url都必须认证通过才可以访问; anon:所有url都都可以匿名访问-->\n\t\tfilterChainDefinitionMap.put(\"/**\", \"authc\");\n\t\t// 如果不设置默认会自动寻找Web工程根目录下的\"/login.jsp\"页面\n\t\tshiroFilterFactoryBean.setLoginUrl(\"/login\");\n\t\t// 登录成功后要跳转的链接\n\t\tshiroFilterFactoryBean.setSuccessUrl(\"/index\");\n\n\t\t//未授权界面;\n\t\tshiroFilterFactoryBean.setUnauthorizedUrl(\"/403\");\n\t\tshiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);\n\t\treturn shiroFilterFactoryBean;\n\t}\n\n\t/**\n\t * 凭证匹配器\n\t * （由于我们的密码校验交给Shiro的SimpleAuthenticationInfo进行处理了\n\t * ）\n\t * @return\n\t */\n\t@Bean\n\tpublic HashedCredentialsMatcher hashedCredentialsMatcher(){\n\t\tHashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();\n\t\thashedCredentialsMatcher.setHashAlgorithmName(\"md5\");//散列算法:这里使用MD5算法;\n\t\thashedCredentialsMatcher.setHashIterations(2);//散列的次数，比如散列两次，相当于 md5(md5(\"\"));\n\t\treturn hashedCredentialsMatcher;\n\t}\n\n\t@Bean\n\tpublic MyShiroRealm myShiroRealm(){\n\t\tMyShiroRealm myShiroRealm = new MyShiroRealm();\n\t\tmyShiroRealm.setCredentialsMatcher(hashedCredentialsMatcher());\n\t\treturn myShiroRealm;\n\t}\n\n\n\t@Bean\n\tpublic SecurityManager securityManager(){\n\t\tDefaultWebSecurityManager securityManager =  new DefaultWebSecurityManager();\n\t\tsecurityManager.setRealm(myShiroRealm());\n\t\treturn securityManager;\n\t}\n\n\t/**\n\t *  开启shiro aop注解支持.\n\t *  使用代理方式;所以需要开启代码支持;\n\t * @param securityManager\n\t * @return\n\t */\n\t@Bean\n\tpublic AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager){\n\t\tAuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();\n\t\tauthorizationAttributeSourceAdvisor.setSecurityManager(securityManager);\n\t\treturn authorizationAttributeSourceAdvisor;\n\t}\n\n\t@Bean(name=\"simpleMappingExceptionResolver\")\n\tpublic SimpleMappingExceptionResolver\n\tcreateSimpleMappingExceptionResolver() {\n\t\tSimpleMappingExceptionResolver r = new SimpleMappingExceptionResolver();\n\t\tProperties mappings = new Properties();\n\t\tmappings.setProperty(\"DatabaseException\", \"databaseError\");//数据库异常处理\n\t\tmappings.setProperty(\"UnauthorizedException\",\"403\");\n\t\tr.setExceptionMappings(mappings);  // None by default\n\t\tr.setDefaultErrorView(\"error\");    // No default\n\t\tr.setExceptionAttribute(\"ex\");     // Default is \"exception\"\n\t\t//r.setWarnLogCategory(\"example.MvcLogger\");     // No default\n\t\treturn r;\n\t}\n}"
  },
  {
    "path": "2.x/spring-boot-shiro/src/main/java/com/neo/dao/UserInfoDao.java",
    "content": "package com.neo.dao;\n\nimport com.neo.model.UserInfo;\nimport org.springframework.data.repository.CrudRepository;\n\npublic interface UserInfoDao extends CrudRepository<UserInfo,Long> {\n    /**通过username查找用户信息;*/\n    public UserInfo findByUsername(String username);\n}"
  },
  {
    "path": "2.x/spring-boot-shiro/src/main/java/com/neo/model/SysPermission.java",
    "content": "package com.neo.model;\n\nimport javax.persistence.*;\nimport java.io.Serializable;\nimport java.util.List;\n\n@Entity\npublic class SysPermission implements Serializable {\n    @Id@GeneratedValue\n    private Integer id;//主键.\n    private String name;//名称.\n    @Column(columnDefinition=\"enum('menu','button')\")\n    private String resourceType;//资源类型，[menu|button]\n    private String url;//资源路径.\n    private String permission; //权限字符串,menu例子：role:*，button例子：role:create,role:update,role:delete,role:view\n    private Long parentId; //父编号\n    private String parentIds; //父编号列表\n    private Boolean available = Boolean.FALSE;\n    @ManyToMany\n    @JoinTable(name=\"SysRolePermission\",joinColumns={@JoinColumn(name=\"permissionId\")},inverseJoinColumns={@JoinColumn(name=\"roleId\")})\n    private List<SysRole> roles;\n\n    public Integer getId() {\n        return id;\n    }\n\n    public void setId(Integer id) {\n        this.id = id;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public String getResourceType() {\n        return resourceType;\n    }\n\n    public void setResourceType(String resourceType) {\n        this.resourceType = resourceType;\n    }\n\n    public String getUrl() {\n        return url;\n    }\n\n    public void setUrl(String url) {\n        this.url = url;\n    }\n\n    public String getPermission() {\n        return permission;\n    }\n\n    public void setPermission(String permission) {\n        this.permission = permission;\n    }\n\n    public Long getParentId() {\n        return parentId;\n    }\n\n    public void setParentId(Long parentId) {\n        this.parentId = parentId;\n    }\n\n    public String getParentIds() {\n        return parentIds;\n    }\n\n    public void setParentIds(String parentIds) {\n        this.parentIds = parentIds;\n    }\n\n    public Boolean getAvailable() {\n        return available;\n    }\n\n    public void setAvailable(Boolean available) {\n        this.available = available;\n    }\n\n    public List<SysRole> getRoles() {\n        return roles;\n    }\n\n    public void setRoles(List<SysRole> roles) {\n        this.roles = roles;\n    }\n}"
  },
  {
    "path": "2.x/spring-boot-shiro/src/main/java/com/neo/model/SysRole.java",
    "content": "package com.neo.model;\n\nimport javax.persistence.*;\nimport java.util.List;\n\n@Entity\npublic class SysRole {\n    @Id@GeneratedValue\n    private Integer id; // 编号\n    private String role; // 角色标识程序中判断使用,如\"admin\",这个是唯一的:\n    private String description; // 角色描述,UI界面显示使用\n    private Boolean available = Boolean.FALSE; // 是否可用,如果不可用将不会添加给用户\n\n    //角色 -- 权限关系：多对多关系;\n    @ManyToMany(fetch= FetchType.EAGER)\n    @JoinTable(name=\"SysRolePermission\",joinColumns={@JoinColumn(name=\"roleId\")},inverseJoinColumns={@JoinColumn(name=\"permissionId\")})\n    private List<SysPermission> permissions;\n\n    // 用户 - 角色关系定义;\n    @ManyToMany\n    @JoinTable(name=\"SysUserRole\",joinColumns={@JoinColumn(name=\"roleId\")},inverseJoinColumns={@JoinColumn(name=\"uid\")})\n    private List<UserInfo> userInfos;// 一个角色对应多个用户\n\n    public Integer getId() {\n        return id;\n    }\n\n    public void setId(Integer id) {\n        this.id = id;\n    }\n\n    public String getRole() {\n        return role;\n    }\n\n    public void setRole(String role) {\n        this.role = role;\n    }\n\n    public String getDescription() {\n        return description;\n    }\n\n    public void setDescription(String description) {\n        this.description = description;\n    }\n\n    public Boolean getAvailable() {\n        return available;\n    }\n\n    public void setAvailable(Boolean available) {\n        this.available = available;\n    }\n\n    public List<SysPermission> getPermissions() {\n        return permissions;\n    }\n\n    public void setPermissions(List<SysPermission> permissions) {\n        this.permissions = permissions;\n    }\n\n    public List<UserInfo> getUserInfos() {\n        return userInfos;\n    }\n\n    public void setUserInfos(List<UserInfo> userInfos) {\n        this.userInfos = userInfos;\n    }\n}"
  },
  {
    "path": "2.x/spring-boot-shiro/src/main/java/com/neo/model/UserInfo.java",
    "content": "package com.neo.model;\n\nimport javax.persistence.*;\nimport java.io.Serializable;\nimport java.util.List;\n\n@Entity\npublic class UserInfo implements Serializable {\n    @Id\n    @GeneratedValue\n    private Integer uid;\n    @Column(unique =true)\n    private String username;//帐号\n    private String name;//名称（昵称或者真实姓名，不同系统不同定义）\n    private String password; //密码;\n    private String salt;//加密密码的盐\n    private byte state;//用户状态,0:创建未认证（比如没有激活，没有输入验证码等等）--等待验证的用户 , 1:正常状态,2：用户被锁定.\n    @ManyToMany(fetch= FetchType.EAGER)//立即从数据库中进行加载数据;\n    @JoinTable(name = \"SysUserRole\", joinColumns = { @JoinColumn(name = \"uid\") }, inverseJoinColumns ={@JoinColumn(name = \"roleId\") })\n    private List<SysRole> roleList;// 一个用户具有多个角色\n\n    public Integer getUid() {\n        return uid;\n    }\n\n    public void setUid(Integer uid) {\n        this.uid = uid;\n    }\n\n    public String getUsername() {\n        return username;\n    }\n\n    public void setUsername(String username) {\n        this.username = username;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public String getPassword() {\n        return password;\n    }\n\n    public void setPassword(String password) {\n        this.password = password;\n    }\n\n    public String getSalt() {\n        return salt;\n    }\n\n    public void setSalt(String salt) {\n        this.salt = salt;\n    }\n\n    public byte getState() {\n        return state;\n    }\n\n    public void setState(byte state) {\n        this.state = state;\n    }\n\n    public List<SysRole> getRoleList() {\n        return roleList;\n    }\n\n    public void setRoleList(List<SysRole> roleList) {\n        this.roleList = roleList;\n    }\n\n    /**\n     * 密码盐.\n     * @return\n     */\n    public String getCredentialsSalt(){\n        return this.username+this.salt;\n    }\n    //重新对盐重新进行了定义，用户名+salt，这样就更加不容易被破解\n}"
  },
  {
    "path": "2.x/spring-boot-shiro/src/main/java/com/neo/sevice/UserInfoService.java",
    "content": "package com.neo.sevice;\n\nimport com.neo.model.UserInfo;\n\npublic interface UserInfoService {\n    /**通过username查找用户信息;*/\n    public UserInfo findByUsername(String username);\n}"
  },
  {
    "path": "2.x/spring-boot-shiro/src/main/java/com/neo/sevice/impl/UserInfoServiceImpl.java",
    "content": "package com.neo.sevice.impl;\n\nimport com.neo.dao.UserInfoDao;\nimport com.neo.model.UserInfo;\nimport com.neo.sevice.UserInfoService;\nimport org.springframework.stereotype.Service;\n\nimport javax.annotation.Resource;\n\n@Service\npublic class UserInfoServiceImpl implements UserInfoService {\n    @Resource\n    private UserInfoDao userInfoDao;\n    @Override\n    public UserInfo findByUsername(String username) {\n        System.out.println(\"UserInfoServiceImpl.findByUsername()\");\n        return userInfoDao.findByUsername(username);\n    }\n}"
  },
  {
    "path": "2.x/spring-boot-shiro/src/main/java/com/neo/web/HomeController.java",
    "content": "package com.neo.web;\n\nimport org.apache.shiro.authc.IncorrectCredentialsException;\nimport org.apache.shiro.authc.UnknownAccountException;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.RequestMapping;\n\nimport javax.servlet.http.HttpServletRequest;\nimport java.util.Map;\n\n@Controller\npublic class HomeController {\n    @RequestMapping({\"/\",\"/index\"})\n    public String index(){\n        return\"/index\";\n    }\n\n    @RequestMapping(\"/login\")\n    public String login(HttpServletRequest request, Map<String, Object> map) throws Exception{\n        System.out.println(\"HomeController.login()\");\n        // 登录失败从request中获取shiro处理的异常信息。\n        // shiroLoginFailure:就是shiro异常类的全类名.\n        String exception = (String) request.getAttribute(\"shiroLoginFailure\");\n        System.out.println(\"exception=\" + exception);\n        String msg = \"\";\n        if (exception != null) {\n            if (UnknownAccountException.class.getName().equals(exception)) {\n                System.out.println(\"UnknownAccountException -- > 账号不存在：\");\n                msg = \"UnknownAccountException -- > 账号不存在：\";\n            } else if (IncorrectCredentialsException.class.getName().equals(exception)) {\n                System.out.println(\"IncorrectCredentialsException -- > 密码不正确：\");\n                msg = \"IncorrectCredentialsException -- > 密码不正确：\";\n            } else if (\"kaptchaValidateFailed\".equals(exception)) {\n                System.out.println(\"kaptchaValidateFailed -- > 验证码错误\");\n                msg = \"kaptchaValidateFailed -- > 验证码错误\";\n            } else {\n                msg = \"else >> \"+exception;\n                System.out.println(\"else -- >\" + exception);\n            }\n        }\n        map.put(\"msg\", msg);\n        // 此方法不处理登录成功,由shiro进行处理\n        return \"/login\";\n    }\n\n    @RequestMapping(\"/403\")\n    public String unauthorizedRole(){\n        System.out.println(\"------没有权限-------\");\n        return \"403\";\n    }\n\n}"
  },
  {
    "path": "2.x/spring-boot-shiro/src/main/java/com/neo/web/UserInfoController.java",
    "content": "package com.neo.web;\n\nimport org.apache.shiro.authz.annotation.RequiresPermissions;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.RequestMapping;\n\n@Controller\n@RequestMapping(\"/userInfo\")\npublic class UserInfoController {\n\n    /**\n     * 用户查询.\n     * @return\n     */\n    @RequestMapping(\"/userList\")\n    @RequiresPermissions(\"userInfo:view\")//权限管理;\n    public String userInfo(){\n        return \"userInfo\";\n    }\n\n    /**\n     * 用户添加;\n     * @return\n     */\n    @RequestMapping(\"/userAdd\")\n    @RequiresPermissions(\"userInfo:add\")//权限管理;\n    public String userInfoAdd(){\n        return \"userInfoAdd\";\n    }\n\n    /**\n     * 用户删除;\n     * @return\n     */\n    @RequestMapping(\"/userDel\")\n    @RequiresPermissions(\"userInfo:del\")//权限管理;\n    public String userDel(){\n        return \"userInfoDel\";\n    }\n}"
  },
  {
    "path": "2.x/spring-boot-shiro/src/main/resources/application.yml",
    "content": "spring:\n    datasource:\n      url: jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true\n      username: root\n      password: root\n      #schema: database/import.sql\n      #sql-script-encoding: utf-8\n      driver-class-name: com.mysql.cj.jdbc.Driver\n\n    jpa:\n      database: mysql\n      show-sql: true\n      hibernate:\n        ddl-auto: update\n      properties:\n         hibernate:\n            dialect: org.hibernate.dialect.MySQL5Dialect\n\n    thymeleaf:\n       cache: false\n       mode: HTML"
  },
  {
    "path": "2.x/spring-boot-shiro/src/main/resources/database/import.sql",
    "content": "INSERT INTO `user_info` (`uid`,`username`,`name`,`password`,`salt`,`state`) VALUES ('1', 'admin', '管理员', 'd3c59d25033dbf980d29554025c23a75', '8d78869f470951332959580424d4bf4f', 0);\nINSERT INTO `sys_permission` (`id`,`available`,`name`,`parent_id`,`parent_ids`,`permission`,`resource_type`,`url`) VALUES (1,0,'用户管理',0,'0/','userInfo:view','menu','userInfo/userList');\nINSERT INTO `sys_permission` (`id`,`available`,`name`,`parent_id`,`parent_ids`,`permission`,`resource_type`,`url`) VALUES (2,0,'用户添加',1,'0/1','userInfo:add','button','userInfo/userAdd');\nINSERT INTO `sys_permission` (`id`,`available`,`name`,`parent_id`,`parent_ids`,`permission`,`resource_type`,`url`) VALUES (3,0,'用户删除',1,'0/1','userInfo:del','button','userInfo/userDel');\nINSERT INTO `sys_role` (`id`,`available`,`description`,`role`) VALUES (1,0,'管理员','admin');\nINSERT INTO `sys_role` (`id`,`available`,`description`,`role`) VALUES (2,0,'VIP会员','vip');\nINSERT INTO `sys_role` (`id`,`available`,`description`,`role`) VALUES (3,1,'test','test');\nINSERT INTO `sys_role_permission` VALUES ('1', '1');\nINSERT INTO `sys_role_permission` (`permission_id`,`role_id`) VALUES (1,1);\nINSERT INTO `sys_role_permission` (`permission_id`,`role_id`) VALUES (2,1);\nINSERT INTO `sys_role_permission` (`permission_id`,`role_id`) VALUES (3,2);\nINSERT INTO `sys_user_role` (`role_id`,`uid`) VALUES (1,1);"
  },
  {
    "path": "2.x/spring-boot-shiro/src/main/resources/templates/403.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>403</title>\n</head>\n<body>\n<h3>403没有权限</h3>\n</body>\n</html>"
  },
  {
    "path": "2.x/spring-boot-shiro/src/main/resources/templates/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>index</title>\n</head>\n<body>\n<h1>index</h1>\n</body>\n</html>"
  },
  {
    "path": "2.x/spring-boot-shiro/src/main/resources/templates/login.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>Login</title>\n</head>\n<body>\n错误信息：<h4 th:text=\"${msg}\"></h4>\n<form action=\"\" method=\"post\">\n    <p>账号：<input type=\"text\" name=\"username\" value=\"admin\"/></p>\n    <p>密码：<input type=\"text\" name=\"password\" value=\"123456\"/></p>\n    <p><input type=\"submit\" value=\"登录\"/></p>\n</form>\n</body>\n</html>"
  },
  {
    "path": "2.x/spring-boot-shiro/src/main/resources/templates/userInfo.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>UserInfo</title>\n</head>\n<body>\n<h3>用户查询界面</h3>\n</body>\n</html>"
  },
  {
    "path": "2.x/spring-boot-shiro/src/main/resources/templates/userInfoAdd.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>Add</title>\n</head>\n<body>\n<h3>用户添加界面</h3>\n</body>\n</html>"
  },
  {
    "path": "2.x/spring-boot-shiro/src/main/resources/templates/userInfoDel.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>Del</title>\n</head>\n<body>\n<h3>用户删除界面</h3>\n</body>\n</html>"
  },
  {
    "path": "2.x/spring-boot-shiro/src/test/java/com/neo/ShiroApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class ShiroApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t}\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-swagger/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\t<artifactId>spring-boot-swagger</artifactId>\n\t<name>Spring Boot swagger Sample</name>\n\t<description>Spring Boot swagger Sample</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>2.1.0.RELEASE</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<dependencies>\n\t\t<!-- Compile -->\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-web</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>io.springfox</groupId>\n\t\t\t<artifactId>springfox-swagger2</artifactId>\n\t\t\t<version>2.9.2</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>io.springfox</groupId>\n\t\t\t<artifactId>springfox-swagger-ui</artifactId>\n\t\t\t<version>2.9.2</version>\n\t\t</dependency>\n\t\t<!-- Test -->\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-devtools</artifactId>\n\t\t\t<scope>runtime</scope>\n\t\t\t<optional>true</optional>\n\t\t</dependency>\n\t</dependencies>\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t\t<configuration>\n\t\t\t\t\t<fork>true</fork>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\n</project>\n"
  },
  {
    "path": "2.x/spring-boot-swagger/src/main/java/com/neo/SwaggerApplication.java",
    "content": "\npackage com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n\n@SpringBootApplication\npublic class SwaggerApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(SwaggerApplication.class, args);\n\t}\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-swagger/src/main/java/com/neo/config/BaseResult.java",
    "content": "package com.neo.config;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\n\n/**\n * 通用响应对象\n */\n@ApiModel(description = \"响应对象\")\npublic class BaseResult<T> {\n    private static final int SUCCESS_CODE = 0;\n    private static final String SUCCESS_MESSAGE = \"成功\";\n\n    @ApiModelProperty(value = \"响应码\", name = \"code\", required = true, example = \"\" + SUCCESS_CODE)\n    private int code;\n\n    @ApiModelProperty(value = \"响应消息\", name = \"msg\", required = true, example = SUCCESS_MESSAGE)\n    private String msg;\n\n    @ApiModelProperty(value = \"响应数据\", name = \"data\")\n    private T data;\n\n    private BaseResult(int code, String msg, T data) {\n        this.code = code;\n        this.msg = msg;\n        this.data = data;\n    }\n\n    private BaseResult() {\n        this(SUCCESS_CODE, SUCCESS_MESSAGE);\n    }\n\n    private BaseResult(int code, String msg) {\n        this(code, msg, null);\n    }\n\n    private BaseResult(T data) {\n        this(SUCCESS_CODE, SUCCESS_MESSAGE, data);\n    }\n\n    public static <T> BaseResult<T> success() {\n        return new BaseResult<>();\n    }\n\n    public static <T> BaseResult<T> successWithData(T data) {\n        return new BaseResult<>(data);\n    }\n\n    public static <T> BaseResult<T> failWithCodeAndMsg(int code, String msg) {\n        return new BaseResult<>(code, msg, null);\n    }\n\n    public static <T> BaseResult<T> buildWithParam(ResponseParam param) {\n        return new BaseResult<>(param.getCode(), param.getMsg(), null);\n    }\n\n    public int getCode() {\n        return code;\n    }\n\n    public void setCode(int code) {\n        this.code = code;\n    }\n\n    public String getMsg() {\n        return msg;\n    }\n\n    public void setMsg(String msg) {\n        this.msg = msg;\n    }\n\n    public T getData() {\n        return data;\n    }\n\n    public void setData(T data) {\n        this.data = data;\n    }\n\n\n\n    public static class ResponseParam {\n        private int code;\n        private String msg;\n\n        private ResponseParam(int code, String msg) {\n            this.code = code;\n            this.msg = msg;\n        }\n\n        public static ResponseParam buildParam(int code, String msg) {\n            return new ResponseParam(code, msg);\n        }\n\n        public int getCode() {\n            return code;\n        }\n\n        public void setCode(int code) {\n            this.code = code;\n        }\n\n        public String getMsg() {\n            return msg;\n        }\n\n        public void setMsg(String msg) {\n            this.msg = msg;\n        }\n    }\n}\n"
  },
  {
    "path": "2.x/spring-boot-swagger/src/main/java/com/neo/config/SwaggerConfig.java",
    "content": "package com.neo.config;\n\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport springfox.documentation.builders.ApiInfoBuilder;\nimport springfox.documentation.builders.PathSelectors;\nimport springfox.documentation.builders.RequestHandlerSelectors;\nimport springfox.documentation.service.ApiInfo;\nimport springfox.documentation.service.Contact;\nimport springfox.documentation.spi.DocumentationType;\nimport springfox.documentation.spring.web.plugins.Docket;\nimport springfox.documentation.swagger2.annotations.EnableSwagger2;\n\n@Configuration\n@EnableSwagger2\npublic class SwaggerConfig {\n\n    @Bean\n    public Docket api() {\n        return new Docket(DocumentationType.SWAGGER_2)\n                .apiInfo(apiInfo())\n                .select()\n                // 自行修改为自己的包路径\n                .apis(RequestHandlerSelectors.basePackage(\"com.neo.controller\"))\n                .paths(PathSelectors.any())\n                .build();\n    }\n\n    private ApiInfo apiInfo() {\n        return new ApiInfoBuilder()\n                .title(\"客户管理\")\n                .description(\"客户管理中心 API 1.0 操作文档\")\n                //服务条款网址\n                .termsOfServiceUrl(\"http://www.ityouknow.com/\")\n                .version(\"1.0\")\n                .contact(new Contact(\"纯洁的微笑\", \"http://www.ityouknow.com/\", \"ityouknow@126.com\"))\n                .build();\n    }\n}"
  },
  {
    "path": "2.x/spring-boot-swagger/src/main/java/com/neo/controller/MessageController.java",
    "content": "\npackage com.neo.controller;\n\nimport com.neo.config.BaseResult;\nimport com.neo.model.Message;\nimport com.neo.repository.MessageRepository;\nimport io.swagger.annotations.*;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.List;\n\n@Api(value = \"消息\", description = \"消息操作 API\", position = 100, protocols = \"http\")\n@RestController\n@RequestMapping(\"/\")\npublic class MessageController {\n\n\t@Autowired\n\tprivate  MessageRepository messageRepository;\n\n\t@ApiOperation(\n\t\t\tvalue = \"消息列表\",\n\t\t\tnotes = \"完整的消息内容列表\",\n\t\t\tproduces=\"application/json, application/xml\",\n\t\t\tconsumes=\"application/json, application/xml\",\n\t\t\tresponse = List.class)\n\t@GetMapping(value = \"messages\")\n\tpublic List<Message> list() {\n\t\tList<Message> messages = this.messageRepository.findAll();\n\t\treturn messages;\n\t}\n\n\t@ApiOperation(\n\t\t\tvalue = \"添加消息\",\n\t\t\tnotes = \"根据参数创建消息\"\n\t)\n\t@ApiImplicitParams({\n\t\t\t@ApiImplicitParam(name = \"id\", value = \"消息 ID\", required = true, dataType = \"Long\", paramType = \"query\"),\n\t\t\t@ApiImplicitParam(name = \"text\", value = \"正文\", required = true, dataType = \"String\", paramType = \"query\"),\n\t\t\t@ApiImplicitParam(name = \"summary\", value = \"摘要\", required = false, dataType = \"String\", paramType = \"query\"),\n\t})\n\t@PostMapping(value = \"message\")\n\tpublic Message create(Message message) {\n\t\tSystem.out.println(\"message====\"+message.toString());\n\t\tmessage = this.messageRepository.save(message);\n\t\treturn message;\n\t}\n\n\t@ApiOperation(\n\t\t\tvalue = \"修改消息\",\n\t\t\tnotes = \"根据参数修改消息\"\n\t)\n\t@PutMapping(value = \"message\")\n\t@ApiResponses({\n\t\t\t@ApiResponse(code = 100, message = \"请求参数有误\"),\n\t\t\t@ApiResponse(code = 101, message = \"未授权\"),\n\t\t\t@ApiResponse(code = 103, message = \"禁止访问\"),\n\t\t\t@ApiResponse(code = 104, message = \"请求路径不存在\"),\n\t\t\t@ApiResponse(code = 200, message = \"服务器内部错误\")\n\t})\n\tpublic Message modify(Message message) {\n\t\tMessage messageResult=this.messageRepository.update(message);\n\t\treturn messageResult;\n\t}\n\n\t@PatchMapping(value=\"/message/text\")\n\tpublic BaseResult<Message> patch(Message message) {\n\t\tMessage messageResult=this.messageRepository.updateText(message);\n\t\treturn BaseResult.successWithData(messageResult);\n\t}\n\n\t@GetMapping(value = \"message/{id}\")\n\tpublic Message get(@PathVariable Long id) {\n\t\tMessage message = this.messageRepository.findMessage(id);\n\t\treturn message;\n\t}\n\n\t@DeleteMapping(value = \"message/{id}\")\n\tpublic void delete(@PathVariable(\"id\") Long id) {\n\t\tthis.messageRepository.deleteMessage(id);\n\t}\n\n\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-swagger/src/main/java/com/neo/controller/UserController.java",
    "content": "package com.neo.controller;\n\nimport com.neo.config.BaseResult;\nimport com.neo.model.User;\nimport io.swagger.annotations.*;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestMethod;\nimport org.springframework.web.bind.annotation.RestController;\nimport springfox.documentation.annotations.ApiIgnore;\n\nimport java.util.*;\n\n\n@Api(value = \"用户管理\", description = \"用户管理API\", position = 100, protocols = \"http\")\n@RestController\n@RequestMapping(value = \"/user\")\npublic class UserController {\n    static Map<Long, User> users = Collections.synchronizedMap(new HashMap<>());\n\n    @ApiOperation(value = \"获取用户列表\", notes = \"查询用户列表\")\n    @RequestMapping(value = {\"\"}, method = RequestMethod.GET)\n    @ApiResponses({\n            @ApiResponse(code = 100, message = \"异常数据\")\n    })\n    public List<User> getUserList() {\n        return new ArrayList<>(users.values());\n    }\n\n    @ApiOperation(value = \"创建用户\", notes = \"根据User对象创建用户\")\n    @ApiImplicitParams({\n            @ApiImplicitParam(name = \"id\", value = \"用户ID\", required = true, dataType = \"Long\", paramType = \"query\"),\n            @ApiImplicitParam(name = \"name\", value = \"用户名\", required = true, dataType = \"String\", paramType = \"query\"),\n            @ApiImplicitParam(name = \"age\", value = \"年龄\", required = true, dataType = \"String\", paramType = \"query\"),\n            @ApiImplicitParam(name = \"ipAddr\", value = \"ip哟\", required = false, dataType = \"String\", paramType = \"query\")\n    })\n    @RequestMapping(value = \"\", method = RequestMethod.POST)\n    public BaseResult<User> postUser(@ApiIgnore User user) {\n        users.put(user.getId(), user);\n        return BaseResult.successWithData(user);\n    }\n\n    @ApiOperation(value = \"获取用户详细信息\", notes = \"根据url的id来获取用户详细信息\")\n    @ApiImplicitParam(name = \"id\", value = \"用户ID\", required = true, dataType = \"Long\", paramType = \"path\")\n    @RequestMapping(value = \"/{id}\", method = RequestMethod.GET)\n    public User getUser(@PathVariable Long id) {\n        return users.get(id);\n    }\n\n    @ApiOperation(value = \"更新用户信息\", notes = \"根据用户ID更新信息\")\n    @ApiImplicitParams({\n            @ApiImplicitParam(name = \"id\", value = \"用户ID\", required = true, dataType = \"Long\", paramType = \"query\"),\n            @ApiImplicitParam(name = \"name\", value = \"用户名\", required = true, dataType = \"String\", paramType = \"query\"),\n            @ApiImplicitParam(name = \"age\", value = \"年龄\", required = true, dataType = \"String\", paramType = \"query\")\n    })\n    @RequestMapping(value = \"/{id}\", method = RequestMethod.PUT)\n    public BaseResult<User> putUser(@PathVariable Long id, @ApiIgnore User user) {\n        User u = users.get(id);\n        u.setName(user.getName());\n        u.setAge(user.getAge());\n        users.put(id, u);\n        return BaseResult.successWithData(u);\n    }\n\n    @RequestMapping(value = \"/{id}\", method = RequestMethod.DELETE)\n    public String deleteUser(@PathVariable Long id) {\n        users.remove(id);\n        return \"success\";\n    }\n\n    @RequestMapping(value = \"/ignoreMe/{id}\", method = RequestMethod.DELETE)\n    public String ignoreMe(@PathVariable Long id) {\n        users.remove(id);\n        return \"success\";\n    }\n}"
  },
  {
    "path": "2.x/spring-boot-swagger/src/main/java/com/neo/model/Message.java",
    "content": "package com.neo.model;\n\nimport io.swagger.annotations.ApiModelProperty;\n\nimport java.util.Calendar;\nimport java.util.Date;\n\nimport javax.validation.constraints.NotEmpty;\n\n\npublic class Message {\n\tprivate Long id;\n\t@ApiModelProperty(value = \"消息体\")\n\tprivate String text;\n\t@ApiModelProperty(value = \"消息总结\")\n\tprivate String summary;\n\tprivate Date createDate;\n\n\tpublic Long getId() {\n\t\treturn this.id;\n\t}\n\n\tpublic void setId(Long id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic Date getCreateDate() {\n\t\treturn createDate;\n\t}\n\n\tpublic void setCreateDate(Date createDate) {\n\t\tthis.createDate = createDate;\n\t}\n\n\tpublic String getText() {\n\t\treturn this.text;\n\t}\n\n\tpublic void setText(String text) {\n\t\tthis.text = text;\n\t}\n\n\tpublic String getSummary() {\n\t\treturn this.summary;\n\t}\n\n\tpublic void setSummary(String summary) {\n\t\tthis.summary = summary;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\treturn \"Message{\" +\n\t\t\t\t\"id=\" + id +\n\t\t\t\t\", text='\" + text + '\\'' +\n\t\t\t\t\", summary='\" + summary + '\\'' +\n\t\t\t\t\", createDate=\" + createDate +\n\t\t\t\t'}';\n\t}\n}\n"
  },
  {
    "path": "2.x/spring-boot-swagger/src/main/java/com/neo/model/User.java",
    "content": "package com.neo.model;\n\npublic class User {\n    private Long id;\n    private String name;\n    private int age;\n\n    public Long getId() {\n        return id;\n    }\n\n    public void setId(Long id) {\n        this.id = id;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public int getAge() {\n        return age;\n    }\n\n    public void setAge(int age) {\n        this.age = age;\n    }\n}\n"
  },
  {
    "path": "2.x/spring-boot-swagger/src/main/java/com/neo/repository/InMemoryMessageRepository.java",
    "content": "package com.neo.repository;\n\nimport com.neo.model.Message;\nimport org.springframework.stereotype.Service;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.concurrent.ConcurrentMap;\nimport java.util.concurrent.atomic.AtomicLong;\n\n@Service(\"messageRepository\")\npublic class InMemoryMessageRepository implements MessageRepository {\n\n\tprivate static AtomicLong counter = new AtomicLong();\n\tprivate final ConcurrentMap<Long, Message> messages = new ConcurrentHashMap<>();\n\n\t@Override\n\tpublic List<Message> findAll() {\n\t\tList<Message> messages = new ArrayList<Message>(this.messages.values());\n\t\treturn messages;\n\t}\n\n\t@Override\n\tpublic Message save(Message message) {\n\t\tLong id = message.getId();\n\t\tif (id == null) {\n\t\t\tid = counter.incrementAndGet();\n\t\t\tmessage.setId(id);\n\t\t}\n\t\tthis.messages.put(id, message);\n\t\treturn message;\n\t}\n\n\t@Override\n\tpublic Message update(Message message) {\n\t\tthis.messages.put(message.getId(), message);\n\t\treturn message;\n\t}\n\n\t@Override\n\tpublic Message updateText(Message message) {\n\t\tMessage msg=this.messages.get(message.getId());\n\t\tmsg.setText(message.getText());\n\t\tthis.messages.put(msg.getId(), msg);\n\t\treturn msg;\n\t}\n\n\t@Override\n\tpublic Message findMessage(Long id) {\n\t\treturn this.messages.get(id);\n\t}\n\n\t@Override\n\tpublic void deleteMessage(Long id) {\n\t\tthis.messages.remove(id);\n\t}\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-swagger/src/main/java/com/neo/repository/MessageRepository.java",
    "content": "\npackage com.neo.repository;\n\nimport com.neo.model.Message;\n\nimport java.util.List;\n\npublic interface MessageRepository {\n\n\tList<Message> findAll();\n\n\tMessage save(Message message);\n\n\tMessage update(Message message);\n\n\tMessage updateText(Message message);\n\n\tMessage findMessage(Long id);\n\n\tvoid deleteMessage(Long id);\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-swagger/src/main/resources/application.properties",
    "content": "logging.level.io.swagger.models.parameters.AbstractSerializableParameter=error"
  },
  {
    "path": "2.x/spring-boot-swagger/src/main/resources/logback.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration>\n\n\t<include resource=\"org/springframework/boot/logging/logback/base.xml\"/>\n\n\t<!-- logger name=\"org.springframework\" level=\"DEBUG\"/-->\n\n</configuration>\n"
  },
  {
    "path": "2.x/spring-boot-swagger/src/test/java/com/neo/SwaggerApplicationTests.java",
    "content": "\npackage com.neo;\n\n\n\nimport org.junit.Test;\n\npublic class SwaggerApplicationTests {\n\n\t@Test\n\tpublic void test() {\n\t}\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-swagger/src/test/java/com/neo/web/MessageControllerTest.java",
    "content": "package com.neo.web;\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\nimport org.springframework.test.web.servlet.MockMvc;\nimport org.springframework.test.web.servlet.MvcResult;\nimport org.springframework.test.web.servlet.request.MockMvcRequestBuilders;\nimport org.springframework.test.web.servlet.setup.MockMvcBuilders;\nimport org.springframework.util.LinkedMultiValueMap;\nimport org.springframework.util.MultiValueMap;\nimport org.springframework.web.context.WebApplicationContext;\n\nimport static org.springframework.test.web.servlet.result.MockMvcResultHandlers.*;\nimport static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;\nimport static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class MessageControllerTest {\n\n    @Autowired\n    private WebApplicationContext wac;\n\n    private MockMvc mockMvc;\n\n    @Before\n    public void setup() {\n        this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();\n        saveMessages();\n    }\n\n    @Test\n    public void saveMessage() throws Exception {\n        final MultiValueMap<String, String> params = new LinkedMultiValueMap<>();\n        params.add(\"text\", \"text\");\n        params.add(\"summary\", \"summary\");\n        String mvcResult=  mockMvc.perform(MockMvcRequestBuilders.post(\"/message\")\n                .params(params)).andReturn().getResponse().getContentAsString();\n        System.out.println(\"Result === \"+mvcResult);\n    }\n\n    @Test\n    public void getAllMessages() throws Exception {\n        String mvcResult= mockMvc.perform(MockMvcRequestBuilders.get(\"/messages\"))\n                .andReturn().getResponse().getContentAsString();\n        System.out.println(\"Result === \"+mvcResult);\n    }\n\n    @Test\n    public void getMessage() throws Exception {\n        String mvcResult= mockMvc.perform(MockMvcRequestBuilders.get(\"/message/6\"))\n                .andReturn().getResponse().getContentAsString();\n        System.out.println(\"Result === \"+mvcResult);\n    }\n\n    @Test\n    public void modifyMessage() throws Exception {\n        final MultiValueMap<String, String> params = new LinkedMultiValueMap<>();\n        params.add(\"id\", \"6\");\n        params.add(\"text\", \"text\");\n        params.add(\"summary\", \"summary\");\n        String mvcResult= mockMvc.perform(MockMvcRequestBuilders.put(\"/message\").params(params))\n                .andReturn().getResponse().getContentAsString();\n        System.out.println(\"Result === \"+mvcResult);\n    }\n\n    @Test\n    public void patchMessage() throws Exception {\n        final MultiValueMap<String, String> params = new LinkedMultiValueMap<>();\n        params.add(\"id\", \"6\");\n        params.add(\"text\", \"text\");\n        String mvcResult= mockMvc.perform(MockMvcRequestBuilders.patch(\"/message/text\").params(params))\n                .andReturn().getResponse().getContentAsString();\n        System.out.println(\"Result === \"+mvcResult);\n    }\n\n    @Test\n    public void deleteMessage() throws Exception {\n        mockMvc.perform(MockMvcRequestBuilders.delete(\"/message/6\"))\n                .andReturn();\n        String mvcResult= mockMvc.perform(MockMvcRequestBuilders.get(\"/messages\"))\n                .andReturn().getResponse().getContentAsString();\n        System.out.println(\"Result === \"+mvcResult);\n    }\n\n    private void  saveMessages()  {\n        for (int i=1;i<10;i++){\n            final MultiValueMap<String, String> params = new LinkedMultiValueMap<>();\n            params.add(\"id\",\"\"+i);\n            params.add(\"text\", \"text\"+i);\n            params.add(\"summary\", \"summary\"+i);\n            try {\n                MvcResult mvcResult=  mockMvc.perform(MockMvcRequestBuilders.post(\"/message\")\n                        .params(params)).andReturn();\n            } catch (Exception e) {\n                e.printStackTrace();\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-thymeleaf/spring-boot-thymeleaf/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-thymeleaf</artifactId>\n\t<version>0.0.1-SNAPSHOT</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-thymeleaf</name>\n\t<description>Demo project for Spring Boot</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>2.1.0.RELEASE</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-web</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-thymeleaf</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-devtools</artifactId>\n\t\t\t<scope>runtime</scope>\n\t\t\t<optional>true</optional>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t</dependencies>\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t\t<configuration>\n\t\t\t\t\t<fork>true</fork>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\n\n</project>\n"
  },
  {
    "path": "2.x/spring-boot-thymeleaf/spring-boot-thymeleaf/src/main/java/com/neo/ThymeleafApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class ThymeleafApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(ThymeleafApplication.class, args);\n\t}\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-thymeleaf/spring-boot-thymeleaf/src/main/java/com/neo/model/User.java",
    "content": "package com.neo.model;\n\nimport org.hibernate.validator.constraints.Length;\nimport org.hibernate.validator.constraints.NotEmpty;\n\nimport javax.validation.constraints.Max;\nimport javax.validation.constraints.Min;\nimport javax.validation.constraints.Size;\n\npublic class User {\n    private String name;\n    private int age;\n    private String pass;\n\n    public User(String name, int age, String pass) {\n        this.name = name;\n        this.age = age;\n        this.pass = pass;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public int getAge() {\n        return age;\n    }\n\n    public void setAge(int age) {\n        this.age = age;\n    }\n\n    public String getPass() {\n        return pass;\n    }\n\n    public void setPass(String pass) {\n        this.pass = pass;\n    }\n\n    @Override\n    public String toString() {\n        return (\"name=\" + this.name + \",age=\" + this.age + \",pass=\" + this.pass);\n    }\n}\n"
  },
  {
    "path": "2.x/spring-boot-thymeleaf/spring-boot-thymeleaf/src/main/java/com/neo/web/ExampleController.java",
    "content": "package com.neo.web;\n\nimport com.neo.model.User;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.ui.ModelMap;\nimport org.springframework.web.bind.annotation.RequestMapping;\n\nimport java.util.ArrayList;\nimport java.util.Date;\nimport java.util.List;\n\n@Controller\npublic class ExampleController {\n\n    @RequestMapping(\"/string\")\n    public String string(ModelMap map) {\n        map.addAttribute(\"userName\", \"ityouknow\");\n        return \"string\";\n    }\n\n    @RequestMapping(\"/if\")\n    public String ifunless(ModelMap map) {\n        map.addAttribute(\"flag\", \"yes\");\n        return \"if\";\n    }\n\n    @RequestMapping(\"/list\")\n    public String list(ModelMap map) {\n        map.addAttribute(\"users\", getUserList());\n        return \"list\";\n    }\n\n    @RequestMapping(\"/url\")\n    public String url(ModelMap map) {\n        map.addAttribute(\"type\", \"link\");\n        map.addAttribute(\"pageId\", \"springcloud/2017/09/11/\");\n        map.addAttribute(\"img\", \"http://www.ityouknow.com/assets/images/neo.jpg\");\n        return \"url\";\n    }\n\n    @RequestMapping(\"/eq\")\n    public String eq(ModelMap map) {\n        map.addAttribute(\"name\", \"neo\");\n        map.addAttribute(\"age\", 30);\n        map.addAttribute(\"flag\", \"yes\");\n        return \"eq\";\n    }\n\n    @RequestMapping(\"/switch\")\n    public String switchcase(ModelMap map) {\n        map.addAttribute(\"sex\", \"woman\");\n        return \"switch\";\n    }\n\n    private List<User> getUserList(){\n        List<User> list=new ArrayList<User>();\n        User user1=new User(\"大牛\",12,\"123456\");\n        User user2=new User(\"小牛\",6,\"123563\");\n        User user3=new User(\"纯洁的微笑\",66,\"666666\");\n        list.add(user1);\n        list.add(user2);\n        list.add(user3);\n        return  list;\n    }\n\n}"
  },
  {
    "path": "2.x/spring-boot-thymeleaf/spring-boot-thymeleaf/src/main/java/com/neo/web/HelloController.java",
    "content": "package com.neo.web;\n\nimport org.springframework.stereotype.Controller;\nimport org.springframework.ui.ModelMap;\nimport org.springframework.web.bind.annotation.RequestMapping;\n\n@Controller\npublic class HelloController {\n\n    @RequestMapping(\"/\")\n    public String index(ModelMap map) {\n        map.addAttribute(\"message\", \"http://www.ityouknow.com\");\n        return \"hello\";\n    }\n\n}"
  },
  {
    "path": "2.x/spring-boot-thymeleaf/spring-boot-thymeleaf/src/main/resources/application.properties",
    "content": "spring.thymeleaf.cache=false"
  },
  {
    "path": "2.x/spring-boot-thymeleaf/spring-boot-thymeleaf/src/main/resources/templates/eq.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\"  xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"UTF-8\"></meta>\n    <title>Example gt eq  </title>\n</head>\n<body>\n<div >\n    <h1>EQ</h1>\n    <input th:value=\"${name}\"/>\n    <br/>\n    <input th:value=\"${age gt 30 ? '中年':'年轻'}\"/>\n    <br/>\n    <a th:if=\"${flag eq 'yes'}\"  th:href=\"@{http://favorites.ren/}\"> favorites </a>\n</div>\n</body>\n</html>"
  },
  {
    "path": "2.x/spring-boot-thymeleaf/spring-boot-thymeleaf/src/main/resources/templates/hello.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"UTF-8\"></meta>\n    <title>Hello</title>\n</head>\n<body>\n<h1  th:text=\"${message}\">Hello World</h1>\n</body>\n</html>"
  },
  {
    "path": "2.x/spring-boot-thymeleaf/spring-boot-thymeleaf/src/main/resources/templates/if.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\"  xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"UTF-8\"></meta>\n    <title>Example If/Unless </title>\n</head>\n<body>\n<div >\n    <h1>If/Unless</h1>\n    <a th:if=\"${flag == 'yes'}\"  th:href=\"@{http://favorites.ren/}\"> home </a>\n    <br/>\n    <a th:unless=\"${flag != 'no'}\" th:href=\"@{http://www.ityouknow.com/}\" >ityouknow</a>\n</div>\n</body>\n</html>"
  },
  {
    "path": "2.x/spring-boot-thymeleaf/spring-boot-thymeleaf/src/main/resources/templates/list.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\"  xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"UTF-8\"></meta>\n    <title>Example If/Unless </title>\n</head>\n<body>\n<div >\n    <h1>for 循环</h1>\n    <table>\n        <tr  th:each=\"user,iterStat : ${users}\">\n            <td th:text=\"${user.name}\">neo</td>\n            <td th:text=\"${user.age}\">6</td>\n            <td th:text=\"${user.pass}\">213</td>\n            <td th:text=\"${iterStat.index}\">index</td>\n        </tr>\n    </table>\n</div>\n</body>\n</html>"
  },
  {
    "path": "2.x/spring-boot-thymeleaf/spring-boot-thymeleaf/src/main/resources/templates/string.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\"  xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"UTF-8\"></meta>\n    <title>Example String </title>\n</head>\n<body>\n    <div >\n        <h1>text</h1>\n        <p th:text=\"${userName}\">neo</p>\n        <span th:text=\"'Welcome to our application, ' + ${userName} + '!'\"></span>\n        <br/>\n        <span th:text=\"|Welcome to our application, ${userName}!|\"></span>\n    </div>\n</body>\n</html>"
  },
  {
    "path": "2.x/spring-boot-thymeleaf/spring-boot-thymeleaf/src/main/resources/templates/switch.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\"  xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"UTF-8\"></meta>\n    <title>Example switch </title>\n</head>\n<body>\n<div >\n    <div th:switch=\"${sex}\">\n        <p th:case=\"'woman'\">她是一个姑娘...</p>\n        <p th:case=\"'man'\">这是一个爷们!</p>\n        <!-- *: case的默认的选项 -->\n        <p th:case=\"*\">未知性别的一个家伙。</p>\n    </div>\n</div>\n</body>\n</html>"
  },
  {
    "path": "2.x/spring-boot-thymeleaf/spring-boot-thymeleaf/src/main/resources/templates/url.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\"  xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"UTF-8\"></meta>\n    <title>Example If/Unless </title>\n</head>\n<body>\n<div >\n    <h1>URL</h1>\n    <a  th:href=\"@{http://www.ityouknow.com/{type}(type=${type})}\">link1</a>\n    <br/>\n    <a th:href=\"@{http://www.ityouknow.com/{pageId}/can-use-springcloud.html(pageId=${pageId})}\">view</a>\n    <br/>\n    <div th:style=\"'background:url(' + @{${img}} + ');'\">\n        <br/><br/><br/>\n    </div>\n</div>\n</body>\n</html>"
  },
  {
    "path": "2.x/spring-boot-thymeleaf/spring-boot-thymeleaf/src/test/java/com/neo/ThymeleafApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class ThymeleafApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t}\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-thymeleaf/spring-boot-thymeleaf-layout/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-thymeleaf-layout</artifactId>\n\t<version>0.0.1-SNAPSHOT</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-thymeleaf-layout</name>\n\t<description>Demo project for Spring Boot</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>2.1.0.RELEASE</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-web</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-thymeleaf</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>nz.net.ultraq.thymeleaf</groupId>\n\t\t\t<artifactId>thymeleaf-layout-dialect</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-devtools</artifactId>\n\t\t\t<scope>runtime</scope>\n\t\t\t<optional>true</optional>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t</dependencies>\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t\t<configuration>\n\t\t\t\t\t<fork>true</fork>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\n\n</project>\n"
  },
  {
    "path": "2.x/spring-boot-thymeleaf/spring-boot-thymeleaf-layout/src/main/java/com/neo/TLayoutApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class TLayoutApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(TLayoutApplication.class, args);\n\t}\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-thymeleaf/spring-boot-thymeleaf-layout/src/main/java/com/neo/web/IndexController.java",
    "content": "package com.neo.web;\n\nimport org.springframework.stereotype.Controller;\nimport org.springframework.ui.ModelMap;\nimport org.springframework.web.bind.annotation.RequestMapping;\n\n@Controller\npublic class IndexController {\n\n    @RequestMapping(\"/index\")\n    public String index() {\n        return \"index\";\n    }\n\n    @RequestMapping(\"/fragment\")\n    public String fragment() {\n        return \"fragment\";\n    }\n\n    @RequestMapping(\"/layout\")\n    public String layout() {\n        return \"layout\";\n    }\n\n    @RequestMapping(\"/home\")\n    public String home() {\n        return \"home\";\n    }\n\n\n}"
  },
  {
    "path": "2.x/spring-boot-thymeleaf/spring-boot-thymeleaf-layout/src/main/resources/application.properties",
    "content": "com.neo.title=\\u7EAF\\u6D01\\u7684\\u5FAE\\u7B11\ncom.neo.description=\\u5206\\u4EAB\\u751F\\u6D3B\\u548C\\u6280\\u672F"
  },
  {
    "path": "2.x/spring-boot-thymeleaf/spring-boot-thymeleaf-layout/src/main/resources/templates/base.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<head th:fragment=\"common_header(title,links)\">\n    <title th:replace=\"${title}\">comm title</title>\n\n    <link rel=\"stylesheet\" type=\"text/css\" media=\"all\" th:href=\"@{/css/myapp.css}\">\n    <link rel=\"shortcut icon\" th:href=\"@{/images/favicon.ico}\">\n    <script type=\"text/javascript\" th:src=\"@{/js/myapp.js}\"></script>\n\n    <th:block th:replace=\"${links}\" />\n</head>\n<body>\n\n</body>\n</html>"
  },
  {
    "path": "2.x/spring-boot-thymeleaf/spring-boot-thymeleaf-layout/src/main/resources/templates/fragment.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<head th:replace=\"base :: common_header(~{::title},~{::link})\">\n    <title>Fragment - Page</title>\n    <link rel=\"stylesheet\" th:href=\"@{/css/bootstrap.min.css}\">\n    <link rel=\"stylesheet\" th:href=\"@{/cs/fragment.css}\">\n</head>\n<body>\n\n</body>\n</html>"
  },
  {
    "path": "2.x/spring-boot-thymeleaf/spring-boot-thymeleaf-layout/src/main/resources/templates/home.html",
    "content": "<html xmlns:th=\"http://www.thymeleaf.org\"  xmlns:layout=\"http://www.ultraq.net.nz/web/thymeleaf/layout\" layout:decorate=\"layout\">\n<head>\n    <meta charset=\"UTF-8\"></meta>\n    <title>Home</title>\n</head>\n<body>\n    <div  layout:fragment=\"content\" >\n        <h2>个性化的内容</h2>\n    </div>\n</body>\n</html>\n"
  },
  {
    "path": "2.x/spring-boot-thymeleaf/spring-boot-thymeleaf-layout/src/main/resources/templates/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"UTF-8\"></meta>\n    <title>Index</title>\n</head>\n<body>\n    <div th:insert=\"layout/copyright :: copyright\"></div>\n    <div th:replace=\"layout/copyright :: copyright\"></div>\n</body>\n</html>"
  },
  {
    "path": "2.x/spring-boot-thymeleaf/spring-boot-thymeleaf-layout/src/main/resources/templates/layout/copyright.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"UTF-8\"></meta>\n    <title>Title</title>\n</head>\n<body>\n<copyright th:fragment=\"copyright\">\n    &copy; 2018\n</copyright>\n</body>\n</html>"
  },
  {
    "path": "2.x/spring-boot-thymeleaf/spring-boot-thymeleaf-layout/src/main/resources/templates/layout/footer.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"UTF-8\"></meta>\n    <title>footer</title>\n</head>\n<body>\n<footer th:fragment=\"footer\">\n    <h1>我是 尾部</h1>\n</footer>\n</body>\n</html>"
  },
  {
    "path": "2.x/spring-boot-thymeleaf/spring-boot-thymeleaf-layout/src/main/resources/templates/layout/header.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\"  xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"UTF-8\"></meta>\n    <title>header</title>\n</head>\n<body>\n<header th:fragment=\"header\">\n    <h1>我是 头部</h1>\n</header>\n</body>\n</html>"
  },
  {
    "path": "2.x/spring-boot-thymeleaf/spring-boot-thymeleaf-layout/src/main/resources/templates/layout/left.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\"  xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"UTF-8\"></meta>\n    <title>left</title>\n</head>\n<body>\n<left th:fragment=\"left\">\n    <h1>我是 左侧</h1>\n</left>\n</body>\n</html>"
  },
  {
    "path": "2.x/spring-boot-thymeleaf/spring-boot-thymeleaf-layout/src/main/resources/templates/layout.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\" xmlns:layout=\"http://www.ultraq.net.nz/web/thymeleaf/layout\">\n<head>\n    <meta charset=\"UTF-8\"></meta>\n    <title>Layout</title>\n</head>\n<body>\n<div >\n    <div th:replace=\"layout/header :: header\"></div>\n    <div th:replace=\"layout/left :: left\"></div>\n    <div layout:fragment=\"content\" > content</div>\n    <div th:replace=\"layout/footer :: footer\"></div>\n</div>\n</body>\n</html>"
  },
  {
    "path": "2.x/spring-boot-thymeleaf/spring-boot-thymeleaf-layout/src/test/java/com/neo/TLayoutApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class TLayoutApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t}\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-web/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-web</artifactId>\n\t<version>1.0.01-SNAPSHOT</version>\n\t<packaging>war</packaging>\n\n\t<name>spring-boot-web</name>\n\t<description>Demo project for Spring Boot</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>2.1.3.RELEASE</version>\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-web</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-thymeleaf</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-data-jpa</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>mysql</groupId>\n\t\t\t<artifactId>mysql-connector-java</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.webjars.bower</groupId>\n\t\t\t<artifactId>jquery</artifactId>\n\t\t\t<version>2.0.3</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.webjars.bower</groupId>\n\t\t\t<artifactId>bootstrap</artifactId>\n\t\t\t<version>3.0.3</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t</dependencies>\n\t\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\t\n\n</project>\n"
  },
  {
    "path": "2.x/spring-boot-web/src/main/java/com/neo/WebApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class WebApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(WebApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "2.x/spring-boot-web/src/main/java/com/neo/WebConfiguration.java",
    "content": "package com.neo;\n\nimport java.io.IOException;\n\nimport javax.servlet.Filter;\nimport javax.servlet.FilterChain;\nimport javax.servlet.FilterConfig;\nimport javax.servlet.ServletException;\nimport javax.servlet.ServletRequest;\nimport javax.servlet.ServletResponse;\nimport javax.servlet.http.HttpServletRequest;\n\nimport org.apache.catalina.filters.RemoteIpFilter;\nimport org.springframework.boot.web.servlet.FilterRegistrationBean;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n@Configuration\npublic class WebConfiguration {\n    @Bean\n    public RemoteIpFilter remoteIpFilter() {\n        return new RemoteIpFilter();\n    }\n    \n    @Bean\n    public FilterRegistrationBean testFilterRegistration() {\n\n        FilterRegistrationBean registration = new FilterRegistrationBean();\n        registration.setFilter(new MyFilter());\n        registration.addUrlPatterns(\"/*\");\n        registration.addInitParameter(\"paramName\", \"paramValue\");\n        registration.setName(\"MyFilter\");\n        registration.setOrder(1);\n        return registration;\n    }\n    \n    public class MyFilter implements Filter {\n\t\t@Override\n\t\tpublic void destroy() {\n\t\t\t// TODO Auto-generated method stub\n\t\t}\n\n\t\t@Override\n\t\tpublic void doFilter(ServletRequest srequest, ServletResponse sresponse, FilterChain filterChain)\n\t\t\t\tthrows IOException, ServletException {\n\t\t\t// TODO Auto-generated method stub\n\t\t\tHttpServletRequest request = (HttpServletRequest) srequest;\n\t\t\tSystem.out.println(\"this is MyFilter,url :\"+request.getRequestURI());\n\t\t\tfilterChain.doFilter(srequest, sresponse);\n\t\t}\n\n\t\t@Override\n\t\tpublic void init(FilterConfig arg0) throws ServletException {\n\t\t\t// TODO Auto-generated method stub\n\t\t}\n    }\n}\n\n\n\n"
  },
  {
    "path": "2.x/spring-boot-web/src/main/java/com/neo/model/User.java",
    "content": "package com.neo.model;\n\nimport java.io.Serializable;\n\nimport javax.persistence.Column;\nimport javax.persistence.Entity;\nimport javax.persistence.GeneratedValue;\nimport javax.persistence.Id;\n\n@Entity\npublic class User implements Serializable {\n\n\tprivate static final long serialVersionUID = 1L;\n\t@Id\n\t@GeneratedValue\n\tprivate Long id;\n\t@Column(nullable = false, unique = true)\n\tprivate String userName;\n\t@Column(nullable = false)\n\tprivate String passWord;\n\t@Column(nullable = false, unique = true)\n\tprivate String email;\n\t@Column(nullable = true, unique = true)\n\tprivate String nickName;\n\t@Column(nullable = false)\n\tprivate String regTime;\n\n\tpublic User() {\n\t\tsuper();\n\t}\n\tpublic User(String nickName,String email,String userName,  String passWord, String regTime) {\n\t\tsuper();\n\t\tthis.email = email;\n\t\tthis.nickName = nickName;\n\t\tthis.passWord = passWord;\n\t\tthis.userName = userName;\n\t\tthis.regTime = regTime;\n\t}\n\tpublic Long getId() {\n\t\treturn id;\n\t}\n\tpublic void setId(Long id) {\n\t\tthis.id = id;\n\t}\n\tpublic String getUserName() {\n\t\treturn userName;\n\t}\n\tpublic void setUserName(String userName) {\n\t\tthis.userName = userName;\n\t}\n\tpublic String getPassWord() {\n\t\treturn passWord;\n\t}\n\tpublic void setPassWord(String passWord) {\n\t\tthis.passWord = passWord;\n\t}\n\tpublic String getEmail() {\n\t\treturn email;\n\t}\n\tpublic void setEmail(String email) {\n\t\tthis.email = email;\n\t}\n\tpublic String getNickName() {\n\t\treturn nickName;\n\t}\n\tpublic void setNickName(String nickName) {\n\t\tthis.nickName = nickName;\n\t}\n\tpublic String getRegTime() {\n\t\treturn regTime;\n\t}\n\tpublic void setRegTime(String regTime) {\n\t\tthis.regTime = regTime;\n\t}\n\n}"
  },
  {
    "path": "2.x/spring-boot-web/src/main/java/com/neo/repository/UserRepository.java",
    "content": "package com.neo.repository;\n\nimport com.neo.model.User;\nimport org.springframework.data.jpa.repository.JpaRepository;\n\npublic interface UserRepository extends JpaRepository<User, Long> {\n\n    User findByUserName(String userName);\n\n    User findByUserNameOrEmail(String username, String email);\n    \n}"
  },
  {
    "path": "2.x/spring-boot-web/src/main/java/com/neo/util/NeoProperties.java",
    "content": "package com.neo.util;\n\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class NeoProperties {\n\t\n\t@Value(\"${com.neo.title}\")\n\tprivate String title;\n\t@Value(\"${com.neo.description}\")\n\tprivate String description;\n\tpublic String getTitle() {\n\t\treturn title;\n\t}\n\tpublic void setTitle(String title) {\n\t\tthis.title = title;\n\t}\n\tpublic String getDescription() {\n\t\treturn description;\n\t}\n\tpublic void setDescription(String description) {\n\t\tthis.description = description;\n\t}\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-web/src/main/java/com/neo/web/HelloController.java",
    "content": "package com.neo.web;\n\nimport java.util.Locale;\nimport java.util.UUID;\n\nimport javax.servlet.http.HttpSession;\n\nimport com.neo.model.User;\nimport org.springframework.ui.Model;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n@RestController\npublic class HelloController {\n\t\n    @RequestMapping(\"/hello\")\n\tpublic String hello(Locale locale, Model model) {\n\t\treturn \"Hello World\";\n\t}\n\n}"
  },
  {
    "path": "2.x/spring-boot-web/src/main/java/com/neo/web/ThymeleafController.java",
    "content": "package com.neo.web;\n\nimport java.text.DateFormat;\nimport java.util.Date;\nimport java.util.Locale;\n\nimport org.springframework.stereotype.Controller;\nimport org.springframework.ui.Model;\nimport org.springframework.web.bind.annotation.RequestMapping;\n\n@Controller\npublic class ThymeleafController {\n\t\n    @RequestMapping(\"/hi\")\n\tpublic String hello(Locale locale, Model model) {\n\t\tmodel.addAttribute(\"greeting\", \"Hello!\");\n\n\t\tDate date = new Date();\n\t\tDateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);        \n\t\tString formattedDate = dateFormat.format(date);\n\t\tmodel.addAttribute(\"currentTime\", formattedDate);\n\n\t\treturn \"hello\";\n\t}\n\n}"
  },
  {
    "path": "2.x/spring-boot-web/src/main/java/com/neo/web/UserController.java",
    "content": "package com.neo.web;\n\nimport java.util.List;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport com.neo.model.User;\nimport com.neo.repository.UserRepository;\n\n@RestController\npublic class UserController {\n\t\n\t@Autowired\n\tprivate UserRepository userRepository;\n\t\n    @RequestMapping(\"/getUser\")\n    public User getUser() {\n    \tUser user=userRepository.findByUserName(\"aa\");\n    \tSystem.out.println(\"若下面没出现“无缓存的时候调用”字样且能打印出数据表示测试成功\");  \n        return user;\n    }\n    \n    @RequestMapping(\"/getUsers\")\n    public List<User> getUsers() {\n    \tList<User> users=userRepository.findAll();\n    \tSystem.out.println(\"若下面没出现“无缓存的时候调用”字样且能打印出数据表示测试成功\");  \n        return users;\n    }\n}"
  },
  {
    "path": "2.x/spring-boot-web/src/main/resources/application.properties",
    "content": "spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true\nspring.datasource.username=root\nspring.datasource.password=root\nspring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver\n\nspring.jpa.properties.hibernate.hbm2ddl.auto=create\nspring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect\n#sql\\u8F93\\u51FA\nspring.jpa.show-sql=true\n#format\\u4E00\\u4E0Bsql\\u8FDB\\u884C\\u8F93\\u51FA\nspring.jpa.properties.hibernate.format_sql=true\n\ncom.neo.title=\\u7EAF\\u6D01\\u7684\\u5FAE\\u7B11\ncom.neo.description=\\u5206\\u4EAB\\u751F\\u6D3B\\u548C\\u6280\\u672F"
  },
  {
    "path": "2.x/spring-boot-web/src/main/resources/static/css/starter.css",
    "content": "body {\n  padding-top: 50px;\n}\n\n.starter-template {\n  padding: 40px 15px;\n  text-align: center;\n}"
  },
  {
    "path": "2.x/spring-boot-web/src/main/resources/templates/hello.html",
    "content": "<html xmlns:th=\"http://www.thymeleaf.org\">\n  <head th:include=\"layout :: htmlhead\" th:with=\"title='Hello'\"></head>\n\n  <body>\n    <div th:replace=\"layout :: navbar\">(navbar)</div>\n\n    <div class=\"container\">\n      <div class=\"starter-template\">\n        <h1>Spring MVC / Thymeleaf / Bootstrap</h1>\n        <p class=\"lead\" th:text=\"${greeting}\">(greeting)</p>\n        <p>The current time is <span th:text=\"${currentTime}\">(time)</span></p>\n      </div>\n    </div>\n\n    <div th:include=\"layout :: footer\" id=\"footer\">(footer)</div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "2.x/spring-boot-web/src/main/resources/templates/layout.html",
    "content": "<html xmlns:th=\"http://www.thymeleaf.org\">\n  <head th:fragment=\"htmlhead\">\n    <meta charset=\"utf-8\"></meta>\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"></meta>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"></meta>\n    <meta name=\"description\" content=\"\"></meta>\n    <meta name=\"author\" content=\"\"></meta>\n    <link rel=\"shortcut icon\" type=\"image/png\" th:href=\"@{/images/favicon.png}\"></link>\n\n   \t<title th:text=\"${title}\">(title)</title>\n\n  \t<link th:href=\"@{/webjars/bootstrap/3.0.3/dist/css/bootstrap.css}\" rel=\"stylesheet\"></link>\n  \t<link th:href=\"@{/css/starter.css}\" rel=\"stylesheet\"></link>\n  </head>\n\n  <body>\n    <div th:fragment=\"navbar\" class=\"navbar navbar-inverse navbar-fixed-top\" role=\"navigation\">\n      <div class=\"container\">\n        <div class=\"navbar-header\">\n          <button type=\"button\" class=\"navbar-toggle\" data-toggle=\"collapse\" data-target=\".navbar-collapse\">\n            <span class=\"sr-only\">Toggle navigation</span>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n          </button>\n          <a class=\"navbar-brand\" href=\"#\">Project name</a>\n        </div>\n        <div class=\"collapse navbar-collapse\">\n          <ul class=\"nav navbar-nav\">\n            <li class=\"active\"><a href=\"#\">Home</a></li>\n            <li><a href=\"#about\">About</a></li>\n            <li><a href=\"#contact\">Contact</a></li>\n          </ul>\n        </div>\n      </div>\n    </div>\n\n    <div class=\"container\">\n      <div class=\"starter-template\">\n        <h1>Spring MVC/Thymeleaf/Bootstrap</h1>\n        <p class=\"lead\" th:text=\"${greeting}\">(greeting)</p>\n      </div>\n    </div>\n\n    <div th:fragment=\"footer\" id=\"footer\">\n      <div class=\"container\">\n        <p class=\"muted credit\">Spring MVC/Thymeleaf/Bootstrap Project Template</p>\n      </div>\n      <script th:src=\"@{/webjars/jquery/2.0.3/jquery.min.js}\"></script>\n      <script th:src=\"@{/webjars/bootstrap/3.0.3/js/bootstrap.min.js}\"></script>\n    </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "2.x/spring-boot-web/src/test/java/com/neo/WebApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class WebApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t\tSystem.out.println(\"hello web\");\n\t}\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-web/src/test/java/com/neo/model/UserRepositoryTests.java",
    "content": "package com.neo.model;\n\nimport java.text.DateFormat;\nimport java.util.Date;\n\nimport com.neo.repository.UserRepository;\nimport org.junit.Assert;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\n\nimport org.springframework.test.context.junit4.SpringRunner;\n\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class UserRepositoryTests {\n\n\t@Autowired\n\tprivate UserRepository userRepository;\n\n\t@Test\n\tpublic void test() throws Exception {\n\t\tDate date = new Date();\n\t\tDateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);        \n\t\tString formattedDate = dateFormat.format(date);\n\t\t\n\t\tuserRepository.save(new User(\"aa1\", \"aa@126.com\", \"aa\", \"aa123456\",formattedDate));\n\t\tuserRepository.save(new User(\"bb2\", \"bb@126.com\", \"bb\", \"bb123456\",formattedDate));\n\t\tuserRepository.save(new User(\"cc3\", \"cc@126.com\", \"cc\", \"cc123456\",formattedDate));\n\n//\t\tAssert.assertEquals(9, userRepository.findAll().size());\n\t\tAssert.assertEquals(\"bb2\", userRepository.findByUserNameOrEmail(\"bb\", \"xxx126.com\").getNickName());\n\t\tuserRepository.delete(userRepository.findByUserName(\"aa\"));\n\t}\n\n}"
  },
  {
    "path": "2.x/spring-boot-web/src/test/java/com/neo/web/HelloControlerTests.java",
    "content": "package com.neo.web;\n\nimport static org.hamcrest.Matchers.equalTo;\nimport static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;\nimport static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.http.MediaType;\nimport org.springframework.mock.web.MockServletContext;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\nimport org.springframework.test.context.junit4.SpringRunner;\nimport org.springframework.test.context.web.WebAppConfiguration;\nimport org.springframework.test.web.servlet.MockMvc;\nimport org.springframework.test.web.servlet.request.MockMvcRequestBuilders;\nimport org.springframework.test.web.servlet.result.MockMvcResultHandlers;\nimport org.springframework.test.web.servlet.result.MockMvcResultMatchers;\nimport org.springframework.test.web.servlet.setup.MockMvcBuilders;\n\nimport static org.hamcrest.Matchers.equalTo;\nimport static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;\nimport static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;\n\nimport com.neo.web.HelloController;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class HelloControlerTests {\n\n    private MockMvc mvc;\n\n    @Before\n    public void setUp() throws Exception {\n        mvc = MockMvcBuilders.standaloneSetup(new HelloController()).build();\n    }\n\n    @Test\n    public void getHello() throws Exception {\n        mvc.perform(MockMvcRequestBuilders.get(\"/hello\").accept(MediaType.APPLICATION_JSON))\n                .andExpect(MockMvcResultMatchers.status().isOk())\n                .andDo(MockMvcResultHandlers.print())\n                .andReturn();\n    }\n    \n    \n\n    @Test\n    public void testHello() throws Exception {\n        mvc.perform(MockMvcRequestBuilders.get(\"/hello\").accept(MediaType.APPLICATION_JSON))\n                .andExpect(status().isOk())\n                .andExpect(content().string(equalTo(\"Hello World\")));\n    }\n\n\n}"
  },
  {
    "path": "2.x/spring-boot-web/src/test/java/com/neo/web/ProPertiesTest.java",
    "content": "package com.neo.web;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.junit.Assert;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\n\nimport com.neo.util.NeoProperties;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class ProPertiesTest {\n\n\t@Autowired\n    private NeoProperties neoProperties;\n\n    @Test\n    public void getHello() throws Exception {\n    \tSystem.out.println(neoProperties.getTitle());\n        Assert.assertEquals(neoProperties.getTitle(), \"纯洁的微笑\");\n        Assert.assertEquals(neoProperties.getDescription(), \"分享生活和技术\");\n    }\n\n    @Test\n    public void testMap() throws Exception {\n    \tMap<String, Long> orderMinTime=new HashMap<String, Long>();\n    \tlong xx=orderMinTime.get(\"123\");\n    }\n\n}"
  },
  {
    "path": "2.x/spring-boot-web-thymeleaf/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\t<artifactId>spring-boot-web-thymeleaf</artifactId>\n\t<name>Spring Boot Web thymeleaf Sample</name>\n\t<description>Spring Boot Web thymeleaf Sample</description>\n\n     <parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>2.0.0.RELEASE</version>\n\t</parent>\n\n\t<dependencies>\n\t\t<!-- Compile -->\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-web</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-thymeleaf</artifactId>\n\t\t</dependency>\n\t\t<!-- Test -->\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t</dependencies>\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n</project>\n"
  },
  {
    "path": "2.x/spring-boot-web-thymeleaf/src/main/java/com/neo/ThymeleafApplication.java",
    "content": "/*\n * Copyright 2012-2018 the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 本示例参数于：\n * https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples/spring-boot-sample-web-ui\n */\npackage com.neo;\n\nimport com.neo.model.Message;\nimport com.neo.repository.InMemoryMessageRepository;\nimport com.neo.repository.MessageRepository;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.core.convert.converter.Converter;\n\n\n@SpringBootApplication\npublic class ThymeleafApplication {\n\n\t@Bean\n\tpublic MessageRepository messageRepository() {\n\t\treturn new InMemoryMessageRepository();\n\t}\n\n\t@Bean\n\tpublic Converter<String, Message> messageConverter() {\n\t\treturn new Converter<String, Message>() {\n\t\t\t@Override\n\t\t\tpublic Message convert(String id) {\n\t\t\t\treturn messageRepository().findMessage(Long.valueOf(id));\n\t\t\t}\n\t\t};\n\t}\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(ThymeleafApplication.class, args);\n\t}\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-web-thymeleaf/src/main/java/com/neo/controller/MessageController.java",
    "content": "\npackage com.neo.controller;\n\nimport javax.validation.Valid;\n\nimport com.neo.model.Message;\nimport com.neo.repository.MessageRepository;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.validation.BindingResult;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.ModelAttribute;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.servlet.ModelAndView;\nimport org.springframework.web.servlet.mvc.support.RedirectAttributes;\n\n@Controller\n@RequestMapping(\"/\")\npublic class MessageController {\n\n\tprivate final MessageRepository messageRepository;\n\n\tpublic MessageController(MessageRepository messageRepository) {\n\t\tthis.messageRepository = messageRepository;\n\t}\n\n\t@GetMapping\n\tpublic ModelAndView list() {\n\t\tIterable<Message> messages = this.messageRepository.findAll();\n\t\treturn new ModelAndView(\"messages/list\", \"messages\", messages);\n\t}\n\n\t@GetMapping(\"{id}\")\n\tpublic ModelAndView view(@PathVariable(\"id\") Message message) {\n\t\treturn new ModelAndView(\"messages/view\", \"message\", message);\n\t}\n\n\t@GetMapping(params = \"form\")\n\tpublic String createForm(@ModelAttribute Message message) {\n\t\treturn \"messages/form\";\n\t}\n\n\t@PostMapping\n\tpublic ModelAndView create(@Valid Message message, BindingResult result,\n\t\t\tRedirectAttributes redirect) {\n\t\tif (result.hasErrors()) {\n\t\t\treturn new ModelAndView(\"messages/form\", \"formErrors\", result.getAllErrors());\n\t\t}\n\t\tmessage = this.messageRepository.save(message);\n\t\tredirect.addFlashAttribute(\"globalMessage\", \"Successfully created a new message\");\n\t\treturn new ModelAndView(\"redirect:/{message.id}\", \"message.id\", message.getId());\n\t}\n\n\t@RequestMapping(\"foo\")\n\tpublic String foo() {\n\t\tthrow new RuntimeException(\"Expected exception in controller\");\n\t}\n\n\t@GetMapping(value = \"delete/{id}\")\n\tpublic ModelAndView delete(@PathVariable(\"id\") Long id) {\n\t\tthis.messageRepository.deleteMessage(id);\n\t\tIterable<Message> messages = this.messageRepository.findAll();\n\t\treturn new ModelAndView(\"messages/list\", \"messages\", messages);\n\t}\n\n\t@GetMapping(value = \"modify/{id}\")\n\tpublic ModelAndView modifyForm(@PathVariable(\"id\") Message message) {\n\t\treturn new ModelAndView(\"messages/form\", \"message\", message);\n\t}\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-web-thymeleaf/src/main/java/com/neo/model/Message.java",
    "content": "package com.neo.model;\n\nimport java.util.Calendar;\n\nimport javax.validation.constraints.NotEmpty;\n\n\npublic class Message {\n\n\tprivate Long id;\n\n\t@NotEmpty(message = \"Text is required.\")\n\tprivate String text;\n\n\t@NotEmpty(message = \"Summary is required.\")\n\tprivate String summary;\n\n\tprivate Calendar created = Calendar.getInstance();\n\n\tpublic Long getId() {\n\t\treturn this.id;\n\t}\n\n\tpublic void setId(Long id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic Calendar getCreated() {\n\t\treturn this.created;\n\t}\n\n\tpublic void setCreated(Calendar created) {\n\t\tthis.created = created;\n\t}\n\n\tpublic String getText() {\n\t\treturn this.text;\n\t}\n\n\tpublic void setText(String text) {\n\t\tthis.text = text;\n\t}\n\n\tpublic String getSummary() {\n\t\treturn this.summary;\n\t}\n\n\tpublic void setSummary(String summary) {\n\t\tthis.summary = summary;\n\t}\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-web-thymeleaf/src/main/java/com/neo/repository/InMemoryMessageRepository.java",
    "content": "\n\npackage com.neo.repository;\n\nimport com.neo.model.Message;\n\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.concurrent.ConcurrentMap;\nimport java.util.concurrent.atomic.AtomicLong;\n\n\npublic class InMemoryMessageRepository implements MessageRepository {\n\n\tprivate static AtomicLong counter = new AtomicLong();\n\n\tprivate final ConcurrentMap<Long, Message> messages = new ConcurrentHashMap<>();\n\n\t@Override\n\tpublic Iterable<Message> findAll() {\n\t\treturn this.messages.values();\n\t}\n\n\t@Override\n\tpublic Message save(Message message) {\n\t\tLong id = message.getId();\n\t\tif (id == null) {\n\t\t\tid = counter.incrementAndGet();\n\t\t\tmessage.setId(id);\n\t\t}\n\t\tthis.messages.put(id, message);\n\t\treturn message;\n\t}\n\n\t@Override\n\tpublic Message findMessage(Long id) {\n\t\treturn this.messages.get(id);\n\t}\n\n\t@Override\n\tpublic void deleteMessage(Long id) {\n\t\tthis.messages.remove(id);\n\t}\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-web-thymeleaf/src/main/java/com/neo/repository/MessageRepository.java",
    "content": "\npackage com.neo.repository;\n\nimport com.neo.model.Message;\n\npublic interface MessageRepository {\n\n\tIterable<Message> findAll();\n\n\tMessage save(Message message);\n\n\tMessage findMessage(Long id);\n\n\tvoid deleteMessage(Long id);\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-web-thymeleaf/src/main/resources/application.properties",
    "content": "# Allow Thymeleaf templates to be reloaded at dev time\nspring.thymeleaf.cache: false\nserver.tomcat.access_log_enabled: true\nserver.tomcat.basedir: target/tomcat"
  },
  {
    "path": "2.x/spring-boot-web-thymeleaf/src/main/resources/logback.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration>\n\n\t<include resource=\"org/springframework/boot/logging/logback/base.xml\"/>\n\n\t<!-- logger name=\"org.springframework\" level=\"DEBUG\"/-->\n\n</configuration>\n"
  },
  {
    "path": "2.x/spring-boot-web-thymeleaf/src/main/resources/templates/fragments.html",
    "content": "<!DOCTYPE html>\n<html xmlns:th=\"http://www.thymeleaf.org\">\n\t<head th:fragment=\"head (title)\">\n\t\t<title th:text=\"${title}\">Fragments</title>\n\t\t<link rel=\"stylesheet\" th:href=\"@{/css/bootstrap.min.css}\"\n\t\t\thref=\"../../css/bootstrap.min.css\" />\n\t</head>\n\t<body>\n\t\t<div class=\"container\">\n\t\t\t<nav th:fragment=\"navbar\" class=\"navbar navbar-dark bg-primary\">\n\t\t\t\t<a class=\"navbar-brand\" href=\"http://www.ityouknow.com\">Ityouknow</a>\n\t\t\t\t<ul class=\"navbar-nav mr-auto mt-2 mt-lg-0\">\n\t\t\t\t\t<li class=\"nav-item\"><a class=\"nav-link\" th:href=\"@{/}\" href=\"messages.html\">Messages</a></li>\n\t\t\t\t</ul>\n\t\t\t</nav>\n\t\t</div>\n\t</body>\n</html>\n"
  },
  {
    "path": "2.x/spring-boot-web-thymeleaf/src/main/resources/templates/messages/form.html",
    "content": "<!DOCTYPE html>\n<html xmlns:th=\"http://www.thymeleaf.org\">\n\t<head th:replace=\"fragments :: head(title=~{::title/text()})\">\n\t\t<title>Messages : Create</title>\n\t</head>\n\t<body>\n\t\t<div class=\"container\">\n\t\t\t<div th:replace=\"fragments :: navbar\"></div>\n\t\t\t<div class=\"float-right mt-2\">\n\t\t\t\t<a class=\"btn btn-primary btn-sm\" th:href=\"@{/}\" href=\"messages.html\"> Messages </a>\n\t\t\t</div>\n\t\t\t<h4 class=\"float-left mt-2\">Messages : Create</h4>\n\t\t\t<div class=\"clearfix\"></div>\n\t\t\t<form id=\"messageForm\" th:action=\"@{/(form)}\" th:object=\"${message}\" action=\"#\" method=\"post\">\n\t\t\t\t<div th:if=\"${#fields.hasErrors('*')}\" class=\"alert alert-danger\" role=\"alert\">\n\t\t\t\t\t<p th:each=\"error : ${#fields.errors('*')}\" class=\"m-0\" th:text=\"${error}\">Validation error</p>\n\t\t\t\t</div>\n\t\t\t\t<input type=\"hidden\" th:field=\"*{id}\" th:class=\"${'form-control' + (#fields.hasErrors('id') ? ' is-invalid' : '')}\"/>\n\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t<label for=\"summary\">Summary</label>\n\t\t\t\t\t<input type=\"text\" th:field=\"*{summary}\" th:class=\"${'form-control' + (#fields.hasErrors('summary') ? ' is-invalid' : '')}\">\n\t\t\t\t</div>\n\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t<label for=\"text\">Message</label>\n\t\t\t\t\t<textarea th:field=\"*{text}\" th:class=\"${'form-control' + (#fields.hasErrors('text') ? ' is-invalid' : '')}\"></textarea>\n\t\t\t\t</div>\n\t\t\t\t<button type=\"submit\" class=\"btn btn-primary\">Submit</button>\n\t\t\t</form>\n\t\t</div>\n\t</body>\n</html>\n"
  },
  {
    "path": "2.x/spring-boot-web-thymeleaf/src/main/resources/templates/messages/list.html",
    "content": "<!DOCTYPE html>\n<html xmlns:th=\"http://www.thymeleaf.org\">\n\t<head th:replace=\"fragments :: head(title=~{::title/text()})\">\n\t\t<title>Messages : View all</title>\n\t</head>\n\t<body>\n\t\t<div class=\"container\">\n\t\t\t<div th:replace=\"fragments :: navbar\"></div>\n\t\t\t<div class=\"float-right mt-2\">\n\t\t\t\t<a class=\"btn btn-primary btn-sm\" href=\"form.html\" th:href=\"@{/(form)}\">Create Message</a>\n\t\t\t</div>\n\t\t\t<h4 class=\"float-left mt-2\">Messages : View all</h4>\n\t\t\t<table class=\"table table-bordered table-striped\">\n\t\t\t\t<thead>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<th>ID</th>\n\t\t\t\t\t\t<th>Created</th>\n\t\t\t\t\t\t<th>Summary</th>\n\t\t\t\t\t</tr>\n\t\t\t\t</thead>\n\t\t\t\t<tbody>\n\t\t\t\t\t<tr th:if=\"${messages.empty}\">\n\t\t\t\t\t\t<td colspan=\"3\">No messages</td>\n\t\t\t\t\t</tr>\n\t\t\t\t\t<tr th:each=\"message : ${messages}\">\n\t\t\t\t\t\t<td th:text=\"${message.id}\">1</td>\n\t\t\t\t\t\t<td th:text=\"${#calendars.format(message.created)}\">July 11,\n\t\t\t\t\t\t\t2012 2:17:16 PM CDT</td>\n\t\t\t\t\t\t<td><a href=\"view.html\" th:href=\"@{'/' + ${message.id}}\"\n\t\t\t\t\t\t\tth:text=\"${message.summary}\"> The summary </a></td>\n\t\t\t\t\t</tr>\n\t\t\t\t</tbody>\n\t\t\t</table>\n\t\t</div>\n\t</body>\n</html>\n"
  },
  {
    "path": "2.x/spring-boot-web-thymeleaf/src/main/resources/templates/messages/view.html",
    "content": "<!DOCTYPE html>\n<html xmlns:th=\"http://www.thymeleaf.org\">\n\t<head th:replace=\"fragments :: head(title=~{::title/text()})\">\n\t\t<title>Messages : View</title>\n\t</head>\n\t<body>\n\t\t<div class=\"container\">\n\t\t\t<div th:replace=\"fragments :: navbar\"></div>\n\t\t\t<div class=\"float-right mt-2\">\n\t\t\t\t<a class=\"btn btn-primary btn-sm\" href=\"list.html\" th:href=\"@{/}\">Messages</a>\n\t\t\t</div>\n\t\t\t<h4 class=\"float-left mt-2\">Messages : View</h4>\n\t\t\t<div class=\"clearfix\"></div>\n\t\t\t<div class=\"alert alert-success\" th:if=\"${globalMessage}\" th:text=\"${globalMessage}\">Some Success message\n\t\t\t</div>\n\t\t\t<div class=\"card\">\n\t\t\t\t<div class=\"card-body\">\n\t\t\t\t\t<h4 class=\"card-title\" th:text=\"${message.id + ': ' + message.summary}\">123 - A short summary...</h4>\n\t\t\t\t\t<h6 class=\"card-subtitle mb-2 text-muted\" th:text=\"${#calendars.format(message.created)}\">July 11, 2012 2:17:16 PM CDT</h6>\n\t\t\t\t\t<p class=\"card-text\" th:text=\"${message.text}\">A detailed message that is longer than the summary.</p>\n\t\t\t\t\t<a class=\"card-link\" href=\"messages\" th:href=\"@{'/delete/' + ${message.id}}\">delete</a>\n\t\t\t\t\t<a class=\"card-link\" href=\"form.html\" th:href=\"@{'/modify/' + ${message.id}}\"> modify</a>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</body>\n</html>\n"
  },
  {
    "path": "2.x/spring-boot-web-thymeleaf/src/test/java/com/neo/MessageControllerWebTests.java",
    "content": "\npackage com.neo;\n\nimport java.util.regex.Pattern;\n\nimport org.hamcrest.Description;\nimport org.hamcrest.TypeSafeMatcher;\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.test.context.ContextConfiguration;\nimport org.springframework.test.context.junit4.SpringRunner;\nimport org.springframework.test.context.web.WebAppConfiguration;\nimport org.springframework.test.web.servlet.MockMvc;\nimport org.springframework.test.web.servlet.setup.MockMvcBuilders;\nimport org.springframework.web.context.WebApplicationContext;\n\nimport static org.hamcrest.Matchers.containsString;\nimport static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;\nimport static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;\nimport static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;\nimport static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header;\nimport static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;\n\n@RunWith(SpringRunner.class)\n@WebAppConfiguration\n@ContextConfiguration(classes = ThymeleafApplication.class)\npublic class MessageControllerWebTests {\n\n\t@Autowired\n\tprivate WebApplicationContext wac;\n\n\tprivate MockMvc mockMvc;\n\n\t@Before\n\tpublic void setup() {\n\t\tthis.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();\n\t}\n\n\t@Test\n\tpublic void testHome() throws Exception {\n\t\tthis.mockMvc.perform(get(\"/\")).andExpect(status().isOk())\n\t\t\t\t.andExpect(content().string(containsString(\"<title>Messages\")));\n\t}\n\n\t@Test\n\tpublic void testCreate() throws Exception {\n\t\tthis.mockMvc.perform(post(\"/\").param(\"text\", \"FOO text\").param(\"summary\", \"FOO\"))\n\t\t\t\t.andExpect(status().isFound())\n\t\t\t\t.andExpect(header().string(\"location\", RegexMatcher.matches(\"/[0-9]+\")));\n\t}\n\n\t@Test\n\tpublic void testCreateValidation() throws Exception {\n\t\tthis.mockMvc.perform(post(\"/\").param(\"text\", \"\").param(\"summary\", \"\"))\n\t\t\t\t.andExpect(status().isOk())\n\t\t\t\t.andExpect(content().string(containsString(\"is required\")));\n\t}\n\n\tprivate static class RegexMatcher extends TypeSafeMatcher<String> {\n\t\tprivate final String regex;\n\n\t\tpublic RegexMatcher(String regex) {\n\t\t\tthis.regex = regex;\n\t\t}\n\n\t\tpublic static org.hamcrest.Matcher<java.lang.String> matches(String regex) {\n\t\t\treturn new RegexMatcher(regex);\n\t\t}\n\n\t\t@Override\n\t\tpublic boolean matchesSafely(String item) {\n\t\t\treturn Pattern.compile(this.regex).matcher(item).find();\n\t\t}\n\n\t\t@Override\n\t\tpublic void describeMismatchSafely(String item, Description mismatchDescription) {\n\t\t\tmismatchDescription.appendText(\"was \\\"\").appendText(item).appendText(\"\\\"\");\n\t\t}\n\n\t\t@Override\n\t\tpublic void describeTo(Description description) {\n\t\t\tdescription.appendText(\"a string that matches regex: \")\n\t\t\t\t\t.appendText(this.regex);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "2.x/spring-boot-web-thymeleaf/src/test/java/com/neo/ThymeleafApplicationTests.java",
    "content": "\npackage com.neo;\n\nimport java.net.URI;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.boot.test.context.SpringBootTest.WebEnvironment;\nimport org.springframework.boot.test.web.client.TestRestTemplate;\nimport org.springframework.boot.web.server.LocalServerPort;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.test.context.junit4.SpringRunner;\nimport org.springframework.util.LinkedMultiValueMap;\nimport org.springframework.util.MultiValueMap;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)\npublic class ThymeleafApplicationTests {\n\n\t@Autowired\n\tprivate TestRestTemplate restTemplate;\n\n\t@LocalServerPort\n\tprivate int port;\n\n\t@Test\n\tpublic void testHome() {\n\t\tResponseEntity<String> entity = this.restTemplate.getForEntity(\"/\", String.class);\n\t\tassertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK);\n\t\tassertThat(entity.getBody()).contains(\"<title>Messages\");\n\t\tassertThat(entity.getBody()).doesNotContain(\"layout:fragment\");\n\t}\n\n\t@Test\n\tpublic void testCreate() {\n\t\tMultiValueMap<String, String> map = new LinkedMultiValueMap<>();\n\t\tmap.set(\"text\", \"FOO text\");\n\t\tmap.set(\"summary\", \"FOO\");\n\t\tURI location = this.restTemplate.postForLocation(\"/\", map);\n\t\tassertThat(location.toString()).contains(\"localhost:\" + this.port);\n\t}\n\n\t@Test\n\tpublic void testCss() {\n\t\tResponseEntity<String> entity = this.restTemplate.getForEntity(\n\t\t\t\t\"http://localhost:\" + this.port + \"/css/bootstrap.min.css\", String.class);\n\t\tassertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK);\n\t\tassertThat(entity.getBody()).contains(\"body\");\n\t}\n\n}\n"
  },
  {
    "path": "2.x/spring-boot-webflux/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-webflux</artifactId>\n\t<version>1.0.0-SNAPSHOT</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-webflux</name>\n\t<description>Demo project for Spring Boot</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>2.1.2.RELEASE</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-webflux</artifactId>\n        </dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-devtools</artifactId>\n\t\t\t<scope>runtime</scope>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t</dependencies>\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\n\n</project>\n"
  },
  {
    "path": "2.x/spring-boot-webflux/src/main/java/com/neo/WebFluxApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class WebFluxApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(WebFluxApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "2.x/spring-boot-webflux/src/main/java/com/neo/web/HelloController.java",
    "content": "package com.neo.web;\n\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RestController;\nimport reactor.core.publisher.Mono;\n\n@RestController\npublic class HelloController {\n\n    @GetMapping(\"/hello\")\n    public Mono<String> hello() {\n        return Mono.just(\"Welcome to reactive world ~\");\n    }\n}\n"
  },
  {
    "path": "2.x/spring-boot-webflux/src/main/resources/application.properties",
    "content": ""
  },
  {
    "path": "2.x/spring-boot-webflux/src/test/java/com/neo/HelloTests.java",
    "content": "package com.neo;\n\nimport com.neo.web.HelloController;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.autoconfigure.web.reactive.WebFluxTest;\nimport org.springframework.test.context.junit4.SpringRunner;\nimport org.springframework.test.web.reactive.server.WebTestClient;\n\n@RunWith(SpringRunner.class)\n@WebFluxTest(controllers = HelloController.class)\npublic class HelloTests {\n    @Autowired\n    WebTestClient client;\n\n    @Test\n    public void getHello() {\n        client.get().uri(\"/hello\").exchange().expectStatus().isOk();\n    }\n}\n"
  },
  {
    "path": "2.x/spring-boot-webflux/src/test/java/com/neo/WebFluxApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class WebFluxApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t}\n\n}\n"
  },
  {
    "path": "README.md",
    "content": "Spring Boot 学习示例\n=========================\n\n![Spring Boot 2.0](https://img.shields.io/badge/Spring%20Boot-2.0-brightgreen.svg)\n![Mysql 5.6](https://img.shields.io/badge/Mysql-5.6-blue.svg)\n![JDK 1.8](https://img.shields.io/badge/JDK-1.8-brightgreen.svg)\n![Maven](https://img.shields.io/badge/Maven-3.5.0-yellowgreen.svg)\n![license](https://img.shields.io/badge/license-MPL--2.0-blue.svg)\n \nSpring Boot 使用的各种示例，以最简单、最实用为标准，此开源项目中的每个示例都以最小依赖，最简单为标准，帮助初学者快速掌握 Spring Boot 各组件的使用。\n\n[Spring Boot 中文索引](https://github.com/ityouknow/awesome-spring-boot) &nbsp;| &nbsp; [Spring Cloud学习示例代码](https://github.com/ityouknow/spring-cloud-examples) &nbsp;| &nbsp; [Spring Boot 精品课程](https://github.com/ityouknow/spring-boot-leaning) \n\n [Github地址](https://github.com/ityouknow/spring-boot-examples) &nbsp;| &nbsp; [码云地址](https://gitee.com/ityouknow/spring-boot-examples) &nbsp;| &nbsp;  [Spring Boot 1.X](https://github.com/ityouknow/spring-boot-examples/tree/master/1.x) | &nbsp;  [Spring Boot 2.X](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x)\n\n---\n\n\n**本项目中所有示例均已经更新到 Spring Boot 3.0**\n\n- Spring Boot 1.X  系列示例代码请看这里：[Spring Boot 1.X](https://github.com/ityouknow/spring-boot-examples/tree/master/1.x)   \n- Spring Boot 2.X  系列示例代码请看这里：[Spring Boot 2.X](https://github.com/ityouknow/spring-boot-examples/tree/master/2.x) \n\n\n\n## 示例代码\n\n- [spring-boot-hello](https://github.com/ityouknow/spring-boot-examples/tree/master/spring-boot-hello)：Spring Boot 3.0  Hello World 示例\n- [spring-boot-banner](https://github.com/ityouknow/spring-boot-examples/tree/master/spring-boot-hello)：Spring Boot 3.0  定制 banner 示例\n- [spring-boot-helloworld](https://github.com/ityouknow/spring-boot-examples/tree/master/spring-boot-helloWorld)：Spring Boot 3.0  Hello World Test 单元测试示例\n- [spring-boot-scheduler](https://github.com/ityouknow/spring-boot-examples/tree/master/spring-boot-scheduler)：Spring Boot 3.0 定时任务 scheduler 使用示例\n- [spring-boot-package](https://github.com/ityouknow/spring-boot-examples/tree/master/spring-boot-package)：Spring Boot 3.0 单元测试、集成测试、打 Jar/War 包、定制启动参数使用案例\n- [spring-boot-commandLineRunner](https://github.com/ityouknow/spring-boot-examples/tree/master/spring-boot-commandLineRunner)：Spring Boot 3.0 目启动时初始化资源案例\n- [spring-boot-web](https://github.com/ityouknow/spring-boot-examples/tree/master/spring-boot-web)：Spring Boot 3.0 web 示例\n- [spring-boot-webflux](https://github.com/ityouknow/spring-boot-examples/tree/master/spring-boot-webflux)：Spring Boot 3.0  响应式编程 WebFlux 使用案例\n- [spring-boot-file-upload](https://github.com/ityouknow/spring-boot-examples/tree/master/spring-boot-file-upload)：Spring Boot 3.0 上传文件使用案例\n- [spring-boot-thymeleaf](https://github.com/ityouknow/spring-boot-examples/tree/master/spring-boot-thymeleaf)：Spring Boot 3.0 Thymeleaf 语法、布局使用示例\n- [spring-boot-jpa](https://github.com/ityouknow/spring-boot-examples/tree/master/spring-boot-jpa)：Spring Boot 3.0 Jpa 操作、增删、改查多数据源使用示例\n- [spring-boot-mybatis](https://github.com/ityouknow/spring-boot-examples/tree/master/spring-boot-mybatis)：Spring Boot 3.0 Mybatis 注解、xml 使用、增删改查、多数据源使用示例\n- [spring-boot-web-thymeleaf](https://github.com/ityouknow/spring-boot-examples/tree/master/spring-boot-web-thymeleaf)：Spring Boot 3.0 thymeleaf 增删该查示例\n- [spring-boot-jpa-thymeleaf-curd](https://github.com/ityouknow/spring-boot-examples/tree/master/spring-boot-jpa-thymeleaf-curd)：Spring Boot 3.0 Jpa thymeleaf 列表、增删改查使用案例\n- [spring-boot-mail](https://github.com/ityouknow/spring-boot-examples/tree/master/spring-boot-mail)：Spring Boot 3.0 邮件发送使用示例\n- [spring-boot-rabbitmq](https://github.com/ityouknow/spring-boot-examples/tree/master/spring-boot-rabbitmq)：Spring Boot 3.0 RabbitMQ 各种常见场景使用示例 \n- [spring-boot-mongodb](https://github.com/ityouknow/spring-boot-examples/tree/master/spring-boot-mongodb)：Spring Boot 3.0 MongoDB 增删改查示例 多数据源使用案例\n- [spring-boot-redis](https://github.com/ityouknow/spring-boot-examples/tree/master/spring-boot-redis)：Spring Boot 3.0 Redis 示例\n- [spring-boot-memcache-spymemcached](https://github.com/ityouknow/spring-boot-examples/tree/master/spring-boot-memcache-spymemcached)：Spring Boot 3.0  集成 Memcached 使用案例\n- [spring-boot-docker](https://github.com/ityouknow/spring-boot-examples/tree/master/spring-boot-docker)：Spring Boot 3.0 Docker 使用案例\n- [dockercompose-springboot-mysql-nginx](https://github.com/ityouknow/spring-boot-examples/tree/master/dockercompose-springboot-mysql-nginx)：Spring Boot 3.0 Docker Compose + Spring Boot + Nginx + Mysql 使用案例\n\n\n> 如果大家想了解关于 Spring Boot 的其它方面应用，也可以以[issues](https://github.com/ityouknow/spring-boot-examples/issues)的形式反馈给我，我后续来完善。\n\n关注公众号：纯洁的微笑，回复\"666\"进群交流\n\n![](http://www.ityouknow.com/assets/images/keeppuresmile_430.jpg)"
  },
  {
    "path": "dockercompose-springboot-mysql-nginx/app/Dockerfile",
    "content": "FROM maven:3.8.3-openjdk-17\n"
  },
  {
    "path": "dockercompose-springboot-mysql-nginx/app/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>dockercompose-springboot-mysql-nginx</artifactId>\n\t<version>1.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>dockercompose-springboot-mysql-nginx</name>\n\t<description>Demo project for Spring Boot</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>3.0.0</version>\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n\t\t<java.version>17</java.version>\n\t</properties>\n\n\t<dependencies>\n\t     <dependency>\n\t        <groupId>org.springframework.boot</groupId>\n\t        <artifactId>spring-boot-starter-web</artifactId>\n\t    </dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-data-jpa</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>mysql</groupId>\n\t\t\t<artifactId>mysql-connector-java</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.junit.vintage</groupId>\n\t\t\t<artifactId>junit-vintage-engine</artifactId>\n\t\t\t<scope>test</scope>\n\t\t\t<exclusions>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<groupId>org.hamcrest</groupId>\n\t\t\t\t\t<artifactId>hamcrest-core</artifactId>\n\t\t\t\t</exclusion>\n\t\t\t</exclusions>\n\t\t</dependency>\n\t</dependencies>\n\t\n\t<build>\n\t\t<defaultGoal>compile</defaultGoal>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\t\n\n</project>\n"
  },
  {
    "path": "dockercompose-springboot-mysql-nginx/app/src/main/java/com/neo/ComposeApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class ComposeApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(ComposeApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "dockercompose-springboot-mysql-nginx/app/src/main/java/com/neo/controller/VisitorController.java",
    "content": "package com.neo.controller;\n\nimport com.neo.entity.Visitor;\nimport com.neo.repository.VisitorRepository;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport jakarta.servlet.http.HttpServletRequest;\n\n@RestController\npublic class VisitorController {\n\n    @Autowired\n    private VisitorRepository repository;\n\t\n    @RequestMapping(\"/\")\n    public String index(HttpServletRequest request) {\n        String ip=request.getRemoteAddr();\n        Visitor visitor=repository.findByIp(ip);\n        if(visitor==null){\n            visitor=new Visitor();\n            visitor.setIp(ip);\n            visitor.setTimes(1);\n        }else {\n            visitor.setTimes(visitor.getTimes()+1);\n        }\n        repository.save(visitor);\n        return \"I have been seen ip \"+visitor.getIp()+\" \"+visitor.getTimes()+\" times.\";\n    }\n}"
  },
  {
    "path": "dockercompose-springboot-mysql-nginx/app/src/main/java/com/neo/entity/Visitor.java",
    "content": "package com.neo.entity;\n\nimport jakarta.persistence.Column;\nimport jakarta.persistence.Entity;\nimport jakarta.persistence.GeneratedValue;\nimport jakarta.persistence.Id;\n\n@Entity\npublic class Visitor {\n    @Id\n    @GeneratedValue\n    private long id;\n    @Column(nullable = false)\n    private  long  times;\n    @Column(nullable = false)\n    private  String  ip;\n\n    public long getId() {\n        return id;\n    }\n\n    public void setId(long id) {\n        this.id = id;\n    }\n\n    public long getTimes() {\n        return times;\n    }\n\n    public void setTimes(long times) {\n        this.times = times;\n    }\n\n    public String getIp() {\n        return ip;\n    }\n\n    public void setIp(String ip) {\n        this.ip = ip;\n    }\n}\n"
  },
  {
    "path": "dockercompose-springboot-mysql-nginx/app/src/main/java/com/neo/repository/VisitorRepository.java",
    "content": "package com.neo.repository;\n\nimport com.neo.entity.Visitor;\nimport org.springframework.data.jpa.repository.JpaRepository;\n\npublic interface  VisitorRepository extends JpaRepository<Visitor, Long> {\n    Visitor findByIp(String ip);\n}\n"
  },
  {
    "path": "dockercompose-springboot-mysql-nginx/app/src/main/resources/application-dev.properties",
    "content": "spring.datasource.url=jdbc:mysql://localhost:3306/test\nspring.datasource.username=root\nspring.datasource.password=root\nspring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver"
  },
  {
    "path": "dockercompose-springboot-mysql-nginx/app/src/main/resources/application-docker.properties",
    "content": "spring.datasource.url=jdbc:mysql://mysql:3306/test\nspring.datasource.username=root\nspring.datasource.password=root\nspring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver"
  },
  {
    "path": "dockercompose-springboot-mysql-nginx/app/src/main/resources/application.properties",
    "content": "spring.jpa.properties.hibernate.hbm2ddl.auto=update\nspring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect\nspring.jpa.show-sql=true\n\nspring.profiles.active=dev"
  },
  {
    "path": "dockercompose-springboot-mysql-nginx/app/src/test/java/com/neo/ComposeApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class ComposeApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t\tSystem.out.println(\"Hello Spring Boot Docker Compose!\");\n\t}\n\n}\n"
  },
  {
    "path": "dockercompose-springboot-mysql-nginx/docker-compose.yaml",
    "content": "version: '3'\nservices:\n  nginx:\n   container_name: v-nginx\n   image: nginx:1.13\n   restart: always\n   ports:\n   - 81:81\n   - 445:445\n   volumes:\n   - ./nginx/conf.d:/etc/nginx/conf.d\n    \n  mysql:\n   container_name: v-mysql\n   image: mysql/mysql-server:5.7\n   environment:\n    MYSQL_DATABASE: test\n    MYSQL_ROOT_PASSWORD: root\n    MYSQL_ROOT_HOST: '%'\n   ports:\n   - \"3308:3308\"\n   restart: always\n    \n  app:\n    restart: always\n    build: ./app\n    working_dir: /app\n    volumes:\n      - ./app:/app\n      - ~/.m2:/root/.m2\n    expose:\n      - \"8080\"\n    depends_on:\n      - nginx\n      - mysql\n    command: mvn clean spring-boot:run -Dspring-boot.run.profiles=docker"
  },
  {
    "path": "dockercompose-springboot-mysql-nginx/nginx/conf.d/app.conf",
    "content": "server {\n    listen 80;\n    charset utf-8;\n    access_log off;\n\n    location / {\n        proxy_pass http://app:8080;\n        proxy_set_header Host $host:$server_port;\n        proxy_set_header X-Forwarded-Host $server_name;\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n    }\n\n    location /static {\n        access_log   off;\n        expires      30d;\n\n        alias /app/static;\n    }\n}\n"
  },
  {
    "path": "spring-boot-banner/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.example</groupId>\n\t<artifactId>spring-boot-banner</artifactId>\n\t<version>3.0.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>Spring Boot banner</name>\n\t<description>A very useful project to demonstrate animated gif support in Spring Boot 2</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>3.0.0</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n\t\t<java.version>17</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter</artifactId>\n\t\t</dependency>\n\t</dependencies>\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\n</project>\n"
  },
  {
    "path": "spring-boot-banner/src/main/java/com/neo/banner/BannerApplication.java",
    "content": "package com.neo.banner;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class BannerApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(BannerApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "spring-boot-banner/src/main/resources/application.properties",
    "content": ""
  },
  {
    "path": "spring-boot-banner/src/main/resources/banner.txt",
    "content": ".__           .__  .__                               .__       .___\n|  |__   ____ |  | |  |   ____   __  _  _____________|  |    __| _/\n|  |  \\_/ __ \\|  | |  |  /  _ \\  \\ \\/ \\/ /  _ \\_  __ \\  |   / __ | \n|   Y  \\  ___/|  |_|  |_(  <_> )  \\     (  <_> )  | \\/  |__/ /_/ | \n|___|  /\\___  >____/____/\\____/    \\/\\_/ \\____/|__|  |____/\\____ | \n     \\/     \\/                                                  \\/ "
  },
  {
    "path": "spring-boot-commandLineRunner/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.example</groupId>\n\t<artifactId>spring-boot-commandLineRunner</artifactId>\n\t<version>2.0.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>Spring Boot banner</name>\n\t<description>Spring Boot and commandLineRunner demo</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>3.0.0</version>\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n\t\t<java.version>17</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-web</artifactId>\n\t\t</dependency>\n\t</dependencies>\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\n</project>\n"
  },
  {
    "path": "spring-boot-commandLineRunner/src/main/java/com/neo/CommandLineRunnerApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.CommandLineRunner;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class CommandLineRunnerApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSystem.out.println(\"The service to start.\");\n\t\tSpringApplication.run(CommandLineRunnerApplication.class, args);\n\t\tSystem.out.println(\"The service has started.\");\n\t}\n}\n"
  },
  {
    "path": "spring-boot-commandLineRunner/src/main/java/com/neo/runner/OrderRunner1.java",
    "content": "package com.neo.runner;\n\nimport org.springframework.boot.CommandLineRunner;\nimport org.springframework.core.annotation.Order;\nimport org.springframework.stereotype.Component;\n\n@Component\n@Order(1)\npublic class OrderRunner1 implements CommandLineRunner {\n\n    @Override\n    public void run(String... args) throws Exception {\n        System.out.println(\"The OrderRunner1 start to initialize ...\");\n    }\n}"
  },
  {
    "path": "spring-boot-commandLineRunner/src/main/java/com/neo/runner/OrderRunner2.java",
    "content": "package com.neo.runner;\n\nimport org.springframework.boot.CommandLineRunner;\nimport org.springframework.core.annotation.Order;\nimport org.springframework.stereotype.Component;\n\n@Component\n@Order(2)\npublic class OrderRunner2 implements CommandLineRunner {\n\n    @Override\n    public void run(String... args) throws Exception {\n        System.out.println(\"The OrderRunner2 start to initialize ...\");\n    }\n}"
  },
  {
    "path": "spring-boot-commandLineRunner/src/main/java/com/neo/runner/Runner.java",
    "content": "package com.neo.runner;\n\nimport org.springframework.boot.CommandLineRunner;\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class Runner implements CommandLineRunner {\n\n    @Override\n    public void run(String... args) throws Exception {\n        System.out.println(\"The Runner start to initialize ...\");\n    }\n}"
  },
  {
    "path": "spring-boot-commandLineRunner/src/main/resources/application.properties",
    "content": ""
  },
  {
    "path": "spring-boot-docker/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-docker</artifactId>\n\t<version>1.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-docker</name>\n\t<description>Demo project for Spring Boot</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>3.0.0</version>\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n\t\t<java.version>17</java.version>\n\t\t<docker.image.prefix>springboot</docker.image.prefix>\n\t</properties>\n\n\n\t<dependencies>\n\t     <dependency>\n\t        <groupId>org.springframework.boot</groupId>\n\t        <artifactId>spring-boot-starter-web</artifactId>\n\t    </dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.junit.vintage</groupId>\n\t\t\t<artifactId>junit-vintage-engine</artifactId>\n\t\t\t<scope>test</scope>\n\t\t\t<exclusions>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<groupId>org.hamcrest</groupId>\n\t\t\t\t\t<artifactId>hamcrest-core</artifactId>\n\t\t\t\t</exclusion>\n\t\t\t</exclusions>\n\t\t</dependency>\n\t</dependencies>\n\t\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t\t<!-- Docker maven plugin -->\n\t\t\t<plugin>\n\t\t\t\t<groupId>com.spotify</groupId>\n\t\t\t\t<artifactId>docker-maven-plugin</artifactId>\n\t\t\t\t<version>1.0.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<imageName>${docker.image.prefix}/${project.artifactId}</imageName>\n\t\t\t\t\t<dockerDirectory>src/main/docker</dockerDirectory>\n\t\t\t\t\t<resources>\n\t\t\t\t\t\t<resource>\n\t\t\t\t\t\t\t<targetPath>/</targetPath>\n\t\t\t\t\t\t\t<directory>${project.build.directory}</directory>\n\t\t\t\t\t\t\t<include>${project.build.finalName}.jar</include>\n\t\t\t\t\t\t</resource>\n\t\t\t\t\t</resources>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t<!-- Docker maven plugin -->\n\t\t</plugins>\n\t</build>\n\t\n\n</project>\n"
  },
  {
    "path": "spring-boot-docker/src/main/docker/Dockerfile",
    "content": "FROM openjdk:17-jdk-alpine\nVOLUME /tmp\nADD spring-boot-docker-1.0.jar app.jar\nENTRYPOINT [\"java\",\"-Djava.security.egd=file:/dev/./urandom\",\"-jar\",\"/app.jar\"]"
  },
  {
    "path": "spring-boot-docker/src/main/java/com/neo/DockerApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class DockerApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(DockerApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "spring-boot-docker/src/main/java/com/neo/controller/DockerController.java",
    "content": "package com.neo.controller;\n\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n@RestController\npublic class DockerController {\n\t\n    @RequestMapping(\"/\")\n    public String index() {\n        return \"Hello Docker!\";\n    }\n}"
  },
  {
    "path": "spring-boot-docker/src/main/resources/application.properties",
    "content": ""
  },
  {
    "path": "spring-boot-docker/src/test/java/com/neo/DockerApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class DockerApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t\tSystem.out.println(\"hello docker\");\n\t}\n\n}\n"
  },
  {
    "path": "spring-boot-file-upload/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0\n  http://maven.apache.org/maven-v4_0_0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <groupId>com.neo</groupId>\n    <artifactId>spring-boot-file-upload</artifactId>\n    <packaging>jar</packaging>\n    <version>1.0</version>\n\n    <parent>\n        <groupId>org.springframework.boot</groupId>\n        <artifactId>spring-boot-starter-parent</artifactId>\n        <version>3.0.0</version>\n        <relativePath/> <!-- lookup parent from repository -->\n    </parent>\n\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n        <java.version>17</java.version>\n    </properties>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-web</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-thymeleaf</artifactId>\n        </dependency>\n    </dependencies>\n\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.springframework.boot</groupId>\n                <artifactId>spring-boot-maven-plugin</artifactId>\n            </plugin>\n        </plugins>\n    </build>\n\n</project>\n"
  },
  {
    "path": "spring-boot-file-upload/src/main/java/com/neo/FileUploadWebApplication.java",
    "content": "package com.neo;\n\nimport org.apache.coyote.http11.AbstractHttp11Protocol;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;\nimport org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;\nimport org.springframework.context.annotation.Bean;\n\n@SpringBootApplication\npublic class FileUploadWebApplication {\n\n    public static void main(String[] args) throws Exception {\n        SpringApplication.run(FileUploadWebApplication.class, args);\n    }\n\n    //Tomcat large file upload connection reset\n    @Bean\n    public TomcatServletWebServerFactory tomcatEmbedded() {\n        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();\n        tomcat.addConnectorCustomizers((TomcatConnectorCustomizer) connector -> {\n            if ((connector.getProtocolHandler() instanceof AbstractHttp11Protocol<?>)) {\n                //-1 means unlimited\n                ((AbstractHttp11Protocol<?>) connector.getProtocolHandler()).setMaxSwallowSize(-1);\n            }\n        });\n        return tomcat;\n    }\n\n}"
  },
  {
    "path": "spring-boot-file-upload/src/main/java/com/neo/controller/GlobalExceptionHandler.java",
    "content": "package com.neo.controller;\n\nimport org.springframework.web.bind.annotation.ControllerAdvice;\nimport org.springframework.web.bind.annotation.ExceptionHandler;\nimport org.springframework.web.multipart.MultipartException;\nimport org.springframework.web.servlet.mvc.support.RedirectAttributes;\n\n@ControllerAdvice\npublic class GlobalExceptionHandler {\n\n    //https://jira.spring.io/browse/SPR-14651\n    //4.3.5 supports RedirectAttributes redirectAttributes\n    @ExceptionHandler(MultipartException.class)\n    public String handleError1(MultipartException e, RedirectAttributes redirectAttributes) {\n        System.out.printf(e.getMessage());\n        redirectAttributes.addFlashAttribute(\"message\", e.getMessage());\n        return \"redirect:/uploadStatus\";\n    }\n}\n"
  },
  {
    "path": "spring-boot-file-upload/src/main/java/com/neo/controller/UploadController.java",
    "content": "package com.neo.controller;\n\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.multipart.MultipartFile;\nimport org.springframework.web.servlet.mvc.support.RedirectAttributes;\n\nimport java.io.IOException;\nimport java.nio.file.Files;\nimport java.nio.file.Path;\nimport java.nio.file.Paths;\n\n@Controller\npublic class UploadController {\n    //Save the uploaded file to this folder\n    private static String UPLOADED_FOLDER = \"E://temp//\";\n\n    @GetMapping(\"/\")\n    public String index() {\n        return \"upload\";\n    }\n\n    @PostMapping(\"/upload\") // //new annotation since 4.3\n    public String singleFileUpload(@RequestParam(\"file\") MultipartFile file,\n        RedirectAttributes redirectAttributes) {\n        if (file.isEmpty()) {\n            redirectAttributes.addFlashAttribute(\"message\", \"Please select a file to upload\");\n            return \"redirect:uploadStatus\";\n        }\n\n        try {\n            // Get the file and save it somewhere\n            byte[] bytes = file.getBytes();\n            Path dir = Paths.get(UPLOADED_FOLDER);\n            Path path = Paths.get(UPLOADED_FOLDER + file.getOriginalFilename());\n            // Create parent dir if not exists\n            if(!Files.exists(dir)) {\n                Files.createDirectories(dir);\n            }\n            Files.write(path, bytes);\n            redirectAttributes.addFlashAttribute(\"message\",\n                \"You successfully uploaded '\" + file.getOriginalFilename() + \"'\");\n\n        } catch (IOException e) {\n            redirectAttributes.addFlashAttribute(\"message\", \"Server throw IOException\");\n            e.printStackTrace();\n        }\n        return \"redirect:/uploadStatus\";\n    }\n\n    @GetMapping(\"/uploadStatus\")\n    public String uploadStatus() {\n        return \"uploadStatus\";\n    }\n\n}"
  },
  {
    "path": "spring-boot-file-upload/src/main/resources/application.properties",
    "content": "#http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#common-application-properties\n#search multipart\nspring.servlet.multipart.max-file-size=10000MB\nspring.servlet.multipart.max-request-size=10000MB"
  },
  {
    "path": "spring-boot-file-upload/src/main/resources/logback.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration>\n\n    <appender name=\"STDOUT\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <layout class=\"ch.qos.logback.classic.PatternLayout\">\n            <Pattern>\n                %d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n\n            </Pattern>\n        </layout>\n    </appender>\n\n    <logger name=\"org.springframework.web\" level=\"error\" additivity=\"false\">\n        <appender-ref ref=\"STDOUT\"/>\n    </logger>\n\n    <logger name=\"com.neo\" level=\"debug\" additivity=\"false\">\n        <appender-ref ref=\"STDOUT\"/>\n    </logger>\n\n    <root level=\"error\">\n        <appender-ref ref=\"STDOUT\"/>\n    </root>\n\n</configuration>"
  },
  {
    "path": "spring-boot-file-upload/src/main/resources/templates/from_file.html",
    "content": "<form id='myupload' action='http://localhost:8080/uploadSign' method='post' enctype='multipart/form-data'>\n  <div class=\"demo\">\n    <div class=\"btn\">\n      <span>Ӹ</span>\n      <input id=\"fileupload\" type=\"file\" name=\"file1\"></div>\n    <div class=\"progress\">\n      <span class=\"bar\"></span>\n      <span class=\"percent\">0%</span></div>\n    <!-- ʾϴļ -->\n    <div class=\"files\"></div>\n    <!-- ʾϴͼƬ-->\n    <div class=\"showimg\"></div>\n  </div>\n  <input type=\"submit\" onclick=\"gosubmit2()\" /></form>\n<script src=\"https://cdn.bootcss.com/jquery/1.6.4/jquery.js\"></script>\n<script type=\"text/javascript\" src=\"https://cdn.bootcss.com/jquery.form/4.1.0/jquery.form.min.js\"></script>\n<script type=\"text/javascript\">var bar = $('.bar'); //\n  var percent = $('.percent'); //ȡϴٷֱ\n  var showimg = $('.showimg'); //ʾͼƬdiv\n  var progress = $('.progress'); //ʾȵdiv\n  var files = $('.files'); //ļϴؼinputԪ\n  var btn = $('.btn span'); //ťı\n  function gosubmit2() {\n    $(\"#myupload\").ajaxSubmit({\n      dataType: 'json',\n      //\n      beforeSend: function() {\n        showimg.empty();\n        progress.show();\n        var percentVal = '0%';\n        bar.width(percentVal);\n        percent.html(percentVal);\n        btn.html('ϴ..');\n      },\n      //½¼\n      uploadProgress: function(event, position, total, percentComplete) {\n        var percentVal = percentComplete + '%';\n        bar.width(percentVal);\n        percent.html(percentVal);\n      },\n      success: function(data) { //ͼƬϴɹʱ\n        //ȡ˷صļ\n        alert(data.name + \",\" + data.pic + \",\" + data.size);\n      },\n      error: function(xhr) {\n        btn.html(ϴʧ);\n        bar.width('0');\n        files.html(xhr.responseText);\n      }\n    });\n  }</script>"
  },
  {
    "path": "spring-boot-file-upload/src/main/resources/templates/upload.html",
    "content": "<!DOCTYPE html>\n<html xmlns:th=\"http://www.thymeleaf.org\">\n<body>\n\n<h1>Spring Boot file upload example</h1>\n\n<form method=\"POST\" action=\"/upload\" enctype=\"multipart/form-data\">\n    <input type=\"file\" name=\"file\" /><br/><br/>\n    <input type=\"submit\" value=\"Submit\" />\n</form>\n\n</body>\n</html>\n"
  },
  {
    "path": "spring-boot-file-upload/src/main/resources/templates/uploadStatus.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<body>\n\n<h1>Spring Boot - Upload Status</h1>\n\n<div th:if=\"${message}\">\n    <h2 th:text=\"${message}\"/>\n</div>\n\n</body>\n</html>"
  },
  {
    "path": "spring-boot-hello/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-hello</artifactId>\n\t<version>1.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-hello</name>\n\t<description>Demo project for Spring Boot</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>3.0.0</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>17</java.version>\n\t</properties>\n\n\t<dependencies>\n\t     <dependency>\n\t        <groupId>org.springframework.boot</groupId>\n\t        <artifactId>spring-boot-starter-web</artifactId>\n\t    </dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t</dependency>\n\t</dependencies>\n\t\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\t\n\n</project>\n"
  },
  {
    "path": "spring-boot-hello/src/main/java/com/neo/HelloApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class HelloApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(HelloApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "spring-boot-hello/src/main/java/com/neo/controller/HelloController.java",
    "content": "package com.neo.controller;\n\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n@RestController\npublic class HelloController {\n\t\n    @RequestMapping(\"/\")\n    public String index() {\n        return \"Hello Spring Boot 3.x!\";\n    }\n}"
  },
  {
    "path": "spring-boot-hello/src/main/resources/application.properties",
    "content": ""
  },
  {
    "path": "spring-boot-hello/src/test/java/com/neo/HelloApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.jupiter.api.Test;\nimport org.springframework.boot.test.context.SpringBootTest;\n\n\n@SpringBootTest\npublic class HelloApplicationTests {\n\n\n\t@Test\n\tvoid contextLoads() {\n\t\tSystem.out.println(\"Hello Spring Boot 2.x!\");\n\t}\n\n}\n"
  },
  {
    "path": "spring-boot-helloWorld/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-helloworld</artifactId>\n\t<version>1.0.0-SNAPSHOT</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-helloworld</name>\n\t<description>Demo project for Spring Boot</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>3.0.0</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>17</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-web</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.junit.vintage</groupId>\n\t\t\t<artifactId>junit-vintage-engine</artifactId>\n\t\t\t<scope>test</scope>\n\t\t\t<exclusions>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<groupId>org.hamcrest</groupId>\n\t\t\t\t\t<artifactId>hamcrest-core</artifactId>\n\t\t\t\t</exclusion>\n\t\t\t</exclusions>\n\t\t</dependency>\n\t</dependencies>\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\t\n\n</project>\n"
  },
  {
    "path": "spring-boot-helloWorld/src/main/java/com/neo/Application.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class Application {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(Application.class, args);\n\t}\n}\n"
  },
  {
    "path": "spring-boot-helloWorld/src/main/java/com/neo/controller/HelloWorldController.java",
    "content": "package com.neo.controller;\n\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n@RestController\npublic class HelloWorldController {\n\t\n    @RequestMapping(\"/hello\")\n    public String index() {\n        return \"Hello World\";\n    }\n}"
  },
  {
    "path": "spring-boot-helloWorld/src/main/resources/application.properties",
    "content": ""
  },
  {
    "path": "spring-boot-helloWorld/src/test/java/com/neo/ApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.jupiter.api.Test;\nimport org.springframework.boot.test.context.SpringBootTest;\n\n@SpringBootTest\npublic class ApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t\tSystem.out.println(\"hello word\");\n\t}\n\n}\n"
  },
  {
    "path": "spring-boot-helloWorld/src/test/java/com/neo/controller/HelloTests.java",
    "content": "package com.neo.controller;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;\nimport org.springframework.http.MediaType;\nimport org.springframework.test.context.junit4.SpringRunner;\nimport org.springframework.test.web.servlet.MockMvc;\nimport org.springframework.test.web.servlet.request.MockMvcRequestBuilders;\nimport org.springframework.test.web.servlet.result.MockMvcResultHandlers;\n\n\nimport static org.hamcrest.Matchers.equalTo;\nimport static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;\nimport static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;\n\n\n@RunWith(SpringRunner.class)\n@WebMvcTest(HelloWorldController.class)\npublic class HelloTests {\n\n    @Autowired\n    private MockMvc mvc;\n\n    @Test\n    public void getHello() throws Exception {\n        mvc.perform(MockMvcRequestBuilders\n                        .get(\"/hello\")\n                        .accept(MediaType.APPLICATION_JSON))\n                        .andExpect(status().isOk())\n                        .andDo(MockMvcResultHandlers.print())\n                        .andExpect(content()\n                                .string(equalTo(\"Hello World\")));\n    }\n\n}"
  },
  {
    "path": "spring-boot-jpa/spring-boot-jpa/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-Jpa</artifactId>\n\t<version>1.0.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-Jpa</name>\n\t<description>Demo project for Spring Boot</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>3.0.0</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>17</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-data-jpa</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>mysql</groupId>\n\t\t\t<artifactId>mysql-connector-java</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.junit.vintage</groupId>\n\t\t\t<artifactId>junit-vintage-engine</artifactId>\n\t\t\t<scope>test</scope>\n\t\t\t<exclusions>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<groupId>org.hamcrest</groupId>\n\t\t\t\t\t<artifactId>hamcrest-core</artifactId>\n\t\t\t\t</exclusion>\n\t\t\t</exclusions>\n\t\t</dependency>\n\t</dependencies>\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\n</project>\n"
  },
  {
    "path": "spring-boot-jpa/spring-boot-jpa/src/main/java/com/neo/JpaApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class JpaApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(JpaApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "spring-boot-jpa/spring-boot-jpa/src/main/java/com/neo/model/Address.java",
    "content": "package com.neo.model;\n\nimport jakarta.persistence.Column;\nimport jakarta.persistence.Entity;\nimport jakarta.persistence.GeneratedValue;\nimport jakarta.persistence.Id;\n\n@Entity\npublic class Address {\n\n    @Id\n    @GeneratedValue\n    private Long id;\n    @Column(nullable = false, length = 30)\n    private Long userId;\n    private String province;\n    private String city;\n    private String street;\n\n    public Long getId() {\n        return id;\n    }\n\n    public void setId(Long id) {\n        this.id = id;\n    }\n\n    public Long getUserId() {\n        return userId;\n    }\n\n    public void setUserId(Long userId) {\n        this.userId = userId;\n    }\n\n    public String getProvince() {\n        return province;\n    }\n\n    public void setProvince(String province) {\n        this.province = province;\n    }\n\n    public String getCity() {\n        return city;\n    }\n\n    public void setCity(String city) {\n        this.city = city;\n    }\n\n    public String getStreet() {\n        return street;\n    }\n\n    public void setStreet(String street) {\n        this.street = street;\n    }\n}\n"
  },
  {
    "path": "spring-boot-jpa/spring-boot-jpa/src/main/java/com/neo/model/User.java",
    "content": "package com.neo.model;\n\nimport jakarta.persistence.Column;\nimport jakarta.persistence.Entity;\nimport jakarta.persistence.GeneratedValue;\nimport jakarta.persistence.Id;\n\n@Entity\npublic class User  {\n\n    @Id\n    @GeneratedValue\n    private Long id;\n    @Column(nullable = false, unique = true, length = 30)\n    private String userName;\n    @Column(nullable = false)\n    private String passWord;\n    @Column(nullable = false, unique = true, length = 30)\n    private String email;\n    @Column(nullable = true, unique = true, length = 30)\n    private String nickName;\n    @Column(nullable = false)\n    private String regTime;\n\n    public User() {\n    }\n\n    public User(String userName, String passWord, String email, String nickName, String regTime) {\n        this.userName = userName;\n        this.passWord = passWord;\n        this.email = email;\n        this.nickName = nickName;\n        this.regTime = regTime;\n    }\n\n    public Long getId() {\n        return id;\n    }\n\n    public void setId(Long id) {\n        this.id = id;\n    }\n\n    public String getUserName() {\n        return userName;\n    }\n\n    public void setUserName(String userName) {\n        this.userName = userName;\n    }\n\n    public String getPassWord() {\n        return passWord;\n    }\n\n    public void setPassWord(String passWord) {\n        this.passWord = passWord;\n    }\n\n    public String getEmail() {\n        return email;\n    }\n\n    public void setEmail(String email) {\n        this.email = email;\n    }\n\n    public String getNickName() {\n        return nickName;\n    }\n\n    public void setNickName(String nickName) {\n        this.nickName = nickName;\n    }\n\n    public String getRegTime() {\n        return regTime;\n    }\n\n    public void setRegTime(String regTime) {\n        this.regTime = regTime;\n    }\n}\n"
  },
  {
    "path": "spring-boot-jpa/spring-boot-jpa/src/main/java/com/neo/model/UserDetail.java",
    "content": "package com.neo.model;\n\n\nimport org.hibernate.annotations.Fetch;\nimport org.hibernate.annotations.FetchMode;\n\nimport jakarta.persistence.*;\nimport java.io.Serializable;\n\n@Entity\npublic class UserDetail {\n\n    @Id\n    @GeneratedValue\n    private Long id;\n    @Column(nullable = false, unique = true, length = 30)\n    private Long userId;\n    private Integer age;\n    private String realName;\n    private String status;\n    private String hobby;\n    private String introduction;\n    private String lastLoginIp;\n\n    public Long getId() {\n        return id;\n    }\n\n    public void setId(Long id) {\n        this.id = id;\n    }\n\n    public Long getUserId() {\n        return userId;\n    }\n\n    public void setUserId(Long userId) {\n        this.userId = userId;\n    }\n\n    public Integer getAge() {\n        return age;\n    }\n\n    public void setAge(Integer age) {\n        this.age = age;\n    }\n\n    public String getRealName() {\n        return realName;\n    }\n\n    public void setRealName(String realName) {\n        this.realName = realName;\n    }\n\n    public String getStatus() {\n        return status;\n    }\n\n    public void setStatus(String status) {\n        this.status = status;\n    }\n\n    public String getHobby() {\n        return hobby;\n    }\n\n    public void setHobby(String hobby) {\n        this.hobby = hobby;\n    }\n\n    public String getIntroduction() {\n        return introduction;\n    }\n\n    public void setIntroduction(String introduction) {\n        this.introduction = introduction;\n    }\n\n    public String getLastLoginIp() {\n        return lastLoginIp;\n    }\n\n    public void setLastLoginIp(String lastLoginIp) {\n        this.lastLoginIp = lastLoginIp;\n    }\n\n    @Override\n    public String toString() {\n        return \"UserDetail{\" +\n                \"id=\" + id +\n                \", userId=\" + userId +\n                \", age=\" + age +\n                \", realName='\" + realName + '\\'' +\n                \", status='\" + status + '\\'' +\n                \", hobby='\" + hobby + '\\'' +\n                \", introduction='\" + introduction + '\\'' +\n                \", lastLoginIp='\" + lastLoginIp + '\\'' +\n                '}';\n    }\n}\n"
  },
  {
    "path": "spring-boot-jpa/spring-boot-jpa/src/main/java/com/neo/model/UserInfo.java",
    "content": "package com.neo.model;\n\npublic interface UserInfo {\n\tString getUserName();\n\tString getEmail();\n\tString getHobby();\n\tString getIntroduction();\n}"
  },
  {
    "path": "spring-boot-jpa/spring-boot-jpa/src/main/java/com/neo/param/UserDetailParam.java",
    "content": "package com.neo.param;\n\n\nimport com.neo.model.Address;\nimport org.hibernate.annotations.Fetch;\nimport org.hibernate.annotations.FetchMode;\n\nimport jakarta.persistence.*;\n\npublic class UserDetailParam {\n    private String userId;\n    private Integer minAge;\n    private Integer maxAge;\n    private String realName;\n    private String introduction;\n    private String city;\n\n    public String getUserId() {\n        return userId;\n    }\n\n    public void setUserId(String userId) {\n        this.userId = userId;\n    }\n\n    public Integer getMinAge() {\n        return minAge;\n    }\n\n    public void setMinAge(Integer minAge) {\n        this.minAge = minAge;\n    }\n\n    public Integer getMaxAge() {\n        return maxAge;\n    }\n\n    public void setMaxAge(Integer maxAge) {\n        this.maxAge = maxAge;\n    }\n\n    public String getRealName() {\n        return realName;\n    }\n\n    public void setRealName(String realName) {\n        this.realName = realName;\n    }\n\n    public String getIntroduction() {\n        return introduction;\n    }\n\n    public void setIntroduction(String introduction) {\n        this.introduction = introduction;\n    }\n\n    public String getCity() {\n        return city;\n    }\n\n    public void setCity(String city) {\n        this.city = city;\n    }\n}\n"
  },
  {
    "path": "spring-boot-jpa/spring-boot-jpa/src/main/java/com/neo/repository/AddressRepository.java",
    "content": "package com.neo.repository;\n\nimport com.neo.model.Address;\nimport org.springframework.data.jpa.repository.JpaRepository;\n\npublic interface AddressRepository extends JpaRepository<Address, Long> {\n}"
  },
  {
    "path": "spring-boot-jpa/spring-boot-jpa/src/main/java/com/neo/repository/UserDetailRepository.java",
    "content": "package com.neo.repository;\n\nimport com.neo.model.User;\nimport com.neo.model.UserDetail;\nimport com.neo.model.UserInfo;\nimport org.springframework.data.jpa.repository.JpaRepository;\nimport org.springframework.data.jpa.repository.JpaSpecificationExecutor;\nimport org.springframework.data.jpa.repository.Query;\n\nimport java.util.List;\n\n\npublic interface UserDetailRepository extends JpaSpecificationExecutor<UserDetail>,JpaRepository<UserDetail, Long>  {\n\n    UserDetail  findByHobby(String hobby);\n\n    @Query(\"select u.userName as userName, u.email as email, d.introduction as introduction , d.hobby as hobby from User u , UserDetail d \" +\n            \"where u.id=d.userId  and  d.hobby = ?1 \")\n    List<UserInfo> findUserInfo(String hobby);\n}"
  },
  {
    "path": "spring-boot-jpa/spring-boot-jpa/src/main/java/com/neo/repository/UserRepository.java",
    "content": "package com.neo.repository;\n\nimport com.neo.model.User;\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.Pageable;\nimport org.springframework.data.domain.Slice;\nimport org.springframework.data.jpa.repository.JpaRepository;\nimport org.springframework.data.jpa.repository.Modifying;\nimport org.springframework.data.jpa.repository.Query;\nimport org.springframework.transaction.annotation.Transactional;\n\n\npublic interface UserRepository extends JpaRepository<User, Long> {\n\n    User findByUserName(String userName);\n\n    User findByUserNameOrEmail(String username, String email);\n\n    @Transactional(timeout = 10)\n    @Modifying\n    @Query(\"update User set userName = ?1 where id = ?2\")\n    int modifyById(String  userName, Long id);\n\n    @Transactional\n    @Modifying\n    @Query(\"delete from User where id = ?1\")\n    void deleteById(Long id);\n\n    @Query(\"select u from User u where u.email = ?1\")\n    User findByEmail(String email);\n\n    @Query(\"select u from User u\")\n    Page<User> findALL(Pageable pageable);\n\n    Page<User> findByNickName(String nickName, Pageable pageable);\n\n    Slice<User> findByNickNameAndEmail(String nickName, String email,Pageable pageable);\n\n\n}"
  },
  {
    "path": "spring-boot-jpa/spring-boot-jpa/src/main/java/com/neo/service/UserDetailService.java",
    "content": "package com.neo.service;\n\nimport com.neo.model.UserDetail;\nimport com.neo.param.UserDetailParam;\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.Pageable;\n\npublic interface UserDetailService {\n    public Page<UserDetail> findByCondition(UserDetailParam detailParam, Pageable pageable);\n}\n"
  },
  {
    "path": "spring-boot-jpa/spring-boot-jpa/src/main/java/com/neo/service/UserDetailServiceImpl.java",
    "content": "package com.neo.service;\n\nimport com.mysql.cj.util.StringUtils;\nimport com.neo.model.UserDetail;\nimport com.neo.param.UserDetailParam;\nimport com.neo.repository.UserDetailRepository;\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.Pageable;\nimport org.springframework.stereotype.Service;\n\nimport jakarta.annotation.Resource;\nimport jakarta.persistence.criteria.Predicate;\nimport java.util.ArrayList;\nimport java.util.List;\n\n@Service\npublic class UserDetailServiceImpl implements  UserDetailService{\n\n    @Resource\n    private UserDetailRepository userDetailRepository;\n\n    @Override\n    public Page<UserDetail> findByCondition(UserDetailParam detailParam, Pageable pageable){\n\n        return userDetailRepository.findAll((root, query, cb) -> {\n            List<Predicate> predicates = new ArrayList<Predicate>();\n            //equal 示例\n            if (!StringUtils.isNullOrEmpty(detailParam.getIntroduction())){\n                predicates.add(cb.equal(root.get(\"introduction\"),detailParam.getIntroduction()));\n            }\n            //like 示例\n            if (!StringUtils.isNullOrEmpty(detailParam.getRealName())){\n                predicates.add(cb.like(root.get(\"realName\"),\"%\"+detailParam.getRealName()+\"%\"));\n            }\n            //between 示例\n            if (detailParam.getMinAge()!=null && detailParam.getMaxAge()!=null) {\n                Predicate agePredicate = cb.between(root.get(\"age\"), detailParam.getMinAge(), detailParam.getMaxAge());\n                predicates.add(agePredicate);\n            }\n            //greaterThan 大于等于示例\n            if (detailParam.getMinAge()!=null){\n                predicates.add(cb.greaterThan(root.get(\"age\"),detailParam.getMinAge()));\n            }\n            return query.where(predicates.toArray(new Predicate[predicates.size()])).getRestriction();\n        }, pageable);\n\n    }\n}\n"
  },
  {
    "path": "spring-boot-jpa/spring-boot-jpa/src/main/resources/application.properties",
    "content": "spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true\nspring.datasource.username=root\nspring.datasource.password=root\nspring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver\nspring.datasource.hikari.maxLifeTime=600000\n\nspring.jpa.properties.hibernate.hbm2ddl.auto=create\nspring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQLDialect\n#sql\\u8F93\\u51FA\nspring.jpa.show-sql=true\n#format\\u4E00\\u4E0Bsql\\u8FDB\\u884C\\u8F93\\u51FA\nspring.jpa.properties.hibernate.format_sql=true"
  },
  {
    "path": "spring-boot-jpa/spring-boot-jpa/src/test/java/com/neo/JpaApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class JpaApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t}\n\n}\n"
  },
  {
    "path": "spring-boot-jpa/spring-boot-jpa/src/test/java/com/neo/repository/JpaSpecificationTests.java",
    "content": "package com.neo.repository;\n\nimport com.neo.model.UserDetail;\nimport com.neo.param.UserDetailParam;\nimport com.neo.service.UserDetailService;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageRequest;\nimport org.springframework.data.domain.Pageable;\nimport org.springframework.data.domain.Sort;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport jakarta.annotation.Resource;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class JpaSpecificationTests {\n\n\t@Resource\n\tprivate UserDetailService userDetailService;\n\n\t@Test\n\tpublic void testFindByCondition()  {\n\t\tint page=0,size=10;\n\t\tPageable pageable = PageRequest.of(page, size, Sort.by(\"id\").descending());\n\t\tUserDetailParam param=new UserDetailParam();\n\t\tparam.setIntroduction(\"程序员\");\n\t\tparam.setMinAge(10);\n\t\tparam.setMaxAge(30);\n\t\tPage<UserDetail> page1=userDetailService.findByCondition(param,pageable);\n\t\tfor (UserDetail userDetail:page1){\n\t\t\tSystem.out.println(\"userDetail: \"+userDetail.toString());\n\t\t}\n\t}\n\n}"
  },
  {
    "path": "spring-boot-jpa/spring-boot-jpa/src/test/java/com/neo/repository/UserDetailRepositoryTests.java",
    "content": "package com.neo.repository;\n\nimport com.neo.model.Address;\nimport com.neo.model.UserDetail;\nimport com.neo.model.UserInfo;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport jakarta.annotation.Resource;\nimport java.text.DateFormat;\nimport java.util.Date;\nimport java.util.List;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class UserDetailRepositoryTests {\n\n\t@Resource\n\tprivate AddressRepository addressRepository;\n\t@Resource\n\tprivate UserDetailRepository userDetailRepository;\n\n\t@Test\n\tpublic void testSaveAddress() {\n\t\tAddress address=new Address();\n\t\taddress.setUserId(1L);\n\t\taddress.setCity(\"北京\");\n\t\taddress.setProvince(\"北京\");\n\t\taddress.setStreet(\"分钟寺\");\n\t\taddressRepository.save(address);\n\t}\n\n\t@Test\n\tpublic void testSaveUserDetail() {\n\t\tDate date = new Date();\n\t\tDateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);\n\t\tString formattedDate = dateFormat.format(date);\n\t\tUserDetail userDetail=new UserDetail();\n\t\tuserDetail.setUserId(3L);\n\t\tuserDetail.setHobby(\"吃鸡游戏\");\n\t\tuserDetail.setAge(28);\n\t\tuserDetail.setIntroduction(\"一个爱玩的人\");\n\t\tuserDetailRepository.save(userDetail);\n\t}\n\n\t@Test\n\tpublic void testUserInfo()  {\n\t\tList<UserInfo> userInfos=userDetailRepository.findUserInfo(\"钓鱼\");\n\t\tfor (UserInfo userInfo:userInfos){\n\t\t\tSystem.out.println(\"userInfo: \"+userInfo.getUserName()+\"-\"+userInfo.getEmail()+\"-\"+userInfo.getHobby()+\"-\"+userInfo.getIntroduction());\n\t\t}\n\t}\n}"
  },
  {
    "path": "spring-boot-jpa/spring-boot-jpa/src/test/java/com/neo/repository/UserRepositoryTests.java",
    "content": "package com.neo.repository;\n\nimport com.neo.model.User;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.data.domain.PageRequest;\nimport org.springframework.data.domain.Pageable;\nimport org.springframework.data.domain.Sort;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport jakarta.annotation.Resource;\nimport java.text.DateFormat;\nimport java.util.Date;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class UserRepositoryTests {\n\n\t@Resource\n    private UserRepository userRepository;\n\n\t@Test\n\tpublic void testSave() {\n\t\tDate date = new Date();\n\t\tDateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);\n\t\tString formattedDate = dateFormat.format(date);\n\t\t\n\t\tuserRepository.save(new User(\"aa\", \"aa123456\",\"aa@126.com\", \"aa\",  formattedDate));\n\t\tuserRepository.save(new User(\"bb\", \"bb123456\",\"bb@126.com\", \"bb\",  formattedDate));\n\t\tuserRepository.save(new User(\"cc\", \"cc123456\",\"cc@126.com\", \"cc\",  formattedDate));\n\n//\t\tAssert.assertEquals(3, userRepository.findAll().size());\n//\t\tAssert.assertEquals(\"bb\", userRepository.findByUserNameOrEmail(\"bb\", \"bb@126.com\").getNickName());\n//\t\tuserRepository.delete(userRepository.findByUserName(\"aa\"));\n\t}\n\n\n\t@Test\n\tpublic void testBaseQuery() {\n\t\tDate date = new Date();\n\t\tDateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);\n\t\tString formattedDate = dateFormat.format(date);\n\t\tUser user=new User(\"ff\", \"ff123456\",\"ff@126.com\", \"ff\",  formattedDate);\n\t\tuserRepository.findAll();\n\t\tuserRepository.findById(3L);\n\t\tuserRepository.save(user);\n\t\tuser.setId(2L);\n\t\tuserRepository.delete(user);\n\t\tuserRepository.count();\n\t\tuserRepository.existsById(3L);\n\t}\n\n\t@Test\n\tpublic void testCustomSql() {\n\t\tuserRepository.modifyById(\"neo\",3L);\n\t\tuserRepository.deleteById(3L);\n\t\tuserRepository.findByEmail(\"ff@126.com\");\n\t}\n\n\n\t@Test\n\tpublic void testPageQuery()  {\n\t\tint page=1,size=2;\n\t\tPageable pageable = PageRequest.of(page, size, Sort.by(\"id\").descending());\n\t\tuserRepository.findALL(pageable);\n\t\tuserRepository.findByNickName(\"aa\", pageable);\n\t}\n\n}"
  },
  {
    "path": "spring-boot-jpa/spring-boot-multi-Jpa/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-multi-Jpa</artifactId>\n\t<version>1.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-multi-Jpa</name>\n\t<description>Demo project for Spring Boot</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>3.0.0</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>17</java.version>\n\t</properties>\n\n\t<dependencies>\n\t    <dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-data-jpa</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>mysql</groupId>\n\t\t\t<artifactId>mysql-connector-java</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.junit.vintage</groupId>\n\t\t\t<artifactId>junit-vintage-engine</artifactId>\n\t\t\t<scope>test</scope>\n\t\t\t<exclusions>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<groupId>org.hamcrest</groupId>\n\t\t\t\t\t<artifactId>hamcrest-core</artifactId>\n\t\t\t\t</exclusion>\n\t\t\t</exclusions>\n\t\t</dependency>\n\n\t</dependencies>\n\t\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\t\n\n</project>\n"
  },
  {
    "path": "spring-boot-jpa/spring-boot-multi-Jpa/src/main/java/com/neo/MultiJpaApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class MultiJpaApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(MultiJpaApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "spring-boot-jpa/spring-boot-multi-Jpa/src/main/java/com/neo/config/DataSourceConfig.java",
    "content": "package com.neo.config;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties;\nimport org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings;\nimport org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;\nimport org.springframework.boot.context.properties.ConfigurationProperties;\nimport org.springframework.boot.jdbc.DataSourceBuilder;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.context.annotation.Primary;\n\nimport javax.sql.DataSource;\nimport java.util.Map;\n\n@Configuration\npublic class DataSourceConfig {\n\n    @Autowired\n    private JpaProperties jpaProperties;\n    @Autowired\n    private HibernateProperties hibernateProperties;\n\n    @Bean(name = \"primaryDataSource\")\n    @Primary\n    @ConfigurationProperties(\"spring.datasource.primary\")\n    public DataSource firstDataSource() {\n        return DataSourceBuilder.create().build();\n    }\n\n    @Bean(name = \"secondaryDataSource\")\n    @ConfigurationProperties(\"spring.datasource.secondary\")\n    public DataSource secondDataSource() {\n        return DataSourceBuilder.create().build();\n    }\n\n    @Bean(name = \"vendorProperties\")\n    public Map<String, Object> getVendorProperties() {\n        return hibernateProperties.determineHibernateProperties(jpaProperties.getProperties(), new HibernateSettings());\n    }\n}\n"
  },
  {
    "path": "spring-boot-jpa/spring-boot-multi-Jpa/src/main/java/com/neo/config/PrimaryConfig.java",
    "content": "package com.neo.config;\n\nimport java.util.Map;\n\nimport jakarta.persistence.EntityManager;\nimport javax.sql.DataSource;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.context.annotation.Primary;\nimport org.springframework.data.jpa.repository.config.EnableJpaRepositories;\nimport org.springframework.orm.jpa.JpaTransactionManager;\nimport org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;\nimport org.springframework.transaction.PlatformTransactionManager;\nimport org.springframework.transaction.annotation.EnableTransactionManagement;\n\n@Configuration\n@EnableTransactionManagement\n@EnableJpaRepositories(\n\t\tentityManagerFactoryRef=\"entityManagerFactoryPrimary\",\n\t\ttransactionManagerRef=\"transactionManagerPrimary\",\n\t\tbasePackages= { \"com.neo.repository.test1\" })//设置dao（repo）所在位置\npublic class PrimaryConfig {\n\n    @Autowired\n    @Qualifier(\"primaryDataSource\")\n    private DataSource primaryDataSource;\n\n    @Autowired\n    @Qualifier(\"vendorProperties\")\n    private Map<String, Object> vendorProperties;\n\n    @Bean(name = \"entityManagerFactoryPrimary\")\n    @Primary\n    public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary (EntityManagerFactoryBuilder builder) {\n        return builder\n                .dataSource(primaryDataSource)\n                .properties(vendorProperties)\n                .packages(\"com.neo.model\") //设置实体类所在位置\n                .persistenceUnit(\"primaryPersistenceUnit\")\n                .build();\n    }\n\n    @Bean(name = \"entityManagerPrimary\")\n    @Primary\n    public EntityManager entityManager(EntityManagerFactoryBuilder builder) {\n        return entityManagerFactoryPrimary(builder).getObject().createEntityManager();\n    }\n\n    @Bean(name = \"transactionManagerPrimary\")\n    @Primary\n    PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {\n        return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject());\n    }\n\n}"
  },
  {
    "path": "spring-boot-jpa/spring-boot-multi-Jpa/src/main/java/com/neo/config/SecondaryConfig.java",
    "content": "package com.neo.config;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.data.jpa.repository.config.EnableJpaRepositories;\nimport org.springframework.orm.jpa.JpaTransactionManager;\nimport org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;\nimport org.springframework.transaction.PlatformTransactionManager;\nimport org.springframework.transaction.annotation.EnableTransactionManagement;\n\nimport jakarta.persistence.EntityManager;\nimport javax.sql.DataSource;\nimport java.util.Map;\n\n@Configuration\n@EnableTransactionManagement\n@EnableJpaRepositories(\n        entityManagerFactoryRef=\"entityManagerFactorySecondary\",\n        transactionManagerRef=\"transactionManagerSecondary\",\n        basePackages= { \"com.neo.repository.test2\" })\npublic class SecondaryConfig {\n\n    @Autowired\n    @Qualifier(\"secondaryDataSource\")\n    private DataSource secondaryDataSource;\n\n    @Autowired\n    @Qualifier(\"vendorProperties\")\n    private Map<String, Object> vendorProperties;\n\n    @Bean(name = \"entityManagerFactorySecondary\")\n    public LocalContainerEntityManagerFactoryBean entityManagerFactorySecondary (EntityManagerFactoryBuilder builder) {\n        return builder\n                .dataSource(secondaryDataSource)\n                .properties(vendorProperties)\n                .packages(\"com.neo.model\")\n                .persistenceUnit(\"secondaryPersistenceUnit\")\n                .build();\n    }\n\n    @Bean(name = \"entityManagerSecondary\")\n    public EntityManager entityManager(EntityManagerFactoryBuilder builder) {\n        return entityManagerFactorySecondary(builder).getObject().createEntityManager();\n    }\n\n    @Bean(name = \"transactionManagerSecondary\")\n    PlatformTransactionManager transactionManagerSecondary(EntityManagerFactoryBuilder builder) {\n        return new JpaTransactionManager(entityManagerFactorySecondary(builder).getObject());\n    }\n\n}"
  },
  {
    "path": "spring-boot-jpa/spring-boot-multi-Jpa/src/main/java/com/neo/model/User.java",
    "content": "package com.neo.model;\n\n\n\nimport jakarta.persistence.*;\n\nimport java.io.Serializable;\n\n@Entity\npublic class User implements Serializable {\n\n    private static final long serialVersionUID = 1L;\n    @Id\n    @GeneratedValue(strategy = GenerationType.IDENTITY)\n    @Column(name = \"id\")\n    private long id;\n    @Column(nullable = false, unique = true)\n    private String userName;\n    @Column(nullable = false)\n    private String passWord;\n    @Column(nullable = false, unique = true)\n    private String email;\n    @Column(nullable = true, unique = true)\n    private String nickName;\n    @Column(nullable = false)\n    private String regTime;\n\n    public User() {\n    }\n\n    public User(String userName, String passWord, String email, String nickName, String regTime) {\n        this.userName = userName;\n        this.passWord = passWord;\n        this.email = email;\n        this.nickName = nickName;\n        this.regTime = regTime;\n    }\n\n    public long getId() {\n        return id;\n    }\n\n    public void setId(long id) {\n        this.id = id;\n    }\n\n    public String getUserName() {\n        return userName;\n    }\n\n    public void setUserName(String userName) {\n        this.userName = userName;\n    }\n\n    public String getPassWord() {\n        return passWord;\n    }\n\n    public void setPassWord(String passWord) {\n        this.passWord = passWord;\n    }\n\n    public String getEmail() {\n        return email;\n    }\n\n    public void setEmail(String email) {\n        this.email = email;\n    }\n\n    public String getNickName() {\n        return nickName;\n    }\n\n    public void setNickName(String nickName) {\n        this.nickName = nickName;\n    }\n\n    public String getRegTime() {\n        return regTime;\n    }\n\n    public void setRegTime(String regTime) {\n        this.regTime = regTime;\n    }\n}\n"
  },
  {
    "path": "spring-boot-jpa/spring-boot-multi-Jpa/src/main/java/com/neo/repository/test1/UserTest1Repository.java",
    "content": "package com.neo.repository.test1;\n\nimport com.neo.model.User;\nimport org.springframework.data.jpa.repository.JpaRepository;\n\npublic interface UserTest1Repository extends JpaRepository<User, Long> {\n    User findById(long id);\n    User findByUserName(String userName);\n    User findByUserNameOrEmail(String username, String email);\n}"
  },
  {
    "path": "spring-boot-jpa/spring-boot-multi-Jpa/src/main/java/com/neo/repository/test2/UserTest2Repository.java",
    "content": "package com.neo.repository.test2;\n\nimport com.neo.model.User;\nimport org.springframework.data.jpa.repository.JpaRepository;\n\n\npublic interface UserTest2Repository extends JpaRepository<User, Long> {\n    User findById(long id);\n    User findByUserName(String userName);\n    User findByUserNameOrEmail(String username, String email);\n}"
  },
  {
    "path": "spring-boot-jpa/spring-boot-multi-Jpa/src/main/resources/application.properties",
    "content": "spring.datasource.primary.jdbc-url=jdbc:mysql://localhost:3306/test1?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true\nspring.datasource.primary.username=root\nspring.datasource.primary.password=root\nspring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver\n\nspring.datasource.secondary.jdbc-url=jdbc:mysql://localhost:3306/test2?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true\nspring.datasource.secondary.username=root\nspring.datasource.secondary.password=root\nspring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver\n\n#sql\\u8F93\\u51FA\nspring.jpa.show-sql=true\nspring.jpa.properties.hibernate.hbm2ddl.auto=create\nspring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQLDialect\n#format\\u4E00\\u4E0Bsql\\u8FDB\\u884C\\u8F93\\u51FA\nspring.jpa.properties.hibernate.format_sql=true\n"
  },
  {
    "path": "spring-boot-jpa/spring-boot-multi-Jpa/src/test/java/com/neo/MultiJpaApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class MultiJpaApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t\tSystem.out.println(\"Hello MultiJpa!\");\n\t}\n\n}\n"
  },
  {
    "path": "spring-boot-jpa/spring-boot-multi-Jpa/src/test/java/com/neo/repository/UserRepositoryTests.java",
    "content": "package com.neo.repository;\n\nimport com.neo.model.User;\nimport com.neo.repository.test1.UserTest1Repository;\nimport com.neo.repository.test2.UserTest2Repository;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport jakarta.annotation.Resource;\nimport java.text.DateFormat;\nimport java.util.Date;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class UserRepositoryTests {\n\t@Resource\n\tprivate UserTest1Repository userTest1Repository;\n\t@Resource\n\tprivate UserTest2Repository userTest2Repository;\n\n\t@Test\n\tpublic void testSave() throws Exception {\n\t\tDate date = new Date();\n\t\tDateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);\n\t\tString formattedDate = dateFormat.format(date);\n\n\t\tuserTest1Repository.save(new User(\"aa\", \"aa123456\",\"aa@126.com\", \"aa\",  formattedDate));\n\t\tuserTest1Repository.save(new User(\"bb\", \"bb123456\",\"bb@126.com\", \"bb\",  formattedDate));\n\t\tuserTest2Repository.save(new User(\"cc\", \"cc123456\",\"cc@126.com\", \"cc\",  formattedDate));\n\t}\n\n\n\t@Test\n\tpublic void testDelete() throws Exception {\n\t\tuserTest1Repository.deleteAll();\n\t\tuserTest2Repository.deleteAll();\n\t}\n\n\t@Test\n\tpublic void testBaseQuery() {\n\t\tDate date = new Date();\n\t\tDateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);\n\t\tString formattedDate = dateFormat.format(date);\n\t\tUser user=new User(\"ff\", \"ff123456\",\"ff@126.com\", \"ff\",  formattedDate);\n\t\tuserTest1Repository.findAll();\n\t\tuserTest2Repository.findById(3l);\n\t\tuserTest2Repository.save(user);\n\t\tuser.setId(2l);\n\t\tuserTest1Repository.delete(user);\n\t\tuserTest1Repository.count();\n\t\tuserTest2Repository.findById(3l);\n\t}\n\n\n}"
  },
  {
    "path": "spring-boot-jpa-thymeleaf-curd/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <artifactId>spring-boot-jpa-thymeleaf-curd</artifactId>\n    <name>spring-boot-jpa-thymeleaf-curd</name>\n    <description>spring-boot-jpa-thymeleaf-curd</description>\n    <parent>\n        <groupId>org.springframework.boot</groupId>\n        <artifactId>spring-boot-starter-parent</artifactId>\n        <version>3.0.0</version>\n        <relativePath/> <!-- lookup parent from repository -->\n    </parent>\n\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n        <java.version>17</java.version>\n    </properties>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-web</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-thymeleaf</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-data-jpa</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>mysql</groupId>\n            <artifactId>mysql-connector-java</artifactId>\n        </dependency>\n    </dependencies>\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.springframework.boot</groupId>\n                <artifactId>spring-boot-maven-plugin</artifactId>\n            </plugin>\n        </plugins>\n    </build>\n</project>"
  },
  {
    "path": "spring-boot-jpa-thymeleaf-curd/src/main/java/com/neo/JpaThymeleafApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.boot.builder.SpringApplicationBuilder;\nimport org.springframework.boot.web.servlet.support.SpringBootServletInitializer;\n\n\n@SpringBootApplication\npublic class JpaThymeleafApplication extends SpringBootServletInitializer {\n    @Override\n    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {\n        return application.sources(JpaThymeleafApplication.class);\n    }\n\n    public static void main(String[] args) throws Exception {\n        SpringApplication.run(JpaThymeleafApplication.class, args);\n    }\n}\n\n"
  },
  {
    "path": "spring-boot-jpa-thymeleaf-curd/src/main/java/com/neo/model/User.java",
    "content": "package com.neo.model;\n\nimport jakarta.persistence.Column;\nimport jakarta.persistence.Entity;\nimport jakarta.persistence.GeneratedValue;\nimport jakarta.persistence.Id;\n\n@Entity\npublic class User {\n    @Id\n    @GeneratedValue\n    private long id;\n    @Column(nullable = false, unique = true)\n    private String userName;\n    @Column(nullable = false)\n    private String password;\n    @Column(nullable = false)\n    private int age;\n\n    public long getId() {\n        return id;\n    }\n\n    public User setId(long id) {\n        this.id = id;\n        return this;\n    }\n\n    public String getUserName() {\n        return userName;\n    }\n\n    public User setUserName(String userName) {\n        this.userName = userName;\n        return this;\n    }\n\n    public String getPassword() {\n        return password;\n    }\n\n    public User setPassword(String password) {\n        this.password = password;\n        return this;\n    }\n\n    public int getAge() {\n        return age;\n    }\n\n    public User setAge(int age) {\n        this.age = age;\n        return this;\n    }\n}\n"
  },
  {
    "path": "spring-boot-jpa-thymeleaf-curd/src/main/java/com/neo/repository/UserRepository.java",
    "content": "package com.neo.repository;\n\nimport com.neo.model.User;\nimport org.springframework.data.jpa.repository.JpaRepository;\n\npublic interface UserRepository extends JpaRepository<User, Long> {\n\n    User findById(long id);\n\n    void deleteById(Long id);\n}"
  },
  {
    "path": "spring-boot-jpa-thymeleaf-curd/src/main/java/com/neo/service/UserService.java",
    "content": "package com.neo.service;\n\nimport com.neo.model.User;\n\nimport java.util.List;\n\npublic interface UserService {\n\n    public List<User> getUserList();\n\n    public User findUserById(long id);\n\n    public void save(User user);\n\n    public void edit(User user);\n\n    public void delete(long id);\n\n\n}\n"
  },
  {
    "path": "spring-boot-jpa-thymeleaf-curd/src/main/java/com/neo/service/impl/UserServiceImpl.java",
    "content": "package com.neo.service.impl;\n\nimport com.neo.model.User;\nimport com.neo.repository.UserRepository;\nimport com.neo.service.UserService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.util.List;\n\n@Service\npublic class UserServiceImpl implements UserService{\n\n    @Autowired\n    private UserRepository userRepository;\n\n    @Override\n    public List<User> getUserList() {\n        return userRepository.findAll();\n    }\n\n    @Override\n    public User findUserById(long id) {\n        return userRepository.findById(id);\n    }\n\n    @Override\n    public void save(User user) {\n        userRepository.save(user);\n    }\n\n    @Override\n    public void edit(User user) {\n        userRepository.save(user);\n    }\n\n    @Override\n    public void delete(long id) {\n        userRepository.deleteById(id);\n    }\n}\n\n\n"
  },
  {
    "path": "spring-boot-jpa-thymeleaf-curd/src/main/java/com/neo/web/HelloController.java",
    "content": "package com.neo.web;\n\nimport org.springframework.stereotype.Controller;\nimport org.springframework.ui.Model;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\n\n@Controller\npublic class HelloController {\n\n    @RequestMapping(\"/hello\")\n    public String hello(Model model, @RequestParam(value=\"name\", required=false, defaultValue=\"World\") String name) {\n        model.addAttribute(\"name\", name);\n        return \"hello\";\n    }\n}\n"
  },
  {
    "path": "spring-boot-jpa-thymeleaf-curd/src/main/java/com/neo/web/UserController.java",
    "content": "package com.neo.web;\n\nimport com.neo.model.User;\nimport com.neo.service.UserService;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.ui.Model;\nimport org.springframework.web.bind.annotation.RequestMapping;\n\nimport jakarta.annotation.Resource;\nimport java.util.List;\n\n@Controller\npublic class UserController {\n\n    @Resource\n    UserService userService;\n\n\n    @RequestMapping(\"/\")\n    public String index() {\n        return \"redirect:/list\";\n    }\n\n    @RequestMapping(\"/list\")\n    public String list(Model model) {\n        List<User> users=userService.getUserList();\n        model.addAttribute(\"users\", users);\n        return \"user/list\";\n    }\n\n    @RequestMapping(\"/toAdd\")\n    public String toAdd() {\n        return \"user/userAdd\";\n    }\n\n    @RequestMapping(\"/add\")\n    public String add(User user) {\n        userService.save(user);\n        return \"redirect:/list\";\n    }\n\n    @RequestMapping(\"/toEdit\")\n    public String toEdit(Model model,Long id) {\n        User user=userService.findUserById(id);\n        model.addAttribute(\"user\", user);\n        return \"user/userEdit\";\n    }\n\n    @RequestMapping(\"/edit\")\n    public String edit(User user) {\n        userService.edit(user);\n        return \"redirect:/list\";\n    }\n\n\n    @RequestMapping(\"/delete\")\n    public String delete(Long id) {\n        userService.delete(id);\n        return \"redirect:/list\";\n    }\n}\n"
  },
  {
    "path": "spring-boot-jpa-thymeleaf-curd/src/main/resources/application.properties",
    "content": "spring.datasource.url=jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=true\nspring.datasource.username=root\nspring.datasource.password=root\nspring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver\n\nspring.jpa.properties.hibernate.hbm2ddl.auto=create\nspring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect\nspring.jpa.show-sql= true\n\nspring.thymeleaf.cache=false\n"
  },
  {
    "path": "spring-boot-jpa-thymeleaf-curd/src/main/resources/static/css/bootstrap.css",
    "content": "/*!\n * Bootstrap v3.3.6 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n  font-family: sans-serif;\n  -webkit-text-size-adjust: 100%;\n      -ms-text-size-adjust: 100%;\n}\nbody {\n  margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n  display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n  display: inline-block;\n  vertical-align: baseline;\n}\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n[hidden],\ntemplate {\n  display: none;\n}\na {\n  background-color: transparent;\n}\na:active,\na:hover {\n  outline: 0;\n}\nabbr[title] {\n  border-bottom: 1px dotted;\n}\nb,\nstrong {\n  font-weight: bold;\n}\ndfn {\n  font-style: italic;\n}\nh1 {\n  margin: .67em 0;\n  font-size: 2em;\n}\nmark {\n  color: #000;\n  background: #ff0;\n}\nsmall {\n  font-size: 80%;\n}\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\nsup {\n  top: -.5em;\n}\nsub {\n  bottom: -.25em;\n}\nimg {\n  border: 0;\n}\nsvg:not(:root) {\n  overflow: hidden;\n}\nfigure {\n  margin: 1em 40px;\n}\nhr {\n  height: 0;\n  -webkit-box-sizing: content-box;\n     -moz-box-sizing: content-box;\n          box-sizing: content-box;\n}\npre {\n  overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  margin: 0;\n  font: inherit;\n  color: inherit;\n}\nbutton {\n  overflow: visible;\n}\nbutton,\nselect {\n  text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  -webkit-appearance: button;\n  cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  padding: 0;\n  border: 0;\n}\ninput {\n  line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n  padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\ninput[type=\"search\"] {\n  -webkit-box-sizing: content-box;\n     -moz-box-sizing: content-box;\n          box-sizing: content-box;\n  -webkit-appearance: textfield;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\nfieldset {\n  padding: .35em .625em .75em;\n  margin: 0 2px;\n  border: 1px solid #c0c0c0;\n}\nlegend {\n  padding: 0;\n  border: 0;\n}\ntextarea {\n  overflow: auto;\n}\noptgroup {\n  font-weight: bold;\n}\ntable {\n  border-spacing: 0;\n  border-collapse: collapse;\n}\ntd,\nth {\n  padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n  *,\n  *:before,\n  *:after {\n    color: #000 !important;\n    text-shadow: none !important;\n    background: transparent !important;\n    -webkit-box-shadow: none !important;\n            box-shadow: none !important;\n  }\n  a,\n  a:visited {\n    text-decoration: underline;\n  }\n  a[href]:after {\n    content: \" (\" attr(href) \")\";\n  }\n  abbr[title]:after {\n    content: \" (\" attr(title) \")\";\n  }\n  a[href^=\"#\"]:after,\n  a[href^=\"javascript:\"]:after {\n    content: \"\";\n  }\n  pre,\n  blockquote {\n    border: 1px solid #999;\n\n    page-break-inside: avoid;\n  }\n  thead {\n    display: table-header-group;\n  }\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n  img {\n    max-width: 100% !important;\n  }\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n  .navbar {\n    display: none;\n  }\n  .btn > .caret,\n  .dropup > .btn > .caret {\n    border-top-color: #000 !important;\n  }\n  .label {\n    border: 1px solid #000;\n  }\n  .table {\n    border-collapse: collapse !important;\n  }\n  .table td,\n  .table th {\n    background-color: #fff !important;\n  }\n  .table-bordered th,\n  .table-bordered td {\n    border: 1px solid #ddd !important;\n  }\n}\n@font-face {\n  font-family: 'Glyphicons Halflings';\n\n  src: url('../fonts/glyphicons-halflings-regular.eot');\n  src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.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');\n}\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n  content: \"\\002a\";\n}\n.glyphicon-plus:before {\n  content: \"\\002b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n  content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n  content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n  content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n  content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n  content: \"\\270f\";\n}\n.glyphicon-glass:before {\n  content: \"\\e001\";\n}\n.glyphicon-music:before {\n  content: \"\\e002\";\n}\n.glyphicon-search:before {\n  content: \"\\e003\";\n}\n.glyphicon-heart:before {\n  content: \"\\e005\";\n}\n.glyphicon-star:before {\n  content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n  content: \"\\e007\";\n}\n.glyphicon-user:before {\n  content: \"\\e008\";\n}\n.glyphicon-film:before {\n  content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n  content: \"\\e010\";\n}\n.glyphicon-th:before {\n  content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n  content: \"\\e012\";\n}\n.glyphicon-ok:before {\n  content: \"\\e013\";\n}\n.glyphicon-remove:before {\n  content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n  content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n  content: \"\\e016\";\n}\n.glyphicon-off:before {\n  content: \"\\e017\";\n}\n.glyphicon-signal:before {\n  content: \"\\e018\";\n}\n.glyphicon-cog:before {\n  content: \"\\e019\";\n}\n.glyphicon-trash:before {\n  content: \"\\e020\";\n}\n.glyphicon-home:before {\n  content: \"\\e021\";\n}\n.glyphicon-file:before {\n  content: \"\\e022\";\n}\n.glyphicon-time:before {\n  content: \"\\e023\";\n}\n.glyphicon-road:before {\n  content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n  content: \"\\e025\";\n}\n.glyphicon-download:before {\n  content: \"\\e026\";\n}\n.glyphicon-upload:before {\n  content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n  content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n  content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n  content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n  content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n  content: \"\\e032\";\n}\n.glyphicon-lock:before {\n  content: \"\\e033\";\n}\n.glyphicon-flag:before {\n  content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n  content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n  content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n  content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n  content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n  content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n  content: \"\\e040\";\n}\n.glyphicon-tag:before {\n  content: \"\\e041\";\n}\n.glyphicon-tags:before {\n  content: \"\\e042\";\n}\n.glyphicon-book:before {\n  content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n  content: \"\\e044\";\n}\n.glyphicon-print:before {\n  content: \"\\e045\";\n}\n.glyphicon-camera:before {\n  content: \"\\e046\";\n}\n.glyphicon-font:before {\n  content: \"\\e047\";\n}\n.glyphicon-bold:before {\n  content: \"\\e048\";\n}\n.glyphicon-italic:before {\n  content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n  content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n  content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n  content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n  content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n  content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n  content: \"\\e055\";\n}\n.glyphicon-list:before {\n  content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n  content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n  content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n  content: \"\\e059\";\n}\n.glyphicon-picture:before {\n  content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n  content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n  content: \"\\e063\";\n}\n.glyphicon-tint:before {\n  content: \"\\e064\";\n}\n.glyphicon-edit:before {\n  content: \"\\e065\";\n}\n.glyphicon-share:before {\n  content: \"\\e066\";\n}\n.glyphicon-check:before {\n  content: \"\\e067\";\n}\n.glyphicon-move:before {\n  content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n  content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n  content: \"\\e070\";\n}\n.glyphicon-backward:before {\n  content: \"\\e071\";\n}\n.glyphicon-play:before {\n  content: \"\\e072\";\n}\n.glyphicon-pause:before {\n  content: \"\\e073\";\n}\n.glyphicon-stop:before {\n  content: \"\\e074\";\n}\n.glyphicon-forward:before {\n  content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n  content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n  content: \"\\e077\";\n}\n.glyphicon-eject:before {\n  content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n  content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n  content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n  content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n  content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n  content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n  content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n  content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n  content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n  content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n  content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n  content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n  content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n  content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n  content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n  content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n  content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n  content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n  content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n  content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n  content: \"\\e101\";\n}\n.glyphicon-gift:before {\n  content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n  content: \"\\e103\";\n}\n.glyphicon-fire:before {\n  content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n  content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n  content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n  content: \"\\e107\";\n}\n.glyphicon-plane:before {\n  content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n  content: \"\\e109\";\n}\n.glyphicon-random:before {\n  content: \"\\e110\";\n}\n.glyphicon-comment:before {\n  content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n  content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n  content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n  content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n  content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n  content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n  content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n  content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n  content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n  content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n  content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n  content: \"\\e122\";\n}\n.glyphicon-bell:before {\n  content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n  content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n  content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n  content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n  content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n  content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n  content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n  content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n  content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n  content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n  content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n  content: \"\\e134\";\n}\n.glyphicon-globe:before {\n  content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n  content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n  content: \"\\e137\";\n}\n.glyphicon-filter:before {\n  content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n  content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n  content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n  content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n  content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n  content: \"\\e143\";\n}\n.glyphicon-link:before {\n  content: \"\\e144\";\n}\n.glyphicon-phone:before {\n  content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n  content: \"\\e146\";\n}\n.glyphicon-usd:before {\n  content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n  content: \"\\e149\";\n}\n.glyphicon-sort:before {\n  content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n  content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n  content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n  content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n  content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n  content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n  content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n  content: \"\\e157\";\n}\n.glyphicon-expand:before {\n  content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n  content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n  content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n  content: \"\\e161\";\n}\n.glyphicon-flash:before {\n  content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n  content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n  content: \"\\e164\";\n}\n.glyphicon-record:before {\n  content: \"\\e165\";\n}\n.glyphicon-save:before {\n  content: \"\\e166\";\n}\n.glyphicon-open:before {\n  content: \"\\e167\";\n}\n.glyphicon-saved:before {\n  content: \"\\e168\";\n}\n.glyphicon-import:before {\n  content: \"\\e169\";\n}\n.glyphicon-export:before {\n  content: \"\\e170\";\n}\n.glyphicon-send:before {\n  content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n  content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n  content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n  content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n  content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n  content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n  content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n  content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n  content: \"\\e179\";\n}\n.glyphicon-header:before {\n  content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n  content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n  content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n  content: \"\\e183\";\n}\n.glyphicon-tower:before {\n  content: \"\\e184\";\n}\n.glyphicon-stats:before {\n  content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n  content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n  content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n  content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n  content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n  content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n  content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n  content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n  content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n  content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n  content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n  content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n  content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n  content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n  content: \"\\e200\";\n}\n.glyphicon-cd:before {\n  content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n  content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n  content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n  content: \"\\e204\";\n}\n.glyphicon-copy:before {\n  content: \"\\e205\";\n}\n.glyphicon-paste:before {\n  content: \"\\e206\";\n}\n.glyphicon-alert:before {\n  content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n  content: \"\\e210\";\n}\n.glyphicon-king:before {\n  content: \"\\e211\";\n}\n.glyphicon-queen:before {\n  content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n  content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n  content: \"\\e214\";\n}\n.glyphicon-knight:before {\n  content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n  content: \"\\e216\";\n}\n.glyphicon-tent:before {\n  content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n  content: \"\\e218\";\n}\n.glyphicon-bed:before {\n  content: \"\\e219\";\n}\n.glyphicon-apple:before {\n  content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n  content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n  content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n  content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n  content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n  content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n  content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n  content: \"\\e227\";\n}\n.glyphicon-btc:before {\n  content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n  content: \"\\e227\";\n}\n.glyphicon-yen:before {\n  content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n  content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n  content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n  content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n  content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n  content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n  content: \"\\e232\";\n}\n.glyphicon-education:before {\n  content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n  content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n  content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n  content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n  content: \"\\e237\";\n}\n.glyphicon-oil:before {\n  content: \"\\e238\";\n}\n.glyphicon-grain:before {\n  content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n  content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n  content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n  content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n  content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n  content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n  content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n  content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n  content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n  content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n  content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n  content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n  content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n  content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n  content: \"\\e253\";\n}\n.glyphicon-console:before {\n  content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n  content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n  content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n  content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n  content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n  content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n  content: \"\\e260\";\n}\n* {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n*:before,\n*:after {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\nhtml {\n  font-size: 10px;\n\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #333;\n  background-color: #fff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\na {\n  color: #337ab7;\n  text-decoration: none;\n}\na:hover,\na:focus {\n  color: #23527c;\n  text-decoration: underline;\n}\na:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\nfigure {\n  margin: 0;\n}\nimg {\n  vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  display: block;\n  max-width: 100%;\n  height: auto;\n}\n.img-rounded {\n  border-radius: 6px;\n}\n.img-thumbnail {\n  display: inline-block;\n  max-width: 100%;\n  height: auto;\n  padding: 4px;\n  line-height: 1.42857143;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-radius: 4px;\n  -webkit-transition: all .2s ease-in-out;\n       -o-transition: all .2s ease-in-out;\n          transition: all .2s ease-in-out;\n}\n.img-circle {\n  border-radius: 50%;\n}\nhr {\n  margin-top: 20px;\n  margin-bottom: 20px;\n  border: 0;\n  border-top: 1px solid #eee;\n}\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n  position: static;\n  width: auto;\n  height: auto;\n  margin: 0;\n  overflow: visible;\n  clip: auto;\n}\n[role=\"button\"] {\n  cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n  font-family: inherit;\n  font-weight: 500;\n  line-height: 1.1;\n  color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n  font-weight: normal;\n  line-height: 1;\n  color: #777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n  margin-top: 20px;\n  margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n  font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n  font-size: 75%;\n}\nh1,\n.h1 {\n  font-size: 36px;\n}\nh2,\n.h2 {\n  font-size: 30px;\n}\nh3,\n.h3 {\n  font-size: 24px;\n}\nh4,\n.h4 {\n  font-size: 18px;\n}\nh5,\n.h5 {\n  font-size: 14px;\n}\nh6,\n.h6 {\n  font-size: 12px;\n}\np {\n  margin: 0 0 10px;\n}\n.lead {\n  margin-bottom: 20px;\n  font-size: 16px;\n  font-weight: 300;\n  line-height: 1.4;\n}\n@media (min-width: 768px) {\n  .lead {\n    font-size: 21px;\n  }\n}\nsmall,\n.small {\n  font-size: 85%;\n}\nmark,\n.mark {\n  padding: .2em;\n  background-color: #fcf8e3;\n}\n.text-left {\n  text-align: left;\n}\n.text-right {\n  text-align: right;\n}\n.text-center {\n  text-align: center;\n}\n.text-justify {\n  text-align: justify;\n}\n.text-nowrap {\n  white-space: nowrap;\n}\n.text-lowercase {\n  text-transform: lowercase;\n}\n.text-uppercase {\n  text-transform: uppercase;\n}\n.text-capitalize {\n  text-transform: capitalize;\n}\n.text-muted {\n  color: #777;\n}\n.text-primary {\n  color: #337ab7;\n}\na.text-primary:hover,\na.text-primary:focus {\n  color: #286090;\n}\n.text-success {\n  color: #3c763d;\n}\na.text-success:hover,\na.text-success:focus {\n  color: #2b542c;\n}\n.text-info {\n  color: #31708f;\n}\na.text-info:hover,\na.text-info:focus {\n  color: #245269;\n}\n.text-warning {\n  color: #8a6d3b;\n}\na.text-warning:hover,\na.text-warning:focus {\n  color: #66512c;\n}\n.text-danger {\n  color: #a94442;\n}\na.text-danger:hover,\na.text-danger:focus {\n  color: #843534;\n}\n.bg-primary {\n  color: #fff;\n  background-color: #337ab7;\n}\na.bg-primary:hover,\na.bg-primary:focus {\n  background-color: #286090;\n}\n.bg-success {\n  background-color: #dff0d8;\n}\na.bg-success:hover,\na.bg-success:focus {\n  background-color: #c1e2b3;\n}\n.bg-info {\n  background-color: #d9edf7;\n}\na.bg-info:hover,\na.bg-info:focus {\n  background-color: #afd9ee;\n}\n.bg-warning {\n  background-color: #fcf8e3;\n}\na.bg-warning:hover,\na.bg-warning:focus {\n  background-color: #f7ecb5;\n}\n.bg-danger {\n  background-color: #f2dede;\n}\na.bg-danger:hover,\na.bg-danger:focus {\n  background-color: #e4b9b9;\n}\n.page-header {\n  padding-bottom: 9px;\n  margin: 40px 0 20px;\n  border-bottom: 1px solid #eee;\n}\nul,\nol {\n  margin-top: 0;\n  margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n  margin-bottom: 0;\n}\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n.list-inline {\n  padding-left: 0;\n  margin-left: -5px;\n  list-style: none;\n}\n.list-inline > li {\n  display: inline-block;\n  padding-right: 5px;\n  padding-left: 5px;\n}\ndl {\n  margin-top: 0;\n  margin-bottom: 20px;\n}\ndt,\ndd {\n  line-height: 1.42857143;\n}\ndt {\n  font-weight: bold;\n}\ndd {\n  margin-left: 0;\n}\n@media (min-width: 768px) {\n  .dl-horizontal dt {\n    float: left;\n    width: 160px;\n    overflow: hidden;\n    clear: left;\n    text-align: right;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n  .dl-horizontal dd {\n    margin-left: 180px;\n  }\n}\nabbr[title],\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted #777;\n}\n.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\nblockquote {\n  padding: 10px 20px;\n  margin: 0 0 20px;\n  font-size: 17.5px;\n  border-left: 5px solid #eee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n  margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n  display: block;\n  font-size: 80%;\n  line-height: 1.42857143;\n  color: #777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n  content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  text-align: right;\n  border-right: 5px solid #eee;\n  border-left: 0;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n  content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n  content: '\\00A0 \\2014';\n}\naddress {\n  margin-bottom: 20px;\n  font-style: normal;\n  line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n  font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #c7254e;\n  background-color: #f9f2f4;\n  border-radius: 4px;\n}\nkbd {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #fff;\n  background-color: #333;\n  border-radius: 3px;\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);\n          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);\n}\nkbd kbd {\n  padding: 0;\n  font-size: 100%;\n  font-weight: bold;\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\npre {\n  display: block;\n  padding: 9.5px;\n  margin: 0 0 10px;\n  font-size: 13px;\n  line-height: 1.42857143;\n  color: #333;\n  word-break: break-all;\n  word-wrap: break-word;\n  background-color: #f5f5f5;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n}\npre code {\n  padding: 0;\n  font-size: inherit;\n  color: inherit;\n  white-space: pre-wrap;\n  background-color: transparent;\n  border-radius: 0;\n}\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\n.container {\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n@media (min-width: 768px) {\n  .container {\n    width: 750px;\n  }\n}\n@media (min-width: 992px) {\n  .container {\n    width: 970px;\n  }\n}\n@media (min-width: 1200px) {\n  .container {\n    width: 1170px;\n  }\n}\n.container-fluid {\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n.row {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n  position: relative;\n  min-height: 1px;\n  padding-right: 15px;\n  padding-left: 15px;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n  float: left;\n}\n.col-xs-12 {\n  width: 100%;\n}\n.col-xs-11 {\n  width: 91.66666667%;\n}\n.col-xs-10 {\n  width: 83.33333333%;\n}\n.col-xs-9 {\n  width: 75%;\n}\n.col-xs-8 {\n  width: 66.66666667%;\n}\n.col-xs-7 {\n  width: 58.33333333%;\n}\n.col-xs-6 {\n  width: 50%;\n}\n.col-xs-5 {\n  width: 41.66666667%;\n}\n.col-xs-4 {\n  width: 33.33333333%;\n}\n.col-xs-3 {\n  width: 25%;\n}\n.col-xs-2 {\n  width: 16.66666667%;\n}\n.col-xs-1 {\n  width: 8.33333333%;\n}\n.col-xs-pull-12 {\n  right: 100%;\n}\n.col-xs-pull-11 {\n  right: 91.66666667%;\n}\n.col-xs-pull-10 {\n  right: 83.33333333%;\n}\n.col-xs-pull-9 {\n  right: 75%;\n}\n.col-xs-pull-8 {\n  right: 66.66666667%;\n}\n.col-xs-pull-7 {\n  right: 58.33333333%;\n}\n.col-xs-pull-6 {\n  right: 50%;\n}\n.col-xs-pull-5 {\n  right: 41.66666667%;\n}\n.col-xs-pull-4 {\n  right: 33.33333333%;\n}\n.col-xs-pull-3 {\n  right: 25%;\n}\n.col-xs-pull-2 {\n  right: 16.66666667%;\n}\n.col-xs-pull-1 {\n  right: 8.33333333%;\n}\n.col-xs-pull-0 {\n  right: auto;\n}\n.col-xs-push-12 {\n  left: 100%;\n}\n.col-xs-push-11 {\n  left: 91.66666667%;\n}\n.col-xs-push-10 {\n  left: 83.33333333%;\n}\n.col-xs-push-9 {\n  left: 75%;\n}\n.col-xs-push-8 {\n  left: 66.66666667%;\n}\n.col-xs-push-7 {\n  left: 58.33333333%;\n}\n.col-xs-push-6 {\n  left: 50%;\n}\n.col-xs-push-5 {\n  left: 41.66666667%;\n}\n.col-xs-push-4 {\n  left: 33.33333333%;\n}\n.col-xs-push-3 {\n  left: 25%;\n}\n.col-xs-push-2 {\n  left: 16.66666667%;\n}\n.col-xs-push-1 {\n  left: 8.33333333%;\n}\n.col-xs-push-0 {\n  left: auto;\n}\n.col-xs-offset-12 {\n  margin-left: 100%;\n}\n.col-xs-offset-11 {\n  margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n  margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n  margin-left: 75%;\n}\n.col-xs-offset-8 {\n  margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n  margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n  margin-left: 50%;\n}\n.col-xs-offset-5 {\n  margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n  margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n  margin-left: 25%;\n}\n.col-xs-offset-2 {\n  margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n  margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n  margin-left: 0;\n}\n@media (min-width: 768px) {\n  .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n    float: left;\n  }\n  .col-sm-12 {\n    width: 100%;\n  }\n  .col-sm-11 {\n    width: 91.66666667%;\n  }\n  .col-sm-10 {\n    width: 83.33333333%;\n  }\n  .col-sm-9 {\n    width: 75%;\n  }\n  .col-sm-8 {\n    width: 66.66666667%;\n  }\n  .col-sm-7 {\n    width: 58.33333333%;\n  }\n  .col-sm-6 {\n    width: 50%;\n  }\n  .col-sm-5 {\n    width: 41.66666667%;\n  }\n  .col-sm-4 {\n    width: 33.33333333%;\n  }\n  .col-sm-3 {\n    width: 25%;\n  }\n  .col-sm-2 {\n    width: 16.66666667%;\n  }\n  .col-sm-1 {\n    width: 8.33333333%;\n  }\n  .col-sm-pull-12 {\n    right: 100%;\n  }\n  .col-sm-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-sm-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-sm-pull-9 {\n    right: 75%;\n  }\n  .col-sm-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-sm-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-sm-pull-6 {\n    right: 50%;\n  }\n  .col-sm-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-sm-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-sm-pull-3 {\n    right: 25%;\n  }\n  .col-sm-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-sm-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-sm-pull-0 {\n    right: auto;\n  }\n  .col-sm-push-12 {\n    left: 100%;\n  }\n  .col-sm-push-11 {\n    left: 91.66666667%;\n  }\n  .col-sm-push-10 {\n    left: 83.33333333%;\n  }\n  .col-sm-push-9 {\n    left: 75%;\n  }\n  .col-sm-push-8 {\n    left: 66.66666667%;\n  }\n  .col-sm-push-7 {\n    left: 58.33333333%;\n  }\n  .col-sm-push-6 {\n    left: 50%;\n  }\n  .col-sm-push-5 {\n    left: 41.66666667%;\n  }\n  .col-sm-push-4 {\n    left: 33.33333333%;\n  }\n  .col-sm-push-3 {\n    left: 25%;\n  }\n  .col-sm-push-2 {\n    left: 16.66666667%;\n  }\n  .col-sm-push-1 {\n    left: 8.33333333%;\n  }\n  .col-sm-push-0 {\n    left: auto;\n  }\n  .col-sm-offset-12 {\n    margin-left: 100%;\n  }\n  .col-sm-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-sm-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-sm-offset-9 {\n    margin-left: 75%;\n  }\n  .col-sm-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-sm-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-sm-offset-6 {\n    margin-left: 50%;\n  }\n  .col-sm-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-sm-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-sm-offset-3 {\n    margin-left: 25%;\n  }\n  .col-sm-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-sm-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-sm-offset-0 {\n    margin-left: 0;\n  }\n}\n@media (min-width: 992px) {\n  .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n    float: left;\n  }\n  .col-md-12 {\n    width: 100%;\n  }\n  .col-md-11 {\n    width: 91.66666667%;\n  }\n  .col-md-10 {\n    width: 83.33333333%;\n  }\n  .col-md-9 {\n    width: 75%;\n  }\n  .col-md-8 {\n    width: 66.66666667%;\n  }\n  .col-md-7 {\n    width: 58.33333333%;\n  }\n  .col-md-6 {\n    width: 50%;\n  }\n  .col-md-5 {\n    width: 41.66666667%;\n  }\n  .col-md-4 {\n    width: 33.33333333%;\n  }\n  .col-md-3 {\n    width: 25%;\n  }\n  .col-md-2 {\n    width: 16.66666667%;\n  }\n  .col-md-1 {\n    width: 8.33333333%;\n  }\n  .col-md-pull-12 {\n    right: 100%;\n  }\n  .col-md-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-md-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-md-pull-9 {\n    right: 75%;\n  }\n  .col-md-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-md-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-md-pull-6 {\n    right: 50%;\n  }\n  .col-md-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-md-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-md-pull-3 {\n    right: 25%;\n  }\n  .col-md-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-md-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-md-pull-0 {\n    right: auto;\n  }\n  .col-md-push-12 {\n    left: 100%;\n  }\n  .col-md-push-11 {\n    left: 91.66666667%;\n  }\n  .col-md-push-10 {\n    left: 83.33333333%;\n  }\n  .col-md-push-9 {\n    left: 75%;\n  }\n  .col-md-push-8 {\n    left: 66.66666667%;\n  }\n  .col-md-push-7 {\n    left: 58.33333333%;\n  }\n  .col-md-push-6 {\n    left: 50%;\n  }\n  .col-md-push-5 {\n    left: 41.66666667%;\n  }\n  .col-md-push-4 {\n    left: 33.33333333%;\n  }\n  .col-md-push-3 {\n    left: 25%;\n  }\n  .col-md-push-2 {\n    left: 16.66666667%;\n  }\n  .col-md-push-1 {\n    left: 8.33333333%;\n  }\n  .col-md-push-0 {\n    left: auto;\n  }\n  .col-md-offset-12 {\n    margin-left: 100%;\n  }\n  .col-md-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-md-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-md-offset-9 {\n    margin-left: 75%;\n  }\n  .col-md-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-md-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-md-offset-6 {\n    margin-left: 50%;\n  }\n  .col-md-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-md-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-md-offset-3 {\n    margin-left: 25%;\n  }\n  .col-md-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-md-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-md-offset-0 {\n    margin-left: 0;\n  }\n}\n@media (min-width: 1200px) {\n  .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n    float: left;\n  }\n  .col-lg-12 {\n    width: 100%;\n  }\n  .col-lg-11 {\n    width: 91.66666667%;\n  }\n  .col-lg-10 {\n    width: 83.33333333%;\n  }\n  .col-lg-9 {\n    width: 75%;\n  }\n  .col-lg-8 {\n    width: 66.66666667%;\n  }\n  .col-lg-7 {\n    width: 58.33333333%;\n  }\n  .col-lg-6 {\n    width: 50%;\n  }\n  .col-lg-5 {\n    width: 41.66666667%;\n  }\n  .col-lg-4 {\n    width: 33.33333333%;\n  }\n  .col-lg-3 {\n    width: 25%;\n  }\n  .col-lg-2 {\n    width: 16.66666667%;\n  }\n  .col-lg-1 {\n    width: 8.33333333%;\n  }\n  .col-lg-pull-12 {\n    right: 100%;\n  }\n  .col-lg-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-lg-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-lg-pull-9 {\n    right: 75%;\n  }\n  .col-lg-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-lg-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-lg-pull-6 {\n    right: 50%;\n  }\n  .col-lg-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-lg-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-lg-pull-3 {\n    right: 25%;\n  }\n  .col-lg-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-lg-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-lg-pull-0 {\n    right: auto;\n  }\n  .col-lg-push-12 {\n    left: 100%;\n  }\n  .col-lg-push-11 {\n    left: 91.66666667%;\n  }\n  .col-lg-push-10 {\n    left: 83.33333333%;\n  }\n  .col-lg-push-9 {\n    left: 75%;\n  }\n  .col-lg-push-8 {\n    left: 66.66666667%;\n  }\n  .col-lg-push-7 {\n    left: 58.33333333%;\n  }\n  .col-lg-push-6 {\n    left: 50%;\n  }\n  .col-lg-push-5 {\n    left: 41.66666667%;\n  }\n  .col-lg-push-4 {\n    left: 33.33333333%;\n  }\n  .col-lg-push-3 {\n    left: 25%;\n  }\n  .col-lg-push-2 {\n    left: 16.66666667%;\n  }\n  .col-lg-push-1 {\n    left: 8.33333333%;\n  }\n  .col-lg-push-0 {\n    left: auto;\n  }\n  .col-lg-offset-12 {\n    margin-left: 100%;\n  }\n  .col-lg-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-lg-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-lg-offset-9 {\n    margin-left: 75%;\n  }\n  .col-lg-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-lg-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-lg-offset-6 {\n    margin-left: 50%;\n  }\n  .col-lg-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-lg-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-lg-offset-3 {\n    margin-left: 25%;\n  }\n  .col-lg-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-lg-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-lg-offset-0 {\n    margin-left: 0;\n  }\n}\ntable {\n  background-color: transparent;\n}\ncaption {\n  padding-top: 8px;\n  padding-bottom: 8px;\n  color: #777;\n  text-align: left;\n}\nth {\n  text-align: left;\n}\n.table {\n  width: 100%;\n  max-width: 100%;\n  margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n  padding: 8px;\n  line-height: 1.42857143;\n  vertical-align: top;\n  border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n  vertical-align: bottom;\n  border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n  border-top: 0;\n}\n.table > tbody + tbody {\n  border-top: 2px solid #ddd;\n}\n.table .table {\n  background-color: #fff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n  padding: 5px;\n}\n.table-bordered {\n  border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n  border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n  border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n  background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n  background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n  position: static;\n  display: table-column;\n  float: none;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n  position: static;\n  display: table-cell;\n  float: none;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n  background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n  background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n  background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n  background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n  background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n  background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n  background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n  background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n  background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n  background-color: #ebcccc;\n}\n.table-responsive {\n  min-height: .01%;\n  overflow-x: auto;\n}\n@media screen and (max-width: 767px) {\n  .table-responsive {\n    width: 100%;\n    margin-bottom: 15px;\n    overflow-y: hidden;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    border: 1px solid #ddd;\n  }\n  .table-responsive > .table {\n    margin-bottom: 0;\n  }\n  .table-responsive > .table > thead > tr > th,\n  .table-responsive > .table > tbody > tr > th,\n  .table-responsive > .table > tfoot > tr > th,\n  .table-responsive > .table > thead > tr > td,\n  .table-responsive > .table > tbody > tr > td,\n  .table-responsive > .table > tfoot > tr > td {\n    white-space: nowrap;\n  }\n  .table-responsive > .table-bordered {\n    border: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:first-child,\n  .table-responsive > .table-bordered > tbody > tr > th:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n  .table-responsive > .table-bordered > thead > tr > td:first-child,\n  .table-responsive > .table-bordered > tbody > tr > td:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n    border-left: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:last-child,\n  .table-responsive > .table-bordered > tbody > tr > th:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n  .table-responsive > .table-bordered > thead > tr > td:last-child,\n  .table-responsive > .table-bordered > tbody > tr > td:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n    border-right: 0;\n  }\n  .table-responsive > .table-bordered > tbody > tr:last-child > th,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n  .table-responsive > .table-bordered > tbody > tr:last-child > td,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n    border-bottom: 0;\n  }\n}\nfieldset {\n  min-width: 0;\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 20px;\n  font-size: 21px;\n  line-height: inherit;\n  color: #333;\n  border: 0;\n  border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n  display: inline-block;\n  max-width: 100%;\n  margin-bottom: 5px;\n  font-weight: bold;\n}\ninput[type=\"search\"] {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9;\n  line-height: normal;\n}\ninput[type=\"file\"] {\n  display: block;\n}\ninput[type=\"range\"] {\n  display: block;\n  width: 100%;\n}\nselect[multiple],\nselect[size] {\n  height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\noutput {\n  display: block;\n  padding-top: 7px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #555;\n}\n.form-control {\n  display: block;\n  width: 100%;\n  height: 34px;\n  padding: 6px 12px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #555;\n  background-color: #fff;\n  background-image: none;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n  -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;\n       -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n          transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n  border-color: #66afe9;\n  outline: 0;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);\n          box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);\n}\n.form-control::-moz-placeholder {\n  color: #999;\n  opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n  color: #999;\n}\n.form-control::-webkit-input-placeholder {\n  color: #999;\n}\n.form-control::-ms-expand {\n  background-color: transparent;\n  border: 0;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n  background-color: #eee;\n  opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n  cursor: not-allowed;\n}\ntextarea.form-control {\n  height: auto;\n}\ninput[type=\"search\"] {\n  -webkit-appearance: none;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n  input[type=\"date\"].form-control,\n  input[type=\"time\"].form-control,\n  input[type=\"datetime-local\"].form-control,\n  input[type=\"month\"].form-control {\n    line-height: 34px;\n  }\n  input[type=\"date\"].input-sm,\n  input[type=\"time\"].input-sm,\n  input[type=\"datetime-local\"].input-sm,\n  input[type=\"month\"].input-sm,\n  .input-group-sm input[type=\"date\"],\n  .input-group-sm input[type=\"time\"],\n  .input-group-sm input[type=\"datetime-local\"],\n  .input-group-sm input[type=\"month\"] {\n    line-height: 30px;\n  }\n  input[type=\"date\"].input-lg,\n  input[type=\"time\"].input-lg,\n  input[type=\"datetime-local\"].input-lg,\n  input[type=\"month\"].input-lg,\n  .input-group-lg input[type=\"date\"],\n  .input-group-lg input[type=\"time\"],\n  .input-group-lg input[type=\"datetime-local\"],\n  .input-group-lg input[type=\"month\"] {\n    line-height: 46px;\n  }\n}\n.form-group {\n  margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n  position: relative;\n  display: block;\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n  min-height: 20px;\n  padding-left: 20px;\n  margin-bottom: 0;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  position: absolute;\n  margin-top: 4px \\9;\n  margin-left: -20px;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n  position: relative;\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  font-weight: normal;\n  vertical-align: middle;\n  cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n  cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n  cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n  cursor: not-allowed;\n}\n.form-control-static {\n  min-height: 34px;\n  padding-top: 7px;\n  padding-bottom: 7px;\n  margin-bottom: 0;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n  padding-right: 0;\n  padding-left: 0;\n}\n.input-sm {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\nselect.input-sm {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n  height: auto;\n}\n.form-group-sm .form-control {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.form-group-sm select.form-control {\n  height: 30px;\n  line-height: 30px;\n}\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n  height: auto;\n}\n.form-group-sm .form-control-static {\n  height: 30px;\n  min-height: 32px;\n  padding: 6px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n}\n.input-lg {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n  border-radius: 6px;\n}\nselect.input-lg {\n  height: 46px;\n  line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n  height: auto;\n}\n.form-group-lg .form-control {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n  border-radius: 6px;\n}\n.form-group-lg select.form-control {\n  height: 46px;\n  line-height: 46px;\n}\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n  height: auto;\n}\n.form-group-lg .form-control-static {\n  height: 46px;\n  min-height: 38px;\n  padding: 11px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n}\n.has-feedback {\n  position: relative;\n}\n.has-feedback .form-control {\n  padding-right: 42.5px;\n}\n.form-control-feedback {\n  position: absolute;\n  top: 0;\n  right: 0;\n  z-index: 2;\n  display: block;\n  width: 34px;\n  height: 34px;\n  line-height: 34px;\n  text-align: center;\n  pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n  width: 46px;\n  height: 46px;\n  line-height: 46px;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n  width: 30px;\n  height: 30px;\n  line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n  color: #3c763d;\n}\n.has-success .form-control {\n  border-color: #3c763d;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-success .form-control:focus {\n  border-color: #2b542c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #3c763d;\n}\n.has-success .form-control-feedback {\n  color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n  color: #8a6d3b;\n}\n.has-warning .form-control {\n  border-color: #8a6d3b;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-warning .form-control:focus {\n  border-color: #66512c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #8a6d3b;\n}\n.has-warning .form-control-feedback {\n  color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n  color: #a94442;\n}\n.has-error .form-control {\n  border-color: #a94442;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-error .form-control:focus {\n  border-color: #843534;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #a94442;\n}\n.has-error .form-control-feedback {\n  color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n  top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n  top: 0;\n}\n.help-block {\n  display: block;\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: #737373;\n}\n@media (min-width: 768px) {\n  .form-inline .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .form-inline .form-control-static {\n    display: inline-block;\n  }\n  .form-inline .input-group {\n    display: inline-table;\n    vertical-align: middle;\n  }\n  .form-inline .input-group .input-group-addon,\n  .form-inline .input-group .input-group-btn,\n  .form-inline .input-group .form-control {\n    width: auto;\n  }\n  .form-inline .input-group > .form-control {\n    width: 100%;\n  }\n  .form-inline .control-label {\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .radio,\n  .form-inline .checkbox {\n    display: inline-block;\n    margin-top: 0;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .radio label,\n  .form-inline .checkbox label {\n    padding-left: 0;\n  }\n  .form-inline .radio input[type=\"radio\"],\n  .form-inline .checkbox input[type=\"checkbox\"] {\n    position: relative;\n    margin-left: 0;\n  }\n  .form-inline .has-feedback .form-control-feedback {\n    top: 0;\n  }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n  padding-top: 7px;\n  margin-top: 0;\n  margin-bottom: 0;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n  min-height: 27px;\n}\n.form-horizontal .form-group {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n@media (min-width: 768px) {\n  .form-horizontal .control-label {\n    padding-top: 7px;\n    margin-bottom: 0;\n    text-align: right;\n  }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n  right: 15px;\n}\n@media (min-width: 768px) {\n  .form-horizontal .form-group-lg .control-label {\n    padding-top: 11px;\n    font-size: 18px;\n  }\n}\n@media (min-width: 768px) {\n  .form-horizontal .form-group-sm .control-label {\n    padding-top: 6px;\n    font-size: 12px;\n  }\n}\n.btn {\n  display: inline-block;\n  padding: 6px 12px;\n  margin-bottom: 0;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1.42857143;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: middle;\n  -ms-touch-action: manipulation;\n      touch-action: manipulation;\n  cursor: pointer;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n  color: #333;\n  text-decoration: none;\n}\n.btn:active,\n.btn.active {\n  background-image: none;\n  outline: 0;\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n  cursor: not-allowed;\n  filter: alpha(opacity=65);\n  -webkit-box-shadow: none;\n          box-shadow: none;\n  opacity: .65;\n}\na.btn.disabled,\nfieldset[disabled] a.btn {\n  pointer-events: none;\n}\n.btn-default {\n  color: #333;\n  background-color: #fff;\n  border-color: #ccc;\n}\n.btn-default:focus,\n.btn-default.focus {\n  color: #333;\n  background-color: #e6e6e6;\n  border-color: #8c8c8c;\n}\n.btn-default:hover {\n  color: #333;\n  background-color: #e6e6e6;\n  border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n  color: #333;\n  background-color: #e6e6e6;\n  border-color: #adadad;\n}\n.btn-default:active:hover,\n.btn-default.active:hover,\n.open > .dropdown-toggle.btn-default:hover,\n.btn-default:active:focus,\n.btn-default.active:focus,\n.open > .dropdown-toggle.btn-default:focus,\n.btn-default:active.focus,\n.btn-default.active.focus,\n.open > .dropdown-toggle.btn-default.focus {\n  color: #333;\n  background-color: #d4d4d4;\n  border-color: #8c8c8c;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n  background-image: none;\n}\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus {\n  background-color: #fff;\n  border-color: #ccc;\n}\n.btn-default .badge {\n  color: #fff;\n  background-color: #333;\n}\n.btn-primary {\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #2e6da4;\n}\n.btn-primary:focus,\n.btn-primary.focus {\n  color: #fff;\n  background-color: #286090;\n  border-color: #122b40;\n}\n.btn-primary:hover {\n  color: #fff;\n  background-color: #286090;\n  border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n  color: #fff;\n  background-color: #286090;\n  border-color: #204d74;\n}\n.btn-primary:active:hover,\n.btn-primary.active:hover,\n.open > .dropdown-toggle.btn-primary:hover,\n.btn-primary:active:focus,\n.btn-primary.active:focus,\n.open > .dropdown-toggle.btn-primary:focus,\n.btn-primary:active.focus,\n.btn-primary.active.focus,\n.open > .dropdown-toggle.btn-primary.focus {\n  color: #fff;\n  background-color: #204d74;\n  border-color: #122b40;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n  background-image: none;\n}\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus {\n  background-color: #337ab7;\n  border-color: #2e6da4;\n}\n.btn-primary .badge {\n  color: #337ab7;\n  background-color: #fff;\n}\n.btn-success {\n  color: #fff;\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n.btn-success:focus,\n.btn-success.focus {\n  color: #fff;\n  background-color: #449d44;\n  border-color: #255625;\n}\n.btn-success:hover {\n  color: #fff;\n  background-color: #449d44;\n  border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n  color: #fff;\n  background-color: #449d44;\n  border-color: #398439;\n}\n.btn-success:active:hover,\n.btn-success.active:hover,\n.open > .dropdown-toggle.btn-success:hover,\n.btn-success:active:focus,\n.btn-success.active:focus,\n.open > .dropdown-toggle.btn-success:focus,\n.btn-success:active.focus,\n.btn-success.active.focus,\n.open > .dropdown-toggle.btn-success.focus {\n  color: #fff;\n  background-color: #398439;\n  border-color: #255625;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n  background-image: none;\n}\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus {\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n.btn-success .badge {\n  color: #5cb85c;\n  background-color: #fff;\n}\n.btn-info {\n  color: #fff;\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n.btn-info:focus,\n.btn-info.focus {\n  color: #fff;\n  background-color: #31b0d5;\n  border-color: #1b6d85;\n}\n.btn-info:hover {\n  color: #fff;\n  background-color: #31b0d5;\n  border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n  color: #fff;\n  background-color: #31b0d5;\n  border-color: #269abc;\n}\n.btn-info:active:hover,\n.btn-info.active:hover,\n.open > .dropdown-toggle.btn-info:hover,\n.btn-info:active:focus,\n.btn-info.active:focus,\n.open > .dropdown-toggle.btn-info:focus,\n.btn-info:active.focus,\n.btn-info.active.focus,\n.open > .dropdown-toggle.btn-info.focus {\n  color: #fff;\n  background-color: #269abc;\n  border-color: #1b6d85;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n  background-image: none;\n}\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus {\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n.btn-info .badge {\n  color: #5bc0de;\n  background-color: #fff;\n}\n.btn-warning {\n  color: #fff;\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n.btn-warning:focus,\n.btn-warning.focus {\n  color: #fff;\n  background-color: #ec971f;\n  border-color: #985f0d;\n}\n.btn-warning:hover {\n  color: #fff;\n  background-color: #ec971f;\n  border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n  color: #fff;\n  background-color: #ec971f;\n  border-color: #d58512;\n}\n.btn-warning:active:hover,\n.btn-warning.active:hover,\n.open > .dropdown-toggle.btn-warning:hover,\n.btn-warning:active:focus,\n.btn-warning.active:focus,\n.open > .dropdown-toggle.btn-warning:focus,\n.btn-warning:active.focus,\n.btn-warning.active.focus,\n.open > .dropdown-toggle.btn-warning.focus {\n  color: #fff;\n  background-color: #d58512;\n  border-color: #985f0d;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n  background-image: none;\n}\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus {\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n.btn-warning .badge {\n  color: #f0ad4e;\n  background-color: #fff;\n}\n.btn-danger {\n  color: #fff;\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n.btn-danger:focus,\n.btn-danger.focus {\n  color: #fff;\n  background-color: #c9302c;\n  border-color: #761c19;\n}\n.btn-danger:hover {\n  color: #fff;\n  background-color: #c9302c;\n  border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n  color: #fff;\n  background-color: #c9302c;\n  border-color: #ac2925;\n}\n.btn-danger:active:hover,\n.btn-danger.active:hover,\n.open > .dropdown-toggle.btn-danger:hover,\n.btn-danger:active:focus,\n.btn-danger.active:focus,\n.open > .dropdown-toggle.btn-danger:focus,\n.btn-danger:active.focus,\n.btn-danger.active.focus,\n.open > .dropdown-toggle.btn-danger.focus {\n  color: #fff;\n  background-color: #ac2925;\n  border-color: #761c19;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n  background-image: none;\n}\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus {\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n.btn-danger .badge {\n  color: #d9534f;\n  background-color: #fff;\n}\n.btn-link {\n  font-weight: normal;\n  color: #337ab7;\n  border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n  background-color: transparent;\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n  border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n  color: #23527c;\n  text-decoration: underline;\n  background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n  color: #777;\n  text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n  border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n  padding: 1px 5px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.btn-block {\n  display: block;\n  width: 100%;\n}\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n.fade {\n  opacity: 0;\n  -webkit-transition: opacity .15s linear;\n       -o-transition: opacity .15s linear;\n          transition: opacity .15s linear;\n}\n.fade.in {\n  opacity: 1;\n}\n.collapse {\n  display: none;\n}\n.collapse.in {\n  display: block;\n}\ntr.collapse.in {\n  display: table-row;\n}\ntbody.collapse.in {\n  display: table-row-group;\n}\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  -webkit-transition-timing-function: ease;\n       -o-transition-timing-function: ease;\n          transition-timing-function: ease;\n  -webkit-transition-duration: .35s;\n       -o-transition-duration: .35s;\n          transition-duration: .35s;\n  -webkit-transition-property: height, visibility;\n       -o-transition-property: height, visibility;\n          transition-property: height, visibility;\n}\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top: 4px dashed;\n  border-top: 4px solid \\9;\n  border-right: 4px solid transparent;\n  border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n  position: relative;\n}\n.dropdown-toggle:focus {\n  outline: 0;\n}\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0;\n  font-size: 14px;\n  text-align: left;\n  list-style: none;\n  background-color: #fff;\n  -webkit-background-clip: padding-box;\n          background-clip: padding-box;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, .15);\n  border-radius: 4px;\n  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);\n          box-shadow: 0 6px 12px rgba(0, 0, 0, .175);\n}\n.dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n.dropdown-menu .divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n  display: block;\n  padding: 3px 20px;\n  clear: both;\n  font-weight: normal;\n  line-height: 1.42857143;\n  color: #333;\n  white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  color: #262626;\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  color: #fff;\n  text-decoration: none;\n  background-color: #337ab7;\n  outline: 0;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  color: #777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n  background-image: none;\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.open > .dropdown-menu {\n  display: block;\n}\n.open > a {\n  outline: 0;\n}\n.dropdown-menu-right {\n  right: 0;\n  left: auto;\n}\n.dropdown-menu-left {\n  right: auto;\n  left: 0;\n}\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: 12px;\n  line-height: 1.42857143;\n  color: #777;\n  white-space: nowrap;\n}\n.dropdown-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 990;\n}\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n  content: \"\";\n  border-top: 0;\n  border-bottom: 4px dashed;\n  border-bottom: 4px solid \\9;\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-bottom: 2px;\n}\n@media (min-width: 768px) {\n  .navbar-right .dropdown-menu {\n    right: 0;\n    left: auto;\n  }\n  .navbar-right .dropdown-menu-left {\n    right: auto;\n    left: 0;\n  }\n}\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n  position: relative;\n  float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n  z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n  margin-left: -1px;\n}\n.btn-toolbar {\n  margin-left: -5px;\n}\n.btn-toolbar .btn,\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n  float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n  margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n.btn-group > .btn:first-child {\n  margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group > .btn-group {\n  float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n  padding-right: 8px;\n  padding-left: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-right: 12px;\n  padding-left: 12px;\n}\n.btn-group.open .dropdown-toggle {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n.btn .caret {\n  margin-left: 0;\n}\n.btn-lg .caret {\n  border-width: 5px 5px 0;\n  border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n  border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n  display: block;\n  float: none;\n  width: 100%;\n  max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n  float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n  margin-top: -1px;\n  margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n  border-top-left-radius: 4px;\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  table-layout: fixed;\n  border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n  display: table-cell;\n  float: none;\n  width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n  width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n  left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n  position: absolute;\n  clip: rect(0, 0, 0, 0);\n  pointer-events: none;\n}\n.input-group {\n  position: relative;\n  display: table;\n  border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n  float: none;\n  padding-right: 0;\n  padding-left: 0;\n}\n.input-group .form-control {\n  position: relative;\n  z-index: 2;\n  float: left;\n  width: 100%;\n  margin-bottom: 0;\n}\n.input-group .form-control:focus {\n  z-index: 3;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n  border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n  height: 46px;\n  line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n  height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n  height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle;\n}\n.input-group-addon {\n  padding: 6px 12px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1;\n  color: #555;\n  text-align: center;\n  background-color: #eee;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n}\n.input-group-addon.input-sm {\n  padding: 5px 10px;\n  font-size: 12px;\n  border-radius: 3px;\n}\n.input-group-addon.input-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n  margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.input-group-addon:first-child {\n  border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.input-group-addon:last-child {\n  border-left: 0;\n}\n.input-group-btn {\n  position: relative;\n  font-size: 0;\n  white-space: nowrap;\n}\n.input-group-btn > .btn {\n  position: relative;\n}\n.input-group-btn > .btn + .btn {\n  margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n  z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n  margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n  z-index: 2;\n  margin-left: -1px;\n}\n.nav {\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n.nav > li {\n  position: relative;\n  display: block;\n}\n.nav > li > a {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n  text-decoration: none;\n  background-color: #eee;\n}\n.nav > li.disabled > a {\n  color: #777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n  color: #777;\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n  background-color: #eee;\n  border-color: #337ab7;\n}\n.nav .nav-divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n.nav > li > a > img {\n  max-width: none;\n}\n.nav-tabs {\n  border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n  float: left;\n  margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n  margin-right: 2px;\n  line-height: 1.42857143;\n  border: 1px solid transparent;\n  border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n  border-color: #eee #eee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n  color: #555;\n  cursor: default;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-bottom-color: transparent;\n}\n.nav-tabs.nav-justified {\n  width: 100%;\n  border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n  float: none;\n}\n.nav-tabs.nav-justified > li > a {\n  margin-bottom: 5px;\n  text-align: center;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n  .nav-tabs.nav-justified > li > a {\n    margin-bottom: 0;\n  }\n}\n.nav-tabs.nav-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n  border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li > a {\n    border-bottom: 1px solid #ddd;\n    border-radius: 4px 4px 0 0;\n  }\n  .nav-tabs.nav-justified > .active > a,\n  .nav-tabs.nav-justified > .active > a:hover,\n  .nav-tabs.nav-justified > .active > a:focus {\n    border-bottom-color: #fff;\n  }\n}\n.nav-pills > li {\n  float: left;\n}\n.nav-pills > li > a {\n  border-radius: 4px;\n}\n.nav-pills > li + li {\n  margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n  color: #fff;\n  background-color: #337ab7;\n}\n.nav-stacked > li {\n  float: none;\n}\n.nav-stacked > li + li {\n  margin-top: 2px;\n  margin-left: 0;\n}\n.nav-justified {\n  width: 100%;\n}\n.nav-justified > li {\n  float: none;\n}\n.nav-justified > li > a {\n  margin-bottom: 5px;\n  text-align: center;\n}\n.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\n@media (min-width: 768px) {\n  .nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n  .nav-justified > li > a {\n    margin-bottom: 0;\n  }\n}\n.nav-tabs-justified {\n  border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n  border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n  .nav-tabs-justified > li > a {\n    border-bottom: 1px solid #ddd;\n    border-radius: 4px 4px 0 0;\n  }\n  .nav-tabs-justified > .active > a,\n  .nav-tabs-justified > .active > a:hover,\n  .nav-tabs-justified > .active > a:focus {\n    border-bottom-color: #fff;\n  }\n}\n.tab-content > .tab-pane {\n  display: none;\n}\n.tab-content > .active {\n  display: block;\n}\n.nav-tabs .dropdown-menu {\n  margin-top: -1px;\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.navbar {\n  position: relative;\n  min-height: 50px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n  .navbar {\n    border-radius: 4px;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-header {\n    float: left;\n  }\n}\n.navbar-collapse {\n  padding-right: 15px;\n  padding-left: 15px;\n  overflow-x: visible;\n  -webkit-overflow-scrolling: touch;\n  border-top: 1px solid transparent;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);\n}\n.navbar-collapse.in {\n  overflow-y: auto;\n}\n@media (min-width: 768px) {\n  .navbar-collapse {\n    width: auto;\n    border-top: 0;\n    -webkit-box-shadow: none;\n            box-shadow: none;\n  }\n  .navbar-collapse.collapse {\n    display: block !important;\n    height: auto !important;\n    padding-bottom: 0;\n    overflow: visible !important;\n  }\n  .navbar-collapse.in {\n    overflow-y: visible;\n  }\n  .navbar-fixed-top .navbar-collapse,\n  .navbar-static-top .navbar-collapse,\n  .navbar-fixed-bottom .navbar-collapse {\n    padding-right: 0;\n    padding-left: 0;\n  }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n  max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n  .navbar-fixed-top .navbar-collapse,\n  .navbar-fixed-bottom .navbar-collapse {\n    max-height: 200px;\n  }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n@media (min-width: 768px) {\n  .container > .navbar-header,\n  .container-fluid > .navbar-header,\n  .container > .navbar-collapse,\n  .container-fluid > .navbar-collapse {\n    margin-right: 0;\n    margin-left: 0;\n  }\n}\n.navbar-static-top {\n  z-index: 1000;\n  border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n  .navbar-static-top {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: 1030;\n}\n@media (min-width: 768px) {\n  .navbar-fixed-top,\n  .navbar-fixed-bottom {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top {\n  top: 0;\n  border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0;\n  border-width: 1px 0 0;\n}\n.navbar-brand {\n  float: left;\n  height: 50px;\n  padding: 15px 15px;\n  font-size: 18px;\n  line-height: 20px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n  text-decoration: none;\n}\n.navbar-brand > img {\n  display: block;\n}\n@media (min-width: 768px) {\n  .navbar > .container .navbar-brand,\n  .navbar > .container-fluid .navbar-brand {\n    margin-left: -15px;\n  }\n}\n.navbar-toggle {\n  position: relative;\n  float: right;\n  padding: 9px 10px;\n  margin-top: 8px;\n  margin-right: 15px;\n  margin-bottom: 8px;\n  background-color: transparent;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.navbar-toggle:focus {\n  outline: 0;\n}\n.navbar-toggle .icon-bar {\n  display: block;\n  width: 22px;\n  height: 2px;\n  border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n  margin-top: 4px;\n}\n@media (min-width: 768px) {\n  .navbar-toggle {\n    display: none;\n  }\n}\n.navbar-nav {\n  margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n  padding-top: 10px;\n  padding-bottom: 10px;\n  line-height: 20px;\n}\n@media (max-width: 767px) {\n  .navbar-nav .open .dropdown-menu {\n    position: static;\n    float: none;\n    width: auto;\n    margin-top: 0;\n    background-color: transparent;\n    border: 0;\n    -webkit-box-shadow: none;\n            box-shadow: none;\n  }\n  .navbar-nav .open .dropdown-menu > li > a,\n  .navbar-nav .open .dropdown-menu .dropdown-header {\n    padding: 5px 15px 5px 25px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a {\n    line-height: 20px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-nav .open .dropdown-menu > li > a:focus {\n    background-image: none;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-nav {\n    float: left;\n    margin: 0;\n  }\n  .navbar-nav > li {\n    float: left;\n  }\n  .navbar-nav > li > a {\n    padding-top: 15px;\n    padding-bottom: 15px;\n  }\n}\n.navbar-form {\n  padding: 10px 15px;\n  margin-top: 8px;\n  margin-right: -15px;\n  margin-bottom: 8px;\n  margin-left: -15px;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);\n}\n@media (min-width: 768px) {\n  .navbar-form .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .navbar-form .form-control-static {\n    display: inline-block;\n  }\n  .navbar-form .input-group {\n    display: inline-table;\n    vertical-align: middle;\n  }\n  .navbar-form .input-group .input-group-addon,\n  .navbar-form .input-group .input-group-btn,\n  .navbar-form .input-group .form-control {\n    width: auto;\n  }\n  .navbar-form .input-group > .form-control {\n    width: 100%;\n  }\n  .navbar-form .control-label {\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .radio,\n  .navbar-form .checkbox {\n    display: inline-block;\n    margin-top: 0;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .radio label,\n  .navbar-form .checkbox label {\n    padding-left: 0;\n  }\n  .navbar-form .radio input[type=\"radio\"],\n  .navbar-form .checkbox input[type=\"checkbox\"] {\n    position: relative;\n    margin-left: 0;\n  }\n  .navbar-form .has-feedback .form-control-feedback {\n    top: 0;\n  }\n}\n@media (max-width: 767px) {\n  .navbar-form .form-group {\n    margin-bottom: 5px;\n  }\n  .navbar-form .form-group:last-child {\n    margin-bottom: 0;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-form {\n    width: auto;\n    padding-top: 0;\n    padding-bottom: 0;\n    margin-right: 0;\n    margin-left: 0;\n    border: 0;\n    -webkit-box-shadow: none;\n            box-shadow: none;\n  }\n}\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  margin-bottom: 0;\n  border-top-left-radius: 4px;\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.navbar-btn {\n  margin-top: 8px;\n  margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n  margin-top: 14px;\n  margin-bottom: 14px;\n}\n.navbar-text {\n  margin-top: 15px;\n  margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n  .navbar-text {\n    float: left;\n    margin-right: 15px;\n    margin-left: 15px;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-left {\n    float: left !important;\n  }\n  .navbar-right {\n    float: right !important;\n    margin-right: -15px;\n  }\n  .navbar-right ~ .navbar-right {\n    margin-right: 0;\n  }\n}\n.navbar-default {\n  background-color: #f8f8f8;\n  border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n  color: #777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n  color: #5e5e5e;\n  background-color: transparent;\n}\n.navbar-default .navbar-text {\n  color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n  color: #777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n  color: #333;\n  background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n  color: #555;\n  background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n  color: #ccc;\n  background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n  border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n  background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n  background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n  border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n  color: #555;\n  background-color: #e7e7e7;\n}\n@media (max-width: 767px) {\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n    color: #777;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #333;\n    background-color: transparent;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #555;\n    background-color: #e7e7e7;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #ccc;\n    background-color: transparent;\n  }\n}\n.navbar-default .navbar-link {\n  color: #777;\n}\n.navbar-default .navbar-link:hover {\n  color: #333;\n}\n.navbar-default .btn-link {\n  color: #777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n  color: #333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n  color: #ccc;\n}\n.navbar-inverse {\n  background-color: #222;\n  border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n  color: #fff;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n  color: #fff;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n  color: #fff;\n  background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n  color: #444;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n  border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n  background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n  background-color: #fff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n  border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n  color: #fff;\n  background-color: #080808;\n}\n@media (max-width: 767px) {\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n    border-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n    background-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n    color: #9d9d9d;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #fff;\n    background-color: transparent;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #fff;\n    background-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #444;\n    background-color: transparent;\n  }\n}\n.navbar-inverse .navbar-link {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n  color: #fff;\n}\n.navbar-inverse .btn-link {\n  color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n  color: #fff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n  color: #444;\n}\n.breadcrumb {\n  padding: 8px 15px;\n  margin-bottom: 20px;\n  list-style: none;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n}\n.breadcrumb > li {\n  display: inline-block;\n}\n.breadcrumb > li + li:before {\n  padding: 0 5px;\n  color: #ccc;\n  content: \"/\\00a0\";\n}\n.breadcrumb > .active {\n  color: #777;\n}\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: 20px 0;\n  border-radius: 4px;\n}\n.pagination > li {\n  display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n  position: relative;\n  float: left;\n  padding: 6px 12px;\n  margin-left: -1px;\n  line-height: 1.42857143;\n  color: #337ab7;\n  text-decoration: none;\n  background-color: #fff;\n  border: 1px solid #ddd;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n  margin-left: 0;\n  border-top-left-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n  z-index: 2;\n  color: #23527c;\n  background-color: #eee;\n  border-color: #ddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n  z-index: 3;\n  color: #fff;\n  cursor: default;\n  background-color: #337ab7;\n  border-color: #337ab7;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n  color: #777;\n  cursor: not-allowed;\n  background-color: #fff;\n  border-color: #ddd;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n  border-top-left-radius: 6px;\n  border-bottom-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n  border-top-right-radius: 6px;\n  border-bottom-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n  border-top-left-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n  border-top-right-radius: 3px;\n  border-bottom-right-radius: 3px;\n}\n.pager {\n  padding-left: 0;\n  margin: 20px 0;\n  text-align: center;\n  list-style: none;\n}\n.pager li {\n  display: inline;\n}\n.pager li > a,\n.pager li > span {\n  display: inline-block;\n  padding: 5px 14px;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n  text-decoration: none;\n  background-color: #eee;\n}\n.pager .next > a,\n.pager .next > span {\n  float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n  float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n  color: #777;\n  cursor: not-allowed;\n  background-color: #fff;\n}\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: #fff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n  color: #fff;\n  text-decoration: none;\n  cursor: pointer;\n}\n.label:empty {\n  display: none;\n}\n.btn .label {\n  position: relative;\n  top: -1px;\n}\n.label-default {\n  background-color: #777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n  background-color: #5e5e5e;\n}\n.label-primary {\n  background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n  background-color: #286090;\n}\n.label-success {\n  background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n  background-color: #449d44;\n}\n.label-info {\n  background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n  background-color: #31b0d5;\n}\n.label-warning {\n  background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n  background-color: #ec971f;\n}\n.label-danger {\n  background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n  background-color: #c9302c;\n}\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: 12px;\n  font-weight: bold;\n  line-height: 1;\n  color: #fff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: middle;\n  background-color: #777;\n  border-radius: 10px;\n}\n.badge:empty {\n  display: none;\n}\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n  top: 0;\n  padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n  color: #fff;\n  text-decoration: none;\n  cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n  color: #337ab7;\n  background-color: #fff;\n}\n.list-group-item > .badge {\n  float: right;\n}\n.list-group-item > .badge + .badge {\n  margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n  margin-left: 3px;\n}\n.jumbotron {\n  padding-top: 30px;\n  padding-bottom: 30px;\n  margin-bottom: 30px;\n  color: inherit;\n  background-color: #eee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n  color: inherit;\n}\n.jumbotron p {\n  margin-bottom: 15px;\n  font-size: 21px;\n  font-weight: 200;\n}\n.jumbotron > hr {\n  border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n  padding-right: 15px;\n  padding-left: 15px;\n  border-radius: 6px;\n}\n.jumbotron .container {\n  max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n  .jumbotron {\n    padding-top: 48px;\n    padding-bottom: 48px;\n  }\n  .container .jumbotron,\n  .container-fluid .jumbotron {\n    padding-right: 60px;\n    padding-left: 60px;\n  }\n  .jumbotron h1,\n  .jumbotron .h1 {\n    font-size: 63px;\n  }\n}\n.thumbnail {\n  display: block;\n  padding: 4px;\n  margin-bottom: 20px;\n  line-height: 1.42857143;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-radius: 4px;\n  -webkit-transition: border .2s ease-in-out;\n       -o-transition: border .2s ease-in-out;\n          transition: border .2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n  margin-right: auto;\n  margin-left: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n  border-color: #337ab7;\n}\n.thumbnail .caption {\n  padding: 9px;\n  color: #333;\n}\n.alert {\n  padding: 15px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.alert h4 {\n  margin-top: 0;\n  color: inherit;\n}\n.alert .alert-link {\n  font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n  margin-bottom: 0;\n}\n.alert > p + p {\n  margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n  padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n  position: relative;\n  top: -2px;\n  right: -21px;\n  color: inherit;\n}\n.alert-success {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n.alert-success hr {\n  border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n  color: #2b542c;\n}\n.alert-info {\n  color: #31708f;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n.alert-info hr {\n  border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n  color: #245269;\n}\n.alert-warning {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n}\n.alert-warning hr {\n  border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n  color: #66512c;\n}\n.alert-danger {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #ebccd1;\n}\n.alert-danger hr {\n  border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n  color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n@-o-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n.progress {\n  height: 20px;\n  margin-bottom: 20px;\n  overflow: hidden;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);\n          box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);\n}\n.progress-bar {\n  float: left;\n  width: 0;\n  height: 100%;\n  font-size: 12px;\n  line-height: 20px;\n  color: #fff;\n  text-align: center;\n  background-color: #337ab7;\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);\n          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);\n  -webkit-transition: width .6s ease;\n       -o-transition: width .6s ease;\n          transition: width .6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  -webkit-background-size: 40px 40px;\n          background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n  -webkit-animation: progress-bar-stripes 2s linear infinite;\n       -o-animation: progress-bar-stripes 2s linear infinite;\n          animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n  background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n  background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n  background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n  background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n}\n.media {\n  margin-top: 15px;\n}\n.media:first-child {\n  margin-top: 0;\n}\n.media,\n.media-body {\n  overflow: hidden;\n  zoom: 1;\n}\n.media-body {\n  width: 10000px;\n}\n.media-object {\n  display: block;\n}\n.media-object.img-thumbnail {\n  max-width: none;\n}\n.media-right,\n.media > .pull-right {\n  padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n  padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n  display: table-cell;\n  vertical-align: top;\n}\n.media-middle {\n  vertical-align: middle;\n}\n.media-bottom {\n  vertical-align: bottom;\n}\n.media-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n.list-group {\n  padding-left: 0;\n  margin-bottom: 20px;\n}\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n  margin-bottom: -1px;\n  background-color: #fff;\n  border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n  border-top-left-radius: 4px;\n  border-top-right-radius: 4px;\n}\n.list-group-item:last-child {\n  margin-bottom: 0;\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\na.list-group-item,\nbutton.list-group-item {\n  color: #555;\n}\na.list-group-item .list-group-item-heading,\nbutton.list-group-item .list-group-item-heading {\n  color: #333;\n}\na.list-group-item:hover,\nbutton.list-group-item:hover,\na.list-group-item:focus,\nbutton.list-group-item:focus {\n  color: #555;\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\nbutton.list-group-item {\n  width: 100%;\n  text-align: left;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n  color: #777;\n  cursor: not-allowed;\n  background-color: #eee;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n  color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n  color: #777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  z-index: 2;\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n  color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n  color: #c7ddef;\n}\n.list-group-item-success {\n  color: #3c763d;\n  background-color: #dff0d8;\n}\na.list-group-item-success,\nbutton.list-group-item-success {\n  color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading,\nbutton.list-group-item-success .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-success:hover,\nbutton.list-group-item-success:hover,\na.list-group-item-success:focus,\nbutton.list-group-item-success:focus {\n  color: #3c763d;\n  background-color: #d0e9c6;\n}\na.list-group-item-success.active,\nbutton.list-group-item-success.active,\na.list-group-item-success.active:hover,\nbutton.list-group-item-success.active:hover,\na.list-group-item-success.active:focus,\nbutton.list-group-item-success.active:focus {\n  color: #fff;\n  background-color: #3c763d;\n  border-color: #3c763d;\n}\n.list-group-item-info {\n  color: #31708f;\n  background-color: #d9edf7;\n}\na.list-group-item-info,\nbutton.list-group-item-info {\n  color: #31708f;\n}\na.list-group-item-info .list-group-item-heading,\nbutton.list-group-item-info .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-info:hover,\nbutton.list-group-item-info:hover,\na.list-group-item-info:focus,\nbutton.list-group-item-info:focus {\n  color: #31708f;\n  background-color: #c4e3f3;\n}\na.list-group-item-info.active,\nbutton.list-group-item-info.active,\na.list-group-item-info.active:hover,\nbutton.list-group-item-info.active:hover,\na.list-group-item-info.active:focus,\nbutton.list-group-item-info.active:focus {\n  color: #fff;\n  background-color: #31708f;\n  border-color: #31708f;\n}\n.list-group-item-warning {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n}\na.list-group-item-warning,\nbutton.list-group-item-warning {\n  color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading,\nbutton.list-group-item-warning .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-warning:hover,\nbutton.list-group-item-warning:hover,\na.list-group-item-warning:focus,\nbutton.list-group-item-warning:focus {\n  color: #8a6d3b;\n  background-color: #faf2cc;\n}\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\nbutton.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus,\nbutton.list-group-item-warning.active:focus {\n  color: #fff;\n  background-color: #8a6d3b;\n  border-color: #8a6d3b;\n}\n.list-group-item-danger {\n  color: #a94442;\n  background-color: #f2dede;\n}\na.list-group-item-danger,\nbutton.list-group-item-danger {\n  color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading,\nbutton.list-group-item-danger .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-danger:hover,\nbutton.list-group-item-danger:hover,\na.list-group-item-danger:focus,\nbutton.list-group-item-danger:focus {\n  color: #a94442;\n  background-color: #ebcccc;\n}\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\nbutton.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus,\nbutton.list-group-item-danger.active:focus {\n  color: #fff;\n  background-color: #a94442;\n  border-color: #a94442;\n}\n.list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3;\n}\n.panel {\n  margin-bottom: 20px;\n  background-color: #fff;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05);\n          box-shadow: 0 1px 1px rgba(0, 0, 0, .05);\n}\n.panel-body {\n  padding: 15px;\n}\n.panel-heading {\n  padding: 10px 15px;\n  border-bottom: 1px solid transparent;\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n  color: inherit;\n}\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: 16px;\n  color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n  color: inherit;\n}\n.panel-footer {\n  padding: 10px 15px;\n  background-color: #f5f5f5;\n  border-top: 1px solid #ddd;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n  margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n  border-width: 1px 0;\n  border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n  border-top: 0;\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n  border-bottom: 0;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n  border-top-width: 0;\n}\n.list-group + .panel-footer {\n  border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n  margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n  padding-right: 15px;\n  padding-left: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n  border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n  border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n  border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n  border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n  border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n  border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n  border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n  border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n  border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n  border-bottom: 0;\n}\n.panel > .table-responsive {\n  margin-bottom: 0;\n  border: 0;\n}\n.panel-group {\n  margin-bottom: 20px;\n}\n.panel-group .panel {\n  margin-bottom: 0;\n  border-radius: 4px;\n}\n.panel-group .panel + .panel {\n  margin-top: 5px;\n}\n.panel-group .panel-heading {\n  border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n  border-top: 1px solid #ddd;\n}\n.panel-group .panel-footer {\n  border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n  border-bottom: 1px solid #ddd;\n}\n.panel-default {\n  border-color: #ddd;\n}\n.panel-default > .panel-heading {\n  color: #333;\n  background-color: #f5f5f5;\n  border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n  color: #f5f5f5;\n  background-color: #333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #ddd;\n}\n.panel-primary {\n  border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n  color: #337ab7;\n  background-color: #fff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #337ab7;\n}\n.panel-success {\n  border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n  color: #dff0d8;\n  background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #d6e9c6;\n}\n.panel-info {\n  border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n  color: #31708f;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n  color: #d9edf7;\n  background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #bce8f1;\n}\n.panel-warning {\n  border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n  color: #fcf8e3;\n  background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #faebcc;\n}\n.panel-danger {\n  border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n  color: #f2dede;\n  background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n  position: relative;\n  display: block;\n  height: 0;\n  padding: 0;\n  overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  border: 0;\n}\n.embed-responsive-16by9 {\n  padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n  padding-bottom: 75%;\n}\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border: 1px solid #e3e3e3;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);\n}\n.well blockquote {\n  border-color: #ddd;\n  border-color: rgba(0, 0, 0, .15);\n}\n.well-lg {\n  padding: 24px;\n  border-radius: 6px;\n}\n.well-sm {\n  padding: 9px;\n  border-radius: 3px;\n}\n.close {\n  float: right;\n  font-size: 21px;\n  font-weight: bold;\n  line-height: 1;\n  color: #000;\n  text-shadow: 0 1px 0 #fff;\n  filter: alpha(opacity=20);\n  opacity: .2;\n}\n.close:hover,\n.close:focus {\n  color: #000;\n  text-decoration: none;\n  cursor: pointer;\n  filter: alpha(opacity=50);\n  opacity: .5;\n}\nbutton.close {\n  -webkit-appearance: none;\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n}\n.modal-open {\n  overflow: hidden;\n}\n.modal {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1050;\n  display: none;\n  overflow: hidden;\n  -webkit-overflow-scrolling: touch;\n  outline: 0;\n}\n.modal.fade .modal-dialog {\n  -webkit-transition: -webkit-transform .3s ease-out;\n       -o-transition:      -o-transform .3s ease-out;\n          transition:         transform .3s ease-out;\n  -webkit-transform: translate(0, -25%);\n      -ms-transform: translate(0, -25%);\n       -o-transform: translate(0, -25%);\n          transform: translate(0, -25%);\n}\n.modal.in .modal-dialog {\n  -webkit-transform: translate(0, 0);\n      -ms-transform: translate(0, 0);\n       -o-transform: translate(0, 0);\n          transform: translate(0, 0);\n}\n.modal-open .modal {\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: 10px;\n}\n.modal-content {\n  position: relative;\n  background-color: #fff;\n  -webkit-background-clip: padding-box;\n          background-clip: padding-box;\n  border: 1px solid #999;\n  border: 1px solid rgba(0, 0, 0, .2);\n  border-radius: 6px;\n  outline: 0;\n  -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5);\n          box-shadow: 0 3px 9px rgba(0, 0, 0, .5);\n}\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  background-color: #000;\n}\n.modal-backdrop.fade {\n  filter: alpha(opacity=0);\n  opacity: 0;\n}\n.modal-backdrop.in {\n  filter: alpha(opacity=50);\n  opacity: .5;\n}\n.modal-header {\n  padding: 15px;\n  border-bottom: 1px solid #e5e5e5;\n}\n.modal-header .close {\n  margin-top: -2px;\n}\n.modal-title {\n  margin: 0;\n  line-height: 1.42857143;\n}\n.modal-body {\n  position: relative;\n  padding: 15px;\n}\n.modal-footer {\n  padding: 15px;\n  text-align: right;\n  border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n  margin-bottom: 0;\n  margin-left: 5px;\n}\n.modal-footer .btn-group .btn + .btn {\n  margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n  margin-left: 0;\n}\n.modal-scrollbar-measure {\n  position: absolute;\n  top: -9999px;\n  width: 50px;\n  height: 50px;\n  overflow: scroll;\n}\n@media (min-width: 768px) {\n  .modal-dialog {\n    width: 600px;\n    margin: 30px auto;\n  }\n  .modal-content {\n    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5);\n            box-shadow: 0 5px 15px rgba(0, 0, 0, .5);\n  }\n  .modal-sm {\n    width: 300px;\n  }\n}\n@media (min-width: 992px) {\n  .modal-lg {\n    width: 900px;\n  }\n}\n.tooltip {\n  position: absolute;\n  z-index: 1070;\n  display: block;\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 12px;\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1.42857143;\n  text-align: left;\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  letter-spacing: normal;\n  word-break: normal;\n  word-spacing: normal;\n  word-wrap: normal;\n  white-space: normal;\n  filter: alpha(opacity=0);\n  opacity: 0;\n\n  line-break: auto;\n}\n.tooltip.in {\n  filter: alpha(opacity=90);\n  opacity: .9;\n}\n.tooltip.top {\n  padding: 5px 0;\n  margin-top: -3px;\n}\n.tooltip.right {\n  padding: 0 5px;\n  margin-left: 3px;\n}\n.tooltip.bottom {\n  padding: 5px 0;\n  margin-top: 3px;\n}\n.tooltip.left {\n  padding: 0 5px;\n  margin-left: -3px;\n}\n.tooltip-inner {\n  max-width: 200px;\n  padding: 3px 8px;\n  color: #fff;\n  text-align: center;\n  background-color: #000;\n  border-radius: 4px;\n}\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n  bottom: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n  right: 5px;\n  bottom: 0;\n  margin-bottom: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n  bottom: 0;\n  left: 5px;\n  margin-bottom: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.right .tooltip-arrow {\n  top: 50%;\n  left: 0;\n  margin-top: -5px;\n  border-width: 5px 5px 5px 0;\n  border-right-color: #000;\n}\n.tooltip.left .tooltip-arrow {\n  top: 50%;\n  right: 0;\n  margin-top: -5px;\n  border-width: 5px 0 5px 5px;\n  border-left-color: #000;\n}\n.tooltip.bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n  top: 0;\n  right: 5px;\n  margin-top: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n  top: 0;\n  left: 5px;\n  margin-top: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1060;\n  display: none;\n  max-width: 276px;\n  padding: 1px;\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1.42857143;\n  text-align: left;\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  letter-spacing: normal;\n  word-break: normal;\n  word-spacing: normal;\n  word-wrap: normal;\n  white-space: normal;\n  background-color: #fff;\n  -webkit-background-clip: padding-box;\n          background-clip: padding-box;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, .2);\n  border-radius: 6px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2);\n          box-shadow: 0 5px 10px rgba(0, 0, 0, .2);\n\n  line-break: auto;\n}\n.popover.top {\n  margin-top: -10px;\n}\n.popover.right {\n  margin-left: 10px;\n}\n.popover.bottom {\n  margin-top: 10px;\n}\n.popover.left {\n  margin-left: -10px;\n}\n.popover-title {\n  padding: 8px 14px;\n  margin: 0;\n  font-size: 14px;\n  background-color: #f7f7f7;\n  border-bottom: 1px solid #ebebeb;\n  border-radius: 5px 5px 0 0;\n}\n.popover-content {\n  padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n  position: absolute;\n  display: block;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.popover > .arrow {\n  border-width: 11px;\n}\n.popover > .arrow:after {\n  content: \"\";\n  border-width: 10px;\n}\n.popover.top > .arrow {\n  bottom: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-top-color: #999;\n  border-top-color: rgba(0, 0, 0, .25);\n  border-bottom-width: 0;\n}\n.popover.top > .arrow:after {\n  bottom: 1px;\n  margin-left: -10px;\n  content: \" \";\n  border-top-color: #fff;\n  border-bottom-width: 0;\n}\n.popover.right > .arrow {\n  top: 50%;\n  left: -11px;\n  margin-top: -11px;\n  border-right-color: #999;\n  border-right-color: rgba(0, 0, 0, .25);\n  border-left-width: 0;\n}\n.popover.right > .arrow:after {\n  bottom: -10px;\n  left: 1px;\n  content: \" \";\n  border-right-color: #fff;\n  border-left-width: 0;\n}\n.popover.bottom > .arrow {\n  top: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-top-width: 0;\n  border-bottom-color: #999;\n  border-bottom-color: rgba(0, 0, 0, .25);\n}\n.popover.bottom > .arrow:after {\n  top: 1px;\n  margin-left: -10px;\n  content: \" \";\n  border-top-width: 0;\n  border-bottom-color: #fff;\n}\n.popover.left > .arrow {\n  top: 50%;\n  right: -11px;\n  margin-top: -11px;\n  border-right-width: 0;\n  border-left-color: #999;\n  border-left-color: rgba(0, 0, 0, .25);\n}\n.popover.left > .arrow:after {\n  right: 1px;\n  bottom: -10px;\n  content: \" \";\n  border-right-width: 0;\n  border-left-color: #fff;\n}\n.carousel {\n  position: relative;\n}\n.carousel-inner {\n  position: relative;\n  width: 100%;\n  overflow: hidden;\n}\n.carousel-inner > .item {\n  position: relative;\n  display: none;\n  -webkit-transition: .6s ease-in-out left;\n       -o-transition: .6s ease-in-out left;\n          transition: .6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n  .carousel-inner > .item {\n    -webkit-transition: -webkit-transform .6s ease-in-out;\n         -o-transition:      -o-transform .6s ease-in-out;\n            transition:         transform .6s ease-in-out;\n\n    -webkit-backface-visibility: hidden;\n            backface-visibility: hidden;\n    -webkit-perspective: 1000px;\n            perspective: 1000px;\n  }\n  .carousel-inner > .item.next,\n  .carousel-inner > .item.active.right {\n    left: 0;\n    -webkit-transform: translate3d(100%, 0, 0);\n            transform: translate3d(100%, 0, 0);\n  }\n  .carousel-inner > .item.prev,\n  .carousel-inner > .item.active.left {\n    left: 0;\n    -webkit-transform: translate3d(-100%, 0, 0);\n            transform: translate3d(-100%, 0, 0);\n  }\n  .carousel-inner > .item.next.left,\n  .carousel-inner > .item.prev.right,\n  .carousel-inner > .item.active {\n    left: 0;\n    -webkit-transform: translate3d(0, 0, 0);\n            transform: translate3d(0, 0, 0);\n  }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  display: block;\n}\n.carousel-inner > .active {\n  left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n.carousel-inner > .next {\n  left: 100%;\n}\n.carousel-inner > .prev {\n  left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n  left: 0;\n}\n.carousel-inner > .active.left {\n  left: -100%;\n}\n.carousel-inner > .active.right {\n  left: 100%;\n}\n.carousel-control {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  width: 15%;\n  font-size: 20px;\n  color: #fff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, .6);\n  background-color: rgba(0, 0, 0, 0);\n  filter: alpha(opacity=50);\n  opacity: .5;\n}\n.carousel-control.left {\n  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);\n  background-image:      -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);\n  background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001)));\n  background-image:         linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n  background-repeat: repeat-x;\n}\n.carousel-control.right {\n  right: 0;\n  left: auto;\n  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);\n  background-image:      -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);\n  background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5)));\n  background-image:         linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n  background-repeat: repeat-x;\n}\n.carousel-control:hover,\n.carousel-control:focus {\n  color: #fff;\n  text-decoration: none;\n  filter: alpha(opacity=90);\n  outline: 0;\n  opacity: .9;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n  position: absolute;\n  top: 50%;\n  z-index: 5;\n  display: inline-block;\n  margin-top: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n  left: 50%;\n  margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n  right: 50%;\n  margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n  width: 20px;\n  height: 20px;\n  font-family: serif;\n  line-height: 1;\n}\n.carousel-control .icon-prev:before {\n  content: '\\2039';\n}\n.carousel-control .icon-next:before {\n  content: '\\203a';\n}\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  padding-left: 0;\n  margin-left: -30%;\n  text-align: center;\n  list-style: none;\n}\n.carousel-indicators li {\n  display: inline-block;\n  width: 10px;\n  height: 10px;\n  margin: 1px;\n  text-indent: -999px;\n  cursor: pointer;\n  background-color: #000 \\9;\n  background-color: rgba(0, 0, 0, 0);\n  border: 1px solid #fff;\n  border-radius: 10px;\n}\n.carousel-indicators .active {\n  width: 12px;\n  height: 12px;\n  margin: 0;\n  background-color: #fff;\n}\n.carousel-caption {\n  position: absolute;\n  right: 15%;\n  bottom: 20px;\n  left: 15%;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: #fff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, .6);\n}\n.carousel-caption .btn {\n  text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-prev,\n  .carousel-control .icon-next {\n    width: 30px;\n    height: 30px;\n    margin-top: -10px;\n    font-size: 30px;\n  }\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .icon-prev {\n    margin-left: -10px;\n  }\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-next {\n    margin-right: -10px;\n  }\n  .carousel-caption {\n    right: 20%;\n    left: 20%;\n    padding-bottom: 30px;\n  }\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-header:before,\n.modal-header:after,\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \" \";\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-header:after,\n.modal-footer:after {\n  clear: both;\n}\n.center-block {\n  display: block;\n  margin-right: auto;\n  margin-left: auto;\n}\n.pull-right {\n  float: right !important;\n}\n.pull-left {\n  float: left !important;\n}\n.hide {\n  display: none !important;\n}\n.show {\n  display: block !important;\n}\n.invisible {\n  visibility: hidden;\n}\n.text-hide {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n.hidden {\n  display: none !important;\n}\n.affix {\n  position: fixed;\n}\n@-ms-viewport {\n  width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n  display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n  display: none !important;\n}\n@media (max-width: 767px) {\n  .visible-xs {\n    display: block !important;\n  }\n  table.visible-xs {\n    display: table !important;\n  }\n  tr.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-xs,\n  td.visible-xs {\n    display: table-cell !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-block {\n    display: block !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-inline {\n    display: inline !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm {\n    display: block !important;\n  }\n  table.visible-sm {\n    display: table !important;\n  }\n  tr.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-sm,\n  td.visible-sm {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-block {\n    display: block !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md {\n    display: block !important;\n  }\n  table.visible-md {\n    display: table !important;\n  }\n  tr.visible-md {\n    display: table-row !important;\n  }\n  th.visible-md,\n  td.visible-md {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-block {\n    display: block !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg {\n    display: block !important;\n  }\n  table.visible-lg {\n    display: table !important;\n  }\n  tr.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-lg,\n  td.visible-lg {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-block {\n    display: block !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (max-width: 767px) {\n  .hidden-xs {\n    display: none !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-sm {\n    display: none !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-md {\n    display: none !important;\n  }\n}\n@media (min-width: 1200px) {\n  .hidden-lg {\n    display: none !important;\n  }\n}\n.visible-print {\n  display: none !important;\n}\n@media print {\n  .visible-print {\n    display: block !important;\n  }\n  table.visible-print {\n    display: table !important;\n  }\n  tr.visible-print {\n    display: table-row !important;\n  }\n  th.visible-print,\n  td.visible-print {\n    display: table-cell !important;\n  }\n}\n.visible-print-block {\n  display: none !important;\n}\n@media print {\n  .visible-print-block {\n    display: block !important;\n  }\n}\n.visible-print-inline {\n  display: none !important;\n}\n@media print {\n  .visible-print-inline {\n    display: inline !important;\n  }\n}\n.visible-print-inline-block {\n  display: none !important;\n}\n@media print {\n  .visible-print-inline-block {\n    display: inline-block !important;\n  }\n}\n@media print {\n  .hidden-print {\n    display: none !important;\n  }\n}\n/*# sourceMappingURL=bootstrap.css.map */\n"
  },
  {
    "path": "spring-boot-jpa-thymeleaf-curd/src/main/resources/templates/hello.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"UTF-8\"/>\n    <title>Hello Thymeleaf!</title>\n</head>\n<body>\n    <p th:text=\"'Hello, ' + ${name} + '!'\" />\n</body>\n</html>"
  },
  {
    "path": "spring-boot-jpa-thymeleaf-curd/src/main/resources/templates/user/list.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"UTF-8\"/>\n    <title>userList</title>\n    <link rel=\"stylesheet\" th:href=\"@{/css/bootstrap.css}\"></link>\n</head>\n<body class=\"container\">\n<br/>\n<h1>用户列表</h1>\n<br/><br/>\n<div class=\"with:80%\">\n    <table class=\"table table-hover\">\n        <thead>\n        <tr>\n            <th>#</th>\n            <th>User Name</th>\n            <th>Password</th>\n            <th>Age</th>\n            <th>Edit</th>\n            <th>Delete</th>\n        </tr>\n        </thead>\n        <tbody>\n        <tr  th:each=\"user : ${users}\">\n            <th scope=\"row\" th:text=\"${user.id}\">1</th>\n            <td th:text=\"${user.userName}\">neo</td>\n            <td th:text=\"${user.password}\">Otto</td>\n            <td th:text=\"${user.age}\">6</td>\n            <td><a th:href=\"@{/toEdit(id=${user.id})}\">edit</a></td>\n            <td><a th:href=\"@{/delete(id=${user.id})}\">delete</a></td>\n        </tr>\n        </tbody>\n    </table>\n</div>\n<div class=\"form-group\">\n    <div class=\"col-sm-2 control-label\">\n        <a href=\"/toAdd\" th:href=\"@{/toAdd}\" class=\"btn btn-info\">add</a>\n    </div>\n</div>\n\n</body>\n</html>"
  },
  {
    "path": "spring-boot-jpa-thymeleaf-curd/src/main/resources/templates/user/userAdd.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"UTF-8\"/>\n    <title>user</title>\n    <link rel=\"stylesheet\" th:href=\"@{/css/bootstrap.css}\"></link>\n</head>\n<body class=\"container\">\n<br/>\n<h1>添加用户</h1>\n<br/><br/>\n<div class=\"with:80%\">\n    <form class=\"form-horizontal\"   th:action=\"@{/add}\"  method=\"post\">\n        <div class=\"form-group\">\n            <label for=\"userName\" class=\"col-sm-2 control-label\">userName</label>\n            <div class=\"col-sm-10\">\n                <input type=\"text\" class=\"form-control\" name=\"userName\"  id=\"userName\" placeholder=\"userName\"/>\n            </div>\n        </div>\n        <div class=\"form-group\">\n            <label for=\"password\" class=\"col-sm-2 control-label\" >Password</label>\n            <div class=\"col-sm-10\">\n                <input type=\"password\" class=\"form-control\" name=\"password\" id=\"password\" placeholder=\"Password\"/>\n            </div>\n        </div>\n        <div class=\"form-group\">\n            <label for=\"age\" class=\"col-sm-2 control-label\">age</label>\n            <div class=\"col-sm-10\">\n                <input type=\"text\" class=\"form-control\" name=\"age\"  id=\"age\" placeholder=\"age\"/>\n            </div>\n        </div>\n        <div class=\"form-group\">\n            <div class=\"col-sm-offset-2 col-sm-10\">\n                <input type=\"submit\" value=\"Submit\" class=\"btn btn-info\" />\n                &nbsp; &nbsp; &nbsp;\n                <input type=\"reset\" value=\"Reset\" class=\"btn btn-info\" />\n            </div>\n\n        </div>\n    </form>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "spring-boot-jpa-thymeleaf-curd/src/main/resources/templates/user/userEdit.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"UTF-8\"/>\n    <title>user</title>\n    <link rel=\"stylesheet\" th:href=\"@{/css/bootstrap.css}\"></link>\n</head>\n<body class=\"container\">\n<br/>\n<h1>修改用户</h1>\n<br/><br/>\n<div class=\"with:80%\">\n    <form class=\"form-horizontal\"   th:action=\"@{/edit}\" th:object=\"${user}\"  method=\"post\">\n        <input type=\"hidden\" name=\"id\" th:value=\"*{id}\" />\n        <div class=\"form-group\">\n            <label for=\"userName\" class=\"col-sm-2 control-label\">userName</label>\n            <div class=\"col-sm-10\">\n                <input type=\"text\" class=\"form-control\" name=\"userName\"  id=\"userName\" th:value=\"*{userName}\" placeholder=\"userName\"/>\n            </div>\n        </div>\n        <div class=\"form-group\">\n            <label for=\"password\" class=\"col-sm-2 control-label\" >Password</label>\n            <div class=\"col-sm-10\">\n                <input type=\"password\" class=\"form-control\" name=\"password\" id=\"password\"  th:value=\"*{password}\" placeholder=\"Password\"/>\n            </div>\n        </div>\n        <div class=\"form-group\">\n            <label for=\"age\" class=\"col-sm-2 control-label\">age</label>\n            <div class=\"col-sm-10\">\n                <input type=\"text\" class=\"form-control\" name=\"age\"  id=\"age\" th:value=\"*{age}\" placeholder=\"age\"/>\n            </div>\n        </div>\n        <div class=\"form-group\">\n            <div class=\"col-sm-offset-2 col-sm-10\">\n                <input type=\"submit\" value=\"Submit\" class=\"btn btn-info\" />\n                &nbsp; &nbsp; &nbsp;\n                <a href=\"/toAdd\" th:href=\"@{/list}\" class=\"btn btn-info\">Back</a>\n            </div>\n\n        </div>\n    </form>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "spring-boot-mail/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-mail</artifactId>\n\t<version>1.0.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-mail</name>\n\t<description>Demo project for Spring Boot and mail</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>3.0.0</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>17</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-mail</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-context-support</artifactId>\n\t\t\t<version>RELEASE</version>\n\t\t</dependency>\n        <dependency>\n            <groupId>com.sun.mail</groupId>\n            <artifactId>javax.mail</artifactId>\n            <version>RELEASE</version>\n        </dependency>\n\t\t<!-- 模板引擎 -->\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-thymeleaf</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.junit.vintage</groupId>\n\t\t\t<artifactId>junit-vintage-engine</artifactId>\n\t\t\t<exclusions>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<groupId>org.hamcrest</groupId>\n\t\t\t\t\t<artifactId>hamcrest-core</artifactId>\n\t\t\t\t</exclusion>\n\t\t\t</exclusions>\n\t\t</dependency>\n    </dependencies>\n\t\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t\t<configuration>\n\t                <fork>true</fork>\n\t            </configuration>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\t\n\n</project>\n"
  },
  {
    "path": "spring-boot-mail/src/main/java/com/neo/MailApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class MailApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(MailApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "spring-boot-mail/src/main/java/com/neo/service/MailService.java",
    "content": "package com.neo.service;\n\n/**\n * Created by summer on 2017/5/4.\n */\npublic interface MailService {\n\n    void sendSimpleMail(String to, String subject, String content);\n\n    void sendHtmlMail(String to, String subject, String content);\n\n    void sendAttachmentsMail(String to, String subject, String content, String filePath);\n\n    void sendInlineResourceMail(String to, String subject, String content, String rscPath, String rscId);\n\n}\n"
  },
  {
    "path": "spring-boot-mail/src/main/java/com/neo/service/impl/MailServiceImpl.java",
    "content": "package com.neo.service.impl;\n\nimport com.neo.service.MailService;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.core.io.FileSystemResource;\nimport org.springframework.mail.SimpleMailMessage;\nimport org.springframework.mail.javamail.JavaMailSender;\nimport org.springframework.mail.javamail.MimeMessageHelper;\nimport org.springframework.stereotype.Component;\n\nimport jakarta.mail.MessagingException;\nimport jakarta.mail.internet.MimeMessage;\nimport java.io.File;\n\n/**\n * Created by summer on 2017/5/4.\n */\n@Component\npublic class MailServiceImpl implements MailService{\n\n    private final Logger logger = LoggerFactory.getLogger(this.getClass());\n\n    @Autowired\n    private JavaMailSender mailSender;\n\n    @Value(\"${mail.fromMail.addr}\")\n    private String from;\n\n    /**\n     * 发送文本邮件\n     * @param to\n     * @param subject\n     * @param content\n     */\n    @Override\n    public void sendSimpleMail(String to, String subject, String content) {\n        SimpleMailMessage message = new SimpleMailMessage();\n        message.setFrom(from);\n        message.setTo(to);\n        message.setSubject(subject);\n        message.setText(content);\n\n        try {\n            mailSender.send(message);\n            logger.info(\"简单邮件已经发送。\");\n        } catch (Exception e) {\n            logger.error(\"发送简单邮件时发生异常！\", e);\n        }\n\n    }\n\n    /**\n     * 发送html邮件\n     * @param to\n     * @param subject\n     * @param content\n     */\n    @Override\n    public void sendHtmlMail(String to, String subject, String content) {\n        MimeMessage message = mailSender.createMimeMessage();\n\n        try {\n            //true表示需要创建一个multipart message\n            MimeMessageHelper helper = new MimeMessageHelper(message, true);\n            helper.setFrom(from);\n            helper.setTo(to);\n            helper.setSubject(subject);\n            helper.setText(content, true);\n\n            mailSender.send(message);\n            logger.info(\"html邮件发送成功\");\n        } catch (MessagingException e) {\n            logger.error(\"发送html邮件时发生异常！\", e);\n        }\n    }\n\n\n    /**\n     * 发送带附件的邮件\n     * @param to\n     * @param subject\n     * @param content\n     * @param filePath\n     */\n    @Override\n    public void sendAttachmentsMail(String to, String subject, String content, String filePath){\n        MimeMessage message = mailSender.createMimeMessage();\n\n        try {\n            MimeMessageHelper helper = new MimeMessageHelper(message, true);\n            helper.setFrom(from);\n            helper.setTo(to);\n            helper.setSubject(subject);\n            helper.setText(content, true);\n\n            FileSystemResource file = new FileSystemResource(new File(filePath));\n            String fileName = filePath.substring(filePath.lastIndexOf(File.separator));\n            helper.addAttachment(fileName, file);\n            //helper.addAttachment(\"test\"+fileName, file);\n\n            mailSender.send(message);\n            logger.info(\"带附件的邮件已经发送。\");\n        } catch (MessagingException e) {\n            logger.error(\"发送带附件的邮件时发生异常！\", e);\n        }\n    }\n\n\n    /**\n     * 发送正文中有静态资源（图片）的邮件\n     * @param to\n     * @param subject\n     * @param content\n     * @param rscPath\n     * @param rscId\n     */\n    @Override\n    public void sendInlineResourceMail(String to, String subject, String content, String rscPath, String rscId){\n        MimeMessage message = mailSender.createMimeMessage();\n\n        try {\n            MimeMessageHelper helper = new MimeMessageHelper(message, true);\n            helper.setFrom(from);\n            helper.setTo(to);\n            helper.setSubject(subject);\n            helper.setText(content, true);\n\n            FileSystemResource res = new FileSystemResource(new File(rscPath));\n            helper.addInline(rscId, res);\n\n            mailSender.send(message);\n            logger.info(\"嵌入静态资源的邮件已经发送。\");\n        } catch (MessagingException e) {\n            logger.error(\"发送嵌入静态资源的邮件时发生异常！\", e);\n        }\n    }\n}\n"
  },
  {
    "path": "spring-boot-mail/src/main/resources/application.properties",
    "content": "spring.application.name=spirng-boot-mail\n\nspring.mail.host=smtp.126.com\nspring.mail.username=xxxx@126.com\nspring.mail.password=Zxxxxxxx\n\nspring.mail.default-encoding=UTF-8\n\nmail.fromMail.addr=ixxxxw@126.com\n\n"
  },
  {
    "path": "spring-boot-mail/src/main/resources/templates/emailTemplate.html",
    "content": "<!DOCTYPE html>\n<html lang=\"zh\" xmlns:th=\"http://www.thymeleaf.org\">\n    <head>\n        <meta charset=\"UTF-8\"/>\n        <title>Title</title>\n    </head>\n    <body>\n        您好,这是验证邮件,请点击下面的链接完成验证,<br/>\n        <a href=\"#\" th:href=\"@{ http://www.ityouknow.com/neo/{id}(id=${id}) }\">激活账号</a>\n    </body>\n</html>"
  },
  {
    "path": "spring-boot-mail/src/test/java/com/neo/MailApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class MailApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t\tSystem.out.println(\"hello world\");\n\t}\n\n}\n"
  },
  {
    "path": "spring-boot-mail/src/test/java/com/neo/service/MailServiceTest.java",
    "content": "package com.neo.service;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\nimport org.thymeleaf.TemplateEngine;\nimport org.thymeleaf.context.Context;\n\n/**\n * Created by summer on 2017/5/4.\n */\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class MailServiceTest {\n\n    @Autowired\n    private MailService mailService;\n\n    @Autowired\n    private TemplateEngine templateEngine;\n\n    @Test\n    public void testSimpleMail() throws Exception {\n        mailService.sendSimpleMail(\"ityouknow@126.com\",\"test simple mail\",\" hello this is simple mail\");\n    }\n\n    @Test\n    public void testHtmlMail() throws Exception {\n        String content=\"<html>\\n\" +\n                \"<body>\\n\" +\n                \"    <h3>hello world ! 这是一封html邮件!</h3>\\n\" +\n                \"</body>\\n\" +\n                \"</html>\";\n        mailService.sendHtmlMail(\"ityouknow@126.com\",\"test simple mail\",content);\n    }\n\n    @Test\n    public void sendAttachmentsMail() {\n        String filePath=\"D:\\\\Log\\\\TaxCard.log\";\n        mailService.sendAttachmentsMail(\"ityouknow@126.com\", \"主题：带附件的邮件\", \"有附件，请查收！\", filePath);\n    }\n\n\n    @Test\n    public void sendInlineResourceMail() {\n        String rscId = \"neo006\";\n        String content=\"<html><body>这是有图片的邮件：<img src=\\'cid:\" + rscId + \"\\' ></body></html>\";\n        String imgPath = \"C:\\\\Users\\\\ityou\\\\Pictures\\\\logo\\\\smilef.png\";\n\n        mailService.sendInlineResourceMail(\"ityouknow@126.com\", \"主题：这是有图片的邮件\", content, imgPath, rscId);\n    }\n\n\n    @Test\n    public void sendTemplateMail() {\n        //创建邮件正文\n        Context context = new Context();\n        context.setVariable(\"id\", \"006\");\n        String emailContent = templateEngine.process(\"emailTemplate\", context);\n\n        mailService.sendHtmlMail(\"ityouknow@126.com\",\"主题：这是模板邮件\",emailContent);\n    }\n}\n"
  },
  {
    "path": "spring-boot-memcache-spymemcached/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-memcache-spymemcached</artifactId>\n\t<version>1.0.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-memcache-spymemcached</name>\n\t<description>Demo project for Spring Boot</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>3.0.0</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>17</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>net.spy</groupId>\n\t\t\t<artifactId>spymemcached</artifactId>\n\t\t\t<version>2.12.2</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.junit.vintage</groupId>\n\t\t\t<artifactId>junit-vintage-engine</artifactId>\n\t\t\t<scope>test</scope>\n\t\t\t<exclusions>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<groupId>org.hamcrest</groupId>\n\t\t\t\t\t<artifactId>hamcrest-core</artifactId>\n\t\t\t\t</exclusion>\n\t\t\t</exclusions>\n\t\t</dependency>\n\t</dependencies>\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\n\n</project>\n"
  },
  {
    "path": "spring-boot-memcache-spymemcached/src/main/java/com/neo/MemcacheApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class MemcacheApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(MemcacheApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "spring-boot-memcache-spymemcached/src/main/java/com/neo/config/MemcacheSource.java",
    "content": "package com.neo.config;\n\nimport org.springframework.boot.context.properties.ConfigurationProperties;\nimport org.springframework.stereotype.Component;\n\n@Component\n@ConfigurationProperties(prefix = \"memcache\")\npublic class MemcacheSource {\n\n    private String ip;\n\n    private int port;\n\n    public String getIp() {\n        return ip;\n    }\n\n    public void setIp(String ip) {\n        this.ip = ip;\n    }\n\n    public int getPort() {\n        return port;\n    }\n\n    public void setPort(int port) {\n        this.port = port;\n    }\n}\n"
  },
  {
    "path": "spring-boot-memcache-spymemcached/src/main/java/com/neo/config/MemcachedRunner.java",
    "content": "package com.neo.config;\n\nimport net.spy.memcached.MemcachedClient;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.boot.CommandLineRunner;\nimport org.springframework.stereotype.Component;\n\nimport jakarta.annotation.Resource;\nimport java.io.IOException;\nimport java.net.InetSocketAddress;\n\n@Component\npublic class MemcachedRunner implements CommandLineRunner {\n    protected Logger logger =  LoggerFactory.getLogger(this.getClass());\n\n    @Resource\n    private  MemcacheSource memcacheSource;\n\n    private MemcachedClient client = null;\n\n    @Override\n    public void run(String... args) throws Exception {\n        try {\n            client = new MemcachedClient(new InetSocketAddress(memcacheSource.getIp(),memcacheSource.getPort()));\n        } catch (IOException e) {\n            logger.error(\"inint MemcachedClient failed \",e);\n        }\n    }\n\n    public MemcachedClient getClient() {\n        return client;\n    }\n\n}"
  },
  {
    "path": "spring-boot-memcache-spymemcached/src/main/resources/application.properties",
    "content": "memcache.ip=localhost\nmemcache.port=11211"
  },
  {
    "path": "spring-boot-memcache-spymemcached/src/test/java/com/neo/MemcacheApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class MemcacheApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t}\n\n}\n"
  },
  {
    "path": "spring-boot-memcache-spymemcached/src/test/java/com/neo/RepositoryTests.java",
    "content": "package com.neo;\n\nimport com.neo.config.MemcachedRunner;\nimport net.spy.memcached.MemcachedClient;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport jakarta.annotation.Resource;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class RepositoryTests {\n\n\t@Resource\n    private MemcachedRunner memcachedRunner;\n\n\t@Test\n\tpublic void testSetGet()  {\n\t\tMemcachedClient memcachedClient = memcachedRunner.getClient();\n\t\tmemcachedClient.set(\"testkey\",1000,\"666666\");\n\t\tSystem.out.println(\"***********  \"+memcachedClient.get(\"testkey\").toString());\n\t}\n\n}"
  },
  {
    "path": "spring-boot-mongodb/spring-boot-mongodb/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-mongodb</artifactId>\n\t<version>1.0.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-mongodb</name>\n\t<description>Demo project for Spring Boot and mongodb</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>3.0.0</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>17</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t   <groupId>org.springframework.boot</groupId>\n\t\t   <artifactId>spring-boot-starter-data-mongodb</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.junit.vintage</groupId>\n\t\t\t<artifactId>junit-vintage-engine</artifactId>\n\t\t\t<scope>test</scope>\n\t\t\t<exclusions>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<groupId>org.hamcrest</groupId>\n\t\t\t\t\t<artifactId>hamcrest-core</artifactId>\n\t\t\t\t</exclusion>\n\t\t\t</exclusions>\n\t\t</dependency>\n    </dependencies>\n\t\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\t\n\n</project>\n"
  },
  {
    "path": "spring-boot-mongodb/spring-boot-mongodb/src/main/java/com/neo/MongoDBApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class MongoDBApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(MongoDBApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "spring-boot-mongodb/spring-boot-mongodb/src/main/java/com/neo/model/User.java",
    "content": "package com.neo.model;\n\nimport java.io.Serializable;\n\n/**\n * Created by summer on 2017/5/5.\n */\npublic class User implements Serializable {\n        private static final long serialVersionUID = -3258839839160856613L;\n        private Long id;\n        private String userName;\n        private String passWord;\n\n        public Long getId() {\n                return id;\n        }\n\n        public void setId(Long id) {\n                this.id = id;\n        }\n\n        public String getUserName() {\n                return userName;\n        }\n\n        public void setUserName(String userName) {\n                this.userName = userName;\n        }\n\n        public String getPassWord() {\n                return passWord;\n        }\n\n        public void setPassWord(String passWord) {\n                this.passWord = passWord;\n        }\n\n        @Override\n        public String toString() {\n                return \"UserEntity{\" +\n                        \"id=\" + id +\n                        \", userName='\" + userName + '\\'' +\n                        \", passWord='\" + passWord + '\\'' +\n                        '}';\n        }\n}\n"
  },
  {
    "path": "spring-boot-mongodb/spring-boot-mongodb/src/main/java/com/neo/repository/UserRepository.java",
    "content": "package com.neo.repository;\n\nimport com.neo.model.User;\n\n/**\n * Created by summer on 2017/5/5.\n */\npublic interface UserRepository {\n\n    public void saveUser(User user);\n\n    public User findUserByUserName(String userName);\n\n    public long updateUser(User user);\n\n    public void deleteUserById(Long id);\n\n}\n"
  },
  {
    "path": "spring-boot-mongodb/spring-boot-mongodb/src/main/java/com/neo/repository/impl/UserRepositoryImpl.java",
    "content": "package com.neo.repository.impl;\n\nimport com.mongodb.client.result.UpdateResult;\nimport com.neo.repository.UserRepository;\nimport com.neo.model.User;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.data.mongodb.core.MongoTemplate;\nimport org.springframework.data.mongodb.core.query.Criteria;\nimport org.springframework.data.mongodb.core.query.Query;\nimport org.springframework.data.mongodb.core.query.Update;\nimport org.springframework.stereotype.Component;\n\n/**\n * Created by summer on 2017/5/5.\n */\n@Component\npublic class UserRepositoryImpl implements UserRepository {\n\n    @Autowired\n    private MongoTemplate mongoTemplate;\n\n    /**\n     * 创建对象\n     * @param user\n     */\n    @Override\n    public void saveUser(User user) {\n        mongoTemplate.save(user);\n    }\n\n    /**\n     * 根据用户名查询对象\n     * @param userName\n     * @return\n     */\n    @Override\n    public User findUserByUserName(String userName) {\n        Query query=new Query(Criteria.where(\"userName\").is(userName));\n        User user =  mongoTemplate.findOne(query , User.class);\n        return user;\n    }\n\n    /**\n     * 更新对象\n     * @param user\n     */\n    @Override\n    public long updateUser(User user) {\n        Query query=new Query(Criteria.where(\"id\").is(user.getId()));\n        Update update= new Update().set(\"userName\", user.getUserName()).set(\"passWord\", user.getPassWord());\n        //更新查询返回结果集的第一条\n        UpdateResult result =mongoTemplate.updateFirst(query,update,User.class);\n        //更新查询返回结果集的所有\n        // mongoTemplate.updateMulti(query,update,UserEntity.class);\n        if(result!=null)\n            return result.getMatchedCount();\n        else\n            return 0;\n    }\n\n    /**\n     * 删除对象\n     * @param id\n     */\n    @Override\n    public void deleteUserById(Long id) {\n        Query query=new Query(Criteria.where(\"id\").is(id));\n        mongoTemplate.remove(query,User.class);\n    }\n}\n"
  },
  {
    "path": "spring-boot-mongodb/spring-boot-mongodb/src/main/resources/application.properties",
    "content": "spring.application.name=spring-boot-mongodb\n\nspring.data.mongodb.uri=mongodb://119.0.0.6:27017/test\n\n\n"
  },
  {
    "path": "spring-boot-mongodb/spring-boot-mongodb/src/test/java/com/neo/MongoDBApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class MongoDBApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t\tSystem.out.println(\"hello world\");\n\t}\n\n}\n"
  },
  {
    "path": "spring-boot-mongodb/spring-boot-mongodb/src/test/java/com/neo/repository/UserRepositoryTest.java",
    "content": "package com.neo.repository;\n\nimport com.neo.model.User;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n/**\n * Created by summer on 2017/5/5.\n */\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class UserRepositoryTest {\n\n    @Autowired\n    private UserRepository userDao;\n\n    @Test\n    public void testSaveUser() throws Exception {\n        User user=new User();\n        user.setId(2l);\n        user.setUserName(\"小明\");\n        user.setPassWord(\"fffooo123\");\n        userDao.saveUser(user);\n    }\n\n    @Test\n    public void findUserByUserName(){\n       User user= userDao.findUserByUserName(\"小明\");\n       System.out.println(\"user is \"+user);\n    }\n\n    @Test\n    public void updateUser(){\n        User user=new User();\n        user.setId(2l);\n        user.setUserName(\"天空\");\n        user.setPassWord(\"fffxxxx\");\n        userDao.updateUser(user);\n    }\n\n    @Test\n    public void deleteUserById(){\n        userDao.deleteUserById(1l);\n    }\n\n}\n"
  },
  {
    "path": "spring-boot-mongodb/spring-boot-multi-mongodb/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-multi-mongodb</artifactId>\n\t<version>1.0.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-multi-mongodb</name>\n\t<description>Demo project for Spring Boot and multi mongodb</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>3.0.0</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>17</java.version>\n\t</properties>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-data-mongodb</artifactId>\n        </dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.junit.vintage</groupId>\n\t\t\t<artifactId>junit-vintage-engine</artifactId>\n\t\t\t<scope>test</scope>\n\t\t\t<exclusions>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<groupId>org.hamcrest</groupId>\n\t\t\t\t\t<artifactId>hamcrest-core</artifactId>\n\t\t\t\t</exclusion>\n\t\t\t</exclusions>\n\t\t</dependency>\n\t</dependencies>\n\t\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\t\n\n</project>\n"
  },
  {
    "path": "spring-boot-mongodb/spring-boot-multi-mongodb/src/main/java/com/neo/MultiMongodbApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class MultiMongodbApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(MultiMongodbApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "spring-boot-mongodb/spring-boot-multi-mongodb/src/main/java/com/neo/config/MultipleMongoConfig.java",
    "content": "package com.neo.config;\n\n\nimport com.mongodb.client.MongoClient;\nimport com.mongodb.client.MongoClients;\nimport com.neo.config.props.MultipleMongoProperties;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.boot.autoconfigure.mongo.MongoProperties;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.context.annotation.Primary;\nimport org.springframework.data.mongodb.MongoDatabaseFactory;\nimport org.springframework.data.mongodb.core.MongoTemplate;\nimport org.springframework.data.mongodb.core.SimpleMongoClientDatabaseFactory;\n\n\n@Configuration\npublic class MultipleMongoConfig {\n\n\t@Autowired\n    private MultipleMongoProperties mongoProperties;\n\n\t@Primary\n\t@Bean(name = \"primaryMongoTemplate\")\n\tpublic MongoTemplate primaryMongoTemplate() throws Exception {\n\t\treturn new MongoTemplate(primaryFactory(this.mongoProperties.getPrimary()));\n\t}\n\n\t@Bean\n\t@Qualifier(\"secondaryMongoTemplate\")\n\tpublic MongoTemplate secondaryMongoTemplate() throws Exception {\n        return new MongoTemplate(secondaryFactory(this.mongoProperties.getSecondary()));\n\t}\n\n\t@Bean\n    @Primary\n\tpublic MongoDatabaseFactory primaryFactory(MongoProperties mongo) throws Exception {\n\t\tMongoClient client = MongoClients.create(mongo.getUri());\n\t\treturn new SimpleMongoClientDatabaseFactory(client, mongoProperties.getPrimary().getDatabase());\n\t}\n\n\t@Bean\n\tpublic MongoDatabaseFactory secondaryFactory(MongoProperties mongo) throws Exception {\n\t\tMongoClient client = MongoClients.create(mongo.getUri());\n\t\treturn new SimpleMongoClientDatabaseFactory(client, mongoProperties.getSecondary().getDatabase());\n\t}\n}"
  },
  {
    "path": "spring-boot-mongodb/spring-boot-multi-mongodb/src/main/java/com/neo/config/PrimaryMongoConfig.java",
    "content": "package com.neo.config;\n\nimport com.neo.config.props.MultipleMongoProperties;\nimport org.springframework.boot.context.properties.EnableConfigurationProperties;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.data.mongodb.repository.config.EnableMongoRepositories;\n\n\n@Configuration\n@EnableConfigurationProperties(MultipleMongoProperties.class)\n@EnableMongoRepositories(basePackages = \"com.neo.repository.primary\",\n\t\tmongoTemplateRef = \"primaryMongoTemplate\")\npublic class PrimaryMongoConfig {\n}\n"
  },
  {
    "path": "spring-boot-mongodb/spring-boot-multi-mongodb/src/main/java/com/neo/config/SecondaryMongoConfig.java",
    "content": "package com.neo.config;\n\nimport com.neo.config.props.MultipleMongoProperties;\nimport org.springframework.boot.context.properties.EnableConfigurationProperties;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.data.mongodb.repository.config.EnableMongoRepositories;\n\n\n@Configuration\n@EnableConfigurationProperties(MultipleMongoProperties.class)\n@EnableMongoRepositories(basePackages = \"com.neo.repository.secondary\",\n\t\tmongoTemplateRef = \"secondaryMongoTemplate\")\npublic class SecondaryMongoConfig {\n\n}\n"
  },
  {
    "path": "spring-boot-mongodb/spring-boot-multi-mongodb/src/main/java/com/neo/config/props/MultipleMongoProperties.java",
    "content": "package com.neo.config.props;\n\nimport org.springframework.boot.autoconfigure.mongo.MongoProperties;\nimport org.springframework.boot.context.properties.ConfigurationProperties;\n\n@ConfigurationProperties(prefix = \"mongodb\")\npublic class MultipleMongoProperties {\n\n\tprivate MongoProperties primary = new MongoProperties();\n\tprivate MongoProperties secondary = new MongoProperties();\n\n\tpublic MongoProperties getPrimary() {\n\t\treturn primary;\n\t}\n\n\tpublic void setPrimary(MongoProperties primary) {\n\t\tthis.primary = primary;\n\t}\n\n\tpublic MongoProperties getSecondary() {\n\t\treturn secondary;\n\t}\n\n\tpublic void setSecondary(MongoProperties secondary) {\n\t\tthis.secondary = secondary;\n\t}\n}\n"
  },
  {
    "path": "spring-boot-mongodb/spring-boot-multi-mongodb/src/main/java/com/neo/model/User.java",
    "content": "package com.neo.model;\n\nimport java.io.Serializable;\n\n\npublic class User implements Serializable {\n        private static final long serialVersionUID = -3258839839160856613L;\n        private String  id;\n        private String userName;\n        private String passWord;\n\n        public User(String userName, String passWord) {\n                this.userName = userName;\n                this.passWord = passWord;\n        }\n\n        public String getId() {\n                return id;\n        }\n\n        public void setId(String id) {\n                this.id = id;\n        }\n\n        public String getUserName() {\n                return userName;\n        }\n\n        public void setUserName(String userName) {\n                this.userName = userName;\n        }\n\n        public String getPassWord() {\n                return passWord;\n        }\n\n        public void setPassWord(String passWord) {\n                this.passWord = passWord;\n        }\n\n        @Override\n        public String toString() {\n                return \"User{\" +\n                        \"id='\" + id + '\\'' +\n                        \", userName='\" + userName + '\\'' +\n                        \", passWord='\" + passWord + '\\'' +\n                        '}';\n        }\n}\n"
  },
  {
    "path": "spring-boot-mongodb/spring-boot-multi-mongodb/src/main/java/com/neo/repository/primary/PrimaryRepository.java",
    "content": "package com.neo.repository.primary;\n\nimport com.neo.model.User;\nimport org.springframework.data.mongodb.repository.MongoRepository;\n\n/**\n * @author neo\n */\npublic interface PrimaryRepository extends MongoRepository<User, String> {\n}\n"
  },
  {
    "path": "spring-boot-mongodb/spring-boot-multi-mongodb/src/main/java/com/neo/repository/secondary/SecondaryRepository.java",
    "content": "package com.neo.repository.secondary;\n\nimport com.neo.model.User;\nimport org.springframework.data.mongodb.repository.MongoRepository;\n\n/**\n * @author neo\n */\npublic interface SecondaryRepository extends MongoRepository<User, String> {\n}\n"
  },
  {
    "path": "spring-boot-mongodb/spring-boot-multi-mongodb/src/main/resources/application.properties",
    "content": "spring.application.name=spring-boot-multi-mongodb\n\nmongodb.primary.uri=mongodb://119.0.0.6:27017\nmongodb.primary.database=primary\nmongodb.secondary.uri=mongodb://119.0.0.6:27017\nmongodb.secondary.database=secondary\n\n\n"
  },
  {
    "path": "spring-boot-mongodb/spring-boot-multi-mongodb/src/test/java/com/neo/MultiMongodbApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class MultiMongodbApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t\tSystem.out.println(\"hello world\");\n\t}\n\n}\n"
  },
  {
    "path": "spring-boot-mongodb/spring-boot-multi-mongodb/src/test/java/com/neo/repository/MuliDatabaseTest.java",
    "content": "package com.neo.repository;\n\nimport com.neo.model.User;\nimport com.neo.repository.primary.PrimaryRepository;\nimport com.neo.repository.secondary.SecondaryRepository;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport java.util.List;\n\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class MuliDatabaseTest {\n\n    @Autowired\n    private PrimaryRepository primaryRepository;\n\n    @Autowired\n    private SecondaryRepository secondaryRepository;\n\n    @Test\n    public void TestSave() {\n        System.out.println(\"************************************************************\");\n        System.out.println(\"测试开始\");\n        System.out.println(\"************************************************************\");\n        this.primaryRepository.save(new User(\"小张\", \"123456\"));\n        this.secondaryRepository.save(new User(\"小王\", \"654321\"));\n        List<User> primaries = this.primaryRepository.findAll();\n        for (User primary : primaries) {\n            System.out.println(primary.toString());\n        }\n        List<User> secondaries = this.secondaryRepository.findAll();\n        for (User secondary : secondaries) {\n            System.out.println(secondary.toString());\n        }\n        System.out.println(\"************************************************************\");\n        System.out.println(\"测试完成\");\n        System.out.println(\"************************************************************\");\n    }\n\n}\n"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-annotation/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-mybatis-annotation</artifactId>\n\t<version>1.0.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-mybatis-annotation</name>\n\t<description>Demo project for Spring Boot and mybatis</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>3.0.0</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>17</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t        <groupId>org.springframework.boot</groupId>\n\t        <artifactId>spring-boot-starter-web</artifactId>\n\t    </dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.mybatis.spring.boot</groupId>\n\t\t\t<artifactId>mybatis-spring-boot-starter</artifactId>\n\t\t\t<version>3.0.0</version>\n\t\t</dependency>\n\t     <dependency>\n\t        <groupId>mysql</groupId>\n\t        <artifactId>mysql-connector-java</artifactId>\n\t    </dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.junit.vintage</groupId>\n\t\t\t<artifactId>junit-vintage-engine</artifactId>\n\t\t\t<scope>test</scope>\n\t\t\t<exclusions>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<groupId>org.hamcrest</groupId>\n\t\t\t\t\t<artifactId>hamcrest-core</artifactId>\n\t\t\t\t</exclusion>\n\t\t\t</exclusions>\n\t\t</dependency>\n\t</dependencies>\n\t\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\t\n\n</project>\n"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-annotation/src/main/java/com/neo/MybatisAnnotationApplication.java",
    "content": "package com.neo;\n\nimport org.mybatis.spring.annotation.MapperScan;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\n@MapperScan(\"com.neo.mapper\")\npublic class MybatisAnnotationApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(MybatisAnnotationApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-annotation/src/main/java/com/neo/enums/UserSexEnum.java",
    "content": "package com.neo.enums;\n\npublic enum UserSexEnum {\n\tMAN, WOMAN\n}\n"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-annotation/src/main/java/com/neo/mapper/UserMapper.java",
    "content": "package com.neo.mapper;\n\nimport java.util.List;\n\nimport com.neo.model.User;\nimport org.apache.ibatis.annotations.Delete;\nimport org.apache.ibatis.annotations.Insert;\nimport org.apache.ibatis.annotations.Result;\nimport org.apache.ibatis.annotations.Results;\nimport org.apache.ibatis.annotations.Select;\nimport org.apache.ibatis.annotations.Update;\n\nimport com.neo.enums.UserSexEnum;\n\npublic interface UserMapper {\n\t\n\t@Select(\"SELECT * FROM users\")\n\t@Results({\n\t\t@Result(property = \"userSex\",  column = \"user_sex\", javaType = UserSexEnum.class),\n\t\t@Result(property = \"nickName\", column = \"nick_name\")\n\t})\n\tList<User> getAll();\n\t\n\t@Select(\"SELECT * FROM users WHERE id = #{id}\")\n\t@Results({\n\t\t@Result(property = \"userSex\",  column = \"user_sex\", javaType = UserSexEnum.class),\n\t\t@Result(property = \"nickName\", column = \"nick_name\")\n\t})\n\tUser getOne(Long id);\n\n\t@Insert(\"INSERT INTO users(userName,passWord,user_sex) VALUES(#{userName}, #{passWord}, #{userSex})\")\n\tvoid insert(User user);\n\n\t@Update(\"UPDATE users SET userName=#{userName},nick_name=#{nickName} WHERE id =#{id}\")\n\tvoid update(User user);\n\n\t@Delete(\"DELETE FROM users WHERE id =#{id}\")\n\tvoid delete(Long id);\n\n}"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-annotation/src/main/java/com/neo/model/User.java",
    "content": "package com.neo.model;\n\nimport java.io.Serializable;\n\nimport com.neo.enums.UserSexEnum;\n\npublic class User implements Serializable {\n\n\tprivate static final long serialVersionUID = 1L;\n\tprivate Long id;\n\tprivate String userName;\n\tprivate String passWord;\n\tprivate UserSexEnum userSex;\n\tprivate String nickName;\n\n\tpublic User() {\n\t\tsuper();\n\t}\n\n\tpublic User(String userName, String passWord, UserSexEnum userSex) {\n\t\tsuper();\n\t\tthis.passWord = passWord;\n\t\tthis.userName = userName;\n\t\tthis.userSex = userSex;\n\t}\n\n\tpublic Long getId() {\n\t\treturn id;\n\t}\n\n\tpublic void setId(Long id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic String getUserName() {\n\t\treturn userName;\n\t}\n\n\tpublic void setUserName(String userName) {\n\t\tthis.userName = userName;\n\t}\n\n\tpublic String getPassWord() {\n\t\treturn passWord;\n\t}\n\n\tpublic void setPassWord(String passWord) {\n\t\tthis.passWord = passWord;\n\t}\n\n\tpublic UserSexEnum getUserSex() {\n\t\treturn userSex;\n\t}\n\n\tpublic void setUserSex(UserSexEnum userSex) {\n\t\tthis.userSex = userSex;\n\t}\n\n\tpublic String getNickName() {\n\t\treturn nickName;\n\t}\n\n\tpublic void setNickName(String nickName) {\n\t\tthis.nickName = nickName;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\t// TODO Auto-generated method stub\n\t\treturn \"userName \" + this.userName + \", pasword \" + this.passWord + \"sex \" + userSex.name();\n\t}\n\n}"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-annotation/src/main/java/com/neo/web/UserController.java",
    "content": "package com.neo.web;\n\nimport java.util.List;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport com.neo.model.User;\nimport com.neo.mapper.UserMapper;\n\n@RestController\npublic class UserController {\n\t\n\t@Autowired\n\tprivate UserMapper userMapper;\n\t\n\t@RequestMapping(\"/getUsers\")\n\tpublic List<User> getUsers() {\n\t\tList<User> users=userMapper.getAll();\n\t\treturn users;\n\t}\n\t\n    @RequestMapping(\"/getUser\")\n    public User getUser(Long id) {\n    \tUser user=userMapper.getOne(id);\n        return user;\n    }\n    \n    @RequestMapping(\"/add\")\n    public void save(User user) {\n    \tuserMapper.insert(user);\n    }\n    \n    @RequestMapping(value=\"update\")\n    public void update(User user) {\n    \tuserMapper.update(user);\n    }\n    \n    @RequestMapping(value=\"/delete/{id}\")\n    public void delete(@PathVariable(\"id\") Long id) {\n    \tuserMapper.delete(id);\n    }\n    \n    \n}"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-annotation/src/main/resources/application.properties",
    "content": "mybatis.type-aliases-package=com.neo.model\n\nspring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true\nspring.datasource.username=root\nspring.datasource.password=root\nspring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-annotation/src/test/java/com/neo/MybatisAnnotationApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class MybatisAnnotationApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t\tSystem.out.println(\"hello world\");\n\t}\n\n}\n"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-annotation/src/test/java/com/neo/mapper/UserMapperTest.java",
    "content": "package com.neo.mapper;\n\nimport java.util.List;\n\nimport com.neo.model.User;\nimport org.junit.Assert;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport com.neo.enums.UserSexEnum;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class UserMapperTest {\n\n\t@Autowired\n\tprivate UserMapper userMapper;\n\n\t@Test\n\tpublic void testInsert() throws Exception {\n\t\tuserMapper.insert(new User(\"aa1\", \"a123456\", UserSexEnum.MAN));\n\t\tuserMapper.insert(new User(\"bb1\", \"b123456\", UserSexEnum.WOMAN));\n\t\tuserMapper.insert(new User(\"cc1\", \"b123456\", UserSexEnum.WOMAN));\n\n\t\tAssert.assertEquals(3, userMapper.getAll().size());\n\t}\n\n\t@Test\n\tpublic void testQuery() throws Exception {\n\t\tList<User> users = userMapper.getAll();\n\t\tSystem.out.println(users.toString());\n\t}\n\t\n\t\n\t@Test\n\tpublic void testUpdate() throws Exception {\n\t\tUser user = userMapper.getOne(30l);\n\t\tSystem.out.println(user.toString());\n\t\tuser.setNickName(\"neo\");\n\t\tuserMapper.update(user);\n\t\tAssert.assertTrue((\"neo\".equals(userMapper.getOne(30l).getNickName())));\n\t}\n\n}"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-annotation/users.sql",
    "content": "/*\nNavicat MySQL Data Transfer\n\nSource Server         : 本地\nSource Server Version : 50505\nSource Host           : localhost:3306\nSource Database       : test1\n\nTarget Server Type    : MYSQL\nTarget Server Version : 50505\nFile Encoding         : 65001\n\nDate: 2016-11-05 21:17:33\n*/\n\nSET FOREIGN_KEY_CHECKS=0;\n\n-- ----------------------------\n-- Table structure for `users`\n-- ----------------------------\nDROP TABLE IF EXISTS `users`;\nCREATE TABLE `users` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',\n  `userName` varchar(32) DEFAULT NULL COMMENT '用户名',\n  `passWord` varchar(32) DEFAULT NULL COMMENT '密码',\n  `user_sex` varchar(32) DEFAULT NULL,\n  `nick_name` varchar(32) DEFAULT NULL,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8;\n\n"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-annotation-mulidatasource/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-mybatis-annotation-mulidatasource</artifactId>\n\t<version>1.0.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-mybatis-annotation-mulidatasource</name>\n\t<description>Demo project for Spring Boot and mybatis with annotation</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>3.0.0</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>17</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t        <groupId>org.springframework.boot</groupId>\n\t        <artifactId>spring-boot-starter-web</artifactId>\n\t    </dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.mybatis.spring.boot</groupId>\n\t\t\t<artifactId>mybatis-spring-boot-starter</artifactId>\n\t\t\t<version>3.0.0</version>\n\t\t</dependency>\n\t     <dependency>\n\t        <groupId>mysql</groupId>\n\t        <artifactId>mysql-connector-java</artifactId>\n\t    </dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.junit.vintage</groupId>\n\t\t\t<artifactId>junit-vintage-engine</artifactId>\n\t\t\t<scope>test</scope>\n\t\t\t<exclusions>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<groupId>org.hamcrest</groupId>\n\t\t\t\t\t<artifactId>hamcrest-core</artifactId>\n\t\t\t\t</exclusion>\n\t\t\t</exclusions>\n\t\t</dependency>\n\t</dependencies>\n\t\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\t\n\n</project>\n"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-annotation-mulidatasource/src/main/java/com/neo/MAMApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class MAMApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(MAMApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-annotation-mulidatasource/src/main/java/com/neo/datasource/DataSource1Config.java",
    "content": "package com.neo.datasource;\n\nimport org.apache.ibatis.session.SqlSessionFactory;\nimport org.mybatis.spring.SqlSessionFactoryBean;\nimport org.mybatis.spring.SqlSessionTemplate;\nimport org.mybatis.spring.annotation.MapperScan;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.boot.context.properties.ConfigurationProperties;\nimport org.springframework.boot.jdbc.DataSourceBuilder;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.context.annotation.Primary;\nimport org.springframework.jdbc.datasource.DataSourceTransactionManager;\n\nimport javax.sql.DataSource;\n\n/**\n * Created by summer on 2016/11/25.\n */\n@Configuration\n@MapperScan(basePackages = \"com.neo.mapper.test1\", sqlSessionTemplateRef  = \"test1SqlSessionTemplate\")\npublic class DataSource1Config {\n\n    @Bean(name = \"test1DataSource\")\n    @ConfigurationProperties(prefix = \"spring.datasource.test1\")\n    @Primary\n    public DataSource testDataSource() {\n        return DataSourceBuilder.create().build();\n    }\n\n    @Bean(name = \"test1SqlSessionFactory\")\n    @Primary\n    public SqlSessionFactory testSqlSessionFactory(@Qualifier(\"test1DataSource\") DataSource dataSource) throws Exception {\n        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();\n        bean.setDataSource(dataSource);\n        return bean.getObject();\n    }\n\n    @Bean(name = \"test1TransactionManager\")\n    @Primary\n    public DataSourceTransactionManager testTransactionManager(@Qualifier(\"test1DataSource\") DataSource dataSource) {\n        return new DataSourceTransactionManager(dataSource);\n    }\n\n    @Bean(name = \"test1SqlSessionTemplate\")\n    @Primary\n    public SqlSessionTemplate testSqlSessionTemplate(@Qualifier(\"test1SqlSessionFactory\") SqlSessionFactory sqlSessionFactory) throws Exception {\n        return new SqlSessionTemplate(sqlSessionFactory);\n    }\n\n}\n"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-annotation-mulidatasource/src/main/java/com/neo/datasource/DataSource2Config.java",
    "content": "package com.neo.datasource;\n\nimport org.apache.ibatis.session.SqlSessionFactory;\nimport org.mybatis.spring.SqlSessionFactoryBean;\nimport org.mybatis.spring.SqlSessionTemplate;\nimport org.mybatis.spring.annotation.MapperScan;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.boot.context.properties.ConfigurationProperties;\nimport org.springframework.boot.jdbc.DataSourceBuilder;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.jdbc.datasource.DataSourceTransactionManager;\n\nimport javax.sql.DataSource;\n\n/**\n * Created by summer on 2016/11/25.\n */\n@Configuration\n@MapperScan(basePackages = \"com.neo.mapper.test2\", sqlSessionTemplateRef  = \"test2SqlSessionTemplate\")\npublic class DataSource2Config {\n\n    @Bean(name = \"test2DataSource\")\n    @ConfigurationProperties(prefix = \"spring.datasource.test2\")\n    public DataSource testDataSource() {\n        return DataSourceBuilder.create().build();\n    }\n\n    @Bean(name = \"test2SqlSessionFactory\")\n    public SqlSessionFactory testSqlSessionFactory(@Qualifier(\"test2DataSource\") DataSource dataSource) throws Exception {\n        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();\n        bean.setDataSource(dataSource);\n        return bean.getObject();\n    }\n\n    @Bean(name = \"test2TransactionManager\")\n    public DataSourceTransactionManager testTransactionManager(@Qualifier(\"test2DataSource\") DataSource dataSource) {\n        return new DataSourceTransactionManager(dataSource);\n    }\n\n    @Bean(name = \"test2SqlSessionTemplate\")\n    public SqlSessionTemplate testSqlSessionTemplate(@Qualifier(\"test2SqlSessionFactory\") SqlSessionFactory sqlSessionFactory) throws Exception {\n        return new SqlSessionTemplate(sqlSessionFactory);\n    }\n\n}\n"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-annotation-mulidatasource/src/main/java/com/neo/enums/UserSexEnum.java",
    "content": "package com.neo.enums;\n\npublic enum UserSexEnum {\n\tMAN, WOMAN\n}\n"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-annotation-mulidatasource/src/main/java/com/neo/mapper/test1/User1Mapper.java",
    "content": "package com.neo.mapper.test1;\n\nimport com.neo.model.User;\nimport com.neo.enums.UserSexEnum;\nimport org.apache.ibatis.annotations.*;\n\nimport java.util.List;\n\npublic interface User1Mapper {\n\n\n\t@Select(\"SELECT * FROM users\")\n\t@Results({\n\t\t\t@Result(property = \"userSex\",  column = \"user_sex\", javaType = UserSexEnum.class),\n\t\t\t@Result(property = \"nickName\", column = \"nick_name\")\n\t})\n\tList<User> getAll();\n\n\t@Select(\"SELECT * FROM users WHERE id = #{id}\")\n\t@Results({\n\t\t\t@Result(property = \"userSex\",  column = \"user_sex\", javaType = UserSexEnum.class),\n\t\t\t@Result(property = \"nickName\", column = \"nick_name\")\n\t})\n\tUser getOne(Long id);\n\n\t@Insert(\"INSERT INTO users(userName,passWord,user_sex) VALUES(#{userName}, #{passWord}, #{userSex})\")\n\tvoid insert(User user);\n\n\t@Update(\"UPDATE users SET userName=#{userName},nick_name=#{nickName} WHERE id =#{id}\")\n\tvoid update(User user);\n\n\t@Delete(\"DELETE FROM users WHERE id =#{id}\")\n\tvoid delete(Long id);\n\n}"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-annotation-mulidatasource/src/main/java/com/neo/mapper/test2/User2Mapper.java",
    "content": "package com.neo.mapper.test2;\n\nimport java.util.List;\n\nimport com.neo.model.User;\nimport com.neo.enums.UserSexEnum;\nimport org.apache.ibatis.annotations.*;\n\npublic interface User2Mapper {\n\n\n\t@Select(\"SELECT * FROM users\")\n\t@Results({\n\t\t\t@Result(property = \"userSex\",  column = \"user_sex\", javaType = UserSexEnum.class),\n\t\t\t@Result(property = \"nickName\", column = \"nick_name\")\n\t})\n\tList<User> getAll();\n\n\t@Select(\"SELECT * FROM users WHERE id = #{id}\")\n\t@Results({\n\t\t\t@Result(property = \"userSex\",  column = \"user_sex\", javaType = UserSexEnum.class),\n\t\t\t@Result(property = \"nickName\", column = \"nick_name\")\n\t})\n\tUser getOne(Long id);\n\n\t@Insert(\"INSERT INTO users(userName,passWord,user_sex) VALUES(#{userName}, #{passWord}, #{userSex})\")\n\tvoid insert(User user);\n\n\t@Update(\"UPDATE users SET userName=#{userName},nick_name=#{nickName} WHERE id =#{id}\")\n\tvoid update(User user);\n\n\t@Delete(\"DELETE FROM users WHERE id =#{id}\")\n\tvoid delete(Long id);\n\n}"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-annotation-mulidatasource/src/main/java/com/neo/model/User.java",
    "content": "package com.neo.model;\n\nimport java.io.Serializable;\n\nimport com.neo.enums.UserSexEnum;\n\npublic class User implements Serializable {\n\n\tprivate static final long serialVersionUID = 1L;\n\tprivate Long id;\n\tprivate String userName;\n\tprivate String passWord;\n\tprivate UserSexEnum userSex;\n\tprivate String nickName;\n\n\tpublic User() {\n\t\tsuper();\n\t}\n\n\tpublic User(String userName, String passWord, UserSexEnum userSex) {\n\t\tsuper();\n\t\tthis.passWord = passWord;\n\t\tthis.userName = userName;\n\t\tthis.userSex = userSex;\n\t}\n\n\tpublic Long getId() {\n\t\treturn id;\n\t}\n\n\tpublic void setId(Long id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic String getUserName() {\n\t\treturn userName;\n\t}\n\n\tpublic void setUserName(String userName) {\n\t\tthis.userName = userName;\n\t}\n\n\tpublic String getPassWord() {\n\t\treturn passWord;\n\t}\n\n\tpublic void setPassWord(String passWord) {\n\t\tthis.passWord = passWord;\n\t}\n\n\tpublic UserSexEnum getUserSex() {\n\t\treturn userSex;\n\t}\n\n\tpublic void setUserSex(UserSexEnum userSex) {\n\t\tthis.userSex = userSex;\n\t}\n\n\tpublic String getNickName() {\n\t\treturn nickName;\n\t}\n\n\tpublic void setNickName(String nickName) {\n\t\tthis.nickName = nickName;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\t// TODO Auto-generated method stub\n\t\treturn \"userName \" + this.userName + \", pasword \" + this.passWord + \"sex \" + userSex.name();\n\t}\n\n}"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-annotation-mulidatasource/src/main/java/com/neo/web/UserController.java",
    "content": "package com.neo.web;\n\nimport java.util.List;\n\nimport com.neo.mapper.test1.User1Mapper;\nimport com.neo.model.User;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport com.neo.mapper.test2.User2Mapper;\n\n@RestController\npublic class UserController {\n\n    @Autowired\n    private User1Mapper user1Mapper;\n\n\t@Autowired\n\tprivate User2Mapper user2Mapper;\n\t\n\t@RequestMapping(\"/getUsers\")\n\tpublic List<User> getUsers() {\n\t\tList<User> users=user1Mapper.getAll();\n\t\treturn users;\n\t}\n\t\n    @RequestMapping(\"/getUser\")\n    public User getUser(Long id) {\n    \tUser user=user2Mapper.getOne(id);\n        return user;\n    }\n    \n    @RequestMapping(\"/add\")\n    public void save(User user) {\n        user2Mapper.insert(user);\n    }\n    \n    @RequestMapping(value=\"update\")\n    public void update(User user) {\n        user2Mapper.update(user);\n    }\n    \n    @RequestMapping(value=\"/delete/{id}\")\n    public void delete(@PathVariable(\"id\") Long id) {\n        user1Mapper.delete(id);\n    }\n    \n}"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-annotation-mulidatasource/src/main/resources/application.properties",
    "content": "mybatis.type-aliases-package=com.neo.model\n\nspring.datasource.test1.jdbc-url=jdbc:mysql://localhost:3306/test1?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true\nspring.datasource.test1.username=root\nspring.datasource.test1.password=root\nspring.datasource.test1.driver-class-name=com.mysql.cj.jdbc.Driver\n\nspring.datasource.test2.jdbc-url=jdbc:mysql://localhost:3306/test2?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true\nspring.datasource.test2.username=root\nspring.datasource.test2.password=root\nspring.datasource.test2.driver-class-name=com.mysql.cj.jdbc.Driver\n\n"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-annotation-mulidatasource/src/test/java/com/neo/MAMApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class MAMApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t\tSystem.out.println(\"hello world\");\n\t}\n\n}\n"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-annotation-mulidatasource/src/test/java/com/neo/mapper/User1MapperTest.java",
    "content": "package com.neo.mapper;\n\nimport java.util.List;\n\nimport com.neo.mapper.test1.User1Mapper;\nimport com.neo.model.User;\nimport org.junit.Assert;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport com.neo.enums.UserSexEnum;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class User1MapperTest {\n\n\t@Autowired\n\tprivate User1Mapper userMapper;\n\n\t@Test\n\tpublic void testInsert() throws Exception {\n\t\tuserMapper.insert(new User(\"aa\", \"a123456\", UserSexEnum.MAN));\n\t\tuserMapper.insert(new User(\"bb\", \"b123456\", UserSexEnum.WOMAN));\n\t\tuserMapper.insert(new User(\"cc\", \"b123456\", UserSexEnum.WOMAN));\n\n\t}\n\n\t@Test\n\tpublic void testQuery() throws Exception {\n\t\tList<User> users = userMapper.getAll();\n\t\tif(users==null || users.size()==0){\n\t\t\tSystem.out.println(\"is null\");\n\t\t}else{\n\t\t\tSystem.out.println(users.size());\n\t\t}\n\t}\n\t\n\t\n\t@Test\n\tpublic void testUpdate() throws Exception {\n\t\tUser user = userMapper.getOne(30l);\n\t\tSystem.out.println(user.toString());\n\t\tuser.setNickName(\"neo\");\n\t\tuserMapper.update(user);\n\t\tAssert.assertTrue((\"neo\".equals(userMapper.getOne(30l).getNickName())));\n\t}\n\n}"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-annotation-mulidatasource/src/test/java/com/neo/mapper/User2MapperTest.java",
    "content": "package com.neo.mapper;\n\nimport com.neo.model.User;\nimport com.neo.enums.UserSexEnum;\nimport com.neo.mapper.test2.User2Mapper;\nimport org.junit.Assert;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport java.util.List;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class User2MapperTest {\n\n\t@Autowired\n\tprivate User2Mapper userMapper;\n\n\t@Test\n\tpublic void testInsert() throws Exception {\n\t\tuserMapper.insert(new User(\"aa\", \"a123456\", UserSexEnum.MAN));\n\t\tuserMapper.insert(new User(\"bb\", \"b123456\", UserSexEnum.WOMAN));\n\t\tuserMapper.insert(new User(\"cc\", \"b123456\", UserSexEnum.WOMAN));\n\t\tSystem.out.println(userMapper.getAll().size());\n\t}\n\n\t@Test\n\tpublic void testQuery() throws Exception {\n\t\tList<User> users = userMapper.getAll();\n\t\tif(users==null || users.size()==0){\n\t\t\tSystem.out.println(\"is null\");\n\t\t}else{\n\t\t\tSystem.out.println(users.toString());\n\t\t}\n\t}\n\t\n\t\n\t@Test\n\tpublic void testUpdate() throws Exception {\n\t\tUser user = userMapper.getOne(30l);\n\t\tSystem.out.println(user.toString());\n\t\tuser.setNickName(\"neo\");\n\t\tuserMapper.update(user);\n\t\tAssert.assertTrue((\"neo\".equals(userMapper.getOne(30l).getNickName())));\n\t}\n\n}"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-annotation-mulidatasource/users.sql",
    "content": "/*\nNavicat MySQL Data Transfer\n\nSource Server         : 本地\nSource Server Version : 50505\nSource Host           : localhost:3306\nSource Database       : test1\n\nTarget Server Type    : MYSQL\nTarget Server Version : 50505\nFile Encoding         : 65001\n\nDate: 2016-11-05 21:17:33\n*/\n\nSET FOREIGN_KEY_CHECKS=0;\n\n-- ----------------------------\n-- Table structure for `users`\n-- ----------------------------\nDROP TABLE IF EXISTS `users`;\nCREATE TABLE `users` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',\n  `userName` varchar(32) DEFAULT NULL COMMENT '用户名',\n  `passWord` varchar(32) DEFAULT NULL COMMENT '密码',\n  `user_sex` varchar(32) DEFAULT NULL,\n  `nick_name` varchar(32) DEFAULT NULL,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8;\n\n"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-xml/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-mybatis-xml</artifactId>\n\t<version>1.0.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-mybatis-xml</name>\n\t<description>Demo project for Spring Boot and mybatis</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>3.0.0</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>17</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t        <groupId>org.springframework.boot</groupId>\n\t        <artifactId>spring-boot-starter-web</artifactId>\n\t    </dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.mybatis.spring.boot</groupId>\n\t\t\t<artifactId>mybatis-spring-boot-starter</artifactId>\n\t\t\t<version>3.0.0</version>\n\t\t</dependency>\n\t\t<dependency>\n\t        <groupId>mysql</groupId>\n\t        <artifactId>mysql-connector-java</artifactId>\n\t    </dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.junit.vintage</groupId>\n\t\t\t<artifactId>junit-vintage-engine</artifactId>\n\t\t\t<scope>test</scope>\n\t\t\t<exclusions>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<groupId>org.hamcrest</groupId>\n\t\t\t\t\t<artifactId>hamcrest-core</artifactId>\n\t\t\t\t</exclusion>\n\t\t\t</exclusions>\n\t\t</dependency>\n\t</dependencies>\n\t\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\n</project>\n"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-xml/src/main/java/com/neo/MybatisXmlApplication.java",
    "content": "package com.neo;\n\nimport org.mybatis.spring.annotation.MapperScan;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\n@MapperScan(\"com.neo.mapper\")\npublic class MybatisXmlApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(MybatisXmlApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-xml/src/main/java/com/neo/enums/UserSexEnum.java",
    "content": "package com.neo.enums;\n\npublic enum UserSexEnum {\n\tMAN, WOMAN\n}\n"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-xml/src/main/java/com/neo/mapper/UserMapper.java",
    "content": "package com.neo.mapper;\n\nimport java.util.List;\n\nimport com.neo.model.User;\n\npublic interface UserMapper {\n\t\n\tList<User> getAll();\n\t\n\tUser getOne(Long id);\n\n\tvoid insert(User user);\n\n\tvoid update(User user);\n\n\tvoid delete(Long id);\n\n}"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-xml/src/main/java/com/neo/model/User.java",
    "content": "package com.neo.model;\n\nimport java.io.Serializable;\n\nimport com.neo.enums.UserSexEnum;\n\npublic class User implements Serializable {\n\n\tprivate static final long serialVersionUID = 1L;\n\tprivate Long id;\n\tprivate String userName;\n\tprivate String passWord;\n\tprivate UserSexEnum userSex;\n\tprivate String nickName;\n\n\tpublic User() {\n\t\tsuper();\n\t}\n\n\tpublic User(String userName, String passWord, UserSexEnum userSex) {\n\t\tsuper();\n\t\tthis.passWord = passWord;\n\t\tthis.userName = userName;\n\t\tthis.userSex = userSex;\n\t}\n\n\tpublic Long getId() {\n\t\treturn id;\n\t}\n\n\tpublic void setId(Long id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic String getUserName() {\n\t\treturn userName;\n\t}\n\n\tpublic void setUserName(String userName) {\n\t\tthis.userName = userName;\n\t}\n\n\tpublic String getPassWord() {\n\t\treturn passWord;\n\t}\n\n\tpublic void setPassWord(String passWord) {\n\t\tthis.passWord = passWord;\n\t}\n\n\tpublic UserSexEnum getUserSex() {\n\t\treturn userSex;\n\t}\n\n\tpublic void setUserSex(UserSexEnum userSex) {\n\t\tthis.userSex = userSex;\n\t}\n\n\tpublic String getNickName() {\n\t\treturn nickName;\n\t}\n\n\tpublic void setNickName(String nickName) {\n\t\tthis.nickName = nickName;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\t// TODO Auto-generated method stub\n\t\treturn \"userName \" + this.userName + \", pasword \" + this.passWord + \"sex \" + userSex.name();\n\t}\n\n}"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-xml/src/main/java/com/neo/web/UserController.java",
    "content": "package com.neo.web;\n\nimport java.util.List;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport com.neo.model.User;\nimport com.neo.mapper.UserMapper;\n\n@RestController\npublic class UserController {\n\t\n\t@Autowired\n\tprivate UserMapper userMapper;\n\t\n\t@RequestMapping(\"/getUsers\")\n\tpublic List<User> getUsers() {\n\t\tList<User> users=userMapper.getAll();\n\t\treturn users;\n\t}\n\t\n    @RequestMapping(\"/getUser\")\n    public User getUser(Long id) {\n    \tUser user=userMapper.getOne(id);\n        return user;\n    }\n    \n    @RequestMapping(\"/add\")\n    public void save(User user) {\n    \tuserMapper.insert(user);\n    }\n    \n    @RequestMapping(value=\"update\")\n    public void update(User user) {\n    \tuserMapper.update(user);\n    }\n    \n    @RequestMapping(value=\"/delete/{id}\")\n    public void delete(@PathVariable(\"id\") Long id) {\n    \tuserMapper.delete(id);\n    }\n    \n    \n}"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-xml/src/main/resources/application.properties",
    "content": "mybatis.config-location=classpath:mybatis/mybatis-config.xml\nmybatis.mapper-locations=classpath:mybatis/mapper/*.xml\nmybatis.type-aliases-package=com.neo.model\n\nspring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true\nspring.datasource.username=root\nspring.datasource.password=root\nspring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver\n"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-xml/src/main/resources/mybatis/mapper/UserMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >\n<mapper namespace=\"com.neo.mapper.UserMapper\" >\n    <resultMap id=\"BaseResultMap\" type=\"com.neo.model.User\" >\n        <id column=\"id\" property=\"id\" jdbcType=\"BIGINT\" />\n        <result column=\"userName\" property=\"userName\" jdbcType=\"VARCHAR\" />\n        <result column=\"passWord\" property=\"passWord\" jdbcType=\"VARCHAR\" />\n        <result column=\"user_sex\" property=\"userSex\" javaType=\"com.neo.enums.UserSexEnum\"/>\n        <result column=\"nick_name\" property=\"nickName\" jdbcType=\"VARCHAR\" />\n    </resultMap>\n    \n    <sql id=\"Base_Column_List\" >\n        id, userName, passWord, user_sex, nick_name\n    </sql>\n\n    <select id=\"getAll\" resultMap=\"BaseResultMap\"  >\n       SELECT \n       <include refid=\"Base_Column_List\" />\n\t   FROM users\n    </select>\n\n    <select id=\"getOne\" parameterType=\"java.lang.Long\" resultMap=\"BaseResultMap\" >\n        SELECT \n       <include refid=\"Base_Column_List\" />\n\t   FROM users\n\t   WHERE id = #{id}\n    </select>\n\n    <insert id=\"insert\" parameterType=\"com.neo.model.User\" >\n       INSERT INTO \n       \t\tusers\n       \t\t(userName,passWord,user_sex) \n       \tVALUES\n       \t\t(#{userName}, #{passWord}, #{userSex})\n    </insert>\n    \n    <update id=\"update\" parameterType=\"com.neo.model.User\" >\n       UPDATE \n       \t\tusers \n       SET \n       \t<if test=\"userName != null\">userName = #{userName},</if>\n       \t<if test=\"passWord != null\">passWord = #{passWord},</if>\n       \tnick_name = #{nickName}\n       WHERE \n       \t\tid = #{id}\n    </update>\n    \n    <delete id=\"delete\" parameterType=\"java.lang.Long\" >\n       DELETE FROM\n       \t\t users \n       WHERE \n       \t\t id =#{id}\n    </delete>\n\n</mapper>"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-xml/src/main/resources/mybatis/mybatis-config.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE configuration PUBLIC \"-//mybatis.org//DTD Config 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-config.dtd\">\n<configuration>\n\t<typeAliases>\n\t\t<typeAlias alias=\"Integer\" type=\"java.lang.Integer\" />\n\t\t<typeAlias alias=\"Long\" type=\"java.lang.Long\" />\n\t\t<typeAlias alias=\"HashMap\" type=\"java.util.HashMap\" />\n\t\t<typeAlias alias=\"LinkedHashMap\" type=\"java.util.LinkedHashMap\" />\n\t\t<typeAlias alias=\"ArrayList\" type=\"java.util.ArrayList\" />\n\t\t<typeAlias alias=\"LinkedList\" type=\"java.util.LinkedList\" />\n\t</typeAliases>\n</configuration>"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-xml/src/test/java/com/neo/MybatisXmlApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class MybatisXmlApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t\tSystem.out.println(\"hello world\");\n\t}\n\n}\n"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-xml/src/test/java/com/neo/mapper/UserMapperTest.java",
    "content": "package com.neo.mapper;\n\nimport java.util.List;\n\nimport org.junit.Assert;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport com.neo.model.User;\nimport com.neo.enums.UserSexEnum;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class UserMapperTest {\n\n\t@Autowired\n\tprivate UserMapper userMapper;\n\n\t@Test\n\tpublic void testInsert() throws Exception {\n\t\tuserMapper.insert(new User(\"aa\", \"a123456\", UserSexEnum.MAN));\n\t\tuserMapper.insert(new User(\"bb\", \"b123456\", UserSexEnum.WOMAN));\n\t\tuserMapper.insert(new User(\"cc\", \"b123456\", UserSexEnum.WOMAN));\n\n\t\tSystem.out.println(userMapper.getAll().size());\n\t}\n\n\t@Test\n\tpublic void testQuery() throws Exception {\n\t\tList<User> users = userMapper.getAll();\n\t\tif(users==null || users.size()==0){\n\t\t\tSystem.out.println(\"is null\");\n\t\t}else{\n\t\t\tSystem.out.println(users.toString());\n\t\t}\n\t}\n\t\n\t\n\t@Test\n\tpublic void testUpdate() throws Exception {\n\n\t\tLong id =30l;\n\t\tUser user = userMapper.getOne(id);\n\t\tSystem.out.println(user.toString());\n\t\tuser.setNickName(\"neo\");\n\t\tuserMapper.update(user);\n\t\tAssert.assertTrue((\"neo\".equals(userMapper.getOne(id).getNickName())));\n\t}\n\n}"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-xml/src/test/java/com/neo/web/UserControllerTest.java",
    "content": "package com.neo.web;\n\n\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.http.MediaType;\nimport org.springframework.test.context.junit4.SpringRunner;\nimport org.springframework.test.web.servlet.MockMvc;\nimport org.springframework.test.web.servlet.request.MockMvcRequestBuilders;\nimport org.springframework.test.web.servlet.setup.MockMvcBuilders;\nimport org.springframework.web.context.WebApplicationContext;\n\nimport static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class UserControllerTest {\n    @Autowired\n    private WebApplicationContext wac;\n    private MockMvc mockMvc;\n\n    @Before\n    public void setUp() throws Exception {\n        mockMvc = MockMvcBuilders.webAppContextSetup(wac).build(); //初始化MockMvc对象\n    }\n\n    @Test\n    public void getUsers() throws Exception {\n        mockMvc.perform(MockMvcRequestBuilders.post(\"/getUsers\")\n                .accept(MediaType.APPLICATION_JSON_UTF8)).andDo(print());\n    }\n\n}"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-xml/users.sql",
    "content": "/*\nNavicat MySQL Data Transfer\n\nSource Server         : 本地\nSource Server Version : 50505\nSource Host           : localhost:3306\nSource Database       : test1\n\nTarget Server Type    : MYSQL\nTarget Server Version : 50505\nFile Encoding         : 65001\n\nDate: 2016-11-05 21:17:33\n*/\n\nSET FOREIGN_KEY_CHECKS=0;\n\n-- ----------------------------\n-- Table structure for `users`\n-- ----------------------------\nDROP TABLE IF EXISTS `users`;\nCREATE TABLE `users` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',\n  `userName` varchar(32) DEFAULT NULL COMMENT '用户名',\n  `passWord` varchar(32) DEFAULT NULL COMMENT '密码',\n  `user_sex` varchar(32) DEFAULT NULL,\n  `nick_name` varchar(32) DEFAULT NULL,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8;\n\n"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-xml-mulidatasource/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-mybatis-xml-mulidatasource</artifactId>\n\t<version>1.0.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-mybatis-xml-mulidatasource</name>\n\t<description>Demo project for Spring Boot and mybatis</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>3.0.0</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>17</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t        <groupId>org.springframework.boot</groupId>\n\t        <artifactId>spring-boot-starter-web</artifactId>\n\t    </dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.mybatis.spring.boot</groupId>\n\t\t\t<artifactId>mybatis-spring-boot-starter</artifactId>\n\t\t\t<version>3.0.0</version>\n\t\t</dependency>\n\t     <dependency>\n\t        <groupId>mysql</groupId>\n\t        <artifactId>mysql-connector-java</artifactId>\n\t    </dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.junit.vintage</groupId>\n\t\t\t<artifactId>junit-vintage-engine</artifactId>\n\t\t\t<scope>test</scope>\n\t\t\t<exclusions>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<groupId>org.hamcrest</groupId>\n\t\t\t\t\t<artifactId>hamcrest-core</artifactId>\n\t\t\t\t</exclusion>\n\t\t\t</exclusions>\n\t\t</dependency>\n\t</dependencies>\n\t\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\t\n</project>\n"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-xml-mulidatasource/src/main/java/com/neo/MXMApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class MXMApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(MXMApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-xml-mulidatasource/src/main/java/com/neo/datasource/DataSource1Config.java",
    "content": "package com.neo.datasource;\n\nimport org.apache.ibatis.session.SqlSessionFactory;\nimport org.mybatis.spring.SqlSessionFactoryBean;\nimport org.mybatis.spring.SqlSessionTemplate;\nimport org.mybatis.spring.annotation.MapperScan;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.boot.context.properties.ConfigurationProperties;\nimport org.springframework.boot.jdbc.DataSourceBuilder;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.context.annotation.Primary;\nimport org.springframework.core.io.support.PathMatchingResourcePatternResolver;\nimport org.springframework.jdbc.datasource.DataSourceTransactionManager;\n\nimport javax.sql.DataSource;\n\n/**\n * Created by summer on 2016/11/25.\n */\n@Configuration\n@MapperScan(basePackages = \"com.neo.mapper.test1\", sqlSessionTemplateRef  = \"test1SqlSessionTemplate\")\npublic class DataSource1Config {\n\n    @Bean(name = \"test1DataSource\")\n    @ConfigurationProperties(prefix = \"spring.datasource.test1\")\n    @Primary\n    public DataSource testDataSource() {\n        return DataSourceBuilder.create().build();\n    }\n\n    @Bean(name = \"test1SqlSessionFactory\")\n    @Primary\n    public SqlSessionFactory testSqlSessionFactory(@Qualifier(\"test1DataSource\") DataSource dataSource) throws Exception {\n        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();\n        bean.setDataSource(dataSource);\n        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(\"classpath:mybatis/mapper/test1/*.xml\"));\n        return bean.getObject();\n    }\n\n    @Bean(name = \"test1TransactionManager\")\n    @Primary\n    public DataSourceTransactionManager testTransactionManager(@Qualifier(\"test1DataSource\") DataSource dataSource) {\n        return new DataSourceTransactionManager(dataSource);\n    }\n\n    @Bean(name = \"test1SqlSessionTemplate\")\n    @Primary\n    public SqlSessionTemplate testSqlSessionTemplate(@Qualifier(\"test1SqlSessionFactory\") SqlSessionFactory sqlSessionFactory) throws Exception {\n        return new SqlSessionTemplate(sqlSessionFactory);\n    }\n\n}\n"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-xml-mulidatasource/src/main/java/com/neo/datasource/DataSource2Config.java",
    "content": "package com.neo.datasource;\n\nimport org.apache.ibatis.session.SqlSessionFactory;\nimport org.mybatis.spring.SqlSessionFactoryBean;\nimport org.mybatis.spring.SqlSessionTemplate;\nimport org.mybatis.spring.annotation.MapperScan;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.boot.context.properties.ConfigurationProperties;\nimport org.springframework.boot.jdbc.DataSourceBuilder;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.core.io.support.PathMatchingResourcePatternResolver;\nimport org.springframework.jdbc.datasource.DataSourceTransactionManager;\n\nimport javax.sql.DataSource;\n\n/**\n * Created by summer on 2016/11/25.\n */\n@Configuration\n@MapperScan(basePackages = \"com.neo.mapper.test2\", sqlSessionTemplateRef  = \"test2SqlSessionTemplate\")\npublic class DataSource2Config {\n\n    @Bean(name = \"test2DataSource\")\n    @ConfigurationProperties(prefix = \"spring.datasource.test2\")\n    public DataSource testDataSource() {\n        return DataSourceBuilder.create().build();\n    }\n\n    @Bean(name = \"test2SqlSessionFactory\")\n    public SqlSessionFactory testSqlSessionFactory(@Qualifier(\"test2DataSource\") DataSource dataSource) throws Exception {\n        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();\n        bean.setDataSource(dataSource);\n        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(\"classpath:mybatis/mapper/test2/*.xml\"));\n        return bean.getObject();\n    }\n\n    @Bean(name = \"test2TransactionManager\")\n    public DataSourceTransactionManager testTransactionManager(@Qualifier(\"test2DataSource\") DataSource dataSource) {\n        return new DataSourceTransactionManager(dataSource);\n    }\n\n    @Bean(name = \"test2SqlSessionTemplate\")\n    public SqlSessionTemplate testSqlSessionTemplate(@Qualifier(\"test2SqlSessionFactory\") SqlSessionFactory sqlSessionFactory) throws Exception {\n        return new SqlSessionTemplate(sqlSessionFactory);\n    }\n\n}\n"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-xml-mulidatasource/src/main/java/com/neo/enums/UserSexEnum.java",
    "content": "package com.neo.enums;\n\npublic enum UserSexEnum {\n\tMAN, WOMAN\n}\n"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-xml-mulidatasource/src/main/java/com/neo/mapper/test1/User1Mapper.java",
    "content": "package com.neo.mapper.test1;\n\nimport com.neo.model.User;\n\nimport java.util.List;\n\npublic interface User1Mapper {\n\t\n\tList<User> getAll();\n\t\n\tUser getOne(Long id);\n\n\tvoid insert(User user);\n\n\tvoid update(User user);\n\n\tvoid delete(Long id);\n\n}"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-xml-mulidatasource/src/main/java/com/neo/mapper/test2/User2Mapper.java",
    "content": "package com.neo.mapper.test2;\n\nimport java.util.List;\n\nimport com.neo.model.User;\n\npublic interface User2Mapper {\n\t\n\tList<User> getAll();\n\t\n\tUser getOne(Long id);\n\n\tvoid insert(User user);\n\n\tvoid update(User user);\n\n\tvoid delete(Long id);\n\n}"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-xml-mulidatasource/src/main/java/com/neo/model/User.java",
    "content": "package com.neo.model;\n\nimport java.io.Serializable;\n\nimport com.neo.enums.UserSexEnum;\n\npublic class User implements Serializable {\n\n\tprivate static final long serialVersionUID = 1L;\n\tprivate Long id;\n\tprivate String userName;\n\tprivate String passWord;\n\tprivate UserSexEnum userSex;\n\tprivate String nickName;\n\n\tpublic User() {\n\t\tsuper();\n\t}\n\n\tpublic User(String userName, String passWord, UserSexEnum userSex) {\n\t\tsuper();\n\t\tthis.passWord = passWord;\n\t\tthis.userName = userName;\n\t\tthis.userSex = userSex;\n\t}\n\n\tpublic Long getId() {\n\t\treturn id;\n\t}\n\n\tpublic void setId(Long id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic String getUserName() {\n\t\treturn userName;\n\t}\n\n\tpublic void setUserName(String userName) {\n\t\tthis.userName = userName;\n\t}\n\n\tpublic String getPassWord() {\n\t\treturn passWord;\n\t}\n\n\tpublic void setPassWord(String passWord) {\n\t\tthis.passWord = passWord;\n\t}\n\n\tpublic UserSexEnum getUserSex() {\n\t\treturn userSex;\n\t}\n\n\tpublic void setUserSex(UserSexEnum userSex) {\n\t\tthis.userSex = userSex;\n\t}\n\n\tpublic String getNickName() {\n\t\treturn nickName;\n\t}\n\n\tpublic void setNickName(String nickName) {\n\t\tthis.nickName = nickName;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\t// TODO Auto-generated method stub\n\t\treturn \"userName \" + this.userName + \", pasword \" + this.passWord + \"sex \" + userSex.name();\n\t}\n\n}"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-xml-mulidatasource/src/main/java/com/neo/web/UserController.java",
    "content": "package com.neo.web;\n\nimport java.util.List;\n\nimport com.neo.mapper.test1.User1Mapper;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport com.neo.model.User;\nimport com.neo.mapper.test2.User2Mapper;\n\n@RestController\npublic class UserController {\n\n    @Autowired\n    private User1Mapper user1Mapper;\n\n\t@Autowired\n\tprivate User2Mapper user2Mapper;\n\t\n\t@RequestMapping(\"/getUsers\")\n\tpublic List<User> getUsers() {\n\t\tList<User> users=user1Mapper.getAll();\n\t\treturn users;\n\t}\n\t\n    @RequestMapping(\"/getUser\")\n    public User getUser(Long id) {\n    \tUser user=user2Mapper.getOne(id);\n        return user;\n    }\n    \n    @RequestMapping(\"/add\")\n    public void save(User user) {\n        user2Mapper.insert(user);\n    }\n    \n    @RequestMapping(value=\"update\")\n    public void update(User user) {\n        user2Mapper.update(user);\n    }\n    \n    @RequestMapping(value=\"/delete/{id}\")\n    public void delete(@PathVariable(\"id\") Long id) {\n        user1Mapper.delete(id);\n    }\n    \n    \n}"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-xml-mulidatasource/src/main/resources/application.properties",
    "content": "mybatis.config-location=classpath:mybatis/mybatis-config.xml\n\nspring.datasource.test1.jdbc-url=jdbc:mysql://localhost:3306/test1?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true\nspring.datasource.test1.username=root\nspring.datasource.test1.password=root\nspring.datasource.test1.driver-class-name=com.mysql.cj.jdbc.Driver\n\nspring.datasource.test2.jdbc-url=jdbc:mysql://localhost:3306/test2?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true\nspring.datasource.test2.username=root\nspring.datasource.test2.password=root\nspring.datasource.test2.driver-class-name=com.mysql.cj.jdbc.Driver\n"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-xml-mulidatasource/src/main/resources/mybatis/mapper/test1/UserMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >\n<mapper namespace=\"com.neo.mapper.test1.User1Mapper\" >\n    <resultMap id=\"BaseResultMap\" type=\"com.neo.model.User\" >\n        <id column=\"id\" property=\"id\" jdbcType=\"BIGINT\" />\n        <result column=\"userName\" property=\"userName\" jdbcType=\"VARCHAR\" />\n        <result column=\"passWord\" property=\"passWord\" jdbcType=\"VARCHAR\" />\n        <result column=\"user_sex\" property=\"userSex\" javaType=\"com.neo.enums.UserSexEnum\"/>\n        <result column=\"nick_name\" property=\"nickName\" jdbcType=\"VARCHAR\" />\n    </resultMap>\n    \n    <sql id=\"Base_Column_List\" >\n        id, userName, passWord, user_sex, nick_name\n    </sql>\n\n    <select id=\"getAll\" resultMap=\"BaseResultMap\"  >\n       SELECT \n       <include refid=\"Base_Column_List\" />\n\t   FROM users\n    </select>\n\n    <select id=\"getOne\" parameterType=\"java.lang.Long\" resultMap=\"BaseResultMap\" >\n        SELECT \n       <include refid=\"Base_Column_List\" />\n\t   FROM users\n\t   WHERE id = #{id}\n    </select>\n\n    <insert id=\"insert\" parameterType=\"com.neo.model.User\" >\n       INSERT INTO \n       \t\tusers\n       \t\t(userName,passWord,user_sex) \n       \tVALUES\n       \t\t(#{userName}, #{passWord}, #{userSex})\n    </insert>\n    \n    <update id=\"update\" parameterType=\"com.neo.model.User\" >\n       UPDATE \n       \t\tusers \n       SET \n       \t<if test=\"userName != null\">userName = #{userName},</if>\n       \t<if test=\"passWord != null\">passWord = #{passWord},</if>\n       \tnick_name = #{nickName}\n       WHERE \n       \t\tid = #{id}\n    </update>\n    \n    <delete id=\"delete\" parameterType=\"java.lang.Long\" >\n       DELETE FROM\n       \t\t users \n       WHERE \n       \t\t id =#{id}\n    </delete>\n\n</mapper>"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-xml-mulidatasource/src/main/resources/mybatis/mapper/test2/UserMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >\n<mapper namespace=\"com.neo.mapper.test2.User2Mapper\" >\n    <resultMap id=\"BaseResultMap\" type=\"com.neo.model.User\" >\n        <id column=\"id\" property=\"id\" jdbcType=\"BIGINT\" />\n        <result column=\"userName\" property=\"userName\" jdbcType=\"VARCHAR\" />\n        <result column=\"passWord\" property=\"passWord\" jdbcType=\"VARCHAR\" />\n        <result column=\"user_sex\" property=\"userSex\" javaType=\"com.neo.enums.UserSexEnum\"/>\n        <result column=\"nick_name\" property=\"nickName\" jdbcType=\"VARCHAR\" />\n    </resultMap>\n    \n    <sql id=\"Base_Column_List\" >\n        id, userName, passWord, user_sex, nick_name\n    </sql>\n\n    <select id=\"getAll\" resultMap=\"BaseResultMap\"  >\n       SELECT \n       <include refid=\"Base_Column_List\" />\n\t   FROM users\n    </select>\n\n    <select id=\"getOne\" parameterType=\"java.lang.Long\" resultMap=\"BaseResultMap\" >\n        SELECT \n       <include refid=\"Base_Column_List\" />\n\t   FROM users\n\t   WHERE id = #{id}\n    </select>\n\n    <insert id=\"insert\" parameterType=\"com.neo.model.User\" >\n       INSERT INTO \n       \t\tusers\n       \t\t(userName,passWord,user_sex) \n       \tVALUES\n       \t\t(#{userName}, #{passWord}, #{userSex})\n    </insert>\n    \n    <update id=\"update\" parameterType=\"com.neo.model.User\" >\n       UPDATE \n       \t\tusers \n       SET \n       \t<if test=\"userName != null\">userName = #{userName},</if>\n       \t<if test=\"passWord != null\">passWord = #{passWord},</if>\n       \tnick_name = #{nickName}\n       WHERE \n       \t\tid = #{id}\n    </update>\n    \n    <delete id=\"delete\" parameterType=\"java.lang.Long\" >\n       DELETE FROM\n       \t\t users \n       WHERE \n       \t\t id =#{id}\n    </delete>\n\n</mapper>"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-xml-mulidatasource/src/main/resources/mybatis/mybatis-config.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE configuration PUBLIC \"-//mybatis.org//DTD Config 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-config.dtd\">\n<configuration>\n\t<typeAliases>\n\t\t<typeAlias alias=\"Integer\" type=\"java.lang.Integer\" />\n\t\t<typeAlias alias=\"Long\" type=\"java.lang.Long\" />\n\t\t<typeAlias alias=\"HashMap\" type=\"java.util.HashMap\" />\n\t\t<typeAlias alias=\"LinkedHashMap\" type=\"java.util.LinkedHashMap\" />\n\t\t<typeAlias alias=\"ArrayList\" type=\"java.util.ArrayList\" />\n\t\t<typeAlias alias=\"LinkedList\" type=\"java.util.LinkedList\" />\n\t</typeAliases>\n</configuration>"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-xml-mulidatasource/src/test/java/com/neo/MXMApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class MXMApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t\tSystem.out.println(\"hello world\");\n\t}\n\n}\n"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-xml-mulidatasource/src/test/java/com/neo/mapper/User1MapperTest.java",
    "content": "package com.neo.mapper;\n\nimport java.util.List;\n\nimport com.neo.mapper.test1.User1Mapper;\nimport org.junit.Assert;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport com.neo.model.User;\nimport com.neo.enums.UserSexEnum;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class User1MapperTest {\n\n\t@Autowired\n\tprivate User1Mapper userMapper;\n\n\t@Test\n\tpublic void testInsert() throws Exception {\n\t\tuserMapper.insert(new User(\"aa\", \"a123456\", UserSexEnum.MAN));\n\t\tuserMapper.insert(new User(\"bb\", \"b123456\", UserSexEnum.WOMAN));\n\t\tuserMapper.insert(new User(\"cc\", \"b123456\", UserSexEnum.WOMAN));\n\n\t\tSystem.out.println(userMapper.getAll().size());\n\t}\n\n\t@Test\n\tpublic void testQuery() throws Exception {\n\t\tList<User> users = userMapper.getAll();\n\t\tif(users==null || users.size()==0){\n\t\t\tSystem.out.println(\"is null\");\n\t\t}else{\n\t\t\tSystem.out.println(users.size());\n\t\t}\n\t}\n\t\n\t\n\t@Test\n\tpublic void testUpdate() throws Exception {\n\t\tLong id =30l;\n\t\tUser user = userMapper.getOne(id);\n\t\tSystem.out.println(user.toString());\n\t\tuser.setNickName(\"neo\");\n\t\tuserMapper.update(user);\n\t\tAssert.assertTrue((\"neo\".equals(userMapper.getOne(id).getNickName())));\n\t}\n\n}"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-xml-mulidatasource/src/test/java/com/neo/mapper/User2MapperTest.java",
    "content": "package com.neo.mapper;\n\nimport com.neo.model.User;\nimport com.neo.enums.UserSexEnum;\nimport com.neo.mapper.test2.User2Mapper;\nimport org.junit.Assert;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport java.util.List;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class User2MapperTest {\n\n\t@Autowired\n\tprivate User2Mapper userMapper;\n\n\t@Test\n\tpublic void testInsert() throws Exception {\n\t\tuserMapper.insert(new User(\"aa\", \"a123456\", UserSexEnum.MAN));\n\t\tuserMapper.insert(new User(\"bb\", \"b123456\", UserSexEnum.WOMAN));\n\t\tuserMapper.insert(new User(\"cc\", \"b123456\", UserSexEnum.WOMAN));\n\n\t\tSystem.out.println(userMapper.getAll().size());\n\t}\n\n\t@Test\n\tpublic void testQuery() throws Exception {\n\t\tList<User> users = userMapper.getAll();\n\t\tif(users==null || users.size()==0){\n\t\t\tSystem.out.println(\"is null\");\n\t\t}else{\n\t\t\tSystem.out.println(users.toString());\n\t\t}\n\t}\n\t\n\t\n\t@Test\n\tpublic void testUpdate() throws Exception {\n\t\tLong id =30l;\n\t\tUser user = userMapper.getOne(id);\n\t\tSystem.out.println(user.toString());\n\t\tuser.setNickName(\"neo\");\n\t\tuserMapper.update(user);\n\t\tAssert.assertTrue((\"neo\".equals(userMapper.getOne(id).getNickName())));\n\t}\n\n}"
  },
  {
    "path": "spring-boot-mybatis/spring-boot-mybatis-xml-mulidatasource/users.sql",
    "content": "/*\nNavicat MySQL Data Transfer\n\nSource Server         : 本地\nSource Server Version : 50505\nSource Host           : localhost:3306\nSource Database       : test1\n\nTarget Server Type    : MYSQL\nTarget Server Version : 50505\nFile Encoding         : 65001\n\nDate: 2016-11-05 21:17:33\n*/\n\nSET FOREIGN_KEY_CHECKS=0;\n\n-- ----------------------------\n-- Table structure for `users`\n-- ----------------------------\nDROP TABLE IF EXISTS `users`;\nCREATE TABLE `users` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',\n  `userName` varchar(32) DEFAULT NULL COMMENT '用户名',\n  `passWord` varchar(32) DEFAULT NULL COMMENT '密码',\n  `user_sex` varchar(32) DEFAULT NULL,\n  `nick_name` varchar(32) DEFAULT NULL,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8;\n\n"
  },
  {
    "path": "spring-boot-package/spring-boot-package/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-package</artifactId>\n\t<version>1.0.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-package</name>\n\t<description>Demo project for Spring Boot package war</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>3.0.0</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>17</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-web</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.junit.vintage</groupId>\n\t\t\t<artifactId>junit-vintage-engine</artifactId>\n\t\t\t<scope>test</scope>\n\t\t\t<exclusions>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<groupId>org.hamcrest</groupId>\n\t\t\t\t\t<artifactId>hamcrest-core</artifactId>\n\t\t\t\t</exclusion>\n\t\t\t</exclusions>\n\t\t</dependency>\n\t</dependencies>\n\t\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\t\n\n</project>\n"
  },
  {
    "path": "spring-boot-package/spring-boot-package/src/main/java/com/neo/PackageApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.boot.builder.SpringApplicationBuilder;\nimport org.springframework.boot.web.servlet.support.SpringBootServletInitializer;\n\n@SpringBootApplication\npublic class PackageApplication extends SpringBootServletInitializer {\n\n\t@Override\n\tprotected SpringApplicationBuilder configure(SpringApplicationBuilder application) {\n\t\treturn application.sources(PackageApplication.class);\n\t}\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(PackageApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "spring-boot-package/spring-boot-package/src/main/java/com/neo/controller/HelloController.java",
    "content": "package com.neo.controller;\n\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n@RestController\npublic class HelloController {\n\t\n    @RequestMapping(\"/hello\")\n    public String index() {\n        return \"Hello World\";\n    }\n}"
  },
  {
    "path": "spring-boot-package/spring-boot-package/src/main/resources/application-dev.properties",
    "content": "info.app.name=spring-boot-test\ninfo.app.version= 1.0.0"
  },
  {
    "path": "spring-boot-package/spring-boot-package/src/main/resources/application-pro.properties",
    "content": "info.app.name=spring-boot-pro\ninfo.app.version= 1.0.0"
  },
  {
    "path": "spring-boot-package/spring-boot-package/src/main/resources/application-test.properties",
    "content": "info.app.name=spring-boot-uat\ninfo.app.version= 1.0.0"
  },
  {
    "path": "spring-boot-package/spring-boot-package/src/main/resources/application.properties",
    "content": "# \\u9879\\u76EEcontextPath\\uFF0C\\u4E00\\u822C\\u4E0D\\u914D\\u7F6E\n#server.servlet.context-path=/myspringboot\n# \\u9519\\u8BEF\\u9875\\uFF0C\\u6307\\u5B9A\\u53D1\\u751F\\u9519\\u8BEF\\u65F6\\uFF0C\\u8DF3\\u8F6C\\u7684URL\\u3002\nserver.error.path=/error\n# \\u670D\\u52A1\\u7AEF\\u53E3\nserver.port=8080\n# session\\u6700\\u5927\\u8D85\\u65F6\\u65F6\\u95F4(\\u5206\\u949F)\\uFF0C\\u9ED8\\u8BA4\\u4E3A30\nserver.session-timeout=60\n# \\u8BE5\\u670D\\u52A1\\u7ED1\\u5B9AIP\\u5730\\u5740\\uFF0C\\u542F\\u52A8\\u670D\\u52A1\\u5668\\u65F6\\u5982\\u672C\\u673A\\u4E0D\\u662F\\u8BE5IP\\u5730\\u5740\\u5219\\u629B\\u51FA\\u5F02\\u5E38\\u542F\\u52A8\\u5931\\u8D25\\uFF0C\\u53EA\\u6709\\u7279\\u6B8A\\u9700\\u6C42\\u7684\\u60C5\\u51B5\\u4E0B\\u624D\\u914D\\u7F6E\n#server.address=192.168.0.6\n\n# tomcat \\u6700\\u5927\\u7EBF\\u7A0B\\u6570\\uFF0C\\u9ED8\\u8BA4\\u4E3A200\nserver.tomcat.max-threads=600\n# tomcat\\u7684URI\\u7F16\\u7801\nserver.tomcat.uri-encoding=UTF-8\n# \\u5B58\\u653ETomcat\\u7684\\u65E5\\u5FD7\\u3001Dump\\u7B49\\u6587\\u4EF6\\u7684\\u4E34\\u65F6\\u6587\\u4EF6\\u5939\\uFF0C\\u9ED8\\u8BA4\\u4E3A\\u7CFB\\u7EDF\\u7684tmp\\u6587\\u4EF6\\u5939\nserver.tomcat.basedir=/tmp/log\n# \\u6253\\u5F00Tomcat\\u7684Access\\u65E5\\u5FD7\\uFF0C\\u5E76\\u53EF\\u4EE5\\u8BBE\\u7F6E\\u65E5\\u5FD7\\u683C\\u5F0F\n#server.tomcat.access-log-enabled=true\n#server.tomcat.access-log-pattern=\n# accesslog\\u76EE\\u5F55\\uFF0C\\u9ED8\\u8BA4\\u5728basedir/logs\n#server.tomcat.accesslog.directory=\n# \\u65E5\\u5FD7\\u6587\\u4EF6\\u76EE\\u5F55\nlogging.path=/tmp/log\n# \\u65E5\\u5FD7\\u6587\\u4EF6\\u540D\\u79F0\\uFF0C\\u9ED8\\u8BA4\\u4E3Aspring.log\nlogging.file=myapp.log"
  },
  {
    "path": "spring-boot-package/spring-boot-package/src/test/java/com/neo/PackageApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class PackageApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t}\n\n}\n"
  },
  {
    "path": "spring-boot-package/spring-boot-package/src/test/java/com/neo/controller/HelloTests.java",
    "content": "package com.neo.controller;\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.http.MediaType;\nimport org.springframework.test.context.junit4.SpringRunner;\nimport org.springframework.test.web.servlet.MockMvc;\nimport org.springframework.test.web.servlet.request.MockMvcRequestBuilders;\nimport org.springframework.test.web.servlet.setup.MockMvcBuilders;\n\nimport static org.hamcrest.Matchers.equalTo;\nimport static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;\nimport static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class HelloTests {\n\n\t\n    private MockMvc mvc;\n\n    @Before\n    public void setUp() throws Exception {\n        mvc = MockMvcBuilders.standaloneSetup(new HelloController()).build();\n    }\n\n    @Test\n    public void getHello() throws Exception {\n        mvc.perform(MockMvcRequestBuilders.get(\"/hello\").accept(MediaType.APPLICATION_JSON))\n                .andExpect(status().isOk())\n                .andExpect(content().string(equalTo(\"Hello World\")));\n    }\n\n}"
  },
  {
    "path": "spring-boot-package/spring-boot-package/src/test/java/com/neo/controller/HelloWorldControlerTests.java",
    "content": "package com.neo.controller;\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.http.MediaType;\nimport org.springframework.test.context.junit4.SpringRunner;\nimport org.springframework.test.web.servlet.MockMvc;\nimport org.springframework.test.web.servlet.request.MockMvcRequestBuilders;\nimport org.springframework.test.web.servlet.result.MockMvcResultHandlers;\nimport org.springframework.test.web.servlet.result.MockMvcResultMatchers;\nimport org.springframework.test.web.servlet.setup.MockMvcBuilders;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class HelloWorldControlerTests {\n\n    private MockMvc mvc;\n\n    @Before\n    public void setUp() throws Exception {\n        mvc = MockMvcBuilders.standaloneSetup(new HelloController()).build();\n    }\n\n    @Test\n    public void getHello() throws Exception {\n        mvc.perform(MockMvcRequestBuilders.get(\"/hello\").accept(MediaType.APPLICATION_JSON))\n                .andExpect(MockMvcResultMatchers.status().isOk())\n                .andDo(MockMvcResultHandlers.print())\n                .andReturn();\n    }\n\n}"
  },
  {
    "path": "spring-boot-package/spring-boot-package-war/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-package-war</artifactId>\n\t<version>0.0.1-SNAPSHOT</version>\n\t<packaging>war</packaging>\n\n\t<name>spring-boot-package-war</name>\n\t<description>Demo project for Spring Boot package war</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>3.0.0</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>17</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.junit.vintage</groupId>\n\t\t\t<artifactId>junit-vintage-engine</artifactId>\n\t\t\t<scope>test</scope>\n\t\t\t<exclusions>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<groupId>org.hamcrest</groupId>\n\t\t\t\t\t<artifactId>hamcrest-core</artifactId>\n\t\t\t\t</exclusion>\n\t\t\t</exclusions>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-web</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-tomcat</artifactId>\n\t\t\t<scope>provided</scope>\n\t\t</dependency>\n\t     <dependency>\n\t        <groupId>org.springframework.boot</groupId>\n\t        <artifactId>spring-boot-devtools</artifactId>\n\t        <optional>true</optional>\n\t\t</dependency>\n\t</dependencies>\n\t\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\t\n\n</project>\n"
  },
  {
    "path": "spring-boot-package/spring-boot-package-war/src/main/java/com/neo/Application.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class Application {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(Application.class, args);\n\t}\n}\n"
  },
  {
    "path": "spring-boot-package/spring-boot-package-war/src/main/java/com/neo/ServletInitializer.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.builder.SpringApplicationBuilder;\nimport org.springframework.boot.web.servlet.support.SpringBootServletInitializer;\n\n/**\n * Created by summer on 2017/5/8.\n */\npublic class ServletInitializer extends SpringBootServletInitializer {\n    @Override\n    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {\n        return application.sources(Application.class);\n    }\n}\n"
  },
  {
    "path": "spring-boot-package/spring-boot-package-war/src/main/java/com/neo/controller/HelloWorldController.java",
    "content": "package com.neo.controller;\n\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n@RestController\npublic class HelloWorldController {\n\t\n    @RequestMapping(\"/hello\")\n    public String index() {\n        return \"Hello World\";\n    }\n}"
  },
  {
    "path": "spring-boot-package/spring-boot-package-war/src/main/resources/application.properties",
    "content": ""
  },
  {
    "path": "spring-boot-package/spring-boot-package-war/src/test/java/com/neo/ApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\n\n@RunWith(SpringJUnit4ClassRunner.class)\npublic class ApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t}\n\n}\n"
  },
  {
    "path": "spring-boot-package/spring-boot-package-war/src/test/java/com/neo/controller/HelloTests.java",
    "content": "package com.neo.controller;\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.http.MediaType;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\nimport org.springframework.test.context.web.WebAppConfiguration;\nimport org.springframework.test.web.servlet.MockMvc;\nimport org.springframework.test.web.servlet.request.MockMvcRequestBuilders;\nimport org.springframework.test.web.servlet.setup.MockMvcBuilders;\n\nimport static org.hamcrest.Matchers.equalTo;\nimport static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;\nimport static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;\n\n@RunWith(SpringJUnit4ClassRunner.class)\n@WebAppConfiguration\npublic class HelloTests {\n\n\t\n    private MockMvc mvc;\n\n    @Before\n    public void setUp() throws Exception {\n        mvc = MockMvcBuilders.standaloneSetup(new HelloWorldController()).build();\n    }\n\n    @Test\n    public void getHello() throws Exception {\n        mvc.perform(MockMvcRequestBuilders.get(\"/hello\").accept(MediaType.APPLICATION_JSON))\n                .andExpect(status().isOk())\n                .andExpect(content().string(equalTo(\"Hello World\")));\n    }\n\n}"
  },
  {
    "path": "spring-boot-package/spring-boot-package-war/src/test/java/com/neo/controller/HelloWorldControlerTests.java",
    "content": "package com.neo.controller;\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.http.MediaType;\nimport org.springframework.mock.web.MockServletContext;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\nimport org.springframework.test.context.web.WebAppConfiguration;\nimport org.springframework.test.web.servlet.MockMvc;\nimport org.springframework.test.web.servlet.request.MockMvcRequestBuilders;\nimport org.springframework.test.web.servlet.result.MockMvcResultHandlers;\nimport org.springframework.test.web.servlet.result.MockMvcResultMatchers;\nimport org.springframework.test.web.servlet.setup.MockMvcBuilders;\n\n@RunWith(SpringJUnit4ClassRunner.class)\n@WebAppConfiguration\npublic class HelloWorldControlerTests {\n\n    private MockMvc mvc;\n\n    @Before\n    public void setUp() throws Exception {\n        mvc = MockMvcBuilders.standaloneSetup(new HelloWorldController()).build();\n    }\n\n    @Test\n    public void getHello() throws Exception {\n        mvc.perform(MockMvcRequestBuilders.get(\"/hello\").accept(MediaType.APPLICATION_JSON))\n                .andExpect(MockMvcResultMatchers.status().isOk())\n                .andDo(MockMvcResultHandlers.print())\n                .andReturn();\n    }\n\n}"
  },
  {
    "path": "spring-boot-rabbitmq/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-rabbitmq</artifactId>\n\t<version>1.0.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-rabbitmq</name>\n\t<description>Demo project for Spring Boot and rabbitmq</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>3.0.0</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>17</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-amqp</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.junit.vintage</groupId>\n\t\t\t<artifactId>junit-vintage-engine</artifactId>\n\t\t\t<scope>test</scope>\n\t\t\t<exclusions>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<groupId>org.hamcrest</groupId>\n\t\t\t\t\t<artifactId>hamcrest-core</artifactId>\n\t\t\t\t</exclusion>\n\t\t\t</exclusions>\n\t\t</dependency>\n\t</dependencies>\n\t\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\t\n\n</project>\n"
  },
  {
    "path": "spring-boot-rabbitmq/src/main/java/com/neo/RabbitMQApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class RabbitMQApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(RabbitMQApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "spring-boot-rabbitmq/src/main/java/com/neo/model/User.java",
    "content": "package com.neo.model;\n\nimport java.io.Serializable;\n\n/**\n * Created by summer on 2016/11/29.\n */\npublic class User implements Serializable{\n\n    private String name;\n\n    private String pass;\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public String getPass() {\n        return pass;\n    }\n\n    public void setPass(String pass) {\n        this.pass = pass;\n    }\n\n    @Override\n    public String toString() {\n        return \"User{\" +\n                \"name='\" + name + '\\'' +\n                \", pass='\" + pass + '\\'' +\n                '}';\n    }\n}\n"
  },
  {
    "path": "spring-boot-rabbitmq/src/main/java/com/neo/rabbit/FanoutRabbitConfig.java",
    "content": "package com.neo.rabbit;\n\nimport org.springframework.amqp.core.Binding;\nimport org.springframework.amqp.core.BindingBuilder;\nimport org.springframework.amqp.core.FanoutExchange;\nimport org.springframework.amqp.core.Queue;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n\n@Configuration\npublic class FanoutRabbitConfig {\n\n    @Bean\n    public Queue AMessage() {\n        return new Queue(\"fanout.A\");\n    }\n\n    @Bean\n    public Queue BMessage() {\n        return new Queue(\"fanout.B\");\n    }\n\n    @Bean\n    public Queue CMessage() {\n        return new Queue(\"fanout.C\");\n    }\n\n    @Bean\n    FanoutExchange fanoutExchange() {\n        return new FanoutExchange(\"fanoutExchange\");\n    }\n\n    @Bean\n    Binding bindingExchangeA(Queue AMessage,FanoutExchange fanoutExchange) {\n        return BindingBuilder.bind(AMessage).to(fanoutExchange);\n    }\n\n    @Bean\n    Binding bindingExchangeB(Queue BMessage, FanoutExchange fanoutExchange) {\n        return BindingBuilder.bind(BMessage).to(fanoutExchange);\n    }\n\n    @Bean\n    Binding bindingExchangeC(Queue CMessage, FanoutExchange fanoutExchange) {\n        return BindingBuilder.bind(CMessage).to(fanoutExchange);\n    }\n\n}\n"
  },
  {
    "path": "spring-boot-rabbitmq/src/main/java/com/neo/rabbit/RabbitConfig.java",
    "content": "package com.neo.rabbit;\n\nimport org.springframework.amqp.core.Queue;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n\n@Configuration\npublic class RabbitConfig {\n\n    @Bean\n    public Queue helloQueue() {\n        return new Queue(\"hello\");\n    }\n\n    @Bean\n    public Queue neoQueue() {\n        return new Queue(\"neo\");\n    }\n\n    @Bean\n    public Queue objectQueue() {\n        return new Queue(\"object\");\n    }\n\n\n}\n"
  },
  {
    "path": "spring-boot-rabbitmq/src/main/java/com/neo/rabbit/TopicRabbitConfig.java",
    "content": "package com.neo.rabbit;\n\nimport org.springframework.amqp.core.Binding;\nimport org.springframework.amqp.core.BindingBuilder;\nimport org.springframework.amqp.core.Queue;\nimport org.springframework.amqp.core.TopicExchange;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n\n@Configuration\npublic class TopicRabbitConfig {\n\n    final static String message = \"topic.message\";\n    final static String messages = \"topic.messages\";\n\n    @Bean\n    public Queue queueMessage() {\n        return new Queue(TopicRabbitConfig.message);\n    }\n\n    @Bean\n    public Queue queueMessages() {\n        return new Queue(TopicRabbitConfig.messages);\n    }\n\n    @Bean\n    TopicExchange exchange() {\n        return new TopicExchange(\"topicExchange\");\n    }\n\n    @Bean\n    Binding bindingExchangeMessage(Queue queueMessage, TopicExchange exchange) {\n        return BindingBuilder.bind(queueMessage).to(exchange).with(\"topic.message\");\n    }\n\n    @Bean\n    Binding bindingExchangeMessages(Queue queueMessages, TopicExchange exchange) {\n        return BindingBuilder.bind(queueMessages).to(exchange).with(\"topic.#\");\n    }\n}\n"
  },
  {
    "path": "spring-boot-rabbitmq/src/main/java/com/neo/rabbit/fanout/FanoutReceiverA.java",
    "content": "package com.neo.rabbit.fanout;\n\nimport org.springframework.amqp.rabbit.annotation.RabbitHandler;\nimport org.springframework.amqp.rabbit.annotation.RabbitListener;\nimport org.springframework.stereotype.Component;\n\n@Component\n@RabbitListener(queues = \"fanout.A\")\npublic class FanoutReceiverA {\n\n    @RabbitHandler\n    public void process(String message) {\n        System.out.println(\"fanout Receiver A  : \" + message);\n    }\n\n}\n"
  },
  {
    "path": "spring-boot-rabbitmq/src/main/java/com/neo/rabbit/fanout/FanoutReceiverB.java",
    "content": "package com.neo.rabbit.fanout;\n\nimport org.springframework.amqp.rabbit.annotation.RabbitHandler;\nimport org.springframework.amqp.rabbit.annotation.RabbitListener;\nimport org.springframework.stereotype.Component;\n\n@Component\n@RabbitListener(queues = \"fanout.B\")\npublic class FanoutReceiverB {\n\n    @RabbitHandler\n    public void process(String message) {\n        System.out.println(\"fanout Receiver B: \" + message);\n    }\n\n}\n"
  },
  {
    "path": "spring-boot-rabbitmq/src/main/java/com/neo/rabbit/fanout/FanoutReceiverC.java",
    "content": "package com.neo.rabbit.fanout;\n\nimport org.springframework.amqp.rabbit.annotation.RabbitHandler;\nimport org.springframework.amqp.rabbit.annotation.RabbitListener;\nimport org.springframework.stereotype.Component;\n\n@Component\n@RabbitListener(queues = \"fanout.C\")\npublic class FanoutReceiverC {\n\n    @RabbitHandler\n    public void process(String message) {\n        System.out.println(\"fanout Receiver C: \" + message);\n    }\n\n}\n"
  },
  {
    "path": "spring-boot-rabbitmq/src/main/java/com/neo/rabbit/fanout/FanoutSender.java",
    "content": "package com.neo.rabbit.fanout;\n\nimport org.springframework.amqp.core.AmqpTemplate;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class FanoutSender {\n\n\t@Autowired\n\tprivate AmqpTemplate rabbitTemplate;\n\n\tpublic void send() {\n\t\tString context = \"hi, fanout msg \";\n\t\tSystem.out.println(\"Sender : \" + context);\n\t\tthis.rabbitTemplate.convertAndSend(\"fanoutExchange\",\"\", context);\n\t}\n\n}"
  },
  {
    "path": "spring-boot-rabbitmq/src/main/java/com/neo/rabbit/hello/HelloReceiver.java",
    "content": "package com.neo.rabbit.hello;\n\nimport org.springframework.amqp.rabbit.annotation.RabbitHandler;\nimport org.springframework.amqp.rabbit.annotation.RabbitListener;\nimport org.springframework.cache.annotation.Cacheable;\nimport org.springframework.stereotype.Component;\n\nimport java.util.Date;\n\n@Component\n@RabbitListener(queues = \"hello\")\npublic class HelloReceiver {\n\n    @RabbitHandler\n    public void process(String hello) {\n        System.out.println(\"Receiver  : \" + hello);\n    }\n\n}\n"
  },
  {
    "path": "spring-boot-rabbitmq/src/main/java/com/neo/rabbit/hello/HelloSender.java",
    "content": "package com.neo.rabbit.hello;\n\nimport org.springframework.amqp.core.AmqpTemplate;\nimport org.springframework.amqp.rabbit.core.RabbitTemplate;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\nimport java.util.Date;\n\n@Component\npublic class HelloSender {\n\n\t@Autowired\n\tprivate AmqpTemplate rabbitTemplate;\n\n\tpublic void send() {\n\t\tString context = \"hello \" + new Date();\n\t\tSystem.out.println(\"Sender : \" + context);\n\t\tthis.rabbitTemplate.convertAndSend(\"hello\", context);\n\t}\n\n}"
  },
  {
    "path": "spring-boot-rabbitmq/src/main/java/com/neo/rabbit/many/NeoReceiver1.java",
    "content": "package com.neo.rabbit.many;\n\nimport org.springframework.amqp.rabbit.annotation.RabbitHandler;\nimport org.springframework.amqp.rabbit.annotation.RabbitListener;\nimport org.springframework.stereotype.Component;\n\n@Component\n@RabbitListener(queues = \"neo\")\npublic class NeoReceiver1 {\n\n    @RabbitHandler\n    public void process(String neo) {\n        System.out.println(\"Receiver 1: \" + neo);\n    }\n\n}\n"
  },
  {
    "path": "spring-boot-rabbitmq/src/main/java/com/neo/rabbit/many/NeoReceiver2.java",
    "content": "package com.neo.rabbit.many;\n\nimport org.springframework.amqp.rabbit.annotation.RabbitHandler;\nimport org.springframework.amqp.rabbit.annotation.RabbitListener;\nimport org.springframework.stereotype.Component;\n\n@Component\n@RabbitListener(queues = \"neo\")\npublic class NeoReceiver2 {\n\n    @RabbitHandler\n    public void process(String neo) {\n        System.out.println(\"Receiver 2: \" + neo);\n    }\n\n}\n"
  },
  {
    "path": "spring-boot-rabbitmq/src/main/java/com/neo/rabbit/many/NeoSender.java",
    "content": "package com.neo.rabbit.many;\n\nimport org.springframework.amqp.core.AmqpTemplate;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class NeoSender {\n\n\t@Autowired\n\tprivate AmqpTemplate rabbitTemplate;\n\n\tpublic void send(int i) {\n\t\tString context = \"spirng boot neo queue\"+\" ****** \"+i;\n\t\tSystem.out.println(\"Sender1 : \" + context);\n\t\tthis.rabbitTemplate.convertAndSend(\"neo\", context);\n\t}\n\n}"
  },
  {
    "path": "spring-boot-rabbitmq/src/main/java/com/neo/rabbit/many/NeoSender2.java",
    "content": "package com.neo.rabbit.many;\n\nimport org.springframework.amqp.core.AmqpTemplate;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class NeoSender2 {\n\n\t@Autowired\n\tprivate AmqpTemplate rabbitTemplate;\n\n\tpublic void send(int i) {\n\t\tString context = \"spirng boot neo queue\"+\" ****** \"+i;\n\t\tSystem.out.println(\"Sender2 : \" + context);\n\t\tthis.rabbitTemplate.convertAndSend(\"neo\", context);\n\t}\n\n}"
  },
  {
    "path": "spring-boot-rabbitmq/src/main/java/com/neo/rabbit/object/ObjectReceiver.java",
    "content": "package com.neo.rabbit.object;\n\nimport com.neo.model.User;\nimport org.springframework.amqp.rabbit.annotation.RabbitHandler;\nimport org.springframework.amqp.rabbit.annotation.RabbitListener;\nimport org.springframework.stereotype.Component;\n\n@Component\n@RabbitListener(queues = \"object\")\npublic class ObjectReceiver {\n\n    @RabbitHandler\n    public void process(User user) {\n        System.out.println(\"Receiver object : \" + user);\n    }\n\n}\n"
  },
  {
    "path": "spring-boot-rabbitmq/src/main/java/com/neo/rabbit/object/ObjectSender.java",
    "content": "package com.neo.rabbit.object;\n\nimport com.neo.model.User;\nimport org.springframework.amqp.core.AmqpTemplate;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\nimport java.util.Date;\n\n@Component\npublic class ObjectSender {\n\n\t@Autowired\n\tprivate AmqpTemplate rabbitTemplate;\n\n\tpublic void send(User user) {\n\t\tSystem.out.println(\"Sender object: \" + user.toString());\n\t\tthis.rabbitTemplate.convertAndSend(\"object\", user);\n\t}\n\n}"
  },
  {
    "path": "spring-boot-rabbitmq/src/main/java/com/neo/rabbit/topic/TopicReceiver.java",
    "content": "package com.neo.rabbit.topic;\n\nimport org.springframework.amqp.rabbit.annotation.RabbitHandler;\nimport org.springframework.amqp.rabbit.annotation.RabbitListener;\nimport org.springframework.stereotype.Component;\n\n@Component\n@RabbitListener(queues = \"topic.message\")\npublic class TopicReceiver {\n\n    @RabbitHandler\n    public void process(String message) {\n        System.out.println(\"Topic Receiver1  : \" + message);\n    }\n\n}\n"
  },
  {
    "path": "spring-boot-rabbitmq/src/main/java/com/neo/rabbit/topic/TopicReceiver2.java",
    "content": "package com.neo.rabbit.topic;\n\nimport org.springframework.amqp.rabbit.annotation.RabbitHandler;\nimport org.springframework.amqp.rabbit.annotation.RabbitListener;\nimport org.springframework.stereotype.Component;\n\n@Component\n@RabbitListener(queues = \"topic.messages\")\npublic class TopicReceiver2 {\n\n    @RabbitHandler\n    public void process(String message) {\n        System.out.println(\"Topic Receiver2  : \" + message);\n    }\n\n}\n"
  },
  {
    "path": "spring-boot-rabbitmq/src/main/java/com/neo/rabbit/topic/TopicSender.java",
    "content": "package com.neo.rabbit.topic;\n\nimport org.springframework.amqp.core.AmqpTemplate;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\nimport java.util.Date;\n\n@Component\npublic class TopicSender {\n\n\t@Autowired\n\tprivate AmqpTemplate rabbitTemplate;\n\n\tpublic void send() {\n\t\tString context = \"hi, i am message all\";\n\t\tSystem.out.println(\"Sender : \" + context);\n\t\tthis.rabbitTemplate.convertAndSend(\"topicExchange\", \"topic.1\", context);\n\t}\n\n\tpublic void send1() {\n\t\tString context = \"hi, i am message 1\";\n\t\tSystem.out.println(\"Sender : \" + context);\n\t\tthis.rabbitTemplate.convertAndSend(\"topicExchange\", \"topic.message\", context);\n\t}\n\n\tpublic void send2() {\n\t\tString context = \"hi, i am messages 2\";\n\t\tSystem.out.println(\"Sender : \" + context);\n\t\tthis.rabbitTemplate.convertAndSend(\"topicExchange\", \"topic.messages\", context);\n\t}\n\n}"
  },
  {
    "path": "spring-boot-rabbitmq/src/main/resources/application.properties",
    "content": "spring.application.name=spring-boot-rabbitmq\n\nspring.rabbitmq.host=192.0.0.6\nspring.rabbitmq.port=5672\nspring.rabbitmq.username=admin\nspring.rabbitmq.password=admin\n\n"
  },
  {
    "path": "spring-boot-rabbitmq/src/test/java/com/neo/RabbitMQApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class RabbitMQApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t\tSystem.out.println(\"hello world\");\n\t}\n\n}\n"
  },
  {
    "path": "spring-boot-rabbitmq/src/test/java/com/neo/rabbitmq/FanoutTest.java",
    "content": "package com.neo.rabbitmq;\n\nimport com.neo.rabbit.fanout.FanoutSender;\nimport com.neo.rabbit.topic.TopicSender;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class FanoutTest {\n\n\t@Autowired\n\tprivate FanoutSender sender;\n\n\t@Test\n\tpublic void fanoutSender() throws Exception {\n\t\tsender.send();\n\t}\n\n\n}"
  },
  {
    "path": "spring-boot-rabbitmq/src/test/java/com/neo/rabbitmq/HelloTest.java",
    "content": "package com.neo.rabbitmq;\n\nimport com.neo.rabbit.hello.HelloSender;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class HelloTest {\n\n\t@Autowired\n\tprivate HelloSender helloSender;\n\n\t@Test\n\tpublic void hello() throws Exception {\n\t\thelloSender.send();\n\t}\n\n\n}"
  },
  {
    "path": "spring-boot-rabbitmq/src/test/java/com/neo/rabbitmq/ManyTest.java",
    "content": "package com.neo.rabbitmq;\n\nimport com.neo.rabbit.many.NeoSender;\nimport com.neo.rabbit.many.NeoSender2;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class ManyTest {\n\t@Autowired\n\tprivate NeoSender neoSender;\n\n\t@Autowired\n\tprivate NeoSender2 neoSender2;\n\n\t@Test\n\tpublic void oneToMany() throws Exception {\n\t\tfor (int i=0;i<100;i++){\n\t\t\tneoSender.send(i);\n\t\t}\n\t}\n\n\t@Test\n\tpublic void manyToMany() throws Exception {\n\t\tfor (int i=0;i<100;i++){\n\t\t\tneoSender.send(i);\n\t\t\tneoSender2.send(i);\n\t\t}\n\t}\n\n}"
  },
  {
    "path": "spring-boot-rabbitmq/src/test/java/com/neo/rabbitmq/ObjectTest.java",
    "content": "package com.neo.rabbitmq;\n\nimport com.neo.model.User;\nimport com.neo.rabbit.object.ObjectSender;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class ObjectTest {\n\n\t@Autowired\n\tprivate ObjectSender sender;\n\n\t@Test\n\tpublic void sendOject() throws Exception {\n\t\tUser user=new User();\n\t\tuser.setName(\"neo\");\n\t\tuser.setPass(\"123456\");\n\t\tsender.send(user);\n\t}\n\n}"
  },
  {
    "path": "spring-boot-rabbitmq/src/test/java/com/neo/rabbitmq/TopicTest.java",
    "content": "package com.neo.rabbitmq;\n\nimport com.neo.rabbit.topic.TopicSender;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class TopicTest {\n\n\t@Autowired\n\tprivate TopicSender sender;\n\n\t@Test\n\tpublic void topic() throws Exception {\n\t\tsender.send();\n\t}\n\n\t@Test\n\tpublic void topic1() throws Exception {\n\t\tsender.send1();\n\t}\n\n\t@Test\n\tpublic void topic2() throws Exception {\n\t\tsender.send2();\n\t}\n\n}"
  },
  {
    "path": "spring-boot-redis/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-redis</artifactId>\n\t<version>3.0.0-SNAPSHOT</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-redis</name>\n\t<description>Demo project for Spring Boot</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>3.0.0</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>17</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-data-redis</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.apache.commons</groupId>\n\t\t\t<artifactId>commons-pool2</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-web</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.session</groupId>\n\t\t\t<artifactId>spring-session-data-redis</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.junit.vintage</groupId>\n\t\t\t<artifactId>junit-vintage-engine</artifactId>\n\t\t\t<scope>test</scope>\n\t\t\t<exclusions>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<groupId>org.hamcrest</groupId>\n\t\t\t\t\t<artifactId>hamcrest-core</artifactId>\n\t\t\t\t</exclusion>\n\t\t\t</exclusions>\n\t\t</dependency>\n\t</dependencies>\n\t\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\t\n\n</project>\n"
  },
  {
    "path": "spring-boot-redis/src/main/java/com/neo/RedisApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class RedisApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(RedisApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "spring-boot-redis/src/main/java/com/neo/config/RedisConfig.java",
    "content": "package com.neo.config;\n\nimport java.lang.reflect.Method;\n\nimport org.springframework.cache.CacheManager;\nimport org.springframework.cache.annotation.CachingConfigurerSupport;\nimport org.springframework.cache.annotation.EnableCaching;\nimport org.springframework.cache.interceptor.KeyGenerator;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.data.redis.cache.RedisCacheManager;\nimport org.springframework.data.redis.core.RedisTemplate;\n\n\n@Configuration\n@EnableCaching\npublic class RedisConfig extends CachingConfigurerSupport{\n\t\n\t@Bean\n\tpublic KeyGenerator keyGenerator() {\n        return new KeyGenerator() {\n            @Override\n            public Object generate(Object target, Method method, Object... params) {\n                StringBuilder sb = new StringBuilder();\n                sb.append(target.getClass().getName());\n                sb.append(method.getName());\n                for (Object obj : params) {\n                    sb.append(obj.toString());\n                }\n                return sb.toString();\n            }\n        };\n    }\n}"
  },
  {
    "path": "spring-boot-redis/src/main/java/com/neo/config/SessionConfig.java",
    "content": "package com.neo.config;\n\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;\n\n@Configuration\n@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 86400*30)\npublic class SessionConfig {\n}"
  },
  {
    "path": "spring-boot-redis/src/main/java/com/neo/model/User.java",
    "content": "package com.neo.model;\n\nimport java.io.Serializable;\n\n\n\npublic class User implements Serializable {\n\n\tprivate static final long serialVersionUID = 1L;\n\tprivate Long id;\n\tprivate String userName;\n\tprivate String password;\n\tprivate String email;\n\tprivate String nickname;\n\tprivate String regTime;\n\n\tpublic User() {\n\t\tsuper();\n\t}\n\tpublic User(String email, String nickname, String password, String userName, String regTime) {\n\t\tsuper();\n\t\tthis.email = email;\n\t\tthis.nickname = nickname;\n\t\tthis.password = password;\n\t\tthis.userName = userName;\n\t\tthis.regTime = regTime;\n\t}\n\n\tpublic Long getId() {\n\t\treturn id;\n\t}\n\n\tpublic void setId(Long id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic String getUserName() {\n\t\treturn userName;\n\t}\n\n\tpublic void setUserName(String userName) {\n\t\tthis.userName = userName;\n\t}\n\n\tpublic String getPassword() {\n\t\treturn password;\n\t}\n\n\tpublic void setPassword(String password) {\n\t\tthis.password = password;\n\t}\n\n\tpublic String getEmail() {\n\t\treturn email;\n\t}\n\n\tpublic void setEmail(String email) {\n\t\tthis.email = email;\n\t}\n\n\tpublic String getNickname() {\n\t\treturn nickname;\n\t}\n\n\tpublic void setNickname(String nickname) {\n\t\tthis.nickname = nickname;\n\t}\n\n\tpublic String getRegTime() {\n\t\treturn regTime;\n\t}\n\n\tpublic void setRegTime(String regTime) {\n\t\tthis.regTime = regTime;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\treturn \"User{\" +\n\t\t\t\t\"id=\" + id +\n\t\t\t\t\", userName='\" + userName + '\\'' +\n\t\t\t\t\", password='\" + password + '\\'' +\n\t\t\t\t\", email='\" + email + '\\'' +\n\t\t\t\t\", nickname='\" + nickname + '\\'' +\n\t\t\t\t\", regTime='\" + regTime + '\\'' +\n\t\t\t\t'}';\n\t}\n}"
  },
  {
    "path": "spring-boot-redis/src/main/java/com/neo/web/UserController.java",
    "content": "package com.neo.web;\n\nimport jakarta.servlet.http.HttpSession;\nimport org.springframework.cache.annotation.Cacheable;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport com.neo.model.User;\n\nimport java.util.UUID;\n\n@RestController\npublic class UserController {\n\n    @RequestMapping(\"/getUser\")\n    @Cacheable(value=\"user-key\")\n    public User getUser() {\n        User user=new User(\"aa@126.com\", \"aa\", \"aa123456\", \"aa\",\"123\");\n        System.out.println(\"若下面没出现“无缓存的时候调用”字样且能打印出数据表示测试成功\");\n        return user;\n    }\n\n\n    @RequestMapping(\"/uid\")\n    String uid(HttpSession session) {\n        UUID uid = (UUID) session.getAttribute(\"uid\");\n        if (uid == null) {\n            uid = UUID.randomUUID();\n        }\n        session.setAttribute(\"uid\", uid);\n        return session.getId();\n    }\n}"
  },
  {
    "path": "spring-boot-redis/src/main/resources/application.properties",
    "content": "# REDIS\n# Redis\\u6570\\u636E\\u5E93\\u7D22\\u5F15\\uFF08\\u9ED8\\u8BA4\\u4E3A0\\uFF09\nspring.redis.database=0  \n# Redis\\u670D\\u52A1\\u5668\\u5730\\u5740\nspring.redis.host=localhost\n# Redis\\u670D\\u52A1\\u5668\\u8FDE\\u63A5\\u7AEF\\u53E3\nspring.redis.port=6379  \n# Redis\\u670D\\u52A1\\u5668\\u8FDE\\u63A5\\u5BC6\\u7801\\uFF08\\u9ED8\\u8BA4\\u4E3A\\u7A7A\\uFF09\nspring.redis.password=\n# \\u8FDE\\u63A5\\u6C60\\u6700\\u5927\\u8FDE\\u63A5\\u6570\\uFF08\\u4F7F\\u7528\\u8D1F\\u503C\\u8868\\u793A\\u6CA1\\u6709\\u9650\\u5236\\uFF09 \\u9ED8\\u8BA4 8\nspring.redis.lettuce.pool.max-active=8\n# \\u8FDE\\u63A5\\u6C60\\u6700\\u5927\\u963B\\u585E\\u7B49\\u5F85\\u65F6\\u95F4\\uFF08\\u4F7F\\u7528\\u8D1F\\u503C\\u8868\\u793A\\u6CA1\\u6709\\u9650\\u5236\\uFF09 \\u9ED8\\u8BA4 -1\nspring.redis.lettuce.pool.max-wait=-1\n# \\u8FDE\\u63A5\\u6C60\\u4E2D\\u7684\\u6700\\u5927\\u7A7A\\u95F2\\u8FDE\\u63A5 \\u9ED8\\u8BA4 8\nspring.redis.lettuce.pool.max-idle=8\n# \\u8FDE\\u63A5\\u6C60\\u4E2D\\u7684\\u6700\\u5C0F\\u7A7A\\u95F2\\u8FDE\\u63A5 \\u9ED8\\u8BA4 0\nspring.redis.lettuce.pool.min-idle=0\n"
  },
  {
    "path": "spring-boot-redis/src/test/java/com/neo/RedisApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class RedisApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t\tSystem.out.println(\"hello web\");\n\t}\n\n}\n"
  },
  {
    "path": "spring-boot-redis/src/test/java/com/neo/TestRedis.java",
    "content": "package com.neo;\n\nimport com.neo.model.User;\nimport org.junit.Assert;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.data.redis.core.RedisTemplate;\nimport org.springframework.data.redis.core.StringRedisTemplate;\nimport org.springframework.data.redis.core.ValueOperations;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport java.util.concurrent.TimeUnit;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class TestRedis {\n\n    @Autowired\n    private StringRedisTemplate stringRedisTemplate;\n    \n\t@Autowired\n    private RedisTemplate redisTemplate;\n\n    @Test\n    public void test() throws Exception {\n        stringRedisTemplate.opsForValue().set(\"aaa\", \"111\");\n        Assert.assertEquals(\"111\", stringRedisTemplate.opsForValue().get(\"aaa\"));\n    }\n    \n    @Test\n    public void testObj() throws Exception {\n        User user=new User(\"aa@126.com\", \"aa\", \"aa123456\", \"aa\",\"123\");\n        ValueOperations<String, User> operations=redisTemplate.opsForValue();\n        operations.set(\"com.neox\", user);\n        operations.set(\"com.neo.f\", user,1, TimeUnit.SECONDS);\n        Thread.sleep(1000);\n        //redisTemplate.delete(\"com.neo.f\");\n        boolean exists=redisTemplate.hasKey(\"com.neo.f\");\n        if(exists){\n        \tSystem.out.println(\"exists is true\");\n        }else{\n        \tSystem.out.println(\"exists is false\");\n        }\n       // Assert.assertEquals(\"aa\", operations.get(\"com.neo.f\").getUserName());\n    }\n}"
  },
  {
    "path": "spring-boot-scheduler/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-scheduler</artifactId>\n\t<version>1.0.0</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-scheduler</name>\n\t<description>Demo project for Spring Boot and scheduler</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>3.0.0</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>17</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.junit.vintage</groupId>\n\t\t\t<artifactId>junit-vintage-engine</artifactId>\n\t\t\t<scope>test</scope>\n\t\t\t<exclusions>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<groupId>org.hamcrest</groupId>\n\t\t\t\t\t<artifactId>hamcrest-core</artifactId>\n\t\t\t\t</exclusion>\n\t\t\t</exclusions>\n\t\t</dependency>\n\t</dependencies>\n\t\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\t\n\n</project>\n"
  },
  {
    "path": "spring-boot-scheduler/src/main/java/com/neo/SchedulerApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.scheduling.annotation.EnableScheduling;\n\n@SpringBootApplication\n@EnableScheduling\npublic class SchedulerApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(SchedulerApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "spring-boot-scheduler/src/main/java/com/neo/task/Scheduler2Task.java",
    "content": "package com.neo.task;\n\nimport org.springframework.scheduling.annotation.Scheduled;\nimport org.springframework.stereotype.Component;\n\nimport java.text.SimpleDateFormat;\nimport java.util.Date;\n\n/**\n * Created by summer on 2016/12/1.\n */\n\n@Component\npublic class Scheduler2Task {\n\n    private static final SimpleDateFormat dateFormat = new SimpleDateFormat(\"HH:mm:ss\");\n\n    @Scheduled(fixedRate = 6000)\n    public void reportCurrentTime() {\n        System.out.println(\"现在时间：\" + dateFormat.format(new Date()));\n    }\n\n}\n"
  },
  {
    "path": "spring-boot-scheduler/src/main/java/com/neo/task/SchedulerTask.java",
    "content": "package com.neo.task;\n\nimport org.springframework.scheduling.annotation.Scheduled;\nimport org.springframework.stereotype.Component;\n\nimport java.util.Date;\n\n/**\n * Created by summer on 2016/12/1.\n */\n\n@Component\npublic class SchedulerTask {\n\n    private int count=0;\n\n    @Scheduled(cron=\"*/6 * * * * ?\")\n    private void process(){\n        System.out.println(\"this is scheduler task runing  \"+(count++));\n    }\n\n}\n"
  },
  {
    "path": "spring-boot-scheduler/src/main/resources/application.properties",
    "content": "spring.application.name=spirng-boot-scheduler\n\n"
  },
  {
    "path": "spring-boot-scheduler/src/test/java/com/neo/SchedulerApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class SchedulerApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t\tSystem.out.println(\"hello world\");\n\t}\n\n}\n"
  },
  {
    "path": "spring-boot-thymeleaf/spring-boot-thymeleaf/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-thymeleaf</artifactId>\n\t<version>0.0.1-SNAPSHOT</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-thymeleaf</name>\n\t<description>Demo project for Spring Boot</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>3.0.0</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>17</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-web</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-thymeleaf</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-devtools</artifactId>\n\t\t\t<scope>runtime</scope>\n\t\t\t<optional>true</optional>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.junit.vintage</groupId>\n\t\t\t<artifactId>junit-vintage-engine</artifactId>\n\t\t\t<scope>test</scope>\n\t\t\t<exclusions>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<groupId>org.hamcrest</groupId>\n\t\t\t\t\t<artifactId>hamcrest-core</artifactId>\n\t\t\t\t</exclusion>\n\t\t\t</exclusions>\n\t\t</dependency>\n\t</dependencies>\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\n\n</project>\n"
  },
  {
    "path": "spring-boot-thymeleaf/spring-boot-thymeleaf/src/main/java/com/neo/ThymeleafApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class ThymeleafApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(ThymeleafApplication.class, args);\n\t}\n\n}\n"
  },
  {
    "path": "spring-boot-thymeleaf/spring-boot-thymeleaf/src/main/java/com/neo/model/User.java",
    "content": "package com.neo.model;\n\n\n\npublic class User {\n    private String name;\n    private int age;\n    private String pass;\n\n    public User(String name, int age, String pass) {\n        this.name = name;\n        this.age = age;\n        this.pass = pass;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public int getAge() {\n        return age;\n    }\n\n    public void setAge(int age) {\n        this.age = age;\n    }\n\n    public String getPass() {\n        return pass;\n    }\n\n    public void setPass(String pass) {\n        this.pass = pass;\n    }\n\n    @Override\n    public String toString() {\n        return (\"name=\" + this.name + \",age=\" + this.age + \",pass=\" + this.pass);\n    }\n}\n"
  },
  {
    "path": "spring-boot-thymeleaf/spring-boot-thymeleaf/src/main/java/com/neo/web/ExampleController.java",
    "content": "package com.neo.web;\n\nimport com.neo.model.User;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.ui.ModelMap;\nimport org.springframework.web.bind.annotation.RequestMapping;\n\nimport java.util.ArrayList;\nimport java.util.Date;\nimport java.util.List;\n\n@Controller\npublic class ExampleController {\n\n    @RequestMapping(\"/string\")\n    public String string(ModelMap map) {\n        map.addAttribute(\"userName\", \"ityouknow\");\n        return \"string\";\n    }\n\n    @RequestMapping(\"/if\")\n    public String ifunless(ModelMap map) {\n        map.addAttribute(\"flag\", \"yes\");\n        return \"if\";\n    }\n\n    @RequestMapping(\"/list\")\n    public String list(ModelMap map) {\n        map.addAttribute(\"users\", getUserList());\n        return \"list\";\n    }\n\n    @RequestMapping(\"/url\")\n    public String url(ModelMap map) {\n        map.addAttribute(\"type\", \"link\");\n        map.addAttribute(\"pageId\", \"springcloud/2017/09/11/\");\n        map.addAttribute(\"img\", \"http://www.ityouknow.com/assets/images/neo.jpg\");\n        return \"url\";\n    }\n\n    @RequestMapping(\"/eq\")\n    public String eq(ModelMap map) {\n        map.addAttribute(\"name\", \"neo\");\n        map.addAttribute(\"age\", 30);\n        map.addAttribute(\"flag\", \"yes\");\n        return \"eq\";\n    }\n\n    @RequestMapping(\"/switch\")\n    public String switchcase(ModelMap map) {\n        map.addAttribute(\"sex\", \"woman\");\n        return \"switch\";\n    }\n\n    private List<User> getUserList(){\n        List<User> list=new ArrayList<User>();\n        User user1=new User(\"大牛\",12,\"123456\");\n        User user2=new User(\"小牛\",6,\"123563\");\n        User user3=new User(\"纯洁的微笑\",66,\"666666\");\n        list.add(user1);\n        list.add(user2);\n        list.add(user3);\n        return  list;\n    }\n\n}"
  },
  {
    "path": "spring-boot-thymeleaf/spring-boot-thymeleaf/src/main/java/com/neo/web/HelloController.java",
    "content": "package com.neo.web;\n\nimport org.springframework.stereotype.Controller;\nimport org.springframework.ui.ModelMap;\nimport org.springframework.web.bind.annotation.RequestMapping;\n\n@Controller\npublic class HelloController {\n\n    @RequestMapping(\"/\")\n    public String index(ModelMap map) {\n        map.addAttribute(\"message\", \"http://www.ityouknow.com\");\n        return \"hello\";\n    }\n\n}"
  },
  {
    "path": "spring-boot-thymeleaf/spring-boot-thymeleaf/src/main/resources/application.properties",
    "content": "spring.thymeleaf.cache=false"
  },
  {
    "path": "spring-boot-thymeleaf/spring-boot-thymeleaf/src/main/resources/templates/eq.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\"  xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"UTF-8\"></meta>\n    <title>Example gt eq  </title>\n</head>\n<body>\n<div >\n    <h1>EQ</h1>\n    <input th:value=\"${name}\"/>\n    <br/>\n    <input th:value=\"${age gt 30 ? '中年':'年轻'}\"/>\n    <br/>\n    <a th:if=\"${flag eq 'yes'}\"  th:href=\"@{http://favorites.ren/}\"> favorites </a>\n</div>\n</body>\n</html>"
  },
  {
    "path": "spring-boot-thymeleaf/spring-boot-thymeleaf/src/main/resources/templates/hello.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"UTF-8\"></meta>\n    <title>Hello</title>\n</head>\n<body>\n<h1  th:text=\"${message}\">Hello World</h1>\n</body>\n</html>"
  },
  {
    "path": "spring-boot-thymeleaf/spring-boot-thymeleaf/src/main/resources/templates/if.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\"  xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"UTF-8\"></meta>\n    <title>Example If/Unless </title>\n</head>\n<body>\n<div >\n    <h1>If/Unless</h1>\n    <a th:if=\"${flag == 'yes'}\"  th:href=\"@{http://favorites.ren/}\"> home </a>\n    <br/>\n    <a th:unless=\"${flag != 'no'}\" th:href=\"@{http://www.ityouknow.com/}\" >ityouknow</a>\n</div>\n</body>\n</html>"
  },
  {
    "path": "spring-boot-thymeleaf/spring-boot-thymeleaf/src/main/resources/templates/list.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\"  xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"UTF-8\"></meta>\n    <title>Example If/Unless </title>\n</head>\n<body>\n<div >\n    <h1>for 循环</h1>\n    <table>\n        <tr  th:each=\"user,iterStat : ${users}\">\n            <td th:text=\"${user.name}\">neo</td>\n            <td th:text=\"${user.age}\">6</td>\n            <td th:text=\"${user.pass}\">213</td>\n            <td th:text=\"${iterStat.index}\">index</td>\n        </tr>\n    </table>\n</div>\n</body>\n</html>"
  },
  {
    "path": "spring-boot-thymeleaf/spring-boot-thymeleaf/src/main/resources/templates/string.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\"  xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"UTF-8\"></meta>\n    <title>Example String </title>\n</head>\n<body>\n    <div >\n        <h1>text</h1>\n        <p th:text=\"${userName}\">neo</p>\n        <span th:text=\"'Welcome to our application, ' + ${userName} + '!'\"></span>\n        <br/>\n        <span th:text=\"|Welcome to our application, ${userName}!|\"></span>\n    </div>\n</body>\n</html>"
  },
  {
    "path": "spring-boot-thymeleaf/spring-boot-thymeleaf/src/main/resources/templates/switch.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\"  xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"UTF-8\"></meta>\n    <title>Example switch </title>\n</head>\n<body>\n<div >\n    <div th:switch=\"${sex}\">\n        <p th:case=\"'woman'\">她是一个姑娘...</p>\n        <p th:case=\"'man'\">这是一个爷们!</p>\n        <!-- *: case的默认的选项 -->\n        <p th:case=\"*\">未知性别的一个家伙。</p>\n    </div>\n</div>\n</body>\n</html>"
  },
  {
    "path": "spring-boot-thymeleaf/spring-boot-thymeleaf/src/main/resources/templates/url.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\"  xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"UTF-8\"></meta>\n    <title>Example If/Unless </title>\n</head>\n<body>\n<div >\n    <h1>URL</h1>\n    <a  th:href=\"@{http://www.ityouknow.com/{type}(type=${type})}\">link1</a>\n    <br/>\n    <a th:href=\"@{http://www.ityouknow.com/{pageId}/can-use-springcloud.html(pageId=${pageId})}\">view</a>\n    <br/>\n    <div th:style=\"'background:url(' + @{${img}} + ');'\">\n        <br/><br/><br/>\n    </div>\n</div>\n</body>\n</html>"
  },
  {
    "path": "spring-boot-thymeleaf/spring-boot-thymeleaf/src/test/java/com/neo/ThymeleafApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class ThymeleafApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t}\n\n}\n"
  },
  {
    "path": "spring-boot-thymeleaf/spring-boot-thymeleaf-layout/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-thymeleaf-layout</artifactId>\n\t<version>0.0.1-SNAPSHOT</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-thymeleaf-layout</name>\n\t<description>Demo project for Spring Boot</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>3.0.0</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>17</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-web</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-thymeleaf</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>nz.net.ultraq.thymeleaf</groupId>\n\t\t\t<artifactId>thymeleaf-layout-dialect</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-devtools</artifactId>\n\t\t\t<scope>runtime</scope>\n\t\t\t<optional>true</optional>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.junit.vintage</groupId>\n\t\t\t<artifactId>junit-vintage-engine</artifactId>\n\t\t\t<scope>test</scope>\n\t\t\t<exclusions>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<groupId>org.hamcrest</groupId>\n\t\t\t\t\t<artifactId>hamcrest-core</artifactId>\n\t\t\t\t</exclusion>\n\t\t\t</exclusions>\n\t\t</dependency>\n\t</dependencies>\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t\t<configuration>\n\t\t\t\t\t<fork>true</fork>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\n\n</project>\n"
  },
  {
    "path": "spring-boot-thymeleaf/spring-boot-thymeleaf-layout/src/main/java/com/neo/TLayoutApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class TLayoutApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(TLayoutApplication.class, args);\n\t}\n\n}\n"
  },
  {
    "path": "spring-boot-thymeleaf/spring-boot-thymeleaf-layout/src/main/java/com/neo/web/IndexController.java",
    "content": "package com.neo.web;\n\nimport org.springframework.stereotype.Controller;\nimport org.springframework.ui.ModelMap;\nimport org.springframework.web.bind.annotation.RequestMapping;\n\n@Controller\npublic class IndexController {\n\n    @RequestMapping(\"/index\")\n    public String index() {\n        return \"index\";\n    }\n\n    @RequestMapping(\"/fragment\")\n    public String fragment() {\n        return \"fragment\";\n    }\n\n    @RequestMapping(\"/layout\")\n    public String layout() {\n        return \"layout\";\n    }\n\n    @RequestMapping(\"/home\")\n    public String home() {\n        return \"home\";\n    }\n\n\n}"
  },
  {
    "path": "spring-boot-thymeleaf/spring-boot-thymeleaf-layout/src/main/resources/application.properties",
    "content": "com.neo.title=\\u7EAF\\u6D01\\u7684\\u5FAE\\u7B11\ncom.neo.description=\\u5206\\u4EAB\\u751F\\u6D3B\\u548C\\u6280\\u672F"
  },
  {
    "path": "spring-boot-thymeleaf/spring-boot-thymeleaf-layout/src/main/resources/templates/base.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<head th:fragment=\"common_header(title,links)\">\n    <title th:replace=\"${title}\">comm title</title>\n\n    <link rel=\"stylesheet\" type=\"text/css\" media=\"all\" th:href=\"@{/css/myapp.css}\">\n    <link rel=\"shortcut icon\" th:href=\"@{/images/favicon.ico}\">\n    <script type=\"text/javascript\" th:src=\"@{/js/myapp.js}\"></script>\n\n    <th:block th:replace=\"${links}\" />\n</head>\n<body>\n\n</body>\n</html>"
  },
  {
    "path": "spring-boot-thymeleaf/spring-boot-thymeleaf-layout/src/main/resources/templates/fragment.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<head th:replace=\"base :: common_header(~{::title},~{::link})\">\n    <title>Fragment - Page</title>\n    <link rel=\"stylesheet\" th:href=\"@{/css/bootstrap.min.css}\">\n    <link rel=\"stylesheet\" th:href=\"@{/cs/fragment.css}\">\n</head>\n<body>\n\n</body>\n</html>"
  },
  {
    "path": "spring-boot-thymeleaf/spring-boot-thymeleaf-layout/src/main/resources/templates/home.html",
    "content": "<html xmlns:th=\"http://www.thymeleaf.org\"  xmlns:layout=\"http://www.ultraq.net.nz/web/thymeleaf/layout\" layout:decorate=\"layout\">\n<head>\n    <meta charset=\"UTF-8\"></meta>\n    <title>Home</title>\n</head>\n<body>\n    <div  layout:fragment=\"content\" >\n        <h2>个性化的内容</h2>\n    </div>\n</body>\n</html>\n"
  },
  {
    "path": "spring-boot-thymeleaf/spring-boot-thymeleaf-layout/src/main/resources/templates/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"UTF-8\"></meta>\n    <title>Index</title>\n</head>\n<body>\n    <div th:insert=\"layout/copyright :: copyright\"></div>\n    <div th:replace=\"layout/copyright :: copyright\"></div>\n</body>\n</html>"
  },
  {
    "path": "spring-boot-thymeleaf/spring-boot-thymeleaf-layout/src/main/resources/templates/layout/copyright.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"UTF-8\"></meta>\n    <title>Title</title>\n</head>\n<body>\n<copyright th:fragment=\"copyright\">\n    &copy; 2018\n</copyright>\n</body>\n</html>"
  },
  {
    "path": "spring-boot-thymeleaf/spring-boot-thymeleaf-layout/src/main/resources/templates/layout/footer.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"UTF-8\"></meta>\n    <title>footer</title>\n</head>\n<body>\n<footer th:fragment=\"footer\">\n    <h1>我是 尾部</h1>\n</footer>\n</body>\n</html>"
  },
  {
    "path": "spring-boot-thymeleaf/spring-boot-thymeleaf-layout/src/main/resources/templates/layout/header.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\"  xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"UTF-8\"></meta>\n    <title>header</title>\n</head>\n<body>\n<header th:fragment=\"header\">\n    <h1>我是 头部</h1>\n</header>\n</body>\n</html>"
  },
  {
    "path": "spring-boot-thymeleaf/spring-boot-thymeleaf-layout/src/main/resources/templates/layout/left.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\"  xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"UTF-8\"></meta>\n    <title>left</title>\n</head>\n<body>\n<left th:fragment=\"left\">\n    <h1>我是 左侧</h1>\n</left>\n</body>\n</html>"
  },
  {
    "path": "spring-boot-thymeleaf/spring-boot-thymeleaf-layout/src/main/resources/templates/layout.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\" xmlns:layout=\"http://www.ultraq.net.nz/web/thymeleaf/layout\">\n<head>\n    <meta charset=\"UTF-8\"></meta>\n    <title>Layout</title>\n</head>\n<body>\n<div >\n    <div th:replace=\"layout/header :: header\"></div>\n    <div th:replace=\"layout/left :: left\"></div>\n    <div layout:fragment=\"content\" > content</div>\n    <div th:replace=\"layout/footer :: footer\"></div>\n</div>\n</body>\n</html>"
  },
  {
    "path": "spring-boot-thymeleaf/spring-boot-thymeleaf-layout/src/test/java/com/neo/TLayoutApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class TLayoutApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t}\n\n}\n"
  },
  {
    "path": "spring-boot-web/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-web</artifactId>\n\t<version>3.0.0-SNAPSHOT</version>\n\t<packaging>war</packaging>\n\n\t<name>spring-boot-web</name>\n\t<description>Demo project for Spring Boot</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>3.0.0</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>17</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-web</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-thymeleaf</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-data-jpa</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>mysql</groupId>\n\t\t\t<artifactId>mysql-connector-java</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.junit.vintage</groupId>\n\t\t\t<artifactId>junit-vintage-engine</artifactId>\n\t\t\t<scope>test</scope>\n\t\t\t<exclusions>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<groupId>org.hamcrest</groupId>\n\t\t\t\t\t<artifactId>hamcrest-core</artifactId>\n\t\t\t\t</exclusion>\n\t\t\t</exclusions>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.webjars.bower</groupId>\n\t\t\t<artifactId>jquery</artifactId>\n\t\t\t<version>3.6.2</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.webjars.bowergithub.twbs</groupId>\n\t\t\t<artifactId>bootstrap</artifactId>\n\t\t\t<version>5.2.3</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t</dependencies>\n\t\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\t\n\n</project>\n"
  },
  {
    "path": "spring-boot-web/src/main/java/com/neo/WebApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class WebApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(WebApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "spring-boot-web/src/main/java/com/neo/WebConfiguration.java",
    "content": "package com.neo;\n\nimport java.io.IOException;\n\nimport jakarta.servlet.Filter;\nimport jakarta.servlet.FilterChain;\nimport jakarta.servlet.FilterConfig;\nimport jakarta.servlet.ServletException;\nimport jakarta.servlet.ServletRequest;\nimport jakarta.servlet.ServletResponse;\nimport jakarta.servlet.http.HttpServletRequest;\n\nimport org.apache.catalina.filters.RemoteIpFilter;\nimport org.springframework.boot.web.servlet.FilterRegistrationBean;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n@Configuration\npublic class WebConfiguration {\n    @Bean\n    public RemoteIpFilter remoteIpFilter() {\n        return new RemoteIpFilter();\n    }\n    \n    @Bean\n    public FilterRegistrationBean testFilterRegistration() {\n\n        FilterRegistrationBean registration = new FilterRegistrationBean();\n        registration.setFilter(new MyFilter());\n        registration.addUrlPatterns(\"/*\");\n        registration.addInitParameter(\"paramName\", \"paramValue\");\n        registration.setName(\"MyFilter\");\n        registration.setOrder(1);\n        return registration;\n    }\n    \n    public class MyFilter implements Filter {\n\t\t@Override\n\t\tpublic void destroy() {\n\t\t\t// TODO Auto-generated method stub\n\t\t}\n\n\t\t@Override\n\t\tpublic void doFilter(ServletRequest srequest, ServletResponse sresponse, FilterChain filterChain)\n\t\t\t\tthrows IOException, ServletException {\n\t\t\t// TODO Auto-generated method stub\n\t\t\tHttpServletRequest request = (HttpServletRequest) srequest;\n\t\t\tSystem.out.println(\"this is MyFilter,url :\"+request.getRequestURI());\n\t\t\tfilterChain.doFilter(srequest, sresponse);\n\t\t}\n\n\t\t@Override\n\t\tpublic void init(FilterConfig arg0) throws ServletException {\n\t\t\t// TODO Auto-generated method stub\n\t\t}\n    }\n}\n\n\n\n"
  },
  {
    "path": "spring-boot-web/src/main/java/com/neo/model/User.java",
    "content": "package com.neo.model;\n\nimport java.io.Serializable;\nimport jakarta.persistence.*;\n\n@Entity\npublic class User implements Serializable {\n\n\tprivate static final long serialVersionUID = 1L;\n\t@Id\n\t@GeneratedValue\n\tprivate Long id;\n\t@Column(nullable = false, unique = true, length = 20)\n\tprivate String userName;\n\t@Column(nullable = false)\n\tprivate String passWord;\n\t@Column(nullable = false, unique = true, length = 30)\n\tprivate String email;\n\t@Column(nullable = true, unique = true, length = 30)\n\tprivate String nickName;\n\t@Column(nullable = false)\n\tprivate String regTime;\n\n\tpublic User() {\n\t\tsuper();\n\t}\n\tpublic User(String nickName,String email,String userName,  String passWord, String regTime) {\n\t\tsuper();\n\t\tthis.email = email;\n\t\tthis.nickName = nickName;\n\t\tthis.passWord = passWord;\n\t\tthis.userName = userName;\n\t\tthis.regTime = regTime;\n\t}\n\tpublic Long getId() {\n\t\treturn id;\n\t}\n\tpublic void setId(Long id) {\n\t\tthis.id = id;\n\t}\n\tpublic String getUserName() {\n\t\treturn userName;\n\t}\n\tpublic void setUserName(String userName) {\n\t\tthis.userName = userName;\n\t}\n\tpublic String getPassWord() {\n\t\treturn passWord;\n\t}\n\tpublic void setPassWord(String passWord) {\n\t\tthis.passWord = passWord;\n\t}\n\tpublic String getEmail() {\n\t\treturn email;\n\t}\n\tpublic void setEmail(String email) {\n\t\tthis.email = email;\n\t}\n\tpublic String getNickName() {\n\t\treturn nickName;\n\t}\n\tpublic void setNickName(String nickName) {\n\t\tthis.nickName = nickName;\n\t}\n\tpublic String getRegTime() {\n\t\treturn regTime;\n\t}\n\tpublic void setRegTime(String regTime) {\n\t\tthis.regTime = regTime;\n\t}\n\n}"
  },
  {
    "path": "spring-boot-web/src/main/java/com/neo/repository/UserRepository.java",
    "content": "package com.neo.repository;\n\nimport com.neo.model.User;\nimport org.springframework.data.jpa.repository.JpaRepository;\n\npublic interface UserRepository extends JpaRepository<User, Long> {\n\n    User findByUserName(String userName);\n\n    User findByUserNameOrEmail(String username, String email);\n    \n}"
  },
  {
    "path": "spring-boot-web/src/main/java/com/neo/util/NeoProperties.java",
    "content": "package com.neo.util;\n\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class NeoProperties {\n\t\n\t@Value(\"${com.neo.title}\")\n\tprivate String title;\n\t@Value(\"${com.neo.description}\")\n\tprivate String description;\n\tpublic String getTitle() {\n\t\treturn title;\n\t}\n\tpublic void setTitle(String title) {\n\t\tthis.title = title;\n\t}\n\tpublic String getDescription() {\n\t\treturn description;\n\t}\n\tpublic void setDescription(String description) {\n\t\tthis.description = description;\n\t}\n\n}\n"
  },
  {
    "path": "spring-boot-web/src/main/java/com/neo/web/HelloController.java",
    "content": "package com.neo.web;\n\nimport java.util.Locale;\nimport java.util.UUID;\n\nimport jakarta.servlet.http.HttpSession;\n\nimport com.neo.model.User;\nimport org.springframework.ui.Model;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n@RestController\npublic class HelloController {\n\t\n    @RequestMapping(\"/hello\")\n\tpublic String hello(Locale locale, Model model) {\n\t\treturn \"Hello World\";\n\t}\n\n\t@RequestMapping(\"/getUser\")\n\tpublic User getUser() {\n\t\tUser user=new User();\n\t\tuser.setUserName(\"小明\");\n\t\tuser.setPassWord(\"xxxx\");\n\t\treturn user;\n\t}\n\n}"
  },
  {
    "path": "spring-boot-web/src/main/java/com/neo/web/ThymeleafController.java",
    "content": "package com.neo.web;\n\nimport java.text.DateFormat;\nimport java.util.Date;\nimport java.util.Locale;\n\nimport org.springframework.stereotype.Controller;\nimport org.springframework.ui.Model;\nimport org.springframework.web.bind.annotation.RequestMapping;\n\n@Controller\npublic class ThymeleafController {\n\t\n    @RequestMapping(\"/hi\")\n\tpublic String hello(Locale locale, Model model) {\n\t\tmodel.addAttribute(\"greeting\", \"Hello!\");\n\n\t\tDate date = new Date();\n\t\tDateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);        \n\t\tString formattedDate = dateFormat.format(date);\n\t\tmodel.addAttribute(\"currentTime\", formattedDate);\n\n\t\treturn \"hello\";\n\t}\n\n}"
  },
  {
    "path": "spring-boot-web/src/main/java/com/neo/web/UserController.java",
    "content": "package com.neo.web;\n\nimport java.util.List;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport com.neo.model.User;\nimport com.neo.repository.UserRepository;\n\n@RestController\npublic class UserController {\n\t\n\t@Autowired\n\tprivate UserRepository userRepository;\n\n    @RequestMapping(\"/add\")\n    public User saveUser(String key) {\n        User user=new User();\n        user.setUserName(\"aa\"+key);\n        user.setEmail(\"ityouknow@126.com\"+key);\n        user.setNickName(\"微笑\"+key);\n        user.setPassWord(\"123456\"+key);\n        user.setRegTime(\"2022-12-20\"+key);\n        userRepository.save(user);\n        return user;\n    }\n\t\n    @RequestMapping(\"/getUserByName\")\n    public User getUserByName() {\n    \tUser user=userRepository.findByUserName(\"aa\");\n    \tSystem.out.println(\"若下面没出现“无缓存的时候调用”字样且能打印出数据表示测试成功\");  \n        return user;\n    }\n    \n    @RequestMapping(\"/getUsers\")\n    public List<User> getUsers() {\n    \tList<User> users=userRepository.findAll();\n    \tSystem.out.println(\"若下面没出现“无缓存的时候调用”字样且能打印出数据表示测试成功\");  \n        return users;\n    }\n}"
  },
  {
    "path": "spring-boot-web/src/main/resources/application.properties",
    "content": "spring.datasource.url=jdbc:mysql://1.1.4.3:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true\nspring.datasource.username=xx\nspring.datasource.password=exxx\nspring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver\nspring.datasource.hikari.maxLifeTime=600000\n\nspring.jpa.properties.hibernate.hbm2ddl.auto=update\n#sql\\u8F93\\u51FA\nspring.jpa.show-sql=true\n#format\\u4E00\\u4E0Bsql\\u8FDB\\u884C\\u8F93\\u51FA\nspring.jpa.properties.hibernate.format_sql=true\nspring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQLDialect\nspring.jpa.open-in-view=true\n\ncom.neo.title=\\u7EAF\\u6D01\\u7684\\u5FAE\\u7B11\ncom.neo.description=\\u5206\\u4EAB\\u751F\\u6D3B\\u548C\\u6280\\u672F"
  },
  {
    "path": "spring-boot-web/src/main/resources/static/css/starter.css",
    "content": "body {\n  padding-top: 50px;\n}\n\n.starter-template {\n  padding: 40px 15px;\n  text-align: center;\n}"
  },
  {
    "path": "spring-boot-web/src/main/resources/templates/hello.html",
    "content": "<html xmlns:th=\"http://www.thymeleaf.org\">\n  <head th:include=\"layout :: htmlhead\" th:with=\"title='Hello'\"></head>\n\n  <body>\n    <div th:replace=\"layout :: navbar\">(navbar)</div>\n\n    <div class=\"container\">\n      <div class=\"starter-template\">\n        <h1>Spring MVC / Thymeleaf / Bootstrap</h1>\n        <p class=\"lead\" th:text=\"${greeting}\">(greeting)</p>\n        <p>The current time is <span th:text=\"${currentTime}\">(time)</span></p>\n      </div>\n    </div>\n\n    <div th:include=\"layout :: footer\" id=\"footer\">(footer)</div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "spring-boot-web/src/main/resources/templates/layout.html",
    "content": "<html xmlns:th=\"http://www.thymeleaf.org\">\n  <head th:fragment=\"htmlhead\">\n    <meta charset=\"utf-8\"></meta>\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"></meta>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"></meta>\n    <meta name=\"description\" content=\"\"></meta>\n    <meta name=\"author\" content=\"\"></meta>\n    <link rel=\"shortcut icon\" type=\"image/png\" th:href=\"@{/images/favicon.png}\"></link>\n\n   \t<title th:text=\"${title}\">(title)</title>\n\n  \t<link th:href=\"@{/webjars/bootstrap/3.0.3/dist/css/bootstrap.css}\" rel=\"stylesheet\"></link>\n  \t<link th:href=\"@{/css/starter.css}\" rel=\"stylesheet\"></link>\n  </head>\n\n  <body>\n    <div th:fragment=\"navbar\" class=\"navbar navbar-inverse navbar-fixed-top\" role=\"navigation\">\n      <div class=\"container\">\n        <div class=\"navbar-header\">\n          <button type=\"button\" class=\"navbar-toggle\" data-toggle=\"collapse\" data-target=\".navbar-collapse\">\n            <span class=\"sr-only\">Toggle navigation</span>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n          </button>\n          <a class=\"navbar-brand\" href=\"#\">Project name</a>\n        </div>\n        <div class=\"collapse navbar-collapse\">\n          <ul class=\"nav navbar-nav\">\n            <li class=\"active\"><a href=\"#\">Home</a></li>\n            <li><a href=\"#about\">About</a></li>\n            <li><a href=\"#contact\">Contact</a></li>\n          </ul>\n        </div>\n      </div>\n    </div>\n\n    <div class=\"container\">\n      <div class=\"starter-template\">\n        <h1>Spring MVC/Thymeleaf/Bootstrap</h1>\n        <p class=\"lead\" th:text=\"${greeting}\">(greeting)</p>\n      </div>\n    </div>\n\n    <div th:fragment=\"footer\" id=\"footer\">\n      <div class=\"container\">\n        <p class=\"muted credit\">Spring MVC/Thymeleaf/Bootstrap Project Template</p>\n      </div>\n      <script th:src=\"@{/webjars/jquery/2.0.3/jquery.min.js}\"></script>\n      <script th:src=\"@{/webjars/bootstrap/3.0.3/js/bootstrap.min.js}\"></script>\n    </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "spring-boot-web/src/test/java/com/neo/WebApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class WebApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t\tSystem.out.println(\"hello web\");\n\t}\n\n}\n"
  },
  {
    "path": "spring-boot-web/src/test/java/com/neo/model/UserRepositoryTests.java",
    "content": "package com.neo.model;\n\nimport java.text.DateFormat;\nimport java.util.Date;\n\nimport com.neo.repository.UserRepository;\nimport org.junit.Assert;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\n\nimport org.springframework.test.context.junit4.SpringRunner;\n\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class UserRepositoryTests {\n\n\t@Autowired\n\tprivate UserRepository userRepository;\n\n\t@Test\n\tpublic void test() throws Exception {\n\t\tDate date = new Date();\n\t\tDateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);        \n\t\tString formattedDate = dateFormat.format(date);\n\t\t\n\t\tuserRepository.save(new User(\"aa1\", \"aa@126.com\", \"aa\", \"aa123456\",formattedDate));\n\t\tuserRepository.save(new User(\"bb2\", \"bb@126.com\", \"bb\", \"bb123456\",formattedDate));\n\t\tuserRepository.save(new User(\"cc3\", \"cc@126.com\", \"cc\", \"cc123456\",formattedDate));\n\n//\t\tAssert.assertEquals(9, userRepository.findAll().size());\n\t\tAssert.assertEquals(\"bb2\", userRepository.findByUserNameOrEmail(\"bb\", \"xxx126.com\").getNickName());\n\t\tuserRepository.delete(userRepository.findByUserName(\"aa\"));\n\t}\n\n}"
  },
  {
    "path": "spring-boot-web/src/test/java/com/neo/web/ProPertiesTest.java",
    "content": "package com.neo.web;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.junit.Assert;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\n\nimport com.neo.util.NeoProperties;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class ProPertiesTest {\n\n\t@Autowired\n    private NeoProperties neoProperties;\n\n    @Test\n    public void getHello() throws Exception {\n    \tSystem.out.println(neoProperties.getTitle());\n        Assert.assertEquals(neoProperties.getTitle(), \"纯洁的微笑\");\n        Assert.assertEquals(neoProperties.getDescription(), \"分享生活和技术\");\n    }\n\n    @Test\n    public void testMap() throws Exception {\n    \tMap<String, Long> orderMinTime=new HashMap<String, Long>();\n    \torderMinTime.get(\"123\");\n    }\n\n}"
  },
  {
    "path": "spring-boot-web-thymeleaf/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\t<artifactId>spring-boot-web-thymeleaf</artifactId>\n\t<name>Spring Boot Web thymeleaf Sample</name>\n\t<description>Spring Boot Web thymeleaf Sample</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>3.0.0</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>17</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<!-- Compile -->\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-web</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-thymeleaf</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-validation</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.junit.vintage</groupId>\n\t\t\t<artifactId>junit-vintage-engine</artifactId>\n\t\t\t<scope>test</scope>\n\t\t\t<exclusions>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<groupId>org.hamcrest</groupId>\n\t\t\t\t\t<artifactId>hamcrest-core</artifactId>\n\t\t\t\t</exclusion>\n\t\t\t</exclusions>\n\t\t</dependency>\n\t</dependencies>\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n</project>\n"
  },
  {
    "path": "spring-boot-web-thymeleaf/src/main/java/com/neo/ThymeleafApplication.java",
    "content": "/*\n * Copyright 2012-2018 the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 本示例参数于：\n * https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples/spring-boot-sample-web-ui\n */\npackage com.neo;\n\nimport com.neo.model.Message;\nimport com.neo.repository.InMemoryMessageRepository;\nimport com.neo.repository.MessageRepository;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.core.convert.converter.Converter;\n\n\n@SpringBootApplication\npublic class ThymeleafApplication {\n\n\t@Bean\n\tpublic MessageRepository messageRepository() {\n\t\treturn new InMemoryMessageRepository();\n\t}\n\n\t@Bean\n\tpublic Converter<String, Message> messageConverter() {\n\t\treturn new Converter<String, Message>() {\n\t\t\t@Override\n\t\t\tpublic Message convert(String id) {\n\t\t\t\treturn messageRepository().findMessage(Long.valueOf(id));\n\t\t\t}\n\t\t};\n\t}\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(ThymeleafApplication.class, args);\n\t}\n\n}\n"
  },
  {
    "path": "spring-boot-web-thymeleaf/src/main/java/com/neo/controller/MessageController.java",
    "content": "\npackage com.neo.controller;\n\nimport jakarta.validation.Valid;\n\nimport com.neo.model.Message;\nimport com.neo.repository.MessageRepository;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.validation.BindingResult;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.ModelAttribute;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.servlet.ModelAndView;\nimport org.springframework.web.servlet.mvc.support.RedirectAttributes;\n\n@Controller\n@RequestMapping(\"/\")\npublic class MessageController {\n\n\tprivate final MessageRepository messageRepository;\n\n\tpublic MessageController(MessageRepository messageRepository) {\n\t\tthis.messageRepository = messageRepository;\n\t}\n\n\t@GetMapping\n\tpublic ModelAndView list() {\n\t\tIterable<Message> messages = this.messageRepository.findAll();\n\t\treturn new ModelAndView(\"messages/list\", \"messages\", messages);\n\t}\n\n\t@GetMapping(\"{id}\")\n\tpublic ModelAndView view(@PathVariable(\"id\") Message message) {\n\t\treturn new ModelAndView(\"messages/view\", \"message\", message);\n\t}\n\n\t@GetMapping(params = \"form\")\n\tpublic String createForm(@ModelAttribute Message message) {\n\t\treturn \"messages/form\";\n\t}\n\n\t@PostMapping\n\tpublic ModelAndView create(@Valid Message message, BindingResult result,\n\t\t\tRedirectAttributes redirect) {\n\t\tif (result.hasErrors()) {\n\t\t\treturn new ModelAndView(\"messages/form\", \"formErrors\", result.getAllErrors());\n\t\t}\n\t\tmessage = this.messageRepository.save(message);\n\t\tredirect.addFlashAttribute(\"globalMessage\", \"Successfully created a new message\");\n\t\treturn new ModelAndView(\"redirect:/{message.id}\", \"message.id\", message.getId());\n\t}\n\n\t@RequestMapping(\"foo\")\n\tpublic String foo() {\n\t\tthrow new RuntimeException(\"Expected exception in controller\");\n\t}\n\n\t@GetMapping(value = \"delete/{id}\")\n\tpublic ModelAndView delete(@PathVariable(\"id\") Long id) {\n\t\tthis.messageRepository.deleteMessage(id);\n\t\tIterable<Message> messages = this.messageRepository.findAll();\n\t\treturn new ModelAndView(\"messages/list\", \"messages\", messages);\n\t}\n\n\t@GetMapping(value = \"modify/{id}\")\n\tpublic ModelAndView modifyForm(@PathVariable(\"id\") Message message) {\n\t\treturn new ModelAndView(\"messages/form\", \"message\", message);\n\t}\n\n}\n"
  },
  {
    "path": "spring-boot-web-thymeleaf/src/main/java/com/neo/model/Message.java",
    "content": "package com.neo.model;\n\nimport jakarta.validation.constraints.NotEmpty;\n\nimport java.util.Calendar;\n\npublic class Message {\n\n\tprivate Long id;\n\n\t@NotEmpty(message = \"Text is required.\")\n\tprivate String text;\n\n\t@NotEmpty(message = \"Summary is required.\")\n\tprivate String summary;\n\n\tprivate Calendar created = Calendar.getInstance();\n\n\tpublic Long getId() {\n\t\treturn this.id;\n\t}\n\n\tpublic void setId(Long id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic Calendar getCreated() {\n\t\treturn this.created;\n\t}\n\n\tpublic void setCreated(Calendar created) {\n\t\tthis.created = created;\n\t}\n\n\tpublic String getText() {\n\t\treturn this.text;\n\t}\n\n\tpublic void setText(String text) {\n\t\tthis.text = text;\n\t}\n\n\tpublic String getSummary() {\n\t\treturn this.summary;\n\t}\n\n\tpublic void setSummary(String summary) {\n\t\tthis.summary = summary;\n\t}\n\n}\n"
  },
  {
    "path": "spring-boot-web-thymeleaf/src/main/java/com/neo/repository/InMemoryMessageRepository.java",
    "content": "\n\npackage com.neo.repository;\n\nimport com.neo.model.Message;\n\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.concurrent.ConcurrentMap;\nimport java.util.concurrent.atomic.AtomicLong;\n\n\npublic class InMemoryMessageRepository implements MessageRepository {\n\n\tprivate static AtomicLong counter = new AtomicLong();\n\n\tprivate final ConcurrentMap<Long, Message> messages = new ConcurrentHashMap<>();\n\n\t@Override\n\tpublic Iterable<Message> findAll() {\n\t\treturn this.messages.values();\n\t}\n\n\t@Override\n\tpublic Message save(Message message) {\n\t\tLong id = message.getId();\n\t\tif (id == null) {\n\t\t\tid = counter.incrementAndGet();\n\t\t\tmessage.setId(id);\n\t\t}\n\t\tthis.messages.put(id, message);\n\t\treturn message;\n\t}\n\n\t@Override\n\tpublic Message findMessage(Long id) {\n\t\treturn this.messages.get(id);\n\t}\n\n\t@Override\n\tpublic void deleteMessage(Long id) {\n\t\tthis.messages.remove(id);\n\t}\n\n}\n"
  },
  {
    "path": "spring-boot-web-thymeleaf/src/main/java/com/neo/repository/MessageRepository.java",
    "content": "\npackage com.neo.repository;\n\nimport com.neo.model.Message;\n\npublic interface MessageRepository {\n\n\tIterable<Message> findAll();\n\n\tMessage save(Message message);\n\n\tMessage findMessage(Long id);\n\n\tvoid deleteMessage(Long id);\n\n}\n"
  },
  {
    "path": "spring-boot-web-thymeleaf/src/main/resources/application.properties",
    "content": "# Allow Thymeleaf templates to be reloaded at dev time\nspring.thymeleaf.cache: false\nserver.tomcat.access_log_enabled: true\nserver.tomcat.basedir: target/tomcat"
  },
  {
    "path": "spring-boot-web-thymeleaf/src/main/resources/logback.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration>\n\n\t<include resource=\"org/springframework/boot/logging/logback/base.xml\"/>\n\n\t<!-- logger name=\"org.springframework\" level=\"DEBUG\"/-->\n\n</configuration>\n"
  },
  {
    "path": "spring-boot-web-thymeleaf/src/main/resources/templates/fragments.html",
    "content": "<!DOCTYPE html>\n<html xmlns:th=\"http://www.thymeleaf.org\">\n\t<head th:fragment=\"head (title)\">\n\t\t<title th:text=\"${title}\">Fragments</title>\n\t\t<link rel=\"stylesheet\" th:href=\"@{/css/bootstrap.min.css}\"\n\t\t\thref=\"../../css/bootstrap.min.css\" />\n\t</head>\n\t<body>\n\t\t<div class=\"container\">\n\t\t\t<nav th:fragment=\"navbar\" class=\"navbar navbar-dark bg-primary\">\n\t\t\t\t<a class=\"navbar-brand\" href=\"http://www.ityouknow.com\">Ityouknow</a>\n\t\t\t\t<ul class=\"navbar-nav mr-auto mt-2 mt-lg-0\">\n\t\t\t\t\t<li class=\"nav-item\"><a class=\"nav-link\" th:href=\"@{/}\" href=\"messages.html\">Messages</a></li>\n\t\t\t\t</ul>\n\t\t\t</nav>\n\t\t</div>\n\t</body>\n</html>\n"
  },
  {
    "path": "spring-boot-web-thymeleaf/src/main/resources/templates/messages/form.html",
    "content": "<!DOCTYPE html>\n<html xmlns:th=\"http://www.thymeleaf.org\">\n\t<head th:replace=\"~{fragments :: head(title=~{::title/text()})}\">\n\t\t<title>Messages : Create</title>\n\t</head>\n\t<body>\n\t\t<div class=\"container\">\n\t\t\t<div th:replace=\"~{fragments :: navbar}\"></div>\n\t\t\t<div class=\"float-right mt-2\">\n\t\t\t\t<a class=\"btn btn-primary btn-sm\" th:href=\"@{/}\" href=\"messages.html\"> Messages </a>\n\t\t\t</div>\n\t\t\t<h4 class=\"float-left mt-2\">Messages : Create</h4>\n\t\t\t<div class=\"clearfix\"></div>\n\t\t\t<form id=\"messageForm\" th:action=\"@{/(form)}\" th:object=\"${message}\" action=\"#\" method=\"post\">\n\t\t\t\t<div th:if=\"${#fields.hasErrors('*')}\" class=\"alert alert-danger\" role=\"alert\">\n\t\t\t\t\t<p th:each=\"error : ${#fields.errors('*')}\" class=\"m-0\" th:text=\"${error}\">Validation error</p>\n\t\t\t\t</div>\n\t\t\t\t<input type=\"hidden\" th:field=\"*{id}\" th:class=\"${'form-control' + (#fields.hasErrors('id') ? ' is-invalid' : '')}\"/>\n\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t<label for=\"summary\">Summary</label>\n\t\t\t\t\t<input type=\"text\" th:field=\"*{summary}\" th:class=\"${'form-control' + (#fields.hasErrors('summary') ? ' is-invalid' : '')}\">\n\t\t\t\t</div>\n\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t<label for=\"text\">Message</label>\n\t\t\t\t\t<textarea th:field=\"*{text}\" th:class=\"${'form-control' + (#fields.hasErrors('text') ? ' is-invalid' : '')}\"></textarea>\n\t\t\t\t</div>\n\t\t\t\t<button type=\"submit\" class=\"btn btn-primary\">Submit</button>\n\t\t\t</form>\n\t\t</div>\n\t</body>\n</html>\n"
  },
  {
    "path": "spring-boot-web-thymeleaf/src/main/resources/templates/messages/list.html",
    "content": "<!DOCTYPE html>\n<html xmlns:th=\"http://www.thymeleaf.org\">\n\t<head th:replace=\"~{fragments :: head(title=~{::title/text()})}\">\n\t\t<title>Messages : View all</title>\n\t</head>\n\t<body>\n\t\t<div class=\"container\">\n\t\t\t<div th:replace=\"~{fragments :: navbar}\"></div>\n\t\t\t<div class=\"float-right mt-2\">\n\t\t\t\t<a class=\"btn btn-primary btn-sm\" href=\"form.html\" th:href=\"@{/(form)}\">Create Message</a>\n\t\t\t</div>\n\t\t\t<h4 class=\"float-left mt-2\">Messages : View all</h4>\n\t\t\t<table class=\"table table-bordered table-striped\">\n\t\t\t\t<thead>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<th>ID</th>\n\t\t\t\t\t\t<th>Created</th>\n\t\t\t\t\t\t<th>Summary</th>\n\t\t\t\t\t</tr>\n\t\t\t\t</thead>\n\t\t\t\t<tbody>\n\t\t\t\t\t<tr th:if=\"${messages.empty}\">\n\t\t\t\t\t\t<td colspan=\"3\">No messages</td>\n\t\t\t\t\t</tr>\n\t\t\t\t\t<tr th:each=\"message : ${messages}\">\n\t\t\t\t\t\t<td th:text=\"${message.id}\">1</td>\n\t\t\t\t\t\t<td th:text=\"${#calendars.format(message.created)}\">July 11,\n\t\t\t\t\t\t\t2012 2:17:16 PM CDT</td>\n\t\t\t\t\t\t<td><a href=\"view.html\" th:href=\"@{'/' + ${message.id}}\"\n\t\t\t\t\t\t\tth:text=\"${message.summary}\"> The summary </a></td>\n\t\t\t\t\t</tr>\n\t\t\t\t</tbody>\n\t\t\t</table>\n\t\t</div>\n\t</body>\n</html>\n"
  },
  {
    "path": "spring-boot-web-thymeleaf/src/main/resources/templates/messages/view.html",
    "content": "<!DOCTYPE html>\n<html xmlns:th=\"http://www.thymeleaf.org\">\n\t<head th:replace=\"~{fragments :: head(title=~{::title/text()})}\">\n\t\t<title>Messages : View</title>\n\t</head>\n\t<body>\n\t\t<div class=\"container\">\n\t\t\t<div th:replace=\"~{fragments :: navbar}\"></div>\n\t\t\t<div class=\"float-right mt-2\">\n\t\t\t\t<a class=\"btn btn-primary btn-sm\" href=\"list.html\" th:href=\"@{/}\">Messages</a>\n\t\t\t</div>\n\t\t\t<h4 class=\"float-left mt-2\">Messages : View</h4>\n\t\t\t<div class=\"clearfix\"></div>\n\t\t\t<div class=\"alert alert-success\" th:if=\"${globalMessage}\" th:text=\"${globalMessage}\">Some Success message\n\t\t\t</div>\n\t\t\t<div class=\"card\">\n\t\t\t\t<div class=\"card-body\">\n\t\t\t\t\t<h4 class=\"card-title\" th:text=\"${message.id + ': ' + message.summary}\">123 - A short summary...</h4>\n\t\t\t\t\t<h6 class=\"card-subtitle mb-2 text-muted\" th:text=\"${#calendars.format(message.created)}\">July 11, 2012 2:17:16 PM CDT</h6>\n\t\t\t\t\t<p class=\"card-text\" th:text=\"${message.text}\">A detailed message that is longer than the summary.</p>\n\t\t\t\t\t<a class=\"card-link\" href=\"messages\" th:href=\"@{'/delete/' + ${message.id}}\">delete</a>\n\t\t\t\t\t<a class=\"card-link\" href=\"form.html\" th:href=\"@{'/modify/' + ${message.id}}\"> modify</a>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</body>\n</html>\n"
  },
  {
    "path": "spring-boot-web-thymeleaf/src/test/java/com/neo/MessageControllerWebTests.java",
    "content": "\npackage com.neo;\n\nimport java.util.regex.Pattern;\n\nimport org.hamcrest.Description;\nimport org.hamcrest.TypeSafeMatcher;\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.test.context.ContextConfiguration;\nimport org.springframework.test.context.junit4.SpringRunner;\nimport org.springframework.test.context.web.WebAppConfiguration;\nimport org.springframework.test.web.servlet.MockMvc;\nimport org.springframework.test.web.servlet.setup.MockMvcBuilders;\nimport org.springframework.web.context.WebApplicationContext;\n\nimport static org.hamcrest.Matchers.containsString;\nimport static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;\nimport static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;\nimport static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;\nimport static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header;\nimport static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;\n\n@RunWith(SpringRunner.class)\n@WebAppConfiguration\n@ContextConfiguration(classes = ThymeleafApplication.class)\npublic class MessageControllerWebTests {\n\n\t@Autowired\n\tprivate WebApplicationContext wac;\n\n\tprivate MockMvc mockMvc;\n\n\t@Before\n\tpublic void setup() {\n\t\tthis.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();\n\t}\n\n\t@Test\n\tpublic void testHome() throws Exception {\n\t\tthis.mockMvc.perform(get(\"/\")).andExpect(status().isOk())\n\t\t\t\t.andExpect(content().string(containsString(\"<title>Messages\")));\n\t}\n\n\t@Test\n\tpublic void testCreate() throws Exception {\n\t\tthis.mockMvc.perform(post(\"/\").param(\"text\", \"FOO text\").param(\"summary\", \"FOO\"))\n\t\t\t\t.andExpect(status().isFound())\n\t\t\t\t.andExpect(header().string(\"location\", RegexMatcher.matches(\"/[0-9]+\")));\n\t}\n\n\t@Test\n\tpublic void testCreateValidation() throws Exception {\n\t\tthis.mockMvc.perform(post(\"/\").param(\"text\", \"\").param(\"summary\", \"\"))\n\t\t\t\t.andExpect(status().isOk())\n\t\t\t\t.andExpect(content().string(containsString(\"is required\")));\n\t}\n\n\tprivate static class RegexMatcher extends TypeSafeMatcher<String> {\n\t\tprivate final String regex;\n\n\t\tpublic RegexMatcher(String regex) {\n\t\t\tthis.regex = regex;\n\t\t}\n\n\t\tpublic static org.hamcrest.Matcher<java.lang.String> matches(String regex) {\n\t\t\treturn new RegexMatcher(regex);\n\t\t}\n\n\t\t@Override\n\t\tpublic boolean matchesSafely(String item) {\n\t\t\treturn Pattern.compile(this.regex).matcher(item).find();\n\t\t}\n\n\t\t@Override\n\t\tpublic void describeMismatchSafely(String item, Description mismatchDescription) {\n\t\t\tmismatchDescription.appendText(\"was \\\"\").appendText(item).appendText(\"\\\"\");\n\t\t}\n\n\t\t@Override\n\t\tpublic void describeTo(Description description) {\n\t\t\tdescription.appendText(\"a string that matches regex: \")\n\t\t\t\t\t.appendText(this.regex);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "spring-boot-web-thymeleaf/src/test/java/com/neo/ThymeleafApplicationTests.java",
    "content": "\npackage com.neo;\n\nimport java.net.URI;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.boot.test.context.SpringBootTest.WebEnvironment;\nimport org.springframework.boot.test.web.client.TestRestTemplate;\nimport org.springframework.http.HttpMethod;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.test.context.junit4.SpringRunner;\nimport org.springframework.util.LinkedMultiValueMap;\nimport org.springframework.util.MultiValueMap;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)\npublic class ThymeleafApplicationTests {\n\n\t@Autowired\n\tprivate TestRestTemplate restTemplate;\n\n\tprivate int port=8080;\n\n\t@Test\n\tpublic void testHome() {\n\t\tResponseEntity<String> entity = this.restTemplate.getForEntity(\"/\", String.class);\n\t\tassertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK);\n\t\tassertThat(entity.getBody()).contains(\"<title>Messages\");\n\t\tassertThat(entity.getBody()).doesNotContain(\"layout:fragment\");\n\t}\n\n\t@Test\n\tpublic void testCreate() {\n\t\tMultiValueMap<String, String> map = new LinkedMultiValueMap<>();\n\t\tmap.set(\"text\", \"FOO text\");\n\t\tmap.set(\"summary\", \"FOO\");\n\t\tURI location = this.restTemplate.postForLocation(\"/\", map);\n\t\tassertThat(location.toString()).contains(\"localhost:\" + this.port);\n\t}\n\n\t@Test\n\tpublic void testCss() {\n\t\tResponseEntity<String> entity = this.restTemplate.getForEntity(\n\t\t\t\t\"http://localhost:\" + this.port + \"/css/bootstrap.min.css\", String.class);\n\n\t\tResponseEntity<String> response = restTemplate.exchange(\n\t\t\t\tcreateURLWithPort(\"/students/Student1/courses\"),\n\t\t\t\tHttpMethod.POST, entity, String.class);\n\t\tassertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK);\n\t\tassertThat(entity.getBody()).contains(\"body\");\n\t}\n\n\tprivate String createURLWithPort(String uri) {\n\t\treturn \"http://localhost:\" + port + uri;\n\t}\n\n}\n"
  },
  {
    "path": "spring-boot-webflux/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.neo</groupId>\n\t<artifactId>spring-boot-webflux</artifactId>\n\t<version>1.0.0-SNAPSHOT</version>\n\t<packaging>jar</packaging>\n\n\t<name>spring-boot-webflux</name>\n\t<description>Demo project for Spring Boot</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>3.0.0</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>17</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-webflux</artifactId>\n        </dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.junit.vintage</groupId>\n\t\t\t<artifactId>junit-vintage-engine</artifactId>\n\t\t\t<scope>test</scope>\n\t\t\t<exclusions>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<groupId>org.hamcrest</groupId>\n\t\t\t\t\t<artifactId>hamcrest-core</artifactId>\n\t\t\t\t</exclusion>\n\t\t\t</exclusions>\n\t\t</dependency>\n\t</dependencies>\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\n\n</project>\n"
  },
  {
    "path": "spring-boot-webflux/src/main/java/com/neo/WebFluxApplication.java",
    "content": "package com.neo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class WebFluxApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(WebFluxApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "spring-boot-webflux/src/main/java/com/neo/web/HelloController.java",
    "content": "package com.neo.web;\n\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RestController;\nimport reactor.core.publisher.Mono;\n\n@RestController\npublic class HelloController {\n\n    @GetMapping(\"/hello\")\n    public Mono<String> hello() {\n        return Mono.just(\"Welcome to reactive world ~\");\n    }\n}\n"
  },
  {
    "path": "spring-boot-webflux/src/main/resources/application.properties",
    "content": ""
  },
  {
    "path": "spring-boot-webflux/src/test/java/com/neo/HelloTests.java",
    "content": "package com.neo;\n\nimport com.neo.web.HelloController;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.autoconfigure.web.reactive.WebFluxTest;\nimport org.springframework.test.context.junit4.SpringRunner;\nimport org.springframework.test.web.reactive.server.WebTestClient;\n\n@RunWith(SpringRunner.class)\n@WebFluxTest(controllers = HelloController.class)\npublic class HelloTests {\n    @Autowired\n    WebTestClient client;\n\n    @Test\n    public void getHello() {\n        client.get().uri(\"/hello\").exchange().expectStatus().isOk();\n    }\n}\n"
  },
  {
    "path": "spring-boot-webflux/src/test/java/com/neo/WebFluxApplicationTests.java",
    "content": "package com.neo;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class WebFluxApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t}\n\n}\n"
  }
]